Problem: the hexagonal refactor churns the backend tree for nine more phases; the UI delivery stack (web/ SPA, cmd/desktop Wails wrapper, compose/web image) must move to its own repo first so doc/layout rewrites land once on a backend-only tree. Change: - New repo git.hubris.network/dtoro/oikos-web (v0.33.0): web/, desktop/ (updateURL repointed to oikos-web releases), compose/, own CI (web + desktop jobs), own deploy script (CI-green gate, TOCTOU guard, version-tagged images, prune-to-3), own webhook receiver on :9798 + launchd unit, own compose project publishing the same 8091:80. - Cutover executed on mac-mini in order: oikos stack's web service stopped+removed, oikos-web project brought up on 8091; outer Caddy untouched (targets the published port) — serving + Authentik flow + /wails 404 quirk verified post-cutover. - Stripped from oikos: web/, cmd/desktop/, compose/web/, desktop CI workflow, ci.yml web job, Makefile ui/desktop/desktop-package/install targets, the compose web service, oikos-web from deploy.sh's fallback prune list; wails + go-keyring dropped from go.mod, vendor synced. - README / CONTRIBUTING / AGENTS.md / .agents dev+operations docs now point at the new repo; mbse + mascot design docs carry a path note. Risk: production SPA serving depends on the new pipeline now; rollback is versioned-image re-up of the old web service from a pre-split checkout (port 8091). Desktop builds installed before the split still check dtoro/oikos releases — one manual reinstall, noted in the oikos-web release notes. Verification: go vet, make test (race), make generate-check, golangci (no new findings; baseline down 400→365); post-cutover curls — localhost:8091 200, /wails/runtime.js 404, outer Caddy 302 Authentik.
173 lines
6.1 KiB
Markdown
173 lines
6.1 KiB
Markdown
# YAML <a href="https://www.npmjs.com/package/yaml"><img align="right" src="https://badge.fury.io/js/yaml.svg" title="npm package" /></a>
|
|
|
|
`yaml` is a definitive library for [YAML](https://yaml.org/), the human friendly data serialization standard.
|
|
This library:
|
|
|
|
- Supports both YAML 1.1 and YAML 1.2 and all common data schemas,
|
|
- Passes all of the [yaml-test-suite](https://github.com/yaml/yaml-test-suite) tests,
|
|
- Can accept any string as input without throwing, parsing as much YAML out of it as it can, and
|
|
- Supports parsing, modifying, and writing YAML comments and blank lines.
|
|
|
|
The library is released under the ISC open source license, and the code is [available on GitHub](https://github.com/eemeli/yaml/).
|
|
It has no external dependencies and runs on Node.js as well as modern browsers.
|
|
|
|
For the purposes of versioning, any changes that break any of the documented endpoints or APIs will be considered semver-major breaking changes.
|
|
Undocumented library internals may change between minor versions, and previous APIs may be deprecated (but not removed).
|
|
|
|
The minimum supported TypeScript version of the included typings is 3.9;
|
|
for use in earlier versions you may need to set `skipLibCheck: true` in your config.
|
|
This requirement may be updated between minor versions of the library.
|
|
|
|
For more information, see the project's documentation site: [**eemeli.org/yaml**](https://eemeli.org/yaml/)
|
|
|
|
For build instructions and contribution guidelines, see [docs/CONTRIBUTING.md](docs/CONTRIBUTING.md).
|
|
|
|
To install:
|
|
|
|
```sh
|
|
npm install yaml
|
|
# or
|
|
deno add jsr:@eemeli/yaml
|
|
```
|
|
|
|
**Note:** These docs are for `yaml@2`. For v1, see the [v1.10.0 tag](https://github.com/eemeli/yaml/tree/v1.10.0) for the source and [eemeli.org/yaml/v1](https://eemeli.org/yaml/v1/) for the documentation.
|
|
|
|
## API Overview
|
|
|
|
The API provided by `yaml` has three layers, depending on how deep you need to go: [Parse & Stringify](https://eemeli.org/yaml/#parse-amp-stringify), [Documents](https://eemeli.org/yaml/#documents), and the underlying [Lexer/Parser/Composer](https://eemeli.org/yaml/#parsing-yaml).
|
|
The first has the simplest API and "just works", the second gets you all the bells and whistles supported by the library along with a decent [AST](https://eemeli.org/yaml/#content-nodes), and the third lets you get progressively closer to YAML source, if that's your thing.
|
|
|
|
A [command-line tool](https://eemeli.org/yaml/#command-line-tool) is also included.
|
|
|
|
### Parse & Stringify
|
|
|
|
```js
|
|
import { parse, stringify } from 'yaml'
|
|
```
|
|
|
|
- [`parse(str, reviver?, options?): value`](https://eemeli.org/yaml/#yaml-parse)
|
|
- [`stringify(value, replacer?, options?): string`](https://eemeli.org/yaml/#yaml-stringify)
|
|
|
|
### Documents
|
|
|
|
<!-- prettier-ignore -->
|
|
```js
|
|
import {
|
|
Document,
|
|
isDocument,
|
|
parseAllDocuments,
|
|
parseDocument
|
|
} from 'yaml'
|
|
```
|
|
|
|
- [`Document`](https://eemeli.org/yaml/#documents)
|
|
- [`constructor(value, replacer?, options?)`](https://eemeli.org/yaml/#creating-documents)
|
|
- [`#contents`](https://eemeli.org/yaml/#content-nodes)
|
|
- [`#directives`](https://eemeli.org/yaml/#stream-directives)
|
|
- [`#errors`](https://eemeli.org/yaml/#errors)
|
|
- [`#warnings`](https://eemeli.org/yaml/#errors)
|
|
- [`isDocument(foo): boolean`](https://eemeli.org/yaml/#identifying-node-types)
|
|
- [`parseAllDocuments(str, options?): Document[]`](https://eemeli.org/yaml/#parsing-documents)
|
|
- [`parseDocument(str, options?): Document`](https://eemeli.org/yaml/#parsing-documents)
|
|
|
|
### Content Nodes
|
|
|
|
<!-- prettier-ignore -->
|
|
```js
|
|
import {
|
|
isAlias, isCollection, isMap, isNode,
|
|
isPair, isScalar, isSeq, Scalar,
|
|
visit, visitAsync, YAMLMap, YAMLSeq
|
|
} from 'yaml'
|
|
```
|
|
|
|
- [`isAlias(foo): boolean`](https://eemeli.org/yaml/#identifying-node-types)
|
|
- [`isCollection(foo): boolean`](https://eemeli.org/yaml/#identifying-node-types)
|
|
- [`isMap(foo): boolean`](https://eemeli.org/yaml/#identifying-node-types)
|
|
- [`isNode(foo): boolean`](https://eemeli.org/yaml/#identifying-node-types)
|
|
- [`isPair(foo): boolean`](https://eemeli.org/yaml/#identifying-node-types)
|
|
- [`isScalar(foo): boolean`](https://eemeli.org/yaml/#identifying-node-types)
|
|
- [`isSeq(foo): boolean`](https://eemeli.org/yaml/#identifying-node-types)
|
|
- [`new Scalar(value)`](https://eemeli.org/yaml/#scalar-values)
|
|
- [`new YAMLMap()`](https://eemeli.org/yaml/#collections)
|
|
- [`new YAMLSeq()`](https://eemeli.org/yaml/#collections)
|
|
- [`doc.createAlias(node, name?): Alias`](https://eemeli.org/yaml/#creating-nodes)
|
|
- [`doc.createNode(value, options?): Node`](https://eemeli.org/yaml/#creating-nodes)
|
|
- [`doc.createPair(key, value): Pair`](https://eemeli.org/yaml/#creating-nodes)
|
|
- [`visit(node, visitor)`](https://eemeli.org/yaml/#finding-and-modifying-nodes)
|
|
- [`visitAsync(node, visitor)`](https://eemeli.org/yaml/#finding-and-modifying-nodes)
|
|
|
|
### Parsing YAML
|
|
|
|
```js
|
|
import { Composer, Lexer, Parser } from 'yaml'
|
|
```
|
|
|
|
- [`new Lexer().lex(src)`](https://eemeli.org/yaml/#lexer)
|
|
- [`new Parser(onNewLine?).parse(src)`](https://eemeli.org/yaml/#parser)
|
|
- [`new Composer(options?).compose(tokens)`](https://eemeli.org/yaml/#composer)
|
|
|
|
## YAML.parse
|
|
|
|
```yaml
|
|
# file.yml
|
|
YAML:
|
|
- A human-readable data serialization language
|
|
- https://en.wikipedia.org/wiki/YAML
|
|
yaml:
|
|
- A complete JavaScript implementation
|
|
- https://www.npmjs.com/package/yaml
|
|
```
|
|
|
|
```js
|
|
import fs from 'fs'
|
|
import YAML from 'yaml'
|
|
|
|
YAML.parse('3.14159')
|
|
// 3.14159
|
|
|
|
YAML.parse('[ true, false, maybe, null ]\n')
|
|
// [ true, false, 'maybe', null ]
|
|
|
|
const file = fs.readFileSync('./file.yml', 'utf8')
|
|
YAML.parse(file)
|
|
// { YAML:
|
|
// [ 'A human-readable data serialization language',
|
|
// 'https://en.wikipedia.org/wiki/YAML' ],
|
|
// yaml:
|
|
// [ 'A complete JavaScript implementation',
|
|
// 'https://www.npmjs.com/package/yaml' ] }
|
|
```
|
|
|
|
## YAML.stringify
|
|
|
|
```js
|
|
import YAML from 'yaml'
|
|
|
|
YAML.stringify(3.14159)
|
|
// '3.14159\n'
|
|
|
|
YAML.stringify([true, false, 'maybe', null])
|
|
// `- true
|
|
// - false
|
|
// - maybe
|
|
// - null
|
|
// `
|
|
|
|
YAML.stringify({ number: 3, plain: 'string', block: 'two\nlines\n' })
|
|
// `number: 3
|
|
// plain: string
|
|
// block: |
|
|
// two
|
|
// lines
|
|
// `
|
|
```
|
|
|
|
---
|
|
|
|
Browser testing provided by:
|
|
|
|
<a href="https://www.browserstack.com/open-source">
|
|
<img width=200 src="https://eemeli.org/yaml/images/browserstack.svg" alt="BrowserStack" />
|
|
</a>
|