@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.
Files changed (182) hide show
  1. package/LANGUAGE.md +56 -0
  2. package/LICENSE +202 -0
  3. package/NOTICE +4 -0
  4. package/README.md +33 -2
  5. package/SPEC.md +225 -0
  6. package/dist/ast.d.ts +114 -0
  7. package/dist/ast.d.ts.map +1 -0
  8. package/dist/ast.js +2 -0
  9. package/dist/ast.js.map +1 -0
  10. package/dist/compile/compile.d.ts +82 -0
  11. package/dist/compile/compile.d.ts.map +1 -0
  12. package/dist/compile/compile.js +249 -0
  13. package/dist/compile/compile.js.map +1 -0
  14. package/dist/compile/index.d.ts +6 -0
  15. package/dist/compile/index.d.ts.map +1 -0
  16. package/dist/compile/index.js +4 -0
  17. package/dist/compile/index.js.map +1 -0
  18. package/dist/compile/spellings.d.ts +7 -0
  19. package/dist/compile/spellings.d.ts.map +1 -0
  20. package/dist/compile/spellings.js +47 -0
  21. package/dist/compile/spellings.js.map +1 -0
  22. package/dist/compile/values.d.ts +32 -0
  23. package/dist/compile/values.d.ts.map +1 -0
  24. package/dist/compile/values.js +48 -0
  25. package/dist/compile/values.js.map +1 -0
  26. package/dist/diagnostics.d.ts +22 -0
  27. package/dist/diagnostics.d.ts.map +1 -0
  28. package/dist/diagnostics.js +71 -0
  29. package/dist/diagnostics.js.map +1 -0
  30. package/dist/editor/index.d.ts +49 -0
  31. package/dist/editor/index.d.ts.map +1 -0
  32. package/dist/editor/index.js +155 -0
  33. package/dist/editor/index.js.map +1 -0
  34. package/dist/fold.d.ts +8 -0
  35. package/dist/fold.d.ts.map +1 -0
  36. package/dist/fold.js +26 -0
  37. package/dist/fold.js.map +1 -0
  38. package/dist/formatter.d.ts +10 -0
  39. package/dist/formatter.d.ts.map +1 -0
  40. package/dist/formatter.js +108 -0
  41. package/dist/formatter.js.map +1 -0
  42. package/dist/identity.d.ts +31 -0
  43. package/dist/identity.d.ts.map +1 -0
  44. package/dist/identity.js +64 -0
  45. package/dist/identity.js.map +1 -0
  46. package/dist/index.d.ts +35 -0
  47. package/dist/index.d.ts.map +1 -0
  48. package/dist/index.js +22 -0
  49. package/dist/index.js.map +1 -0
  50. package/dist/kernel.generated.d.ts +99 -0
  51. package/dist/kernel.generated.d.ts.map +1 -0
  52. package/dist/kernel.generated.js +422 -0
  53. package/dist/kernel.generated.js.map +1 -0
  54. package/dist/parser/index.d.ts +5 -0
  55. package/dist/parser/index.d.ts.map +1 -0
  56. package/dist/parser/index.js +3 -0
  57. package/dist/parser/index.js.map +1 -0
  58. package/dist/parser/parser.d.ts +11 -0
  59. package/dist/parser/parser.d.ts.map +1 -0
  60. package/dist/parser/parser.js +297 -0
  61. package/dist/parser/parser.js.map +1 -0
  62. package/dist/parser/values.d.ts +24 -0
  63. package/dist/parser/values.d.ts.map +1 -0
  64. package/dist/parser/values.js +284 -0
  65. package/dist/parser/values.js.map +1 -0
  66. package/dist/paths.d.ts +6 -0
  67. package/dist/paths.d.ts.map +1 -0
  68. package/dist/paths.js +21 -0
  69. package/dist/paths.js.map +1 -0
  70. package/dist/references.d.ts +15 -0
  71. package/dist/references.d.ts.map +1 -0
  72. package/dist/references.js +40 -0
  73. package/dist/references.js.map +1 -0
  74. package/dist/registry/consent.d.ts +11 -0
  75. package/dist/registry/consent.d.ts.map +1 -0
  76. package/dist/registry/consent.js +31 -0
  77. package/dist/registry/consent.js.map +1 -0
  78. package/dist/registry/extract.d.ts +11 -0
  79. package/dist/registry/extract.d.ts.map +1 -0
  80. package/dist/registry/extract.js +275 -0
  81. package/dist/registry/extract.js.map +1 -0
  82. package/dist/registry/fields.d.ts +14 -0
  83. package/dist/registry/fields.d.ts.map +1 -0
  84. package/dist/registry/fields.js +30 -0
  85. package/dist/registry/fields.js.map +1 -0
  86. package/dist/registry/floor.d.ts +17 -0
  87. package/dist/registry/floor.d.ts.map +1 -0
  88. package/dist/registry/floor.js +42 -0
  89. package/dist/registry/floor.js.map +1 -0
  90. package/dist/registry/index.d.ts +19 -0
  91. package/dist/registry/index.d.ts.map +1 -0
  92. package/dist/registry/index.js +80 -0
  93. package/dist/registry/index.js.map +1 -0
  94. package/dist/registry/merge.d.ts +32 -0
  95. package/dist/registry/merge.d.ts.map +1 -0
  96. package/dist/registry/merge.js +84 -0
  97. package/dist/registry/merge.js.map +1 -0
  98. package/dist/registry/order.d.ts +12 -0
  99. package/dist/registry/order.d.ts.map +1 -0
  100. package/dist/registry/order.js +134 -0
  101. package/dist/registry/order.js.map +1 -0
  102. package/dist/registry/records.d.ts +14 -0
  103. package/dist/registry/records.d.ts.map +1 -0
  104. package/dist/registry/records.js +64 -0
  105. package/dist/registry/records.js.map +1 -0
  106. package/dist/registry/schemas.d.ts +20 -0
  107. package/dist/registry/schemas.d.ts.map +1 -0
  108. package/dist/registry/schemas.js +282 -0
  109. package/dist/registry/schemas.js.map +1 -0
  110. package/dist/registry/types.d.ts +130 -0
  111. package/dist/registry/types.d.ts.map +1 -0
  112. package/dist/registry/types.js +2 -0
  113. package/dist/registry/types.js.map +1 -0
  114. package/dist/scanner/index.d.ts +16 -0
  115. package/dist/scanner/index.d.ts.map +1 -0
  116. package/dist/scanner/index.js +78 -0
  117. package/dist/scanner/index.js.map +1 -0
  118. package/dist/scanner/lines.d.ts +46 -0
  119. package/dist/scanner/lines.d.ts.map +1 -0
  120. package/dist/scanner/lines.js +210 -0
  121. package/dist/scanner/lines.js.map +1 -0
  122. package/dist/scanner/tokenize.d.ts +9 -0
  123. package/dist/scanner/tokenize.d.ts.map +1 -0
  124. package/dist/scanner/tokenize.js +125 -0
  125. package/dist/scanner/tokenize.js.map +1 -0
  126. package/dist/scanner/tokens.d.ts +52 -0
  127. package/dist/scanner/tokens.d.ts.map +1 -0
  128. package/dist/scanner/tokens.js +2 -0
  129. package/dist/scanner/tokens.js.map +1 -0
  130. package/dist/semantic/cases.d.ts +12 -0
  131. package/dist/semantic/cases.d.ts.map +1 -0
  132. package/dist/semantic/cases.js +81 -0
  133. package/dist/semantic/cases.js.map +1 -0
  134. package/dist/semantic/cells.d.ts +9 -0
  135. package/dist/semantic/cells.d.ts.map +1 -0
  136. package/dist/semantic/cells.js +120 -0
  137. package/dist/semantic/cells.js.map +1 -0
  138. package/dist/semantic/conditions.d.ts +22 -0
  139. package/dist/semantic/conditions.d.ts.map +1 -0
  140. package/dist/semantic/conditions.js +54 -0
  141. package/dist/semantic/conditions.js.map +1 -0
  142. package/dist/semantic/contracts.d.ts +11 -0
  143. package/dist/semantic/contracts.d.ts.map +1 -0
  144. package/dist/semantic/contracts.js +75 -0
  145. package/dist/semantic/contracts.js.map +1 -0
  146. package/dist/semantic/edges.d.ts +19 -0
  147. package/dist/semantic/edges.d.ts.map +1 -0
  148. package/dist/semantic/edges.js +129 -0
  149. package/dist/semantic/edges.js.map +1 -0
  150. package/dist/semantic/placement.d.ts +6 -0
  151. package/dist/semantic/placement.d.ts.map +1 -0
  152. package/dist/semantic/placement.js +47 -0
  153. package/dist/semantic/placement.js.map +1 -0
  154. package/dist/semantic/requirements.d.ts +14 -0
  155. package/dist/semantic/requirements.d.ts.map +1 -0
  156. package/dist/semantic/requirements.js +32 -0
  157. package/dist/semantic/requirements.js.map +1 -0
  158. package/dist/semantic/resolve.d.ts +23 -0
  159. package/dist/semantic/resolve.d.ts.map +1 -0
  160. package/dist/semantic/resolve.js +62 -0
  161. package/dist/semantic/resolve.js.map +1 -0
  162. package/dist/semantic/selectors.d.ts +10 -0
  163. package/dist/semantic/selectors.d.ts.map +1 -0
  164. package/dist/semantic/selectors.js +33 -0
  165. package/dist/semantic/selectors.js.map +1 -0
  166. package/dist/semantic/types.d.ts +56 -0
  167. package/dist/semantic/types.d.ts.map +1 -0
  168. package/dist/semantic/types.js +11 -0
  169. package/dist/semantic/types.js.map +1 -0
  170. package/dist/semantic/variants.d.ts +10 -0
  171. package/dist/semantic/variants.d.ts.map +1 -0
  172. package/dist/semantic/variants.js +63 -0
  173. package/dist/semantic/variants.js.map +1 -0
  174. package/dist/semantic/vocabulary.d.ts +12 -0
  175. package/dist/semantic/vocabulary.d.ts.map +1 -0
  176. package/dist/semantic/vocabulary.js +33 -0
  177. package/dist/semantic/vocabulary.js.map +1 -0
  178. package/dist/taxonomy.d.ts +51 -0
  179. package/dist/taxonomy.d.ts.map +1 -0
  180. package/dist/taxonomy.js +42 -0
  181. package/dist/taxonomy.js.map +1 -0
  182. package/package.json +221 -3
@@ -0,0 +1,80 @@
1
+ import { diag } from '../diagnostics.js';
2
+ import { extractSystems } from './extract.js';
3
+ import { BUILTIN_SYSTEMS, FLOOR_CONSENT, FLOOR_REGISTRATIONS, FLOOR_SYSTEM, RESERVED_KEYWORDS } from './floor.js';
4
+ import { mergeByName, mergeRegistrations } from './merge.js';
5
+ import { orderSystems } from './order.js';
6
+ import { extractSchemas } from './schemas.js';
7
+ export { fieldTypeText } from './schemas.js';
8
+ export { admits, consentFor } from './consent.js';
9
+ export { BUILTIN_SYSTEMS, FLOOR_REGISTRATIONS, FLOOR_SYSTEM, RESERVED_KEYWORDS, TAXONOMY_SYSTEM } from './floor.js';
10
+ export { fieldOf, restAfter, sectionOf, spelledAs, stringOf } from './fields.js';
11
+ /** Diagnostics leave in path order, then line order, whichever stage found them. */
12
+ export function sortDiagnostics(diagnostics) {
13
+ return [...diagnostics].sort((a, b) => (a.path < b.path ? -1 : a.path > b.path ? 1 : a.line - b.line));
14
+ }
15
+ /**
16
+ * The minting join at one location (spec 4.4): extract every @system without a vocabulary; band
17
+ * merge; resolve and order requires; lower consent; resolve schemas. A word is joined or refused.
18
+ */
19
+ export function buildRegistry(sources) {
20
+ const diagnostics = [];
21
+ const systems = [];
22
+ const schemas = [];
23
+ const refusedSchemas = new Set();
24
+ for (const source of sources) {
25
+ const band = source.location.placement.band;
26
+ diagnostics.push(...source.diagnostics);
27
+ const extracted = extractSystems(source.ast, band, source.diagnostics);
28
+ systems.push(...extracted.systems);
29
+ diagnostics.push(...extracted.diagnostics);
30
+ const extractedSchemas = extractSchemas(source.ast, band, source.diagnostics);
31
+ schemas.push(...extractedSchemas.schemas);
32
+ diagnostics.push(...extractedSchemas.diagnostics);
33
+ for (const name of extractedSchemas.refused)
34
+ refusedSchemas.add(name);
35
+ }
36
+ const mergedSystems = mergeByName(systems, '@system');
37
+ diagnostics.push(...mergedSystems.diagnostics);
38
+ const ordered = orderSystems(mergedSystems.winners);
39
+ diagnostics.push(...ordered.diagnostics);
40
+ const inForce = ordered.order.map((name) => mergedSystems.winners.get(name));
41
+ const merged = mergeRegistrations(inForce, FLOOR_REGISTRATIONS);
42
+ diagnostics.push(...merged.diagnostics);
43
+ const mergedSchemas = mergeByName(schemas, '@schema');
44
+ diagnostics.push(...mergedSchemas.diagnostics);
45
+ // A winning-band collision already diagnosed the schema; it is refused, not missing.
46
+ for (const schema of schemas)
47
+ if (!mergedSchemas.winners.has(schema.name))
48
+ refusedSchemas.add(schema.name);
49
+ const registrations = new Map();
50
+ for (const [keyword, registration] of merged.registrations) {
51
+ if (RESERVED_KEYWORDS.includes(keyword)) {
52
+ registrations.set(keyword, registration);
53
+ continue;
54
+ }
55
+ const system = mergedSystems.winners.get(registration.system);
56
+ const entry = system.entries.find((e) => e.keyword === keyword);
57
+ const schema = mergedSchemas.winners.get(registration.schema);
58
+ if (schema === undefined) {
59
+ if (!refusedSchemas.has(registration.schema)) {
60
+ diagnostics.push(diag('IA-LANG-SCHEMA-MISSING', system.path, entry.span.line, `${system.path}:${entry.span.line}: '${keyword}' names @schema ${registration.schema}, which no visible file declares`));
61
+ }
62
+ continue;
63
+ }
64
+ if (schema.kind !== registration.kind) {
65
+ diagnostics.push(diag('IA-LANG-SCHEMA-KIND-MISMATCH', system.path, entry.span.line, `${system.path}:${entry.span.line}: '${keyword}' lowers to ${registration.kind} but @schema ${registration.schema} lowers to ${schema.kind}`));
66
+ continue;
67
+ }
68
+ registrations.set(keyword, registration);
69
+ }
70
+ const registry = Object.freeze({
71
+ systems: new Map(inForce.map((s) => [s.name, s])),
72
+ order: [...BUILTIN_SYSTEMS, ...ordered.order.filter((name) => !BUILTIN_SYSTEMS.includes(name))],
73
+ registrations,
74
+ blocked: merged.blocked,
75
+ schemas: mergedSchemas.winners,
76
+ consent: new Map([...inForce.map((s) => [s.name, s.consent]), [FLOOR_SYSTEM, FLOOR_CONSENT]]),
77
+ });
78
+ return { registry, diagnostics: sortDiagnostics(diagnostics) };
79
+ }
80
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/registry/index.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,32 @@
1
+ import type { Span } from '../ast.js';
2
+ import type { Diagnostic } from '../diagnostics.js';
3
+ import type { Band } from '../taxonomy.js';
4
+ import type { Registration, SystemDeclaration } from './types.js';
5
+ interface Named {
6
+ readonly name: string;
7
+ readonly displayName: string;
8
+ readonly band: Band;
9
+ readonly path: string;
10
+ readonly span: Span;
11
+ }
12
+ /**
13
+ * Band merge of declarations sharing a name: the highest band wins and lower bands are shadowed
14
+ * silently; two at the winning band collide and neither is in force (spec 3.2, 4.2).
15
+ */
16
+ export declare function mergeByName<T extends Named>(items: readonly T[], label: string): {
17
+ winners: Map<string, T>;
18
+ diagnostics: Diagnostic[];
19
+ };
20
+ /**
21
+ * One registration per keyword. The floor's words come first and cannot be overridden (extraction
22
+ * refuses them). For a minted keyword the winning band is the highest any system registers it at;
23
+ * two systems there is a conflict on each, and the keyword is blocked at that band rather than
24
+ * falling through to a lower provider.
25
+ */
26
+ export declare function mergeRegistrations(systems: readonly SystemDeclaration[], floor: readonly Registration[]): {
27
+ registrations: Map<string, Registration>;
28
+ blocked: Set<string>;
29
+ diagnostics: Diagnostic[];
30
+ };
31
+ export {};
32
+ //# sourceMappingURL=merge.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"merge.d.ts","sourceRoot":"","sources":["../../src/registry/merge.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAEtC,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC;AACpD,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,gBAAgB,CAAC;AAC3C,OAAO,KAAK,EAAS,YAAY,EAAE,iBAAiB,EAAE,MAAM,YAAY,CAAC;AAEzE,UAAU,KAAK;IACb,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;IAC7B,QAAQ,CAAC,IAAI,EAAE,IAAI,CAAC;IACpB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,IAAI,EAAE,IAAI,CAAC;CACrB;AAID;;;GAGG;AACH,wBAAgB,WAAW,CAAC,CAAC,SAAS,KAAK,EACzC,KAAK,EAAE,SAAS,CAAC,EAAE,EACnB,KAAK,EAAE,MAAM,GACZ;IAAE,OAAO,EAAE,GAAG,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC;IAAC,WAAW,EAAE,UAAU,EAAE,CAAA;CAAE,CAiCxD;AAQD;;;;;GAKG;AACH,wBAAgB,kBAAkB,CAChC,OAAO,EAAE,SAAS,iBAAiB,EAAE,EACrC,KAAK,EAAE,SAAS,YAAY,EAAE,GAC7B;IAAE,aAAa,EAAE,GAAG,CAAC,MAAM,EAAE,YAAY,CAAC,CAAC;IAAC,OAAO,EAAE,GAAG,CAAC,MAAM,CAAC,CAAC;IAAC,WAAW,EAAE,UAAU,EAAE,CAAA;CAAE,CA6C/F"}
@@ -0,0 +1,84 @@
1
+ import { diag } from '../diagnostics.js';
2
+ const byName = (a, b) => (a < b ? -1 : a > b ? 1 : 0);
3
+ /**
4
+ * Band merge of declarations sharing a name: the highest band wins and lower bands are shadowed
5
+ * silently; two at the winning band collide and neither is in force (spec 3.2, 4.2).
6
+ */
7
+ export function mergeByName(items, label) {
8
+ const groups = new Map();
9
+ for (const item of items) {
10
+ const group = groups.get(item.name);
11
+ if (group === undefined)
12
+ groups.set(item.name, [item]);
13
+ else
14
+ group.push(item);
15
+ }
16
+ const winners = new Map();
17
+ const diagnostics = [];
18
+ for (const [name, group] of [...groups.entries()].sort(([a], [b]) => byName(a, b))) {
19
+ const top = Math.max(...group.map((item) => item.band));
20
+ const atTop = group.filter((item) => item.band === top);
21
+ const winner = atTop[0];
22
+ if (atTop.length === 1 && winner !== undefined) {
23
+ winners.set(name, winner);
24
+ continue;
25
+ }
26
+ for (const item of atTop) {
27
+ const others = atTop
28
+ .filter((o) => o !== item)
29
+ .map((o) => `${o.path}:${o.span.line}`)
30
+ .join(', ');
31
+ diagnostics.push(diag('IA-LANG-IDENTITY-COLLISION', item.path, item.span.line, `${item.path}:${item.span.line}: ${label} ${item.displayName} collides with ${others} at band ${top}`));
32
+ }
33
+ }
34
+ return { winners, diagnostics };
35
+ }
36
+ /**
37
+ * One registration per keyword. The floor's words come first and cannot be overridden (extraction
38
+ * refuses them). For a minted keyword the winning band is the highest any system registers it at;
39
+ * two systems there is a conflict on each, and the keyword is blocked at that band rather than
40
+ * falling through to a lower provider.
41
+ */
42
+ export function mergeRegistrations(systems, floor) {
43
+ const candidates = new Map();
44
+ for (const system of systems) {
45
+ for (const entry of system.entries) {
46
+ const registration = {
47
+ keyword: entry.keyword,
48
+ system: system.name,
49
+ kind: entry.kind,
50
+ category: entry.category,
51
+ facets: entry.facets,
52
+ schema: entry.schema,
53
+ band: system.band,
54
+ };
55
+ const list = candidates.get(entry.keyword);
56
+ if (list === undefined)
57
+ candidates.set(entry.keyword, [{ registration, entry, system }]);
58
+ else
59
+ list.push({ registration, entry, system });
60
+ }
61
+ }
62
+ const registrations = new Map(floor.map((r) => [r.keyword, r]));
63
+ const blocked = new Set();
64
+ const diagnostics = [];
65
+ for (const [keyword, list] of [...candidates.entries()].sort(([a], [b]) => byName(a, b))) {
66
+ // Extraction owns the reserved-keyword diagnostic; preserve the supplied floor here.
67
+ if (registrations.has(keyword))
68
+ continue;
69
+ const top = Math.max(...list.map((c) => c.registration.band));
70
+ const atTop = list.filter((c) => c.registration.band === top);
71
+ const winner = atTop[0];
72
+ if (atTop.length === 1 && winner !== undefined) {
73
+ registrations.set(keyword, winner.registration);
74
+ continue;
75
+ }
76
+ blocked.add(keyword);
77
+ const names = atTop.map((c) => c.system.displayName).join(', ');
78
+ for (const c of atTop) {
79
+ diagnostics.push(diag('IA-LANG-DISCRIMINATOR-CONFLICT', c.system.path, c.entry.span.line, `${c.system.path}:${c.entry.span.line}: '${keyword}' is registered by ${names} at band ${top}; the keyword is blocked at that band`));
80
+ }
81
+ }
82
+ return { registrations, blocked, diagnostics };
83
+ }
84
+ //# sourceMappingURL=merge.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"merge.js","sourceRoot":"","sources":["../../src/registry/merge.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,12 @@
1
+ import type { Diagnostic } from '../diagnostics.js';
2
+ import type { SystemDeclaration } from './types.js';
3
+ export interface OrderedSystems {
4
+ /** Bootstrap order over the systems in force: every system after all it requires, ties by name. */
5
+ readonly order: readonly string[];
6
+ /** Systems refused for missing requirements, cycle membership, or dependence on a refused system. */
7
+ readonly dropped: ReadonlySet<string>;
8
+ readonly diagnostics: readonly Diagnostic[];
9
+ }
10
+ /** Resolve `requires` against the final systems in force, then order survivors (spec 4.2). */
11
+ export declare function orderSystems(winners: ReadonlyMap<string, SystemDeclaration>): OrderedSystems;
12
+ //# sourceMappingURL=order.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"order.d.ts","sourceRoot":"","sources":["../../src/registry/order.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC;AAEpD,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,YAAY,CAAC;AAEpD,MAAM,WAAW,cAAc;IAC7B,mGAAmG;IACnG,QAAQ,CAAC,KAAK,EAAE,SAAS,MAAM,EAAE,CAAC;IAClC,qGAAqG;IACrG,QAAQ,CAAC,OAAO,EAAE,WAAW,CAAC,MAAM,CAAC,CAAC;IACtC,QAAQ,CAAC,WAAW,EAAE,SAAS,UAAU,EAAE,CAAC;CAC7C;AAED,8FAA8F;AAC9F,wBAAgB,YAAY,CAAC,OAAO,EAAE,WAAW,CAAC,MAAM,EAAE,iBAAiB,CAAC,GAAG,cAAc,CAoI5F"}
@@ -0,0 +1,134 @@
1
+ import { diag } from '../diagnostics.js';
2
+ import { BUILTIN_SYSTEMS } from './floor.js';
3
+ /** Resolve `requires` against the final systems in force, then order survivors (spec 4.2). */
4
+ export function orderSystems(winners) {
5
+ const diagnostics = [];
6
+ const dropped = new Set();
7
+ const names = [...winners.keys()].sort();
8
+ const dependencies = new Map();
9
+ const dependents = new Map(names.map((name) => [name, []]));
10
+ for (const name of names) {
11
+ const system = winners.get(name);
12
+ const declared = new Set();
13
+ for (const required of system.requires) {
14
+ if (BUILTIN_SYSTEMS.includes(required.name))
15
+ continue;
16
+ if (winners.has(required.name))
17
+ declared.add(required.name);
18
+ else
19
+ dropped.add(name);
20
+ }
21
+ dependencies.set(name, [...declared].sort());
22
+ for (const required of declared)
23
+ dependents.get(required).push(name);
24
+ }
25
+ // Tarjan's strongly connected components include every member of overlapping cycles.
26
+ const indices = new Map();
27
+ const low = new Map();
28
+ const stack = [];
29
+ const active = new Set();
30
+ const cycleOf = new Map();
31
+ const visit = (name) => {
32
+ const index = indices.size;
33
+ indices.set(name, index);
34
+ low.set(name, index);
35
+ stack.push(name);
36
+ active.add(name);
37
+ for (const required of dependencies.get(name)) {
38
+ if (!indices.has(required)) {
39
+ visit(required);
40
+ low.set(name, Math.min(low.get(name), low.get(required)));
41
+ }
42
+ else if (active.has(required)) {
43
+ low.set(name, Math.min(low.get(name), indices.get(required)));
44
+ }
45
+ }
46
+ if (low.get(name) !== index)
47
+ return;
48
+ const members = new Set();
49
+ let member;
50
+ do {
51
+ member = stack.pop();
52
+ active.delete(member);
53
+ members.add(member);
54
+ } while (member !== name);
55
+ if (members.size > 1 || dependencies.get(name).includes(name)) {
56
+ for (const member of members) {
57
+ cycleOf.set(member, members);
58
+ dropped.add(member);
59
+ }
60
+ }
61
+ };
62
+ for (const name of names)
63
+ if (!indices.has(name))
64
+ visit(name);
65
+ // Refusal propagates to every dependent before resolving any requirement as satisfied.
66
+ const refused = [...dropped];
67
+ for (const name of refused) {
68
+ for (const dependent of dependents.get(name)) {
69
+ if (dropped.has(dependent))
70
+ continue;
71
+ dropped.add(dependent);
72
+ refused.push(dependent);
73
+ }
74
+ }
75
+ const cycleThrough = (start, members) => {
76
+ const seen = new Set();
77
+ const path = [];
78
+ const walk = (name) => {
79
+ seen.add(name);
80
+ path.push(name);
81
+ for (const required of dependencies.get(name)) {
82
+ if (!members.has(required))
83
+ continue;
84
+ if (required === start)
85
+ return [...path, start];
86
+ if (seen.has(required))
87
+ continue;
88
+ const cycle = walk(required);
89
+ if (cycle !== undefined)
90
+ return cycle;
91
+ }
92
+ path.pop();
93
+ return undefined;
94
+ };
95
+ return walk(start); // Every member of a cyclic component lies on a cycle.
96
+ };
97
+ const visible = [...new Set([...BUILTIN_SYSTEMS, ...names.filter((name) => !dropped.has(name))])].join(', ');
98
+ for (const name of names) {
99
+ const system = winners.get(name);
100
+ const cycle = cycleOf.get(name);
101
+ if (cycle !== undefined) {
102
+ diagnostics.push(diag('IA-LANG-SYSTEM-CYCLE', system.path, system.span.line, `${system.path}:${system.span.line}: requires cycle ${cycleThrough(name, cycle).join(' -> ')}`));
103
+ }
104
+ for (const required of system.requires) {
105
+ if (BUILTIN_SYSTEMS.includes(required.name))
106
+ continue;
107
+ if (winners.has(required.name) && !dropped.has(required.name))
108
+ continue;
109
+ if (cycle !== undefined && cycle === cycleOf.get(required.name))
110
+ continue;
111
+ diagnostics.push(diag('IA-LANG-SYSTEM-MISSING', system.path, required.span.line, `${system.path}:${required.span.line}: @system ${system.displayName} requires '${required.name}', which has no @system in force; visible: ${visible}`));
112
+ }
113
+ }
114
+ diagnostics.sort((a, b) => (a.path < b.path ? -1 : a.path > b.path ? 1 : a.line - b.line));
115
+ // Kahn's algorithm with a sorted ready queue gives the first available name at each step.
116
+ const remaining = new Map(names.filter((name) => !dropped.has(name)).map((name) => [name, dependencies.get(name).length]));
117
+ const ready = names.filter((name) => remaining.get(name) === 0);
118
+ const order = [];
119
+ while (ready.length > 0) {
120
+ const name = ready.shift();
121
+ order.push(name);
122
+ for (const dependent of dependents.get(name)) {
123
+ const count = remaining.get(dependent);
124
+ if (count === undefined)
125
+ continue;
126
+ remaining.set(dependent, count - 1);
127
+ if (count === 1)
128
+ ready.push(dependent);
129
+ }
130
+ ready.sort();
131
+ }
132
+ return { order, dropped, diagnostics };
133
+ }
134
+ //# sourceMappingURL=order.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"order.js","sourceRoot":"","sources":["../../src/registry/order.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,14 @@
1
+ import type { ChildNode, FieldNode, FileNode, RecordNode } from '../ast.js';
2
+ import type { Diagnostic } from '../diagnostics.js';
3
+ export interface RecordSource {
4
+ readonly record: RecordNode;
5
+ /** Structural boundary, including trailing refused lines omitted by the accepted AST span. */
6
+ readonly endLine: number;
7
+ /** Parser errors owned by this record, excluding its nested declarations. */
8
+ readonly errors: readonly Diagnostic[];
9
+ }
10
+ /** Every record once in source order, with its own parser faults. Structural children alias `nested`. */
11
+ export declare function recordsIn(ast: FileNode, parserDiagnostics: readonly Diagnostic[]): readonly RecordSource[];
12
+ /** Inline and standalone conditions through field blocks; nested records own their own positions. */
13
+ export declare function conditionsIn(children: readonly ChildNode[]): FieldNode[];
14
+ //# sourceMappingURL=records.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"records.d.ts","sourceRoot":"","sources":["../../src/registry/records.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,SAAS,EAAE,QAAQ,EAAE,UAAU,EAAE,MAAM,WAAW,CAAC;AAC5E,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC;AAEpD,MAAM,WAAW,YAAY;IAC3B,QAAQ,CAAC,MAAM,EAAE,UAAU,CAAC;IAC5B,8FAA8F;IAC9F,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,6EAA6E;IAC7E,QAAQ,CAAC,MAAM,EAAE,SAAS,UAAU,EAAE,CAAC;CACxC;AAED,yGAAyG;AACzG,wBAAgB,SAAS,CAAC,GAAG,EAAE,QAAQ,EAAE,iBAAiB,EAAE,SAAS,UAAU,EAAE,GAAG,SAAS,YAAY,EAAE,CAsC1G;AAuBD,qGAAqG;AACrG,wBAAgB,YAAY,CAAC,QAAQ,EAAE,SAAS,SAAS,EAAE,GAAG,SAAS,EAAE,CAQxE"}
@@ -0,0 +1,64 @@
1
+ /** Every record once in source order, with its own parser faults. Structural children alias `nested`. */
2
+ export function recordsIn(ast, parserDiagnostics) {
3
+ const errors = parserDiagnostics.filter((d) => d.path === ast.path && d.severity === 'error');
4
+ const fileEnd = Math.max(1, ...ast.records.map((r) => r.span.endLine), ...errors.map((d) => d.endLine ?? d.line));
5
+ const limits = recordLimits(ast.records, fileEnd);
6
+ if (ast.syntaxRecordSpans !== undefined) {
7
+ const ends = new Map(ast.syntaxRecordSpans.map((span) => [span.line, span.endLine]));
8
+ return [...limits].map(([record, fallback]) => {
9
+ const endLine = ends.get(record.span.line) ?? fallback;
10
+ return {
11
+ record,
12
+ endLine,
13
+ errors: errors.filter((d) => d.line >= record.span.line &&
14
+ d.line <= endLine &&
15
+ !ast.syntaxRecordSpans.some((nested) => nested.line > record.span.line &&
16
+ nested.line <= endLine &&
17
+ d.line >= nested.line &&
18
+ d.line <= nested.endLine)),
19
+ };
20
+ });
21
+ }
22
+ // JSON serialization copies the derived `nested` entries, so ownership cannot depend on aliases.
23
+ const endsByLine = new Map([...limits].map(([record, endLine]) => [record.span.line, endLine]));
24
+ return [...limits].map(([record, endLine]) => ({
25
+ record,
26
+ endLine,
27
+ errors: errors.filter((d) => d.line >= record.span.line &&
28
+ d.line <= endLine &&
29
+ !record.nested.some((nested) => d.line >= nested.span.line && d.line <= endsByLine.get(nested.span.line))),
30
+ }));
31
+ }
32
+ /** Structural boundaries include refused trailing lines that accepted AST spans omit. */
33
+ function recordLimits(records, fileEnd) {
34
+ const limits = new Map();
35
+ const children = (nodes, endLine) => {
36
+ nodes.forEach((node, index) => {
37
+ const end = (nodes[index + 1]?.span.line ?? endLine + 1) - 1;
38
+ if (node.kind === 'record')
39
+ record(node, end);
40
+ else if (node.kind === 'field')
41
+ children(node.children, end);
42
+ });
43
+ };
44
+ const record = (node, endLine) => {
45
+ limits.set(node, endLine);
46
+ children(node.head, (node.sections[0]?.span.line ?? endLine + 1) - 1);
47
+ node.sections.forEach((section, index) => children(section.children, (node.sections[index + 1]?.span.line ?? endLine + 1) - 1));
48
+ };
49
+ children(records, fileEnd);
50
+ return limits;
51
+ }
52
+ /** Inline and standalone conditions through field blocks; nested records own their own positions. */
53
+ export function conditionsIn(children) {
54
+ const found = [];
55
+ for (const child of children) {
56
+ if (child.kind !== 'field')
57
+ continue;
58
+ if (child.when !== undefined || child.words[0] === 'when')
59
+ found.push(child);
60
+ found.push(...conditionsIn(child.children));
61
+ }
62
+ return found;
63
+ }
64
+ //# sourceMappingURL=records.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"records.js","sourceRoot":"","sources":["../../src/registry/records.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,20 @@
1
+ import type { FileNode } from '../ast.js';
2
+ import type { Diagnostic } from '../diagnostics.js';
3
+ import type { Band } from '../taxonomy.js';
4
+ import type { SchemaDeclaration } from './types.js';
5
+ /** The field type as the dialect spells it, narrowing included: `id in [a, b]`, `list of ref to task`, `text form iso-date`. */
6
+ export declare function fieldTypeText(field: {
7
+ readonly type: string;
8
+ readonly values?: readonly string[];
9
+ readonly target?: string;
10
+ readonly form?: string;
11
+ }): string;
12
+ export interface ExtractedSchemas {
13
+ readonly schemas: readonly SchemaDeclaration[];
14
+ readonly diagnostics: readonly Diagnostic[];
15
+ /** Lowercased names of `@schema` records that were present but refused, so a registration naming one is not also "missing". */
16
+ readonly refused: ReadonlySet<string>;
17
+ }
18
+ /** Every `@schema`, including nested declarations. The caller retains parser diagnostics once. */
19
+ export declare function extractSchemas(ast: FileNode, band: Band, parserDiagnostics: readonly Diagnostic[]): ExtractedSchemas;
20
+ //# sourceMappingURL=schemas.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"schemas.d.ts","sourceRoot":"","sources":["../../src/registry/schemas.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAwB,QAAQ,EAAqB,MAAM,WAAW,CAAC;AAEnF,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC;AAcpD,OAAO,KAAK,EAAE,IAAI,EAAmB,MAAM,gBAAgB,CAAC;AAE5D,OAAO,KAAK,EAAE,iBAAiB,EAA0C,MAAM,YAAY,CAAC;AAuC5F,gIAAgI;AAChI,wBAAgB,aAAa,CAAC,KAAK,EAAE;IACnC,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,MAAM,CAAC,EAAE,SAAS,MAAM,EAAE,CAAC;IACpC,QAAQ,CAAC,MAAM,CAAC,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,IAAI,CAAC,EAAE,MAAM,CAAC;CACxB,GAAG,MAAM,CAKT;AAED,MAAM,WAAW,gBAAgB;IAC/B,QAAQ,CAAC,OAAO,EAAE,SAAS,iBAAiB,EAAE,CAAC;IAC/C,QAAQ,CAAC,WAAW,EAAE,SAAS,UAAU,EAAE,CAAC;IAC5C,+HAA+H;IAC/H,QAAQ,CAAC,OAAO,EAAE,WAAW,CAAC,MAAM,CAAC,CAAC;CACvC;AAED,kGAAkG;AAClG,wBAAgB,cAAc,CAAC,GAAG,EAAE,QAAQ,EAAE,IAAI,EAAE,IAAI,EAAE,iBAAiB,EAAE,SAAS,UAAU,EAAE,GAAG,gBAAgB,CAWpH"}