@objectstack/core 4.0.2 → 4.0.4

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/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@objectstack/core",
3
- "version": "4.0.2",
3
+ "version": "4.0.4",
4
4
  "license": "Apache-2.0",
5
5
  "description": "Microkernel Core for ObjectStack",
6
6
  "type": "module",
@@ -14,15 +14,15 @@
14
14
  }
15
15
  },
16
16
  "devDependencies": {
17
- "@types/node": "^25.5.2",
17
+ "@types/node": "^25.6.0",
18
18
  "typescript": "^6.0.2",
19
- "vitest": "^4.1.2"
19
+ "vitest": "^4.1.4"
20
20
  },
21
21
  "dependencies": {
22
22
  "pino": "^10.3.1",
23
23
  "pino-pretty": "^13.1.3",
24
24
  "zod": "^4.3.6",
25
- "@objectstack/spec": "4.0.2"
25
+ "@objectstack/spec": "4.0.4"
26
26
  },
27
27
  "peerDependencies": {
28
28
  "pino": "^8.0.0"
package/src/kernel.ts CHANGED
@@ -213,6 +213,28 @@ export class ObjectKernel {
213
213
  return this;
214
214
  }
215
215
 
216
+ /**
217
+ * Pre-inject in-memory fallbacks for 'core' services that were not registered
218
+ * by plugins during Phase 1. Called before Phase 2 so that all core services
219
+ * (e.g. 'metadata', 'cache', 'queue') are resolvable via ctx.getService()
220
+ * when plugin start() methods execute.
221
+ */
222
+ private preInjectCoreFallbacks() {
223
+ if (this.config.skipSystemValidation) return;
224
+ for (const [serviceName, criticality] of Object.entries(ServiceRequirementDef)) {
225
+ if (criticality !== 'core') continue;
226
+ const hasService = this.services.has(serviceName) || this.pluginLoader.hasService(serviceName);
227
+ if (!hasService) {
228
+ const factory = CORE_FALLBACK_FACTORIES[serviceName];
229
+ if (factory) {
230
+ const fallback = factory();
231
+ this.registerService(serviceName, fallback);
232
+ this.logger.debug(`[Kernel] Pre-injected in-memory fallback for '${serviceName}' before Phase 2`);
233
+ }
234
+ }
235
+ }
236
+ }
237
+
216
238
  /**
217
239
  * Validate Critical System Requirements
218
240
  */
@@ -291,6 +313,12 @@ export class ObjectKernel {
291
313
  await this.initPluginWithTimeout(plugin);
292
314
  }
293
315
 
316
+ // Pre-inject in-memory fallbacks for 'core' services that were not
317
+ // registered by any plugin during Phase 1. This ensures services like
318
+ // 'metadata', 'cache', 'queue', etc. are always available when plugins
319
+ // call ctx.getService() during their start() methods.
320
+ this.preInjectCoreFallbacks();
321
+
294
322
  // Phase 2: Start - Plugins execute business logic
295
323
  this.logger.info('Phase 2: Start plugins');
296
324
  this.state = 'running';