@hyperscale0/hsx 6.0.0 → 6.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.
- package/dist/src/attachment-economics.d.ts +5 -0
- package/dist/src/attachment-economics.d.ts.map +1 -0
- package/dist/src/attachment-economics.js +55 -0
- package/dist/src/attachment-economics.js.map +1 -0
- package/dist/src/compile.d.ts.map +1 -1
- package/dist/src/compile.js +9 -1
- package/dist/src/compile.js.map +1 -1
- package/dist/src/examples-bundle.js +3 -3
- package/dist/src/examples-bundle.js.map +1 -1
- package/dist/src/parse.js +2 -0
- package/dist/src/parse.js.map +1 -1
- package/dist/src/version.d.ts +1 -1
- package/dist/src/version.js +1 -1
- package/docs/README.md +23 -1
- package/examples/insurance.hsx +1 -0
- package/examples/money.hsx +1 -0
- package/examples/wallet.hsx +1 -0
- package/package.json +3 -3
- package/src/attachment-economics.ts +103 -0
- package/src/compile.ts +15 -1
- package/src/examples-bundle.ts +3 -3
- package/src/parse.ts +2 -0
- package/src/version.ts +1 -1
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
import { type AttachmentPartyBinding, type UdlDocument, type UdlInstrument } from "@hyperscale0/udl";
|
|
2
|
+
import type { Entry, Expr } from "./ast.ts";
|
|
3
|
+
/** An attachment specializes its own instrument; imported definitions stay generic. */
|
|
4
|
+
export declare function applyAttachmentEconomics(document: UdlDocument, instrument: UdlInstrument, parties: Record<string, AttachmentPartyBinding>, declarations: Entry[], data: (expression: Expr) => unknown): void;
|
|
5
|
+
//# sourceMappingURL=attachment-economics.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"attachment-economics.d.ts","sourceRoot":"","sources":["../../src/attachment-economics.ts"],"names":[],"mappings":"AAAA,OAAO,EAGL,KAAK,sBAAsB,EAE3B,KAAK,WAAW,EAChB,KAAK,aAAa,EACnB,MAAM,kBAAkB,CAAC;AAC1B,OAAO,KAAK,EAAE,KAAK,EAAE,IAAI,EAAE,MAAM,UAAU,CAAC;AAG5C,uFAAuF;AACvF,wBAAgB,wBAAwB,CACtC,QAAQ,EAAE,WAAW,EACrB,UAAU,EAAE,aAAa,EACzB,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,sBAAsB,CAAC,EAC/C,YAAY,EAAE,KAAK,EAAE,EACrB,IAAI,EAAE,CAAC,UAAU,EAAE,IAAI,KAAK,OAAO,GAClC,IAAI,CAoFN"}
|
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
import { subjectPartyRoles, udlMoveSchema, } from "@hyperscale0/udl";
|
|
2
|
+
import { fail } from "./diagnostics.js";
|
|
3
|
+
/** An attachment specializes its own instrument; imported definitions stay generic. */
|
|
4
|
+
export function applyAttachmentEconomics(document, instrument, parties, declarations, data) {
|
|
5
|
+
const selected = new Set();
|
|
6
|
+
for (const declaration of declarations) {
|
|
7
|
+
const selector = declaration.key.slice("economics ".length);
|
|
8
|
+
const [actionName, moveKey, extra] = selector.split(".");
|
|
9
|
+
const action = Object.hasOwn(instrument.actions, actionName)
|
|
10
|
+
? instrument.actions[actionName]
|
|
11
|
+
: undefined;
|
|
12
|
+
if (!action)
|
|
13
|
+
fail(declaration, `unknown economics action ${actionName}`, `choose ${instrument.actionOrder.join(", ")}, before its public alias`);
|
|
14
|
+
const move = moveKey
|
|
15
|
+
? action.moves.find((move) => move.key === moveKey)
|
|
16
|
+
: action.moves.length === 1
|
|
17
|
+
? action.moves[0]
|
|
18
|
+
: undefined;
|
|
19
|
+
if (!move || extra)
|
|
20
|
+
fail(declaration, `economics ${selector} must select one money move`, action.moves.length
|
|
21
|
+
? `choose ${action.moves.map((move) => `${actionName}.${move.key}`).join(", ")}`
|
|
22
|
+
: "choose an action that transfers or reserves money");
|
|
23
|
+
if (move.operation === "internal_transfer.void")
|
|
24
|
+
fail(declaration, `economics ${selector} cannot classify a void`, "declare the purpose on the reservation or its posting");
|
|
25
|
+
if (selected.has(move))
|
|
26
|
+
fail(declaration, `repeated economics for ${selector}`, "declare each money move's purpose once");
|
|
27
|
+
selected.add(move);
|
|
28
|
+
const parsed = udlMoveSchema.safeParse({
|
|
29
|
+
...move,
|
|
30
|
+
economics: data(declaration.value),
|
|
31
|
+
});
|
|
32
|
+
if (!parsed.success || !parsed.data.economics)
|
|
33
|
+
fail(declaration, `invalid economics for ${selector}`, "declare purpose and sourceParty using the move economics fields");
|
|
34
|
+
const economics = parsed.data.economics;
|
|
35
|
+
if (move.economics &&
|
|
36
|
+
(move.economics.purpose !== economics.purpose ||
|
|
37
|
+
move.economics.sourceParty !== economics.sourceParty ||
|
|
38
|
+
move.economics.reversalOf !== economics.reversalOf))
|
|
39
|
+
fail(declaration, `economics ${selector} conflicts with the instrument's declared purpose`, "keep the instrument's economics or choose an unclassified move");
|
|
40
|
+
const source = economics.sourceParty;
|
|
41
|
+
const role = subjectPartyRoles.includes(source);
|
|
42
|
+
if (!role && document.parties[source]?.kind !== "business")
|
|
43
|
+
fail(declaration, `unknown economic source party ${source}`, "bind sourceParty to owner, actor, operator or a declared business");
|
|
44
|
+
if (!Object.values(parties).some((binding) => "role" in binding ? binding.role === source : binding.party === source)) {
|
|
45
|
+
let key = "economicSource";
|
|
46
|
+
for (let index = 2; Object.hasOwn(parties, key); index++)
|
|
47
|
+
key = `economicSource${index}`;
|
|
48
|
+
parties[key] = role
|
|
49
|
+
? { role: source }
|
|
50
|
+
: { party: source };
|
|
51
|
+
}
|
|
52
|
+
move.economics = economics;
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
//# sourceMappingURL=attachment-economics.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"attachment-economics.js","sourceRoot":"","sources":["../../src/attachment-economics.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"compile.d.ts","sourceRoot":"","sources":["../../src/compile.ts"],"names":[],"mappings":"AAOA,OAAO,EAAwB,KAAK,eAAe,EAAE,MAAM,WAAW,CAAC;AACvE,OAAO,EAeL,KAAK,WAAW,EAQjB,MAAM,kBAAkB,CAAC;
|
|
1
|
+
{"version":3,"file":"compile.d.ts","sourceRoot":"","sources":["../../src/compile.ts"],"names":[],"mappings":"AAOA,OAAO,EAAwB,KAAK,eAAe,EAAE,MAAM,WAAW,CAAC;AACvE,OAAO,EAeL,KAAK,WAAW,EAQjB,MAAM,kBAAkB,CAAC;AAU1B,OAAO,EAIL,KAAK,UAAU,EAKf,KAAK,IAAI,EACV,MAAM,UAAU,CAAC;AAClB,OAAO,EAA0B,KAAK,eAAe,EAAE,MAAM,kBAAkB,CAAC;AAEhF,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,kBAAkB,CAAC;AAExD,MAAM,WAAW,iBAAkB,SAAQ,UAAU;IACnD,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,MAAM,CAAC;IACf,QAAQ,EAAE,OAAO,CAAC;IAClB,KAAK,EAAE,OAAO,GAAG,OAAO,GAAG,OAAO,CAAC;CACpC;AACD,MAAM,WAAW,qBAAqB;IACpC,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,IAAI,GAAG;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,CAAA;KAAE,CAAC;IAC9C,aAAa,CAAC,EAAE;QAAE,GAAG,EAAE,MAAM,CAAC;QAAC,UAAU,EAAE,MAAM,CAAC;QAAC,YAAY,EAAE,MAAM,CAAA;KAAE,CAAC;CAC3E;AACD,MAAM,WAAW,oBAAoB;IACnC,OAAO,EAAE,eAAe,CAAC;IACzB,SAAS,EAAE,MAAM,CAAC;CACnB;AACD,MAAM,WAAW,cAAc;IAC7B,eAAe,CAAC,EAAE,eAAe,CAAC;IAClC,eAAe,CAAC,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,oBAAoB,CAAC,CAAC,CAAC;CAClE;AACD,MAAM,WAAW,aAAa;IAC5B,OAAO,EAAE,OAAO,GAAG,SAAS,CAAC;IAC7B,WAAW,EAAE,iBAAiB,EAAE,CAAC;IACjC,SAAS,CAAC,EAAE;QACV,QAAQ,EAAE,WAAW,CAAC;QACtB,YAAY,EAAE,eAAe,CAAC;QAC9B,SAAS,EAAE,qBAAqB,EAAE,CAAC;KACpC,CAAC;CACH;AAqTD,wBAAgB,OAAO,CACrB,MAAM,EAAE,MAAM,EACd,OAAO,GAAE,cAAmB,GAC3B,aAAa,CAgnHf"}
|
package/dist/src/compile.js
CHANGED
|
@@ -5,6 +5,7 @@ import { validateUdl, resolveField, sameObjectField, subjectPartyRoles, RESERVED
|
|
|
5
5
|
import { bindingDependencies, parameterDiagnostics, BindingContractError, } from "./binding-contract.js";
|
|
6
6
|
import { tunableBounds } from "./tunables.js";
|
|
7
7
|
import { parseProgram } from "./parse.js";
|
|
8
|
+
import { applyAttachmentEconomics } from "./attachment-economics.js";
|
|
8
9
|
import { parseHeader } from "./header-source.js";
|
|
9
10
|
import { lineColAt, } from "./ast.js";
|
|
10
11
|
import { bundledStandardLibrary } from "./std-library.js";
|
|
@@ -2078,6 +2079,8 @@ export function compile(source, options = {}) {
|
|
|
2078
2079
|
inst.actions[name] = a;
|
|
2079
2080
|
inst.actionOrder.push(name);
|
|
2080
2081
|
}
|
|
2082
|
+
if (attachmentInfo && !attachmentInfo.child)
|
|
2083
|
+
applyAttachmentEconomics(document, inst, attachmentInfo.parties, attachmentInfo.economics, data);
|
|
2081
2084
|
for (const key of [
|
|
2082
2085
|
"invariants",
|
|
2083
2086
|
"reports",
|
|
@@ -2221,9 +2224,13 @@ export function compile(source, options = {}) {
|
|
|
2221
2224
|
const renames = new Map();
|
|
2222
2225
|
const renameEntries = new Map();
|
|
2223
2226
|
const exposed = new Map();
|
|
2227
|
+
const economics = [];
|
|
2224
2228
|
const tunableEntries = [];
|
|
2225
2229
|
for (const row of attachmentBlock.entries) {
|
|
2226
|
-
if (row.key
|
|
2230
|
+
if (row.key.startsWith("economics ")) {
|
|
2231
|
+
economics.push(row);
|
|
2232
|
+
}
|
|
2233
|
+
else if (row.key === "rename") {
|
|
2227
2234
|
for (const r of asBlock(row.value).entries) {
|
|
2228
2235
|
if (renames.has(r.key))
|
|
2229
2236
|
fail(r, `duplicate rename ${r.key}`, "rename each subject field once");
|
|
@@ -2267,6 +2274,7 @@ export function compile(source, options = {}) {
|
|
|
2267
2274
|
exposed,
|
|
2268
2275
|
parties,
|
|
2269
2276
|
attachments,
|
|
2277
|
+
economics,
|
|
2270
2278
|
}, templateFamily ? { ...templateFamily } : undefined, standardOrigins.get(template));
|
|
2271
2279
|
}
|
|
2272
2280
|
catch (error) {
|