@xyo-network/module-resolver 2.92.7 → 2.92.8
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/browser/CompositeModuleResolver.d.cts +6 -1
- package/dist/browser/CompositeModuleResolver.d.cts.map +1 -1
- package/dist/browser/CompositeModuleResolver.d.mts +6 -1
- package/dist/browser/CompositeModuleResolver.d.mts.map +1 -1
- package/dist/browser/CompositeModuleResolver.d.ts +6 -1
- package/dist/browser/CompositeModuleResolver.d.ts.map +1 -1
- package/dist/browser/ResolverEventEmitter.d.cts.map +1 -1
- package/dist/browser/ResolverEventEmitter.d.mts.map +1 -1
- package/dist/browser/ResolverEventEmitter.d.ts.map +1 -1
- package/dist/browser/SimpleModuleResolver.d.cts +6 -3
- package/dist/browser/SimpleModuleResolver.d.cts.map +1 -1
- package/dist/browser/SimpleModuleResolver.d.mts +6 -3
- package/dist/browser/SimpleModuleResolver.d.mts.map +1 -1
- package/dist/browser/SimpleModuleResolver.d.ts +6 -3
- package/dist/browser/SimpleModuleResolver.d.ts.map +1 -1
- package/dist/browser/index.cjs +40 -20
- package/dist/browser/index.cjs.map +1 -1
- package/dist/browser/index.js +42 -22
- package/dist/browser/index.js.map +1 -1
- package/dist/node/CompositeModuleResolver.d.cts +6 -1
- package/dist/node/CompositeModuleResolver.d.cts.map +1 -1
- package/dist/node/CompositeModuleResolver.d.mts +6 -1
- package/dist/node/CompositeModuleResolver.d.mts.map +1 -1
- package/dist/node/CompositeModuleResolver.d.ts +6 -1
- package/dist/node/CompositeModuleResolver.d.ts.map +1 -1
- package/dist/node/ResolverEventEmitter.d.cts.map +1 -1
- package/dist/node/ResolverEventEmitter.d.mts.map +1 -1
- package/dist/node/ResolverEventEmitter.d.ts.map +1 -1
- package/dist/node/SimpleModuleResolver.d.cts +6 -3
- package/dist/node/SimpleModuleResolver.d.cts.map +1 -1
- package/dist/node/SimpleModuleResolver.d.mts +6 -3
- package/dist/node/SimpleModuleResolver.d.mts.map +1 -1
- package/dist/node/SimpleModuleResolver.d.ts +6 -3
- package/dist/node/SimpleModuleResolver.d.ts.map +1 -1
- package/dist/node/index.cjs +40 -23
- package/dist/node/index.cjs.map +1 -1
- package/dist/node/index.js +42 -25
- package/dist/node/index.js.map +1 -1
- package/package.json +8 -8
- package/src/CompositeModuleResolver.ts +27 -4
- package/src/ResolverEventEmitter.ts +1 -0
- package/src/SimpleModuleResolver.ts +53 -43
package/dist/node/index.js
CHANGED
|
@@ -7,15 +7,17 @@ var __publicField = (obj, key, value) => {
|
|
|
7
7
|
};
|
|
8
8
|
|
|
9
9
|
// src/CompositeModuleResolver.ts
|
|
10
|
-
import { assertEx } from "@xylabs/assert";
|
|
10
|
+
import { assertEx as assertEx2 } from "@xylabs/assert";
|
|
11
11
|
import { exists } from "@xylabs/exists";
|
|
12
12
|
import { Base } from "@xylabs/object";
|
|
13
13
|
import { duplicateModules } from "@xyo-network/module-model";
|
|
14
14
|
import { LRUCache } from "lru-cache";
|
|
15
15
|
|
|
16
16
|
// src/SimpleModuleResolver.ts
|
|
17
|
-
import {
|
|
18
|
-
import {
|
|
17
|
+
import { assertEx } from "@xylabs/assert";
|
|
18
|
+
import { isAddress } from "@xylabs/hex";
|
|
19
|
+
import { compact } from "@xylabs/lodash";
|
|
20
|
+
import { isAddressModuleFilter, isModuleName, isNameModuleFilter, isQueryModuleFilter } from "@xyo-network/module-model";
|
|
19
21
|
var _SimpleModuleResolver = class _SimpleModuleResolver {
|
|
20
22
|
addressToName = {};
|
|
21
23
|
modules = {};
|
|
@@ -43,20 +45,26 @@ var _SimpleModuleResolver = class _SimpleModuleResolver {
|
|
|
43
45
|
removeResolver(_resolver) {
|
|
44
46
|
throw "Removing resolvers not supported";
|
|
45
47
|
}
|
|
46
|
-
resolve(idOrFilter, options) {
|
|
48
|
+
resolve(idOrFilter = "*", options) {
|
|
47
49
|
const unfiltered = (() => {
|
|
48
50
|
if (idOrFilter) {
|
|
49
51
|
if (typeof idOrFilter === "string") {
|
|
52
|
+
if (idOrFilter === "*") {
|
|
53
|
+
return Object.values(this.modules);
|
|
54
|
+
}
|
|
50
55
|
const id = idOrFilter;
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
+
const name = isModuleName(id) ? id : void 0;
|
|
57
|
+
const address = isAddress(id) ? id : void 0;
|
|
58
|
+
assertEx(name || address, () => "module identifier must be a ModuleName or Address");
|
|
59
|
+
return (name ? this.resolveByName(Object.values(this.modules), [
|
|
60
|
+
name
|
|
61
|
+
]).pop() : void 0) ?? (address ? this.resolveByAddress(this.modules, [
|
|
62
|
+
address
|
|
63
|
+
]).pop() : void 0);
|
|
56
64
|
} else {
|
|
57
65
|
const filter = idOrFilter;
|
|
58
66
|
if (isAddressModuleFilter(filter)) {
|
|
59
|
-
return this.resolveByAddress(
|
|
67
|
+
return this.resolveByAddress(this.modules, filter.address);
|
|
60
68
|
} else if (isNameModuleFilter(filter)) {
|
|
61
69
|
return this.resolveByName(Object.values(this.modules), filter.name);
|
|
62
70
|
} else if (isQueryModuleFilter(filter)) {
|
|
@@ -80,6 +88,7 @@ var _SimpleModuleResolver = class _SimpleModuleResolver {
|
|
|
80
88
|
}
|
|
81
89
|
}
|
|
82
90
|
removeSingleModule(address) {
|
|
91
|
+
assertEx(isAddress(address), () => "Invalid address");
|
|
83
92
|
if (address && this.modules[address]) {
|
|
84
93
|
delete this.modules[address];
|
|
85
94
|
const name = this.addressToName[address];
|
|
@@ -89,21 +98,17 @@ var _SimpleModuleResolver = class _SimpleModuleResolver {
|
|
|
89
98
|
}
|
|
90
99
|
}
|
|
91
100
|
resolveByAddress(modules, address) {
|
|
92
|
-
return
|
|
93
|
-
return modules
|
|
94
|
-
}))
|
|
101
|
+
return compact(address.map((address2) => {
|
|
102
|
+
return modules[address2];
|
|
103
|
+
}));
|
|
95
104
|
}
|
|
96
105
|
resolveByName(modules, name) {
|
|
97
|
-
|
|
98
|
-
return
|
|
99
|
-
|
|
100
|
-
return ((_a = module.config) == null ? void 0 : _a.name) === name2;
|
|
101
|
-
})));
|
|
102
|
-
}
|
|
103
|
-
return modules;
|
|
106
|
+
return compact(name.map((name2) => {
|
|
107
|
+
return modules.find((module) => module.config.name === name2);
|
|
108
|
+
}));
|
|
104
109
|
}
|
|
105
110
|
resolveByQuery(modules, query) {
|
|
106
|
-
return
|
|
111
|
+
return compact(modules.filter((module) => query == null ? void 0 : query.reduce((supported, queryList) => {
|
|
107
112
|
return (
|
|
108
113
|
// eslint-disable-next-line unicorn/no-array-reduce
|
|
109
114
|
queryList.reduce((supported2, query2) => {
|
|
@@ -111,7 +116,7 @@ var _SimpleModuleResolver = class _SimpleModuleResolver {
|
|
|
111
116
|
return supported2 && queryable;
|
|
112
117
|
}, true) || supported
|
|
113
118
|
);
|
|
114
|
-
}, false)))
|
|
119
|
+
}, false)));
|
|
115
120
|
}
|
|
116
121
|
};
|
|
117
122
|
__name(_SimpleModuleResolver, "SimpleModuleResolver");
|
|
@@ -170,11 +175,23 @@ var _CompositeModuleResolver = class _CompositeModuleResolver extends Base {
|
|
|
170
175
|
this.resolvers = this.resolvers.filter((item) => item !== resolver);
|
|
171
176
|
return this;
|
|
172
177
|
}
|
|
173
|
-
async resolve(idOrFilter, options) {
|
|
178
|
+
async resolve(idOrFilter = "*", options) {
|
|
174
179
|
const mutatedOptions = {
|
|
175
180
|
...options,
|
|
176
181
|
maxDepth: ((options == null ? void 0 : options.maxDepth) ?? _CompositeModuleResolver.defaultMaxDepth) - 1
|
|
177
182
|
};
|
|
183
|
+
if (idOrFilter === "*") {
|
|
184
|
+
const all = idOrFilter;
|
|
185
|
+
if (mutatedOptions.maxDepth < 0) {
|
|
186
|
+
return [];
|
|
187
|
+
}
|
|
188
|
+
const result = await Promise.all(this.resolvers.map(async (resolver) => {
|
|
189
|
+
const result2 = await resolver.resolve(all, mutatedOptions);
|
|
190
|
+
return result2;
|
|
191
|
+
}));
|
|
192
|
+
const flatResult = result.flat().filter(exists);
|
|
193
|
+
return flatResult.filter(duplicateModules);
|
|
194
|
+
}
|
|
178
195
|
if (typeof idOrFilter === "string") {
|
|
179
196
|
const idParts = moduleIdentifierParts(idOrFilter);
|
|
180
197
|
if (idParts.length > 1) {
|
|
@@ -224,8 +241,8 @@ var _CompositeModuleResolver = class _CompositeModuleResolver extends Base {
|
|
|
224
241
|
}
|
|
225
242
|
async resolveMultipartIdentifier(moduleIdentifier) {
|
|
226
243
|
const idParts = moduleIdentifierParts(moduleIdentifier);
|
|
227
|
-
|
|
228
|
-
const id =
|
|
244
|
+
assertEx2(idParts.length >= 2, () => "Not a valid multipart identifier");
|
|
245
|
+
const id = assertEx2(idParts.shift());
|
|
229
246
|
const module = await this.resolve(id);
|
|
230
247
|
return await (module == null ? void 0 : module.resolve(idParts.join(":")));
|
|
231
248
|
}
|
package/dist/node/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/CompositeModuleResolver.ts","../../src/SimpleModuleResolver.ts","../../src/ResolverEventEmitter.ts"],"sourcesContent":["import { assertEx } from '@xylabs/assert'\nimport { exists } from '@xylabs/exists'\nimport { Address } from '@xylabs/hex'\nimport { Base, BaseParams } from '@xylabs/object'\nimport { Promisable } from '@xylabs/promise'\nimport {\n CacheConfig,\n duplicateModules,\n ModuleFilter,\n ModuleFilterOptions,\n ModuleIdentifier,\n ModuleIdentifierPart,\n ModuleInstance,\n ModuleRepository,\n ModuleResolverInstance,\n} from '@xyo-network/module-model'\nimport { LRUCache } from 'lru-cache'\n\nimport { SimpleModuleResolver } from './SimpleModuleResolver'\nimport { ModuleIdentifierTransformer } from './transformers'\n\nexport type ModuleIdentifierTransformerFunc = (id: ModuleIdentifier) => Promisable<ModuleIdentifier>\n\nexport interface ModuleResolverParams extends BaseParams {\n cache?: CacheConfig\n moduleIdentifierTransformers?: ModuleIdentifierTransformer[]\n}\n\nconst moduleIdentifierParts = (moduleIdentifier: ModuleIdentifier): ModuleIdentifierPart[] => {\n return moduleIdentifier?.split(':') as ModuleIdentifierPart[]\n}\n\nexport class CompositeModuleResolver extends Base<ModuleResolverParams> implements ModuleRepository, ModuleResolverInstance {\n static defaultMaxDepth = 5\n protected resolvers: ModuleResolverInstance[] = []\n private _cache: LRUCache<ModuleIdentifier, ModuleInstance>\n private _localResolver: SimpleModuleResolver\n\n constructor({ cache, ...params }: ModuleResolverParams = {}) {\n super(params)\n const localResolver = new SimpleModuleResolver()\n this.addResolver(localResolver)\n const { max = 100, ttl = 1000 * 5 /* five seconds */ } = cache ?? {}\n this._cache = new LRUCache<ModuleIdentifier, ModuleInstance>({ max, ttl, ...cache })\n this._localResolver = localResolver\n }\n\n private get moduleIdentifierTransformers() {\n return this.params.moduleIdentifierTransformers\n }\n\n add(module: ModuleInstance): this\n add(module: ModuleInstance[]): this\n add(module: ModuleInstance | ModuleInstance[]): this {\n if (Array.isArray(module)) {\n for (const mod of module) this.addSingleModule(mod)\n } else {\n this.addSingleModule(module)\n }\n return this\n }\n\n addResolver(resolver: ModuleResolverInstance): this {\n this.resolvers.push(resolver)\n return this\n }\n\n remove(addresses: Address[] | Address): this {\n if (Array.isArray(addresses)) {\n for (const address of addresses) this.removeSingleModule(address)\n } else {\n this.removeSingleModule(addresses)\n }\n return this\n }\n\n removeResolver(resolver: ModuleResolverInstance): this {\n this.resolvers = this.resolvers.filter((item) => item !== resolver)\n return this\n }\n\n async resolve<T extends ModuleInstance = ModuleInstance>(filter?: ModuleFilter<T>, options?: ModuleFilterOptions<T>): Promise<T[]>\n async resolve<T extends ModuleInstance = ModuleInstance>(id: ModuleIdentifier, options?: ModuleFilterOptions<T>): Promise<T | undefined>\n async resolve<T extends ModuleInstance = ModuleInstance>(\n idOrFilter?: ModuleFilter<T> | ModuleIdentifier,\n options?: ModuleFilterOptions<T>,\n ): Promise<T | T[] | undefined> {\n const mutatedOptions = { ...options, maxDepth: (options?.maxDepth ?? CompositeModuleResolver.defaultMaxDepth) - 1 }\n if (typeof idOrFilter === 'string') {\n const idParts = moduleIdentifierParts(idOrFilter)\n if (idParts.length > 1) {\n return await this.resolveMultipartIdentifier<T>(idOrFilter)\n }\n const id = await this.transformModuleIdentifier(idOrFilter)\n if (mutatedOptions.maxDepth < 0) {\n return undefined\n }\n const cachedResult = this._cache.get(id)\n if (cachedResult) {\n if (cachedResult.status === 'dead') {\n this._cache.delete(id)\n } else {\n return cachedResult as T\n }\n }\n const results = await Promise.all(\n this.resolvers.map(async (resolver) => {\n const result: T | undefined = await resolver.resolve<T>(id, mutatedOptions)\n return result\n }),\n )\n const result: T | undefined = results.filter(exists).filter(duplicateModules).pop()\n if (result) {\n this._cache.set(id, result)\n }\n return result\n } else {\n const filter = idOrFilter\n if (mutatedOptions.maxDepth < 0) {\n return []\n }\n const result = await Promise.all(\n this.resolvers.map(async (resolver) => {\n const result: T[] = await resolver.resolve<T>(filter, mutatedOptions)\n return result\n }),\n )\n const flatResult: T[] = result.flat().filter(exists)\n return flatResult.filter(duplicateModules)\n }\n }\n\n private addSingleModule(module?: ModuleInstance) {\n if (module) {\n this._localResolver.add(module)\n }\n }\n private removeSingleModule(address: Address) {\n this._localResolver.remove(address)\n }\n\n private async resolveMultipartIdentifier<T extends ModuleInstance = ModuleInstance>(moduleIdentifier: ModuleIdentifier): Promise<T | undefined> {\n const idParts = moduleIdentifierParts(moduleIdentifier)\n assertEx(idParts.length >= 2, 'Not a valid multipart identifier')\n const id = assertEx(idParts.shift())\n const module = await this.resolve(id)\n return await module?.resolve<T>(idParts.join(':'))\n }\n\n private async transformModuleIdentifier(identifier: ModuleIdentifier) {\n let id = identifier\n for (const transformer of this.moduleIdentifierTransformers ?? []) {\n id = await transformer.transform(id)\n }\n return id\n }\n}\n","import { Address } from '@xylabs/hex'\nimport { compact, flatten } from '@xylabs/lodash'\nimport { Promisable } from '@xylabs/promise'\nimport {\n isAddressModuleFilter,\n isNameModuleFilter,\n isQueryModuleFilter,\n ModuleFilter,\n ModuleFilterOptions,\n ModuleIdentifier,\n ModuleInstance,\n ModuleRepository,\n ModuleResolverInstance,\n} from '@xyo-network/module-model'\n\n//This class is now package private (not exported from index.ts)\nexport class SimpleModuleResolver implements ModuleRepository {\n private addressToName: Record<string, string> = {}\n private modules: Record<string, ModuleInstance> = {}\n\n add(module: ModuleInstance): this\n add(module: ModuleInstance[]): this\n add(module: ModuleInstance | ModuleInstance[]): this {\n if (Array.isArray(module)) {\n for (const mod of module) this.addSingleModule(mod)\n } else {\n this.addSingleModule(module)\n }\n return this\n }\n\n addResolver(_resolver: ModuleResolverInstance): this {\n throw 'Adding resolvers not supported'\n }\n\n remove(address: Address | Address[]): this {\n if (Array.isArray(address)) {\n for (const addr of address) this.removeSingleModule(addr)\n } else {\n this.removeSingleModule(address)\n }\n return this\n }\n\n removeResolver(_resolver: ModuleResolverInstance): this {\n throw 'Removing resolvers not supported'\n }\n\n resolve<T extends ModuleInstance = ModuleInstance>(filter?: ModuleFilter<T>, options?: ModuleFilterOptions<T>): Promisable<T[]>\n resolve<T extends ModuleInstance = ModuleInstance>(id: ModuleIdentifier, options?: ModuleFilterOptions<T>): Promisable<T | undefined>\n resolve<T extends ModuleInstance = ModuleInstance>(\n idOrFilter?: ModuleFilter<T> | string,\n options?: ModuleFilterOptions<T>,\n ): Promisable<T[] | T | undefined> {\n const unfiltered = (() => {\n if (idOrFilter) {\n if (typeof idOrFilter === 'string') {\n const id = idOrFilter\n return this.resolveByName<T>(Object.values(this.modules), [id]).pop() ?? this.resolveByAddress<T>(Object.values(this.modules), [id]).pop()\n } else {\n const filter = idOrFilter\n if (isAddressModuleFilter(filter)) {\n return this.resolveByAddress<T>(Object.values(this.modules), filter.address)\n } else if (isNameModuleFilter(filter)) {\n return this.resolveByName<T>(Object.values(this.modules), filter.name)\n } else if (isQueryModuleFilter(filter)) {\n return this.resolveByQuery<T>(Object.values(this.modules), filter.query)\n }\n }\n } else {\n return Object.values(this.modules) as T[]\n }\n })()\n const identity = options?.identity\n if (identity) {\n return (\n Array.isArray(unfiltered) ? unfiltered?.filter((module) => identity(module))\n : identity(unfiltered) ? unfiltered\n : undefined\n )\n } else {\n return unfiltered\n }\n }\n\n private addSingleModule(module?: ModuleInstance) {\n if (module) {\n this.modules[module.address] = module\n }\n }\n\n private removeSingleModule(address: Address) {\n if (address && this.modules[address]) {\n delete this.modules[address]\n const name = this.addressToName[address]\n if (name) {\n delete this.addressToName[address]\n }\n }\n }\n\n private resolveByAddress<T extends ModuleInstance = ModuleInstance>(modules: ModuleInstance[], address?: string[]): T[] {\n return (\n address ?\n compact(\n flatten(\n address?.map((address) => {\n return modules.filter((module) => module.address === address)\n }),\n ),\n )\n : modules) as T[]\n }\n\n private resolveByName<T extends ModuleInstance = ModuleInstance>(modules: ModuleInstance[], name?: string[]): T[] {\n if (name) {\n return compact(name.flatMap((name) => modules.filter((module) => module.config?.name === name))) as T[]\n }\n return modules as T[]\n }\n\n private resolveByQuery<T extends ModuleInstance = ModuleInstance>(modules: ModuleInstance[], query?: string[][]): T[] {\n return (\n query ?\n compact(\n modules.filter((module) =>\n query?.reduce((supported, queryList) => {\n return (\n // eslint-disable-next-line unicorn/no-array-reduce\n queryList.reduce((supported, query) => {\n const queryable = module.queries.includes(query)\n return supported && queryable\n }, true) || supported\n )\n }, false),\n ),\n )\n : modules) as T[]\n }\n}\n","import { Module, ModuleFilter, ModuleResolver } from '@xyo-network/module-model'\n\nexport interface ModuleResolvedEventArgs {\n filter?: ModuleFilter\n module: Module\n}\n\nexport interface ResolverEventEmitter {\n on(event: 'moduleResolved', listener: (args: ModuleResolvedEventArgs) => void): void\n}\n\ntype ListenerFunction = (args: ModuleResolvedEventArgs) => void\n\nconst getMixin = <T extends ModuleResolver = ModuleResolver>(resolver: T) => {\n const listeners: ListenerFunction[] = []\n const emit = (event: 'moduleResolved', args: ModuleResolvedEventArgs): boolean => {\n if (listeners.length === 0) return false\n listeners.map((listener) => listener(args))\n return true\n }\n const onModuleResolved = (module: Module, filter?: ModuleFilter) => {\n const args = { filter, module }\n emit('moduleResolved', args)\n }\n const { resolve } = resolver\n function originalResolve(filter?: ModuleFilter) {\n return resolve.bind(resolver)(filter)\n }\n\n return {\n on: (event: 'moduleResolved', listener: (args: ModuleResolvedEventArgs) => void) => {\n listeners.push(listener)\n },\n resolve: async (filter?: ModuleFilter): Promise<Module[]> => {\n const modules: Module[] = await originalResolve(filter)\n await Promise.allSettled(modules.map((mod) => onModuleResolved(mod, filter)))\n return modules\n },\n }\n}\n\nexport const mixinResolverEventEmitter = <T extends ModuleResolver = ModuleResolver>(resolver: T): T & ResolverEventEmitter => {\n const mixin = getMixin(resolver)\n const ret = Object.assign(resolver, mixin)\n return ret\n}\n"],"mappings":"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","names":["assertEx","exists","Base","duplicateModules","LRUCache","compact","flatten","isAddressModuleFilter","isNameModuleFilter","isQueryModuleFilter","SimpleModuleResolver","addressToName","modules","add","module","Array","isArray","mod","addSingleModule","addResolver","_resolver","remove","address","addr","removeSingleModule","removeResolver","resolve","idOrFilter","options","unfiltered","id","resolveByName","Object","values","pop","resolveByAddress","filter","isAddressModuleFilter","isNameModuleFilter","name","isQueryModuleFilter","resolveByQuery","query","identity","undefined","compact","flatten","map","flatMap","config","reduce","supported","queryList","queryable","queries","includes","moduleIdentifierParts","moduleIdentifier","split","CompositeModuleResolver","Base","resolvers","_cache","_localResolver","constructor","cache","params","localResolver","SimpleModuleResolver","addResolver","max","ttl","LRUCache","moduleIdentifierTransformers","add","module","Array","isArray","mod","addSingleModule","resolver","push","remove","addresses","address","removeSingleModule","removeResolver","filter","item","resolve","idOrFilter","options","mutatedOptions","maxDepth","defaultMaxDepth","idParts","length","resolveMultipartIdentifier","id","transformModuleIdentifier","undefined","cachedResult","get","status","delete","results","Promise","all","map","result","exists","duplicateModules","pop","set","flatResult","flat","assertEx","shift","join","identifier","transformer","transform","getMixin","resolver","listeners","emit","event","args","length","map","listener","onModuleResolved","module","filter","resolve","originalResolve","bind","on","push","modules","Promise","allSettled","mod","mixinResolverEventEmitter","mixin","ret","Object","assign"]}
|
|
1
|
+
{"version":3,"sources":["../../src/CompositeModuleResolver.ts","../../src/SimpleModuleResolver.ts","../../src/ResolverEventEmitter.ts"],"sourcesContent":["import { assertEx } from '@xylabs/assert'\nimport { exists } from '@xylabs/exists'\nimport { Address } from '@xylabs/hex'\nimport { Base, BaseParams } from '@xylabs/object'\nimport { Promisable } from '@xylabs/promise'\nimport {\n CacheConfig,\n duplicateModules,\n ModuleFilter,\n ModuleFilterOptions,\n ModuleIdentifier,\n ModuleIdentifierPart,\n ModuleInstance,\n ModuleRepository,\n ModuleResolverInstance,\n} from '@xyo-network/module-model'\nimport { LRUCache } from 'lru-cache'\n\nimport { SimpleModuleResolver } from './SimpleModuleResolver'\nimport { ModuleIdentifierTransformer } from './transformers'\n\nexport type ModuleIdentifierTransformerFunc = (id: ModuleIdentifier) => Promisable<ModuleIdentifier>\n\nexport interface ModuleResolverParams extends BaseParams {\n cache?: CacheConfig\n moduleIdentifierTransformers?: ModuleIdentifierTransformer[]\n}\n\nconst moduleIdentifierParts = (moduleIdentifier: ModuleIdentifier): ModuleIdentifierPart[] => {\n return moduleIdentifier?.split(':') as ModuleIdentifierPart[]\n}\n\nexport class CompositeModuleResolver extends Base<ModuleResolverParams> implements ModuleRepository, ModuleResolverInstance {\n static defaultMaxDepth = 5\n protected resolvers: ModuleResolverInstance[] = []\n private _cache: LRUCache<ModuleIdentifier, ModuleInstance>\n private _localResolver: SimpleModuleResolver\n\n constructor({ cache, ...params }: ModuleResolverParams = {}) {\n super(params)\n const localResolver = new SimpleModuleResolver()\n this.addResolver(localResolver)\n const { max = 100, ttl = 1000 * 5 /* five seconds */ } = cache ?? {}\n this._cache = new LRUCache<ModuleIdentifier, ModuleInstance>({ max, ttl, ...cache })\n this._localResolver = localResolver\n }\n\n private get moduleIdentifierTransformers() {\n return this.params.moduleIdentifierTransformers\n }\n\n add(module: ModuleInstance): this\n add(module: ModuleInstance[]): this\n add(module: ModuleInstance | ModuleInstance[]): this {\n if (Array.isArray(module)) {\n for (const mod of module) this.addSingleModule(mod)\n } else {\n this.addSingleModule(module)\n }\n return this\n }\n\n addResolver(resolver: ModuleResolverInstance): this {\n this.resolvers.push(resolver)\n return this\n }\n\n remove(addresses: Address[] | Address): this {\n if (Array.isArray(addresses)) {\n for (const address of addresses) this.removeSingleModule(address)\n } else {\n this.removeSingleModule(addresses)\n }\n return this\n }\n\n removeResolver(resolver: ModuleResolverInstance): this {\n this.resolvers = this.resolvers.filter((item) => item !== resolver)\n return this\n }\n /** @deprecated do not pass undefined. If trying to get all, pass '*' */\n async resolve(): Promise<ModuleInstance[]>\n async resolve<T extends ModuleInstance = ModuleInstance>(all: '*', options?: ModuleFilterOptions<T>): Promise<T[]>\n async resolve<T extends ModuleInstance = ModuleInstance>(filter: ModuleFilter<T>, options?: ModuleFilterOptions<T>): Promise<T[]>\n async resolve<T extends ModuleInstance = ModuleInstance>(id: ModuleIdentifier, options?: ModuleFilterOptions<T>): Promise<T | undefined>\n /** @deprecated use '*' if trying to resolve all */\n async resolve<T extends ModuleInstance = ModuleInstance>(filter?: ModuleFilter<T>, options?: ModuleFilterOptions<T>): Promise<T[]>\n async resolve<T extends ModuleInstance = ModuleInstance>(\n idOrFilter: ModuleFilter<T> | ModuleIdentifier = '*',\n options?: ModuleFilterOptions<T>,\n ): Promise<T | T[] | undefined> {\n const mutatedOptions = { ...options, maxDepth: (options?.maxDepth ?? CompositeModuleResolver.defaultMaxDepth) - 1 }\n\n //resolve all\n if (idOrFilter === '*') {\n const all = idOrFilter\n if (mutatedOptions.maxDepth < 0) {\n return []\n }\n const result = await Promise.all(\n this.resolvers.map(async (resolver) => {\n const result: T[] = await resolver.resolve<T>(all, mutatedOptions)\n return result\n }),\n )\n const flatResult: T[] = result.flat().filter(exists)\n return flatResult.filter(duplicateModules)\n }\n\n if (typeof idOrFilter === 'string') {\n //resolve ModuleIdentifier\n const idParts = moduleIdentifierParts(idOrFilter)\n if (idParts.length > 1) {\n return await this.resolveMultipartIdentifier<T>(idOrFilter)\n }\n const id = await this.transformModuleIdentifier(idOrFilter)\n if (mutatedOptions.maxDepth < 0) {\n return undefined\n }\n const cachedResult = this._cache.get(id)\n if (cachedResult) {\n if (cachedResult.status === 'dead') {\n this._cache.delete(id)\n } else {\n return cachedResult as T\n }\n }\n const results = await Promise.all(\n this.resolvers.map(async (resolver) => {\n const result: T | undefined = await resolver.resolve<T>(id, mutatedOptions)\n return result\n }),\n )\n const result: T | undefined = results.filter(exists).filter(duplicateModules).pop()\n if (result) {\n this._cache.set(id, result)\n }\n return result\n } else {\n //resolve filter\n const filter = idOrFilter\n if (mutatedOptions.maxDepth < 0) {\n return []\n }\n const result = await Promise.all(\n this.resolvers.map(async (resolver) => {\n const result: T[] = await resolver.resolve<T>(filter, mutatedOptions)\n return result\n }),\n )\n const flatResult: T[] = result.flat().filter(exists)\n return flatResult.filter(duplicateModules)\n }\n }\n\n private addSingleModule(module?: ModuleInstance) {\n if (module) {\n this._localResolver.add(module)\n }\n }\n private removeSingleModule(address: Address) {\n this._localResolver.remove(address)\n }\n\n private async resolveMultipartIdentifier<T extends ModuleInstance = ModuleInstance>(moduleIdentifier: ModuleIdentifier): Promise<T | undefined> {\n const idParts = moduleIdentifierParts(moduleIdentifier)\n assertEx(idParts.length >= 2, () => 'Not a valid multipart identifier')\n const id = assertEx(idParts.shift())\n const module = await this.resolve(id)\n return await module?.resolve<T>(idParts.join(':'))\n }\n\n private async transformModuleIdentifier(identifier: ModuleIdentifier) {\n let id = identifier\n for (const transformer of this.moduleIdentifierTransformers ?? []) {\n id = await transformer.transform(id)\n }\n return id\n }\n}\n","import { assertEx } from '@xylabs/assert'\nimport { Address, isAddress } from '@xylabs/hex'\nimport { compact } from '@xylabs/lodash'\nimport { Promisable } from '@xylabs/promise'\nimport {\n isAddressModuleFilter,\n isModuleName,\n isNameModuleFilter,\n isQueryModuleFilter,\n ModuleFilter,\n ModuleFilterOptions,\n ModuleIdentifier,\n ModuleInstance,\n ModuleName,\n ModuleRepository,\n ModuleResolver,\n ModuleResolverInstance,\n} from '@xyo-network/module-model'\n\n//This class is now package private (not exported from index.ts)\nexport class SimpleModuleResolver implements ModuleRepository, ModuleResolver {\n private addressToName: Record<Address, ModuleName> = {}\n private modules: Record<Address, ModuleInstance> = {}\n\n add(module: ModuleInstance): this\n add(module: ModuleInstance[]): this\n add(module: ModuleInstance | ModuleInstance[]): this {\n if (Array.isArray(module)) {\n for (const mod of module) this.addSingleModule(mod)\n } else {\n this.addSingleModule(module)\n }\n return this\n }\n\n addResolver(_resolver: ModuleResolverInstance): this {\n throw 'Adding resolvers not supported'\n }\n\n remove(address: Address | Address[]): this {\n if (Array.isArray(address)) {\n for (const addr of address) this.removeSingleModule(addr)\n } else {\n this.removeSingleModule(address)\n }\n return this\n }\n\n removeResolver(_resolver: ModuleResolverInstance): this {\n throw 'Removing resolvers not supported'\n }\n\n resolve<T extends ModuleInstance = ModuleInstance>(all: '*', options?: ModuleFilterOptions<T>): Promisable<T[]>\n resolve<T extends ModuleInstance = ModuleInstance>(filter: ModuleFilter<T>, options?: ModuleFilterOptions<T>): Promisable<T[]>\n resolve<T extends ModuleInstance = ModuleInstance>(id: ModuleIdentifier, options?: ModuleFilterOptions<T>): Promisable<T | undefined>\n /** @deprecated use '*' if trying to resolve all */\n resolve<T extends ModuleInstance = ModuleInstance>(filter?: ModuleFilter<T>, options?: ModuleFilterOptions<T>): Promisable<T[]>\n resolve<T extends ModuleInstance = ModuleInstance>(\n idOrFilter: ModuleFilter<T> | string = '*',\n options?: ModuleFilterOptions<T>,\n ): Promisable<T[] | T | undefined> {\n const unfiltered = (() => {\n if (idOrFilter) {\n if (typeof idOrFilter === 'string') {\n if (idOrFilter === '*') {\n return Object.values(this.modules) as T[]\n }\n const id = idOrFilter as ModuleIdentifier\n const name = isModuleName(id) ? id : undefined\n const address = isAddress(id) ? id : undefined\n assertEx(name || address, () => 'module identifier must be a ModuleName or Address')\n return (\n (name ? this.resolveByName<T>(Object.values(this.modules), [name]).pop() : undefined) ??\n (address ? this.resolveByAddress<T>(this.modules, [address]).pop() : undefined)\n )\n } else {\n const filter = idOrFilter\n if (isAddressModuleFilter(filter)) {\n return this.resolveByAddress<T>(this.modules, filter.address)\n } else if (isNameModuleFilter(filter)) {\n return this.resolveByName<T>(Object.values(this.modules), filter.name)\n } else if (isQueryModuleFilter(filter)) {\n return this.resolveByQuery<T>(Object.values(this.modules), filter.query)\n }\n }\n } else {\n return Object.values(this.modules) as T[]\n }\n })()\n const identity = options?.identity\n if (identity) {\n return (\n Array.isArray(unfiltered) ? unfiltered?.filter((module) => identity(module))\n : identity(unfiltered) ? unfiltered\n : undefined\n )\n } else {\n return unfiltered\n }\n }\n\n private addSingleModule(module?: ModuleInstance) {\n if (module) {\n this.modules[module.address] = module\n }\n }\n\n private removeSingleModule(address: Address) {\n assertEx(isAddress(address), () => 'Invalid address')\n if (address && this.modules[address]) {\n delete this.modules[address]\n const name = this.addressToName[address]\n if (name) {\n delete this.addressToName[address]\n }\n }\n }\n\n private resolveByAddress<T extends ModuleInstance = ModuleInstance>(modules: Record<Address, ModuleInstance>, address: Address[]): T[] {\n return compact(\n address.map((address) => {\n return modules[address]\n }),\n ) as T[]\n }\n\n private resolveByName<T extends ModuleInstance = ModuleInstance>(modules: ModuleInstance[], name: ModuleName[]): T[] {\n return compact(\n name.map((name) => {\n return modules.find((module) => module.config.name === name)\n }),\n ) as T[]\n }\n\n private resolveByQuery<T extends ModuleInstance = ModuleInstance>(modules: ModuleInstance[], query: string[][]): T[] {\n return compact(\n modules.filter((module) =>\n query?.reduce((supported, queryList) => {\n return (\n // eslint-disable-next-line unicorn/no-array-reduce\n queryList.reduce((supported, query) => {\n const queryable = module.queries.includes(query)\n return supported && queryable\n }, true) || supported\n )\n }, false),\n ),\n ) as T[]\n }\n}\n","import { Module, ModuleFilter, ModuleResolver } from '@xyo-network/module-model'\n\nexport interface ModuleResolvedEventArgs {\n filter?: ModuleFilter\n module: Module\n}\n\nexport interface ResolverEventEmitter {\n on(event: 'moduleResolved', listener: (args: ModuleResolvedEventArgs) => void): void\n}\n\ntype ListenerFunction = (args: ModuleResolvedEventArgs) => void\n\nconst getMixin = <T extends ModuleResolver = ModuleResolver>(resolver: T) => {\n const listeners: ListenerFunction[] = []\n const emit = (event: 'moduleResolved', args: ModuleResolvedEventArgs): boolean => {\n if (listeners.length === 0) return false\n listeners.map((listener) => listener(args))\n return true\n }\n const onModuleResolved = (module: Module, filter?: ModuleFilter) => {\n const args = { filter, module }\n emit('moduleResolved', args)\n }\n // eslint-disable-next-line deprecation/deprecation\n const { resolve } = resolver\n function originalResolve(filter?: ModuleFilter) {\n return resolve.bind(resolver)(filter)\n }\n\n return {\n on: (event: 'moduleResolved', listener: (args: ModuleResolvedEventArgs) => void) => {\n listeners.push(listener)\n },\n resolve: async (filter?: ModuleFilter): Promise<Module[]> => {\n const modules: Module[] = await originalResolve(filter)\n await Promise.allSettled(modules.map((mod) => onModuleResolved(mod, filter)))\n return modules\n },\n }\n}\n\nexport const mixinResolverEventEmitter = <T extends ModuleResolver = ModuleResolver>(resolver: T): T & ResolverEventEmitter => {\n const mixin = getMixin(resolver)\n const ret = Object.assign(resolver, mixin)\n return ret\n}\n"],"mappings":"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","names":["assertEx","exists","Base","duplicateModules","LRUCache","assertEx","isAddress","compact","isAddressModuleFilter","isModuleName","isNameModuleFilter","isQueryModuleFilter","SimpleModuleResolver","addressToName","modules","add","module","Array","isArray","mod","addSingleModule","addResolver","_resolver","remove","address","addr","removeSingleModule","removeResolver","resolve","idOrFilter","options","unfiltered","Object","values","id","name","isModuleName","undefined","isAddress","assertEx","resolveByName","pop","resolveByAddress","filter","isAddressModuleFilter","isNameModuleFilter","isQueryModuleFilter","resolveByQuery","query","identity","compact","map","find","config","reduce","supported","queryList","queryable","queries","includes","moduleIdentifierParts","moduleIdentifier","split","CompositeModuleResolver","Base","resolvers","_cache","_localResolver","constructor","cache","params","localResolver","SimpleModuleResolver","addResolver","max","ttl","LRUCache","moduleIdentifierTransformers","add","module","Array","isArray","mod","addSingleModule","resolver","push","remove","addresses","address","removeSingleModule","removeResolver","filter","item","resolve","idOrFilter","options","mutatedOptions","maxDepth","defaultMaxDepth","all","result","Promise","map","flatResult","flat","exists","duplicateModules","idParts","length","resolveMultipartIdentifier","id","transformModuleIdentifier","undefined","cachedResult","get","status","delete","results","pop","set","assertEx","shift","join","identifier","transformer","transform","getMixin","resolver","listeners","emit","event","args","length","map","listener","onModuleResolved","module","filter","resolve","originalResolve","bind","on","push","modules","Promise","allSettled","mod","mixinResolverEventEmitter","mixin","ret","Object","assign"]}
|
package/package.json
CHANGED
|
@@ -10,13 +10,13 @@
|
|
|
10
10
|
"url": "https://github.com/XYOracleNetwork/sdk-xyo-client-js/issues"
|
|
11
11
|
},
|
|
12
12
|
"dependencies": {
|
|
13
|
-
"@xylabs/assert": "^3.0.
|
|
14
|
-
"@xylabs/exists": "^3.0.
|
|
15
|
-
"@xylabs/hex": "^3.0.
|
|
16
|
-
"@xylabs/lodash": "^3.0.
|
|
17
|
-
"@xylabs/object": "^3.0.
|
|
18
|
-
"@xylabs/promise": "^3.0.
|
|
19
|
-
"@xyo-network/module-model": "~2.92.
|
|
13
|
+
"@xylabs/assert": "^3.0.15",
|
|
14
|
+
"@xylabs/exists": "^3.0.15",
|
|
15
|
+
"@xylabs/hex": "^3.0.15",
|
|
16
|
+
"@xylabs/lodash": "^3.0.15",
|
|
17
|
+
"@xylabs/object": "^3.0.15",
|
|
18
|
+
"@xylabs/promise": "^3.0.15",
|
|
19
|
+
"@xyo-network/module-model": "~2.92.8",
|
|
20
20
|
"lru-cache": "^10.2.0"
|
|
21
21
|
},
|
|
22
22
|
"devDependencies": {
|
|
@@ -65,6 +65,6 @@
|
|
|
65
65
|
"url": "https://github.com/XYOracleNetwork/sdk-xyo-client-js.git"
|
|
66
66
|
},
|
|
67
67
|
"sideEffects": false,
|
|
68
|
-
"version": "2.92.
|
|
68
|
+
"version": "2.92.8",
|
|
69
69
|
"type": "module"
|
|
70
70
|
}
|
|
@@ -78,15 +78,37 @@ export class CompositeModuleResolver extends Base<ModuleResolverParams> implemen
|
|
|
78
78
|
this.resolvers = this.resolvers.filter((item) => item !== resolver)
|
|
79
79
|
return this
|
|
80
80
|
}
|
|
81
|
-
|
|
82
|
-
async resolve
|
|
81
|
+
/** @deprecated do not pass undefined. If trying to get all, pass '*' */
|
|
82
|
+
async resolve(): Promise<ModuleInstance[]>
|
|
83
|
+
async resolve<T extends ModuleInstance = ModuleInstance>(all: '*', options?: ModuleFilterOptions<T>): Promise<T[]>
|
|
84
|
+
async resolve<T extends ModuleInstance = ModuleInstance>(filter: ModuleFilter<T>, options?: ModuleFilterOptions<T>): Promise<T[]>
|
|
83
85
|
async resolve<T extends ModuleInstance = ModuleInstance>(id: ModuleIdentifier, options?: ModuleFilterOptions<T>): Promise<T | undefined>
|
|
86
|
+
/** @deprecated use '*' if trying to resolve all */
|
|
87
|
+
async resolve<T extends ModuleInstance = ModuleInstance>(filter?: ModuleFilter<T>, options?: ModuleFilterOptions<T>): Promise<T[]>
|
|
84
88
|
async resolve<T extends ModuleInstance = ModuleInstance>(
|
|
85
|
-
idOrFilter
|
|
89
|
+
idOrFilter: ModuleFilter<T> | ModuleIdentifier = '*',
|
|
86
90
|
options?: ModuleFilterOptions<T>,
|
|
87
91
|
): Promise<T | T[] | undefined> {
|
|
88
92
|
const mutatedOptions = { ...options, maxDepth: (options?.maxDepth ?? CompositeModuleResolver.defaultMaxDepth) - 1 }
|
|
93
|
+
|
|
94
|
+
//resolve all
|
|
95
|
+
if (idOrFilter === '*') {
|
|
96
|
+
const all = idOrFilter
|
|
97
|
+
if (mutatedOptions.maxDepth < 0) {
|
|
98
|
+
return []
|
|
99
|
+
}
|
|
100
|
+
const result = await Promise.all(
|
|
101
|
+
this.resolvers.map(async (resolver) => {
|
|
102
|
+
const result: T[] = await resolver.resolve<T>(all, mutatedOptions)
|
|
103
|
+
return result
|
|
104
|
+
}),
|
|
105
|
+
)
|
|
106
|
+
const flatResult: T[] = result.flat().filter(exists)
|
|
107
|
+
return flatResult.filter(duplicateModules)
|
|
108
|
+
}
|
|
109
|
+
|
|
89
110
|
if (typeof idOrFilter === 'string') {
|
|
111
|
+
//resolve ModuleIdentifier
|
|
90
112
|
const idParts = moduleIdentifierParts(idOrFilter)
|
|
91
113
|
if (idParts.length > 1) {
|
|
92
114
|
return await this.resolveMultipartIdentifier<T>(idOrFilter)
|
|
@@ -115,6 +137,7 @@ export class CompositeModuleResolver extends Base<ModuleResolverParams> implemen
|
|
|
115
137
|
}
|
|
116
138
|
return result
|
|
117
139
|
} else {
|
|
140
|
+
//resolve filter
|
|
118
141
|
const filter = idOrFilter
|
|
119
142
|
if (mutatedOptions.maxDepth < 0) {
|
|
120
143
|
return []
|
|
@@ -141,7 +164,7 @@ export class CompositeModuleResolver extends Base<ModuleResolverParams> implemen
|
|
|
141
164
|
|
|
142
165
|
private async resolveMultipartIdentifier<T extends ModuleInstance = ModuleInstance>(moduleIdentifier: ModuleIdentifier): Promise<T | undefined> {
|
|
143
166
|
const idParts = moduleIdentifierParts(moduleIdentifier)
|
|
144
|
-
assertEx(idParts.length >= 2, 'Not a valid multipart identifier')
|
|
167
|
+
assertEx(idParts.length >= 2, () => 'Not a valid multipart identifier')
|
|
145
168
|
const id = assertEx(idParts.shift())
|
|
146
169
|
const module = await this.resolve(id)
|
|
147
170
|
return await module?.resolve<T>(idParts.join(':'))
|
|
@@ -22,6 +22,7 @@ const getMixin = <T extends ModuleResolver = ModuleResolver>(resolver: T) => {
|
|
|
22
22
|
const args = { filter, module }
|
|
23
23
|
emit('moduleResolved', args)
|
|
24
24
|
}
|
|
25
|
+
// eslint-disable-next-line deprecation/deprecation
|
|
25
26
|
const { resolve } = resolver
|
|
26
27
|
function originalResolve(filter?: ModuleFilter) {
|
|
27
28
|
return resolve.bind(resolver)(filter)
|
|
@@ -1,22 +1,26 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import {
|
|
1
|
+
import { assertEx } from '@xylabs/assert'
|
|
2
|
+
import { Address, isAddress } from '@xylabs/hex'
|
|
3
|
+
import { compact } from '@xylabs/lodash'
|
|
3
4
|
import { Promisable } from '@xylabs/promise'
|
|
4
5
|
import {
|
|
5
6
|
isAddressModuleFilter,
|
|
7
|
+
isModuleName,
|
|
6
8
|
isNameModuleFilter,
|
|
7
9
|
isQueryModuleFilter,
|
|
8
10
|
ModuleFilter,
|
|
9
11
|
ModuleFilterOptions,
|
|
10
12
|
ModuleIdentifier,
|
|
11
13
|
ModuleInstance,
|
|
14
|
+
ModuleName,
|
|
12
15
|
ModuleRepository,
|
|
16
|
+
ModuleResolver,
|
|
13
17
|
ModuleResolverInstance,
|
|
14
18
|
} from '@xyo-network/module-model'
|
|
15
19
|
|
|
16
20
|
//This class is now package private (not exported from index.ts)
|
|
17
|
-
export class SimpleModuleResolver implements ModuleRepository {
|
|
18
|
-
private addressToName: Record<
|
|
19
|
-
private modules: Record<
|
|
21
|
+
export class SimpleModuleResolver implements ModuleRepository, ModuleResolver {
|
|
22
|
+
private addressToName: Record<Address, ModuleName> = {}
|
|
23
|
+
private modules: Record<Address, ModuleInstance> = {}
|
|
20
24
|
|
|
21
25
|
add(module: ModuleInstance): this
|
|
22
26
|
add(module: ModuleInstance[]): this
|
|
@@ -46,21 +50,33 @@ export class SimpleModuleResolver implements ModuleRepository {
|
|
|
46
50
|
throw 'Removing resolvers not supported'
|
|
47
51
|
}
|
|
48
52
|
|
|
49
|
-
resolve<T extends ModuleInstance = ModuleInstance>(
|
|
53
|
+
resolve<T extends ModuleInstance = ModuleInstance>(all: '*', options?: ModuleFilterOptions<T>): Promisable<T[]>
|
|
54
|
+
resolve<T extends ModuleInstance = ModuleInstance>(filter: ModuleFilter<T>, options?: ModuleFilterOptions<T>): Promisable<T[]>
|
|
50
55
|
resolve<T extends ModuleInstance = ModuleInstance>(id: ModuleIdentifier, options?: ModuleFilterOptions<T>): Promisable<T | undefined>
|
|
56
|
+
/** @deprecated use '*' if trying to resolve all */
|
|
57
|
+
resolve<T extends ModuleInstance = ModuleInstance>(filter?: ModuleFilter<T>, options?: ModuleFilterOptions<T>): Promisable<T[]>
|
|
51
58
|
resolve<T extends ModuleInstance = ModuleInstance>(
|
|
52
|
-
idOrFilter
|
|
59
|
+
idOrFilter: ModuleFilter<T> | string = '*',
|
|
53
60
|
options?: ModuleFilterOptions<T>,
|
|
54
61
|
): Promisable<T[] | T | undefined> {
|
|
55
62
|
const unfiltered = (() => {
|
|
56
63
|
if (idOrFilter) {
|
|
57
64
|
if (typeof idOrFilter === 'string') {
|
|
58
|
-
|
|
59
|
-
|
|
65
|
+
if (idOrFilter === '*') {
|
|
66
|
+
return Object.values(this.modules) as T[]
|
|
67
|
+
}
|
|
68
|
+
const id = idOrFilter as ModuleIdentifier
|
|
69
|
+
const name = isModuleName(id) ? id : undefined
|
|
70
|
+
const address = isAddress(id) ? id : undefined
|
|
71
|
+
assertEx(name || address, () => 'module identifier must be a ModuleName or Address')
|
|
72
|
+
return (
|
|
73
|
+
(name ? this.resolveByName<T>(Object.values(this.modules), [name]).pop() : undefined) ??
|
|
74
|
+
(address ? this.resolveByAddress<T>(this.modules, [address]).pop() : undefined)
|
|
75
|
+
)
|
|
60
76
|
} else {
|
|
61
77
|
const filter = idOrFilter
|
|
62
78
|
if (isAddressModuleFilter(filter)) {
|
|
63
|
-
return this.resolveByAddress<T>(
|
|
79
|
+
return this.resolveByAddress<T>(this.modules, filter.address)
|
|
64
80
|
} else if (isNameModuleFilter(filter)) {
|
|
65
81
|
return this.resolveByName<T>(Object.values(this.modules), filter.name)
|
|
66
82
|
} else if (isQueryModuleFilter(filter)) {
|
|
@@ -90,6 +106,7 @@ export class SimpleModuleResolver implements ModuleRepository {
|
|
|
90
106
|
}
|
|
91
107
|
|
|
92
108
|
private removeSingleModule(address: Address) {
|
|
109
|
+
assertEx(isAddress(address), () => 'Invalid address')
|
|
93
110
|
if (address && this.modules[address]) {
|
|
94
111
|
delete this.modules[address]
|
|
95
112
|
const name = this.addressToName[address]
|
|
@@ -99,42 +116,35 @@ export class SimpleModuleResolver implements ModuleRepository {
|
|
|
99
116
|
}
|
|
100
117
|
}
|
|
101
118
|
|
|
102
|
-
private resolveByAddress<T extends ModuleInstance = ModuleInstance>(modules:
|
|
103
|
-
return (
|
|
104
|
-
address
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
return modules.filter((module) => module.address === address)
|
|
109
|
-
}),
|
|
110
|
-
),
|
|
111
|
-
)
|
|
112
|
-
: modules) as T[]
|
|
119
|
+
private resolveByAddress<T extends ModuleInstance = ModuleInstance>(modules: Record<Address, ModuleInstance>, address: Address[]): T[] {
|
|
120
|
+
return compact(
|
|
121
|
+
address.map((address) => {
|
|
122
|
+
return modules[address]
|
|
123
|
+
}),
|
|
124
|
+
) as T[]
|
|
113
125
|
}
|
|
114
126
|
|
|
115
|
-
private resolveByName<T extends ModuleInstance = ModuleInstance>(modules: ModuleInstance[], name
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
127
|
+
private resolveByName<T extends ModuleInstance = ModuleInstance>(modules: ModuleInstance[], name: ModuleName[]): T[] {
|
|
128
|
+
return compact(
|
|
129
|
+
name.map((name) => {
|
|
130
|
+
return modules.find((module) => module.config.name === name)
|
|
131
|
+
}),
|
|
132
|
+
) as T[]
|
|
120
133
|
}
|
|
121
134
|
|
|
122
|
-
private resolveByQuery<T extends ModuleInstance = ModuleInstance>(modules: ModuleInstance[], query
|
|
123
|
-
return (
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
),
|
|
137
|
-
)
|
|
138
|
-
: modules) as T[]
|
|
135
|
+
private resolveByQuery<T extends ModuleInstance = ModuleInstance>(modules: ModuleInstance[], query: string[][]): T[] {
|
|
136
|
+
return compact(
|
|
137
|
+
modules.filter((module) =>
|
|
138
|
+
query?.reduce((supported, queryList) => {
|
|
139
|
+
return (
|
|
140
|
+
// eslint-disable-next-line unicorn/no-array-reduce
|
|
141
|
+
queryList.reduce((supported, query) => {
|
|
142
|
+
const queryable = module.queries.includes(query)
|
|
143
|
+
return supported && queryable
|
|
144
|
+
}, true) || supported
|
|
145
|
+
)
|
|
146
|
+
}, false),
|
|
147
|
+
),
|
|
148
|
+
) as T[]
|
|
139
149
|
}
|
|
140
150
|
}
|