@xyo-network/module-resolver 2.90.22 → 2.91.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (87) hide show
  1. package/dist/browser/CompositeModuleResolver.d.cts +15 -5
  2. package/dist/browser/CompositeModuleResolver.d.cts.map +1 -1
  3. package/dist/browser/CompositeModuleResolver.d.mts +15 -5
  4. package/dist/browser/CompositeModuleResolver.d.mts.map +1 -1
  5. package/dist/browser/CompositeModuleResolver.d.ts +15 -5
  6. package/dist/browser/CompositeModuleResolver.d.ts.map +1 -1
  7. package/dist/browser/SimpleModuleResolver.d.cts +4 -3
  8. package/dist/browser/SimpleModuleResolver.d.cts.map +1 -1
  9. package/dist/browser/SimpleModuleResolver.d.mts +4 -3
  10. package/dist/browser/SimpleModuleResolver.d.mts.map +1 -1
  11. package/dist/browser/SimpleModuleResolver.d.ts +4 -3
  12. package/dist/browser/SimpleModuleResolver.d.ts.map +1 -1
  13. package/dist/browser/index.cjs +56 -25
  14. package/dist/browser/index.cjs.map +1 -1
  15. package/dist/browser/index.d.cts +0 -1
  16. package/dist/browser/index.d.cts.map +1 -1
  17. package/dist/browser/index.d.mts +0 -1
  18. package/dist/browser/index.d.mts.map +1 -1
  19. package/dist/browser/index.d.ts +0 -1
  20. package/dist/browser/index.d.ts.map +1 -1
  21. package/dist/browser/index.js +53 -22
  22. package/dist/browser/index.js.map +1 -1
  23. package/dist/browser/transformers/Xns.d.cts +3 -0
  24. package/dist/browser/transformers/Xns.d.cts.map +1 -0
  25. package/dist/browser/transformers/Xns.d.mts +3 -0
  26. package/dist/browser/transformers/Xns.d.mts.map +1 -0
  27. package/dist/browser/transformers/Xns.d.ts +3 -0
  28. package/dist/browser/transformers/Xns.d.ts.map +1 -0
  29. package/dist/browser/transformers/index.d.cts +3 -0
  30. package/dist/browser/transformers/index.d.cts.map +1 -0
  31. package/dist/browser/transformers/index.d.mts +3 -0
  32. package/dist/browser/transformers/index.d.mts.map +1 -0
  33. package/dist/browser/transformers/index.d.ts +3 -0
  34. package/dist/browser/transformers/index.d.ts.map +1 -0
  35. package/dist/browser/transformers/model.d.cts +7 -0
  36. package/dist/browser/transformers/model.d.cts.map +1 -0
  37. package/dist/browser/transformers/model.d.mts +7 -0
  38. package/dist/browser/transformers/model.d.mts.map +1 -0
  39. package/dist/browser/transformers/model.d.ts +7 -0
  40. package/dist/browser/transformers/model.d.ts.map +1 -0
  41. package/dist/node/CompositeModuleResolver.d.cts +15 -5
  42. package/dist/node/CompositeModuleResolver.d.cts.map +1 -1
  43. package/dist/node/CompositeModuleResolver.d.mts +15 -5
  44. package/dist/node/CompositeModuleResolver.d.mts.map +1 -1
  45. package/dist/node/CompositeModuleResolver.d.ts +15 -5
  46. package/dist/node/CompositeModuleResolver.d.ts.map +1 -1
  47. package/dist/node/SimpleModuleResolver.d.cts +4 -3
  48. package/dist/node/SimpleModuleResolver.d.cts.map +1 -1
  49. package/dist/node/SimpleModuleResolver.d.mts +4 -3
  50. package/dist/node/SimpleModuleResolver.d.mts.map +1 -1
  51. package/dist/node/SimpleModuleResolver.d.ts +4 -3
  52. package/dist/node/SimpleModuleResolver.d.ts.map +1 -1
  53. package/dist/node/index.cjs +56 -26
  54. package/dist/node/index.cjs.map +1 -1
  55. package/dist/node/index.d.cts +0 -1
  56. package/dist/node/index.d.cts.map +1 -1
  57. package/dist/node/index.d.mts +0 -1
  58. package/dist/node/index.d.mts.map +1 -1
  59. package/dist/node/index.d.ts +0 -1
  60. package/dist/node/index.d.ts.map +1 -1
  61. package/dist/node/index.js +53 -22
  62. package/dist/node/index.js.map +1 -1
  63. package/dist/node/transformers/Xns.d.cts +3 -0
  64. package/dist/node/transformers/Xns.d.cts.map +1 -0
  65. package/dist/node/transformers/Xns.d.mts +3 -0
  66. package/dist/node/transformers/Xns.d.mts.map +1 -0
  67. package/dist/node/transformers/Xns.d.ts +3 -0
  68. package/dist/node/transformers/Xns.d.ts.map +1 -0
  69. package/dist/node/transformers/index.d.cts +3 -0
  70. package/dist/node/transformers/index.d.cts.map +1 -0
  71. package/dist/node/transformers/index.d.mts +3 -0
  72. package/dist/node/transformers/index.d.mts.map +1 -0
  73. package/dist/node/transformers/index.d.ts +3 -0
  74. package/dist/node/transformers/index.d.ts.map +1 -0
  75. package/dist/node/transformers/model.d.cts +7 -0
  76. package/dist/node/transformers/model.d.cts.map +1 -0
  77. package/dist/node/transformers/model.d.mts +7 -0
  78. package/dist/node/transformers/model.d.mts.map +1 -0
  79. package/dist/node/transformers/model.d.ts +7 -0
  80. package/dist/node/transformers/model.d.ts.map +1 -0
  81. package/package.json +10 -8
  82. package/src/CompositeModuleResolver.ts +55 -13
  83. package/src/SimpleModuleResolver.ts +51 -46
  84. package/src/index.ts +0 -1
  85. package/src/transformers/Xns.ts +5 -0
  86. package/src/transformers/index.ts +2 -0
  87. package/src/transformers/model.ts +8 -0
@@ -0,0 +1,7 @@
1
+ import { Promisable } from '@xylabs/promise';
2
+ import { ModuleIdentifier } from '@xyo-network/module-model';
3
+ export type ModuleIdentifierTransformerFunc = (id: ModuleIdentifier) => Promisable<ModuleIdentifier>;
4
+ export interface ModuleIdentifierTransformer {
5
+ transform: ModuleIdentifierTransformerFunc;
6
+ }
7
+ //# sourceMappingURL=model.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"model.d.ts","sourceRoot":"","sources":["../../../src/transformers/model.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAA;AAC5C,OAAO,EAAE,gBAAgB,EAAE,MAAM,2BAA2B,CAAA;AAE5D,MAAM,MAAM,+BAA+B,GAAG,CAAC,EAAE,EAAE,gBAAgB,KAAK,UAAU,CAAC,gBAAgB,CAAC,CAAA;AAEpG,MAAM,WAAW,2BAA2B;IAC1C,SAAS,EAAE,+BAA+B,CAAA;CAC3C"}
package/package.json CHANGED
@@ -10,15 +10,17 @@
10
10
  "url": "https://github.com/XYOracleNetwork/sdk-xyo-client-js/issues"
11
11
  },
12
12
  "dependencies": {
13
- "@xylabs/exists": "^2.14.2",
14
- "@xylabs/lodash": "^2.14.2",
15
- "@xylabs/object": "^2.89.2",
16
- "@xylabs/promise": "^2.14.2",
17
- "@xyo-network/module-model": "~2.90.22"
13
+ "@xylabs/assert": "^3.0.0",
14
+ "@xylabs/exists": "^3.0.0",
15
+ "@xylabs/hex": "^3.0.0",
16
+ "@xylabs/lodash": "^3.0.0",
17
+ "@xylabs/object": "^3.0.0",
18
+ "@xylabs/promise": "^3.0.0",
19
+ "@xyo-network/module-model": "~2.91.0"
18
20
  },
19
21
  "devDependencies": {
20
- "@xylabs/ts-scripts-yarn3": "^3.2.42",
21
- "@xylabs/tsconfig": "^3.2.42",
22
+ "@xylabs/ts-scripts-yarn3": "^3.4.1",
23
+ "@xylabs/tsconfig": "^3.4.1",
22
24
  "jest": "^29.7.0",
23
25
  "jest-mock-extended": "^3.0.5",
24
26
  "typescript": "^5.3.3"
@@ -62,6 +64,6 @@
62
64
  "url": "https://github.com/XYOracleNetwork/sdk-xyo-client-js.git"
63
65
  },
64
66
  "sideEffects": false,
65
- "version": "2.90.22",
67
+ "version": "2.91.0",
66
68
  "type": "module"
67
69
  }
@@ -1,28 +1,48 @@
1
+ import { assertEx } from '@xylabs/assert'
1
2
  import { exists } from '@xylabs/exists'
3
+ import { Address } from '@xylabs/hex'
2
4
  import { Base, BaseParams } from '@xylabs/object'
5
+ import { Promisable } from '@xylabs/promise'
3
6
  import {
4
7
  duplicateModules,
5
8
  ModuleFilter,
6
9
  ModuleFilterOptions,
10
+ ModuleIdentifier,
11
+ ModuleIdentifierPart,
7
12
  ModuleInstance,
8
13
  ModuleRepository,
9
14
  ModuleResolverInstance,
10
15
  } from '@xyo-network/module-model'
11
16
 
12
17
  import { SimpleModuleResolver } from './SimpleModuleResolver'
18
+ import { ModuleIdentifierTransformer } from './transformers'
13
19
 
14
- export class CompositeModuleResolver extends Base implements ModuleRepository, ModuleResolverInstance {
20
+ export type ModuleIdentifierTransformerFunc = (id: ModuleIdentifier) => Promisable<ModuleIdentifier>
21
+
22
+ export interface ModuleResolverParams extends BaseParams {
23
+ moduleIdentifierTransformers?: ModuleIdentifierTransformer[]
24
+ }
25
+
26
+ const moduleIdentifierParts = (moduleIdentifier: ModuleIdentifier): ModuleIdentifierPart[] => {
27
+ return moduleIdentifier?.split(':') as ModuleIdentifierPart[]
28
+ }
29
+
30
+ export class CompositeModuleResolver extends Base<ModuleResolverParams> implements ModuleRepository, ModuleResolverInstance {
15
31
  static defaultMaxDepth = 5
16
32
  protected resolvers: ModuleResolverInstance[] = []
17
33
  private localResolver: SimpleModuleResolver
18
34
 
19
- constructor(params: BaseParams = {}) {
35
+ constructor(params: ModuleResolverParams = {}) {
20
36
  super(params)
21
37
  const localResolver = new SimpleModuleResolver()
22
38
  this.addResolver(localResolver)
23
39
  this.localResolver = localResolver
24
40
  }
25
41
 
42
+ private get moduleIdentifierTransformers() {
43
+ return this.params.moduleIdentifierTransformers
44
+ }
45
+
26
46
  add(module: ModuleInstance): this
27
47
  add(module: ModuleInstance[]): this
28
48
  add(module: ModuleInstance | ModuleInstance[]): this {
@@ -39,11 +59,11 @@ export class CompositeModuleResolver extends Base implements ModuleRepository, M
39
59
  return this
40
60
  }
41
61
 
42
- remove(addressOrName: string | string[]): this {
43
- if (Array.isArray(addressOrName)) {
44
- for (const address of addressOrName) this.removeSingleModule(address)
62
+ remove(addresses: Address[] | Address): this {
63
+ if (Array.isArray(addresses)) {
64
+ for (const address of addresses) this.removeSingleModule(address)
45
65
  } else {
46
- this.removeSingleModule(addressOrName)
66
+ this.removeSingleModule(addresses)
47
67
  }
48
68
  return this
49
69
  }
@@ -54,31 +74,37 @@ export class CompositeModuleResolver extends Base implements ModuleRepository, M
54
74
  }
55
75
 
56
76
  async resolve<T extends ModuleInstance = ModuleInstance>(filter?: ModuleFilter<T>, options?: ModuleFilterOptions<T>): Promise<T[]>
57
- async resolve<T extends ModuleInstance = ModuleInstance>(nameOrAddress: string, options?: ModuleFilterOptions<T>): Promise<T | undefined>
77
+ async resolve<T extends ModuleInstance = ModuleInstance>(id: ModuleIdentifier, options?: ModuleFilterOptions<T>): Promise<T | undefined>
58
78
  async resolve<T extends ModuleInstance = ModuleInstance>(
59
- nameOrAddressOrFilter?: ModuleFilter<T> | string,
79
+ idOrFilter?: ModuleFilter<T> | ModuleIdentifier,
60
80
  options?: ModuleFilterOptions<T>,
61
81
  ): Promise<T | T[] | undefined> {
62
82
  const mutatedOptions = { ...options, maxDepth: (options?.maxDepth ?? CompositeModuleResolver.defaultMaxDepth) - 1 }
63
- if (typeof nameOrAddressOrFilter === 'string') {
83
+ if (typeof idOrFilter === 'string') {
84
+ const idParts = moduleIdentifierParts(idOrFilter)
85
+ if (idParts.length > 1) {
86
+ return await this.resolveMultipartIdentifier<T>(idOrFilter)
87
+ }
88
+ const id = await this.transformModuleIdentifier(idOrFilter)
64
89
  if (mutatedOptions.maxDepth < 0) {
65
90
  return undefined
66
91
  }
67
92
  const results = await Promise.all(
68
93
  this.resolvers.map(async (resolver) => {
69
- const result: T | undefined = await resolver.resolve<T>(nameOrAddressOrFilter, mutatedOptions)
94
+ const result: T | undefined = await resolver.resolve<T>(id, mutatedOptions)
70
95
  return result
71
96
  }),
72
97
  )
73
98
  const result: T | undefined = results.filter(exists).filter(duplicateModules).pop()
74
99
  return result
75
100
  } else {
101
+ const filter = idOrFilter
76
102
  if (mutatedOptions.maxDepth < 0) {
77
103
  return []
78
104
  }
79
105
  const result = await Promise.all(
80
106
  this.resolvers.map(async (resolver) => {
81
- const result: T[] = await resolver.resolve<T>(nameOrAddressOrFilter, mutatedOptions)
107
+ const result: T[] = await resolver.resolve<T>(filter, mutatedOptions)
82
108
  return result
83
109
  }),
84
110
  )
@@ -92,7 +118,23 @@ export class CompositeModuleResolver extends Base implements ModuleRepository, M
92
118
  this.localResolver.add(module)
93
119
  }
94
120
  }
95
- private removeSingleModule(addressOrName: string) {
96
- this.localResolver.remove(addressOrName)
121
+ private removeSingleModule(address: Address) {
122
+ this.localResolver.remove(address)
123
+ }
124
+
125
+ private async resolveMultipartIdentifier<T extends ModuleInstance = ModuleInstance>(moduleIdentifier: ModuleIdentifier): Promise<T | undefined> {
126
+ const idParts = moduleIdentifierParts(moduleIdentifier)
127
+ assertEx(idParts.length >= 2, 'Not a valid multipart identifier')
128
+ const id = assertEx(idParts.shift())
129
+ const module = await this.resolve(id)
130
+ return await module?.resolve<T>(idParts.join(':'))
131
+ }
132
+
133
+ private async transformModuleIdentifier(identifier: ModuleIdentifier) {
134
+ let id = identifier
135
+ for (const transformer of this.moduleIdentifierTransformers ?? []) {
136
+ id = await transformer.transform(id)
137
+ }
138
+ return id
97
139
  }
98
140
  }
@@ -1,14 +1,16 @@
1
+ import { Address } from '@xylabs/hex'
1
2
  import { compact, flatten } from '@xylabs/lodash'
2
3
  import { Promisable } from '@xylabs/promise'
3
4
  import {
4
- AddressModuleFilter,
5
+ isAddressModuleFilter,
6
+ isNameModuleFilter,
7
+ isQueryModuleFilter,
5
8
  ModuleFilter,
6
9
  ModuleFilterOptions,
10
+ ModuleIdentifier,
7
11
  ModuleInstance,
8
12
  ModuleRepository,
9
13
  ModuleResolverInstance,
10
- NameModuleFilter,
11
- QueryModuleFilter,
12
14
  } from '@xyo-network/module-model'
13
15
 
14
16
  //This class is now package private (not exported from index.ts)
@@ -31,7 +33,7 @@ export class SimpleModuleResolver implements ModuleRepository {
31
33
  throw 'Adding resolvers not supported'
32
34
  }
33
35
 
34
- remove(address: string | string[]): this {
36
+ remove(address: Address | Address[]): this {
35
37
  if (Array.isArray(address)) {
36
38
  for (const addr of address) this.removeSingleModule(addr)
37
39
  } else {
@@ -45,24 +47,25 @@ export class SimpleModuleResolver implements ModuleRepository {
45
47
  }
46
48
 
47
49
  resolve<T extends ModuleInstance = ModuleInstance>(filter?: ModuleFilter<T>, options?: ModuleFilterOptions<T>): Promisable<T[]>
48
- resolve<T extends ModuleInstance = ModuleInstance>(nameOrAddress: string, options?: ModuleFilterOptions<T>): Promisable<T | undefined>
50
+ resolve<T extends ModuleInstance = ModuleInstance>(id: ModuleIdentifier, options?: ModuleFilterOptions<T>): Promisable<T | undefined>
49
51
  resolve<T extends ModuleInstance = ModuleInstance>(
50
- nameOrAddressOrFilter?: ModuleFilter<T> | string,
52
+ idOrFilter?: ModuleFilter<T> | string,
51
53
  options?: ModuleFilterOptions<T>,
52
54
  ): Promisable<T[] | T | undefined> {
53
55
  const unfiltered = (() => {
54
- if (nameOrAddressOrFilter) {
55
- if (typeof nameOrAddressOrFilter === 'string') {
56
- return (
57
- this.resolveByName<T>(Object.values(this.modules), [nameOrAddressOrFilter]).pop() ??
58
- this.resolveByAddress<T>(Object.values(this.modules), [nameOrAddressOrFilter]).pop()
59
- )
60
- } else if ((nameOrAddressOrFilter as AddressModuleFilter).address) {
61
- return this.resolveByAddress<T>(Object.values(this.modules), (nameOrAddressOrFilter as AddressModuleFilter).address)
62
- } else if ((nameOrAddressOrFilter as NameModuleFilter).name) {
63
- return this.resolveByName<T>(Object.values(this.modules), (nameOrAddressOrFilter as NameModuleFilter).name)
64
- } else if ((nameOrAddressOrFilter as QueryModuleFilter).query) {
65
- return this.resolveByQuery<T>(Object.values(this.modules), (nameOrAddressOrFilter as QueryModuleFilter).query)
56
+ if (idOrFilter) {
57
+ 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()
60
+ } else {
61
+ const filter = idOrFilter
62
+ if (isAddressModuleFilter(filter)) {
63
+ return this.resolveByAddress<T>(Object.values(this.modules), filter.address)
64
+ } else if (isNameModuleFilter(filter)) {
65
+ return this.resolveByName<T>(Object.values(this.modules), filter.name)
66
+ } else if (isQueryModuleFilter(filter)) {
67
+ return this.resolveByQuery<T>(Object.values(this.modules), filter.query)
68
+ }
66
69
  }
67
70
  } else {
68
71
  return Object.values(this.modules) as T[]
@@ -70,7 +73,11 @@ export class SimpleModuleResolver implements ModuleRepository {
70
73
  })()
71
74
  const identity = options?.identity
72
75
  if (identity) {
73
- return Array.isArray(unfiltered) ? unfiltered?.filter((module) => identity(module)) : identity(unfiltered) ? unfiltered : undefined
76
+ return (
77
+ Array.isArray(unfiltered) ? unfiltered?.filter((module) => identity(module))
78
+ : identity(unfiltered) ? unfiltered
79
+ : undefined
80
+ )
74
81
  } else {
75
82
  return unfiltered
76
83
  }
@@ -82,7 +89,7 @@ export class SimpleModuleResolver implements ModuleRepository {
82
89
  }
83
90
  }
84
91
 
85
- private removeSingleModule(address: string) {
92
+ private removeSingleModule(address: Address) {
86
93
  if (address && this.modules[address]) {
87
94
  delete this.modules[address]
88
95
  const name = this.addressToName[address]
@@ -94,16 +101,15 @@ export class SimpleModuleResolver implements ModuleRepository {
94
101
 
95
102
  private resolveByAddress<T extends ModuleInstance = ModuleInstance>(modules: ModuleInstance[], address?: string[]): T[] {
96
103
  return (
97
- address
98
- ? compact(
99
- flatten(
100
- address?.map((address) => {
101
- return modules.filter((module) => module.address === address)
102
- }),
103
- ),
104
- )
105
- : modules
106
- ) as T[]
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[]
107
113
  }
108
114
 
109
115
  private resolveByName<T extends ModuleInstance = ModuleInstance>(modules: ModuleInstance[], name?: string[]): T[] {
@@ -115,21 +121,20 @@ export class SimpleModuleResolver implements ModuleRepository {
115
121
 
116
122
  private resolveByQuery<T extends ModuleInstance = ModuleInstance>(modules: ModuleInstance[], query?: string[][]): T[] {
117
123
  return (
118
- query
119
- ? compact(
120
- modules.filter((module) =>
121
- query?.reduce((supported, queryList) => {
122
- return (
123
- // eslint-disable-next-line unicorn/no-array-reduce
124
- queryList.reduce((supported, query) => {
125
- const queryable = module.queries.includes(query)
126
- return supported && queryable
127
- }, true) || supported
128
- )
129
- }, false),
130
- ),
131
- )
132
- : modules
133
- ) as T[]
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[]
134
139
  }
135
140
  }
package/src/index.ts CHANGED
@@ -1,3 +1,2 @@
1
1
  export * from './CompositeModuleResolver'
2
2
  export * from './ResolverEventEmitter'
3
- export * from './SimpleModuleResolver'
@@ -0,0 +1,5 @@
1
+ import { ModuleIdentifier } from '@xyo-network/module-model'
2
+
3
+ export const XnsModuleIdentifierTransformer = (id: ModuleIdentifier) => {
4
+ return id
5
+ }
@@ -0,0 +1,2 @@
1
+ export * from './model'
2
+ export * from './Xns'
@@ -0,0 +1,8 @@
1
+ import { Promisable } from '@xylabs/promise'
2
+ import { ModuleIdentifier } from '@xyo-network/module-model'
3
+
4
+ export type ModuleIdentifierTransformerFunc = (id: ModuleIdentifier) => Promisable<ModuleIdentifier>
5
+
6
+ export interface ModuleIdentifierTransformer {
7
+ transform: ModuleIdentifierTransformerFunc
8
+ }