@hyperscale0/udl 4.9.0 → 5.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 (44) hide show
  1. package/CHANGELOG.md +15 -0
  2. package/README.md +4 -13
  3. package/dist/diagnostics.d.ts +1 -15
  4. package/dist/diagnostics.d.ts.map +1 -1
  5. package/dist/diagnostics.js +3 -12
  6. package/dist/diagnostics.js.map +1 -1
  7. package/dist/index.d.ts +1 -4
  8. package/dist/index.d.ts.map +1 -1
  9. package/dist/index.js +1 -4
  10. package/dist/index.js.map +1 -1
  11. package/dist/object-contract.d.ts +0 -52
  12. package/dist/object-contract.d.ts.map +1 -1
  13. package/dist/object-contract.js +0 -19
  14. package/dist/object-contract.js.map +1 -1
  15. package/dist/validation.d.ts.map +1 -1
  16. package/dist/validation.js +29 -0
  17. package/dist/validation.js.map +1 -1
  18. package/package.json +4 -8
  19. package/spec/README.md +6 -0
  20. package/src/diagnostics.ts +10 -18
  21. package/src/index.ts +1 -13
  22. package/src/object-contract.ts +0 -47
  23. package/src/validation.ts +57 -0
  24. package/dist/cli.d.ts +0 -3
  25. package/dist/cli.d.ts.map +0 -1
  26. package/dist/cli.js +0 -184
  27. package/dist/cli.js.map +0 -1
  28. package/dist/evolution.d.ts +0 -5
  29. package/dist/evolution.d.ts.map +0 -1
  30. package/dist/evolution.js +0 -27
  31. package/dist/evolution.js.map +0 -1
  32. package/dist/instrument-references.d.ts +0 -5
  33. package/dist/instrument-references.d.ts.map +0 -1
  34. package/dist/instrument-references.js +0 -90
  35. package/dist/instrument-references.js.map +0 -1
  36. package/dist/parser.d.ts +0 -4
  37. package/dist/parser.d.ts.map +0 -1
  38. package/dist/parser.js +0 -67
  39. package/dist/parser.js.map +0 -1
  40. package/docs/README.md +0 -294
  41. package/src/cli.ts +0 -196
  42. package/src/evolution.ts +0 -46
  43. package/src/instrument-references.ts +0 -123
  44. package/src/parser.ts +0 -80
package/dist/cli.js DELETED
@@ -1,184 +0,0 @@
1
- #!/usr/bin/env node
2
- /**
3
- * The `udl` command. Actions over the same library the compiler uses:
4
- * `validate` answers whether a document is admissible, `fmt` writes the
5
- * canonical bytes, and `diff` answers whether a change is legal against a
6
- * document that already has live instances.
7
- */
8
- import { readFile, writeFile } from "node:fs/promises";
9
- import { canonicalizeUdl, canonicalDigest, diffValidatedUdlEvolution, parseUdl, UdlError, udlDiagnostic, } from "./index.js";
10
- const USAGE = `udl - the Universal Domain Language toolchain
11
-
12
- usage:
13
- udl validate <file> parse <file> and report every issue found
14
- udl fmt <file> [--write] print the canonical form, or rewrite the file
15
- udl canon <file> [--digest] print canonical bytes, or their SHA-256 digest
16
- udl diff <live> <next> check <next> against the append-only law
17
- udl explain UDL#### explain one stable diagnostic code
18
- udl help print this
19
-
20
- exit codes:
21
- 0 the document is admissible, or the change is additive
22
- 1 the document was refused, or the change breaks the append-only law
23
- 2 the command line was wrong, or a file could not be read`;
24
- async function main(argv) {
25
- const [command, ...rest] = argv;
26
- switch (command) {
27
- case "help":
28
- case "-h":
29
- case "--help":
30
- console.log(USAGE);
31
- return 0;
32
- case "validate":
33
- return validateCommand(rest);
34
- case "fmt":
35
- return formatCommand(rest);
36
- case "canon":
37
- return canonCommand(rest);
38
- case "diff":
39
- return diffCommand(rest);
40
- case "explain":
41
- return explainCommand(rest);
42
- case undefined:
43
- return usageError("udl: no command given");
44
- default:
45
- return usageError(`udl: unknown command ${command}`);
46
- }
47
- }
48
- async function canonCommand(args) {
49
- const digest = args.includes("--digest");
50
- const [file, ...extra] = args.filter((argument) => argument !== "--digest");
51
- if (file === undefined || extra.length > 0) {
52
- return usageError("usage: udl canon <file> [--digest]");
53
- }
54
- const bytes = await readDocument(file);
55
- if (bytes === null)
56
- return 2;
57
- let document;
58
- try {
59
- document = parseUdl(bytes);
60
- }
61
- catch (error) {
62
- return reportIssues(file, error);
63
- }
64
- if (digest)
65
- console.log(await canonicalDigest(document));
66
- else
67
- process.stdout.write(canonicalizeUdl(bytes));
68
- return 0;
69
- }
70
- function explainCommand(args) {
71
- const [code, ...extra] = args;
72
- if (code === undefined || extra.length > 0) {
73
- return usageError("usage: udl explain UDL####");
74
- }
75
- const diagnostic = udlDiagnostic(code);
76
- if (!diagnostic) {
77
- return usageError(`udl: unknown diagnostic code ${code}`);
78
- }
79
- console.log(`${code} ${diagnostic.title}`);
80
- console.log(`category: ${diagnostic.category}`);
81
- console.log(`family: ${diagnostic.family}`);
82
- console.log(`fix: ${diagnostic.fix}`);
83
- return 0;
84
- }
85
- async function validateCommand(args) {
86
- const [file, ...extra] = args;
87
- if (file === undefined || extra.length > 0) {
88
- return usageError("usage: udl validate <file>");
89
- }
90
- const bytes = await readDocument(file);
91
- if (bytes === null)
92
- return 2;
93
- if (parseDocument(file, bytes) === null)
94
- return 1;
95
- console.log(`${file}: ok`);
96
- return 0;
97
- }
98
- async function formatCommand(args) {
99
- const write = args.includes("--write");
100
- const [file, ...extra] = args.filter((argument) => argument !== "--write");
101
- if (file === undefined || extra.length > 0) {
102
- return usageError("usage: udl fmt <file> [--write]");
103
- }
104
- const bytes = await readDocument(file);
105
- if (bytes === null)
106
- return 2;
107
- let canonical;
108
- try {
109
- canonical = canonicalizeUdl(bytes);
110
- }
111
- catch (error) {
112
- return reportIssues(file, error);
113
- }
114
- if (!write) {
115
- process.stdout.write(canonical);
116
- return 0;
117
- }
118
- // The bytes decoded cleanly already: canonicalizeUdl refuses anything else.
119
- if (new TextDecoder().decode(bytes) === canonical)
120
- return 0;
121
- await writeFile(file, canonical);
122
- console.log(`${file}: formatted`);
123
- return 0;
124
- }
125
- async function diffCommand(args) {
126
- const [livePath, nextPath, ...extra] = args;
127
- if (livePath === undefined || nextPath === undefined || extra.length > 0) {
128
- return usageError("usage: udl diff <live> <next>");
129
- }
130
- const liveBytes = await readDocument(livePath);
131
- const nextBytes = await readDocument(nextPath);
132
- if (liveBytes === null || nextBytes === null)
133
- return 2;
134
- const live = parseDocument(livePath, liveBytes);
135
- const next = parseDocument(nextPath, nextBytes);
136
- if (live === null || next === null)
137
- return 1;
138
- // `parseDocument` already validated both, so take the door that does not
139
- // validate a second time.
140
- const violations = diffValidatedUdlEvolution(live, next);
141
- if (violations.length === 0) {
142
- console.log(`${nextPath}: additive`);
143
- return 0;
144
- }
145
- for (const violation of violations) {
146
- console.error(`${nextPath}: ${violation.code} ${violation.path}: ${violation.message}`);
147
- }
148
- return 1;
149
- }
150
- async function readDocument(file) {
151
- try {
152
- return await readFile(file);
153
- }
154
- catch (error) {
155
- const reason = error instanceof Error ? error.message : String(error);
156
- console.error(`udl: cannot read ${file}: ${reason}`);
157
- return null;
158
- }
159
- }
160
- /** Parses one document, printing its issues. Null means the document was refused. */
161
- function parseDocument(file, bytes) {
162
- try {
163
- return parseUdl(bytes);
164
- }
165
- catch (error) {
166
- reportIssues(file, error);
167
- return null;
168
- }
169
- }
170
- function reportIssues(file, error) {
171
- if (!(error instanceof UdlError))
172
- throw error;
173
- for (const issue of error.issues) {
174
- console.error(`${file}: ${issue.code} ${issue.path}: ${issue.message}`);
175
- }
176
- return 1;
177
- }
178
- function usageError(message) {
179
- console.error(message);
180
- console.error(USAGE);
181
- return 2;
182
- }
183
- process.exitCode = await main(process.argv.slice(2));
184
- //# sourceMappingURL=cli.js.map
package/dist/cli.js.map DELETED
@@ -1 +0,0 @@
1
- {"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":"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"}
@@ -1,5 +0,0 @@
1
- import type { UdlDocument } from "./schema.js";
2
- import { type UdlIssue } from "./diagnostics.js";
3
- /** Existing instruments are frozen; a live document may add independent instruments. */
4
- export declare function diffValidatedUdlEvolution(live: UdlDocument, next: UdlDocument): UdlIssue[];
5
- //# sourceMappingURL=evolution.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"evolution.d.ts","sourceRoot":"","sources":["../src/evolution.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAC/C,OAAO,EAAS,KAAK,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AAGxD,wFAAwF;AACxF,wBAAgB,yBAAyB,CACvC,IAAI,EAAE,WAAW,EACjB,IAAI,EAAE,WAAW,GAChB,QAAQ,EAAE,CAqCZ"}
package/dist/evolution.js DELETED
@@ -1,27 +0,0 @@
1
- import { issue } from "./diagnostics.js";
2
- import { writeJson } from "./json.js";
3
- /** Existing instruments are frozen; a live document may add independent instruments. */
4
- export function diffValidatedUdlEvolution(live, next) {
5
- const issues = [];
6
- const refuse = (path, message) => issues.push(issue("UDL7001", path, message));
7
- if (live.product !== next.product || live.currency !== next.currency)
8
- refuse("$", "product identity and currency are immutable");
9
- for (const [name, party] of Object.entries(live.parties))
10
- if (!Object.hasOwn(next.parties, name) ||
11
- writeJson(party) !== writeJson(next.parties[name]))
12
- refuse(`$.parties.${name}`, "a live party cannot change or disappear");
13
- for (const object of live.objects) {
14
- const updated = next.objects.find((o) => o.id === object.id);
15
- if (!updated || writeJson(object) !== writeJson(updated))
16
- refuse(`$.objects.${object.id}`, "a live object kind cannot change or disappear; recreate development estates");
17
- }
18
- for (const instrument of live.instruments) {
19
- const updated = next.instruments.find((i) => i.id === instrument.id);
20
- if (!updated || writeJson(instrument) !== writeJson(updated))
21
- refuse(`$.instruments.${instrument.id}`, "a live instrument cannot change or disappear; recreate development estates");
22
- }
23
- if (writeJson(live) !== writeJson(next) && next.version <= live.version)
24
- issues.push(issue("UDL7002", "$.version", "a changed document needs a higher version"));
25
- return issues;
26
- }
27
- //# sourceMappingURL=evolution.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"evolution.js","sourceRoot":"","sources":["../src/evolution.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,KAAK,EAAiB,MAAM,kBAAkB,CAAC;AACxD,OAAO,EAAE,SAAS,EAAE,MAAM,WAAW,CAAC;AAEtC,wFAAwF;AACxF,MAAM,UAAU,yBAAyB,CACvC,IAAiB,EACjB,IAAiB;IAEjB,MAAM,MAAM,GAAe,EAAE,CAAC;IAC9B,MAAM,MAAM,GAAG,CAAC,IAAY,EAAE,OAAe,EAAE,EAAE,CAC/C,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,SAAS,EAAE,IAAI,EAAE,OAAO,CAAC,CAAC,CAAC;IAC/C,IAAI,IAAI,CAAC,OAAO,KAAK,IAAI,CAAC,OAAO,IAAI,IAAI,CAAC,QAAQ,KAAK,IAAI,CAAC,QAAQ;QAClE,MAAM,CAAC,GAAG,EAAE,6CAA6C,CAAC,CAAC;IAC7D,KAAK,MAAM,CAAC,IAAI,EAAE,KAAK,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,OAAO,CAAC;QACtD,IACE,CAAC,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,OAAO,EAAE,IAAI,CAAC;YAClC,SAAS,CAAC,KAAK,CAAC,KAAK,SAAS,CAAC,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;YAElD,MAAM,CAAC,aAAa,IAAI,EAAE,EAAE,yCAAyC,CAAC,CAAC;IAC3E,KAAK,MAAM,MAAM,IAAI,IAAI,CAAC,OAAO,EAAE,CAAC;QAClC,MAAM,OAAO,GAAG,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,KAAK,MAAM,CAAC,EAAE,CAAC,CAAC;QAC7D,IAAI,CAAC,OAAO,IAAI,SAAS,CAAC,MAAM,CAAC,KAAK,SAAS,CAAC,OAAO,CAAC;YACtD,MAAM,CACJ,aAAa,MAAM,CAAC,EAAE,EAAE,EACxB,6EAA6E,CAC9E,CAAC;IACN,CAAC;IACD,KAAK,MAAM,UAAU,IAAI,IAAI,CAAC,WAAW,EAAE,CAAC;QAC1C,MAAM,OAAO,GAAG,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,KAAK,UAAU,CAAC,EAAE,CAAC,CAAC;QACrE,IAAI,CAAC,OAAO,IAAI,SAAS,CAAC,UAAU,CAAC,KAAK,SAAS,CAAC,OAAO,CAAC;YAC1D,MAAM,CACJ,iBAAiB,UAAU,CAAC,EAAE,EAAE,EAChC,4EAA4E,CAC7E,CAAC;IACN,CAAC;IACD,IAAI,SAAS,CAAC,IAAI,CAAC,KAAK,SAAS,CAAC,IAAI,CAAC,IAAI,IAAI,CAAC,OAAO,IAAI,IAAI,CAAC,OAAO;QACrE,MAAM,CAAC,IAAI,CACT,KAAK,CACH,SAAS,EACT,WAAW,EACX,2CAA2C,CAC5C,CACF,CAAC;IACJ,OAAO,MAAM,CAAC;AAChB,CAAC"}
@@ -1,5 +0,0 @@
1
- import { type UdlDocument, type UdlInstrument } from "./schema.js";
2
- /** Visit identities through schema annotations, never through user JSON keys. */
3
- export declare function mapUdlInstrumentReferences(document: UdlDocument, map: (id: string) => string): UdlDocument;
4
- export declare function referencedUdlInstrumentIds(instrument: UdlInstrument): readonly string[];
5
- //# sourceMappingURL=instrument-references.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"instrument-references.d.ts","sourceRoot":"","sources":["../src/instrument-references.ts"],"names":[],"mappings":"AACA,OAAO,EAEL,KAAK,WAAW,EAChB,KAAK,aAAa,EACnB,MAAM,aAAa,CAAC;AAOrB,iFAAiF;AACjF,wBAAgB,0BAA0B,CACxC,QAAQ,EAAE,WAAW,EACrB,GAAG,EAAE,CAAC,EAAE,EAAE,MAAM,KAAK,MAAM,GAC1B,WAAW,CAkFb;AAED,wBAAgB,0BAA0B,CACxC,UAAU,EAAE,aAAa,GACxB,SAAS,MAAM,EAAE,CAoBnB"}
@@ -1,90 +0,0 @@
1
- import * as z from "zod";
2
- import { udlDocumentSchema, } from "./schema.js";
3
- const object = (value) => value !== null && typeof value === "object" && !Array.isArray(value);
4
- let documentSchema;
5
- /** Visit identities through schema annotations, never through user JSON keys. */
6
- export function mapUdlInstrumentReferences(document, map) {
7
- const root = (documentSchema ??= z.toJSONSchema(udlDocumentSchema));
8
- const result = structuredClone(document);
9
- const locations = new Map();
10
- function visit(schema, value, parent, key, path) {
11
- if (!object(schema))
12
- return;
13
- if (typeof schema.$ref === "string") {
14
- if (!schema.$ref.startsWith("#/"))
15
- throw new Error("UDL reference schema must be local");
16
- let target = root;
17
- for (const part of schema.$ref.slice(2).split("/")) {
18
- target = object(target)
19
- ? target[part.replaceAll("~1", "/").replaceAll("~0", "~")]
20
- : undefined;
21
- }
22
- visit(target, value, parent, key, path);
23
- }
24
- const kind = schema["x-udl-reference"];
25
- if (typeof kind === "string" && typeof value === "string")
26
- locations.set(JSON.stringify(path), { parent, key, kind });
27
- for (const union of [schema.anyOf, schema.oneOf, schema.allOf])
28
- if (Array.isArray(union))
29
- for (const branch of union)
30
- visit(branch, value, parent, key, path);
31
- if (Array.isArray(value)) {
32
- value.forEach((entry, index) => visit(schema.items, entry, value, index, [...path, index]));
33
- }
34
- else if (object(value)) {
35
- const properties = object(schema.properties) ? schema.properties : {};
36
- const discriminator = object(properties.type)
37
- ? properties.type.const
38
- : undefined;
39
- if ((discriminator === "ref" || discriminator === "list") &&
40
- value.type === discriminator &&
41
- value.targetKind === "instrument") {
42
- if (typeof value.target === "string")
43
- locations.set(JSON.stringify([...path, "target"]), {
44
- parent: value,
45
- key: "target",
46
- kind: "instrument",
47
- });
48
- else if (Array.isArray(value.target))
49
- value.target.forEach((_, index) => locations.set(JSON.stringify([...path, "target", index]), {
50
- parent: value.target,
51
- key: index,
52
- kind: "instrument",
53
- }));
54
- }
55
- for (const [name, entry] of Object.entries(value))
56
- visit(properties[name] ?? schema.additionalProperties, entry, value, name, [...path, name]);
57
- }
58
- }
59
- visit(root, result, [result], 0, []);
60
- for (const { parent, key, kind } of locations.values()) {
61
- const holder = parent;
62
- const value = holder[key];
63
- if (kind === "instrument")
64
- holder[key] = map(value);
65
- else if (kind === "instrument_event") {
66
- const separator = value.indexOf(".");
67
- holder[key] = map(value.slice(0, separator)) + value.slice(separator);
68
- }
69
- }
70
- return result;
71
- }
72
- export function referencedUdlInstrumentIds(instrument) {
73
- const found = new Set();
74
- mapUdlInstrumentReferences({
75
- udl: 4,
76
- version: 1,
77
- product: "references",
78
- title: "References",
79
- currency: "SAR",
80
- parties: {},
81
- objects: [],
82
- instruments: [instrument],
83
- }, (id) => {
84
- found.add(id);
85
- return id;
86
- });
87
- found.delete(instrument.id);
88
- return [...found];
89
- }
90
- //# sourceMappingURL=instrument-references.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"instrument-references.js","sourceRoot":"","sources":["../src/instrument-references.ts"],"names":[],"mappings":"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"}
package/dist/parser.d.ts DELETED
@@ -1,4 +0,0 @@
1
- import type { UdlDocument } from "./schema.js";
2
- export declare function parseUdl(source: string | Uint8Array): UdlDocument;
3
- export declare function canonicalizeUdl(source: string | Uint8Array): string;
4
- //# sourceMappingURL=parser.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"parser.d.ts","sourceRoot":"","sources":["../src/parser.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAK/C,wBAAgB,QAAQ,CAAC,MAAM,EAAE,MAAM,GAAG,UAAU,GAAG,WAAW,CAmBjE;AAwCD,wBAAgB,eAAe,CAAC,MAAM,EAAE,MAAM,GAAG,UAAU,GAAG,MAAM,CAEnE"}
package/dist/parser.js DELETED
@@ -1,67 +0,0 @@
1
- import { serializeUdl } from "./canonical.js";
2
- import { issue } from "./diagnostics.js";
3
- import { UDL_LIMITS } from "./limits.js";
4
- import { assertValidUdl, UdlError } from "./validation.js";
5
- const utf8Decoder = new TextDecoder("utf-8", { fatal: true });
6
- export function parseUdl(source) {
7
- const sourceBytes = typeof source === "string"
8
- ? source.length > UDL_LIMITS.maxSourceBytes
9
- ? source.length
10
- : new TextEncoder().encode(source).byteLength
11
- : source.byteLength;
12
- if (sourceBytes > UDL_LIMITS.maxSourceBytes) {
13
- throw new UdlError([
14
- issue("UDL1004", "$", `UDL source exceeds ${UDL_LIMITS.maxSourceBytes} bytes`),
15
- ]);
16
- }
17
- return parseUdlText(typeof source === "string" ? source : decodeUdlBytes(source));
18
- }
19
- function parseUdlText(source) {
20
- let value;
21
- try {
22
- value = JSON.parse(source);
23
- }
24
- catch (error) {
25
- throw new UdlError([
26
- issue("UDL1002", "$", error instanceof Error ? error.message : "could not parse JSON"),
27
- ]);
28
- }
29
- // JSON.parse has already checked syntax. Scan member names before its
30
- // last-value-wins behavior can erase an authored declaration.
31
- const members = [];
32
- let name = "";
33
- for (const token of source.matchAll(/"(?:[^"\\]|\\.)*"|[{}[\]:]/g)) {
34
- const text = token[0];
35
- if (text === "{")
36
- members.push(new Set());
37
- else if (text === "[")
38
- members.push(null);
39
- else if (text === "}" || text === "]")
40
- members.pop();
41
- else if (text === ":") {
42
- const keys = members[members.length - 1];
43
- if (keys?.has(name))
44
- throw new UdlError([
45
- issue("UDL1002", "$", `duplicate JSON member ${name} at offset ${token.index}`),
46
- ]);
47
- keys?.add(name);
48
- }
49
- else
50
- name = JSON.parse(text);
51
- }
52
- return assertValidUdl(value);
53
- }
54
- export function canonicalizeUdl(source) {
55
- return serializeUdl(parseUdl(source));
56
- }
57
- function decodeUdlBytes(source) {
58
- try {
59
- return utf8Decoder.decode(source);
60
- }
61
- catch {
62
- throw new UdlError([
63
- issue("UDL1001", "$", "UDL bytes must be valid UTF-8"),
64
- ]);
65
- }
66
- }
67
- //# sourceMappingURL=parser.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"parser.js","sourceRoot":"","sources":["../src/parser.ts"],"names":[],"mappings":"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"}