@inventarch/language 0.0.0-stage → 1.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (181) hide show
  1. package/LICENSE +202 -0
  2. package/NOTICE +4 -0
  3. package/README.md +33 -2
  4. package/SPEC.md +225 -0
  5. package/dist/ast.d.ts +114 -0
  6. package/dist/ast.d.ts.map +1 -0
  7. package/dist/ast.js +2 -0
  8. package/dist/ast.js.map +1 -0
  9. package/dist/compile/compile.d.ts +82 -0
  10. package/dist/compile/compile.d.ts.map +1 -0
  11. package/dist/compile/compile.js +249 -0
  12. package/dist/compile/compile.js.map +1 -0
  13. package/dist/compile/index.d.ts +6 -0
  14. package/dist/compile/index.d.ts.map +1 -0
  15. package/dist/compile/index.js +4 -0
  16. package/dist/compile/index.js.map +1 -0
  17. package/dist/compile/spellings.d.ts +7 -0
  18. package/dist/compile/spellings.d.ts.map +1 -0
  19. package/dist/compile/spellings.js +47 -0
  20. package/dist/compile/spellings.js.map +1 -0
  21. package/dist/compile/values.d.ts +32 -0
  22. package/dist/compile/values.d.ts.map +1 -0
  23. package/dist/compile/values.js +48 -0
  24. package/dist/compile/values.js.map +1 -0
  25. package/dist/diagnostics.d.ts +22 -0
  26. package/dist/diagnostics.d.ts.map +1 -0
  27. package/dist/diagnostics.js +71 -0
  28. package/dist/diagnostics.js.map +1 -0
  29. package/dist/editor/index.d.ts +49 -0
  30. package/dist/editor/index.d.ts.map +1 -0
  31. package/dist/editor/index.js +155 -0
  32. package/dist/editor/index.js.map +1 -0
  33. package/dist/fold.d.ts +8 -0
  34. package/dist/fold.d.ts.map +1 -0
  35. package/dist/fold.js +26 -0
  36. package/dist/fold.js.map +1 -0
  37. package/dist/formatter.d.ts +10 -0
  38. package/dist/formatter.d.ts.map +1 -0
  39. package/dist/formatter.js +108 -0
  40. package/dist/formatter.js.map +1 -0
  41. package/dist/identity.d.ts +31 -0
  42. package/dist/identity.d.ts.map +1 -0
  43. package/dist/identity.js +64 -0
  44. package/dist/identity.js.map +1 -0
  45. package/dist/index.d.ts +35 -0
  46. package/dist/index.d.ts.map +1 -0
  47. package/dist/index.js +22 -0
  48. package/dist/index.js.map +1 -0
  49. package/dist/kernel.generated.d.ts +99 -0
  50. package/dist/kernel.generated.d.ts.map +1 -0
  51. package/dist/kernel.generated.js +422 -0
  52. package/dist/kernel.generated.js.map +1 -0
  53. package/dist/parser/index.d.ts +5 -0
  54. package/dist/parser/index.d.ts.map +1 -0
  55. package/dist/parser/index.js +3 -0
  56. package/dist/parser/index.js.map +1 -0
  57. package/dist/parser/parser.d.ts +11 -0
  58. package/dist/parser/parser.d.ts.map +1 -0
  59. package/dist/parser/parser.js +297 -0
  60. package/dist/parser/parser.js.map +1 -0
  61. package/dist/parser/values.d.ts +24 -0
  62. package/dist/parser/values.d.ts.map +1 -0
  63. package/dist/parser/values.js +284 -0
  64. package/dist/parser/values.js.map +1 -0
  65. package/dist/paths.d.ts +6 -0
  66. package/dist/paths.d.ts.map +1 -0
  67. package/dist/paths.js +21 -0
  68. package/dist/paths.js.map +1 -0
  69. package/dist/references.d.ts +15 -0
  70. package/dist/references.d.ts.map +1 -0
  71. package/dist/references.js +40 -0
  72. package/dist/references.js.map +1 -0
  73. package/dist/registry/consent.d.ts +11 -0
  74. package/dist/registry/consent.d.ts.map +1 -0
  75. package/dist/registry/consent.js +31 -0
  76. package/dist/registry/consent.js.map +1 -0
  77. package/dist/registry/extract.d.ts +11 -0
  78. package/dist/registry/extract.d.ts.map +1 -0
  79. package/dist/registry/extract.js +275 -0
  80. package/dist/registry/extract.js.map +1 -0
  81. package/dist/registry/fields.d.ts +14 -0
  82. package/dist/registry/fields.d.ts.map +1 -0
  83. package/dist/registry/fields.js +30 -0
  84. package/dist/registry/fields.js.map +1 -0
  85. package/dist/registry/floor.d.ts +17 -0
  86. package/dist/registry/floor.d.ts.map +1 -0
  87. package/dist/registry/floor.js +42 -0
  88. package/dist/registry/floor.js.map +1 -0
  89. package/dist/registry/index.d.ts +19 -0
  90. package/dist/registry/index.d.ts.map +1 -0
  91. package/dist/registry/index.js +80 -0
  92. package/dist/registry/index.js.map +1 -0
  93. package/dist/registry/merge.d.ts +32 -0
  94. package/dist/registry/merge.d.ts.map +1 -0
  95. package/dist/registry/merge.js +84 -0
  96. package/dist/registry/merge.js.map +1 -0
  97. package/dist/registry/order.d.ts +12 -0
  98. package/dist/registry/order.d.ts.map +1 -0
  99. package/dist/registry/order.js +134 -0
  100. package/dist/registry/order.js.map +1 -0
  101. package/dist/registry/records.d.ts +14 -0
  102. package/dist/registry/records.d.ts.map +1 -0
  103. package/dist/registry/records.js +64 -0
  104. package/dist/registry/records.js.map +1 -0
  105. package/dist/registry/schemas.d.ts +20 -0
  106. package/dist/registry/schemas.d.ts.map +1 -0
  107. package/dist/registry/schemas.js +282 -0
  108. package/dist/registry/schemas.js.map +1 -0
  109. package/dist/registry/types.d.ts +130 -0
  110. package/dist/registry/types.d.ts.map +1 -0
  111. package/dist/registry/types.js +2 -0
  112. package/dist/registry/types.js.map +1 -0
  113. package/dist/scanner/index.d.ts +16 -0
  114. package/dist/scanner/index.d.ts.map +1 -0
  115. package/dist/scanner/index.js +78 -0
  116. package/dist/scanner/index.js.map +1 -0
  117. package/dist/scanner/lines.d.ts +46 -0
  118. package/dist/scanner/lines.d.ts.map +1 -0
  119. package/dist/scanner/lines.js +210 -0
  120. package/dist/scanner/lines.js.map +1 -0
  121. package/dist/scanner/tokenize.d.ts +9 -0
  122. package/dist/scanner/tokenize.d.ts.map +1 -0
  123. package/dist/scanner/tokenize.js +125 -0
  124. package/dist/scanner/tokenize.js.map +1 -0
  125. package/dist/scanner/tokens.d.ts +52 -0
  126. package/dist/scanner/tokens.d.ts.map +1 -0
  127. package/dist/scanner/tokens.js +2 -0
  128. package/dist/scanner/tokens.js.map +1 -0
  129. package/dist/semantic/cases.d.ts +12 -0
  130. package/dist/semantic/cases.d.ts.map +1 -0
  131. package/dist/semantic/cases.js +81 -0
  132. package/dist/semantic/cases.js.map +1 -0
  133. package/dist/semantic/cells.d.ts +9 -0
  134. package/dist/semantic/cells.d.ts.map +1 -0
  135. package/dist/semantic/cells.js +120 -0
  136. package/dist/semantic/cells.js.map +1 -0
  137. package/dist/semantic/conditions.d.ts +22 -0
  138. package/dist/semantic/conditions.d.ts.map +1 -0
  139. package/dist/semantic/conditions.js +54 -0
  140. package/dist/semantic/conditions.js.map +1 -0
  141. package/dist/semantic/contracts.d.ts +11 -0
  142. package/dist/semantic/contracts.d.ts.map +1 -0
  143. package/dist/semantic/contracts.js +75 -0
  144. package/dist/semantic/contracts.js.map +1 -0
  145. package/dist/semantic/edges.d.ts +19 -0
  146. package/dist/semantic/edges.d.ts.map +1 -0
  147. package/dist/semantic/edges.js +129 -0
  148. package/dist/semantic/edges.js.map +1 -0
  149. package/dist/semantic/placement.d.ts +6 -0
  150. package/dist/semantic/placement.d.ts.map +1 -0
  151. package/dist/semantic/placement.js +47 -0
  152. package/dist/semantic/placement.js.map +1 -0
  153. package/dist/semantic/requirements.d.ts +14 -0
  154. package/dist/semantic/requirements.d.ts.map +1 -0
  155. package/dist/semantic/requirements.js +32 -0
  156. package/dist/semantic/requirements.js.map +1 -0
  157. package/dist/semantic/resolve.d.ts +23 -0
  158. package/dist/semantic/resolve.d.ts.map +1 -0
  159. package/dist/semantic/resolve.js +62 -0
  160. package/dist/semantic/resolve.js.map +1 -0
  161. package/dist/semantic/selectors.d.ts +10 -0
  162. package/dist/semantic/selectors.d.ts.map +1 -0
  163. package/dist/semantic/selectors.js +33 -0
  164. package/dist/semantic/selectors.js.map +1 -0
  165. package/dist/semantic/types.d.ts +56 -0
  166. package/dist/semantic/types.d.ts.map +1 -0
  167. package/dist/semantic/types.js +11 -0
  168. package/dist/semantic/types.js.map +1 -0
  169. package/dist/semantic/variants.d.ts +10 -0
  170. package/dist/semantic/variants.d.ts.map +1 -0
  171. package/dist/semantic/variants.js +63 -0
  172. package/dist/semantic/variants.js.map +1 -0
  173. package/dist/semantic/vocabulary.d.ts +12 -0
  174. package/dist/semantic/vocabulary.d.ts.map +1 -0
  175. package/dist/semantic/vocabulary.js +33 -0
  176. package/dist/semantic/vocabulary.js.map +1 -0
  177. package/dist/taxonomy.d.ts +51 -0
  178. package/dist/taxonomy.d.ts.map +1 -0
  179. package/dist/taxonomy.js +42 -0
  180. package/dist/taxonomy.js.map +1 -0
  181. package/package.json +220 -3
@@ -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":"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"}
@@ -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":"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"}
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
@@ -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"}
@@ -0,0 +1,64 @@
1
+ import { diag } from './diagnostics.js';
2
+ import { fieldOf } from './registry/fields.js';
3
+ export function renderIdentity(system, kind, facet, name) {
4
+ return `${system}/${kind}/${facet}/${name}`;
5
+ }
6
+ /** 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. */
7
+ export function identityOf(record, registration, path) {
8
+ let facet = registration.facets[0]; // A joined registration declares at least one facet (4.2).
9
+ const facetField = fieldOf(record.head, ['facet']);
10
+ if (facetField !== undefined) {
11
+ const value = facetField.value;
12
+ const named = value.kind === 'scalar' || value.kind === 'string' ? value.text : '';
13
+ if (!registration.facets.includes(named)) {
14
+ const line = facetField.span.line;
15
+ return {
16
+ identity: undefined,
17
+ diagnostics: [
18
+ diag('IA-LANG-FACET-UNDECLARED', path, line, `${path}:${line}: facet '${named}' is not declared for '${registration.keyword}'; declared: ${registration.facets.join(', ')}`),
19
+ ],
20
+ };
21
+ }
22
+ facet = named;
23
+ }
24
+ const name = record.name.toLowerCase();
25
+ return {
26
+ identity: {
27
+ identity: renderIdentity(registration.system, registration.kind, facet, name),
28
+ system: registration.system,
29
+ kind: registration.kind,
30
+ facet,
31
+ name,
32
+ displayName: record.name,
33
+ },
34
+ diagnostics: [],
35
+ };
36
+ }
37
+ /** 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. */
38
+ export function collisions(occurrences) {
39
+ const groups = new Map();
40
+ for (const occurrence of occurrences) {
41
+ const key = `${occurrence.identity}@${occurrence.band}`;
42
+ const group = groups.get(key);
43
+ if (group === undefined)
44
+ groups.set(key, [occurrence]);
45
+ else
46
+ group.push(occurrence);
47
+ }
48
+ const refused = new Set();
49
+ const diagnostics = [];
50
+ for (const group of groups.values()) {
51
+ if (group.length < 2)
52
+ continue;
53
+ for (const occurrence of group) {
54
+ refused.add(occurrence);
55
+ const others = group
56
+ .filter((other) => other !== occurrence)
57
+ .map((other) => `${other.path}:${other.line}`)
58
+ .join(', ');
59
+ diagnostics.push(diag('IA-LANG-IDENTITY-COLLISION', occurrence.path, occurrence.line, `${occurrence.path}:${occurrence.line}: identity ${occurrence.identity} is also declared at ${others} (band ${occurrence.band})`, { identity: occurrence.identity }));
60
+ }
61
+ }
62
+ return { refused, diagnostics };
63
+ }
64
+ //# sourceMappingURL=identity.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"identity.js","sourceRoot":"","sources":["../src/identity.ts"],"names":[],"mappings":"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"}