@origints/yaml 0.1.0 → 0.2.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +21 -0
- package/README.md +202 -0
- package/dist/index.cjs +1 -1
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.ts +3 -0
- package/dist/index.es.js +293 -168
- package/dist/index.es.js.map +1 -1
- package/dist/parse.d.ts +5 -4
- package/dist/yaml-node.d.ts +2 -0
- package/dist/yaml-spec-builder.d.ts +40 -0
- package/dist/yaml-spec-executor.d.ts +6 -0
- package/dist/yaml-spec.d.ts +19 -0
- package/package.json +22 -3
package/dist/index.es.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.es.js","sources":["../src/yaml-result.ts","../src/yaml-node.ts","../src/util.ts","../src/parse.ts","../src/convert.ts","../src/index.ts"],"sourcesContent":["/**\n * Result types for YAML operations.\n *\n * @module yaml/yaml-result\n */\n\n/**\n * Path through a YAML structure, tracking how we arrived at a value.\n * Each element is either a string (mapping key) or number (sequence index).\n */\nexport type YamlPath = readonly (string | number)[]\n\n/**\n * Failure kinds specific to YAML operations.\n */\nexport type YamlFailureKind =\n | 'parse' // YAML parsing error\n | 'type' // Wrong type at path\n | 'missing' // Key or index not found\n | 'anchor' // Anchor not found or invalid\n | 'alias' // Alias resolution failed\n | 'tag' // Invalid or unsupported tag\n\n/**\n * A failure during YAML traversal or extraction.\n */\nexport interface YamlFailure {\n readonly kind: YamlFailureKind\n readonly message: string\n readonly path: YamlPath\n readonly position?: SourcePosition\n}\n\n/**\n * Position in source document.\n */\nexport interface SourcePosition {\n readonly start: { line: number; column: number; offset: number }\n readonly end: { line: number; column: number; offset: number }\n}\n\n/**\n * Result of a YAML extraction - either a successful value or a failure.\n */\nexport type YamlResult<T> =\n | { readonly ok: true; readonly value: T; readonly path: YamlPath }\n | { readonly ok: false; readonly failure: YamlFailure }\n\n/**\n * Creates a success result.\n */\nexport function ok<T>(value: T, path: YamlPath): YamlResult<T> {\n return { ok: true, value, path }\n}\n\n/**\n * Creates a failure result.\n */\nexport function fail(\n kind: YamlFailureKind,\n message: string,\n path: YamlPath,\n position?: SourcePosition\n): YamlResult<never> {\n return {\n ok: false,\n failure: { kind, message, path, position },\n }\n}\n\n/**\n * Formats a path for display.\n */\nexport function formatYamlPath(path: YamlPath): string {\n if (path.length === 0) return 'root'\n return path\n .map(p => (typeof p === 'number' ? `[${p}]` : `.${p}`))\n .join('')\n .replace(/^\\./, '')\n}\n","/**\n * YamlNode - wrapper around YAML AST with path tracking and typed extraction.\n *\n * @module yaml/yaml-node\n */\n\nimport {\n Document,\n Pair,\n Node as YamlAstNode,\n isScalar,\n isMap,\n isSeq,\n isAlias,\n isPair,\n} from 'yaml'\nimport {\n YamlResult,\n YamlPath,\n SourcePosition,\n ok,\n fail,\n} from './yaml-result'\n\n/**\n * The type of YAML node.\n */\nexport type YamlNodeType = 'scalar' | 'mapping' | 'sequence' | 'alias'\n\n/**\n * A wrapper around YAML AST nodes with full metadata preservation.\n *\n * YamlNode enables typed navigation through YAML structures while maintaining\n * provenance information. Each traversal operation returns a new YamlNode\n * with an extended path, allowing you to trace exactly how you arrived at\n * any value.\n *\n * YAML-specific features preserved:\n * - Anchors (&name)\n * - Aliases (*name)\n * - Tags (!!str, !!int, custom tags)\n * - Comments (before and inline)\n */\nexport class YamlNode {\n private constructor(\n private readonly node: YamlAstNode | null,\n private readonly _path: YamlPath,\n private readonly doc: Document\n ) {}\n\n /**\n * Creates a YamlNode from a parsed YAML document.\n */\n static fromDocument(doc: Document): YamlNode {\n return new YamlNode(doc.contents, [], doc)\n }\n\n /**\n * Creates a YamlNode from a YAML AST node.\n * @internal\n */\n static fromNode(\n node: YamlAstNode | null,\n path: YamlPath,\n doc: Document\n ): YamlNode {\n return new YamlNode(node, path, doc)\n }\n\n /**\n * Returns the current path through the YAML structure.\n */\n get path(): YamlPath {\n return this._path\n }\n\n /**\n * Returns the source position of this node, if available.\n */\n get position(): SourcePosition | undefined {\n if (!this.node || !this.node.range) return undefined\n const [startOffset, endOffset] = this.node.range\n\n // The yaml library doesn't provide line/column directly on nodes\n // We need to compute them from the source\n // For now, return offset-based position\n return {\n start: { line: 0, column: 0, offset: startOffset },\n end: { line: 0, column: 0, offset: endOffset },\n }\n }\n\n /**\n * Returns the type of this YAML node.\n */\n get nodeType(): YamlNodeType {\n if (!this.node) return 'scalar' // null is a scalar\n if (isAlias(this.node)) return 'alias'\n if (isMap(this.node)) return 'mapping'\n if (isSeq(this.node)) return 'sequence'\n return 'scalar'\n }\n\n /**\n * Returns the underlying raw value.\n * Resolves all aliases using the document context.\n */\n unwrap(): unknown {\n if (!this.node) return null\n // For root node, use document's toJSON which handles aliases properly\n if (this._path.length === 0) {\n return this.doc.toJSON()\n }\n // For nested nodes, navigate through the document's JSON representation\n const root = this.doc.toJSON() as Record<string, unknown>\n return this.navigatePath(root, this._path)\n }\n\n /**\n * Navigate to a nested value in a JSON structure using the path.\n */\n private navigatePath(obj: unknown, path: YamlPath): unknown {\n let current = obj\n for (const segment of path) {\n if (current === null || current === undefined) return undefined\n if (typeof segment === 'number' && Array.isArray(current)) {\n current = current[segment]\n } else if (typeof segment === 'string' && typeof current === 'object') {\n current = (current as Record<string, unknown>)[segment]\n } else {\n return undefined\n }\n }\n return current\n }\n\n // ---------------------------------------------------------------------------\n // YAML-SPECIFIC METADATA\n // ---------------------------------------------------------------------------\n\n /**\n * Get the YAML tag (e.g., '!!str', '!!int', custom tags).\n */\n tag(): YamlResult<string | null> {\n if (!this.node) return ok(null, this._path)\n if (isScalar(this.node)) {\n return ok(this.node.tag ?? null, this._path)\n }\n if (isMap(this.node) || isSeq(this.node)) {\n return ok(this.node.tag ?? null, this._path)\n }\n return ok(null, this._path)\n }\n\n /**\n * Get anchor name if this node defines one.\n */\n anchor(): YamlResult<string | null> {\n if (!this.node) return ok(null, this._path)\n if (isScalar(this.node) || isMap(this.node) || isSeq(this.node)) {\n return ok(this.node.anchor ?? null, this._path)\n }\n return ok(null, this._path)\n }\n\n /**\n * Check if this node is an alias reference.\n */\n isAlias(): boolean {\n return this.node !== null && isAlias(this.node)\n }\n\n /**\n * If alias, get the anchor name it references.\n */\n aliasTarget(): YamlResult<string> {\n if (!this.node || !isAlias(this.node)) {\n return fail('alias', 'Node is not an alias', this._path, this.position)\n }\n return ok(this.node.source, this._path)\n }\n\n /**\n * If alias, resolve to the actual node.\n */\n resolveAlias(): YamlResult<YamlNode> {\n if (!this.node || !isAlias(this.node)) {\n return fail('alias', 'Node is not an alias', this._path, this.position)\n }\n const resolved = this.node.resolve(this.doc)\n if (!resolved) {\n return fail(\n 'anchor',\n `Anchor \"${this.node.source}\" not found`,\n this._path,\n this.position\n )\n }\n return ok(new YamlNode(resolved, [...this._path], this.doc), this._path)\n }\n\n /**\n * Get comment before this node.\n */\n commentBefore(): YamlResult<string | null> {\n if (!this.node) return ok(null, this._path)\n if (isScalar(this.node) || isMap(this.node) || isSeq(this.node)) {\n return ok(this.node.commentBefore ?? null, this._path)\n }\n return ok(null, this._path)\n }\n\n /**\n * Get comment on same line as this node.\n */\n comment(): YamlResult<string | null> {\n if (!this.node) return ok(null, this._path)\n if (isScalar(this.node) || isMap(this.node) || isSeq(this.node)) {\n return ok(this.node.comment ?? null, this._path)\n }\n return ok(null, this._path)\n }\n\n // ---------------------------------------------------------------------------\n // NAVIGATION\n // ---------------------------------------------------------------------------\n\n /**\n * Navigate to a property of a mapping.\n * Automatically resolves aliases.\n */\n get(key: string): YamlResult<YamlNode> {\n const resolved = this.resolveIfAlias()\n if (!resolved.ok) return resolved\n\n const node = resolved.value.node\n if (!node || !isMap(node)) {\n return fail(\n 'type',\n `Expected mapping, got ${this.nodeType}`,\n this._path,\n this.position\n )\n }\n\n const pair = node.items.find(item => {\n if (!isPair(item)) return false\n const k = item.key\n if (isScalar(k)) return k.value === key\n return false\n }) as Pair | undefined\n\n if (!pair) {\n return fail(\n 'missing',\n `Key \"${key}\" not found`,\n this._path,\n this.position\n )\n }\n\n const newPath = [...this._path, key]\n return ok(\n new YamlNode(pair.value as YamlAstNode | null, newPath, this.doc),\n newPath\n )\n }\n\n /**\n * Navigate to an element of a sequence.\n * Automatically resolves aliases.\n */\n at(index: number): YamlResult<YamlNode> {\n const resolved = this.resolveIfAlias()\n if (!resolved.ok) return resolved\n\n const node = resolved.value.node\n if (!node || !isSeq(node)) {\n return fail(\n 'type',\n `Expected sequence, got ${this.nodeType}`,\n this._path,\n this.position\n )\n }\n\n if (index < 0 || index >= node.items.length) {\n return fail(\n 'missing',\n `Index ${index} out of bounds (length: ${node.items.length})`,\n this._path,\n this.position\n )\n }\n\n const newPath = [...this._path, index]\n return ok(\n new YamlNode(node.items[index] as YamlAstNode | null, newPath, this.doc),\n newPath\n )\n }\n\n /**\n * Get all keys of a mapping.\n */\n keys(): YamlResult<readonly string[]> {\n const resolved = this.resolveIfAlias()\n if (!resolved.ok) return resolved as YamlResult<never>\n\n const node = resolved.value.node\n if (!node || !isMap(node)) {\n return fail(\n 'type',\n `Expected mapping, got ${this.nodeType}`,\n this._path,\n this.position\n )\n }\n\n const keys: string[] = []\n for (const item of node.items) {\n if (isPair(item) && isScalar(item.key)) {\n keys.push(String(item.key.value))\n }\n }\n return ok(keys, this._path)\n }\n\n /**\n * Get all values of a mapping as [key, node] pairs.\n */\n entries(): YamlResult<readonly [string, YamlNode][]> {\n const resolved = this.resolveIfAlias()\n if (!resolved.ok) return resolved as YamlResult<never>\n\n const node = resolved.value.node\n if (!node || !isMap(node)) {\n return fail(\n 'type',\n `Expected mapping, got ${this.nodeType}`,\n this._path,\n this.position\n )\n }\n\n const entries: [string, YamlNode][] = []\n for (const item of node.items) {\n if (isPair(item) && isScalar(item.key)) {\n const key = String(item.key.value)\n const newPath = [...this._path, key]\n entries.push([\n key,\n new YamlNode(item.value as YamlAstNode | null, newPath, this.doc),\n ])\n }\n }\n return ok(entries, this._path)\n }\n\n /**\n * Get all items of a sequence.\n */\n items(): YamlResult<readonly YamlNode[]> {\n const resolved = this.resolveIfAlias()\n if (!resolved.ok) return resolved as YamlResult<never>\n\n const node = resolved.value.node\n if (!node || !isSeq(node)) {\n return fail(\n 'type',\n `Expected sequence, got ${this.nodeType}`,\n this._path,\n this.position\n )\n }\n\n const items: YamlNode[] = []\n for (let i = 0; i < node.items.length; i++) {\n const newPath = [...this._path, i]\n items.push(\n new YamlNode(node.items[i] as YamlAstNode | null, newPath, this.doc)\n )\n }\n return ok(items, this._path)\n }\n\n /**\n * Check if mapping has key.\n */\n has(key: string): boolean {\n const resolved = this.resolveIfAlias()\n if (!resolved.ok) return false\n\n const node = resolved.value.node\n if (!node || !isMap(node)) return false\n\n return node.items.some(item => {\n if (!isPair(item)) return false\n const k = item.key\n if (isScalar(k)) return k.value === key\n return false\n })\n }\n\n // ---------------------------------------------------------------------------\n // TYPE EXTRACTION\n // ---------------------------------------------------------------------------\n\n /**\n * Extract as a string.\n */\n asString(): YamlResult<string> {\n const value = this.getScalarValue()\n if (typeof value !== 'string') {\n return fail(\n 'type',\n `Expected string, got ${typeOf(value)}`,\n this._path,\n this.position\n )\n }\n return ok(value, this._path)\n }\n\n /**\n * Extract as a number.\n */\n asNumber(): YamlResult<number> {\n const value = this.getScalarValue()\n if (typeof value !== 'number') {\n return fail(\n 'type',\n `Expected number, got ${typeOf(value)}`,\n this._path,\n this.position\n )\n }\n return ok(value, this._path)\n }\n\n /**\n * Extract as a boolean.\n */\n asBoolean(): YamlResult<boolean> {\n const value = this.getScalarValue()\n if (typeof value !== 'boolean') {\n return fail(\n 'type',\n `Expected boolean, got ${typeOf(value)}`,\n this._path,\n this.position\n )\n }\n return ok(value, this._path)\n }\n\n /**\n * Extract as null.\n */\n asNull(): YamlResult<null> {\n const value = this.getScalarValue()\n if (value !== null) {\n return fail(\n 'type',\n `Expected null, got ${typeOf(value)}`,\n this._path,\n this.position\n )\n }\n return ok(null, this._path)\n }\n\n /**\n * Extract as a sequence of YamlNodes.\n */\n asSequence(): YamlResult<readonly YamlNode[]> {\n return this.items()\n }\n\n /**\n * Extract as a mapping with YamlNode values.\n */\n asMapping(): YamlResult<Readonly<Record<string, YamlNode>>> {\n const entriesResult = this.entries()\n if (!entriesResult.ok) return entriesResult as YamlResult<never>\n\n const mapping: Record<string, YamlNode> = {}\n for (const [key, node] of entriesResult.value) {\n mapping[key] = node\n }\n return ok(mapping, this._path)\n }\n\n // ---------------------------------------------------------------------------\n // PREDICATES\n // ---------------------------------------------------------------------------\n\n isScalar(): boolean {\n if (!this.node) return true // null is a scalar\n if (isAlias(this.node)) {\n const resolved = this.node.resolve(this.doc)\n return !resolved || isScalar(resolved)\n }\n return isScalar(this.node)\n }\n\n isSequence(): boolean {\n if (!this.node) return false\n if (isAlias(this.node)) {\n const resolved = this.node.resolve(this.doc)\n return resolved !== null && isSeq(resolved)\n }\n return isSeq(this.node)\n }\n\n isMapping(): boolean {\n if (!this.node) return false\n if (isAlias(this.node)) {\n const resolved = this.node.resolve(this.doc)\n return resolved !== null && isMap(resolved)\n }\n return isMap(this.node)\n }\n\n isString(): boolean {\n return typeof this.getScalarValue() === 'string'\n }\n\n isNumber(): boolean {\n return typeof this.getScalarValue() === 'number'\n }\n\n isBoolean(): boolean {\n return typeof this.getScalarValue() === 'boolean'\n }\n\n isNull(): boolean {\n return this.getScalarValue() === null\n }\n\n // ---------------------------------------------------------------------------\n // HELPERS\n // ---------------------------------------------------------------------------\n\n /**\n * Resolve alias if this is one, otherwise return self.\n */\n private resolveIfAlias(): YamlResult<YamlNode> {\n if (this.node && isAlias(this.node)) {\n return this.resolveAlias()\n }\n return ok(this, this._path)\n }\n\n /**\n * Get the scalar value, resolving aliases.\n */\n private getScalarValue(): unknown {\n if (!this.node) return null\n if (isAlias(this.node)) {\n const resolved = this.node.resolve(this.doc)\n if (!resolved) return null\n if (isScalar(resolved)) return resolved.value\n return resolved.toJSON()\n }\n if (isScalar(this.node)) return this.node.value\n return this.node.toJSON()\n }\n}\n\n/**\n * Returns a human-readable type name.\n */\nfunction typeOf(value: unknown): string {\n if (value === null) return 'null'\n if (Array.isArray(value)) return 'sequence'\n if (typeof value === 'object') return 'mapping'\n return typeof value\n}\n","/**\n * Utility functions for YAML package.\n *\n * @module yaml/util\n */\n\n/**\n * Convert a ReadableStream<Uint8Array> to a string.\n */\nexport async function streamToString(\n stream: ReadableStream<Uint8Array>\n): Promise<string> {\n const reader = stream.getReader()\n const decoder = new TextDecoder()\n const chunks: string[] = []\n\n try {\n while (true) {\n const { done, value } = await reader.read()\n if (done) break\n chunks.push(decoder.decode(value, { stream: true }))\n }\n // Flush the decoder\n chunks.push(decoder.decode())\n return chunks.join('')\n } finally {\n reader.releaseLock()\n }\n}\n","/**\n * YAML parsing transform for Origins.\n *\n * @module yaml/parse\n */\n\nimport {\n parseDocument,\n parseAllDocuments,\n ParseOptions,\n DocumentOptions,\n} from 'yaml'\nimport type { TransformAst, TransformImpl } from '@origints/core'\nimport { YamlNode } from './yaml-node'\nimport { streamToString } from './util'\n\n/**\n * Options for parsing YAML.\n */\nexport interface YamlParseOptions {\n /**\n * How to handle duplicate keys in mappings.\n * - 'error': Throw an error (default)\n * - 'warn': Log a warning and use the last value\n * - 'last': Silently use the last value\n */\n duplicateKeys?: 'error' | 'warn' | 'last'\n\n /**\n * Maximum number of aliases to resolve.\n * This is a security measure to prevent YAML bombs.\n * Default: 100\n */\n maxAliasCount?: number\n\n /**\n * Preserve comments in the parsed document.\n * Default: true\n */\n preserveComments?: boolean\n\n /**\n * YAML version to use.\n * Default: '1.2'\n */\n version?: '1.1' | '1.2'\n}\n\n/**\n * Creates a TransformAst for parsing YAML.\n *\n * @example\n * ```ts\n * const plan = new Planner()\n * .in(loadFile('config.yaml'))\n * .mapIn(parseYaml())\n * .emit((out, $) => out\n * .add('host', $.get('server').get('host').asString())\n * )\n * .compile()\n * ```\n */\nexport function parseYaml(options?: YamlParseOptions): TransformAst {\n return {\n kind: 'transform',\n namespace: '@origints/yaml',\n name: 'parseYaml',\n args: options,\n }\n}\n\n/**\n * Creates a TransformAst for parsing multi-document YAML.\n * Returns an array of YamlNodes, one for each document.\n *\n * @example\n * ```ts\n * const plan = new Planner()\n * .in(loadFile('multi.yaml'))\n * .mapIn(parseYamlAll())\n * .emit((out, $) => out\n * .add('docs', $.items().all(doc => doc.get('name').asString()))\n * )\n * .compile()\n * ```\n */\nexport function parseYamlAll(options?: YamlParseOptions): TransformAst {\n return {\n kind: 'transform',\n namespace: '@origints/yaml',\n name: 'parseYamlAll',\n args: options,\n }\n}\n\n/**\n * Transform implementation for parseYaml.\n */\nexport const parseYamlImpl: TransformImpl = {\n namespace: '@origints/yaml',\n name: 'parseYaml',\n\n execute(input: unknown, args?: unknown): YamlNode {\n const options = (args as YamlParseOptions) ?? {}\n const yamlOptions = toYamlParseOptions(options)\n\n let content: string\n if (typeof input === 'string') {\n content = input\n } else if (input instanceof ReadableStream) {\n // This will be handled asynchronously by the executor\n throw new Error(\n 'parseYaml received a stream. Use streamToString first or ensure the input is a string.'\n )\n } else {\n throw new Error(`parseYaml expects string input, got ${typeof input}`)\n }\n\n const doc = parseDocument(content, yamlOptions)\n\n // Check for errors\n if (doc.errors.length > 0) {\n const error = doc.errors[0]\n throw new Error(`YAML parse error: ${error.message}`)\n }\n\n return YamlNode.fromDocument(doc)\n },\n}\n\n/**\n * Async transform implementation for parseYaml (handles streams).\n */\nexport const parseYamlAsyncImpl: TransformImpl = {\n namespace: '@origints/yaml',\n name: 'parseYaml',\n\n async execute(input: unknown, args?: unknown): Promise<YamlNode> {\n const options = (args as YamlParseOptions) ?? {}\n const yamlOptions = toYamlParseOptions(options)\n\n let content: string\n if (typeof input === 'string') {\n content = input\n } else if (input instanceof ReadableStream) {\n content = await streamToString(input)\n } else {\n throw new Error(\n `parseYaml expects string or stream input, got ${typeof input}`\n )\n }\n\n const doc = parseDocument(content, yamlOptions)\n\n // Check for errors\n if (doc.errors.length > 0) {\n const error = doc.errors[0]\n throw new Error(`YAML parse error: ${error.message}`)\n }\n\n return YamlNode.fromDocument(doc)\n },\n}\n\n/**\n * Transform implementation for parseYamlAll.\n */\nexport const parseYamlAllImpl: TransformImpl = {\n namespace: '@origints/yaml',\n name: 'parseYamlAll',\n\n async execute(input: unknown, args?: unknown): Promise<YamlNode[]> {\n const options = (args as YamlParseOptions) ?? {}\n const yamlOptions = toYamlParseOptions(options)\n\n let content: string\n if (typeof input === 'string') {\n content = input\n } else if (input instanceof ReadableStream) {\n content = await streamToString(input)\n } else {\n throw new Error(\n `parseYamlAll expects string or stream input, got ${typeof input}`\n )\n }\n\n const docs = parseAllDocuments(content, yamlOptions)\n\n // Check for errors in any document\n for (const doc of docs) {\n if (doc.errors.length > 0) {\n const error = doc.errors[0]\n throw new Error(`YAML parse error: ${error.message}`)\n }\n }\n\n return docs.map(doc => YamlNode.fromDocument(doc))\n },\n}\n\n/**\n * Convert our options to yaml library options.\n * Note: maxAliasCount is used during toJS conversion, not during parsing.\n */\nfunction toYamlParseOptions(\n options: YamlParseOptions\n): ParseOptions & DocumentOptions {\n return {\n uniqueKeys: options.duplicateKeys !== 'last',\n keepSourceTokens: true, // Needed for position tracking\n version: options.version ?? '1.2',\n }\n}\n","/**\n * Conversion from YamlNode to JSON.\n *\n * @module yaml/convert\n */\n\nimport {\n Document,\n Node as YamlAstNode,\n isScalar,\n isMap,\n isSeq,\n isAlias,\n isPair,\n} from 'yaml'\nimport { YamlNode } from './yaml-node'\nimport { YamlResult, ok, fail, YamlPath, SourcePosition } from './yaml-result'\n\n/**\n * JSON value type (mirrors @origints/core JsonValue).\n */\nexport type JsonValue =\n | null\n | boolean\n | number\n | string\n | JsonValue[]\n | { [key: string]: JsonValue }\n\n/**\n * Convert a YamlNode to a plain JSON value.\n *\n * This conversion:\n * - Resolves all aliases\n * - Strips tags, comments, and anchors\n * - Converts all values to JSON-compatible types\n *\n * @param node The YamlNode to convert\n * @returns A JSON value\n */\nexport function toJsonValue(node: YamlNode): YamlResult<JsonValue> {\n const raw = node.unwrap()\n\n if (!isJsonCompatible(raw)) {\n return fail(\n 'type',\n `Cannot convert YAML value to JSON: ${typeof raw}`,\n node.path,\n node.position\n )\n }\n\n return ok(raw as JsonValue, node.path)\n}\n\n/**\n * Check if a value is JSON-compatible.\n */\nfunction isJsonCompatible(value: unknown): boolean {\n if (value === null) return true\n if (typeof value === 'boolean') return true\n if (typeof value === 'number') return Number.isFinite(value)\n if (typeof value === 'string') return true\n if (Array.isArray(value)) return value.every(isJsonCompatible)\n if (typeof value === 'object') {\n return Object.values(value).every(isJsonCompatible)\n }\n return false\n}\n\n/**\n * Options for YAML to JSON conversion.\n */\nexport interface ToJsonOptions {\n /**\n * How to handle non-JSON-compatible values (Infinity, NaN, undefined).\n * - 'error': Throw an error (default)\n * - 'null': Convert to null\n * - 'string': Convert to string representation\n */\n nonJsonValues?: 'error' | 'null' | 'string'\n\n /**\n * How to handle Date objects.\n * - 'iso': Convert to ISO 8601 string (default)\n * - 'timestamp': Convert to Unix timestamp (number)\n * - 'preserve': Keep as Date object (not JSON-compatible)\n */\n dates?: 'iso' | 'timestamp' | 'preserve'\n}\n\n/**\n * Convert a YamlNode to JSON with options.\n * This walks the AST to properly handle Date objects and other YAML-specific types.\n */\nexport function toJson(\n node: YamlNode,\n options: ToJsonOptions = {}\n): YamlResult<JsonValue> {\n // Access internal AST for proper type handling\n const internal = node as unknown as {\n node: YamlAstNode | null\n doc: Document\n }\n return convertAstNode(internal.node, internal.doc, node.path, options)\n}\n\nfunction convertAstNode(\n astNode: YamlAstNode | null,\n doc: Document,\n path: YamlPath,\n options: ToJsonOptions\n): YamlResult<JsonValue> {\n if (astNode === null) return ok(null, path)\n\n // Handle aliases by resolving them\n if (isAlias(astNode)) {\n const resolved = astNode.resolve(doc)\n if (!resolved) {\n return fail(\n 'anchor',\n `Unresolved alias: ${astNode.source}`,\n path,\n getPosition(astNode)\n )\n }\n return convertAstNode(resolved, doc, path, options)\n }\n\n // Handle scalars\n if (isScalar(astNode)) {\n const value = astNode.value\n\n if (value === null) return ok(null, path)\n if (typeof value === 'boolean') return ok(value, path)\n if (typeof value === 'string') return ok(value, path)\n\n if (typeof value === 'number') {\n if (!Number.isFinite(value)) {\n switch (options.nonJsonValues ?? 'error') {\n case 'null':\n return ok(null, path)\n case 'string':\n return ok(String(value), path)\n default:\n return fail(\n 'type',\n `Cannot convert ${value} to JSON`,\n path,\n getPosition(astNode)\n )\n }\n }\n return ok(value, path)\n }\n\n if (value instanceof Date) {\n switch (options.dates ?? 'iso') {\n case 'iso':\n return ok(value.toISOString(), path)\n case 'timestamp':\n return ok(value.getTime(), path)\n default:\n return fail(\n 'type',\n 'Date objects are not JSON-compatible',\n path,\n getPosition(astNode)\n )\n }\n }\n\n // Fallback for other scalar types\n return ok(String(value), path)\n }\n\n // Handle sequences\n if (isSeq(astNode)) {\n const result: JsonValue[] = []\n for (let i = 0; i < astNode.items.length; i++) {\n const item = astNode.items[i] as YamlAstNode | null\n const itemPath = [...path, i] as YamlPath\n const itemResult = convertAstNode(item, doc, itemPath, options)\n if (!itemResult.ok) return itemResult\n result.push(itemResult.value)\n }\n return ok(result, path)\n }\n\n // Handle mappings\n if (isMap(astNode)) {\n const result: { [key: string]: JsonValue } = {}\n for (const pair of astNode.items) {\n if (!isPair(pair)) continue\n\n // Get key (handle scalar keys, resolve alias keys)\n let key: string\n const keyNode = pair.key as YamlAstNode | null\n if (keyNode === null) {\n key = 'null'\n } else if (isAlias(keyNode)) {\n const resolvedKey = keyNode.resolve(doc)\n if (resolvedKey && isScalar(resolvedKey)) {\n key = String(resolvedKey.value)\n } else {\n key = String(keyNode.source)\n }\n } else if (isScalar(keyNode)) {\n key = String(keyNode.value)\n } else {\n // Complex keys - recursively convert and stringify\n const keyResult = convertAstNode(keyNode, doc, path, options)\n if (!keyResult.ok) return keyResult\n key = JSON.stringify(keyResult.value)\n }\n\n const valuePath = [...path, key] as YamlPath\n const valueNode = pair.value as YamlAstNode | null\n const valueResult = convertAstNode(valueNode, doc, valuePath, options)\n if (!valueResult.ok) return valueResult\n result[key] = valueResult.value\n }\n return ok(result, path)\n }\n\n // Should not reach here - all YAML node types are handled above\n return fail('type', 'Unexpected YAML node type', path, undefined)\n}\n\nfunction getPosition(node: YamlAstNode): SourcePosition | undefined {\n if (!node.range) return undefined\n const [startOffset, endOffset] = node.range\n return {\n start: { line: 0, column: 0, offset: startOffset },\n end: { line: 0, column: 0, offset: endOffset },\n }\n}\n","/**\n * @origints/yaml - YAML parsing for Origins with anchor/alias/tag preservation.\n *\n * @packageDocumentation\n */\n\n// Re-export types\nexport type {\n YamlPath,\n YamlFailure,\n YamlFailureKind,\n YamlResult,\n SourcePosition,\n} from './yaml-result'\nexport { ok, fail, formatYamlPath } from './yaml-result'\n\n// Re-export YamlNode\nexport type { YamlNodeType } from './yaml-node'\nexport { YamlNode } from './yaml-node'\n\n// Re-export parse functions and implementations\nexport type { YamlParseOptions } from './parse'\nexport {\n parseYaml,\n parseYamlAll,\n parseYamlImpl,\n parseYamlAsyncImpl,\n parseYamlAllImpl,\n} from './parse'\n\n// Re-export conversion utilities\nexport type { JsonValue, ToJsonOptions } from './convert'\nexport { toJson, toJsonValue } from './convert'\n\n// Re-export utilities\nexport { streamToString } from './util'\n\n// ---------------------------------------------------------------------------\n// Auto-registration of transforms\n// ---------------------------------------------------------------------------\n\nimport { parseYamlAsyncImpl, parseYamlAllImpl } from './parse'\n\n/**\n * Register the YAML transforms with a registry.\n * Call this to enable parseYaml() and parseYamlAll() in your plans.\n *\n * @example\n * ```ts\n * import { globalRegistry } from '@origints/core'\n * import { registerYamlTransforms } from '@origints/yaml'\n *\n * registerYamlTransforms(globalRegistry)\n * ```\n */\nexport function registerYamlTransforms(registry: {\n register(impl: {\n namespace: string\n name: string\n execute: (...args: unknown[]) => unknown\n }): void\n}): void {\n registry.register(parseYamlAsyncImpl)\n registry.register(parseYamlAllImpl)\n}\n"],"names":["ok","value","path","fail","kind","message","position","formatYamlPath","p","YamlNode","node","_path","doc","startOffset","endOffset","isAlias","isMap","isSeq","root","obj","current","segment","isScalar","resolved","key","pair","item","isPair","k","newPath","index","keys","entries","items","i","typeOf","entriesResult","mapping","streamToString","stream","reader","decoder","chunks","done","parseYaml","options","parseYamlAll","parseYamlImpl","input","args","yamlOptions","toYamlParseOptions","content","parseDocument","error","parseYamlAsyncImpl","parseYamlAllImpl","docs","parseAllDocuments","toJsonValue","raw","isJsonCompatible","toJson","internal","convertAstNode","astNode","getPosition","result","itemPath","itemResult","keyNode","resolvedKey","keyResult","valuePath","valueNode","valueResult","registerYamlTransforms","registry"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"index.es.js","sources":["../src/yaml-result.ts","../src/yaml-node.ts","../src/yaml-spec-builder.ts","../src/util.ts","../src/parse.ts","../src/yaml-spec-executor.ts","../src/convert.ts","../src/index.ts"],"sourcesContent":["/**\n * Result types for YAML operations.\n *\n * @module yaml/yaml-result\n */\n\n/**\n * Path through a YAML structure, tracking how we arrived at a value.\n * Each element is either a string (mapping key) or number (sequence index).\n */\nexport type YamlPath = readonly (string | number)[]\n\n/**\n * Failure kinds specific to YAML operations.\n */\nexport type YamlFailureKind =\n | 'parse' // YAML parsing error\n | 'type' // Wrong type at path\n | 'missing' // Key or index not found\n | 'anchor' // Anchor not found or invalid\n | 'alias' // Alias resolution failed\n | 'tag' // Invalid or unsupported tag\n\n/**\n * A failure during YAML traversal or extraction.\n */\nexport interface YamlFailure {\n readonly kind: YamlFailureKind\n readonly message: string\n readonly path: YamlPath\n readonly position?: SourcePosition\n}\n\n/**\n * Position in source document.\n */\nexport interface SourcePosition {\n readonly start: { line: number; column: number; offset: number }\n readonly end: { line: number; column: number; offset: number }\n}\n\n/**\n * Result of a YAML extraction - either a successful value or a failure.\n */\nexport type YamlResult<T> =\n | { readonly ok: true; readonly value: T; readonly path: YamlPath }\n | { readonly ok: false; readonly failure: YamlFailure }\n\n/**\n * Creates a success result.\n */\nexport function ok<T>(value: T, path: YamlPath): YamlResult<T> {\n return { ok: true, value, path }\n}\n\n/**\n * Creates a failure result.\n */\nexport function fail(\n kind: YamlFailureKind,\n message: string,\n path: YamlPath,\n position?: SourcePosition\n): YamlResult<never> {\n return {\n ok: false,\n failure: { kind, message, path, position },\n }\n}\n\n/**\n * Formats a path for display.\n */\nexport function formatYamlPath(path: YamlPath): string {\n if (path.length === 0) return 'root'\n return path\n .map(p => (typeof p === 'number' ? `[${p}]` : `.${p}`))\n .join('')\n .replace(/^\\./, '')\n}\n","/**\n * YamlNode - wrapper around YAML AST with path tracking and typed extraction.\n *\n * @module yaml/yaml-node\n */\n\nimport { TYPE_LABEL } from '@origints/core'\nimport {\n Document,\n Pair,\n Node as YamlAstNode,\n isScalar,\n isMap,\n isSeq,\n isAlias,\n isPair,\n} from 'yaml'\nimport { YamlResult, YamlPath, SourcePosition, ok, fail } from './yaml-result'\n\n/**\n * The type of YAML node.\n */\nexport type YamlNodeType = 'scalar' | 'mapping' | 'sequence' | 'alias'\n\n/**\n * A wrapper around YAML AST nodes with full metadata preservation.\n *\n * YamlNode enables typed navigation through YAML structures while maintaining\n * provenance information. Each traversal operation returns a new YamlNode\n * with an extended path, allowing you to trace exactly how you arrived at\n * any value.\n *\n * YAML-specific features preserved:\n * - Anchors (&name)\n * - Aliases (*name)\n * - Tags (!!str, !!int, custom tags)\n * - Comments (before and inline)\n */\nexport class YamlNode {\n get [TYPE_LABEL]() {\n return `YamlNode(${this.nodeType})`\n }\n\n private constructor(\n private readonly node: YamlAstNode | null,\n private readonly _path: YamlPath,\n private readonly doc: Document\n ) {}\n\n /**\n * Creates a YamlNode from a parsed YAML document.\n */\n static fromDocument(doc: Document): YamlNode {\n return new YamlNode(doc.contents, [], doc)\n }\n\n /**\n * Creates a YamlNode from a YAML AST node.\n * @internal\n */\n static fromNode(\n node: YamlAstNode | null,\n path: YamlPath,\n doc: Document\n ): YamlNode {\n return new YamlNode(node, path, doc)\n }\n\n /**\n * Returns the current path through the YAML structure.\n */\n get path(): YamlPath {\n return this._path\n }\n\n /**\n * Returns the source position of this node, if available.\n */\n get position(): SourcePosition | undefined {\n if (!this.node || !this.node.range) return undefined\n const [startOffset, endOffset] = this.node.range\n\n // The yaml library doesn't provide line/column directly on nodes\n // We need to compute them from the source\n // For now, return offset-based position\n return {\n start: { line: 0, column: 0, offset: startOffset },\n end: { line: 0, column: 0, offset: endOffset },\n }\n }\n\n /**\n * Returns the type of this YAML node.\n */\n get nodeType(): YamlNodeType {\n if (!this.node) return 'scalar' // null is a scalar\n if (isAlias(this.node)) return 'alias'\n if (isMap(this.node)) return 'mapping'\n if (isSeq(this.node)) return 'sequence'\n return 'scalar'\n }\n\n /**\n * Returns the underlying raw value.\n * Resolves all aliases using the document context.\n */\n unwrap(): unknown {\n if (!this.node) return null\n // For root node, use document's toJSON which handles aliases properly\n if (this._path.length === 0) {\n return this.doc.toJSON()\n }\n // For nested nodes, navigate through the document's JSON representation\n const root = this.doc.toJSON() as Record<string, unknown>\n return this.navigatePath(root, this._path)\n }\n\n /**\n * Navigate to a nested value in a JSON structure using the path.\n */\n private navigatePath(obj: unknown, path: YamlPath): unknown {\n let current = obj\n for (const segment of path) {\n if (current === null || current === undefined) return undefined\n if (typeof segment === 'number' && Array.isArray(current)) {\n current = current[segment]\n } else if (typeof segment === 'string' && typeof current === 'object') {\n current = (current as Record<string, unknown>)[segment]\n } else {\n return undefined\n }\n }\n return current\n }\n\n // ---------------------------------------------------------------------------\n // YAML-SPECIFIC METADATA\n // ---------------------------------------------------------------------------\n\n /**\n * Get the YAML tag (e.g., '!!str', '!!int', custom tags).\n */\n tag(): YamlResult<string | null> {\n if (!this.node) return ok(null, this._path)\n if (isScalar(this.node)) {\n return ok(this.node.tag ?? null, this._path)\n }\n if (isMap(this.node) || isSeq(this.node)) {\n return ok(this.node.tag ?? null, this._path)\n }\n return ok(null, this._path)\n }\n\n /**\n * Get anchor name if this node defines one.\n */\n anchor(): YamlResult<string | null> {\n if (!this.node) return ok(null, this._path)\n if (isScalar(this.node) || isMap(this.node) || isSeq(this.node)) {\n return ok(this.node.anchor ?? null, this._path)\n }\n return ok(null, this._path)\n }\n\n /**\n * Check if this node is an alias reference.\n */\n isAlias(): boolean {\n return this.node !== null && isAlias(this.node)\n }\n\n /**\n * If alias, get the anchor name it references.\n */\n aliasTarget(): YamlResult<string> {\n if (!this.node || !isAlias(this.node)) {\n return fail('alias', 'Node is not an alias', this._path, this.position)\n }\n return ok(this.node.source, this._path)\n }\n\n /**\n * If alias, resolve to the actual node.\n */\n resolveAlias(): YamlResult<YamlNode> {\n if (!this.node || !isAlias(this.node)) {\n return fail('alias', 'Node is not an alias', this._path, this.position)\n }\n const resolved = this.node.resolve(this.doc)\n if (!resolved) {\n return fail(\n 'anchor',\n `Anchor \"${this.node.source}\" not found`,\n this._path,\n this.position\n )\n }\n return ok(new YamlNode(resolved, [...this._path], this.doc), this._path)\n }\n\n /**\n * Get comment before this node.\n */\n commentBefore(): YamlResult<string | null> {\n if (!this.node) return ok(null, this._path)\n if (isScalar(this.node) || isMap(this.node) || isSeq(this.node)) {\n return ok(this.node.commentBefore ?? null, this._path)\n }\n return ok(null, this._path)\n }\n\n /**\n * Get comment on same line as this node.\n */\n comment(): YamlResult<string | null> {\n if (!this.node) return ok(null, this._path)\n if (isScalar(this.node) || isMap(this.node) || isSeq(this.node)) {\n return ok(this.node.comment ?? null, this._path)\n }\n return ok(null, this._path)\n }\n\n // ---------------------------------------------------------------------------\n // NAVIGATION\n // ---------------------------------------------------------------------------\n\n /**\n * Navigate to a property of a mapping.\n * Automatically resolves aliases.\n */\n get(key: string): YamlResult<YamlNode> {\n const resolved = this.resolveIfAlias()\n if (!resolved.ok) return resolved\n\n const node = resolved.value.node\n if (!node || !isMap(node)) {\n return fail(\n 'type',\n `Expected mapping, got ${this.nodeType}`,\n this._path,\n this.position\n )\n }\n\n const pair = node.items.find(item => {\n if (!isPair(item)) return false\n const k = item.key\n if (isScalar(k)) return k.value === key\n return false\n }) as Pair | undefined\n\n if (!pair) {\n return fail(\n 'missing',\n `Key \"${key}\" not found`,\n this._path,\n this.position\n )\n }\n\n const newPath = [...this._path, key]\n return ok(\n new YamlNode(pair.value as YamlAstNode | null, newPath, this.doc),\n newPath\n )\n }\n\n /**\n * Navigate to an element of a sequence.\n * Automatically resolves aliases.\n */\n at(index: number): YamlResult<YamlNode> {\n const resolved = this.resolveIfAlias()\n if (!resolved.ok) return resolved\n\n const node = resolved.value.node\n if (!node || !isSeq(node)) {\n return fail(\n 'type',\n `Expected sequence, got ${this.nodeType}`,\n this._path,\n this.position\n )\n }\n\n if (index < 0 || index >= node.items.length) {\n return fail(\n 'missing',\n `Index ${index} out of bounds (length: ${node.items.length})`,\n this._path,\n this.position\n )\n }\n\n const newPath = [...this._path, index]\n return ok(\n new YamlNode(node.items[index] as YamlAstNode | null, newPath, this.doc),\n newPath\n )\n }\n\n /**\n * Get all keys of a mapping.\n */\n keys(): YamlResult<readonly string[]> {\n const resolved = this.resolveIfAlias()\n if (!resolved.ok) return resolved as YamlResult<never>\n\n const node = resolved.value.node\n if (!node || !isMap(node)) {\n return fail(\n 'type',\n `Expected mapping, got ${this.nodeType}`,\n this._path,\n this.position\n )\n }\n\n const keys: string[] = []\n for (const item of node.items) {\n if (isPair(item) && isScalar(item.key)) {\n keys.push(String(item.key.value))\n }\n }\n return ok(keys, this._path)\n }\n\n /**\n * Get all values of a mapping as [key, node] pairs.\n */\n entries(): YamlResult<readonly [string, YamlNode][]> {\n const resolved = this.resolveIfAlias()\n if (!resolved.ok) return resolved as YamlResult<never>\n\n const node = resolved.value.node\n if (!node || !isMap(node)) {\n return fail(\n 'type',\n `Expected mapping, got ${this.nodeType}`,\n this._path,\n this.position\n )\n }\n\n const entries: [string, YamlNode][] = []\n for (const item of node.items) {\n if (isPair(item) && isScalar(item.key)) {\n const key = String(item.key.value)\n const newPath = [...this._path, key]\n entries.push([\n key,\n new YamlNode(item.value as YamlAstNode | null, newPath, this.doc),\n ])\n }\n }\n return ok(entries, this._path)\n }\n\n /**\n * Get all items of a sequence.\n */\n items(): YamlResult<readonly YamlNode[]> {\n const resolved = this.resolveIfAlias()\n if (!resolved.ok) return resolved as YamlResult<never>\n\n const node = resolved.value.node\n if (!node || !isSeq(node)) {\n return fail(\n 'type',\n `Expected sequence, got ${this.nodeType}`,\n this._path,\n this.position\n )\n }\n\n const items: YamlNode[] = []\n for (let i = 0; i < node.items.length; i++) {\n const newPath = [...this._path, i]\n items.push(\n new YamlNode(node.items[i] as YamlAstNode | null, newPath, this.doc)\n )\n }\n return ok(items, this._path)\n }\n\n /**\n * Check if mapping has key.\n */\n has(key: string): boolean {\n const resolved = this.resolveIfAlias()\n if (!resolved.ok) return false\n\n const node = resolved.value.node\n if (!node || !isMap(node)) return false\n\n return node.items.some(item => {\n if (!isPair(item)) return false\n const k = item.key\n if (isScalar(k)) return k.value === key\n return false\n })\n }\n\n // ---------------------------------------------------------------------------\n // TYPE EXTRACTION\n // ---------------------------------------------------------------------------\n\n /**\n * Extract as a string.\n */\n asString(): YamlResult<string> {\n const value = this.getScalarValue()\n if (typeof value !== 'string') {\n return fail(\n 'type',\n `Expected string, got ${typeOf(value)}`,\n this._path,\n this.position\n )\n }\n return ok(value, this._path)\n }\n\n /**\n * Extract as a number.\n */\n asNumber(): YamlResult<number> {\n const value = this.getScalarValue()\n if (typeof value !== 'number') {\n return fail(\n 'type',\n `Expected number, got ${typeOf(value)}`,\n this._path,\n this.position\n )\n }\n return ok(value, this._path)\n }\n\n /**\n * Extract as a boolean.\n */\n asBoolean(): YamlResult<boolean> {\n const value = this.getScalarValue()\n if (typeof value !== 'boolean') {\n return fail(\n 'type',\n `Expected boolean, got ${typeOf(value)}`,\n this._path,\n this.position\n )\n }\n return ok(value, this._path)\n }\n\n /**\n * Extract as null.\n */\n asNull(): YamlResult<null> {\n const value = this.getScalarValue()\n if (value !== null) {\n return fail(\n 'type',\n `Expected null, got ${typeOf(value)}`,\n this._path,\n this.position\n )\n }\n return ok(null, this._path)\n }\n\n /**\n * Extract as a sequence of YamlNodes.\n */\n asSequence(): YamlResult<readonly YamlNode[]> {\n return this.items()\n }\n\n /**\n * Extract as a mapping with YamlNode values.\n */\n asMapping(): YamlResult<Readonly<Record<string, YamlNode>>> {\n const entriesResult = this.entries()\n if (!entriesResult.ok) return entriesResult as YamlResult<never>\n\n const mapping: Record<string, YamlNode> = {}\n for (const [key, node] of entriesResult.value) {\n mapping[key] = node\n }\n return ok(mapping, this._path)\n }\n\n // ---------------------------------------------------------------------------\n // PREDICATES\n // ---------------------------------------------------------------------------\n\n isScalar(): boolean {\n if (!this.node) return true // null is a scalar\n if (isAlias(this.node)) {\n const resolved = this.node.resolve(this.doc)\n return !resolved || isScalar(resolved)\n }\n return isScalar(this.node)\n }\n\n isSequence(): boolean {\n if (!this.node) return false\n if (isAlias(this.node)) {\n const resolved = this.node.resolve(this.doc)\n return resolved !== null && isSeq(resolved)\n }\n return isSeq(this.node)\n }\n\n isMapping(): boolean {\n if (!this.node) return false\n if (isAlias(this.node)) {\n const resolved = this.node.resolve(this.doc)\n return resolved !== null && isMap(resolved)\n }\n return isMap(this.node)\n }\n\n isString(): boolean {\n return typeof this.getScalarValue() === 'string'\n }\n\n isNumber(): boolean {\n return typeof this.getScalarValue() === 'number'\n }\n\n isBoolean(): boolean {\n return typeof this.getScalarValue() === 'boolean'\n }\n\n isNull(): boolean {\n return this.getScalarValue() === null\n }\n\n // ---------------------------------------------------------------------------\n // HELPERS\n // ---------------------------------------------------------------------------\n\n /**\n * Resolve alias if this is one, otherwise return self.\n */\n private resolveIfAlias(): YamlResult<YamlNode> {\n if (this.node && isAlias(this.node)) {\n return this.resolveAlias()\n }\n return ok(this, this._path)\n }\n\n /**\n * Get the scalar value, resolving aliases.\n */\n private getScalarValue(): unknown {\n if (!this.node) return null\n if (isAlias(this.node)) {\n const resolved = this.node.resolve(this.doc)\n if (!resolved) return null\n if (isScalar(resolved)) return resolved.value\n return resolved.toJSON()\n }\n if (isScalar(this.node)) return this.node.value\n return this.node.toJSON()\n }\n}\n\n/**\n * Returns a human-readable type name.\n */\nfunction typeOf(value: unknown): string {\n if (value === null) return 'null'\n if (Array.isArray(value)) return 'sequence'\n if (typeof value === 'object') return 'mapping'\n return typeof value\n}\n","/**\n * YAML spec builders — build-time recorders that produce YamlSpec objects.\n *\n * Mirror the runtime YamlNode API but record navigation steps\n * as JSON-serializable specs.\n *\n * @module yaml/yaml-spec-builder\n */\n\nimport type { ExtractSpec, ArraySpec, Spec } from '@origints/core'\nimport type { YamlStep, YamlExtract } from './yaml-spec'\n\nfunction buildSpec<E extends YamlExtract>(\n steps: readonly YamlStep[],\n extract: E\n): ExtractSpec<YamlStep, E> {\n return { kind: 'extract', format: 'yaml', steps, extract }\n}\n\n/**\n * Spec builder for a YAML node — navigation and extraction.\n *\n * Used as `$` in `emit()` after `.mapIn(parseYaml())`.\n *\n * @example\n * ```ts\n * .mapIn(parseYaml())\n * .emit((out, $) => out\n * .add('host', $.get('server').get('host').string())\n * .add('port', $.get('server').get('port').number())\n * )\n * ```\n */\nexport class YamlSpecBuilder {\n private constructor(private readonly steps: readonly YamlStep[]) {}\n\n /** Create a root spec builder */\n static root(): YamlSpecBuilder {\n return new YamlSpecBuilder([])\n }\n\n /** Navigate to a mapping property */\n get(key: string): YamlSpecBuilder {\n return new YamlSpecBuilder([...this.steps, { kind: 'get', key }])\n }\n\n /** Navigate to a sequence element */\n at(index: number): YamlSpecBuilder {\n return new YamlSpecBuilder([...this.steps, { kind: 'at', index }])\n }\n\n /** Extract as string */\n string(): ExtractSpec<YamlStep, 'string'> {\n return buildSpec(this.steps, 'string')\n }\n\n /** Extract as number */\n number(): ExtractSpec<YamlStep, 'number'> {\n return buildSpec(this.steps, 'number')\n }\n\n /** Extract as boolean */\n boolean(): ExtractSpec<YamlStep, 'boolean'> {\n return buildSpec(this.steps, 'boolean')\n }\n\n /** Extract as null */\n null(): ExtractSpec<YamlStep, 'null'> {\n return buildSpec(this.steps, 'null')\n }\n\n /** Iterate over sequence items, mapping each to a spec */\n array<T extends Spec>(\n itemMapper: (item: YamlSpecBuilder) => T\n ): ArraySpec<T> {\n const itemSpec = itemMapper(YamlSpecBuilder.root())\n return {\n kind: 'array',\n source: buildSpec(this.steps, 'items'),\n items: itemSpec,\n }\n }\n\n /** Extract all items as strings */\n strings(): ArraySpec<ExtractSpec<YamlStep, 'string'>> {\n return this.array(item => item.string())\n }\n\n /** Extract all items as numbers */\n numbers(): ArraySpec<ExtractSpec<YamlStep, 'number'>> {\n return this.array(item => item.number())\n }\n}\n","/**\n * Utility functions for YAML package.\n *\n * @module yaml/util\n */\n\n/**\n * Convert a ReadableStream<Uint8Array> to a string.\n */\nexport async function streamToString(\n stream: ReadableStream<Uint8Array>\n): Promise<string> {\n const reader = stream.getReader()\n const decoder = new TextDecoder()\n const chunks: string[] = []\n\n try {\n while (true) {\n const { done, value } = await reader.read()\n if (done) break\n chunks.push(decoder.decode(value, { stream: true }))\n }\n // Flush the decoder\n chunks.push(decoder.decode())\n return chunks.join('')\n } finally {\n reader.releaseLock()\n }\n}\n","/**\n * YAML parsing transform for Origins.\n *\n * @module yaml/parse\n */\n\nimport {\n parseDocument,\n parseAllDocuments,\n ParseOptions,\n DocumentOptions,\n} from 'yaml'\nimport type {\n TransformAst,\n TransformImpl,\n TypedTransformAst,\n} from '@origints/core'\nimport { YamlSpecBuilder } from './yaml-spec-builder'\nimport { YamlNode } from './yaml-node'\nimport { streamToString } from './util'\n\n/**\n * Options for parsing YAML.\n */\nexport interface YamlParseOptions {\n /**\n * How to handle duplicate keys in mappings.\n * - 'error': Throw an error (default)\n * - 'warn': Log a warning and use the last value\n * - 'last': Silently use the last value\n */\n duplicateKeys?: 'error' | 'warn' | 'last'\n\n /**\n * Maximum number of aliases to resolve.\n * This is a security measure to prevent YAML bombs.\n * Default: 100\n */\n maxAliasCount?: number\n\n /**\n * Preserve comments in the parsed document.\n * Default: true\n */\n preserveComments?: boolean\n\n /**\n * YAML version to use.\n * Default: '1.2'\n */\n version?: '1.1' | '1.2'\n}\n\n/**\n * Creates a TransformAst for parsing YAML.\n *\n * @example\n * ```ts\n * const plan = new Planner()\n * .in(loadFile('config.yaml'))\n * .mapIn(parseYaml())\n * .emit((out, $) => out\n * .add('host', $.get('server').get('host').string())\n * )\n * .compile()\n * ```\n */\nexport function parseYaml(\n options?: YamlParseOptions\n): TypedTransformAst<YamlSpecBuilder> {\n return {\n kind: 'transform',\n namespace: '@origints/yaml',\n name: 'parseYaml',\n args: options,\n specBuilderFactory: () => YamlSpecBuilder.root(),\n }\n}\n\n/**\n * Creates a TransformAst for parsing multi-document YAML.\n * Returns an array of YamlNodes, one for each document.\n *\n * @example\n * ```ts\n * const plan = new Planner()\n * .in(loadFile('multi.yaml'))\n * .mapIn(parseYamlAll())\n * .emit((out, $) => out\n * .add('names', $.array(doc => doc.get('name').string()))\n * )\n * .compile()\n * ```\n */\nexport function parseYamlAll(options?: YamlParseOptions): TransformAst {\n return {\n kind: 'transform',\n namespace: '@origints/yaml',\n name: 'parseYamlAll',\n args: options,\n }\n}\n\n/**\n * Transform implementation for parseYaml.\n */\nexport const parseYamlImpl: TransformImpl = {\n namespace: '@origints/yaml',\n name: 'parseYaml',\n\n execute(input: unknown, args?: unknown): YamlNode {\n const options = (args as YamlParseOptions) ?? {}\n const yamlOptions = toYamlParseOptions(options)\n\n let content: string\n if (typeof input === 'string') {\n content = input\n } else if (input instanceof ReadableStream) {\n // This will be handled asynchronously by the executor\n throw new Error(\n 'parseYaml received a stream. Use streamToString first or ensure the input is a string.'\n )\n } else {\n throw new Error(`parseYaml expects string input, got ${typeof input}`)\n }\n\n const doc = parseDocument(content, yamlOptions)\n\n // Check for errors\n if (doc.errors.length > 0) {\n const error = doc.errors[0]\n throw new Error(`YAML parse error: ${error.message}`)\n }\n\n return YamlNode.fromDocument(doc)\n },\n}\n\n/**\n * Async transform implementation for parseYaml (handles streams).\n */\nexport const parseYamlAsyncImpl: TransformImpl = {\n namespace: '@origints/yaml',\n name: 'parseYaml',\n\n async execute(input: unknown, args?: unknown): Promise<YamlNode> {\n const options = (args as YamlParseOptions) ?? {}\n const yamlOptions = toYamlParseOptions(options)\n\n let content: string\n if (typeof input === 'string') {\n content = input\n } else if (input instanceof ReadableStream) {\n content = await streamToString(input)\n } else if (input instanceof Uint8Array) {\n content = new TextDecoder().decode(input)\n } else if (input instanceof ArrayBuffer) {\n content = new TextDecoder().decode(input)\n } else {\n throw new Error(\n `parseYaml expects a string, stream, Uint8Array, or ArrayBuffer input, got ${typeof input}`\n )\n }\n\n const doc = parseDocument(content, yamlOptions)\n\n // Check for errors\n if (doc.errors.length > 0) {\n const error = doc.errors[0]\n throw new Error(`YAML parse error: ${error.message}`)\n }\n\n return YamlNode.fromDocument(doc)\n },\n}\n\n/**\n * Transform implementation for parseYamlAll.\n */\nexport const parseYamlAllImpl: TransformImpl = {\n namespace: '@origints/yaml',\n name: 'parseYamlAll',\n\n async execute(input: unknown, args?: unknown): Promise<YamlNode[]> {\n const options = (args as YamlParseOptions) ?? {}\n const yamlOptions = toYamlParseOptions(options)\n\n let content: string\n if (typeof input === 'string') {\n content = input\n } else if (input instanceof ReadableStream) {\n content = await streamToString(input)\n } else {\n throw new Error(\n `parseYamlAll expects string or stream input, got ${typeof input}`\n )\n }\n\n const docs = parseAllDocuments(content, yamlOptions)\n\n // Check for errors in any document\n for (const doc of docs) {\n if (doc.errors.length > 0) {\n const error = doc.errors[0]\n throw new Error(`YAML parse error: ${error.message}`)\n }\n }\n\n return docs.map(doc => YamlNode.fromDocument(doc))\n },\n}\n\n/**\n * Convert our options to yaml library options.\n * Note: maxAliasCount is used during toJS conversion, not during parsing.\n */\nfunction toYamlParseOptions(\n options: YamlParseOptions\n): ParseOptions & DocumentOptions {\n return {\n uniqueKeys: options.duplicateKeys !== 'last',\n keepSourceTokens: true, // Needed for position tracking\n version: options.version ?? '1.2',\n }\n}\n","/**\n * Runtime executor for YamlSpec — walks spec steps against a YamlNode.\n *\n * @module yaml/yaml-spec-executor\n */\n\nimport type { ExtractionResult } from '@origints/core'\nimport type { YamlSpec } from './yaml-spec'\nimport type { YamlNode } from './yaml-node'\n\nfunction success<T>(value: T): ExtractionResult<T> {\n return { ok: true, value, path: [] }\n}\n\nfunction failure(message: string): ExtractionResult<never> {\n return { ok: false, kind: 'format', message, path: [] }\n}\n\n/**\n * Execute a YamlSpec against data (expected to be a YamlNode).\n */\nexport function executeYamlSpec(\n spec: YamlSpec,\n data: unknown\n): ExtractionResult<unknown> {\n if (spec.kind !== 'extract' || spec.format !== 'yaml') {\n return failure(\n `Expected spec kind \"extract\" with format \"yaml\", got kind \"${spec.kind}\" format \"${(spec as YamlSpec).format}\"`\n )\n }\n\n let node = data as YamlNode\n\n for (const step of spec.steps) {\n switch (step.kind) {\n case 'get': {\n const result = node.get(step.key)\n if (!result.ok)\n return failure(\n `YAML navigation failed at get(\"${step.key}\"): ${result.failure.message}`\n )\n node = result.value\n break\n }\n case 'at': {\n const result = node.at(step.index)\n if (!result.ok)\n return failure(\n `YAML navigation failed at at(${step.index}): ${result.failure.message}`\n )\n node = result.value\n break\n }\n }\n }\n\n switch (spec.extract) {\n case 'string': {\n const result = node.asString()\n if (!result.ok)\n return failure(`YAML extraction failed: ${result.failure.message}`)\n return success(result.value)\n }\n case 'number': {\n const result = node.asNumber()\n if (!result.ok)\n return failure(`YAML extraction failed: ${result.failure.message}`)\n return success(result.value)\n }\n case 'boolean': {\n const result = node.asBoolean()\n if (!result.ok)\n return failure(`YAML extraction failed: ${result.failure.message}`)\n return success(result.value)\n }\n case 'null': {\n const result = node.asNull()\n if (!result.ok)\n return failure(`YAML extraction failed: ${result.failure.message}`)\n return success(result.value)\n }\n case 'items': {\n const result = node.items()\n if (!result.ok)\n return failure(`YAML extraction failed: ${result.failure.message}`)\n return success(result.value)\n }\n }\n}\n","/**\n * Conversion from YamlNode to JSON.\n *\n * @module yaml/convert\n */\n\nimport {\n Document,\n Node as YamlAstNode,\n isScalar,\n isMap,\n isSeq,\n isAlias,\n isPair,\n} from 'yaml'\nimport { YamlNode } from './yaml-node'\nimport { YamlResult, ok, fail, YamlPath, SourcePosition } from './yaml-result'\n\n/**\n * JSON value type (mirrors @origints/core JsonValue).\n */\nexport type JsonValue =\n | null\n | boolean\n | number\n | string\n | JsonValue[]\n | { [key: string]: JsonValue }\n\n/**\n * Convert a YamlNode to a plain JSON value.\n *\n * This conversion:\n * - Resolves all aliases\n * - Strips tags, comments, and anchors\n * - Converts all values to JSON-compatible types\n *\n * @param node The YamlNode to convert\n * @returns A JSON value\n */\nexport function toJsonValue(node: YamlNode): YamlResult<JsonValue> {\n const raw = node.unwrap()\n\n if (!isJsonCompatible(raw)) {\n return fail(\n 'type',\n `Cannot convert YAML value to JSON: ${typeof raw}`,\n node.path,\n node.position\n )\n }\n\n return ok(raw as JsonValue, node.path)\n}\n\n/**\n * Check if a value is JSON-compatible.\n */\nfunction isJsonCompatible(value: unknown): boolean {\n if (value === null) return true\n if (typeof value === 'boolean') return true\n if (typeof value === 'number') return Number.isFinite(value)\n if (typeof value === 'string') return true\n if (Array.isArray(value)) return value.every(isJsonCompatible)\n if (typeof value === 'object') {\n return Object.values(value).every(isJsonCompatible)\n }\n return false\n}\n\n/**\n * Options for YAML to JSON conversion.\n */\nexport interface ToJsonOptions {\n /**\n * How to handle non-JSON-compatible values (Infinity, NaN, undefined).\n * - 'error': Throw an error (default)\n * - 'null': Convert to null\n * - 'string': Convert to string representation\n */\n nonJsonValues?: 'error' | 'null' | 'string'\n\n /**\n * How to handle Date objects.\n * - 'iso': Convert to ISO 8601 string (default)\n * - 'timestamp': Convert to Unix timestamp (number)\n * - 'preserve': Keep as Date object (not JSON-compatible)\n */\n dates?: 'iso' | 'timestamp' | 'preserve'\n}\n\n/**\n * Convert a YamlNode to JSON with options.\n * This walks the AST to properly handle Date objects and other YAML-specific types.\n */\nexport function toJson(\n node: YamlNode,\n options: ToJsonOptions = {}\n): YamlResult<JsonValue> {\n // Access internal AST for proper type handling\n const internal = node as unknown as {\n node: YamlAstNode | null\n doc: Document\n }\n return convertAstNode(internal.node, internal.doc, node.path, options)\n}\n\nfunction convertAstNode(\n astNode: YamlAstNode | null,\n doc: Document,\n path: YamlPath,\n options: ToJsonOptions\n): YamlResult<JsonValue> {\n if (astNode === null) return ok(null, path)\n\n // Handle aliases by resolving them\n if (isAlias(astNode)) {\n const resolved = astNode.resolve(doc)\n if (!resolved) {\n return fail(\n 'anchor',\n `Unresolved alias: ${astNode.source}`,\n path,\n getPosition(astNode)\n )\n }\n return convertAstNode(resolved, doc, path, options)\n }\n\n // Handle scalars\n if (isScalar(astNode)) {\n const value = astNode.value\n\n if (value === null) return ok(null, path)\n if (typeof value === 'boolean') return ok(value, path)\n if (typeof value === 'string') return ok(value, path)\n\n if (typeof value === 'number') {\n if (!Number.isFinite(value)) {\n switch (options.nonJsonValues ?? 'error') {\n case 'null':\n return ok(null, path)\n case 'string':\n return ok(String(value), path)\n default:\n return fail(\n 'type',\n `Cannot convert ${value} to JSON`,\n path,\n getPosition(astNode)\n )\n }\n }\n return ok(value, path)\n }\n\n if (value instanceof Date) {\n switch (options.dates ?? 'iso') {\n case 'iso':\n return ok(value.toISOString(), path)\n case 'timestamp':\n return ok(value.getTime(), path)\n default:\n return fail(\n 'type',\n 'Date objects are not JSON-compatible',\n path,\n getPosition(astNode)\n )\n }\n }\n\n // Fallback for other scalar types\n return ok(String(value), path)\n }\n\n // Handle sequences\n if (isSeq(astNode)) {\n const result: JsonValue[] = []\n for (let i = 0; i < astNode.items.length; i++) {\n const item = astNode.items[i] as YamlAstNode | null\n const itemPath = [...path, i] as YamlPath\n const itemResult = convertAstNode(item, doc, itemPath, options)\n if (!itemResult.ok) return itemResult\n result.push(itemResult.value)\n }\n return ok(result, path)\n }\n\n // Handle mappings\n if (isMap(astNode)) {\n const result: { [key: string]: JsonValue } = {}\n for (const pair of astNode.items) {\n if (!isPair(pair)) continue\n\n // Get key (handle scalar keys, resolve alias keys)\n let key: string\n const keyNode = pair.key as YamlAstNode | null\n if (keyNode === null) {\n key = 'null'\n } else if (isAlias(keyNode)) {\n const resolvedKey = keyNode.resolve(doc)\n if (resolvedKey && isScalar(resolvedKey)) {\n key = String(resolvedKey.value)\n } else {\n key = String(keyNode.source)\n }\n } else if (isScalar(keyNode)) {\n key = String(keyNode.value)\n } else {\n // Complex keys - recursively convert and stringify\n const keyResult = convertAstNode(keyNode, doc, path, options)\n if (!keyResult.ok) return keyResult\n key = JSON.stringify(keyResult.value)\n }\n\n const valuePath = [...path, key] as YamlPath\n const valueNode = pair.value as YamlAstNode | null\n const valueResult = convertAstNode(valueNode, doc, valuePath, options)\n if (!valueResult.ok) return valueResult\n result[key] = valueResult.value\n }\n return ok(result, path)\n }\n\n // Should not reach here - all YAML node types are handled above\n return fail('type', 'Unexpected YAML node type', path, undefined)\n}\n\nfunction getPosition(node: YamlAstNode): SourcePosition | undefined {\n if (!node.range) return undefined\n const [startOffset, endOffset] = node.range\n return {\n start: { line: 0, column: 0, offset: startOffset },\n end: { line: 0, column: 0, offset: endOffset },\n }\n}\n","/**\n * @origints/yaml - YAML parsing for Origins with anchor/alias/tag preservation.\n *\n * @packageDocumentation\n */\n\n// Re-export types\nexport type {\n YamlPath,\n YamlFailure,\n YamlFailureKind,\n YamlResult,\n SourcePosition,\n} from './yaml-result'\nexport { ok, fail, formatYamlPath } from './yaml-result'\n\n// Re-export YamlNode\nexport type { YamlNodeType } from './yaml-node'\nexport { YamlNode } from './yaml-node'\n\n// Re-export parse functions and implementations\nexport type { YamlParseOptions } from './parse'\nexport {\n parseYaml,\n parseYamlAll,\n parseYamlImpl,\n parseYamlAsyncImpl,\n parseYamlAllImpl,\n} from './parse'\n\n// Spec types and builders\nexport type { YamlSpec, YamlStep, YamlExtract } from './yaml-spec'\nexport { YamlSpecBuilder } from './yaml-spec-builder'\nexport { executeYamlSpec } from './yaml-spec-executor'\n\n// Re-export conversion utilities\nexport type { JsonValue, ToJsonOptions } from './convert'\nexport { toJson, toJsonValue } from './convert'\n\n// Re-export utilities\nexport { streamToString } from './util'\n\n// ---------------------------------------------------------------------------\n// Auto-registration of transforms\n// ---------------------------------------------------------------------------\n\nimport { globalRegistry, registerSpecExecutor } from '@origints/core'\nimport { parseYamlAsyncImpl, parseYamlAllImpl } from './parse'\nimport { executeYamlSpec as _executeYamlSpec } from './yaml-spec-executor'\nimport type { YamlSpec } from './yaml-spec'\n\n/**\n * Register the YAML transforms with a registry.\n * Call this to enable parseYaml() and parseYamlAll() in your plans.\n *\n * @example\n * ```ts\n * import { globalRegistry } from '@origints/core'\n * import { registerYamlTransforms } from '@origints/yaml'\n *\n * registerYamlTransforms(globalRegistry)\n * ```\n */\nexport function registerYamlTransforms(registry: {\n register(impl: {\n namespace: string\n name: string\n execute: (...args: unknown[]) => unknown\n }): void\n}): void {\n registry.register(parseYamlAsyncImpl)\n registry.register(parseYamlAllImpl)\n}\n\n// Auto-register transforms\nregisterYamlTransforms(globalRegistry)\nregisterSpecExecutor('yaml', (spec, data) =>\n _executeYamlSpec(spec as YamlSpec, data)\n)\n"],"names":["ok","value","path","fail","kind","message","position","formatYamlPath","p","YamlNode","node","_path","doc","TYPE_LABEL","startOffset","endOffset","isAlias","isMap","isSeq","root","obj","current","segment","isScalar","resolved","key","pair","item","isPair","k","newPath","index","keys","entries","items","i","typeOf","entriesResult","mapping","buildSpec","steps","extract","YamlSpecBuilder","itemMapper","itemSpec","streamToString","stream","reader","decoder","chunks","done","parseYaml","options","parseYamlAll","parseYamlImpl","input","args","yamlOptions","toYamlParseOptions","content","parseDocument","error","parseYamlAsyncImpl","parseYamlAllImpl","docs","parseAllDocuments","success","failure","executeYamlSpec","spec","data","step","result","toJsonValue","raw","isJsonCompatible","toJson","internal","convertAstNode","astNode","getPosition","itemPath","itemResult","keyNode","resolvedKey","keyResult","valuePath","valueNode","valueResult","registerYamlTransforms","registry","globalRegistry","registerSpecExecutor","_executeYamlSpec"],"mappings":"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"}
|
package/dist/parse.d.ts
CHANGED
|
@@ -1,4 +1,5 @@
|
|
|
1
|
-
import { TransformAst, TransformImpl } from '@origints/core';
|
|
1
|
+
import { TransformAst, TransformImpl, TypedTransformAst } from '@origints/core';
|
|
2
|
+
import { YamlSpecBuilder } from './yaml-spec-builder';
|
|
2
3
|
/**
|
|
3
4
|
* Options for parsing YAML.
|
|
4
5
|
*/
|
|
@@ -36,12 +37,12 @@ export interface YamlParseOptions {
|
|
|
36
37
|
* .in(loadFile('config.yaml'))
|
|
37
38
|
* .mapIn(parseYaml())
|
|
38
39
|
* .emit((out, $) => out
|
|
39
|
-
* .add('host', $.get('server').get('host').
|
|
40
|
+
* .add('host', $.get('server').get('host').string())
|
|
40
41
|
* )
|
|
41
42
|
* .compile()
|
|
42
43
|
* ```
|
|
43
44
|
*/
|
|
44
|
-
export declare function parseYaml(options?: YamlParseOptions):
|
|
45
|
+
export declare function parseYaml(options?: YamlParseOptions): TypedTransformAst<YamlSpecBuilder>;
|
|
45
46
|
/**
|
|
46
47
|
* Creates a TransformAst for parsing multi-document YAML.
|
|
47
48
|
* Returns an array of YamlNodes, one for each document.
|
|
@@ -52,7 +53,7 @@ export declare function parseYaml(options?: YamlParseOptions): TransformAst;
|
|
|
52
53
|
* .in(loadFile('multi.yaml'))
|
|
53
54
|
* .mapIn(parseYamlAll())
|
|
54
55
|
* .emit((out, $) => out
|
|
55
|
-
* .add('
|
|
56
|
+
* .add('names', $.array(doc => doc.get('name').string()))
|
|
56
57
|
* )
|
|
57
58
|
* .compile()
|
|
58
59
|
* ```
|
package/dist/yaml-node.d.ts
CHANGED
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import { TYPE_LABEL } from '@origints/core';
|
|
1
2
|
import { Document, Node as YamlAstNode } from 'yaml';
|
|
2
3
|
import { YamlResult, YamlPath, SourcePosition } from './yaml-result';
|
|
3
4
|
/**
|
|
@@ -22,6 +23,7 @@ export declare class YamlNode {
|
|
|
22
23
|
private readonly node;
|
|
23
24
|
private readonly _path;
|
|
24
25
|
private readonly doc;
|
|
26
|
+
get [TYPE_LABEL](): string;
|
|
25
27
|
private constructor();
|
|
26
28
|
/**
|
|
27
29
|
* Creates a YamlNode from a parsed YAML document.
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
import { ExtractSpec, ArraySpec, Spec } from '@origints/core';
|
|
2
|
+
import { YamlStep } from './yaml-spec';
|
|
3
|
+
/**
|
|
4
|
+
* Spec builder for a YAML node — navigation and extraction.
|
|
5
|
+
*
|
|
6
|
+
* Used as `$` in `emit()` after `.mapIn(parseYaml())`.
|
|
7
|
+
*
|
|
8
|
+
* @example
|
|
9
|
+
* ```ts
|
|
10
|
+
* .mapIn(parseYaml())
|
|
11
|
+
* .emit((out, $) => out
|
|
12
|
+
* .add('host', $.get('server').get('host').string())
|
|
13
|
+
* .add('port', $.get('server').get('port').number())
|
|
14
|
+
* )
|
|
15
|
+
* ```
|
|
16
|
+
*/
|
|
17
|
+
export declare class YamlSpecBuilder {
|
|
18
|
+
private readonly steps;
|
|
19
|
+
private constructor();
|
|
20
|
+
/** Create a root spec builder */
|
|
21
|
+
static root(): YamlSpecBuilder;
|
|
22
|
+
/** Navigate to a mapping property */
|
|
23
|
+
get(key: string): YamlSpecBuilder;
|
|
24
|
+
/** Navigate to a sequence element */
|
|
25
|
+
at(index: number): YamlSpecBuilder;
|
|
26
|
+
/** Extract as string */
|
|
27
|
+
string(): ExtractSpec<YamlStep, 'string'>;
|
|
28
|
+
/** Extract as number */
|
|
29
|
+
number(): ExtractSpec<YamlStep, 'number'>;
|
|
30
|
+
/** Extract as boolean */
|
|
31
|
+
boolean(): ExtractSpec<YamlStep, 'boolean'>;
|
|
32
|
+
/** Extract as null */
|
|
33
|
+
null(): ExtractSpec<YamlStep, 'null'>;
|
|
34
|
+
/** Iterate over sequence items, mapping each to a spec */
|
|
35
|
+
array<T extends Spec>(itemMapper: (item: YamlSpecBuilder) => T): ArraySpec<T>;
|
|
36
|
+
/** Extract all items as strings */
|
|
37
|
+
strings(): ArraySpec<ExtractSpec<YamlStep, 'string'>>;
|
|
38
|
+
/** Extract all items as numbers */
|
|
39
|
+
numbers(): ArraySpec<ExtractSpec<YamlStep, 'number'>>;
|
|
40
|
+
}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
import { ExtractSpec } from '@origints/core';
|
|
2
|
+
/**
|
|
3
|
+
* A single navigation step through a YAML document.
|
|
4
|
+
*/
|
|
5
|
+
export type YamlStep = {
|
|
6
|
+
readonly kind: 'get';
|
|
7
|
+
readonly key: string;
|
|
8
|
+
} | {
|
|
9
|
+
readonly kind: 'at';
|
|
10
|
+
readonly index: number;
|
|
11
|
+
};
|
|
12
|
+
/**
|
|
13
|
+
* The terminal extraction type for a YAML value.
|
|
14
|
+
*/
|
|
15
|
+
export type YamlExtract = 'string' | 'number' | 'boolean' | 'null' | 'items';
|
|
16
|
+
/**
|
|
17
|
+
* A complete YAML extraction spec.
|
|
18
|
+
*/
|
|
19
|
+
export type YamlSpec = ExtractSpec<YamlStep, YamlExtract>;
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@origints/yaml",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.2.0",
|
|
4
4
|
"description": "YAML parsing for Origins with anchor/alias/tag preservation.",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"license": "MIT",
|
|
@@ -20,11 +20,30 @@
|
|
|
20
20
|
"publishConfig": {
|
|
21
21
|
"access": "public"
|
|
22
22
|
},
|
|
23
|
+
"repository": {
|
|
24
|
+
"type": "git",
|
|
25
|
+
"url": "https://github.com/fponticelli/origints.git",
|
|
26
|
+
"directory": "packages/yaml"
|
|
27
|
+
},
|
|
28
|
+
"homepage": "https://origints.dev",
|
|
29
|
+
"bugs": "https://github.com/fponticelli/origints/issues",
|
|
30
|
+
"keywords": [
|
|
31
|
+
"origints",
|
|
32
|
+
"data-extraction",
|
|
33
|
+
"lineage",
|
|
34
|
+
"provenance",
|
|
35
|
+
"yaml",
|
|
36
|
+
"anchors",
|
|
37
|
+
"aliases"
|
|
38
|
+
],
|
|
39
|
+
"engines": {
|
|
40
|
+
"node": ">=18"
|
|
41
|
+
},
|
|
23
42
|
"dependencies": {
|
|
24
43
|
"yaml": "^2.7.1"
|
|
25
44
|
},
|
|
26
45
|
"peerDependencies": {
|
|
27
|
-
"@origints/core": "^0.
|
|
46
|
+
"@origints/core": "^0.2.0"
|
|
28
47
|
},
|
|
29
48
|
"devDependencies": {
|
|
30
49
|
"@types/node": "25.0.6",
|
|
@@ -34,7 +53,7 @@
|
|
|
34
53
|
"vite": "7.3.1",
|
|
35
54
|
"vite-plugin-dts": "4.5.4",
|
|
36
55
|
"vitest": "4.0.16",
|
|
37
|
-
"@origints/core": "0.
|
|
56
|
+
"@origints/core": "0.2.0"
|
|
38
57
|
},
|
|
39
58
|
"scripts": {
|
|
40
59
|
"build": "vite build",
|