@xyo-network/module-resolver 2.92.11 → 2.93.0-rc.1

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 (61) hide show
  1. package/dist/browser/AbstractModuleResolver.d.cts +12 -0
  2. package/dist/browser/AbstractModuleResolver.d.cts.map +1 -0
  3. package/dist/browser/AbstractModuleResolver.d.mts +12 -0
  4. package/dist/browser/AbstractModuleResolver.d.mts.map +1 -0
  5. package/dist/browser/AbstractModuleResolver.d.ts +12 -0
  6. package/dist/browser/AbstractModuleResolver.d.ts.map +1 -0
  7. package/dist/browser/CompositeModuleResolver.d.cts +4 -9
  8. package/dist/browser/CompositeModuleResolver.d.cts.map +1 -1
  9. package/dist/browser/CompositeModuleResolver.d.mts +4 -9
  10. package/dist/browser/CompositeModuleResolver.d.mts.map +1 -1
  11. package/dist/browser/CompositeModuleResolver.d.ts +4 -9
  12. package/dist/browser/CompositeModuleResolver.d.ts.map +1 -1
  13. package/dist/browser/SimpleModuleResolver.d.cts +5 -7
  14. package/dist/browser/SimpleModuleResolver.d.cts.map +1 -1
  15. package/dist/browser/SimpleModuleResolver.d.mts +5 -7
  16. package/dist/browser/SimpleModuleResolver.d.mts.map +1 -1
  17. package/dist/browser/SimpleModuleResolver.d.ts +5 -7
  18. package/dist/browser/SimpleModuleResolver.d.ts.map +1 -1
  19. package/dist/browser/index.cjs +57 -20
  20. package/dist/browser/index.cjs.map +1 -1
  21. package/dist/browser/index.js +48 -11
  22. package/dist/browser/index.js.map +1 -1
  23. package/dist/browser/toJson.d.cts +3 -0
  24. package/dist/browser/toJson.d.cts.map +1 -0
  25. package/dist/browser/toJson.d.mts +3 -0
  26. package/dist/browser/toJson.d.mts.map +1 -0
  27. package/dist/browser/toJson.d.ts +3 -0
  28. package/dist/browser/toJson.d.ts.map +1 -0
  29. package/dist/node/AbstractModuleResolver.d.cts +12 -0
  30. package/dist/node/AbstractModuleResolver.d.cts.map +1 -0
  31. package/dist/node/AbstractModuleResolver.d.mts +12 -0
  32. package/dist/node/AbstractModuleResolver.d.mts.map +1 -0
  33. package/dist/node/AbstractModuleResolver.d.ts +12 -0
  34. package/dist/node/AbstractModuleResolver.d.ts.map +1 -0
  35. package/dist/node/CompositeModuleResolver.d.cts +4 -9
  36. package/dist/node/CompositeModuleResolver.d.cts.map +1 -1
  37. package/dist/node/CompositeModuleResolver.d.mts +4 -9
  38. package/dist/node/CompositeModuleResolver.d.mts.map +1 -1
  39. package/dist/node/CompositeModuleResolver.d.ts +4 -9
  40. package/dist/node/CompositeModuleResolver.d.ts.map +1 -1
  41. package/dist/node/SimpleModuleResolver.d.cts +5 -7
  42. package/dist/node/SimpleModuleResolver.d.cts.map +1 -1
  43. package/dist/node/SimpleModuleResolver.d.mts +5 -7
  44. package/dist/node/SimpleModuleResolver.d.mts.map +1 -1
  45. package/dist/node/SimpleModuleResolver.d.ts +5 -7
  46. package/dist/node/SimpleModuleResolver.d.ts.map +1 -1
  47. package/dist/node/index.cjs +61 -20
  48. package/dist/node/index.cjs.map +1 -1
  49. package/dist/node/index.js +52 -11
  50. package/dist/node/index.js.map +1 -1
  51. package/dist/node/toJson.d.cts +3 -0
  52. package/dist/node/toJson.d.cts.map +1 -0
  53. package/dist/node/toJson.d.mts +3 -0
  54. package/dist/node/toJson.d.mts.map +1 -0
  55. package/dist/node/toJson.d.ts +3 -0
  56. package/dist/node/toJson.d.ts.map +1 -0
  57. package/package.json +11 -10
  58. package/src/AbstractModuleResolver.ts +53 -0
  59. package/src/CompositeModuleResolver.ts +6 -11
  60. package/src/SimpleModuleResolver.ts +8 -8
  61. package/src/toJson.ts +45 -0
@@ -0,0 +1,53 @@
1
+ import { assertEx } from '@xylabs/assert'
2
+ import { Base, BaseParams, toJsonString } from '@xylabs/object'
3
+ import { Promisable } from '@xylabs/promise'
4
+ import { asModuleInstance, ModuleFilter, ModuleFilterOptions, ModuleIdentifier, ModuleInstance, ModuleResolver } from '@xyo-network/module-model'
5
+
6
+ export abstract class AbstractModuleResolver<T extends BaseParams = BaseParams> extends Base<T> implements ModuleResolver {
7
+ async resolve<T extends ModuleInstance = ModuleInstance>(all: '*', options?: ModuleFilterOptions<T>): Promise<T[]>
8
+ async resolve<T extends ModuleInstance = ModuleInstance>(filter: ModuleFilter<T>, options?: ModuleFilterOptions<T>): Promise<T[]>
9
+ async resolve<T extends ModuleInstance = ModuleInstance>(id: ModuleIdentifier, options?: ModuleFilterOptions<T>): Promise<T | undefined>
10
+ /** @deprecated use '*' if trying to resolve all */
11
+ async resolve<T extends ModuleInstance = ModuleInstance>(filter?: ModuleFilter<T>, options?: ModuleFilterOptions<T>): Promise<T[]>
12
+ async resolve<T extends ModuleInstance = ModuleInstance>(
13
+ idOrFilter: ModuleFilter<T> | string = '*',
14
+ options?: ModuleFilterOptions<T>,
15
+ ): Promise<T[] | T | undefined> {
16
+ if (idOrFilter === '*') {
17
+ const values = (await this.resolveHandler(idOrFilter, options)) as []
18
+ assertEx(Array.isArray(values), () => 'resolveHandler returned a non-array')
19
+ return values.map((value) =>
20
+ asModuleInstance<T>(value, () => {
21
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
22
+ return `resolveHandler returned invalid result (*) [${(value as any)?.constructor?.name}][${toJsonString(value)}]`
23
+ }),
24
+ )
25
+ }
26
+ switch (typeof idOrFilter) {
27
+ case 'string': {
28
+ const value = await this.resolveHandler(idOrFilter, options)
29
+ return asModuleInstance<T>(
30
+ value,
31
+ () =>
32
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
33
+ `resolveHandler returned invalid result (string) [${(value as any)?.constructor?.name}][${toJsonString(value)}]`,
34
+ )
35
+ }
36
+ default: {
37
+ const values = (await this.resolveHandler(idOrFilter, options)) as []
38
+ assertEx(Array.isArray(values), () => 'resolveHandler returned a non-array')
39
+ return values.map((value) =>
40
+ asModuleInstance<T>(value, () => {
41
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
42
+ return `resolveHandler returned invalid result (filter) [${(value as any)?.constructor?.name}][${toJsonString(value)}]`
43
+ }),
44
+ )
45
+ }
46
+ }
47
+ }
48
+
49
+ abstract resolveHandler<T extends ModuleInstance = ModuleInstance>(
50
+ idOrFilter: ModuleFilter<T> | ModuleIdentifier,
51
+ options?: ModuleFilterOptions<T>,
52
+ ): Promisable<T | T[] | undefined>
53
+ }
@@ -1,7 +1,7 @@
1
1
  import { assertEx } from '@xylabs/assert'
2
2
  import { exists } from '@xylabs/exists'
3
3
  import { Address } from '@xylabs/hex'
4
- import { Base, BaseParams } from '@xylabs/object'
4
+ import { BaseParams } from '@xylabs/object'
5
5
  import { Promisable } from '@xylabs/promise'
6
6
  import {
7
7
  CacheConfig,
@@ -16,6 +16,7 @@ import {
16
16
  } from '@xyo-network/module-model'
17
17
  import { LRUCache } from 'lru-cache'
18
18
 
19
+ import { AbstractModuleResolver } from './AbstractModuleResolver'
19
20
  import { SimpleModuleResolver } from './SimpleModuleResolver'
20
21
  import { ModuleIdentifierTransformer } from './transformers'
21
22
 
@@ -30,7 +31,7 @@ const moduleIdentifierParts = (moduleIdentifier: ModuleIdentifier): ModuleIdenti
30
31
  return moduleIdentifier?.split(':') as ModuleIdentifierPart[]
31
32
  }
32
33
 
33
- export class CompositeModuleResolver extends Base<ModuleResolverParams> implements ModuleRepository, ModuleResolverInstance {
34
+ export class CompositeModuleResolver extends AbstractModuleResolver<ModuleResolverParams> implements ModuleRepository, ModuleResolverInstance {
34
35
  static defaultMaxDepth = 5
35
36
  protected resolvers: ModuleResolverInstance[] = []
36
37
  private _cache: LRUCache<ModuleIdentifier, ModuleInstance>
@@ -78,14 +79,8 @@ export class CompositeModuleResolver extends Base<ModuleResolverParams> implemen
78
79
  this.resolvers = this.resolvers.filter((item) => item !== resolver)
79
80
  return this
80
81
  }
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[]>
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[]>
88
- async resolve<T extends ModuleInstance = ModuleInstance>(
82
+
83
+ async resolveHandler<T extends ModuleInstance = ModuleInstance>(
89
84
  idOrFilter: ModuleFilter<T> | ModuleIdentifier = '*',
90
85
  options?: ModuleFilterOptions<T>,
91
86
  ): Promise<T | T[] | undefined> {
@@ -166,7 +161,7 @@ export class CompositeModuleResolver extends Base<ModuleResolverParams> implemen
166
161
  const idParts = moduleIdentifierParts(moduleIdentifier)
167
162
  assertEx(idParts.length >= 2, () => 'Not a valid multipart identifier')
168
163
  const id = assertEx(idParts.shift())
169
- const module = await this.resolve(id)
164
+ const module = await this.resolve<T>(id)
170
165
  return await module?.resolve<T>(idParts.join(':'))
171
166
  }
172
167
 
@@ -13,15 +13,20 @@ import {
13
13
  ModuleInstance,
14
14
  ModuleName,
15
15
  ModuleRepository,
16
- ModuleResolver,
17
16
  ModuleResolverInstance,
18
17
  } from '@xyo-network/module-model'
19
18
 
19
+ import { AbstractModuleResolver } from './AbstractModuleResolver'
20
+
20
21
  //This class is now package private (not exported from index.ts)
21
- export class SimpleModuleResolver implements ModuleRepository, ModuleResolver {
22
+ export class SimpleModuleResolver extends AbstractModuleResolver implements ModuleRepository {
22
23
  private addressToName: Record<Address, ModuleName> = {}
23
24
  private modules: Record<Address, ModuleInstance> = {}
24
25
 
26
+ constructor() {
27
+ super({})
28
+ }
29
+
25
30
  add(module: ModuleInstance): this
26
31
  add(module: ModuleInstance[]): this
27
32
  add(module: ModuleInstance | ModuleInstance[]): this {
@@ -50,12 +55,7 @@ export class SimpleModuleResolver implements ModuleRepository, ModuleResolver {
50
55
  throw 'Removing resolvers not supported'
51
56
  }
52
57
 
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[]>
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[]>
58
- resolve<T extends ModuleInstance = ModuleInstance>(
58
+ resolveHandler<T extends ModuleInstance = ModuleInstance>(
59
59
  idOrFilter: ModuleFilter<T> | string = '*',
60
60
  options?: ModuleFilterOptions<T>,
61
61
  ): Promisable<T[] | T | undefined> {
package/src/toJson.ts ADDED
@@ -0,0 +1,45 @@
1
+ import { JsonArray, JsonObject, JsonValue } from '@xylabs/object'
2
+
3
+ const toJsonArray = (value: unknown[], cycleList?: unknown[], maxDepth = 3): JsonArray => {
4
+ return value.map((item) => toJsonValue(item, cycleList, maxDepth))
5
+ }
6
+
7
+ const toJsonObject = (value: object, cycleList?: unknown[], maxDepth = 3): JsonObject => {
8
+ const result: JsonObject = {}
9
+ for (const [key, entry] of Object.entries(value)) {
10
+ result[key] = value === undefined ? '[Undefined]' : toJsonValue(entry, cycleList, maxDepth)
11
+ }
12
+ return result
13
+ }
14
+
15
+ const toJsonValue = (value: unknown, cycleList?: unknown[], maxDepth = 3): JsonValue => {
16
+ console.log(`toJsonValue: ${maxDepth}`)
17
+ if (maxDepth <= 0 && typeof value === 'object') {
18
+ return '[MaxDepth]'
19
+ }
20
+ if (cycleList?.includes(value)) {
21
+ return '[Circular]'
22
+ }
23
+ switch (typeof value) {
24
+ case 'string':
25
+ case 'boolean':
26
+ case 'number': {
27
+ return value
28
+ }
29
+ case 'object': {
30
+ if (value === null) {
31
+ return null
32
+ }
33
+ const newCycleList = cycleList ?? []
34
+ newCycleList.push(value)
35
+ return Array.isArray(value) ? toJsonArray(value, newCycleList, maxDepth - 1) : toJsonObject(value, newCycleList, maxDepth - 1)
36
+ }
37
+ default: {
38
+ return `[${typeof value}]`
39
+ }
40
+ }
41
+ }
42
+
43
+ export const toJson = (value: unknown, maxDepth = 3): JsonValue => {
44
+ return toJsonValue(value, undefined, maxDepth)
45
+ }