effect-grammar 0.3.0 → 0.5.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 (68) hide show
  1. package/README.md +168 -229
  2. package/dist/binary.d.ts +64 -0
  3. package/dist/binary.d.ts.map +1 -0
  4. package/dist/binary.js +246 -0
  5. package/dist/binary.js.map +1 -0
  6. package/dist/codec.d.ts +17 -0
  7. package/dist/codec.d.ts.map +1 -0
  8. package/dist/codec.js +14 -0
  9. package/dist/codec.js.map +1 -0
  10. package/dist/combinators.d.ts +112 -6
  11. package/dist/combinators.d.ts.map +1 -1
  12. package/dist/combinators.js +218 -28
  13. package/dist/combinators.js.map +1 -1
  14. package/dist/compile.d.ts +36 -0
  15. package/dist/compile.d.ts.map +1 -0
  16. package/dist/compile.js +228 -0
  17. package/dist/compile.js.map +1 -0
  18. package/dist/core.d.ts +34 -1
  19. package/dist/core.d.ts.map +1 -1
  20. package/dist/core.js +51 -1
  21. package/dist/core.js.map +1 -1
  22. package/dist/env.d.ts +5 -0
  23. package/dist/env.d.ts.map +1 -1
  24. package/dist/env.js +20 -1
  25. package/dist/env.js.map +1 -1
  26. package/dist/errors.d.ts +12 -0
  27. package/dist/errors.d.ts.map +1 -1
  28. package/dist/errors.js +40 -4
  29. package/dist/errors.js.map +1 -1
  30. package/dist/gen.d.ts.map +1 -1
  31. package/dist/gen.js +5 -7
  32. package/dist/gen.js.map +1 -1
  33. package/dist/index.d.ts +5 -4
  34. package/dist/index.d.ts.map +1 -1
  35. package/dist/index.js +4 -3
  36. package/dist/index.js.map +1 -1
  37. package/dist/parse.d.ts +10 -1
  38. package/dist/parse.d.ts.map +1 -1
  39. package/dist/parse.js +81 -19
  40. package/dist/parse.js.map +1 -1
  41. package/dist/pattern.d.ts +2 -1
  42. package/dist/pattern.d.ts.map +1 -1
  43. package/dist/pattern.js +46 -2
  44. package/dist/pattern.js.map +1 -1
  45. package/dist/print.d.ts +8 -0
  46. package/dist/print.d.ts.map +1 -1
  47. package/dist/print.js +136 -18
  48. package/dist/print.js.map +1 -1
  49. package/dist/render.d.ts.map +1 -1
  50. package/dist/render.js +33 -6
  51. package/dist/render.js.map +1 -1
  52. package/dist/schema.d.ts +8 -3
  53. package/dist/schema.d.ts.map +1 -1
  54. package/dist/schema.js +11 -13
  55. package/dist/schema.js.map +1 -1
  56. package/dist/testing.d.ts +18 -0
  57. package/dist/testing.d.ts.map +1 -0
  58. package/dist/testing.js +72 -0
  59. package/dist/testing.js.map +1 -0
  60. package/package.json +9 -3
  61. package/dist/grammar.d.ts +0 -8
  62. package/dist/grammar.d.ts.map +0 -1
  63. package/dist/grammar.js +0 -8
  64. package/dist/grammar.js.map +0 -1
  65. package/dist/recovery.d.ts +0 -10
  66. package/dist/recovery.d.ts.map +0 -1
  67. package/dist/recovery.js +0 -296
  68. package/dist/recovery.js.map +0 -1
@@ -0,0 +1,228 @@
1
+ import { Result } from "effect";
2
+ import { children, nodeOf, resolve } from "./core.js";
3
+ import { exceptionMessage } from "./errors.js";
4
+ import { parse } from "./parse.js";
5
+ import { print, printChecked } from "./print.js";
6
+ import { describe, render } from "./render.js";
7
+ const exprScope = (expr) => {
8
+ switch (expr._tag) {
9
+ case "Ref":
10
+ return expr.scope;
11
+ case "Prop":
12
+ return exprScope(expr.object);
13
+ case "Count":
14
+ return undefined;
15
+ }
16
+ };
17
+ const allMatchEmpty = (grammars, seen) => {
18
+ let result = "yes";
19
+ for (const grammar of grammars) {
20
+ const match = matchesEmpty(grammar, seen);
21
+ if (match === "no")
22
+ return "no";
23
+ if (match === "unknown")
24
+ result = "unknown";
25
+ }
26
+ return result;
27
+ };
28
+ /** Check whether the grammar can be proved to match or reject empty input. */
29
+ const matchesEmpty = (grammar, seen) => {
30
+ const node = nodeOf(grammar);
31
+ switch (node._tag) {
32
+ case "Literal":
33
+ return node.value === "" ? "yes" : "no";
34
+ case "Regex":
35
+ return new RegExp(node.source, `${node.flags}y`).exec("") === null ? "no" : "yes";
36
+ case "Gen":
37
+ return allMatchEmpty(node.steps.map((step) => step.grammar), seen);
38
+ case "Wrap":
39
+ return allMatchEmpty([node.open, node.inner, node.close], seen);
40
+ case "Choice": {
41
+ let result = "no";
42
+ for (const option of node.options) {
43
+ const match = matchesEmpty(option, new Set(seen));
44
+ if (match === "yes")
45
+ return "yes";
46
+ if (match === "unknown")
47
+ result = "unknown";
48
+ }
49
+ return result;
50
+ }
51
+ case "Many": {
52
+ if (node.max === 0)
53
+ return "yes";
54
+ const item = matchesEmpty(node.inner, seen);
55
+ // A zero-width item makes the repetition fail its own progress guard.
56
+ if (item === "yes")
57
+ return "no";
58
+ if (item === "unknown")
59
+ return "unknown";
60
+ return node.min === 0 ? "yes" : "no";
61
+ }
62
+ case "Optional":
63
+ return "yes";
64
+ case "Transform": {
65
+ // A transform consumes what its inner grammar does, but its decode may reject an empty match.
66
+ const inner = matchesEmpty(node.inner, seen);
67
+ return inner === "yes" && node.total !== true ? "unknown" : inner;
68
+ }
69
+ case "Label":
70
+ case "Skip":
71
+ return matchesEmpty(node.inner, seen);
72
+ case "Suspend": {
73
+ if (seen.has(node))
74
+ return "unknown";
75
+ seen.add(node);
76
+ const empty = matchesEmpty(resolve(node), seen);
77
+ seen.delete(node);
78
+ return empty;
79
+ }
80
+ case "Take":
81
+ case "RepeatExact":
82
+ // A repeated item must consume input, so as with take only a zero count matches empty.
83
+ if (node.count._tag !== "Count")
84
+ return "unknown";
85
+ return node.count.value === 0 ? "yes" : "no";
86
+ case "Merge":
87
+ return allMatchEmpty(node.parts.map((part) => part.grammar), seen);
88
+ case "Match":
89
+ return "unknown";
90
+ }
91
+ };
92
+ /** Walk every node reachable from `grammar`, once per `Suspend` node. */
93
+ const eachNode = (grammar, visit, seen) => {
94
+ const node = nodeOf(grammar);
95
+ if (node._tag === "Suspend") {
96
+ if (seen.has(node))
97
+ return;
98
+ seen.add(node);
99
+ }
100
+ visit(node);
101
+ for (const child of children(node))
102
+ eachNode(child, visit, seen);
103
+ };
104
+ const checkRef = (expr, where, active, issues) => {
105
+ const scope = exprScope(expr);
106
+ if (scope !== undefined && !active.includes(scope)) {
107
+ issues.push({
108
+ message: `${where}: uses a ref bound by a gen that is not an ancestor here; a ref works only inside the gen that bound it`,
109
+ });
110
+ }
111
+ };
112
+ const checkProgress = (inner, repetition, issues) => {
113
+ if (matchesEmpty(inner, new Set()) === "yes") {
114
+ issues.push({
115
+ message: `${repetition} of ${describe(inner)}, which can match the empty string, so parsing and printing would disagree about zero-width elements`,
116
+ });
117
+ }
118
+ };
119
+ const sameScopePath = (left, right) => left.length === right.length && left.every((scope, index) => scope === right[index]);
120
+ const walk = (grammar, active, visiting, completed, issues) => {
121
+ const node = nodeOf(grammar);
122
+ switch (node._tag) {
123
+ case "Gen": {
124
+ const inner = [...active, node.scope];
125
+ for (const step of node.steps)
126
+ walk(step.grammar, inner, visiting, completed, issues);
127
+ return;
128
+ }
129
+ case "Many":
130
+ if (node.max > 0) {
131
+ checkProgress(node.inner, node.max === Number.POSITIVE_INFINITY ? "unbounded repetition" : "repetition", issues);
132
+ }
133
+ break;
134
+ case "Suspend":
135
+ if (visiting.has(node))
136
+ return;
137
+ const paths = completed.get(node);
138
+ if (paths?.some((path) => sameScopePath(path, active)))
139
+ return;
140
+ visiting.add(node);
141
+ try {
142
+ let target;
143
+ try {
144
+ target = resolve(node);
145
+ }
146
+ catch (error) {
147
+ issues.push({
148
+ message: `invalid suspend: ${exceptionMessage(error)}`,
149
+ });
150
+ return;
151
+ }
152
+ walk(target, active, visiting, completed, issues);
153
+ }
154
+ finally {
155
+ visiting.delete(node);
156
+ }
157
+ if (paths === undefined)
158
+ completed.set(node, [active.slice()]);
159
+ else
160
+ paths.push(active.slice());
161
+ return;
162
+ case "Match":
163
+ checkRef(node.scrutinee, "match", active, issues);
164
+ break;
165
+ case "Take":
166
+ checkRef(node.count, node.unit === "char" ? "take" : "bytes", active, issues);
167
+ break;
168
+ case "RepeatExact":
169
+ checkRef(node.count, "repeat", active, issues);
170
+ // A bound count may be zero at run time, but like `many` with a max it is checked anyway.
171
+ if (node.count._tag !== "Count" || node.count.value > 0) {
172
+ checkProgress(node.inner, "repetition", issues);
173
+ }
174
+ break;
175
+ default:
176
+ break;
177
+ }
178
+ for (const child of children(node))
179
+ walk(child, active, visiting, completed, issues);
180
+ };
181
+ /**
182
+ * Check a grammar for staged errors that `parse` and `print` would otherwise
183
+ * only report when they run: refs used outside their gen and any nonzero
184
+ * repetition of a grammar proven to match empty input. Resolving suspensions
185
+ * may evaluate and cache their thunks. Returns the issues these checks find;
186
+ * an empty array is not proof of all runtime behavior.
187
+ */
188
+ export const validate = (grammar) => {
189
+ const issues = [];
190
+ walk(grammar, [], new Set(), new WeakMap(), issues);
191
+ return issues;
192
+ };
193
+ /**
194
+ * List the transforms in a grammar that do not claim a full inverse law
195
+ * (`transform`, `transformOrFail`, `partialIso`). An empty result means each
196
+ * transform makes that claim; it does not prove the claim or a round trip.
197
+ */
198
+ export const auditFidelity = (grammar) => {
199
+ const entries = [];
200
+ eachNode(grammar, (node) => {
201
+ if (node._tag === "Transform" && node.fidelity !== "claimed-iso") {
202
+ entries.push({ name: node.name ?? describe(node.inner), fidelity: node.fidelity });
203
+ }
204
+ }, new Set());
205
+ return entries;
206
+ };
207
+ /**
208
+ * Validate a grammar once, then return interpreter functions bound to it.
209
+ * This does not compile or optimize the grammar. Validation can resolve and
210
+ * cache suspended thunks, and throws if {@link validate} finds an issue. Other
211
+ * input, value, callback, and round-trip failures can still occur at runtime.
212
+ */
213
+ export const prepare = (grammar) => {
214
+ const issues = validate(grammar);
215
+ if (issues.length > 0) {
216
+ throw new Error(`prepare: the grammar has ${issues.length} issue${issues.length === 1 ? "" : "s"}:\n ${issues
217
+ .map((issue) => issue.message)
218
+ .join("\n ")}`);
219
+ }
220
+ return {
221
+ parse: (text) => parse(grammar, text),
222
+ print: (value) => print(grammar, value),
223
+ printChecked: (value) => printChecked(grammar, value),
224
+ render: render(grammar),
225
+ fidelity: auditFidelity(grammar),
226
+ };
227
+ };
228
+ //# sourceMappingURL=compile.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"compile.js","sourceRoot":"","sources":["../src/compile.ts"],"names":[],"mappings":"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"}
package/dist/core.d.ts CHANGED
@@ -28,6 +28,9 @@ export type Expr = RefExpr | {
28
28
  readonly _tag: "Prop";
29
29
  readonly object: Expr;
30
30
  readonly key: PropertyKey;
31
+ } | {
32
+ readonly _tag: "Count";
33
+ readonly value: number;
31
34
  };
32
35
  export type Pattern = RefExpr | {
33
36
  readonly _tag: "Const";
@@ -40,6 +43,14 @@ export type Pattern = RefExpr | {
40
43
  readonly items: ReadonlyArray<Pattern>;
41
44
  };
42
45
  export type MatchKey = string | number | boolean;
46
+ /**
47
+ * How much a `Transform` promises about its two directions.
48
+ *
49
+ * - `unchecked`: no law claimed (`transform`, `transformOrFail`).
50
+ * - `partial`: both directions may fail, and agree where they succeed (`partialIso`).
51
+ * - `claimed-iso`: the author claims the directions are inverse (`iso`, `decodeTo`, `as`).
52
+ */
53
+ export type Fidelity = "unchecked" | "partial" | "claimed-iso";
43
54
  export interface GrammarIssue {
44
55
  readonly message: string;
45
56
  }
@@ -61,9 +72,11 @@ export type Step = {
61
72
  export type Node = {
62
73
  readonly _tag: "Literal";
63
74
  readonly value: string;
75
+ readonly name?: string | undefined;
64
76
  } | {
65
77
  readonly _tag: "Regex";
66
- readonly re: RegExp;
78
+ readonly source: string;
79
+ readonly flags: string;
67
80
  readonly name: string;
68
81
  } | {
69
82
  readonly _tag: "Gen";
@@ -79,6 +92,12 @@ export type Node = {
79
92
  } | {
80
93
  readonly _tag: "Choice";
81
94
  readonly options: ReadonlyArray<GrammarInternal>;
95
+ readonly on?: {
96
+ readonly tag: string;
97
+ readonly keys: ReadonlyArray<MatchKey>;
98
+ } | undefined;
99
+ /** Print with the first branch whose text parses back, not just the first that accepts. */
100
+ readonly checked?: boolean | undefined;
82
101
  } | ({
83
102
  readonly _tag: "Many";
84
103
  readonly inner: GrammarInternal;
@@ -93,6 +112,10 @@ export type Node = {
93
112
  readonly encode: (b: never) => Result.Result<Value, GrammarIssue>;
94
113
  readonly is?: ((value: never) => boolean) | undefined;
95
114
  readonly name?: string | undefined;
115
+ readonly keys?: ReadonlyArray<string> | undefined;
116
+ readonly fidelity: Fidelity;
117
+ /** Decoding accepts every inner match, so the transform matches empty input when its inner grammar does. */
118
+ readonly total?: boolean | undefined;
96
119
  } | {
97
120
  readonly _tag: "Skip";
98
121
  readonly inner: GrammarInternal;
@@ -114,6 +137,14 @@ export type Node = {
114
137
  } | {
115
138
  readonly _tag: "Take";
116
139
  readonly count: Expr;
140
+ readonly unit: "char" | "byte";
141
+ readonly name?: string | undefined;
142
+ } | {
143
+ readonly _tag: "Merge";
144
+ readonly parts: ReadonlyArray<{
145
+ readonly grammar: GrammarInternal;
146
+ readonly keys: ReadonlyArray<string>;
147
+ }>;
117
148
  } | {
118
149
  readonly _tag: "RepeatExact";
119
150
  readonly count: Expr;
@@ -153,5 +184,7 @@ export declare const isSilent: (grammar: GrammarInternal) => grammar is Silent;
153
184
  export declare const resolve: (node: Extract<Node, {
154
185
  _tag: "Suspend";
155
186
  }>) => GrammarInternal;
187
+ /** The grammars a node refers to directly. A `Suspend` yields its resolved target. */
188
+ export declare const children: (node: Node) => ReadonlyArray<GrammarInternal>;
156
189
  export {};
157
190
  //# sourceMappingURL=core.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"core.d.ts","sourceRoot":"","sources":["../src/core.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"core.d.ts","sourceRoot":"","sources":["../src/core.ts"],"names":[],"mappings":"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"}
package/dist/core.js CHANGED
@@ -34,5 +34,55 @@ export const make = (node) => new GrammarImpl(node);
34
34
  export const silent = (node) => new SilentImpl(node);
35
35
  export const isGrammar = (value) => Predicate.hasProperty(value, GrammarTypeId);
36
36
  export const isSilent = (grammar) => Predicate.hasProperty(grammar, SilentTypeId);
37
- export const resolve = (node) => (node.resolved ??= node.thunk());
37
+ const Resolving = Symbol("effect-grammar/ResolvingSuspend");
38
+ export const resolve = (node) => {
39
+ if (node.resolved !== undefined)
40
+ return node.resolved;
41
+ // SAFETY: the private marker exists only while this suspend thunk is resolving.
42
+ const state = node;
43
+ if (state.resolving === Resolving) {
44
+ throw new Error(`suspend${node.name === undefined ? "" : ` ${JSON.stringify(node.name)}`}: thunk resolved itself while it was being evaluated`);
45
+ }
46
+ state.resolving = Resolving;
47
+ try {
48
+ const target = node.thunk();
49
+ if (!isGrammar(target)) {
50
+ throw new TypeError(`suspend${node.name === undefined ? "" : ` ${JSON.stringify(node.name)}`}: thunk must return a grammar`);
51
+ }
52
+ node.resolved = target;
53
+ return target;
54
+ }
55
+ finally {
56
+ delete state.resolving;
57
+ }
58
+ };
59
+ /** The grammars a node refers to directly. A `Suspend` yields its resolved target. */
60
+ export const children = (node) => {
61
+ switch (node._tag) {
62
+ case "Literal":
63
+ case "Regex":
64
+ case "Take":
65
+ return [];
66
+ case "Gen":
67
+ return node.steps.map((step) => step.grammar);
68
+ case "Wrap":
69
+ return [node.open, node.inner, node.close];
70
+ case "Choice":
71
+ return node.options;
72
+ case "Many":
73
+ return [node.inner, node.sep];
74
+ case "Optional":
75
+ case "Transform":
76
+ case "Label":
77
+ case "Skip":
78
+ case "RepeatExact":
79
+ return [node.inner];
80
+ case "Suspend":
81
+ return [resolve(node)];
82
+ case "Match":
83
+ return node.cases.map((matchCase) => matchCase.grammar);
84
+ case "Merge":
85
+ return node.parts.map((part) => part.grammar);
86
+ }
87
+ };
38
88
  //# sourceMappingURL=core.js.map
package/dist/core.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"core.js","sourceRoot":"","sources":["../src/core.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,SAAS,EAAE,MAAM,EAAc,KAAK,EAAE,MAAM,QAAQ,CAAA;AAEvE,MAAM,aAAa,GAAkB,MAAM,CAAC,GAAG,CAAC,wBAAwB,CAAC,CAAA;AACzE,MAAM,YAAY,GAAkB,MAAM,CAAC,GAAG,CAAC,uBAAuB,CAAC,CAAA;AACvE,MAAM,UAAU,GAAkB,MAAM,CAAC,qBAAqB,CAAC,CAAA;AAC/D,MAAM,CAAC,MAAM,SAAS,GAAkB,MAAM,CAAC,GAAG,CAAC,oBAAoB,CAAC,CAAA;AAKxE;;;;;GAKG;AACH,MAAM,CAAC,MAAM,aAAa,GAAG,CAAC,KAAY,EAAS,EAAE;IACnD,iFAAiF;IACjF,OAAO,KAAc,CAAA;AACvB,CAAC,CAAA;AAgID,MAAM,WAAW;IAEN,CAAC,UAAU,CAAC,CAAM;IAE3B,YAAY,IAAU;QACpB,IAAI,CAAC,UAAU,CAAC,GAAG,IAAI,CAAA;IACzB,CAAC;IAED,IAAI;QACF,OAAO,QAAQ,CAAC,aAAa,CAAC,IAAI,EAAE,SAAS,CAAC,CAAA;IAChD,CAAC;IAED,CAAC,MAAM,CAAC,QAAQ,CAAC;QACf,OAAO,IAAI,KAAK,CAAC,aAAa,CAAuB,IAAI,CAAC,CAAA;IAC5D,CAAC;CACF;AAED,MAAM,CAAC,cAAc,CAAC,WAAW,CAAC,SAAS,EAAE,aAAa,EAAE,EAAE,KAAK,EAAE,aAAa,EAAE,CAAC,CAAA;AAErF,MAAM,UAAW,SAAQ,WAAiB;CAEzC;AAED,MAAM,CAAC,cAAc,CAAC,UAAU,CAAC,SAAS,EAAE,YAAY,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAA;AAE1E,MAAM,CAAC,MAAM,MAAM,GAAG,CAAC,OAAwB,EAAQ,EAAE,CAAC,OAAO,CAAC,UAAU,CAAC,CAAA;AAE7E,MAAM,CAAC,MAAM,IAAI,GAAG,CAAI,IAAU,EAAc,EAAE,CAAC,IAAI,WAAW,CAAI,IAAI,CAAC,CAAA;AAE3E,MAAM,CAAC,MAAM,MAAM,GAAG,CAAC,IAAU,EAAU,EAAE,CAAC,IAAI,UAAU,CAAC,IAAI,CAAC,CAAA;AAElE,MAAM,CAAC,MAAM,SAAS,GAAG,CAAI,KAAQ,EAAgC,EAAE,CACrE,SAAS,CAAC,WAAW,CAAC,KAAK,EAAE,aAAa,CAAC,CAAA;AAE7C,MAAM,CAAC,MAAM,QAAQ,GAAG,CAAC,OAAwB,EAAqB,EAAE,CACtE,SAAS,CAAC,WAAW,CAAC,OAAO,EAAE,YAAY,CAAC,CAAA;AAE9C,MAAM,CAAC,MAAM,OAAO,GAAG,CAAC,IAAwC,EAAmB,EAAE,CACnF,CAAC,IAAI,CAAC,QAAQ,KAAK,IAAI,CAAC,KAAK,EAAE,CAAC,CAAA"}
1
+ {"version":3,"file":"core.js","sourceRoot":"","sources":["../src/core.ts"],"names":[],"mappings":"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"}
package/dist/env.d.ts CHANGED
@@ -14,7 +14,12 @@ export declare const frame: (scope: ScopeId, slotCount: number, parent: Frame |
14
14
  export declare const bind: (target: Frame, slot: number, value: Value) => void;
15
15
  export declare const lookup: (env: Frame | undefined, ref: RefExpr) => BoundValue;
16
16
  export declare const evaluate: (expr: Expr, env: Frame | undefined) => BoundValue;
17
+ export declare const defineField: (object: Record<string, Value>, key: string, value: Value) => void;
18
+ export declare const copyFields: (target: Record<string, Value>, source: Readonly<Record<string, Value>>, keys: ReadonlyArray<string>) => void;
17
19
  export declare const materialize: (pattern: Pattern, env: Frame) => BoundValue;
18
20
  export declare const caseFor: (cases: ReadonlyArray<Case>, value: Value) => Case | undefined;
19
21
  export declare const isCount: (value: Value) => value is number;
22
+ export declare const nonByte: RegExp;
23
+ /** The bytes of a binary string, one per character; call only once `nonByte` has ruled out wider ones. */
24
+ export declare const toBytes: (binary: string) => Uint8Array;
20
25
  //# sourceMappingURL=env.d.ts.map
package/dist/env.d.ts.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"env.d.ts","sourceRoot":"","sources":["../src/env.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,IAAI,EAAE,IAAI,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,MAAM,WAAW,CAAA;AAE7E;;;GAGG;AACH,eAAO,MAAM,OAAO,eAAmC,CAAA;AAEvD,MAAM,MAAM,UAAU,GAAG,KAAK,GAAG,OAAO,OAAO,CAAA;AAE/C,MAAM,WAAW,KAAK;IACpB,QAAQ,CAAC,KAAK,EAAE,OAAO,CAAA;IACvB,QAAQ,CAAC,MAAM,EAAE,KAAK,GAAG,SAAS,CAAA;IAClC,QAAQ,CAAC,MAAM,EAAE,KAAK,CAAC,KAAK,CAAC,CAAA;CAC9B;AAED,eAAO,MAAM,KAAK,UAAW,OAAO,aAAa,MAAM,UAAU,KAAK,GAAG,SAAS,KAAG,KAKpF,CAAA;AAED,eAAO,MAAM,IAAI,WAAY,KAAK,QAAQ,MAAM,SAAS,KAAK,KAAG,IAEhE,CAAA;AAED,eAAO,MAAM,MAAM,QAAS,KAAK,GAAG,SAAS,OAAO,OAAO,KAAG,UAM7D,CAAA;AAED,eAAO,MAAM,QAAQ,SAAU,IAAI,OAAO,KAAK,GAAG,SAAS,KAAG,UAM7D,CAAA;AAED,eAAO,MAAM,WAAW,YAAa,OAAO,OAAO,KAAK,KAAG,UAyB1D,CAAA;AAED,eAAO,MAAM,OAAO,UAAW,aAAa,CAAC,IAAI,CAAC,SAAS,KAAK,qBACJ,CAAA;AAE5D,eAAO,MAAM,OAAO,UAAW,KAAK,KAAG,KAAK,IAAI,MACwB,CAAA"}
1
+ {"version":3,"file":"env.d.ts","sourceRoot":"","sources":["../src/env.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,IAAI,EAAE,IAAI,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,MAAM,WAAW,CAAA;AAE7E;;;GAGG;AACH,eAAO,MAAM,OAAO,eAAmC,CAAA;AAEvD,MAAM,MAAM,UAAU,GAAG,KAAK,GAAG,OAAO,OAAO,CAAA;AAE/C,MAAM,WAAW,KAAK;IACpB,QAAQ,CAAC,KAAK,EAAE,OAAO,CAAA;IACvB,QAAQ,CAAC,MAAM,EAAE,KAAK,GAAG,SAAS,CAAA;IAClC,QAAQ,CAAC,MAAM,EAAE,KAAK,CAAC,KAAK,CAAC,CAAA;CAC9B;AAED,eAAO,MAAM,KAAK,UAAW,OAAO,aAAa,MAAM,UAAU,KAAK,GAAG,SAAS,KAAG,KAKpF,CAAA;AAED,eAAO,MAAM,IAAI,WAAY,KAAK,QAAQ,MAAM,SAAS,KAAK,KAAG,IAEhE,CAAA;AAED,eAAO,MAAM,MAAM,QAAS,KAAK,GAAG,SAAS,OAAO,OAAO,KAAG,UAM7D,CAAA;AAED,eAAO,MAAM,QAAQ,SAAU,IAAI,OAAO,KAAK,GAAG,SAAS,KAAG,UAO7D,CAAA;AAED,eAAO,MAAM,WAAW,WAAY,MAAM,CAAC,MAAM,EAAE,KAAK,CAAC,OAAO,MAAM,SAAS,KAAK,KAAG,IAOtF,CAAA;AAED,eAAO,MAAM,UAAU,WACb,MAAM,CAAC,MAAM,EAAE,KAAK,CAAC,UACrB,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,KAAK,CAAC,CAAC,QACjC,aAAa,CAAC,MAAM,CAAC,KAC1B,IAIF,CAAA;AAED,eAAO,MAAM,WAAW,YAAa,OAAO,OAAO,KAAK,KAAG,UAyB1D,CAAA;AAED,eAAO,MAAM,OAAO,UAAW,aAAa,CAAC,IAAI,CAAC,SAAS,KAAK,qBACJ,CAAA;AAE5D,eAAO,MAAM,OAAO,UAAW,KAAK,KAAG,KAAK,IAAI,MACwB,CAAA;AAExE,eAAO,MAAM,OAAO,QAAe,CAAA;AAEnC,0GAA0G;AAC1G,eAAO,MAAM,OAAO,WAAY,MAAM,KAAG,UACc,CAAA"}
package/dist/env.js CHANGED
@@ -25,11 +25,27 @@ export const lookup = (env, ref) => {
25
25
  export const evaluate = (expr, env) => {
26
26
  if (expr._tag === "Ref")
27
27
  return lookup(env, expr);
28
+ if (expr._tag === "Count")
29
+ return expr.value;
28
30
  const object = evaluate(expr.object, env);
29
31
  if (object === Unbound || !Predicate.isObject(object))
30
32
  return Unbound;
31
33
  return Object.hasOwn(object, expr.key) ? object[expr.key] : Unbound;
32
34
  };
35
+ export const defineField = (object, key, value) => {
36
+ Object.defineProperty(object, key, {
37
+ value,
38
+ writable: true,
39
+ enumerable: true,
40
+ configurable: true,
41
+ });
42
+ };
43
+ export const copyFields = (target, source, keys) => {
44
+ for (const key of keys) {
45
+ if (Object.hasOwn(source, key))
46
+ defineField(target, key, source[key]);
47
+ }
48
+ };
33
49
  export const materialize = (pattern, env) => {
34
50
  switch (pattern._tag) {
35
51
  case "Ref":
@@ -42,7 +58,7 @@ export const materialize = (pattern, env) => {
42
58
  const value = materialize(field, env);
43
59
  if (value === Unbound)
44
60
  return Unbound;
45
- object[key] = value;
61
+ defineField(object, key, value);
46
62
  }
47
63
  return object;
48
64
  }
@@ -60,4 +76,7 @@ export const materialize = (pattern, env) => {
60
76
  };
61
77
  export const caseFor = (cases, value) => cases.find((matchCase) => Object.is(matchCase.key, value));
62
78
  export const isCount = (value) => Predicate.isNumber(value) && Number.isSafeInteger(value) && value >= 0;
79
+ export const nonByte = /[^\0-\xff]/;
80
+ /** The bytes of a binary string, one per character; call only once `nonByte` has ruled out wider ones. */
81
+ export const toBytes = (binary) => Uint8Array.from(binary, (char) => char.charCodeAt(0));
63
82
  //# sourceMappingURL=env.js.map
package/dist/env.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"env.js","sourceRoot":"","sources":["../src/env.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"env.js","sourceRoot":"","sources":["../src/env.ts"],"names":[],"mappings":"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"}
package/dist/errors.d.ts CHANGED
@@ -1,5 +1,6 @@
1
1
  import { Schema } from "effect";
2
2
  import type { Value } from "./core.ts";
3
+ export declare const describeExpected: (expected: ReadonlyArray<string>) => string;
3
4
  declare const ParseError_base: Schema.Class<ParseError, Schema.TaggedStruct<"ParseError", {
4
5
  readonly pos: Schema.Finite;
5
6
  readonly line: Schema.Finite;
@@ -33,11 +34,21 @@ export type PrintIssue = {
33
34
  readonly _tag: "NoAlternative";
34
35
  readonly actual: Value;
35
36
  readonly issues: ReadonlyArray<PrintIssue>;
37
+ } | {
38
+ readonly _tag: "RoundTrip";
39
+ readonly value: Value;
40
+ readonly printed: string;
41
+ readonly parsed?: Value | undefined;
42
+ readonly error?: string | undefined;
36
43
  } | {
37
44
  readonly _tag: "AtPath";
38
45
  readonly path: string | number;
39
46
  readonly issue: PrintIssue;
40
47
  };
48
+ /** The tail of a round-trip message: what the value printed as and how that read back. */
49
+ export declare const describeRoundTrip: (issue: Extract<PrintIssue, {
50
+ _tag: "RoundTrip";
51
+ }>) => string;
41
52
  declare const PrintError_base: Schema.Class<PrintError, Schema.TaggedStruct<"PrintError", {
42
53
  readonly issue: Schema.Unknown;
43
54
  }>, import("effect/Cause").YieldableError>;
@@ -46,6 +57,7 @@ export declare class PrintError extends PrintError_base {
46
57
  get message(): string;
47
58
  static format(error: PrintError | PrintIssue): string;
48
59
  }
60
+ export declare const hex: (bytes: Uint8Array) => string;
49
61
  export declare const preview: <T>(value: T) => string;
50
62
  export declare const exceptionMessage: (error: Value) => string;
51
63
  export {};
@@ -1 +1 @@
1
- {"version":3,"file":"errors.d.ts","sourceRoot":"","sources":["../src/errors.ts"],"names":[],"mappings":"AAAA,OAAO,EAAa,MAAM,EAAE,MAAM,QAAQ,CAAA;AAE1C,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,WAAW,CAAA;;;;;;;;AAEtC,qBAAa,UAAW,SAAQ,eAM9B;IACA,IAAa,OAAO,IAAI,MAAM,CAK7B;CACF;AAED,MAAM,MAAM,UAAU,GAClB;IACE,QAAQ,CAAC,IAAI,EAAE,cAAc,CAAA;IAC7B,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAA;IACzB,QAAQ,CAAC,MAAM,EAAE,KAAK,CAAA;CACvB,GACD;IACE,QAAQ,CAAC,IAAI,EAAE,kBAAkB,CAAA;IACjC,QAAQ,CAAC,QAAQ,EAAE,KAAK,CAAA;IACxB,QAAQ,CAAC,MAAM,EAAE,KAAK,CAAA;CACvB,GACD;IACE,QAAQ,CAAC,IAAI,EAAE,cAAc,CAAA;IAC7B,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAA;CACvB,GACD;IACE,QAAQ,CAAC,IAAI,EAAE,gBAAgB,CAAA;IAC/B,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAA;CACzB,GACD;IACE,QAAQ,CAAC,IAAI,EAAE,cAAc,CAAA;IAC7B,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAA;IACzB,QAAQ,CAAC,MAAM,EAAE,KAAK,CAAA;IACtB,QAAQ,CAAC,MAAM,CAAC,EAAE,MAAM,GAAG,SAAS,CAAA;CACrC,GACD;IACE,QAAQ,CAAC,IAAI,EAAE,eAAe,CAAA;IAC9B,QAAQ,CAAC,MAAM,EAAE,KAAK,CAAA;IACtB,QAAQ,CAAC,MAAM,EAAE,aAAa,CAAC,UAAU,CAAC,CAAA;CAC3C,GACD;IACE,QAAQ,CAAC,IAAI,EAAE,QAAQ,CAAA;IACvB,QAAQ,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAAA;IAC9B,QAAQ,CAAC,KAAK,EAAE,UAAU,CAAA;CAC3B,CAAA;;;;AA+BL,qBAAa,UAAW,SAAQ,eAE9B;IACA,SAAiB,KAAK,EAAE,UAAU,CAAA;IAElC,IAAa,OAAO,IAAI,MAAM,CAE7B;IAED,MAAM,CAAC,MAAM,CAAC,KAAK,EAAE,UAAU,GAAG,UAAU,GAAG,MAAM,CAEpD;CACF;AAED,eAAO,MAAM,OAAO,GAAI,CAAC,SAAS,CAAC,KAAG,MAMrC,CAAA;AAED,eAAO,MAAM,gBAAgB,UAAW,KAAK,KAAG,MACW,CAAA"}
1
+ {"version":3,"file":"errors.d.ts","sourceRoot":"","sources":["../src/errors.ts"],"names":[],"mappings":"AAAA,OAAO,EAAa,MAAM,EAAE,MAAM,QAAQ,CAAA;AAE1C,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,WAAW,CAAA;AAEtC,eAAO,MAAM,gBAAgB,aAAc,aAAa,CAAC,MAAM,CAAC,KAAG,MACK,CAAA;;;;;;;;AAExE,qBAAa,UAAW,SAAQ,eAM9B;IACA,IAAa,OAAO,IAAI,MAAM,CAG7B;CACF;AAED,MAAM,MAAM,UAAU,GAClB;IACE,QAAQ,CAAC,IAAI,EAAE,cAAc,CAAA;IAC7B,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAA;IACzB,QAAQ,CAAC,MAAM,EAAE,KAAK,CAAA;CACvB,GACD;IACE,QAAQ,CAAC,IAAI,EAAE,kBAAkB,CAAA;IACjC,QAAQ,CAAC,QAAQ,EAAE,KAAK,CAAA;IACxB,QAAQ,CAAC,MAAM,EAAE,KAAK,CAAA;CACvB,GACD;IACE,QAAQ,CAAC,IAAI,EAAE,cAAc,CAAA;IAC7B,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAA;CACvB,GACD;IACE,QAAQ,CAAC,IAAI,EAAE,gBAAgB,CAAA;IAC/B,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAA;CACzB,GACD;IACE,QAAQ,CAAC,IAAI,EAAE,cAAc,CAAA;IAC7B,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAA;IACzB,QAAQ,CAAC,MAAM,EAAE,KAAK,CAAA;IACtB,QAAQ,CAAC,MAAM,CAAC,EAAE,MAAM,GAAG,SAAS,CAAA;CACrC,GACD;IACE,QAAQ,CAAC,IAAI,EAAE,eAAe,CAAA;IAC9B,QAAQ,CAAC,MAAM,EAAE,KAAK,CAAA;IACtB,QAAQ,CAAC,MAAM,EAAE,aAAa,CAAC,UAAU,CAAC,CAAA;CAC3C,GACD;IACE,QAAQ,CAAC,IAAI,EAAE,WAAW,CAAA;IAC1B,QAAQ,CAAC,KAAK,EAAE,KAAK,CAAA;IACrB,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAA;IACxB,QAAQ,CAAC,MAAM,CAAC,EAAE,KAAK,GAAG,SAAS,CAAA;IACnC,QAAQ,CAAC,KAAK,CAAC,EAAE,MAAM,GAAG,SAAS,CAAA;CACpC,GACD;IACE,QAAQ,CAAC,IAAI,EAAE,QAAQ,CAAA;IACvB,QAAQ,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAAA;IAC9B,QAAQ,CAAC,KAAK,EAAE,UAAU,CAAA;CAC3B,CAAA;AAiCL,0FAA0F;AAC1F,eAAO,MAAM,iBAAiB,UAAW,OAAO,CAAC,UAAU,EAAE;IAAE,IAAI,EAAE,WAAW,CAAA;CAAE,CAAC,KAAG,MAGO,CAAA;;;;AAE7F,qBAAa,UAAW,SAAQ,eAE9B;IACA,SAAiB,KAAK,EAAE,UAAU,CAAA;IAElC,IAAa,OAAO,IAAI,MAAM,CAE7B;IAED,MAAM,CAAC,MAAM,CAAC,KAAK,EAAE,UAAU,GAAG,UAAU,GAAG,MAAM,CAEpD;CACF;AAED,eAAO,MAAM,GAAG,UAAW,UAAU,KAAG,MACmC,CAAA;AAwB3E,eAAO,MAAM,OAAO,GAAI,CAAC,SAAS,CAAC,KAAG,MAUrC,CAAA;AAED,eAAO,MAAM,gBAAgB,UAAW,KAAK,KAAG,MACW,CAAA"}
package/dist/errors.js CHANGED
@@ -1,4 +1,5 @@
1
1
  import { Predicate, Schema } from "effect";
2
+ export const describeExpected = (expected) => expected.length === 1 ? expected[0] : `one of ${expected.join(", ")}`;
2
3
  export class ParseError extends Schema.TaggedError()("ParseError", {
3
4
  pos: Schema.Finite,
4
5
  line: Schema.Finite,
@@ -8,8 +9,7 @@ export class ParseError extends Schema.TaggedError()("ParseError", {
8
9
  }) {
9
10
  get message() {
10
11
  const found = this.found === undefined ? "end of input" : JSON.stringify(this.found);
11
- const expected = this.expected.length === 1 ? this.expected[0] : `one of ${this.expected.join(", ")}`;
12
- return `line ${this.line}, column ${this.column}: expected ${expected}, found ${found}`;
12
+ return `line ${this.line}, column ${this.column}: expected ${describeExpected(this.expected)}, found ${found}`;
13
13
  }
14
14
  }
15
15
  const pathText = (path) => path.map((part) => (Predicate.isNumber(part) ? `[${part}]` : `.${part}`)).join("");
@@ -36,8 +36,14 @@ const formatAt = (issue, path) => {
36
36
  return `${prefix}no choice branch accepts ${preview(issue.actual)}:\n ${issue.issues
37
37
  .map((child) => formatAt(child, []))
38
38
  .join("\n ")}`;
39
+ case "RoundTrip":
40
+ return `${prefix}${preview(issue.value)} ${describeRoundTrip(issue)}`;
39
41
  }
40
42
  };
43
+ /** The tail of a round-trip message: what the value printed as and how that read back. */
44
+ export const describeRoundTrip = (issue) => issue.error === undefined
45
+ ? `prints as ${JSON.stringify(issue.printed)}, which reads back as ${preview(issue.parsed)}`
46
+ : `prints as ${JSON.stringify(issue.printed)}, which does not parse back: ${issue.error}`;
41
47
  export class PrintError extends Schema.TaggedError()("PrintError", {
42
48
  issue: Schema.Unknown,
43
49
  }) {
@@ -48,12 +54,42 @@ export class PrintError extends Schema.TaggedError()("PrintError", {
48
54
  return formatAt(error._tag === "PrintError" ? error.issue : error, []);
49
55
  }
50
56
  }
57
+ export const hex = (bytes) => Array.from(bytes, (byte) => byte.toString(16).padStart(2, "0")).join(" ");
58
+ /**
59
+ * `JSON.stringify`, except that bytes show as `<07 ab>` and a bigint as `5n`,
60
+ * unquoted so neither reads as a string. A replacer cannot do this: its result
61
+ * is quoted, and `toJSON` turns a `Buffer` into an object before it runs.
62
+ */
63
+ const show = (value, seen) => {
64
+ if (Predicate.isBigInt(value))
65
+ return `${value}n`;
66
+ if (Predicate.isUint8Array(value))
67
+ return `<${hex(value)}>`;
68
+ if (seen.includes(value))
69
+ throw new TypeError("circular value");
70
+ if (Array.isArray(value)) {
71
+ return `[${Array.from(value, (item) => show(item, [...seen, value]) ?? "null").join(",")}]`;
72
+ }
73
+ if (!Predicate.isObject(value) || Predicate.isFunction(value["toJSON"])) {
74
+ return JSON.stringify(value);
75
+ }
76
+ const fields = Object.entries(value).flatMap(([key, field]) => {
77
+ const text = show(field, [...seen, value]);
78
+ return text === undefined ? [] : [`${JSON.stringify(key)}:${text}`];
79
+ });
80
+ return `{${fields.join(",")}}`;
81
+ };
51
82
  export const preview = (value) => {
52
83
  try {
53
- return JSON.stringify(value) ?? String(value);
84
+ return show(value, []) ?? String(value);
54
85
  }
55
86
  catch {
56
- return String(value);
87
+ try {
88
+ return String(value);
89
+ }
90
+ catch {
91
+ return "<unprintable value>";
92
+ }
57
93
  }
58
94
  };
59
95
  export const exceptionMessage = (error) => Predicate.isError(error) ? error.message : preview(error);