@hyperscale0/udl 4.9.0 → 5.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.
- package/CHANGELOG.md +15 -0
- package/README.md +4 -13
- package/dist/diagnostics.d.ts +1 -15
- package/dist/diagnostics.d.ts.map +1 -1
- package/dist/diagnostics.js +0 -12
- package/dist/diagnostics.js.map +1 -1
- package/dist/index.d.ts +1 -4
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +1 -4
- package/dist/index.js.map +1 -1
- package/dist/object-contract.d.ts +0 -52
- package/dist/object-contract.d.ts.map +1 -1
- package/dist/object-contract.js +0 -19
- package/dist/object-contract.js.map +1 -1
- package/package.json +4 -8
- package/src/diagnostics.ts +1 -18
- package/src/index.ts +1 -13
- package/src/object-contract.ts +0 -47
- package/dist/cli.d.ts +0 -3
- package/dist/cli.d.ts.map +0 -1
- package/dist/cli.js +0 -184
- package/dist/cli.js.map +0 -1
- package/dist/evolution.d.ts +0 -5
- package/dist/evolution.d.ts.map +0 -1
- package/dist/evolution.js +0 -27
- package/dist/evolution.js.map +0 -1
- package/dist/instrument-references.d.ts +0 -5
- package/dist/instrument-references.d.ts.map +0 -1
- package/dist/instrument-references.js +0 -90
- package/dist/instrument-references.js.map +0 -1
- package/dist/parser.d.ts +0 -4
- package/dist/parser.d.ts.map +0 -1
- package/dist/parser.js +0 -67
- package/dist/parser.js.map +0 -1
- package/docs/README.md +0 -294
- package/src/cli.ts +0 -196
- package/src/evolution.ts +0 -46
- package/src/instrument-references.ts +0 -123
- 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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"}
|
package/dist/evolution.d.ts
DELETED
|
@@ -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
|
package/dist/evolution.d.ts.map
DELETED
|
@@ -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
|
package/dist/evolution.js.map
DELETED
|
@@ -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
package/dist/parser.d.ts.map
DELETED
|
@@ -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
|
package/dist/parser.js.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"parser.js","sourceRoot":"","sources":["../src/parser.ts"],"names":[],"mappings":"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"}
|