apcore-js 0.18.0 → 0.19.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 (125) hide show
  1. package/README.md +3 -1
  2. package/dist/acl-handlers.d.ts +14 -0
  3. package/dist/acl-handlers.d.ts.map +1 -1
  4. package/dist/acl-handlers.js +37 -4
  5. package/dist/acl-handlers.js.map +1 -1
  6. package/dist/acl.d.ts +4 -1
  7. package/dist/acl.d.ts.map +1 -1
  8. package/dist/acl.js +40 -21
  9. package/dist/acl.js.map +1 -1
  10. package/dist/bindings.d.ts.map +1 -1
  11. package/dist/bindings.js +113 -11
  12. package/dist/bindings.js.map +1 -1
  13. package/dist/builtin-steps.d.ts +19 -5
  14. package/dist/builtin-steps.d.ts.map +1 -1
  15. package/dist/builtin-steps.js +78 -23
  16. package/dist/builtin-steps.js.map +1 -1
  17. package/dist/client.d.ts +1 -0
  18. package/dist/client.d.ts.map +1 -1
  19. package/dist/client.js.map +1 -1
  20. package/dist/context.d.ts +34 -7
  21. package/dist/context.d.ts.map +1 -1
  22. package/dist/context.js +96 -39
  23. package/dist/context.js.map +1 -1
  24. package/dist/decorator.d.ts +3 -0
  25. package/dist/decorator.d.ts.map +1 -1
  26. package/dist/decorator.js +3 -0
  27. package/dist/decorator.js.map +1 -1
  28. package/dist/errors.d.ts +66 -2
  29. package/dist/errors.d.ts.map +1 -1
  30. package/dist/errors.js +192 -56
  31. package/dist/errors.js.map +1 -1
  32. package/dist/events/emitter.d.ts +2 -0
  33. package/dist/events/emitter.d.ts.map +1 -1
  34. package/dist/events/emitter.js +20 -10
  35. package/dist/events/emitter.js.map +1 -1
  36. package/dist/executor.d.ts +4 -1
  37. package/dist/executor.d.ts.map +1 -1
  38. package/dist/executor.js +36 -12
  39. package/dist/executor.js.map +1 -1
  40. package/dist/generated/version.d.ts +1 -1
  41. package/dist/generated/version.js +1 -1
  42. package/dist/index.d.ts +15 -3
  43. package/dist/index.d.ts.map +1 -1
  44. package/dist/index.js +15 -4
  45. package/dist/index.js.map +1 -1
  46. package/dist/middleware/index.d.ts +1 -1
  47. package/dist/middleware/index.d.ts.map +1 -1
  48. package/dist/middleware/index.js +1 -1
  49. package/dist/middleware/index.js.map +1 -1
  50. package/dist/middleware/logging.d.ts +6 -0
  51. package/dist/middleware/logging.d.ts.map +1 -1
  52. package/dist/middleware/logging.js +13 -3
  53. package/dist/middleware/logging.js.map +1 -1
  54. package/dist/middleware/manager.d.ts.map +1 -1
  55. package/dist/middleware/manager.js +1 -0
  56. package/dist/middleware/manager.js.map +1 -1
  57. package/dist/middleware/platform-notify.d.ts.map +1 -1
  58. package/dist/middleware/platform-notify.js +4 -0
  59. package/dist/middleware/platform-notify.js.map +1 -1
  60. package/dist/middleware/retry.d.ts +16 -7
  61. package/dist/middleware/retry.d.ts.map +1 -1
  62. package/dist/middleware/retry.js +21 -15
  63. package/dist/middleware/retry.js.map +1 -1
  64. package/dist/observability/context-logger.d.ts.map +1 -1
  65. package/dist/observability/context-logger.js +18 -5
  66. package/dist/observability/context-logger.js.map +1 -1
  67. package/dist/observability/metrics-utils.d.ts.map +1 -1
  68. package/dist/observability/metrics-utils.js +3 -5
  69. package/dist/observability/metrics-utils.js.map +1 -1
  70. package/dist/observability/metrics.d.ts +1 -0
  71. package/dist/observability/metrics.d.ts.map +1 -1
  72. package/dist/observability/metrics.js +14 -1
  73. package/dist/observability/metrics.js.map +1 -1
  74. package/dist/observability/tracing.d.ts +2 -0
  75. package/dist/observability/tracing.d.ts.map +1 -1
  76. package/dist/observability/tracing.js +12 -2
  77. package/dist/observability/tracing.js.map +1 -1
  78. package/dist/observability/usage.d.ts.map +1 -1
  79. package/dist/observability/usage.js +10 -1
  80. package/dist/observability/usage.js.map +1 -1
  81. package/dist/pipeline-config.d.ts +13 -7
  82. package/dist/pipeline-config.d.ts.map +1 -1
  83. package/dist/pipeline-config.js +77 -9
  84. package/dist/pipeline-config.js.map +1 -1
  85. package/dist/registry/conflicts.d.ts +2 -2
  86. package/dist/registry/conflicts.d.ts.map +1 -1
  87. package/dist/registry/conflicts.js +10 -11
  88. package/dist/registry/conflicts.js.map +1 -1
  89. package/dist/registry/dependencies.d.ts +1 -1
  90. package/dist/registry/dependencies.d.ts.map +1 -1
  91. package/dist/registry/dependencies.js +69 -20
  92. package/dist/registry/dependencies.js.map +1 -1
  93. package/dist/registry/registry.d.ts +8 -1
  94. package/dist/registry/registry.d.ts.map +1 -1
  95. package/dist/registry/registry.js +112 -24
  96. package/dist/registry/registry.js.map +1 -1
  97. package/dist/registry/scanner.d.ts.map +1 -1
  98. package/dist/registry/scanner.js +6 -0
  99. package/dist/registry/scanner.js.map +1 -1
  100. package/dist/registry/version.d.ts +1 -0
  101. package/dist/registry/version.d.ts.map +1 -1
  102. package/dist/registry/version.js +33 -4
  103. package/dist/registry/version.js.map +1 -1
  104. package/dist/schema/extractor.d.ts +69 -0
  105. package/dist/schema/extractor.d.ts.map +1 -0
  106. package/dist/schema/extractor.js +142 -0
  107. package/dist/schema/extractor.js.map +1 -0
  108. package/dist/schema/index.d.ts +2 -0
  109. package/dist/schema/index.d.ts.map +1 -1
  110. package/dist/schema/index.js +1 -0
  111. package/dist/schema/index.js.map +1 -1
  112. package/dist/schema/ref-resolver.d.ts.map +1 -1
  113. package/dist/schema/ref-resolver.js +10 -1
  114. package/dist/schema/ref-resolver.js.map +1 -1
  115. package/dist/sys-modules/control.d.ts.map +1 -1
  116. package/dist/sys-modules/control.js +4 -1
  117. package/dist/sys-modules/control.js.map +1 -1
  118. package/dist/sys-modules/registration.d.ts +12 -0
  119. package/dist/sys-modules/registration.d.ts.map +1 -1
  120. package/dist/sys-modules/registration.js +12 -0
  121. package/dist/sys-modules/registration.js.map +1 -1
  122. package/dist/utils/index.d.ts.map +1 -1
  123. package/dist/utils/index.js +2 -1
  124. package/dist/utils/index.js.map +1 -1
  125. package/package.json +1 -1
@@ -63,12 +63,18 @@ class ConfiguredStep {
63
63
  /**
64
64
  * Resolve a step definition dict into a Step instance.
65
65
  *
66
- * Resolution order:
67
- * 1. `type` field -> look up in registry
68
- * 2. `handler` field -> dynamic import (TypeScript-native)
66
+ * Resolution order (DECLARATIVE_CONFIG_SPEC.md §4):
67
+ * 1. `type` field -> look up in registry (sync, fast path)
68
+ * 2. `handler` field -> dynamic ESM import via `await import()`
69
+ * Format: `"module:exportName"`. The resolved export is invoked as
70
+ * `factory(config)` — wrap classes in a factory if needed.
69
71
  * 3. Neither -> throw Error
72
+ *
73
+ * NOTE: this function is async because handler resolution requires
74
+ * `await import()`. Type-registry lookups still resolve synchronously
75
+ * inside this async wrapper.
70
76
  */
71
- export function _resolveStep(stepDef) {
77
+ export async function _resolveStep(stepDef) {
72
78
  const typeName = stepDef.type;
73
79
  const handlerPath = stepDef.handler;
74
80
  const config = stepDef.config ?? {};
@@ -78,10 +84,10 @@ export function _resolveStep(stepDef) {
78
84
  const step = factory(config);
79
85
  return new ConfiguredStep(step, stepDef);
80
86
  }
81
- // (2) Handler path (dynamic import placeholder)
87
+ // (2) Handler path -- dynamic ESM import
82
88
  if (handlerPath) {
83
- throw new Error(`Dynamic handler import '${handlerPath}' is not supported in TypeScript SDK. ` +
84
- `Use registerStepType() to register the step type, then reference it via 'type'.`);
89
+ const step = await _importStep(handlerPath, config);
90
+ return new ConfiguredStep(step, stepDef);
85
91
  }
86
92
  // (3) Neither
87
93
  if (typeName) {
@@ -90,6 +96,68 @@ export function _resolveStep(stepDef) {
90
96
  }
91
97
  throw new Error(`Step '${stepDef.name ?? ''}' has neither 'type' nor 'handler'`);
92
98
  }
99
+ /**
100
+ * Dynamically import a Step factory from a `"module:exportName"` handler path.
101
+ *
102
+ * Mirrors `bindings.ts#resolveTarget` security model: rejects path-traversal
103
+ * (`..`) segments and `file:` URLs at parse time. The resolved export must be
104
+ * a callable `(config) => Step`. Classes should be wrapped in a thin factory.
105
+ */
106
+ async function _importStep(handlerPath, config) {
107
+ // Security checks run on the whole path BEFORE the module:export split,
108
+ // because 'file:' URLs contain a colon that would otherwise be misparsed.
109
+ const FORBIDDEN_SCHEMES = ['file:', 'http:', 'https:', 'ftp:', 'data:', 'blob:'];
110
+ for (const scheme of FORBIDDEN_SCHEMES) {
111
+ if (handlerPath.startsWith(scheme)) {
112
+ throw new Error(`Handler path '${handlerPath}' must not use '${scheme}' URLs.`);
113
+ }
114
+ }
115
+ if (handlerPath.includes('..')) {
116
+ throw new Error(`Handler path '${handlerPath}' must not contain '..' segments.`);
117
+ }
118
+ if (!handlerPath.includes(':')) {
119
+ throw new Error(`Invalid handler path '${handlerPath}'. Expected format: 'module:exportName'.`);
120
+ }
121
+ // Split from the right so module specifiers containing ':' (e.g., URL-like)
122
+ // don't get misparsed. Standard forms ('./mod:fn', '@scope/pkg:fn') split fine
123
+ // either way; rsplit defends against future scheme-like specifiers.
124
+ const lastColon = handlerPath.lastIndexOf(':');
125
+ const modulePath = handlerPath.slice(0, lastColon);
126
+ const exportName = handlerPath.slice(lastColon + 1);
127
+ let mod;
128
+ try {
129
+ mod = await import(modulePath);
130
+ }
131
+ catch (e) {
132
+ throw new Error(`Cannot import handler module '${modulePath}': ${e.message}`);
133
+ }
134
+ const resolved = mod[exportName];
135
+ if (resolved == null) {
136
+ throw new Error(`Export '${exportName}' not found in module '${modulePath}'.`);
137
+ }
138
+ if (typeof resolved !== 'function') {
139
+ throw new Error(`Handler '${handlerPath}' resolved to a non-callable. ` +
140
+ `Expected a (config) => Step factory; wrap classes in a factory if needed.`);
141
+ }
142
+ // Distinguish class export (has a prototype with a `constructor` pointing
143
+ // back to itself) from factory function. The previous implementation used
144
+ // try/new-then-fallback-to-call, which silently swallowed legitimate
145
+ // constructor errors (bad config, missing required field) and produced
146
+ // misleading secondary failures when the fallback call was invoked on a
147
+ // class that required `new`.
148
+ const isLikelyClass = typeof resolved === 'function' &&
149
+ resolved.prototype != null &&
150
+ typeof resolved.prototype === 'object' &&
151
+ resolved.prototype.constructor === resolved &&
152
+ // Arrow functions have no prototype; factories with .prototype typically
153
+ // have the default Object constructor, so also require the function's
154
+ // name to start uppercase (class convention).
155
+ /^[A-Z]/.test(resolved.name ?? '');
156
+ const step = isLikelyClass
157
+ ? new resolved(config)
158
+ : resolved(config);
159
+ return step;
160
+ }
93
161
  /**
94
162
  * Build an ExecutionStrategy from YAML pipeline configuration.
95
163
  *
@@ -102,7 +170,7 @@ export function _resolveStep(stepDef) {
102
170
  * @param deps - Forwarded to `buildStandardStrategy()`.
103
171
  * @returns Configured ExecutionStrategy.
104
172
  */
105
- export function buildStrategyFromConfig(pipelineConfig, deps) {
173
+ export async function buildStrategyFromConfig(pipelineConfig, deps) {
106
174
  const strategy = buildStandardStrategy(deps);
107
175
  // (1) Remove steps
108
176
  for (const stepName of pipelineConfig.remove ?? []) {
@@ -131,7 +199,7 @@ export function buildStrategyFromConfig(pipelineConfig, deps) {
131
199
  }
132
200
  // (3) Resolve and insert custom steps
133
201
  for (const stepDef of pipelineConfig.steps ?? []) {
134
- const step = _resolveStep(stepDef);
202
+ const step = await _resolveStep(stepDef);
135
203
  const after = stepDef.after;
136
204
  const before = stepDef.before;
137
205
  if (after) {
@@ -1 +1 @@
1
- {"version":3,"file":"pipeline-config.js","sourceRoot":"","sources":["../src/pipeline-config.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"pipeline-config.js","sourceRoot":"","sources":["../src/pipeline-config.ts"],"names":[],"mappings":"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"}
@@ -16,12 +16,12 @@ export interface ConflictResult {
16
16
  *
17
17
  * Steps:
18
18
  * 1. Exact duplicate detection.
19
- * 2. Reserved word detection (per segment).
19
+ * 2. Reserved word detection (first segment).
20
20
  * 3. Case collision detection.
21
21
  *
22
22
  * @param newId - Canonical ID to be registered.
23
23
  * @param existingIds - Set of already registered IDs.
24
- * @param reservedWords - Reserved words that cannot be used as ID segments.
24
+ * @param reservedWords - Reserved words that cannot be used as the first ID segment.
25
25
  * @param lowercaseMap - Optional pre-built lowercase-to-original_id mapping for O(1) case collision.
26
26
  * @returns ConflictResult if a conflict is found, null if the ID is safe.
27
27
  */
@@ -1 +1 @@
1
- {"version":3,"file":"conflicts.d.ts","sourceRoot":"","sources":["../../src/registry/conflicts.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,qCAAqC;AACrC,MAAM,MAAM,YAAY,GAAG,cAAc,GAAG,eAAe,GAAG,gBAAgB,CAAC;AAE/E,kCAAkC;AAClC,MAAM,MAAM,gBAAgB,GAAG,OAAO,GAAG,SAAS,CAAC;AAEnD,sCAAsC;AACtC,MAAM,WAAW,cAAc;IAC7B,QAAQ,CAAC,IAAI,EAAE,YAAY,CAAC;IAC5B,QAAQ,CAAC,QAAQ,EAAE,gBAAgB,CAAC;IACpC,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;CAC1B;AAED;;;;;;;;;;;;;GAaG;AACH,wBAAgB,iBAAiB,CAC/B,KAAK,EAAE,MAAM,EACb,WAAW,EAAE,WAAW,CAAC,MAAM,CAAC,EAChC,aAAa,EAAE,WAAW,CAAC,MAAM,CAAC,EAClC,YAAY,CAAC,EAAE,WAAW,CAAC,MAAM,EAAE,MAAM,CAAC,GACzC,cAAc,GAAG,IAAI,CA6CvB"}
1
+ {"version":3,"file":"conflicts.d.ts","sourceRoot":"","sources":["../../src/registry/conflicts.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,qCAAqC;AACrC,MAAM,MAAM,YAAY,GAAG,cAAc,GAAG,eAAe,GAAG,gBAAgB,CAAC;AAE/E,kCAAkC;AAClC,MAAM,MAAM,gBAAgB,GAAG,OAAO,GAAG,SAAS,CAAC;AAEnD,sCAAsC;AACtC,MAAM,WAAW,cAAc;IAC7B,QAAQ,CAAC,IAAI,EAAE,YAAY,CAAC;IAC5B,QAAQ,CAAC,QAAQ,EAAE,gBAAgB,CAAC;IACpC,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;CAC1B;AAED;;;;;;;;;;;;;GAaG;AACH,wBAAgB,iBAAiB,CAC/B,KAAK,EAAE,MAAM,EACb,WAAW,EAAE,WAAW,CAAC,MAAM,CAAC,EAChC,aAAa,EAAE,WAAW,CAAC,MAAM,CAAC,EAClC,YAAY,CAAC,EAAE,WAAW,CAAC,MAAM,EAAE,MAAM,CAAC,GACzC,cAAc,GAAG,IAAI,CA4CvB"}
@@ -6,12 +6,12 @@
6
6
  *
7
7
  * Steps:
8
8
  * 1. Exact duplicate detection.
9
- * 2. Reserved word detection (per segment).
9
+ * 2. Reserved word detection (first segment).
10
10
  * 3. Case collision detection.
11
11
  *
12
12
  * @param newId - Canonical ID to be registered.
13
13
  * @param existingIds - Set of already registered IDs.
14
- * @param reservedWords - Reserved words that cannot be used as ID segments.
14
+ * @param reservedWords - Reserved words that cannot be used as the first ID segment.
15
15
  * @param lowercaseMap - Optional pre-built lowercase-to-original_id mapping for O(1) case collision.
16
16
  * @returns ConflictResult if a conflict is found, null if the ID is safe.
17
17
  */
@@ -24,15 +24,14 @@ export function detectIdConflicts(newId, existingIds, reservedWords, lowercaseMa
24
24
  message: `Module ID '${newId}' is already registered`,
25
25
  };
26
26
  }
27
- // Step 2: Reserved word check
28
- for (const segment of newId.split('.')) {
29
- if (reservedWords.has(segment)) {
30
- return {
31
- type: 'reserved_word',
32
- severity: 'error',
33
- message: `Module ID '${newId}' contains reserved word '${segment}'`,
34
- };
35
- }
27
+ // Step 2: Reserved word check (first segment only)
28
+ const firstSegment = newId.split('.')[0];
29
+ if (reservedWords.has(firstSegment)) {
30
+ return {
31
+ type: 'reserved_word',
32
+ severity: 'error',
33
+ message: `Module ID '${newId}' contains reserved word '${firstSegment}'`,
34
+ };
36
35
  }
37
36
  // Step 3: Case collision
38
37
  const normalizedNew = newId.toLowerCase();
@@ -1 +1 @@
1
- {"version":3,"file":"conflicts.js","sourceRoot":"","sources":["../../src/registry/conflicts.ts"],"names":[],"mappings":"AAAA;;GAEG;AAeH;;;;;;;;;;;;;GAaG;AACH,MAAM,UAAU,iBAAiB,CAC/B,KAAa,EACb,WAAgC,EAChC,aAAkC,EAClC,YAA0C;IAE1C,0BAA0B;IAC1B,IAAI,WAAW,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE,CAAC;QAC3B,OAAO;YACL,IAAI,EAAE,cAAc;YACpB,QAAQ,EAAE,OAAO;YACjB,OAAO,EAAE,cAAc,KAAK,yBAAyB;SACtD,CAAC;IACJ,CAAC;IAED,8BAA8B;IAC9B,KAAK,MAAM,OAAO,IAAI,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,EAAE,CAAC;QACvC,IAAI,aAAa,CAAC,GAAG,CAAC,OAAO,CAAC,EAAE,CAAC;YAC/B,OAAO;gBACL,IAAI,EAAE,eAAe;gBACrB,QAAQ,EAAE,OAAO;gBACjB,OAAO,EAAE,cAAc,KAAK,6BAA6B,OAAO,GAAG;aACpE,CAAC;QACJ,CAAC;IACH,CAAC;IAED,yBAAyB;IACzB,MAAM,aAAa,GAAG,KAAK,CAAC,WAAW,EAAE,CAAC;IAC1C,IAAI,YAAY,IAAI,IAAI,EAAE,CAAC;QACzB,MAAM,QAAQ,GAAG,YAAY,CAAC,GAAG,CAAC,aAAa,CAAC,CAAC;QACjD,IAAI,QAAQ,IAAI,IAAI,IAAI,QAAQ,KAAK,KAAK,EAAE,CAAC;YAC3C,OAAO;gBACL,IAAI,EAAE,gBAAgB;gBACtB,QAAQ,EAAE,SAAS;gBACnB,OAAO,EAAE,cAAc,KAAK,yCAAyC,QAAQ,GAAG;aACjF,CAAC;QACJ,CAAC;IACH,CAAC;SAAM,CAAC;QACN,KAAK,MAAM,UAAU,IAAI,WAAW,EAAE,CAAC;YACrC,IAAI,UAAU,CAAC,WAAW,EAAE,KAAK,aAAa,IAAI,UAAU,KAAK,KAAK,EAAE,CAAC;gBACvE,OAAO;oBACL,IAAI,EAAE,gBAAgB;oBACtB,QAAQ,EAAE,SAAS;oBACnB,OAAO,EAAE,cAAc,KAAK,yCAAyC,UAAU,GAAG;iBACnF,CAAC;YACJ,CAAC;QACH,CAAC;IACH,CAAC;IAED,OAAO,IAAI,CAAC;AACd,CAAC"}
1
+ {"version":3,"file":"conflicts.js","sourceRoot":"","sources":["../../src/registry/conflicts.ts"],"names":[],"mappings":"AAAA;;GAEG;AAeH;;;;;;;;;;;;;GAaG;AACH,MAAM,UAAU,iBAAiB,CAC/B,KAAa,EACb,WAAgC,EAChC,aAAkC,EAClC,YAA0C;IAE1C,0BAA0B;IAC1B,IAAI,WAAW,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE,CAAC;QAC3B,OAAO;YACL,IAAI,EAAE,cAAc;YACpB,QAAQ,EAAE,OAAO;YACjB,OAAO,EAAE,cAAc,KAAK,yBAAyB;SACtD,CAAC;IACJ,CAAC;IAED,mDAAmD;IACnD,MAAM,YAAY,GAAG,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;IACzC,IAAI,aAAa,CAAC,GAAG,CAAC,YAAY,CAAC,EAAE,CAAC;QACpC,OAAO;YACL,IAAI,EAAE,eAAe;YACrB,QAAQ,EAAE,OAAO;YACjB,OAAO,EAAE,cAAc,KAAK,6BAA6B,YAAY,GAAG;SACzE,CAAC;IACJ,CAAC;IAED,yBAAyB;IACzB,MAAM,aAAa,GAAG,KAAK,CAAC,WAAW,EAAE,CAAC;IAC1C,IAAI,YAAY,IAAI,IAAI,EAAE,CAAC;QACzB,MAAM,QAAQ,GAAG,YAAY,CAAC,GAAG,CAAC,aAAa,CAAC,CAAC;QACjD,IAAI,QAAQ,IAAI,IAAI,IAAI,QAAQ,KAAK,KAAK,EAAE,CAAC;YAC3C,OAAO;gBACL,IAAI,EAAE,gBAAgB;gBACtB,QAAQ,EAAE,SAAS;gBACnB,OAAO,EAAE,cAAc,KAAK,yCAAyC,QAAQ,GAAG;aACjF,CAAC;QACJ,CAAC;IACH,CAAC;SAAM,CAAC;QACN,KAAK,MAAM,UAAU,IAAI,WAAW,EAAE,CAAC;YACrC,IAAI,UAAU,CAAC,WAAW,EAAE,KAAK,aAAa,IAAI,UAAU,KAAK,KAAK,EAAE,CAAC;gBACvE,OAAO;oBACL,IAAI,EAAE,gBAAgB;oBACtB,QAAQ,EAAE,SAAS;oBACnB,OAAO,EAAE,cAAc,KAAK,yCAAyC,UAAU,GAAG;iBACnF,CAAC;YACJ,CAAC;QACH,CAAC;IACH,CAAC;IAED,OAAO,IAAI,CAAC;AACd,CAAC"}
@@ -2,5 +2,5 @@
2
2
  * Dependency resolution via Kahn's topological sort.
3
3
  */
4
4
  import type { DependencyInfo } from './types.js';
5
- export declare function resolveDependencies(modules: Array<[string, DependencyInfo[]]>, knownIds?: Set<string> | null): string[];
5
+ export declare function resolveDependencies(modules: Array<[string, DependencyInfo[]]>, knownIds?: Set<string> | null, moduleVersions?: Map<string, string> | Record<string, string> | null): string[];
6
6
  //# sourceMappingURL=dependencies.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"dependencies.d.ts","sourceRoot":"","sources":["../../src/registry/dependencies.ts"],"names":[],"mappings":"AAAA;;GAEG;AAGH,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,YAAY,CAAC;AAEjD,wBAAgB,mBAAmB,CACjC,OAAO,EAAE,KAAK,CAAC,CAAC,MAAM,EAAE,cAAc,EAAE,CAAC,CAAC,EAC1C,QAAQ,CAAC,EAAE,GAAG,CAAC,MAAM,CAAC,GAAG,IAAI,GAC5B,MAAM,EAAE,CAwDV"}
1
+ {"version":3,"file":"dependencies.d.ts","sourceRoot":"","sources":["../../src/registry/dependencies.ts"],"names":[],"mappings":"AAAA;;GAEG;AAOH,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,YAAY,CAAC;AAGjD,wBAAgB,mBAAmB,CACjC,OAAO,EAAE,KAAK,CAAC,CAAC,MAAM,EAAE,cAAc,EAAE,CAAC,CAAC,EAC1C,QAAQ,CAAC,EAAE,GAAG,CAAC,MAAM,CAAC,GAAG,IAAI,EAC7B,cAAc,CAAC,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,IAAI,GACnE,MAAM,EAAE,CAkFV"}
@@ -1,11 +1,19 @@
1
1
  /**
2
2
  * Dependency resolution via Kahn's topological sort.
3
3
  */
4
- import { CircularDependencyError, ModuleLoadError } from '../errors.js';
5
- export function resolveDependencies(modules, knownIds) {
4
+ import { CircularDependencyError, DependencyNotFoundError, DependencyVersionMismatchError, } from '../errors.js';
5
+ import { matchesVersionHint } from './version.js';
6
+ export function resolveDependencies(modules, knownIds, moduleVersions) {
6
7
  if (modules.length === 0)
7
8
  return [];
8
9
  const ids = knownIds ?? new Set(modules.map(([id]) => id));
10
+ const versionLookup = (() => {
11
+ if (moduleVersions == null)
12
+ return null;
13
+ if (moduleVersions instanceof Map)
14
+ return moduleVersions;
15
+ return new Map(Object.entries(moduleVersions));
16
+ })();
9
17
  // Build graph and in-degree
10
18
  const graph = new Map();
11
19
  const inDegree = new Map();
@@ -17,7 +25,24 @@ export function resolveDependencies(modules, knownIds) {
17
25
  if (!ids.has(dep.moduleId)) {
18
26
  if (dep.optional)
19
27
  continue;
20
- throw new ModuleLoadError(moduleId, `Required dependency '${dep.moduleId}' not found`);
28
+ throw new DependencyNotFoundError(moduleId, dep.moduleId);
29
+ }
30
+ if (dep.version && versionLookup !== null) {
31
+ const actual = versionLookup.get(dep.moduleId);
32
+ if (actual === undefined) {
33
+ // Version constraint cannot be evaluated — surface this so a silent
34
+ // bypass does not masquerade as a satisfied constraint. Typical
35
+ // cause: the target module is registered but has no `version`
36
+ // string on its class and no YAML metadata declared one.
37
+ console.warn(`[apcore:registry] Cannot enforce version constraint '${dep.version}' on '${dep.moduleId}' for '${moduleId}': no version information available for the target module`);
38
+ }
39
+ else if (!matchesVersionHint(actual, dep.version)) {
40
+ if (dep.optional) {
41
+ console.warn(`[apcore:registry] Optional dependency '${dep.moduleId}' for module '${moduleId}' has version '${actual}' which does not satisfy constraint '${dep.version}', skipping`);
42
+ continue;
43
+ }
44
+ throw new DependencyVersionMismatchError(moduleId, dep.moduleId, dep.version, actual);
45
+ }
21
46
  }
22
47
  if (!graph.has(dep.moduleId))
23
48
  graph.set(dep.moduleId, new Set());
@@ -58,26 +83,50 @@ function extractCycle(modules, remaining) {
58
83
  const depMap = new Map();
59
84
  for (const [modId, deps] of modules) {
60
85
  if (remaining.has(modId)) {
61
- depMap.set(modId, deps.filter((d) => remaining.has(d.moduleId)).map((d) => d.moduleId));
86
+ const uniq = new Set(deps.filter((d) => remaining.has(d.moduleId)).map((d) => d.moduleId));
87
+ depMap.set(modId, [...uniq].sort());
62
88
  }
63
89
  }
64
- const start = remaining.values().next().value;
65
- const visited = [start];
66
- const visitedSet = new Set([start]);
67
- let current = start;
68
- while (true) {
69
- const nexts = depMap.get(current) ?? [];
70
- if (nexts.length === 0)
71
- break;
72
- const nxt = nexts[0];
73
- if (visitedSet.has(nxt)) {
74
- const idx = visited.indexOf(nxt);
75
- return [...visited.slice(idx), nxt];
90
+ const sortedRemaining = [...remaining].sort();
91
+ for (const start of sortedRemaining) {
92
+ const cycle = dfsFindCycle(depMap, start);
93
+ if (cycle !== null)
94
+ return cycle;
95
+ }
96
+ return sortedRemaining;
97
+ }
98
+ function dfsFindCycle(depMap, start) {
99
+ const path = [];
100
+ const onPath = new Set();
101
+ const visited = new Set();
102
+ const stack = [[start, 0]];
103
+ while (stack.length > 0) {
104
+ const frame = stack[stack.length - 1];
105
+ const [node, idx] = frame;
106
+ if (idx === 0) {
107
+ if (onPath.has(node)) {
108
+ const startIdx = path.indexOf(node);
109
+ return [...path.slice(startIdx), node];
110
+ }
111
+ if (visited.has(node)) {
112
+ stack.pop();
113
+ continue;
114
+ }
115
+ visited.add(node);
116
+ onPath.add(node);
117
+ path.push(node);
118
+ }
119
+ const neighbors = depMap.get(node) ?? [];
120
+ if (idx < neighbors.length) {
121
+ frame[1] = idx + 1;
122
+ stack.push([neighbors[idx], 0]);
123
+ }
124
+ else {
125
+ onPath.delete(node);
126
+ path.pop();
127
+ stack.pop();
76
128
  }
77
- visited.push(nxt);
78
- visitedSet.add(nxt);
79
- current = nxt;
80
129
  }
81
- return [...remaining, remaining.values().next().value];
130
+ return null;
82
131
  }
83
132
  //# sourceMappingURL=dependencies.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"dependencies.js","sourceRoot":"","sources":["../../src/registry/dependencies.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"dependencies.js","sourceRoot":"","sources":["../../src/registry/dependencies.ts"],"names":[],"mappings":"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"}
@@ -25,7 +25,7 @@ export declare const MODULE_ID_PATTERN: RegExp;
25
25
  */
26
26
  export declare const MAX_MODULE_ID_LENGTH = 192;
27
27
  /**
28
- * Reserved words that cannot appear as any segment of a module ID.
28
+ * Reserved words that cannot appear as the first segment of a module ID.
29
29
  */
30
30
  export declare const RESERVED_WORDS: Set<string>;
31
31
  /**
@@ -53,6 +53,7 @@ export declare class Registry {
53
53
  private _moduleMeta;
54
54
  private _callbacks;
55
55
  private _idMap;
56
+ private _lowercaseMap;
56
57
  private _schemaCache;
57
58
  private _config;
58
59
  private _watchers?;
@@ -92,6 +93,8 @@ export declare class Registry {
92
93
  * duplicate.
93
94
  */
94
95
  register(moduleId: string, module: unknown): void;
96
+ /** Inner registration — no validator, no ID validation. Used by discover() paths that run their own checks. */
97
+ private _registerImpl;
95
98
  unregister(moduleId: string): boolean;
96
99
  get(moduleId: string): unknown | null;
97
100
  has(moduleId: string): boolean;
@@ -162,6 +165,10 @@ export declare class Registry {
162
165
  beginDrain(moduleId: string): void;
163
166
  /**
164
167
  * Remove the draining mark and clean up drain state.
168
+ *
169
+ * If any waitDrained waiters are still pending (e.g., refCount briefly
170
+ * hit zero and then a new acquire bumped it back up), resolve them first
171
+ * so they do not wait for their individual timeouts before returning.
165
172
  */
166
173
  endDrain(moduleId: string): void;
167
174
  /**
@@ -1 +1 @@
1
- {"version":3,"file":"registry.d.ts","sourceRoot":"","sources":["../../src/registry/registry.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"registry.d.ts","sourceRoot":"","sources":["../../src/registry/registry.ts"],"names":[],"mappings":"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"}