@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.
Files changed (42) hide show
  1. package/dist/browser/CompositeModuleResolver.d.cts +6 -1
  2. package/dist/browser/CompositeModuleResolver.d.cts.map +1 -1
  3. package/dist/browser/CompositeModuleResolver.d.mts +6 -1
  4. package/dist/browser/CompositeModuleResolver.d.mts.map +1 -1
  5. package/dist/browser/CompositeModuleResolver.d.ts +6 -1
  6. package/dist/browser/CompositeModuleResolver.d.ts.map +1 -1
  7. package/dist/browser/ResolverEventEmitter.d.cts.map +1 -1
  8. package/dist/browser/ResolverEventEmitter.d.mts.map +1 -1
  9. package/dist/browser/ResolverEventEmitter.d.ts.map +1 -1
  10. package/dist/browser/SimpleModuleResolver.d.cts +6 -3
  11. package/dist/browser/SimpleModuleResolver.d.cts.map +1 -1
  12. package/dist/browser/SimpleModuleResolver.d.mts +6 -3
  13. package/dist/browser/SimpleModuleResolver.d.mts.map +1 -1
  14. package/dist/browser/SimpleModuleResolver.d.ts +6 -3
  15. package/dist/browser/SimpleModuleResolver.d.ts.map +1 -1
  16. package/dist/browser/index.cjs +40 -20
  17. package/dist/browser/index.cjs.map +1 -1
  18. package/dist/browser/index.js +42 -22
  19. package/dist/browser/index.js.map +1 -1
  20. package/dist/node/CompositeModuleResolver.d.cts +6 -1
  21. package/dist/node/CompositeModuleResolver.d.cts.map +1 -1
  22. package/dist/node/CompositeModuleResolver.d.mts +6 -1
  23. package/dist/node/CompositeModuleResolver.d.mts.map +1 -1
  24. package/dist/node/CompositeModuleResolver.d.ts +6 -1
  25. package/dist/node/CompositeModuleResolver.d.ts.map +1 -1
  26. package/dist/node/ResolverEventEmitter.d.cts.map +1 -1
  27. package/dist/node/ResolverEventEmitter.d.mts.map +1 -1
  28. package/dist/node/ResolverEventEmitter.d.ts.map +1 -1
  29. package/dist/node/SimpleModuleResolver.d.cts +6 -3
  30. package/dist/node/SimpleModuleResolver.d.cts.map +1 -1
  31. package/dist/node/SimpleModuleResolver.d.mts +6 -3
  32. package/dist/node/SimpleModuleResolver.d.mts.map +1 -1
  33. package/dist/node/SimpleModuleResolver.d.ts +6 -3
  34. package/dist/node/SimpleModuleResolver.d.ts.map +1 -1
  35. package/dist/node/index.cjs +40 -23
  36. package/dist/node/index.cjs.map +1 -1
  37. package/dist/node/index.js +42 -25
  38. package/dist/node/index.js.map +1 -1
  39. package/package.json +8 -8
  40. package/src/CompositeModuleResolver.ts +27 -4
  41. package/src/ResolverEventEmitter.ts +1 -0
  42. package/src/SimpleModuleResolver.ts +53 -43
@@ -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 { compact, flatten } from "@xylabs/lodash";
18
- import { isAddressModuleFilter, isNameModuleFilter, isQueryModuleFilter } from "@xyo-network/module-model";
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
- return this.resolveByName(Object.values(this.modules), [
52
- id
53
- ]).pop() ?? this.resolveByAddress(Object.values(this.modules), [
54
- id
55
- ]).pop();
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(Object.values(this.modules), filter.address);
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 address ? compact(flatten(address == null ? void 0 : address.map((address2) => {
93
- return modules.filter((module) => module.address === address2);
94
- }))) : modules;
101
+ return compact(address.map((address2) => {
102
+ return modules[address2];
103
+ }));
95
104
  }
96
105
  resolveByName(modules, name) {
97
- if (name) {
98
- return compact(name.flatMap((name2) => modules.filter((module) => {
99
- var _a;
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 query ? compact(modules.filter((module) => query == null ? void 0 : query.reduce((supported, queryList) => {
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))) : modules;
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
- assertEx(idParts.length >= 2, "Not a valid multipart identifier");
228
- const id = assertEx(idParts.shift());
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
  }
@@ -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.13",
14
- "@xylabs/exists": "^3.0.13",
15
- "@xylabs/hex": "^3.0.13",
16
- "@xylabs/lodash": "^3.0.13",
17
- "@xylabs/object": "^3.0.13",
18
- "@xylabs/promise": "^3.0.13",
19
- "@xyo-network/module-model": "~2.92.7",
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.7",
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<T extends ModuleInstance = ModuleInstance>(filter?: ModuleFilter<T>, options?: ModuleFilterOptions<T>): Promise<T[]>
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?: ModuleFilter<T> | ModuleIdentifier,
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 { Address } from '@xylabs/hex'
2
- import { compact, flatten } from '@xylabs/lodash'
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<string, string> = {}
19
- private modules: Record<string, ModuleInstance> = {}
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>(filter?: ModuleFilter<T>, options?: ModuleFilterOptions<T>): Promisable<T[]>
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?: ModuleFilter<T> | string,
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
- const id = idOrFilter
59
- return this.resolveByName<T>(Object.values(this.modules), [id]).pop() ?? this.resolveByAddress<T>(Object.values(this.modules), [id]).pop()
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>(Object.values(this.modules), filter.address)
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: ModuleInstance[], address?: string[]): T[] {
103
- return (
104
- address ?
105
- compact(
106
- flatten(
107
- address?.map((address) => {
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?: string[]): T[] {
116
- if (name) {
117
- return compact(name.flatMap((name) => modules.filter((module) => module.config?.name === name))) as T[]
118
- }
119
- return modules as T[]
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?: string[][]): T[] {
123
- return (
124
- query ?
125
- compact(
126
- modules.filter((module) =>
127
- query?.reduce((supported, queryList) => {
128
- return (
129
- // eslint-disable-next-line unicorn/no-array-reduce
130
- queryList.reduce((supported, query) => {
131
- const queryable = module.queries.includes(query)
132
- return supported && queryable
133
- }, true) || supported
134
- )
135
- }, false),
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
  }