@zintrust/core 0.4.54 → 0.4.56

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/README.md CHANGED
@@ -21,6 +21,8 @@ zin start
21
21
 
22
22
  Your API is now running at `http://localhost:7777`
23
23
 
24
+ Fresh projects also include a default flat ESLint setup through `@zintrust/governance/eslint`, so `npm run lint` works immediately after scaffolding.
25
+
24
26
  If you’re targeting a different runtime:
25
27
 
26
28
  - Cloudflare Workers (Wrangler): `zin start --wg`
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@zintrust/core",
3
- "version": "0.4.54",
3
+ "version": "0.4.56",
4
4
  "description": "Production-grade TypeScript backend framework for JavaScript",
5
5
  "homepage": "https://zintrust.com",
6
6
  "repository": {
@@ -57,6 +57,8 @@
57
57
  "./package.json": "./package.json"
58
58
  },
59
59
  "dependencies": {
60
+ "@cloudflare/containers": "^0.2.0",
61
+ "@zintrust/workers": "0.4.50",
60
62
  "bcryptjs": "^3.0.3",
61
63
  "bullmq": "^5.71.1",
62
64
  "chalk": "^5.6.2",
@@ -1 +1 @@
1
- {"version":3,"file":"registerRoute.d.ts","sourceRoot":"","sources":["../../../../src/boot/registry/registerRoute.ts"],"names":[],"mappings":"AAEA,OAAO,EAAU,KAAK,OAAO,EAAE,MAAM,qBAAqB,CAAC;AAc3D,eAAO,MAAM,kBAAkB,QAAO,OAKrC,CAAC;AAEF,eAAO,MAAM,iBAAiB,GAAU,CAAC,EAAE,YAAY,MAAM,KAAG,OAAO,CAAC,CAAC,GAAG,SAAS,CAMpF,CAAC;AAEF,eAAO,MAAM,kBAAkB,GAAU,CAAC,EAAE,YAAY,MAAM,KAAG,OAAO,CAAC,CAAC,GAAG,SAAS,CAOrF,CAAC;AA2LF,eAAO,MAAM,oBAAoB,GAC/B,kBAAkB,MAAM,EACxB,QAAQ,OAAO,KACd,OAAO,CAAC,IAAI,CAqBd,CAAC"}
1
+ {"version":3,"file":"registerRoute.d.ts","sourceRoot":"","sources":["../../../../src/boot/registry/registerRoute.ts"],"names":[],"mappings":"AAEA,OAAO,EAAU,KAAK,OAAO,EAAE,MAAM,qBAAqB,CAAC;AAc3D,eAAO,MAAM,kBAAkB,QAAO,OAKrC,CAAC;AAEF,eAAO,MAAM,iBAAiB,GAAU,CAAC,EAAE,YAAY,MAAM,KAAG,OAAO,CAAC,CAAC,GAAG,SAAS,CAMpF,CAAC;AAEF,eAAO,MAAM,kBAAkB,GAAU,CAAC,EAAE,YAAY,MAAM,KAAG,OAAO,CAAC,CAAC,GAAG,SAAS,CAOrF,CAAC;AAoMF,eAAO,MAAM,oBAAoB,GAC/B,kBAAkB,MAAM,EACxB,QAAQ,OAAO,KACd,OAAO,CAAC,IAAI,CAqBd,CAAC"}
@@ -86,6 +86,13 @@ const resolveServicePrefix = (entry) => {
86
86
  }
87
87
  return `/${entry.domain}/${entry.name}`;
88
88
  };
89
+ const shouldPreferRootEnvInMonolith = () => {
90
+ if (typeof process === 'undefined' || process.env === undefined)
91
+ return false;
92
+ const raw = process.env['RUN_AS_MONOLITH'] ?? '';
93
+ const normalized = raw.trim().toLowerCase();
94
+ return normalized === '1' || normalized === 'true' || normalized === 'yes' || normalized === 'on';
95
+ };
89
96
  const ensureManifestServiceEnvLoaded = async (entry) => {
90
97
  if (isCloudflare)
91
98
  return;
@@ -98,6 +105,7 @@ const ensureManifestServiceEnvLoaded = async (entry) => {
98
105
  cwd: projectRoot,
99
106
  includeCwd: true,
100
107
  envPaths: [envPath],
108
+ envPathsOverrideExisting: !shouldPreferRootEnvInMonolith(),
101
109
  });
102
110
  };
103
111
  const shouldRegisterManifestEntry = (entry, activeService) => {
package/src/boot.d.ts.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"boot.d.ts","sourceRoot":"","sources":["../../src/boot.ts"],"names":[],"mappings":"AAoCA,OAAO,EAAE,CAAC"}
1
+ {"version":3,"file":"boot.d.ts","sourceRoot":"","sources":["../../src/boot.ts"],"names":[],"mappings":"AAQA,OAAO,EAAE,CAAC"}
package/src/boot.js CHANGED
@@ -1,30 +1,6 @@
1
- import { isNodeRuntime } from './runtime/detectRuntime.js';
2
- import { resolveNodeProjectRoot } from './runtime/resolveNodeProjectRoot.js';
3
- const ensureNodeBootstrapEnv = async () => {
4
- if (!isNodeRuntime())
5
- return;
6
- const projectRoot = await resolveNodeProjectRoot();
7
- if ((process.env?.['ZINTRUST_PROJECT_ROOT'] ?? '').trim() === '') {
8
- process.env['ZINTRUST_PROJECT_ROOT'] = projectRoot;
9
- }
10
- const [{ EnvFileLoader }, { Logger }, { existsSync }, path] = await Promise.all([
11
- import('./cli/utils/EnvFileLoader.js'),
12
- import('./config/logger.js'),
13
- import('./node-singletons/fs.js'),
14
- import('./node-singletons/path.js'),
15
- ]);
16
- const state = EnvFileLoader.ensureLoaded({
17
- cwd: projectRoot,
18
- includeCwd: true,
19
- });
20
- if (state.loadedFiles.length > 0)
21
- return;
22
- const resolvedDotEnv = path.join(projectRoot, '.env');
23
- Logger.warn('Node bootstrap started without loaded env files.', {
24
- projectRoot,
25
- resolvedDotEnv: existsSync(resolvedDotEnv) ? resolvedDotEnv : 'missing',
26
- entry: '@zintrust/core/boot',
27
- });
28
- };
29
- await ensureNodeBootstrapEnv();
1
+ import { ensureNodeStartupEnvLoaded } from './runtime/NodeStartup.js';
2
+ await ensureNodeStartupEnvLoaded({
3
+ entry: '@zintrust/core/boot',
4
+ warnOnMissingEnv: true,
5
+ });
30
6
  await import('./boot/bootstrap.js');
@@ -1 +1 @@
1
- {"version":3,"file":"StartCommand.d.ts","sourceRoot":"","sources":["../../../../src/cli/commands/StartCommand.ts"],"names":[],"mappings":"AAAA,OAAO,EAAoC,KAAK,YAAY,EAAE,MAAM,kBAAkB,CAAC;AA2+BvF,eAAO,MAAM,YAAY;cACb,YAAY;;mCAn7BU,MAAM,KAAG,OAAO;4CAaP,MAAM,KAAG,MAAM;4CA4Bf,MAAM,KAAG,OAAO;sCAetB,MAAM,WAAW,MAAM,KAAG,OAAO;oCAmBnC,MAAM,KAAG,OAAO;;EAm5BjD,CAAC"}
1
+ {"version":3,"file":"StartCommand.d.ts","sourceRoot":"","sources":["../../../../src/cli/commands/StartCommand.ts"],"names":[],"mappings":"AAAA,OAAO,EAAoC,KAAK,YAAY,EAAE,MAAM,kBAAkB,CAAC;AAsgCvF,eAAO,MAAM,YAAY;cACb,YAAY;;mCA18BU,MAAM,KAAG,OAAO;4CAaP,MAAM,KAAG,MAAM;4CA4Bf,MAAM,KAAG,OAAO;sCAetB,MAAM,WAAW,MAAM,KAAG,OAAO;oCAmBnC,MAAM,KAAG,OAAO;;EA06BjD,CAAC"}
@@ -1,6 +1,6 @@
1
1
  import { BaseCommand } from '../BaseCommand.js';
2
2
  import { withWranglerDevVarsSnapshot } from '../cloudflare/CloudflareWranglerDevEnv.js';
3
- import { createDenoRunnerSource, createLambdaRunnerSource } from '../commands/runner/index.js';
3
+ import { createDenoRunnerSource, createLambdaRunnerSource, createNodeRunnerSource, } from '../commands/runner/index.js';
4
4
  import { EnvFileLoader } from '../utils/EnvFileLoader.js';
5
5
  import { SpawnUtil } from '../utils/spawn.js';
6
6
  import { readEnvString } from '../../common/ExternalServiceUtils.js';
@@ -337,6 +337,10 @@ const buildStartEnv = (projectRoot) => ({
337
337
  ...process.env,
338
338
  ZINTRUST_PROJECT_ROOT: projectRoot,
339
339
  });
340
+ const shouldPreferRootEnvInMonolith = () => {
341
+ const raw = readEnvString('RUN_AS_MONOLITH').trim().toLowerCase();
342
+ return raw === '1' || raw === 'true' || raw === 'yes' || raw === 'on';
343
+ };
340
344
  const resolveManifestServiceEnvDir = (projectRoot, entry) => {
341
345
  const configRoot = entry.configRoot;
342
346
  if (isNonEmptyString(configRoot)) {
@@ -375,6 +379,7 @@ const preloadManifestServiceEnv = async (context, options) => {
375
379
  cwd: context.projectRoot,
376
380
  includeCwd: resolveRootEnvPreference(options),
377
381
  envPaths,
382
+ envPathsOverrideExisting: !shouldPreferRootEnvInMonolith(),
378
383
  });
379
384
  };
380
385
  const isFrameworkRepo = (packageJson) => packageJson.name === '@zintrust/core';
@@ -415,17 +420,25 @@ const resolveRuntimeStartModuleSpecifier = (cwd) => {
415
420
  }
416
421
  return '@zintrust/core/start';
417
422
  };
418
- const resolveNodeDevCommand = (cwd, packageJson) => {
419
- if (isFrameworkRepo(packageJson)) {
420
- const bootstrap = resolveBootstrapEntryTs(cwd);
421
- return { command: 'tsx', args: ['watch', bootstrap ?? 'src/index.ts'] };
423
+ const resolveRuntimeCompiledStartModuleSpecifier = (cwd) => {
424
+ const localCompiledStart = path.join(cwd, 'dist', 'src', 'start.js');
425
+ if (existsSync(localCompiledStart)) {
426
+ return '../dist/src/start.js';
422
427
  }
423
- const bootstrap = resolveBootstrapEntryTs(cwd);
424
- if (bootstrap !== undefined) {
425
- return { command: 'tsx', args: ['watch', bootstrap] };
426
- }
427
- if (existsSync(path.join(cwd, 'src/index.ts'))) {
428
- return { command: 'tsx', args: ['watch', 'src/index.ts'] };
428
+ return '@zintrust/core/start';
429
+ };
430
+ const hasNodeSourceEntrypoint = (cwd) => {
431
+ return resolveBootstrapEntryTs(cwd) !== undefined || existsSync(path.join(cwd, 'src/index.ts'));
432
+ };
433
+ const ensureNodeSourceRunner = (cwd) => {
434
+ return ensureTmpRunnerFile(cwd, 'zin-start-node.ts', createNodeRunnerSource(resolveRuntimeStartModuleSpecifier(cwd)));
435
+ };
436
+ const ensureNodeCompiledRunner = (cwd) => {
437
+ return ensureTmpRunnerFile(cwd, 'zin-start-node.mjs', createNodeRunnerSource(resolveRuntimeCompiledStartModuleSpecifier(cwd)));
438
+ };
439
+ const resolveNodeDevCommand = (cwd, packageJson) => {
440
+ if (isFrameworkRepo(packageJson) || hasNodeSourceEntrypoint(cwd)) {
441
+ return { command: 'tsx', args: ['watch', ensureNodeSourceRunner(cwd)] };
429
442
  }
430
443
  // Fallback: if the app provides a dev script, run it.
431
444
  // IMPORTANT: avoid calling `npm run dev` when the dev script itself invokes `zin`/`zintrust`
@@ -440,24 +453,16 @@ const resolveNodeDevCommand = (cwd, packageJson) => {
440
453
  };
441
454
  const resolveNodeProdCommand = (cwd) => {
442
455
  const compiledBoot = path.join(cwd, 'dist/src/boot/bootstrap.js');
443
- let compiled;
444
456
  if (existsSync(compiledBoot) && !runFromSource()) {
445
- compiled = 'dist/src/boot/bootstrap.js';
457
+ return { command: 'node', args: [ensureNodeCompiledRunner(cwd)] };
446
458
  }
447
459
  // If compiled app isn't available (or the env forces running from source),
448
460
  // fall back to running the source entry with `tsx` so developers can test
449
461
  // core files with production semantics without building.
450
- if (compiled === undefined) {
451
- const bootstrap = resolveBootstrapEntryTs(cwd);
452
- if (bootstrap !== undefined) {
453
- return { command: 'tsx', args: [bootstrap] };
454
- }
455
- if (existsSync(path.join(cwd, 'src/index.ts'))) {
456
- return { command: 'tsx', args: ['src/index.ts'] };
457
- }
458
- throw ErrorFactory.createCliError("Error: Compiled app not found at dist/src/boot/bootstrap.js. Run 'npm run build' first or set ZINTRUST_RUN_FROM_SOURCE=1 to run source in production.");
462
+ if (hasNodeSourceEntrypoint(cwd)) {
463
+ return { command: 'tsx', args: [ensureNodeSourceRunner(cwd)] };
459
464
  }
460
- return { command: 'node', args: [compiled] };
465
+ throw ErrorFactory.createCliError("Error: Compiled app not found at dist/src/boot/bootstrap.js. Run 'npm run build' first or set ZINTRUST_RUN_FROM_SOURCE=1 to run source in production.");
461
466
  };
462
467
  const resolveWranglerDevConfig = (context, wranglerConfig) => {
463
468
  const normalizedConfig = typeof wranglerConfig === 'string' ? wranglerConfig.trim() : '';
@@ -612,13 +617,15 @@ const executeNodeStart = async (cmd, context, mode, watchEnabled, _port) => {
612
617
  if (mode === 'development') {
613
618
  if (!watchEnabled) {
614
619
  cmd.warn('Watch mode disabled; starting once.');
615
- const bootstrap = resolveBootstrapEntryTs(context.cwd);
616
- const args = bootstrap === undefined ? ['src/index.ts'] : [bootstrap];
620
+ const args = [ensureNodeSourceRunner(context.cwd)];
617
621
  const exitCode = await SpawnUtil.spawnAndWait({
618
622
  command: 'tsx',
619
623
  args,
620
624
  forwardSignals: false,
621
- env: buildStartEnv(context.projectRoot),
625
+ env: {
626
+ ...buildStartEnv(context.projectRoot),
627
+ ZINTRUST_BOOTSTRAP_PREFERENCE: 'source',
628
+ },
622
629
  });
623
630
  process.exit(exitCode);
624
631
  }
@@ -628,7 +635,10 @@ const executeNodeStart = async (cmd, context, mode, watchEnabled, _port) => {
628
635
  command: dev.command,
629
636
  args: dev.args,
630
637
  forwardSignals: false,
631
- env: buildStartEnv(context.projectRoot),
638
+ env: {
639
+ ...buildStartEnv(context.projectRoot),
640
+ ZINTRUST_BOOTSTRAP_PREFERENCE: 'source',
641
+ },
632
642
  });
633
643
  process.exit(exitCode);
634
644
  }
@@ -638,7 +648,10 @@ const executeNodeStart = async (cmd, context, mode, watchEnabled, _port) => {
638
648
  command: prod.command,
639
649
  args: prod.args,
640
650
  forwardSignals: false,
641
- env: buildStartEnv(context.projectRoot),
651
+ env: {
652
+ ...buildStartEnv(context.projectRoot),
653
+ ZINTRUST_BOOTSTRAP_PREFERENCE: runFromSource() ? 'source' : 'compiled',
654
+ },
642
655
  });
643
656
  process.exit(exitCode);
644
657
  };
@@ -1,3 +1,4 @@
1
1
  export declare const createDenoRunnerSource: (startModuleSpecifier: string) => string;
2
2
  export declare const createLambdaRunnerSource: (startModuleSpecifier: string) => string;
3
+ export declare const createNodeRunnerSource: (startModuleSpecifier: string) => string;
3
4
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../../src/cli/commands/runner/index.ts"],"names":[],"mappings":"AAoJA,eAAO,MAAM,sBAAsB,GAAI,sBAAsB,MAAM,KAAG,MAErE,CAAC;AAEF,eAAO,MAAM,wBAAwB,GAAI,sBAAsB,MAAM,KAAG,MAEvE,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../../src/cli/commands/runner/index.ts"],"names":[],"mappings":"AA2JA,eAAO,MAAM,sBAAsB,GAAI,sBAAsB,MAAM,KAAG,MAErE,CAAC;AAEF,eAAO,MAAM,wBAAwB,GAAI,sBAAsB,MAAM,KAAG,MAEvE,CAAC;AAEF,eAAO,MAAM,sBAAsB,GAAI,sBAAsB,MAAM,KAAG,MAErE,CAAC"}
@@ -142,9 +142,18 @@ const lambdaRunnerTemplate = [
142
142
  '});',
143
143
  '',
144
144
  ].join('\n');
145
+ const nodeRunnerTemplate = [
146
+ `import { start } from ${START_MODULE_PLACEHOLDER};`,
147
+ '',
148
+ 'await start();',
149
+ '',
150
+ ].join('\n');
145
151
  export const createDenoRunnerSource = (startModuleSpecifier) => {
146
152
  return injectStartModuleSpecifier(denoRunnerTemplate, startModuleSpecifier);
147
153
  };
148
154
  export const createLambdaRunnerSource = (startModuleSpecifier) => {
149
155
  return injectStartModuleSpecifier(lambdaRunnerTemplate, startModuleSpecifier);
150
156
  };
157
+ export const createNodeRunnerSource = (startModuleSpecifier) => {
158
+ return injectStartModuleSpecifier(nodeRunnerTemplate, startModuleSpecifier);
159
+ };
@@ -65,7 +65,7 @@ const inferGovernanceVersion = (pkg) => {
65
65
  };
66
66
  const writeEslintConfig = (projectRoot) => {
67
67
  const eslintConfigPath = path.join(projectRoot, 'eslint.config.mjs');
68
- const content = `import { zintrustAppEslintConfig } from '@zintrust/governance';
68
+ const content = `import { zintrustAppEslintConfig } from '@zintrust/governance/eslint';
69
69
 
70
70
  export default zintrustAppEslintConfig({
71
71
  tsconfigRootDir: import.meta.dirname,
@@ -4,6 +4,7 @@ type LoadOptions = {
4
4
  includeCwd?: boolean;
5
5
  extraCwds?: string[];
6
6
  envPaths?: string[];
7
+ envPathsOverrideExisting?: boolean;
7
8
  overrideExisting?: boolean;
8
9
  };
9
10
  type LoadState = {
@@ -1 +1 @@
1
- {"version":3,"file":"EnvFileLoader.d.ts","sourceRoot":"","sources":["../../../../src/cli/utils/EnvFileLoader.ts"],"names":[],"mappings":"AASA,KAAK,QAAQ,GAAG,aAAa,GAAG,YAAY,GAAG,SAAS,CAAC;AA8IzD,KAAK,WAAW,GAAG;IACjB,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,SAAS,CAAC,EAAE,MAAM,EAAE,CAAC;IACrB,QAAQ,CAAC,EAAE,MAAM,EAAE,CAAC;IACpB,gBAAgB,CAAC,EAAE,OAAO,CAAC;CAC5B,CAAC;AAEF,KAAK,SAAS,GAAG;IACf,WAAW,EAAE,MAAM,EAAE,CAAC;IACtB,IAAI,CAAC,EAAE,MAAM,CAAC;CACf,CAAC;AAaF,KAAK,YAAY,GAAG;IAClB,OAAO,CAAC,EAAE,QAAQ,CAAC;IACnB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,YAAY,CAAC,EAAE,OAAO,CAAC;CACxB,CAAC;AAwMF,eAAO,MAAM,aAAa;qBAjDH,WAAW,KAAQ,SAAS;6BAapB,IAAI,CAAC,WAAW,EAAE,kBAAkB,CAAC,KAAQ,SAAS;mCAG/C,YAAY,KAAG,IAAI;oBA+BpC,SAAS;EAO5B,CAAC"}
1
+ {"version":3,"file":"EnvFileLoader.d.ts","sourceRoot":"","sources":["../../../../src/cli/utils/EnvFileLoader.ts"],"names":[],"mappings":"AASA,KAAK,QAAQ,GAAG,aAAa,GAAG,YAAY,GAAG,SAAS,CAAC;AA8IzD,KAAK,WAAW,GAAG;IACjB,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,SAAS,CAAC,EAAE,MAAM,EAAE,CAAC;IACrB,QAAQ,CAAC,EAAE,MAAM,EAAE,CAAC;IACpB,wBAAwB,CAAC,EAAE,OAAO,CAAC;IACnC,gBAAgB,CAAC,EAAE,OAAO,CAAC;CAC5B,CAAC;AAEF,KAAK,SAAS,GAAG;IACf,WAAW,EAAE,MAAM,EAAE,CAAC;IACtB,IAAI,CAAC,EAAE,MAAM,CAAC;CACf,CAAC;AAaF,KAAK,YAAY,GAAG;IAClB,OAAO,CAAC,EAAE,QAAQ,CAAC;IACnB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,YAAY,CAAC,EAAE,OAAO,CAAC;CACxB,CAAC;AAyMF,eAAO,MAAM,aAAa;qBAjDH,WAAW,KAAQ,SAAS;6BAapB,IAAI,CAAC,WAAW,EAAE,kBAAkB,CAAC,KAAQ,SAAS;mCAG/C,YAAY,KAAG,IAAI;oBA+BpC,SAAS;EAO5B,CAAC"}
@@ -207,6 +207,7 @@ const createLoadPlan = (options) => {
207
207
  const extraCwds = normalizeCwdList(options.extraCwds);
208
208
  const envPaths = normalizeEnvPathList(options.envPaths);
209
209
  const overrideExisting = options.overrideExisting ?? true;
210
+ const envPathsOverrideExisting = options.envPathsOverrideExisting ?? true;
210
211
  const sources = [];
211
212
  if (includeCwd) {
212
213
  sources.push({
@@ -230,7 +231,7 @@ const createLoadPlan = (options) => {
230
231
  key: `${looksLikeFile ? 'file' : 'cwd'}:${envPath}`,
231
232
  path: envPath,
232
233
  kind: looksLikeFile ? 'file' : 'cwd',
233
- overrideExisting: true,
234
+ overrideExisting: envPathsOverrideExisting,
234
235
  });
235
236
  }
236
237
  return sources.filter((source, index, items) => items.findIndex((item) => item.key === source.key) === index);
package/src/index.js CHANGED
@@ -1,11 +1,11 @@
1
1
  /**
2
- * @zintrust/core v0.4.54
2
+ * @zintrust/core v0.4.56
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-04T15:24:52.580Z
8
+ * Built: 2026-04-04T16:43:22.388Z
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-04T15:24:52.546Z'; // Replaced during build
24
+ export const ZINTRUST_BUILD_DATE = '2026-04-04T16:43:22.354Z'; // 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';
@@ -0,0 +1,14 @@
1
+ type NodeStartupLoadState = {
2
+ loadedFiles: string[];
3
+ mode?: string;
4
+ };
5
+ type EnsureNodeStartupEnvOptions = {
6
+ entry: string;
7
+ warnOnMissingEnv?: boolean;
8
+ };
9
+ export declare const ensureNodeStartupEnvLoaded: (options: EnsureNodeStartupEnvOptions) => Promise<NodeStartupLoadState | undefined>;
10
+ declare const _default: Readonly<{
11
+ ensureNodeStartupEnvLoaded: (options: EnsureNodeStartupEnvOptions) => Promise<NodeStartupLoadState | undefined>;
12
+ }>;
13
+ export default _default;
14
+ //# sourceMappingURL=NodeStartup.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"NodeStartup.d.ts","sourceRoot":"","sources":["../../../src/runtime/NodeStartup.ts"],"names":[],"mappings":"AAGA,KAAK,oBAAoB,GAAG;IAC1B,WAAW,EAAE,MAAM,EAAE,CAAC;IACtB,IAAI,CAAC,EAAE,MAAM,CAAC;CACf,CAAC;AAEF,KAAK,2BAA2B,GAAG;IACjC,KAAK,EAAE,MAAM,CAAC;IACd,gBAAgB,CAAC,EAAE,OAAO,CAAC;CAC5B,CAAC;AAmBF,eAAO,MAAM,0BAA0B,GACrC,SAAS,2BAA2B,KACnC,OAAO,CAAC,oBAAoB,GAAG,SAAS,CAuB1C,CAAC;;0CAxBS,2BAA2B,KACnC,OAAO,CAAC,oBAAoB,GAAG,SAAS,CAAC;;AAyB5C,wBAEG"}
@@ -0,0 +1,39 @@
1
+ import { isNodeRuntime } from './detectRuntime.js';
2
+ import { resolveNodeProjectRoot } from './resolveNodeProjectRoot.js';
3
+ let pendingNodeStartupEnv;
4
+ const warnOnMissingEnvFiles = async (projectRoot, entry) => {
5
+ const [{ Logger }, { existsSync }, path] = await Promise.all([
6
+ import('../config/logger.js'),
7
+ import('../node-singletons/fs.js'),
8
+ import('../node-singletons/path.js'),
9
+ ]);
10
+ const resolvedDotEnv = path.join(projectRoot, '.env');
11
+ Logger.warn('Node bootstrap started without loaded env files.', {
12
+ projectRoot,
13
+ resolvedDotEnv: existsSync(resolvedDotEnv) ? resolvedDotEnv : 'missing',
14
+ entry,
15
+ });
16
+ };
17
+ export const ensureNodeStartupEnvLoaded = async (options) => {
18
+ if (!isNodeRuntime())
19
+ return undefined;
20
+ pendingNodeStartupEnv ??= (async () => {
21
+ const projectRoot = await resolveNodeProjectRoot();
22
+ if ((process.env?.['ZINTRUST_PROJECT_ROOT'] ?? '').trim() === '') {
23
+ process.env['ZINTRUST_PROJECT_ROOT'] = projectRoot;
24
+ }
25
+ const { EnvFileLoader } = await import('../cli/utils/EnvFileLoader.js');
26
+ const state = EnvFileLoader.ensureLoaded({
27
+ cwd: projectRoot,
28
+ includeCwd: true,
29
+ });
30
+ if (options.warnOnMissingEnv === true && state.loadedFiles.length === 0) {
31
+ await warnOnMissingEnvFiles(projectRoot, options.entry);
32
+ }
33
+ return state;
34
+ })();
35
+ return pendingNodeStartupEnv;
36
+ };
37
+ export default Object.freeze({
38
+ ensureNodeStartupEnvLoaded,
39
+ });
@@ -1 +1 @@
1
- {"version":3,"file":"ProjectBootstrap.d.ts","sourceRoot":"","sources":["../../../src/runtime/ProjectBootstrap.ts"],"names":[],"mappings":"AAgCA,wBAAsB,oBAAoB,IAAI,OAAO,CAAC,IAAI,CAAC,CAU1D;;;;AAED,wBAEG"}
1
+ {"version":3,"file":"ProjectBootstrap.d.ts","sourceRoot":"","sources":["../../../src/runtime/ProjectBootstrap.ts"],"names":[],"mappings":"AA2CA,wBAAsB,oBAAoB,IAAI,OAAO,CAAC,IAAI,CAAC,CAU1D;;;;AAED,wBAEG"}
@@ -8,11 +8,20 @@ const getProjectRoot = () => {
8
8
  return fromEnv.trim();
9
9
  return process.cwd();
10
10
  };
11
- const getBootstrapCandidates = (projectRoot) => [
12
- path.join(projectRoot, 'src', 'boot', 'bootstrap.ts'),
13
- path.join(projectRoot, 'dist', 'src', 'boot', 'bootstrap.js'),
14
- path.join(projectRoot, 'src', 'boot', 'bootstrap.js'),
15
- ];
11
+ const getBootstrapPreference = () => {
12
+ const raw = process.env?.['ZINTRUST_BOOTSTRAP_PREFERENCE'] ?? '';
13
+ return raw.trim().toLowerCase() === 'compiled' ? 'compiled' : 'source';
14
+ };
15
+ const getBootstrapCandidates = (projectRoot) => {
16
+ const sourceCandidates = [
17
+ path.join(projectRoot, 'src', 'boot', 'bootstrap.ts'),
18
+ path.join(projectRoot, 'src', 'boot', 'bootstrap.js'),
19
+ ];
20
+ const compiledCandidate = path.join(projectRoot, 'dist', 'src', 'boot', 'bootstrap.js');
21
+ return getBootstrapPreference() === 'compiled'
22
+ ? [compiledCandidate, ...sourceCandidates]
23
+ : [sourceCandidates[0], compiledCandidate, sourceCandidates[1]];
24
+ };
16
25
  const tryImportBootstrapCandidate = async (candidate) => {
17
26
  if (!existsSync(candidate))
18
27
  return false;
package/src/start.d.ts CHANGED
@@ -8,17 +8,22 @@ export declare const bootStandaloneService: (importMetaUrl: string, activeServic
8
8
  * This uses a non-literal dynamic import so Worker bundlers don't pull Node-only modules.
9
9
  */
10
10
  export declare const start: () => Promise<void>;
11
+ declare const cloudflareWorker: Readonly<{
12
+ fetch: (request: Request, env: unknown, ctx: unknown) => Promise<Response>;
13
+ }>;
14
+ declare const deno: (request: Request) => Promise<Response>;
15
+ declare const handler: (event: unknown, context: unknown) => Promise<unknown>;
11
16
  /**
12
17
  * Cloudflare Workers entry (module worker style).
13
18
  */
14
- export { default } from './functions/cloudflare';
15
- export { default as cloudflareWorker } from './functions/cloudflare';
19
+ export default cloudflareWorker;
20
+ export { cloudflareWorker };
16
21
  /**
17
22
  * Deno fetch handler.
18
23
  */
19
- export { default as deno } from './functions/deno';
24
+ export { deno };
20
25
  /**
21
26
  * AWS Lambda handler.
22
27
  */
23
- export { handler } from './functions/lambda';
28
+ export { handler };
24
29
  //# sourceMappingURL=start.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"start.d.ts","sourceRoot":"","sources":["../../src/start.ts"],"names":[],"mappings":"AAGA,OAAO,EAEL,KAAK,oBAAoB,EAC1B,MAAM,gCAAgC,CAAC;AAwBxC,eAAO,MAAM,UAAU,GAAI,eAAe,MAAM,KAAG,OAYlD,CAAC;AAEF,eAAO,MAAM,0BAA0B,GAAI,eAAe,OAAO,KAAG,oBASnE,CAAC;AAoEF,eAAO,MAAM,qBAAqB,GAChC,eAAe,MAAM,EACrB,eAAe,OAAO,KACrB,OAAO,CAAC,oBAAoB,CAS9B,CAAC;AAEF;;;;GAIG;AACH,eAAO,MAAM,KAAK,QAAa,OAAO,CAAC,IAAI,CAO1C,CAAC;AAEF;;GAEG;AACH,OAAO,EAAE,OAAO,EAAE,MAAM,uBAAuB,CAAC;AAEhD,OAAO,EAAE,OAAO,IAAI,gBAAgB,EAAE,MAAM,uBAAuB,CAAC;AAEpE;;GAEG;AACH,OAAO,EAAE,OAAO,IAAI,IAAI,EAAE,MAAM,iBAAiB,CAAC;AAElD;;GAEG;AACH,OAAO,EAAE,OAAO,EAAE,MAAM,mBAAmB,CAAC"}
1
+ {"version":3,"file":"start.d.ts","sourceRoot":"","sources":["../../src/start.ts"],"names":[],"mappings":"AAEA,OAAO,EAEL,KAAK,oBAAoB,EAC1B,MAAM,gCAAgC,CAAC;AAqExC,eAAO,MAAM,UAAU,GAAI,eAAe,MAAM,KAAG,OAYlD,CAAC;AAEF,eAAO,MAAM,0BAA0B,GAAI,eAAe,OAAO,KAAG,oBAOnE,CAAC;AAoEF,eAAO,MAAM,qBAAqB,GAChC,eAAe,MAAM,EACrB,eAAe,OAAO,KACrB,OAAO,CAAC,oBAAoB,CAS9B,CAAC;AAEF;;;;GAIG;AACH,eAAO,MAAM,KAAK,QAAa,OAAO,CAAC,IAAI,CAW1C,CAAC;AAiBF,QAAA,MAAM,gBAAgB;qBAfkB,OAAO,OAAO,OAAO,OAAO,OAAO,KAAG,OAAO,CAAC,QAAQ,CAAC;EAiB7F,CAAC;AAEH,QAAA,MAAM,IAAI,GAAU,SAAS,OAAO,KAAG,OAAO,CAAC,QAAQ,CAKtD,CAAC;AAEF,QAAA,MAAM,OAAO,GAAU,OAAO,OAAO,EAAE,SAAS,OAAO,KAAG,OAAO,CAAC,OAAO,CAKxE,CAAC;AAEF;;GAEG;AACH,eAAe,gBAAgB,CAAC;AAEhC,OAAO,EAAE,gBAAgB,EAAE,CAAC;AAE5B;;GAEG;AACH,OAAO,EAAE,IAAI,EAAE,CAAC;AAEhB;;GAEG;AACH,OAAO,EAAE,OAAO,EAAE,CAAC"}
package/src/start.js CHANGED
@@ -1,10 +1,35 @@
1
- import { ErrorFactory } from './exceptions/ZintrustError.js';
2
1
  import { isArray, isNonEmptyString, isObject } from './helper/index.js';
3
2
  import { ZintrustLang } from './lang/lang.js';
4
3
  import { normalizeActiveServiceRuntime, } from './microservices/ServiceManifest.js';
5
- import { ProjectRuntime } from './runtime/ProjectRuntime.js';
4
+ import { ensureNodeStartupEnvLoaded } from './runtime/NodeStartup.js';
6
5
  import { resolveNodeProjectRoot } from './runtime/resolveNodeProjectRoot.js';
7
6
  import { isNodeRuntime } from './runtime/detectRuntime.js';
7
+ const getProjectRuntimeGlobal = () => globalThis;
8
+ const getCachedProjectRuntime = () => {
9
+ return getProjectRuntimeGlobal().__zintrustProjectRuntime;
10
+ };
11
+ const setCachedProjectRuntime = (value) => {
12
+ const current = getCachedProjectRuntime();
13
+ const next = Object.freeze({
14
+ ...(current?.serviceManifest === undefined ? {} : { serviceManifest: current.serviceManifest }),
15
+ ...(current?.activeService === undefined ? {} : { activeService: current.activeService }),
16
+ ...(value.serviceManifest === undefined ? {} : { serviceManifest: value.serviceManifest }),
17
+ ...(value.activeService === undefined ? {} : { activeService: value.activeService }),
18
+ });
19
+ getProjectRuntimeGlobal().__zintrustProjectRuntime = next;
20
+ return next;
21
+ };
22
+ const createValidationError = (message) => {
23
+ // eslint-disable-next-line no-restricted-syntax
24
+ const error = new Error(message);
25
+ error.name = 'ValidationError';
26
+ error.statusCode = 400;
27
+ error.code = 'VALIDATION_ERROR';
28
+ return error;
29
+ };
30
+ const loadCloudflareWorker = async () => {
31
+ return (await import('./functions/cloudflare.js'));
32
+ };
8
33
  const isAbsolutePath = (value) => value.startsWith('/') || /^[A-Za-z]:[\\/]/.test(value);
9
34
  const fileUrlToPathLike = (value) => {
10
35
  if (!value.startsWith(ZintrustLang.FILE_PROTOCOL))
@@ -33,9 +58,9 @@ export const isNodeMain = (importMetaUrl) => {
33
58
  export const configureStandaloneService = (activeService) => {
34
59
  const normalized = normalizeActiveServiceRuntime(activeService);
35
60
  if (normalized === undefined) {
36
- throw ErrorFactory.createValidationError('Standalone service runtime requires at least domain and name.');
61
+ throw createValidationError('Standalone service runtime requires at least domain and name.');
37
62
  }
38
- return ProjectRuntime.set({ activeService: normalized }).activeService ?? normalized;
63
+ return setCachedProjectRuntime({ activeService: normalized }).activeService ?? normalized;
39
64
  };
40
65
  const normalizeStandaloneEnvPaths = (value) => {
41
66
  if (isNonEmptyString(value)) {
@@ -97,19 +122,41 @@ export const bootStandaloneService = async (importMetaUrl, activeService) => {
97
122
  export const start = async () => {
98
123
  if (!isNodeRuntime())
99
124
  return;
125
+ await ensureNodeStartupEnvLoaded({
126
+ entry: '@zintrust/core/start',
127
+ });
100
128
  const projectBootstrapModule = (await import('./runtime/ProjectBootstrap.js'));
101
129
  await projectBootstrapModule.loadProjectBootstrap();
102
130
  };
131
+ const cloudflareFetch = async (request, env, ctx) => {
132
+ const worker = await loadCloudflareWorker();
133
+ if (typeof worker.fetch === 'function') {
134
+ return worker.fetch(request, env, ctx);
135
+ }
136
+ const callable = worker;
137
+ return callable(request, env, ctx);
138
+ };
139
+ const cloudflareWorker = Object.freeze({
140
+ fetch: cloudflareFetch,
141
+ });
142
+ const deno = async (request) => {
143
+ const module = (await import('./functions/deno.js'));
144
+ return module.default(request);
145
+ };
146
+ const handler = async (event, context) => {
147
+ const module = (await import('./functions/lambda.js'));
148
+ return module.handler(event, context);
149
+ };
103
150
  /**
104
151
  * Cloudflare Workers entry (module worker style).
105
152
  */
106
- export { default } from './functions/cloudflare.js';
107
- export { default as cloudflareWorker } from './functions/cloudflare.js';
153
+ export default cloudflareWorker;
154
+ export { cloudflareWorker };
108
155
  /**
109
156
  * Deno fetch handler.
110
157
  */
111
- export { default as deno } from './functions/deno.js';
158
+ export { deno };
112
159
  /**
113
160
  * AWS Lambda handler.
114
161
  */
115
- export { handler } from './functions/lambda.js';
162
+ export { handler };
@@ -0,0 +1,5 @@
1
+ import { zintrustAppEslintConfig } from '@zintrust/governance/eslint';
2
+
3
+ export default zintrustAppEslintConfig({
4
+ tsconfigRootDir: import.meta.dirname,
5
+ });
@@ -6,17 +6,19 @@
6
6
  "scripts": {
7
7
  "dev": "zin s",
8
8
  "build": "tsc && tsc-alias",
9
+ "lint": "eslint .",
9
10
  "start": "zin s --mode production --no-watch",
10
11
  "test": "vitest run",
11
12
  "type-check": "tsc --noEmit"
12
13
  },
13
14
  "dependencies": {
14
15
  "@zintrust/core": "^{{coreVersion}}",
15
- "@zintrust/d1-migrator": "^0.4.6",
16
- "@zintrust/governance": "{{governanceVersion}}"
16
+ "@zintrust/d1-migrator": "^0.4.6"
17
17
  },
18
18
  "devDependencies": {
19
+ "@zintrust/governance": "{{governanceVersion}}",
19
20
  "@types/node": "^25.0.3",
21
+ "eslint": "^10.0.0",
20
22
  "tsx": "^4.21.0",
21
23
  "tsc-alias": "^1.8.16",
22
24
  "typescript": "^5.9.3",