@gmb/bitmark-parser 6.0.0 → 6.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/browser/bitmark-parser.min.js +2 -1
- package/dist/browser/bitmark-parser.min.js.map +1 -1
- package/dist/browser/bitmark_wasm_bg.wasm +0 -0
- package/dist/browser/cjs/bitmark_wasm_bg.wasm +0 -0
- package/dist/browser/cjs/index.cjs +452 -20
- package/dist/browser/cjs/index.cjs.map +1 -1
- package/dist/browser/cjs/index.d.cts +155 -2
- package/dist/browser/esm/bitmark_wasm_bg.wasm +0 -0
- package/dist/browser/esm/index.d.ts +155 -2
- package/dist/browser/esm/index.js +450 -20
- package/dist/browser/esm/index.js.map +1 -1
- package/dist/browser/esm/worker-entry.d.ts +2 -0
- package/dist/browser/esm/worker-entry.js +191 -0
- package/dist/browser/esm/worker-entry.js.map +1 -0
- package/dist/cli.js +219 -7
- package/dist/cli.js.map +1 -1
- package/dist/index.cjs +265 -4
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +167 -4
- package/dist/index.d.ts +167 -4
- package/dist/index.js +257 -4
- package/dist/index.js.map +1 -1
- package/dist/worker-entry.cjs +39 -0
- package/dist/worker-entry.cjs.map +1 -0
- package/package.json +3 -2
- package/wasm/bitmark_wasm.d.ts +65 -17
- package/wasm/bitmark_wasm.js +287 -40
- package/wasm/bitmark_wasm_bg.wasm +0 -0
- package/wasm/bitmark_wasm_bg.wasm.d.ts +10 -1
- package/wasm/package.json +2 -2
package/dist/cli.js
CHANGED
|
@@ -1,12 +1,125 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
2
|
import { Command } from 'commander';
|
|
3
3
|
import { createRequire } from 'module';
|
|
4
|
-
import
|
|
4
|
+
import 'url';
|
|
5
|
+
import 'worker_threads';
|
|
6
|
+
import { readFileSync, existsSync, mkdirSync, appendFileSync, writeFileSync } from 'fs';
|
|
5
7
|
import { dirname } from 'path';
|
|
6
8
|
|
|
7
9
|
// src/generated/package_info.ts
|
|
8
10
|
var PACKAGE_INFO = {
|
|
9
|
-
"version": "6.
|
|
11
|
+
"version": "6.1.0"};
|
|
12
|
+
|
|
13
|
+
// src/core/hooked-transform.ts
|
|
14
|
+
function isError(s) {
|
|
15
|
+
return s.startsWith("error:");
|
|
16
|
+
}
|
|
17
|
+
function errorString(e) {
|
|
18
|
+
const m = e instanceof Error ? e.message : String(e);
|
|
19
|
+
return m.startsWith("error:") ? m : `error: ${m}`;
|
|
20
|
+
}
|
|
21
|
+
function stripArray(doc) {
|
|
22
|
+
const t = doc.trim();
|
|
23
|
+
return t.startsWith("[") && t.endsWith("]") ? t.slice(1, -1) : doc;
|
|
24
|
+
}
|
|
25
|
+
function normalisePatch(patch) {
|
|
26
|
+
if (patch === void 0) return [];
|
|
27
|
+
if (typeof patch === "string") {
|
|
28
|
+
const trimmed = patch.trim();
|
|
29
|
+
return trimmed === "" ? [] : JSON.parse(trimmed);
|
|
30
|
+
}
|
|
31
|
+
return patch;
|
|
32
|
+
}
|
|
33
|
+
function buildUnits(wasm2, input, inputIsBitmark) {
|
|
34
|
+
if (inputIsBitmark) {
|
|
35
|
+
const out2 = wasm2.split_bits(input);
|
|
36
|
+
if (isError(out2)) throw new Error(out2);
|
|
37
|
+
const slices = JSON.parse(out2);
|
|
38
|
+
return slices.map((s) => ({
|
|
39
|
+
view: { format: "bitmark", index: s.index, total: slices.length, source: s.source },
|
|
40
|
+
source: s.source
|
|
41
|
+
}));
|
|
42
|
+
}
|
|
43
|
+
const out = wasm2.split_json_bits(input);
|
|
44
|
+
if (isError(out)) throw new Error(out);
|
|
45
|
+
const envelopes = JSON.parse(out);
|
|
46
|
+
return envelopes.map((env, index) => ({
|
|
47
|
+
view: { format: "json", index, total: envelopes.length, bit: env.bit },
|
|
48
|
+
// Per-bit transform consumes a one-bit JSON document.
|
|
49
|
+
source: JSON.stringify([env])
|
|
50
|
+
}));
|
|
51
|
+
}
|
|
52
|
+
function planTransform(wasm2, input, options) {
|
|
53
|
+
const mode = options.mode ?? "optimized";
|
|
54
|
+
const output = options.outputFormat ?? "json";
|
|
55
|
+
const spacesAroundValues = options.spacesAroundValues ?? 1;
|
|
56
|
+
const indent = options.indent ?? 2;
|
|
57
|
+
const pretty = options.pretty ?? false;
|
|
58
|
+
const sel = options.inputFormat ?? "auto";
|
|
59
|
+
const inputIsBitmark = sel === "bitmark" || sel !== "json" && wasm2.is_bitmark(input);
|
|
60
|
+
const inputFormat = inputIsBitmark ? "bitmark" : "json";
|
|
61
|
+
const staticPatch = normalisePatch(options.patch);
|
|
62
|
+
const units = buildUnits(wasm2, input, inputIsBitmark);
|
|
63
|
+
const total = units.length;
|
|
64
|
+
const jobs = [];
|
|
65
|
+
const views = [];
|
|
66
|
+
for (let index = 0; index < total; index++) {
|
|
67
|
+
const { view, source } = units[index];
|
|
68
|
+
view.index = index;
|
|
69
|
+
view.total = total;
|
|
70
|
+
const result = options.preHook ? options.preHook(view) || {} : {};
|
|
71
|
+
if (result.drop) continue;
|
|
72
|
+
const patches = result.patches ? [...staticPatch, ...result.patches] : staticPatch;
|
|
73
|
+
jobs.push({
|
|
74
|
+
index,
|
|
75
|
+
source,
|
|
76
|
+
inputFormat,
|
|
77
|
+
outputFormat: result.outputFormat ?? output,
|
|
78
|
+
mode,
|
|
79
|
+
patchJson: JSON.stringify(patches),
|
|
80
|
+
spacesAroundValues
|
|
81
|
+
});
|
|
82
|
+
views.push(view);
|
|
83
|
+
}
|
|
84
|
+
return { jobs, views, output, pretty, indent };
|
|
85
|
+
}
|
|
86
|
+
function computeBit(wasm2, job) {
|
|
87
|
+
const out = wasm2.transform(
|
|
88
|
+
job.source,
|
|
89
|
+
job.inputFormat,
|
|
90
|
+
job.outputFormat,
|
|
91
|
+
job.mode,
|
|
92
|
+
job.patchJson,
|
|
93
|
+
false,
|
|
94
|
+
2,
|
|
95
|
+
job.spacesAroundValues
|
|
96
|
+
);
|
|
97
|
+
if (isError(out)) return out;
|
|
98
|
+
return job.outputFormat === "json" ? stripArray(out) : out;
|
|
99
|
+
}
|
|
100
|
+
function recombine(wasm2, elements, output, pretty, indent) {
|
|
101
|
+
if (output === "bitmark") return elements.join("\n");
|
|
102
|
+
const arr = `[${elements.join(",")}]`;
|
|
103
|
+
return pretty ? wasm2.prettify(arr, indent) : arr;
|
|
104
|
+
}
|
|
105
|
+
function runHookedTransform(wasm2, input, options) {
|
|
106
|
+
let plan;
|
|
107
|
+
try {
|
|
108
|
+
plan = planTransform(wasm2, input, options);
|
|
109
|
+
} catch (e) {
|
|
110
|
+
return errorString(e);
|
|
111
|
+
}
|
|
112
|
+
const rendered = [];
|
|
113
|
+
for (let i = 0; i < plan.jobs.length; i++) {
|
|
114
|
+
const element = computeBit(wasm2, plan.jobs[i]);
|
|
115
|
+
if (isError(element)) return element;
|
|
116
|
+
options.postHook?.(plan.views[i], element);
|
|
117
|
+
rendered.push(element);
|
|
118
|
+
}
|
|
119
|
+
return recombine(wasm2, rendered, plan.output, plan.pretty, plan.indent);
|
|
120
|
+
}
|
|
121
|
+
|
|
122
|
+
// src/index.ts
|
|
10
123
|
var require2 = createRequire(import.meta.url);
|
|
11
124
|
var wasm = require2("../wasm/bitmark_wasm.js");
|
|
12
125
|
function lex(input, options = {}) {
|
|
@@ -16,7 +129,46 @@ function parse(input, options = {}) {
|
|
|
16
129
|
return wasm.parse(input, options.mode ?? "optimized");
|
|
17
130
|
}
|
|
18
131
|
function convert(input, options = {}) {
|
|
19
|
-
return wasm.convert(
|
|
132
|
+
return wasm.convert(
|
|
133
|
+
input,
|
|
134
|
+
options.inputFormat ?? "auto",
|
|
135
|
+
options.outputFormat ?? "auto",
|
|
136
|
+
options.mode ?? "optimized",
|
|
137
|
+
options.pretty ?? false,
|
|
138
|
+
options.indent ?? 2,
|
|
139
|
+
options.spacesAroundValues ?? 1
|
|
140
|
+
);
|
|
141
|
+
}
|
|
142
|
+
function optimize(input, options = {}) {
|
|
143
|
+
return wasm.optimize(input, options.pretty ?? false, options.indent ?? 2);
|
|
144
|
+
}
|
|
145
|
+
function fullize(input, options = {}) {
|
|
146
|
+
return wasm.fullize(input, options.pretty ?? false, options.indent ?? 2);
|
|
147
|
+
}
|
|
148
|
+
function canonicalize(input, options = {}) {
|
|
149
|
+
return wasm.canonicalize(
|
|
150
|
+
input,
|
|
151
|
+
options.mode ?? "optimized",
|
|
152
|
+
options.pretty ?? false,
|
|
153
|
+
options.indent ?? 2,
|
|
154
|
+
options.spacesAroundValues ?? 1
|
|
155
|
+
);
|
|
156
|
+
}
|
|
157
|
+
function transform(input, options = {}) {
|
|
158
|
+
if (options.preHook || options.postHook) {
|
|
159
|
+
return runHookedTransform(wasm, input, options);
|
|
160
|
+
}
|
|
161
|
+
const patchJson = options.patch === void 0 ? "" : typeof options.patch === "string" ? options.patch : JSON.stringify(options.patch);
|
|
162
|
+
return wasm.transform(
|
|
163
|
+
input,
|
|
164
|
+
options.inputFormat ?? "auto",
|
|
165
|
+
options.outputFormat ?? "json",
|
|
166
|
+
options.mode ?? "optimized",
|
|
167
|
+
patchJson,
|
|
168
|
+
options.pretty ?? false,
|
|
169
|
+
options.indent ?? 2,
|
|
170
|
+
options.spacesAroundValues ?? 1
|
|
171
|
+
);
|
|
20
172
|
}
|
|
21
173
|
function breakscapeText(input, options = {}) {
|
|
22
174
|
const format = options.format ?? "bitmark++";
|
|
@@ -36,6 +188,9 @@ function info(options = {}) {
|
|
|
36
188
|
const indent = options.indent ?? 2;
|
|
37
189
|
return wasm.info(infoType, format, bit, pretty, indent);
|
|
38
190
|
}
|
|
191
|
+
function generate(input, options = {}) {
|
|
192
|
+
return wasm.convert(input, "json", "bitmark", options.mode ?? "optimized", false, 2, 1);
|
|
193
|
+
}
|
|
39
194
|
function readInputs(inputs) {
|
|
40
195
|
if (inputs.length === 0) {
|
|
41
196
|
return readStdin();
|
|
@@ -94,18 +249,21 @@ function registerParseCommand(program2) {
|
|
|
94
249
|
|
|
95
250
|
// src/commands/generate.ts
|
|
96
251
|
function registerGenerateCommand(program2) {
|
|
97
|
-
program2.command("generate").description("Generate bitmark text from JSON").argument("
|
|
98
|
-
|
|
99
|
-
|
|
252
|
+
program2.command("generate").description("Generate bitmark text from JSON").argument("[INPUT...]", "Input: JSON files, literal strings, or omit for stdin").option("-o, --output <file>", "Output file (default: stdout)").option("-a, --append", "Append to output file", false).option("--mode <MODE>", "Output mode: optimized or full", "optimized").action((inputs, options) => {
|
|
253
|
+
const content = readInputs(inputs);
|
|
254
|
+
const result = generate(content, { mode: options.mode });
|
|
255
|
+
writeOutput(result, options.output, options.append);
|
|
100
256
|
});
|
|
101
257
|
}
|
|
102
258
|
|
|
103
259
|
// src/commands/convert.ts
|
|
104
260
|
function registerConvertCommand(program2) {
|
|
105
|
-
program2.command("convert").description("Auto-detect input format and convert between bitmark and JSON").argument("[INPUT...]", "Input: file paths, bitmark/JSON strings, or omit for stdin").option("-o, --output <file>", "Output file (default: stdout)").option("-a, --append", "Append to output file", false).option("-w, --warnings", "Enable validation warnings in output", false).option("-p, --pretty", "Prettify JSON output", false).option("--indent <n>", "Indent size for pretty JSON", "2").option("--mode <MODE>", "JSON output mode: optimized or full", "optimized").option("--plain-text", "Output text as plain text (debug)", false).action(
|
|
261
|
+
program2.command("convert").description("Auto-detect input format and convert between bitmark and JSON").argument("[INPUT...]", "Input: file paths, bitmark/JSON strings, or omit for stdin").option("-o, --output <file>", "Output file (default: stdout)").option("-a, --append", "Append to output file", false).option("-w, --warnings", "Enable validation warnings in output", false).option("-p, --pretty", "Prettify JSON output", false).option("--indent <n>", "Indent size for pretty JSON", "2").option("--mode <MODE>", "JSON output mode: optimized or full", "optimized").option("--input-format <FMT>", "Input format: auto, bitmark, or json", "auto").option("--output-format <FMT>", "Output format: auto, bitmark, or json", "auto").option("--plain-text", "Output text as plain text (debug)", false).action(
|
|
106
262
|
(inputs, options) => {
|
|
107
263
|
const content = readInputs(inputs);
|
|
108
264
|
const result = convert(content, {
|
|
265
|
+
inputFormat: options.inputFormat,
|
|
266
|
+
outputFormat: options.outputFormat,
|
|
109
267
|
mode: options.mode,
|
|
110
268
|
warnings: options.warnings,
|
|
111
269
|
plainText: options.plainText,
|
|
@@ -117,6 +275,58 @@ function registerConvertCommand(program2) {
|
|
|
117
275
|
);
|
|
118
276
|
}
|
|
119
277
|
|
|
278
|
+
// src/commands/normalize.ts
|
|
279
|
+
function registerNormalizeCommands(program2) {
|
|
280
|
+
const common = (cmd) => cmd.argument("[INPUT...]", "Input: file paths, bitmark/JSON strings, or omit for stdin").option("-o, --output <file>", "Output file (default: stdout)").option("-a, --append", "Append to output file", false).option("-p, --pretty", "Prettify JSON output", false).option("--indent <n>", "Indent size for pretty JSON", "2").option("--spacesAroundValues <n>", "Spaces around bitmark tag values (0-10)", "1");
|
|
281
|
+
common(program2.command("optimize").description("Re-emit input in its own format at optimized mode")).action(
|
|
282
|
+
(inputs, options) => {
|
|
283
|
+
const out = optimize(readInputs(inputs), {
|
|
284
|
+
pretty: options.pretty,
|
|
285
|
+
indent: parseInt(options.indent, 10)
|
|
286
|
+
});
|
|
287
|
+
writeOutput(out, options.output, options.append);
|
|
288
|
+
}
|
|
289
|
+
);
|
|
290
|
+
common(
|
|
291
|
+
program2.command("fullize").alias("expand").description("Re-emit input in its own format at full mode (all keys)")
|
|
292
|
+
).action((inputs, options) => {
|
|
293
|
+
const out = fullize(readInputs(inputs), {
|
|
294
|
+
pretty: options.pretty,
|
|
295
|
+
indent: parseInt(options.indent, 10)
|
|
296
|
+
});
|
|
297
|
+
writeOutput(out, options.output, options.append);
|
|
298
|
+
});
|
|
299
|
+
common(
|
|
300
|
+
program2.command("canonicalize").description("Re-emit input in its own format in canonical form").option("--mode <MODE>", "Output mode: optimized or full", "optimized")
|
|
301
|
+
).action((inputs, options) => {
|
|
302
|
+
const out = canonicalize(readInputs(inputs), {
|
|
303
|
+
mode: options.mode,
|
|
304
|
+
pretty: options.pretty,
|
|
305
|
+
indent: parseInt(options.indent, 10),
|
|
306
|
+
spacesAroundValues: parseInt(options.spacesAroundValues, 10)
|
|
307
|
+
});
|
|
308
|
+
writeOutput(out, options.output, options.append);
|
|
309
|
+
});
|
|
310
|
+
}
|
|
311
|
+
function registerTransformCommand(program2) {
|
|
312
|
+
program2.command("transform").alias("patch").description("Apply path patches to each bit (per-bit transform)").argument("[INPUT...]", "Input: file paths, bitmark/JSON strings, or omit for stdin").option("-o, --output <file>", "Output file (default: stdout)").option("-a, --append", "Append to output file", false).option("--patch <file>", "Patch file: a JSON array of patch entries").option("--input-format <FMT>", "Input format: auto, bitmark, or json", "auto").option("--output-format <FMT>", "Output format: bitmark or json", "json").option("--mode <MODE>", "Output mode: optimized or full", "optimized").option("-p, --pretty", "Prettify JSON output", false).option("--indent <n>", "Indent size for pretty JSON", "2").option("--spacesAroundValues <n>", "Spaces around bitmark tag values (0-10)", "1").action(
|
|
313
|
+
(inputs, options) => {
|
|
314
|
+
const content = readInputs(inputs);
|
|
315
|
+
const patch = options.patch ? readFileSync(options.patch, "utf8") : void 0;
|
|
316
|
+
const out = transform(content, {
|
|
317
|
+
patch,
|
|
318
|
+
inputFormat: options.inputFormat,
|
|
319
|
+
outputFormat: options.outputFormat,
|
|
320
|
+
mode: options.mode,
|
|
321
|
+
pretty: options.pretty,
|
|
322
|
+
indent: parseInt(options.indent, 10),
|
|
323
|
+
spacesAroundValues: parseInt(options.spacesAroundValues, 10)
|
|
324
|
+
});
|
|
325
|
+
writeOutput(out, options.output, options.append);
|
|
326
|
+
}
|
|
327
|
+
);
|
|
328
|
+
}
|
|
329
|
+
|
|
120
330
|
// src/commands/breakscape.ts
|
|
121
331
|
function registerBreakscapeCommand(program2) {
|
|
122
332
|
program2.command("breakscape").description("Breakscape text (escape bitmark special characters)").argument("[INPUT...]", "Input: file paths, text strings, or omit for stdin").option("-o, --output <file>", "Output file (default: stdout)").option("-a, --append", "Append to output file", false).option("--format <FORMAT>", "Text format: bitmark++ or plainText", "bitmark++").option("--location <LOCATION>", "Text location: body or tag", "body").action((inputs, options) => {
|
|
@@ -163,6 +373,8 @@ program.name("bitmark-parser").description("Parse and generate bitmark text").ve
|
|
|
163
373
|
registerParseCommand(program);
|
|
164
374
|
registerGenerateCommand(program);
|
|
165
375
|
registerConvertCommand(program);
|
|
376
|
+
registerNormalizeCommands(program);
|
|
377
|
+
registerTransformCommand(program);
|
|
166
378
|
registerBreakscapeCommand(program);
|
|
167
379
|
registerUnbreakscapeCommand(program);
|
|
168
380
|
registerInfoCommand(program);
|
package/dist/cli.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/generated/package_info.ts","../src/index.ts","../src/utils/io.ts","../src/commands/parse.ts","../src/commands/generate.ts","../src/commands/convert.ts","../src/commands/breakscape.ts","../src/commands/unbreakscape.ts","../src/commands/info.ts","../src/cli.ts"],"names":["require","program"],"mappings":"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","file":"cli.js","sourcesContent":["// This file is automatically generated. DO NOT EDIT.\n\n/* eslint-disable */\n\nexport const PACKAGE_INFO = {\n \"name\": \"@gmb/bitmark-parser\",\n \"version\": \"6.0.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: WASM-TSBindings\n\nimport { createRequire } from \"node:module\";\nimport { PACKAGE_INFO } from \"./generated/package_info.js\";\nimport type { LexOptions, ParseOptions, ConvertOptions, BreakscapeOptions, InfoOptions } from \"./types.js\";\nconst require = createRequire(import.meta.url);\nconst wasm = require(\"../wasm/bitmark_wasm.js\") as typeof import(\"../wasm/bitmark_wasm.js\");\n\nexport type { LexOptions, LexStage, ParseOptions, ConvertOptions, OutputMode, BreakscapeOptions, TextFormat, TextLocation, InfoOptions, InfoType, InfoFormat } from \"./types.js\";\n\n/**\n * Get the version of the @gmb/bitmark-parser library.\n *\n * @returns Version string (e.g. \"3.0.0\").\n */\nexport function version(): string {\n return PACKAGE_INFO.version;\n}\n\n/**\n * Lex bitmark input text, returning one line per token.\n *\n * @param input - The bitmark source text.\n * @param options - Lex options (e.g. `{ stage: \"lex\" }`).\n * @returns Token dump string (one token per line).\n */\nexport function lex(input: string, options: LexOptions = {}): string {\n return wasm.lex(input, options.stage ?? \"lex\");\n}\n\n/**\n * Parse bitmark input text and return structured JSON entries.\n *\n * Each entry contains `bit`, `parser`, and `bitmark` fields.\n *\n * @param input - The bitmark source text.\n * @param options - Parse options (e.g. `{ mode: \"full\" }`).\n * @returns JSON string array of structured parsed entries.\n */\nexport function parse(input: string, options: ParseOptions = {}): string {\n return wasm.parse(input, options.mode ?? \"optimized\");\n}\n\n/**\n * Auto-detect input format and convert between bitmark and JSON.\n *\n * @param input - Bitmark or JSON input text.\n * @param options - Convert options (e.g. `{ mode: \"full\", warnings: true }`).\n * @returns Converted output string. For bitmark input, this is a JSON string\n * array of structured parsed entries (`bit`, `parser`, `bitmark`).\n */\nexport function convert(input: string, options: ConvertOptions = {}): string {\n return wasm.convert(input, options.mode ?? \"optimized\", options.warnings ?? false, options.plainText ?? false, options.pretty ?? false, options.indent ?? 2);\n}\n\n/**\n * Breakscape text (escape bitmark special characters).\n *\n * @param input - The text to breakscape.\n * @param options - Breakscape options (e.g. `{ format: \"plainText\", location: \"tag\" }`).\n * @returns Breakscaped text.\n */\nexport function breakscapeText(input: string, options: BreakscapeOptions = {}): string {\n const format = options.format ?? \"bitmark++\";\n const location = options.location ?? \"body\";\n return wasm.breakscape_text(input, format, location);\n}\n\n/**\n * Unbreakscape text (unescape bitmark special characters).\n *\n * @param input - The text to unbreakscape.\n * @param options - Unbreakscape options (e.g. `{ format: \"plainText\", location: \"tag\" }`).\n * @returns Unbreakscaped text.\n */\nexport function unbreakscapeText(input: string, options: BreakscapeOptions = {}): string {\n const format = options.format ?? \"bitmark++\";\n const location = options.location ?? \"body\";\n return wasm.unbreakscape_text(input, format, location);\n}\n\n/**\n * Query information about supported bit types.\n *\n * @param options - Info options (e.g. `{ infoType: \"bit\", format: \"json\", bit: \"cloze\" }`).\n * @returns Information string.\n */\nexport function info(options: InfoOptions = {}): string {\n const infoType = options.infoType ?? \"list\";\n const format = options.format ?? \"text\";\n const bit = options.bit ?? \"\";\n const pretty = options.pretty ?? false;\n const indent = options.indent ?? 2;\n return wasm.info(infoType, format, bit, pretty, indent);\n}\n\n/**\n * Generate bitmark text from a JSON AST.\n *\n * @param _json - JSON string of the AST.\n * @throws Always throws — not yet implemented.\n */\nexport function generate(_json: string): string {\n throw new Error(\"generate is not yet implemented\");\n}\n","// @zen-component: CLI-SharedIO\n//! Shared I/O utilities for the TS CLI.\n\nimport { readFileSync, writeFileSync, appendFileSync, existsSync, mkdirSync } from \"node:fs\";\nimport { dirname } from \"node:path\";\n\n/**\n * Resolve multiple inputs into a single concatenated string.\n *\n * If the array is empty, reads from stdin.\n * Multiple inputs are concatenated with `\\n` — valid for bitmark\n * because bits are `\\n`-delimited.\n */\nexport function readInputs(inputs: string[]): string {\n if (inputs.length === 0) {\n return readStdin();\n }\n if (inputs.length === 1) {\n return readSingle(inputs[0]);\n }\n return inputs.map(readSingle).join(\"\\n\");\n}\n\n/**\n * Resolve a single input string (file path or literal).\n */\nfunction readSingle(input: string): string {\n if (existsSync(input)) {\n return readFileSync(input, \"utf-8\");\n }\n return input;\n}\n\n/**\n * Read all of stdin synchronously.\n */\nfunction readStdin(): string {\n const buf = readFileSync(0, \"utf-8\") as string;\n if (!buf) {\n console.error(\"No input provided. Pass a file path, literal string, or pipe via stdin.\");\n process.exit(1);\n }\n return buf;\n}\n\n/**\n * Write output to stdout or a file.\n *\n * - If `outputPath` is undefined → write to stdout\n * - If `append` is true → append to file\n * - Otherwise → overwrite file\n */\nexport function writeOutput(content: string, outputPath: string | undefined, append: boolean): void {\n if (outputPath === undefined) {\n process.stdout.write(content);\n return;\n }\n\n // Ensure parent directory exists\n const dir = dirname(outputPath);\n if (dir && !existsSync(dir)) {\n mkdirSync(dir, { recursive: true });\n }\n\n if (append) {\n appendFileSync(outputPath, content, \"utf-8\");\n } else {\n writeFileSync(outputPath, content, \"utf-8\");\n }\n}\n","// @zen-component: WASM-TSBindings\n\nimport type { Command } from \"commander\";\nimport { lex, parse } from \"../index.js\";\nimport { readInputs, writeOutput } from \"../utils/io.js\";\n\nexport function registerParseCommand(program: Command): void {\n program\n .command(\"parse\")\n .description(\"Parse a bitmark file to JSON\")\n .argument(\"[INPUT...]\", \"Input: bitmark files, literal strings, or omit for stdin\")\n .option(\"-o, --output <file>\", \"Output file (default: stdout)\")\n .option(\"-a, --append\", \"Append to output file\", false)\n .option(\"--stage <STAGE>\", \"Stage to run: all, lex\", \"all\")\n .option(\"--mode <MODE>\", \"JSON output mode: optimized or full\", \"optimized\")\n .option(\"-p, --pretty\", \"Prettify JSON output\", false)\n .option(\"--indent <SIZE>\", \"Indent size for pretty JSON\", \"2\")\n .action((inputs: string[], options: { output?: string; append: boolean; stage: string; mode: string; pretty: boolean; indent: string }) => {\n const content = readInputs(inputs);\n let result: string;\n\n if (options.stage === \"lex\") {\n result = lex(content, { stage: options.stage });\n } else {\n result = parse(content, { mode: options.mode as \"optimized\" | \"full\" });\n }\n\n if (options.pretty && options.stage === \"all\") {\n result = JSON.stringify(JSON.parse(result), null, Number(options.indent));\n }\n\n writeOutput(result, options.output, options.append);\n });\n}\n","// @zen-component: WASM-TSBindings\n\nimport type { Command } from \"commander\";\n\nexport function registerGenerateCommand(program: Command): void {\n program\n .command(\"generate\")\n .description(\"Generate bitmark text from JSON\")\n .argument(\"<INPUT>\", \"Input JSON file\")\n .argument(\"<OUTPUT>\", \"Output bitmark file\")\n .action((_input: string, _output: string) => {\n console.error(\"generate not yet implemented\");\n process.exit(1);\n });\n}\n","// @zen-component: CLI-Convert\n\nimport type { Command } from \"commander\";\nimport { convert } from \"../index.js\";\nimport { readInputs, writeOutput } from \"../utils/io.js\";\n\nexport function registerConvertCommand(program: Command): void {\n program\n .command(\"convert\")\n .description(\"Auto-detect input format and convert between bitmark and JSON\")\n .argument(\"[INPUT...]\", \"Input: file paths, bitmark/JSON strings, or omit for stdin\")\n .option(\"-o, --output <file>\", \"Output file (default: stdout)\")\n .option(\"-a, --append\", \"Append to output file\", false)\n .option(\"-w, --warnings\", \"Enable validation warnings in output\", false)\n .option(\"-p, --pretty\", \"Prettify JSON output\", false)\n .option(\"--indent <n>\", \"Indent size for pretty JSON\", \"2\")\n .option(\"--mode <MODE>\", \"JSON output mode: optimized or full\", \"optimized\")\n .option(\"--plain-text\", \"Output text as plain text (debug)\", false)\n .action(\n (\n inputs: string[],\n options: {\n output?: string;\n append: boolean;\n warnings: boolean;\n pretty: boolean;\n indent: string;\n mode: string;\n plainText: boolean;\n },\n ) => {\n const content = readInputs(inputs);\n const result = convert(content, {\n mode: options.mode as \"optimized\" | \"full\",\n warnings: options.warnings,\n plainText: options.plainText,\n pretty: options.pretty,\n indent: parseInt(options.indent, 10),\n });\n writeOutput(result, options.output, options.append);\n },\n );\n}\n","// @zen-component: CLI-Breakscape\n\nimport type { Command } from \"commander\";\nimport { breakscapeText } from \"../index.js\";\nimport { readInputs, writeOutput } from \"../utils/io.js\";\n\nexport function registerBreakscapeCommand(program: Command): void {\n program\n .command(\"breakscape\")\n .description(\"Breakscape text (escape bitmark special characters)\")\n .argument(\"[INPUT...]\", \"Input: file paths, text strings, or omit for stdin\")\n .option(\"-o, --output <file>\", \"Output file (default: stdout)\")\n .option(\"-a, --append\", \"Append to output file\", false)\n .option(\"--format <FORMAT>\", \"Text format: bitmark++ or plainText\", \"bitmark++\")\n .option(\"--location <LOCATION>\", \"Text location: body or tag\", \"body\")\n .action((inputs: string[], options: { output?: string; append: boolean; format: string; location: string }) => {\n const content = readInputs(inputs);\n const result = breakscapeText(content, {\n format: options.format as \"bitmark++\" | \"plainText\",\n location: options.location as \"body\" | \"tag\",\n });\n writeOutput(result, options.output, options.append);\n });\n}\n","// @zen-component: CLI-Breakscape\n\nimport type { Command } from \"commander\";\nimport { unbreakscapeText } from \"../index.js\";\nimport { readInputs, writeOutput } from \"../utils/io.js\";\n\nexport function registerUnbreakscapeCommand(program: Command): void {\n program\n .command(\"unbreakscape\")\n .description(\"Unbreakscape text (unescape bitmark special characters)\")\n .argument(\"[INPUT...]\", \"Input: file paths, text strings, or omit for stdin\")\n .option(\"-o, --output <file>\", \"Output file (default: stdout)\")\n .option(\"-a, --append\", \"Append to output file\", false)\n .option(\"--format <FORMAT>\", \"Text format: bitmark++ or plainText\", \"bitmark++\")\n .option(\"--location <LOCATION>\", \"Text location: body or tag\", \"body\")\n .action((inputs: string[], options: { output?: string; append: boolean; format: string; location: string }) => {\n const content = readInputs(inputs);\n const result = unbreakscapeText(content, {\n format: options.format as \"bitmark++\" | \"plainText\",\n location: options.location as \"body\" | \"tag\",\n });\n writeOutput(result, options.output, options.append);\n });\n}\n","// @zen-component: CLI-Info\n\nimport type { Command } from \"commander\";\nimport { info } from \"../index.js\";\nimport { writeOutput } from \"../utils/io.js\";\n\nexport function registerInfoCommand(program: Command): void {\n program\n .command(\"info\")\n .description(\"Show information about supported bit types\")\n .argument(\"[INFO]\", \"Info type: list, bit, all, deprecated\", \"list\")\n .option(\"-f, --format <FORMAT>\", \"Output format: text or json\", \"text\")\n .option(\"--all\", \"Include deprecated bits\", false)\n .option(\"--bit <NAME>\", \"Filter to specific bit type\")\n .option(\"--deprecated\", \"Show only deprecated bits\", false)\n .option(\"-o, --output <file>\", \"Output file (default: stdout)\")\n .option(\"-a, --append\", \"Append to output file\", false)\n .option(\"-p, --pretty\", \"Prettify JSON output\", false)\n .option(\"--indent <n>\", \"Indent size for pretty JSON\", \"2\")\n .action(\n (\n infoType: string,\n options: {\n format: string;\n all: boolean;\n bit?: string;\n deprecated: boolean;\n output?: string;\n append: boolean;\n pretty: boolean;\n indent: string;\n },\n ) => {\n const result = info({\n infoType: infoType as \"list\" | \"bit\" | \"all\" | \"deprecated\",\n format: options.format as \"text\" | \"json\",\n bit: options.bit,\n pretty: options.pretty,\n indent: parseInt(options.indent, 10),\n });\n writeOutput(result, options.output, options.append);\n },\n );\n}\n","#!/usr/bin/env node\n// @zen-component: WASM-TSBindings\n\nimport { Command } from \"commander\";\nimport { PACKAGE_INFO } from \"./generated/package_info.js\";\nimport { registerParseCommand } from \"./commands/parse.js\";\nimport { registerGenerateCommand } from \"./commands/generate.js\";\nimport { registerConvertCommand } from \"./commands/convert.js\";\nimport { registerBreakscapeCommand } from \"./commands/breakscape.js\";\nimport { registerUnbreakscapeCommand } from \"./commands/unbreakscape.js\";\nimport { registerInfoCommand } from \"./commands/info.js\";\n\nconst program = new Command();\n\nprogram.name(\"bitmark-parser\").description(\"Parse and generate bitmark text\").version(PACKAGE_INFO.version);\n\nregisterParseCommand(program);\nregisterGenerateCommand(program);\nregisterConvertCommand(program);\nregisterBreakscapeCommand(program);\nregisterUnbreakscapeCommand(program);\nregisterInfoCommand(program);\n\nprogram.parse();\n"]}
|
|
1
|
+
{"version":3,"sources":["../src/generated/package_info.ts","../src/core/hooked-transform.ts","../src/index.ts","../src/utils/io.ts","../src/commands/parse.ts","../src/commands/generate.ts","../src/commands/convert.ts","../src/commands/normalize.ts","../src/commands/transform.ts","../src/commands/breakscape.ts","../src/commands/unbreakscape.ts","../src/commands/info.ts","../src/cli.ts"],"names":["wasm","out","require","program","readFileSync"],"mappings":"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","file":"cli.js","sourcesContent":["// This file is automatically generated. DO NOT EDIT.\n\n/* eslint-disable */\n\nexport const PACKAGE_INFO = {\n \"name\": \"@gmb/bitmark-parser\",\n \"version\": \"6.1.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: TS-HookedTransform\n\nimport type { BitView, OutputFormat, PatchEntry, TransformOptions } from \"../types.js\";\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 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\nexport function isError(s: string): boolean {\n return s.startsWith(\"error:\");\n}\n\n/**\n * Normalise a thrown value to an `error:`-prefixed string, without\n * double-prefixing a message that already carries the prefix (split helpers\n * surface WASM `error:` strings as thrown `Error`s).\n */\nexport function errorString(e: unknown): string {\n const m = e instanceof Error ? e.message : String(e);\n return m.startsWith(\"error:\") ? m : `error: ${m}`;\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\nfunction normalisePatch(patch: TransformOptions[\"patch\"]): PatchEntry[] {\n if (patch === undefined) return [];\n if (typeof patch === \"string\") {\n const trimmed = patch.trim();\n return trimmed === \"\" ? [] : (JSON.parse(trimmed) as PatchEntry[]);\n }\n return patch;\n}\n\nfunction buildUnits(\n wasm: HookedWasm,\n input: string,\n inputIsBitmark: boolean,\n): { view: BitView; source: string }[] {\n if (inputIsBitmark) {\n const out = wasm.split_bits(input);\n if (isError(out)) throw new Error(out);\n const slices = JSON.parse(out) 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 out = wasm.split_json_bits(input);\n if (isError(out)) throw new Error(out);\n const envelopes = JSON.parse(out) as { bit?: unknown }[];\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 const staticPatch = normalisePatch(options.patch);\n const units = buildUnits(wasm, input, inputIsBitmark);\n const total = units.length;\n\n const jobs: BitJob[] = [];\n const views: BitView[] = [];\n for (let index = 0; index < total; index++) {\n const { view, source } = units[index];\n view.index = index;\n view.total = total;\n\n const result = options.preHook ? options.preHook(view) || {} : {};\n if (result.drop) continue;\n\n const patches = result.patches ? [...staticPatch, ...result.patches] : staticPatch;\n jobs.push({\n index,\n source,\n inputFormat,\n outputFormat: result.outputFormat ?? output,\n mode,\n patchJson: JSON.stringify(patches),\n spacesAroundValues,\n });\n views.push(view);\n }\n return { jobs, views, output, pretty, indent };\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). Returns an `error:`-prefixed string on failure.\n */\nexport function computeBit(wasm: HookedWasm, job: BitJob): string {\n const out = 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 if (isError(out)) return out;\n return job.outputFormat === \"json\" ? stripArray(out) : out;\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 if (output === \"bitmark\") 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. Returns the document, or an `error:`-prefixed\n * string on failure.\n */\nexport function runHookedTransform(\n wasm: HookedWasm,\n input: string,\n options: TransformOptions,\n): string {\n let plan: TransformPlan;\n try {\n plan = planTransform(wasm, input, options);\n } catch (e) {\n return errorString(e);\n }\n\n const rendered: string[] = [];\n for (let i = 0; i < plan.jobs.length; i++) {\n const element = computeBit(wasm, plan.jobs[i]);\n if (isError(element)) return element;\n options.postHook?.(plan.views[i], element);\n rendered.push(element);\n }\n return recombine(wasm, rendered, plan.output, plan.pretty, plan.indent);\n}\n","// @zen-component: WASM-TSBindings\n\nimport { createRequire } from \"node:module\";\nimport { PACKAGE_INFO } from \"./generated/package_info.js\";\nimport { runHookedTransform, type HookedWasm } from \"./core/hooked-transform.js\";\nimport { runParallelTransform } from \"./node/transform-parallel.js\";\nimport type { LexOptions, ParseOptions, ConvertOptions, BreakscapeOptions, InfoOptions, NormalizeOptions, TransformOptions, BitSlice } from \"./types.js\";\nconst require = createRequire(import.meta.url);\nconst wasm = require(\"../wasm/bitmark_wasm.js\") as typeof import(\"../wasm/bitmark_wasm.js\");\n\nexport type { LexOptions, LexStage, ParseOptions, ConvertOptions, OutputMode, BreakscapeOptions, TextFormat, TextLocation, InfoOptions, InfoType, InfoFormat, InputFormat, OutputFormat, NormalizeOptions, TransformOptions, PatchOp, PatchEntry, BitSlice, BitView, PreHook, PostHook, PreHookResult } from \"./types.js\";\n\n/**\n * Get the version of the @gmb/bitmark-parser library.\n *\n * @returns Version string (e.g. \"3.0.0\").\n */\nexport function version(): string {\n return PACKAGE_INFO.version;\n}\n\n/**\n * Lex bitmark input text, returning one line per token.\n *\n * @param input - The bitmark source text.\n * @param options - Lex options (e.g. `{ stage: \"lex\" }`).\n * @returns Token dump string (one token per line).\n */\nexport function lex(input: string, options: LexOptions = {}): string {\n return wasm.lex(input, options.stage ?? \"lex\");\n}\n\n/**\n * Parse bitmark input text and return structured JSON entries.\n *\n * Each entry contains `bit`, `parser`, and `bitmark` fields.\n *\n * @param input - The bitmark source text.\n * @param options - Parse options (e.g. `{ mode: \"full\" }`).\n * @returns JSON string array of structured parsed entries.\n */\nexport function parse(input: string, options: ParseOptions = {}): string {\n return wasm.parse(input, options.mode ?? \"optimized\");\n}\n\n/**\n * Auto-detect input format and convert between bitmark and JSON.\n *\n * @param input - Bitmark or JSON input text.\n * @param options - Convert options (e.g. `{ mode: \"full\", warnings: true }`).\n * @returns Converted output string. For bitmark input, this is a JSON string\n * array of structured parsed entries (`bit`, `parser`, `bitmark`).\n */\nexport function convert(input: string, options: ConvertOptions = {}): string {\n return wasm.convert(\n input,\n options.inputFormat ?? \"auto\",\n options.outputFormat ?? \"auto\",\n options.mode ?? \"optimized\",\n options.pretty ?? false,\n options.indent ?? 2,\n options.spacesAroundValues ?? 1,\n );\n}\n\n/**\n * Re-emit input in its own (auto-detected) format at optimized mode.\n *\n * @param input - Bitmark or JSON input text.\n * @returns Optimized output in the same format as the input.\n */\nexport function optimize(input: string, options: NormalizeOptions = {}): string {\n return wasm.optimize(input, options.pretty ?? false, options.indent ?? 2);\n}\n\n/**\n * Re-emit input in its own (auto-detected) format at full mode (all keys).\n * Aliased as {@link expand}.\n */\nexport function fullize(input: string, options: NormalizeOptions = {}): string {\n return wasm.fullize(input, options.pretty ?? false, options.indent ?? 2);\n}\n\n/** Alias of {@link fullize}. */\nexport const expand = fullize;\n\n/**\n * Re-emit input in its own (auto-detected) format in canonical form.\n */\nexport function canonicalize(input: string, options: NormalizeOptions = {}): string {\n return wasm.canonicalize(\n input,\n options.mode ?? \"optimized\",\n options.pretty ?? false,\n options.indent ?? 2,\n options.spacesAroundValues ?? 1,\n );\n}\n\n/**\n * Count the bits in `input`, auto-detecting bitmark vs JSON.\n *\n * @throws If the input cannot be parsed.\n */\nexport function countBits(input: string): number {\n const out = wasm.count_bits(input);\n if (out.startsWith(\"error:\")) throw new Error(out);\n return Number.parseInt(out, 10);\n}\n\n/**\n * Split a bitmark document into per-bit source slices.\n *\n * @returns Array of `{ index, byteStart, byteEnd, source }`.\n */\nexport function splitBits(input: string): BitSlice[] {\n return JSON.parse(wasm.split_bits(input)) as BitSlice[];\n}\n\n/**\n * Transform a document bit-by-bit: apply an optional static `patch` and/or\n * per-bit `preHook`/`postHook`, then re-emit.\n *\n * With neither hook, the whole document is transformed in a single WASM pass\n * (the fast path). When a `preHook` or `postHook` is supplied, `transform`\n * drives the bits one at a time on the calling thread — the hook inspects each\n * bit, may return patches / an output-format override / `drop`, and only data\n * crosses into WASM. The patch may be an array of entries or a JSON string.\n *\n * @returns The transformed document, or an `error:`-prefixed string on failure.\n */\nexport function transform(input: string, options: TransformOptions = {}): string {\n if (options.preHook || options.postHook) {\n return runHookedTransform(wasm as unknown as HookedWasm, input, options);\n }\n const patchJson =\n options.patch === undefined\n ? \"\"\n : typeof options.patch === \"string\"\n ? options.patch\n : JSON.stringify(options.patch);\n return wasm.transform(\n input,\n options.inputFormat ?? \"auto\",\n options.outputFormat ?? \"json\",\n options.mode ?? \"optimized\",\n patchJson,\n options.pretty ?? false,\n options.indent ?? 2,\n options.spacesAroundValues ?? 1,\n );\n}\n\n/**\n * Parallel counterpart of {@link transform} (Node only). Fans the per-bit WASM\n * compute across a `worker_threads` pool (`options.workers`, default `4`),\n * while `preHook`/`postHook` still run on the calling thread. Output is\n * identical to {@link transform}; this trades startup cost for throughput on\n * large documents.\n *\n * @returns A Promise of the transformed document, or an `error:`-prefixed\n * string on failure.\n */\nexport function transformParallel(input: string, options: TransformOptions = {}): Promise<string> {\n return runParallelTransform(wasm as unknown as HookedWasm, input, options);\n}\n\n/**\n * Breakscape text (escape bitmark special characters).\n *\n * @param input - The text to breakscape.\n * @param options - Breakscape options (e.g. `{ format: \"plainText\", location: \"tag\" }`).\n * @returns Breakscaped text.\n */\nexport function breakscapeText(input: string, options: BreakscapeOptions = {}): string {\n const format = options.format ?? \"bitmark++\";\n const location = options.location ?? \"body\";\n return wasm.breakscape_text(input, format, location);\n}\n\n/**\n * Unbreakscape text (unescape bitmark special characters).\n *\n * @param input - The text to unbreakscape.\n * @param options - Unbreakscape options (e.g. `{ format: \"plainText\", location: \"tag\" }`).\n * @returns Unbreakscaped text.\n */\nexport function unbreakscapeText(input: string, options: BreakscapeOptions = {}): string {\n const format = options.format ?? \"bitmark++\";\n const location = options.location ?? \"body\";\n return wasm.unbreakscape_text(input, format, location);\n}\n\n/**\n * Query information about supported bit types.\n *\n * @param options - Info options (e.g. `{ infoType: \"bit\", format: \"json\", bit: \"cloze\" }`).\n * @returns Information string.\n */\nexport function info(options: InfoOptions = {}): string {\n const infoType = options.infoType ?? \"list\";\n const format = options.format ?? \"text\";\n const bit = options.bit ?? \"\";\n const pretty = options.pretty ?? false;\n const indent = options.indent ?? 2;\n return wasm.info(infoType, format, bit, pretty, indent);\n}\n\n/**\n * Generate bitmark text from a JSON AST.\n *\n * The reverse pipeline: `JSON → json_to_ast → AST → ast_to_bitmark`.\n *\n * @param input - JSON string of the parsed bit entries (forward output shape).\n * @param options - Generate options (e.g. `{ mode: \"full\" }`).\n * @returns Bitmark text. On failure, an `error:`-prefixed string.\n */\nexport function generate(input: string, options: ParseOptions = {}): string {\n return wasm.convert(input, \"json\", \"bitmark\", options.mode ?? \"optimized\", false, 2, 1);\n}\n","// @zen-component: CLI-SharedIO\n//! Shared I/O utilities for the TS CLI.\n\nimport { readFileSync, writeFileSync, appendFileSync, existsSync, mkdirSync } from \"node:fs\";\nimport { dirname } from \"node:path\";\n\n/**\n * Resolve multiple inputs into a single concatenated string.\n *\n * If the array is empty, reads from stdin.\n * Multiple inputs are concatenated with `\\n` — valid for bitmark\n * because bits are `\\n`-delimited.\n */\nexport function readInputs(inputs: string[]): string {\n if (inputs.length === 0) {\n return readStdin();\n }\n if (inputs.length === 1) {\n return readSingle(inputs[0]);\n }\n return inputs.map(readSingle).join(\"\\n\");\n}\n\n/**\n * Resolve a single input string (file path or literal).\n */\nfunction readSingle(input: string): string {\n if (existsSync(input)) {\n return readFileSync(input, \"utf-8\");\n }\n return input;\n}\n\n/**\n * Read all of stdin synchronously.\n */\nfunction readStdin(): string {\n const buf = readFileSync(0, \"utf-8\") as string;\n if (!buf) {\n console.error(\"No input provided. Pass a file path, literal string, or pipe via stdin.\");\n process.exit(1);\n }\n return buf;\n}\n\n/**\n * Write output to stdout or a file.\n *\n * - If `outputPath` is undefined → write to stdout\n * - If `append` is true → append to file\n * - Otherwise → overwrite file\n */\nexport function writeOutput(content: string, outputPath: string | undefined, append: boolean): void {\n if (outputPath === undefined) {\n process.stdout.write(content);\n return;\n }\n\n // Ensure parent directory exists\n const dir = dirname(outputPath);\n if (dir && !existsSync(dir)) {\n mkdirSync(dir, { recursive: true });\n }\n\n if (append) {\n appendFileSync(outputPath, content, \"utf-8\");\n } else {\n writeFileSync(outputPath, content, \"utf-8\");\n }\n}\n","// @zen-component: WASM-TSBindings\n\nimport type { Command } from \"commander\";\nimport { lex, parse } from \"../index.js\";\nimport { readInputs, writeOutput } from \"../utils/io.js\";\n\nexport function registerParseCommand(program: Command): void {\n program\n .command(\"parse\")\n .description(\"Parse a bitmark file to JSON\")\n .argument(\"[INPUT...]\", \"Input: bitmark files, literal strings, or omit for stdin\")\n .option(\"-o, --output <file>\", \"Output file (default: stdout)\")\n .option(\"-a, --append\", \"Append to output file\", false)\n .option(\"--stage <STAGE>\", \"Stage to run: all, lex\", \"all\")\n .option(\"--mode <MODE>\", \"JSON output mode: optimized or full\", \"optimized\")\n .option(\"-p, --pretty\", \"Prettify JSON output\", false)\n .option(\"--indent <SIZE>\", \"Indent size for pretty JSON\", \"2\")\n .action((inputs: string[], options: { output?: string; append: boolean; stage: string; mode: string; pretty: boolean; indent: string }) => {\n const content = readInputs(inputs);\n let result: string;\n\n if (options.stage === \"lex\") {\n result = lex(content, { stage: options.stage });\n } else {\n result = parse(content, { mode: options.mode as \"optimized\" | \"full\" });\n }\n\n if (options.pretty && options.stage === \"all\") {\n result = JSON.stringify(JSON.parse(result), null, Number(options.indent));\n }\n\n writeOutput(result, options.output, options.append);\n });\n}\n","// @zen-component: WASM-TSBindings\n\nimport type { Command } from \"commander\";\nimport { generate } from \"../index.js\";\nimport { readInputs, writeOutput } from \"../utils/io.js\";\n\nexport function registerGenerateCommand(program: Command): void {\n program\n .command(\"generate\")\n .description(\"Generate bitmark text from JSON\")\n .argument(\"[INPUT...]\", \"Input: JSON files, literal strings, or omit for stdin\")\n .option(\"-o, --output <file>\", \"Output file (default: stdout)\")\n .option(\"-a, --append\", \"Append to output file\", false)\n .option(\"--mode <MODE>\", \"Output mode: optimized or full\", \"optimized\")\n .action((inputs: string[], options: { output?: string; append: boolean; mode: string }) => {\n const content = readInputs(inputs);\n const result = generate(content, { mode: options.mode as \"optimized\" | \"full\" });\n writeOutput(result, options.output, options.append);\n });\n}\n","// @zen-component: CLI-Convert\n\nimport type { Command } from \"commander\";\nimport { convert } from \"../index.js\";\nimport { readInputs, writeOutput } from \"../utils/io.js\";\n\nexport function registerConvertCommand(program: Command): void {\n program\n .command(\"convert\")\n .description(\"Auto-detect input format and convert between bitmark and JSON\")\n .argument(\"[INPUT...]\", \"Input: file paths, bitmark/JSON strings, or omit for stdin\")\n .option(\"-o, --output <file>\", \"Output file (default: stdout)\")\n .option(\"-a, --append\", \"Append to output file\", false)\n .option(\"-w, --warnings\", \"Enable validation warnings in output\", false)\n .option(\"-p, --pretty\", \"Prettify JSON output\", false)\n .option(\"--indent <n>\", \"Indent size for pretty JSON\", \"2\")\n .option(\"--mode <MODE>\", \"JSON output mode: optimized or full\", \"optimized\")\n .option(\"--input-format <FMT>\", \"Input format: auto, bitmark, or json\", \"auto\")\n .option(\"--output-format <FMT>\", \"Output format: auto, bitmark, or json\", \"auto\")\n .option(\"--plain-text\", \"Output text as plain text (debug)\", false)\n .action(\n (\n inputs: string[],\n options: {\n output?: string;\n append: boolean;\n warnings: boolean;\n pretty: boolean;\n indent: string;\n mode: string;\n inputFormat: string;\n outputFormat: string;\n plainText: boolean;\n },\n ) => {\n const content = readInputs(inputs);\n const result = convert(content, {\n inputFormat: options.inputFormat as \"auto\" | \"bitmark\" | \"json\",\n outputFormat: options.outputFormat as \"auto\" | \"bitmark\" | \"json\",\n mode: options.mode as \"optimized\" | \"full\",\n warnings: options.warnings,\n plainText: options.plainText,\n pretty: options.pretty,\n indent: parseInt(options.indent, 10),\n });\n writeOutput(result, options.output, options.append);\n },\n );\n}\n","// @zen-component: CLI-Normalize\n\nimport type { Command } from \"commander\";\nimport { canonicalize, fullize, optimize } from \"../index.js\";\nimport { readInputs, writeOutput } from \"../utils/io.js\";\n\ninterface NormalizeCliOptions {\n output?: string;\n append: boolean;\n pretty: boolean;\n indent: string;\n mode: string;\n spacesAroundValues: string;\n}\n\n/** Register `optimize`, `fullize` (alias `expand`), and `canonicalize`. */\nexport function registerNormalizeCommands(program: Command): void {\n const common = (cmd: ReturnType<Command[\"command\"]>) =>\n cmd\n .argument(\"[INPUT...]\", \"Input: file paths, bitmark/JSON strings, or omit for stdin\")\n .option(\"-o, --output <file>\", \"Output file (default: stdout)\")\n .option(\"-a, --append\", \"Append to output file\", false)\n .option(\"-p, --pretty\", \"Prettify JSON output\", false)\n .option(\"--indent <n>\", \"Indent size for pretty JSON\", \"2\")\n .option(\"--spacesAroundValues <n>\", \"Spaces around bitmark tag values (0-10)\", \"1\");\n\n common(program.command(\"optimize\").description(\"Re-emit input in its own format at optimized mode\")).action(\n (inputs: string[], options: NormalizeCliOptions) => {\n const out = optimize(readInputs(inputs), {\n pretty: options.pretty,\n indent: parseInt(options.indent, 10),\n });\n writeOutput(out, options.output, options.append);\n },\n );\n\n common(\n program\n .command(\"fullize\")\n .alias(\"expand\")\n .description(\"Re-emit input in its own format at full mode (all keys)\"),\n ).action((inputs: string[], options: NormalizeCliOptions) => {\n const out = fullize(readInputs(inputs), {\n pretty: options.pretty,\n indent: parseInt(options.indent, 10),\n });\n writeOutput(out, options.output, options.append);\n });\n\n common(\n program\n .command(\"canonicalize\")\n .description(\"Re-emit input in its own format in canonical form\")\n .option(\"--mode <MODE>\", \"Output mode: optimized or full\", \"optimized\"),\n ).action((inputs: string[], options: NormalizeCliOptions) => {\n const out = canonicalize(readInputs(inputs), {\n mode: options.mode as \"optimized\" | \"full\",\n pretty: options.pretty,\n indent: parseInt(options.indent, 10),\n spacesAroundValues: parseInt(options.spacesAroundValues, 10),\n });\n writeOutput(out, options.output, options.append);\n });\n}\n","// @zen-component: CLI-Transform\n\nimport { readFileSync } from \"node:fs\";\nimport type { Command } from \"commander\";\nimport { transform } from \"../index.js\";\nimport { readInputs, writeOutput } from \"../utils/io.js\";\n\n/**\n * Register the `transform` command (alias `patch`): apply a static patch file\n * to every bit and re-emit. Programmatic per-bit JS hooks are a library-only\n * feature; the CLI exposes only the static-patch path.\n */\nexport function registerTransformCommand(program: Command): void {\n program\n .command(\"transform\")\n .alias(\"patch\")\n .description(\"Apply path patches to each bit (per-bit transform)\")\n .argument(\"[INPUT...]\", \"Input: file paths, bitmark/JSON strings, or omit for stdin\")\n .option(\"-o, --output <file>\", \"Output file (default: stdout)\")\n .option(\"-a, --append\", \"Append to output file\", false)\n .option(\"--patch <file>\", \"Patch file: a JSON array of patch entries\")\n .option(\"--input-format <FMT>\", \"Input format: auto, bitmark, or json\", \"auto\")\n .option(\"--output-format <FMT>\", \"Output format: bitmark or json\", \"json\")\n .option(\"--mode <MODE>\", \"Output mode: optimized or full\", \"optimized\")\n .option(\"-p, --pretty\", \"Prettify JSON output\", false)\n .option(\"--indent <n>\", \"Indent size for pretty JSON\", \"2\")\n .option(\"--spacesAroundValues <n>\", \"Spaces around bitmark tag values (0-10)\", \"1\")\n .action(\n (\n inputs: string[],\n options: {\n output?: string;\n append: boolean;\n patch?: string;\n inputFormat: string;\n outputFormat: string;\n mode: string;\n pretty: boolean;\n indent: string;\n spacesAroundValues: string;\n },\n ) => {\n const content = readInputs(inputs);\n const patch = options.patch ? readFileSync(options.patch, \"utf8\") : undefined;\n const out = transform(content, {\n patch,\n inputFormat: options.inputFormat as \"auto\" | \"bitmark\" | \"json\",\n outputFormat: options.outputFormat as \"bitmark\" | \"json\",\n mode: options.mode as \"optimized\" | \"full\",\n pretty: options.pretty,\n indent: parseInt(options.indent, 10),\n spacesAroundValues: parseInt(options.spacesAroundValues, 10),\n });\n writeOutput(out, options.output, options.append);\n },\n );\n}\n","// @zen-component: CLI-Breakscape\n\nimport type { Command } from \"commander\";\nimport { breakscapeText } from \"../index.js\";\nimport { readInputs, writeOutput } from \"../utils/io.js\";\n\nexport function registerBreakscapeCommand(program: Command): void {\n program\n .command(\"breakscape\")\n .description(\"Breakscape text (escape bitmark special characters)\")\n .argument(\"[INPUT...]\", \"Input: file paths, text strings, or omit for stdin\")\n .option(\"-o, --output <file>\", \"Output file (default: stdout)\")\n .option(\"-a, --append\", \"Append to output file\", false)\n .option(\"--format <FORMAT>\", \"Text format: bitmark++ or plainText\", \"bitmark++\")\n .option(\"--location <LOCATION>\", \"Text location: body or tag\", \"body\")\n .action((inputs: string[], options: { output?: string; append: boolean; format: string; location: string }) => {\n const content = readInputs(inputs);\n const result = breakscapeText(content, {\n format: options.format as \"bitmark++\" | \"plainText\",\n location: options.location as \"body\" | \"tag\",\n });\n writeOutput(result, options.output, options.append);\n });\n}\n","// @zen-component: CLI-Breakscape\n\nimport type { Command } from \"commander\";\nimport { unbreakscapeText } from \"../index.js\";\nimport { readInputs, writeOutput } from \"../utils/io.js\";\n\nexport function registerUnbreakscapeCommand(program: Command): void {\n program\n .command(\"unbreakscape\")\n .description(\"Unbreakscape text (unescape bitmark special characters)\")\n .argument(\"[INPUT...]\", \"Input: file paths, text strings, or omit for stdin\")\n .option(\"-o, --output <file>\", \"Output file (default: stdout)\")\n .option(\"-a, --append\", \"Append to output file\", false)\n .option(\"--format <FORMAT>\", \"Text format: bitmark++ or plainText\", \"bitmark++\")\n .option(\"--location <LOCATION>\", \"Text location: body or tag\", \"body\")\n .action((inputs: string[], options: { output?: string; append: boolean; format: string; location: string }) => {\n const content = readInputs(inputs);\n const result = unbreakscapeText(content, {\n format: options.format as \"bitmark++\" | \"plainText\",\n location: options.location as \"body\" | \"tag\",\n });\n writeOutput(result, options.output, options.append);\n });\n}\n","// @zen-component: CLI-Info\n\nimport type { Command } from \"commander\";\nimport { info } from \"../index.js\";\nimport { writeOutput } from \"../utils/io.js\";\n\nexport function registerInfoCommand(program: Command): void {\n program\n .command(\"info\")\n .description(\"Show information about supported bit types\")\n .argument(\"[INFO]\", \"Info type: list, bit, all, deprecated\", \"list\")\n .option(\"-f, --format <FORMAT>\", \"Output format: text or json\", \"text\")\n .option(\"--all\", \"Include deprecated bits\", false)\n .option(\"--bit <NAME>\", \"Filter to specific bit type\")\n .option(\"--deprecated\", \"Show only deprecated bits\", false)\n .option(\"-o, --output <file>\", \"Output file (default: stdout)\")\n .option(\"-a, --append\", \"Append to output file\", false)\n .option(\"-p, --pretty\", \"Prettify JSON output\", false)\n .option(\"--indent <n>\", \"Indent size for pretty JSON\", \"2\")\n .action(\n (\n infoType: string,\n options: {\n format: string;\n all: boolean;\n bit?: string;\n deprecated: boolean;\n output?: string;\n append: boolean;\n pretty: boolean;\n indent: string;\n },\n ) => {\n const result = info({\n infoType: infoType as \"list\" | \"bit\" | \"all\" | \"deprecated\",\n format: options.format as \"text\" | \"json\",\n bit: options.bit,\n pretty: options.pretty,\n indent: parseInt(options.indent, 10),\n });\n writeOutput(result, options.output, options.append);\n },\n );\n}\n","#!/usr/bin/env node\n// @zen-component: WASM-TSBindings\n\nimport { Command } from \"commander\";\nimport { PACKAGE_INFO } from \"./generated/package_info.js\";\nimport { registerParseCommand } from \"./commands/parse.js\";\nimport { registerGenerateCommand } from \"./commands/generate.js\";\nimport { registerConvertCommand } from \"./commands/convert.js\";\nimport { registerNormalizeCommands } from \"./commands/normalize.js\";\nimport { registerTransformCommand } from \"./commands/transform.js\";\nimport { registerBreakscapeCommand } from \"./commands/breakscape.js\";\nimport { registerUnbreakscapeCommand } from \"./commands/unbreakscape.js\";\nimport { registerInfoCommand } from \"./commands/info.js\";\n\nconst program = new Command();\n\nprogram.name(\"bitmark-parser\").description(\"Parse and generate bitmark text\").version(PACKAGE_INFO.version);\n\nregisterParseCommand(program);\nregisterGenerateCommand(program);\nregisterConvertCommand(program);\nregisterNormalizeCommands(program);\nregisterTransformCommand(program);\nregisterBreakscapeCommand(program);\nregisterUnbreakscapeCommand(program);\nregisterInfoCommand(program);\n\nprogram.parse();\n"]}
|