@inventarch/language 0.0.0-stage → 1.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LANGUAGE.md +56 -0
- package/LICENSE +202 -0
- package/NOTICE +4 -0
- package/README.md +33 -2
- package/SPEC.md +225 -0
- package/dist/ast.d.ts +114 -0
- package/dist/ast.d.ts.map +1 -0
- package/dist/ast.js +2 -0
- package/dist/ast.js.map +1 -0
- package/dist/compile/compile.d.ts +82 -0
- package/dist/compile/compile.d.ts.map +1 -0
- package/dist/compile/compile.js +249 -0
- package/dist/compile/compile.js.map +1 -0
- package/dist/compile/index.d.ts +6 -0
- package/dist/compile/index.d.ts.map +1 -0
- package/dist/compile/index.js +4 -0
- package/dist/compile/index.js.map +1 -0
- package/dist/compile/spellings.d.ts +7 -0
- package/dist/compile/spellings.d.ts.map +1 -0
- package/dist/compile/spellings.js +47 -0
- package/dist/compile/spellings.js.map +1 -0
- package/dist/compile/values.d.ts +32 -0
- package/dist/compile/values.d.ts.map +1 -0
- package/dist/compile/values.js +48 -0
- package/dist/compile/values.js.map +1 -0
- package/dist/diagnostics.d.ts +22 -0
- package/dist/diagnostics.d.ts.map +1 -0
- package/dist/diagnostics.js +71 -0
- package/dist/diagnostics.js.map +1 -0
- package/dist/editor/index.d.ts +49 -0
- package/dist/editor/index.d.ts.map +1 -0
- package/dist/editor/index.js +155 -0
- package/dist/editor/index.js.map +1 -0
- package/dist/fold.d.ts +8 -0
- package/dist/fold.d.ts.map +1 -0
- package/dist/fold.js +26 -0
- package/dist/fold.js.map +1 -0
- package/dist/formatter.d.ts +10 -0
- package/dist/formatter.d.ts.map +1 -0
- package/dist/formatter.js +108 -0
- package/dist/formatter.js.map +1 -0
- package/dist/identity.d.ts +31 -0
- package/dist/identity.d.ts.map +1 -0
- package/dist/identity.js +64 -0
- package/dist/identity.js.map +1 -0
- package/dist/index.d.ts +35 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +22 -0
- package/dist/index.js.map +1 -0
- package/dist/kernel.generated.d.ts +99 -0
- package/dist/kernel.generated.d.ts.map +1 -0
- package/dist/kernel.generated.js +422 -0
- package/dist/kernel.generated.js.map +1 -0
- package/dist/parser/index.d.ts +5 -0
- package/dist/parser/index.d.ts.map +1 -0
- package/dist/parser/index.js +3 -0
- package/dist/parser/index.js.map +1 -0
- package/dist/parser/parser.d.ts +11 -0
- package/dist/parser/parser.d.ts.map +1 -0
- package/dist/parser/parser.js +297 -0
- package/dist/parser/parser.js.map +1 -0
- package/dist/parser/values.d.ts +24 -0
- package/dist/parser/values.d.ts.map +1 -0
- package/dist/parser/values.js +284 -0
- package/dist/parser/values.js.map +1 -0
- package/dist/paths.d.ts +6 -0
- package/dist/paths.d.ts.map +1 -0
- package/dist/paths.js +21 -0
- package/dist/paths.js.map +1 -0
- package/dist/references.d.ts +15 -0
- package/dist/references.d.ts.map +1 -0
- package/dist/references.js +40 -0
- package/dist/references.js.map +1 -0
- package/dist/registry/consent.d.ts +11 -0
- package/dist/registry/consent.d.ts.map +1 -0
- package/dist/registry/consent.js +31 -0
- package/dist/registry/consent.js.map +1 -0
- package/dist/registry/extract.d.ts +11 -0
- package/dist/registry/extract.d.ts.map +1 -0
- package/dist/registry/extract.js +275 -0
- package/dist/registry/extract.js.map +1 -0
- package/dist/registry/fields.d.ts +14 -0
- package/dist/registry/fields.d.ts.map +1 -0
- package/dist/registry/fields.js +30 -0
- package/dist/registry/fields.js.map +1 -0
- package/dist/registry/floor.d.ts +17 -0
- package/dist/registry/floor.d.ts.map +1 -0
- package/dist/registry/floor.js +42 -0
- package/dist/registry/floor.js.map +1 -0
- package/dist/registry/index.d.ts +19 -0
- package/dist/registry/index.d.ts.map +1 -0
- package/dist/registry/index.js +80 -0
- package/dist/registry/index.js.map +1 -0
- package/dist/registry/merge.d.ts +32 -0
- package/dist/registry/merge.d.ts.map +1 -0
- package/dist/registry/merge.js +84 -0
- package/dist/registry/merge.js.map +1 -0
- package/dist/registry/order.d.ts +12 -0
- package/dist/registry/order.d.ts.map +1 -0
- package/dist/registry/order.js +134 -0
- package/dist/registry/order.js.map +1 -0
- package/dist/registry/records.d.ts +14 -0
- package/dist/registry/records.d.ts.map +1 -0
- package/dist/registry/records.js +64 -0
- package/dist/registry/records.js.map +1 -0
- package/dist/registry/schemas.d.ts +20 -0
- package/dist/registry/schemas.d.ts.map +1 -0
- package/dist/registry/schemas.js +282 -0
- package/dist/registry/schemas.js.map +1 -0
- package/dist/registry/types.d.ts +130 -0
- package/dist/registry/types.d.ts.map +1 -0
- package/dist/registry/types.js +2 -0
- package/dist/registry/types.js.map +1 -0
- package/dist/scanner/index.d.ts +16 -0
- package/dist/scanner/index.d.ts.map +1 -0
- package/dist/scanner/index.js +78 -0
- package/dist/scanner/index.js.map +1 -0
- package/dist/scanner/lines.d.ts +46 -0
- package/dist/scanner/lines.d.ts.map +1 -0
- package/dist/scanner/lines.js +210 -0
- package/dist/scanner/lines.js.map +1 -0
- package/dist/scanner/tokenize.d.ts +9 -0
- package/dist/scanner/tokenize.d.ts.map +1 -0
- package/dist/scanner/tokenize.js +125 -0
- package/dist/scanner/tokenize.js.map +1 -0
- package/dist/scanner/tokens.d.ts +52 -0
- package/dist/scanner/tokens.d.ts.map +1 -0
- package/dist/scanner/tokens.js +2 -0
- package/dist/scanner/tokens.js.map +1 -0
- package/dist/semantic/cases.d.ts +12 -0
- package/dist/semantic/cases.d.ts.map +1 -0
- package/dist/semantic/cases.js +81 -0
- package/dist/semantic/cases.js.map +1 -0
- package/dist/semantic/cells.d.ts +9 -0
- package/dist/semantic/cells.d.ts.map +1 -0
- package/dist/semantic/cells.js +120 -0
- package/dist/semantic/cells.js.map +1 -0
- package/dist/semantic/conditions.d.ts +22 -0
- package/dist/semantic/conditions.d.ts.map +1 -0
- package/dist/semantic/conditions.js +54 -0
- package/dist/semantic/conditions.js.map +1 -0
- package/dist/semantic/contracts.d.ts +11 -0
- package/dist/semantic/contracts.d.ts.map +1 -0
- package/dist/semantic/contracts.js +75 -0
- package/dist/semantic/contracts.js.map +1 -0
- package/dist/semantic/edges.d.ts +19 -0
- package/dist/semantic/edges.d.ts.map +1 -0
- package/dist/semantic/edges.js +129 -0
- package/dist/semantic/edges.js.map +1 -0
- package/dist/semantic/placement.d.ts +6 -0
- package/dist/semantic/placement.d.ts.map +1 -0
- package/dist/semantic/placement.js +47 -0
- package/dist/semantic/placement.js.map +1 -0
- package/dist/semantic/requirements.d.ts +14 -0
- package/dist/semantic/requirements.d.ts.map +1 -0
- package/dist/semantic/requirements.js +32 -0
- package/dist/semantic/requirements.js.map +1 -0
- package/dist/semantic/resolve.d.ts +23 -0
- package/dist/semantic/resolve.d.ts.map +1 -0
- package/dist/semantic/resolve.js +62 -0
- package/dist/semantic/resolve.js.map +1 -0
- package/dist/semantic/selectors.d.ts +10 -0
- package/dist/semantic/selectors.d.ts.map +1 -0
- package/dist/semantic/selectors.js +33 -0
- package/dist/semantic/selectors.js.map +1 -0
- package/dist/semantic/types.d.ts +56 -0
- package/dist/semantic/types.d.ts.map +1 -0
- package/dist/semantic/types.js +11 -0
- package/dist/semantic/types.js.map +1 -0
- package/dist/semantic/variants.d.ts +10 -0
- package/dist/semantic/variants.d.ts.map +1 -0
- package/dist/semantic/variants.js +63 -0
- package/dist/semantic/variants.js.map +1 -0
- package/dist/semantic/vocabulary.d.ts +12 -0
- package/dist/semantic/vocabulary.d.ts.map +1 -0
- package/dist/semantic/vocabulary.js +33 -0
- package/dist/semantic/vocabulary.js.map +1 -0
- package/dist/taxonomy.d.ts +51 -0
- package/dist/taxonomy.d.ts.map +1 -0
- package/dist/taxonomy.js +42 -0
- package/dist/taxonomy.js.map +1 -0
- package/package.json +221 -3
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
export function compiledValue(value) {
|
|
2
|
+
switch (value.kind) {
|
|
3
|
+
case 'scalar':
|
|
4
|
+
case 'string':
|
|
5
|
+
case 'prose':
|
|
6
|
+
return { kind: value.kind, text: value.text };
|
|
7
|
+
case 'ref':
|
|
8
|
+
return {
|
|
9
|
+
kind: 'ref',
|
|
10
|
+
discriminator: value.discriminator,
|
|
11
|
+
name: value.name,
|
|
12
|
+
...(value.fragment === undefined ? {} : { fragment: value.fragment }),
|
|
13
|
+
};
|
|
14
|
+
case 'list':
|
|
15
|
+
return { kind: 'list', items: value.items.map(compiledValue) };
|
|
16
|
+
case 'block':
|
|
17
|
+
return { kind: 'block' };
|
|
18
|
+
case 'none':
|
|
19
|
+
return { kind: 'none' };
|
|
20
|
+
}
|
|
21
|
+
}
|
|
22
|
+
/**
|
|
23
|
+
* The key rule (spec 2.1) resolved against spelled keys (spec 10.2). A line whose value is not a
|
|
24
|
+
* bare scalar keeps the parser's key: every word before the value. On an all-words line the longest
|
|
25
|
+
* spelling that starts the words is the key and the remaining words are the scalar; with no spelling
|
|
26
|
+
* the parser's first-word key stands. The assertive form keeps the parser's reading.
|
|
27
|
+
*/
|
|
28
|
+
export function resolveKey(field, spellings) {
|
|
29
|
+
if (field.assertive === true || field.value.kind !== 'scalar')
|
|
30
|
+
return { key: field.key, value: compiledValue(field.value) };
|
|
31
|
+
let best;
|
|
32
|
+
for (const spelling of spellings) {
|
|
33
|
+
if (spelling.length === 0 || spelling.length > field.words.length)
|
|
34
|
+
continue;
|
|
35
|
+
if (!spelling.every((word, index) => field.words[index] === word))
|
|
36
|
+
continue;
|
|
37
|
+
if (best === undefined || spelling.length > best.length)
|
|
38
|
+
best = spelling;
|
|
39
|
+
}
|
|
40
|
+
if (best === undefined)
|
|
41
|
+
return { key: field.key, value: compiledValue(field.value) };
|
|
42
|
+
const rest = field.words.slice(best.length);
|
|
43
|
+
return {
|
|
44
|
+
key: best.join(' '),
|
|
45
|
+
value: rest.length === 0 ? { kind: 'none' } : { kind: 'scalar', text: rest.join(' ') },
|
|
46
|
+
};
|
|
47
|
+
}
|
|
48
|
+
//# sourceMappingURL=values.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"values.js","sourceRoot":"","sources":["../../src/compile/values.ts"],"names":[],"mappings":"AAUA,MAAM,UAAU,aAAa,CAAC,KAAY;IACxC,QAAQ,KAAK,CAAC,IAAI,EAAE,CAAC;QACnB,KAAK,QAAQ,CAAC;QACd,KAAK,QAAQ,CAAC;QACd,KAAK,OAAO;YACV,OAAO,EAAE,IAAI,EAAE,KAAK,CAAC,IAAI,EAAE,IAAI,EAAE,KAAK,CAAC,IAAI,EAAE,CAAC;QAChD,KAAK,KAAK;YACR,OAAO;gBACL,IAAI,EAAE,KAAK;gBACX,aAAa,EAAE,KAAK,CAAC,aAAa;gBAClC,IAAI,EAAE,KAAK,CAAC,IAAI;gBAChB,GAAG,CAAC,KAAK,CAAC,QAAQ,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,QAAQ,EAAE,KAAK,CAAC,QAAQ,EAAE,CAAC;aACtE,CAAC;QACJ,KAAK,MAAM;YACT,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,aAAa,CAAC,EAAE,CAAC;QACjE,KAAK,OAAO;YACV,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,CAAC;QAC3B,KAAK,MAAM;YACT,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC;IAC5B,CAAC;AACH,CAAC;AAKD;;;;;GAKG;AACH,MAAM,UAAU,UAAU,CACxB,KAAgB,EAChB,SAA8B;IAE9B,IAAI,KAAK,CAAC,SAAS,KAAK,IAAI,IAAI,KAAK,CAAC,KAAK,CAAC,IAAI,KAAK,QAAQ;QAC3D,OAAO,EAAE,GAAG,EAAE,KAAK,CAAC,GAAG,EAAE,KAAK,EAAE,aAAa,CAAC,KAAK,CAAC,KAAK,CAAC,EAAE,CAAC;IAC/D,IAAI,IAA0B,CAAC;IAC/B,KAAK,MAAM,QAAQ,IAAI,SAAS,EAAE,CAAC;QACjC,IAAI,QAAQ,CAAC,MAAM,KAAK,CAAC,IAAI,QAAQ,CAAC,MAAM,GAAG,KAAK,CAAC,KAAK,CAAC,MAAM;YAAE,SAAS;QAC5E,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,IAAI,EAAE,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,KAAK,CAAC,KAAK,CAAC,KAAK,IAAI,CAAC;YAAE,SAAS;QAC5E,IAAI,IAAI,KAAK,SAAS,IAAI,QAAQ,CAAC,MAAM,GAAG,IAAI,CAAC,MAAM;YAAE,IAAI,GAAG,QAAQ,CAAC;IAC3E,CAAC;IACD,IAAI,IAAI,KAAK,SAAS;QAAE,OAAO,EAAE,GAAG,EAAE,KAAK,CAAC,GAAG,EAAE,KAAK,EAAE,aAAa,CAAC,KAAK,CAAC,KAAK,CAAC,EAAE,CAAC;IACrF,MAAM,IAAI,GAAG,KAAK,CAAC,KAAK,CAAC,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;IAC5C,OAAO;QACL,GAAG,EAAE,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC;QACnB,KAAK,EAAE,IAAI,CAAC,MAAM,KAAK,CAAC,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,QAAQ,EAAE,IAAI,EAAE,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE;KACvF,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
/** Closed diagnostic inventory from spec section 11 and the colocated semantic contract. */
|
|
2
|
+
export declare const LANG_CODES: readonly ["IA-LANG-PRAGMA-MISSING", "IA-LANG-VERSION-UNSUPPORTED", "IA-LANG-INDENT-TAB", "IA-LANG-INDENT-STEP", "IA-LANG-STRING-UNTERMINATED", "IA-LANG-PROSE-TRAILING", "IA-LANG-PROSE-UNTERMINATED", "IA-LANG-LIST-UNTERMINATED", "IA-LANG-HEADER-MALFORMED", "IA-LANG-HEAD-FIELD-AFTER-SECTION", "IA-LANG-TOPLEVEL-UNEXPECTED", "IA-LANG-DISCRIMINATOR-UNREGISTERED", "IA-LANG-FACET-UNDECLARED", "IA-LANG-IDENTITY-COLLISION", "IA-LANG-KEYWORD-RESERVED", "IA-LANG-SYSTEM-CYCLE", "IA-LANG-REGISTRATION-INCOMPLETE", "IA-LANG-KIND-UNKNOWN", "IA-LANG-CATEGORY-UNKNOWN", "IA-LANG-PREDICATE-UNKNOWN", "IA-LANG-SCHEMA-MISSING", "IA-LANG-SCHEMA-KIND-MISMATCH", "IA-LANG-DISCRIMINATOR-CONFLICT", "IA-LANG-SCHEMA-EDGE-AS-FIELD", "IA-LANG-SYSTEM-MISSING", "IA-LANG-SCHEMA-MALFORMED", "IA-LANG-CELL-MALFORMED", "IA-LANG-SELECTOR-MALFORMED", "IA-LANG-SELECTOR-AXIS-UNKNOWN", "IA-LANG-SELECTOR-VALUE-UNKNOWN", "IA-LANG-VERB-UNKNOWN", "IA-LANG-EDGE-MALFORMED", "IA-LANG-EDGE-TARGET-MISSING", "IA-LANG-EDGE-TARGET-AMBIGUOUS", "IA-LANG-EDGE-UNCONSENTED", "IA-LANG-CONDITION-TERM-UNKNOWN", "IA-LANG-CONDITION-MALFORMED", "IA-LANG-CONDITION-VALUE-UNKNOWN", "IA-LANG-CONDITION-MISPLACED", "IA-LANG-VARIANT-DUPLICATE", "IA-LANG-REQUIREMENT-DUPLICATE", "IA-LANG-REQUIREMENT-MALFORMED", "IA-LANG-CONTRACT-UNBOUND", "IA-LANG-CONTRACT-BINDS-RETIRED", "IA-LANG-CONTRACT-SCHEMA-SECTION", "IA-LANG-CASE-UNBOUND", "IA-LANG-CASE-MALFORMED", "IA-LANG-FORMAT-LOSSY", "IA-LANG-VALUE-TRAILING", "IA-LANG-LIST-MALFORMED", "IA-LANG-REF-MALFORMED", "IA-LANG-FIELD-KEY-MISSING"];
|
|
3
|
+
export type LangCode = (typeof LANG_CODES)[number];
|
|
4
|
+
export type Severity = 'error' | 'warning';
|
|
5
|
+
export interface Diagnostic {
|
|
6
|
+
readonly code: LangCode;
|
|
7
|
+
readonly severity: Severity;
|
|
8
|
+
readonly path: string;
|
|
9
|
+
readonly line: number;
|
|
10
|
+
readonly endLine?: number;
|
|
11
|
+
readonly message: string;
|
|
12
|
+
readonly identity?: string;
|
|
13
|
+
}
|
|
14
|
+
export interface DiagOptions {
|
|
15
|
+
readonly severity?: Severity;
|
|
16
|
+
readonly endLine?: number;
|
|
17
|
+
readonly identity?: string;
|
|
18
|
+
}
|
|
19
|
+
/** Build a diagnostic. Severity defaults to error; a construct that produced one produced nothing else. */
|
|
20
|
+
export declare function diag(code: LangCode, path: string, line: number, message: string, options?: DiagOptions): Diagnostic;
|
|
21
|
+
export declare function isError(d: Diagnostic): boolean;
|
|
22
|
+
//# sourceMappingURL=diagnostics.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"diagnostics.d.ts","sourceRoot":"","sources":["../src/diagnostics.ts"],"names":[],"mappings":"AAAA,4FAA4F;AAC5F,eAAO,MAAM,UAAU,8/CAqDb,CAAC;AAEX,MAAM,MAAM,QAAQ,GAAG,CAAC,OAAO,UAAU,CAAC,CAAC,MAAM,CAAC,CAAC;AACnD,MAAM,MAAM,QAAQ,GAAG,OAAO,GAAG,SAAS,CAAC;AAE3C,MAAM,WAAW,UAAU;IACzB,QAAQ,CAAC,IAAI,EAAE,QAAQ,CAAC;IACxB,QAAQ,CAAC,QAAQ,EAAE,QAAQ,CAAC;IAC5B,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,OAAO,CAAC,EAAE,MAAM,CAAC;IAC1B,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,QAAQ,CAAC,EAAE,MAAM,CAAC;CAC5B;AAED,MAAM,WAAW,WAAW;IAC1B,QAAQ,CAAC,QAAQ,CAAC,EAAE,QAAQ,CAAC;IAC7B,QAAQ,CAAC,OAAO,CAAC,EAAE,MAAM,CAAC;IAC1B,QAAQ,CAAC,QAAQ,CAAC,EAAE,MAAM,CAAC;CAC5B;AAED,2GAA2G;AAC3G,wBAAgB,IAAI,CAClB,IAAI,EAAE,QAAQ,EACd,IAAI,EAAE,MAAM,EACZ,IAAI,EAAE,MAAM,EACZ,OAAO,EAAE,MAAM,EACf,OAAO,GAAE,WAAgB,GACxB,UAAU,CAUZ;AAED,wBAAgB,OAAO,CAAC,CAAC,EAAE,UAAU,GAAG,OAAO,CAE9C"}
|
|
@@ -0,0 +1,71 @@
|
|
|
1
|
+
/** Closed diagnostic inventory from spec section 11 and the colocated semantic contract. */
|
|
2
|
+
export const LANG_CODES = [
|
|
3
|
+
'IA-LANG-PRAGMA-MISSING',
|
|
4
|
+
'IA-LANG-VERSION-UNSUPPORTED',
|
|
5
|
+
'IA-LANG-INDENT-TAB',
|
|
6
|
+
'IA-LANG-INDENT-STEP',
|
|
7
|
+
'IA-LANG-STRING-UNTERMINATED',
|
|
8
|
+
'IA-LANG-PROSE-TRAILING',
|
|
9
|
+
'IA-LANG-PROSE-UNTERMINATED',
|
|
10
|
+
'IA-LANG-LIST-UNTERMINATED',
|
|
11
|
+
'IA-LANG-HEADER-MALFORMED',
|
|
12
|
+
'IA-LANG-HEAD-FIELD-AFTER-SECTION',
|
|
13
|
+
'IA-LANG-TOPLEVEL-UNEXPECTED',
|
|
14
|
+
'IA-LANG-DISCRIMINATOR-UNREGISTERED',
|
|
15
|
+
'IA-LANG-FACET-UNDECLARED',
|
|
16
|
+
'IA-LANG-IDENTITY-COLLISION',
|
|
17
|
+
'IA-LANG-KEYWORD-RESERVED',
|
|
18
|
+
'IA-LANG-SYSTEM-CYCLE',
|
|
19
|
+
'IA-LANG-REGISTRATION-INCOMPLETE',
|
|
20
|
+
'IA-LANG-KIND-UNKNOWN',
|
|
21
|
+
'IA-LANG-CATEGORY-UNKNOWN',
|
|
22
|
+
'IA-LANG-PREDICATE-UNKNOWN',
|
|
23
|
+
'IA-LANG-SCHEMA-MISSING',
|
|
24
|
+
'IA-LANG-SCHEMA-KIND-MISMATCH',
|
|
25
|
+
'IA-LANG-DISCRIMINATOR-CONFLICT',
|
|
26
|
+
'IA-LANG-SCHEMA-EDGE-AS-FIELD',
|
|
27
|
+
'IA-LANG-SYSTEM-MISSING',
|
|
28
|
+
'IA-LANG-SCHEMA-MALFORMED',
|
|
29
|
+
'IA-LANG-CELL-MALFORMED',
|
|
30
|
+
'IA-LANG-SELECTOR-MALFORMED',
|
|
31
|
+
'IA-LANG-SELECTOR-AXIS-UNKNOWN',
|
|
32
|
+
'IA-LANG-SELECTOR-VALUE-UNKNOWN',
|
|
33
|
+
'IA-LANG-VERB-UNKNOWN',
|
|
34
|
+
'IA-LANG-EDGE-MALFORMED',
|
|
35
|
+
'IA-LANG-EDGE-TARGET-MISSING',
|
|
36
|
+
'IA-LANG-EDGE-TARGET-AMBIGUOUS',
|
|
37
|
+
'IA-LANG-EDGE-UNCONSENTED',
|
|
38
|
+
'IA-LANG-CONDITION-TERM-UNKNOWN',
|
|
39
|
+
'IA-LANG-CONDITION-MALFORMED',
|
|
40
|
+
'IA-LANG-CONDITION-VALUE-UNKNOWN',
|
|
41
|
+
'IA-LANG-CONDITION-MISPLACED',
|
|
42
|
+
'IA-LANG-VARIANT-DUPLICATE',
|
|
43
|
+
'IA-LANG-REQUIREMENT-DUPLICATE',
|
|
44
|
+
'IA-LANG-REQUIREMENT-MALFORMED',
|
|
45
|
+
'IA-LANG-CONTRACT-UNBOUND',
|
|
46
|
+
'IA-LANG-CONTRACT-BINDS-RETIRED',
|
|
47
|
+
'IA-LANG-CONTRACT-SCHEMA-SECTION',
|
|
48
|
+
'IA-LANG-CASE-UNBOUND',
|
|
49
|
+
'IA-LANG-CASE-MALFORMED',
|
|
50
|
+
'IA-LANG-FORMAT-LOSSY',
|
|
51
|
+
'IA-LANG-VALUE-TRAILING',
|
|
52
|
+
'IA-LANG-LIST-MALFORMED',
|
|
53
|
+
'IA-LANG-REF-MALFORMED',
|
|
54
|
+
'IA-LANG-FIELD-KEY-MISSING',
|
|
55
|
+
];
|
|
56
|
+
/** Build a diagnostic. Severity defaults to error; a construct that produced one produced nothing else. */
|
|
57
|
+
export function diag(code, path, line, message, options = {}) {
|
|
58
|
+
return {
|
|
59
|
+
code,
|
|
60
|
+
severity: options.severity ?? 'error',
|
|
61
|
+
path,
|
|
62
|
+
line,
|
|
63
|
+
...(options.endLine === undefined ? {} : { endLine: options.endLine }),
|
|
64
|
+
message,
|
|
65
|
+
...(options.identity === undefined ? {} : { identity: options.identity }),
|
|
66
|
+
};
|
|
67
|
+
}
|
|
68
|
+
export function isError(d) {
|
|
69
|
+
return d.severity === 'error';
|
|
70
|
+
}
|
|
71
|
+
//# sourceMappingURL=diagnostics.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"diagnostics.js","sourceRoot":"","sources":["../src/diagnostics.ts"],"names":[],"mappings":"AAAA,4FAA4F;AAC5F,MAAM,CAAC,MAAM,UAAU,GAAG;IACxB,wBAAwB;IACxB,6BAA6B;IAC7B,oBAAoB;IACpB,qBAAqB;IACrB,6BAA6B;IAC7B,wBAAwB;IACxB,4BAA4B;IAC5B,2BAA2B;IAC3B,0BAA0B;IAC1B,kCAAkC;IAClC,6BAA6B;IAC7B,oCAAoC;IACpC,0BAA0B;IAC1B,4BAA4B;IAC5B,0BAA0B;IAC1B,sBAAsB;IACtB,iCAAiC;IACjC,sBAAsB;IACtB,0BAA0B;IAC1B,2BAA2B;IAC3B,wBAAwB;IACxB,8BAA8B;IAC9B,gCAAgC;IAChC,8BAA8B;IAC9B,wBAAwB;IACxB,0BAA0B;IAC1B,wBAAwB;IACxB,4BAA4B;IAC5B,+BAA+B;IAC/B,gCAAgC;IAChC,sBAAsB;IACtB,wBAAwB;IACxB,6BAA6B;IAC7B,+BAA+B;IAC/B,0BAA0B;IAC1B,gCAAgC;IAChC,6BAA6B;IAC7B,iCAAiC;IACjC,6BAA6B;IAC7B,2BAA2B;IAC3B,+BAA+B;IAC/B,+BAA+B;IAC/B,0BAA0B;IAC1B,gCAAgC;IAChC,iCAAiC;IACjC,sBAAsB;IACtB,wBAAwB;IACxB,sBAAsB;IACtB,wBAAwB;IACxB,wBAAwB;IACxB,uBAAuB;IACvB,2BAA2B;CACnB,CAAC;AAqBX,2GAA2G;AAC3G,MAAM,UAAU,IAAI,CAClB,IAAc,EACd,IAAY,EACZ,IAAY,EACZ,OAAe,EACf,UAAuB,EAAE;IAEzB,OAAO;QACL,IAAI;QACJ,QAAQ,EAAE,OAAO,CAAC,QAAQ,IAAI,OAAO;QACrC,IAAI;QACJ,IAAI;QACJ,GAAG,CAAC,OAAO,CAAC,OAAO,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,OAAO,EAAE,OAAO,CAAC,OAAO,EAAE,CAAC;QACtE,OAAO;QACP,GAAG,CAAC,OAAO,CAAC,QAAQ,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,QAAQ,EAAE,OAAO,CAAC,QAAQ,EAAE,CAAC;KAC1E,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,OAAO,CAAC,CAAa;IACnC,OAAO,CAAC,CAAC,QAAQ,KAAK,OAAO,CAAC;AAChC,CAAC"}
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
import type { FileNode, RecordNode, Span } from '../ast.js';
|
|
2
|
+
import type { TypedReference } from '../references.js';
|
|
3
|
+
import type { Token } from '../scanner/tokens.js';
|
|
4
|
+
import type { SchemaField, SchemaSection } from '../registry/types.js';
|
|
5
|
+
export { format, checkFormatPreservation } from '../formatter.js';
|
|
6
|
+
/** Minimal source serialization for a schema-backed form; admission remains a separate operation. */
|
|
7
|
+
export declare function draftSource(discriminator: string, name: string, schema: {
|
|
8
|
+
readonly sections: readonly Pick<SchemaSection, 'name' | 'must'>[];
|
|
9
|
+
readonly fields: readonly Pick<SchemaField, 'section' | 'key' | 'type' | 'must'>[];
|
|
10
|
+
}, values: Readonly<Record<string, string>>): string;
|
|
11
|
+
export interface Position {
|
|
12
|
+
readonly line: number;
|
|
13
|
+
readonly character: number;
|
|
14
|
+
}
|
|
15
|
+
export interface Range {
|
|
16
|
+
readonly start: Position;
|
|
17
|
+
readonly end: Position;
|
|
18
|
+
}
|
|
19
|
+
export interface SourceToken {
|
|
20
|
+
readonly token: Token;
|
|
21
|
+
readonly range: Range;
|
|
22
|
+
}
|
|
23
|
+
export interface SourceReference extends TypedReference {
|
|
24
|
+
readonly range: Range;
|
|
25
|
+
}
|
|
26
|
+
export interface SourceProjection {
|
|
27
|
+
readonly ast: FileNode;
|
|
28
|
+
readonly tokens: readonly SourceToken[];
|
|
29
|
+
readonly references: readonly SourceReference[];
|
|
30
|
+
readonly supported: boolean;
|
|
31
|
+
}
|
|
32
|
+
export declare const contains: (range: Range, at: Position) => boolean;
|
|
33
|
+
export declare function lineRange(source: string | readonly string[], span: Span): Range;
|
|
34
|
+
export declare function recordsIn(ast: FileNode): readonly RecordNode[];
|
|
35
|
+
/** Scanner columns exclude layout; restore physical UTF-16 positions without lexing again. */
|
|
36
|
+
export declare function projectSource(source: string, path: string): SourceProjection;
|
|
37
|
+
export interface CursorContext {
|
|
38
|
+
readonly slot: 'none' | 'header' | 'section' | 'field' | 'value' | 'reference' | 'fragment';
|
|
39
|
+
readonly range: Range;
|
|
40
|
+
readonly prefix: string;
|
|
41
|
+
readonly words: readonly string[];
|
|
42
|
+
readonly record?: RecordNode;
|
|
43
|
+
readonly section?: string;
|
|
44
|
+
readonly discriminator?: string;
|
|
45
|
+
readonly targetName?: string;
|
|
46
|
+
}
|
|
47
|
+
/** Recovery uses language scanner primitives and never supplies records for admission. */
|
|
48
|
+
export declare function cursorContext(source: string, path: string, at: Position, projection?: SourceProjection): CursorContext;
|
|
49
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/editor/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,EAAE,UAAU,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAI5D,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAC;AAIvD,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,sBAAsB,CAAC;AAClD,OAAO,KAAK,EAAE,WAAW,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AACvE,OAAO,EAAE,MAAM,EAAE,uBAAuB,EAAE,MAAM,iBAAiB,CAAC;AAElE,qGAAqG;AACrG,wBAAgB,WAAW,CACzB,aAAa,EAAE,MAAM,EACrB,IAAI,EAAE,MAAM,EACZ,MAAM,EAAE;IACN,QAAQ,CAAC,QAAQ,EAAE,SAAS,IAAI,CAAC,aAAa,EAAE,MAAM,GAAG,MAAM,CAAC,EAAE,CAAC;IACnE,QAAQ,CAAC,MAAM,EAAE,SAAS,IAAI,CAAC,WAAW,EAAE,SAAS,GAAG,KAAK,GAAG,MAAM,GAAG,MAAM,CAAC,EAAE,CAAC;CACpF,EACD,MAAM,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,GACvC,MAAM,CA6BR;AAED,MAAM,WAAW,QAAQ;IACvB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;CAC5B;AACD,MAAM,WAAW,KAAK;IACpB,QAAQ,CAAC,KAAK,EAAE,QAAQ,CAAC;IACzB,QAAQ,CAAC,GAAG,EAAE,QAAQ,CAAC;CACxB;AACD,MAAM,WAAW,WAAW;IAC1B,QAAQ,CAAC,KAAK,EAAE,KAAK,CAAC;IACtB,QAAQ,CAAC,KAAK,EAAE,KAAK,CAAC;CACvB;AACD,MAAM,WAAW,eAAgB,SAAQ,cAAc;IACrD,QAAQ,CAAC,KAAK,EAAE,KAAK,CAAC;CACvB;AACD,MAAM,WAAW,gBAAgB;IAC/B,QAAQ,CAAC,GAAG,EAAE,QAAQ,CAAC;IACvB,QAAQ,CAAC,MAAM,EAAE,SAAS,WAAW,EAAE,CAAC;IACxC,QAAQ,CAAC,UAAU,EAAE,SAAS,eAAe,EAAE,CAAC;IAChD,QAAQ,CAAC,SAAS,EAAE,OAAO,CAAC;CAC7B;AACD,eAAO,MAAM,QAAQ,GAAI,OAAO,KAAK,EAAE,IAAI,QAAQ,KAAG,OAE6C,CAAC;AACpG,wBAAgB,SAAS,CAAC,MAAM,EAAE,MAAM,GAAG,SAAS,MAAM,EAAE,EAAE,IAAI,EAAE,IAAI,GAAG,KAAK,CAK/E;AACD,wBAAgB,SAAS,CAAC,GAAG,EAAE,QAAQ,GAAG,SAAS,UAAU,EAAE,CAI9D;AAED,8FAA8F;AAC9F,wBAAgB,aAAa,CAAC,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,gBAAgB,CA4C5E;AAED,MAAM,WAAW,aAAa;IAC5B,QAAQ,CAAC,IAAI,EAAE,MAAM,GAAG,QAAQ,GAAG,SAAS,GAAG,OAAO,GAAG,OAAO,GAAG,WAAW,GAAG,UAAU,CAAC;IAC5F,QAAQ,CAAC,KAAK,EAAE,KAAK,CAAC;IACtB,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,KAAK,EAAE,SAAS,MAAM,EAAE,CAAC;IAClC,QAAQ,CAAC,MAAM,CAAC,EAAE,UAAU,CAAC;IAC7B,QAAQ,CAAC,OAAO,CAAC,EAAE,MAAM,CAAC;IAC1B,QAAQ,CAAC,aAAa,CAAC,EAAE,MAAM,CAAC;IAChC,QAAQ,CAAC,UAAU,CAAC,EAAE,MAAM,CAAC;CAC9B;AACD,0FAA0F;AAC1F,wBAAgB,aAAa,CAC3B,MAAM,EAAE,MAAM,EACd,IAAI,EAAE,MAAM,EACZ,EAAE,EAAE,QAAQ,EACZ,UAAU,mBAA8B,GACvC,aAAa,CAgEf"}
|
|
@@ -0,0 +1,155 @@
|
|
|
1
|
+
import { parse, SUPPORTED_VERSIONS } from '../parser/index.js';
|
|
2
|
+
import { spell } from '../parser/values.js';
|
|
3
|
+
import { references } from '../references.js';
|
|
4
|
+
import { scan } from '../scanner/index.js';
|
|
5
|
+
import { logicalLines, walk } from '../scanner/lines.js';
|
|
6
|
+
import { tokenizeLine } from '../scanner/tokenize.js';
|
|
7
|
+
export { format, checkFormatPreservation } from '../formatter.js';
|
|
8
|
+
/** Minimal source serialization for a schema-backed form; admission remains a separate operation. */
|
|
9
|
+
export function draftSource(discriminator, name, schema, values) {
|
|
10
|
+
if (!/^[a-z][a-z0-9-]*$/.test(discriminator) || !/^[A-Za-z][A-Za-z0-9-]*$/.test(name))
|
|
11
|
+
throw new Error('Invalid IA discriminator or record name');
|
|
12
|
+
const sections = new Map(), keys = new Set(schema.fields.map((f) => `${f.section}/${f.key}`));
|
|
13
|
+
if (Object.keys(values).some((key) => !keys.has(key)))
|
|
14
|
+
throw new Error('Draft contains an undeclared schema field');
|
|
15
|
+
for (const section of schema.sections)
|
|
16
|
+
if (section.must)
|
|
17
|
+
sections.set(section.name, []);
|
|
18
|
+
for (const field of schema.fields) {
|
|
19
|
+
const value = values[`${field.section}/${field.key}`];
|
|
20
|
+
if (value === undefined)
|
|
21
|
+
continue;
|
|
22
|
+
if (typeof value !== 'string' || /[\r\n]/.test(value))
|
|
23
|
+
throw new Error('Form fields must be single-line; use the source draft for multiline prose or structure');
|
|
24
|
+
// IA strings escape only quotes and backslashes. JSON escapes would change tabs and newlines into literal text.
|
|
25
|
+
const encoded = field.type === 'text' ? `"${value.replaceAll('\\', '\\\\').replaceAll('"', '\\"')}"` : value;
|
|
26
|
+
const rows = sections.get(field.section) ?? [];
|
|
27
|
+
rows.push(`${field.key} ${encoded}`);
|
|
28
|
+
sections.set(field.section, rows);
|
|
29
|
+
}
|
|
30
|
+
return (`#! ia 1.0\n\n@${discriminator} ${name}\n` +
|
|
31
|
+
[...sections]
|
|
32
|
+
.sort(([a], [b]) => (a === 'head' ? -1 : b === 'head' ? 1 : 0))
|
|
33
|
+
.map(([section, rows]) => section === '' || section === 'head'
|
|
34
|
+
? rows.map((r) => ` ${r}\n`).join('')
|
|
35
|
+
: ` ${section}\n${rows.map((r) => ` ${r}\n`).join('')}`)
|
|
36
|
+
.join(''));
|
|
37
|
+
}
|
|
38
|
+
export const contains = (range, at) => (at.line > range.start.line || (at.line === range.start.line && at.character >= range.start.character)) &&
|
|
39
|
+
(at.line < range.end.line || (at.line === range.end.line && at.character <= range.end.character));
|
|
40
|
+
export function lineRange(source, span) {
|
|
41
|
+
const lines = typeof source === 'string' ? source.split(/\r?\n/) : source, line = Math.max(0, Math.min(lines.length - 1, span.line - 1));
|
|
42
|
+
const end = Math.max(line, Math.min(lines.length - 1, span.endLine - 1));
|
|
43
|
+
return { start: { line, character: 0 }, end: { line: end, character: lines[end]?.length ?? 0 } };
|
|
44
|
+
}
|
|
45
|
+
export function recordsIn(ast) {
|
|
46
|
+
return ast.records.flatMap(function flatten(record) {
|
|
47
|
+
return [record, ...record.nested.flatMap(flatten)];
|
|
48
|
+
});
|
|
49
|
+
}
|
|
50
|
+
/** Scanner columns exclude layout; restore physical UTF-16 positions without lexing again. */
|
|
51
|
+
export function projectSource(source, path) {
|
|
52
|
+
const parsed = parse(source, path), scanned = scan(source, path), lines = source.split(/\r?\n/);
|
|
53
|
+
const tokens = scanned.tokens.flatMap((token) => {
|
|
54
|
+
if (!('column' in token))
|
|
55
|
+
return [];
|
|
56
|
+
const line = token.line - 1, indent = /^[\t ]*/.exec(lines[line] ?? '')[0].length;
|
|
57
|
+
const start = { line, character: indent + token.column - 1 + (line === 0 && source.startsWith('\uFEFF') ? 1 : 0) };
|
|
58
|
+
const parts = spell(token).split('\n');
|
|
59
|
+
const end = {
|
|
60
|
+
line: line + parts.length - 1,
|
|
61
|
+
character: parts.length === 1 ? start.character + parts[0].length : parts.at(-1).length,
|
|
62
|
+
};
|
|
63
|
+
return [{ token, range: { start, end } }];
|
|
64
|
+
});
|
|
65
|
+
const byLine = new Map(), indexes = new Map();
|
|
66
|
+
tokens.forEach((t, index) => {
|
|
67
|
+
const row = byLine.get(t.token.line) ?? [];
|
|
68
|
+
row.push(t);
|
|
69
|
+
byLine.set(t.token.line, row);
|
|
70
|
+
indexes.set(t, index);
|
|
71
|
+
});
|
|
72
|
+
const uses = references(parsed.ast).flatMap((use) => {
|
|
73
|
+
const candidates = [];
|
|
74
|
+
for (let line = use.span.line; line <= use.span.endLine; line++)
|
|
75
|
+
candidates.push(...(byLine.get(line) ?? []));
|
|
76
|
+
if (use.reference.kind === 'identity') {
|
|
77
|
+
const value = use.reference.identity + (use.reference.fragment === undefined ? '' : `#${use.reference.fragment}`);
|
|
78
|
+
const found = candidates.find((t) => t.token.kind === 'word' && t.token.value === value);
|
|
79
|
+
return found === undefined ? [] : [{ ...use, range: found.range }];
|
|
80
|
+
}
|
|
81
|
+
const sigils = candidates.filter((t) => t.token.kind === 'sigil');
|
|
82
|
+
const sigil = sigils[use.index];
|
|
83
|
+
if (sigil === undefined)
|
|
84
|
+
return [];
|
|
85
|
+
const next = tokens[indexes.get(sigil) + 1];
|
|
86
|
+
return next?.token.kind === 'word' ? [{ ...use, range: { start: sigil.range.start, end: next.range.end } }] : [];
|
|
87
|
+
});
|
|
88
|
+
return {
|
|
89
|
+
ast: parsed.ast,
|
|
90
|
+
tokens,
|
|
91
|
+
references: uses,
|
|
92
|
+
supported: SUPPORTED_VERSIONS.includes(parsed.ast.version),
|
|
93
|
+
};
|
|
94
|
+
}
|
|
95
|
+
/** Recovery uses language scanner primitives and never supplies records for admission. */
|
|
96
|
+
export function cursorContext(source, path, at, projection = projectSource(source, path)) {
|
|
97
|
+
const lines = source.split(/\r?\n/), line = lines[at.line] ?? '', prefixLine = line.slice(0, at.character);
|
|
98
|
+
const range = { start: at, end: at }, none = { slot: 'none', range, prefix: '', words: [] };
|
|
99
|
+
if (!projection.supported)
|
|
100
|
+
return none;
|
|
101
|
+
if (projection.tokens.some((t) => (t.token.kind === 'string' || t.token.kind === 'prose') &&
|
|
102
|
+
contains(t.range, at) &&
|
|
103
|
+
at.character !== t.range.end.character))
|
|
104
|
+
return none;
|
|
105
|
+
const prefixSource = [...lines.slice(0, at.line), prefixLine].join('\n');
|
|
106
|
+
const logical = logicalLines(prefixSource, path);
|
|
107
|
+
if (logical.diagnostics.some((d) => d.code === 'IA-LANG-PROSE-UNTERMINATED'))
|
|
108
|
+
return none;
|
|
109
|
+
const lexical = walk(prefixLine);
|
|
110
|
+
if (lexical.commentAt >= 0 || lexical.endsInString || lexical.endsInProse)
|
|
111
|
+
return none;
|
|
112
|
+
const indent = /^[ \t]*/.exec(prefixLine)[0].length;
|
|
113
|
+
const local = tokenizeLine(prefixLine.slice(indent), path, at.line + 1).tokens;
|
|
114
|
+
const last = local.at(-1), trailingSpace = /\s$/.test(prefixLine);
|
|
115
|
+
const prefix = !trailingSpace && last !== undefined ? spell(last) : '';
|
|
116
|
+
const replace = { start: { line: at.line, character: at.character - prefix.length }, end: at };
|
|
117
|
+
const words = local.filter((t) => t.kind === 'word' || t.kind === 'sigil').map((t) => t.value);
|
|
118
|
+
const records = recordsIn(projection.ast).filter((r) => r.span.line <= at.line + 1);
|
|
119
|
+
const record = records
|
|
120
|
+
.filter((r) => /^[ ]*/.exec(lines[r.span.line - 1] ?? '')[0].length < indent || r.span.line === at.line + 1)
|
|
121
|
+
.at(-1);
|
|
122
|
+
const section = record?.sections
|
|
123
|
+
.filter((s) => s.span.line <= at.line + 1 && /^[ ]*/.exec(lines[s.span.line - 1] ?? '')[0].length < indent)
|
|
124
|
+
.at(-1)?.name;
|
|
125
|
+
const base = {
|
|
126
|
+
range: replace,
|
|
127
|
+
prefix,
|
|
128
|
+
words,
|
|
129
|
+
...(record === undefined ? {} : { record }),
|
|
130
|
+
...(section === undefined ? {} : { section }),
|
|
131
|
+
};
|
|
132
|
+
if (prefixLine.slice(indent).startsWith('@'))
|
|
133
|
+
return { ...base, slot: local.length <= 1 && !trailingSpace ? 'header' : 'none' };
|
|
134
|
+
const sigilIndex = local.map((t) => t.kind).lastIndexOf('sigil');
|
|
135
|
+
if (sigilIndex >= 0) {
|
|
136
|
+
const sigil = local[sigilIndex], name = local[sigilIndex + 1];
|
|
137
|
+
if (sigil.kind === 'sigil' && (sigilIndex === local.length - 1 || sigilIndex === local.length - 2)) {
|
|
138
|
+
const hash = name?.kind === 'word' ? name.value.indexOf('#') : -1;
|
|
139
|
+
return {
|
|
140
|
+
...base,
|
|
141
|
+
range: { start: { line: at.line, character: indent + sigil.column - 1 }, end: at },
|
|
142
|
+
slot: hash >= 0 ? 'fragment' : 'reference',
|
|
143
|
+
discriminator: sigil.value.slice(1),
|
|
144
|
+
...(name?.kind === 'word' ? { targetName: hash >= 0 ? name.value.slice(0, hash) : name.value } : {}),
|
|
145
|
+
};
|
|
146
|
+
}
|
|
147
|
+
}
|
|
148
|
+
const recordIndent = record === undefined ? -1 : /^[ ]*/.exec(lines[record.span.line - 1] ?? '')[0].length;
|
|
149
|
+
if (record !== undefined && indent === recordIndent + 2 && local.length <= 1 && !trailingSpace)
|
|
150
|
+
return { ...base, slot: 'section' };
|
|
151
|
+
if (record === undefined)
|
|
152
|
+
return { ...base, slot: 'header' };
|
|
153
|
+
return { ...base, slot: local.length <= (trailingSpace ? 0 : 1) ? 'field' : 'value' };
|
|
154
|
+
}
|
|
155
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/editor/index.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,KAAK,EAAE,kBAAkB,EAAE,MAAM,oBAAoB,CAAC;AAC/D,OAAO,EAAE,KAAK,EAAE,MAAM,qBAAqB,CAAC;AAC5C,OAAO,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAE9C,OAAO,EAAE,IAAI,EAAE,MAAM,qBAAqB,CAAC;AAC3C,OAAO,EAAE,YAAY,EAAE,IAAI,EAAE,MAAM,qBAAqB,CAAC;AACzD,OAAO,EAAE,YAAY,EAAE,MAAM,wBAAwB,CAAC;AAGtD,OAAO,EAAE,MAAM,EAAE,uBAAuB,EAAE,MAAM,iBAAiB,CAAC;AAElE,qGAAqG;AACrG,MAAM,UAAU,WAAW,CACzB,aAAqB,EACrB,IAAY,EACZ,MAGC,EACD,MAAwC;IAExC,IAAI,CAAC,mBAAmB,CAAC,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,yBAAyB,CAAC,IAAI,CAAC,IAAI,CAAC;QACnF,MAAM,IAAI,KAAK,CAAC,yCAAyC,CAAC,CAAC;IAC7D,MAAM,QAAQ,GAAG,IAAI,GAAG,EAAoB,EAC1C,IAAI,GAAG,IAAI,GAAG,CAAC,MAAM,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,GAAG,CAAC,CAAC,OAAO,IAAI,CAAC,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC;IACpE,IAAI,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;QAAE,MAAM,IAAI,KAAK,CAAC,2CAA2C,CAAC,CAAC;IACpH,KAAK,MAAM,OAAO,IAAI,MAAM,CAAC,QAAQ;QAAE,IAAI,OAAO,CAAC,IAAI;YAAE,QAAQ,CAAC,GAAG,CAAC,OAAO,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC;IACxF,KAAK,MAAM,KAAK,IAAI,MAAM,CAAC,MAAM,EAAE,CAAC;QAClC,MAAM,KAAK,GAAG,MAAM,CAAC,GAAG,KAAK,CAAC,OAAO,IAAI,KAAK,CAAC,GAAG,EAAE,CAAC,CAAC;QACtD,IAAI,KAAK,KAAK,SAAS;YAAE,SAAS;QAClC,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,QAAQ,CAAC,IAAI,CAAC,KAAK,CAAC;YACnD,MAAM,IAAI,KAAK,CAAC,wFAAwF,CAAC,CAAC;QAC5G,gHAAgH;QAChH,MAAM,OAAO,GAAG,KAAK,CAAC,IAAI,KAAK,MAAM,CAAC,CAAC,CAAC,IAAI,KAAK,CAAC,UAAU,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC,UAAU,CAAC,GAAG,EAAE,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,KAAK,CAAC;QAC7G,MAAM,IAAI,GAAG,QAAQ,CAAC,GAAG,CAAC,KAAK,CAAC,OAAO,CAAC,IAAI,EAAE,CAAC;QAC/C,IAAI,CAAC,IAAI,CAAC,GAAG,KAAK,CAAC,GAAG,IAAI,OAAO,EAAE,CAAC,CAAC;QACrC,QAAQ,CAAC,GAAG,CAAC,KAAK,CAAC,OAAO,EAAE,IAAI,CAAC,CAAC;IACpC,CAAC;IACD,OAAO,CACL,iBAAiB,aAAa,IAAI,IAAI,IAAI;QAC1C,CAAC,GAAG,QAAQ,CAAC;aACV,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,KAAK,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,KAAK,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;aAC9D,GAAG,CAAC,CAAC,CAAC,OAAO,EAAE,IAAI,CAAC,EAAE,EAAE,CACvB,OAAO,KAAK,EAAE,IAAI,OAAO,KAAK,MAAM;YAClC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC;YACtC,CAAC,CAAC,KAAK,OAAO,KAAK,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,EAAE,CAC9D;aACA,IAAI,CAAC,EAAE,CAAC,CACZ,CAAC;AACJ,CAAC;AAuBD,MAAM,CAAC,MAAM,QAAQ,GAAG,CAAC,KAAY,EAAE,EAAY,EAAW,EAAE,CAC9D,CAAC,EAAE,CAAC,IAAI,GAAG,KAAK,CAAC,KAAK,CAAC,IAAI,IAAI,CAAC,EAAE,CAAC,IAAI,KAAK,KAAK,CAAC,KAAK,CAAC,IAAI,IAAI,EAAE,CAAC,SAAS,IAAI,KAAK,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC;IACvG,CAAC,EAAE,CAAC,IAAI,GAAG,KAAK,CAAC,GAAG,CAAC,IAAI,IAAI,CAAC,EAAE,CAAC,IAAI,KAAK,KAAK,CAAC,GAAG,CAAC,IAAI,IAAI,EAAE,CAAC,SAAS,IAAI,KAAK,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC,CAAC;AACpG,MAAM,UAAU,SAAS,CAAC,MAAkC,EAAE,IAAU;IACtE,MAAM,KAAK,GAAG,OAAO,MAAM,KAAK,QAAQ,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,MAAM,EACvE,IAAI,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC,EAAE,IAAI,CAAC,IAAI,GAAG,CAAC,CAAC,CAAC,CAAC;IAChE,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,CAAC,IAAI,EAAE,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC,EAAE,IAAI,CAAC,OAAO,GAAG,CAAC,CAAC,CAAC,CAAC;IACzE,OAAO,EAAE,KAAK,EAAE,EAAE,IAAI,EAAE,SAAS,EAAE,CAAC,EAAE,EAAE,GAAG,EAAE,EAAE,IAAI,EAAE,GAAG,EAAE,SAAS,EAAE,KAAK,CAAC,GAAG,CAAC,EAAE,MAAM,IAAI,CAAC,EAAE,EAAE,CAAC;AACnG,CAAC;AACD,MAAM,UAAU,SAAS,CAAC,GAAa;IACrC,OAAO,GAAG,CAAC,OAAO,CAAC,OAAO,CAAC,SAAS,OAAO,CAAC,MAAM;QAChD,OAAO,CAAC,MAAM,EAAE,GAAG,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC,CAAC;IACrD,CAAC,CAAC,CAAC;AACL,CAAC;AAED,8FAA8F;AAC9F,MAAM,UAAU,aAAa,CAAC,MAAc,EAAE,IAAY;IACxD,MAAM,MAAM,GAAG,KAAK,CAAC,MAAM,EAAE,IAAI,CAAC,EAChC,OAAO,GAAG,IAAI,CAAC,MAAM,EAAE,IAAI,CAAC,EAC5B,KAAK,GAAG,MAAM,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;IAChC,MAAM,MAAM,GAAkB,OAAO,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,KAAK,EAAE,EAAE;QAC7D,IAAI,CAAC,CAAC,QAAQ,IAAI,KAAK,CAAC;YAAE,OAAO,EAAE,CAAC;QACpC,MAAM,IAAI,GAAG,KAAK,CAAC,IAAI,GAAG,CAAC,EACzB,MAAM,GAAG,SAAS,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,EAAE,CAAE,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC;QACxD,MAAM,KAAK,GAAG,EAAE,IAAI,EAAE,SAAS,EAAE,MAAM,GAAG,KAAK,CAAC,MAAM,GAAG,CAAC,GAAG,CAAC,IAAI,KAAK,CAAC,IAAI,MAAM,CAAC,UAAU,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;QACnH,MAAM,KAAK,GAAG,KAAK,CAAC,KAAK,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;QACvC,MAAM,GAAG,GAAG;YACV,IAAI,EAAE,IAAI,GAAG,KAAK,CAAC,MAAM,GAAG,CAAC;YAC7B,SAAS,EAAE,KAAK,CAAC,MAAM,KAAK,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,SAAS,GAAG,KAAK,CAAC,CAAC,CAAE,CAAC,MAAM,CAAC,CAAC,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC,CAAC,CAAE,CAAC,MAAM;SAC1F,CAAC;QACF,OAAO,CAAC,EAAE,KAAK,EAAE,KAAK,EAAE,EAAE,KAAK,EAAE,GAAG,EAAE,EAAE,CAAC,CAAC;IAC5C,CAAC,CAAC,CAAC;IACH,MAAM,MAAM,GAAG,IAAI,GAAG,EAAyB,EAC7C,OAAO,GAAG,IAAI,GAAG,EAAuB,CAAC;IAC3C,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,EAAE;QAC1B,MAAM,GAAG,GAAG,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC;QAC3C,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QACZ,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,KAAK,CAAC,IAAI,EAAE,GAAG,CAAC,CAAC;QAC9B,OAAO,CAAC,GAAG,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC;IACxB,CAAC,CAAC,CAAC;IACH,MAAM,IAAI,GAAG,UAAU,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,OAAO,CAAC,CAAC,GAAG,EAAqB,EAAE;QACrE,MAAM,UAAU,GAAkB,EAAE,CAAC;QACrC,KAAK,IAAI,IAAI,GAAG,GAAG,CAAC,IAAI,CAAC,IAAI,EAAE,IAAI,IAAI,GAAG,CAAC,IAAI,CAAC,OAAO,EAAE,IAAI,EAAE;YAAE,UAAU,CAAC,IAAI,CAAC,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC;QAC9G,IAAI,GAAG,CAAC,SAAS,CAAC,IAAI,KAAK,UAAU,EAAE,CAAC;YACtC,MAAM,KAAK,GAAG,GAAG,CAAC,SAAS,CAAC,QAAQ,GAAG,CAAC,GAAG,CAAC,SAAS,CAAC,QAAQ,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,GAAG,CAAC,SAAS,CAAC,QAAQ,EAAE,CAAC,CAAC;YAClH,MAAM,KAAK,GAAG,UAAU,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,KAAK,CAAC,IAAI,KAAK,MAAM,IAAI,CAAC,CAAC,KAAK,CAAC,KAAK,KAAK,KAAK,CAAC,CAAC;YACzF,OAAO,KAAK,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,EAAE,GAAG,GAAG,EAAE,KAAK,EAAE,KAAK,CAAC,KAAK,EAAE,CAAC,CAAC;QACrE,CAAC;QACD,MAAM,MAAM,GAAG,UAAU,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,KAAK,CAAC,IAAI,KAAK,OAAO,CAAC,CAAC;QAClE,MAAM,KAAK,GAAG,MAAM,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;QAChC,IAAI,KAAK,KAAK,SAAS;YAAE,OAAO,EAAE,CAAC;QACnC,MAAM,IAAI,GAAG,MAAM,CAAC,OAAO,CAAC,GAAG,CAAC,KAAK,CAAE,GAAG,CAAC,CAAC,CAAC;QAC7C,OAAO,IAAI,EAAE,KAAK,CAAC,IAAI,KAAK,MAAM,CAAC,CAAC,CAAC,CAAC,EAAE,GAAG,GAAG,EAAE,KAAK,EAAE,EAAE,KAAK,EAAE,KAAK,CAAC,KAAK,CAAC,KAAK,EAAE,GAAG,EAAE,IAAI,CAAC,KAAK,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;IACnH,CAAC,CAAC,CAAC;IACH,OAAO;QACL,GAAG,EAAE,MAAM,CAAC,GAAG;QACf,MAAM;QACN,UAAU,EAAE,IAAI;QAChB,SAAS,EAAG,kBAAwC,CAAC,QAAQ,CAAC,MAAM,CAAC,GAAG,CAAC,OAAO,CAAC;KAClF,CAAC;AACJ,CAAC;AAYD,0FAA0F;AAC1F,MAAM,UAAU,aAAa,CAC3B,MAAc,EACd,IAAY,EACZ,EAAY,EACZ,UAAU,GAAG,aAAa,CAAC,MAAM,EAAE,IAAI,CAAC;IAExC,MAAM,KAAK,GAAG,MAAM,CAAC,KAAK,CAAC,OAAO,CAAC,EACjC,IAAI,GAAG,KAAK,CAAC,EAAE,CAAC,IAAI,CAAC,IAAI,EAAE,EAC3B,UAAU,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,SAAS,CAAC,CAAC;IAC3C,MAAM,KAAK,GAAG,EAAE,KAAK,EAAE,EAAE,EAAE,GAAG,EAAE,EAAE,EAAE,EAClC,IAAI,GAAkB,EAAE,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,EAAE,EAAE,KAAK,EAAE,EAAE,EAAE,CAAC;IACvE,IAAI,CAAC,UAAU,CAAC,SAAS;QAAE,OAAO,IAAI,CAAC;IACvC,IACE,UAAU,CAAC,MAAM,CAAC,IAAI,CACpB,CAAC,CAAC,EAAE,EAAE,CACJ,CAAC,CAAC,CAAC,KAAK,CAAC,IAAI,KAAK,QAAQ,IAAI,CAAC,CAAC,KAAK,CAAC,IAAI,KAAK,OAAO,CAAC;QACvD,QAAQ,CAAC,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC;QACrB,EAAE,CAAC,SAAS,KAAK,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,SAAS,CACzC;QAED,OAAO,IAAI,CAAC;IACd,MAAM,YAAY,GAAG,CAAC,GAAG,KAAK,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,IAAI,CAAC,EAAE,UAAU,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IACzE,MAAM,OAAO,GAAG,YAAY,CAAC,YAAY,EAAE,IAAI,CAAC,CAAC;IACjD,IAAI,OAAO,CAAC,WAAW,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,4BAA4B,CAAC;QAAE,OAAO,IAAI,CAAC;IAC1F,MAAM,OAAO,GAAG,IAAI,CAAC,UAAU,CAAC,CAAC;IACjC,IAAI,OAAO,CAAC,SAAS,IAAI,CAAC,IAAI,OAAO,CAAC,YAAY,IAAI,OAAO,CAAC,WAAW;QAAE,OAAO,IAAI,CAAC;IACvF,MAAM,MAAM,GAAG,SAAS,CAAC,IAAI,CAAC,UAAU,CAAE,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC;IACrD,MAAM,KAAK,GAAG,YAAY,CAAC,UAAU,CAAC,KAAK,CAAC,MAAM,CAAC,EAAE,IAAI,EAAE,EAAE,CAAC,IAAI,GAAG,CAAC,CAAC,CAAC,MAAM,CAAC;IAC/E,MAAM,IAAI,GAAG,KAAK,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,EACvB,aAAa,GAAG,KAAK,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;IACzC,MAAM,MAAM,GAAG,CAAC,aAAa,IAAI,IAAI,KAAK,SAAS,CAAC,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;IACvE,MAAM,OAAO,GAAG,EAAE,KAAK,EAAE,EAAE,IAAI,EAAE,EAAE,CAAC,IAAI,EAAE,SAAS,EAAE,EAAE,CAAC,SAAS,GAAG,MAAM,CAAC,MAAM,EAAE,EAAE,GAAG,EAAE,EAAE,EAAE,CAAC;IAC/F,MAAM,KAAK,GAAG,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,MAAM,IAAI,CAAC,CAAC,IAAI,KAAK,OAAO,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC;IAC/F,MAAM,OAAO,GAAG,SAAS,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,IAAI,EAAE,CAAC,IAAI,GAAG,CAAC,CAAC,CAAC;IACpF,MAAM,MAAM,GAAG,OAAO;SACnB,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,GAAG,CAAC,CAAC,IAAI,EAAE,CAAE,CAAC,CAAC,CAAC,CAAC,MAAM,GAAG,MAAM,IAAI,CAAC,CAAC,IAAI,CAAC,IAAI,KAAK,EAAE,CAAC,IAAI,GAAG,CAAC,CAAC;SAC5G,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC;IACV,MAAM,OAAO,GAAG,MAAM,EAAE,QAAQ;SAC7B,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,IAAI,EAAE,CAAC,IAAI,GAAG,CAAC,IAAI,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,GAAG,CAAC,CAAC,IAAI,EAAE,CAAE,CAAC,CAAC,CAAC,CAAC,MAAM,GAAG,MAAM,CAAC;SAC3G,EAAE,CAAC,CAAC,CAAC,CAAC,EAAE,IAAI,CAAC;IAChB,MAAM,IAAI,GAAG;QACX,KAAK,EAAE,OAAO;QACd,MAAM;QACN,KAAK;QACL,GAAG,CAAC,MAAM,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC;QAC3C,GAAG,CAAC,OAAO,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,OAAO,EAAE,CAAC;KAC9C,CAAC;IACF,IAAI,UAAU,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,UAAU,CAAC,GAAG,CAAC;QAC1C,OAAO,EAAE,GAAG,IAAI,EAAE,IAAI,EAAE,KAAK,CAAC,MAAM,IAAI,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC;IACpF,MAAM,UAAU,GAAG,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,WAAW,CAAC,OAAO,CAAC,CAAC;IACjE,IAAI,UAAU,IAAI,CAAC,EAAE,CAAC;QACpB,MAAM,KAAK,GAAG,KAAK,CAAC,UAAU,CAAE,EAC9B,IAAI,GAAG,KAAK,CAAC,UAAU,GAAG,CAAC,CAAC,CAAC;QAC/B,IAAI,KAAK,CAAC,IAAI,KAAK,OAAO,IAAI,CAAC,UAAU,KAAK,KAAK,CAAC,MAAM,GAAG,CAAC,IAAI,UAAU,KAAK,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC,EAAE,CAAC;YACnG,MAAM,IAAI,GAAG,IAAI,EAAE,IAAI,KAAK,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;YAClE,OAAO;gBACL,GAAG,IAAI;gBACP,KAAK,EAAE,EAAE,KAAK,EAAE,EAAE,IAAI,EAAE,EAAE,CAAC,IAAI,EAAE,SAAS,EAAE,MAAM,GAAG,KAAK,CAAC,MAAM,GAAG,CAAC,EAAE,EAAE,GAAG,EAAE,EAAE,EAAE;gBAClF,IAAI,EAAE,IAAI,IAAI,CAAC,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,WAAW;gBAC1C,aAAa,EAAE,KAAK,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC;gBACnC,GAAG,CAAC,IAAI,EAAE,IAAI,KAAK,MAAM,CAAC,CAAC,CAAC,EAAE,UAAU,EAAE,IAAI,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,EAAE,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;aACrG,CAAC;QACJ,CAAC;IACH,CAAC;IACD,MAAM,YAAY,GAAG,MAAM,KAAK,SAAS,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,IAAI,CAAC,IAAI,GAAG,CAAC,CAAC,IAAI,EAAE,CAAE,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC;IAC5G,IAAI,MAAM,KAAK,SAAS,IAAI,MAAM,KAAK,YAAY,GAAG,CAAC,IAAI,KAAK,CAAC,MAAM,IAAI,CAAC,IAAI,CAAC,aAAa;QAC5F,OAAO,EAAE,GAAG,IAAI,EAAE,IAAI,EAAE,SAAS,EAAE,CAAC;IACtC,IAAI,MAAM,KAAK,SAAS;QAAE,OAAO,EAAE,GAAG,IAAI,EAAE,IAAI,EAAE,QAAQ,EAAE,CAAC;IAC7D,OAAO,EAAE,GAAG,IAAI,EAAE,IAAI,EAAE,KAAK,CAAC,MAAM,IAAI,CAAC,aAAa,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,OAAO,EAAE,CAAC;AACxF,CAAC"}
|
package/dist/fold.d.ts
ADDED
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Fold a prose (`"""`) value. Spec 2.4 as amended by plan 1: a line break plus the
|
|
3
|
+
* continuation line's leading indentation becomes one space; a blank line becomes one
|
|
4
|
+
* paragraph break (`\n`); runs of blank lines collapse to one; the whole is trimmed.
|
|
5
|
+
* Characters inside a line are never changed.
|
|
6
|
+
*/
|
|
7
|
+
export declare function foldProse(raw: string): string;
|
|
8
|
+
//# sourceMappingURL=fold.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"fold.d.ts","sourceRoot":"","sources":["../src/fold.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AACH,wBAAgB,SAAS,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAgB7C"}
|
package/dist/fold.js
ADDED
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Fold a prose (`"""`) value. Spec 2.4 as amended by plan 1: a line break plus the
|
|
3
|
+
* continuation line's leading indentation becomes one space; a blank line becomes one
|
|
4
|
+
* paragraph break (`\n`); runs of blank lines collapse to one; the whole is trimmed.
|
|
5
|
+
* Characters inside a line are never changed.
|
|
6
|
+
*/
|
|
7
|
+
export function foldProse(raw) {
|
|
8
|
+
const lines = raw.split('\n').map((line) => line.trim());
|
|
9
|
+
const paragraphs = [];
|
|
10
|
+
let current = [];
|
|
11
|
+
for (const line of lines) {
|
|
12
|
+
if (line === '') {
|
|
13
|
+
if (current.length > 0) {
|
|
14
|
+
paragraphs.push(current.join(' '));
|
|
15
|
+
current = [];
|
|
16
|
+
}
|
|
17
|
+
}
|
|
18
|
+
else {
|
|
19
|
+
current.push(line);
|
|
20
|
+
}
|
|
21
|
+
}
|
|
22
|
+
if (current.length > 0)
|
|
23
|
+
paragraphs.push(current.join(' '));
|
|
24
|
+
return paragraphs.join('\n').trim();
|
|
25
|
+
}
|
|
26
|
+
//# sourceMappingURL=fold.js.map
|
package/dist/fold.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"fold.js","sourceRoot":"","sources":["../src/fold.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AACH,MAAM,UAAU,SAAS,CAAC,GAAW;IACnC,MAAM,KAAK,GAAG,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC,CAAC;IACzD,MAAM,UAAU,GAAa,EAAE,CAAC;IAChC,IAAI,OAAO,GAAa,EAAE,CAAC;IAC3B,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;QACzB,IAAI,IAAI,KAAK,EAAE,EAAE,CAAC;YAChB,IAAI,OAAO,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;gBACvB,UAAU,CAAC,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC;gBACnC,OAAO,GAAG,EAAE,CAAC;YACf,CAAC;QACH,CAAC;aAAM,CAAC;YACN,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACrB,CAAC;IACH,CAAC;IACD,IAAI,OAAO,CAAC,MAAM,GAAG,CAAC;QAAE,UAAU,CAAC,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC;IAC3D,OAAO,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE,CAAC;AACtC,CAAC"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import type { Diagnostic } from './diagnostics.js';
|
|
2
|
+
export interface FormatResult {
|
|
3
|
+
readonly text: string | null;
|
|
4
|
+
readonly diagnostics: readonly Diagnostic[];
|
|
5
|
+
}
|
|
6
|
+
/** A host may reuse this guard before writing a candidate. It verifies preservation, not registry validity. */
|
|
7
|
+
export declare function checkFormatPreservation(source: string, output: string, path: string): readonly Diagnostic[];
|
|
8
|
+
/** Scanner-driven whitespace formatting. Multiline values and physical trivia positions stay intact. */
|
|
9
|
+
export declare function format(source: string, path: string): FormatResult;
|
|
10
|
+
//# sourceMappingURL=formatter.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"formatter.d.ts","sourceRoot":"","sources":["../src/formatter.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAKnD,MAAM,WAAW,YAAY;IAC3B,QAAQ,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI,CAAC;IAC7B,QAAQ,CAAC,WAAW,EAAE,SAAS,UAAU,EAAE,CAAC;CAC7C;AAgCD,+GAA+G;AAC/G,wBAAgB,uBAAuB,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,SAAS,UAAU,EAAE,CAiB3G;AAED,wGAAwG;AACxG,wBAAgB,MAAM,CAAC,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,YAAY,CAmCjE"}
|
|
@@ -0,0 +1,108 @@
|
|
|
1
|
+
import { diag } from './diagnostics.js';
|
|
2
|
+
import { parse } from './parser/index.js';
|
|
3
|
+
import { scan } from './scanner/index.js';
|
|
4
|
+
function inventories(scanned) {
|
|
5
|
+
return {
|
|
6
|
+
comments: scanned.tokens
|
|
7
|
+
.filter((t) => t.kind === 'comment')
|
|
8
|
+
.map((t) => [t.line, t.text])
|
|
9
|
+
.sort((a, b) => Number(a[0]) - Number(b[0])),
|
|
10
|
+
blanks: scanned.trivia.filter((t) => t.kind === 'blank').map((t) => t.line),
|
|
11
|
+
content: scanned.tokens.flatMap((t) => {
|
|
12
|
+
switch (t.kind) {
|
|
13
|
+
case 'comment':
|
|
14
|
+
case 'indent':
|
|
15
|
+
case 'dedent':
|
|
16
|
+
return [];
|
|
17
|
+
case 'pragma':
|
|
18
|
+
return [[t.kind, t.version]];
|
|
19
|
+
case 'newline':
|
|
20
|
+
return [[t.kind, t.line, t.endLine, t.depth]];
|
|
21
|
+
case 'word':
|
|
22
|
+
case 'sigil':
|
|
23
|
+
return [[t.kind, t.line, t.value]];
|
|
24
|
+
case 'string':
|
|
25
|
+
case 'prose':
|
|
26
|
+
return [[t.kind, t.line, t.value, t.raw]];
|
|
27
|
+
default:
|
|
28
|
+
return [[t.kind, t.line]];
|
|
29
|
+
}
|
|
30
|
+
}),
|
|
31
|
+
};
|
|
32
|
+
}
|
|
33
|
+
/** A host may reuse this guard before writing a candidate. It verifies preservation, not registry validity. */
|
|
34
|
+
export function checkFormatPreservation(source, output, path) {
|
|
35
|
+
const input = scan(source, path);
|
|
36
|
+
const candidate = scan(output, path);
|
|
37
|
+
const before = inventories(input);
|
|
38
|
+
const after = inventories(candidate);
|
|
39
|
+
const changed = ['comments', 'blanks', 'content'].find((key) => JSON.stringify(before[key]) !== JSON.stringify(after[key]));
|
|
40
|
+
if (input.diagnostics.length === 0 && candidate.diagnostics.length === 0 && changed === undefined)
|
|
41
|
+
return [];
|
|
42
|
+
return [
|
|
43
|
+
diag('IA-LANG-FORMAT-LOSSY', path, 1, `${path}: formatting changed ${changed ?? 'scanner validity'}; no output may be written`),
|
|
44
|
+
];
|
|
45
|
+
}
|
|
46
|
+
/** Scanner-driven whitespace formatting. Multiline values and physical trivia positions stay intact. */
|
|
47
|
+
export function format(source, path) {
|
|
48
|
+
const parsed = parse(source, path);
|
|
49
|
+
if (parsed.diagnostics.length > 0)
|
|
50
|
+
return { text: null, diagnostics: parsed.diagnostics };
|
|
51
|
+
const scanned = scan(source, path);
|
|
52
|
+
const lines = source.replaceAll('\r\n', '\n').split('\n');
|
|
53
|
+
if (lines.at(-1) === '')
|
|
54
|
+
lines.pop();
|
|
55
|
+
let pending = [];
|
|
56
|
+
let comment;
|
|
57
|
+
for (const token of scanned.tokens) {
|
|
58
|
+
switch (token.kind) {
|
|
59
|
+
case 'pragma':
|
|
60
|
+
lines[0] = `#! ia ${token.version}`;
|
|
61
|
+
break;
|
|
62
|
+
case 'indent':
|
|
63
|
+
case 'dedent':
|
|
64
|
+
break;
|
|
65
|
+
case 'comment':
|
|
66
|
+
if (token.trailing)
|
|
67
|
+
comment = token;
|
|
68
|
+
break;
|
|
69
|
+
case 'newline': {
|
|
70
|
+
// Preserve scanner-owned raw multiline layout, including list comments on any physical line.
|
|
71
|
+
if (token.line === token.endLine)
|
|
72
|
+
lines[token.line - 1] =
|
|
73
|
+
`${' '.repeat(token.depth)}${render(pending)}${comment?.line === token.line ? ` ${comment.text}` : ''}`;
|
|
74
|
+
pending = [];
|
|
75
|
+
comment = undefined;
|
|
76
|
+
break;
|
|
77
|
+
}
|
|
78
|
+
default:
|
|
79
|
+
pending.push(token);
|
|
80
|
+
}
|
|
81
|
+
}
|
|
82
|
+
const text = `${lines.join('\n')}\n`;
|
|
83
|
+
const diagnostics = checkFormatPreservation(source, text, path);
|
|
84
|
+
return { text: diagnostics.length === 0 ? text : null, diagnostics };
|
|
85
|
+
}
|
|
86
|
+
function render(tokens) {
|
|
87
|
+
let output = '';
|
|
88
|
+
let previous;
|
|
89
|
+
for (const token of tokens) {
|
|
90
|
+
const text = token.kind === 'string' || token.kind === 'prose'
|
|
91
|
+
? token.raw
|
|
92
|
+
: token.kind === 'list-open'
|
|
93
|
+
? '['
|
|
94
|
+
: token.kind === 'list-close'
|
|
95
|
+
? ']'
|
|
96
|
+
: token.kind === 'list-sep'
|
|
97
|
+
? ','
|
|
98
|
+
: token.value;
|
|
99
|
+
const space = previous !== undefined &&
|
|
100
|
+
token.kind !== 'list-close' &&
|
|
101
|
+
token.kind !== 'list-sep' &&
|
|
102
|
+
previous.kind !== 'list-open';
|
|
103
|
+
output += `${space ? ' ' : ''}${text}`;
|
|
104
|
+
previous = token;
|
|
105
|
+
}
|
|
106
|
+
return output;
|
|
107
|
+
}
|
|
108
|
+
//# sourceMappingURL=formatter.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"formatter.js","sourceRoot":"","sources":["../src/formatter.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
import type { RecordNode } from './ast.js';
|
|
2
|
+
import type { Diagnostic } from './diagnostics.js';
|
|
3
|
+
import type { Registration } from './registry/types.js';
|
|
4
|
+
import type { Band, Kind } from './taxonomy.js';
|
|
5
|
+
/** The four slots of spec 3.1 and their rendering. */
|
|
6
|
+
export interface Identity {
|
|
7
|
+
readonly identity: string;
|
|
8
|
+
readonly system: string;
|
|
9
|
+
readonly kind: Kind;
|
|
10
|
+
readonly facet: string;
|
|
11
|
+
readonly name: string;
|
|
12
|
+
readonly displayName: string;
|
|
13
|
+
}
|
|
14
|
+
export declare function renderIdentity(system: string, kind: string, facet: string, name: string): string;
|
|
15
|
+
/** Spec 3.1: the facet is the `facet` head field or the registration's first facet; the name is lowercased; the authored spelling is kept. */
|
|
16
|
+
export declare function identityOf(record: RecordNode, registration: Registration, path: string): {
|
|
17
|
+
readonly identity: Identity | undefined;
|
|
18
|
+
readonly diagnostics: readonly Diagnostic[];
|
|
19
|
+
};
|
|
20
|
+
export interface IdentityOccurrence {
|
|
21
|
+
readonly identity: string;
|
|
22
|
+
readonly path: string;
|
|
23
|
+
readonly line: number;
|
|
24
|
+
readonly band: Band;
|
|
25
|
+
}
|
|
26
|
+
/** Spec 3.2 and 3.3: one identity twice at one band is a collision on both; across bands the graph's authority rule decides. */
|
|
27
|
+
export declare function collisions(occurrences: readonly IdentityOccurrence[]): {
|
|
28
|
+
readonly refused: ReadonlySet<IdentityOccurrence>;
|
|
29
|
+
readonly diagnostics: readonly Diagnostic[];
|
|
30
|
+
};
|
|
31
|
+
//# sourceMappingURL=identity.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"identity.d.ts","sourceRoot":"","sources":["../src/identity.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,UAAU,CAAC;AAE3C,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAEnD,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AACxD,OAAO,KAAK,EAAE,IAAI,EAAE,IAAI,EAAE,MAAM,eAAe,CAAC;AAEhD,sDAAsD;AACtD,MAAM,WAAW,QAAQ;IACvB,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAC1B,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,IAAI,EAAE,IAAI,CAAC;IACpB,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;CAC9B;AAED,wBAAgB,cAAc,CAAC,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,MAAM,CAEhG;AAED,8IAA8I;AAC9I,wBAAgB,UAAU,CACxB,MAAM,EAAE,UAAU,EAClB,YAAY,EAAE,YAAY,EAC1B,IAAI,EAAE,MAAM,GACX;IAAE,QAAQ,CAAC,QAAQ,EAAE,QAAQ,GAAG,SAAS,CAAC;IAAC,QAAQ,CAAC,WAAW,EAAE,SAAS,UAAU,EAAE,CAAA;CAAE,CAkC1F;AAED,MAAM,WAAW,kBAAkB;IACjC,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAC1B,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,IAAI,EAAE,IAAI,CAAC;CACrB;AAED,gIAAgI;AAChI,wBAAgB,UAAU,CAAC,WAAW,EAAE,SAAS,kBAAkB,EAAE,GAAG;IACtE,QAAQ,CAAC,OAAO,EAAE,WAAW,CAAC,kBAAkB,CAAC,CAAC;IAClD,QAAQ,CAAC,WAAW,EAAE,SAAS,UAAU,EAAE,CAAC;CAC7C,CA8BA"}
|