@layerzerolabs/base-definitions 0.2.5 → 0.2.7
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/.turbo/turbo-build.log +29 -29
- package/.turbo/turbo-lint.log +4 -0
- package/.turbo/turbo-test.log +5 -5
- package/dist/{O7HENH25.cjs → 3AKKEY5J.cjs} +55 -5
- package/dist/3AKKEY5J.cjs.map +1 -0
- package/dist/{4DUQS2FO.js → H6QNIXMU.js} +55 -5
- package/dist/H6QNIXMU.js.map +1 -0
- package/dist/index.cjs +3 -3
- package/dist/index.js +1 -1
- package/dist/registrarBuilder.cjs +3 -3
- package/dist/registrarBuilder.d.ts +14 -2
- package/dist/registrarBuilder.d.ts.map +1 -1
- package/dist/registrarBuilder.js +1 -1
- package/package.json +7 -7
- package/src/registrarBuilder.ts +84 -10
- package/test/registrarBuilder.test.ts +53 -0
- package/dist/4DUQS2FO.js.map +0 -1
- package/dist/O7HENH25.cjs.map +0 -1
package/.turbo/turbo-build.log
CHANGED
|
@@ -4,51 +4,51 @@
|
|
|
4
4
|
|
|
5
5
|
[34mCLI[39m Building entry: src/definitions.ts, src/index.ts, src/lzyringe.ts, src/registrarBuilder.ts, src/utils.ts
|
|
6
6
|
[34mCLI[39m Using tsconfig: tsconfig.json
|
|
7
|
-
[34mCLI[39m tsup v8.
|
|
7
|
+
[34mCLI[39m tsup v8.5.1
|
|
8
8
|
[34mCLI[39m Using tsup config: /home/runner/work/monorepo-internal/monorepo-internal/packages/framework/definitions/base-definitions/tsup.config.ts
|
|
9
9
|
[34mCLI[39m Target: ES2023
|
|
10
10
|
[34mCLI[39m Cleaning output folder
|
|
11
11
|
[34mCJS[39m Build start
|
|
12
12
|
[34mESM[39m Build start
|
|
13
|
+
[32mCJS[39m [1mdist/definitions.cjs [22m[32m742.00 B[39m
|
|
14
|
+
[32mCJS[39m [1mdist/lzyringe.cjs [22m[32m302.00 B[39m
|
|
15
|
+
[32mCJS[39m [1mdist/index.cjs [22m[32m1.42 KB[39m
|
|
16
|
+
[32mCJS[39m [1mdist/JKTGUQY4.cjs [22m[32m1.70 KB[39m
|
|
17
|
+
[32mCJS[39m [1mdist/utils.cjs [22m[32m341.00 B[39m
|
|
18
|
+
[32mCJS[39m [1mdist/registrarBuilder.cjs [22m[32m481.00 B[39m
|
|
19
|
+
[32mCJS[39m [1mdist/3AKKEY5J.cjs [22m[32m6.27 KB[39m
|
|
20
|
+
[32mCJS[39m [1mdist/OIBEOODK.cjs [22m[32m812.00 B[39m
|
|
21
|
+
[32mCJS[39m [1mdist/VTYVOFLM.cjs [22m[32m1.68 KB[39m
|
|
22
|
+
[32mCJS[39m [1mdist/YJF4D23A.cjs [22m[32m245.00 B[39m
|
|
23
|
+
[32mCJS[39m [1mdist/definitions.cjs.map [22m[32m76.00 B[39m
|
|
24
|
+
[32mCJS[39m [1mdist/lzyringe.cjs.map [22m[32m73.00 B[39m
|
|
25
|
+
[32mCJS[39m [1mdist/index.cjs.map [22m[32m70.00 B[39m
|
|
26
|
+
[32mCJS[39m [1mdist/registrarBuilder.cjs.map [22m[32m81.00 B[39m
|
|
27
|
+
[32mCJS[39m [1mdist/3AKKEY5J.cjs.map [22m[32m17.00 KB[39m
|
|
28
|
+
[32mCJS[39m [1mdist/OIBEOODK.cjs.map [22m[32m1.83 KB[39m
|
|
29
|
+
[32mCJS[39m [1mdist/VTYVOFLM.cjs.map [22m[32m14.00 KB[39m
|
|
30
|
+
[32mCJS[39m [1mdist/YJF4D23A.cjs.map [22m[32m73.00 B[39m
|
|
31
|
+
[32mCJS[39m [1mdist/JKTGUQY4.cjs.map [22m[32m3.78 KB[39m
|
|
32
|
+
[32mCJS[39m [1mdist/utils.cjs.map [22m[32m70.00 B[39m
|
|
33
|
+
[32mCJS[39m ⚡️ Build success in 166ms
|
|
13
34
|
[32mESM[39m [1mdist/index.js [22m[32m389.00 B[39m
|
|
14
35
|
[32mESM[39m [1mdist/lzyringe.js [22m[32m146.00 B[39m
|
|
15
|
-
[32mESM[39m [1mdist/registrarBuilder.js [22m[32m191.00 B[39m
|
|
16
36
|
[32mESM[39m [1mdist/definitions.js [22m[32m216.00 B[39m
|
|
17
37
|
[32mESM[39m [1mdist/JJBD65HU.js [22m[32m1.65 KB[39m
|
|
18
|
-
[32mESM[39m [1mdist/
|
|
38
|
+
[32mESM[39m [1mdist/registrarBuilder.js [22m[32m191.00 B[39m
|
|
39
|
+
[32mESM[39m [1mdist/H6QNIXMU.js [22m[32m6.07 KB[39m
|
|
19
40
|
[32mESM[39m [1mdist/utils.js [22m[32m173.00 B[39m
|
|
20
41
|
[32mESM[39m [1mdist/EAPC6542.js [22m[32m733.00 B[39m
|
|
21
|
-
[32mESM[39m [1mdist/NQBJGAQC.js [22m[32m1.47 KB[39m
|
|
22
42
|
[32mESM[39m [1mdist/VUOMXK5T.js [22m[32m222.00 B[39m
|
|
43
|
+
[32mESM[39m [1mdist/NQBJGAQC.js [22m[32m1.47 KB[39m
|
|
23
44
|
[32mESM[39m [1mdist/index.js.map [22m[32m69.00 B[39m
|
|
24
45
|
[32mESM[39m [1mdist/lzyringe.js.map [22m[32m72.00 B[39m
|
|
25
|
-
[32mESM[39m [1mdist/registrarBuilder.js.map [22m[32m80.00 B[39m
|
|
26
46
|
[32mESM[39m [1mdist/definitions.js.map [22m[32m75.00 B[39m
|
|
27
47
|
[32mESM[39m [1mdist/JJBD65HU.js.map [22m[32m3.78 KB[39m
|
|
28
|
-
[32mESM[39m [1mdist/
|
|
48
|
+
[32mESM[39m [1mdist/H6QNIXMU.js.map [22m[32m16.99 KB[39m
|
|
49
|
+
[32mESM[39m [1mdist/registrarBuilder.js.map [22m[32m80.00 B[39m
|
|
29
50
|
[32mESM[39m [1mdist/utils.js.map [22m[32m69.00 B[39m
|
|
30
51
|
[32mESM[39m [1mdist/EAPC6542.js.map [22m[32m1.82 KB[39m
|
|
31
|
-
[32mESM[39m [1mdist/NQBJGAQC.js.map [22m[32m13.99 KB[39m
|
|
32
52
|
[32mESM[39m [1mdist/VUOMXK5T.js.map [22m[32m72.00 B[39m
|
|
33
|
-
[32mESM[39m
|
|
34
|
-
[
|
|
35
|
-
[32mCJS[39m [1mdist/JKTGUQY4.cjs [22m[32m1.70 KB[39m
|
|
36
|
-
[32mCJS[39m [1mdist/registrarBuilder.cjs [22m[32m478.00 B[39m
|
|
37
|
-
[32mCJS[39m [1mdist/OIBEOODK.cjs [22m[32m812.00 B[39m
|
|
38
|
-
[32mCJS[39m [1mdist/O7HENH25.cjs [22m[32m4.66 KB[39m
|
|
39
|
-
[32mCJS[39m [1mdist/utils.cjs [22m[32m341.00 B[39m
|
|
40
|
-
[32mCJS[39m [1mdist/YJF4D23A.cjs [22m[32m245.00 B[39m
|
|
41
|
-
[32mCJS[39m [1mdist/VTYVOFLM.cjs [22m[32m1.68 KB[39m
|
|
42
|
-
[32mCJS[39m [1mdist/index.cjs [22m[32m1.42 KB[39m
|
|
43
|
-
[32mCJS[39m [1mdist/definitions.cjs [22m[32m742.00 B[39m
|
|
44
|
-
[32mCJS[39m [1mdist/lzyringe.cjs.map [22m[32m73.00 B[39m
|
|
45
|
-
[32mCJS[39m [1mdist/OIBEOODK.cjs.map [22m[32m1.83 KB[39m
|
|
46
|
-
[32mCJS[39m [1mdist/JKTGUQY4.cjs.map [22m[32m3.78 KB[39m
|
|
47
|
-
[32mCJS[39m [1mdist/O7HENH25.cjs.map [22m[32m12.79 KB[39m
|
|
48
|
-
[32mCJS[39m [1mdist/utils.cjs.map [22m[32m70.00 B[39m
|
|
49
|
-
[32mCJS[39m [1mdist/YJF4D23A.cjs.map [22m[32m73.00 B[39m
|
|
50
|
-
[32mCJS[39m [1mdist/VTYVOFLM.cjs.map [22m[32m14.00 KB[39m
|
|
51
|
-
[32mCJS[39m [1mdist/registrarBuilder.cjs.map [22m[32m81.00 B[39m
|
|
52
|
-
[32mCJS[39m [1mdist/index.cjs.map [22m[32m70.00 B[39m
|
|
53
|
-
[32mCJS[39m [1mdist/definitions.cjs.map [22m[32m76.00 B[39m
|
|
54
|
-
[32mCJS[39m ⚡️ Build success in 332ms
|
|
53
|
+
[32mESM[39m [1mdist/NQBJGAQC.js.map [22m[32m13.99 KB[39m
|
|
54
|
+
[32mESM[39m ⚡️ Build success in 167ms
|
package/.turbo/turbo-lint.log
CHANGED
|
@@ -2,3 +2,7 @@
|
|
|
2
2
|
> @layerzerolabs/base-definitions@0.0.2 lint /home/runner/work/monorepo-internal/monorepo-internal/packages/framework/definitions/base-definitions
|
|
3
3
|
> eslint . --max-warnings 0 || (eslint . --fix --max-warnings 0 && false)
|
|
4
4
|
|
|
5
|
+
(node:23094) [MODULE_TYPELESS_PACKAGE_JSON] Warning: Module type of file:///home/runner/work/monorepo-internal/monorepo-internal/eslint.config.js?mtime=1764985257978 is not specified and it doesn't parse as CommonJS.
|
|
6
|
+
Reparsing as ES module because module syntax was detected. This incurs a performance overhead.
|
|
7
|
+
To eliminate this warning, add "type": "module" to /home/runner/work/monorepo-internal/monorepo-internal/package.json.
|
|
8
|
+
(Use `node --trace-warnings ...` to show where the warning was created)
|
package/.turbo/turbo-test.log
CHANGED
|
@@ -5,13 +5,13 @@
|
|
|
5
5
|
[33mTesting types with tsc and vue-tsc is an experimental feature.
|
|
6
6
|
Breaking changes might not follow SemVer, please pin Vitest's version when using it.[39m
|
|
7
7
|
|
|
8
|
-
[1m[46m RUN [49m[22m [36mv3.2.
|
|
8
|
+
[1m[46m RUN [49m[22m [36mv3.2.4 [39m[90m/home/runner/work/monorepo-internal/monorepo-internal/packages/framework/definitions/base-definitions[39m
|
|
9
9
|
|
|
10
|
-
[32m✓[39m test/registrarBuilder.test.ts [2m([22m[
|
|
10
|
+
[32m✓[39m test/registrarBuilder.test.ts [2m([22m[2m7 tests[22m[2m)[22m[32m 11[2mms[22m[39m
|
|
11
11
|
|
|
12
12
|
[2m Test Files [22m [1m[32m1 passed[39m[22m[90m (1)[39m
|
|
13
|
-
[2m Tests [22m [1m[
|
|
13
|
+
[2m Tests [22m [1m[32m7 passed[39m[22m[90m (7)[39m
|
|
14
14
|
[2mType Errors [22m [2mno errors[22m
|
|
15
|
-
[2m Start at [22m
|
|
16
|
-
[2m Duration [22m
|
|
15
|
+
[2m Start at [22m 01:44:45
|
|
16
|
+
[2m Duration [22m 575ms[2m (transform 107ms, setup 0ms, collect 99ms, tests 11ms, environment 0ms, prepare 126ms)[22m
|
|
17
17
|
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
'use strict';
|
|
2
2
|
|
|
3
3
|
var YJF4D23A_cjs = require('./YJF4D23A.cjs');
|
|
4
|
+
var dependencyGraph = require('@layerzerolabs/dependency-graph');
|
|
4
5
|
var dfs = require('@layerzerolabs/dfs');
|
|
5
6
|
|
|
6
7
|
var RegistrarBuilder = class {
|
|
@@ -8,13 +9,24 @@ var RegistrarBuilder = class {
|
|
|
8
9
|
YJF4D23A_cjs.__name(this, "RegistrarBuilder");
|
|
9
10
|
}
|
|
10
11
|
defaultHandler;
|
|
12
|
+
namedHandlers = {};
|
|
13
|
+
classHandlers = [];
|
|
14
|
+
classAliases = [];
|
|
15
|
+
getEntrypoints = /* @__PURE__ */ YJF4D23A_cjs.__name((node) => [
|
|
16
|
+
node
|
|
17
|
+
], "getEntrypoints");
|
|
11
18
|
constructor() {
|
|
12
19
|
this.defaultHandler = async (node) => {
|
|
13
20
|
throw new Error(`This registrar does not provide a handler for the dependency type used by ${JSON.stringify(node)}`);
|
|
14
21
|
};
|
|
15
22
|
}
|
|
16
|
-
|
|
17
|
-
|
|
23
|
+
addNamedHandler(node, fn) {
|
|
24
|
+
if (this.namedHandlers[node.name]) {
|
|
25
|
+
throw new Error(`Cannot define a named handler for an identifier that already has a handler: ${node.name}`);
|
|
26
|
+
}
|
|
27
|
+
this.namedHandlers[node.name] = fn;
|
|
28
|
+
return this;
|
|
29
|
+
}
|
|
18
30
|
/**
|
|
19
31
|
* Add a function fn to be called on all nodes of class
|
|
20
32
|
* @param nodeClass
|
|
@@ -93,6 +105,14 @@ var RegistrarBuilder = class {
|
|
|
93
105
|
});
|
|
94
106
|
return this;
|
|
95
107
|
}
|
|
108
|
+
/**
|
|
109
|
+
* Set a custom entrypoint getter function. By default, the entrypoint getter
|
|
110
|
+
* returns the node passed in as the sole entrypoint.
|
|
111
|
+
*/
|
|
112
|
+
setEntrypointsGetter(fn) {
|
|
113
|
+
this.getEntrypoints = fn;
|
|
114
|
+
return this;
|
|
115
|
+
}
|
|
96
116
|
/**
|
|
97
117
|
* Add a default function fn to be used on nodes whose types do not have handlers.
|
|
98
118
|
* If this is not set, the default behaviour will be to throw
|
|
@@ -112,6 +132,19 @@ var RegistrarBuilder = class {
|
|
|
112
132
|
return node;
|
|
113
133
|
}, "mergedNodePrehandler");
|
|
114
134
|
const mergedNodeHandler = /* @__PURE__ */ YJF4D23A_cjs.__name(async (node, ancestry) => {
|
|
135
|
+
if (node.name === "_virtualEntrypoint") {
|
|
136
|
+
return {
|
|
137
|
+
key: node.name,
|
|
138
|
+
value: void 0
|
|
139
|
+
};
|
|
140
|
+
}
|
|
141
|
+
const namedHandler = this.namedHandlers[node.name];
|
|
142
|
+
if (namedHandler) {
|
|
143
|
+
return {
|
|
144
|
+
key: node.name,
|
|
145
|
+
value: await namedHandler(node, ancestry)
|
|
146
|
+
};
|
|
147
|
+
}
|
|
115
148
|
for (const { nodeClass, identifier, fn } of this.classHandlers) {
|
|
116
149
|
if (node instanceof nodeClass) {
|
|
117
150
|
return {
|
|
@@ -126,7 +159,24 @@ var RegistrarBuilder = class {
|
|
|
126
159
|
};
|
|
127
160
|
}, "mergedNodeHandler");
|
|
128
161
|
return {
|
|
129
|
-
traverseDependencies: /* @__PURE__ */ YJF4D23A_cjs.__name(async (node) =>
|
|
162
|
+
traverseDependencies: /* @__PURE__ */ YJF4D23A_cjs.__name(async (node) => {
|
|
163
|
+
const entrypoints = this.getEntrypoints(node);
|
|
164
|
+
if (entrypoints.length === 1) return await dfs.dfs(node, mergedNodeHandler, mergedNodePrehandler)();
|
|
165
|
+
const dependencies = entrypoints.reduce((acc, cur) => {
|
|
166
|
+
acc[cur.name] = cur;
|
|
167
|
+
return acc;
|
|
168
|
+
}, {});
|
|
169
|
+
let VirtualNode = class VirtualNode extends dependencyGraph.DependencyNode {
|
|
170
|
+
static {
|
|
171
|
+
YJF4D23A_cjs.__name(this, "VirtualNode");
|
|
172
|
+
}
|
|
173
|
+
};
|
|
174
|
+
const virtualEntrypoint = new VirtualNode({
|
|
175
|
+
name: "_virtualEntrypoint",
|
|
176
|
+
dependencies
|
|
177
|
+
});
|
|
178
|
+
return await dfs.dfs(virtualEntrypoint, mergedNodeHandler, mergedNodePrehandler)();
|
|
179
|
+
}, "traverseDependencies")
|
|
130
180
|
};
|
|
131
181
|
}
|
|
132
182
|
};
|
|
@@ -146,5 +196,5 @@ var multiplexOrderedRegistrars = /* @__PURE__ */ YJF4D23A_cjs.__name((...registr
|
|
|
146
196
|
|
|
147
197
|
exports.RegistrarBuilder = RegistrarBuilder;
|
|
148
198
|
exports.multiplexOrderedRegistrars = multiplexOrderedRegistrars;
|
|
149
|
-
//# sourceMappingURL=
|
|
150
|
-
//# sourceMappingURL=
|
|
199
|
+
//# sourceMappingURL=3AKKEY5J.cjs.map
|
|
200
|
+
//# sourceMappingURL=3AKKEY5J.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/registrarBuilder.ts"],"names":["RegistrarBuilder","defaultHandler","namedHandlers","classHandlers","classAliases","getEntrypoints","node","Error","JSON","stringify","addNamedHandler","fn","name","addClassHandler","nodeClass","identifier","find","fromNodeClass","i","handler","prototype","isPrototypeOf","splice","push","addClassAlias","getToNode","alias","setEntrypointsGetter","addDefault","build","mergedNodePrehandler","toNode","mergedNodeHandler","__name","ancestry","key","value","undefined","namedHandler","traverseDependencies","entrypoints","length","dfs","dependencies","reduce","acc","cur","VirtualNode","DependencyNode","virtualEntrypoint","multiplexOrderedRegistrars","registrars","multiplexRegistrar","params","registrar","result"],"mappings":"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","file":"3AKKEY5J.cjs","sourcesContent":["import type { Dependencies } from '@layerzerolabs/dependency-graph';\nimport { DependencyNode } from '@layerzerolabs/dependency-graph';\nimport type { Registrar } from '@layerzerolabs/dfs';\nimport { dfs } from '@layerzerolabs/dfs';\nexport type { Registrar };\n\ntype NodeClass = new (...args: any[]) => DependencyNode;\ntype AbstractNodeClass = abstract new (...args: any[]) => DependencyNode;\n\n/**\n * <!-- anchor:RegistrarBuilder -->\n * A builder class for a {@link Registrar}.\n * Builds a registrar that switches on node class--i.e., enables defining\n * specific registration behaviour for specific node classes.\n * Intelligently handles inheritance, always using the most specific\n * handler defined for any given class.\n * The registrar built shall return an object that maps from a handler ID,\n * to a map from node name to the return of each handler,\n * e.g., { objectNodes: { myObjectNode: 'my handler return' }}.\n * This can be used to extract a specific resolved value after resolving the tree,\n * given that the handlers return the resolved nodes.\n */\nexport class RegistrarBuilder<_ReturnTypes> {\n protected defaultHandler: (node: DependencyNode, ancestry: DependencyNode[]) => Promise<any>;\n\n protected namedHandlers: Record<\n string,\n (node: DependencyNode, ancestry: DependencyNode[]) => Promise<any>\n > = {};\n\n protected classHandlers: {\n nodeClass: AbstractNodeClass;\n identifier: string;\n fn: (node: DependencyNode, ancestry: DependencyNode[]) => Promise<any>;\n }[] = [];\n\n protected classAliases: {\n fromNodeClass: AbstractNodeClass;\n getToNode: (from: DependencyNode) => DependencyNode;\n }[] = [];\n\n protected getEntrypoints: (node: DependencyNode) => DependencyNode[] = (node) => [node];\n\n constructor() {\n this.defaultHandler = async (node: DependencyNode) => {\n throw new Error(\n `This registrar does not provide a handler for the dependency type used by ${JSON.stringify(node)}`,\n );\n };\n }\n\n public addNamedHandler<\n Node extends DependencyNode,\n Function extends (node: Node, ancestry: DependencyNode[]) => Promise<any>,\n >(node: DependencyNode, fn: Function) {\n if (this.namedHandlers[node.name]) {\n throw new Error(\n `Cannot define a named handler for an identifier that already has a handler: ${node.name}`,\n );\n }\n this.namedHandlers[node.name] = fn as unknown as (\n node: DependencyNode,\n ancestry: DependencyNode[],\n ) => Promise<any>;\n return this as RegistrarBuilder<\n _ReturnTypes & {\n ['namedHandlers']: { [nodeName: string]: Awaited<ReturnType<Function>> };\n }\n >;\n }\n\n /**\n * Add a function fn to be called on all nodes of class\n * @param nodeClass\n * @param identifier\n * @param fn\n */\n public addClassHandler<\n Identifier extends string,\n _NodeClass extends NodeClass,\n Function extends (node: InstanceType<_NodeClass>, ancestry: DependencyNode[]) => any,\n >(nodeClass: _NodeClass, identifier: Identifier, fn: Function) {\n if (this.classAliases.find(({ fromNodeClass }) => fromNodeClass === nodeClass)) {\n throw new Error(\n `Cannot define a handler for a class that is aliased to something else. This would be pointless`,\n );\n }\n\n let i = 0;\n for (const handler of this.classHandlers) {\n //check if we are overriding an existing handler\n if (handler.nodeClass === nodeClass) {\n this.classHandlers[i] = {\n nodeClass,\n identifier,\n fn: fn as unknown as (node: DependencyNode) => Promise<any>,\n };\n\n return this as RegistrarBuilder<\n _ReturnTypes & {\n [_K in Identifier]: { [nodeName: string]: Awaited<ReturnType<Function>> };\n }\n >;\n }\n //check if the new handler has an ordering requirement against an existing handler\n //(we always want to use more specific handlers if they exist)\n // eslint-disable-next-line no-prototype-builtins\n if (handler.nodeClass.prototype.isPrototypeOf(nodeClass.prototype)) {\n this.classHandlers.splice(i, 0, {\n nodeClass,\n identifier,\n fn: fn as unknown as (node: DependencyNode) => Promise<any>,\n });\n\n return this as RegistrarBuilder<\n _ReturnTypes & {\n [_K in Identifier]: { [nodeName: string]: Awaited<ReturnType<Function>> };\n }\n >;\n }\n i++;\n }\n\n this.classHandlers.push({\n nodeClass,\n identifier,\n fn: fn as unknown as (node: DependencyNode) => Promise<any>,\n });\n\n return this as RegistrarBuilder<\n _ReturnTypes & {\n [_K in Identifier]: { [nodeName: string]: Awaited<ReturnType<Function>> };\n }\n >;\n }\n\n /**\n * Alias some class *from*, such that any node of that class in the tree will be\n * treated as though it were some other node *to*. The *to* node is given as a\n * function returning a class instance, so that its dependencies, name, etc can be fixed.\n * The registrar will ignore the dependencies of the original node, and follow the alias's\n * dependencies instead.\n *\n * Additionally, this method does not affect the typing of the registrar. The output type\n * of the build() method will not reflect the alias.\n *\n * @param fromNodeClass alias instances of this class\n * @param getToNode method that returns the *to* part of the alias\n */\n public addClassAlias<FromNodeClass extends AbstractNodeClass>(\n fromNodeClass: FromNodeClass,\n getToNode: (fromNodeInstance: InstanceType<FromNodeClass>) => DependencyNode,\n ) {\n if (this.classHandlers.find(({ nodeClass }) => nodeClass === fromNodeClass)) {\n throw new Error(`Cannot define an alias for a class that already has a handler`);\n }\n\n let i = 0;\n for (const alias of this.classAliases) {\n //check if we are overriding an existing alias\n if (alias.fromNodeClass === fromNodeClass) {\n this.classAliases[i] = {\n fromNodeClass,\n getToNode: getToNode as unknown as (from: DependencyNode) => DependencyNode,\n };\n\n return this;\n }\n //check if the new alias has an ordering requirement against an existing alias\n //(we always want to use more specific handlers if they exist)\n // eslint-disable-next-line no-prototype-builtins\n if (alias.fromNodeClass.prototype.isPrototypeOf(fromNodeClass.prototype)) {\n this.classAliases.splice(i, 0, {\n fromNodeClass,\n getToNode: getToNode as unknown as (from: DependencyNode) => DependencyNode,\n });\n\n return this;\n }\n i++;\n }\n\n this.classAliases.push({\n fromNodeClass,\n getToNode: getToNode as unknown as (from: DependencyNode) => DependencyNode,\n });\n\n return this;\n }\n\n /**\n * Set a custom entrypoint getter function. By default, the entrypoint getter\n * returns the node passed in as the sole entrypoint.\n */\n public setEntrypointsGetter(fn: (node: DependencyNode) => DependencyNode[]) {\n this.getEntrypoints = fn;\n return this;\n }\n\n /**\n * Add a default function fn to be used on nodes whose types do not have handlers.\n * If this is not set, the default behaviour will be to throw\n * @param fn\n */\n public addDefault(fn: (node: DependencyNode, ancestry: DependencyNode[]) => any) {\n this.defaultHandler = fn;\n return this;\n }\n\n public build(): Registrar<_ReturnTypes> {\n const mergedNodePrehandler = (node: DependencyNode) => {\n for (const { fromNodeClass, getToNode: toNode } of this.classAliases) {\n if (node instanceof fromNodeClass) {\n return toNode(node);\n }\n }\n return node;\n };\n\n const mergedNodeHandler = async (node: DependencyNode, ancestry: DependencyNode[]) => {\n if (node.name === '_virtualEntrypoint') {\n return {\n key: node.name,\n value: undefined,\n };\n }\n\n const namedHandler = this.namedHandlers[node.name];\n if (namedHandler) {\n return {\n key: node.name,\n value: await namedHandler(node, ancestry),\n };\n }\n\n for (const { nodeClass, identifier, fn } of this.classHandlers) {\n if (node instanceof nodeClass) {\n return {\n key: identifier,\n value: await fn(node, ancestry),\n };\n }\n }\n\n return {\n key: 'default',\n value: await this.defaultHandler(node, ancestry),\n };\n };\n return {\n traverseDependencies: async (node: DependencyNode) => {\n const entrypoints = this.getEntrypoints(node);\n if (entrypoints.length === 1)\n return await dfs<_ReturnTypes>(node, mergedNodeHandler, mergedNodePrehandler)();\n\n const dependencies = entrypoints.reduce((acc, cur) => {\n acc[cur.name] = cur;\n return acc;\n }, {} as Dependencies);\n\n class VirtualNode extends DependencyNode {}\n\n const virtualEntrypoint = new VirtualNode({\n name: '_virtualEntrypoint',\n dependencies,\n });\n\n return await dfs<_ReturnTypes>(\n virtualEntrypoint,\n mergedNodeHandler,\n mergedNodePrehandler,\n )();\n },\n };\n }\n}\n\nexport const multiplexOrderedRegistrars = <\n const T extends [name: string, registrar: Registrar<{}>][],\n>(\n ...registrars: T\n) => {\n const multiplexRegistrar: Registrar<{\n [K in Extract<keyof T, number> as T[K] extends readonly [infer Name extends string, any]\n ? Name\n : never]: T[K] extends readonly [any, Registrar<infer Ret>] ? Ret : never;\n }> = {\n traverseDependencies: async (\n ...params: Parameters<Registrar<any>['traverseDependencies']>\n ) => {\n const acc: Record<string, any> = {};\n for (const [name, registrar] of registrars) {\n const result = await registrar.traverseDependencies(...params);\n acc[name] = result;\n }\n\n return acc;\n },\n } as any;\n\n return multiplexRegistrar;\n};\n"]}
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import { __name } from './VUOMXK5T.js';
|
|
2
|
+
import { DependencyNode } from '@layerzerolabs/dependency-graph';
|
|
2
3
|
import { dfs } from '@layerzerolabs/dfs';
|
|
3
4
|
|
|
4
5
|
var RegistrarBuilder = class {
|
|
@@ -6,13 +7,24 @@ var RegistrarBuilder = class {
|
|
|
6
7
|
__name(this, "RegistrarBuilder");
|
|
7
8
|
}
|
|
8
9
|
defaultHandler;
|
|
10
|
+
namedHandlers = {};
|
|
11
|
+
classHandlers = [];
|
|
12
|
+
classAliases = [];
|
|
13
|
+
getEntrypoints = /* @__PURE__ */ __name((node) => [
|
|
14
|
+
node
|
|
15
|
+
], "getEntrypoints");
|
|
9
16
|
constructor() {
|
|
10
17
|
this.defaultHandler = async (node) => {
|
|
11
18
|
throw new Error(`This registrar does not provide a handler for the dependency type used by ${JSON.stringify(node)}`);
|
|
12
19
|
};
|
|
13
20
|
}
|
|
14
|
-
|
|
15
|
-
|
|
21
|
+
addNamedHandler(node, fn) {
|
|
22
|
+
if (this.namedHandlers[node.name]) {
|
|
23
|
+
throw new Error(`Cannot define a named handler for an identifier that already has a handler: ${node.name}`);
|
|
24
|
+
}
|
|
25
|
+
this.namedHandlers[node.name] = fn;
|
|
26
|
+
return this;
|
|
27
|
+
}
|
|
16
28
|
/**
|
|
17
29
|
* Add a function fn to be called on all nodes of class
|
|
18
30
|
* @param nodeClass
|
|
@@ -91,6 +103,14 @@ var RegistrarBuilder = class {
|
|
|
91
103
|
});
|
|
92
104
|
return this;
|
|
93
105
|
}
|
|
106
|
+
/**
|
|
107
|
+
* Set a custom entrypoint getter function. By default, the entrypoint getter
|
|
108
|
+
* returns the node passed in as the sole entrypoint.
|
|
109
|
+
*/
|
|
110
|
+
setEntrypointsGetter(fn) {
|
|
111
|
+
this.getEntrypoints = fn;
|
|
112
|
+
return this;
|
|
113
|
+
}
|
|
94
114
|
/**
|
|
95
115
|
* Add a default function fn to be used on nodes whose types do not have handlers.
|
|
96
116
|
* If this is not set, the default behaviour will be to throw
|
|
@@ -110,6 +130,19 @@ var RegistrarBuilder = class {
|
|
|
110
130
|
return node;
|
|
111
131
|
}, "mergedNodePrehandler");
|
|
112
132
|
const mergedNodeHandler = /* @__PURE__ */ __name(async (node, ancestry) => {
|
|
133
|
+
if (node.name === "_virtualEntrypoint") {
|
|
134
|
+
return {
|
|
135
|
+
key: node.name,
|
|
136
|
+
value: void 0
|
|
137
|
+
};
|
|
138
|
+
}
|
|
139
|
+
const namedHandler = this.namedHandlers[node.name];
|
|
140
|
+
if (namedHandler) {
|
|
141
|
+
return {
|
|
142
|
+
key: node.name,
|
|
143
|
+
value: await namedHandler(node, ancestry)
|
|
144
|
+
};
|
|
145
|
+
}
|
|
113
146
|
for (const { nodeClass, identifier, fn } of this.classHandlers) {
|
|
114
147
|
if (node instanceof nodeClass) {
|
|
115
148
|
return {
|
|
@@ -124,7 +157,24 @@ var RegistrarBuilder = class {
|
|
|
124
157
|
};
|
|
125
158
|
}, "mergedNodeHandler");
|
|
126
159
|
return {
|
|
127
|
-
traverseDependencies: /* @__PURE__ */ __name(async (node) =>
|
|
160
|
+
traverseDependencies: /* @__PURE__ */ __name(async (node) => {
|
|
161
|
+
const entrypoints = this.getEntrypoints(node);
|
|
162
|
+
if (entrypoints.length === 1) return await dfs(node, mergedNodeHandler, mergedNodePrehandler)();
|
|
163
|
+
const dependencies = entrypoints.reduce((acc, cur) => {
|
|
164
|
+
acc[cur.name] = cur;
|
|
165
|
+
return acc;
|
|
166
|
+
}, {});
|
|
167
|
+
let VirtualNode = class VirtualNode extends DependencyNode {
|
|
168
|
+
static {
|
|
169
|
+
__name(this, "VirtualNode");
|
|
170
|
+
}
|
|
171
|
+
};
|
|
172
|
+
const virtualEntrypoint = new VirtualNode({
|
|
173
|
+
name: "_virtualEntrypoint",
|
|
174
|
+
dependencies
|
|
175
|
+
});
|
|
176
|
+
return await dfs(virtualEntrypoint, mergedNodeHandler, mergedNodePrehandler)();
|
|
177
|
+
}, "traverseDependencies")
|
|
128
178
|
};
|
|
129
179
|
}
|
|
130
180
|
};
|
|
@@ -143,5 +193,5 @@ var multiplexOrderedRegistrars = /* @__PURE__ */ __name((...registrars) => {
|
|
|
143
193
|
}, "multiplexOrderedRegistrars");
|
|
144
194
|
|
|
145
195
|
export { RegistrarBuilder, multiplexOrderedRegistrars };
|
|
146
|
-
//# sourceMappingURL=
|
|
147
|
-
//# sourceMappingURL=
|
|
196
|
+
//# sourceMappingURL=H6QNIXMU.js.map
|
|
197
|
+
//# sourceMappingURL=H6QNIXMU.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/registrarBuilder.ts"],"names":["RegistrarBuilder","defaultHandler","namedHandlers","classHandlers","classAliases","getEntrypoints","node","Error","JSON","stringify","addNamedHandler","fn","name","addClassHandler","nodeClass","identifier","find","fromNodeClass","i","handler","prototype","isPrototypeOf","splice","push","addClassAlias","getToNode","alias","setEntrypointsGetter","addDefault","build","mergedNodePrehandler","toNode","mergedNodeHandler","ancestry","key","value","undefined","namedHandler","traverseDependencies","entrypoints","length","dfs","dependencies","reduce","acc","cur","VirtualNode","DependencyNode","virtualEntrypoint","multiplexOrderedRegistrars","registrars","multiplexRegistrar","params","registrar","result"],"mappings":"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","file":"H6QNIXMU.js","sourcesContent":["import type { Dependencies } from '@layerzerolabs/dependency-graph';\nimport { DependencyNode } from '@layerzerolabs/dependency-graph';\nimport type { Registrar } from '@layerzerolabs/dfs';\nimport { dfs } from '@layerzerolabs/dfs';\nexport type { Registrar };\n\ntype NodeClass = new (...args: any[]) => DependencyNode;\ntype AbstractNodeClass = abstract new (...args: any[]) => DependencyNode;\n\n/**\n * <!-- anchor:RegistrarBuilder -->\n * A builder class for a {@link Registrar}.\n * Builds a registrar that switches on node class--i.e., enables defining\n * specific registration behaviour for specific node classes.\n * Intelligently handles inheritance, always using the most specific\n * handler defined for any given class.\n * The registrar built shall return an object that maps from a handler ID,\n * to a map from node name to the return of each handler,\n * e.g., { objectNodes: { myObjectNode: 'my handler return' }}.\n * This can be used to extract a specific resolved value after resolving the tree,\n * given that the handlers return the resolved nodes.\n */\nexport class RegistrarBuilder<_ReturnTypes> {\n protected defaultHandler: (node: DependencyNode, ancestry: DependencyNode[]) => Promise<any>;\n\n protected namedHandlers: Record<\n string,\n (node: DependencyNode, ancestry: DependencyNode[]) => Promise<any>\n > = {};\n\n protected classHandlers: {\n nodeClass: AbstractNodeClass;\n identifier: string;\n fn: (node: DependencyNode, ancestry: DependencyNode[]) => Promise<any>;\n }[] = [];\n\n protected classAliases: {\n fromNodeClass: AbstractNodeClass;\n getToNode: (from: DependencyNode) => DependencyNode;\n }[] = [];\n\n protected getEntrypoints: (node: DependencyNode) => DependencyNode[] = (node) => [node];\n\n constructor() {\n this.defaultHandler = async (node: DependencyNode) => {\n throw new Error(\n `This registrar does not provide a handler for the dependency type used by ${JSON.stringify(node)}`,\n );\n };\n }\n\n public addNamedHandler<\n Node extends DependencyNode,\n Function extends (node: Node, ancestry: DependencyNode[]) => Promise<any>,\n >(node: DependencyNode, fn: Function) {\n if (this.namedHandlers[node.name]) {\n throw new Error(\n `Cannot define a named handler for an identifier that already has a handler: ${node.name}`,\n );\n }\n this.namedHandlers[node.name] = fn as unknown as (\n node: DependencyNode,\n ancestry: DependencyNode[],\n ) => Promise<any>;\n return this as RegistrarBuilder<\n _ReturnTypes & {\n ['namedHandlers']: { [nodeName: string]: Awaited<ReturnType<Function>> };\n }\n >;\n }\n\n /**\n * Add a function fn to be called on all nodes of class\n * @param nodeClass\n * @param identifier\n * @param fn\n */\n public addClassHandler<\n Identifier extends string,\n _NodeClass extends NodeClass,\n Function extends (node: InstanceType<_NodeClass>, ancestry: DependencyNode[]) => any,\n >(nodeClass: _NodeClass, identifier: Identifier, fn: Function) {\n if (this.classAliases.find(({ fromNodeClass }) => fromNodeClass === nodeClass)) {\n throw new Error(\n `Cannot define a handler for a class that is aliased to something else. This would be pointless`,\n );\n }\n\n let i = 0;\n for (const handler of this.classHandlers) {\n //check if we are overriding an existing handler\n if (handler.nodeClass === nodeClass) {\n this.classHandlers[i] = {\n nodeClass,\n identifier,\n fn: fn as unknown as (node: DependencyNode) => Promise<any>,\n };\n\n return this as RegistrarBuilder<\n _ReturnTypes & {\n [_K in Identifier]: { [nodeName: string]: Awaited<ReturnType<Function>> };\n }\n >;\n }\n //check if the new handler has an ordering requirement against an existing handler\n //(we always want to use more specific handlers if they exist)\n // eslint-disable-next-line no-prototype-builtins\n if (handler.nodeClass.prototype.isPrototypeOf(nodeClass.prototype)) {\n this.classHandlers.splice(i, 0, {\n nodeClass,\n identifier,\n fn: fn as unknown as (node: DependencyNode) => Promise<any>,\n });\n\n return this as RegistrarBuilder<\n _ReturnTypes & {\n [_K in Identifier]: { [nodeName: string]: Awaited<ReturnType<Function>> };\n }\n >;\n }\n i++;\n }\n\n this.classHandlers.push({\n nodeClass,\n identifier,\n fn: fn as unknown as (node: DependencyNode) => Promise<any>,\n });\n\n return this as RegistrarBuilder<\n _ReturnTypes & {\n [_K in Identifier]: { [nodeName: string]: Awaited<ReturnType<Function>> };\n }\n >;\n }\n\n /**\n * Alias some class *from*, such that any node of that class in the tree will be\n * treated as though it were some other node *to*. The *to* node is given as a\n * function returning a class instance, so that its dependencies, name, etc can be fixed.\n * The registrar will ignore the dependencies of the original node, and follow the alias's\n * dependencies instead.\n *\n * Additionally, this method does not affect the typing of the registrar. The output type\n * of the build() method will not reflect the alias.\n *\n * @param fromNodeClass alias instances of this class\n * @param getToNode method that returns the *to* part of the alias\n */\n public addClassAlias<FromNodeClass extends AbstractNodeClass>(\n fromNodeClass: FromNodeClass,\n getToNode: (fromNodeInstance: InstanceType<FromNodeClass>) => DependencyNode,\n ) {\n if (this.classHandlers.find(({ nodeClass }) => nodeClass === fromNodeClass)) {\n throw new Error(`Cannot define an alias for a class that already has a handler`);\n }\n\n let i = 0;\n for (const alias of this.classAliases) {\n //check if we are overriding an existing alias\n if (alias.fromNodeClass === fromNodeClass) {\n this.classAliases[i] = {\n fromNodeClass,\n getToNode: getToNode as unknown as (from: DependencyNode) => DependencyNode,\n };\n\n return this;\n }\n //check if the new alias has an ordering requirement against an existing alias\n //(we always want to use more specific handlers if they exist)\n // eslint-disable-next-line no-prototype-builtins\n if (alias.fromNodeClass.prototype.isPrototypeOf(fromNodeClass.prototype)) {\n this.classAliases.splice(i, 0, {\n fromNodeClass,\n getToNode: getToNode as unknown as (from: DependencyNode) => DependencyNode,\n });\n\n return this;\n }\n i++;\n }\n\n this.classAliases.push({\n fromNodeClass,\n getToNode: getToNode as unknown as (from: DependencyNode) => DependencyNode,\n });\n\n return this;\n }\n\n /**\n * Set a custom entrypoint getter function. By default, the entrypoint getter\n * returns the node passed in as the sole entrypoint.\n */\n public setEntrypointsGetter(fn: (node: DependencyNode) => DependencyNode[]) {\n this.getEntrypoints = fn;\n return this;\n }\n\n /**\n * Add a default function fn to be used on nodes whose types do not have handlers.\n * If this is not set, the default behaviour will be to throw\n * @param fn\n */\n public addDefault(fn: (node: DependencyNode, ancestry: DependencyNode[]) => any) {\n this.defaultHandler = fn;\n return this;\n }\n\n public build(): Registrar<_ReturnTypes> {\n const mergedNodePrehandler = (node: DependencyNode) => {\n for (const { fromNodeClass, getToNode: toNode } of this.classAliases) {\n if (node instanceof fromNodeClass) {\n return toNode(node);\n }\n }\n return node;\n };\n\n const mergedNodeHandler = async (node: DependencyNode, ancestry: DependencyNode[]) => {\n if (node.name === '_virtualEntrypoint') {\n return {\n key: node.name,\n value: undefined,\n };\n }\n\n const namedHandler = this.namedHandlers[node.name];\n if (namedHandler) {\n return {\n key: node.name,\n value: await namedHandler(node, ancestry),\n };\n }\n\n for (const { nodeClass, identifier, fn } of this.classHandlers) {\n if (node instanceof nodeClass) {\n return {\n key: identifier,\n value: await fn(node, ancestry),\n };\n }\n }\n\n return {\n key: 'default',\n value: await this.defaultHandler(node, ancestry),\n };\n };\n return {\n traverseDependencies: async (node: DependencyNode) => {\n const entrypoints = this.getEntrypoints(node);\n if (entrypoints.length === 1)\n return await dfs<_ReturnTypes>(node, mergedNodeHandler, mergedNodePrehandler)();\n\n const dependencies = entrypoints.reduce((acc, cur) => {\n acc[cur.name] = cur;\n return acc;\n }, {} as Dependencies);\n\n class VirtualNode extends DependencyNode {}\n\n const virtualEntrypoint = new VirtualNode({\n name: '_virtualEntrypoint',\n dependencies,\n });\n\n return await dfs<_ReturnTypes>(\n virtualEntrypoint,\n mergedNodeHandler,\n mergedNodePrehandler,\n )();\n },\n };\n }\n}\n\nexport const multiplexOrderedRegistrars = <\n const T extends [name: string, registrar: Registrar<{}>][],\n>(\n ...registrars: T\n) => {\n const multiplexRegistrar: Registrar<{\n [K in Extract<keyof T, number> as T[K] extends readonly [infer Name extends string, any]\n ? Name\n : never]: T[K] extends readonly [any, Registrar<infer Ret>] ? Ret : never;\n }> = {\n traverseDependencies: async (\n ...params: Parameters<Registrar<any>['traverseDependencies']>\n ) => {\n const acc: Record<string, any> = {};\n for (const [name, registrar] of registrars) {\n const result = await registrar.traverseDependencies(...params);\n acc[name] = result;\n }\n\n return acc;\n },\n } as any;\n\n return multiplexRegistrar;\n};\n"]}
|
package/dist/index.cjs
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
'use strict';
|
|
2
2
|
|
|
3
3
|
var JKTGUQY4_cjs = require('./JKTGUQY4.cjs');
|
|
4
|
-
var
|
|
4
|
+
var _3AKKEY5J_cjs = require('./3AKKEY5J.cjs');
|
|
5
5
|
var OIBEOODK_cjs = require('./OIBEOODK.cjs');
|
|
6
6
|
var VTYVOFLM_cjs = require('./VTYVOFLM.cjs');
|
|
7
7
|
require('./YJF4D23A.cjs');
|
|
@@ -14,11 +14,11 @@ Object.defineProperty(exports, "DependencyStore", {
|
|
|
14
14
|
});
|
|
15
15
|
Object.defineProperty(exports, "RegistrarBuilder", {
|
|
16
16
|
enumerable: true,
|
|
17
|
-
get: function () { return
|
|
17
|
+
get: function () { return _3AKKEY5J_cjs.RegistrarBuilder; }
|
|
18
18
|
});
|
|
19
19
|
Object.defineProperty(exports, "multiplexOrderedRegistrars", {
|
|
20
20
|
enumerable: true,
|
|
21
|
-
get: function () { return
|
|
21
|
+
get: function () { return _3AKKEY5J_cjs.multiplexOrderedRegistrars; }
|
|
22
22
|
});
|
|
23
23
|
Object.defineProperty(exports, "extractSchemaFromFactory", {
|
|
24
24
|
enumerable: true,
|
package/dist/index.js
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
export { DependencyStore } from './JJBD65HU.js';
|
|
2
|
-
export { RegistrarBuilder, multiplexOrderedRegistrars } from './
|
|
2
|
+
export { RegistrarBuilder, multiplexOrderedRegistrars } from './H6QNIXMU.js';
|
|
3
3
|
export { extractSchemaFromFactory } from './EAPC6542.js';
|
|
4
4
|
export { FactoryDefinition, ObjectDefinition, deserializeDimensions, serializeDimensions } from './NQBJGAQC.js';
|
|
5
5
|
import './VUOMXK5T.js';
|
|
@@ -1,17 +1,17 @@
|
|
|
1
1
|
'use strict';
|
|
2
2
|
|
|
3
|
-
var
|
|
3
|
+
var _3AKKEY5J_cjs = require('./3AKKEY5J.cjs');
|
|
4
4
|
require('./YJF4D23A.cjs');
|
|
5
5
|
|
|
6
6
|
|
|
7
7
|
|
|
8
8
|
Object.defineProperty(exports, "RegistrarBuilder", {
|
|
9
9
|
enumerable: true,
|
|
10
|
-
get: function () { return
|
|
10
|
+
get: function () { return _3AKKEY5J_cjs.RegistrarBuilder; }
|
|
11
11
|
});
|
|
12
12
|
Object.defineProperty(exports, "multiplexOrderedRegistrars", {
|
|
13
13
|
enumerable: true,
|
|
14
|
-
get: function () { return
|
|
14
|
+
get: function () { return _3AKKEY5J_cjs.multiplexOrderedRegistrars; }
|
|
15
15
|
});
|
|
16
16
|
//# sourceMappingURL=registrarBuilder.cjs.map
|
|
17
17
|
//# sourceMappingURL=registrarBuilder.cjs.map
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import
|
|
1
|
+
import { DependencyNode } from '@layerzerolabs/dependency-graph';
|
|
2
2
|
import type { Registrar } from '@layerzerolabs/dfs';
|
|
3
3
|
export type { Registrar };
|
|
4
4
|
type NodeClass = new (...args: any[]) => DependencyNode;
|
|
@@ -18,7 +18,7 @@ type AbstractNodeClass = abstract new (...args: any[]) => DependencyNode;
|
|
|
18
18
|
*/
|
|
19
19
|
export declare class RegistrarBuilder<_ReturnTypes> {
|
|
20
20
|
protected defaultHandler: (node: DependencyNode, ancestry: DependencyNode[]) => Promise<any>;
|
|
21
|
-
|
|
21
|
+
protected namedHandlers: Record<string, (node: DependencyNode, ancestry: DependencyNode[]) => Promise<any>>;
|
|
22
22
|
protected classHandlers: {
|
|
23
23
|
nodeClass: AbstractNodeClass;
|
|
24
24
|
identifier: string;
|
|
@@ -28,6 +28,13 @@ export declare class RegistrarBuilder<_ReturnTypes> {
|
|
|
28
28
|
fromNodeClass: AbstractNodeClass;
|
|
29
29
|
getToNode: (from: DependencyNode) => DependencyNode;
|
|
30
30
|
}[];
|
|
31
|
+
protected getEntrypoints: (node: DependencyNode) => DependencyNode[];
|
|
32
|
+
constructor();
|
|
33
|
+
addNamedHandler<Node extends DependencyNode, Function extends (node: Node, ancestry: DependencyNode[]) => Promise<any>>(node: DependencyNode, fn: Function): RegistrarBuilder<_ReturnTypes & {
|
|
34
|
+
["namedHandlers"]: {
|
|
35
|
+
[nodeName: string]: Awaited<ReturnType<Function>>;
|
|
36
|
+
};
|
|
37
|
+
}>;
|
|
31
38
|
/**
|
|
32
39
|
* Add a function fn to be called on all nodes of class
|
|
33
40
|
* @param nodeClass
|
|
@@ -51,6 +58,11 @@ export declare class RegistrarBuilder<_ReturnTypes> {
|
|
|
51
58
|
* @param getToNode method that returns the *to* part of the alias
|
|
52
59
|
*/
|
|
53
60
|
addClassAlias<FromNodeClass extends AbstractNodeClass>(fromNodeClass: FromNodeClass, getToNode: (fromNodeInstance: InstanceType<FromNodeClass>) => DependencyNode): this;
|
|
61
|
+
/**
|
|
62
|
+
* Set a custom entrypoint getter function. By default, the entrypoint getter
|
|
63
|
+
* returns the node passed in as the sole entrypoint.
|
|
64
|
+
*/
|
|
65
|
+
setEntrypointsGetter(fn: (node: DependencyNode) => DependencyNode[]): this;
|
|
54
66
|
/**
|
|
55
67
|
* Add a default function fn to be used on nodes whose types do not have handlers.
|
|
56
68
|
* If this is not set, the default behaviour will be to throw
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"registrarBuilder.d.ts","sourceRoot":"","sources":["../src/registrarBuilder.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"registrarBuilder.d.ts","sourceRoot":"","sources":["../src/registrarBuilder.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,cAAc,EAAE,MAAM,iCAAiC,CAAC;AACjE,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,oBAAoB,CAAC;AAEpD,YAAY,EAAE,SAAS,EAAE,CAAC;AAE1B,KAAK,SAAS,GAAG,KAAK,GAAG,IAAI,EAAE,GAAG,EAAE,KAAK,cAAc,CAAC;AACxD,KAAK,iBAAiB,GAAG,QAAQ,MAAM,GAAG,IAAI,EAAE,GAAG,EAAE,KAAK,cAAc,CAAC;AAEzE;;;;;;;;;;;;GAYG;AACH,qBAAa,gBAAgB,CAAC,YAAY;IACtC,SAAS,CAAC,cAAc,EAAE,CAAC,IAAI,EAAE,cAAc,EAAE,QAAQ,EAAE,cAAc,EAAE,KAAK,OAAO,CAAC,GAAG,CAAC,CAAC;IAE7F,SAAS,CAAC,aAAa,EAAE,MAAM,CAC3B,MAAM,EACN,CAAC,IAAI,EAAE,cAAc,EAAE,QAAQ,EAAE,cAAc,EAAE,KAAK,OAAO,CAAC,GAAG,CAAC,CACrE,CAAM;IAEP,SAAS,CAAC,aAAa,EAAE;QACrB,SAAS,EAAE,iBAAiB,CAAC;QAC7B,UAAU,EAAE,MAAM,CAAC;QACnB,EAAE,EAAE,CAAC,IAAI,EAAE,cAAc,EAAE,QAAQ,EAAE,cAAc,EAAE,KAAK,OAAO,CAAC,GAAG,CAAC,CAAC;KAC1E,EAAE,CAAM;IAET,SAAS,CAAC,YAAY,EAAE;QACpB,aAAa,EAAE,iBAAiB,CAAC;QACjC,SAAS,EAAE,CAAC,IAAI,EAAE,cAAc,KAAK,cAAc,CAAC;KACvD,EAAE,CAAM;IAET,SAAS,CAAC,cAAc,EAAE,CAAC,IAAI,EAAE,cAAc,KAAK,cAAc,EAAE,CAAoB;;IAUjF,eAAe,CAClB,IAAI,SAAS,cAAc,EAC3B,QAAQ,SAAS,CAAC,IAAI,EAAE,IAAI,EAAE,QAAQ,EAAE,cAAc,EAAE,KAAK,OAAO,CAAC,GAAG,CAAC,EAC3E,IAAI,EAAE,cAAc,EAAE,EAAE,EAAE,QAAQ,GAUjB,gBAAgB,CAC3B,YAAY,GAAG;QACX,CAAC,eAAe,CAAC,EAAE;YAAE,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,UAAU,CAAC,QAAQ,CAAC,CAAC,CAAA;SAAE,CAAC;KAC5E,CACJ;IAGL;;;;;OAKG;IACI,eAAe,CAClB,UAAU,SAAS,MAAM,EACzB,UAAU,SAAS,SAAS,EAC5B,QAAQ,SAAS,CAAC,IAAI,EAAE,YAAY,CAAC,UAAU,CAAC,EAAE,QAAQ,EAAE,cAAc,EAAE,KAAK,GAAG,EACtF,SAAS,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,EAAE,EAAE,QAAQ,sCAmBxC,EAAE;;;IAoCvB;;;;;;;;;;;;OAYG;IACI,aAAa,CAAC,aAAa,SAAS,iBAAiB,EACxD,aAAa,EAAE,aAAa,EAC5B,SAAS,EAAE,CAAC,gBAAgB,EAAE,YAAY,CAAC,aAAa,CAAC,KAAK,cAAc;IAuChF;;;OAGG;IACI,oBAAoB,CAAC,EAAE,EAAE,CAAC,IAAI,EAAE,cAAc,KAAK,cAAc,EAAE;IAK1E;;;;OAIG;IACI,UAAU,CAAC,EAAE,EAAE,CAAC,IAAI,EAAE,cAAc,EAAE,QAAQ,EAAE,cAAc,EAAE,KAAK,GAAG;IAKxE,KAAK,IAAI,SAAS,CAAC,YAAY,CAAC;CAkE1C;AAED,eAAO,MAAM,0BAA0B,GACnC,KAAK,CAAC,CAAC,SAAS,CAAC,IAAI,EAAE,MAAM,EAAE,SAAS,EAAE,SAAS,CAAC,EAAE,CAAC,CAAC,EAAE,EAE1D,GAAG,YAAY,CAAC,kBAGX,CAAC,6DAA6D,IAAI,mFAET,GAAG,oBAgBpE,CAAC"}
|
package/dist/registrarBuilder.js
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
export { RegistrarBuilder, multiplexOrderedRegistrars } from './
|
|
1
|
+
export { RegistrarBuilder, multiplexOrderedRegistrars } from './H6QNIXMU.js';
|
|
2
2
|
import './VUOMXK5T.js';
|
|
3
3
|
//# sourceMappingURL=registrarBuilder.js.map
|
|
4
4
|
//# sourceMappingURL=registrarBuilder.js.map
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@layerzerolabs/base-definitions",
|
|
3
|
-
"version": "0.2.
|
|
3
|
+
"version": "0.2.7",
|
|
4
4
|
"private": false,
|
|
5
5
|
"license": "MIT",
|
|
6
6
|
"type": "module",
|
|
@@ -15,16 +15,16 @@
|
|
|
15
15
|
"types": "./dist/index.d.ts",
|
|
16
16
|
"dependencies": {
|
|
17
17
|
"zod": "3.25.56",
|
|
18
|
-
"@layerzerolabs/common-utils": "0.2.
|
|
19
|
-
"@layerzerolabs/dependency-graph": "0.2.
|
|
20
|
-
"@layerzerolabs/
|
|
21
|
-
"@layerzerolabs/
|
|
18
|
+
"@layerzerolabs/common-utils": "0.2.7",
|
|
19
|
+
"@layerzerolabs/dependency-graph": "0.2.7",
|
|
20
|
+
"@layerzerolabs/dfs": "0.2.7",
|
|
21
|
+
"@layerzerolabs/typescript-utils": "0.2.7"
|
|
22
22
|
},
|
|
23
23
|
"devDependencies": {
|
|
24
24
|
"tsup": "^8.4.0",
|
|
25
25
|
"vitest": "^3.2.3",
|
|
26
|
-
"@layerzerolabs/tsup-configuration": "0.2.
|
|
27
|
-
"@layerzerolabs/typescript-configuration": "0.2.
|
|
26
|
+
"@layerzerolabs/tsup-configuration": "0.2.7",
|
|
27
|
+
"@layerzerolabs/typescript-configuration": "0.2.7"
|
|
28
28
|
},
|
|
29
29
|
"publishConfig": {
|
|
30
30
|
"access": "restricted",
|
package/src/registrarBuilder.ts
CHANGED
|
@@ -1,4 +1,5 @@
|
|
|
1
|
-
import type {
|
|
1
|
+
import type { Dependencies } from '@layerzerolabs/dependency-graph';
|
|
2
|
+
import { DependencyNode } from '@layerzerolabs/dependency-graph';
|
|
2
3
|
import type { Registrar } from '@layerzerolabs/dfs';
|
|
3
4
|
import { dfs } from '@layerzerolabs/dfs';
|
|
4
5
|
export type { Registrar };
|
|
@@ -21,13 +22,11 @@ type AbstractNodeClass = abstract new (...args: any[]) => DependencyNode;
|
|
|
21
22
|
*/
|
|
22
23
|
export class RegistrarBuilder<_ReturnTypes> {
|
|
23
24
|
protected defaultHandler: (node: DependencyNode, ancestry: DependencyNode[]) => Promise<any>;
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
};
|
|
30
|
-
}
|
|
25
|
+
|
|
26
|
+
protected namedHandlers: Record<
|
|
27
|
+
string,
|
|
28
|
+
(node: DependencyNode, ancestry: DependencyNode[]) => Promise<any>
|
|
29
|
+
> = {};
|
|
31
30
|
|
|
32
31
|
protected classHandlers: {
|
|
33
32
|
nodeClass: AbstractNodeClass;
|
|
@@ -40,6 +39,36 @@ export class RegistrarBuilder<_ReturnTypes> {
|
|
|
40
39
|
getToNode: (from: DependencyNode) => DependencyNode;
|
|
41
40
|
}[] = [];
|
|
42
41
|
|
|
42
|
+
protected getEntrypoints: (node: DependencyNode) => DependencyNode[] = (node) => [node];
|
|
43
|
+
|
|
44
|
+
constructor() {
|
|
45
|
+
this.defaultHandler = async (node: DependencyNode) => {
|
|
46
|
+
throw new Error(
|
|
47
|
+
`This registrar does not provide a handler for the dependency type used by ${JSON.stringify(node)}`,
|
|
48
|
+
);
|
|
49
|
+
};
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
public addNamedHandler<
|
|
53
|
+
Node extends DependencyNode,
|
|
54
|
+
Function extends (node: Node, ancestry: DependencyNode[]) => Promise<any>,
|
|
55
|
+
>(node: DependencyNode, fn: Function) {
|
|
56
|
+
if (this.namedHandlers[node.name]) {
|
|
57
|
+
throw new Error(
|
|
58
|
+
`Cannot define a named handler for an identifier that already has a handler: ${node.name}`,
|
|
59
|
+
);
|
|
60
|
+
}
|
|
61
|
+
this.namedHandlers[node.name] = fn as unknown as (
|
|
62
|
+
node: DependencyNode,
|
|
63
|
+
ancestry: DependencyNode[],
|
|
64
|
+
) => Promise<any>;
|
|
65
|
+
return this as RegistrarBuilder<
|
|
66
|
+
_ReturnTypes & {
|
|
67
|
+
['namedHandlers']: { [nodeName: string]: Awaited<ReturnType<Function>> };
|
|
68
|
+
}
|
|
69
|
+
>;
|
|
70
|
+
}
|
|
71
|
+
|
|
43
72
|
/**
|
|
44
73
|
* Add a function fn to be called on all nodes of class
|
|
45
74
|
* @param nodeClass
|
|
@@ -159,6 +188,15 @@ export class RegistrarBuilder<_ReturnTypes> {
|
|
|
159
188
|
return this;
|
|
160
189
|
}
|
|
161
190
|
|
|
191
|
+
/**
|
|
192
|
+
* Set a custom entrypoint getter function. By default, the entrypoint getter
|
|
193
|
+
* returns the node passed in as the sole entrypoint.
|
|
194
|
+
*/
|
|
195
|
+
public setEntrypointsGetter(fn: (node: DependencyNode) => DependencyNode[]) {
|
|
196
|
+
this.getEntrypoints = fn;
|
|
197
|
+
return this;
|
|
198
|
+
}
|
|
199
|
+
|
|
162
200
|
/**
|
|
163
201
|
* Add a default function fn to be used on nodes whose types do not have handlers.
|
|
164
202
|
* If this is not set, the default behaviour will be to throw
|
|
@@ -180,6 +218,21 @@ export class RegistrarBuilder<_ReturnTypes> {
|
|
|
180
218
|
};
|
|
181
219
|
|
|
182
220
|
const mergedNodeHandler = async (node: DependencyNode, ancestry: DependencyNode[]) => {
|
|
221
|
+
if (node.name === '_virtualEntrypoint') {
|
|
222
|
+
return {
|
|
223
|
+
key: node.name,
|
|
224
|
+
value: undefined,
|
|
225
|
+
};
|
|
226
|
+
}
|
|
227
|
+
|
|
228
|
+
const namedHandler = this.namedHandlers[node.name];
|
|
229
|
+
if (namedHandler) {
|
|
230
|
+
return {
|
|
231
|
+
key: node.name,
|
|
232
|
+
value: await namedHandler(node, ancestry),
|
|
233
|
+
};
|
|
234
|
+
}
|
|
235
|
+
|
|
183
236
|
for (const { nodeClass, identifier, fn } of this.classHandlers) {
|
|
184
237
|
if (node instanceof nodeClass) {
|
|
185
238
|
return {
|
|
@@ -195,8 +248,29 @@ export class RegistrarBuilder<_ReturnTypes> {
|
|
|
195
248
|
};
|
|
196
249
|
};
|
|
197
250
|
return {
|
|
198
|
-
traverseDependencies: async (node: DependencyNode) =>
|
|
199
|
-
|
|
251
|
+
traverseDependencies: async (node: DependencyNode) => {
|
|
252
|
+
const entrypoints = this.getEntrypoints(node);
|
|
253
|
+
if (entrypoints.length === 1)
|
|
254
|
+
return await dfs<_ReturnTypes>(node, mergedNodeHandler, mergedNodePrehandler)();
|
|
255
|
+
|
|
256
|
+
const dependencies = entrypoints.reduce((acc, cur) => {
|
|
257
|
+
acc[cur.name] = cur;
|
|
258
|
+
return acc;
|
|
259
|
+
}, {} as Dependencies);
|
|
260
|
+
|
|
261
|
+
class VirtualNode extends DependencyNode {}
|
|
262
|
+
|
|
263
|
+
const virtualEntrypoint = new VirtualNode({
|
|
264
|
+
name: '_virtualEntrypoint',
|
|
265
|
+
dependencies,
|
|
266
|
+
});
|
|
267
|
+
|
|
268
|
+
return await dfs<_ReturnTypes>(
|
|
269
|
+
virtualEntrypoint,
|
|
270
|
+
mergedNodeHandler,
|
|
271
|
+
mergedNodePrehandler,
|
|
272
|
+
)();
|
|
273
|
+
},
|
|
200
274
|
};
|
|
201
275
|
}
|
|
202
276
|
}
|
|
@@ -120,3 +120,56 @@ describe('Registrar builder', () => {
|
|
|
120
120
|
});
|
|
121
121
|
});
|
|
122
122
|
});
|
|
123
|
+
|
|
124
|
+
describe('Named handlers', () => {
|
|
125
|
+
test('Named handlers should take priority over class handlers', async () => {
|
|
126
|
+
let classHandlerCalled = false;
|
|
127
|
+
let namedHandlerCalled = false;
|
|
128
|
+
|
|
129
|
+
const builder = new RegistrarBuilder()
|
|
130
|
+
.addClassHandler(SimpleClassA, 'simpleA', async () => {
|
|
131
|
+
classHandlerCalled = true;
|
|
132
|
+
return 'from-class';
|
|
133
|
+
})
|
|
134
|
+
.addNamedHandler(mySimpleClassA1, async () => {
|
|
135
|
+
namedHandlerCalled = true;
|
|
136
|
+
return 'from-named';
|
|
137
|
+
})
|
|
138
|
+
.build();
|
|
139
|
+
|
|
140
|
+
await builder.traverseDependencies(mySimpleClassA1);
|
|
141
|
+
|
|
142
|
+
expect(namedHandlerCalled).toBe(true);
|
|
143
|
+
expect(classHandlerCalled).toBe(false);
|
|
144
|
+
});
|
|
145
|
+
|
|
146
|
+
test('Named handlers should be invoked with correct arguments and return values', async () => {
|
|
147
|
+
let receivedNode: DependencyNode | undefined;
|
|
148
|
+
let receivedAncestry: DependencyNode[] | undefined;
|
|
149
|
+
|
|
150
|
+
const builder = new RegistrarBuilder()
|
|
151
|
+
.addNamedHandler(mySimpleClassA1, async (node, ancestry) => {
|
|
152
|
+
receivedNode = node;
|
|
153
|
+
receivedAncestry = ancestry;
|
|
154
|
+
return 'named-result';
|
|
155
|
+
})
|
|
156
|
+
.build();
|
|
157
|
+
|
|
158
|
+
const result = await builder.traverseDependencies(mySimpleClassA1);
|
|
159
|
+
|
|
160
|
+
expect(receivedNode).toBe(mySimpleClassA1);
|
|
161
|
+
expect(receivedAncestry).toStrictEqual([]);
|
|
162
|
+
// Result is grouped by handler identifier (node name for named handlers)
|
|
163
|
+
expect(result).toStrictEqual({ MySimpleClassA: { MySimpleClassA: 'named-result' } });
|
|
164
|
+
});
|
|
165
|
+
|
|
166
|
+
test('Registering duplicate named handlers should throw', () => {
|
|
167
|
+
expect(() => {
|
|
168
|
+
new RegistrarBuilder()
|
|
169
|
+
.addNamedHandler(mySimpleClassA1, async () => 'first')
|
|
170
|
+
.addNamedHandler(mySimpleClassA1, async () => 'second');
|
|
171
|
+
}).toThrow(
|
|
172
|
+
'Cannot define a named handler for an identifier that already has a handler: MySimpleClassA',
|
|
173
|
+
);
|
|
174
|
+
});
|
|
175
|
+
});
|
package/dist/4DUQS2FO.js.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/registrarBuilder.ts"],"names":["RegistrarBuilder","defaultHandler","node","Error","JSON","stringify","classHandlers","classAliases","addClassHandler","nodeClass","identifier","fn","find","fromNodeClass","i","handler","prototype","isPrototypeOf","splice","push","addClassAlias","getToNode","alias","addDefault","build","mergedNodePrehandler","toNode","mergedNodeHandler","ancestry","key","value","traverseDependencies","dfs","multiplexOrderedRegistrars","registrars","multiplexRegistrar","params","acc","name","registrar","result"],"mappings":";;;AAqBO,IAAMA,mBAAN,MAAMA;EAnBb;;;AAoBcC,EAAAA,cAAAA;EACV,WAAA,GAAc;AACV,IAAA,IAAA,CAAKA,cAAAA,GAAiB,OAAOC,IAAAA,KAAAA;AACzB,MAAA,MAAM,IAAIC,KAAAA,CACN,CAAA,0EAAA,EAA6EC,KAAKC,SAAAA,CAAUH,IAAAA,CAAAA,CAAAA,CAAO,CAAA;AAE3G,IAAA,CAAA;AACJ,EAAA;AAEUI,EAAAA,aAAAA,GAIJ,EAAA;AAEIC,EAAAA,YAAAA,GAGJ,EAAA;;;;;;;EAQCC,eAAAA,CAILC,SAAAA,EAAuBC,YAAwBC,EAAAA,EAAc;AAC3D,IAAA,IAAI,IAAA,CAAKJ,aAAaK,IAAAA,CAAK,CAAC,EAAEC,aAAAA,EAAa,KAAOA,aAAAA,KAAkBJ,SAAAA,CAAAA,EAAY;AAC5E,MAAA,MAAM,IAAIN,MACN,CAAA,8FAAA,CAAgG,CAAA;AAExG,IAAA;AAEA,IAAA,IAAIW,CAAAA,GAAI,CAAA;AACR,IAAA,KAAA,MAAWC,OAAAA,IAAW,KAAKT,aAAAA,EAAe;AAEtC,MAAA,IAAIS,OAAAA,CAAQN,cAAcA,SAAAA,EAAW;AACjC,QAAA,IAAA,CAAKH,aAAAA,CAAcQ,CAAAA,CAAAA,GAAK;AACpBL,UAAAA,SAAAA;AACAC,UAAAA,UAAAA;AACAC,UAAAA;AACJ,SAAA;AAEA,QAAA,OAAO,IAAA;AAKX,MAAA;AAIA,MAAA,IAAII,QAAQN,SAAAA,CAAUO,SAAAA,CAAUC,aAAAA,CAAcR,SAAAA,CAAUO,SAAS,CAAA,EAAG;AAChE,QAAA,IAAA,CAAKV,aAAAA,CAAcY,MAAAA,CAAOJ,CAAAA,EAAG,CAAA,EAAG;AAC5BL,UAAAA,SAAAA;AACAC,UAAAA,UAAAA;AACAC,UAAAA;SACJ,CAAA;AAEA,QAAA,OAAO,IAAA;AAKX,MAAA;AACAG,MAAAA,CAAAA,EAAAA;AACJ,IAAA;AAEA,IAAA,IAAA,CAAKR,cAAca,IAAAA,CAAK;AACpBV,MAAAA,SAAAA;AACAC,MAAAA,UAAAA;AACAC,MAAAA;KACJ,CAAA;AAEA,IAAA,OAAO,IAAA;AAKX,EAAA;;;;;;;;;;;;;;AAeOS,EAAAA,aAAAA,CACHP,eACAQ,SAAAA,EACF;AACE,IAAA,IAAI,IAAA,CAAKf,cAAcM,IAAAA,CAAK,CAAC,EAAEH,SAAAA,EAAS,KAAOA,SAAAA,KAAcI,aAAAA,CAAAA,EAAgB;AACzE,MAAA,MAAM,IAAIV,MAAM,CAAA,6DAAA,CAA+D,CAAA;AACnF,IAAA;AAEA,IAAA,IAAIW,CAAAA,GAAI,CAAA;AACR,IAAA,KAAA,MAAWQ,KAAAA,IAAS,KAAKf,YAAAA,EAAc;AAEnC,MAAA,IAAIe,KAAAA,CAAMT,kBAAkBA,aAAAA,EAAe;AACvC,QAAA,IAAA,CAAKN,YAAAA,CAAaO,CAAAA,CAAAA,GAAK;AACnBD,UAAAA,aAAAA;AACAQ,UAAAA;AACJ,SAAA;AAEA,QAAA,OAAO,IAAA;AACX,MAAA;AAIA,MAAA,IAAIC,MAAMT,aAAAA,CAAcG,SAAAA,CAAUC,aAAAA,CAAcJ,aAAAA,CAAcG,SAAS,CAAA,EAAG;AACtE,QAAA,IAAA,CAAKT,YAAAA,CAAaW,MAAAA,CAAOJ,CAAAA,EAAG,CAAA,EAAG;AAC3BD,UAAAA,aAAAA;AACAQ,UAAAA;SACJ,CAAA;AAEA,QAAA,OAAO,IAAA;AACX,MAAA;AACAP,MAAAA,CAAAA,EAAAA;AACJ,IAAA;AAEA,IAAA,IAAA,CAAKP,aAAaY,IAAAA,CAAK;AACnBN,MAAAA,aAAAA;AACAQ,MAAAA;KACJ,CAAA;AAEA,IAAA,OAAO,IAAA;AACX,EAAA;;;;;;AAOOE,EAAAA,UAAAA,CAAWZ,EAAAA,EAA+D;AAC7E,IAAA,IAAA,CAAKV,cAAAA,GAAiBU,EAAAA;AACtB,IAAA,OAAO,IAAA;AACX,EAAA;EAEOa,KAAAA,GAAiC;AACpC,IAAA,MAAMC,oBAAAA,2BAAwBvB,IAAAA,KAAAA;AAC1B,MAAA,KAAA,MAAW,EAAEW,aAAAA,EAAeQ,SAAAA,EAAWK,MAAAA,EAAM,IAAM,KAAKnB,YAAAA,EAAc;AAClE,QAAA,IAAIL,gBAAgBW,aAAAA,EAAe;AAC/B,UAAA,OAAOa,OAAOxB,IAAAA,CAAAA;AAClB,QAAA;AACJ,MAAA;AACA,MAAA,OAAOA,IAAAA;IACX,CAAA,EAP6B,sBAAA,CAAA;AAS7B,IAAA,MAAMyB,iBAAAA,mBAAoB,MAAA,CAAA,OAAOzB,IAAAA,EAAsB0B,QAAAA,KAAAA;AACnD,MAAA,KAAA,MAAW,EAAEnB,SAAAA,EAAWC,UAAAA,EAAYC,EAAAA,EAAE,IAAM,KAAKL,aAAAA,EAAe;AAC5D,QAAA,IAAIJ,gBAAgBO,SAAAA,EAAW;AAC3B,UAAA,OAAO;YACHoB,GAAAA,EAAKnB,UAAAA;YACLoB,KAAAA,EAAO,MAAMnB,EAAAA,CAAGT,IAAAA,EAAM0B,QAAAA;AAC1B,WAAA;AACJ,QAAA;AACJ,MAAA;AAEA,MAAA,OAAO;QACHC,GAAAA,EAAK,SAAA;AACLC,QAAAA,KAAAA,EAAO,MAAM,IAAA,CAAK7B,cAAAA,CAAeC,IAAAA,EAAM0B,QAAAA;AAC3C,OAAA;IACJ,CAAA,EAd0B,mBAAA,CAAA;AAe1B,IAAA,OAAO;MACHG,oBAAAA,kBAAsB,MAAA,CAAA,OAAO7B,SACzB,MAAM8B,GAAAA,CAAkB9B,MAAMyB,iBAAAA,EAAmBF,oBAAAA,GAAAA,EAD/B,sBAAA;AAE1B,KAAA;AACJ,EAAA;AACJ;AAEO,IAAMQ,0BAAAA,8BAGNC,UAAAA,KAAAA;AAEH,EAAA,MAAMC,kBAAAA,GAID;AACDJ,IAAAA,oBAAAA,mCACOK,MAAAA,KAAAA;AAEH,MAAA,MAAMC,MAA2B,EAAC;AAClC,MAAA,KAAA,MAAW,CAACC,IAAAA,EAAMC,SAAAA,CAAAA,IAAcL,UAAAA,EAAY;AACxC,QAAA,MAAMM,MAAAA,GAAS,MAAMD,SAAAA,CAAUR,oBAAAA,CAAoB,GAAIK,MAAAA,CAAAA;AACvDC,QAAAA,GAAAA,CAAIC,IAAAA,CAAAA,GAAQE,MAAAA;AAChB,MAAA;AAEA,MAAA,OAAOH,GAAAA;IACX,CAAA,EAVsB,sBAAA;AAW1B,GAAA;AAEA,EAAA,OAAOF,kBAAAA;AACX,CAAA,EAxB0C,4BAAA","file":"4DUQS2FO.js","sourcesContent":["import type { DependencyNode } from '@layerzerolabs/dependency-graph';\nimport type { Registrar } from '@layerzerolabs/dfs';\nimport { dfs } from '@layerzerolabs/dfs';\nexport type { Registrar };\n\ntype NodeClass = new (...args: any[]) => DependencyNode;\ntype AbstractNodeClass = abstract new (...args: any[]) => DependencyNode;\n\n/**\n * <!-- anchor:RegistrarBuilder -->\n * A builder class for a {@link Registrar}.\n * Builds a registrar that switches on node class--i.e., enables defining\n * specific registration behaviour for specific node classes.\n * Intelligently handles inheritance, always using the most specific\n * handler defined for any given class.\n * The registrar built shall return an object that maps from a handler ID,\n * to a map from node name to the return of each handler,\n * e.g., { objectNodes: { myObjectNode: 'my handler return' }}.\n * This can be used to extract a specific resolved value after resolving the tree,\n * given that the handlers return the resolved nodes.\n */\nexport class RegistrarBuilder<_ReturnTypes> {\n protected defaultHandler: (node: DependencyNode, ancestry: DependencyNode[]) => Promise<any>;\n constructor() {\n this.defaultHandler = async (node: DependencyNode) => {\n throw new Error(\n `This registrar does not provide a handler for the dependency type used by ${JSON.stringify(node)}`,\n );\n };\n }\n\n protected classHandlers: {\n nodeClass: AbstractNodeClass;\n identifier: string;\n fn: (node: DependencyNode, ancestry: DependencyNode[]) => Promise<any>;\n }[] = [];\n\n protected classAliases: {\n fromNodeClass: AbstractNodeClass;\n getToNode: (from: DependencyNode) => DependencyNode;\n }[] = [];\n\n /**\n * Add a function fn to be called on all nodes of class\n * @param nodeClass\n * @param identifier\n * @param fn\n */\n public addClassHandler<\n Identifier extends string,\n _NodeClass extends NodeClass,\n Function extends (node: InstanceType<_NodeClass>, ancestry: DependencyNode[]) => any,\n >(nodeClass: _NodeClass, identifier: Identifier, fn: Function) {\n if (this.classAliases.find(({ fromNodeClass }) => fromNodeClass === nodeClass)) {\n throw new Error(\n `Cannot define a handler for a class that is aliased to something else. This would be pointless`,\n );\n }\n\n let i = 0;\n for (const handler of this.classHandlers) {\n //check if we are overriding an existing handler\n if (handler.nodeClass === nodeClass) {\n this.classHandlers[i] = {\n nodeClass,\n identifier,\n fn: fn as unknown as (node: DependencyNode) => Promise<any>,\n };\n\n return this as RegistrarBuilder<\n _ReturnTypes & {\n [_K in Identifier]: { [nodeName: string]: Awaited<ReturnType<Function>> };\n }\n >;\n }\n //check if the new handler has an ordering requirement against an existing handler\n //(we always want to use more specific handlers if they exist)\n // eslint-disable-next-line no-prototype-builtins\n if (handler.nodeClass.prototype.isPrototypeOf(nodeClass.prototype)) {\n this.classHandlers.splice(i, 0, {\n nodeClass,\n identifier,\n fn: fn as unknown as (node: DependencyNode) => Promise<any>,\n });\n\n return this as RegistrarBuilder<\n _ReturnTypes & {\n [_K in Identifier]: { [nodeName: string]: Awaited<ReturnType<Function>> };\n }\n >;\n }\n i++;\n }\n\n this.classHandlers.push({\n nodeClass,\n identifier,\n fn: fn as unknown as (node: DependencyNode) => Promise<any>,\n });\n\n return this as RegistrarBuilder<\n _ReturnTypes & {\n [_K in Identifier]: { [nodeName: string]: Awaited<ReturnType<Function>> };\n }\n >;\n }\n\n /**\n * Alias some class *from*, such that any node of that class in the tree will be\n * treated as though it were some other node *to*. The *to* node is given as a\n * function returning a class instance, so that its dependencies, name, etc can be fixed.\n * The registrar will ignore the dependencies of the original node, and follow the alias's\n * dependencies instead.\n *\n * Additionally, this method does not affect the typing of the registrar. The output type\n * of the build() method will not reflect the alias.\n *\n * @param fromNodeClass alias instances of this class\n * @param getToNode method that returns the *to* part of the alias\n */\n public addClassAlias<FromNodeClass extends AbstractNodeClass>(\n fromNodeClass: FromNodeClass,\n getToNode: (fromNodeInstance: InstanceType<FromNodeClass>) => DependencyNode,\n ) {\n if (this.classHandlers.find(({ nodeClass }) => nodeClass === fromNodeClass)) {\n throw new Error(`Cannot define an alias for a class that already has a handler`);\n }\n\n let i = 0;\n for (const alias of this.classAliases) {\n //check if we are overriding an existing alias\n if (alias.fromNodeClass === fromNodeClass) {\n this.classAliases[i] = {\n fromNodeClass,\n getToNode: getToNode as unknown as (from: DependencyNode) => DependencyNode,\n };\n\n return this;\n }\n //check if the new alias has an ordering requirement against an existing alias\n //(we always want to use more specific handlers if they exist)\n // eslint-disable-next-line no-prototype-builtins\n if (alias.fromNodeClass.prototype.isPrototypeOf(fromNodeClass.prototype)) {\n this.classAliases.splice(i, 0, {\n fromNodeClass,\n getToNode: getToNode as unknown as (from: DependencyNode) => DependencyNode,\n });\n\n return this;\n }\n i++;\n }\n\n this.classAliases.push({\n fromNodeClass,\n getToNode: getToNode as unknown as (from: DependencyNode) => DependencyNode,\n });\n\n return this;\n }\n\n /**\n * Add a default function fn to be used on nodes whose types do not have handlers.\n * If this is not set, the default behaviour will be to throw\n * @param fn\n */\n public addDefault(fn: (node: DependencyNode, ancestry: DependencyNode[]) => any) {\n this.defaultHandler = fn;\n return this;\n }\n\n public build(): Registrar<_ReturnTypes> {\n const mergedNodePrehandler = (node: DependencyNode) => {\n for (const { fromNodeClass, getToNode: toNode } of this.classAliases) {\n if (node instanceof fromNodeClass) {\n return toNode(node);\n }\n }\n return node;\n };\n\n const mergedNodeHandler = async (node: DependencyNode, ancestry: DependencyNode[]) => {\n for (const { nodeClass, identifier, fn } of this.classHandlers) {\n if (node instanceof nodeClass) {\n return {\n key: identifier,\n value: await fn(node, ancestry),\n };\n }\n }\n\n return {\n key: 'default',\n value: await this.defaultHandler(node, ancestry),\n };\n };\n return {\n traverseDependencies: async (node: DependencyNode) =>\n await dfs<_ReturnTypes>(node, mergedNodeHandler, mergedNodePrehandler)(),\n };\n }\n}\n\nexport const multiplexOrderedRegistrars = <\n const T extends [name: string, registrar: Registrar<{}>][],\n>(\n ...registrars: T\n) => {\n const multiplexRegistrar: Registrar<{\n [K in Extract<keyof T, number> as T[K] extends readonly [infer Name extends string, any]\n ? Name\n : never]: T[K] extends readonly [any, Registrar<infer Ret>] ? Ret : never;\n }> = {\n traverseDependencies: async (\n ...params: Parameters<Registrar<any>['traverseDependencies']>\n ) => {\n const acc: Record<string, any> = {};\n for (const [name, registrar] of registrars) {\n const result = await registrar.traverseDependencies(...params);\n acc[name] = result;\n }\n\n return acc;\n },\n } as any;\n\n return multiplexRegistrar;\n};\n"]}
|
package/dist/O7HENH25.cjs.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/registrarBuilder.ts"],"names":["RegistrarBuilder","defaultHandler","node","Error","JSON","stringify","classHandlers","classAliases","addClassHandler","nodeClass","identifier","fn","find","fromNodeClass","i","handler","prototype","isPrototypeOf","splice","push","addClassAlias","getToNode","alias","addDefault","build","mergedNodePrehandler","toNode","mergedNodeHandler","__name","ancestry","key","value","traverseDependencies","dfs","multiplexOrderedRegistrars","registrars","multiplexRegistrar","params","acc","name","registrar","result"],"mappings":"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","file":"O7HENH25.cjs","sourcesContent":["import type { DependencyNode } from '@layerzerolabs/dependency-graph';\nimport type { Registrar } from '@layerzerolabs/dfs';\nimport { dfs } from '@layerzerolabs/dfs';\nexport type { Registrar };\n\ntype NodeClass = new (...args: any[]) => DependencyNode;\ntype AbstractNodeClass = abstract new (...args: any[]) => DependencyNode;\n\n/**\n * <!-- anchor:RegistrarBuilder -->\n * A builder class for a {@link Registrar}.\n * Builds a registrar that switches on node class--i.e., enables defining\n * specific registration behaviour for specific node classes.\n * Intelligently handles inheritance, always using the most specific\n * handler defined for any given class.\n * The registrar built shall return an object that maps from a handler ID,\n * to a map from node name to the return of each handler,\n * e.g., { objectNodes: { myObjectNode: 'my handler return' }}.\n * This can be used to extract a specific resolved value after resolving the tree,\n * given that the handlers return the resolved nodes.\n */\nexport class RegistrarBuilder<_ReturnTypes> {\n protected defaultHandler: (node: DependencyNode, ancestry: DependencyNode[]) => Promise<any>;\n constructor() {\n this.defaultHandler = async (node: DependencyNode) => {\n throw new Error(\n `This registrar does not provide a handler for the dependency type used by ${JSON.stringify(node)}`,\n );\n };\n }\n\n protected classHandlers: {\n nodeClass: AbstractNodeClass;\n identifier: string;\n fn: (node: DependencyNode, ancestry: DependencyNode[]) => Promise<any>;\n }[] = [];\n\n protected classAliases: {\n fromNodeClass: AbstractNodeClass;\n getToNode: (from: DependencyNode) => DependencyNode;\n }[] = [];\n\n /**\n * Add a function fn to be called on all nodes of class\n * @param nodeClass\n * @param identifier\n * @param fn\n */\n public addClassHandler<\n Identifier extends string,\n _NodeClass extends NodeClass,\n Function extends (node: InstanceType<_NodeClass>, ancestry: DependencyNode[]) => any,\n >(nodeClass: _NodeClass, identifier: Identifier, fn: Function) {\n if (this.classAliases.find(({ fromNodeClass }) => fromNodeClass === nodeClass)) {\n throw new Error(\n `Cannot define a handler for a class that is aliased to something else. This would be pointless`,\n );\n }\n\n let i = 0;\n for (const handler of this.classHandlers) {\n //check if we are overriding an existing handler\n if (handler.nodeClass === nodeClass) {\n this.classHandlers[i] = {\n nodeClass,\n identifier,\n fn: fn as unknown as (node: DependencyNode) => Promise<any>,\n };\n\n return this as RegistrarBuilder<\n _ReturnTypes & {\n [_K in Identifier]: { [nodeName: string]: Awaited<ReturnType<Function>> };\n }\n >;\n }\n //check if the new handler has an ordering requirement against an existing handler\n //(we always want to use more specific handlers if they exist)\n // eslint-disable-next-line no-prototype-builtins\n if (handler.nodeClass.prototype.isPrototypeOf(nodeClass.prototype)) {\n this.classHandlers.splice(i, 0, {\n nodeClass,\n identifier,\n fn: fn as unknown as (node: DependencyNode) => Promise<any>,\n });\n\n return this as RegistrarBuilder<\n _ReturnTypes & {\n [_K in Identifier]: { [nodeName: string]: Awaited<ReturnType<Function>> };\n }\n >;\n }\n i++;\n }\n\n this.classHandlers.push({\n nodeClass,\n identifier,\n fn: fn as unknown as (node: DependencyNode) => Promise<any>,\n });\n\n return this as RegistrarBuilder<\n _ReturnTypes & {\n [_K in Identifier]: { [nodeName: string]: Awaited<ReturnType<Function>> };\n }\n >;\n }\n\n /**\n * Alias some class *from*, such that any node of that class in the tree will be\n * treated as though it were some other node *to*. The *to* node is given as a\n * function returning a class instance, so that its dependencies, name, etc can be fixed.\n * The registrar will ignore the dependencies of the original node, and follow the alias's\n * dependencies instead.\n *\n * Additionally, this method does not affect the typing of the registrar. The output type\n * of the build() method will not reflect the alias.\n *\n * @param fromNodeClass alias instances of this class\n * @param getToNode method that returns the *to* part of the alias\n */\n public addClassAlias<FromNodeClass extends AbstractNodeClass>(\n fromNodeClass: FromNodeClass,\n getToNode: (fromNodeInstance: InstanceType<FromNodeClass>) => DependencyNode,\n ) {\n if (this.classHandlers.find(({ nodeClass }) => nodeClass === fromNodeClass)) {\n throw new Error(`Cannot define an alias for a class that already has a handler`);\n }\n\n let i = 0;\n for (const alias of this.classAliases) {\n //check if we are overriding an existing alias\n if (alias.fromNodeClass === fromNodeClass) {\n this.classAliases[i] = {\n fromNodeClass,\n getToNode: getToNode as unknown as (from: DependencyNode) => DependencyNode,\n };\n\n return this;\n }\n //check if the new alias has an ordering requirement against an existing alias\n //(we always want to use more specific handlers if they exist)\n // eslint-disable-next-line no-prototype-builtins\n if (alias.fromNodeClass.prototype.isPrototypeOf(fromNodeClass.prototype)) {\n this.classAliases.splice(i, 0, {\n fromNodeClass,\n getToNode: getToNode as unknown as (from: DependencyNode) => DependencyNode,\n });\n\n return this;\n }\n i++;\n }\n\n this.classAliases.push({\n fromNodeClass,\n getToNode: getToNode as unknown as (from: DependencyNode) => DependencyNode,\n });\n\n return this;\n }\n\n /**\n * Add a default function fn to be used on nodes whose types do not have handlers.\n * If this is not set, the default behaviour will be to throw\n * @param fn\n */\n public addDefault(fn: (node: DependencyNode, ancestry: DependencyNode[]) => any) {\n this.defaultHandler = fn;\n return this;\n }\n\n public build(): Registrar<_ReturnTypes> {\n const mergedNodePrehandler = (node: DependencyNode) => {\n for (const { fromNodeClass, getToNode: toNode } of this.classAliases) {\n if (node instanceof fromNodeClass) {\n return toNode(node);\n }\n }\n return node;\n };\n\n const mergedNodeHandler = async (node: DependencyNode, ancestry: DependencyNode[]) => {\n for (const { nodeClass, identifier, fn } of this.classHandlers) {\n if (node instanceof nodeClass) {\n return {\n key: identifier,\n value: await fn(node, ancestry),\n };\n }\n }\n\n return {\n key: 'default',\n value: await this.defaultHandler(node, ancestry),\n };\n };\n return {\n traverseDependencies: async (node: DependencyNode) =>\n await dfs<_ReturnTypes>(node, mergedNodeHandler, mergedNodePrehandler)(),\n };\n }\n}\n\nexport const multiplexOrderedRegistrars = <\n const T extends [name: string, registrar: Registrar<{}>][],\n>(\n ...registrars: T\n) => {\n const multiplexRegistrar: Registrar<{\n [K in Extract<keyof T, number> as T[K] extends readonly [infer Name extends string, any]\n ? Name\n : never]: T[K] extends readonly [any, Registrar<infer Ret>] ? Ret : never;\n }> = {\n traverseDependencies: async (\n ...params: Parameters<Registrar<any>['traverseDependencies']>\n ) => {\n const acc: Record<string, any> = {};\n for (const [name, registrar] of registrars) {\n const result = await registrar.traverseDependencies(...params);\n acc[name] = result;\n }\n\n return acc;\n },\n } as any;\n\n return multiplexRegistrar;\n};\n"]}
|