@hyperscale0/udl 1.0.0-alpha.1
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/AUTHORS +8 -0
- package/CHANGELOG.md +36 -0
- package/LICENSE +661 -0
- package/LICENSING.md +51 -0
- package/README.md +163 -0
- package/SECURITY.md +42 -0
- package/TRADEMARKS.md +35 -0
- package/conformance/README.md +79 -0
- package/conformance/invalid/blank-title.expected.json +10 -0
- package/conformance/invalid/blank-title.udl +50 -0
- package/conformance/invalid/depth-budget.expected.json +10 -0
- package/conformance/invalid/depth-budget.udl +49 -0
- package/conformance/invalid/format-version.expected.json +10 -0
- package/conformance/invalid/format-version.udl +50 -0
- package/conformance/invalid/invalid-utf8.expected.json +10 -0
- package/conformance/invalid/invalid-utf8.udl +1 -0
- package/conformance/invalid/malformed-json.expected.json +10 -0
- package/conformance/invalid/malformed-json.udl +1 -0
- package/conformance/invalid/missing-create-verb.expected.json +10 -0
- package/conformance/invalid/missing-create-verb.udl +45 -0
- package/conformance/invalid/not-an-object.expected.json +10 -0
- package/conformance/invalid/not-an-object.udl +1 -0
- package/conformance/invalid/noun-id-not-snake-case.expected.json +10 -0
- package/conformance/invalid/noun-id-not-snake-case.udl +50 -0
- package/conformance/invalid/unknown-key.expected.json +10 -0
- package/conformance/invalid/unknown-key.udl +51 -0
- package/conformance/invalid/unreachable-state.expected.json +10 -0
- package/conformance/invalid/unreachable-state.udl +51 -0
- package/conformance/invalid/verb-without-transition.expected.json +10 -0
- package/conformance/invalid/verb-without-transition.udl +55 -0
- package/conformance/valid/cards.expected.json +5 -0
- package/conformance/valid/cards.udl +1092 -0
- package/conformance/valid/commerce-escrow.expected.json +5 -0
- package/conformance/valid/commerce-escrow.udl +1011 -0
- package/conformance/valid/hand-edited.expected.json +5 -0
- package/conformance/valid/hand-edited.udl +1 -0
- package/conformance/valid/insured-car-marketplace.expected.json +5 -0
- package/conformance/valid/insured-car-marketplace.udl +831 -0
- package/conformance/valid/insured-travel.expected.json +5 -0
- package/conformance/valid/insured-travel.udl +2621 -0
- package/conformance/valid/minimal.expected.json +5 -0
- package/conformance/valid/minimal.udl +50 -0
- package/conformance/valid/protection.expected.json +5 -0
- package/conformance/valid/protection.udl +1136 -0
- package/dist/canonical.d.ts +2 -0
- package/dist/canonical.d.ts.map +1 -0
- package/dist/canonical.js +35 -0
- package/dist/canonical.js.map +1 -0
- package/dist/cli.d.ts +3 -0
- package/dist/cli.d.ts.map +1 -0
- package/dist/cli.js +138 -0
- package/dist/cli.js.map +1 -0
- package/dist/duration.d.ts +3 -0
- package/dist/duration.d.ts.map +1 -0
- package/dist/duration.js +23 -0
- package/dist/duration.js.map +1 -0
- package/dist/evolution.d.ts +63 -0
- package/dist/evolution.d.ts.map +1 -0
- package/dist/evolution.js +345 -0
- package/dist/evolution.js.map +1 -0
- package/dist/finance.d.ts +53 -0
- package/dist/finance.d.ts.map +1 -0
- package/dist/finance.js +511 -0
- package/dist/finance.js.map +1 -0
- package/dist/index.d.ts +11 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +8 -0
- package/dist/index.js.map +1 -0
- package/dist/limits.d.ts +33 -0
- package/dist/limits.d.ts.map +1 -0
- package/dist/limits.js +33 -0
- package/dist/limits.js.map +1 -0
- package/dist/parser.d.ts +4 -0
- package/dist/parser.d.ts.map +1 -0
- package/dist/parser.js +54 -0
- package/dist/parser.js.map +1 -0
- package/dist/schema.d.ts +757 -0
- package/dist/schema.d.ts.map +1 -0
- package/dist/schema.js +281 -0
- package/dist/schema.js.map +1 -0
- package/dist/validation.d.ts +64 -0
- package/dist/validation.d.ts.map +1 -0
- package/dist/validation.js +1323 -0
- package/dist/validation.js.map +1 -0
- package/package.json +84 -0
- package/spec/README.md +137 -0
- package/spec/udl.schema.json +1019 -0
- package/src/canonical.ts +41 -0
- package/src/cli.ts +148 -0
- package/src/duration.ts +26 -0
- package/src/evolution.ts +587 -0
- package/src/finance.ts +775 -0
- package/src/index.ts +59 -0
- package/src/limits.ts +32 -0
- package/src/parser.ts +61 -0
- package/src/schema.ts +339 -0
- package/src/validation.ts +2053 -0
package/dist/index.d.ts
ADDED
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
export { canonicalizeUdl, parseUdl } from "./parser.js";
|
|
2
|
+
export { serializeUdl } from "./canonical.js";
|
|
3
|
+
export { fixedIsoDurationMs } from "./duration.js";
|
|
4
|
+
export { analyzeNounFinance, type FinanceIssue, type FinanceOptions, } from "./finance.js";
|
|
5
|
+
export { diffNounEvolution, diffUdlEvolution, snapshotUdlNoun, } from "./evolution.js";
|
|
6
|
+
export type { EvolutionFieldSnapshot, EvolutionMoveSnapshot, EvolutionStepSnapshot, EvolutionTransitionSnapshot, EvolutionVerbSnapshot, NounEvolutionSnapshot, } from "./evolution.js";
|
|
7
|
+
export { UDL_FORMAT_VERSION, udlDocumentSchema, udlKernelOperationSchema, } from "./schema.js";
|
|
8
|
+
export type { UdlAggregate, UdlAggregateCondition, UdlBinding, UdlDeclaredValuePolicy, UdlDecision, UdlDocument, UdlDue, UdlExample, UdlGate, UdlKernelOperation, UdlLifecycle, UdlLifecycleTransition, UdlNoun, UdlNounSubject, UdlStep, UdlSubject, UdlUnwind, UdlVerb, } from "./schema.js";
|
|
9
|
+
export { assertValidUdl, openReferenceShapeBudget, UdlError, validateUdl, validateUdlSchemaValue, } from "./validation.js";
|
|
10
|
+
export type { ReferenceShapeBudget, UdlIssue, UdlIssueCode, UdlValidationResult, } from "./validation.js";
|
|
11
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAC;AACxD,OAAO,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAC;AAC9C,OAAO,EAAE,kBAAkB,EAAE,MAAM,eAAe,CAAC;AACnD,OAAO,EACL,kBAAkB,EAClB,KAAK,YAAY,EACjB,KAAK,cAAc,GACpB,MAAM,cAAc,CAAC;AACtB,OAAO,EACL,iBAAiB,EACjB,gBAAgB,EAChB,eAAe,GAChB,MAAM,gBAAgB,CAAC;AACxB,YAAY,EACV,sBAAsB,EACtB,qBAAqB,EACrB,qBAAqB,EACrB,2BAA2B,EAC3B,qBAAqB,EACrB,qBAAqB,GACtB,MAAM,gBAAgB,CAAC;AACxB,OAAO,EACL,kBAAkB,EAClB,iBAAiB,EACjB,wBAAwB,GACzB,MAAM,aAAa,CAAC;AACrB,YAAY,EACV,YAAY,EACZ,qBAAqB,EACrB,UAAU,EACV,sBAAsB,EACtB,WAAW,EACX,WAAW,EACX,MAAM,EACN,UAAU,EACV,OAAO,EACP,kBAAkB,EAClB,YAAY,EACZ,sBAAsB,EACtB,OAAO,EACP,cAAc,EACd,OAAO,EACP,UAAU,EACV,SAAS,EACT,OAAO,GACR,MAAM,aAAa,CAAC;AACrB,OAAO,EACL,cAAc,EACd,wBAAwB,EACxB,QAAQ,EACR,WAAW,EACX,sBAAsB,GACvB,MAAM,iBAAiB,CAAC;AACzB,YAAY,EACV,oBAAoB,EACpB,QAAQ,EACR,YAAY,EACZ,mBAAmB,GACpB,MAAM,iBAAiB,CAAC"}
|
package/dist/index.js
ADDED
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
export { canonicalizeUdl, parseUdl } from "./parser.js";
|
|
2
|
+
export { serializeUdl } from "./canonical.js";
|
|
3
|
+
export { fixedIsoDurationMs } from "./duration.js";
|
|
4
|
+
export { analyzeNounFinance, } from "./finance.js";
|
|
5
|
+
export { diffNounEvolution, diffUdlEvolution, snapshotUdlNoun, } from "./evolution.js";
|
|
6
|
+
export { UDL_FORMAT_VERSION, udlDocumentSchema, udlKernelOperationSchema, } from "./schema.js";
|
|
7
|
+
export { assertValidUdl, openReferenceShapeBudget, UdlError, validateUdl, validateUdlSchemaValue, } from "./validation.js";
|
|
8
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAC;AACxD,OAAO,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAC;AAC9C,OAAO,EAAE,kBAAkB,EAAE,MAAM,eAAe,CAAC;AACnD,OAAO,EACL,kBAAkB,GAGnB,MAAM,cAAc,CAAC;AACtB,OAAO,EACL,iBAAiB,EACjB,gBAAgB,EAChB,eAAe,GAChB,MAAM,gBAAgB,CAAC;AASxB,OAAO,EACL,kBAAkB,EAClB,iBAAiB,EACjB,wBAAwB,GACzB,MAAM,aAAa,CAAC;AAqBrB,OAAO,EACL,cAAc,EACd,wBAAwB,EACxB,QAAQ,EACR,WAAW,EACX,sBAAsB,GACvB,MAAM,iBAAiB,CAAC"}
|
package/dist/limits.d.ts
ADDED
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
export declare const UDL_LIMITS: Readonly<{
|
|
2
|
+
financeAccounts: 16;
|
|
3
|
+
financeEffects: 128;
|
|
4
|
+
financePathVariants: 256;
|
|
5
|
+
financeStates: 32;
|
|
6
|
+
financeTransitionEdges: 128;
|
|
7
|
+
financeTransitions: 64;
|
|
8
|
+
financeVerbs: 64;
|
|
9
|
+
financeWork: 4096;
|
|
10
|
+
maxDepth: 24;
|
|
11
|
+
maxKeyLength: 128;
|
|
12
|
+
maxNodes: 10000;
|
|
13
|
+
maxPatternLength: 320;
|
|
14
|
+
/**
|
|
15
|
+
* Upper bound on the match attempts a document-authored `pattern` can force
|
|
16
|
+
* the backtracking engine to explore at its single anchored start position.
|
|
17
|
+
* Every admitted pattern's search space is multiplied out at admission
|
|
18
|
+
* (alternation branches x optional atoms x variable-quantifier spans), so
|
|
19
|
+
* worst-case matching cost is this budget times the pattern length, not an
|
|
20
|
+
* exponential in the document author's choice of grammar.
|
|
21
|
+
*/
|
|
22
|
+
maxPatternPaths: 4096;
|
|
23
|
+
/**
|
|
24
|
+
* Reference-shape classifications one `ReferenceShapeBudget` may buy. Each
|
|
25
|
+
* one compiles a JSON Schema validator, and a document controls both factors
|
|
26
|
+
* of the nouns x gate-fields product that asks for them.
|
|
27
|
+
*/
|
|
28
|
+
maxSchemaProbes: 2048;
|
|
29
|
+
maxSourceBytes: number;
|
|
30
|
+
maxStringLength: 2048;
|
|
31
|
+
maxTotalStringLength: number;
|
|
32
|
+
}>;
|
|
33
|
+
//# sourceMappingURL=limits.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"limits.d.ts","sourceRoot":"","sources":["../src/limits.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,UAAU;;;;;;;;;;;;;IAarB;;;;;;;OAOG;;IAEH;;;;OAIG;;;;;EAKH,CAAC"}
|
package/dist/limits.js
ADDED
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
export const UDL_LIMITS = Object.freeze({
|
|
2
|
+
financeAccounts: 16,
|
|
3
|
+
financeEffects: 128,
|
|
4
|
+
financePathVariants: 256,
|
|
5
|
+
financeStates: 32,
|
|
6
|
+
financeTransitionEdges: 128,
|
|
7
|
+
financeTransitions: 64,
|
|
8
|
+
financeVerbs: 64,
|
|
9
|
+
financeWork: 4_096,
|
|
10
|
+
maxDepth: 24,
|
|
11
|
+
maxKeyLength: 128,
|
|
12
|
+
maxNodes: 10_000,
|
|
13
|
+
maxPatternLength: 320,
|
|
14
|
+
/**
|
|
15
|
+
* Upper bound on the match attempts a document-authored `pattern` can force
|
|
16
|
+
* the backtracking engine to explore at its single anchored start position.
|
|
17
|
+
* Every admitted pattern's search space is multiplied out at admission
|
|
18
|
+
* (alternation branches x optional atoms x variable-quantifier spans), so
|
|
19
|
+
* worst-case matching cost is this budget times the pattern length, not an
|
|
20
|
+
* exponential in the document author's choice of grammar.
|
|
21
|
+
*/
|
|
22
|
+
maxPatternPaths: 4_096,
|
|
23
|
+
/**
|
|
24
|
+
* Reference-shape classifications one `ReferenceShapeBudget` may buy. Each
|
|
25
|
+
* one compiles a JSON Schema validator, and a document controls both factors
|
|
26
|
+
* of the nouns x gate-fields product that asks for them.
|
|
27
|
+
*/
|
|
28
|
+
maxSchemaProbes: 2_048,
|
|
29
|
+
maxSourceBytes: 256 * 1_024,
|
|
30
|
+
maxStringLength: 2_048,
|
|
31
|
+
maxTotalStringLength: 256 * 1_024,
|
|
32
|
+
});
|
|
33
|
+
//# sourceMappingURL=limits.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"limits.js","sourceRoot":"","sources":["../src/limits.ts"],"names":[],"mappings":"AAAA,MAAM,CAAC,MAAM,UAAU,GAAG,MAAM,CAAC,MAAM,CAAC;IACtC,eAAe,EAAE,EAAE;IACnB,cAAc,EAAE,GAAG;IACnB,mBAAmB,EAAE,GAAG;IACxB,aAAa,EAAE,EAAE;IACjB,sBAAsB,EAAE,GAAG;IAC3B,kBAAkB,EAAE,EAAE;IACtB,YAAY,EAAE,EAAE;IAChB,WAAW,EAAE,KAAK;IAClB,QAAQ,EAAE,EAAE;IACZ,YAAY,EAAE,GAAG;IACjB,QAAQ,EAAE,MAAM;IAChB,gBAAgB,EAAE,GAAG;IACrB;;;;;;;OAOG;IACH,eAAe,EAAE,KAAK;IACtB;;;;OAIG;IACH,eAAe,EAAE,KAAK;IACtB,cAAc,EAAE,GAAG,GAAG,KAAK;IAC3B,eAAe,EAAE,KAAK;IACtB,oBAAoB,EAAE,GAAG,GAAG,KAAK;CAClC,CAAC,CAAC"}
|
package/dist/parser.d.ts
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"parser.d.ts","sourceRoot":"","sources":["../src/parser.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAK/C,wBAAgB,QAAQ,CAAC,MAAM,EAAE,MAAM,GAAG,UAAU,GAAG,WAAW,CAmBjE;AAmBD,wBAAgB,eAAe,CAAC,MAAM,EAAE,MAAM,GAAG,UAAU,GAAG,MAAM,CAEnE"}
|
package/dist/parser.js
ADDED
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
import { serializeUdl } from "./canonical.js";
|
|
2
|
+
import { UDL_LIMITS } from "./limits.js";
|
|
3
|
+
import { assertValidUdl, UdlError } from "./validation.js";
|
|
4
|
+
const utf8Decoder = new TextDecoder("utf-8", { fatal: true });
|
|
5
|
+
export function parseUdl(source) {
|
|
6
|
+
const sourceBytes = typeof source === "string"
|
|
7
|
+
? source.length > UDL_LIMITS.maxSourceBytes
|
|
8
|
+
? source.length
|
|
9
|
+
: new TextEncoder().encode(source).byteLength
|
|
10
|
+
: source.byteLength;
|
|
11
|
+
if (sourceBytes > UDL_LIMITS.maxSourceBytes) {
|
|
12
|
+
throw new UdlError([
|
|
13
|
+
{
|
|
14
|
+
code: "resource_limit",
|
|
15
|
+
message: `UDL source exceeds ${UDL_LIMITS.maxSourceBytes} bytes`,
|
|
16
|
+
path: "$",
|
|
17
|
+
},
|
|
18
|
+
]);
|
|
19
|
+
}
|
|
20
|
+
return parseUdlText(typeof source === "string" ? source : decodeUdlBytes(source));
|
|
21
|
+
}
|
|
22
|
+
function parseUdlText(source) {
|
|
23
|
+
let value;
|
|
24
|
+
try {
|
|
25
|
+
value = JSON.parse(source);
|
|
26
|
+
}
|
|
27
|
+
catch (error) {
|
|
28
|
+
throw new UdlError([
|
|
29
|
+
{
|
|
30
|
+
code: "invalid_json",
|
|
31
|
+
message: error instanceof Error ? error.message : "could not parse JSON",
|
|
32
|
+
path: "$",
|
|
33
|
+
},
|
|
34
|
+
]);
|
|
35
|
+
}
|
|
36
|
+
return assertValidUdl(value);
|
|
37
|
+
}
|
|
38
|
+
export function canonicalizeUdl(source) {
|
|
39
|
+
return serializeUdl(parseUdl(source));
|
|
40
|
+
}
|
|
41
|
+
function decodeUdlBytes(source) {
|
|
42
|
+
try {
|
|
43
|
+
return utf8Decoder.decode(source);
|
|
44
|
+
}
|
|
45
|
+
catch {
|
|
46
|
+
const issue = {
|
|
47
|
+
code: "invalid_utf8",
|
|
48
|
+
message: "UDL bytes must be valid UTF-8",
|
|
49
|
+
path: "$",
|
|
50
|
+
};
|
|
51
|
+
throw new UdlError([issue]);
|
|
52
|
+
}
|
|
53
|
+
}
|
|
54
|
+
//# sourceMappingURL=parser.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"parser.js","sourceRoot":"","sources":["../src/parser.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAC;AAC9C,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAEzC,OAAO,EAAE,cAAc,EAAE,QAAQ,EAAiB,MAAM,iBAAiB,CAAC;AAE1E,MAAM,WAAW,GAAG,IAAI,WAAW,CAAC,OAAO,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC;AAE9D,MAAM,UAAU,QAAQ,CAAC,MAA2B;IAClD,MAAM,WAAW,GACf,OAAO,MAAM,KAAK,QAAQ;QACxB,CAAC,CAAC,MAAM,CAAC,MAAM,GAAG,UAAU,CAAC,cAAc;YACzC,CAAC,CAAC,MAAM,CAAC,MAAM;YACf,CAAC,CAAC,IAAI,WAAW,EAAE,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,UAAU;QAC/C,CAAC,CAAC,MAAM,CAAC,UAAU,CAAC;IACxB,IAAI,WAAW,GAAG,UAAU,CAAC,cAAc,EAAE,CAAC;QAC5C,MAAM,IAAI,QAAQ,CAAC;YACjB;gBACE,IAAI,EAAE,gBAAgB;gBACtB,OAAO,EAAE,sBAAsB,UAAU,CAAC,cAAc,QAAQ;gBAChE,IAAI,EAAE,GAAG;aACV;SACF,CAAC,CAAC;IACL,CAAC;IACD,OAAO,YAAY,CACjB,OAAO,MAAM,KAAK,QAAQ,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,cAAc,CAAC,MAAM,CAAC,CAC7D,CAAC;AACJ,CAAC;AAED,SAAS,YAAY,CAAC,MAAc;IAClC,IAAI,KAAc,CAAC;IACnB,IAAI,CAAC;QACH,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM,CAAY,CAAC;IACxC,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,MAAM,IAAI,QAAQ,CAAC;YACjB;gBACE,IAAI,EAAE,cAAc;gBACpB,OAAO,EACL,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,sBAAsB;gBACjE,IAAI,EAAE,GAAG;aACV;SACF,CAAC,CAAC;IACL,CAAC;IACD,OAAO,cAAc,CAAC,KAAK,CAAC,CAAC;AAC/B,CAAC;AAED,MAAM,UAAU,eAAe,CAAC,MAA2B;IACzD,OAAO,YAAY,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC;AACxC,CAAC;AAED,SAAS,cAAc,CAAC,MAAkB;IACxC,IAAI,CAAC;QACH,OAAO,WAAW,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;IACpC,CAAC;IAAC,MAAM,CAAC;QACP,MAAM,KAAK,GAAa;YACtB,IAAI,EAAE,cAAc;YACpB,OAAO,EAAE,+BAA+B;YACxC,IAAI,EAAE,GAAG;SACV,CAAC;QACF,MAAM,IAAI,QAAQ,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC;IAC9B,CAAC;AACH,CAAC"}
|