@xyo-network/module-abstract 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 (48) hide show
  1. package/dist/browser/AbstractModule.d.cts +1 -2
  2. package/dist/browser/AbstractModule.d.cts.map +1 -1
  3. package/dist/browser/AbstractModule.d.mts +1 -2
  4. package/dist/browser/AbstractModule.d.mts.map +1 -1
  5. package/dist/browser/AbstractModule.d.ts +1 -2
  6. package/dist/browser/AbstractModule.d.ts.map +1 -1
  7. package/dist/browser/ResolveHelper.d.cts +14 -0
  8. package/dist/browser/ResolveHelper.d.cts.map +1 -0
  9. package/dist/browser/ResolveHelper.d.mts +14 -0
  10. package/dist/browser/ResolveHelper.d.mts.map +1 -0
  11. package/dist/browser/ResolveHelper.d.ts +14 -0
  12. package/dist/browser/ResolveHelper.d.ts.map +1 -0
  13. package/dist/browser/index.cjs +140 -94
  14. package/dist/browser/index.cjs.map +1 -1
  15. package/dist/browser/index.d.cts +1 -0
  16. package/dist/browser/index.d.cts.map +1 -1
  17. package/dist/browser/index.d.mts +1 -0
  18. package/dist/browser/index.d.mts.map +1 -1
  19. package/dist/browser/index.d.ts +1 -0
  20. package/dist/browser/index.d.ts.map +1 -1
  21. package/dist/browser/index.js +108 -62
  22. package/dist/browser/index.js.map +1 -1
  23. package/dist/node/AbstractModule.d.cts +1 -2
  24. package/dist/node/AbstractModule.d.cts.map +1 -1
  25. package/dist/node/AbstractModule.d.mts +1 -2
  26. package/dist/node/AbstractModule.d.mts.map +1 -1
  27. package/dist/node/AbstractModule.d.ts +1 -2
  28. package/dist/node/AbstractModule.d.ts.map +1 -1
  29. package/dist/node/ResolveHelper.d.cts +14 -0
  30. package/dist/node/ResolveHelper.d.cts.map +1 -0
  31. package/dist/node/ResolveHelper.d.mts +14 -0
  32. package/dist/node/ResolveHelper.d.mts.map +1 -0
  33. package/dist/node/ResolveHelper.d.ts +14 -0
  34. package/dist/node/ResolveHelper.d.ts.map +1 -0
  35. package/dist/node/index.cjs +140 -94
  36. package/dist/node/index.cjs.map +1 -1
  37. package/dist/node/index.d.cts +1 -0
  38. package/dist/node/index.d.cts.map +1 -1
  39. package/dist/node/index.d.mts +1 -0
  40. package/dist/node/index.d.mts.map +1 -1
  41. package/dist/node/index.d.ts +1 -0
  42. package/dist/node/index.d.ts.map +1 -1
  43. package/dist/node/index.js +107 -62
  44. package/dist/node/index.js.map +1 -1
  45. package/package.json +28 -27
  46. package/src/AbstractModule.ts +27 -66
  47. package/src/ResolveHelper.ts +96 -0
  48. package/src/index.ts +1 -0
@@ -0,0 +1,96 @@
1
+ import { Logger } from '@xylabs/logger'
2
+ import { duplicateModules, ModuleFilter, ModuleFilterOptions, ModuleIdentifier, ModuleInstance, ModuleResolver } from '@xyo-network/module-model'
3
+
4
+ export interface ResolveHelperConfig {
5
+ dead?: boolean
6
+ downResolver?: ModuleResolver
7
+ upResolver?: ModuleResolver
8
+ }
9
+
10
+ export class ResolveHelper {
11
+ static async resolve<T extends ModuleInstance = ModuleInstance>(
12
+ config: ResolveHelperConfig,
13
+ all: '*',
14
+ options?: ModuleFilterOptions<T>,
15
+ ): Promise<T[]>
16
+ static async resolve<T extends ModuleInstance = ModuleInstance>(
17
+ config: ResolveHelperConfig,
18
+ filter: ModuleFilter,
19
+ options?: ModuleFilterOptions<T>,
20
+ ): Promise<T[]>
21
+ static async resolve<T extends ModuleInstance = ModuleInstance>(
22
+ config: ResolveHelperConfig,
23
+ id: ModuleIdentifier,
24
+ options?: ModuleFilterOptions<T>,
25
+ ): Promise<T | undefined>
26
+ static async resolve<T extends ModuleInstance = ModuleInstance>(
27
+ config: ResolveHelperConfig,
28
+ idOrFilter: ModuleFilter<T> | ModuleIdentifier = '*',
29
+ { required = 'log', ...options }: ModuleFilterOptions<T> = {},
30
+ ): Promise<T | T[] | undefined> {
31
+ const { dead = false, upResolver, downResolver } = config
32
+ const childOptions = { ...options, required: false }
33
+ const direction = options?.direction ?? 'all'
34
+ const up = direction === 'up' || direction === 'all'
35
+ const down = direction === 'down' || direction === 'all'
36
+ let result: T | T[] | undefined
37
+ if (idOrFilter === '*') {
38
+ if (dead) {
39
+ return []
40
+ }
41
+ return [
42
+ ...(down ? await (downResolver as ModuleResolver).resolve<T>('*', childOptions) : []),
43
+ ...(up ? await (upResolver as ModuleResolver).resolve<T>('*', childOptions) : []),
44
+ ].filter(duplicateModules)
45
+ } else {
46
+ switch (typeof idOrFilter) {
47
+ case 'string': {
48
+ if (dead) {
49
+ return undefined
50
+ }
51
+ result =
52
+ (down ? await (downResolver as ModuleResolver).resolve<T>(idOrFilter, childOptions) : undefined) ??
53
+ (up ? await (upResolver as ModuleResolver).resolve<T>(idOrFilter, childOptions) : undefined)
54
+ break
55
+ }
56
+ default: {
57
+ if (dead) {
58
+ return []
59
+ }
60
+ const filter: ModuleFilter<T> | undefined = idOrFilter
61
+ result = [
62
+ ...(down ? await (downResolver as ModuleResolver).resolve<T>(filter, childOptions) : []),
63
+ ...(up ? await (upResolver as ModuleResolver).resolve<T>(filter, childOptions) : []),
64
+ ].filter(duplicateModules)
65
+ break
66
+ }
67
+ }
68
+ }
69
+ this.validateRequiredResolve(required, result, idOrFilter)
70
+ return result
71
+ }
72
+
73
+ static validateRequiredResolve(
74
+ required: boolean | 'warn' | 'log',
75
+ result: ModuleInstance[] | ModuleInstance | undefined,
76
+ idOrFilter: ModuleIdentifier | ModuleFilter,
77
+ logger?: Logger,
78
+ ) {
79
+ if (required && (result === undefined || (Array.isArray(result) && result.length > 0))) {
80
+ switch (required) {
81
+ case 'warn': {
82
+ logger?.warn('resolve failed', idOrFilter)
83
+ break
84
+ }
85
+ case 'log': {
86
+ logger?.log('resolve failed', idOrFilter)
87
+ break
88
+ }
89
+ default: {
90
+ logger?.error('resolve failed', idOrFilter)
91
+ break
92
+ }
93
+ }
94
+ }
95
+ }
96
+ }
package/src/index.ts CHANGED
@@ -3,3 +3,4 @@ export * from './AbstractModuleInstance'
3
3
  export * from './BaseEmitter'
4
4
  export * from './Error'
5
5
  export * from './QueryValidator'
6
+ export * from './ResolveHelper'