@zintrust/core 0.4.86 → 0.4.87

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": "@zintrust/core",
3
- "version": "0.4.86",
3
+ "version": "0.4.87",
4
4
  "description": "Production-grade TypeScript backend framework for JavaScript",
5
5
  "homepage": "https://zintrust.com",
6
6
  "repository": {
@@ -1 +1 @@
1
- {"version":3,"file":"runtime.d.ts","sourceRoot":"","sources":["../../../../src/boot/registry/runtime.ts"],"names":[],"mappings":"AAmBA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,gBAAgB,CAAC;AASvD,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,gBAAgB,CAAC;AA2O9C,eAAO,MAAM,8BAA8B,GAAI,iBAAiB,gBAAgB,KAAG,IA6BlF,CAAC;AAqUF,eAAO,MAAM,eAAe,GAAI,QAAQ;IACtC,WAAW,EAAE,MAAM,CAAC;IACpB,gBAAgB,EAAE,MAAM,CAAC;IACzB,MAAM,EAAE,OAAO,CAAC;IAChB,eAAe,EAAE,gBAAgB,CAAC;IAClC,SAAS,EAAE,MAAM,OAAO,CAAC;IACzB,SAAS,EAAE,CAAC,KAAK,EAAE,OAAO,KAAK,IAAI,CAAC;CACrC,KAAG;IAAE,IAAI,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;IAAC,QAAQ,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAA;CAyF7D,CAAC"}
1
+ {"version":3,"file":"runtime.d.ts","sourceRoot":"","sources":["../../../../src/boot/registry/runtime.ts"],"names":[],"mappings":"AAmBA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,gBAAgB,CAAC;AASvD,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,gBAAgB,CAAC;AA2O9C,eAAO,MAAM,8BAA8B,GAAI,iBAAiB,gBAAgB,KAAG,IA6BlF,CAAC;AAsUF,eAAO,MAAM,eAAe,GAAI,QAAQ;IACtC,WAAW,EAAE,MAAM,CAAC;IACpB,gBAAgB,EAAE,MAAM,CAAC;IACzB,MAAM,EAAE,OAAO,CAAC;IAChB,eAAe,EAAE,gBAAgB,CAAC;IAClC,SAAS,EAAE,MAAM,OAAO,CAAC;IACzB,SAAS,EAAE,CAAC,KAAK,EAAE,OAAO,KAAK,IAAI,CAAC;CACrC,KAAG;IAAE,IAAI,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;IAAC,QAAQ,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAA;CAyF7D,CAAC"}
@@ -440,7 +440,8 @@ const initializeSystemTrace = async (router) => {
440
440
  Logger.info(`System Trace dashboard auto-mounted at ${basePath}.`);
441
441
  }
442
442
  catch (error) {
443
- Logger.warn('Failed to initialize System Trace runtime', error);
443
+ Logger.error('Failed to initialize System Trace runtime', error);
444
+ throw error;
444
445
  }
445
446
  };
446
447
  const initializeSockets = (router) => {
@@ -215,7 +215,7 @@ const warnIfAdapterMissing = (cmd, conn) => {
215
215
  if (conn.driver === 'mysql' && DatabaseAdapterRegistry.get('mysql') === undefined) {
216
216
  cmd.warn('MySQL adapter is not installed/registered; migrations may not hit a real MySQL DB.');
217
217
  cmd.warn('Install via `zin plugin install adapter:mysql` (or `zin add db:mysql`).');
218
- cmd.debug('[debug] Expected a side-effect import in src/zintrust.plugins.ts like: import "@zintrust/db-mysql/register";');
218
+ cmd.debug('[debug] Expected a side-effect import in src/zintrust.plugins.ts like: import "../../../packages/db-mysql/src/register";');
219
219
  }
220
220
  if (conn.driver === 'postgresql' && DatabaseAdapterRegistry.get('postgresql') === undefined) {
221
221
  cmd.warn('PostgreSQL adapter is not installed/registered; migrations may not hit a real PostgreSQL DB.');
@@ -4,6 +4,7 @@ export interface SpawnAndWaitInput {
4
4
  cwd?: string;
5
5
  env?: NodeJS.ProcessEnv;
6
6
  forwardSignals?: boolean;
7
+ shell?: boolean;
7
8
  }
8
9
  export declare const SpawnUtil: Readonly<{
9
10
  spawnAndWait(input: SpawnAndWaitInput): Promise<number>;
@@ -1 +1 @@
1
- {"version":3,"file":"spawn.d.ts","sourceRoot":"","sources":["../../../../src/cli/utils/spawn.ts"],"names":[],"mappings":"AAMA,MAAM,WAAW,iBAAiB;IAChC,OAAO,EAAE,MAAM,CAAC;IAChB,IAAI,EAAE,MAAM,EAAE,CAAC;IACf,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,GAAG,CAAC,EAAE,MAAM,CAAC,UAAU,CAAC;IACxB,cAAc,CAAC,EAAE,OAAO,CAAC;CAC1B;AA0CD,eAAO,MAAM,SAAS;wBACM,iBAAiB,GAAG,OAAO,CAAC,MAAM,CAAC;EA+E7D,CAAC"}
1
+ {"version":3,"file":"spawn.d.ts","sourceRoot":"","sources":["../../../../src/cli/utils/spawn.ts"],"names":[],"mappings":"AAMA,MAAM,WAAW,iBAAiB;IAChC,OAAO,EAAE,MAAM,CAAC;IAChB,IAAI,EAAE,MAAM,EAAE,CAAC;IACf,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,GAAG,CAAC,EAAE,MAAM,CAAC,UAAU,CAAC;IACxB,cAAc,CAAC,EAAE,OAAO,CAAC;IACzB,KAAK,CAAC,EAAE,OAAO,CAAC;CACjB;AA0CD,eAAO,MAAM,SAAS;wBACM,iBAAiB,GAAG,OAAO,CAAC,MAAM,CAAC;EAiF7D,CAAC"}
@@ -42,11 +42,12 @@ const buildCommandNotFoundMessage = (command) => {
42
42
  export const SpawnUtil = Object.freeze({
43
43
  async spawnAndWait(input) {
44
44
  const cwd = input.cwd ?? process.cwd();
45
- const resolvedCommand = resolveLocalBin(input.command, cwd);
45
+ const resolvedCommand = input.shell === true ? input.command : resolveLocalBin(input.command, cwd);
46
46
  const child = spawn(resolvedCommand, input.args, {
47
47
  cwd,
48
48
  env: input.env ?? appConfig.getSafeEnv(),
49
49
  stdio: 'inherit',
50
+ shell: input.shell === true,
50
51
  });
51
52
  // In interactive shells, the foreground process group already receives SIGINT
52
53
  // (and often SIGTERM) so forwarding can cause duplicates. `tsx watch` is
@@ -1 +1 @@
1
- {"version":3,"file":"FileUploadMiddleware.d.ts","sourceRoot":"","sources":["../../../../src/http/middleware/FileUploadMiddleware.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAQH,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,6BAA6B,CAAC;AAW9D;;;GAGG;AACH,eAAO,MAAM,oBAAoB,EAAE,UA8DlC,CAAC;AAEF,eAAe,oBAAoB,CAAC"}
1
+ {"version":3,"file":"FileUploadMiddleware.d.ts","sourceRoot":"","sources":["../../../../src/http/middleware/FileUploadMiddleware.ts"],"names":[],"mappings":"AAAA;;;GAGG;AASH,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,6BAA6B,CAAC;AAW9D;;;GAGG;AACH,eAAO,MAAM,oBAAoB,EAAE,UA8DlC,CAAC;AAEF,eAAe,oBAAoB,CAAC"}
@@ -4,6 +4,7 @@
4
4
  */
5
5
  import { Env } from '../../config/env.js';
6
6
  import { Logger } from '../../config/logger.js';
7
+ import { ErrorFactory } from '../../exceptions/ZintrustError.js';
7
8
  import { MultipartParser } from '../parsers/MultipartParser.js';
8
9
  import { MultipartParserRegistry } from '../parsers/MultipartParserRegistry.js';
9
10
  /**
@@ -19,7 +20,7 @@ const getContentType = (req) => {
19
20
  * File upload middleware
20
21
  * Automatically parses multipart/form-data and makes files available
21
22
  */
22
- export const fileUploadMiddleware = async (req, res, next) => {
23
+ export const fileUploadMiddleware = async (req, _res, next) => {
23
24
  const contentType = getContentType(req);
24
25
  // Only process multipart/form-data requests
25
26
  if (!MultipartParser.isMultipart(contentType)) {
@@ -29,10 +30,10 @@ export const fileUploadMiddleware = async (req, res, next) => {
29
30
  // Phase 4 default behavior: multipart requires external streaming parser.
30
31
  const provider = MultipartParserRegistry.get();
31
32
  if (provider === null) {
32
- res.setStatus(415).json({
33
- error: 'multipart/form-data not supported. Install @zintrust/storage to enable uploads.',
33
+ throw ErrorFactory.createConfigError('Multipart upload parser is not configured.', {
34
+ contentType,
35
+ hint: 'Install @zintrust/storage to enable multipart/form-data uploads.',
34
36
  });
35
- return;
36
37
  }
37
38
  try {
38
39
  const maxFileSizeBytes = Env.getInt('MAX_FILE_SIZE', 50 * 1024 * 1024);
package/src/index.js CHANGED
@@ -1,11 +1,11 @@
1
1
  /**
2
- * @zintrust/core v0.4.86
2
+ * @zintrust/core v0.4.87
3
3
  *
4
4
  * ZinTrust Framework - Production-Grade TypeScript Backend
5
5
  * Built for performance, type safety, and exceptional developer experience
6
6
  *
7
7
  * Build Information:
8
- * Built: 2026-04-09T08:00:41.050Z
8
+ * Built: 2026-04-09T17:36:11.089Z
9
9
  * Node: >=20.0.0
10
10
  * License: MIT
11
11
  *
@@ -21,7 +21,7 @@
21
21
  * Available at runtime for debugging and health checks
22
22
  */
23
23
  export const ZINTRUST_VERSION = '0.1.41';
24
- export const ZINTRUST_BUILD_DATE = '2026-04-09T08:00:41.015Z'; // Replaced during build
24
+ export const ZINTRUST_BUILD_DATE = '2026-04-09T17:36:11.024Z'; // Replaced during build
25
25
  export { Application } from './boot/Application.js';
26
26
  export { AwsSigV4 } from './common/index.js';
27
27
  export { SignedRequest } from './security/SignedRequest.js';
@@ -1 +1 @@
1
- {"version":3,"file":"MicroserviceBootstrap.d.ts","sourceRoot":"","sources":["../../../src/microservices/MicroserviceBootstrap.ts"],"names":[],"mappings":"AAkBA;;GAEG;AACH,MAAM,WAAW,aAAa;IAC5B,EAAE,CAAC,EAAE,MAAM,CAAC;IACZ,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,MAAM,CAAC;IACf,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,OAAO,EAAE,MAAM,CAAC;IAChB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,YAAY,CAAC,EAAE,MAAM,EAAE,CAAC;IACxB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,QAAQ,CAAC,EAAE;QACT,SAAS,EAAE,QAAQ,GAAG,UAAU,CAAC;QACjC,UAAU,EAAE,OAAO,CAAC;KACrB,CAAC;IACF,IAAI,CAAC,EAAE;QACL,QAAQ,EAAE,SAAS,GAAG,KAAK,GAAG,MAAM,GAAG,QAAQ,CAAC;QAChD,SAAS,CAAC,EAAE,MAAM,CAAC;QACnB,SAAS,CAAC,EAAE,MAAM,CAAC;KACpB,CAAC;IACF,OAAO,CAAC,EAAE;QACR,OAAO,EAAE,OAAO,CAAC;QACjB,YAAY,CAAC,EAAE,MAAM,CAAC;KACvB,CAAC;CACH;AAED,MAAM,WAAW,sBAAsB;IACrC,cAAc,CAAC,GAAG,EAAE,MAAM,GAAG,IAAI,CAAC;IAClC,cAAc,IAAI,MAAM,CAAC;IACzB,gBAAgB,IAAI,OAAO,CAAC,aAAa,EAAE,CAAC,CAAC;IAC7C,gBAAgB,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;IAClC,gBAAgB,CAAC,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,aAAa,GAAG,SAAS,CAAC;IAC1E,oBAAoB,IAAI,aAAa,EAAE,CAAC;IACxC,iBAAiB,CAAC,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC;IACzD,sBAAsB,CAAC,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,MAAM,CAAC;IAC7D,gBAAgB,CAAC,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC;IACxD,sBAAsB,CAAC,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,MAAM,CAAC;IAC7D,UAAU,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;CAC7B;AAgFD;;GAEG;AACH,eAAO,MAAM,qBAAqB;mBAEf,sBAAsB;aAC5B,IAAI;cACH,sBAAsB;CA8GjC,CAAC;AAyKJ;;GAEG;AACH,wBAAgB,gBAAgB,IAAI,OAAO,CAE1C;AAED;;GAEG;AACH,wBAAgB,iBAAiB,IAAI,MAAM,EAAE,CAE5C;AAED;;GAEG;AACH,wBAAgB,qBAAqB,IAAI,MAAM,EAAE,CAEhD;AAED;;GAEG;AACH,wBAAgB,wBAAwB,IAAI,OAAO,CAElD;AAED;;GAEG;AACH,wBAAgB,4BAA4B,IAAI,MAAM,CAGrD;AAED,eAAO,MAAM,mBAAmB;;;;;;CAM/B,CAAC;AAEF,eAAe,qBAAqB,CAAC"}
1
+ {"version":3,"file":"MicroserviceBootstrap.d.ts","sourceRoot":"","sources":["../../../src/microservices/MicroserviceBootstrap.ts"],"names":[],"mappings":"AAkBA;;GAEG;AACH,MAAM,WAAW,aAAa;IAC5B,EAAE,CAAC,EAAE,MAAM,CAAC;IACZ,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,MAAM,CAAC;IACf,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,OAAO,EAAE,MAAM,CAAC;IAChB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,YAAY,CAAC,EAAE,MAAM,EAAE,CAAC;IACxB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,QAAQ,CAAC,EAAE;QACT,SAAS,EAAE,QAAQ,GAAG,UAAU,CAAC;QACjC,UAAU,EAAE,OAAO,CAAC;KACrB,CAAC;IACF,IAAI,CAAC,EAAE;QACL,QAAQ,EAAE,SAAS,GAAG,KAAK,GAAG,MAAM,GAAG,QAAQ,CAAC;QAChD,SAAS,CAAC,EAAE,MAAM,CAAC;QACnB,SAAS,CAAC,EAAE,MAAM,CAAC;KACpB,CAAC;IACF,OAAO,CAAC,EAAE;QACR,OAAO,EAAE,OAAO,CAAC;QACjB,YAAY,CAAC,EAAE,MAAM,CAAC;KACvB,CAAC;CACH;AAED,MAAM,WAAW,sBAAsB;IACrC,cAAc,CAAC,GAAG,EAAE,MAAM,GAAG,IAAI,CAAC;IAClC,cAAc,IAAI,MAAM,CAAC;IACzB,gBAAgB,IAAI,OAAO,CAAC,aAAa,EAAE,CAAC,CAAC;IAC7C,gBAAgB,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;IAClC,gBAAgB,CAAC,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,aAAa,GAAG,SAAS,CAAC;IAC1E,oBAAoB,IAAI,aAAa,EAAE,CAAC;IACxC,iBAAiB,CAAC,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC;IACzD,sBAAsB,CAAC,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,MAAM,CAAC;IAC7D,gBAAgB,CAAC,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC;IACxD,sBAAsB,CAAC,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,MAAM,CAAC;IAC7D,UAAU,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;CAC7B;AA+ED;;GAEG;AACH,eAAO,MAAM,qBAAqB;mBAEf,sBAAsB;aAC5B,IAAI;cACH,sBAAsB;CA8GjC,CAAC;AAuKJ;;GAEG;AACH,wBAAgB,gBAAgB,IAAI,OAAO,CAE1C;AAED;;GAEG;AACH,wBAAgB,iBAAiB,IAAI,MAAM,EAAE,CAE5C;AAED;;GAEG;AACH,wBAAgB,qBAAqB,IAAI,MAAM,EAAE,CAEhD;AAED;;GAEG;AACH,wBAAgB,wBAAwB,IAAI,OAAO,CAElD;AAED;;GAEG;AACH,wBAAgB,4BAA4B,IAAI,MAAM,CAGrD;AAED,eAAO,MAAM,mBAAmB;;;;;;CAM/B,CAAC;AAEF,eAAe,qBAAqB,CAAC"}
@@ -2,7 +2,7 @@ import { Env } from '../config/env.js';
2
2
  import { Logger } from '../config/logger.js';
3
3
  import { MicroserviceManager, getEnabledServices, isMicroservicesEnabled, } from './MicroserviceManager.js';
4
4
  import { getServiceId, serviceMatchesAllowList, } from './ServiceManifest.js';
5
- import fs from '../node-singletons/fs.js';
5
+ import fs, { fsPromises } from '../node-singletons/fs.js';
6
6
  import * as path from '../node-singletons/path.js';
7
7
  import { ProjectRuntime } from '../runtime/ProjectRuntime.js';
8
8
  const projectCwd = process.cwd();
@@ -19,12 +19,12 @@ async function runDiscoverServices(state) {
19
19
  Logger.info(`✅ Discovered ${manifestServices.length} microservices from static manifest`);
20
20
  return manifestServices;
21
21
  }
22
- const domains = getDomains(state.servicesDir);
23
- const services = [];
24
- for (const domain of domains) {
25
- const domainServices = discoverServicesInDomain(state, domain, services.length);
26
- services.push(...domainServices);
27
- }
22
+ const domains = await getDomains(state.servicesDir);
23
+ const services = await domains.reduce(async (pending, domain) => {
24
+ const discovered = await pending;
25
+ const domainServices = await discoverServicesInDomain(state, domain, discovered.length);
26
+ return [...discovered, ...domainServices];
27
+ }, Promise.resolve([]));
28
28
  Logger.info(`✅ Discovered ${services.length} microservices`);
29
29
  return services;
30
30
  }
@@ -186,13 +186,11 @@ async function discoverServicesFromManifest(state) {
186
186
  /**
187
187
  * Get all domains in services directory
188
188
  */
189
- function getDomains(servicesDir) {
189
+ async function getDomains(servicesDir) {
190
190
  if (!fs.existsSync(servicesDir))
191
191
  return [];
192
- return fs.readdirSync(servicesDir).filter((file) => {
193
- const filePath = path.join(servicesDir, file);
194
- return fs.statSync(filePath).isDirectory();
195
- });
192
+ const entries = await fsPromises.readdir(servicesDir, { withFileTypes: true });
193
+ return entries.filter((entry) => entry.isDirectory()).map((entry) => entry.name);
196
194
  }
197
195
  /**
198
196
  * Check if a service is enabled via environment
@@ -203,8 +201,8 @@ function isServiceEnabled(serviceName, enabledServices) {
203
201
  /**
204
202
  * Load service configuration from file
205
203
  */
206
- function loadServiceConfig(domain, serviceName, configPath, index) {
207
- const configData = JSON.parse(fs.readFileSync(configPath, 'utf-8'));
204
+ async function loadServiceConfig(domain, serviceName, configPath, index) {
205
+ const configData = JSON.parse(await fsPromises.readFile(configPath, 'utf-8'));
208
206
  return {
209
207
  id: getServiceId(domain, serviceName),
210
208
  name: serviceName,
@@ -255,33 +253,30 @@ function createServiceConfigFromManifest(entry, index) {
255
253
  /**
256
254
  * Try to load service configuration if it exists
257
255
  */
258
- function tryLoadServiceConfig(state, domain, serviceName, domainPath, index) {
256
+ async function tryLoadServiceConfig(state, domain, serviceName, domainPath, index) {
259
257
  const configPath = path.join(domainPath, serviceName, 'service.config.json');
260
258
  if (!fs.existsSync(configPath))
261
259
  return null;
262
- const config = loadServiceConfig(domain, serviceName, configPath, index);
260
+ const config = await loadServiceConfig(domain, serviceName, configPath, index);
263
261
  state.serviceConfigs.set(getServiceKey(domain, serviceName), config);
264
262
  return config;
265
263
  }
266
264
  /**
267
265
  * Discover all services within a specific domain
268
266
  */
269
- function discoverServicesInDomain(state, domain, startIndex) {
267
+ async function discoverServicesInDomain(state, domain, startIndex) {
270
268
  const domainPath = path.join(state.servicesDir, domain);
271
- const serviceNames = fs.readdirSync(domainPath).filter((file) => {
272
- const filePath = path.join(domainPath, file);
273
- return fs.statSync(filePath).isDirectory() && file !== 'shared';
274
- });
275
- const services = [];
269
+ const entries = await fsPromises.readdir(domainPath, { withFileTypes: true });
270
+ const serviceNames = entries
271
+ .filter((entry) => entry.isDirectory() && entry.name !== 'shared')
272
+ .map((entry) => entry.name);
276
273
  const enabledServices = getEnabledServices();
277
- for (const serviceName of serviceNames) {
278
- if (isServiceEnabled(serviceName, enabledServices)) {
279
- const config = tryLoadServiceConfig(state, domain, serviceName, domainPath, startIndex + services.length);
280
- if (config)
281
- services.push(config);
282
- }
283
- }
284
- return services;
274
+ const eligibleServiceNames = serviceNames.filter((serviceName) => isServiceEnabled(serviceName, enabledServices));
275
+ // Pre-filter to services that actually have config files so that the index
276
+ // used for default port assignment (3001 + index) stays contiguous and stable.
277
+ const servicesWithConfig = eligibleServiceNames.filter((serviceName) => fs.existsSync(path.join(domainPath, serviceName, 'service.config.json')));
278
+ const services = await Promise.all(servicesWithConfig.map(async (serviceName, index) => tryLoadServiceConfig(state, domain, serviceName, domainPath, startIndex + index)));
279
+ return services.filter((config) => config !== null);
285
280
  }
286
281
  /**
287
282
  * Handle discovery errors gracefully
@@ -59,6 +59,12 @@ export interface IPostgresAdapter {
59
59
  }>): Promise<void>;
60
60
  healthCheck(): Promise<boolean>;
61
61
  }
62
+ export interface IPostgresAdapterManager {
63
+ getInstance(config: PostgresPoolConfig, key?: string): IPostgresAdapter;
64
+ getAllInstances(): IPostgresAdapter[];
65
+ releaseInstance(key: string): Promise<void>;
66
+ disconnectAll(): Promise<void>;
67
+ }
62
68
  /**
63
69
  * PostgreSQL Adapter with Connection Pooling
64
70
  * Supports both shared (multi-service) and isolated (per-service) database modes
@@ -77,14 +83,14 @@ export declare function getInstance(config: PostgresPoolConfig, key?: string): I
77
83
  * Get all instances
78
84
  */
79
85
  export declare function getAllInstances(): IPostgresAdapter[];
86
+ /**
87
+ * Disconnect and release a single cached adapter instance.
88
+ */
89
+ export declare function releaseInstance(key: string): Promise<void>;
80
90
  /**
81
91
  * Disconnect all instances
82
92
  */
83
93
  export declare function disconnectAll(): Promise<void>;
84
- export declare const PostgresAdapterManager: Readonly<{
85
- getInstance: typeof getInstance;
86
- getAllInstances: typeof getAllInstances;
87
- disconnectAll: typeof disconnectAll;
88
- }>;
94
+ export declare const PostgresAdapterManager: IPostgresAdapterManager;
89
95
  export default PostgresAdapter;
90
96
  //# sourceMappingURL=PostgresAdapter.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"PostgresAdapter.d.ts","sourceRoot":"","sources":["../../../src/microservices/PostgresAdapter.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"PostgresAdapter.d.ts","sourceRoot":"","sources":["../../../src/microservices/PostgresAdapter.ts"],"names":[],"mappings":"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"}
@@ -291,6 +291,17 @@ export function getInstance(config, key = 'default') {
291
291
  export function getAllInstances() {
292
292
  return Array.from(instances.values());
293
293
  }
294
+ /**
295
+ * Disconnect and release a single cached adapter instance.
296
+ */
297
+ export async function releaseInstance(key) {
298
+ const adapter = instances.get(key);
299
+ if (adapter === undefined) {
300
+ return;
301
+ }
302
+ await adapter.disconnectAll();
303
+ instances.delete(key);
304
+ }
294
305
  /**
295
306
  * Disconnect all instances
296
307
  */
@@ -301,6 +312,7 @@ export async function disconnectAll() {
301
312
  export const PostgresAdapterManager = Object.freeze({
302
313
  getInstance,
303
314
  getAllInstances,
315
+ releaseInstance,
304
316
  disconnectAll,
305
317
  });
306
318
  export default PostgresAdapter;
@@ -1 +1 @@
1
- {"version":3,"file":"PluginManager.d.ts","sourceRoot":"","sources":["../../../src/runtime/PluginManager.ts"],"names":[],"mappings":"AAeA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,yBAAyB,CAAC;AAgShE,eAAO,MAAM,aAAa;IACxB;;OAEG;YACK,MAAM,CAAC,MAAM,EAAE,gBAAgB,CAAC;IAIxC;;OAEG;yBACkB,MAAM,GAAG,MAAM,GAAG,IAAI;IAW3C;;OAEG;0BACyB,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IA0DrD;;OAEG;sBACqB,MAAM,YAAY;QAAE,cAAc,CAAC,EAAE,MAAM,CAAA;KAAE,GAAG,OAAO,CAAC,IAAI,CAAC;IA8BrF;;;;OAIG;wBACuB,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;EA2ChD,CAAC"}
1
+ {"version":3,"file":"PluginManager.d.ts","sourceRoot":"","sources":["../../../src/runtime/PluginManager.ts"],"names":[],"mappings":"AAcA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,yBAAyB,CAAC;AAsRhE,eAAO,MAAM,aAAa;IACxB;;OAEG;YACK,MAAM,CAAC,MAAM,EAAE,gBAAgB,CAAC;IAIxC;;OAEG;yBACkB,MAAM,GAAG,MAAM,GAAG,IAAI;IAW3C;;OAEG;0BACyB,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IA0DrD;;OAEG;sBACqB,MAAM,YAAY;QAAE,cAAc,CAAC,EAAE,MAAM,CAAA;KAAE,GAAG,OAAO,CAAC,IAAI,CAAC;IA8BrF;;;;OAIG;wBACuB,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;EA2ChD,CAAC"}
@@ -8,7 +8,6 @@ import { readEnvString } from '../common/ExternalServiceUtils.js';
8
8
  import { esmDirname, resolvePackageManager } from '../common/index.js';
9
9
  import { Logger } from '../config/logger.js';
10
10
  import { ErrorFactory } from '../exceptions/ZintrustError.js';
11
- import { execSync } from '../node-singletons/child-process.js';
12
11
  import { existsSync, fsPromises as fs } from '../node-singletons/fs.js';
13
12
  import * as path from '../node-singletons/path.js';
14
13
  import { PluginRegistry } from './PluginRegistry.js';
@@ -92,21 +91,6 @@ async function npmInstall(packages, options) {
92
91
  Logger.info(`Installing ${options.label}: ${packages.join(', ')}...`);
93
92
  const projectRoot = options.projectRoot ?? resolveProjectRoot();
94
93
  const pm = options.packageManager ?? resolvePackageManager();
95
- // Legacy behavior: npm uses execSync in this framework.
96
- // This keeps behavior predictable for CI/test environments and matches existing unit tests.
97
- if (pm === 'npm') {
98
- const cmd = options.dev
99
- ? `npm install -D ${packages.join(' ')}`
100
- : `npm install ${packages.join(' ')}`;
101
- try {
102
- execSync(cmd, { cwd: projectRoot, stdio: 'inherit' });
103
- return;
104
- }
105
- catch (error) {
106
- ErrorFactory.createCliError(`Failed to install ${options.label}`, { error });
107
- throw error;
108
- }
109
- }
110
94
  let cmd;
111
95
  let args = [];
112
96
  switch (pm) {
@@ -217,7 +201,7 @@ async function ensurePluginAutoImports(plugin) {
217
201
  const next = lines.join('\n') + '\n';
218
202
  await fs.writeFile(pluginFile, next, 'utf-8');
219
203
  }
220
- function runPostInstall(plugin) {
204
+ async function runPostInstall(plugin) {
221
205
  if (!plugin.postInstall)
222
206
  return;
223
207
  const projectRoot = resolveProjectRoot();
@@ -227,14 +211,20 @@ function runPostInstall(plugin) {
227
211
  const allow = getAllowPostInstallEnv() === '1';
228
212
  if (allow) {
229
213
  Logger.info(`Running post-install command: ${plugin.postInstall.command}...`);
214
+ let exit;
230
215
  try {
231
- execSync(plugin.postInstall.command, {
232
- stdio: 'inherit',
216
+ exit = await SpawnUtil.spawnAndWait({
217
+ command: plugin.postInstall.command,
218
+ args: [],
233
219
  cwd: projectRoot,
220
+ shell: true,
234
221
  });
235
222
  }
236
223
  catch (error) {
237
- ErrorFactory.createCliError('Post-install command failed', { error });
224
+ throw ErrorFactory.createCliError('Post-install command failed', { error });
225
+ }
226
+ if (exit !== 0) {
227
+ throw ErrorFactory.createCliError('Post-install command failed', { exit });
238
228
  }
239
229
  }
240
230
  else {
@@ -332,8 +322,8 @@ export const PluginManager = Object.freeze({
332
322
  await copyPluginTemplates(plugin);
333
323
  // 2b. Ensure plugin-side effects are imported by the project
334
324
  await ensurePluginAutoImports(plugin);
335
- // 3. Post-Install (still executed via execSync - opt-in)
336
- runPostInstall(plugin);
325
+ // 3. Post-Install (opt-in, async to avoid blocking the event loop)
326
+ await runPostInstall(plugin);
337
327
  Logger.info(`✓ Plugin ${plugin.name} installed successfully`);
338
328
  },
339
329
  /**
@@ -0,0 +1,11 @@
1
+ import '../packages/db-d1/src/register.js';
2
+ import '../packages/db-mysql/src/register.js';
3
+ import '../packages/db-postgres/src/register.js';
4
+ import '../packages/db-sqlite/src/register.js';
5
+ import '../packages/db-sqlserver/src/register.js';
6
+ import '../packages/mail-sendgrid/src/register.js';
7
+ import '../packages/mail-smtp/src/register.js';
8
+ import '@zintrust/queue-monitor';
9
+ import '../packages/queue-redis/src/register.js';
10
+ import '../packages/workers/src/register.js';
11
+ //# sourceMappingURL=zintrust.comon.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"zintrust.comon.d.ts","sourceRoot":"","sources":["../../src/zintrust.comon.ts"],"names":[],"mappings":"AAQA,OAAO,mCAAmC,CAAC;AAC3C,OAAO,sCAAsC,CAAC;AAC9C,OAAO,yCAAyC,CAAC;AACjD,OAAO,uCAAuC,CAAC;AAC/C,OAAO,0CAA0C,CAAC;AAClD,OAAO,2CAA2C,CAAC;AACnD,OAAO,uCAAuC,CAAC;AAC/C,OAAO,wCAAwC,CAAC;AAChD,OAAO,yCAAyC,CAAC;AACjD,OAAO,qCAAqC,CAAC"}
@@ -0,0 +1,17 @@
1
+ /* eslint-disable no-restricted-imports */
2
+ // /**
3
+ // * ZinTrust comon plugin auto-imports
4
+ // *
5
+ // * This file is managed by `zin plugin install` and contains side-effect
6
+ // * imports that register optional adapters/drivers into core registries.
7
+ // */
8
+ import '../packages/db-d1/src/register.js';
9
+ import '../packages/db-mysql/src/register.js';
10
+ import '../packages/db-postgres/src/register.js';
11
+ import '../packages/db-sqlite/src/register.js';
12
+ import '../packages/db-sqlserver/src/register.js';
13
+ import '../packages/mail-sendgrid/src/register.js';
14
+ import '../packages/mail-smtp/src/register.js';
15
+ import '@zintrust/queue-monitor';
16
+ import '../packages/queue-redis/src/register.js';
17
+ import '../packages/workers/src/register.js';
@@ -1,7 +1,10 @@
1
1
  /**
2
- * Auto-generated fallback module.
3
- * This file is created by scripts/ensure-worker-plugins.mjs when missing.
4
- * It allows optional runtime plugin imports to resolve in CI/scaffolded setups.
2
+ * ZinTrust plugin auto-imports
3
+ *
4
+ * In real projects, this file is managed by `zin plugin install` and contains
5
+ * side-effect imports (e.g. `@zintrust/db-sqlite/register`) that register
6
+ * optional adapters/drivers into core registries.
7
+ *
5
8
  */
6
9
  export type {};
7
10
  export declare const __zintrustGeneratedPluginStub = "zintrust.plugins.ts";
@@ -1 +1 @@
1
- {"version":3,"file":"zintrust.plugins.d.ts","sourceRoot":"","sources":["../../src/zintrust.plugins.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAIH,YAAY,EAAE,CAAC;AAgBf,eAAO,MAAM,6BAA6B,wBAAwB,CAAC;;AACnE,wBAAkB"}
1
+ {"version":3,"file":"zintrust.plugins.d.ts","sourceRoot":"","sources":["../../src/zintrust.plugins.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAIH,YAAY,EAAE,CAAC;AAgBf,eAAO,MAAM,6BAA6B,wBAAwB,CAAC;;AACnE,wBAAkB"}
@@ -1,7 +1,10 @@
1
1
  /**
2
- * Auto-generated fallback module.
3
- * This file is created by scripts/ensure-worker-plugins.mjs when missing.
4
- * It allows optional runtime plugin imports to resolve in CI/scaffolded setups.
2
+ * ZinTrust plugin auto-imports
3
+ *
4
+ * In real projects, this file is managed by `zin plugin install` and contains
5
+ * side-effect imports (e.g. `@zintrust/db-sqlite/register`) that register
6
+ * optional adapters/drivers into core registries.
7
+ *
5
8
  */
6
9
  import * as TraceRuntime from './runtime/plugins/trace-runtime.js';
7
10
  globalThis.__zintrust_system_trace_plugin_requested__ = true;