a-form-parser 0.1.4

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/README.md ADDED
@@ -0,0 +1,131 @@
1
+ # a-form-parser
2
+
3
+ **Turn human-friendly form definitions into trusted AForm contracts.**
4
+
5
+ `a-form-parser` parses strict YAML and compact Emmet-like layouts, reports source-aware diagnostics, validates form semantics, and produces the normalized specification expected by renderers.
6
+
7
+ ## Install
8
+
9
+ ```bash
10
+ npm install a-form-core a-form-parser
11
+ ```
12
+
13
+ ## The Complete Pipeline
14
+
15
+ ```ts
16
+ import {
17
+ normalizeFormSpec,
18
+ parseYamlSpec,
19
+ validateFormSpec,
20
+ } from "a-form-parser";
21
+
22
+ const parsed = parseYamlSpec(yamlSource);
23
+
24
+ if (!parsed.value) {
25
+ throw new Error(parsed.diagnostics.map(({ message }) => message).join("\n"));
26
+ }
27
+
28
+ const diagnostics = [
29
+ ...parsed.diagnostics,
30
+ ...validateFormSpec(parsed.value),
31
+ ];
32
+
33
+ if (diagnostics.some(({ severity }) => severity === "error")) {
34
+ console.error(diagnostics);
35
+ } else {
36
+ const normalized = normalizeFormSpec(parsed.value);
37
+ console.log(normalized);
38
+ }
39
+ ```
40
+
41
+ ## Public API
42
+
43
+ ### `parseYamlSpec(source, options?)`
44
+
45
+ Parses a YAML document into a `FormSpec` without executing document content.
46
+
47
+ ```ts
48
+ const result = parseYamlSpec(source, {
49
+ maxSourceLength: 500_000,
50
+ maxDepth: 30,
51
+ maxNodes: 5_000,
52
+ maxAliases: 20,
53
+ });
54
+ ```
55
+
56
+ The result contains `value` when a specification could be produced and always contains `diagnostics`.
57
+
58
+ Default limits protect parser consumers from unexpectedly expensive documents:
59
+
60
+ | Option | Default |
61
+ | --- | ---: |
62
+ | `maxSourceLength` | `1_000_000` characters |
63
+ | `maxDepth` | `40` |
64
+ | `maxNodes` | `10_000` |
65
+ | `maxAliases` | `50` |
66
+
67
+ ### `validateFormSpec(spec)`
68
+
69
+ Checks the semantic contract after parsing, including:
70
+
71
+ - supported specification version;
72
+ - row, column, field, and nested-row hierarchy;
73
+ - responsive spans from 1 through 12;
74
+ - field paths against nested JSON Schema properties;
75
+ - duplicate fields;
76
+ - async validation paths, triggers, and timing values.
77
+
78
+ ### `normalizeFormSpec(spec)`
79
+
80
+ Returns a `NormalizedFormSpec` with deterministic fallback IDs and complete `mobile`, `tablet`, and `desktop` spans.
81
+
82
+ ```ts
83
+ const normalized = normalizeFormSpec(spec);
84
+
85
+ // Ready for <AForm spec={normalized} />
86
+ ```
87
+
88
+ ### `parseEmmetLayout(source)`
89
+
90
+ Parses a compact layout expression into `RowNode[]`:
91
+
92
+ ```ts
93
+ import { parseEmmetLayout } from "a-form-parser";
94
+
95
+ const result = parseEmmetLayout(
96
+ "row>(col[mobile=12 tablet=6]>field[path=person.name])" +
97
+ "+(col[mobile=12 tablet=6]>field[path=person.email])",
98
+ );
99
+ ```
100
+
101
+ Supported building blocks are `row`, `col`, `field`, child nesting with `>`, siblings with `+`, and attributes inside `[]`.
102
+
103
+ ## Diagnostics First
104
+
105
+ Parser functions do not throw for document errors. They return structured diagnostics with a code, severity, specification path, and source range when available.
106
+
107
+ ```ts
108
+ for (const diagnostic of result.diagnostics) {
109
+ console.log(
110
+ diagnostic.code,
111
+ diagnostic.severity,
112
+ diagnostic.range?.start.line,
113
+ diagnostic.message,
114
+ );
115
+ }
116
+ ```
117
+
118
+ Diagnostic code families include `YF_PARSE_*`, `YF_SPEC_*`, `YF_LAYOUT_*`, `YF_FIELD_*`, `YF_ASYNC_*`, and `YF_EMMET_*`.
119
+
120
+ ## Important Boundaries
121
+
122
+ - Parsing is synchronous.
123
+ - YAML keys are strict and duplicate keys are rejected.
124
+ - Field path validation follows nested `schema.properties`.
125
+ - JSON Schema `$ref` resolution and composition traversal are not implemented yet.
126
+ - Parse diagnostics and semantic diagnostics are separate; run both parsing and `validateFormSpec` before rendering.
127
+
128
+ ## Works With
129
+
130
+ - `a-form-react` for rendering normalized specs
131
+ - `a-form-core` for all public data contracts
@@ -0,0 +1,7 @@
1
+ import type { Diagnostic, RowNode } from "a-form-core";
2
+ export interface ParseEmmetResult {
3
+ readonly value?: readonly RowNode[];
4
+ readonly diagnostics: readonly Diagnostic[];
5
+ }
6
+ export declare function parseEmmetLayout(source: string): ParseEmmetResult;
7
+ //# sourceMappingURL=emmet.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"emmet.d.ts","sourceRoot":"","sources":["../src/emmet.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAEV,UAAU,EAGV,OAAO,EAER,MAAM,aAAa,CAAC;AAmBrB,MAAM,WAAW,gBAAgB;IAC/B,QAAQ,CAAC,KAAK,CAAC,EAAE,SAAS,OAAO,EAAE,CAAC;IACpC,QAAQ,CAAC,WAAW,EAAE,SAAS,UAAU,EAAE,CAAC;CAC7C;AAgRD,wBAAgB,gBAAgB,CAAC,MAAM,EAAE,MAAM,GAAG,gBAAgB,CAUjE"}
package/dist/emmet.js ADDED
@@ -0,0 +1,267 @@
1
+ function positionAt(source, offset) {
2
+ const before = source.slice(0, offset);
3
+ const lines = before.split("\n");
4
+ return {
5
+ line: lines.length - 1,
6
+ character: lines.at(-1)?.length ?? 0,
7
+ offset,
8
+ };
9
+ }
10
+ function rangeAt(source, start, end) {
11
+ return { start: positionAt(source, start), end: positionAt(source, end) };
12
+ }
13
+ function tokenize(source) {
14
+ const tokens = [];
15
+ let offset = 0;
16
+ while (offset < source.length) {
17
+ const character = source[offset];
18
+ if (/\s/.test(character)) {
19
+ offset += 1;
20
+ continue;
21
+ }
22
+ if (">+()[]=".includes(character)) {
23
+ tokens.push({ kind: character, value: character, start: offset, end: offset + 1 });
24
+ offset += 1;
25
+ continue;
26
+ }
27
+ if (character === "\"" || character === "'") {
28
+ const quote = character;
29
+ const start = offset;
30
+ offset += 1;
31
+ let value = "";
32
+ while (offset < source.length && source[offset] !== quote) {
33
+ if (source[offset] === "\\" && offset + 1 < source.length) {
34
+ offset += 1;
35
+ }
36
+ value += source[offset];
37
+ offset += 1;
38
+ }
39
+ if (source[offset] === quote) {
40
+ offset += 1;
41
+ }
42
+ tokens.push({ kind: "string", value, start, end: offset });
43
+ continue;
44
+ }
45
+ const start = offset;
46
+ while (offset < source.length && !/[\s>+()[\]=]/.test(source[offset])) {
47
+ offset += 1;
48
+ }
49
+ const value = source.slice(start, offset);
50
+ tokens.push({
51
+ kind: /^\d+$/.test(value) ? "number" : "identifier",
52
+ value,
53
+ start,
54
+ end: offset,
55
+ });
56
+ }
57
+ tokens.push({ kind: "eof", value: "", start: source.length, end: source.length });
58
+ return tokens;
59
+ }
60
+ class EmmetParser {
61
+ source;
62
+ tokens;
63
+ diagnostics = [];
64
+ index = 0;
65
+ constructor(source, tokens) {
66
+ this.source = source;
67
+ this.tokens = tokens;
68
+ }
69
+ parse() {
70
+ const nodes = this.parseSiblings();
71
+ if (this.current().kind !== "eof") {
72
+ this.error("YF_EMMET_UNEXPECTED", `Unexpected token '${this.current().value}'.`, this.current());
73
+ }
74
+ return nodes;
75
+ }
76
+ parseSiblings() {
77
+ const nodes = this.parsePrimary();
78
+ while (this.match("+")) {
79
+ nodes.push(...this.parsePrimary());
80
+ }
81
+ return nodes;
82
+ }
83
+ parsePrimary() {
84
+ let nodes;
85
+ if (this.match("(")) {
86
+ nodes = this.parseSiblings();
87
+ this.expect(")", "Expected ')' to close the group.");
88
+ }
89
+ else {
90
+ const token = this.expect("identifier", "Expected row, col or field.");
91
+ if (!token) {
92
+ return [];
93
+ }
94
+ const attributes = this.parseAttributes();
95
+ nodes = [{ name: token.value, attributes, children: [], start: token.start, end: this.previous().end }];
96
+ }
97
+ if (this.match(">")) {
98
+ const children = this.parseSiblings();
99
+ nodes = nodes.map((node) => ({ ...node, children, end: children.at(-1)?.end ?? node.end }));
100
+ }
101
+ return nodes;
102
+ }
103
+ parseAttributes() {
104
+ if (!this.match("[")) {
105
+ return {};
106
+ }
107
+ const attributes = {};
108
+ while (this.current().kind !== "]" && this.current().kind !== "eof") {
109
+ const name = this.expect("identifier", "Expected an attribute name.");
110
+ if (!name) {
111
+ this.advance();
112
+ continue;
113
+ }
114
+ this.expect("=", `Expected '=' after '${name.value}'.`);
115
+ const value = this.current();
116
+ if (value.kind !== "identifier" && value.kind !== "number" && value.kind !== "string") {
117
+ this.error("YF_EMMET_ATTRIBUTE", `Expected a value for '${name.value}'.`, value);
118
+ }
119
+ else {
120
+ attributes[name.value] = value.value;
121
+ this.advance();
122
+ }
123
+ }
124
+ this.expect("]", "Expected ']' to close attributes.");
125
+ return attributes;
126
+ }
127
+ current() {
128
+ return this.tokens[this.index];
129
+ }
130
+ previous() {
131
+ return this.tokens[Math.max(0, this.index - 1)];
132
+ }
133
+ advance() {
134
+ const token = this.current();
135
+ if (token.kind !== "eof") {
136
+ this.index += 1;
137
+ }
138
+ return token;
139
+ }
140
+ match(kind) {
141
+ if (this.current().kind !== kind) {
142
+ return false;
143
+ }
144
+ this.advance();
145
+ return true;
146
+ }
147
+ expect(kind, message) {
148
+ if (this.current().kind === kind) {
149
+ return this.advance();
150
+ }
151
+ this.error("YF_EMMET_SYNTAX", message, this.current());
152
+ return undefined;
153
+ }
154
+ error(code, message, token) {
155
+ this.diagnostics.push({
156
+ code,
157
+ message,
158
+ severity: "error",
159
+ path: [],
160
+ range: rangeAt(this.source, token.start, token.end),
161
+ });
162
+ }
163
+ }
164
+ function numericAttribute(node, name, diagnostics, source) {
165
+ const rawValue = node.attributes[name];
166
+ if (rawValue === undefined) {
167
+ return undefined;
168
+ }
169
+ const value = Number(rawValue);
170
+ if (!Number.isInteger(value)) {
171
+ diagnostics.push({
172
+ code: "YF_EMMET_SPAN",
173
+ message: `${name} must be an integer.`,
174
+ severity: "error",
175
+ path: [],
176
+ range: rangeAt(source, node.start, node.end),
177
+ });
178
+ return undefined;
179
+ }
180
+ return value;
181
+ }
182
+ function convertField(node, diagnostics, source) {
183
+ const path = node.attributes.path;
184
+ if (!path) {
185
+ diagnostics.push({
186
+ code: "YF_EMMET_FIELD_PATH",
187
+ message: "field requires a path attribute.",
188
+ severity: "error",
189
+ path: [],
190
+ range: rangeAt(source, node.start, node.end),
191
+ });
192
+ return undefined;
193
+ }
194
+ if (node.children.length > 0) {
195
+ diagnostics.push({
196
+ code: "YF_EMMET_FIELD_CHILDREN",
197
+ message: "field cannot contain children.",
198
+ severity: "error",
199
+ path: [],
200
+ range: rangeAt(source, node.start, node.end),
201
+ });
202
+ }
203
+ return { type: "field", path, ...(node.attributes.id ? { id: node.attributes.id } : {}) };
204
+ }
205
+ function convertRow(node, diagnostics, source) {
206
+ if (node.name !== "row") {
207
+ diagnostics.push({
208
+ code: "YF_EMMET_ROOT",
209
+ message: "The Emmet layout root may only contain row nodes.",
210
+ severity: "error",
211
+ path: [],
212
+ range: rangeAt(source, node.start, node.end),
213
+ });
214
+ return undefined;
215
+ }
216
+ const children = node.children
217
+ .map((child) => {
218
+ if (child.name !== "col") {
219
+ diagnostics.push({
220
+ code: "YF_EMMET_ROW_CHILD",
221
+ message: "row may only contain col nodes.",
222
+ severity: "error",
223
+ path: [],
224
+ range: rangeAt(source, child.start, child.end),
225
+ });
226
+ return undefined;
227
+ }
228
+ const columnChildren = child.children
229
+ .map((columnChild) => columnChild.name === "row"
230
+ ? convertRow(columnChild, diagnostics, source)
231
+ : columnChild.name === "field"
232
+ ? convertField(columnChild, diagnostics, source)
233
+ : undefined)
234
+ .filter((value) => value !== undefined);
235
+ const mobile = numericAttribute(child, "mobile", diagnostics, source);
236
+ const tablet = numericAttribute(child, "tablet", diagnostics, source);
237
+ const desktop = numericAttribute(child, "desktop", diagnostics, source);
238
+ const span = {
239
+ ...(mobile !== undefined ? { mobile } : {}),
240
+ ...(tablet !== undefined ? { tablet } : {}),
241
+ ...(desktop !== undefined ? { desktop } : {}),
242
+ };
243
+ return {
244
+ type: "column",
245
+ ...(child.attributes.id ? { id: child.attributes.id } : {}),
246
+ ...(Object.keys(span).length > 0 ? { span } : {}),
247
+ children: columnChildren,
248
+ };
249
+ })
250
+ .filter((value) => value !== undefined);
251
+ return {
252
+ type: "row",
253
+ ...(node.attributes.id ? { id: node.attributes.id } : {}),
254
+ children,
255
+ };
256
+ }
257
+ export function parseEmmetLayout(source) {
258
+ const parser = new EmmetParser(source, tokenize(source));
259
+ const rawNodes = parser.parse();
260
+ const diagnostics = [...parser.diagnostics];
261
+ const value = rawNodes
262
+ .map((node) => convertRow(node, diagnostics, source))
263
+ .filter((node) => node !== undefined);
264
+ return diagnostics.some(({ severity }) => severity === "error")
265
+ ? { diagnostics }
266
+ : { value, diagnostics };
267
+ }
@@ -0,0 +1,5 @@
1
+ export * from "./emmet.js";
2
+ export * from "./normalize.js";
3
+ export * from "./validate.js";
4
+ export * from "./yaml.js";
5
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,YAAY,CAAC;AAC3B,cAAc,gBAAgB,CAAC;AAC/B,cAAc,eAAe,CAAC;AAC9B,cAAc,WAAW,CAAC"}
package/dist/index.js ADDED
@@ -0,0 +1,4 @@
1
+ export * from "./emmet.js";
2
+ export * from "./normalize.js";
3
+ export * from "./validate.js";
4
+ export * from "./yaml.js";
@@ -0,0 +1,3 @@
1
+ import type { FormSpec, NormalizedFormSpec } from "a-form-core";
2
+ export declare function normalizeFormSpec(spec: FormSpec): NormalizedFormSpec;
3
+ //# sourceMappingURL=normalize.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"normalize.d.ts","sourceRoot":"","sources":["../src/normalize.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAEV,QAAQ,EAGR,kBAAkB,EAKnB,MAAM,aAAa,CAAC;AAmCrB,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,QAAQ,GAAG,kBAAkB,CAKpE"}
@@ -0,0 +1,36 @@
1
+ function normalizeSpan(span) {
2
+ const responsive = typeof span === "number" ? { mobile: span } : span;
3
+ const mobile = responsive?.mobile ?? 12;
4
+ const tablet = responsive?.tablet ?? mobile;
5
+ return {
6
+ mobile,
7
+ tablet,
8
+ desktop: responsive?.desktop ?? tablet,
9
+ };
10
+ }
11
+ function normalizeRow(row, path) {
12
+ return {
13
+ ...row,
14
+ id: row.id ?? path,
15
+ children: row.children.map((column, index) => normalizeColumn(column, `${path}.column-${index + 1}`)),
16
+ };
17
+ }
18
+ function normalizeColumn(column, path) {
19
+ return {
20
+ ...column,
21
+ id: column.id ?? path,
22
+ span: normalizeSpan(column.span),
23
+ children: column.children.map((child, index) => {
24
+ const childPath = `${path}.${child.type}-${index + 1}`;
25
+ return child.type === "row"
26
+ ? normalizeRow(child, childPath)
27
+ : { ...child, id: child.id ?? childPath };
28
+ }),
29
+ };
30
+ }
31
+ export function normalizeFormSpec(spec) {
32
+ return {
33
+ ...spec,
34
+ layout: spec.layout.map((row, index) => normalizeRow(row, `row-${index + 1}`)),
35
+ };
36
+ }
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=parser.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"parser.test.d.ts","sourceRoot":"","sources":["../src/parser.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,78 @@
1
+ import { describe, expect, it } from "vitest";
2
+ import { normalizeFormSpec, parseEmmetLayout, parseYamlSpec, validateFormSpec } from "./index.js";
3
+ const validSource = `
4
+ version: "1"
5
+ schema:
6
+ type: object
7
+ properties:
8
+ person:
9
+ type: object
10
+ properties:
11
+ name: { type: string }
12
+ email: { type: string, format: email }
13
+ layout:
14
+ - type: row
15
+ children:
16
+ - type: column
17
+ span: { mobile: 12, tablet: 6 }
18
+ children:
19
+ - type: field
20
+ path: person.name
21
+ - type: column
22
+ span: { mobile: 12, tablet: 6 }
23
+ children:
24
+ - type: field
25
+ path: person.email
26
+ validations:
27
+ async:
28
+ - id: email-available
29
+ adapter: customer-api
30
+ paths: [person.email]
31
+ triggers: [blur, submit]
32
+ timeoutMs: 5000
33
+ `;
34
+ describe("YAML form specs", () => {
35
+ it("parses, validates and normalizes a responsive form", () => {
36
+ const parsed = parseYamlSpec(validSource);
37
+ expect(parsed.diagnostics).toEqual([]);
38
+ expect(parsed.value).toBeDefined();
39
+ const diagnostics = validateFormSpec(parsed.value);
40
+ expect(diagnostics).toEqual([]);
41
+ const normalized = normalizeFormSpec(parsed.value);
42
+ expect(normalized.layout[0]?.children[0]?.span).toEqual({
43
+ mobile: 12,
44
+ tablet: 6,
45
+ desktop: 6,
46
+ });
47
+ expect(normalized.layout[0]?.children[0]?.children[0]?.id).toBe("row-1.column-1.field-1");
48
+ });
49
+ it("reports invalid field paths and spans", () => {
50
+ const parsed = parseYamlSpec(validSource.replace("person.name", "person.missing").replace("tablet: 6", "tablet: 13"));
51
+ const diagnostics = validateFormSpec(parsed.value);
52
+ expect(diagnostics.map(({ code }) => code)).toEqual(expect.arrayContaining(["YF_FIELD_PATH", "YF_LAYOUT_SPAN"]));
53
+ });
54
+ it("returns a ranged diagnostic for malformed YAML", () => {
55
+ const parsed = parseYamlSpec("version: [\n");
56
+ expect(parsed.value).toBeUndefined();
57
+ expect(parsed.diagnostics[0]?.code).toBe("YF_PARSE_YAML");
58
+ expect(parsed.diagnostics[0]?.range?.start.line).toBe(1);
59
+ });
60
+ });
61
+ describe("Emmet layouts", () => {
62
+ it("parses grouped responsive columns", () => {
63
+ const parsed = parseEmmetLayout("row>(col[mobile=12 tablet=6]>field[path=person.name])+(col[mobile=12 tablet=6]>field[path=person.email])");
64
+ expect(parsed.diagnostics).toEqual([]);
65
+ expect(parsed.value).toHaveLength(1);
66
+ expect(parsed.value?.[0]?.children).toHaveLength(2);
67
+ expect(parsed.value?.[0]?.children[1]?.children[0]).toEqual({
68
+ type: "field",
69
+ path: "person.email",
70
+ });
71
+ });
72
+ it("reports invalid hierarchy with a source range", () => {
73
+ const parsed = parseEmmetLayout("row>field[path=name]");
74
+ expect(parsed.value).toBeUndefined();
75
+ expect(parsed.diagnostics[0]?.code).toBe("YF_EMMET_ROW_CHILD");
76
+ expect(parsed.diagnostics[0]?.range?.start.offset).toBe(4);
77
+ });
78
+ });
@@ -0,0 +1 @@
1
+ {"fileNames":["../../../node_modules/typescript/lib/lib.es5.d.ts","../../../node_modules/typescript/lib/lib.es2015.d.ts","../../../node_modules/typescript/lib/lib.es2016.d.ts","../../../node_modules/typescript/lib/lib.es2017.d.ts","../../../node_modules/typescript/lib/lib.es2018.d.ts","../../../node_modules/typescript/lib/lib.es2019.d.ts","../../../node_modules/typescript/lib/lib.es2020.d.ts","../../../node_modules/typescript/lib/lib.es2021.d.ts","../../../node_modules/typescript/lib/lib.es2022.d.ts","../../../node_modules/typescript/lib/lib.es2023.d.ts","../../../node_modules/typescript/lib/lib.dom.d.ts","../../../node_modules/typescript/lib/lib.dom.iterable.d.ts","../../../node_modules/typescript/lib/lib.es2015.core.d.ts","../../../node_modules/typescript/lib/lib.es2015.collection.d.ts","../../../node_modules/typescript/lib/lib.es2015.generator.d.ts","../../../node_modules/typescript/lib/lib.es2015.iterable.d.ts","../../../node_modules/typescript/lib/lib.es2015.promise.d.ts","../../../node_modules/typescript/lib/lib.es2015.proxy.d.ts","../../../node_modules/typescript/lib/lib.es2015.reflect.d.ts","../../../node_modules/typescript/lib/lib.es2015.symbol.d.ts","../../../node_modules/typescript/lib/lib.es2015.symbol.wellknown.d.ts","../../../node_modules/typescript/lib/lib.es2016.array.include.d.ts","../../../node_modules/typescript/lib/lib.es2016.intl.d.ts","../../../node_modules/typescript/lib/lib.es2017.arraybuffer.d.ts","../../../node_modules/typescript/lib/lib.es2017.date.d.ts","../../../node_modules/typescript/lib/lib.es2017.object.d.ts","../../../node_modules/typescript/lib/lib.es2017.sharedmemory.d.ts","../../../node_modules/typescript/lib/lib.es2017.string.d.ts","../../../node_modules/typescript/lib/lib.es2017.intl.d.ts","../../../node_modules/typescript/lib/lib.es2017.typedarrays.d.ts","../../../node_modules/typescript/lib/lib.es2018.asyncgenerator.d.ts","../../../node_modules/typescript/lib/lib.es2018.asynciterable.d.ts","../../../node_modules/typescript/lib/lib.es2018.intl.d.ts","../../../node_modules/typescript/lib/lib.es2018.promise.d.ts","../../../node_modules/typescript/lib/lib.es2018.regexp.d.ts","../../../node_modules/typescript/lib/lib.es2019.array.d.ts","../../../node_modules/typescript/lib/lib.es2019.object.d.ts","../../../node_modules/typescript/lib/lib.es2019.string.d.ts","../../../node_modules/typescript/lib/lib.es2019.symbol.d.ts","../../../node_modules/typescript/lib/lib.es2019.intl.d.ts","../../../node_modules/typescript/lib/lib.es2020.bigint.d.ts","../../../node_modules/typescript/lib/lib.es2020.date.d.ts","../../../node_modules/typescript/lib/lib.es2020.promise.d.ts","../../../node_modules/typescript/lib/lib.es2020.sharedmemory.d.ts","../../../node_modules/typescript/lib/lib.es2020.string.d.ts","../../../node_modules/typescript/lib/lib.es2020.symbol.wellknown.d.ts","../../../node_modules/typescript/lib/lib.es2020.intl.d.ts","../../../node_modules/typescript/lib/lib.es2020.number.d.ts","../../../node_modules/typescript/lib/lib.es2021.promise.d.ts","../../../node_modules/typescript/lib/lib.es2021.string.d.ts","../../../node_modules/typescript/lib/lib.es2021.weakref.d.ts","../../../node_modules/typescript/lib/lib.es2021.intl.d.ts","../../../node_modules/typescript/lib/lib.es2022.array.d.ts","../../../node_modules/typescript/lib/lib.es2022.error.d.ts","../../../node_modules/typescript/lib/lib.es2022.intl.d.ts","../../../node_modules/typescript/lib/lib.es2022.object.d.ts","../../../node_modules/typescript/lib/lib.es2022.string.d.ts","../../../node_modules/typescript/lib/lib.es2022.regexp.d.ts","../../../node_modules/typescript/lib/lib.es2023.array.d.ts","../../../node_modules/typescript/lib/lib.es2023.collection.d.ts","../../../node_modules/typescript/lib/lib.es2023.intl.d.ts","../../../node_modules/typescript/lib/lib.esnext.disposable.d.ts","../../../node_modules/typescript/lib/lib.esnext.float16.d.ts","../../../node_modules/typescript/lib/lib.decorators.d.ts","../../../node_modules/typescript/lib/lib.decorators.legacy.d.ts","../../core/dist/index.d.ts","../src/emmet.ts","../src/normalize.ts","../src/validate.ts","../../../node_modules/yaml/dist/parse/line-counter.d.ts","../../../node_modules/yaml/dist/errors.d.ts","../../../node_modules/yaml/dist/doc/applyReviver.d.ts","../../../node_modules/yaml/dist/log.d.ts","../../../node_modules/yaml/dist/nodes/toJS.d.ts","../../../node_modules/yaml/dist/nodes/Scalar.d.ts","../../../node_modules/yaml/dist/stringify/stringify.d.ts","../../../node_modules/yaml/dist/nodes/Collection.d.ts","../../../node_modules/yaml/dist/nodes/YAMLSeq.d.ts","../../../node_modules/yaml/dist/schema/types.d.ts","../../../node_modules/yaml/dist/schema/common/map.d.ts","../../../node_modules/yaml/dist/schema/common/seq.d.ts","../../../node_modules/yaml/dist/schema/common/string.d.ts","../../../node_modules/yaml/dist/stringify/foldFlowLines.d.ts","../../../node_modules/yaml/dist/stringify/stringifyNumber.d.ts","../../../node_modules/yaml/dist/stringify/stringifyString.d.ts","../../../node_modules/yaml/dist/util.d.ts","../../../node_modules/yaml/dist/nodes/YAMLMap.d.ts","../../../node_modules/yaml/dist/nodes/identity.d.ts","../../../node_modules/yaml/dist/schema/Schema.d.ts","../../../node_modules/yaml/dist/doc/createNode.d.ts","../../../node_modules/yaml/dist/nodes/addPairToJSMap.d.ts","../../../node_modules/yaml/dist/nodes/Pair.d.ts","../../../node_modules/yaml/dist/schema/tags.d.ts","../../../node_modules/yaml/dist/options.d.ts","../../../node_modules/yaml/dist/nodes/Node.d.ts","../../../node_modules/yaml/dist/parse/cst-scalar.d.ts","../../../node_modules/yaml/dist/parse/cst-stringify.d.ts","../../../node_modules/yaml/dist/parse/cst-visit.d.ts","../../../node_modules/yaml/dist/parse/cst.d.ts","../../../node_modules/yaml/dist/nodes/Alias.d.ts","../../../node_modules/yaml/dist/doc/Document.d.ts","../../../node_modules/yaml/dist/doc/directives.d.ts","../../../node_modules/yaml/dist/compose/composer.d.ts","../../../node_modules/yaml/dist/parse/lexer.d.ts","../../../node_modules/yaml/dist/parse/parser.d.ts","../../../node_modules/yaml/dist/public-api.d.ts","../../../node_modules/yaml/dist/schema/yaml-1.1/omap.d.ts","../../../node_modules/yaml/dist/schema/yaml-1.1/set.d.ts","../../../node_modules/yaml/dist/visit.d.ts","../../../node_modules/yaml/dist/index.d.ts","../src/yaml.ts","../src/index.ts","../../../node_modules/@types/deep-eql/index.d.ts","../../../node_modules/assertion-error/index.d.ts","../../../node_modules/@types/chai/index.d.ts","../../../node_modules/@types/esrecurse/index.d.ts","../../../node_modules/@types/estree/index.d.ts","../../../node_modules/@types/json-schema/index.d.ts","../../../node_modules/@types/node/compatibility/iterators.d.ts","../../../node_modules/@types/node/globals.typedarray.d.ts","../../../node_modules/@types/node/buffer.buffer.d.ts","../../../node_modules/@types/node/globals.d.ts","../../../node_modules/@types/node/web-globals/abortcontroller.d.ts","../../../node_modules/@types/node/web-globals/crypto.d.ts","../../../node_modules/@types/node/web-globals/domexception.d.ts","../../../node_modules/@types/node/web-globals/events.d.ts","../../../node_modules/undici-types/utility.d.ts","../../../node_modules/undici-types/header.d.ts","../../../node_modules/undici-types/readable.d.ts","../../../node_modules/undici-types/fetch.d.ts","../../../node_modules/undici-types/formdata.d.ts","../../../node_modules/undici-types/connector.d.ts","../../../node_modules/undici-types/client-stats.d.ts","../../../node_modules/undici-types/client.d.ts","../../../node_modules/undici-types/errors.d.ts","../../../node_modules/undici-types/dispatcher.d.ts","../../../node_modules/undici-types/global-dispatcher.d.ts","../../../node_modules/undici-types/global-origin.d.ts","../../../node_modules/undici-types/pool-stats.d.ts","../../../node_modules/undici-types/pool.d.ts","../../../node_modules/undici-types/handlers.d.ts","../../../node_modules/undici-types/balanced-pool.d.ts","../../../node_modules/undici-types/round-robin-pool.d.ts","../../../node_modules/undici-types/h2c-client.d.ts","../../../node_modules/undici-types/agent.d.ts","../../../node_modules/undici-types/mock-interceptor.d.ts","../../../node_modules/undici-types/mock-call-history.d.ts","../../../node_modules/undici-types/mock-agent.d.ts","../../../node_modules/undici-types/mock-client.d.ts","../../../node_modules/undici-types/mock-pool.d.ts","../../../node_modules/undici-types/snapshot-agent.d.ts","../../../node_modules/undici-types/mock-errors.d.ts","../../../node_modules/undici-types/proxy-agent.d.ts","../../../node_modules/undici-types/env-http-proxy-agent.d.ts","../../../node_modules/undici-types/retry-handler.d.ts","../../../node_modules/undici-types/retry-agent.d.ts","../../../node_modules/undici-types/api.d.ts","../../../node_modules/undici-types/cache-interceptor.d.ts","../../../node_modules/undici-types/interceptors.d.ts","../../../node_modules/undici-types/util.d.ts","../../../node_modules/undici-types/cookies.d.ts","../../../node_modules/undici-types/patch.d.ts","../../../node_modules/undici-types/websocket.d.ts","../../../node_modules/undici-types/eventsource.d.ts","../../../node_modules/undici-types/diagnostics-channel.d.ts","../../../node_modules/undici-types/content-type.d.ts","../../../node_modules/undici-types/cache.d.ts","../../../node_modules/undici-types/index.d.ts","../../../node_modules/@types/node/web-globals/fetch.d.ts","../../../node_modules/@types/node/web-globals/navigator.d.ts","../../../node_modules/@types/node/web-globals/storage.d.ts","../../../node_modules/@types/node/web-globals/streams.d.ts","../../../node_modules/@types/node/assert.d.ts","../../../node_modules/@types/node/assert/strict.d.ts","../../../node_modules/@types/node/async_hooks.d.ts","../../../node_modules/@types/node/buffer.d.ts","../../../node_modules/@types/node/child_process.d.ts","../../../node_modules/@types/node/cluster.d.ts","../../../node_modules/@types/node/console.d.ts","../../../node_modules/@types/node/constants.d.ts","../../../node_modules/@types/node/crypto.d.ts","../../../node_modules/@types/node/dgram.d.ts","../../../node_modules/@types/node/diagnostics_channel.d.ts","../../../node_modules/@types/node/dns.d.ts","../../../node_modules/@types/node/dns/promises.d.ts","../../../node_modules/@types/node/domain.d.ts","../../../node_modules/@types/node/events.d.ts","../../../node_modules/@types/node/fs.d.ts","../../../node_modules/@types/node/fs/promises.d.ts","../../../node_modules/@types/node/http.d.ts","../../../node_modules/@types/node/http2.d.ts","../../../node_modules/@types/node/https.d.ts","../../../node_modules/@types/node/inspector.d.ts","../../../node_modules/@types/node/inspector.generated.d.ts","../../../node_modules/@types/node/module.d.ts","../../../node_modules/@types/node/net.d.ts","../../../node_modules/@types/node/os.d.ts","../../../node_modules/@types/node/path.d.ts","../../../node_modules/@types/node/perf_hooks.d.ts","../../../node_modules/@types/node/process.d.ts","../../../node_modules/@types/node/punycode.d.ts","../../../node_modules/@types/node/querystring.d.ts","../../../node_modules/@types/node/readline.d.ts","../../../node_modules/@types/node/readline/promises.d.ts","../../../node_modules/@types/node/repl.d.ts","../../../node_modules/@types/node/sea.d.ts","../../../node_modules/@types/node/sqlite.d.ts","../../../node_modules/@types/node/stream.d.ts","../../../node_modules/@types/node/stream/promises.d.ts","../../../node_modules/@types/node/stream/consumers.d.ts","../../../node_modules/@types/node/stream/web.d.ts","../../../node_modules/@types/node/string_decoder.d.ts","../../../node_modules/@types/node/test.d.ts","../../../node_modules/@types/node/timers.d.ts","../../../node_modules/@types/node/timers/promises.d.ts","../../../node_modules/@types/node/tls.d.ts","../../../node_modules/@types/node/trace_events.d.ts","../../../node_modules/@types/node/tty.d.ts","../../../node_modules/@types/node/url.d.ts","../../../node_modules/@types/node/util.d.ts","../../../node_modules/@types/node/v8.d.ts","../../../node_modules/@types/node/vm.d.ts","../../../node_modules/@types/node/wasi.d.ts","../../../node_modules/@types/node/worker_threads.d.ts","../../../node_modules/@types/node/zlib.d.ts","../../../node_modules/@types/node/index.d.ts","../../../node_modules/@types/react/global.d.ts","../../../node_modules/csstype/index.d.ts","../../../node_modules/@types/react/index.d.ts","../../../node_modules/@types/react-dom/index.d.ts"],"fileIdsList":[[113,114,121,176,193,194],[121,176,193,194],[121,173,174,176,193,194],[121,175,176,193,194],[176,193,194],[121,176,181,193,194,211],[121,176,177,182,187,193,194,196,208,219],[121,176,177,178,187,193,194,196],[121,176,179,193,194,220],[121,176,180,181,188,193,194,197],[121,176,181,193,194,208,216],[121,176,182,184,187,193,194,196],[121,175,176,183,193,194],[121,176,184,185,193,194],[121,176,186,187,193,194],[121,175,176,187,193,194],[121,176,187,188,189,193,194,208,219],[121,176,187,188,189,193,194,203,208,211],[121,168,176,184,187,190,193,194,196,208,219],[121,176,187,188,190,191,193,194,196,208,216,219],[121,176,190,192,193,194,208,216,219],[119,120,121,122,123,124,125,126,169,170,171,172,173,174,175,176,177,178,179,180,181,182,183,184,185,186,187,188,189,190,191,192,193,194,195,196,197,198,199,200,201,202,203,204,205,206,207,208,209,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225],[121,176,187,193,194],[121,176,193,194,195,219],[121,176,184,187,193,194,196,208],[121,176,193,194,197],[121,176,193,194,198],[121,175,176,193,194,199],[121,173,174,175,176,177,178,179,180,181,182,183,184,185,186,187,188,189,190,191,192,193,194,195,196,197,198,199,200,201,202,203,204,205,206,207,208,209,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225],[121,176,193,194,201],[121,176,193,194,202],[121,176,187,193,194,203,204],[121,176,193,194,203,205,220,222],[121,176,188,193,194],[121,176,187,193,194,208,209,211],[121,176,193,194,210,211],[121,176,193,194,208,209],[121,176,193,194,211],[121,176,193,194,212],[121,173,176,193,194,208,213,219],[121,176,187,193,194,214,215],[121,176,193,194,214,215],[121,176,181,193,194,196,208,216],[121,176,193,194,217],[121,176,193,194,196,218],[121,176,190,193,194,202,219],[121,176,181,193,194,220],[121,176,193,194,208,221],[121,176,193,194,195,222],[121,176,193,194,223],[121,176,181,193,194],[121,168,176,193,194],[121,176,193,194,224],[121,168,176,187,189,193,194,199,208,211,219,221,222,224],[121,176,193,194,208,225],[121,176,193,194,229],[121,176,193,194,227,228],[121,133,136,139,140,176,193,194,219],[121,136,176,193,194,208,219],[121,136,140,176,193,194,219],[121,176,193,194,208],[121,130,176,193,194],[121,134,176,193,194],[121,132,133,136,176,193,194,219],[121,176,193,194,196,216],[121,176,193,194,226],[121,130,176,193,194,226],[121,132,136,176,193,194,196,219],[121,127,128,129,131,135,176,187,193,194,208,219],[121,136,145,153,176,193,194],[121,128,134,176,193,194],[121,136,162,163,176,193,194],[121,128,131,136,176,193,194,211,219,226],[121,136,176,193,194],[121,132,136,176,193,194,219],[121,127,176,193,194],[121,130,131,132,134,135,136,137,138,140,141,142,143,144,145,146,147,148,149,150,151,152,153,154,155,156,157,158,159,160,161,163,164,165,166,167,176,193,194],[121,136,155,158,176,184,193,194],[121,136,145,146,147,176,193,194],[121,134,136,146,148,176,193,194],[121,135,176,193,194],[121,128,130,136,176,193,194],[121,136,140,146,148,176,193,194],[121,140,176,193,194],[121,134,136,139,176,193,194,219],[121,128,132,136,145,176,193,194],[121,136,155,176,193,194],[121,148,176,193,194],[121,130,136,162,176,193,194,211,224,226],[71,94,95,99,101,102,121,176,193,194],[71,75,78,87,88,89,92,94,95,100,102,121,176,193,194],[79,89,95,101,121,176,193,194],[101,121,176,193,194],[70,121,176,193,194],[70,71,75,78,79,87,88,89,92,93,94,95,99,100,101,103,104,105,106,107,108,109,121,176,193,194],[74,75,76,78,87,95,99,101,121,176,193,194],[88,89,95,121,176,193,194],[74,75,76,78,87,88,94,99,100,101,121,176,193,194],[74,76,88,89,90,91,95,99,121,176,193,194],[74,95,99,121,176,193,194],[74,75,76,77,86,89,92,95,99,121,176,193,194],[74,75,76,77,89,90,92,95,99,121,176,193,194],[74,87,92,121,176,193,194],[75,78,87,92,95,100,101,121,176,193,194],[95,101,121,176,193,194],[70,72,73,75,79,89,92,93,95,102,121,176,193,194],[71,75,95,99,121,176,193,194],[99,121,176,193,194],[96,97,98,121,176,193,194],[72,94,95,101,103,121,176,193,194],[79,88,92,94,121,176,193,194],[79,121,176,193,194],[79,94,121,176,193,194],[75,76,78,87,89,90,94,95,121,176,193,194],[74,78,79,86,87,89,121,176,193,194],[74,75,76,79,86,87,89,92,121,176,193,194],[94,100,101,121,176,193,194],[75,121,176,193,194],[75,76,121,176,193,194],[73,74,76,80,81,82,83,84,85,87,90,92,121,176,193,194],[66,121,176,193,194],[67,68,69,111,121,176,193,194],[66,110,121,176,193,194]],"fileInfos":[{"version":"c430d44666289dae81f30fa7b2edebf186ecc91a2d4c71266ea6ae76388792e1","affectsGlobalScope":true,"impliedFormat":1},{"version":"45b7ab580deca34ae9729e97c13cfd999df04416a79116c3bfb483804f85ded4","impliedFormat":1},{"version":"3facaf05f0c5fc569c5649dd359892c98a85557e3e0c847964caeb67076f4d75","impliedFormat":1},{"version":"e44bb8bbac7f10ecc786703fe0a6a4b952189f908707980ba8f3c8975a760962","impliedFormat":1},{"version":"5e1c4c362065a6b95ff952c0eab010f04dcd2c3494e813b493ecfd4fcb9fc0d8","impliedFormat":1},{"version":"68d73b4a11549f9c0b7d352d10e91e5dca8faa3322bfb77b661839c42b1ddec7","impliedFormat":1},{"version":"5efce4fc3c29ea84e8928f97adec086e3dc876365e0982cc8479a07954a3efd4","impliedFormat":1},{"version":"feecb1be483ed332fad555aff858affd90a48ab19ba7272ee084704eb7167569","impliedFormat":1},{"version":"ee7bad0c15b58988daa84371e0b89d313b762ab83cb5b31b8a2d1162e8eb41c2","impliedFormat":1},{"version":"27bdc30a0e32783366a5abeda841bc22757c1797de8681bbe81fbc735eeb1c10","impliedFormat":1},{"version":"080941d9f9ff9307f7e27a83bcd888b7c8270716c39af943532438932ec1d0b9","affectsGlobalScope":true,"impliedFormat":1},{"version":"2e80ee7a49e8ac312cc11b77f1475804bee36b3b2bc896bead8b6e1266befb43","affectsGlobalScope":true,"impliedFormat":1},{"version":"c57796738e7f83dbc4b8e65132f11a377649c00dd3eee333f672b8f0a6bea671","affectsGlobalScope":true,"impliedFormat":1},{"version":"dc2df20b1bcdc8c2d34af4926e2c3ab15ffe1160a63e58b7e09833f616efff44","affectsGlobalScope":true,"impliedFormat":1},{"version":"515d0b7b9bea2e31ea4ec968e9edd2c39d3eebf4a2d5cbd04e88639819ae3b71","affectsGlobalScope":true,"impliedFormat":1},{"version":"0559b1f683ac7505ae451f9a96ce4c3c92bdc71411651ca6ddb0e88baaaad6a3","affectsGlobalScope":true,"impliedFormat":1},{"version":"0dc1e7ceda9b8b9b455c3a2d67b0412feab00bd2f66656cd8850e8831b08b537","affectsGlobalScope":true,"impliedFormat":1},{"version":"ce691fb9e5c64efb9547083e4a34091bcbe5bdb41027e310ebba8f7d96a98671","affectsGlobalScope":true,"impliedFormat":1},{"version":"8d697a2a929a5fcb38b7a65594020fcef05ec1630804a33748829c5ff53640d0","affectsGlobalScope":true,"impliedFormat":1},{"version":"4ff2a353abf8a80ee399af572debb8faab2d33ad38c4b4474cff7f26e7653b8d","affectsGlobalScope":true,"impliedFormat":1},{"version":"fb0f136d372979348d59b3f5020b4cdb81b5504192b1cacff5d1fbba29378aa1","affectsGlobalScope":true,"impliedFormat":1},{"version":"d15bea3d62cbbdb9797079416b8ac375ae99162a7fba5de2c6c505446486ac0a","affectsGlobalScope":true,"impliedFormat":1},{"version":"68d18b664c9d32a7336a70235958b8997ebc1c3b8505f4f1ae2b7e7753b87618","affectsGlobalScope":true,"impliedFormat":1},{"version":"eb3d66c8327153d8fa7dd03f9c58d351107fe824c79e9b56b462935176cdf12a","affectsGlobalScope":true,"impliedFormat":1},{"version":"38f0219c9e23c915ef9790ab1d680440d95419ad264816fa15009a8851e79119","affectsGlobalScope":true,"impliedFormat":1},{"version":"69ab18c3b76cd9b1be3d188eaf8bba06112ebbe2f47f6c322b5105a6fbc45a2e","affectsGlobalScope":true,"impliedFormat":1},{"version":"a680117f487a4d2f30ea46f1b4b7f58bef1480456e18ba53ee85c2746eeca012","affectsGlobalScope":true,"impliedFormat":1},{"version":"2f11ff796926e0832f9ae148008138ad583bd181899ab7dd768a2666700b1893","affectsGlobalScope":true,"impliedFormat":1},{"version":"4de680d5bb41c17f7f68e0419412ca23c98d5749dcaaea1896172f06435891fc","affectsGlobalScope":true,"impliedFormat":1},{"version":"954296b30da6d508a104a3a0b5d96b76495c709785c1d11610908e63481ee667","affectsGlobalScope":true,"impliedFormat":1},{"version":"ac9538681b19688c8eae65811b329d3744af679e0bdfa5d842d0e32524c73e1c","affectsGlobalScope":true,"impliedFormat":1},{"version":"0a969edff4bd52585473d24995c5ef223f6652d6ef46193309b3921d65dd4376","affectsGlobalScope":true,"impliedFormat":1},{"version":"9e9fbd7030c440b33d021da145d3232984c8bb7916f277e8ffd3dc2e3eae2bdb","affectsGlobalScope":true,"impliedFormat":1},{"version":"811ec78f7fefcabbda4bfa93b3eb67d9ae166ef95f9bff989d964061cbf81a0c","affectsGlobalScope":true,"impliedFormat":1},{"version":"717937616a17072082152a2ef351cb51f98802fb4b2fdabd32399843875974ca","affectsGlobalScope":true,"impliedFormat":1},{"version":"d7e7d9b7b50e5f22c915b525acc5a49a7a6584cf8f62d0569e557c5cfc4b2ac2","affectsGlobalScope":true,"impliedFormat":1},{"version":"71c37f4c9543f31dfced6c7840e068c5a5aacb7b89111a4364b1d5276b852557","affectsGlobalScope":true,"impliedFormat":1},{"version":"576711e016cf4f1804676043e6a0a5414252560eb57de9faceee34d79798c850","affectsGlobalScope":true,"impliedFormat":1},{"version":"89c1b1281ba7b8a96efc676b11b264de7a8374c5ea1e6617f11880a13fc56dc6","affectsGlobalScope":true,"impliedFormat":1},{"version":"74f7fa2d027d5b33eb0471c8e82a6c87216223181ec31247c357a3e8e2fddc5b","affectsGlobalScope":true,"impliedFormat":1},{"version":"d6d7ae4d1f1f3772e2a3cde568ed08991a8ae34a080ff1151af28b7f798e22ca","affectsGlobalScope":true,"impliedFormat":1},{"version":"063600664504610fe3e99b717a1223f8b1900087fab0b4cad1496a114744f8df","affectsGlobalScope":true,"impliedFormat":1},{"version":"934019d7e3c81950f9a8426d093458b65d5aff2c7c1511233c0fd5b941e608ab","affectsGlobalScope":true,"impliedFormat":1},{"version":"52ada8e0b6e0482b728070b7639ee42e83a9b1c22d205992756fe020fd9f4a47","affectsGlobalScope":true,"impliedFormat":1},{"version":"3bdefe1bfd4d6dee0e26f928f93ccc128f1b64d5d501ff4a8cf3c6371200e5e6","affectsGlobalScope":true,"impliedFormat":1},{"version":"59fb2c069260b4ba00b5643b907ef5d5341b167e7d1dbf58dfd895658bda2867","affectsGlobalScope":true,"impliedFormat":1},{"version":"639e512c0dfc3fad96a84caad71b8834d66329a1f28dc95e3946c9b58176c73a","affectsGlobalScope":true,"impliedFormat":1},{"version":"368af93f74c9c932edd84c58883e736c9e3d53cec1fe24c0b0ff451f529ceab1","affectsGlobalScope":true,"impliedFormat":1},{"version":"af3dd424cf267428f30ccfc376f47a2c0114546b55c44d8c0f1d57d841e28d74","affectsGlobalScope":true,"impliedFormat":1},{"version":"995c005ab91a498455ea8dfb63aa9f83fa2ea793c3d8aa344be4a1678d06d399","affectsGlobalScope":true,"impliedFormat":1},{"version":"959d36cddf5e7d572a65045b876f2956c973a586da58e5d26cde519184fd9b8a","affectsGlobalScope":true,"impliedFormat":1},{"version":"965f36eae237dd74e6cca203a43e9ca801ce38824ead814728a2807b1910117d","affectsGlobalScope":true,"impliedFormat":1},{"version":"3925a6c820dcb1a06506c90b1577db1fdbf7705d65b62b99dce4be75c637e26b","affectsGlobalScope":true,"impliedFormat":1},{"version":"0a3d63ef2b853447ec4f749d3f368ce642264246e02911fcb1590d8c161b8005","affectsGlobalScope":true,"impliedFormat":1},{"version":"8cdf8847677ac7d20486e54dd3fcf09eda95812ac8ace44b4418da1bbbab6eb8","affectsGlobalScope":true,"impliedFormat":1},{"version":"8444af78980e3b20b49324f4a16ba35024fef3ee069a0eb67616ea6ca821c47a","affectsGlobalScope":true,"impliedFormat":1},{"version":"3287d9d085fbd618c3971944b65b4be57859f5415f495b33a6adc994edd2f004","affectsGlobalScope":true,"impliedFormat":1},{"version":"b4b67b1a91182421f5df999988c690f14d813b9850b40acd06ed44691f6727ad","affectsGlobalScope":true,"impliedFormat":1},{"version":"df83c2a6c73228b625b0beb6669c7ee2a09c914637e2d35170723ad49c0f5cd4","affectsGlobalScope":true,"impliedFormat":1},{"version":"436aaf437562f276ec2ddbee2f2cdedac7664c1e4c1d2c36839ddd582eeb3d0a","affectsGlobalScope":true,"impliedFormat":1},{"version":"8e3c06ea092138bf9fa5e874a1fdbc9d54805d074bee1de31b99a11e2fec239d","affectsGlobalScope":true,"impliedFormat":1},{"version":"51ad4c928303041605b4d7ae32e0c1ee387d43a24cd6f1ebf4a2699e1076d4fa","affectsGlobalScope":true,"impliedFormat":1},{"version":"196cb558a13d4533a5163286f30b0509ce0210e4b316c56c38d4c0fd2fb38405","affectsGlobalScope":true,"impliedFormat":1},{"version":"8e7f8264d0fb4c5339605a15daadb037bf238c10b654bb3eee14208f860a32ea","affectsGlobalScope":true,"impliedFormat":1},{"version":"782dec38049b92d4e85c1585fbea5474a219c6984a35b004963b00beb1aab538","affectsGlobalScope":true,"impliedFormat":1},{"version":"8992c6df1af81698b45bab8a703679a5a0fade848a6db9389cd379429d5c7b4f","impliedFormat":99},{"version":"96a5394d31d413b5709a14c4340bbadd4a8fc8795234416d304ad063b4c72b31","signature":"37253f6be392e79bdfc1b48aa828dd70e4f6d9eeac226221d70e3cab4579d20a","impliedFormat":99},{"version":"6403026c2e1fa2753872edc3e1e3c3c5271127e79689eb998d642749353ea918","signature":"220425aa9c725e64a921557da5cde46d2dbfe13bf5483981d3dcfe033dd6e9ba","impliedFormat":99},{"version":"586482b636dee351df0fa3d3bb78559e77fa3af9a32a9a4f9febeac60601d25a","signature":"5ed940d8d9c6af122507efa86cbcb7f764aa784904027d1c1ddff612f5db5134","impliedFormat":99},{"version":"3dfcd0a3bfa70b53135db3cf2e4ddcb7eccc3e4418ce833ae24eecd06928328f","impliedFormat":1},{"version":"bea7cae6a8b2d41fd1a9d70475b54d741dd7ca2103904934858108eec0336a69","impliedFormat":1},{"version":"bc41a8e33caf4d193b0c49ec70d1e8db5ce3312eafe5447c6c1d5a2084fece12","impliedFormat":1},{"version":"7c33f11a56ba4e79efc4ddae85f8a4a888e216d2bf66c863f344d403437ffc74","impliedFormat":1},{"version":"cbef1abd1f8987dee5c9ed8c768a880fbfbff7f7053e063403090f48335c8e4e","impliedFormat":1},{"version":"afb5e9a110ff72b60783e0fe65ce1a28adbe6ab5f30d2dc31e2fb099e0f86de4","impliedFormat":1},{"version":"0132f67b7f128d4a47324f48d0918ec73cf4220a5e9ea8bd92b115397911254f","impliedFormat":1},{"version":"06b37153d512000a91cad6fcbae75ca795ecec00469effaa8916101a00d5b9e2","impliedFormat":1},{"version":"8a641e3402f2988bf993007bd814faba348b813fc4058fce5b06de3e81ed511a","impliedFormat":1},{"version":"281744305ba2dcb2d80e2021fae211b1b07e5d85cfc8e36f4520325fcf698dbb","impliedFormat":1},{"version":"e1b042779d17b69719d34f31822ddba8aa6f5eb15f221b02105785f4447e7f5b","impliedFormat":1},{"version":"6858337936b90bd31f1674c43bedda2edbab2a488d04adc02512aef47c792fd0","impliedFormat":1},{"version":"15cb3deecc635efb26133990f521f7f1cc95665d5db8d87e5056beaea564b0ce","impliedFormat":1},{"version":"e27605c8932e75b14e742558a4c3101d9f4fdd32e7e9a056b2ca83f37f973945","impliedFormat":1},{"version":"f0443725119ecde74b0d75c82555b1f95ee1c3cd371558e5528a83d1de8109de","impliedFormat":1},{"version":"7794810c4b3f03d2faa81189504b953a73eb80e5662a90e9030ea9a9a359a66f","impliedFormat":1},{"version":"b074516a691a30279f0fe6dff33cd76359c1daacf4ae024659e44a68756de602","impliedFormat":1},{"version":"57cbeb55ec95326d068a2ce33403e1b795f2113487f07c1f53b1eaf9c21ff2ce","impliedFormat":1},{"version":"a00362ee43d422bcd8239110b8b5da39f1122651a1809be83a518b1298fa6af8","impliedFormat":1},{"version":"a820499a28a5fcdbf4baec05cc069362041d735520ab5a94c38cc44db7df614c","impliedFormat":1},{"version":"33a6d7b07c85ac0cef9a021b78b52e2d901d2ebfd5458db68f229ca482c1910c","impliedFormat":1},{"version":"8f648847b52020c1c0cdfcc40d7bcab72ea470201a631004fde4d85ccbc0c4c7","impliedFormat":1},{"version":"7821d3b702e0c672329c4d036c7037ecf2e5e758eceb5e740dde1355606dc9f2","impliedFormat":1},{"version":"213e4f26ee5853e8ba314ecad3a73cd06ab244a0809749bb777cbc1619aa07d8","impliedFormat":1},{"version":"1720be851bdb7cdbff68061522a71d9ddaa69db1fe90c6819a26953da05942f2","impliedFormat":1},{"version":"961fa18e1658f3f8e38c23e1a9bc3f4d7be75b056a94700291d5f82f57524ff0","impliedFormat":1},{"version":"079c02dc397960da2786db71d7c9e716475377bcedd81dede034f8a9f94c71b8","impliedFormat":1},{"version":"a7595cbb1b354b54dff14a6bb87d471e6d53b63de101a1b4d9d82d3d3f6eddec","impliedFormat":1},{"version":"1f49a85a97e01a26245fd74232b3b301ebe408fb4e969e72e537aa6ffbd3fe14","impliedFormat":1},{"version":"9c38563e4eabfffa597c4d6b9aa16e11e7f9a636f0dd80dd0a8bce1f6f0b2108","impliedFormat":1},{"version":"a971cba9f67e1c87014a2a544c24bc58bad1983970dfa66051b42ae441da1f46","impliedFormat":1},{"version":"df9b266bceb94167c2e8ae25db37d31a28de02ae89ff58e8174708afdec26738","impliedFormat":1},{"version":"9e5b8137b7ee679d31b35221503282561e764116d8b007c5419b6f9d60765683","impliedFormat":1},{"version":"3e7ae921a43416e155d7bbe5b4229b7686cfa6a20af0a3ae5a79dfe127355c21","impliedFormat":1},{"version":"c7200ae85e414d5ed1d3c9507ae38c097050161f57eb1a70bef021d796af87a7","impliedFormat":1},{"version":"4edb4ff36b17b2cf19014b2c901a6bdcdd0d8f732bcf3a11aa6fd0a111198e27","impliedFormat":1},{"version":"810f0d14ce416a343dcdd0d3074c38c094505e664c90636b113d048471c292e2","impliedFormat":1},{"version":"9c37dc73c97cd17686edc94cc534486509e479a1b8809ef783067b7dde5c6713","impliedFormat":1},{"version":"5fe2ef29b33889d3279d5bc92f8e554ffd32145a02f48d272d30fc1eea8b4c89","impliedFormat":1},{"version":"e39090ffe9c45c59082c3746e2aa2546dc53e3c5eeb4ad83f8210be7e2e58022","impliedFormat":1},{"version":"9f85a1810d42f75e1abb4fc94be585aae1fdac8ae752c76b912d95aef61bf5de","impliedFormat":1},{"version":"2c4f0e719674aeb773493f54f5da019d0d09013ec55a6e05605e18ca4700d52e","signature":"933e941d1556791c37d79197ee636ca92d7ad804fd8d3f7ecbce6c87b4f8625f","impliedFormat":99},{"version":"a543175c07d9883d9f0ab3fa1b14fe537f56ce642220163c5d05bbc0ef61a9cc","signature":"d41551f08f42c8084da3e6bf4bb1cf70f37ef3ee094d01a7cd759f4e953f33fd","impliedFormat":99},{"version":"427fe2004642504828c1476d0af4270e6ad4db6de78c0b5da3e4c5ca95052a99","impliedFormat":1},{"version":"2eeffcee5c1661ddca53353929558037b8cf305ffb86a803512982f99bcab50d","impliedFormat":99},{"version":"9afb4cb864d297e4092a79ee2871b5d3143ea14153f62ef0bb04ede25f432030","affectsGlobalScope":true,"impliedFormat":99},{"version":"d5799bcf7fe4e6de3063abf4e321c14b051706f03cf5716d8a19f22fe1f69519","impliedFormat":1},{"version":"751764bb94219b4ce8f5475dc35d3de2e432fea01a0c9610cd7f69ad05e398c6","impliedFormat":1},{"version":"f3d8c757e148ad968f0d98697987db363070abada5f503da3c06aefd9d4248c1","impliedFormat":1},{"version":"d153a11543fd884b596587ccd97aebbeed950b26933ee000f94009f1ab142848","affectsGlobalScope":true,"impliedFormat":1},{"version":"378281aa35786c27d5811af7e6bcaa492eebd0c7013d48137c35bbc69a2b9751","affectsGlobalScope":true,"impliedFormat":1},{"version":"3af97acf03cc97de58a3a4bc91f8f616408099bc4233f6d0852e72a8ffb91ac9","affectsGlobalScope":true,"impliedFormat":1},{"version":"1b2dd1cbeb0cc6ae20795958ba5950395ebb2849b7c8326853dd15530c77ab0c","affectsGlobalScope":true,"impliedFormat":1},{"version":"1db0b7dca579049ca4193d034d835f6bfe73096c73663e5ef9a0b5779939f3d0","affectsGlobalScope":true,"impliedFormat":1},{"version":"387a023d363f755eb63450a66c28b14cdd7bc30a104565e2dbf0a8988bb4a56c","affectsGlobalScope":true,"impliedFormat":1},{"version":"9798340ffb0d067d69b1ae5b32faa17ab31b82466a3fc00d8f2f2df0c8554aaa","affectsGlobalScope":true,"impliedFormat":1},{"version":"f26b11d8d8e4b8028f1c7d618b22274c892e4b0ef5b3678a8ccbad85419aef43","affectsGlobalScope":true,"impliedFormat":1},{"version":"cdcf9ea426ad970f96ac930cd176d5c69c6c24eebd9fc580e1572d6c6a88f62c","impliedFormat":1},{"version":"23cd712e2ce083d68afe69224587438e5914b457b8acf87073c22494d706a3d0","impliedFormat":1},{"version":"156a859e21ef3244d13afeeba4e49760a6afa035c149dda52f0c45ea8903b338","impliedFormat":1},{"version":"10ec5e82144dfac6f04fa5d1d6c11763b3e4dbbac6d99101427219ab3e2ae887","impliedFormat":1},{"version":"615754924717c0b1e293e083b83503c0a872717ad5aa60ed7f1a699eb1b4ea5c","impliedFormat":1},{"version":"074de5b2fdead0165a2757e3aaef20f27a6347b1c36adea27d51456795b37682","impliedFormat":1},{"version":"68834d631c8838c715f225509cfc3927913b9cc7a4870460b5b60c8dbdb99baf","impliedFormat":1},{"version":"24371e69a38fc33e268d4a8716dbcda430d6c2c414a99ff9669239c4b8f40dea","impliedFormat":1},{"version":"ccab02f3920fc75c01174c47fcf67882a11daf16baf9e81701d0a94636e94556","impliedFormat":1},{"version":"3e11fce78ad8c0e1d1db4ba5f0652285509be3acdd519529bc8fcef85f7dafd9","impliedFormat":1},{"version":"ea6bc8de8b59f90a7a3960005fd01988f98fd0784e14bc6922dde2e93305ec7d","impliedFormat":1},{"version":"36107995674b29284a115e21a0618c4c2751b32a8766dd4cb3ba740308b16d59","impliedFormat":1},{"version":"914a0ae30d96d71915fc519ccb4efbf2b62c0ddfb3a3fc6129151076bc01dc60","impliedFormat":1},{"version":"9c32412007b5662fd34a8eb04292fb5314ec370d7016d1c2fb8aa193c807fe22","impliedFormat":1},{"version":"7fd1b31fd35876b0aa650811c25ec2c97a3c6387e5473eb18004bed86cdd76b6","impliedFormat":1},{"version":"4d327f7d72ad0918275cea3eee49a6a8dc8114ae1d5b7f3f5d0774de75f7439a","impliedFormat":1},{"version":"6ebe8ebb8659aaa9d1acbf3710d7dae3e923e97610238b9511c25dc39023a166","impliedFormat":1},{"version":"e85d7f8068f6a26710bff0cc8c0fc5e47f71089c3780fbede05857331d2ddec9","impliedFormat":1},{"version":"7befaf0e76b5671be1d47b77fcc65f2b0aad91cc26529df1904f4a7c46d216e9","impliedFormat":1},{"version":"0a60a292b89ca7218b8616f78e5bbd1c96b87e048849469cccb4355e98af959a","impliedFormat":1},{"version":"0b6e25234b4eec6ed96ab138d96eb70b135690d7dd01f3dd8a8ab291c35a683a","impliedFormat":1},{"version":"9666f2f84b985b62400d2e5ab0adae9ff44de9b2a34803c2c5bd3c8325b17dc0","impliedFormat":1},{"version":"40cd35c95e9cf22cfa5bd84e96408b6fcbca55295f4ff822390abb11afbc3dca","impliedFormat":1},{"version":"b1616b8959bf557feb16369c6124a97a0e74ed6f49d1df73bb4b9ddf68acf3f3","impliedFormat":1},{"version":"5b03a034c72146b61573aab280f295b015b9168470f2df05f6080a2122f9b4df","impliedFormat":1},{"version":"40b463c6766ca1b689bfcc46d26b5e295954f32ad43e37ee6953c0a677e4ae2b","impliedFormat":1},{"version":"249b9cab7f5d628b71308c7d9bb0a808b50b091e640ba3ed6e2d0516f4a8d91d","impliedFormat":1},{"version":"80aae6afc67faa5ac0b32b5b8bc8cc9f7fa299cff15cf09cc2e11fd28c6ae29e","impliedFormat":1},{"version":"f473cd2288991ff3221165dcf73cd5d24da30391f87e85b3dd4d0450c787a391","impliedFormat":1},{"version":"499e5b055a5aba1e1998f7311a6c441a369831c70905cc565ceac93c28083d53","impliedFormat":1},{"version":"8aee8b6d4f9f62cf3776cda1305fb18763e2aade7e13cea5bbe699112df85214","impliedFormat":1},{"version":"c63b9ada8c72f95aac5db92aea07e5e87ec810353cdf63b2d78f49a58662cf6c","impliedFormat":1},{"version":"1cc2a09e1a61a5222d4174ab358a9f9de5e906afe79dbf7363d871a7edda3955","impliedFormat":1},{"version":"5d0375ca7310efb77e3ef18d068d53784faf62705e0ad04569597ae0e755c401","impliedFormat":1},{"version":"59af37caec41ecf7b2e76059c9672a49e682c1a2aa6f9d7dc78878f53aa284d6","impliedFormat":1},{"version":"addf417b9eb3f938fddf8d81e96393a165e4be0d4a8b6402292f9c634b1cb00d","impliedFormat":1},{"version":"b64d4d1c5f877f9c666e98e833f0205edb9384acc46e98a1fef344f64d6aba44","impliedFormat":1},{"version":"adf27937dba6af9f08a68c5b1d3fce0ca7d4b960c57e6d6c844e7d1a8e53adae","impliedFormat":1},{"version":"12950411eeab8563b349cb7959543d92d8d02c289ed893d78499a19becb5a8cc","impliedFormat":1},{"version":"2e85db9e6fd73cfa3d7f28e0ab6b55417ea18931423bd47b409a96e4a169e8e6","impliedFormat":1},{"version":"c46e079fe54c76f95c67fb89081b3e399da2c7d109e7dca8e4b58d83e332e605","impliedFormat":1},{"version":"c9381908473a1c92cb8c516b184e75f4d226dad95c3a85a5af35f670064d9a2f","impliedFormat":1},{"version":"f724236417941ea77ec8d38c6b7021f5fb7f8521c7f8c1538e87661f2c6a0774","affectsGlobalScope":true,"impliedFormat":1},{"version":"1cf059eaf468efcc649f8cf6075d3cb98e9a35a0fe9c44419ec3d2f5428d7123","affectsGlobalScope":true,"impliedFormat":1},{"version":"e7721c4f69f93c91360c26a0a84ee885997d748237ef78ef665b153e622b36c1","affectsGlobalScope":true,"impliedFormat":1},{"version":"d97fb21da858fb18b8ae72c314e9743fd52f73ebe2764e12af1db32fc03f853f","affectsGlobalScope":true,"impliedFormat":1},{"version":"4ea15fd99b2e34cb25fe8346c955000bb70c8b423ae4377a972ef46bfb37f595","impliedFormat":1},{"version":"7cf69dd5502c41644c9e5106210b5da7144800670cbe861f66726fa209e231c4","impliedFormat":1},{"version":"72c1f5e0a28e473026074817561d1bc9647909cf253c8d56c41d1df8d95b85f7","impliedFormat":1},{"version":"f9b4137a0d285bd77dba2e6e895530112264310ae47e07bf311feae428fb8b61","affectsGlobalScope":true,"impliedFormat":1},{"version":"c06b2652ffeb89afd0f1c52c165ced77032f9cd09bc481153fbd6b5504c69494","impliedFormat":1},{"version":"51aecd2df90a3cffea1eb4696b33b2d78594ea2aa2138e6b9471ec4841c6c2ee","impliedFormat":1},{"version":"9d8f9e63e29a3396285620908e7f14d874d066caea747dc4b2c378f0599166b4","affectsGlobalScope":true,"impliedFormat":1},{"version":"5524481e56c48ff486f42926778c0a3cce1cc85dc46683b92b1271865bcf015a","impliedFormat":1},{"version":"612422d5ba6b4a5c4537f423e9199645468ad80a689801da63ab7edb43f7b835","impliedFormat":1},{"version":"db9ada976f9e52e13f7ae8b9a320f4b67b87685938c5879187d8864b2fbe97f3","impliedFormat":1},{"version":"9f39e70a354d0fba29ac3cdf6eca00b7f9e96f64b2b2780c432e8ea27f133743","impliedFormat":1},{"version":"0dace96cc0f7bc6d0ee2044921bdf19fe42d16284dbcc8ae200800d1c9579335","impliedFormat":1},{"version":"a2e2bbde231b65c53c764c12313897ffdfb6c49183dd31823ee2405f2f7b5378","impliedFormat":1},{"version":"1cbdcdef62bf42688e5d825898c3a59458466c48ad8a4ef3f88d8a1cd04310d6","impliedFormat":1},{"version":"c64e1888baaa3253ca4405b455e4bf44f76357868a1bd0a52998ade9a092ad78","affectsGlobalScope":true,"impliedFormat":1},{"version":"dc8c6f5322961b56d9906601b20798725df60baeab45ec014fba9f795d5596fd","impliedFormat":1},{"version":"67e435fa530778903f5525904e6645b7368eb5ac622055febd19bb399e328ccd","impliedFormat":1},{"version":"060d305fe4494d8cb2b99d620928d369d1ee55c1645f5e729a2aca07d0f108cb","impliedFormat":1},{"version":"5b22bf96be06fca1e134e3a85351ffe7aa2edf0c9a5bd175b7239ee48186dbf5","impliedFormat":1},{"version":"0c50296ee73dae94efc3f0da4936b1146ca6ce2217acfabb44c19c9a33fa30e5","impliedFormat":1},{"version":"bbf42f98a5819f4f06e18c8b669a994afe9a17fe520ae3454a195e6eabf7700d","impliedFormat":1},{"version":"5b48cc670da1dfe926036deaf349085caf822def460a6d50de23f1cc12a5f8cd","impliedFormat":1},{"version":"418f34087d52d001e2688a6282a5de9bf583ff771ed5546af0ae36e4f60a458b","affectsGlobalScope":true,"impliedFormat":1},{"version":"036c9a03b01281f99f8251fdc7088e894566be44b3f139a9d48501a978b611df","impliedFormat":1},{"version":"ff65b8a8bd380c6d129becc35de02f7c29ad7ce03300331ca91311fb4044d1a9","impliedFormat":1},{"version":"04bf1aa481d1adfb16d93d76e44ce71c51c8ef68039d849926551199489637f6","impliedFormat":1},{"version":"2c9adcc85574b002c9a6311ff2141055769e0071856ec979d92ff989042b1f1b","affectsGlobalScope":true,"impliedFormat":1},{"version":"1569ad5969ae0de6ad0bdfaaab0dabcd8878bc3147ab096206eed2019bb84e7f","affectsGlobalScope":true,"impliedFormat":1},{"version":"a58a15da4c5ba3df60c910a043281256fa52d36a0fcdef9b9100c646282e88dd","impliedFormat":1},{"version":"b36beffbf8acdc3ebc58c8bb4b75574b31a2169869c70fc03f82895b93950a12","impliedFormat":1},{"version":"42a350ce4f6f291198dc89833afcc4fd078248b4e1fdc9d05c846c66a670f710","impliedFormat":1},{"version":"77fbe5eecb6fac4b6242bbf6eebfc43e98ce5ccba8fa44e0ef6a95c945ff4d98","impliedFormat":1},{"version":"8c81fd4a110490c43d7c578e8c6f69b3af01717189196899a6a44f93daa57a3a","impliedFormat":1},{"version":"5fb39858b2459864b139950a09adae4f38dad87c25bf572ce414f10e4bd7baab","impliedFormat":1},{"version":"b03754211d839cdc48979996525a32eb62130682c2f9801dfc2f25533ce7238d","impliedFormat":1},{"version":"3910dab597c40e173bf0e0d419d3ce9682c54ebf6ae84849f9b829b1451a17ec","impliedFormat":1},{"version":"37ba7b45141a45ce6e80e66f2a96c8a5ab1bcef0fc2d0f56bb58df96ec67e972","impliedFormat":1},{"version":"45650f47bfb376c8a8ed39d4bcda5902ab899a3150029684ee4c10676d9fbaee","impliedFormat":1},{"version":"4e5d5874ff5bf94b02e856cffbcc2b3ddea5d52f463ef55cc0206f1afaa2ab28","affectsGlobalScope":true,"impliedFormat":1},{"version":"c119835edf36415081dfd9ed15fc0cd37aaa28d232be029ad073f15f3d88c323","impliedFormat":1},{"version":"f4d99ac08c4097a3cc202bec2c7198c19dcdd80d4ec6c62d1356b10d03b119d5","impliedFormat":1},{"version":"9705cd157ffbb91c5cab48bdd2de5a437a372e63f870f8a8472e72ff634d47c1","affectsGlobalScope":true,"impliedFormat":1},{"version":"ae86f30d5d10e4f75ce8dcb6e1bd3a12ecec3d071a21e8f462c5c85c678efb41","impliedFormat":1},{"version":"ca77e83162eccec633513723d178d4203bdd5465297267696be08013bab0aa1d","impliedFormat":1},{"version":"e03460fe72b259f6d25ad029f085e4bedc3f90477da4401d8fbc1efa9793230e","impliedFormat":1},{"version":"4286a3a6619514fca656089aee160bb6f2e77f4dd53dc5a96b26a0b4fc778055","impliedFormat":1},{"version":"f61c153d5abbe4381a1fba0d41be0babdd5de51c626ee7ff14cede14dedc33f1","affectsGlobalScope":true,"impliedFormat":1},{"version":"7803171d745ab18e77f16bf82e742268ff72b7f7382ab191e4277527580c2d89","affectsGlobalScope":true,"impliedFormat":1},{"version":"0e9ba65cd3d6d194bdda7343f9f2917f7144ead96a924ca58d1a14919992dc20","impliedFormat":1},{"version":"255d948f87f24ffd57bcb2fdf95792fd418a2e1f712a98cf2cce88744d75085c","impliedFormat":1},{"version":"0d5b085f36e6dc55bc6332ecb9c733be3a534958c238fb8d8d18d4a2b6f2a15a","impliedFormat":1},{"version":"0b0dfb2d3e8420ead06f6a11acfb02ddcec42257e6ce391993e895ba0af86de4","affectsGlobalScope":true,"impliedFormat":1},{"version":"bfd3b3c21a56104693183942e221c1896ee23bcb8f8d91ab0b941f7b32985411","impliedFormat":1},{"version":"d7e9ab1b0996639047c61c1e62f85c620e4382206b3abb430d9a21fb7bc23c77","impliedFormat":1},{"version":"7e29f41b158de217f94cb9676bf9cbd0cd9b5a46e1985141ed36e075c52bf6ad","affectsGlobalScope":true,"impliedFormat":1},{"version":"ac51dd7d31333793807a6abaa5ae168512b6131bd41d9c5b98477fc3b7800f9f","impliedFormat":1},{"version":"045c1b395851aa71ef76393398466330fe1eeebc113c8085eefc6d84abea3a88","impliedFormat":1},{"version":"dfb24c6874a941ebd8947c97efb27c6b40f4a48218ce7433d1d088d1245b6d58","impliedFormat":1}],"root":[[67,69],111,112],"options":{"composite":true,"declaration":true,"declarationMap":true,"exactOptionalPropertyTypes":true,"module":199,"noFallthroughCasesInSwitch":true,"noImplicitOverride":true,"noUncheckedIndexedAccess":true,"outDir":"./","rootDir":"../src","skipLibCheck":true,"strict":true,"target":9,"tsBuildInfoFile":"./parser.tsbuildinfo"},"referencedMap":[[115,1],[113,2],[116,2],[117,2],[118,2],[173,3],[174,3],[175,4],[121,5],[176,6],[177,7],[178,8],[119,2],[179,9],[180,10],[181,11],[182,12],[183,13],[184,14],[185,14],[186,15],[187,16],[188,17],[189,18],[122,2],[120,2],[190,19],[191,20],[192,21],[226,22],[193,23],[194,2],[195,24],[196,25],[197,26],[198,27],[199,28],[200,29],[201,30],[202,31],[203,32],[204,32],[205,33],[206,2],[207,34],[208,35],[210,36],[209,37],[211,38],[212,39],[213,40],[214,41],[215,42],[216,43],[217,44],[218,45],[219,46],[220,47],[221,48],[222,49],[223,50],[123,2],[124,51],[125,2],[126,2],[169,52],[170,53],[171,2],[172,38],[224,54],[225,55],[230,56],[227,2],[229,57],[114,2],[228,2],[64,2],[65,2],[11,2],[12,2],[14,2],[13,2],[2,2],[15,2],[16,2],[17,2],[18,2],[19,2],[20,2],[21,2],[22,2],[3,2],[23,2],[24,2],[4,2],[25,2],[29,2],[26,2],[27,2],[28,2],[30,2],[31,2],[32,2],[5,2],[33,2],[34,2],[35,2],[36,2],[6,2],[40,2],[37,2],[38,2],[39,2],[41,2],[7,2],[42,2],[47,2],[48,2],[43,2],[44,2],[45,2],[46,2],[8,2],[52,2],[49,2],[50,2],[51,2],[53,2],[9,2],[54,2],[55,2],[56,2],[58,2],[57,2],[59,2],[60,2],[10,2],[61,2],[1,2],[62,2],[63,2],[145,58],[157,59],[142,60],[158,61],[167,62],[133,63],[134,64],[132,65],[166,66],[161,67],[165,68],[136,69],[154,70],[135,71],[164,72],[130,73],[131,67],[137,74],[138,2],[144,75],[141,74],[128,76],[168,77],[159,78],[148,79],[147,74],[149,80],[152,81],[146,82],[150,83],[162,66],[139,84],[140,85],[153,86],[129,61],[156,87],[155,74],[143,85],[151,88],[160,2],[127,2],[163,89],[103,90],[101,91],[72,2],[90,92],[102,93],[71,94],[110,95],[73,2],[100,96],[77,97],[95,98],[92,99],[75,100],[87,101],[78,102],[91,103],[88,104],[74,105],[94,106],[96,107],[97,108],[98,108],[99,109],[104,2],[70,2],[105,108],[106,110],[89,111],[80,112],[81,112],[82,112],[93,113],[79,114],[107,115],[108,116],[83,2],[76,117],[84,118],[85,119],[86,120],[109,104],[66,2],[67,121],[112,122],[68,121],[69,121],[111,123]],"latestChangedDtsFile":"./yaml.d.ts","version":"5.9.3"}
@@ -0,0 +1,3 @@
1
+ import type { Diagnostic, FormSpec } from "a-form-core";
2
+ export declare function validateFormSpec(spec: FormSpec): readonly Diagnostic[];
3
+ //# sourceMappingURL=validate.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"validate.d.ts","sourceRoot":"","sources":["../src/validate.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAGV,UAAU,EACV,QAAQ,EAGT,MAAM,aAAa,CAAC;AAoHrB,wBAAgB,gBAAgB,CAAC,IAAI,EAAE,QAAQ,GAAG,SAAS,UAAU,EAAE,CAetE"}
@@ -0,0 +1,118 @@
1
+ const VALID_TRIGGERS = new Set(["change", "blur", "submit", "manual"]);
2
+ function addError(diagnostics, code, message, path) {
3
+ diagnostics.push({ code, message, severity: "error", path });
4
+ }
5
+ function schemaHasPath(schema, fieldPath) {
6
+ let current = schema;
7
+ for (const segment of fieldPath.split(".")) {
8
+ if (current === null || typeof current !== "object" || Array.isArray(current)) {
9
+ return false;
10
+ }
11
+ const properties = current.properties;
12
+ if (properties === null || typeof properties !== "object" || Array.isArray(properties)) {
13
+ return false;
14
+ }
15
+ current = properties[segment];
16
+ if (current === undefined) {
17
+ return false;
18
+ }
19
+ }
20
+ return true;
21
+ }
22
+ function validateRows(spec, diagnostics) {
23
+ const seenFields = new Set();
24
+ const visitRows = (rows, path) => {
25
+ rows.forEach((row, rowIndex) => {
26
+ const rowPath = [...path, rowIndex];
27
+ if (row.type !== "row" || !Array.isArray(row.children)) {
28
+ addError(diagnostics, "YF_LAYOUT_ROW", "A layout row must contain a children array.", rowPath);
29
+ return;
30
+ }
31
+ let desktopTotal = 0;
32
+ row.children.forEach((column, columnIndex) => {
33
+ const columnPath = [...rowPath, "children", columnIndex];
34
+ if (column.type !== "column" || !Array.isArray(column.children)) {
35
+ addError(diagnostics, "YF_LAYOUT_COLUMN", "A row may only contain columns.", columnPath);
36
+ return;
37
+ }
38
+ const span = typeof column.span === "number" ? { mobile: column.span } : column.span;
39
+ for (const breakpoint of ["mobile", "tablet", "desktop"]) {
40
+ const value = span?.[breakpoint];
41
+ if (value !== undefined && (!Number.isInteger(value) || value < 1 || value > 12)) {
42
+ addError(diagnostics, "YF_LAYOUT_SPAN", `Column ${breakpoint} span must be an integer from 1 to 12.`, [...columnPath, "span", breakpoint]);
43
+ }
44
+ }
45
+ desktopTotal += span?.desktop ?? span?.tablet ?? span?.mobile ?? 12;
46
+ column.children.forEach((child, childIndex) => {
47
+ const childPath = [...columnPath, "children", childIndex];
48
+ if (child.type === "row") {
49
+ visitRows([child], childPath);
50
+ return;
51
+ }
52
+ if (child.type !== "field" || typeof child.path !== "string" || child.path.length === 0) {
53
+ addError(diagnostics, "YF_LAYOUT_FIELD", "A column child must be a field or nested row.", childPath);
54
+ return;
55
+ }
56
+ if (!schemaHasPath(spec.schema, child.path)) {
57
+ addError(diagnostics, "YF_FIELD_PATH", `Field path '${child.path}' does not exist in schema.`, [...childPath, "path"]);
58
+ }
59
+ if (seenFields.has(child.path)) {
60
+ diagnostics.push({
61
+ code: "YF_FIELD_DUPLICATE",
62
+ message: `Field path '${child.path}' appears more than once in the layout.`,
63
+ severity: "warning",
64
+ path: [...childPath, "path"],
65
+ });
66
+ }
67
+ seenFields.add(child.path);
68
+ });
69
+ });
70
+ if (desktopTotal > 12) {
71
+ diagnostics.push({
72
+ code: "YF_LAYOUT_WRAP",
73
+ message: `Desktop spans total ${desktopTotal}; columns will wrap.`,
74
+ severity: "warning",
75
+ path: rowPath,
76
+ });
77
+ }
78
+ });
79
+ };
80
+ visitRows(spec.layout, ["layout"]);
81
+ }
82
+ function validateAsyncRule(spec, rule, index, diagnostics) {
83
+ const basePath = ["validations", "async", index];
84
+ if (!rule.id || !rule.adapter || !Array.isArray(rule.paths) || rule.paths.length === 0) {
85
+ addError(diagnostics, "YF_ASYNC_RULE", "Async validation requires id, adapter and at least one path.", basePath);
86
+ }
87
+ [...(rule.paths ?? []), ...(rule.dependsOn ?? [])].forEach((fieldPath) => {
88
+ if (!schemaHasPath(spec.schema, fieldPath)) {
89
+ addError(diagnostics, "YF_ASYNC_PATH", `Async validation path '${fieldPath}' does not exist in schema.`, basePath);
90
+ }
91
+ });
92
+ rule.triggers?.forEach((trigger) => {
93
+ if (!VALID_TRIGGERS.has(trigger)) {
94
+ addError(diagnostics, "YF_ASYNC_TRIGGER", `Unknown async validation trigger '${trigger}'.`, basePath);
95
+ }
96
+ });
97
+ for (const [name, value] of [["debounceMs", rule.debounceMs], ["timeoutMs", rule.timeoutMs], ["cacheTtlMs", rule.cacheTtlMs]]) {
98
+ if (value !== undefined && (!Number.isInteger(value) || value < 0)) {
99
+ addError(diagnostics, "YF_ASYNC_TIMING", `${name} must be a non-negative integer.`, [...basePath, name]);
100
+ }
101
+ }
102
+ }
103
+ export function validateFormSpec(spec) {
104
+ const diagnostics = [];
105
+ if (spec.version !== "1") {
106
+ addError(diagnostics, "YF_SPEC_VERSION", "Only spec version '1' is supported.", ["version"]);
107
+ }
108
+ if (spec.schema === null || typeof spec.schema !== "object" || Array.isArray(spec.schema)) {
109
+ addError(diagnostics, "YF_SPEC_SCHEMA", "schema must be a JSON object.", ["schema"]);
110
+ }
111
+ if (!Array.isArray(spec.layout)) {
112
+ addError(diagnostics, "YF_SPEC_LAYOUT", "layout must be an array of rows.", ["layout"]);
113
+ return diagnostics;
114
+ }
115
+ validateRows(spec, diagnostics);
116
+ spec.validations?.async?.forEach((rule, index) => validateAsyncRule(spec, rule, index, diagnostics));
117
+ return diagnostics;
118
+ }
package/dist/yaml.d.ts ADDED
@@ -0,0 +1,13 @@
1
+ import type { Diagnostic, FormSpec } from "a-form-core";
2
+ export interface ParseYamlOptions {
3
+ readonly maxSourceLength?: number;
4
+ readonly maxDepth?: number;
5
+ readonly maxNodes?: number;
6
+ readonly maxAliases?: number;
7
+ }
8
+ export interface ParseYamlResult {
9
+ readonly value?: FormSpec;
10
+ readonly diagnostics: readonly Diagnostic[];
11
+ }
12
+ export declare function parseYamlSpec(source: string, options?: ParseYamlOptions): ParseYamlResult;
13
+ //# sourceMappingURL=yaml.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"yaml.d.ts","sourceRoot":"","sources":["../src/yaml.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,QAAQ,EAA+B,MAAM,aAAa,CAAC;AAQrF,MAAM,WAAW,gBAAgB;IAC/B,QAAQ,CAAC,eAAe,CAAC,EAAE,MAAM,CAAC;IAClC,QAAQ,CAAC,QAAQ,CAAC,EAAE,MAAM,CAAC;IAC3B,QAAQ,CAAC,QAAQ,CAAC,EAAE,MAAM,CAAC;IAC3B,QAAQ,CAAC,UAAU,CAAC,EAAE,MAAM,CAAC;CAC9B;AAED,MAAM,WAAW,eAAe;IAC9B,QAAQ,CAAC,KAAK,CAAC,EAAE,QAAQ,CAAC;IAC1B,QAAQ,CAAC,WAAW,EAAE,SAAS,UAAU,EAAE,CAAC;CAC7C;AAuDD,wBAAgB,aAAa,CAAC,MAAM,EAAE,MAAM,EAAE,OAAO,GAAE,gBAAqB,GAAG,eAAe,CAkE7F"}
package/dist/yaml.js ADDED
@@ -0,0 +1,113 @@
1
+ import { LineCounter, parseDocument } from "yaml";
2
+ const DEFAULT_MAX_SOURCE_LENGTH = 1_000_000;
3
+ const DEFAULT_MAX_DEPTH = 40;
4
+ const DEFAULT_MAX_NODES = 10_000;
5
+ const DEFAULT_MAX_ALIASES = 50;
6
+ function sourcePosition(lineCounter, offset) {
7
+ const position = lineCounter.linePos(offset);
8
+ return {
9
+ line: position.line - 1,
10
+ character: position.col - 1,
11
+ offset,
12
+ };
13
+ }
14
+ function sourceRange(lineCounter, start, end) {
15
+ return {
16
+ start: sourcePosition(lineCounter, start),
17
+ end: sourcePosition(lineCounter, end),
18
+ };
19
+ }
20
+ function inspectTree(value, maxDepth, maxNodes) {
21
+ let nodes = 0;
22
+ const diagnostics = [];
23
+ const visit = (current, depth, path) => {
24
+ nodes += 1;
25
+ if (nodes > maxNodes) {
26
+ return;
27
+ }
28
+ if (depth > maxDepth) {
29
+ diagnostics.push({
30
+ code: "YF_PARSE_MAX_DEPTH",
31
+ message: `The document exceeds the maximum depth of ${maxDepth}.`,
32
+ severity: "error",
33
+ path,
34
+ });
35
+ return;
36
+ }
37
+ if (Array.isArray(current)) {
38
+ current.forEach((child, index) => visit(child, depth + 1, [...path, index]));
39
+ }
40
+ else if (current !== null && typeof current === "object") {
41
+ Object.entries(current).forEach(([key, child]) => visit(child, depth + 1, [...path, key]));
42
+ }
43
+ };
44
+ visit(value, 0, []);
45
+ if (nodes > maxNodes) {
46
+ diagnostics.push({
47
+ code: "YF_PARSE_MAX_NODES",
48
+ message: `The document exceeds the maximum node count of ${maxNodes}.`,
49
+ severity: "error",
50
+ path: [],
51
+ });
52
+ }
53
+ return diagnostics;
54
+ }
55
+ export function parseYamlSpec(source, options = {}) {
56
+ const maxSourceLength = options.maxSourceLength ?? DEFAULT_MAX_SOURCE_LENGTH;
57
+ if (source.length > maxSourceLength) {
58
+ return {
59
+ diagnostics: [{
60
+ code: "YF_PARSE_MAX_LENGTH",
61
+ message: `The source exceeds the maximum length of ${maxSourceLength} characters.`,
62
+ severity: "error",
63
+ path: [],
64
+ }],
65
+ };
66
+ }
67
+ const lineCounter = new LineCounter();
68
+ const document = parseDocument(source, {
69
+ lineCounter,
70
+ prettyErrors: false,
71
+ strict: true,
72
+ uniqueKeys: true,
73
+ });
74
+ const diagnostics = document.errors.map((error) => ({
75
+ code: "YF_PARSE_YAML",
76
+ message: error.message,
77
+ severity: "error",
78
+ path: [],
79
+ range: sourceRange(lineCounter, error.pos[0], error.pos[1]),
80
+ }));
81
+ if (diagnostics.length > 0) {
82
+ return { diagnostics };
83
+ }
84
+ let value;
85
+ try {
86
+ value = document.toJS({ maxAliasCount: options.maxAliases ?? DEFAULT_MAX_ALIASES });
87
+ }
88
+ catch (error) {
89
+ return {
90
+ diagnostics: [{
91
+ code: "YF_PARSE_ALIAS_LIMIT",
92
+ message: error instanceof Error ? error.message : "YAML alias expansion failed.",
93
+ severity: "error",
94
+ path: [],
95
+ }],
96
+ };
97
+ }
98
+ diagnostics.push(...inspectTree(value, options.maxDepth ?? DEFAULT_MAX_DEPTH, options.maxNodes ?? DEFAULT_MAX_NODES));
99
+ if (diagnostics.length > 0) {
100
+ return { diagnostics };
101
+ }
102
+ if (value === null || typeof value !== "object" || Array.isArray(value)) {
103
+ return {
104
+ diagnostics: [{
105
+ code: "YF_SPEC_ROOT_OBJECT",
106
+ message: "The form spec root must be an object.",
107
+ severity: "error",
108
+ path: [],
109
+ }],
110
+ };
111
+ }
112
+ return { value: value, diagnostics };
113
+ }
package/package.json ADDED
@@ -0,0 +1,22 @@
1
+ {
2
+ "name": "a-form-parser",
3
+ "version": "0.1.4",
4
+ "type": "module",
5
+ "exports": {
6
+ ".": {
7
+ "types": "./dist/index.d.ts",
8
+ "import": "./dist/index.js"
9
+ }
10
+ },
11
+ "files": [
12
+ "dist"
13
+ ],
14
+ "scripts": {
15
+ "build": "tsc -b",
16
+ "typecheck": "tsc -b --pretty false"
17
+ },
18
+ "dependencies": {
19
+ "a-form-core": "^0.1.4",
20
+ "yaml": "^2.8.1"
21
+ }
22
+ }