@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.
- package/dist/browser/AbstractModuleResolver.d.cts +12 -0
- package/dist/browser/AbstractModuleResolver.d.cts.map +1 -0
- package/dist/browser/AbstractModuleResolver.d.mts +12 -0
- package/dist/browser/AbstractModuleResolver.d.mts.map +1 -0
- package/dist/browser/AbstractModuleResolver.d.ts +12 -0
- package/dist/browser/AbstractModuleResolver.d.ts.map +1 -0
- package/dist/browser/CompositeModuleResolver.d.cts +4 -9
- package/dist/browser/CompositeModuleResolver.d.cts.map +1 -1
- package/dist/browser/CompositeModuleResolver.d.mts +4 -9
- package/dist/browser/CompositeModuleResolver.d.mts.map +1 -1
- package/dist/browser/CompositeModuleResolver.d.ts +4 -9
- package/dist/browser/CompositeModuleResolver.d.ts.map +1 -1
- package/dist/browser/SimpleModuleResolver.d.cts +5 -7
- package/dist/browser/SimpleModuleResolver.d.cts.map +1 -1
- package/dist/browser/SimpleModuleResolver.d.mts +5 -7
- package/dist/browser/SimpleModuleResolver.d.mts.map +1 -1
- package/dist/browser/SimpleModuleResolver.d.ts +5 -7
- package/dist/browser/SimpleModuleResolver.d.ts.map +1 -1
- package/dist/browser/index.cjs +57 -20
- package/dist/browser/index.cjs.map +1 -1
- package/dist/browser/index.js +48 -11
- package/dist/browser/index.js.map +1 -1
- package/dist/browser/toJson.d.cts +3 -0
- package/dist/browser/toJson.d.cts.map +1 -0
- package/dist/browser/toJson.d.mts +3 -0
- package/dist/browser/toJson.d.mts.map +1 -0
- package/dist/browser/toJson.d.ts +3 -0
- package/dist/browser/toJson.d.ts.map +1 -0
- package/dist/node/AbstractModuleResolver.d.cts +12 -0
- package/dist/node/AbstractModuleResolver.d.cts.map +1 -0
- package/dist/node/AbstractModuleResolver.d.mts +12 -0
- package/dist/node/AbstractModuleResolver.d.mts.map +1 -0
- package/dist/node/AbstractModuleResolver.d.ts +12 -0
- package/dist/node/AbstractModuleResolver.d.ts.map +1 -0
- package/dist/node/CompositeModuleResolver.d.cts +4 -9
- package/dist/node/CompositeModuleResolver.d.cts.map +1 -1
- package/dist/node/CompositeModuleResolver.d.mts +4 -9
- package/dist/node/CompositeModuleResolver.d.mts.map +1 -1
- package/dist/node/CompositeModuleResolver.d.ts +4 -9
- package/dist/node/CompositeModuleResolver.d.ts.map +1 -1
- package/dist/node/SimpleModuleResolver.d.cts +5 -7
- package/dist/node/SimpleModuleResolver.d.cts.map +1 -1
- package/dist/node/SimpleModuleResolver.d.mts +5 -7
- package/dist/node/SimpleModuleResolver.d.mts.map +1 -1
- package/dist/node/SimpleModuleResolver.d.ts +5 -7
- package/dist/node/SimpleModuleResolver.d.ts.map +1 -1
- package/dist/node/index.cjs +61 -20
- package/dist/node/index.cjs.map +1 -1
- package/dist/node/index.js +52 -11
- package/dist/node/index.js.map +1 -1
- package/dist/node/toJson.d.cts +3 -0
- package/dist/node/toJson.d.cts.map +1 -0
- package/dist/node/toJson.d.mts +3 -0
- package/dist/node/toJson.d.mts.map +1 -0
- package/dist/node/toJson.d.ts +3 -0
- package/dist/node/toJson.d.ts.map +1 -0
- package/package.json +11 -10
- package/src/AbstractModuleResolver.ts +53 -0
- package/src/CompositeModuleResolver.ts +6 -11
- package/src/SimpleModuleResolver.ts +8 -8
- 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 {
|
|
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
|
|
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
|
-
|
|
82
|
-
async
|
|
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
|
|
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
|
-
|
|
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
|
+
}
|