@gmb/bitmark-parser 7.6.0 → 7.7.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.
Files changed (43) hide show
  1. package/README.md +54 -1
  2. package/config/bitmark.json +2 -2
  3. package/dist/browser/bitmark-parser.min.js +6 -6
  4. package/dist/browser/bitmark-parser.min.js.map +1 -1
  5. package/dist/browser/cjs/index.cjs +669 -241
  6. package/dist/browser/cjs/index.cjs.map +1 -1
  7. package/dist/browser/cjs/index.d.cts +104 -7
  8. package/dist/browser/esm/index.d.ts +104 -7
  9. package/dist/browser/esm/index.js +668 -241
  10. package/dist/browser/esm/index.js.map +1 -1
  11. package/dist/browser/esm/worker-entry.js +626 -233
  12. package/dist/browser/esm/worker-entry.js.map +1 -1
  13. package/dist/browser/wasm/bitmark_browser_full_wasm_bg.wasm +0 -0
  14. package/dist/browser/wasm/bitmark_json_wasm_bg.wasm +0 -0
  15. package/dist/browser/wasm/bitmark_wasm_bg.wasm +0 -0
  16. package/dist/index.cjs +39 -4
  17. package/dist/index.cjs.map +1 -1
  18. package/dist/index.d.cts +104 -7
  19. package/dist/index.d.ts +104 -7
  20. package/dist/index.js +38 -4
  21. package/dist/index.js.map +1 -1
  22. package/dist/legacy.cjs +1 -1
  23. package/dist/legacy.cjs.map +1 -1
  24. package/dist/legacy.js +1 -1
  25. package/dist/legacy.js.map +1 -1
  26. package/dist/worker-entry.cjs.map +1 -1
  27. package/package.json +7 -7
  28. package/schema/bitmark.schema.json +1 -1
  29. package/wasm/bitmark_wasm.d.ts +65 -31
  30. package/wasm/bitmark_wasm.js +288 -122
  31. package/wasm/bitmark_wasm_bg.wasm +0 -0
  32. package/wasm/bitmark_wasm_bg.wasm.d.ts +6 -1
  33. package/wasm/package.json +1 -1
  34. package/wasm-bitmark-json/bitmark_json_wasm.d.ts +72 -38
  35. package/wasm-bitmark-json/bitmark_json_wasm.js +301 -135
  36. package/wasm-bitmark-json/bitmark_json_wasm_bg.wasm +0 -0
  37. package/wasm-bitmark-json/bitmark_json_wasm_bg.wasm.d.ts +6 -1
  38. package/wasm-bitmark-json/package.json +1 -1
  39. package/wasm-browser-full/bitmark_browser_full_wasm.d.ts +65 -31
  40. package/wasm-browser-full/bitmark_browser_full_wasm.js +288 -122
  41. package/wasm-browser-full/bitmark_browser_full_wasm_bg.wasm +0 -0
  42. package/wasm-browser-full/bitmark_browser_full_wasm_bg.wasm.d.ts +6 -1
  43. package/wasm-browser-full/package.json +1 -1
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/legacy-entry.ts","../src/node/legacy-init.ts","../src/legacy/runtime.ts","../src/generated/package_info.ts","../src/legacy/errors.ts","../src/legacy/translate.ts","../src/legacy/pseudo-ast.ts","../src/legacy/generated/resource-collection-keys.ts","../src/legacy/builder.ts","../src/legacy/bpg-class.ts","../src/legacy/resource-builder.ts","../src/legacy/options.ts","../src/legacy/enums-extra.ts","../src/legacy/stubs.ts"],"sourcesContent":["// @zen-component: LEGACY-Facade\n// Subpath entry: `@gmb/bitmark-parser/legacy` (Node). Re-exports the legacy\n// namespace flat, so bpg consumers can migrate with only an import change:\n//\n// import { BitmarkParserGenerator } from \"@gmb/bitmark-parser/legacy\";\n\nimport { createRequire } from \"node:module\";\nimport { initLegacyNode } from \"./node/legacy-init.js\";\n\nconst require = createRequire(import.meta.url);\nconst wasm = require(\"../wasm/bitmark_wasm.js\") as typeof import(\"../wasm/bitmark_wasm.js\");\ninitLegacyNode(() => wasm);\n\nexport * from \"./legacy/index.js\";\n","// @zen-component: LEGACY-Facade\n// Node platform wiring for the legacy facade: provides the WASM module and\n// real file I/O (PLAN-126 F-5). The browser entry provides WASM only.\n\nimport * as fs from \"node:fs\";\nimport * as path from \"node:path\";\nimport { setLegacyFileIo, setLegacyWasmProvider, type LegacyWasm } from \"../legacy/runtime.js\";\n\n/**\n * `provider` is consulted per legacy call (PLAN-166): it can load the wasm\n * lazily and always reflects the active variant after an init swap.\n */\nexport function initLegacyNode(provider: () => LegacyWasm): void {\n setLegacyWasmProvider(provider);\n setLegacyFileIo({\n existsSync: (p) => fs.existsSync(p),\n readFileSync: (p, encoding) => fs.readFileSync(p, { encoding: encoding as BufferEncoding }),\n writeFile: (p, data, opts) => {\n fs.mkdirSync(path.dirname(p), { recursive: true });\n fs.writeFileSync(p, data, {\n encoding: (opts.encoding ?? \"utf8\") as BufferEncoding,\n flag: opts.append ? \"a\" : \"w\",\n });\n },\n });\n}\n","// @zen-component: LEGACY-Facade\n// Platform injection for the legacy facade. The Node and browser entries\n// provide the WASM module (and, on Node, file I/O) before exposing the\n// `legacy` namespace — the facade itself stays platform-free.\n\n/** The subset of the WASM surface the legacy facade drives. */\nexport interface LegacyWasm {\n convert(\n input: string,\n inputFormat: string,\n outputFormat: string,\n mode: string,\n pretty: boolean,\n indent: number,\n spacesAroundValues: number,\n includeUnknownProperties: boolean,\n mappingReport: boolean,\n /** `semantic-tokens` output only (PLAN-193); the legacy facade passes `\"\"`. */\n positionEncoding: string,\n tokensLayout: string,\n ): string;\n canonicalize(\n input: string,\n inputFormat: string,\n mode: string,\n pretty: boolean,\n indent: number,\n spacesAroundValues: number,\n ): string;\n breakscape_text(input: string, format: string, location: string): string;\n unbreakscape_text(input: string, format: string, location: string): string;\n info(\n infoType: string,\n format: string,\n bit: string,\n pretty: boolean,\n indent: number,\n includeDeprecated: boolean,\n onlyDeprecated: boolean,\n full: boolean,\n language: string,\n ): string;\n is_bitmark(input: string): boolean;\n prettify(json: string, indent: number): string;\n convert_text(input: string, direction: string, format: string, location: string): string;\n}\n\nlet wasmProvider: (() => LegacyWasm) | undefined;\n\nexport function setLegacyWasm(wasm: LegacyWasm): void {\n wasmProvider = () => wasm;\n}\n\n/**\n * Provide the WASM module lazily (PLAN-166): the provider is consulted on\n * every legacy call, so it can defer loading and always reflects the ACTIVE\n * variant after an `init({ feature })` swap.\n */\nexport function setLegacyWasmProvider(provider: () => LegacyWasm): void {\n wasmProvider = provider;\n}\n\nexport function getLegacyWasm(): LegacyWasm {\n if (!wasmProvider) {\n throw new Error(\n \"legacy API not initialised: the WASM module has not been provided (browser consumers must call init() first)\",\n );\n }\n return wasmProvider();\n}\n\n/** Node file I/O, injected by the Node entry only (PLAN-126 F-5). */\nexport interface LegacyFileIo {\n existsSync(path: string): boolean;\n readFileSync(path: string, encoding: string): string;\n /** Write (or append) `data`, creating parent directories as needed. */\n writeFile(path: string, data: string, opts: { append?: boolean; encoding?: string }): void;\n}\n\nlet fileIo: LegacyFileIo | undefined;\n\nexport function setLegacyFileIo(io: LegacyFileIo): void {\n fileIo = io;\n}\n\n/** Returns undefined in the browser (no file I/O). */\nexport function getLegacyFileIo(): LegacyFileIo | undefined {\n return fileIo;\n}\n","// This file is automatically generated. DO NOT EDIT.\n\n/* eslint-disable */\n\nexport const PACKAGE_INFO = {\n \"name\": \"@gmb/bitmark-parser\",\n \"version\": \"7.6.0\",\n \"author\": \"Get More Brain Ltd <info@getmorebrain.com>\",\n \"license\": \"ISC\",\n \"description\": \"A parser for bitmark text, powered by WebAssembly.\"\n};\n","// @zen-component: LEGACY-Facade\n\n/** Error thrown for bpg API members / options the legacy facade does not support. */\nexport class LegacyUnsupportedError extends Error {\n constructor(message: string) {\n super(message);\n this.name = \"LegacyUnsupportedError\";\n }\n}\n\n/** Throw for a bpg API member that is not supported (PLAN-126 F-2). */\nexport function unsupportedMember(member: string, reason?: string): never {\n throw new LegacyUnsupportedError(\n `'${member}' is not supported by the @gmb/bitmark-parser legacy API` + (reason ? `: ${reason}` : \"\"),\n );\n}\n\n/** Throw for an option that cannot be honoured (PLAN-126 F-9: never silently ignore). */\nexport function unsupportedOption(option: string, reason?: string): never {\n throw new LegacyUnsupportedError(\n `Option '${option}' is not supported by the @gmb/bitmark-parser legacy API` +\n (reason ? `: ${reason}` : \"\"),\n );\n}\n","// @zen-component: LEGACY-Facade\n// Central bpg-option → core-parameter translation table (PLAN-126 F-4/F-9).\n// Strict policy: options that map are honoured; options we cannot honour\n// throw a LegacyUnsupportedError naming the option. Sole exception:\n// `bitmarkParserType` is accepted and ignored — bpg v5.31.1 itself hardcodes\n// the peggy parser and ignores the option.\n\nimport { unsupportedOption } from \"./errors.js\";\nimport type { BitmarkOptions, JsonOptions } from \"./options.js\";\n\nconst V3_ONLY = \"bitmark v2 output is not supported (this parser is bitmark v3 only)\";\n\nexport function validateVersionOptions(opts: {\n bitmarkVersion?: number;\n bitmarkParserType?: string;\n}): void {\n if (opts.bitmarkVersion === 2) unsupportedOption(\"bitmarkVersion: 2\", V3_ONLY);\n // bitmarkParserType: accepted + ignored (documented exception).\n}\n\nexport function validateBitmarkOptions(o: BitmarkOptions): void {\n // The option TYPES are narrowed to the supported values (build-time\n // errors for TS consumers), but JS callers can still pass anything —\n // keep validating the runtime values (hence the widening casts).\n // Booleans error only when set truthy (false === bpg default behaviour).\n if (o.explicitTextFormat) unsupportedOption(\"bitmarkOptions.explicitTextFormat\");\n // prettifyJson: honoured — maps to the core's pretty/indent for bitmark\n // output (embedded JSON bodies of json-format bits); see prettyIndent().\n if ((o.cardSetVersion as number | undefined) === 1) {\n unsupportedOption(\"bitmarkOptions.cardSetVersion: 1\", V3_ONLY);\n }\n if (o.debugGenerationInline) unsupportedOption(\"bitmarkOptions.debugGenerationInline\");\n if (o.noBreakscaping) unsupportedOption(\"bitmarkOptions.noBreakscaping\");\n}\n\nexport function validateJsonOptions(o: JsonOptions): void {\n if (o.textAsPlainText) unsupportedOption(\"jsonOptions.textAsPlainText\", V3_ONLY);\n // excludeUnknownProperties: honoured — maps to the core's inverse\n // `includeUnknownProperties` flag (bpg default: include; see bpg-class).\n if (o.debugGenerationInline) unsupportedOption(\"jsonOptions.debugGenerationInline\");\n // enableWarnings: accepted — parser warnings are always carried in the\n // output envelope by this parser, so both values are honoured trivially.\n}\n\n/**\n * bpg `prettify?: boolean | number` → core (pretty, indent).\n *\n * Also used for `bitmarkOptions.prettifyJson` (identical bpg semantics:\n * true → indent 2, positive number → that indent, else off) — for bitmark\n * output the core's pretty/indent prettify the embedded JSON bodies of\n * json-format bits, which is exactly what bpg's prettifyJson did.\n */\nexport function prettyIndent(prettify: boolean | number | undefined): {\n pretty: boolean;\n indent: number;\n} {\n if (prettify === true) return { pretty: true, indent: 2 };\n if (typeof prettify === \"number\" && prettify > 0) return { pretty: true, indent: prettify };\n return { pretty: false, indent: 2 };\n}\n\n/** bpg `spacesAroundValues?: number | boolean` → core spaces count (cap 10, as bpg). */\nexport function spacesAround(v: number | boolean | undefined): number {\n if (v === undefined || v === true) return 1;\n if (v === false) return 0;\n return Math.max(0, Math.min(10, v));\n}\n\n/**\n * bpg text format value → core breakscape format.\n * bpg maps `latex`/`json`/`xml` as aliases of plain text, and defaults\n * anything else (including absent) to bitmark text (`bitmark++`).\n */\nexport function mapTextFormat(f: string | undefined): \"bitmark++\" | \"plainText\" {\n switch (f) {\n case \"text\":\n case \"latex\":\n case \"json\":\n case \"xml\":\n return \"plainText\";\n default:\n return \"bitmark++\";\n }\n}\n","// @zen-component: LEGACY-Facade\n// The legacy \"AST\" is bit JSON (PLAN-126 §3.1): an envelope of the parser's\n// wrapper entries (`{ bit, parser?, bitmark? }`), tagged with a\n// non-enumerable marker so it can be recognised without surviving\n// JSON.stringify. It round-trips through `convert`, but is NOT bpg's\n// internal TS AST node model (no `cardNode` / `BodyPart[]` structure).\n\nexport const PSEUDO_AST_MARKER = Symbol.for(\"@gmb/bitmark-parser/legacy-pseudo-ast\");\n\nexport interface LegacyPseudoAst {\n bits: unknown[];\n}\n\nexport function makePseudoAst(bits: unknown[]): LegacyPseudoAst {\n const ast: LegacyPseudoAst = { bits };\n Object.defineProperty(ast, PSEUDO_AST_MARKER, { value: true, enumerable: false });\n return ast;\n}\n\nexport function isPseudoAst(v: unknown): v is LegacyPseudoAst {\n return (\n v !== null &&\n typeof v === \"object\" &&\n (PSEUDO_AST_MARKER in v || Array.isArray((v as LegacyPseudoAst).bits))\n );\n}\n","// GENERATED FILE — do not edit.\n// Emitted by scripts/gen-legacy-resource-keys.mjs from\n// resources/bitmark-configurator/bitmark.json. Regenerate via `npm run init`.\n//\n// Every bit whose config maps a repeatable resource tag group onto a single\n// JSON collection key. The legacy `Builder.buildBit` routes bpg's\n// `resources` input onto this key (bpg's JsonGenerator special-cased the\n// same family by bit type; here it is derived from config).\n\n/** A bit's resource-collection mapping: target JSON key + accepted resource type. */\nexport interface ResourceCollection {\n key: string;\n resourceType: string;\n}\n\nexport const RESOURCE_COLLECTION_KEYS: Readonly<Record<string, ResourceCollection>> = {\n \"extractor-image\": { key: \"images\", resourceType: \"image\" },\n \"extractor-image-collapsible\": { key: \"images\", resourceType: \"image\" },\n \"images-logo-grave\": { key: \"logos\", resourceType: \"image\" },\n \"prototype-images\": { key: \"images\", resourceType: \"image\" },\n};\n","// @zen-component: LEGACY-Facade\n// bpg-compatible `Builder` (PLAN-126 §3.1): the legacy AST is bit JSON, so\n// building a bit is a data *mapping* (bpg buildBit data → bit JSON keys)\n// followed by one WASM json→json normalization pass — the config-driven core\n// performs the defaulting/coercion/validation that bpg's ~4.2k-line builder\n// does in TS. No parsing logic lives here.\n\nimport { getLegacyWasm } from \"./runtime.js\";\nimport { makePseudoAst, type LegacyPseudoAst } from \"./pseudo-ast.js\";\nimport { RESOURCE_COLLECTION_KEYS } from \"./generated/resource-collection-keys.js\";\nimport type { ParserError, ParserInfo } from \"./vendor/enums.js\";\n\n/** Carries bpg `data.parser` (wrapper-level metadata) invisibly on the built bit. */\nexport const BUILT_BIT_PARSER = Symbol.for(\"@gmb/bitmark-parser/legacy-built-bit-parser\");\n\n/**\n * bpg buildBit data keys whose bit-JSON key differs. Everything else in the\n * flat data object maps by identity (the data fields are already the bpg\n * JSON model types) and unknown keys pass through untouched (PLAN-126 F-6).\n */\nconst DATA_KEY_TO_JSON_KEY: Record<string, string> = {\n bitType: \"type\",\n textFormat: \"format\",\n flashcards: \"cards\",\n markConfig: \"marks\",\n};\n\n/** bpg deprecated text-format value accepted by buildBit. */\nconst DEPRECATED_TEXT_FORMATS: Record<string, string> = {\n \"bitmark--\": \"bitmark++\",\n \"bitmark+\": \"bitmark++\",\n};\n\n/**\n * Config `bodyFormat` → bpg TextFormat value. When the caller omits\n * `textFormat`, bpg defaults to the bit config's `textFormatDefault`\n * (bpg Builder.bit), which is derived from the config `bodyFormat` — NOT\n * to bitmark text. E.g. `extractor-information` (bodyFormat: json) built\n * without an explicit `textFormat` must keep its JSON body verbatim.\n */\nconst CONFIG_BODY_FORMAT_TO_TEXT_FORMAT: Record<string, string> = {\n bitmark: \"bitmark++\",\n text: \"text\",\n json: \"json\",\n latex: \"latex\",\n xml: \"xml\",\n};\n\n/** Top-level bit JSON fields typed JsonText (tag location) in bpg. */\nconst TAG_TEXT_KEYS = [\n \"title\",\n \"subtitle\",\n \"item\",\n \"lead\",\n \"pageNumber\",\n \"marginNumber\",\n \"hint\",\n \"instruction\",\n \"caption\",\n] as const;\n\nexport interface BuildBitOptions {\n cardSet?: {\n sideNo: number;\n variantNo: number;\n };\n}\n\nexport class Builder {\n /**\n * Build bitmark AST envelope (bpg-compatible `buildBitmark`).\n */\n buildBitmark(data: { bits?: unknown[]; errors?: ParserError[] }): LegacyPseudoAst {\n const ast = makePseudoAst(data.bits ?? []);\n if (data.errors !== undefined) {\n (ast as LegacyPseudoAst & { errors?: ParserError[] }).errors = data.errors;\n }\n return ast;\n }\n\n /**\n * Build a bit (bpg-compatible `buildBit`).\n *\n * Accepts the full bpg data shape (flat, ~250 optional fields, values in\n * the JSON model types). Returns the normalized bit JSON. Throws\n * `No config found for bit: X` for unknown bit types, as bpg does.\n *\n * NOTE (documented divergences from bpg):\n * - the return value is bit JSON, not bpg's internal AST node model;\n * - `resourceType` (an inference hint in bpg) is not carried into the\n * JSON — the attached `resource` object is authoritative.\n *\n * `resources` follows bpg's JsonGenerator routing: on a bit whose config\n * maps a repeatable resource tag group onto a collection key (e.g.\n * `images` / `logos` — see the generated RESOURCE_COLLECTION_KEYS), the\n * matching-type entries land under that key; on every other bit the first\n * entry becomes the canonical single `resource` (as bpg: \"if there is\n * more than one resource, use the first one\").\n */\n buildBit(data: Record<string, unknown>, _options?: BuildBitOptions): Record<string, unknown> {\n const wasm = getLegacyWasm();\n const src = { ...data };\n\n const bitType = src.bitType as string | undefined;\n const bitConfig = this.getBitConfig(bitType);\n\n // --- divergent keys ---\n const bit: Record<string, unknown> = {};\n bit.type = bitType;\n if (src.isCommented) {\n bit.type = \"_comment\";\n bit.originalType = bitType;\n }\n delete src.bitType;\n delete src.isCommented;\n\n const textFormat = src.textFormat as string | undefined;\n if (textFormat !== undefined) {\n bit.format = DEPRECATED_TEXT_FORMATS[textFormat] ?? textFormat;\n delete src.textFormat;\n } else {\n // bpg parity: `textFormat ?? bitConfig.textFormatDefault` — the\n // config-driven default, so e.g. JSON-bodied bits don't get their\n // body mangled by the bitmark text parser (see parseStringTexts).\n bit.format = CONFIG_BODY_FORMAT_TO_TEXT_FORMAT[bitConfig.bodyFormat ?? \"\"] ?? \"bitmark++\";\n }\n\n // resourceType is an inference hint only (see doc comment)\n delete src.resourceType;\n\n // body: accept bpg's Partial<Body> node ({ body: <JsonText> }) or a bare JsonText\n const body = src.body as { body?: unknown } | unknown;\n if (body !== undefined && body !== null && typeof body === \"object\" && \"body\" in (body as object)) {\n bit.body = (body as { body?: unknown }).body;\n delete src.body;\n }\n\n // example / __isDefaultExample → isExample + example (bpg toExample semantics)\n if (src.example !== undefined) {\n bit.isExample = true;\n bit.example = src.example;\n delete src.example;\n delete src.__isDefaultExample;\n } else if (src.__isDefaultExample) {\n bit.isExample = true;\n delete src.__isDefaultExample;\n }\n\n // resources → the bit's resource-collection key (config-derived), else\n // the canonical single `resource` — bpg's JsonGenerator routing.\n const resources = src.resources;\n if (resources !== undefined && bitType !== undefined) {\n const list = Array.isArray(resources) ? resources : [resources];\n const collection = RESOURCE_COLLECTION_KEYS[bitType];\n if (collection) {\n // bpg keeps only the entries of the collection's resource type.\n bit[collection.key] = list.filter(\n (r) =>\n r !== null &&\n typeof r === \"object\" &&\n (r as { type?: unknown }).type === collection.resourceType,\n );\n } else if (list.length >= 1) {\n bit.resource = list[0];\n }\n delete src.resources;\n }\n\n // parser metadata lives on the wrapper, not in the bit JSON\n const parser = src.parser as ParserInfo | undefined;\n delete src.parser;\n\n // extraProperties spread into the bit JSON top level (bpg semantics)\n const extraProperties = src.extraProperties as Record<string, unknown> | undefined;\n delete src.extraProperties;\n\n // --- renamed + identity + unknown keys (pass through, PLAN-126 F-6) ---\n for (const [key, value] of Object.entries(src)) {\n if (value === undefined) continue;\n bit[DATA_KEY_TO_JSON_KEY[key] ?? key] = value;\n }\n if (extraProperties) {\n for (const [key, value] of Object.entries(extraProperties)) {\n if (!(key in bit)) bit[key] = value;\n }\n }\n\n // --- bpg parity: string JsonText values are parsed bitmark text ---\n this.parseStringTexts(bit);\n\n // --- normalization pass: the config-driven core defaults/coerces/validates ---\n const out = wasm.convert(JSON.stringify([{ bit }]), \"json\", \"json\", \"optimized\", false, 2, 1, false, false, \"\", \"\");\n const entries = JSON.parse(out) as { bit: Record<string, unknown> }[];\n const built = entries[0]?.bit ?? bit;\n\n // F-6: keys the core doesn't know are dropped by the normalize pass —\n // re-attach them so nothing is lost silently. Values matching bpg's own\n // \"unset optional\" strip set (false / \"\" / [] / null) stay stripped,\n // mirroring bpg's removeUnwantedProperties.\n for (const [key, value] of Object.entries(bit)) {\n if (key in built) continue;\n if (\n value === false ||\n value === \"\" ||\n value === null ||\n (Array.isArray(value) && value.length === 0)\n ) {\n continue;\n }\n built[key] = value;\n }\n if (parser !== undefined) {\n Object.defineProperty(built, BUILT_BIT_PARSER, { value: parser, enumerable: false });\n }\n return built;\n }\n\n /**\n * Build a highlight body bit (bpg-compatible `buildHighlight`).\n * Shapes the HighlightJson body-bit; unset optionals are omitted.\n */\n buildHighlight(\n _context: unknown,\n data: Record<string, unknown> | undefined,\n ): Record<string, unknown> | undefined {\n if (!data) return undefined;\n const src = { ...data };\n // bpg: data may arrive nested under 'attrs' (when coming from JSON)\n const attrs = src.attrs as Record<string, unknown> | undefined;\n if (attrs) Object.assign(src, attrs);\n\n const texts = Array.isArray(src.texts)\n ? (src.texts as Record<string, unknown>[]).filter((t) => t != null).map((t) => ({\n text: t.text ?? \"\",\n isCorrect: t.isCorrect ?? false,\n isHighlighted: t.isHighlighted ?? false,\n ...stripUndefined(t, [\"text\", \"isCorrect\", \"isHighlighted\"]),\n }))\n : [];\n\n const node: Record<string, unknown> = {\n type: \"highlight\",\n texts,\n prefix: src.prefix ?? \"\",\n postfix: src.postfix ?? \"\",\n ...stripUndefined(src, [\"type\", \"texts\", \"prefix\", \"postfix\", \"attrs\"]),\n attrs: {},\n };\n return node;\n }\n\n /**\n * bpg's builder parses string-valued JsonText fields as bitmark text\n * (inline marks become TextAst marks); the composer would otherwise treat\n * them as literal text. Converts top-level JsonText fields in place.\n * Nested (card-content) strings are left literal — documented divergence.\n *\n * A string body is dispatched on the bit's resolved text format, as bpg's\n * buildBody: bitmark text is parsed to TextAst, `json` is JSON.parsed\n * (unparseable → null), and plain-text formats (text/latex/xml) stay\n * verbatim. Tag texts are always bitmark text, independent of body format\n * (bpg TextParser.toAst ignores format; only location matters).\n */\n private parseStringTexts(bit: Record<string, unknown>): void {\n const wasm = getLegacyWasm();\n const toAst = (s: string, location: \"body\" | \"tag\"): unknown => {\n if (s === \"\") return s;\n const out = wasm.convert_text(s, \"textToAst\", \"bitmark++\", location);\n try {\n return JSON.parse(out) as unknown;\n } catch {\n return s;\n }\n };\n\n const format = bit.format as string | undefined;\n const bitmarkBody = format === undefined || format === \"bitmark++\" || format === \"bitmark+\";\n if (typeof bit.body === \"string\") {\n if (format === \"json\") {\n // bpg handleJsonBody: parse legacy string bodies; null on failure\n try {\n bit.body = JSON.parse(bit.body) as unknown;\n } catch {\n bit.body = null;\n }\n } else if (bitmarkBody) {\n bit.body = toAst(bit.body, \"body\");\n }\n // plain-text formats (text/latex/xml): body stays a verbatim string\n }\n for (const key of TAG_TEXT_KEYS) {\n const v = bit[key];\n if (typeof v === \"string\") bit[key] = toAst(v, \"tag\");\n }\n }\n\n /**\n * Look up the bit's config (`wasm.info`); throws bpg's exact\n * bit-type-invalid error (`Config.getBitConfig` parity).\n */\n private getBitConfig(bitType: string | undefined): { bodyFormat?: string } {\n const wasm = getLegacyWasm();\n if (bitType !== undefined) {\n try {\n const info = JSON.parse(wasm.info(\"bit\", \"json\", bitType, false, 2, false, false, true, \"\")) as {\n error?: string;\n body?: { format?: string };\n };\n // PLAN-149 restructured the info JSON: bodyFormat now lives at\n // `body.format`; adapt to the legacy flat shape callers expect.\n if (info.error === undefined) return { bodyFormat: info.body?.format };\n } catch {\n // fall through to the not-found error\n }\n }\n throw new Error(`No config found for bit: ${bitType}`);\n }\n}\n\nfunction stripUndefined(\n src: Record<string, unknown>,\n exclude: string[],\n): Record<string, unknown> {\n const out: Record<string, unknown> = {};\n for (const [k, v] of Object.entries(src)) {\n if (v !== undefined && !exclude.includes(k)) out[k] = v;\n }\n return out;\n}\n","// @zen-component: LEGACY-Facade\n// bpg-compatible `BitmarkParserGenerator` class — a thin synchronous wrapper\n// over the WASM core (PLAN-126). Behavioural parity is at the call boundary:\n// same method names, option keys and return shapes as bpg v5.31.1.\n\nimport { PACKAGE_INFO } from \"../generated/package_info.js\";\nimport { unsupportedMember, unsupportedOption } from \"./errors.js\";\nimport { getLegacyFileIo, getLegacyWasm } from \"./runtime.js\";\nimport {\n mapTextFormat,\n prettyIndent,\n spacesAround,\n validateBitmarkOptions,\n validateJsonOptions,\n validateVersionOptions,\n} from \"./translate.js\";\nimport type {\n BreakscapeOptions,\n ConvertHtmlTableOptions,\n ConvertOptions,\n ConvertTextOptions,\n CreateAstOptions,\n ExtractPlainTextOptions,\n FileOptions,\n InfoOptions,\n UnbreakscapeOptions,\n UpgradeOptions,\n} from \"./options.js\";\nimport { makePseudoAst, type LegacyPseudoAst } from \"./pseudo-ast.js\";\nimport { BUILT_BIT_PARSER } from \"./builder.js\";\n\n/** Classified input for the convert/upgrade pipeline (PLAN-126 F-10). */\ninterface ResolvedInput {\n /** JSON-wrapper-array string (json/ast input) or bitmark source (bitmark input). */\n source: string;\n isBitmark: boolean;\n}\n\nexport class BitmarkParserGenerator {\n /**\n * Get the version of the library.\n *\n * Reports the @gmb/bitmark-parser version (not a bpg version string).\n */\n public version(): string {\n return PACKAGE_INFO.version;\n }\n\n /**\n * Convert bitmark from bitmark to JSON, or JSON to bitmark (bpg-compatible).\n *\n * Input detection order matches bpg: AST → JSON → assume bitmark.\n * Default output: bitmark input → json; json/ast input → bitmark.\n */\n public convert(input: string | unknown, options?: ConvertOptions): string | unknown | void {\n const opts: ConvertOptions = Object.assign({}, options);\n const jsonOptions = Object.assign({}, opts.jsonOptions);\n const bitmarkOptions = Object.assign({}, opts.bitmarkOptions);\n validateVersionOptions(opts);\n validateBitmarkOptions(bitmarkOptions);\n validateJsonOptions(jsonOptions);\n this.checkBrowserFileWrite(opts.outputFile);\n\n const wasm = getLegacyWasm();\n const { source, isBitmark } = this.resolveInput(input, opts.inputFormat);\n\n const outputFormat = opts.outputFormat ?? (isBitmark ? \"json\" : \"bitmark\");\n const coreFormat = outputFormat === \"ast\" ? \"json\" : outputFormat;\n // bpg parity: `jsonOptions.prettify` governs JSON output only;\n // `bitmarkOptions.prettifyJson` governs bitmark output (it prettifies the\n // embedded JSON bodies of json-format bits — same boolean|number shape).\n const { pretty, indent } = prettyIndent(jsonOptions.prettify);\n const emit =\n coreFormat === \"bitmark\" ? prettyIndent(bitmarkOptions.prettifyJson) : { pretty, indent };\n const spaces = spacesAround(bitmarkOptions.spacesAroundValues);\n // bpg parity: unknown properties are included in JSON output unless\n // `jsonOptions.excludeUnknownProperties` is set (the core flag is the\n // inverse and only affects the bitmark → JSON direction).\n const includeUnknown = !jsonOptions.excludeUnknownProperties;\n\n const out = wasm.convert(source, isBitmark ? \"bitmark\" : \"json\", coreFormat, \"optimized\", emit.pretty, emit.indent, spaces, includeUnknown, false, \"\", \"\");\n\n // Shape the result per output format (bpg-compatible return shapes)\n if (outputFormat === \"bitmark\" || outputFormat === \"text\") {\n return this.deliver(out, opts.outputFile, opts.fileOptions);\n }\n if (outputFormat === \"json\") {\n if (opts.outputFile) return this.deliver(out, opts.outputFile, opts.fileOptions);\n if (pretty || jsonOptions.stringify) return out;\n return JSON.parse(out) as unknown;\n }\n // outputFormat === \"ast\": bit-JSON pseudo-AST (PLAN-126 §3.1)\n const ast = makePseudoAst(JSON.parse(out) as unknown[]);\n if (opts.outputFile) {\n return this.deliver(JSON.stringify(ast), opts.outputFile, opts.fileOptions);\n }\n return ast;\n }\n\n /**\n * Upgrade (prettify / canonicalize) bitmark or JSON to the latest version\n * of itself (bpg-compatible `upgrade`).\n */\n public upgrade(input: string | unknown, options?: UpgradeOptions): string | unknown | void {\n const opts: UpgradeOptions = Object.assign({}, options);\n const jsonOptions = Object.assign({}, opts.jsonOptions);\n const bitmarkOptions = Object.assign({}, opts.bitmarkOptions);\n validateVersionOptions(opts);\n validateBitmarkOptions(bitmarkOptions);\n validateJsonOptions(jsonOptions);\n this.checkBrowserFileWrite(opts.outputFile);\n\n const wasm = getLegacyWasm();\n const { source, isBitmark } = this.resolveInput(input, opts.inputFormat);\n // Same routing as convert(): bitmark in → bitmark out, so prettifyJson\n // applies; JSON in → JSON out, so jsonOptions.prettify applies.\n const { pretty, indent } = prettyIndent(\n isBitmark ? bitmarkOptions.prettifyJson : jsonOptions.prettify,\n );\n const spaces = spacesAround(bitmarkOptions.spacesAroundValues);\n\n const out = wasm.canonicalize(source, isBitmark ? \"bitmark\" : \"json\", \"optimized\", pretty, indent, spaces);\n\n if (isBitmark) return this.deliver(out, opts.outputFile, opts.fileOptions);\n if (opts.outputFile) return this.deliver(out, opts.outputFile, opts.fileOptions);\n if (pretty || jsonOptions.stringify) return out;\n return JSON.parse(out) as unknown;\n }\n\n /**\n * Get information about the bitmark language (bpg-compatible `info`).\n */\n public info(options?: InfoOptions): unknown {\n const opts: InfoOptions = Object.assign({}, options);\n const wasm = getLegacyWasm();\n const type = opts.type ?? \"list\";\n const format = opts.outputFormat ?? \"text\";\n const { pretty, indent } = prettyIndent(opts.prettify);\n\n const coreFormat = format === \"pojo\" ? \"json\" : format;\n // full=true: the legacy facade keeps the rich info shape (bpg parity).\n // The legacy (bpg-compatible) surface is English-only by definition.\n const out = wasm.info(type, coreFormat, opts.bit ?? \"\", pretty, indent, false, false, true, \"\");\n if (format === \"pojo\") return JSON.parse(out) as unknown;\n return out;\n }\n\n /** Not supported: bpg-internal development tool. */\n public generateConfig(_options?: unknown): void {\n unsupportedMember(\"BitmarkParserGenerator.generateConfig\", \"bpg-internal development tool\");\n }\n\n /**\n * Convert between HTML tables and bitmark tables (bpg-compatible\n * `convertHtmlTable`).\n *\n * Backed by the core's schema-driven html mapping: HTML input has each\n * `<table>` wrapped in the core's `<bitmark-bit>` envelope and parsed;\n * bits input is emitted as html and the `<table>` fragments extracted\n * (the envelope stripped). The markup *inside* `<table>` follows this\n * parser's html mapping, which may differ from bpg's in detail.\n */\n public convertHtmlTable(\n input: string | unknown,\n options?: ConvertHtmlTableOptions,\n ): string | unknown | void {\n const opts: ConvertHtmlTableOptions = Object.assign({}, options);\n const jsonOptions = Object.assign({}, opts.jsonOptions);\n const bitmarkOptions = Object.assign({}, opts.bitmarkOptions);\n validateBitmarkOptions(bitmarkOptions);\n validateJsonOptions(jsonOptions);\n if (opts.keepUnknownTags) unsupportedOption(\"keepUnknownTags\");\n if (opts.noBreakscaping) unsupportedOption(\"noBreakscaping\");\n this.checkBrowserFileWrite(opts.outputFile);\n const wasm = getLegacyWasm();\n\n const inStr = typeof input === \"string\" ? this.maybeReadFile(input, undefined) : \"\";\n const isHtmlInput =\n opts.inputFormat === \"html\" ||\n (opts.inputFormat === undefined && typeof input === \"string\" && /<table[\\s>]/iu.test(inStr));\n\n if (!isHtmlInput) {\n // bits (bitmark / JSON / AST) → HTML `<table>` fragments\n const { source, isBitmark } = this.resolveInput(input, undefined);\n const out = wasm.convert(source, isBitmark ? \"bitmark\" : \"json\", \"html\", \"optimized\", false, 2, 1, false, false, \"\", \"\");\n return this.deliver(extractHtmlTables(out).join(\"\\n\"), opts.outputFile, opts.fileOptions);\n }\n\n // HTML input: wrap each <table> in the core's bit envelope and parse\n const bitType = opts.tableFormat === \"table\" ? \"table\" : \"table-extended\";\n const wrapped = extractHtmlTables(inStr)\n .map((t) => `<bitmark-bit data-type=\"${bitType}\" data-format=\"bitmark++\">${t}</bitmark-bit>`)\n .join(\"\");\n const outputFormat = opts.outputFormat ?? \"bitmark\";\n const { pretty, indent } = prettyIndent(jsonOptions.prettify);\n const spaces = spacesAround(bitmarkOptions.spacesAroundValues);\n\n if (outputFormat === \"html\") {\n const out = wasm.convert(wrapped, \"html\", \"html\", \"optimized\", false, 2, 1, false, false, \"\", \"\");\n return this.deliver(extractHtmlTables(out).join(\"\\n\"), opts.outputFile, opts.fileOptions);\n }\n const coreFormat = outputFormat === \"ast\" ? \"json\" : outputFormat;\n const out = wasm.convert(wrapped, \"html\", coreFormat, \"optimized\", pretty, indent, spaces, false, false, \"\", \"\");\n if (outputFormat === \"bitmark\" || outputFormat === \"text\") {\n return this.deliver(out, opts.outputFile, opts.fileOptions);\n }\n if (outputFormat === \"json\") {\n if (opts.outputFile) return this.deliver(out, opts.outputFile, opts.fileOptions);\n if (pretty || jsonOptions.stringify) return out;\n return JSON.parse(out) as unknown;\n }\n const ast = makePseudoAst(JSON.parse(out) as unknown[]);\n if (opts.outputFile) return this.deliver(JSON.stringify(ast), opts.outputFile, opts.fileOptions);\n return ast;\n }\n\n /**\n * Create a bit-JSON pseudo-AST from bitmark or JSON input (PLAN-126 §3.1).\n *\n * NOTE: the returned structure is the bit JSON (wrapper entries), not\n * bpg's internal TS AST node model. It round-trips through `convert` but\n * is not walkable with bpg's `Ast`/`NodeType`.\n */\n public createAst(input: unknown, options?: CreateAstOptions): LegacyPseudoAst {\n const opts: CreateAstOptions = Object.assign({}, options);\n const wasm = getLegacyWasm();\n const { source, isBitmark } = this.resolveInput(input, opts.inputFormat);\n // bpg's AST carries extraProperties unconditionally (createAst has no\n // jsonOptions), so unknown properties are always included here.\n const out = wasm.convert(source, isBitmark ? \"bitmark\" : \"json\", \"json\", \"optimized\", false, 2, 1, true, false, \"\", \"\");\n return makePseudoAst(JSON.parse(out) as unknown[]);\n }\n\n /**\n * Breakscape text (bpg-compatible `breakscapeText`).\n */\n public breakscapeText(input: string, options?: BreakscapeOptions): string | void {\n if (!input) return input;\n const opts: BreakscapeOptions = Object.assign({}, options);\n this.checkBrowserFileWrite(opts.outputFile);\n const wasm = getLegacyWasm();\n const inStr = this.maybeReadFile(input, opts.inputFormat);\n const res = wasm.breakscape_text(inStr, mapTextFormat(opts.textFormat), opts.textLocation ?? \"body\");\n return this.deliver(res, opts.outputFile, opts.fileOptions);\n }\n\n /**\n * Unbreakscape text (bpg-compatible `unbreakscapeText`).\n */\n public unbreakscapeText(input: string, options?: UnbreakscapeOptions): string | void {\n if (!input) return input;\n const opts: UnbreakscapeOptions = Object.assign({}, options);\n this.checkBrowserFileWrite(opts.outputFile);\n const wasm = getLegacyWasm();\n const inStr = this.maybeReadFile(input, opts.inputFormat);\n const res = wasm.unbreakscape_text(inStr, mapTextFormat(opts.textFormat), opts.textLocation ?? \"body\");\n return this.deliver(res, opts.outputFile, opts.fileOptions);\n }\n\n /**\n * Convert bitmark text ↔ text AST (bpg-compatible `convertText`).\n *\n * Direction is auto-detected: TextAst (JSON) input generates bitmark\n * text; anything else parses as bitmark text and returns the TextAst\n * (plain JS object; a string when `jsonOptions.prettify` is set).\n */\n public convertText(input: string | unknown, options?: ConvertTextOptions): string | unknown | void {\n const opts: ConvertTextOptions = Object.assign({}, options);\n const jsonOptions = Object.assign({}, opts.jsonOptions);\n this.checkBrowserFileWrite(opts.outputFile);\n const wasm = getLegacyWasm();\n\n const isBitmarkText = opts.textFormat === undefined || mapTextFormat(opts.textFormat) === \"bitmark++\";\n const textLocation = opts.textLocation ?? \"body\";\n\n let inStr: string;\n let ast: unknown[] | undefined;\n if (typeof input === \"string\") {\n inStr = this.maybeReadFile(input, opts.inputFormat);\n ast = this.parseTextAstString(inStr);\n } else {\n inStr = JSON.stringify(input);\n ast = Array.isArray(input) ? input : undefined;\n }\n\n if (ast !== undefined) {\n // TextAst → text (reverse honours the location; a plain-text format\n // generates plain text, i.e. marks are dropped — bpg parity)\n const out = isBitmarkText\n ? wasm.convert_text(JSON.stringify(ast), \"astToText\", \"bitmark++\", textLocation)\n : wasm.convert_text(JSON.stringify(ast), \"astToPlainText\", \"plainText\", textLocation);\n return this.deliver(out, opts.outputFile, opts.fileOptions);\n }\n\n // text → TextAst (bpg parses forward at body location)\n const out = wasm.convert_text(inStr, \"textToAst\", isBitmarkText ? \"bitmark++\" : \"plainText\", \"body\");\n const { pretty, indent } = prettyIndent(jsonOptions.prettify);\n const outStr = pretty ? wasm.prettify(out, indent) : out;\n if (opts.outputFile) return this.deliver(outStr, opts.outputFile, opts.fileOptions);\n if (pretty) return outStr;\n return JSON.parse(out) as unknown;\n }\n\n /**\n * Convert a text AST to plain text (bpg-compatible `textAstToPlainText`).\n */\n public textAstToPlainText(textAst: unknown, _options?: ExtractPlainTextOptions): string {\n const wasm = getLegacyWasm();\n const out = wasm.convert_text(\n typeof textAst === \"string\" ? textAst : JSON.stringify(textAst),\n \"astToPlainText\",\n \"bitmark++\",\n \"body\",\n );\n return out;\n }\n\n /**\n * Extract plain text from bitmark or bitmark JSON (bpg-compatible).\n */\n public extractPlainText(input: string | unknown, options?: ExtractPlainTextOptions): string {\n const inputFormat = options?.inputFormat;\n const wasm = getLegacyWasm();\n if (inputFormat === \"plainText\") {\n return typeof input === \"string\" ? String(input) : \"\";\n }\n if (inputFormat === \"bitmarkText\") {\n const ast = wasm.convert_text(String(input), \"textToAst\", \"bitmark++\", \"body\");\n const out = wasm.convert_text(ast, \"astToPlainText\", \"bitmark++\", \"body\");\n return out;\n }\n if (typeof input === \"string\" && this.parseTextAstString(input) === undefined && !wasm.is_bitmark(input)) {\n // Neither JSON nor bitmark: bpg falls through to bitmark text\n const looksJson = ((): boolean => {\n try {\n JSON.parse(input);\n return true;\n } catch {\n return false;\n }\n })();\n if (!looksJson) {\n return this.extractPlainText(input, { inputFormat: \"bitmarkText\" });\n }\n }\n const { source, isBitmark } = this.resolveInput(input, undefined);\n const out = wasm.convert(source, isBitmark ? \"bitmark\" : \"json\", \"text\", \"optimized\", false, 2, 1, false, false, \"\", \"\");\n return out;\n }\n\n /** If `s` parses as a TextAst JSON array, return it. */\n private parseTextAstString(s: string): unknown[] | undefined {\n const t = s.trim();\n if (!t.startsWith(\"[\")) return undefined;\n try {\n const v = JSON.parse(t) as unknown;\n if (Array.isArray(v) && v.every((n) => n !== null && typeof n === \"object\" && \"type\" in n)) {\n return v;\n }\n } catch {\n // not JSON\n }\n return undefined;\n }\n\n // ------------------------------------------------------------------\n // Internal helpers\n // ------------------------------------------------------------------\n\n /**\n * Resolve bpg input (string | file path | JSON value | pseudo-AST) to a\n * source string for the WASM core, classified per bpg's detection order:\n * AST → JSON → assume bitmark (PLAN-126 F-10).\n */\n protected resolveInput(input: unknown, inputFormat: string | undefined): ResolvedInput {\n if (typeof input !== \"string\") {\n // Parsed JSON / pseudo-AST value.\n const entries = this.jsonEntries(input);\n return {\n source: JSON.stringify(entries ? entries.map((b) => this.toWrapperEntry(b)) : input),\n isBitmark: false,\n };\n }\n const inStr = this.maybeReadFile(input, inputFormat);\n const wasm = getLegacyWasm();\n if (wasm.is_bitmark(inStr)) return { source: inStr, isBitmark: true };\n // JSON-ish: normalise loose shapes (AST envelope, single wrapper, bare bit)\n try {\n const parsed = JSON.parse(inStr) as unknown;\n const entries = this.jsonEntries(parsed);\n if (entries) {\n return {\n source: JSON.stringify(entries.map((b) => this.toWrapperEntry(b))),\n isBitmark: false,\n };\n }\n } catch {\n // is_bitmark said \"not bitmark\" but it is not JSON either —\n // fall through and let the core's own detection handle it (bpg\n // behaviour: assume bitmark).\n return { source: inStr, isBitmark: true };\n }\n return { source: inStr, isBitmark: false };\n }\n\n /**\n * Normalise the JSON shapes bpg accepts to a bits/entries array:\n * wrapper array, `{ bits: [...] }` AST envelope, single `{ bit: ... }`\n * wrapper, or a bare bit object (`{ type: ... }`).\n */\n private jsonEntries(v: unknown): unknown[] | undefined {\n if (Array.isArray(v)) return v;\n if (v !== null && typeof v === \"object\") {\n const o = v as Record<string, unknown>;\n if (Array.isArray(o.bits)) return o.bits;\n if (\"bit\" in o) return [o];\n if (typeof o.type === \"string\") return [{ bit: o }];\n }\n return undefined;\n }\n\n /**\n * Normalise a pseudo-AST bits entry to a `{ bit, parser? }` wrapper.\n * `Builder.buildBit` returns bare bit JSON (with any parser metadata\n * attached under a non-enumerable symbol); parsed forward output is\n * already wrapper-shaped.\n */\n private toWrapperEntry(entry: unknown): unknown {\n if (entry !== null && typeof entry === \"object\" && \"bit\" in (entry as object)) return entry;\n const wrapper: { bit: unknown; parser?: unknown } = { bit: entry };\n const parser = (entry as Record<symbol, unknown> | null)?.[BUILT_BIT_PARSER];\n if (parser !== undefined) wrapper.parser = parser;\n return wrapper;\n }\n\n /** bpg parity: read `input` as a file when it names one (Node only). */\n protected maybeReadFile(input: string, inputFormat: string | undefined): string {\n if (inputFormat === \"string\") return input;\n const io = getLegacyFileIo();\n if (!io) return input;\n try {\n if (io.existsSync(input)) return io.readFileSync(input, \"utf8\");\n } catch {\n // treat as literal input\n }\n return input;\n }\n\n /** bpg parity: writing a file is impossible in the browser. */\n protected checkBrowserFileWrite(outputFile: string | undefined): void {\n if (outputFile && !getLegacyFileIo()) {\n throw new Error(\"Cannot write to file in browser environment\");\n }\n }\n\n /** Return `data`, or write it to `outputFile` (returning void), as bpg does. */\n protected deliver(data: string, outputFile?: string, fileOptions?: FileOptions): string | void {\n if (!outputFile) return data;\n const io = getLegacyFileIo();\n if (!io) throw new Error(\"Cannot write to file in browser environment\");\n io.writeFile(outputFile, data, {\n append: fileOptions?.append,\n encoding: fileOptions?.encoding ?? \"utf8\",\n });\n }\n\n}\n\n/**\n * Extract every top-level `<table>…</table>` fragment from `html`\n * (case-insensitive, nesting-safe). Pure string scanning — no HTML parsing.\n */\nfunction extractHtmlTables(html: string): string[] {\n const tables: string[] = [];\n const lower = html.toLowerCase();\n let i = 0;\n for (;;) {\n const start = lower.indexOf(\"<table\", i);\n if (start === -1) break;\n let depth = 0;\n let j = start;\n let end = -1;\n while (j < html.length) {\n const open = lower.indexOf(\"<table\", j);\n const close = lower.indexOf(\"</table\", j);\n if (close === -1) break;\n if (open !== -1 && open < close) {\n depth++;\n j = open + \"<table\".length;\n } else {\n depth--;\n const closeEnd = lower.indexOf(\">\", close);\n j = closeEnd === -1 ? html.length : closeEnd + 1;\n if (depth === 0) {\n end = j;\n break;\n }\n }\n }\n if (end === -1) break;\n tables.push(html.slice(start, end));\n i = end;\n }\n return tables;\n}\n\n/**\n * Direct bitmark text parser (bpg-compatible `bitmarkTextParse`):\n * bitmark text → TextAst array.\n */\nexport function bitmarkTextParse(text: string): unknown[] {\n const out = getLegacyWasm().convert_text(text, \"textToAst\", \"bitmark++\", \"body\");\n return JSON.parse(out) as unknown[];\n}\n","// @zen-component: LEGACY-Facade\n// bpg-compatible `ResourceBuilder` (PLAN-126 §3.1): each method shapes the\n// `{ type, <family>: { ... } }` ResourceJson wrapper from bpg's flat data.\n// One generic table-driven implementation — per-bit-type defaulting and\n// URL-derived cosmetics are left to the config-driven core, which normalizes\n// the resource when the bit containing it is converted.\n\ninterface ResourceSpec {\n /** ResourceJson discriminator (`type`). */\n type: string;\n /** Family key holding the resource data object. */\n key: string;\n /** JSON field that bpg's `data.value` maps to. */\n valueField: \"src\" | \"url\" | \"body\";\n}\n\nconst RESOURCE_SPECS = {\n imageResource: { type: \"image\", key: \"image\", valueField: \"src\" },\n imageLinkResource: { type: \"image-link\", key: \"imageLink\", valueField: \"url\" },\n audioResource: { type: \"audio\", key: \"audio\", valueField: \"src\" },\n audioEmbedResource: { type: \"audio-embed\", key: \"audioEmbed\", valueField: \"src\" },\n audioLinkResource: { type: \"audio-link\", key: \"audioLink\", valueField: \"url\" },\n videoResource: { type: \"video\", key: \"video\", valueField: \"src\" },\n videoEmbedResource: { type: \"video-embed\", key: \"videoEmbed\", valueField: \"url\" },\n videoLinkResource: { type: \"video-link\", key: \"videoLink\", valueField: \"url\" },\n stillImageFilmEmbedResource: {\n type: \"still-image-film-embed\",\n key: \"stillImageFilmEmbed\",\n valueField: \"url\",\n },\n stillImageFilmLinkResource: {\n type: \"still-image-film-link\",\n key: \"stillImageFilmLink\",\n valueField: \"url\",\n },\n articleResource: { type: \"article\", key: \"article\", valueField: \"body\" },\n documentResource: { type: \"document\", key: \"document\", valueField: \"url\" },\n documentEmbedResource: { type: \"document-embed\", key: \"documentEmbed\", valueField: \"url\" },\n documentLinkResource: { type: \"document-link\", key: \"documentLink\", valueField: \"url\" },\n documentDownloadResource: {\n type: \"document-download\",\n key: \"documentDownload\",\n valueField: \"url\",\n },\n appLinkResource: { type: \"app-link\", key: \"appLink\", valueField: \"url\" },\n websiteLinkResource: { type: \"website-link\", key: \"websiteLink\", valueField: \"url\" },\n} as const satisfies Record<string, ResourceSpec>;\n\nexport type ResourceMethod = (\n context: unknown,\n data: Record<string, unknown> | undefined,\n __typeAlias?: string,\n) => Record<string, unknown> | undefined;\n\nfunction buildResource(spec: ResourceSpec): ResourceMethod {\n return (_context, data, _typeAlias) => {\n if (!data) return undefined;\n const { value, ...rest } = data;\n const inner: Record<string, unknown> = { [spec.valueField]: value ?? \"\" };\n for (const [k, v] of Object.entries(rest)) {\n if (v !== undefined) inner[k] = v;\n }\n return { type: spec.type, [spec.key]: inner };\n };\n}\n\n/** Resource `type` string → spec (for the generic wrapper/data entry points). */\nconst SPEC_BY_TYPE: Record<string, ResourceSpec> = Object.fromEntries(\n Object.values(RESOURCE_SPECS).map((s) => [s.type, s]),\n);\n\n/** bpg-compatible ResourceBuilder: 17 `<family>Resource(context, data)` methods\n * plus the generic `resourceFromResourceJson` / `resourceFromResourceDataJson`. */\nexport class ResourceBuilder {\n /**\n * Normalise existing ResourceJson wrapper(s) (bpg-compatible).\n * Unknown resource types are dropped (bpg parity: it skips invalid types).\n */\n resourceFromResourceJson(\n _context: unknown,\n resource?: Record<string, unknown> | Record<string, unknown>[],\n ): unknown {\n if (!resource) return undefined;\n const single = !Array.isArray(resource);\n const list = single ? [resource as Record<string, unknown>] : resource;\n const nodes: Record<string, unknown>[] = [];\n for (const wrapper of list) {\n const spec = SPEC_BY_TYPE[wrapper.type as string];\n if (!spec) continue;\n const inner = (wrapper[spec.key] ?? {}) as Record<string, unknown>;\n const { [spec.valueField]: value, ...rest } = inner;\n const built = buildResource(spec)(undefined, { value, ...rest });\n if (built) nodes.push(built);\n }\n if (nodes.length === 0) return undefined;\n return single ? nodes[0] : nodes;\n }\n\n /**\n * Build a resource wrapper from a bare ResourceDataJson (bpg-compatible).\n * `data` may also be a plain string (used as the url/src/body value).\n */\n resourceFromResourceDataJson(\n context: unknown,\n type: string,\n data?: Record<string, unknown> | string,\n ): Record<string, unknown> | undefined {\n if (!data) return undefined;\n const spec = SPEC_BY_TYPE[type];\n if (!spec) return undefined;\n const asString = typeof data === \"string\" ? data : undefined;\n const obj = typeof data === \"object\" ? data : {};\n const { url, src, body, ...rest } = obj as {\n url?: unknown;\n src?: unknown;\n body?: unknown;\n [k: string]: unknown;\n };\n const value = url ?? src ?? body ?? asString;\n return buildResource(spec)(context, { value, ...rest });\n }\n imageResource: ResourceMethod = buildResource(RESOURCE_SPECS.imageResource);\n imageLinkResource: ResourceMethod = buildResource(RESOURCE_SPECS.imageLinkResource);\n audioResource: ResourceMethod = buildResource(RESOURCE_SPECS.audioResource);\n audioEmbedResource: ResourceMethod = buildResource(RESOURCE_SPECS.audioEmbedResource);\n audioLinkResource: ResourceMethod = buildResource(RESOURCE_SPECS.audioLinkResource);\n videoResource: ResourceMethod = buildResource(RESOURCE_SPECS.videoResource);\n videoEmbedResource: ResourceMethod = buildResource(RESOURCE_SPECS.videoEmbedResource);\n videoLinkResource: ResourceMethod = buildResource(RESOURCE_SPECS.videoLinkResource);\n stillImageFilmEmbedResource: ResourceMethod = buildResource(\n RESOURCE_SPECS.stillImageFilmEmbedResource,\n );\n stillImageFilmLinkResource: ResourceMethod = buildResource(\n RESOURCE_SPECS.stillImageFilmLinkResource,\n );\n articleResource: ResourceMethod = buildResource(RESOURCE_SPECS.articleResource);\n documentResource: ResourceMethod = buildResource(RESOURCE_SPECS.documentResource);\n documentEmbedResource: ResourceMethod = buildResource(RESOURCE_SPECS.documentEmbedResource);\n documentLinkResource: ResourceMethod = buildResource(RESOURCE_SPECS.documentLinkResource);\n documentDownloadResource: ResourceMethod = buildResource(\n RESOURCE_SPECS.documentDownloadResource,\n );\n appLinkResource: ResourceMethod = buildResource(RESOURCE_SPECS.appLinkResource);\n websiteLinkResource: ResourceMethod = buildResource(RESOURCE_SPECS.websiteLinkResource);\n}\n","// @zen-component: LEGACY-Facade\n// bpg-compatible enum objects and option interfaces (vendored from\n// bitmark-parser-generator v5.31.1, superenum EnumType<> replaced with the\n// equivalent value-union derivation). Exposed ONLY via the `legacy`\n// namespace / subpath — never re-exported at the package root.\n\n/** @internal */\ntype EnumType<T> = T[keyof T];\n\n/** Input type enumeration */\nexport const Input = {\n /** Input is as a string */\n string: \"string\",\n /** Input is as a file path */\n file: \"file\",\n} as const;\nexport type InputType = EnumType<typeof Input>;\n\n/** Output type enumeration */\nexport const Output = {\n /** Output bitmark string */\n bitmark: \"bitmark\",\n /** Output JSON as a plain JS object, or a file */\n json: \"json\",\n /** Output AST as a plain JS object, or a file */\n ast: \"ast\",\n /** Output plain text as a string, or a file */\n text: \"text\",\n} as const;\nexport type OutputType = EnumType<typeof Output>;\n\n/** Input format enumeration */\nexport const InputFormat = {\n bitmark: \"bitmark\",\n bitmarkText: \"bitmarkText\",\n plainText: \"plainText\",\n html: \"html\",\n} as const;\nexport type InputFormatType = EnumType<typeof InputFormat>;\n\nexport const BitmarkVersion = {\n v2: 2,\n v3: 3,\n} as const;\nexport type BitmarkVersionType = EnumType<typeof BitmarkVersion>;\n\nexport const CardSetVersion = {\n v1: 1,\n v2: 2,\n} as const;\nexport type CardSetVersionType = EnumType<typeof CardSetVersion>;\n\nexport const BitmarkParserType = {\n peggy: \"peggy\",\n} as const;\nexport type BitmarkParserTypeType = EnumType<typeof BitmarkParserType>;\n\nexport const InfoType = {\n list: \"list\",\n deprecated: \"deprecated\",\n all: \"all\",\n bit: \"bit\",\n} as const;\nexport type InfoTypeType = EnumType<typeof InfoType>;\n\nexport const InfoFormat = {\n text: \"text\",\n json: \"json\",\n pojo: \"pojo\",\n} as const;\nexport type InfoFormatType = EnumType<typeof InfoFormat>;\n\nexport const BodyTextFormat = {\n plainText: \"text\",\n latex: \"latex\",\n json: \"json\",\n xml: \"xml\",\n bitmarkPlusPlus: \"bitmark++\",\n} as const;\nexport type BodyTextFormatType = EnumType<typeof BodyTextFormat>;\n\nexport const TextLocation = {\n tag: \"tag\",\n body: \"body\",\n cardBody: \"cardBody\",\n} as const;\nexport type TextLocationType = EnumType<typeof TextLocation>;\n\n/** Options for the output file (Node only) */\nexport interface FileOptions {\n /** Append to a file if true, otherwise overwrite */\n append?: boolean;\n /** Character encoding, defaults to 'utf8' */\n encoding?: string;\n}\n\n// Strict option policy, surfaced at BUILD time (bpg declared these wider):\n// options this facade cannot honour are narrowed to their supported value(s)\n// — truthy-throws booleans to `false`, value-gated enums to the supported\n// literal — so TS consumers get a type error instead of only the runtime\n// LegacyUnsupportedError. The runtime validation stays (JS callers, or TS\n// with the type ignored, still get the loud error).\n\n/** Options for bitmark generation */\nexport interface BitmarkOptions {\n /** Not supported — `true` throws `LegacyUnsupportedError` at runtime. */\n explicitTextFormat?: false;\n prettifyJson?: boolean | number;\n /** bitmark v3 only — card set version `1` throws `LegacyUnsupportedError` at runtime. */\n cardSetVersion?: typeof CardSetVersion.v2;\n spacesAroundValues?: number | boolean;\n /** Not supported — `true` throws `LegacyUnsupportedError` at runtime. */\n debugGenerationInline?: false;\n /** Not supported — `true` throws `LegacyUnsupportedError` at runtime. */\n noBreakscaping?: false;\n}\n\n/** Options for JSON generation */\nexport interface JsonOptions {\n enableWarnings?: boolean | number;\n prettify?: boolean | number;\n stringify?: boolean;\n /** bitmark v3 only — `true` throws `LegacyUnsupportedError` at runtime. */\n textAsPlainText?: false;\n /**\n * Exclude unknown properties from the JSON output (default: `false` —\n * unknown properties are included, as bpg). The parser's warning text\n * references the new API's inverse flag (`includeUnknownProperties`).\n */\n excludeUnknownProperties?: boolean;\n /** Not supported — `true` throws `LegacyUnsupportedError` at runtime. */\n debugGenerationInline?: false;\n}\n\n/** Options for bitmark text JSON generation */\nexport interface TextJsonOptions {\n prettify?: boolean | number;\n}\n\n/** Info options for the parser */\nexport interface InfoOptions {\n type?: InfoTypeType;\n bit?: string;\n outputFormat?: InfoFormatType;\n prettify?: boolean | number;\n}\n\n/** Conversion options for bitmark / JSON conversion */\nexport interface ConvertOptions {\n /** bitmark v3 only — version `2` throws `LegacyUnsupportedError` at runtime. */\n bitmarkVersion?: typeof BitmarkVersion.v3;\n bitmarkParserType?: BitmarkParserTypeType;\n inputFormat?: InputType;\n outputFormat?: OutputType;\n outputFile?: string;\n fileOptions?: FileOptions;\n bitmarkOptions?: BitmarkOptions;\n jsonOptions?: JsonOptions;\n}\n\n/** Prettify options for bitmark / JSON prettify / validate */\nexport interface UpgradeOptions {\n /** bitmark v3 only — version `2` throws `LegacyUnsupportedError` at runtime. */\n bitmarkVersion?: typeof BitmarkVersion.v3;\n bitmarkParserType?: BitmarkParserTypeType;\n inputFormat?: InputType;\n outputFile?: string;\n fileOptions?: FileOptions;\n bitmarkOptions?: BitmarkOptions;\n jsonOptions?: JsonOptions;\n}\n\n/** Conversion options for bitmark text / JSON conversion */\nexport interface ConvertTextOptions {\n textFormat?: BodyTextFormatType;\n textLocation?: TextLocationType;\n inputFormat?: InputType;\n outputFile?: string;\n fileOptions?: FileOptions;\n jsonOptions?: TextJsonOptions;\n}\n\n/** Create AST options */\nexport interface CreateAstOptions {\n inputFormat?: InputType;\n}\n\nexport interface ExtractPlainTextOptions {\n inputFormat?: InputFormatType;\n}\n\n/** Options for convertHtmlTable */\nexport interface ConvertHtmlTableOptions {\n inputFormat?: InputFormatType;\n outputFormat?: OutputType | \"html\";\n tableFormat?: string;\n keepUnknownTags?: boolean;\n /** Not supported — `true` throws `LegacyUnsupportedError` at runtime. */\n noBreakscaping?: false;\n outputFile?: string;\n fileOptions?: FileOptions;\n bitmarkOptions?: BitmarkOptions;\n jsonOptions?: JsonOptions;\n}\n\n/** Breakscape options */\nexport interface BreakscapeOptions {\n inputFormat?: InputType;\n outputFile?: string;\n fileOptions?: FileOptions;\n textFormat?: BodyTextFormatType;\n textLocation?: TextLocationType;\n}\n\n/** Unbreakscape options */\nexport interface UnbreakscapeOptions {\n inputFormat?: InputType;\n outputFile?: string;\n fileOptions?: FileOptions;\n textFormat?: BodyTextFormatType;\n textLocation?: TextLocationType;\n}\n","// @zen-component: LEGACY-Facade\n// Remaining bpg enum exports: TextMarkType / TextNodeType (vendored values),\n// BitType (built lazily from the config-driven core — never a hardcoded bit\n// list), and throwing proxies for enums tied to unsupported internals.\n\nimport { unsupportedMember } from \"./errors.js\";\nimport { getLegacyWasm } from \"./runtime.js\";\n\n/** Vendored from bpg v5.31.1 model/enum/TextMarkType.ts. */\nexport const TextMarkType = {\n bold: \"bold\",\n light: \"light\",\n italic: \"italic\",\n highlight: \"highlight\",\n highlightOrange: \"highlightOrange\",\n highlightYellow: \"highlightYellow\",\n highlightGreen: \"highlightGreen\",\n highlightBlue: \"highlightBlue\",\n highlightPurple: \"highlightPurple\",\n highlightPink: \"highlightPink\",\n highlightBrown: \"highlightBrown\",\n highlightBlack: \"highlightBlack\",\n highlightWhite: \"highlightWhite\",\n highlightGray: \"highlightGray\",\n strike: \"strike\",\n subscript: \"subscript\",\n superscript: \"superscript\",\n ins: \"ins\",\n del: \"del\",\n underline: \"underline\",\n doubleUnderline: \"doubleUnderline\",\n circle: \"circle\",\n languageEmRed: \"languageEmRed\",\n languageEmOrange: \"languageEmOrange\",\n languageEmYellow: \"languageEmYellow\",\n languageEmGreen: \"languageEmGreen\",\n languageEmBlue: \"languageEmBlue\",\n languageEmPurple: \"languageEmPurple\",\n languageEmPink: \"languageEmPink\",\n languageEmBrown: \"languageEmBrown\",\n languageEmBlack: \"languageEmBlack\",\n languageEmWhite: \"languageEmWhite\",\n languageEmGray: \"languageEmGray\",\n languageEm: \"languageEm\",\n userUnderline: \"userUnderline\",\n userDoubleUnderline: \"userDoubleUnderline\",\n userStrike: \"userStrike\",\n userCircle: \"userCircle\",\n userHighlight: \"userHighlight\",\n notranslate: \"notranslate\",\n link: \"link\",\n ref: \"ref\",\n xref: \"xref\",\n extref: \"extref\",\n footnote: \"footnote\",\n footnoteStar: \"footnote*\",\n symbol: \"symbol\",\n var: \"var\",\n code: \"code\",\n timer: \"timer\",\n duration: \"duration\",\n color: \"color\",\n colorPicker: \"colorPicker\",\n comment: \"comment\",\n} as const;\n\n/** Vendored from bpg v5.31.1 model/enum/TextNodeType.ts. */\nexport const TextNodeType = {\n text: \"text\",\n hardBreak: \"hardBreak\",\n paragraph: \"paragraph\",\n heading: \"heading\",\n section: \"section\",\n noBulletList: \"noBulletList\",\n bulletList: \"bulletList\",\n orderedList: \"orderedList\",\n orderedListRoman: \"orderedListRoman\",\n orderedListRomanLower: \"orderedListRomanLower\",\n letteredList: \"letteredList\",\n letteredListLower: \"letteredListLower\",\n taskList: \"taskList\",\n listItem: \"listItem\",\n taskItem: \"taskItem\",\n image: \"image\",\n imageInline: \"imageInline\",\n codeBlock: \"codeBlock\",\n latex: \"latex\",\n gap: \"gap\",\n select: \"select\",\n highlight: \"highlight\",\n mark: \"mark\",\n} as const;\n\n/** bpg key derivation: kebab-case bit name → camelCase enum key. */\nfunction bitNameToKey(name: string): string {\n return name.replace(/-([a-z0-9])/gu, (_, c: string) => c.toUpperCase());\n}\n\nlet bitTypeCache: Record<string, string> | undefined;\n\nfunction loadBitTypes(): Record<string, string> {\n if (!bitTypeCache) {\n const wasm = getLegacyWasm();\n // includeDeprecated: bpg's BitType enum carries the deprecated bit\n // types too (PLAN-149 hides them from listings by default).\n const all = JSON.parse(wasm.info(\"all\", \"json\", \"\", false, 2, true, false, false, \"\")) as {\n name: string;\n }[];\n const map: Record<string, string> = { _standard: \"_standard\" };\n for (const { name } of all) {\n map[bitNameToKey(name)] = name;\n }\n bitTypeCache = map;\n }\n return bitTypeCache;\n}\n\n/**\n * bpg-compatible `BitType` enum object, built lazily from the core's\n * config (`info`) rather than a hardcoded list. Keys are the camelCase of\n * the bit names, exactly as bpg derives them.\n */\nexport const BitType: Record<string, string> = new Proxy(\n {},\n {\n get: (_t, prop) => (typeof prop === \"string\" ? loadBitTypes()[prop] : undefined),\n has: (_t, prop) => typeof prop === \"string\" && prop in loadBitTypes(),\n ownKeys: () => Reflect.ownKeys(loadBitTypes()),\n getOwnPropertyDescriptor: (_t, prop) =>\n typeof prop === \"string\" && prop in loadBitTypes()\n ? { value: loadBitTypes()[prop], enumerable: true, configurable: true, writable: false }\n : undefined,\n },\n);\n\n/** Loud F-2 stand-in for enums tied to unsupported bpg internals. */\nfunction unsupportedEnum(name: string, reason: string): Record<string, string> {\n return new Proxy(\n {},\n {\n get: (_t, prop) => {\n if (prop === Symbol.toPrimitive || prop === \"toString\" || prop === Symbol.toStringTag) {\n return () => `[unsupported ${name}]`;\n }\n return unsupportedMember(name, reason);\n },\n has: () => unsupportedMember(name, reason),\n ownKeys: () => unsupportedMember(name, reason),\n },\n );\n}\n\n/** bpg `NodeType` — names bpg's internal AST nodes; the legacy AST is bit JSON. */\nexport const NodeType = unsupportedEnum(\n \"NodeType\",\n \"it names bpg's internal AST nodes; the legacy AST is bit JSON (see createAst)\",\n);\n\n/** bpg `BoundingBoxIndex` — bpg-internal utility. */\nexport const BoundingBoxIndex = unsupportedEnum(\n \"BoundingBoxIndex\",\n \"bpg-internal bounding-box utility\",\n);\n","// @zen-component: LEGACY-Facade\n// Throwing stubs for bpg exports the legacy facade deliberately does not\n// implement (PLAN-126 F-2: exist, but fail loudly and deterministically —\n// never silent no-ops). These are internals of bpg's TS implementation\n// (its AST walker, generators, parsers, writers), which have no equivalent\n// over the WASM core.\n\nimport { unsupportedMember } from \"./errors.js\";\n\nfunction stubClass(name: string, reason: string): new (...args: unknown[]) => never {\n return class {\n constructor() {\n unsupportedMember(name, reason);\n }\n } as unknown as new (...args: unknown[]) => never;\n}\n\nconst WALKER_REASON =\n \"the legacy AST is bit JSON, not bpg's internal node model; walking it with bpg NodeType names would silently misbehave\";\nconst INTERNAL_REASON = \"internal class of bpg's TS implementation\";\n\n/** bpg `Ast` walker — unsupported (PLAN-126 decision Q-7). */\nexport const Ast = stubClass(\"Ast\", WALKER_REASON);\n\nexport const BitmarkGenerator = stubClass(\"BitmarkGenerator\", INTERNAL_REASON);\nexport const BitmarkStringGenerator = stubClass(\"BitmarkStringGenerator\", INTERNAL_REASON);\nexport const BitmarkFileGenerator = stubClass(\"BitmarkFileGenerator\", INTERNAL_REASON);\nexport const JsonGenerator = stubClass(\"JsonGenerator\", INTERNAL_REASON);\nexport const JsonStringGenerator = stubClass(\"JsonStringGenerator\", INTERNAL_REASON);\nexport const JsonFileGenerator = stubClass(\"JsonFileGenerator\", INTERNAL_REASON);\nexport const HtmlTableGenerator = stubClass(\"HtmlTableGenerator\", INTERNAL_REASON);\nexport const HtmlTableParser = stubClass(\"HtmlTableParser\", INTERNAL_REASON);\nexport const BitmarkParser = stubClass(\"BitmarkParser\", INTERNAL_REASON);\nexport const JsonParser = stubClass(\"JsonParser\", INTERNAL_REASON);\nexport const StringWriter = stubClass(\"StringWriter\", INTERNAL_REASON);\nexport const FileWriter = stubClass(\"FileWriter\", INTERNAL_REASON);\nexport const StreamWriter = stubClass(\"StreamWriter\", INTERNAL_REASON);\n"],"mappings":"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","names":["wasm","wasm","out","wasm","require"]}
1
+ {"version":3,"sources":["../src/legacy-entry.ts","../src/node/legacy-init.ts","../src/legacy/runtime.ts","../src/generated/package_info.ts","../src/legacy/errors.ts","../src/legacy/translate.ts","../src/legacy/pseudo-ast.ts","../src/legacy/generated/resource-collection-keys.ts","../src/legacy/builder.ts","../src/legacy/bpg-class.ts","../src/legacy/resource-builder.ts","../src/legacy/options.ts","../src/legacy/enums-extra.ts","../src/legacy/stubs.ts"],"sourcesContent":["// @zen-component: LEGACY-Facade\n// Subpath entry: `@gmb/bitmark-parser/legacy` (Node). Re-exports the legacy\n// namespace flat, so bpg consumers can migrate with only an import change:\n//\n// import { BitmarkParserGenerator } from \"@gmb/bitmark-parser/legacy\";\n\nimport { createRequire } from \"node:module\";\nimport { initLegacyNode } from \"./node/legacy-init.js\";\n\nconst require = createRequire(import.meta.url);\nconst wasm = require(\"../wasm/bitmark_wasm.js\") as typeof import(\"../wasm/bitmark_wasm.js\");\ninitLegacyNode(() => wasm);\n\nexport * from \"./legacy/index.js\";\n","// @zen-component: LEGACY-Facade\n// Node platform wiring for the legacy facade: provides the WASM module and\n// real file I/O (PLAN-126 F-5). The browser entry provides WASM only.\n\nimport * as fs from \"node:fs\";\nimport * as path from \"node:path\";\nimport { setLegacyFileIo, setLegacyWasmProvider, type LegacyWasm } from \"../legacy/runtime.js\";\n\n/**\n * `provider` is consulted per legacy call (PLAN-166): it can load the wasm\n * lazily and always reflects the active variant after an init swap.\n */\nexport function initLegacyNode(provider: () => LegacyWasm): void {\n setLegacyWasmProvider(provider);\n setLegacyFileIo({\n existsSync: (p) => fs.existsSync(p),\n readFileSync: (p, encoding) => fs.readFileSync(p, { encoding: encoding as BufferEncoding }),\n writeFile: (p, data, opts) => {\n fs.mkdirSync(path.dirname(p), { recursive: true });\n fs.writeFileSync(p, data, {\n encoding: (opts.encoding ?? \"utf8\") as BufferEncoding,\n flag: opts.append ? \"a\" : \"w\",\n });\n },\n });\n}\n","// @zen-component: LEGACY-Facade\n// Platform injection for the legacy facade. The Node and browser entries\n// provide the WASM module (and, on Node, file I/O) before exposing the\n// `legacy` namespace — the facade itself stays platform-free.\n\n/** The subset of the WASM surface the legacy facade drives. */\nexport interface LegacyWasm {\n convert(\n input: string,\n inputFormat: string,\n outputFormat: string,\n mode: string,\n pretty: boolean,\n indent: number,\n spacesAroundValues: number,\n includeUnknownProperties: boolean,\n mappingReport: boolean,\n /** `semantic-tokens` output only (PLAN-193); the legacy facade passes `\"\"`. */\n positionEncoding: string,\n tokensLayout: string,\n ): string;\n canonicalize(\n input: string,\n inputFormat: string,\n mode: string,\n pretty: boolean,\n indent: number,\n spacesAroundValues: number,\n ): string;\n breakscape_text(input: string, format: string, location: string): string;\n unbreakscape_text(input: string, format: string, location: string): string;\n info(\n infoType: string,\n format: string,\n bit: string,\n pretty: boolean,\n indent: number,\n includeDeprecated: boolean,\n onlyDeprecated: boolean,\n full: boolean,\n language: string,\n ): string;\n is_bitmark(input: string): boolean;\n prettify(json: string, indent: number): string;\n convert_text(input: string, direction: string, format: string, location: string): string;\n}\n\nlet wasmProvider: (() => LegacyWasm) | undefined;\n\nexport function setLegacyWasm(wasm: LegacyWasm): void {\n wasmProvider = () => wasm;\n}\n\n/**\n * Provide the WASM module lazily (PLAN-166): the provider is consulted on\n * every legacy call, so it can defer loading and always reflects the ACTIVE\n * variant after an `init({ feature })` swap.\n */\nexport function setLegacyWasmProvider(provider: () => LegacyWasm): void {\n wasmProvider = provider;\n}\n\nexport function getLegacyWasm(): LegacyWasm {\n if (!wasmProvider) {\n throw new Error(\n \"legacy API not initialised: the WASM module has not been provided (browser consumers must call init() first)\",\n );\n }\n return wasmProvider();\n}\n\n/** Node file I/O, injected by the Node entry only (PLAN-126 F-5). */\nexport interface LegacyFileIo {\n existsSync(path: string): boolean;\n readFileSync(path: string, encoding: string): string;\n /** Write (or append) `data`, creating parent directories as needed. */\n writeFile(path: string, data: string, opts: { append?: boolean; encoding?: string }): void;\n}\n\nlet fileIo: LegacyFileIo | undefined;\n\nexport function setLegacyFileIo(io: LegacyFileIo): void {\n fileIo = io;\n}\n\n/** Returns undefined in the browser (no file I/O). */\nexport function getLegacyFileIo(): LegacyFileIo | undefined {\n return fileIo;\n}\n","// This file is automatically generated. DO NOT EDIT.\n\n/* eslint-disable */\n\nexport const PACKAGE_INFO = {\n \"name\": \"@gmb/bitmark-parser\",\n \"version\": \"7.7.0\",\n \"author\": \"Get More Brain Ltd <info@getmorebrain.com>\",\n \"license\": \"ISC\",\n \"description\": \"A parser for bitmark text, powered by WebAssembly.\"\n};\n","// @zen-component: LEGACY-Facade\n\n/** Error thrown for bpg API members / options the legacy facade does not support. */\nexport class LegacyUnsupportedError extends Error {\n constructor(message: string) {\n super(message);\n this.name = \"LegacyUnsupportedError\";\n }\n}\n\n/** Throw for a bpg API member that is not supported (PLAN-126 F-2). */\nexport function unsupportedMember(member: string, reason?: string): never {\n throw new LegacyUnsupportedError(\n `'${member}' is not supported by the @gmb/bitmark-parser legacy API` + (reason ? `: ${reason}` : \"\"),\n );\n}\n\n/** Throw for an option that cannot be honoured (PLAN-126 F-9: never silently ignore). */\nexport function unsupportedOption(option: string, reason?: string): never {\n throw new LegacyUnsupportedError(\n `Option '${option}' is not supported by the @gmb/bitmark-parser legacy API` +\n (reason ? `: ${reason}` : \"\"),\n );\n}\n","// @zen-component: LEGACY-Facade\n// Central bpg-option → core-parameter translation table (PLAN-126 F-4/F-9).\n// Strict policy: options that map are honoured; options we cannot honour\n// throw a LegacyUnsupportedError naming the option. Sole exception:\n// `bitmarkParserType` is accepted and ignored — bpg v5.31.1 itself hardcodes\n// the peggy parser and ignores the option.\n\nimport { unsupportedOption } from \"./errors.js\";\nimport type { BitmarkOptions, JsonOptions } from \"./options.js\";\n\nconst V3_ONLY = \"bitmark v2 output is not supported (this parser is bitmark v3 only)\";\n\nexport function validateVersionOptions(opts: {\n bitmarkVersion?: number;\n bitmarkParserType?: string;\n}): void {\n if (opts.bitmarkVersion === 2) unsupportedOption(\"bitmarkVersion: 2\", V3_ONLY);\n // bitmarkParserType: accepted + ignored (documented exception).\n}\n\nexport function validateBitmarkOptions(o: BitmarkOptions): void {\n // The option TYPES are narrowed to the supported values (build-time\n // errors for TS consumers), but JS callers can still pass anything —\n // keep validating the runtime values (hence the widening casts).\n // Booleans error only when set truthy (false === bpg default behaviour).\n if (o.explicitTextFormat) unsupportedOption(\"bitmarkOptions.explicitTextFormat\");\n // prettifyJson: honoured — maps to the core's pretty/indent for bitmark\n // output (embedded JSON bodies of json-format bits); see prettyIndent().\n if ((o.cardSetVersion as number | undefined) === 1) {\n unsupportedOption(\"bitmarkOptions.cardSetVersion: 1\", V3_ONLY);\n }\n if (o.debugGenerationInline) unsupportedOption(\"bitmarkOptions.debugGenerationInline\");\n if (o.noBreakscaping) unsupportedOption(\"bitmarkOptions.noBreakscaping\");\n}\n\nexport function validateJsonOptions(o: JsonOptions): void {\n if (o.textAsPlainText) unsupportedOption(\"jsonOptions.textAsPlainText\", V3_ONLY);\n // excludeUnknownProperties: honoured — maps to the core's inverse\n // `includeUnknownProperties` flag (bpg default: include; see bpg-class).\n if (o.debugGenerationInline) unsupportedOption(\"jsonOptions.debugGenerationInline\");\n // enableWarnings: accepted — parser warnings are always carried in the\n // output envelope by this parser, so both values are honoured trivially.\n}\n\n/**\n * bpg `prettify?: boolean | number` → core (pretty, indent).\n *\n * Also used for `bitmarkOptions.prettifyJson` (identical bpg semantics:\n * true → indent 2, positive number → that indent, else off) — for bitmark\n * output the core's pretty/indent prettify the embedded JSON bodies of\n * json-format bits, which is exactly what bpg's prettifyJson did.\n */\nexport function prettyIndent(prettify: boolean | number | undefined): {\n pretty: boolean;\n indent: number;\n} {\n if (prettify === true) return { pretty: true, indent: 2 };\n if (typeof prettify === \"number\" && prettify > 0) return { pretty: true, indent: prettify };\n return { pretty: false, indent: 2 };\n}\n\n/** bpg `spacesAroundValues?: number | boolean` → core spaces count (cap 10, as bpg). */\nexport function spacesAround(v: number | boolean | undefined): number {\n if (v === undefined || v === true) return 1;\n if (v === false) return 0;\n return Math.max(0, Math.min(10, v));\n}\n\n/**\n * bpg text format value → core breakscape format.\n * bpg maps `latex`/`json`/`xml` as aliases of plain text, and defaults\n * anything else (including absent) to bitmark text (`bitmark++`).\n */\nexport function mapTextFormat(f: string | undefined): \"bitmark++\" | \"plainText\" {\n switch (f) {\n case \"text\":\n case \"latex\":\n case \"json\":\n case \"xml\":\n return \"plainText\";\n default:\n return \"bitmark++\";\n }\n}\n","// @zen-component: LEGACY-Facade\n// The legacy \"AST\" is bit JSON (PLAN-126 §3.1): an envelope of the parser's\n// wrapper entries (`{ bit, parser?, bitmark? }`), tagged with a\n// non-enumerable marker so it can be recognised without surviving\n// JSON.stringify. It round-trips through `convert`, but is NOT bpg's\n// internal TS AST node model (no `cardNode` / `BodyPart[]` structure).\n\nexport const PSEUDO_AST_MARKER = Symbol.for(\"@gmb/bitmark-parser/legacy-pseudo-ast\");\n\nexport interface LegacyPseudoAst {\n bits: unknown[];\n}\n\nexport function makePseudoAst(bits: unknown[]): LegacyPseudoAst {\n const ast: LegacyPseudoAst = { bits };\n Object.defineProperty(ast, PSEUDO_AST_MARKER, { value: true, enumerable: false });\n return ast;\n}\n\nexport function isPseudoAst(v: unknown): v is LegacyPseudoAst {\n return (\n v !== null &&\n typeof v === \"object\" &&\n (PSEUDO_AST_MARKER in v || Array.isArray((v as LegacyPseudoAst).bits))\n );\n}\n","// GENERATED FILE — do not edit.\n// Emitted by scripts/gen-legacy-resource-keys.mjs from\n// resources/bitmark-configurator/bitmark.json. Regenerate via `npm run init`.\n//\n// Every bit whose config maps a repeatable resource tag group onto a single\n// JSON collection key. The legacy `Builder.buildBit` routes bpg's\n// `resources` input onto this key (bpg's JsonGenerator special-cased the\n// same family by bit type; here it is derived from config).\n\n/** A bit's resource-collection mapping: target JSON key + accepted resource type. */\nexport interface ResourceCollection {\n key: string;\n resourceType: string;\n}\n\nexport const RESOURCE_COLLECTION_KEYS: Readonly<Record<string, ResourceCollection>> = {\n \"extractor-image\": { key: \"images\", resourceType: \"image\" },\n \"extractor-image-collapsible\": { key: \"images\", resourceType: \"image\" },\n \"images-logo-grave\": { key: \"logos\", resourceType: \"image\" },\n \"prototype-images\": { key: \"images\", resourceType: \"image\" },\n};\n","// @zen-component: LEGACY-Facade\n// bpg-compatible `Builder` (PLAN-126 §3.1): the legacy AST is bit JSON, so\n// building a bit is a data *mapping* (bpg buildBit data → bit JSON keys)\n// followed by one WASM json→json normalization pass — the config-driven core\n// performs the defaulting/coercion/validation that bpg's ~4.2k-line builder\n// does in TS. No parsing logic lives here.\n\nimport { getLegacyWasm } from \"./runtime.js\";\nimport { makePseudoAst, type LegacyPseudoAst } from \"./pseudo-ast.js\";\nimport { RESOURCE_COLLECTION_KEYS } from \"./generated/resource-collection-keys.js\";\nimport type { ParserError, ParserInfo } from \"./vendor/enums.js\";\n\n/** Carries bpg `data.parser` (wrapper-level metadata) invisibly on the built bit. */\nexport const BUILT_BIT_PARSER = Symbol.for(\"@gmb/bitmark-parser/legacy-built-bit-parser\");\n\n/**\n * bpg buildBit data keys whose bit-JSON key differs. Everything else in the\n * flat data object maps by identity (the data fields are already the bpg\n * JSON model types) and unknown keys pass through untouched (PLAN-126 F-6).\n */\nconst DATA_KEY_TO_JSON_KEY: Record<string, string> = {\n bitType: \"type\",\n textFormat: \"format\",\n flashcards: \"cards\",\n markConfig: \"marks\",\n};\n\n/** bpg deprecated text-format value accepted by buildBit. */\nconst DEPRECATED_TEXT_FORMATS: Record<string, string> = {\n \"bitmark--\": \"bitmark++\",\n \"bitmark+\": \"bitmark++\",\n};\n\n/**\n * Config `bodyFormat` → bpg TextFormat value. When the caller omits\n * `textFormat`, bpg defaults to the bit config's `textFormatDefault`\n * (bpg Builder.bit), which is derived from the config `bodyFormat` — NOT\n * to bitmark text. E.g. `extractor-information` (bodyFormat: json) built\n * without an explicit `textFormat` must keep its JSON body verbatim.\n */\nconst CONFIG_BODY_FORMAT_TO_TEXT_FORMAT: Record<string, string> = {\n bitmark: \"bitmark++\",\n text: \"text\",\n json: \"json\",\n latex: \"latex\",\n xml: \"xml\",\n};\n\n/** Top-level bit JSON fields typed JsonText (tag location) in bpg. */\nconst TAG_TEXT_KEYS = [\n \"title\",\n \"subtitle\",\n \"item\",\n \"lead\",\n \"pageNumber\",\n \"marginNumber\",\n \"hint\",\n \"instruction\",\n \"caption\",\n] as const;\n\nexport interface BuildBitOptions {\n cardSet?: {\n sideNo: number;\n variantNo: number;\n };\n}\n\nexport class Builder {\n /**\n * Build bitmark AST envelope (bpg-compatible `buildBitmark`).\n */\n buildBitmark(data: { bits?: unknown[]; errors?: ParserError[] }): LegacyPseudoAst {\n const ast = makePseudoAst(data.bits ?? []);\n if (data.errors !== undefined) {\n (ast as LegacyPseudoAst & { errors?: ParserError[] }).errors = data.errors;\n }\n return ast;\n }\n\n /**\n * Build a bit (bpg-compatible `buildBit`).\n *\n * Accepts the full bpg data shape (flat, ~250 optional fields, values in\n * the JSON model types). Returns the normalized bit JSON. Throws\n * `No config found for bit: X` for unknown bit types, as bpg does.\n *\n * NOTE (documented divergences from bpg):\n * - the return value is bit JSON, not bpg's internal AST node model;\n * - `resourceType` (an inference hint in bpg) is not carried into the\n * JSON — the attached `resource` object is authoritative.\n *\n * `resources` follows bpg's JsonGenerator routing: on a bit whose config\n * maps a repeatable resource tag group onto a collection key (e.g.\n * `images` / `logos` — see the generated RESOURCE_COLLECTION_KEYS), the\n * matching-type entries land under that key; on every other bit the first\n * entry becomes the canonical single `resource` (as bpg: \"if there is\n * more than one resource, use the first one\").\n */\n buildBit(data: Record<string, unknown>, _options?: BuildBitOptions): Record<string, unknown> {\n const wasm = getLegacyWasm();\n const src = { ...data };\n\n const bitType = src.bitType as string | undefined;\n const bitConfig = this.getBitConfig(bitType);\n\n // --- divergent keys ---\n const bit: Record<string, unknown> = {};\n bit.type = bitType;\n if (src.isCommented) {\n bit.type = \"_comment\";\n bit.originalType = bitType;\n }\n delete src.bitType;\n delete src.isCommented;\n\n const textFormat = src.textFormat as string | undefined;\n if (textFormat !== undefined) {\n bit.format = DEPRECATED_TEXT_FORMATS[textFormat] ?? textFormat;\n delete src.textFormat;\n } else {\n // bpg parity: `textFormat ?? bitConfig.textFormatDefault` — the\n // config-driven default, so e.g. JSON-bodied bits don't get their\n // body mangled by the bitmark text parser (see parseStringTexts).\n bit.format = CONFIG_BODY_FORMAT_TO_TEXT_FORMAT[bitConfig.bodyFormat ?? \"\"] ?? \"bitmark++\";\n }\n\n // resourceType is an inference hint only (see doc comment)\n delete src.resourceType;\n\n // body: accept bpg's Partial<Body> node ({ body: <JsonText> }) or a bare JsonText\n const body = src.body as { body?: unknown } | unknown;\n if (body !== undefined && body !== null && typeof body === \"object\" && \"body\" in (body as object)) {\n bit.body = (body as { body?: unknown }).body;\n delete src.body;\n }\n\n // example / __isDefaultExample → isExample + example (bpg toExample semantics)\n if (src.example !== undefined) {\n bit.isExample = true;\n bit.example = src.example;\n delete src.example;\n delete src.__isDefaultExample;\n } else if (src.__isDefaultExample) {\n bit.isExample = true;\n delete src.__isDefaultExample;\n }\n\n // resources → the bit's resource-collection key (config-derived), else\n // the canonical single `resource` — bpg's JsonGenerator routing.\n const resources = src.resources;\n if (resources !== undefined && bitType !== undefined) {\n const list = Array.isArray(resources) ? resources : [resources];\n const collection = RESOURCE_COLLECTION_KEYS[bitType];\n if (collection) {\n // bpg keeps only the entries of the collection's resource type.\n bit[collection.key] = list.filter(\n (r) =>\n r !== null &&\n typeof r === \"object\" &&\n (r as { type?: unknown }).type === collection.resourceType,\n );\n } else if (list.length >= 1) {\n bit.resource = list[0];\n }\n delete src.resources;\n }\n\n // parser metadata lives on the wrapper, not in the bit JSON\n const parser = src.parser as ParserInfo | undefined;\n delete src.parser;\n\n // extraProperties spread into the bit JSON top level (bpg semantics)\n const extraProperties = src.extraProperties as Record<string, unknown> | undefined;\n delete src.extraProperties;\n\n // --- renamed + identity + unknown keys (pass through, PLAN-126 F-6) ---\n for (const [key, value] of Object.entries(src)) {\n if (value === undefined) continue;\n bit[DATA_KEY_TO_JSON_KEY[key] ?? key] = value;\n }\n if (extraProperties) {\n for (const [key, value] of Object.entries(extraProperties)) {\n if (!(key in bit)) bit[key] = value;\n }\n }\n\n // --- bpg parity: string JsonText values are parsed bitmark text ---\n this.parseStringTexts(bit);\n\n // --- normalization pass: the config-driven core defaults/coerces/validates ---\n const out = wasm.convert(JSON.stringify([{ bit }]), \"json\", \"json\", \"optimized\", false, 2, 1, false, false, \"\", \"\");\n const entries = JSON.parse(out) as { bit: Record<string, unknown> }[];\n const built = entries[0]?.bit ?? bit;\n\n // F-6: keys the core doesn't know are dropped by the normalize pass —\n // re-attach them so nothing is lost silently. Values matching bpg's own\n // \"unset optional\" strip set (false / \"\" / [] / null) stay stripped,\n // mirroring bpg's removeUnwantedProperties.\n for (const [key, value] of Object.entries(bit)) {\n if (key in built) continue;\n if (\n value === false ||\n value === \"\" ||\n value === null ||\n (Array.isArray(value) && value.length === 0)\n ) {\n continue;\n }\n built[key] = value;\n }\n if (parser !== undefined) {\n Object.defineProperty(built, BUILT_BIT_PARSER, { value: parser, enumerable: false });\n }\n return built;\n }\n\n /**\n * Build a highlight body bit (bpg-compatible `buildHighlight`).\n * Shapes the HighlightJson body-bit; unset optionals are omitted.\n */\n buildHighlight(\n _context: unknown,\n data: Record<string, unknown> | undefined,\n ): Record<string, unknown> | undefined {\n if (!data) return undefined;\n const src = { ...data };\n // bpg: data may arrive nested under 'attrs' (when coming from JSON)\n const attrs = src.attrs as Record<string, unknown> | undefined;\n if (attrs) Object.assign(src, attrs);\n\n const texts = Array.isArray(src.texts)\n ? (src.texts as Record<string, unknown>[]).filter((t) => t != null).map((t) => ({\n text: t.text ?? \"\",\n isCorrect: t.isCorrect ?? false,\n isHighlighted: t.isHighlighted ?? false,\n ...stripUndefined(t, [\"text\", \"isCorrect\", \"isHighlighted\"]),\n }))\n : [];\n\n const node: Record<string, unknown> = {\n type: \"highlight\",\n texts,\n prefix: src.prefix ?? \"\",\n postfix: src.postfix ?? \"\",\n ...stripUndefined(src, [\"type\", \"texts\", \"prefix\", \"postfix\", \"attrs\"]),\n attrs: {},\n };\n return node;\n }\n\n /**\n * bpg's builder parses string-valued JsonText fields as bitmark text\n * (inline marks become TextAst marks); the composer would otherwise treat\n * them as literal text. Converts top-level JsonText fields in place.\n * Nested (card-content) strings are left literal — documented divergence.\n *\n * A string body is dispatched on the bit's resolved text format, as bpg's\n * buildBody: bitmark text is parsed to TextAst, `json` is JSON.parsed\n * (unparseable → null), and plain-text formats (text/latex/xml) stay\n * verbatim. Tag texts are always bitmark text, independent of body format\n * (bpg TextParser.toAst ignores format; only location matters).\n */\n private parseStringTexts(bit: Record<string, unknown>): void {\n const wasm = getLegacyWasm();\n const toAst = (s: string, location: \"body\" | \"tag\"): unknown => {\n if (s === \"\") return s;\n const out = wasm.convert_text(s, \"textToAst\", \"bitmark++\", location);\n try {\n return JSON.parse(out) as unknown;\n } catch {\n return s;\n }\n };\n\n const format = bit.format as string | undefined;\n const bitmarkBody = format === undefined || format === \"bitmark++\" || format === \"bitmark+\";\n if (typeof bit.body === \"string\") {\n if (format === \"json\") {\n // bpg handleJsonBody: parse legacy string bodies; null on failure\n try {\n bit.body = JSON.parse(bit.body) as unknown;\n } catch {\n bit.body = null;\n }\n } else if (bitmarkBody) {\n bit.body = toAst(bit.body, \"body\");\n }\n // plain-text formats (text/latex/xml): body stays a verbatim string\n }\n for (const key of TAG_TEXT_KEYS) {\n const v = bit[key];\n if (typeof v === \"string\") bit[key] = toAst(v, \"tag\");\n }\n }\n\n /**\n * Look up the bit's config (`wasm.info`); throws bpg's exact\n * bit-type-invalid error (`Config.getBitConfig` parity).\n */\n private getBitConfig(bitType: string | undefined): { bodyFormat?: string } {\n const wasm = getLegacyWasm();\n if (bitType !== undefined) {\n try {\n const info = JSON.parse(wasm.info(\"bit\", \"json\", bitType, false, 2, false, false, true, \"\")) as {\n error?: string;\n body?: { format?: string };\n };\n // PLAN-149 restructured the info JSON: bodyFormat now lives at\n // `body.format`; adapt to the legacy flat shape callers expect.\n if (info.error === undefined) return { bodyFormat: info.body?.format };\n } catch {\n // fall through to the not-found error\n }\n }\n throw new Error(`No config found for bit: ${bitType}`);\n }\n}\n\nfunction stripUndefined(\n src: Record<string, unknown>,\n exclude: string[],\n): Record<string, unknown> {\n const out: Record<string, unknown> = {};\n for (const [k, v] of Object.entries(src)) {\n if (v !== undefined && !exclude.includes(k)) out[k] = v;\n }\n return out;\n}\n","// @zen-component: LEGACY-Facade\n// bpg-compatible `BitmarkParserGenerator` class — a thin synchronous wrapper\n// over the WASM core (PLAN-126). Behavioural parity is at the call boundary:\n// same method names, option keys and return shapes as bpg v5.31.1.\n\nimport { PACKAGE_INFO } from \"../generated/package_info.js\";\nimport { unsupportedMember, unsupportedOption } from \"./errors.js\";\nimport { getLegacyFileIo, getLegacyWasm } from \"./runtime.js\";\nimport {\n mapTextFormat,\n prettyIndent,\n spacesAround,\n validateBitmarkOptions,\n validateJsonOptions,\n validateVersionOptions,\n} from \"./translate.js\";\nimport type {\n BreakscapeOptions,\n ConvertHtmlTableOptions,\n ConvertOptions,\n ConvertTextOptions,\n CreateAstOptions,\n ExtractPlainTextOptions,\n FileOptions,\n InfoOptions,\n UnbreakscapeOptions,\n UpgradeOptions,\n} from \"./options.js\";\nimport { makePseudoAst, type LegacyPseudoAst } from \"./pseudo-ast.js\";\nimport { BUILT_BIT_PARSER } from \"./builder.js\";\n\n/** Classified input for the convert/upgrade pipeline (PLAN-126 F-10). */\ninterface ResolvedInput {\n /** JSON-wrapper-array string (json/ast input) or bitmark source (bitmark input). */\n source: string;\n isBitmark: boolean;\n}\n\nexport class BitmarkParserGenerator {\n /**\n * Get the version of the library.\n *\n * Reports the @gmb/bitmark-parser version (not a bpg version string).\n */\n public version(): string {\n return PACKAGE_INFO.version;\n }\n\n /**\n * Convert bitmark from bitmark to JSON, or JSON to bitmark (bpg-compatible).\n *\n * Input detection order matches bpg: AST → JSON → assume bitmark.\n * Default output: bitmark input → json; json/ast input → bitmark.\n */\n public convert(input: string | unknown, options?: ConvertOptions): string | unknown | void {\n const opts: ConvertOptions = Object.assign({}, options);\n const jsonOptions = Object.assign({}, opts.jsonOptions);\n const bitmarkOptions = Object.assign({}, opts.bitmarkOptions);\n validateVersionOptions(opts);\n validateBitmarkOptions(bitmarkOptions);\n validateJsonOptions(jsonOptions);\n this.checkBrowserFileWrite(opts.outputFile);\n\n const wasm = getLegacyWasm();\n const { source, isBitmark } = this.resolveInput(input, opts.inputFormat);\n\n const outputFormat = opts.outputFormat ?? (isBitmark ? \"json\" : \"bitmark\");\n const coreFormat = outputFormat === \"ast\" ? \"json\" : outputFormat;\n // bpg parity: `jsonOptions.prettify` governs JSON output only;\n // `bitmarkOptions.prettifyJson` governs bitmark output (it prettifies the\n // embedded JSON bodies of json-format bits — same boolean|number shape).\n const { pretty, indent } = prettyIndent(jsonOptions.prettify);\n const emit =\n coreFormat === \"bitmark\" ? prettyIndent(bitmarkOptions.prettifyJson) : { pretty, indent };\n const spaces = spacesAround(bitmarkOptions.spacesAroundValues);\n // bpg parity: unknown properties are included in JSON output unless\n // `jsonOptions.excludeUnknownProperties` is set (the core flag is the\n // inverse and only affects the bitmark → JSON direction).\n const includeUnknown = !jsonOptions.excludeUnknownProperties;\n\n const out = wasm.convert(source, isBitmark ? \"bitmark\" : \"json\", coreFormat, \"optimized\", emit.pretty, emit.indent, spaces, includeUnknown, false, \"\", \"\");\n\n // Shape the result per output format (bpg-compatible return shapes)\n if (outputFormat === \"bitmark\" || outputFormat === \"text\") {\n return this.deliver(out, opts.outputFile, opts.fileOptions);\n }\n if (outputFormat === \"json\") {\n if (opts.outputFile) return this.deliver(out, opts.outputFile, opts.fileOptions);\n if (pretty || jsonOptions.stringify) return out;\n return JSON.parse(out) as unknown;\n }\n // outputFormat === \"ast\": bit-JSON pseudo-AST (PLAN-126 §3.1)\n const ast = makePseudoAst(JSON.parse(out) as unknown[]);\n if (opts.outputFile) {\n return this.deliver(JSON.stringify(ast), opts.outputFile, opts.fileOptions);\n }\n return ast;\n }\n\n /**\n * Upgrade (prettify / canonicalize) bitmark or JSON to the latest version\n * of itself (bpg-compatible `upgrade`).\n */\n public upgrade(input: string | unknown, options?: UpgradeOptions): string | unknown | void {\n const opts: UpgradeOptions = Object.assign({}, options);\n const jsonOptions = Object.assign({}, opts.jsonOptions);\n const bitmarkOptions = Object.assign({}, opts.bitmarkOptions);\n validateVersionOptions(opts);\n validateBitmarkOptions(bitmarkOptions);\n validateJsonOptions(jsonOptions);\n this.checkBrowserFileWrite(opts.outputFile);\n\n const wasm = getLegacyWasm();\n const { source, isBitmark } = this.resolveInput(input, opts.inputFormat);\n // Same routing as convert(): bitmark in → bitmark out, so prettifyJson\n // applies; JSON in → JSON out, so jsonOptions.prettify applies.\n const { pretty, indent } = prettyIndent(\n isBitmark ? bitmarkOptions.prettifyJson : jsonOptions.prettify,\n );\n const spaces = spacesAround(bitmarkOptions.spacesAroundValues);\n\n const out = wasm.canonicalize(source, isBitmark ? \"bitmark\" : \"json\", \"optimized\", pretty, indent, spaces);\n\n if (isBitmark) return this.deliver(out, opts.outputFile, opts.fileOptions);\n if (opts.outputFile) return this.deliver(out, opts.outputFile, opts.fileOptions);\n if (pretty || jsonOptions.stringify) return out;\n return JSON.parse(out) as unknown;\n }\n\n /**\n * Get information about the bitmark language (bpg-compatible `info`).\n */\n public info(options?: InfoOptions): unknown {\n const opts: InfoOptions = Object.assign({}, options);\n const wasm = getLegacyWasm();\n const type = opts.type ?? \"list\";\n const format = opts.outputFormat ?? \"text\";\n const { pretty, indent } = prettyIndent(opts.prettify);\n\n const coreFormat = format === \"pojo\" ? \"json\" : format;\n // full=true: the legacy facade keeps the rich info shape (bpg parity).\n // The legacy (bpg-compatible) surface is English-only by definition.\n const out = wasm.info(type, coreFormat, opts.bit ?? \"\", pretty, indent, false, false, true, \"\");\n if (format === \"pojo\") return JSON.parse(out) as unknown;\n return out;\n }\n\n /** Not supported: bpg-internal development tool. */\n public generateConfig(_options?: unknown): void {\n unsupportedMember(\"BitmarkParserGenerator.generateConfig\", \"bpg-internal development tool\");\n }\n\n /**\n * Convert between HTML tables and bitmark tables (bpg-compatible\n * `convertHtmlTable`).\n *\n * Backed by the core's schema-driven html mapping: HTML input has each\n * `<table>` wrapped in the core's `<bitmark-bit>` envelope and parsed;\n * bits input is emitted as html and the `<table>` fragments extracted\n * (the envelope stripped). The markup *inside* `<table>` follows this\n * parser's html mapping, which may differ from bpg's in detail.\n */\n public convertHtmlTable(\n input: string | unknown,\n options?: ConvertHtmlTableOptions,\n ): string | unknown | void {\n const opts: ConvertHtmlTableOptions = Object.assign({}, options);\n const jsonOptions = Object.assign({}, opts.jsonOptions);\n const bitmarkOptions = Object.assign({}, opts.bitmarkOptions);\n validateBitmarkOptions(bitmarkOptions);\n validateJsonOptions(jsonOptions);\n if (opts.keepUnknownTags) unsupportedOption(\"keepUnknownTags\");\n if (opts.noBreakscaping) unsupportedOption(\"noBreakscaping\");\n this.checkBrowserFileWrite(opts.outputFile);\n const wasm = getLegacyWasm();\n\n const inStr = typeof input === \"string\" ? this.maybeReadFile(input, undefined) : \"\";\n const isHtmlInput =\n opts.inputFormat === \"html\" ||\n (opts.inputFormat === undefined && typeof input === \"string\" && /<table[\\s>]/iu.test(inStr));\n\n if (!isHtmlInput) {\n // bits (bitmark / JSON / AST) → HTML `<table>` fragments\n const { source, isBitmark } = this.resolveInput(input, undefined);\n const out = wasm.convert(source, isBitmark ? \"bitmark\" : \"json\", \"html\", \"optimized\", false, 2, 1, false, false, \"\", \"\");\n return this.deliver(extractHtmlTables(out).join(\"\\n\"), opts.outputFile, opts.fileOptions);\n }\n\n // HTML input: wrap each <table> in the core's bit envelope and parse\n const bitType = opts.tableFormat === \"table\" ? \"table\" : \"table-extended\";\n const wrapped = extractHtmlTables(inStr)\n .map((t) => `<bitmark-bit data-type=\"${bitType}\" data-format=\"bitmark++\">${t}</bitmark-bit>`)\n .join(\"\");\n const outputFormat = opts.outputFormat ?? \"bitmark\";\n const { pretty, indent } = prettyIndent(jsonOptions.prettify);\n const spaces = spacesAround(bitmarkOptions.spacesAroundValues);\n\n if (outputFormat === \"html\") {\n const out = wasm.convert(wrapped, \"html\", \"html\", \"optimized\", false, 2, 1, false, false, \"\", \"\");\n return this.deliver(extractHtmlTables(out).join(\"\\n\"), opts.outputFile, opts.fileOptions);\n }\n const coreFormat = outputFormat === \"ast\" ? \"json\" : outputFormat;\n const out = wasm.convert(wrapped, \"html\", coreFormat, \"optimized\", pretty, indent, spaces, false, false, \"\", \"\");\n if (outputFormat === \"bitmark\" || outputFormat === \"text\") {\n return this.deliver(out, opts.outputFile, opts.fileOptions);\n }\n if (outputFormat === \"json\") {\n if (opts.outputFile) return this.deliver(out, opts.outputFile, opts.fileOptions);\n if (pretty || jsonOptions.stringify) return out;\n return JSON.parse(out) as unknown;\n }\n const ast = makePseudoAst(JSON.parse(out) as unknown[]);\n if (opts.outputFile) return this.deliver(JSON.stringify(ast), opts.outputFile, opts.fileOptions);\n return ast;\n }\n\n /**\n * Create a bit-JSON pseudo-AST from bitmark or JSON input (PLAN-126 §3.1).\n *\n * NOTE: the returned structure is the bit JSON (wrapper entries), not\n * bpg's internal TS AST node model. It round-trips through `convert` but\n * is not walkable with bpg's `Ast`/`NodeType`.\n */\n public createAst(input: unknown, options?: CreateAstOptions): LegacyPseudoAst {\n const opts: CreateAstOptions = Object.assign({}, options);\n const wasm = getLegacyWasm();\n const { source, isBitmark } = this.resolveInput(input, opts.inputFormat);\n // bpg's AST carries extraProperties unconditionally (createAst has no\n // jsonOptions), so unknown properties are always included here.\n const out = wasm.convert(source, isBitmark ? \"bitmark\" : \"json\", \"json\", \"optimized\", false, 2, 1, true, false, \"\", \"\");\n return makePseudoAst(JSON.parse(out) as unknown[]);\n }\n\n /**\n * Breakscape text (bpg-compatible `breakscapeText`).\n */\n public breakscapeText(input: string, options?: BreakscapeOptions): string | void {\n if (!input) return input;\n const opts: BreakscapeOptions = Object.assign({}, options);\n this.checkBrowserFileWrite(opts.outputFile);\n const wasm = getLegacyWasm();\n const inStr = this.maybeReadFile(input, opts.inputFormat);\n const res = wasm.breakscape_text(inStr, mapTextFormat(opts.textFormat), opts.textLocation ?? \"body\");\n return this.deliver(res, opts.outputFile, opts.fileOptions);\n }\n\n /**\n * Unbreakscape text (bpg-compatible `unbreakscapeText`).\n */\n public unbreakscapeText(input: string, options?: UnbreakscapeOptions): string | void {\n if (!input) return input;\n const opts: UnbreakscapeOptions = Object.assign({}, options);\n this.checkBrowserFileWrite(opts.outputFile);\n const wasm = getLegacyWasm();\n const inStr = this.maybeReadFile(input, opts.inputFormat);\n const res = wasm.unbreakscape_text(inStr, mapTextFormat(opts.textFormat), opts.textLocation ?? \"body\");\n return this.deliver(res, opts.outputFile, opts.fileOptions);\n }\n\n /**\n * Convert bitmark text ↔ text AST (bpg-compatible `convertText`).\n *\n * Direction is auto-detected: TextAst (JSON) input generates bitmark\n * text; anything else parses as bitmark text and returns the TextAst\n * (plain JS object; a string when `jsonOptions.prettify` is set).\n */\n public convertText(input: string | unknown, options?: ConvertTextOptions): string | unknown | void {\n const opts: ConvertTextOptions = Object.assign({}, options);\n const jsonOptions = Object.assign({}, opts.jsonOptions);\n this.checkBrowserFileWrite(opts.outputFile);\n const wasm = getLegacyWasm();\n\n const isBitmarkText = opts.textFormat === undefined || mapTextFormat(opts.textFormat) === \"bitmark++\";\n const textLocation = opts.textLocation ?? \"body\";\n\n let inStr: string;\n let ast: unknown[] | undefined;\n if (typeof input === \"string\") {\n inStr = this.maybeReadFile(input, opts.inputFormat);\n ast = this.parseTextAstString(inStr);\n } else {\n inStr = JSON.stringify(input);\n ast = Array.isArray(input) ? input : undefined;\n }\n\n if (ast !== undefined) {\n // TextAst → text (reverse honours the location; a plain-text format\n // generates plain text, i.e. marks are dropped — bpg parity)\n const out = isBitmarkText\n ? wasm.convert_text(JSON.stringify(ast), \"astToText\", \"bitmark++\", textLocation)\n : wasm.convert_text(JSON.stringify(ast), \"astToPlainText\", \"plainText\", textLocation);\n return this.deliver(out, opts.outputFile, opts.fileOptions);\n }\n\n // text → TextAst (bpg parses forward at body location)\n const out = wasm.convert_text(inStr, \"textToAst\", isBitmarkText ? \"bitmark++\" : \"plainText\", \"body\");\n const { pretty, indent } = prettyIndent(jsonOptions.prettify);\n const outStr = pretty ? wasm.prettify(out, indent) : out;\n if (opts.outputFile) return this.deliver(outStr, opts.outputFile, opts.fileOptions);\n if (pretty) return outStr;\n return JSON.parse(out) as unknown;\n }\n\n /**\n * Convert a text AST to plain text (bpg-compatible `textAstToPlainText`).\n */\n public textAstToPlainText(textAst: unknown, _options?: ExtractPlainTextOptions): string {\n const wasm = getLegacyWasm();\n const out = wasm.convert_text(\n typeof textAst === \"string\" ? textAst : JSON.stringify(textAst),\n \"astToPlainText\",\n \"bitmark++\",\n \"body\",\n );\n return out;\n }\n\n /**\n * Extract plain text from bitmark or bitmark JSON (bpg-compatible).\n */\n public extractPlainText(input: string | unknown, options?: ExtractPlainTextOptions): string {\n const inputFormat = options?.inputFormat;\n const wasm = getLegacyWasm();\n if (inputFormat === \"plainText\") {\n return typeof input === \"string\" ? String(input) : \"\";\n }\n if (inputFormat === \"bitmarkText\") {\n const ast = wasm.convert_text(String(input), \"textToAst\", \"bitmark++\", \"body\");\n const out = wasm.convert_text(ast, \"astToPlainText\", \"bitmark++\", \"body\");\n return out;\n }\n if (typeof input === \"string\" && this.parseTextAstString(input) === undefined && !wasm.is_bitmark(input)) {\n // Neither JSON nor bitmark: bpg falls through to bitmark text\n const looksJson = ((): boolean => {\n try {\n JSON.parse(input);\n return true;\n } catch {\n return false;\n }\n })();\n if (!looksJson) {\n return this.extractPlainText(input, { inputFormat: \"bitmarkText\" });\n }\n }\n const { source, isBitmark } = this.resolveInput(input, undefined);\n const out = wasm.convert(source, isBitmark ? \"bitmark\" : \"json\", \"text\", \"optimized\", false, 2, 1, false, false, \"\", \"\");\n return out;\n }\n\n /** If `s` parses as a TextAst JSON array, return it. */\n private parseTextAstString(s: string): unknown[] | undefined {\n const t = s.trim();\n if (!t.startsWith(\"[\")) return undefined;\n try {\n const v = JSON.parse(t) as unknown;\n if (Array.isArray(v) && v.every((n) => n !== null && typeof n === \"object\" && \"type\" in n)) {\n return v;\n }\n } catch {\n // not JSON\n }\n return undefined;\n }\n\n // ------------------------------------------------------------------\n // Internal helpers\n // ------------------------------------------------------------------\n\n /**\n * Resolve bpg input (string | file path | JSON value | pseudo-AST) to a\n * source string for the WASM core, classified per bpg's detection order:\n * AST → JSON → assume bitmark (PLAN-126 F-10).\n */\n protected resolveInput(input: unknown, inputFormat: string | undefined): ResolvedInput {\n if (typeof input !== \"string\") {\n // Parsed JSON / pseudo-AST value.\n const entries = this.jsonEntries(input);\n return {\n source: JSON.stringify(entries ? entries.map((b) => this.toWrapperEntry(b)) : input),\n isBitmark: false,\n };\n }\n const inStr = this.maybeReadFile(input, inputFormat);\n const wasm = getLegacyWasm();\n if (wasm.is_bitmark(inStr)) return { source: inStr, isBitmark: true };\n // JSON-ish: normalise loose shapes (AST envelope, single wrapper, bare bit)\n try {\n const parsed = JSON.parse(inStr) as unknown;\n const entries = this.jsonEntries(parsed);\n if (entries) {\n return {\n source: JSON.stringify(entries.map((b) => this.toWrapperEntry(b))),\n isBitmark: false,\n };\n }\n } catch {\n // is_bitmark said \"not bitmark\" but it is not JSON either —\n // fall through and let the core's own detection handle it (bpg\n // behaviour: assume bitmark).\n return { source: inStr, isBitmark: true };\n }\n return { source: inStr, isBitmark: false };\n }\n\n /**\n * Normalise the JSON shapes bpg accepts to a bits/entries array:\n * wrapper array, `{ bits: [...] }` AST envelope, single `{ bit: ... }`\n * wrapper, or a bare bit object (`{ type: ... }`).\n */\n private jsonEntries(v: unknown): unknown[] | undefined {\n if (Array.isArray(v)) return v;\n if (v !== null && typeof v === \"object\") {\n const o = v as Record<string, unknown>;\n if (Array.isArray(o.bits)) return o.bits;\n if (\"bit\" in o) return [o];\n if (typeof o.type === \"string\") return [{ bit: o }];\n }\n return undefined;\n }\n\n /**\n * Normalise a pseudo-AST bits entry to a `{ bit, parser? }` wrapper.\n * `Builder.buildBit` returns bare bit JSON (with any parser metadata\n * attached under a non-enumerable symbol); parsed forward output is\n * already wrapper-shaped.\n */\n private toWrapperEntry(entry: unknown): unknown {\n if (entry !== null && typeof entry === \"object\" && \"bit\" in (entry as object)) return entry;\n const wrapper: { bit: unknown; parser?: unknown } = { bit: entry };\n const parser = (entry as Record<symbol, unknown> | null)?.[BUILT_BIT_PARSER];\n if (parser !== undefined) wrapper.parser = parser;\n return wrapper;\n }\n\n /** bpg parity: read `input` as a file when it names one (Node only). */\n protected maybeReadFile(input: string, inputFormat: string | undefined): string {\n if (inputFormat === \"string\") return input;\n const io = getLegacyFileIo();\n if (!io) return input;\n try {\n if (io.existsSync(input)) return io.readFileSync(input, \"utf8\");\n } catch {\n // treat as literal input\n }\n return input;\n }\n\n /** bpg parity: writing a file is impossible in the browser. */\n protected checkBrowserFileWrite(outputFile: string | undefined): void {\n if (outputFile && !getLegacyFileIo()) {\n throw new Error(\"Cannot write to file in browser environment\");\n }\n }\n\n /** Return `data`, or write it to `outputFile` (returning void), as bpg does. */\n protected deliver(data: string, outputFile?: string, fileOptions?: FileOptions): string | void {\n if (!outputFile) return data;\n const io = getLegacyFileIo();\n if (!io) throw new Error(\"Cannot write to file in browser environment\");\n io.writeFile(outputFile, data, {\n append: fileOptions?.append,\n encoding: fileOptions?.encoding ?? \"utf8\",\n });\n }\n\n}\n\n/**\n * Extract every top-level `<table>…</table>` fragment from `html`\n * (case-insensitive, nesting-safe). Pure string scanning — no HTML parsing.\n */\nfunction extractHtmlTables(html: string): string[] {\n const tables: string[] = [];\n const lower = html.toLowerCase();\n let i = 0;\n for (;;) {\n const start = lower.indexOf(\"<table\", i);\n if (start === -1) break;\n let depth = 0;\n let j = start;\n let end = -1;\n while (j < html.length) {\n const open = lower.indexOf(\"<table\", j);\n const close = lower.indexOf(\"</table\", j);\n if (close === -1) break;\n if (open !== -1 && open < close) {\n depth++;\n j = open + \"<table\".length;\n } else {\n depth--;\n const closeEnd = lower.indexOf(\">\", close);\n j = closeEnd === -1 ? html.length : closeEnd + 1;\n if (depth === 0) {\n end = j;\n break;\n }\n }\n }\n if (end === -1) break;\n tables.push(html.slice(start, end));\n i = end;\n }\n return tables;\n}\n\n/**\n * Direct bitmark text parser (bpg-compatible `bitmarkTextParse`):\n * bitmark text → TextAst array.\n */\nexport function bitmarkTextParse(text: string): unknown[] {\n const out = getLegacyWasm().convert_text(text, \"textToAst\", \"bitmark++\", \"body\");\n return JSON.parse(out) as unknown[];\n}\n","// @zen-component: LEGACY-Facade\n// bpg-compatible `ResourceBuilder` (PLAN-126 §3.1): each method shapes the\n// `{ type, <family>: { ... } }` ResourceJson wrapper from bpg's flat data.\n// One generic table-driven implementation — per-bit-type defaulting and\n// URL-derived cosmetics are left to the config-driven core, which normalizes\n// the resource when the bit containing it is converted.\n\ninterface ResourceSpec {\n /** ResourceJson discriminator (`type`). */\n type: string;\n /** Family key holding the resource data object. */\n key: string;\n /** JSON field that bpg's `data.value` maps to. */\n valueField: \"src\" | \"url\" | \"body\";\n}\n\nconst RESOURCE_SPECS = {\n imageResource: { type: \"image\", key: \"image\", valueField: \"src\" },\n imageLinkResource: { type: \"image-link\", key: \"imageLink\", valueField: \"url\" },\n audioResource: { type: \"audio\", key: \"audio\", valueField: \"src\" },\n audioEmbedResource: { type: \"audio-embed\", key: \"audioEmbed\", valueField: \"src\" },\n audioLinkResource: { type: \"audio-link\", key: \"audioLink\", valueField: \"url\" },\n videoResource: { type: \"video\", key: \"video\", valueField: \"src\" },\n videoEmbedResource: { type: \"video-embed\", key: \"videoEmbed\", valueField: \"url\" },\n videoLinkResource: { type: \"video-link\", key: \"videoLink\", valueField: \"url\" },\n stillImageFilmEmbedResource: {\n type: \"still-image-film-embed\",\n key: \"stillImageFilmEmbed\",\n valueField: \"url\",\n },\n stillImageFilmLinkResource: {\n type: \"still-image-film-link\",\n key: \"stillImageFilmLink\",\n valueField: \"url\",\n },\n articleResource: { type: \"article\", key: \"article\", valueField: \"body\" },\n documentResource: { type: \"document\", key: \"document\", valueField: \"url\" },\n documentEmbedResource: { type: \"document-embed\", key: \"documentEmbed\", valueField: \"url\" },\n documentLinkResource: { type: \"document-link\", key: \"documentLink\", valueField: \"url\" },\n documentDownloadResource: {\n type: \"document-download\",\n key: \"documentDownload\",\n valueField: \"url\",\n },\n appLinkResource: { type: \"app-link\", key: \"appLink\", valueField: \"url\" },\n websiteLinkResource: { type: \"website-link\", key: \"websiteLink\", valueField: \"url\" },\n} as const satisfies Record<string, ResourceSpec>;\n\nexport type ResourceMethod = (\n context: unknown,\n data: Record<string, unknown> | undefined,\n __typeAlias?: string,\n) => Record<string, unknown> | undefined;\n\nfunction buildResource(spec: ResourceSpec): ResourceMethod {\n return (_context, data, _typeAlias) => {\n if (!data) return undefined;\n const { value, ...rest } = data;\n const inner: Record<string, unknown> = { [spec.valueField]: value ?? \"\" };\n for (const [k, v] of Object.entries(rest)) {\n if (v !== undefined) inner[k] = v;\n }\n return { type: spec.type, [spec.key]: inner };\n };\n}\n\n/** Resource `type` string → spec (for the generic wrapper/data entry points). */\nconst SPEC_BY_TYPE: Record<string, ResourceSpec> = Object.fromEntries(\n Object.values(RESOURCE_SPECS).map((s) => [s.type, s]),\n);\n\n/** bpg-compatible ResourceBuilder: 17 `<family>Resource(context, data)` methods\n * plus the generic `resourceFromResourceJson` / `resourceFromResourceDataJson`. */\nexport class ResourceBuilder {\n /**\n * Normalise existing ResourceJson wrapper(s) (bpg-compatible).\n * Unknown resource types are dropped (bpg parity: it skips invalid types).\n */\n resourceFromResourceJson(\n _context: unknown,\n resource?: Record<string, unknown> | Record<string, unknown>[],\n ): unknown {\n if (!resource) return undefined;\n const single = !Array.isArray(resource);\n const list = single ? [resource as Record<string, unknown>] : resource;\n const nodes: Record<string, unknown>[] = [];\n for (const wrapper of list) {\n const spec = SPEC_BY_TYPE[wrapper.type as string];\n if (!spec) continue;\n const inner = (wrapper[spec.key] ?? {}) as Record<string, unknown>;\n const { [spec.valueField]: value, ...rest } = inner;\n const built = buildResource(spec)(undefined, { value, ...rest });\n if (built) nodes.push(built);\n }\n if (nodes.length === 0) return undefined;\n return single ? nodes[0] : nodes;\n }\n\n /**\n * Build a resource wrapper from a bare ResourceDataJson (bpg-compatible).\n * `data` may also be a plain string (used as the url/src/body value).\n */\n resourceFromResourceDataJson(\n context: unknown,\n type: string,\n data?: Record<string, unknown> | string,\n ): Record<string, unknown> | undefined {\n if (!data) return undefined;\n const spec = SPEC_BY_TYPE[type];\n if (!spec) return undefined;\n const asString = typeof data === \"string\" ? data : undefined;\n const obj = typeof data === \"object\" ? data : {};\n const { url, src, body, ...rest } = obj as {\n url?: unknown;\n src?: unknown;\n body?: unknown;\n [k: string]: unknown;\n };\n const value = url ?? src ?? body ?? asString;\n return buildResource(spec)(context, { value, ...rest });\n }\n imageResource: ResourceMethod = buildResource(RESOURCE_SPECS.imageResource);\n imageLinkResource: ResourceMethod = buildResource(RESOURCE_SPECS.imageLinkResource);\n audioResource: ResourceMethod = buildResource(RESOURCE_SPECS.audioResource);\n audioEmbedResource: ResourceMethod = buildResource(RESOURCE_SPECS.audioEmbedResource);\n audioLinkResource: ResourceMethod = buildResource(RESOURCE_SPECS.audioLinkResource);\n videoResource: ResourceMethod = buildResource(RESOURCE_SPECS.videoResource);\n videoEmbedResource: ResourceMethod = buildResource(RESOURCE_SPECS.videoEmbedResource);\n videoLinkResource: ResourceMethod = buildResource(RESOURCE_SPECS.videoLinkResource);\n stillImageFilmEmbedResource: ResourceMethod = buildResource(\n RESOURCE_SPECS.stillImageFilmEmbedResource,\n );\n stillImageFilmLinkResource: ResourceMethod = buildResource(\n RESOURCE_SPECS.stillImageFilmLinkResource,\n );\n articleResource: ResourceMethod = buildResource(RESOURCE_SPECS.articleResource);\n documentResource: ResourceMethod = buildResource(RESOURCE_SPECS.documentResource);\n documentEmbedResource: ResourceMethod = buildResource(RESOURCE_SPECS.documentEmbedResource);\n documentLinkResource: ResourceMethod = buildResource(RESOURCE_SPECS.documentLinkResource);\n documentDownloadResource: ResourceMethod = buildResource(\n RESOURCE_SPECS.documentDownloadResource,\n );\n appLinkResource: ResourceMethod = buildResource(RESOURCE_SPECS.appLinkResource);\n websiteLinkResource: ResourceMethod = buildResource(RESOURCE_SPECS.websiteLinkResource);\n}\n","// @zen-component: LEGACY-Facade\n// bpg-compatible enum objects and option interfaces (vendored from\n// bitmark-parser-generator v5.31.1, superenum EnumType<> replaced with the\n// equivalent value-union derivation). Exposed ONLY via the `legacy`\n// namespace / subpath — never re-exported at the package root.\n\n/** @internal */\ntype EnumType<T> = T[keyof T];\n\n/** Input type enumeration */\nexport const Input = {\n /** Input is as a string */\n string: \"string\",\n /** Input is as a file path */\n file: \"file\",\n} as const;\nexport type InputType = EnumType<typeof Input>;\n\n/** Output type enumeration */\nexport const Output = {\n /** Output bitmark string */\n bitmark: \"bitmark\",\n /** Output JSON as a plain JS object, or a file */\n json: \"json\",\n /** Output AST as a plain JS object, or a file */\n ast: \"ast\",\n /** Output plain text as a string, or a file */\n text: \"text\",\n} as const;\nexport type OutputType = EnumType<typeof Output>;\n\n/** Input format enumeration */\nexport const InputFormat = {\n bitmark: \"bitmark\",\n bitmarkText: \"bitmarkText\",\n plainText: \"plainText\",\n html: \"html\",\n} as const;\nexport type InputFormatType = EnumType<typeof InputFormat>;\n\nexport const BitmarkVersion = {\n v2: 2,\n v3: 3,\n} as const;\nexport type BitmarkVersionType = EnumType<typeof BitmarkVersion>;\n\nexport const CardSetVersion = {\n v1: 1,\n v2: 2,\n} as const;\nexport type CardSetVersionType = EnumType<typeof CardSetVersion>;\n\nexport const BitmarkParserType = {\n peggy: \"peggy\",\n} as const;\nexport type BitmarkParserTypeType = EnumType<typeof BitmarkParserType>;\n\nexport const InfoType = {\n list: \"list\",\n deprecated: \"deprecated\",\n all: \"all\",\n bit: \"bit\",\n} as const;\nexport type InfoTypeType = EnumType<typeof InfoType>;\n\nexport const InfoFormat = {\n text: \"text\",\n json: \"json\",\n pojo: \"pojo\",\n} as const;\nexport type InfoFormatType = EnumType<typeof InfoFormat>;\n\nexport const BodyTextFormat = {\n plainText: \"text\",\n latex: \"latex\",\n json: \"json\",\n xml: \"xml\",\n bitmarkPlusPlus: \"bitmark++\",\n} as const;\nexport type BodyTextFormatType = EnumType<typeof BodyTextFormat>;\n\nexport const TextLocation = {\n tag: \"tag\",\n body: \"body\",\n cardBody: \"cardBody\",\n} as const;\nexport type TextLocationType = EnumType<typeof TextLocation>;\n\n/** Options for the output file (Node only) */\nexport interface FileOptions {\n /** Append to a file if true, otherwise overwrite */\n append?: boolean;\n /** Character encoding, defaults to 'utf8' */\n encoding?: string;\n}\n\n// Strict option policy, surfaced at BUILD time (bpg declared these wider):\n// options this facade cannot honour are narrowed to their supported value(s)\n// — truthy-throws booleans to `false`, value-gated enums to the supported\n// literal — so TS consumers get a type error instead of only the runtime\n// LegacyUnsupportedError. The runtime validation stays (JS callers, or TS\n// with the type ignored, still get the loud error).\n\n/** Options for bitmark generation */\nexport interface BitmarkOptions {\n /** Not supported — `true` throws `LegacyUnsupportedError` at runtime. */\n explicitTextFormat?: false;\n prettifyJson?: boolean | number;\n /** bitmark v3 only — card set version `1` throws `LegacyUnsupportedError` at runtime. */\n cardSetVersion?: typeof CardSetVersion.v2;\n spacesAroundValues?: number | boolean;\n /** Not supported — `true` throws `LegacyUnsupportedError` at runtime. */\n debugGenerationInline?: false;\n /** Not supported — `true` throws `LegacyUnsupportedError` at runtime. */\n noBreakscaping?: false;\n}\n\n/** Options for JSON generation */\nexport interface JsonOptions {\n enableWarnings?: boolean | number;\n prettify?: boolean | number;\n stringify?: boolean;\n /** bitmark v3 only — `true` throws `LegacyUnsupportedError` at runtime. */\n textAsPlainText?: false;\n /**\n * Exclude unknown properties from the JSON output (default: `false` —\n * unknown properties are included, as bpg). The parser's warning text\n * references the new API's inverse flag (`includeUnknownProperties`).\n */\n excludeUnknownProperties?: boolean;\n /** Not supported — `true` throws `LegacyUnsupportedError` at runtime. */\n debugGenerationInline?: false;\n}\n\n/** Options for bitmark text JSON generation */\nexport interface TextJsonOptions {\n prettify?: boolean | number;\n}\n\n/** Info options for the parser */\nexport interface InfoOptions {\n type?: InfoTypeType;\n bit?: string;\n outputFormat?: InfoFormatType;\n prettify?: boolean | number;\n}\n\n/** Conversion options for bitmark / JSON conversion */\nexport interface ConvertOptions {\n /** bitmark v3 only — version `2` throws `LegacyUnsupportedError` at runtime. */\n bitmarkVersion?: typeof BitmarkVersion.v3;\n bitmarkParserType?: BitmarkParserTypeType;\n inputFormat?: InputType;\n outputFormat?: OutputType;\n outputFile?: string;\n fileOptions?: FileOptions;\n bitmarkOptions?: BitmarkOptions;\n jsonOptions?: JsonOptions;\n}\n\n/** Prettify options for bitmark / JSON prettify / validate */\nexport interface UpgradeOptions {\n /** bitmark v3 only — version `2` throws `LegacyUnsupportedError` at runtime. */\n bitmarkVersion?: typeof BitmarkVersion.v3;\n bitmarkParserType?: BitmarkParserTypeType;\n inputFormat?: InputType;\n outputFile?: string;\n fileOptions?: FileOptions;\n bitmarkOptions?: BitmarkOptions;\n jsonOptions?: JsonOptions;\n}\n\n/** Conversion options for bitmark text / JSON conversion */\nexport interface ConvertTextOptions {\n textFormat?: BodyTextFormatType;\n textLocation?: TextLocationType;\n inputFormat?: InputType;\n outputFile?: string;\n fileOptions?: FileOptions;\n jsonOptions?: TextJsonOptions;\n}\n\n/** Create AST options */\nexport interface CreateAstOptions {\n inputFormat?: InputType;\n}\n\nexport interface ExtractPlainTextOptions {\n inputFormat?: InputFormatType;\n}\n\n/** Options for convertHtmlTable */\nexport interface ConvertHtmlTableOptions {\n inputFormat?: InputFormatType;\n outputFormat?: OutputType | \"html\";\n tableFormat?: string;\n keepUnknownTags?: boolean;\n /** Not supported — `true` throws `LegacyUnsupportedError` at runtime. */\n noBreakscaping?: false;\n outputFile?: string;\n fileOptions?: FileOptions;\n bitmarkOptions?: BitmarkOptions;\n jsonOptions?: JsonOptions;\n}\n\n/** Breakscape options */\nexport interface BreakscapeOptions {\n inputFormat?: InputType;\n outputFile?: string;\n fileOptions?: FileOptions;\n textFormat?: BodyTextFormatType;\n textLocation?: TextLocationType;\n}\n\n/** Unbreakscape options */\nexport interface UnbreakscapeOptions {\n inputFormat?: InputType;\n outputFile?: string;\n fileOptions?: FileOptions;\n textFormat?: BodyTextFormatType;\n textLocation?: TextLocationType;\n}\n","// @zen-component: LEGACY-Facade\n// Remaining bpg enum exports: TextMarkType / TextNodeType (vendored values),\n// BitType (built lazily from the config-driven core — never a hardcoded bit\n// list), and throwing proxies for enums tied to unsupported internals.\n\nimport { unsupportedMember } from \"./errors.js\";\nimport { getLegacyWasm } from \"./runtime.js\";\n\n/** Vendored from bpg v5.31.1 model/enum/TextMarkType.ts. */\nexport const TextMarkType = {\n bold: \"bold\",\n light: \"light\",\n italic: \"italic\",\n highlight: \"highlight\",\n highlightOrange: \"highlightOrange\",\n highlightYellow: \"highlightYellow\",\n highlightGreen: \"highlightGreen\",\n highlightBlue: \"highlightBlue\",\n highlightPurple: \"highlightPurple\",\n highlightPink: \"highlightPink\",\n highlightBrown: \"highlightBrown\",\n highlightBlack: \"highlightBlack\",\n highlightWhite: \"highlightWhite\",\n highlightGray: \"highlightGray\",\n strike: \"strike\",\n subscript: \"subscript\",\n superscript: \"superscript\",\n ins: \"ins\",\n del: \"del\",\n underline: \"underline\",\n doubleUnderline: \"doubleUnderline\",\n circle: \"circle\",\n languageEmRed: \"languageEmRed\",\n languageEmOrange: \"languageEmOrange\",\n languageEmYellow: \"languageEmYellow\",\n languageEmGreen: \"languageEmGreen\",\n languageEmBlue: \"languageEmBlue\",\n languageEmPurple: \"languageEmPurple\",\n languageEmPink: \"languageEmPink\",\n languageEmBrown: \"languageEmBrown\",\n languageEmBlack: \"languageEmBlack\",\n languageEmWhite: \"languageEmWhite\",\n languageEmGray: \"languageEmGray\",\n languageEm: \"languageEm\",\n userUnderline: \"userUnderline\",\n userDoubleUnderline: \"userDoubleUnderline\",\n userStrike: \"userStrike\",\n userCircle: \"userCircle\",\n userHighlight: \"userHighlight\",\n notranslate: \"notranslate\",\n link: \"link\",\n ref: \"ref\",\n xref: \"xref\",\n extref: \"extref\",\n footnote: \"footnote\",\n footnoteStar: \"footnote*\",\n symbol: \"symbol\",\n var: \"var\",\n code: \"code\",\n timer: \"timer\",\n duration: \"duration\",\n color: \"color\",\n colorPicker: \"colorPicker\",\n comment: \"comment\",\n} as const;\n\n/** Vendored from bpg v5.31.1 model/enum/TextNodeType.ts. */\nexport const TextNodeType = {\n text: \"text\",\n hardBreak: \"hardBreak\",\n paragraph: \"paragraph\",\n heading: \"heading\",\n section: \"section\",\n noBulletList: \"noBulletList\",\n bulletList: \"bulletList\",\n orderedList: \"orderedList\",\n orderedListRoman: \"orderedListRoman\",\n orderedListRomanLower: \"orderedListRomanLower\",\n letteredList: \"letteredList\",\n letteredListLower: \"letteredListLower\",\n taskList: \"taskList\",\n listItem: \"listItem\",\n taskItem: \"taskItem\",\n image: \"image\",\n imageInline: \"imageInline\",\n codeBlock: \"codeBlock\",\n latex: \"latex\",\n gap: \"gap\",\n select: \"select\",\n highlight: \"highlight\",\n mark: \"mark\",\n} as const;\n\n/** bpg key derivation: kebab-case bit name → camelCase enum key. */\nfunction bitNameToKey(name: string): string {\n return name.replace(/-([a-z0-9])/gu, (_, c: string) => c.toUpperCase());\n}\n\nlet bitTypeCache: Record<string, string> | undefined;\n\nfunction loadBitTypes(): Record<string, string> {\n if (!bitTypeCache) {\n const wasm = getLegacyWasm();\n // includeDeprecated: bpg's BitType enum carries the deprecated bit\n // types too (PLAN-149 hides them from listings by default).\n const all = JSON.parse(wasm.info(\"all\", \"json\", \"\", false, 2, true, false, false, \"\")) as {\n name: string;\n }[];\n const map: Record<string, string> = { _standard: \"_standard\" };\n for (const { name } of all) {\n map[bitNameToKey(name)] = name;\n }\n bitTypeCache = map;\n }\n return bitTypeCache;\n}\n\n/**\n * bpg-compatible `BitType` enum object, built lazily from the core's\n * config (`info`) rather than a hardcoded list. Keys are the camelCase of\n * the bit names, exactly as bpg derives them.\n */\nexport const BitType: Record<string, string> = new Proxy(\n {},\n {\n get: (_t, prop) => (typeof prop === \"string\" ? loadBitTypes()[prop] : undefined),\n has: (_t, prop) => typeof prop === \"string\" && prop in loadBitTypes(),\n ownKeys: () => Reflect.ownKeys(loadBitTypes()),\n getOwnPropertyDescriptor: (_t, prop) =>\n typeof prop === \"string\" && prop in loadBitTypes()\n ? { value: loadBitTypes()[prop], enumerable: true, configurable: true, writable: false }\n : undefined,\n },\n);\n\n/** Loud F-2 stand-in for enums tied to unsupported bpg internals. */\nfunction unsupportedEnum(name: string, reason: string): Record<string, string> {\n return new Proxy(\n {},\n {\n get: (_t, prop) => {\n if (prop === Symbol.toPrimitive || prop === \"toString\" || prop === Symbol.toStringTag) {\n return () => `[unsupported ${name}]`;\n }\n return unsupportedMember(name, reason);\n },\n has: () => unsupportedMember(name, reason),\n ownKeys: () => unsupportedMember(name, reason),\n },\n );\n}\n\n/** bpg `NodeType` — names bpg's internal AST nodes; the legacy AST is bit JSON. */\nexport const NodeType = unsupportedEnum(\n \"NodeType\",\n \"it names bpg's internal AST nodes; the legacy AST is bit JSON (see createAst)\",\n);\n\n/** bpg `BoundingBoxIndex` — bpg-internal utility. */\nexport const BoundingBoxIndex = unsupportedEnum(\n \"BoundingBoxIndex\",\n \"bpg-internal bounding-box utility\",\n);\n","// @zen-component: LEGACY-Facade\n// Throwing stubs for bpg exports the legacy facade deliberately does not\n// implement (PLAN-126 F-2: exist, but fail loudly and deterministically —\n// never silent no-ops). These are internals of bpg's TS implementation\n// (its AST walker, generators, parsers, writers), which have no equivalent\n// over the WASM core.\n\nimport { unsupportedMember } from \"./errors.js\";\n\nfunction stubClass(name: string, reason: string): new (...args: unknown[]) => never {\n return class {\n constructor() {\n unsupportedMember(name, reason);\n }\n } as unknown as new (...args: unknown[]) => never;\n}\n\nconst WALKER_REASON =\n \"the legacy AST is bit JSON, not bpg's internal node model; walking it with bpg NodeType names would silently misbehave\";\nconst INTERNAL_REASON = \"internal class of bpg's TS implementation\";\n\n/** bpg `Ast` walker — unsupported (PLAN-126 decision Q-7). */\nexport const Ast = stubClass(\"Ast\", WALKER_REASON);\n\nexport const BitmarkGenerator = stubClass(\"BitmarkGenerator\", INTERNAL_REASON);\nexport const BitmarkStringGenerator = stubClass(\"BitmarkStringGenerator\", INTERNAL_REASON);\nexport const BitmarkFileGenerator = stubClass(\"BitmarkFileGenerator\", INTERNAL_REASON);\nexport const JsonGenerator = stubClass(\"JsonGenerator\", INTERNAL_REASON);\nexport const JsonStringGenerator = stubClass(\"JsonStringGenerator\", INTERNAL_REASON);\nexport const JsonFileGenerator = stubClass(\"JsonFileGenerator\", INTERNAL_REASON);\nexport const HtmlTableGenerator = stubClass(\"HtmlTableGenerator\", INTERNAL_REASON);\nexport const HtmlTableParser = stubClass(\"HtmlTableParser\", INTERNAL_REASON);\nexport const BitmarkParser = stubClass(\"BitmarkParser\", INTERNAL_REASON);\nexport const JsonParser = stubClass(\"JsonParser\", INTERNAL_REASON);\nexport const StringWriter = stubClass(\"StringWriter\", INTERNAL_REASON);\nexport const FileWriter = stubClass(\"FileWriter\", INTERNAL_REASON);\nexport const StreamWriter = stubClass(\"StreamWriter\", INTERNAL_REASON);\n"],"mappings":"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","names":["wasm","wasm","out","wasm","require"]}
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../node_modules/tsup/assets/cjs_shims.js","../src/core/facade.ts","../src/core/hooked-transform.ts","../src/node/worker-entry.ts"],"names":["require","createRequire","workerData","parentPort"],"mappings":";;;;;;AAKA,IAAM,gBAAA,GAAmB,MACvB,OAAO,QAAA,KAAa,WAAA,GAChB,IAAI,GAAA,CAAI,CAAA,KAAA,EAAQ,UAAU,CAAA,CAAE,CAAA,CAAE,IAAA,GAC7B,QAAA,CAAS,aAAA,IAAiB,QAAA,CAAS,aAAA,CAAc,OAAA,CAAQ,WAAA,EAAY,KAAM,QAAA,GAC1E,QAAA,CAAS,aAAA,CAAc,GAAA,GACvB,IAAI,GAAA,CAAI,SAAA,EAAW,QAAA,CAAS,OAAO,CAAA,CAAE,IAAA;AAEtC,IAAM,gCAAgC,gBAAA,EAAiB;;;ACiBvD,IAAM,oBAAA,GAAgC,MAAA;;;ACqCtC,SAAS,WAAW,GAAA,EAAqB;AAC9C,EAAA,MAAM,CAAA,GAAI,IAAI,IAAA,EAAK;AACnB,EAAA,OAAO,CAAA,CAAE,UAAA,CAAW,GAAG,CAAA,IAAK,CAAA,CAAE,QAAA,CAAS,GAAG,CAAA,GAAI,CAAA,CAAE,KAAA,CAAM,CAAA,EAAG,EAAE,CAAA,GAAI,GAAA;AACjE;AA2JO,SAAS,SAAA,CAAU,cAAsB,YAAA,EAAuC;AACrF,EAAA,MAAM,EAAE,IAAA,EAAM,WAAA,EAAY,GAAI,IAAA,CAAK,MAAM,YAAY,CAAA;AACrD,EAAA,OAAO,EAAE,SAAS,YAAA,KAAiB,MAAA,GAAS,WAAW,IAAI,CAAA,GAAI,MAAM,WAAA,EAAY;AACnF;;;ACvNA,IAAMA,QAAAA,GAAUC,uBAAc,aAAe,CAAA;AAI7C,IAAM,YAAA,GAAwC;AAAA,EAC5C,IAAA,EAAM,yBAAA;AAAA,EACN,cAAA,EAAgB,mDAAA;AAAA,EAChB,cAAA,EAAgB;AAClB,CAAA;AAEA,IAAM,OAAA,GAAYC,2BAAkD,OAAA,IAClE,oBAAA;AACF,IAAM,IAAA,GAAOF,QAAAA,CAAQ,YAAA,CAAa,OAAO,CAAC,CAAA;AAkB1CG,yBAAA,EAAY,EAAA,CAAG,SAAA,EAAW,CAAC,GAAA,KAAoB;AAC7C,EAAA,MAAM,EAAE,EAAA,EAAI,GAAA,EAAI,GAAI,GAAA;AACpB,EAAA,IAAI;AACF,IAAA,MAAM,EAAE,OAAA,EAAS,WAAA,EAAY,GAAI,SAAA;AAAA,MAC/B,IAAA,CAAK,SAAA;AAAA,QACH,GAAA,CAAI,MAAA;AAAA,QACJ,GAAA,CAAI,WAAA;AAAA,QACJ,GAAA,CAAI,YAAA;AAAA,QACJ,GAAA,CAAI,IAAA;AAAA,QACJ,GAAA,CAAI,SAAA;AAAA,QACJ,KAAA;AAAA,QACA,CAAA;AAAA,QACA,GAAA,CAAI;AAAA,OACN;AAAA,MACA,GAAA,CAAI;AAAA,KACN;AACA,IAAAA,yBAAA,EAAY,YAAY,EAAE,EAAA,EAAI,IAAI,IAAA,EAAM,OAAA,EAAS,aAAa,CAAA;AAAA,EAChE,SAAS,CAAA,EAAG;AAGV,IAAAA,yBAAA,EAAY,WAAA,CAAY,EAAE,EAAA,EAAI,EAAA,EAAI,KAAA,EAAO,KAAA,EAAO,CAAA,YAAa,KAAA,GAAQ,CAAA,CAAE,OAAA,GAAU,MAAA,CAAO,CAAC,GAAG,CAAA;AAAA,EAC9F;AACF,CAAC,CAAA","file":"worker-entry.cjs","sourcesContent":["// Shim globals in cjs bundle\n// There's a weird bug that esbuild will always inject importMetaUrl\n// if we export it as `const importMetaUrl = ... __filename ...`\n// But using a function will not cause this issue\n\nconst getImportMetaUrl = () => \n typeof document === \"undefined\" \n ? new URL(`file:${__filename}`).href \n : (document.currentScript && document.currentScript.tagName.toUpperCase() === 'SCRIPT') \n ? document.currentScript.src \n : new URL(\"main.js\", document.baseURI).href;\n\nexport const importMetaUrl = /* @__PURE__ */ getImportMetaUrl()\n","// @zen-component: TS-VariantFacade\n//\n// Runtime variant selection (PLAN-166). The package ships one API surface\n// backed by a mutable reference to the ACTIVE wasm module; `init({ feature })`\n// selects which wasm variant backs it, and a later re-init swaps the module\n// atomically between calls (every wasm call is stateless string → string).\n// Platform entries (Node / browser) own the loading; this module owns the\n// reference, the feature vocabulary, and the error types.\n\nimport type { PatchDiagnostic } from \"../types.js\";\n\n/**\n * A deployable wasm feature set (PLAN-174).\n *\n * - `full` — everything, including the `info` META layer (tag descriptions,\n * group provenance, raw mappingKeys patterns). Native-CLI parity.\n * - `browser-full` — the same conversion capabilities as `full`, minus the\n * meta strings the browser should not pay to download.\n * - `bitmark-json` — bitmark ↔ JSON only.\n *\n * Size gating follows the DELIVERY CHANNEL, not the compilation target: a Node\n * backend loading wasm from disk has native-CLI requirements, while any entry\n * can be bundled for the browser. So every variant is buildable for both\n * targets and richness is always chosen explicitly. The per-entry defaults\n * below are conveniences; the contract is \"you get the variant you selected\".\n */\nexport type Feature = \"full\" | \"browser-full\" | \"bitmark-json\";\n\n/** Default variant for the Node entry — disk-loaded wasm, no download budget. */\nexport const NODE_DEFAULT_FEATURE: Feature = \"full\";\n\n/** Default variant for the browser entry — download latency is the budget. */\nexport const BROWSER_DEFAULT_FEATURE: Feature = \"browser-full\";\n\n/**\n * The wasm surface the shared wrappers drive. The optional members are the\n * capabilities a lean variant compiles out (calling their wrapper there\n * throws {@link UnsupportedFeatureError}).\n *\n * Every fallible member THROWS a JavaScript `Error` on failure (PLAN-192 D1);\n * its `message` is the core's error contract, `<kind> at <path>: <message>`,\n * with `<kind>` a stable kebab-case identifier. A returned string is always a\n * result — there is no in-band error prefix to test for.\n */\nexport interface WasmModule {\n convert(\n input: string,\n inputFormat: string,\n outputFormat: string,\n mode: string,\n pretty: boolean,\n indent: number,\n spacesAroundValues: number,\n includeUnknownProperties: boolean,\n mappingReport: boolean,\n /** `semantic-tokens` output only: `\"utf-16\"` | `\"utf-8\"`, `\"\"` = default (PLAN-193). */\n positionEncoding: string,\n /** `semantic-tokens` output only: `\"lsp\"` | `\"absolute\"`, `\"\"` = default. */\n tokensLayout: string,\n ): string;\n canonicalize(\n input: string,\n inputFormat: string,\n mode: string,\n pretty: boolean,\n indent: number,\n spacesAroundValues: number,\n ): string;\n transform(\n input: string,\n inputFormat: string,\n outputFormat: string,\n mode: string,\n patchJson: string,\n pretty: boolean,\n indent: number,\n spacesAroundValues: number,\n ): string;\n info(\n infoType: string,\n format: string,\n bit: string,\n pretty: boolean,\n indent: number,\n includeDeprecated: boolean,\n onlyDeprecated: boolean,\n full: boolean,\n language: string,\n ): string;\n /** Throws when the data is not valid for `dataType`. */\n register(dataType: string, data: string): void;\n count_bits(input: string): string;\n split_bits(input: string): string;\n split_json_bits(input: string): string;\n is_bitmark(input: string): boolean;\n prettify(json: string, indent: number): string;\n convert_text(input: string, direction: string, format: string, location: string): string;\n breakscape_text(input: string, format: string, location: string, subLocation: string): string;\n unbreakscape_text(input: string, format: string, location: string, subLocation: string): string;\n /**\n * Resolve a patch document against a document into ordered items\n * (PLAN-179), splitting it under `inputFormat` (`\"auto\"` | `\"bitmark\"` |\n * `\"json\"`) — the selector the caller already resolved, never a re-sniff.\n */\n resolve_patch_document(input: string, inputFormat: string, patchJson: string): string;\n /**\n * Present only where this build can render `info` as TEXT (PLAN-192 D6) —\n * the same \"presence is the capability\" signal as `diff`, so no caller\n * has to test for a variant name. Absent on `bitmark-json`, where `info`\n * serves JSON only.\n */\n info_text_supported?(): boolean;\n /** Completion at a position (PLAN-196); absent on a variant built without `editor`. */\n complete?(\n input: string,\n line: number,\n character: number,\n positionEncoding: string,\n includeDeprecated: boolean,\n triggerCharacter: string,\n ): string;\n /** One completion item with its documentation (PLAN-202); absent on a variant built without `editor`. */\n resolve?(\n input: string,\n line: number,\n character: number,\n positionEncoding: string,\n includeDeprecated: boolean,\n label: string,\n kind: number,\n ): string;\n /** Hover at a position (PLAN-196); absent on a variant built without `editor`. */\n hover?(input: string, line: number, character: number, positionEncoding: string): string;\n /** Semantic diff (PLAN-179); absent on a variant built without `diff`. */\n diff?(\n a: string,\n b: string,\n inputFormat: string,\n outputFormat: string,\n context: number,\n locate: boolean,\n similarity: number,\n bboxTolerance: number,\n spacesAroundValues: number,\n ): string;\n}\n\n/** Options accepted by `init` / `initSync` on every platform entry. */\nexport interface InitOptions {\n /** Which wasm variant to load. Default: `\"full\"`. */\n feature?: Feature;\n}\n\n/** A call arrived before any wasm module was initialised (browser only). */\nexport class NotInitializedError extends Error {\n constructor() {\n super(\"wasm not initialised: call init() (or init({ feature: … })) first\");\n this.name = \"NotInitializedError\";\n }\n}\n\n/** `register` rejected the supplied data. */\nexport class RegisterError extends Error {\n constructor(message: string) {\n super(message);\n this.name = \"RegisterError\";\n }\n}\n\n/**\n * `transform` skipped one or more patch entries (PLAN-209 T9). The document\n * was NOT returned: a silently ignored edit is worse than an error. Each\n * diagnostic names the entry's `path`, the error contract's `kind`\n * (`patch-parse-error`, `patch-index-out-of-range`, `patch-type-mismatch`)\n * and a `message`.\n */\nexport class PatchError extends Error {\n readonly diagnostics: PatchDiagnostic[];\n constructor(diagnostics: PatchDiagnostic[]) {\n const lines = diagnostics.map((d) => `${d.kind} at ${d.path}: ${d.message}`);\n super(\n `${diagnostics.length} patch ${diagnostics.length === 1 ? \"entry was\" : \"entries were\"} skipped:\\n` +\n lines.join(\"\\n\"),\n );\n this.name = \"PatchError\";\n this.diagnostics = diagnostics;\n }\n}\n\n/** A call needs a capability the ACTIVE wasm variant compiled out. */\nexport class UnsupportedFeatureError extends Error {\n constructor(what: string, active: Feature | undefined) {\n super(\n `${what} is not available in the loaded wasm module` +\n `${active ? ` (feature: \"${active}\")` : \"\"}; init({ feature: \"full\" }) to load it`,\n );\n this.name = \"UnsupportedFeatureError\";\n }\n}\n\nlet active: WasmModule | undefined;\nlet activeFeature: Feature | undefined;\nlet lazyLoader: (() => void) | undefined;\n\n// Data registered through `register`, kept so it can be REPLAYED onto each\n// newly activated module. Each variant is a separate wasm instance with its\n// own memory, so a registration made against one is invisible to the next —\n// and PLAN-166's promise is that swapping variants is invisible to the\n// caller. Keyed by type, because `register` replaces per type.\nconst registrations = new Map<string, string>();\n\n/**\n * The active wasm module. On Node the entry installs a lazy loader, so the\n * first call without an explicit `init` loads the default (`full`) variant\n * synchronously; in the browser an uninitialised call throws\n * {@link NotInitializedError} (wasm instantiation is async there).\n */\nexport function getActive(): WasmModule {\n if (!active && lazyLoader) lazyLoader();\n if (!active) throw new NotInitializedError();\n return active;\n}\n\n/** Swap the active module — the single atomic reference assignment. */\nexport function setActive(feature: Feature, module: WasmModule): void {\n // Replay first: a module that cannot take the registered data must not\n // become active half-configured. The data was accepted once already, so a\n // failure here is a bug worth surfacing rather than swallowing.\n for (const [type, data] of registrations) {\n try {\n module.register(type, data);\n } catch (e) {\n throw new RegisterError(e instanceof Error ? e.message : String(e));\n }\n }\n active = module;\n activeFeature = feature;\n}\n\n/**\n * Remember what `register` accepted, so it survives an `init` swap. Called\n * only after the ACTIVE module has accepted the same data.\n */\nexport function rememberRegistration(type: string, data: string): void {\n registrations.set(type, data);\n}\n\n/**\n * Install the Node lazy default loader (runs on the first call when no\n * explicit `init` happened; must call {@link setActive}).\n */\nexport function setLazyLoader(loader: () => void): void {\n lazyLoader = loader;\n}\n\n/** The active wasm feature, or `undefined` before the first init. */\nexport function variant(): Feature | undefined {\n return activeFeature;\n}\n","// @zen-component: TS-HookedTransform\n\nimport type { BitView, OutputFormat, PatchDiagnostic, PatchEntry, TransformOptions } from \"../types.js\";\nimport { PatchError } from \"./facade.js\";\n\n/** What the WASM `transform` export returns (PLAN-209 T9). */\nexport interface TransformEnvelope {\n data: string;\n diagnostics: PatchDiagnostic[];\n}\n\n/** One bit's rendered element plus the entries skipped on it. */\nexport interface BitOutput {\n element: string;\n diagnostics: PatchDiagnostic[];\n}\n\n/**\n * The minimal WASM surface the per-bit hook driver needs. Both the Node and\n * browser entry points satisfy this with their loaded module.\n */\nexport interface HookedWasm {\n is_bitmark(input: string): boolean;\n split_bits(input: string): string;\n split_json_bits(input: string): string;\n prettify(json: string, indent: number): string;\n resolve_patch_document(input: string, inputFormat: string, patchJson: string): string;\n /** Returns the {@link TransformEnvelope} as JSON text. */\n transform(\n input: string,\n inputFormat: string,\n outputFormat: string,\n mode: string,\n patchJson: string,\n pretty: boolean,\n indent: number,\n spacesAroundValues: number,\n ): string;\n}\n\n/** A single bit's compute job: data only, safe to ship to a worker thread. */\nexport interface BitJob {\n index: number;\n source: string;\n inputFormat: \"bitmark\" | \"json\";\n outputFormat: OutputFormat;\n mode: string;\n patchJson: string;\n spacesAroundValues: number;\n}\n\n/**\n * The result of running `preHook` over a document's bits: the compute `jobs`\n * for the bits that survived (in document order) and the matching `views`\n * (so `postHook` can be called per surviving bit), plus the document-level\n * recombination settings.\n */\nexport interface TransformPlan {\n jobs: BitJob[];\n views: BitView[];\n output: OutputFormat;\n pretty: boolean;\n indent: number;\n}\n\n/** Strip the outer `[ … ]` of a compact one-element JSON array. */\nexport function stripArray(doc: string): string {\n const t = doc.trim();\n return t.startsWith(\"[\") && t.endsWith(\"]\") ? t.slice(1, -1) : doc;\n}\n\n/**\n * The `patch` option as the JSON text the WASM resolver takes — a patch\n * document or the bare-array every-bit shorthand — or `\"\"` when absent.\n */\nfunction patchJsonOf(patch: TransformOptions[\"patch\"]): string {\n if (patch === undefined) return \"\";\n if (typeof patch === \"string\") return patch.trim();\n return JSON.stringify(patch);\n}\n\n/**\n * One slot of the resolved patch document (see `resolve_patch_document`).\n * An inserted `bit` is a JSON bit or, as a string, one bit of bitmark\n * source (PLAN-209 D15).\n */\ninterface ResolvedItem {\n source: number | null;\n bit: Record<string, unknown> | string | null;\n patch: PatchEntry[];\n}\n\nfunction buildUnits(\n wasm: HookedWasm,\n input: string,\n inputIsBitmark: boolean,\n): { view: BitView; source: string }[] {\n if (inputIsBitmark) {\n const slices = JSON.parse(wasm.split_bits(input)) as { index: number; source: string }[];\n return slices.map((s) => ({\n view: { format: \"bitmark\", index: s.index, total: slices.length, source: s.source },\n source: s.source,\n }));\n }\n const envelopes = JSON.parse(wasm.split_json_bits(input)) as {\n bit?: import(\"../generated/bit-types.js\").AnyBit;\n }[];\n return envelopes.map((env, index) => ({\n view: { format: \"json\", index, total: envelopes.length, bit: env.bit ?? {} },\n // Per-bit transform consumes a one-bit JSON document.\n source: JSON.stringify([env]),\n }));\n}\n\n/**\n * Split the document and run `preHook` (on the calling thread) for each bit,\n * producing the surviving compute jobs + their views. This is the main-thread\n * half shared by the sync and worker-pool drivers — only the resulting\n * data-only {@link BitJob}s ever cross to a worker.\n */\nexport function planTransform(\n wasm: HookedWasm,\n input: string,\n options: TransformOptions,\n): TransformPlan {\n const mode = options.mode ?? \"optimized\";\n const output: OutputFormat = options.outputFormat ?? \"json\";\n const spacesAroundValues = options.spacesAroundValues ?? 1;\n const indent = options.indent ?? 2;\n const pretty = options.pretty ?? false;\n\n const sel = options.inputFormat ?? \"auto\";\n const inputIsBitmark = sel === \"bitmark\" || (sel !== \"json\" && wasm.is_bitmark(input));\n const inputFormat = inputIsBitmark ? \"bitmark\" : \"json\";\n\n // The engine decides which output formats are per-bit (the whole-document\n // `lex` / `semantic-tokens` / `diagnostics` are not, and it refuses them\n // before any hook runs). Ask it the same way, once, with an empty document:\n // a document that splits into no bits would otherwise never carry that\n // refusal, and the hooked path would answer `\"\"` where the hookless one\n // throws (PLAN-192 D1 parity).\n wasm.transform(\"\", \"bitmark\", output, mode, \"\", false, indent, spacesAroundValues);\n\n const units = buildUnits(wasm, input, inputIsBitmark);\n const total = units.length;\n\n // Hooks see the ORIGINAL bits, in order, before the patch document\n // reshapes anything (same as the Rust pipeline's Phase A).\n const hooked: ({ patches: PatchEntry[]; outputFormat: OutputFormat } | null)[] = [];\n for (let index = 0; index < total; index++) {\n const { view } = units[index];\n view.index = index;\n view.total = total;\n const result = options.preHook ? options.preHook(view) || {} : {};\n hooked.push(result.drop ? null : { patches: result.patches ?? [], outputFormat: result.outputFormat ?? output });\n }\n\n // The patch document (or the every-bit shorthand) is resolved by the one\n // Rust implementation into the ordered output slots; without a patch the\n // slots are simply the original bits. The resolver splits under the SAME\n // input format resolved above — an explicit selection is never re-sniffed.\n const patchJson = patchJsonOf(options.patch);\n let resolved: ResolvedItem[];\n if (patchJson === \"\") {\n resolved = units.map((_, index) => ({ source: index, bit: null, patch: [] }));\n } else {\n resolved = JSON.parse(\n wasm.resolve_patch_document(input, inputFormat, patchJson),\n ) as ResolvedItem[];\n }\n\n const jobs: BitJob[] = [];\n const views: BitView[] = [];\n for (const item of resolved) {\n if (item.source !== null) {\n const hook = hooked[item.source];\n if (!hook) continue; // dropped by the pre-hook\n jobs.push({\n index: item.source,\n source: units[item.source].source,\n inputFormat,\n outputFormat: hook.outputFormat,\n mode,\n // The document's patches first, the hook's after (the hook contract).\n patchJson: JSON.stringify([...item.patch, ...hook.patches]),\n spacesAroundValues,\n });\n views.push(units[item.source].view);\n } else if (typeof item.bit === \"string\") {\n // An inserted bitmark bit (PLAN-209 D15), seen by `postHook` only.\n const index = jobs.length;\n jobs.push({\n index,\n source: item.bit,\n inputFormat: \"bitmark\",\n outputFormat: output,\n mode,\n patchJson: JSON.stringify(item.patch),\n spacesAroundValues,\n });\n views.push({ format: \"bitmark\", index, total, source: item.bit });\n } else {\n // An inserted bit: a one-bit JSON document, seen by `postHook` only.\n const bit = (item.bit ?? {}) as import(\"../generated/bit-types.js\").AnyBit;\n const index = jobs.length;\n jobs.push({\n index,\n source: JSON.stringify([{ bit }]),\n inputFormat: \"json\",\n outputFormat: output,\n mode,\n patchJson: JSON.stringify(item.patch),\n spacesAroundValues,\n });\n views.push({ format: \"json\", index, total, bit });\n }\n }\n return { jobs, views, output, pretty, indent };\n}\n\n/**\n * Read the WASM `transform` envelope for one bit: the element (compact JSON\n * stripped of its one-element array) and the entries skipped on it.\n */\nexport function bitOutput(envelopeJson: string, outputFormat: OutputFormat): BitOutput {\n const { data, diagnostics } = JSON.parse(envelopeJson) as TransformEnvelope;\n return { element: outputFormat === \"json\" ? stripArray(data) : data, diagnostics };\n}\n\n/**\n * Compute one bit's rendered element synchronously via WASM. The per-bit\n * element is always compact JSON (the document is prettified once on\n * recombination). Throws on failure; skipped entries come back as\n * diagnostics for the driver to raise.\n */\nexport function computeBit(wasm: HookedWasm, job: BitJob): BitOutput {\n return bitOutput(\n wasm.transform(\n job.source,\n job.inputFormat,\n job.outputFormat,\n job.mode,\n job.patchJson,\n false,\n 2,\n job.spacesAroundValues,\n ),\n job.outputFormat,\n );\n}\n\n/** Recombine per-bit elements into the final document, in document order. */\nexport function recombine(\n wasm: HookedWasm,\n elements: string[],\n output: OutputFormat,\n pretty: boolean,\n indent: number,\n): string {\n // Only JSON wraps as an array; every other per-bit output (bitmark, plain\n // text, a mapping such as html) is text and joins with newlines — the same\n // rule as the Rust pipeline's recombine.\n if (output !== \"json\") return elements.join(\"\\n\");\n const arr = `[${elements.join(\",\")}]`;\n return pretty ? wasm.prettify(arr, indent) : arr;\n}\n\n/**\n * Per-bit transform driver (synchronous, in-process): split the document, run\n * `preHook` for each bit on the calling thread, apply the static patch + any\n * hook patches, re-emit the bit, run `postHook`, then recombine in document\n * order.\n *\n * Hooks run synchronously on the calling thread; only data crosses into WASM.\n * Used when a `preHook`/`postHook` is supplied; the hookless path stays a\n * single `wasm.transform` call. Throws on failure (PLAN-192 D1), and a\n * `PatchError` when any entry was skipped (PLAN-209 T9).\n */\nexport function runHookedTransform(\n wasm: HookedWasm,\n input: string,\n options: TransformOptions,\n): string {\n const plan: TransformPlan = planTransform(wasm, input, options);\n\n const rendered: string[] = [];\n const skipped: PatchDiagnostic[] = [];\n for (let i = 0; i < plan.jobs.length; i++) {\n const { element, diagnostics } = computeBit(wasm, plan.jobs[i]);\n skipped.push(...diagnostics);\n options.postHook?.(plan.views[i], element);\n rendered.push(element);\n }\n // A skipped entry is never silent (PLAN-209 T9).\n if (skipped.length > 0) throw new PatchError(skipped);\n return recombine(wasm, rendered, plan.output, plan.pretty, plan.indent);\n}\n","// @zen-component: TS-WorkerEntry\n//\n// Node worker_threads entry for the parallel transform pool. Each worker loads\n// its own WASM instance — the VARIANT the spawning pool passes via workerData\n// (PLAN-166) — and computes one bit at a time from a data-only job. Hooks (JS\n// closures) never reach here — they run on the main thread.\n\nimport { createRequire } from \"node:module\";\nimport { parentPort, workerData } from \"node:worker_threads\";\nimport { type BitJob, bitOutput } from \"../core/hooked-transform.js\";\nimport { NODE_DEFAULT_FEATURE, type Feature } from \"../core/facade.js\";\n\nconst require = createRequire(import.meta.url);\n\n// Bundled to dist/worker-entry.cjs; the wasm glue dirs sit at the package\n// root. Mirrors the entry's variant map (facade.ts).\nconst VARIANT_GLUE: Record<Feature, string> = {\n full: \"../wasm/bitmark_wasm.js\",\n \"browser-full\": \"../wasm-browser-full/bitmark_browser_full_wasm.js\",\n \"bitmark-json\": \"../wasm-bitmark-json/bitmark_json_wasm.js\",\n};\n\nconst feature = ((workerData as { feature?: Feature } | undefined)?.feature ??\n NODE_DEFAULT_FEATURE) as Feature;\nconst wasm = require(VARIANT_GLUE[feature]) as {\n transform(\n input: string,\n inputFormat: string,\n outputFormat: string,\n mode: string,\n patchJson: string,\n pretty: boolean,\n indent: number,\n spacesAroundValues: number,\n ): string;\n};\n\ninterface JobMessage {\n id: number;\n job: BitJob;\n}\n\nparentPort?.on(\"message\", (msg: JobMessage) => {\n const { id, job } = msg;\n try {\n const { element, diagnostics } = bitOutput(\n wasm.transform(\n job.source,\n job.inputFormat,\n job.outputFormat,\n job.mode,\n job.patchJson,\n false,\n 2,\n job.spacesAroundValues,\n ),\n job.outputFormat,\n );\n parentPort?.postMessage({ id, ok: true, element, diagnostics });\n } catch (e) {\n // The wasm export throws on failure (PLAN-192 D1); the pool turns this\n // message back into a rejected promise on the main thread.\n parentPort?.postMessage({ id, ok: false, error: e instanceof Error ? e.message : String(e) });\n }\n});\n"]}
1
+ {"version":3,"sources":["../../../node_modules/tsup/assets/cjs_shims.js","../src/core/facade.ts","../src/core/hooked-transform.ts","../src/node/worker-entry.ts"],"names":["require","createRequire","workerData","parentPort"],"mappings":";;;;;;AAKA,IAAM,gBAAA,GAAmB,MACvB,OAAO,QAAA,KAAa,WAAA,GAChB,IAAI,GAAA,CAAI,CAAA,KAAA,EAAQ,UAAU,CAAA,CAAE,CAAA,CAAE,IAAA,GAC7B,QAAA,CAAS,aAAA,IAAiB,QAAA,CAAS,aAAA,CAAc,OAAA,CAAQ,WAAA,EAAY,KAAM,QAAA,GAC1E,QAAA,CAAS,aAAA,CAAc,GAAA,GACvB,IAAI,GAAA,CAAI,SAAA,EAAW,QAAA,CAAS,OAAO,CAAA,CAAE,IAAA;AAEtC,IAAM,gCAAgC,gBAAA,EAAiB;;;ACiBvD,IAAM,oBAAA,GAAgC,MAAA;;;ACqCtC,SAAS,WAAW,GAAA,EAAqB;AAC9C,EAAA,MAAM,CAAA,GAAI,IAAI,IAAA,EAAK;AACnB,EAAA,OAAO,CAAA,CAAE,UAAA,CAAW,GAAG,CAAA,IAAK,CAAA,CAAE,QAAA,CAAS,GAAG,CAAA,GAAI,CAAA,CAAE,KAAA,CAAM,CAAA,EAAG,EAAE,CAAA,GAAI,GAAA;AACjE;AA4JO,SAAS,SAAA,CAAU,cAAsB,YAAA,EAAuC;AACrF,EAAA,MAAM,EAAE,IAAA,EAAM,WAAA,EAAY,GAAI,IAAA,CAAK,MAAM,YAAY,CAAA;AACrD,EAAA,OAAO,EAAE,SAAS,YAAA,KAAiB,MAAA,GAAS,WAAW,IAAI,CAAA,GAAI,MAAM,WAAA,EAAY;AACnF;;;ACxNA,IAAMA,QAAAA,GAAUC,uBAAc,aAAe,CAAA;AAI7C,IAAM,YAAA,GAAwC;AAAA,EAC5C,IAAA,EAAM,yBAAA;AAAA,EACN,cAAA,EAAgB,mDAAA;AAAA,EAChB,cAAA,EAAgB;AAClB,CAAA;AAEA,IAAM,OAAA,GAAYC,2BAAkD,OAAA,IAClE,oBAAA;AACF,IAAM,IAAA,GAAOF,QAAAA,CAAQ,YAAA,CAAa,OAAO,CAAC,CAAA;AAkB1CG,yBAAA,EAAY,EAAA,CAAG,SAAA,EAAW,CAAC,GAAA,KAAoB;AAC7C,EAAA,MAAM,EAAE,EAAA,EAAI,GAAA,EAAI,GAAI,GAAA;AACpB,EAAA,IAAI;AACF,IAAA,MAAM,EAAE,OAAA,EAAS,WAAA,EAAY,GAAI,SAAA;AAAA,MAC/B,IAAA,CAAK,SAAA;AAAA,QACH,GAAA,CAAI,MAAA;AAAA,QACJ,GAAA,CAAI,WAAA;AAAA,QACJ,GAAA,CAAI,YAAA;AAAA,QACJ,GAAA,CAAI,IAAA;AAAA,QACJ,GAAA,CAAI,SAAA;AAAA,QACJ,KAAA;AAAA,QACA,CAAA;AAAA,QACA,GAAA,CAAI;AAAA,OACN;AAAA,MACA,GAAA,CAAI;AAAA,KACN;AACA,IAAAA,yBAAA,EAAY,YAAY,EAAE,EAAA,EAAI,IAAI,IAAA,EAAM,OAAA,EAAS,aAAa,CAAA;AAAA,EAChE,SAAS,CAAA,EAAG;AAGV,IAAAA,yBAAA,EAAY,WAAA,CAAY,EAAE,EAAA,EAAI,EAAA,EAAI,KAAA,EAAO,KAAA,EAAO,CAAA,YAAa,KAAA,GAAQ,CAAA,CAAE,OAAA,GAAU,MAAA,CAAO,CAAC,GAAG,CAAA;AAAA,EAC9F;AACF,CAAC,CAAA","file":"worker-entry.cjs","sourcesContent":["// Shim globals in cjs bundle\n// There's a weird bug that esbuild will always inject importMetaUrl\n// if we export it as `const importMetaUrl = ... __filename ...`\n// But using a function will not cause this issue\n\nconst getImportMetaUrl = () => \n typeof document === \"undefined\" \n ? new URL(`file:${__filename}`).href \n : (document.currentScript && document.currentScript.tagName.toUpperCase() === 'SCRIPT') \n ? document.currentScript.src \n : new URL(\"main.js\", document.baseURI).href;\n\nexport const importMetaUrl = /* @__PURE__ */ getImportMetaUrl()\n","// @zen-component: TS-VariantFacade\n//\n// Runtime variant selection (PLAN-166). The package ships one API surface\n// backed by a mutable reference to the ACTIVE wasm module; `init({ feature })`\n// selects which wasm variant backs it, and a later re-init swaps the module\n// atomically between calls (every wasm call is stateless string → string).\n// Platform entries (Node / browser) own the loading; this module owns the\n// reference, the feature vocabulary, and the error types.\n\nimport type { PatchDiagnostic } from \"../types.js\";\n\n/**\n * A deployable wasm feature set (PLAN-174).\n *\n * - `full` — everything, including the `info` META layer (tag descriptions,\n * group provenance, raw mappingKeys patterns). Native-CLI parity.\n * - `browser-full` — the same conversion capabilities as `full`, minus the\n * meta strings the browser should not pay to download.\n * - `bitmark-json` — bitmark ↔ JSON only.\n *\n * Size gating follows the DELIVERY CHANNEL, not the compilation target: a Node\n * backend loading wasm from disk has native-CLI requirements, while any entry\n * can be bundled for the browser. So every variant is buildable for both\n * targets and richness is always chosen explicitly. The per-entry defaults\n * below are conveniences; the contract is \"you get the variant you selected\".\n */\nexport type Feature = \"full\" | \"browser-full\" | \"bitmark-json\";\n\n/** Default variant for the Node entry — disk-loaded wasm, no download budget. */\nexport const NODE_DEFAULT_FEATURE: Feature = \"full\";\n\n/** Default variant for the browser entry — download latency is the budget. */\nexport const BROWSER_DEFAULT_FEATURE: Feature = \"browser-full\";\n\n/**\n * The wasm surface the shared wrappers drive. The optional members are the\n * capabilities a lean variant compiles out (calling their wrapper there\n * throws {@link UnsupportedFeatureError}).\n *\n * Every fallible member THROWS a JavaScript `Error` on failure (PLAN-192 D1);\n * its `message` is the core's error contract, `<kind> at <path>: <message>`,\n * with `<kind>` a stable kebab-case identifier. A returned string is always a\n * result — there is no in-band error prefix to test for.\n */\nexport interface WasmModule {\n convert(\n input: string,\n inputFormat: string,\n outputFormat: string,\n mode: string,\n pretty: boolean,\n indent: number,\n spacesAroundValues: number,\n includeUnknownProperties: boolean,\n mappingReport: boolean,\n /** `semantic-tokens` / `diagnostics` output and the bit spans: `\"utf-16\"` | `\"utf-8\"`, `\"\"` = default (PLAN-193, PLAN-221). */\n positionEncoding: string,\n /** `semantic-tokens` output only: `\"lsp\"` | `\"absolute\"`, `\"\"` = default. */\n tokensLayout: string,\n ): string;\n /**\n * `convert`'s arguments, then one flag per extra (PLAN-221 D1a). Returns a\n * {@link WasmConvertDetails} living in wasm memory: the caller must\n * `free()` it.\n */\n convert_with_details(\n input: string,\n inputFormat: string,\n outputFormat: string,\n mode: string,\n pretty: boolean,\n indent: number,\n spacesAroundValues: number,\n includeUnknownProperties: boolean,\n mappingReport: boolean,\n positionEncoding: string,\n tokensLayout: string,\n bitSpans: boolean,\n ): WasmConvertDetails;\n canonicalize(\n input: string,\n inputFormat: string,\n mode: string,\n pretty: boolean,\n indent: number,\n spacesAroundValues: number,\n ): string;\n transform(\n input: string,\n inputFormat: string,\n outputFormat: string,\n mode: string,\n patchJson: string,\n pretty: boolean,\n indent: number,\n spacesAroundValues: number,\n ): string;\n info(\n infoType: string,\n format: string,\n bit: string,\n pretty: boolean,\n indent: number,\n includeDeprecated: boolean,\n onlyDeprecated: boolean,\n full: boolean,\n language: string,\n ): string;\n /** Throws when the data is not valid for `dataType`. */\n register(dataType: string, data: string): void;\n count_bits(input: string): string;\n /** `positionEncoding`: `\"utf-16\"` | `\"utf-8\"`, `\"\"` = default (PLAN-221 D3). */\n split_bits(input: string, positionEncoding: string): string;\n split_json_bits(input: string): string;\n is_bitmark(input: string): boolean;\n prettify(json: string, indent: number): string;\n convert_text(input: string, direction: string, format: string, location: string): string;\n breakscape_text(input: string, format: string, location: string, subLocation: string): string;\n unbreakscape_text(input: string, format: string, location: string, subLocation: string): string;\n /**\n * Resolve a patch document against a document into ordered items\n * (PLAN-179), splitting it under `inputFormat` (`\"auto\"` | `\"bitmark\"` |\n * `\"json\"`) — the selector the caller already resolved, never a re-sniff.\n */\n resolve_patch_document(input: string, inputFormat: string, patchJson: string): string;\n /**\n * Present only where this build can render `info` as TEXT (PLAN-192 D6) —\n * the same \"presence is the capability\" signal as `diff`, so no caller\n * has to test for a variant name. Absent on `bitmark-json`, where `info`\n * serves JSON only.\n */\n info_text_supported?(): boolean;\n /** Completion at a position (PLAN-196); absent on a variant built without `editor`. */\n complete?(\n input: string,\n line: number,\n character: number,\n positionEncoding: string,\n includeDeprecated: boolean,\n triggerCharacter: string,\n ): string;\n /** One completion item with its documentation (PLAN-202); absent on a variant built without `editor`. */\n resolve?(\n input: string,\n line: number,\n character: number,\n positionEncoding: string,\n includeDeprecated: boolean,\n label: string,\n kind: number,\n ): string;\n /** Hover at a position (PLAN-196); absent on a variant built without `editor`. */\n hover?(input: string, line: number, character: number, positionEncoding: string): string;\n /** Semantic diff (PLAN-179); absent on a variant built without `diff`. */\n diff?(\n a: string,\n b: string,\n inputFormat: string,\n outputFormat: string,\n context: number,\n locate: boolean,\n similarity: number,\n bboxTolerance: number,\n spacesAroundValues: number,\n ): string;\n}\n\n/**\n * The result object of `convert_with_details` (PLAN-221 F7): the output and\n * each extra asked for, without a JSON round trip. One accessor per extra.\n */\nexport interface WasmConvertDetails {\n /** The output, moved out of wasm memory: a second call returns `\"\"`. */\n take_data(): string;\n /** Flat `[index, start, end, …]`; `undefined` when not asked for. */\n bit_spans(): Uint32Array | undefined;\n /** The spans' encoding; `undefined` when not asked for. */\n bit_spans_encoding(): string | undefined;\n free(): void;\n}\n\n/** Options accepted by `init` / `initSync` on every platform entry. */\nexport interface InitOptions {\n /** Which wasm variant to load. Default: `\"full\"`. */\n feature?: Feature;\n}\n\n/** A call arrived before any wasm module was initialised (browser only). */\nexport class NotInitializedError extends Error {\n constructor() {\n super(\"wasm not initialised: call init() (or init({ feature: … })) first\");\n this.name = \"NotInitializedError\";\n }\n}\n\n/** `register` rejected the supplied data. */\nexport class RegisterError extends Error {\n constructor(message: string) {\n super(message);\n this.name = \"RegisterError\";\n }\n}\n\n/**\n * `transform` skipped one or more patch entries (PLAN-209 T9). The document\n * was NOT returned: a silently ignored edit is worse than an error. Each\n * diagnostic names the entry's `path`, the error contract's `kind`\n * (`patch-parse-error`, `patch-index-out-of-range`, `patch-type-mismatch`)\n * and a `message`.\n */\nexport class PatchError extends Error {\n readonly diagnostics: PatchDiagnostic[];\n constructor(diagnostics: PatchDiagnostic[]) {\n const lines = diagnostics.map((d) => `${d.kind} at ${d.path}: ${d.message}`);\n super(\n `${diagnostics.length} patch ${diagnostics.length === 1 ? \"entry was\" : \"entries were\"} skipped:\\n` +\n lines.join(\"\\n\"),\n );\n this.name = \"PatchError\";\n this.diagnostics = diagnostics;\n }\n}\n\n/** A call needs a capability the ACTIVE wasm variant compiled out. */\nexport class UnsupportedFeatureError extends Error {\n constructor(what: string, active: Feature | undefined) {\n super(\n `${what} is not available in the loaded wasm module` +\n `${active ? ` (feature: \"${active}\")` : \"\"}; init({ feature: \"full\" }) to load it`,\n );\n this.name = \"UnsupportedFeatureError\";\n }\n}\n\nlet active: WasmModule | undefined;\nlet activeFeature: Feature | undefined;\nlet lazyLoader: (() => void) | undefined;\n\n// Data registered through `register`, kept so it can be REPLAYED onto each\n// newly activated module. Each variant is a separate wasm instance with its\n// own memory, so a registration made against one is invisible to the next —\n// and PLAN-166's promise is that swapping variants is invisible to the\n// caller. Keyed by type, because `register` replaces per type.\nconst registrations = new Map<string, string>();\n\n/**\n * The active wasm module. On Node the entry installs a lazy loader, so the\n * first call without an explicit `init` loads the default (`full`) variant\n * synchronously; in the browser an uninitialised call throws\n * {@link NotInitializedError} (wasm instantiation is async there).\n */\nexport function getActive(): WasmModule {\n if (!active && lazyLoader) lazyLoader();\n if (!active) throw new NotInitializedError();\n return active;\n}\n\n/** Swap the active module — the single atomic reference assignment. */\nexport function setActive(feature: Feature, module: WasmModule): void {\n // Replay first: a module that cannot take the registered data must not\n // become active half-configured. The data was accepted once already, so a\n // failure here is a bug worth surfacing rather than swallowing.\n for (const [type, data] of registrations) {\n try {\n module.register(type, data);\n } catch (e) {\n throw new RegisterError(e instanceof Error ? e.message : String(e));\n }\n }\n active = module;\n activeFeature = feature;\n}\n\n/**\n * Remember what `register` accepted, so it survives an `init` swap. Called\n * only after the ACTIVE module has accepted the same data.\n */\nexport function rememberRegistration(type: string, data: string): void {\n registrations.set(type, data);\n}\n\n/**\n * Install the Node lazy default loader (runs on the first call when no\n * explicit `init` happened; must call {@link setActive}).\n */\nexport function setLazyLoader(loader: () => void): void {\n lazyLoader = loader;\n}\n\n/** The active wasm feature, or `undefined` before the first init. */\nexport function variant(): Feature | undefined {\n return activeFeature;\n}\n","// @zen-component: TS-HookedTransform\n\nimport type { BitView, OutputFormat, PatchDiagnostic, PatchEntry, TransformOptions } from \"../types.js\";\nimport { PatchError } from \"./facade.js\";\n\n/** What the WASM `transform` export returns (PLAN-209 T9). */\nexport interface TransformEnvelope {\n data: string;\n diagnostics: PatchDiagnostic[];\n}\n\n/** One bit's rendered element plus the entries skipped on it. */\nexport interface BitOutput {\n element: string;\n diagnostics: PatchDiagnostic[];\n}\n\n/**\n * The minimal WASM surface the per-bit hook driver needs. Both the Node and\n * browser entry points satisfy this with their loaded module.\n */\nexport interface HookedWasm {\n is_bitmark(input: string): boolean;\n split_bits(input: string, positionEncoding: string): string;\n split_json_bits(input: string): string;\n prettify(json: string, indent: number): string;\n resolve_patch_document(input: string, inputFormat: string, patchJson: string): string;\n /** Returns the {@link TransformEnvelope} as JSON text. */\n transform(\n input: string,\n inputFormat: string,\n outputFormat: string,\n mode: string,\n patchJson: string,\n pretty: boolean,\n indent: number,\n spacesAroundValues: number,\n ): string;\n}\n\n/** A single bit's compute job: data only, safe to ship to a worker thread. */\nexport interface BitJob {\n index: number;\n source: string;\n inputFormat: \"bitmark\" | \"json\";\n outputFormat: OutputFormat;\n mode: string;\n patchJson: string;\n spacesAroundValues: number;\n}\n\n/**\n * The result of running `preHook` over a document's bits: the compute `jobs`\n * for the bits that survived (in document order) and the matching `views`\n * (so `postHook` can be called per surviving bit), plus the document-level\n * recombination settings.\n */\nexport interface TransformPlan {\n jobs: BitJob[];\n views: BitView[];\n output: OutputFormat;\n pretty: boolean;\n indent: number;\n}\n\n/** Strip the outer `[ … ]` of a compact one-element JSON array. */\nexport function stripArray(doc: string): string {\n const t = doc.trim();\n return t.startsWith(\"[\") && t.endsWith(\"]\") ? t.slice(1, -1) : doc;\n}\n\n/**\n * The `patch` option as the JSON text the WASM resolver takes — a patch\n * document or the bare-array every-bit shorthand — or `\"\"` when absent.\n */\nfunction patchJsonOf(patch: TransformOptions[\"patch\"]): string {\n if (patch === undefined) return \"\";\n if (typeof patch === \"string\") return patch.trim();\n return JSON.stringify(patch);\n}\n\n/**\n * One slot of the resolved patch document (see `resolve_patch_document`).\n * An inserted `bit` is a JSON bit or, as a string, one bit of bitmark\n * source (PLAN-209 D15).\n */\ninterface ResolvedItem {\n source: number | null;\n bit: Record<string, unknown> | string | null;\n patch: PatchEntry[];\n}\n\nfunction buildUnits(\n wasm: HookedWasm,\n input: string,\n inputIsBitmark: boolean,\n): { view: BitView; source: string }[] {\n if (inputIsBitmark) {\n // Only `index` / `source` are read: `\"utf-8\"` skips encoding the offsets.\n const slices = JSON.parse(wasm.split_bits(input, \"utf-8\")) as { index: number; source: string }[];\n return slices.map((s) => ({\n view: { format: \"bitmark\", index: s.index, total: slices.length, source: s.source },\n source: s.source,\n }));\n }\n const envelopes = JSON.parse(wasm.split_json_bits(input)) as {\n bit?: import(\"../generated/bit-types.js\").AnyBit;\n }[];\n return envelopes.map((env, index) => ({\n view: { format: \"json\", index, total: envelopes.length, bit: env.bit ?? {} },\n // Per-bit transform consumes a one-bit JSON document.\n source: JSON.stringify([env]),\n }));\n}\n\n/**\n * Split the document and run `preHook` (on the calling thread) for each bit,\n * producing the surviving compute jobs + their views. This is the main-thread\n * half shared by the sync and worker-pool drivers — only the resulting\n * data-only {@link BitJob}s ever cross to a worker.\n */\nexport function planTransform(\n wasm: HookedWasm,\n input: string,\n options: TransformOptions,\n): TransformPlan {\n const mode = options.mode ?? \"optimized\";\n const output: OutputFormat = options.outputFormat ?? \"json\";\n const spacesAroundValues = options.spacesAroundValues ?? 1;\n const indent = options.indent ?? 2;\n const pretty = options.pretty ?? false;\n\n const sel = options.inputFormat ?? \"auto\";\n const inputIsBitmark = sel === \"bitmark\" || (sel !== \"json\" && wasm.is_bitmark(input));\n const inputFormat = inputIsBitmark ? \"bitmark\" : \"json\";\n\n // The engine decides which output formats are per-bit (the whole-document\n // `lex` / `semantic-tokens` / `diagnostics` are not, and it refuses them\n // before any hook runs). Ask it the same way, once, with an empty document:\n // a document that splits into no bits would otherwise never carry that\n // refusal, and the hooked path would answer `\"\"` where the hookless one\n // throws (PLAN-192 D1 parity).\n wasm.transform(\"\", \"bitmark\", output, mode, \"\", false, indent, spacesAroundValues);\n\n const units = buildUnits(wasm, input, inputIsBitmark);\n const total = units.length;\n\n // Hooks see the ORIGINAL bits, in order, before the patch document\n // reshapes anything (same as the Rust pipeline's Phase A).\n const hooked: ({ patches: PatchEntry[]; outputFormat: OutputFormat } | null)[] = [];\n for (let index = 0; index < total; index++) {\n const { view } = units[index];\n view.index = index;\n view.total = total;\n const result = options.preHook ? options.preHook(view) || {} : {};\n hooked.push(result.drop ? null : { patches: result.patches ?? [], outputFormat: result.outputFormat ?? output });\n }\n\n // The patch document (or the every-bit shorthand) is resolved by the one\n // Rust implementation into the ordered output slots; without a patch the\n // slots are simply the original bits. The resolver splits under the SAME\n // input format resolved above — an explicit selection is never re-sniffed.\n const patchJson = patchJsonOf(options.patch);\n let resolved: ResolvedItem[];\n if (patchJson === \"\") {\n resolved = units.map((_, index) => ({ source: index, bit: null, patch: [] }));\n } else {\n resolved = JSON.parse(\n wasm.resolve_patch_document(input, inputFormat, patchJson),\n ) as ResolvedItem[];\n }\n\n const jobs: BitJob[] = [];\n const views: BitView[] = [];\n for (const item of resolved) {\n if (item.source !== null) {\n const hook = hooked[item.source];\n if (!hook) continue; // dropped by the pre-hook\n jobs.push({\n index: item.source,\n source: units[item.source].source,\n inputFormat,\n outputFormat: hook.outputFormat,\n mode,\n // The document's patches first, the hook's after (the hook contract).\n patchJson: JSON.stringify([...item.patch, ...hook.patches]),\n spacesAroundValues,\n });\n views.push(units[item.source].view);\n } else if (typeof item.bit === \"string\") {\n // An inserted bitmark bit (PLAN-209 D15), seen by `postHook` only.\n const index = jobs.length;\n jobs.push({\n index,\n source: item.bit,\n inputFormat: \"bitmark\",\n outputFormat: output,\n mode,\n patchJson: JSON.stringify(item.patch),\n spacesAroundValues,\n });\n views.push({ format: \"bitmark\", index, total, source: item.bit });\n } else {\n // An inserted bit: a one-bit JSON document, seen by `postHook` only.\n const bit = (item.bit ?? {}) as import(\"../generated/bit-types.js\").AnyBit;\n const index = jobs.length;\n jobs.push({\n index,\n source: JSON.stringify([{ bit }]),\n inputFormat: \"json\",\n outputFormat: output,\n mode,\n patchJson: JSON.stringify(item.patch),\n spacesAroundValues,\n });\n views.push({ format: \"json\", index, total, bit });\n }\n }\n return { jobs, views, output, pretty, indent };\n}\n\n/**\n * Read the WASM `transform` envelope for one bit: the element (compact JSON\n * stripped of its one-element array) and the entries skipped on it.\n */\nexport function bitOutput(envelopeJson: string, outputFormat: OutputFormat): BitOutput {\n const { data, diagnostics } = JSON.parse(envelopeJson) as TransformEnvelope;\n return { element: outputFormat === \"json\" ? stripArray(data) : data, diagnostics };\n}\n\n/**\n * Compute one bit's rendered element synchronously via WASM. The per-bit\n * element is always compact JSON (the document is prettified once on\n * recombination). Throws on failure; skipped entries come back as\n * diagnostics for the driver to raise.\n */\nexport function computeBit(wasm: HookedWasm, job: BitJob): BitOutput {\n return bitOutput(\n wasm.transform(\n job.source,\n job.inputFormat,\n job.outputFormat,\n job.mode,\n job.patchJson,\n false,\n 2,\n job.spacesAroundValues,\n ),\n job.outputFormat,\n );\n}\n\n/** Recombine per-bit elements into the final document, in document order. */\nexport function recombine(\n wasm: HookedWasm,\n elements: string[],\n output: OutputFormat,\n pretty: boolean,\n indent: number,\n): string {\n // Only JSON wraps as an array; every other per-bit output (bitmark, plain\n // text, a mapping such as html) is text and joins with newlines — the same\n // rule as the Rust pipeline's recombine.\n if (output !== \"json\") return elements.join(\"\\n\");\n const arr = `[${elements.join(\",\")}]`;\n return pretty ? wasm.prettify(arr, indent) : arr;\n}\n\n/**\n * Per-bit transform driver (synchronous, in-process): split the document, run\n * `preHook` for each bit on the calling thread, apply the static patch + any\n * hook patches, re-emit the bit, run `postHook`, then recombine in document\n * order.\n *\n * Hooks run synchronously on the calling thread; only data crosses into WASM.\n * Used when a `preHook`/`postHook` is supplied; the hookless path stays a\n * single `wasm.transform` call. Throws on failure (PLAN-192 D1), and a\n * `PatchError` when any entry was skipped (PLAN-209 T9).\n */\nexport function runHookedTransform(\n wasm: HookedWasm,\n input: string,\n options: TransformOptions,\n): string {\n const plan: TransformPlan = planTransform(wasm, input, options);\n\n const rendered: string[] = [];\n const skipped: PatchDiagnostic[] = [];\n for (let i = 0; i < plan.jobs.length; i++) {\n const { element, diagnostics } = computeBit(wasm, plan.jobs[i]);\n skipped.push(...diagnostics);\n options.postHook?.(plan.views[i], element);\n rendered.push(element);\n }\n // A skipped entry is never silent (PLAN-209 T9).\n if (skipped.length > 0) throw new PatchError(skipped);\n return recombine(wasm, rendered, plan.output, plan.pretty, plan.indent);\n}\n","// @zen-component: TS-WorkerEntry\n//\n// Node worker_threads entry for the parallel transform pool. Each worker loads\n// its own WASM instance — the VARIANT the spawning pool passes via workerData\n// (PLAN-166) — and computes one bit at a time from a data-only job. Hooks (JS\n// closures) never reach here — they run on the main thread.\n\nimport { createRequire } from \"node:module\";\nimport { parentPort, workerData } from \"node:worker_threads\";\nimport { type BitJob, bitOutput } from \"../core/hooked-transform.js\";\nimport { NODE_DEFAULT_FEATURE, type Feature } from \"../core/facade.js\";\n\nconst require = createRequire(import.meta.url);\n\n// Bundled to dist/worker-entry.cjs; the wasm glue dirs sit at the package\n// root. Mirrors the entry's variant map (facade.ts).\nconst VARIANT_GLUE: Record<Feature, string> = {\n full: \"../wasm/bitmark_wasm.js\",\n \"browser-full\": \"../wasm-browser-full/bitmark_browser_full_wasm.js\",\n \"bitmark-json\": \"../wasm-bitmark-json/bitmark_json_wasm.js\",\n};\n\nconst feature = ((workerData as { feature?: Feature } | undefined)?.feature ??\n NODE_DEFAULT_FEATURE) as Feature;\nconst wasm = require(VARIANT_GLUE[feature]) as {\n transform(\n input: string,\n inputFormat: string,\n outputFormat: string,\n mode: string,\n patchJson: string,\n pretty: boolean,\n indent: number,\n spacesAroundValues: number,\n ): string;\n};\n\ninterface JobMessage {\n id: number;\n job: BitJob;\n}\n\nparentPort?.on(\"message\", (msg: JobMessage) => {\n const { id, job } = msg;\n try {\n const { element, diagnostics } = bitOutput(\n wasm.transform(\n job.source,\n job.inputFormat,\n job.outputFormat,\n job.mode,\n job.patchJson,\n false,\n 2,\n job.spacesAroundValues,\n ),\n job.outputFormat,\n );\n parentPort?.postMessage({ id, ok: true, element, diagnostics });\n } catch (e) {\n // The wasm export throws on failure (PLAN-192 D1); the pool turns this\n // message back into a rejected promise on the main thread.\n parentPort?.postMessage({ id, ok: false, error: e instanceof Error ? e.message : String(e) });\n }\n});\n"]}