@0disoft/mensor-compiler 0.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 (90) hide show
  1. package/LICENSE +201 -0
  2. package/dist/src/check-project.d.ts +9 -0
  3. package/dist/src/check-project.d.ts.map +1 -0
  4. package/dist/src/check-project.js +334 -0
  5. package/dist/src/check-project.js.map +1 -0
  6. package/dist/src/compiler-timing.d.ts +25 -0
  7. package/dist/src/compiler-timing.d.ts.map +1 -0
  8. package/dist/src/compiler-timing.js +72 -0
  9. package/dist/src/compiler-timing.js.map +1 -0
  10. package/dist/src/feature-roots.d.ts +6 -0
  11. package/dist/src/feature-roots.d.ts.map +1 -0
  12. package/dist/src/feature-roots.js +8 -0
  13. package/dist/src/feature-roots.js.map +1 -0
  14. package/dist/src/filesystem.d.ts +4 -0
  15. package/dist/src/filesystem.d.ts.map +1 -0
  16. package/dist/src/filesystem.js +127 -0
  17. package/dist/src/filesystem.js.map +1 -0
  18. package/dist/src/form-facts.d.ts +37 -0
  19. package/dist/src/form-facts.d.ts.map +1 -0
  20. package/dist/src/form-facts.js +2 -0
  21. package/dist/src/form-facts.js.map +1 -0
  22. package/dist/src/form-index-semantics.d.ts +4 -0
  23. package/dist/src/form-index-semantics.d.ts.map +1 -0
  24. package/dist/src/form-index-semantics.js +149 -0
  25. package/dist/src/form-index-semantics.js.map +1 -0
  26. package/dist/src/form-index-types.d.ts +69 -0
  27. package/dist/src/form-index-types.d.ts.map +1 -0
  28. package/dist/src/form-index-types.js +11 -0
  29. package/dist/src/form-index-types.js.map +1 -0
  30. package/dist/src/form-index-validation.d.ts +3 -0
  31. package/dist/src/form-index-validation.d.ts.map +1 -0
  32. package/dist/src/form-index-validation.js +360 -0
  33. package/dist/src/form-index-validation.js.map +1 -0
  34. package/dist/src/form-index.d.ts +8 -0
  35. package/dist/src/form-index.d.ts.map +1 -0
  36. package/dist/src/form-index.js +94 -0
  37. package/dist/src/form-index.js.map +1 -0
  38. package/dist/src/form-rule.d.ts +9 -0
  39. package/dist/src/form-rule.d.ts.map +1 -0
  40. package/dist/src/form-rule.js +399 -0
  41. package/dist/src/form-rule.js.map +1 -0
  42. package/dist/src/handler-rule.d.ts +10 -0
  43. package/dist/src/handler-rule.d.ts.map +1 -0
  44. package/dist/src/handler-rule.js +75 -0
  45. package/dist/src/handler-rule.js.map +1 -0
  46. package/dist/src/html-forms.d.ts +12 -0
  47. package/dist/src/html-forms.d.ts.map +1 -0
  48. package/dist/src/html-forms.js +275 -0
  49. package/dist/src/html-forms.js.map +1 -0
  50. package/dist/src/index.d.ts +3 -0
  51. package/dist/src/index.d.ts.map +1 -0
  52. package/dist/src/index.js +2 -0
  53. package/dist/src/index.js.map +1 -0
  54. package/dist/src/locations.d.ts +12 -0
  55. package/dist/src/locations.d.ts.map +1 -0
  56. package/dist/src/locations.js +148 -0
  57. package/dist/src/locations.js.map +1 -0
  58. package/dist/src/module-boundary-rule.d.ts +12 -0
  59. package/dist/src/module-boundary-rule.d.ts.map +1 -0
  60. package/dist/src/module-boundary-rule.js +256 -0
  61. package/dist/src/module-boundary-rule.js.map +1 -0
  62. package/dist/src/ownership-rule.d.ts +13 -0
  63. package/dist/src/ownership-rule.d.ts.map +1 -0
  64. package/dist/src/ownership-rule.js +98 -0
  65. package/dist/src/ownership-rule.js.map +1 -0
  66. package/dist/src/paths.d.ts +11 -0
  67. package/dist/src/paths.d.ts.map +1 -0
  68. package/dist/src/paths.js +35 -0
  69. package/dist/src/paths.js.map +1 -0
  70. package/dist/src/route-index.d.ts +9 -0
  71. package/dist/src/route-index.d.ts.map +1 -0
  72. package/dist/src/route-index.js +31 -0
  73. package/dist/src/route-index.js.map +1 -0
  74. package/dist/src/route-rule.d.ts +11 -0
  75. package/dist/src/route-rule.d.ts.map +1 -0
  76. package/dist/src/route-rule.js +54 -0
  77. package/dist/src/route-rule.js.map +1 -0
  78. package/dist/src/source-fact-index.d.ts +8 -0
  79. package/dist/src/source-fact-index.d.ts.map +1 -0
  80. package/dist/src/source-fact-index.js +38 -0
  81. package/dist/src/source-fact-index.js.map +1 -0
  82. package/dist/src/types.d.ts +29 -0
  83. package/dist/src/types.d.ts.map +1 -0
  84. package/dist/src/types.js +2 -0
  85. package/dist/src/types.js.map +1 -0
  86. package/dist/src/typescript-source.d.ts +22 -0
  87. package/dist/src/typescript-source.d.ts.map +1 -0
  88. package/dist/src/typescript-source.js +352 -0
  89. package/dist/src/typescript-source.js.map +1 -0
  90. package/package.json +48 -0
@@ -0,0 +1,360 @@
1
+ import * as path from "node:path";
2
+ import { compareText } from "./paths.js";
3
+ import { FormIndexFailure, } from "./form-index-types.js";
4
+ const dynamicReasons = new Set([
5
+ "computed-attribute",
6
+ "conditional-presence",
7
+ "custom-helper-semantics",
8
+ "dynamic-interpolation",
9
+ "repeated-generation",
10
+ ]);
11
+ const unsupportedReasons = new Set([
12
+ "file-input",
13
+ "named-submitter",
14
+ "provider-resource-limit",
15
+ "submitter-route-override",
16
+ "unsupported-control-kind",
17
+ ]);
18
+ const windowsReservedName = /^(?:aux|con|nul|prn|com[1-9]|lpt[1-9])(?:\..*)?$/iu;
19
+ export function canonicalizeFormIndex(value) {
20
+ const root = objectValue(value, "");
21
+ exactKeys(root, "", ["schemaVersion", "producer", "documents"]);
22
+ if (root["schemaVersion"] !== 1) {
23
+ fail("form_index.shape_invalid", "/schemaVersion", "schemaVersion must be 1.");
24
+ }
25
+ const producer = objectValue(root["producer"], "/producer");
26
+ exactKeys(producer, "/producer", ["name", "version"]);
27
+ const producerName = identifierValue(producer["name"], "/producer/name");
28
+ const producerVersion = versionValue(producer["version"], "/producer/version");
29
+ const rawDocuments = arrayValue(root["documents"], "/documents");
30
+ const documents = rawDocuments
31
+ .map((document, index) => documentValue(document, `/documents/${index}`))
32
+ .sort((left, right) => compareText(left.path, right.path));
33
+ rejectDuplicateDocuments(documents);
34
+ return {
35
+ schemaVersion: 1,
36
+ producer: {
37
+ name: producerName,
38
+ version: producerVersion,
39
+ },
40
+ documents,
41
+ };
42
+ }
43
+ function documentValue(value, instancePath) {
44
+ const document = objectValue(value, instancePath);
45
+ exactKeys(document, instancePath, [
46
+ "path",
47
+ "contentDigest",
48
+ "sourceKind",
49
+ "inspection",
50
+ "forms",
51
+ ]);
52
+ const documentPath = relativePosixPathValue(document["path"], `${instancePath}/path`);
53
+ const contentDigest = digestValue(document["contentDigest"], `${instancePath}/contentDigest`);
54
+ const sourceKind = identifierValue(document["sourceKind"], `${instancePath}/sourceKind`);
55
+ const inspection = inspectionValue(document["inspection"], `${instancePath}/inspection`);
56
+ const rawForms = arrayValue(document["forms"], `${instancePath}/forms`);
57
+ const forms = rawForms
58
+ .map((form, index) => formValue(form, `${instancePath}/forms/${index}`))
59
+ .sort((left, right) => compareRanges(left.range, right.range));
60
+ rejectDuplicateRanges(forms, `${instancePath}/forms`, "form");
61
+ return {
62
+ path: documentPath,
63
+ contentDigest,
64
+ sourceKind,
65
+ inspection,
66
+ forms,
67
+ };
68
+ }
69
+ function inspectionValue(value, instancePath) {
70
+ const inspection = objectValue(value, instancePath);
71
+ const state = stringValue(inspection["state"], `${instancePath}/state`);
72
+ if (state === "complete") {
73
+ exactKeys(inspection, instancePath, ["state"]);
74
+ return { state: "complete" };
75
+ }
76
+ if (state !== "incomplete") {
77
+ fail("form_index.shape_invalid", `${instancePath}/state`, "inspection state must be complete or incomplete.");
78
+ }
79
+ exactKeys(inspection, instancePath, ["state", "reason"], ["range"]);
80
+ const reason = unresolvedReasonValue(inspection["reason"], `${instancePath}/reason`);
81
+ const range = optionalRangeValue(inspection["range"], `${instancePath}/range`);
82
+ return range === undefined
83
+ ? { state: "incomplete", reason }
84
+ : { state: "incomplete", reason, range };
85
+ }
86
+ function formValue(value, instancePath) {
87
+ const form = objectValue(value, instancePath);
88
+ exactKeys(form, instancePath, [
89
+ "identity",
90
+ "method",
91
+ "action",
92
+ "range",
93
+ "controls",
94
+ ]);
95
+ const range = rangeValue(form["range"], `${instancePath}/range`);
96
+ const rawControls = arrayValue(form["controls"], `${instancePath}/controls`);
97
+ const controls = rawControls
98
+ .map((control, index) => controlValue(control, `${instancePath}/controls/${index}`))
99
+ .sort((left, right) => compareRanges(left.range, right.range));
100
+ rejectDuplicateRanges(controls, `${instancePath}/controls`, "control");
101
+ return {
102
+ identity: evidenceValue(form["identity"], `${instancePath}/identity`, nonEmptyStringValue),
103
+ method: evidenceValue(form["method"], `${instancePath}/method`, stringValue),
104
+ action: actionValue(form["action"], `${instancePath}/action`),
105
+ range,
106
+ controls,
107
+ };
108
+ }
109
+ function controlValue(value, instancePath) {
110
+ const control = objectValue(value, instancePath);
111
+ exactKeys(control, instancePath, [
112
+ "name",
113
+ "controlKind",
114
+ "inputType",
115
+ "multiple",
116
+ "multiplicity",
117
+ "successful",
118
+ "range",
119
+ ]);
120
+ return {
121
+ name: evidenceValue(control["name"], `${instancePath}/name`, nonEmptyStringValue),
122
+ controlKind: evidenceValue(control["controlKind"], `${instancePath}/controlKind`, (entry, entryPath) => enumValue(entry, entryPath, ["button", "input", "select", "textarea"])),
123
+ inputType: evidenceValue(control["inputType"], `${instancePath}/inputType`, stringValue),
124
+ multiple: evidenceValue(control["multiple"], `${instancePath}/multiple`, booleanValue),
125
+ multiplicity: evidenceValue(control["multiplicity"], `${instancePath}/multiplicity`, (entry, entryPath) => enumValue(entry, entryPath, [
126
+ "mutually-exclusive",
127
+ "repeated",
128
+ "scalar",
129
+ ])),
130
+ successful: evidenceValue(control["successful"], `${instancePath}/successful`, booleanValue),
131
+ range: rangeValue(control["range"], `${instancePath}/range`),
132
+ };
133
+ }
134
+ function actionValue(value, instancePath) {
135
+ const action = objectValue(value, instancePath);
136
+ if (action["state"] === "current-document") {
137
+ exactKeys(action, instancePath, ["state", "range"]);
138
+ return {
139
+ state: "current-document",
140
+ range: rangeValue(action["range"], `${instancePath}/range`),
141
+ };
142
+ }
143
+ return evidenceValue(value, instancePath, nonEmptyStringValue);
144
+ }
145
+ function evidenceValue(value, instancePath, knownValue) {
146
+ const evidence = objectValue(value, instancePath);
147
+ const state = stringValue(evidence["state"], `${instancePath}/state`);
148
+ if (state === "known") {
149
+ exactKeys(evidence, instancePath, ["state", "value", "range"]);
150
+ return {
151
+ state: "known",
152
+ value: knownValue(evidence["value"], `${instancePath}/value`),
153
+ range: rangeValue(evidence["range"], `${instancePath}/range`),
154
+ };
155
+ }
156
+ if (state === "absent") {
157
+ exactKeys(evidence, instancePath, ["state"], ["range"]);
158
+ const range = optionalRangeValue(evidence["range"], `${instancePath}/range`);
159
+ return range === undefined
160
+ ? { state: "absent" }
161
+ : { state: "absent", range };
162
+ }
163
+ if (state === "dynamic") {
164
+ exactKeys(evidence, instancePath, ["state", "reason", "range"]);
165
+ return {
166
+ state: "dynamic",
167
+ reason: dynamicReasonValue(evidence["reason"], `${instancePath}/reason`),
168
+ range: rangeValue(evidence["range"], `${instancePath}/range`),
169
+ };
170
+ }
171
+ if (state === "unsupported") {
172
+ exactKeys(evidence, instancePath, ["state", "reason", "range"]);
173
+ return {
174
+ state: "unsupported",
175
+ reason: unsupportedReasonValue(evidence["reason"], `${instancePath}/reason`),
176
+ range: rangeValue(evidence["range"], `${instancePath}/range`),
177
+ };
178
+ }
179
+ fail("form_index.shape_invalid", `${instancePath}/state`, "evidence state is not supported.");
180
+ }
181
+ function rangeValue(value, instancePath) {
182
+ const range = objectValue(value, instancePath);
183
+ exactKeys(range, instancePath, ["start", "end"]);
184
+ const start = positionValue(range["start"], `${instancePath}/start`);
185
+ const end = positionValue(range["end"], `${instancePath}/end`);
186
+ if (comparePositions(start, end) > 0) {
187
+ fail("form_index.range_invalid", instancePath, "range start must not follow range end.");
188
+ }
189
+ return { start, end };
190
+ }
191
+ function optionalRangeValue(value, instancePath) {
192
+ return value === undefined ? undefined : rangeValue(value, instancePath);
193
+ }
194
+ function positionValue(value, instancePath) {
195
+ const position = objectValue(value, instancePath);
196
+ exactKeys(position, instancePath, ["line", "character"]);
197
+ return {
198
+ line: nonNegativeIntegerValue(position["line"], `${instancePath}/line`),
199
+ character: nonNegativeIntegerValue(position["character"], `${instancePath}/character`),
200
+ };
201
+ }
202
+ function relativePosixPathValue(value, instancePath) {
203
+ const candidate = stringValue(value, instancePath);
204
+ if (candidate.length === 0 ||
205
+ candidate.includes("\\") ||
206
+ path.posix.isAbsolute(candidate) ||
207
+ /^[a-z]:/iu.test(candidate) ||
208
+ /[\u0000-\u001f\u007f]/u.test(candidate)) {
209
+ fail("form_index.path_invalid", instancePath, "path must be a non-empty project-relative POSIX path.");
210
+ }
211
+ const segments = candidate.split("/");
212
+ if (segments.some((segment) => segment.length === 0 ||
213
+ segment === "." ||
214
+ segment === ".." ||
215
+ segment.includes(":") ||
216
+ segment.endsWith(".") ||
217
+ segment.endsWith(" ") ||
218
+ windowsReservedName.test(segment))) {
219
+ fail("form_index.path_invalid", instancePath, "path contains a non-portable or root-escaping segment.");
220
+ }
221
+ return candidate;
222
+ }
223
+ function digestValue(value, instancePath) {
224
+ const digest = stringValue(value, instancePath);
225
+ if (!/^sha256:[0-9a-f]{64}$/u.test(digest)) {
226
+ fail("form_index.digest_invalid", instancePath, "contentDigest must be a lowercase SHA-256 digest.");
227
+ }
228
+ return digest;
229
+ }
230
+ function identifierValue(value, instancePath) {
231
+ const identifier = stringValue(value, instancePath);
232
+ if (!/^[a-z0-9](?:[a-z0-9._/-]{0,127})$/u.test(identifier)) {
233
+ fail("form_index.shape_invalid", instancePath, "identifier must use lowercase ASCII letters, digits, dot, underscore, slash, or hyphen.");
234
+ }
235
+ return identifier;
236
+ }
237
+ function versionValue(value, instancePath) {
238
+ const version = stringValue(value, instancePath);
239
+ if (!/^[A-Za-z0-9](?:[A-Za-z0-9._+-]{0,127})$/u.test(version)) {
240
+ fail("form_index.shape_invalid", instancePath, "producer version is not a stable printable identifier.");
241
+ }
242
+ return version;
243
+ }
244
+ function dynamicReasonValue(value, instancePath) {
245
+ const reason = stringValue(value, instancePath);
246
+ if (!dynamicReasons.has(reason)) {
247
+ fail("form_index.shape_invalid", instancePath, "dynamic reason is not supported.");
248
+ }
249
+ return reason;
250
+ }
251
+ function unsupportedReasonValue(value, instancePath) {
252
+ const reason = stringValue(value, instancePath);
253
+ if (!unsupportedReasons.has(reason)) {
254
+ fail("form_index.shape_invalid", instancePath, "unsupported reason is not supported.");
255
+ }
256
+ return reason;
257
+ }
258
+ function unresolvedReasonValue(value, instancePath) {
259
+ const reason = stringValue(value, instancePath);
260
+ if (!dynamicReasons.has(reason) &&
261
+ !unsupportedReasons.has(reason)) {
262
+ fail("form_index.shape_invalid", instancePath, "incomplete inspection reason is not supported.");
263
+ }
264
+ return reason;
265
+ }
266
+ function objectValue(value, instancePath) {
267
+ if (typeof value !== "object" ||
268
+ value === null ||
269
+ Array.isArray(value) ||
270
+ (Object.getPrototypeOf(value) !== Object.prototype &&
271
+ Object.getPrototypeOf(value) !== null)) {
272
+ fail("form_index.shape_invalid", instancePath, "value must be a plain object.");
273
+ }
274
+ return value;
275
+ }
276
+ function arrayValue(value, instancePath) {
277
+ if (!Array.isArray(value)) {
278
+ fail("form_index.shape_invalid", instancePath, "value must be an array.");
279
+ }
280
+ return value;
281
+ }
282
+ function stringValue(value, instancePath) {
283
+ if (typeof value !== "string") {
284
+ fail("form_index.shape_invalid", instancePath, "value must be a string.");
285
+ }
286
+ return value;
287
+ }
288
+ function nonEmptyStringValue(value, instancePath) {
289
+ const text = stringValue(value, instancePath);
290
+ if (text.length === 0) {
291
+ fail("form_index.shape_invalid", instancePath, "value must not be empty.");
292
+ }
293
+ return text;
294
+ }
295
+ function booleanValue(value, instancePath) {
296
+ if (typeof value !== "boolean") {
297
+ fail("form_index.shape_invalid", instancePath, "value must be a boolean.");
298
+ }
299
+ return value;
300
+ }
301
+ function nonNegativeIntegerValue(value, instancePath) {
302
+ if (!Number.isSafeInteger(value) || value < 0) {
303
+ fail("form_index.range_invalid", instancePath, "position component must be a non-negative safe integer.");
304
+ }
305
+ return value;
306
+ }
307
+ function enumValue(value, instancePath, allowed) {
308
+ const text = stringValue(value, instancePath);
309
+ if (!allowed.includes(text)) {
310
+ fail("form_index.shape_invalid", instancePath, "value is not supported.");
311
+ }
312
+ return text;
313
+ }
314
+ function exactKeys(value, instancePath, required, optional = []) {
315
+ const allowed = new Set([...required, ...optional]);
316
+ for (const key of Object.keys(value)) {
317
+ if (!allowed.has(key)) {
318
+ fail("form_index.shape_invalid", `${instancePath}/${key}`, "property is not allowed.");
319
+ }
320
+ }
321
+ for (const key of required) {
322
+ if (!Object.hasOwn(value, key)) {
323
+ fail("form_index.shape_invalid", `${instancePath}/${key}`, "required property is missing.");
324
+ }
325
+ }
326
+ }
327
+ function rejectDuplicateDocuments(documents) {
328
+ const exact = new Set();
329
+ const folded = new Map();
330
+ for (const [index, document] of documents.entries()) {
331
+ const key = document.path.toLocaleLowerCase("en-US");
332
+ if (exact.has(document.path) || folded.has(key)) {
333
+ fail("form_index.duplicate", `/documents/${index}/path`, `document path collides with ${folded.get(key) ?? document.path}.`);
334
+ }
335
+ exact.add(document.path);
336
+ folded.set(key, document.path);
337
+ }
338
+ }
339
+ function rejectDuplicateRanges(values, instancePath, label) {
340
+ for (let index = 1; index < values.length; index += 1) {
341
+ const previous = values[index - 1];
342
+ const current = values[index];
343
+ if (previous !== undefined &&
344
+ current !== undefined &&
345
+ compareRanges(previous.range, current.range) === 0) {
346
+ fail("form_index.duplicate", `${instancePath}/${index}/range`, `${label} range is duplicated.`);
347
+ }
348
+ }
349
+ }
350
+ function compareRanges(left, right) {
351
+ return comparePositions(left.start, right.start) ||
352
+ comparePositions(left.end, right.end);
353
+ }
354
+ function comparePositions(left, right) {
355
+ return left.line - right.line || left.character - right.character;
356
+ }
357
+ function fail(code, instancePath, message) {
358
+ throw new FormIndexFailure(code, instancePath, message);
359
+ }
360
+ //# sourceMappingURL=form-index-validation.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"form-index-validation.js","sourceRoot":"","sources":["../../src/form-index-validation.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,8 @@
1
+ import { type ContentDigest, type FormIndex } from "./form-index-types.js";
2
+ export type { ContentDigest, DocumentInspection, DynamicReason, FormActionEvidence, FormDocumentFact, FormIndex, FormIndexFailureCode, IndexedControlFact, IndexedEvidence, IndexedFormFact, UnsupportedReason, } from "./form-index-types.js";
3
+ export { FormIndexFailure } from "./form-index-types.js";
4
+ export declare function createContentDigest(source: string | Uint8Array): ContentDigest;
5
+ export declare function serializeFormIndex(value: unknown): string;
6
+ export declare function parseFormIndex(text: string): FormIndex;
7
+ export declare function verifyFormIndexContent(value: unknown, sourceForPath: (path: string) => string | Uint8Array | undefined): FormIndex;
8
+ //# sourceMappingURL=form-index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"form-index.d.ts","sourceRoot":"","sources":["../../src/form-index.ts"],"names":[],"mappings":"AAIA,OAAO,EAEL,KAAK,aAAa,EAClB,KAAK,SAAS,EACf,MAAM,uBAAuB,CAAC;AAG/B,YAAY,EACV,aAAa,EACb,kBAAkB,EAClB,aAAa,EACb,kBAAkB,EAClB,gBAAgB,EAChB,SAAS,EACT,oBAAoB,EACpB,kBAAkB,EAClB,eAAe,EACf,eAAe,EACf,iBAAiB,GAClB,MAAM,uBAAuB,CAAC;AAC/B,OAAO,EAAE,gBAAgB,EAAE,MAAM,uBAAuB,CAAC;AAEzD,wBAAgB,mBAAmB,CACjC,MAAM,EAAE,MAAM,GAAG,UAAU,GAC1B,aAAa,CAEf;AAED,wBAAgB,kBAAkB,CAAC,KAAK,EAAE,OAAO,GAAG,MAAM,CAGzD;AAED,wBAAgB,cAAc,CAAC,IAAI,EAAE,MAAM,GAAG,SAAS,CAqBtD;AAED,wBAAgB,sBAAsB,CACpC,KAAK,EAAE,OAAO,EACd,aAAa,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,MAAM,GAAG,UAAU,GAAG,SAAS,GAC/D,SAAS,CAqBX"}
@@ -0,0 +1,94 @@
1
+ import { createHash } from "node:crypto";
2
+ import { FormIndexFailure, } from "./form-index-types.js";
3
+ import { canonicalizeFormIndex } from "./form-index-validation.js";
4
+ export { FormIndexFailure } from "./form-index-types.js";
5
+ export function createContentDigest(source) {
6
+ return `sha256:${createHash("sha256").update(source).digest("hex")}`;
7
+ }
8
+ export function serializeFormIndex(value) {
9
+ const canonical = canonicalizeFormIndex(value);
10
+ return `${JSON.stringify(canonical, null, 2)}\n`;
11
+ }
12
+ export function parseFormIndex(text) {
13
+ let value;
14
+ try {
15
+ value = JSON.parse(text);
16
+ }
17
+ catch {
18
+ throw new FormIndexFailure("form_index.json_invalid", "", "FormIndex must be strict JSON.");
19
+ }
20
+ const canonical = canonicalizeFormIndex(value);
21
+ if (serializeFormIndex(canonical) !== text) {
22
+ throw new FormIndexFailure("form_index.noncanonical", "", "FormIndex JSON is not in canonical form.");
23
+ }
24
+ return canonical;
25
+ }
26
+ export function verifyFormIndexContent(value, sourceForPath) {
27
+ const canonical = canonicalizeFormIndex(value);
28
+ for (const [index, document] of canonical.documents.entries()) {
29
+ const source = sourceForPath(document.path);
30
+ if (source === undefined) {
31
+ throw new FormIndexFailure("form_index.source_missing", `/documents/${index}/path`, "Indexed source document is missing.");
32
+ }
33
+ if (createContentDigest(source) !== document.contentDigest) {
34
+ throw new FormIndexFailure("form_index.digest_mismatch", `/documents/${index}/contentDigest`, "Indexed source digest does not match the current source bytes.");
35
+ }
36
+ verifyDocumentRanges(document, source, `/documents/${index}`);
37
+ }
38
+ return canonical;
39
+ }
40
+ function verifyDocumentRanges(document, source, instancePath) {
41
+ const text = sourceText(source, instancePath);
42
+ const lines = text.split(/\r\n|\n|\r/u);
43
+ const ranges = [];
44
+ if (document.inspection.state === "incomplete" && document.inspection.range !== undefined) {
45
+ ranges.push({
46
+ instancePath: `${instancePath}/inspection/range`,
47
+ range: document.inspection.range,
48
+ });
49
+ }
50
+ document.forms.forEach((form, formIndex) => {
51
+ const formPath = `${instancePath}/forms/${formIndex}`;
52
+ ranges.push({ instancePath: `${formPath}/range`, range: form.range });
53
+ pushEvidenceRange(ranges, `${formPath}/identity`, form.identity);
54
+ pushEvidenceRange(ranges, `${formPath}/method`, form.method);
55
+ pushEvidenceRange(ranges, `${formPath}/action`, form.action);
56
+ form.controls.forEach((control, controlIndex) => {
57
+ const controlPath = `${formPath}/controls/${controlIndex}`;
58
+ ranges.push({ instancePath: `${controlPath}/range`, range: control.range });
59
+ pushEvidenceRange(ranges, `${controlPath}/name`, control.name);
60
+ pushEvidenceRange(ranges, `${controlPath}/controlKind`, control.controlKind);
61
+ pushEvidenceRange(ranges, `${controlPath}/inputType`, control.inputType);
62
+ pushEvidenceRange(ranges, `${controlPath}/multiple`, control.multiple);
63
+ pushEvidenceRange(ranges, `${controlPath}/multiplicity`, control.multiplicity);
64
+ pushEvidenceRange(ranges, `${controlPath}/successful`, control.successful);
65
+ });
66
+ });
67
+ for (const entry of ranges) {
68
+ assertPositionWithinSource(entry.range.start, lines, `${entry.instancePath}/start`);
69
+ assertPositionWithinSource(entry.range.end, lines, `${entry.instancePath}/end`);
70
+ }
71
+ }
72
+ function pushEvidenceRange(ranges, instancePath, evidence) {
73
+ if (evidence.range !== undefined) {
74
+ ranges.push({ instancePath: `${instancePath}/range`, range: evidence.range });
75
+ }
76
+ }
77
+ function assertPositionWithinSource(position, lines, instancePath) {
78
+ const line = lines[position.line];
79
+ if (line === undefined || position.character > line.length) {
80
+ throw new FormIndexFailure("form_index.range_invalid", instancePath, "Indexed range falls outside the bound source document.");
81
+ }
82
+ }
83
+ function sourceText(source, instancePath) {
84
+ if (typeof source === "string") {
85
+ return source;
86
+ }
87
+ try {
88
+ return new TextDecoder("utf-8", { fatal: true }).decode(source);
89
+ }
90
+ catch {
91
+ throw new FormIndexFailure("form_index.source_encoding_invalid", instancePath, "Indexed source bytes must be valid UTF-8.");
92
+ }
93
+ }
94
+ //# sourceMappingURL=form-index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"form-index.js","sourceRoot":"","sources":["../../src/form-index.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,9 @@
1
+ import type { Diagnostic, FeatureContract } from "@0disoft/mensor-contract";
2
+ import type { FormIndex } from "./form-index.js";
3
+ export declare function checkFeatureForms(options: {
4
+ readonly featureContractPath: string;
5
+ readonly featureText: string;
6
+ readonly feature: FeatureContract;
7
+ readonly formIndex: FormIndex;
8
+ }): readonly Diagnostic[];
9
+ //# sourceMappingURL=form-rule.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"form-rule.d.ts","sourceRoot":"","sources":["../../src/form-rule.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EACV,UAAU,EACV,eAAe,EAOhB,MAAM,0BAA0B,CAAC;AAIlC,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AAejD,wBAAgB,iBAAiB,CAAC,OAAO,EAAE;IACzC,QAAQ,CAAC,mBAAmB,EAAE,MAAM,CAAC;IACrC,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;IAC7B,QAAQ,CAAC,OAAO,EAAE,eAAe,CAAC;IAClC,QAAQ,CAAC,SAAS,EAAE,SAAS,CAAC;CAC/B,GAAG,SAAS,UAAU,EAAE,CAsLxB"}