@flux-lang/core 0.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.
Files changed (53) hide show
  1. package/dist/args.d.ts +18 -0
  2. package/dist/args.d.ts.map +1 -0
  3. package/dist/args.js +60 -0
  4. package/dist/args.js.map +1 -0
  5. package/dist/ast.d.ts +194 -0
  6. package/dist/ast.d.ts.map +1 -0
  7. package/dist/ast.js +3 -0
  8. package/dist/ast.js.map +1 -0
  9. package/dist/bin/flux.d.ts +2 -0
  10. package/dist/bin/flux.d.ts.map +1 -0
  11. package/dist/bin/flux.js +157 -0
  12. package/dist/bin/flux.js.map +1 -0
  13. package/dist/checks.d.ts +12 -0
  14. package/dist/checks.d.ts.map +1 -0
  15. package/dist/checks.js +98 -0
  16. package/dist/checks.js.map +1 -0
  17. package/dist/commands/check.d.ts +2 -0
  18. package/dist/commands/check.d.ts.map +1 -0
  19. package/dist/commands/check.js +118 -0
  20. package/dist/commands/check.js.map +1 -0
  21. package/dist/commands/repl.d.ts +2 -0
  22. package/dist/commands/repl.d.ts.map +1 -0
  23. package/dist/commands/repl.js +37 -0
  24. package/dist/commands/repl.js.map +1 -0
  25. package/dist/fs-utils.d.ts +4 -0
  26. package/dist/fs-utils.d.ts.map +1 -0
  27. package/dist/fs-utils.js +34 -0
  28. package/dist/fs-utils.js.map +1 -0
  29. package/dist/index.d.ts +6 -0
  30. package/dist/index.d.ts.map +1 -0
  31. package/dist/index.js +11 -0
  32. package/dist/index.js.map +1 -0
  33. package/dist/parse.d.ts +2 -0
  34. package/dist/parse.d.ts.map +1 -0
  35. package/dist/parse.js +107 -0
  36. package/dist/parse.js.map +1 -0
  37. package/dist/parser.d.ts +3 -0
  38. package/dist/parser.d.ts.map +1 -0
  39. package/dist/parser.js +1452 -0
  40. package/dist/parser.js.map +1 -0
  41. package/dist/runtime/kernel.d.ts +20 -0
  42. package/dist/runtime/kernel.d.ts.map +1 -0
  43. package/dist/runtime/kernel.js +356 -0
  44. package/dist/runtime/kernel.js.map +1 -0
  45. package/dist/runtime/model.d.ts +146 -0
  46. package/dist/runtime/model.d.ts.map +1 -0
  47. package/dist/runtime/model.js +3 -0
  48. package/dist/runtime/model.js.map +1 -0
  49. package/dist/version.d.ts +2 -0
  50. package/dist/version.d.ts.map +1 -0
  51. package/dist/version.js +3 -0
  52. package/dist/version.js.map +1 -0
  53. package/package.json +33 -0
@@ -0,0 +1,118 @@
1
+ // packages/cli/src/commands/check.ts
2
+ import { parseArgs } from "../args.js";
3
+ import { collectFluxFiles, readFileText } from "../fs-utils.js";
4
+ import { parseDocument } from "@flux-lang/core"; // adjust path if needed
5
+ export async function runCheckCommand(argv) {
6
+ const { flags, positional } = parseArgs(argv);
7
+ const options = {
8
+ quiet: Boolean(flags.q || flags.quiet),
9
+ json: Boolean(flags.json),
10
+ maxErrors: typeof flags["max-errors"] === "number" ? flags["max-errors"] : undefined,
11
+ recursive: !Boolean(flags["no-recursive"]),
12
+ stdin: Boolean(flags.stdin),
13
+ };
14
+ const diags = [];
15
+ if (options.stdin) {
16
+ const src = await readAllStdin();
17
+ collectDiagnostics("<stdin>", src, diags, options);
18
+ }
19
+ else {
20
+ const roots = positional.length > 0 ? positional : ["."];
21
+ for (const root of roots) {
22
+ const files = collectFluxFiles(root, options.recursive);
23
+ for (const file of files) {
24
+ const src = readFileText(file);
25
+ collectDiagnostics(file, src, diags, options);
26
+ if (options.maxErrors && diags.length >= options.maxErrors) {
27
+ break;
28
+ }
29
+ }
30
+ if (options.maxErrors && diags.length >= options.maxErrors) {
31
+ break;
32
+ }
33
+ }
34
+ }
35
+ if (options.json) {
36
+ process.stdout.write(JSON.stringify(diags, null, 2) + "\n");
37
+ }
38
+ else if (!options.quiet) {
39
+ for (const d of diags) {
40
+ const loc = d.line != null && d.column != null ? `${d.file}:${d.line}:${d.column}` : d.file;
41
+ console.error(`${loc} [${d.severity.toUpperCase()} ${d.code}] ${d.message}`);
42
+ }
43
+ if (diags.length === 0) {
44
+ console.log("flux check: no issues found.");
45
+ }
46
+ }
47
+ if (diags.some((d) => d.severity === "error")) {
48
+ process.exitCode = 1;
49
+ }
50
+ }
51
+ async function readAllStdin() {
52
+ return new Promise((resolve, reject) => {
53
+ let data = "";
54
+ process.stdin.setEncoding("utf8");
55
+ process.stdin.on("data", (chunk) => (data += chunk));
56
+ process.stdin.on("end", () => resolve(data));
57
+ process.stdin.on("error", (err) => reject(err));
58
+ });
59
+ }
60
+ function collectDiagnostics(file, src, diags, opts) {
61
+ try {
62
+ const doc = parseDocument(src);
63
+ // Minimal static checks, "as robust as possible for this spec" without overreaching.
64
+ // 1. meta.version should be "0.1.0"
65
+ if (!doc.meta?.version) {
66
+ diags.push({
67
+ file,
68
+ severity: "warning",
69
+ code: "W_META_VERSION_MISSING",
70
+ message: "meta.version is missing; expected '0.1.0' for v0.1 documents.",
71
+ });
72
+ }
73
+ else if (doc.meta.version !== "0.1.0") {
74
+ diags.push({
75
+ file,
76
+ severity: "warning",
77
+ code: "W_META_VERSION_MISMATCH",
78
+ message: `meta.version is '${doc.meta.version}', expected '0.1.0' for v0.1 documents.`,
79
+ });
80
+ }
81
+ // 2. docstep rules should have a docstep param if you want to enforce that.
82
+ const hasDocstepParam = doc.state.params?.some((p) => p.name === "docstep" && p.type === "int") ?? false;
83
+ const hasDocstepRules = doc.rules?.some((r) => r.mode === "docstep") ?? false;
84
+ if (hasDocstepRules && !hasDocstepParam) {
85
+ diags.push({
86
+ file,
87
+ severity: "warning",
88
+ code: "W_DOCSTEP_PARAM_MISSING",
89
+ message: "Document defines docstep rules but no 'docstep : int [...]' param was found in state.",
90
+ });
91
+ }
92
+ // (Many of the other invariants are already enforced at parse-time.)
93
+ }
94
+ catch (err) {
95
+ const e = err;
96
+ const { line, column } = extractLocationFromMessage(e.message);
97
+ diags.push({
98
+ file,
99
+ line,
100
+ column,
101
+ severity: "error",
102
+ code: "E_PARSE",
103
+ message: e.message,
104
+ });
105
+ }
106
+ }
107
+ function extractLocationFromMessage(message) {
108
+ // Parser error format:
109
+ // "Parse error at 33:40 near '{': Expected expression"
110
+ const match = /at\s+(\d+):(\d+)/.exec(message);
111
+ if (!match)
112
+ return {};
113
+ return {
114
+ line: Number(match[1]),
115
+ column: Number(match[2]),
116
+ };
117
+ }
118
+ //# sourceMappingURL=check.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"check.js","sourceRoot":"","sources":["../../src/commands/check.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export declare function runRepl(): Promise<void>;
2
+ //# sourceMappingURL=repl.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"repl.d.ts","sourceRoot":"","sources":["../../src/commands/repl.ts"],"names":[],"mappings":"AAGA,wBAAsB,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC,CA0B7C"}
@@ -0,0 +1,37 @@
1
+ // packages/cli/src/commands/repl.ts
2
+ import { parseDocument } from "@flux-lang/core";
3
+ export async function runRepl() {
4
+ // For v0.1, this is a single-shot "paste and parse" mode.
5
+ // Later you can make it interactive line-by-line if you want.
6
+ const src = await readAllStdin();
7
+ if (!src.trim()) {
8
+ console.error("flux repl: no input received on stdin.");
9
+ return;
10
+ }
11
+ try {
12
+ const doc = parseDocument(src);
13
+ console.log("Parse succeeded.");
14
+ const title = doc.meta?.title ?? "<unnamed>";
15
+ const rules = doc.rules?.length ?? 0;
16
+ const grids = doc.grids?.length ?? 0;
17
+ console.log(` title : ${JSON.stringify(title)}`);
18
+ console.log(` grids : ${grids}`);
19
+ console.log(` rules : ${rules}`);
20
+ // Optional: pretty-print IR
21
+ console.log("\nIR:");
22
+ console.log(JSON.stringify(doc, null, 2));
23
+ }
24
+ catch (err) {
25
+ console.error(`flux repl: parse error: ${err.message}`);
26
+ }
27
+ }
28
+ async function readAllStdin() {
29
+ return new Promise((resolve, reject) => {
30
+ let data = "";
31
+ process.stdin.setEncoding("utf8");
32
+ process.stdin.on("data", (chunk) => (data += chunk));
33
+ process.stdin.on("end", () => resolve(data));
34
+ process.stdin.on("error", (err) => reject(err));
35
+ });
36
+ }
37
+ //# sourceMappingURL=repl.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"repl.js","sourceRoot":"","sources":["../../src/commands/repl.ts"],"names":[],"mappings":"AAAA,oCAAoC;AACpC,OAAO,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAC;AAEhD,MAAM,CAAC,KAAK,UAAU,OAAO;IAC3B,0DAA0D;IAC1D,8DAA8D;IAC9D,MAAM,GAAG,GAAG,MAAM,YAAY,EAAE,CAAC;IAEjC,IAAI,CAAC,GAAG,CAAC,IAAI,EAAE,EAAE,CAAC;QAChB,OAAO,CAAC,KAAK,CAAC,wCAAwC,CAAC,CAAC;QACxD,OAAO;IACT,CAAC;IAED,IAAI,CAAC;QACH,MAAM,GAAG,GAAG,aAAa,CAAC,GAAG,CAAC,CAAC;QAC/B,OAAO,CAAC,GAAG,CAAC,kBAAkB,CAAC,CAAC;QAChC,MAAM,KAAK,GAAG,GAAG,CAAC,IAAI,EAAE,KAAK,IAAI,WAAW,CAAC;QAC7C,MAAM,KAAK,GAAG,GAAG,CAAC,KAAK,EAAE,MAAM,IAAI,CAAC,CAAC;QACrC,MAAM,KAAK,GAAG,GAAG,CAAC,KAAK,EAAE,MAAM,IAAI,CAAC,CAAC;QACrC,OAAO,CAAC,GAAG,CAAC,aAAa,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;QAClD,OAAO,CAAC,GAAG,CAAC,aAAa,KAAK,EAAE,CAAC,CAAC;QAClC,OAAO,CAAC,GAAG,CAAC,aAAa,KAAK,EAAE,CAAC,CAAC;QAElC,4BAA4B;QAC5B,OAAO,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;QACrB,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,GAAG,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC;IAC5C,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,OAAO,CAAC,KAAK,CAAC,2BAA4B,GAAa,CAAC,OAAO,EAAE,CAAC,CAAC;IACrE,CAAC;AACH,CAAC;AAED,KAAK,UAAU,YAAY;IACzB,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;QACrC,IAAI,IAAI,GAAG,EAAE,CAAC;QACd,OAAO,CAAC,KAAK,CAAC,WAAW,CAAC,MAAM,CAAC,CAAC;QAClC,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC,MAAM,EAAE,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC,IAAI,IAAI,KAAK,CAAC,CAAC,CAAC;QACrD,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC,KAAK,EAAE,GAAG,EAAE,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC;QAC7C,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC,OAAO,EAAE,CAAC,GAAG,EAAE,EAAE,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC;IAClD,CAAC,CAAC,CAAC;AACL,CAAC"}
@@ -0,0 +1,4 @@
1
+ export declare function readFileText(filePath: string): string;
2
+ export declare function writeFileText(filePath: string, text: string): void;
3
+ export declare function collectFluxFiles(root: string, recursive?: boolean): string[];
4
+ //# sourceMappingURL=fs-utils.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"fs-utils.d.ts","sourceRoot":"","sources":["../src/fs-utils.ts"],"names":[],"mappings":"AAIA,wBAAgB,YAAY,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM,CAErD;AAED,wBAAgB,aAAa,CAAC,QAAQ,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,IAAI,CAElE;AAED,wBAAgB,gBAAgB,CAC9B,IAAI,EAAE,MAAM,EACZ,SAAS,UAAO,GACf,MAAM,EAAE,CAuBV"}
@@ -0,0 +1,34 @@
1
+ // packages/cli/src/fs-utils.ts
2
+ import fs from "node:fs";
3
+ import path from "node:path";
4
+ export function readFileText(filePath) {
5
+ return fs.readFileSync(filePath, "utf8");
6
+ }
7
+ export function writeFileText(filePath, text) {
8
+ fs.writeFileSync(filePath, text, "utf8");
9
+ }
10
+ export function collectFluxFiles(root, recursive = true) {
11
+ const result = [];
12
+ function walk(dir) {
13
+ const entries = fs.readdirSync(dir, { withFileTypes: true });
14
+ for (const entry of entries) {
15
+ const full = path.join(dir, entry.name);
16
+ if (entry.isDirectory()) {
17
+ if (recursive)
18
+ walk(full);
19
+ }
20
+ else if (entry.isFile() && full.endsWith(".flux")) {
21
+ result.push(full);
22
+ }
23
+ }
24
+ }
25
+ const stat = fs.statSync(root);
26
+ if (stat.isDirectory()) {
27
+ walk(root);
28
+ }
29
+ else if (stat.isFile() && root.endsWith(".flux")) {
30
+ result.push(root);
31
+ }
32
+ return result;
33
+ }
34
+ //# sourceMappingURL=fs-utils.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"fs-utils.js","sourceRoot":"","sources":["../src/fs-utils.ts"],"names":[],"mappings":"AAAA,+BAA+B;AAC/B,OAAO,EAAE,MAAM,SAAS,CAAC;AACzB,OAAO,IAAI,MAAM,WAAW,CAAC;AAE7B,MAAM,UAAU,YAAY,CAAC,QAAgB;IAC3C,OAAO,EAAE,CAAC,YAAY,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAC;AAC3C,CAAC;AAED,MAAM,UAAU,aAAa,CAAC,QAAgB,EAAE,IAAY;IAC1D,EAAE,CAAC,aAAa,CAAC,QAAQ,EAAE,IAAI,EAAE,MAAM,CAAC,CAAC;AAC3C,CAAC;AAED,MAAM,UAAU,gBAAgB,CAC9B,IAAY,EACZ,SAAS,GAAG,IAAI;IAEhB,MAAM,MAAM,GAAa,EAAE,CAAC;IAE5B,SAAS,IAAI,CAAC,GAAW;QACvB,MAAM,OAAO,GAAG,EAAE,CAAC,WAAW,CAAC,GAAG,EAAE,EAAE,aAAa,EAAE,IAAI,EAAE,CAAC,CAAC;QAC7D,KAAK,MAAM,KAAK,IAAI,OAAO,EAAE,CAAC;YAC5B,MAAM,IAAI,GAAG,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,CAAC,CAAC;YACxC,IAAI,KAAK,CAAC,WAAW,EAAE,EAAE,CAAC;gBACxB,IAAI,SAAS;oBAAE,IAAI,CAAC,IAAI,CAAC,CAAC;YAC5B,CAAC;iBAAM,IAAI,KAAK,CAAC,MAAM,EAAE,IAAI,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC,EAAE,CAAC;gBACpD,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YACpB,CAAC;QACH,CAAC;IACH,CAAC;IAED,MAAM,IAAI,GAAG,EAAE,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC;IAC/B,IAAI,IAAI,CAAC,WAAW,EAAE,EAAE,CAAC;QACvB,IAAI,CAAC,IAAI,CAAC,CAAC;IACb,CAAC;SAAM,IAAI,IAAI,CAAC,MAAM,EAAE,IAAI,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC,EAAE,CAAC;QACnD,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IACpB,CAAC;IAED,OAAO,MAAM,CAAC;AAChB,CAAC"}
@@ -0,0 +1,6 @@
1
+ export * from "./ast.js";
2
+ export { parseDocument } from "./parser.js";
3
+ export type { RuntimeState, GridRuntimeState, RuntimeCellState, NeighborRef, NeighborsNamespace, } from "./runtime/model.js";
4
+ export { initRuntimeState, runDocstepOnce, handleEvent } from "./runtime/kernel.js";
5
+ export { checkDocument } from "./checks.js";
6
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAIA,cAAc,UAAU,CAAC;AAGzB,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAG5C,YAAY,EACR,YAAY,EACZ,gBAAgB,EAChB,gBAAgB,EAChB,WAAW,EACX,kBAAkB,GACrB,MAAM,oBAAoB,CAAC;AAG5B,OAAO,EAAE,gBAAgB,EAAE,cAAc,EAAE,WAAW,EAAE,MAAM,qBAAqB,CAAC;AAGpF,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC"}
package/dist/index.js ADDED
@@ -0,0 +1,11 @@
1
+ // packages/core/src/index.ts
2
+ // Public surface for @flux-lang/core
3
+ // AST / IR types
4
+ export * from "./ast.js";
5
+ // Parser
6
+ export { parseDocument } from "./parser.js";
7
+ // Runtime kernel entry points
8
+ export { initRuntimeState, runDocstepOnce, handleEvent } from "./runtime/kernel.js";
9
+ // Static checks
10
+ export { checkDocument } from "./checks.js";
11
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,6BAA6B;AAC7B,qCAAqC;AAErC,iBAAiB;AACjB,cAAc,UAAU,CAAC;AAEzB,SAAS;AACT,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAW5C,8BAA8B;AAC9B,OAAO,EAAE,gBAAgB,EAAE,cAAc,EAAE,WAAW,EAAE,MAAM,qBAAqB,CAAC;AAEpF,gBAAgB;AAChB,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC"}
@@ -0,0 +1,2 @@
1
+ export declare function runParseCommand(argv: string[]): Promise<void>;
2
+ //# sourceMappingURL=parse.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"parse.d.ts","sourceRoot":"","sources":["../src/parse.ts"],"names":[],"mappings":"AAoBA,wBAAsB,eAAe,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CA8DnE"}
package/dist/parse.js ADDED
@@ -0,0 +1,107 @@
1
+ import path from "node:path";
2
+ import { parseArgs } from "../args.js";
3
+ import { readFileText, writeFileText } from "../fs-utils.js";
4
+ import { parseDocument } from "@flux-lang/core"; // adjust path if needed
5
+ export async function runParseCommand(argv) {
6
+ const { flags, positional } = parseArgs(argv);
7
+ const options = {
8
+ outputPath: flags.o ?? flags.output ?? undefined,
9
+ compact: Boolean(flags.compact),
10
+ ndjson: Boolean(flags.ndjson),
11
+ summary: Boolean(flags.summary),
12
+ stdin: Boolean(flags.stdin),
13
+ };
14
+ const outputs = [];
15
+ let hadError = false;
16
+ if (options.stdin) {
17
+ const src = await readAllStdin();
18
+ try {
19
+ const doc = parseDocument(src);
20
+ outputs.push({ file: "<stdin>", doc });
21
+ }
22
+ catch (err) {
23
+ hadError = true;
24
+ printParseError("<stdin>", err);
25
+ }
26
+ }
27
+ else {
28
+ if (positional.length === 0) {
29
+ console.error("flux parse: expected at least one <file> or --stdin");
30
+ process.exitCode = 1;
31
+ return;
32
+ }
33
+ for (const file of positional) {
34
+ let src;
35
+ try {
36
+ src = readFileText(file);
37
+ }
38
+ catch (err) {
39
+ hadError = true;
40
+ console.error(`flux parse: failed to read ${file}: ${err.message}`);
41
+ continue;
42
+ }
43
+ try {
44
+ const doc = parseDocument(src);
45
+ outputs.push({ file: path.resolve(file), doc });
46
+ }
47
+ catch (err) {
48
+ hadError = true;
49
+ printParseError(file, err);
50
+ }
51
+ }
52
+ }
53
+ if (outputs.length > 0) {
54
+ const json = formatOutput(outputs, options);
55
+ if (options.outputPath) {
56
+ writeFileText(options.outputPath, json);
57
+ }
58
+ else {
59
+ process.stdout.write(json + "\n");
60
+ }
61
+ }
62
+ if (hadError) {
63
+ process.exitCode = 1;
64
+ }
65
+ }
66
+ async function readAllStdin() {
67
+ return new Promise((resolve, reject) => {
68
+ let data = "";
69
+ process.stdin.setEncoding("utf8");
70
+ process.stdin.on("data", (chunk) => (data += chunk));
71
+ process.stdin.on("end", () => resolve(data));
72
+ process.stdin.on("error", (err) => reject(err));
73
+ });
74
+ }
75
+ function printParseError(file, err) {
76
+ // Your parser errors already include line/column info in the message string.
77
+ console.error(`flux parse: ${file}: ${err.message}`);
78
+ }
79
+ function formatOutput(files, opts) {
80
+ if (opts.summary) {
81
+ return files.map((f) => summarizeDoc(f.file, f.doc)).join("\n\n");
82
+ }
83
+ if (files.length === 1 && !opts.ndjson) {
84
+ const doc = files[0].doc;
85
+ return JSON.stringify(doc, null, opts.compact ? 0 : 2);
86
+ }
87
+ // NDJSON
88
+ return files
89
+ .map((f) => JSON.stringify({ file: f.file, doc: f.doc }))
90
+ .join("\n");
91
+ }
92
+ function summarizeDoc(file, doc) {
93
+ const title = doc?.meta?.title ?? "<unnamed>";
94
+ const version = doc?.meta?.version ?? "<unknown>";
95
+ const params = doc?.state?.params?.length ?? 0;
96
+ const grids = doc?.grids?.length ?? 0;
97
+ const rules = doc?.rules?.length ?? 0;
98
+ return [
99
+ file,
100
+ ` title : ${JSON.stringify(title)}`,
101
+ ` version : ${version}`,
102
+ ` params : ${params}`,
103
+ ` grids : ${grids}`,
104
+ ` rules : ${rules}`,
105
+ ].join("\n");
106
+ }
107
+ //# sourceMappingURL=parse.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"parse.js","sourceRoot":"","sources":["../src/parse.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ import { FluxDocument } from "./ast.js";
2
+ export declare function parseDocument(source: string): FluxDocument;
3
+ //# sourceMappingURL=parser.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"parser.d.ts","sourceRoot":"","sources":["../src/parser.ts"],"names":[],"mappings":"AAAA,OAAO,EACH,YAAY,EA2Bf,MAAM,UAAU,CAAC;AAykDlB,wBAAgB,aAAa,CAAC,MAAM,EAAE,MAAM,GAAG,YAAY,CAK1D"}