@elqora/dgp-core 1.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/LICENSE +674 -0
- package/README.md +83 -0
- package/dist/capabilities.d.ts +13 -0
- package/dist/capabilities.d.ts.map +1 -0
- package/dist/capabilities.js +32 -0
- package/dist/capabilities.js.map +1 -0
- package/dist/context.d.ts +12 -0
- package/dist/context.d.ts.map +1 -0
- package/dist/context.js +49 -0
- package/dist/context.js.map +1 -0
- package/dist/effects.d.ts +10 -0
- package/dist/effects.d.ts.map +1 -0
- package/dist/effects.js +16 -0
- package/dist/effects.js.map +1 -0
- package/dist/index.d.ts +9 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +10 -0
- package/dist/index.js.map +1 -0
- package/dist/indexer.d.ts +37 -0
- package/dist/indexer.d.ts.map +1 -0
- package/dist/indexer.js +119 -0
- package/dist/indexer.js.map +1 -0
- package/dist/interpreter.d.ts +29 -0
- package/dist/interpreter.d.ts.map +1 -0
- package/dist/interpreter.js +53 -0
- package/dist/interpreter.js.map +1 -0
- package/dist/options.d.ts +15 -0
- package/dist/options.d.ts.map +1 -0
- package/dist/options.js +48 -0
- package/dist/options.js.map +1 -0
- package/dist/services.d.ts +12 -0
- package/dist/services.d.ts.map +1 -0
- package/dist/services.js +61 -0
- package/dist/services.js.map +1 -0
- package/dist/visibility.d.ts +14 -0
- package/dist/visibility.d.ts.map +1 -0
- package/dist/visibility.js +142 -0
- package/dist/visibility.js.map +1 -0
- package/package.json +55 -0
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import type { ProductDefinition, ServiceId } from "@elqora/dgp-spec";
|
|
2
|
+
import { type ProductIndex } from "./indexer.js";
|
|
3
|
+
export interface ResolvedServiceBindings {
|
|
4
|
+
byNodeId: Readonly<Record<string, ServiceId>>;
|
|
5
|
+
serviceIds: ServiceId[];
|
|
6
|
+
}
|
|
7
|
+
export declare function serviceBindingForNode(index: ProductIndex, nodeId: string): ServiceId | undefined;
|
|
8
|
+
export declare function resolveServiceBindingsWithIndex(definition: ProductDefinition, index: ProductIndex): ResolvedServiceBindings;
|
|
9
|
+
export declare function resolveServiceBindings(definition: ProductDefinition): ResolvedServiceBindings;
|
|
10
|
+
export declare function resolveFallbackCandidates(definition: ProductDefinition, primaryServiceId: ServiceId, nodeId?: string): ServiceId[];
|
|
11
|
+
export declare function fallbackCandidatesForNode(definition: ProductDefinition, index: ProductIndex, nodeId: string): ServiceId[];
|
|
12
|
+
//# sourceMappingURL=services.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"services.d.ts","sourceRoot":"","sources":["../src/services.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,iBAAiB,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AAErE,OAAO,EAAsB,KAAK,YAAY,EAAE,MAAM,cAAc,CAAC;AAGrE,MAAM,WAAW,uBAAuB;IACtC,QAAQ,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,SAAS,CAAC,CAAC,CAAC;IAC9C,UAAU,EAAE,SAAS,EAAE,CAAC;CACzB;AAED,wBAAgB,qBAAqB,CAAC,KAAK,EAAE,YAAY,EAAE,MAAM,EAAE,MAAM,GAAG,SAAS,GAAG,SAAS,CAMhG;AAED,wBAAgB,+BAA+B,CAC7C,UAAU,EAAE,iBAAiB,EAC7B,KAAK,EAAE,YAAY,GAClB,uBAAuB,CAoBzB;AAED,wBAAgB,sBAAsB,CAAC,UAAU,EAAE,iBAAiB,GAAG,uBAAuB,CAE7F;AAED,wBAAgB,yBAAyB,CACvC,UAAU,EAAE,iBAAiB,EAC7B,gBAAgB,EAAE,SAAS,EAC3B,MAAM,CAAC,EAAE,MAAM,GACd,SAAS,EAAE,CAeb;AAED,wBAAgB,yBAAyB,CACvC,UAAU,EAAE,iBAAiB,EAC7B,KAAK,EAAE,YAAY,EACnB,MAAM,EAAE,MAAM,GACb,SAAS,EAAE,CAGb"}
|
package/dist/services.js
ADDED
|
@@ -0,0 +1,61 @@
|
|
|
1
|
+
// SPDX-License-Identifier: GPL-3.0-only
|
|
2
|
+
import { createProductIndex } from "./indexer.js";
|
|
3
|
+
import { walkOptions } from "./options.js";
|
|
4
|
+
export function serviceBindingForNode(index, nodeId) {
|
|
5
|
+
const node = index.getNode(nodeId);
|
|
6
|
+
if (node.kind === "filter")
|
|
7
|
+
return node.filter.service_id;
|
|
8
|
+
if (node.kind === "field")
|
|
9
|
+
return node.field.button === true ? node.field.service_id : undefined;
|
|
10
|
+
if (node.kind === "option")
|
|
11
|
+
return node.option.service_id;
|
|
12
|
+
return undefined;
|
|
13
|
+
}
|
|
14
|
+
export function resolveServiceBindingsWithIndex(definition, index) {
|
|
15
|
+
const byNodeId = {};
|
|
16
|
+
const serviceIds = [];
|
|
17
|
+
const seen = new Set();
|
|
18
|
+
const bind = (nodeId, serviceId) => {
|
|
19
|
+
if (serviceId === undefined)
|
|
20
|
+
return;
|
|
21
|
+
byNodeId[nodeId] = serviceId;
|
|
22
|
+
const key = String(serviceId);
|
|
23
|
+
if (!seen.has(key)) {
|
|
24
|
+
seen.add(key);
|
|
25
|
+
serviceIds.push(serviceId);
|
|
26
|
+
}
|
|
27
|
+
};
|
|
28
|
+
for (const filter of definition.filters)
|
|
29
|
+
bind(filter.id, serviceBindingForNode(index, filter.id));
|
|
30
|
+
for (const field of definition.fields)
|
|
31
|
+
bind(field.id, serviceBindingForNode(index, field.id));
|
|
32
|
+
for (const visit of walkOptions(definition)) {
|
|
33
|
+
bind(visit.optionId, serviceBindingForNode(index, visit.optionId));
|
|
34
|
+
}
|
|
35
|
+
return { byNodeId, serviceIds };
|
|
36
|
+
}
|
|
37
|
+
export function resolveServiceBindings(definition) {
|
|
38
|
+
return resolveServiceBindingsWithIndex(definition, createProductIndex(definition));
|
|
39
|
+
}
|
|
40
|
+
export function resolveFallbackCandidates(definition, primaryServiceId, nodeId) {
|
|
41
|
+
const candidates = [
|
|
42
|
+
...(nodeId === undefined ? [] : definition.fallbacks?.nodes?.[nodeId] ?? []),
|
|
43
|
+
...(definition.fallbacks?.global?.[String(primaryServiceId)] ?? []),
|
|
44
|
+
];
|
|
45
|
+
const primaryKey = String(primaryServiceId);
|
|
46
|
+
const seen = new Set();
|
|
47
|
+
const result = [];
|
|
48
|
+
for (const candidate of candidates) {
|
|
49
|
+
const key = String(candidate);
|
|
50
|
+
if (key === primaryKey || seen.has(key))
|
|
51
|
+
continue;
|
|
52
|
+
seen.add(key);
|
|
53
|
+
result.push(candidate);
|
|
54
|
+
}
|
|
55
|
+
return result;
|
|
56
|
+
}
|
|
57
|
+
export function fallbackCandidatesForNode(definition, index, nodeId) {
|
|
58
|
+
const primary = serviceBindingForNode(index, nodeId);
|
|
59
|
+
return primary === undefined ? [] : resolveFallbackCandidates(definition, primary, nodeId);
|
|
60
|
+
}
|
|
61
|
+
//# sourceMappingURL=services.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"services.js","sourceRoot":"","sources":["../src/services.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import type { ProductDefinition } from "@elqora/dgp-spec";
|
|
2
|
+
import { type ProductIndex } from "./indexer.js";
|
|
3
|
+
export interface VisibilityOptions {
|
|
4
|
+
selectedTriggerIds?: Iterable<string>;
|
|
5
|
+
}
|
|
6
|
+
export interface ResolvedVisibility {
|
|
7
|
+
fieldIds: string[];
|
|
8
|
+
optionsByFieldId: Record<string, string[]>;
|
|
9
|
+
forcedFieldIds: string[];
|
|
10
|
+
}
|
|
11
|
+
export declare function visibleFieldIdsUnder(definition: ProductDefinition, filterId: string, options?: VisibilityOptions): string[];
|
|
12
|
+
export declare function resolveVisibilityWithIndex(definition: ProductDefinition, index: ProductIndex, filterId: string, selectedTriggerIds?: Iterable<string>): ResolvedVisibility;
|
|
13
|
+
export declare function resolveVisibility(definition: ProductDefinition, filterId: string, selectedTriggerIds?: Iterable<string>): ResolvedVisibility;
|
|
14
|
+
//# sourceMappingURL=visibility.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"visibility.d.ts","sourceRoot":"","sources":["../src/visibility.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,iBAAiB,EAAgB,MAAM,kBAAkB,CAAC;AAGxE,OAAO,EAAsB,KAAK,YAAY,EAAE,MAAM,cAAc,CAAC;AAGrE,MAAM,WAAW,iBAAiB;IAChC,kBAAkB,CAAC,EAAE,QAAQ,CAAC,MAAM,CAAC,CAAC;CACvC;AAED,MAAM,WAAW,kBAAkB;IACjC,QAAQ,EAAE,MAAM,EAAE,CAAC;IACnB,gBAAgB,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,EAAE,CAAC,CAAC;IAC3C,cAAc,EAAE,MAAM,EAAE,CAAC;CAC1B;AA+DD,wBAAgB,oBAAoB,CAClC,UAAU,EAAE,iBAAiB,EAC7B,QAAQ,EAAE,MAAM,EAChB,OAAO,GAAE,iBAAsB,GAC9B,MAAM,EAAE,CAOV;AAED,wBAAgB,0BAA0B,CACxC,UAAU,EAAE,iBAAiB,EAC7B,KAAK,EAAE,YAAY,EACnB,QAAQ,EAAE,MAAM,EAChB,kBAAkB,GAAE,QAAQ,CAAC,MAAM,CAAM,GACxC,kBAAkB,CAsEpB;AAED,wBAAgB,iBAAiB,CAC/B,UAAU,EAAE,iBAAiB,EAC7B,QAAQ,EAAE,MAAM,EAChB,kBAAkB,GAAE,QAAQ,CAAC,MAAM,CAAM,GACxC,kBAAkB,CAOpB"}
|
|
@@ -0,0 +1,142 @@
|
|
|
1
|
+
// SPDX-License-Identifier: GPL-3.0-only
|
|
2
|
+
import { resolveFilterContext, triggerOwnerDepth } from "./context.js";
|
|
3
|
+
import { createProductIndex } from "./indexer.js";
|
|
4
|
+
import { fieldOptionIds } from "./options.js";
|
|
5
|
+
function relevantTriggers(inputs) {
|
|
6
|
+
const context = resolveFilterContext(inputs.index, inputs.filterId);
|
|
7
|
+
if (context === undefined)
|
|
8
|
+
return [];
|
|
9
|
+
const result = [];
|
|
10
|
+
for (const id of inputs.selectedTriggerIds) {
|
|
11
|
+
const depth = triggerOwnerDepth(inputs.index, id, context.lineageDepths);
|
|
12
|
+
if (depth !== undefined)
|
|
13
|
+
result.push({ id, depth });
|
|
14
|
+
}
|
|
15
|
+
return result;
|
|
16
|
+
}
|
|
17
|
+
function visibleFieldIdsFromInputs(inputs) {
|
|
18
|
+
const context = resolveFilterContext(inputs.index, inputs.filterId);
|
|
19
|
+
if (context === undefined)
|
|
20
|
+
return [];
|
|
21
|
+
const visible = new Set();
|
|
22
|
+
const lineageIds = new Set(context.lineage.map((filter) => filter.id));
|
|
23
|
+
for (const field of inputs.definition.fields) {
|
|
24
|
+
if (inputs.index.fieldBindIds(field).some((bindId) => lineageIds.has(bindId)))
|
|
25
|
+
visible.add(field.id);
|
|
26
|
+
if (context.filter.includes?.includes(field.id) === true)
|
|
27
|
+
visible.add(field.id);
|
|
28
|
+
}
|
|
29
|
+
for (const fieldId of context.filter.excludes ?? [])
|
|
30
|
+
visible.delete(fieldId);
|
|
31
|
+
const decisions = new Map();
|
|
32
|
+
const decide = (fieldId, next) => {
|
|
33
|
+
const previous = decisions.get(fieldId);
|
|
34
|
+
if (previous === undefined
|
|
35
|
+
|| next.depth < previous.depth
|
|
36
|
+
|| (next.depth === previous.depth && previous.kind === "include" && next.kind === "exclude"))
|
|
37
|
+
decisions.set(fieldId, next);
|
|
38
|
+
};
|
|
39
|
+
for (const trigger of relevantTriggers(inputs)) {
|
|
40
|
+
for (const fieldId of inputs.definition.includes_for_buttons[trigger.id] ?? []) {
|
|
41
|
+
decide(fieldId, { depth: trigger.depth, kind: "include" });
|
|
42
|
+
}
|
|
43
|
+
for (const fieldId of inputs.definition.excludes_for_buttons[trigger.id] ?? []) {
|
|
44
|
+
decide(fieldId, { depth: trigger.depth, kind: "exclude" });
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
for (const [fieldId, decision] of decisions) {
|
|
48
|
+
if (decision.kind === "include")
|
|
49
|
+
visible.add(fieldId);
|
|
50
|
+
else
|
|
51
|
+
visible.delete(fieldId);
|
|
52
|
+
}
|
|
53
|
+
const natural = inputs.definition.fields.filter((field) => visible.has(field.id)).map((field) => field.id);
|
|
54
|
+
const pinned = inputs.definition.order_for_tags[inputs.filterId] ?? [];
|
|
55
|
+
const pinnedVisible = pinned.filter((fieldId) => visible.has(fieldId));
|
|
56
|
+
const pinnedSet = new Set(pinnedVisible);
|
|
57
|
+
return [...pinnedVisible, ...natural.filter((fieldId) => !pinnedSet.has(fieldId))];
|
|
58
|
+
}
|
|
59
|
+
export function visibleFieldIdsUnder(definition, filterId, options = {}) {
|
|
60
|
+
return visibleFieldIdsFromInputs({
|
|
61
|
+
definition,
|
|
62
|
+
index: createProductIndex(definition),
|
|
63
|
+
filterId,
|
|
64
|
+
selectedTriggerIds: options.selectedTriggerIds ?? [],
|
|
65
|
+
});
|
|
66
|
+
}
|
|
67
|
+
export function resolveVisibilityWithIndex(definition, index, filterId, selectedTriggerIds = []) {
|
|
68
|
+
const inputs = { definition, index, filterId, selectedTriggerIds };
|
|
69
|
+
const baseFieldIds = visibleFieldIdsFromInputs(inputs);
|
|
70
|
+
const visible = new Set(baseFieldIds);
|
|
71
|
+
const forced = new Set();
|
|
72
|
+
const optionsByFieldId = {};
|
|
73
|
+
const optionIdsByFieldId = new Map();
|
|
74
|
+
const optionIds = (field) => {
|
|
75
|
+
const cached = optionIdsByFieldId.get(field.id);
|
|
76
|
+
if (cached !== undefined)
|
|
77
|
+
return cached;
|
|
78
|
+
const ids = fieldOptionIds(field);
|
|
79
|
+
optionIdsByFieldId.set(field.id, ids);
|
|
80
|
+
return ids;
|
|
81
|
+
};
|
|
82
|
+
const initializeOptions = (field) => {
|
|
83
|
+
const ids = optionIds(field);
|
|
84
|
+
if (ids.length > 0 && optionsByFieldId[field.id] === undefined)
|
|
85
|
+
optionsByFieldId[field.id] = [...ids];
|
|
86
|
+
};
|
|
87
|
+
for (const fieldId of baseFieldIds) {
|
|
88
|
+
const field = index.getField(fieldId);
|
|
89
|
+
if (field !== undefined)
|
|
90
|
+
initializeOptions(field);
|
|
91
|
+
}
|
|
92
|
+
for (const trigger of relevantTriggers(inputs)) {
|
|
93
|
+
for (const [targetFieldId, rule] of Object.entries(definition.option_effects_for_buttons[trigger.id] ?? {})) {
|
|
94
|
+
const field = index.getField(targetFieldId);
|
|
95
|
+
if (field === undefined)
|
|
96
|
+
continue;
|
|
97
|
+
if (!visible.has(targetFieldId) && rule.force_visible !== true)
|
|
98
|
+
continue;
|
|
99
|
+
if (!visible.has(targetFieldId)) {
|
|
100
|
+
visible.add(targetFieldId);
|
|
101
|
+
forced.add(targetFieldId);
|
|
102
|
+
}
|
|
103
|
+
const orderedOptionIds = optionIds(field);
|
|
104
|
+
if (orderedOptionIds.length === 0)
|
|
105
|
+
continue;
|
|
106
|
+
const known = new Set(orderedOptionIds);
|
|
107
|
+
let allowed = optionsByFieldId[targetFieldId] ?? [...orderedOptionIds];
|
|
108
|
+
if ((rule.include?.length ?? 0) > 0) {
|
|
109
|
+
const included = new Set(rule.include?.filter((id) => known.has(id)) ?? []);
|
|
110
|
+
const currentlyAllowed = new Set(allowed);
|
|
111
|
+
allowed = orderedOptionIds.filter((id) => included.has(id) && currentlyAllowed.has(id));
|
|
112
|
+
}
|
|
113
|
+
if ((rule.exclude?.length ?? 0) > 0) {
|
|
114
|
+
const excluded = new Set(rule.exclude?.filter((id) => known.has(id)) ?? []);
|
|
115
|
+
allowed = allowed.filter((id) => !excluded.has(id));
|
|
116
|
+
}
|
|
117
|
+
optionsByFieldId[targetFieldId] = allowed;
|
|
118
|
+
}
|
|
119
|
+
}
|
|
120
|
+
const fieldIds = baseFieldIds.filter((fieldId) => visible.has(fieldId));
|
|
121
|
+
const seen = new Set(fieldIds);
|
|
122
|
+
for (const field of definition.fields) {
|
|
123
|
+
if (!visible.has(field.id) || seen.has(field.id))
|
|
124
|
+
continue;
|
|
125
|
+
seen.add(field.id);
|
|
126
|
+
fieldIds.push(field.id);
|
|
127
|
+
initializeOptions(field);
|
|
128
|
+
}
|
|
129
|
+
for (const fieldId of Object.keys(optionsByFieldId)) {
|
|
130
|
+
if (!visible.has(fieldId))
|
|
131
|
+
delete optionsByFieldId[fieldId];
|
|
132
|
+
}
|
|
133
|
+
return {
|
|
134
|
+
fieldIds,
|
|
135
|
+
optionsByFieldId,
|
|
136
|
+
forcedFieldIds: fieldIds.filter((fieldId) => forced.has(fieldId)),
|
|
137
|
+
};
|
|
138
|
+
}
|
|
139
|
+
export function resolveVisibility(definition, filterId, selectedTriggerIds = []) {
|
|
140
|
+
return resolveVisibilityWithIndex(definition, createProductIndex(definition), filterId, selectedTriggerIds);
|
|
141
|
+
}
|
|
142
|
+
//# sourceMappingURL=visibility.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"visibility.js","sourceRoot":"","sources":["../src/visibility.ts"],"names":[],"mappings":"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"}
|
package/package.json
ADDED
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@elqora/dgp-core",
|
|
3
|
+
"version": "1.0.0",
|
|
4
|
+
"description": "Deterministic framework-neutral interpretation for Digital Goods Protocol product definitions.",
|
|
5
|
+
"license": "GPL-3.0-only",
|
|
6
|
+
"type": "module",
|
|
7
|
+
"types": "./dist/index.d.ts",
|
|
8
|
+
"module": "./dist/index.js",
|
|
9
|
+
"sideEffects": false,
|
|
10
|
+
"packageManager": "npm@11.6.4",
|
|
11
|
+
"repository": {
|
|
12
|
+
"type": "git",
|
|
13
|
+
"url": "git+https://github.com/elqora/dgp-core.git"
|
|
14
|
+
},
|
|
15
|
+
"publishConfig": {
|
|
16
|
+
"access": "public"
|
|
17
|
+
},
|
|
18
|
+
"engines": {
|
|
19
|
+
"node": ">=22"
|
|
20
|
+
},
|
|
21
|
+
"files": [
|
|
22
|
+
"dist",
|
|
23
|
+
"README.md",
|
|
24
|
+
"LICENSE"
|
|
25
|
+
],
|
|
26
|
+
"exports": {
|
|
27
|
+
".": {
|
|
28
|
+
"types": "./dist/index.d.ts",
|
|
29
|
+
"import": "./dist/index.js"
|
|
30
|
+
},
|
|
31
|
+
"./package.json": "./package.json"
|
|
32
|
+
},
|
|
33
|
+
"scripts": {
|
|
34
|
+
"clean": "node scripts/clean.mjs",
|
|
35
|
+
"build": "npm run clean && tsc -p tsconfig.build.json",
|
|
36
|
+
"typecheck": "tsc --noEmit -p tsconfig.json",
|
|
37
|
+
"lint": "eslint .",
|
|
38
|
+
"test": "vitest run",
|
|
39
|
+
"check:boundaries": "node scripts/check-boundaries.mjs",
|
|
40
|
+
"check": "npm run lint && npm run typecheck && npm run test && npm run check:boundaries && npm run build",
|
|
41
|
+
"prepack": "npm run check"
|
|
42
|
+
},
|
|
43
|
+
"dependencies": {
|
|
44
|
+
"@elqora/dgp-spec": "^1.0.0"
|
|
45
|
+
},
|
|
46
|
+
"devDependencies": {
|
|
47
|
+
"@eslint/js": "10.0.1",
|
|
48
|
+
"@types/node": "^24.10.0",
|
|
49
|
+
"eslint": "10.0.1",
|
|
50
|
+
"globals": "^16.5.0",
|
|
51
|
+
"typescript": "5.9.3",
|
|
52
|
+
"typescript-eslint": "8.65.0",
|
|
53
|
+
"vitest": "4.1.10"
|
|
54
|
+
}
|
|
55
|
+
}
|