@zintrust/core 0.1.44 → 0.1.48

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 (35) hide show
  1. package/app/Middleware/index.d.ts.map +1 -1
  2. package/app/Middleware/index.js +4 -4
  3. package/config/storage.d.ts.map +1 -1
  4. package/config/storage.js +1 -1
  5. package/package.json +2 -1
  6. package/packages/workers/src/http/middleware/FeaturesValidator.d.ts.map +1 -1
  7. package/packages/workers/src/http/middleware/FeaturesValidator.js +5 -4
  8. package/src/cli/CLI.d.ts.map +1 -1
  9. package/src/cli/CLI.js +2 -0
  10. package/src/cli/commands/ContainerComposeLifecycle.d.ts +20 -0
  11. package/src/cli/commands/ContainerComposeLifecycle.d.ts.map +1 -0
  12. package/src/cli/commands/ContainerComposeLifecycle.js +46 -0
  13. package/src/cli/commands/ContainerProxiesCommand.d.ts.map +1 -1
  14. package/src/cli/commands/ContainerProxiesCommand.js +7 -44
  15. package/src/cli/commands/ContainerWorkersCommand.d.ts.map +1 -1
  16. package/src/cli/commands/ContainerWorkersCommand.js +7 -30
  17. package/src/cli/commands/DockerCommand.d.ts.map +1 -1
  18. package/src/cli/commands/DockerCommand.js +84 -2
  19. package/src/cli/commands/DockerPushCommand.d.ts +5 -0
  20. package/src/cli/commands/DockerPushCommand.d.ts.map +1 -0
  21. package/src/cli/commands/DockerPushCommand.js +92 -0
  22. package/src/cli/commands/InitContainerCommand.d.ts.map +1 -1
  23. package/src/cli/commands/InitContainerCommand.js +1 -0
  24. package/src/config/queue.d.ts.map +1 -1
  25. package/src/config/queue.js +27 -8
  26. package/src/index.js +3 -3
  27. package/src/orm/Database.d.ts.map +1 -1
  28. package/src/orm/Database.js +36 -2
  29. package/src/orm/QueryBuilder.d.ts.map +1 -1
  30. package/src/orm/QueryBuilder.js +0 -2
  31. package/src/performance/Optimizer.js +1 -1
  32. package/src/proxy/ProxyServer.d.ts.map +1 -1
  33. package/src/proxy/ProxyServer.js +9 -0
  34. package/src/session/SessionManager.js +1 -1
  35. package/src/templates/docker/docker-compose.schedules.yml.tpl +78 -7
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../app/Middleware/index.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAGH,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAC;AAC9C,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC;AAChD,OAAO,KAAK,EAAE,oBAAoB,EAAE,iBAAiB,EAAE,MAAM,4BAA4B,CAAC;AAC1F,OAAO,KAAK,EAAE,WAAW,EAAE,YAAY,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AAGtF,OAAO,KAAK,EAAW,UAAU,EAAE,MAAM,uBAAuB,CAAC;AAGjE,KAAK,eAAe,GAAG,WAAW,GAAG,cAAc,CAAC;AACpD,KAAK,gBAAgB,GAAG,iBAAiB,GAAG,oBAAoB,CAAC;AAajE;;;GAGG;AACH,eAAO,MAAM,cAAc,GACzB,KAAK,QAAQ,EACb,KAAK,SAAS,EACd,MAAM,MAAM,OAAO,CAAC,IAAI,CAAC,KACxB,OAAO,CAAC,IAAI,CASd,CAAC;AAEF;;;GAGG;AACH,eAAO,MAAM,cAAc,GACzB,KAAK,QAAQ,EACb,KAAK,SAAS,EACd,MAAM,MAAM,OAAO,CAAC,IAAI,CAAC,KACxB,OAAO,CAAC,IAAI,CAWd,CAAC;AAEF;;;GAGG;AACH,eAAO,MAAM,cAAc,GACzB,KAAK,QAAQ,EACb,KAAK,SAAS,EACd,MAAM,MAAM,OAAO,CAAC,IAAI,CAAC,KACxB,OAAO,CAAC,IAAI,CAYd,CAAC;AAEF;;;GAGG;AACH,eAAO,MAAM,iBAAiB,GAC5B,KAAK,QAAQ,EACb,KAAK,SAAS,EACd,MAAM,MAAM,OAAO,CAAC,IAAI,CAAC,KACxB,OAAO,CAAC,IAAI,CAYd,CAAC;AAQF,eAAO,MAAM,mBAAmB,GAC9B,KAAK,QAAQ,EACb,KAAK,SAAS,EACd,MAAM,MAAM,OAAO,CAAC,IAAI,CAAC,KACxB,OAAO,CAAC,IAAI,CAsBd,CAAC;AAEF;;;GAGG;AACH,eAAO,MAAM,uBAAuB,GAClC,KAAK,QAAQ,EACb,KAAK,SAAS,EACd,MAAM,MAAM,OAAO,CAAC,IAAI,CAAC,KACxB,OAAO,CAAC,IAAI,CAUd,CAAC;AAEF;;;GAGG;AACH,eAAO,MAAM,aAAa,GAAI,YAAY,eAAe,EAAE,YAAW,YAAsB,MAC5E,KAAK,QAAQ,EAAE,KAAK,SAAS,EAAE,MAAM,MAAM,OAAO,CAAC,IAAI,CAAC,KAAG,OAAO,CAAC,IAAI,CAgCtF,CAAC;AAEF;;;GAGG;AACH,eAAO,MAAM,cAAc,GAAI,aAAa,gBAAgB,MAC5C,KAAK,QAAQ,EAAE,KAAK,SAAS,EAAE,MAAM,MAAM,OAAO,CAAC,IAAI,CAAC,KAAG,OAAO,CAAC,IAAI,CAmCtF,CAAC;AAEF;;;GAGG;AACH,eAAO,MAAM,oBAAoB,GAAI,QAAQ,UAAU,MACvC,KAAK,QAAQ,EAAE,KAAK,SAAS,EAAE,MAAM,MAAM,OAAO,CAAC,IAAI,CAAC,KAAG,OAAO,CAAC,IAAI,CAwBtF,CAAC;AAEF;;;GAGG;AACH,eAAO,MAAM,uBAAuB,GAClC,KAAK,QAAQ,EACb,KAAK,SAAS,EACd,MAAM,MAAM,OAAO,CAAC,IAAI,CAAC,KACxB,OAAO,CAAC,IAAI,CAiBd,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../app/Middleware/index.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAGH,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAC;AAC9C,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC;AAChD,OAAO,KAAK,EAAE,oBAAoB,EAAE,iBAAiB,EAAE,MAAM,4BAA4B,CAAC;AAC1F,OAAO,KAAK,EAAE,WAAW,EAAE,YAAY,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AAGtF,OAAO,KAAK,EAAW,UAAU,EAAE,MAAM,uBAAuB,CAAC;AAGjE,KAAK,eAAe,GAAG,WAAW,GAAG,cAAc,CAAC;AACpD,KAAK,gBAAgB,GAAG,iBAAiB,GAAG,oBAAoB,CAAC;AAajE;;;GAGG;AACH,eAAO,MAAM,cAAc,GACzB,KAAK,QAAQ,EACb,KAAK,SAAS,EACd,MAAM,MAAM,OAAO,CAAC,IAAI,CAAC,KACxB,OAAO,CAAC,IAAI,CASd,CAAC;AAEF;;;GAGG;AACH,eAAO,MAAM,cAAc,GACzB,KAAK,QAAQ,EACb,KAAK,SAAS,EACd,MAAM,MAAM,OAAO,CAAC,IAAI,CAAC,KACxB,OAAO,CAAC,IAAI,CAWd,CAAC;AAEF;;;GAGG;AACH,eAAO,MAAM,cAAc,GACzB,KAAK,QAAQ,EACb,KAAK,SAAS,EACd,MAAM,MAAM,OAAO,CAAC,IAAI,CAAC,KACxB,OAAO,CAAC,IAAI,CAYd,CAAC;AAEF;;;GAGG;AACH,eAAO,MAAM,iBAAiB,GAC5B,KAAK,QAAQ,EACb,KAAK,SAAS,EACd,MAAM,MAAM,OAAO,CAAC,IAAI,CAAC,KACxB,OAAO,CAAC,IAAI,CAYd,CAAC;AAQF,eAAO,MAAM,mBAAmB,GAC9B,KAAK,QAAQ,EACb,KAAK,SAAS,EACd,MAAM,MAAM,OAAO,CAAC,IAAI,CAAC,KACxB,OAAO,CAAC,IAAI,CAsBd,CAAC;AAEF;;;GAGG;AACH,eAAO,MAAM,uBAAuB,GAClC,KAAK,QAAQ,EACb,KAAK,SAAS,EACd,MAAM,MAAM,OAAO,CAAC,IAAI,CAAC,KACxB,OAAO,CAAC,IAAI,CAUd,CAAC;AAEF;;;GAGG;AACH,eAAO,MAAM,aAAa,GAAI,YAAY,eAAe,EAAE,YAAW,YAAsB,MAC5E,KAAK,QAAQ,EAAE,KAAK,SAAS,EAAE,MAAM,MAAM,OAAO,CAAC,IAAI,CAAC,KAAG,OAAO,CAAC,IAAI,CAiCtF,CAAC;AAEF;;;GAGG;AACH,eAAO,MAAM,cAAc,GAAI,aAAa,gBAAgB,MAC5C,KAAK,QAAQ,EAAE,KAAK,SAAS,EAAE,MAAM,MAAM,OAAO,CAAC,IAAI,CAAC,KAAG,OAAO,CAAC,IAAI,CAmCtF,CAAC;AAEF;;;GAGG;AACH,eAAO,MAAM,oBAAoB,GAAI,QAAQ,UAAU,MACvC,KAAK,QAAQ,EAAE,KAAK,SAAS,EAAE,MAAM,MAAM,OAAO,CAAC,IAAI,CAAC,KAAG,OAAO,CAAC,IAAI,CAwBtF,CAAC;AAEF;;;GAGG;AACH,eAAO,MAAM,uBAAuB,GAClC,KAAK,QAAQ,EACb,KAAK,SAAS,EACd,MAAM,MAAM,OAAO,CAAC,IAAI,CAAC,KACxB,OAAO,CAAC,IAAI,CAiBd,CAAC"}
@@ -118,12 +118,12 @@ export const jwtMiddleware = (jwtManager, algorithm = 'HS256') => {
118
118
  res.setStatus(401).json({ error: 'Invalid authorization header format' });
119
119
  return;
120
120
  }
121
- if (await TokenRevocation.isRevoked(token)) {
122
- res.setStatus(401).json({ error: 'Invalid or expired token' });
123
- return;
124
- }
125
121
  try {
126
122
  const payload = resolveJwtManager(jwtManager).verify(token, algorithm);
123
+ if (await TokenRevocation.isRevoked(token)) {
124
+ res.setStatus(401).json({ error: 'Invalid or expired token' });
125
+ return;
126
+ }
127
127
  // Store in request context (TypeScript allows dynamic properties)
128
128
  req.user = payload;
129
129
  await next();
@@ -1 +1 @@
1
- {"version":3,"file":"storage.d.ts","sourceRoot":"","sources":["../../config/storage.ts"],"names":[],"mappings":"AAIA;;;;;;GAMG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAEH,wBAiDmC"}
1
+ {"version":3,"file":"storage.d.ts","sourceRoot":"","sources":["../../config/storage.ts"],"names":[],"mappings":"AAGA;;;;;;GAMG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAEH,wBAiDmC"}
package/config/storage.js CHANGED
@@ -1,5 +1,5 @@
1
1
  // @ts-ignore - config templates are excluded from the main TS project in this repo
2
- import { Env } from '../src/config/env.js';
2
+ import { Env } from '../src/index.js';
3
3
  /**
4
4
  * Storage Configuration (default override)
5
5
  *
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@zintrust/core",
3
- "version": "0.1.44",
3
+ "version": "0.1.48",
4
4
  "description": "Production-grade TypeScript backend framework for JavaScript",
5
5
  "homepage": "https://zintrust.com",
6
6
  "repository": {
@@ -49,6 +49,7 @@
49
49
  "./package.json": "./package.json"
50
50
  },
51
51
  "dependencies": {
52
+ "@cloudflare/containers": "^0.1.0",
52
53
  "@zintrust/workers": "^0.1.31",
53
54
  "bcryptjs": "^3.0.3",
54
55
  "bullmq": "^5.69.3",
@@ -1 +1 @@
1
- {"version":3,"file":"FeaturesValidator.d.ts","sourceRoot":"","sources":["../../../../../../packages/workers/src/http/middleware/FeaturesValidator.ts"],"names":[],"mappings":"AAAA,OAAO,EAAU,KAAK,QAAQ,EAAE,KAAK,SAAS,EAAE,MAAM,gBAAgB,CAAC;AAEvE,MAAM,MAAM,YAAY,GAAG,CAAC,GAAG,EAAE,QAAQ,EAAE,GAAG,EAAE,SAAS,KAAK,OAAO,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC;AA8BnF,eAAO,MAAM,sBAAsB,GAAI,SAAS,YAAY,KAAG,YAiD9D,CAAC"}
1
+ {"version":3,"file":"FeaturesValidator.d.ts","sourceRoot":"","sources":["../../../../../../packages/workers/src/http/middleware/FeaturesValidator.ts"],"names":[],"mappings":"AAAA,OAAO,EAAU,KAAK,QAAQ,EAAE,KAAK,SAAS,EAAE,MAAM,gBAAgB,CAAC;AAEvE,MAAM,MAAM,YAAY,GAAG,CAAC,GAAG,EAAE,QAAQ,EAAE,GAAG,EAAE,SAAS,KAAK,OAAO,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC;AAgBnF,eAAO,MAAM,sBAAsB,GAAI,SAAS,YAAY,KAAG,YAoD9D,CAAC"}
@@ -20,8 +20,8 @@ export const withFeaturesValidation = (handler) => {
20
20
  if (!features) {
21
21
  return handler(req, res); // Skip validation if features is not provided
22
22
  }
23
- // Check if features is an object
24
- if (typeof features !== 'object' || features === null || Array.isArray(features)) {
23
+ const isPlainObject = Object.prototype.toString.call(features) === '[object Object]' && !Array.isArray(features);
24
+ if (!isPlainObject) {
25
25
  return res.setStatus(400).json({
26
26
  error: 'Invalid features configuration',
27
27
  message: 'Features must be an object',
@@ -29,7 +29,8 @@ export const withFeaturesValidation = (handler) => {
29
29
  });
30
30
  }
31
31
  // Validate each feature key and value
32
- const featureKeys = Object.keys(features);
32
+ const featuresObj = features;
33
+ const featureKeys = Object.keys(featuresObj);
33
34
  for (const key of featureKeys) {
34
35
  if (!VALID_FEATURES.has(key)) {
35
36
  return res.setStatus(400).json({
@@ -38,7 +39,7 @@ export const withFeaturesValidation = (handler) => {
38
39
  code: 'INVALID_FEATURE',
39
40
  });
40
41
  }
41
- const value = features[key];
42
+ const value = featuresObj[key];
42
43
  if (typeof value !== 'boolean') {
43
44
  return res.setStatus(400).json({
44
45
  error: 'Invalid feature value',
@@ -1 +1 @@
1
- {"version":3,"file":"CLI.d.ts","sourceRoot":"","sources":["../../../src/cli/CLI.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAoEH,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAIpC,MAAM,WAAW,IAAI;IACnB,GAAG,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IACnC,UAAU,IAAI,OAAO,CAAC;CACvB;AA0PD;;;;;;;GAOG;AACH,eAAO,MAAM,GAAG;cACJ,IAAI;EAed,CAAC"}
1
+ {"version":3,"file":"CLI.d.ts","sourceRoot":"","sources":["../../../src/cli/CLI.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAqEH,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAIpC,MAAM,WAAW,IAAI;IACnB,GAAG,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IACnC,UAAU,IAAI,OAAO,CAAC;CACvB;AA2PD;;;;;;;GAOG;AACH,eAAO,MAAM,GAAG;cACJ,IAAI;EAed,CAAC"}
package/src/cli/CLI.js CHANGED
@@ -17,6 +17,7 @@ import { DeployContainerProxiesCommand } from './commands/DeployContainerProxies
17
17
  import { DeployContainersProxyCommand } from './commands/DeployContainersProxyCommand.js';
18
18
  import { DeployContainerWorkersCommand } from './commands/DeployContainerWorkersCommand.js';
19
19
  import { DockerCommand } from './commands/DockerCommand.js';
20
+ import { DockerPushCommand } from './commands/DockerPushCommand.js';
20
21
  import { DoctorArchitectureCommand } from './commands/DoctorArchitectureCommand.js';
21
22
  import { FixCommand } from './commands/FixCommand.js';
22
23
  import { InitContainerCommand } from './commands/InitContainerCommand.js';
@@ -89,6 +90,7 @@ const buildCommandRegistry = () => {
89
90
  AddMigrationCommand.create(),
90
91
  StartCommand.create(),
91
92
  DockerCommand.create(),
93
+ DockerPushCommand.create(),
92
94
  QueueCommand.create(),
93
95
  QueueRecoveryCommand.create(),
94
96
  ScheduleListCommand.create(),
@@ -0,0 +1,20 @@
1
+ type ComposeBuildOptions = {
2
+ noCache?: boolean;
3
+ pull?: boolean;
4
+ };
5
+ type ComposeUpOptions = {
6
+ detach?: boolean;
7
+ removeOrphans?: boolean;
8
+ };
9
+ type ComposeDownOptions = {
10
+ volumes?: boolean;
11
+ removeOrphans?: boolean;
12
+ };
13
+ export declare const ContainerComposeLifecycle: Readonly<{
14
+ normalizeAction<const Allowed extends readonly string[]>(raw: string | undefined, allowed: Allowed, usageMessage: string): Allowed[number];
15
+ runBuild(composePath: string, options: ComposeBuildOptions, logMessage: string): Promise<void>;
16
+ runUp(composePath: string, options: ComposeUpOptions, logMessage: string): Promise<void>;
17
+ runDown(composePath: string, options: ComposeDownOptions, logMessage: string): Promise<void>;
18
+ }>;
19
+ export {};
20
+ //# sourceMappingURL=ContainerComposeLifecycle.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ContainerComposeLifecycle.d.ts","sourceRoot":"","sources":["../../../../src/cli/commands/ContainerComposeLifecycle.ts"],"names":[],"mappings":"AAIA,KAAK,mBAAmB,GAAG;IACzB,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,IAAI,CAAC,EAAE,OAAO,CAAC;CAChB,CAAC;AAEF,KAAK,gBAAgB,GAAG;IACtB,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,aAAa,CAAC,EAAE,OAAO,CAAC;CACzB,CAAC;AAEF,KAAK,kBAAkB,GAAG;IACxB,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,aAAa,CAAC,EAAE,OAAO,CAAC;CACzB,CAAC;AAEF,eAAO,MAAM,yBAAyB;0BACd,OAAO,SAAS,SAAS,MAAM,EAAE,OAChD,MAAM,GAAG,SAAS,WACd,OAAO,gBACF,MAAM,GACnB,OAAO,CAAC,MAAM,CAAC;0BASH,MAAM,WACV,mBAAmB,cAChB,MAAM,GACjB,OAAO,CAAC,IAAI,CAAC;uBAeS,MAAM,WAAW,gBAAgB,cAAc,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;yBAgB/E,MAAM,WACV,kBAAkB,cACf,MAAM,GACjB,OAAO,CAAC,IAAI,CAAC;EAchB,CAAC"}
@@ -0,0 +1,46 @@
1
+ import { runComposeWithFallback } from '../commands/DockerComposeCommandUtils.js';
2
+ import { Logger } from '../../config/logger.js';
3
+ import { ErrorFactory } from '../../exceptions/ZintrustError.js';
4
+ export const ContainerComposeLifecycle = Object.freeze({
5
+ normalizeAction(raw, allowed, usageMessage) {
6
+ const value = (raw ?? '').trim().toLowerCase();
7
+ for (const item of allowed) {
8
+ if (value === item)
9
+ return item;
10
+ }
11
+ throw ErrorFactory.createCliError(usageMessage);
12
+ },
13
+ async runBuild(composePath, options, logMessage) {
14
+ const args = ['compose', '-f', composePath, 'build'];
15
+ if (options.noCache === true) {
16
+ args.push('--no-cache');
17
+ }
18
+ if (options.pull === true) {
19
+ args.push('--pull');
20
+ }
21
+ Logger.info(logMessage);
22
+ await runComposeWithFallback(args);
23
+ },
24
+ async runUp(composePath, options, logMessage) {
25
+ const args = ['compose', '-f', composePath, 'up'];
26
+ if (options.detach === true) {
27
+ args.push('-d');
28
+ }
29
+ if (options.removeOrphans === true) {
30
+ args.push('--remove-orphans');
31
+ }
32
+ Logger.info(logMessage);
33
+ await runComposeWithFallback(args);
34
+ },
35
+ async runDown(composePath, options, logMessage) {
36
+ const args = ['compose', '-f', composePath, 'down'];
37
+ if (options.volumes === true) {
38
+ args.push('-v');
39
+ }
40
+ if (options.removeOrphans === true) {
41
+ args.push('--remove-orphans');
42
+ }
43
+ Logger.info(logMessage);
44
+ await runComposeWithFallback(args);
45
+ },
46
+ });
@@ -1 +1 @@
1
- {"version":3,"file":"ContainerProxiesCommand.d.ts","sourceRoot":"","sources":["../../../../src/cli/commands/ContainerProxiesCommand.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAkB,YAAY,EAAE,MAAM,kBAAkB,CAAC;AAwErE,eAAO,MAAM,uBAAuB;cACxB,YAAY;EAuCtB,CAAC"}
1
+ {"version":3,"file":"ContainerProxiesCommand.d.ts","sourceRoot":"","sources":["../../../../src/cli/commands/ContainerProxiesCommand.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAkB,YAAY,EAAE,MAAM,kBAAkB,CAAC;AAyBrE,eAAO,MAAM,uBAAuB;cACxB,YAAY;EAgDtB,CAAC"}
@@ -1,45 +1,8 @@
1
1
  import { BaseCommand } from '../BaseCommand.js';
2
- import { resolveComposePath, runComposeWithFallback, } from '../commands/DockerComposeCommandUtils.js';
3
- import { Logger } from '../../config/logger.js';
4
- import { ErrorFactory } from '../../exceptions/ZintrustError.js';
5
- const runBuild = async (composePath, options) => {
6
- const args = ['compose', '-f', composePath, 'build'];
7
- if (options.noCache === true) {
8
- args.push('--no-cache');
9
- }
10
- if (options.pull === true) {
11
- args.push('--pull');
12
- }
13
- Logger.info('Building proxy stack image...');
14
- await runComposeWithFallback(args);
15
- };
16
- const runUp = async (composePath, options) => {
17
- const args = ['compose', '-f', composePath, 'up'];
18
- if (options.detach === true) {
19
- args.push('-d');
20
- }
21
- if (options.removeOrphans === true) {
22
- args.push('--remove-orphans');
23
- }
24
- Logger.info('Starting proxy stack...');
25
- await runComposeWithFallback(args);
26
- };
27
- const runDown = async (composePath, options) => {
28
- const args = ['compose', '-f', composePath, 'down'];
29
- if (options.removeOrphans === true) {
30
- args.push('--remove-orphans');
31
- }
32
- if (options.volumes === true) {
33
- args.push('--volumes');
34
- }
35
- Logger.info('Stopping proxy stack...');
36
- await runComposeWithFallback(args);
37
- };
2
+ import { ContainerComposeLifecycle } from '../commands/ContainerComposeLifecycle.js';
3
+ import { resolveComposePath } from '../commands/DockerComposeCommandUtils.js';
38
4
  const normalizeAction = (raw) => {
39
- const value = (raw ?? '').trim().toLowerCase();
40
- if (value === 'build' || value === 'up' || value === 'down')
41
- return value;
42
- throw ErrorFactory.createCliError('Usage: zin cp <build|up|down> [options]');
5
+ return ContainerComposeLifecycle.normalizeAction(raw, ['build', 'up', 'down'], 'Usage: zin cp <build|up|down> [options]');
43
6
  };
44
7
  export const ContainerProxiesCommand = Object.freeze({
45
8
  create() {
@@ -60,17 +23,17 @@ export const ContainerProxiesCommand = Object.freeze({
60
23
  const action = normalizeAction(options.args?.[0]);
61
24
  const composePath = resolveComposePath('docker-compose.proxy.yml', 'docker-compose.proxy.yml not found.');
62
25
  if (action === 'build') {
63
- await runBuild(composePath, options);
26
+ await ContainerComposeLifecycle.runBuild(composePath, options, 'Building proxy stack image...');
64
27
  return;
65
28
  }
66
29
  if (action === 'down') {
67
- await runDown(composePath, options);
30
+ await ContainerComposeLifecycle.runDown(composePath, options, 'Stopping proxy stack...');
68
31
  return;
69
32
  }
70
33
  if (options.build === true) {
71
- await runBuild(composePath, options);
34
+ await ContainerComposeLifecycle.runBuild(composePath, options, 'Building proxy stack image...');
72
35
  }
73
- await runUp(composePath, options);
36
+ await ContainerComposeLifecycle.runUp(composePath, options, 'Starting proxy stack...');
74
37
  },
75
38
  });
76
39
  },
@@ -1 +1 @@
1
- {"version":3,"file":"ContainerWorkersCommand.d.ts","sourceRoot":"","sources":["../../../../src/cli/commands/ContainerWorkersCommand.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAkB,YAAY,EAAE,MAAM,kBAAkB,CAAC;AAmDrE,eAAO,MAAM,uBAAuB;cACxB,YAAY;EAgCtB,CAAC"}
1
+ {"version":3,"file":"ContainerWorkersCommand.d.ts","sourceRoot":"","sources":["../../../../src/cli/commands/ContainerWorkersCommand.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAkB,YAAY,EAAE,MAAM,kBAAkB,CAAC;AAuBrE,eAAO,MAAM,uBAAuB;cACxB,YAAY;EA6CtB,CAAC"}
@@ -1,31 +1,8 @@
1
1
  import { BaseCommand } from '../BaseCommand.js';
2
- import { resolveComposePath, runComposeWithFallback, } from '../commands/DockerComposeCommandUtils.js';
3
- import { Logger } from '../../config/logger.js';
4
- import { ErrorFactory } from '../../exceptions/ZintrustError.js';
5
- const runBuild = async (composePath, options) => {
6
- const args = ['compose', '-f', composePath, 'build'];
7
- if (options.noCache === true) {
8
- args.push('--no-cache');
9
- }
10
- if (options.pull === true) {
11
- args.push('--pull');
12
- }
13
- Logger.info('Building container workers image...');
14
- await runComposeWithFallback(args);
15
- };
16
- const runUp = async (composePath, options) => {
17
- const args = ['compose', '-f', composePath, 'up'];
18
- if (options.detach === true) {
19
- args.push('-d');
20
- }
21
- Logger.info('Starting container workers...');
22
- await runComposeWithFallback(args);
23
- };
2
+ import { ContainerComposeLifecycle } from '../commands/ContainerComposeLifecycle.js';
3
+ import { resolveComposePath } from '../commands/DockerComposeCommandUtils.js';
24
4
  const normalizeAction = (raw) => {
25
- const value = (raw ?? '').trim().toLowerCase();
26
- if (value === 'build' || value === 'up')
27
- return value;
28
- throw ErrorFactory.createCliError('Usage: zin cw <build|up> [options]');
5
+ return ContainerComposeLifecycle.normalizeAction(raw, ['build', 'up'], 'Usage: zin cw <build|up> [options]');
29
6
  };
30
7
  export const ContainerWorkersCommand = Object.freeze({
31
8
  create() {
@@ -34,7 +11,7 @@ export const ContainerWorkersCommand = Object.freeze({
34
11
  aliases: ['container-workers'],
35
12
  description: 'Build or start container-based workers',
36
13
  addOptions: (command) => {
37
- command.argument('<action>', 'Action to run (build or up)');
14
+ command.argument('<action>', 'Action to run (build, up)');
38
15
  command.option('-d, --detach', 'Run containers in background (up only)');
39
16
  command.option('--no-cache', 'Disable Docker build cache (build only)');
40
17
  command.option('--pull', 'Always attempt to pull a newer base image (build only)');
@@ -44,13 +21,13 @@ export const ContainerWorkersCommand = Object.freeze({
44
21
  const action = normalizeAction(options.args?.[0]);
45
22
  const composePath = resolveComposePath('docker-compose.workers.yml', 'docker-compose.workers.yml not found. Run `zin init:cw` first.');
46
23
  if (action === 'build') {
47
- await runBuild(composePath, options);
24
+ await ContainerComposeLifecycle.runBuild(composePath, options, 'Building container workers image...');
48
25
  return;
49
26
  }
50
27
  if (options.build === true) {
51
- await runBuild(composePath, options);
28
+ await ContainerComposeLifecycle.runBuild(composePath, options, 'Building container workers image...');
52
29
  }
53
- await runUp(composePath, options);
30
+ await ContainerComposeLifecycle.runUp(composePath, options, 'Starting container workers...');
54
31
  },
55
32
  });
56
33
  },
@@ -1 +1 @@
1
- {"version":3,"file":"DockerCommand.d.ts","sourceRoot":"","sources":["../../../../src/cli/commands/DockerCommand.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAkB,YAAY,EAAE,MAAM,kBAAkB,CAAC;AA0ErE,eAAO,MAAM,aAAa;cACd,YAAY;EAiBtB,CAAC"}
1
+ {"version":3,"file":"DockerCommand.d.ts","sourceRoot":"","sources":["../../../../src/cli/commands/DockerCommand.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAkB,YAAY,EAAE,MAAM,kBAAkB,CAAC;AA+JrE,eAAO,MAAM,aAAa;cACd,YAAY;EAuBtB,CAAC"}
@@ -1,8 +1,10 @@
1
+ import { generateUuid } from '../../common/utility.js';
1
2
  import { BaseCommand } from '../BaseCommand.js';
3
+ import { DockerPushCommand } from '../commands/DockerPushCommand.js';
2
4
  import { SpawnUtil } from '../utils/spawn.js';
3
5
  import { Logger } from '../../config/logger.js';
4
6
  import { ErrorFactory } from '../../exceptions/ZintrustError.js';
5
- import { existsSync } from '../../node-singletons/fs.js';
7
+ import { existsSync, renameSync } from '../../node-singletons/fs.js';
6
8
  import { join } from '../../node-singletons/path.js';
7
9
  const resolveDefaultWranglerConfig = (cwd) => {
8
10
  const candidates = [
@@ -43,6 +45,79 @@ const resolveWranglerConfig = (cwd, options) => {
43
45
  return fallback;
44
46
  throw ErrorFactory.createCliError('Wrangler config not found. Expected wrangler.containers-proxy.jsonc (or wrangler.jsonc/toml).');
45
47
  };
48
+ const isContainersProxyConfig = (config) => {
49
+ const base = config.split(/[/\\]/).pop() ?? config;
50
+ return (base === 'wrangler.containers-proxy.jsonc' ||
51
+ base === 'wrangler.containers-proxy.json' ||
52
+ base === 'wrangler.containers-proxy.toml' ||
53
+ base.startsWith('wrangler.containers-proxy.'));
54
+ };
55
+ const withDevVarsForConfig = async (cwd, config, envName, fn) => {
56
+ const nonce = generateUuid();
57
+ const moved = [];
58
+ const swappedIn = [];
59
+ const disable = (name) => {
60
+ const from = join(cwd, name);
61
+ if (!existsSync(from))
62
+ return;
63
+ const to = join(cwd, `${name}.disabled-by-zin-${nonce}`);
64
+ renameSync(from, to);
65
+ moved.push({ from, to });
66
+ };
67
+ const swapIn = (source, target) => {
68
+ const from = join(cwd, source);
69
+ if (!existsSync(from))
70
+ return;
71
+ const to = join(cwd, target);
72
+ if (existsSync(to))
73
+ return;
74
+ renameSync(from, to);
75
+ swappedIn.push({ from, to });
76
+ };
77
+ try {
78
+ if (isContainersProxyConfig(config)) {
79
+ // For containers-proxy configs, we want `.dev.vars*` to exist but only for
80
+ // this run. Users keep the files renamed as `.dev.vars*.containers-proxy`.
81
+ swapIn('.dev.vars.containers-proxy', '.dev.vars');
82
+ if (envName !== '') {
83
+ swapIn(`.dev.vars.${envName}.containers-proxy`, `.dev.vars.${envName}`);
84
+ }
85
+ return await fn();
86
+ }
87
+ // For all other configs, disable `.dev.vars*` so Wrangler relies on `.env*`.
88
+ disable('.dev.vars');
89
+ disable('.dev.vars.local');
90
+ disable('.dev.vars.staging');
91
+ disable('.dev.vars.staging.local');
92
+ if (envName !== '') {
93
+ disable(`.dev.vars.${envName}`);
94
+ disable(`.dev.vars.${envName}.local`);
95
+ }
96
+ return await fn();
97
+ }
98
+ finally {
99
+ const restoreSwaps = swappedIn.slice().reverse();
100
+ for (const item of restoreSwaps) {
101
+ try {
102
+ if (existsSync(item.to) && !existsSync(item.from))
103
+ renameSync(item.to, item.from);
104
+ }
105
+ catch {
106
+ // noop
107
+ }
108
+ }
109
+ const restoreMoved = moved.slice().reverse();
110
+ for (const item of restoreMoved) {
111
+ try {
112
+ if (existsSync(item.to))
113
+ renameSync(item.to, item.from);
114
+ }
115
+ catch {
116
+ // noop
117
+ }
118
+ }
119
+ }
120
+ };
46
121
  const executeDocker = async (options) => {
47
122
  const cwd = process.cwd();
48
123
  const config = resolveWranglerConfig(cwd, options);
@@ -54,7 +129,9 @@ const executeDocker = async (options) => {
54
129
  if (env.length > 0)
55
130
  args.push('--env', env);
56
131
  Logger.info('Starting Wrangler dev (Containers/Docker-backed)...');
57
- const exitCode = await SpawnUtil.spawnAndWait({ command: 'wrangler', args, env: process.env });
132
+ const exitCode = await withDevVarsForConfig(cwd, config, env, async () => {
133
+ return SpawnUtil.spawnAndWait({ command: 'wrangler', args, env: process.env });
134
+ });
58
135
  process.exit(exitCode);
59
136
  };
60
137
  export const DockerCommand = Object.freeze({
@@ -64,6 +141,11 @@ export const DockerCommand = Object.freeze({
64
141
  aliases: ['dkr', 'dk'],
65
142
  description: 'Run Wrangler dev using a Docker-backed Cloudflare Containers config',
66
143
  addOptions: (command) => {
144
+ // `zin docker push` (subcommand) for Docker Hub publishing.
145
+ // Keep `zin docker` itself as the Wrangler dev command.
146
+ const pushCommand = DockerPushCommand.create().getCommand();
147
+ pushCommand.name('push');
148
+ command.addCommand(pushCommand);
67
149
  command.option('-c, --wrangler-config <path>', 'Wrangler config file (defaults if present)');
68
150
  command.option('-e, --env <name>', 'Wrangler environment name');
69
151
  command.option('-p, --port <number>', 'Port for wrangler dev');
@@ -0,0 +1,5 @@
1
+ import type { IBaseCommand } from '../BaseCommand';
2
+ export declare const DockerPushCommand: Readonly<{
3
+ create(): IBaseCommand;
4
+ }>;
5
+ //# sourceMappingURL=DockerPushCommand.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"DockerPushCommand.d.ts","sourceRoot":"","sources":["../../../../src/cli/commands/DockerPushCommand.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAkB,YAAY,EAAE,MAAM,kBAAkB,CAAC;AA6FrE,eAAO,MAAM,iBAAiB;cAClB,YAAY;EA0BtB,CAAC"}
@@ -0,0 +1,92 @@
1
+ import { BaseCommand } from '../BaseCommand.js';
2
+ import { VersionChecker } from '../services/VersionChecker.js';
3
+ import { SpawnUtil } from '../utils/spawn.js';
4
+ import { Logger } from '../../config/logger.js';
5
+ import { ErrorFactory } from '../../exceptions/ZintrustError.js';
6
+ const parsePlatforms = (value) => {
7
+ const raw = (value ?? '').trim();
8
+ if (raw !== '')
9
+ return raw;
10
+ return 'linux/amd64,linux/arm64';
11
+ };
12
+ const parseTag = (value) => {
13
+ const raw = (value ?? '').trim();
14
+ if (raw === '') {
15
+ const currentVersion = VersionChecker.getCurrentVersion();
16
+ return currentVersion === '0.0.0' ? 'latest' : currentVersion;
17
+ }
18
+ return raw;
19
+ };
20
+ const resolvePublishTags = (tag, alsoLatest) => {
21
+ if (tag === 'latest')
22
+ return ['latest'];
23
+ if (alsoLatest === false)
24
+ return [tag];
25
+ return [tag, 'latest'];
26
+ };
27
+ const parseOnly = (value) => {
28
+ const raw = (value ?? '').trim().toLowerCase();
29
+ if (raw === 'runtime' || raw === 'gateway')
30
+ return raw;
31
+ return 'both';
32
+ };
33
+ const runPublishImages = async (options) => {
34
+ const tag = parseTag(options.tag);
35
+ const platforms = parsePlatforms(options.platforms);
36
+ const tags = resolvePublishTags(tag, options.alsoLatest);
37
+ const only = parseOnly(options.only);
38
+ const runtimeRepo = 'zintrust/zintrust';
39
+ const gatewayRepo = 'zintrust/zintrust-proxy-gateway';
40
+ const buildArgsFor = (repo, context) => {
41
+ const args = ['buildx', 'build', '--platform', platforms];
42
+ for (const t of tags)
43
+ args.push('-t', `${repo}:${t}`);
44
+ args.push('--push', context);
45
+ return args;
46
+ };
47
+ Logger.info('Publishing images to Docker Hub via buildx...', {
48
+ runtime: runtimeRepo,
49
+ gateway: gatewayRepo,
50
+ platforms,
51
+ tags,
52
+ only,
53
+ });
54
+ if (only === 'runtime' || only === 'both') {
55
+ const runtimeExit = await SpawnUtil.spawnAndWait({
56
+ command: 'docker',
57
+ args: buildArgsFor(runtimeRepo, '.'),
58
+ env: process.env,
59
+ });
60
+ if (runtimeExit !== 0) {
61
+ throw ErrorFactory.createCliError(`Failed to publish ${runtimeRepo} (exit code ${runtimeExit})`);
62
+ }
63
+ }
64
+ if (only === 'gateway' || only === 'both') {
65
+ const gatewayExit = await SpawnUtil.spawnAndWait({
66
+ command: 'docker',
67
+ args: buildArgsFor(gatewayRepo, './docker/proxy-gateway'),
68
+ env: process.env,
69
+ });
70
+ if (gatewayExit !== 0) {
71
+ throw ErrorFactory.createCliError(`Failed to publish ${gatewayRepo} (exit code ${gatewayExit})`);
72
+ }
73
+ }
74
+ };
75
+ export const DockerPushCommand = Object.freeze({
76
+ create() {
77
+ return BaseCommand.create({
78
+ name: 'docker:push',
79
+ aliases: ['docker-push'],
80
+ description: 'Build and push ZinTrust Docker images to Docker Hub',
81
+ addOptions: (command) => {
82
+ command.option('--tag <tag>', 'Docker image tag to publish. Defaults to current version and also tags :latest');
83
+ command.option('--platforms <list>', 'Comma-separated platforms for buildx', 'linux/amd64,linux/arm64');
84
+ command.option('--no-also-latest', 'When publishing a non-latest --tag, do not also push :latest');
85
+ command.option('--only <target>', 'Publish only one image: runtime|gateway|both', 'both');
86
+ },
87
+ execute: async (options) => {
88
+ await runPublishImages(options);
89
+ },
90
+ });
91
+ },
92
+ });
@@ -1 +1 @@
1
- {"version":3,"file":"InitContainerCommand.d.ts","sourceRoot":"","sources":["../../../../src/cli/commands/InitContainerCommand.ts"],"names":[],"mappings":"AAAA,OAAO,EAAe,KAAK,YAAY,EAAE,MAAM,kBAAkB,CAAC;AAmOlE,eAAO,MAAM,oBAAoB;cACrB,YAAY;EAkBtB,CAAC"}
1
+ {"version":3,"file":"InitContainerCommand.d.ts","sourceRoot":"","sources":["../../../../src/cli/commands/InitContainerCommand.ts"],"names":[],"mappings":"AAAA,OAAO,EAAe,KAAK,YAAY,EAAE,MAAM,kBAAkB,CAAC;AAoOlE,eAAO,MAAM,oBAAoB;cACrB,YAAY;EAkBtB,CAAC"}
@@ -9,6 +9,7 @@ services:
9
9
  # Workers/Jobs API Service (Port 7772)
10
10
  # Exposes the Workers API to create/manage jobs
11
11
  workers-api:
12
+ image: \${WORKERS_IMAGE:-zintrust/zintrust-workers:latest}
12
13
  build:
13
14
  context: .
14
15
  dockerfile: Dockerfile
@@ -1 +1 @@
1
- {"version":3,"file":"queue.d.ts","sourceRoot":"","sources":["../../../src/config/queue.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAMH,OAAO,KAAK,EAAE,sBAAsB,EAAE,eAAe,EAAE,kBAAkB,EAAE,MAAM,cAAc,CAAC;AAGhG,MAAM,MAAM,oBAAoB,GAAG,OAAO,CAAC;IACzC,OAAO,EAAE,eAAe,CAAC;IACzB,OAAO,EAAE,OAAO,CAAC,kBAAkB,CAAC,CAAC;IACrC,MAAM,EAAE;QAAE,QAAQ,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAA;KAAE,CAAC;IAC5C,UAAU,EAAE;QAAE,OAAO,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,MAAM,CAAA;KAAE,CAAC;IACnF,OAAO,EAAE;QACP,OAAO,EAAE,OAAO,CAAC;QACjB,QAAQ,EAAE,MAAM,CAAC;QACjB,UAAU,EAAE,aAAa,CAAC,MAAM,CAAC,CAAC;QAClC,WAAW,EAAE,OAAO,CAAC;QACrB,iBAAiB,EAAE,MAAM,CAAC;KAC3B,CAAC;CACH,CAAC,CAAC;AA+EH;;GAEG;AACH,eAAO,MAAM,iBAAiB,QAAO,kBA4DnC,CAAC;AAsBH,QAAA,MAAM,iBAAiB,QAAO;IAC5B,OAAO,EAAE,eAAe,CAAC;IACzB,OAAO,EAAE,kBAAkB,CAAC;IAC5B,SAAS,EAAE,CAAC,YAAY,EAAE,sBAAsB,KAAK,kBAAkB,CAAC,eAAe,CAAC,CAAC;IACzF,MAAM,EAAE;QAAE,QAAQ,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAA;KAAE,CAAC;IAC5C,UAAU,EAAE;QAAE,OAAO,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,MAAM,CAAA;KAAE,CAAC;IACnF,OAAO,EAAE;QACP,OAAO,EAAE,OAAO,CAAC;QACjB,QAAQ,EAAE,MAAM,CAAC;QACjB,UAAU,EAAE,aAAa,CAAC,MAAM,CAAC,CAAC;QAClC,WAAW,EAAE,OAAO,CAAC;QACrB,iBAAiB,EAAE,MAAM,CAAC;KAC3B,CAAC;CAuEH,CAAC;AAEF,MAAM,MAAM,WAAW,GAAG,UAAU,CAAC,OAAO,iBAAiB,CAAC,CAAC;AAqB/D,eAAO,MAAM,WAAW,EAAE,WAYxB,CAAC"}
1
+ {"version":3,"file":"queue.d.ts","sourceRoot":"","sources":["../../../src/config/queue.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AASH,OAAO,KAAK,EAAE,sBAAsB,EAAE,eAAe,EAAE,kBAAkB,EAAE,MAAM,cAAc,CAAC;AAGhG,MAAM,MAAM,oBAAoB,GAAG,OAAO,CAAC;IACzC,OAAO,EAAE,eAAe,CAAC;IACzB,OAAO,EAAE,OAAO,CAAC,kBAAkB,CAAC,CAAC;IACrC,MAAM,EAAE;QAAE,QAAQ,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAA;KAAE,CAAC;IAC5C,UAAU,EAAE;QAAE,OAAO,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,MAAM,CAAA;KAAE,CAAC;IACnF,OAAO,EAAE;QACP,OAAO,EAAE,OAAO,CAAC;QACjB,QAAQ,EAAE,MAAM,CAAC;QACjB,UAAU,EAAE,aAAa,CAAC,MAAM,CAAC,CAAC;QAClC,WAAW,EAAE,OAAO,CAAC;QACrB,iBAAiB,EAAE,MAAM,CAAC;KAC3B,CAAC;CACH,CAAC,CAAC;AA+EH;;GAEG;AACH,eAAO,MAAM,iBAAiB,QAAO,kBA4DnC,CAAC;AA8CH,QAAA,MAAM,iBAAiB,QAAO;IAC5B,OAAO,EAAE,eAAe,CAAC;IACzB,OAAO,EAAE,kBAAkB,CAAC;IAC5B,SAAS,EAAE,CAAC,YAAY,EAAE,sBAAsB,KAAK,kBAAkB,CAAC,eAAe,CAAC,CAAC;IACzF,MAAM,EAAE;QAAE,QAAQ,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAA;KAAE,CAAC;IAC5C,UAAU,EAAE;QAAE,OAAO,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,MAAM,CAAA;KAAE,CAAC;IACnF,OAAO,EAAE;QACP,OAAO,EAAE,OAAO,CAAC;QACjB,QAAQ,EAAE,MAAM,CAAC;QACjB,UAAU,EAAE,aAAa,CAAC,MAAM,CAAC,CAAC;QAClC,WAAW,EAAE,OAAO,CAAC;QACrB,iBAAiB,EAAE,MAAM,CAAC;KAC3B,CAAC;CAuEH,CAAC;AAEF,MAAM,MAAM,WAAW,GAAG,UAAU,CAAC,OAAO,iBAAiB,CAAC,CAAC;AAqB/D,eAAO,MAAM,WAAW,EAAE,WAYxB,CAAC"}
@@ -5,6 +5,9 @@
5
5
  */
6
6
  import { Cloudflare } from './cloudflare.js';
7
7
  import { Env } from './env.js';
8
+ import { Logger } from './logger.js';
9
+ import { middlewareConfig } from './middleware.js';
10
+ import { ErrorFactory } from '../exceptions/ZintrustError.js';
8
11
  import { ZintrustLang } from '../lang/lang.js';
9
12
  import { StartupConfigFile, StartupConfigFileRegistry } from '../runtime/StartupConfigFileRegistry.js';
10
13
  const getQueueDriver = (driverConfig) => {
@@ -113,16 +116,32 @@ export const createBaseDrivers = () => ({
113
116
  /**
114
117
  * Helper: Create monitor configuration from environment
115
118
  */
116
- const createBaseMonitor = () => ({
117
- enabled: Env.getBool('QUEUE_MONITOR_ENABLED', false),
118
- basePath: Env.get('QUEUE_MONITOR_BASE_PATH', '/queue-monitor'),
119
- middleware: Env.get('QUEUE_MONITOR_MIDDLEWARE', '')
119
+ const createBaseMonitor = () => {
120
+ const enabled = Env.getBool('QUEUE_MONITOR_ENABLED', false);
121
+ const basePath = Env.get('QUEUE_MONITOR_BASE_PATH', '/queue-monitor');
122
+ const middleware = Env.get('QUEUE_MONITOR_MIDDLEWARE', '')
120
123
  .split(',')
121
124
  .map((m) => m.trim())
122
- .filter((m) => m.length > 0),
123
- autoRefresh: Env.getBool('QUEUE_MONITOR_AUTO_REFRESH', true),
124
- refreshIntervalMs: Env.getInt('QUEUE_MONITOR_REFRESH_MS', 5000),
125
- });
125
+ .filter((m) => m.length > 0);
126
+ if (enabled && middleware.length > 0) {
127
+ const knownKeys = new Set(Object.keys(middlewareConfig.route ?? {}));
128
+ const unknownKeys = middleware.filter((name) => !knownKeys.has(name));
129
+ if (unknownKeys.length > 0) {
130
+ Logger.error('Unknown QUEUE_MONITOR_MIDDLEWARE keys configured', {
131
+ unknownKeys,
132
+ basePath,
133
+ });
134
+ throw ErrorFactory.createConfigError(`Unknown QUEUE_MONITOR_MIDDLEWARE key(s): ${unknownKeys.join(', ')}. These must match registered route middleware keys in your app.`);
135
+ }
136
+ }
137
+ return {
138
+ enabled,
139
+ basePath,
140
+ middleware,
141
+ autoRefresh: Env.getBool('QUEUE_MONITOR_AUTO_REFRESH', true),
142
+ refreshIntervalMs: Env.getInt('QUEUE_MONITOR_REFRESH_MS', 5000),
143
+ };
144
+ };
126
145
  const createQueueConfig = () => {
127
146
  const overrides = StartupConfigFileRegistry.get(StartupConfigFile.Queue) ?? {};
128
147
  const baseDefault = Env.get('QUEUE_DRIVER', 'sync');
package/src/index.js CHANGED
@@ -1,11 +1,11 @@
1
1
  /**
2
- * @zintrust/core v0.1.44
2
+ * @zintrust/core v0.1.48
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-02-19T18:45:53.851Z
8
+ * Built: 2026-02-22T16:26:04.049Z
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-02-19T18:45:53.822Z'; // Replaced during build
24
+ export const ZINTRUST_BUILD_DATE = '2026-02-22T16:26:04.019Z'; // 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":"Database.d.ts","sourceRoot":"","sources":["../../../src/orm/Database.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAOH,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,kBAAkB,CAAC;AAUxD,OAAO,KAAK,EAAE,cAAc,EAAE,gBAAgB,EAAE,WAAW,EAAE,MAAM,sBAAsB,CAAC;AAE1F,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,mBAAmB,CAAC;AAGvD,MAAM,MAAM,QAAQ,GAAG;IAAE,KAAK,EAAE,MAAM,CAAA;CAAE,CAAC;AAEzC,MAAM,WAAW,SAAS;IACxB,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;IACzB,UAAU,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;IAC5B,WAAW,IAAI,OAAO,CAAC;IACvB,KAAK,CAAC,GAAG,EAAE,MAAM,EAAE,UAAU,CAAC,EAAE,OAAO,EAAE,EAAE,MAAM,CAAC,EAAE,OAAO,GAAG,OAAO,CAAC,OAAO,EAAE,CAAC,CAAC;IACjF,QAAQ,CAAC,GAAG,EAAE,MAAM,EAAE,UAAU,CAAC,EAAE,OAAO,EAAE,EAAE,MAAM,CAAC,EAAE,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;IAClF,OAAO,CAAC,GAAG,EAAE,MAAM,EAAE,UAAU,CAAC,EAAE,OAAO,EAAE,EAAE,MAAM,CAAC,EAAE,OAAO,GAAG,OAAO,CAAC,WAAW,CAAC,CAAC;IACrF,GAAG,CAAC,KAAK,EAAE,MAAM,GAAG,QAAQ,CAAC;IAC7B,WAAW,CAAC,CAAC,EAAE,QAAQ,EAAE,CAAC,EAAE,EAAE,SAAS,KAAK,OAAO,CAAC,CAAC,CAAC,GAAG,OAAO,CAAC,CAAC,CAAC,CAAC;IACpE,KAAK,CAAC,IAAI,EAAE,MAAM,GAAG,aAAa,CAAC;IACnC,aAAa,CAAC,OAAO,EAAE,CAAC,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,KAAK,IAAI,GAAG,IAAI,CAAC;IACzE,YAAY,CAAC,OAAO,EAAE,CAAC,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,EAAE,QAAQ,EAAE,MAAM,KAAK,IAAI,GAAG,IAAI,CAAC;IAC1F,cAAc,CAAC,OAAO,EAAE,CAAC,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,KAAK,IAAI,GAAG,IAAI,CAAC;IAC1E,aAAa,CAAC,OAAO,EAAE,CAAC,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,EAAE,QAAQ,EAAE,MAAM,KAAK,IAAI,GAAG,IAAI,CAAC;IAC3F,kBAAkB,CAAC,MAAM,CAAC,EAAE,OAAO,GAAG,gBAAgB,CAAC;IACvD,OAAO,IAAI,eAAe,CAAC;IAC3B,SAAS,IAAI,cAAc,CAAC;IAC5B,OAAO,IAAI,IAAI,CAAC;CACjB;AA2eD,eAAO,MAAM,QAAQ;IACnB;;OAEG;oBACa,cAAc,GAAG,SAAS;EAI1C,CAAC;AAIH,eAAO,MAAM,oBAAoB,GAC/B,SAAQ,cAAc,GAAG,SAAqB,EAC9C,uBAA0B,KACzB,OAAO,CAAC,UAAU,CAAC,OAAO,WAAW,CAAC,CAMxC,CAAC;AAEF,wBAAgB,WAAW,CAAC,MAAM,CAAC,EAAE,cAAc,EAAE,UAAU,SAAY,GAAG,SAAS,CAoBtF;AAED,wBAAsB,aAAa,IAAI,OAAO,CAAC,IAAI,CAAC,CAWnD"}
1
+ {"version":3,"file":"Database.d.ts","sourceRoot":"","sources":["../../../src/orm/Database.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAOH,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,kBAAkB,CAAC;AAWxD,OAAO,KAAK,EAAE,cAAc,EAAE,gBAAgB,EAAE,WAAW,EAAE,MAAM,sBAAsB,CAAC;AAE1F,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,mBAAmB,CAAC;AAGvD,MAAM,MAAM,QAAQ,GAAG;IAAE,KAAK,EAAE,MAAM,CAAA;CAAE,CAAC;AAEzC,MAAM,WAAW,SAAS;IACxB,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;IACzB,UAAU,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;IAC5B,WAAW,IAAI,OAAO,CAAC;IACvB,KAAK,CAAC,GAAG,EAAE,MAAM,EAAE,UAAU,CAAC,EAAE,OAAO,EAAE,EAAE,MAAM,CAAC,EAAE,OAAO,GAAG,OAAO,CAAC,OAAO,EAAE,CAAC,CAAC;IACjF,QAAQ,CAAC,GAAG,EAAE,MAAM,EAAE,UAAU,CAAC,EAAE,OAAO,EAAE,EAAE,MAAM,CAAC,EAAE,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;IAClF,OAAO,CAAC,GAAG,EAAE,MAAM,EAAE,UAAU,CAAC,EAAE,OAAO,EAAE,EAAE,MAAM,CAAC,EAAE,OAAO,GAAG,OAAO,CAAC,WAAW,CAAC,CAAC;IACrF,GAAG,CAAC,KAAK,EAAE,MAAM,GAAG,QAAQ,CAAC;IAC7B,WAAW,CAAC,CAAC,EAAE,QAAQ,EAAE,CAAC,EAAE,EAAE,SAAS,KAAK,OAAO,CAAC,CAAC,CAAC,GAAG,OAAO,CAAC,CAAC,CAAC,CAAC;IACpE,KAAK,CAAC,IAAI,EAAE,MAAM,GAAG,aAAa,CAAC;IACnC,aAAa,CAAC,OAAO,EAAE,CAAC,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,KAAK,IAAI,GAAG,IAAI,CAAC;IACzE,YAAY,CAAC,OAAO,EAAE,CAAC,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,EAAE,QAAQ,EAAE,MAAM,KAAK,IAAI,GAAG,IAAI,CAAC;IAC1F,cAAc,CAAC,OAAO,EAAE,CAAC,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,KAAK,IAAI,GAAG,IAAI,CAAC;IAC1E,aAAa,CAAC,OAAO,EAAE,CAAC,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,EAAE,QAAQ,EAAE,MAAM,KAAK,IAAI,GAAG,IAAI,CAAC;IAC3F,kBAAkB,CAAC,MAAM,CAAC,EAAE,OAAO,GAAG,gBAAgB,CAAC;IACvD,OAAO,IAAI,eAAe,CAAC;IAC3B,SAAS,IAAI,cAAc,CAAC;IAC5B,OAAO,IAAI,IAAI,CAAC;CACjB;AA4gBD,eAAO,MAAM,QAAQ;IACnB;;OAEG;oBACa,cAAc,GAAG,SAAS;EAI1C,CAAC;AAIH,eAAO,MAAM,oBAAoB,GAC/B,SAAQ,cAAc,GAAG,SAAqB,EAC9C,uBAA0B,KACzB,OAAO,CAAC,UAAU,CAAC,OAAO,WAAW,CAAC,CAMxC,CAAC;AAEF,wBAAgB,WAAW,CAAC,MAAM,CAAC,EAAE,cAAc,EAAE,UAAU,SAAY,GAAG,SAAS,CAoBtF;AAED,wBAAsB,aAAa,IAAI,OAAO,CAAC,IAAI,CAAC,CAWnD"}
@@ -16,6 +16,7 @@ import { PostgreSQLAdapter } from './adapters/PostgreSQLAdapter.js';
16
16
  import { PostgreSQLProxyAdapter } from './adapters/PostgreSQLProxyAdapter.js';
17
17
  import { SQLiteAdapter } from './adapters/SQLiteAdapter.js';
18
18
  import { SQLServerAdapter } from './adapters/SQLServerAdapter.js';
19
+ import { createSqlServerProxyAdapter } from './adapters/SqlServerProxyAdapter.js';
19
20
  import { DatabaseAdapterRegistry } from './DatabaseAdapterRegistry.js';
20
21
  import { QueryBuilder } from './QueryBuilder.js';
21
22
  /**
@@ -31,7 +32,7 @@ const resolveMySqlProxyAdapter = (cfg) => {
31
32
  const proxyUrl = Env.get('MYSQL_PROXY_URL', '').trim();
32
33
  const useProxy = Env.getBool('USE_MYSQL_PROXY', false);
33
34
  if (useProxy || proxyUrl.length > 0) {
34
- Logger.info('[Database] Selecting MySQL proxy adapter for Workers runtime', {
35
+ Logger.info('[Database] Selecting MySQL proxy adapter', {
35
36
  driver: cfg.driver,
36
37
  useMySqlProxy: useProxy,
37
38
  mysqlProxyUrlConfigured: proxyUrl.length > 0,
@@ -47,7 +48,7 @@ const resolvePostgresProxyAdapter = (cfg) => {
47
48
  const proxyUrl = Env.get('POSTGRES_PROXY_URL', '').trim();
48
49
  const useProxy = Env.getBool('USE_POSTGRES_PROXY', false);
49
50
  if (useProxy || proxyUrl.length > 0) {
50
- Logger.info('[Database] Selecting PostgreSQL proxy adapter for Workers runtime', {
51
+ Logger.info('[Database] Selecting PostgreSQL proxy adapter', {
51
52
  driver: cfg.driver,
52
53
  usePostgresProxy: useProxy,
53
54
  postgresProxyUrlConfigured: proxyUrl.length > 0,
@@ -57,6 +58,36 @@ const resolvePostgresProxyAdapter = (cfg) => {
57
58
  }
58
59
  return null;
59
60
  };
61
+ const resolveSqlServerProxyAdapter = (cfg) => {
62
+ if (cfg.driver !== 'sqlserver')
63
+ return null;
64
+ const proxyUrl = Env.get('SQLSERVER_PROXY_URL', '').trim();
65
+ const useProxy = Env.getBool('USE_SQLSERVER_PROXY', false);
66
+ if (useProxy || proxyUrl.length > 0) {
67
+ Logger.info('[Database] Selecting SQL Server proxy adapter', {
68
+ driver: cfg.driver,
69
+ useSqlServerProxy: useProxy,
70
+ sqlServerProxyUrlConfigured: proxyUrl.length > 0,
71
+ sqlServerProxyUrl: proxyUrl,
72
+ });
73
+ return createSqlServerProxyAdapter();
74
+ }
75
+ return null;
76
+ };
77
+ const resolveExplicitProxyAdapter = (cfg) => {
78
+ // Allow proxy adapters to be forced in any runtime (Node or Workers) when
79
+ // the feature flags or proxy URLs are configured.
80
+ const mysqlProxy = resolveMySqlProxyAdapter(cfg);
81
+ if (mysqlProxy)
82
+ return mysqlProxy;
83
+ const postgresProxy = resolvePostgresProxyAdapter(cfg);
84
+ if (postgresProxy)
85
+ return postgresProxy;
86
+ const sqlServerProxy = resolveSqlServerProxyAdapter(cfg);
87
+ if (sqlServerProxy)
88
+ return sqlServerProxy;
89
+ return null;
90
+ };
60
91
  const ensureCloudflareSocketSupport = (cfg) => {
61
92
  const isSocketDriver = cfg.driver === 'postgresql' || cfg.driver === 'mysql';
62
93
  if (!isSocketDriver)
@@ -92,6 +123,9 @@ const resolveWorkersAdapter = (cfg) => {
92
123
  return null;
93
124
  };
94
125
  const createAdapter = (cfg) => {
126
+ const explicitProxy = resolveExplicitProxyAdapter(cfg);
127
+ if (explicitProxy)
128
+ return explicitProxy;
95
129
  const workersAdapter = resolveWorkersAdapter(cfg);
96
130
  if (workersAdapter)
97
131
  return workersAdapter;
@@ -1 +1 @@
1
- {"version":3,"file":"QueryBuilder.d.ts","sourceRoot":"","sources":["../../../src/orm/QueryBuilder.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"QueryBuilder.d.ts","sourceRoot":"","sources":["../../../src/orm/QueryBuilder.ts"],"names":[],"mappings":"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"}
@@ -196,8 +196,6 @@ const buildSelectClause = (columns, dialect) => {
196
196
  const out = [];
197
197
  for (const c of columns) {
198
198
  const parsed = tryParseSelectExpr(String(c));
199
- if (parsed === null)
200
- continue;
201
199
  out.push(formatSelectExpr(parsed, dialect));
202
200
  }
203
201
  return out.join(', ');
@@ -469,7 +469,7 @@ export function createMemoized(fn, options = {}) {
469
469
  typeof a === 'string' ||
470
470
  typeof a === 'number' ||
471
471
  typeof a === 'boolean' ||
472
- a === 'undefined');
472
+ a === undefined);
473
473
  key = arePrimitives ? args.join('|') : JSON.stringify(args);
474
474
  }
475
475
  else {
@@ -1 +1 @@
1
- {"version":3,"file":"ProxyServer.d.ts","sourceRoot":"","sources":["../../../src/proxy/ProxyServer.ts"],"names":[],"mappings":"AACA,OAAO,EAEL,KAAK,eAAe,EACpB,KAAK,MAAM,EAEZ,MAAM,uBAAuB,CAAC;AAC/B,OAAO,KAAK,EAAE,YAAY,EAA+B,MAAM,qBAAqB,CAAC;AAErF,MAAM,MAAM,kBAAkB,GAAG,QAAQ,CAAC;IACxC,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,YAAY,EAAE,MAAM,CAAC;IACrB,OAAO,EAAE,YAAY,CAAC;IACtB,MAAM,CAAC,EAAE,CACP,GAAG,EAAE,eAAe,EACpB,IAAI,EAAE,MAAM,KACT,OAAO,CAAC;QAAE,EAAE,EAAE,IAAI,CAAA;KAAE,GAAG;QAAE,EAAE,EAAE,KAAK,CAAC;QAAC,MAAM,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;CAC7E,CAAC,CAAC;AA0CH,eAAO,MAAM,iBAAiB,GAC5B,SAAS,kBAAkB,KAC1B,QAAQ,CAAC;IACV,KAAK,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;IAC3B,IAAI,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;IAC1B,MAAM,EAAE,MAAM,CAAC;CAChB,CAsDA,CAAC"}
1
+ {"version":3,"file":"ProxyServer.d.ts","sourceRoot":"","sources":["../../../src/proxy/ProxyServer.ts"],"names":[],"mappings":"AACA,OAAO,EAEL,KAAK,eAAe,EACpB,KAAK,MAAM,EAEZ,MAAM,uBAAuB,CAAC;AAC/B,OAAO,KAAK,EAAE,YAAY,EAA+B,MAAM,qBAAqB,CAAC;AAErF,MAAM,MAAM,kBAAkB,GAAG,QAAQ,CAAC;IACxC,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,YAAY,EAAE,MAAM,CAAC;IACrB,OAAO,EAAE,YAAY,CAAC;IACtB,MAAM,CAAC,EAAE,CACP,GAAG,EAAE,eAAe,EACpB,IAAI,EAAE,MAAM,KACT,OAAO,CAAC;QAAE,EAAE,EAAE,IAAI,CAAA;KAAE,GAAG;QAAE,EAAE,EAAE,KAAK,CAAC;QAAC,MAAM,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;CAC7E,CAAC,CAAC;AA0CH,eAAO,MAAM,iBAAiB,GAC5B,SAAS,kBAAkB,KAC1B,QAAQ,CAAC;IACV,KAAK,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;IAC3B,IAAI,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;IAC1B,MAAM,EAAE,MAAM,CAAC;CAChB,CAkEA,CAAC"}
@@ -38,6 +38,15 @@ export const createProxyServer = (options) => {
38
38
  const server = createServer(async (req, res) => {
39
39
  try {
40
40
  const body = await readBody(req, options.maxBodyBytes);
41
+ const rawUrl = req.url ?? '';
42
+ if (rawUrl.startsWith('/containerstarthealthcheck') ||
43
+ rawUrl.startsWith('containerstarthealthcheck')) {
44
+ respond(res, {
45
+ status: 200,
46
+ body: { status: 'ok' },
47
+ });
48
+ return;
49
+ }
41
50
  if ((req.url ?? '').startsWith('/health')) {
42
51
  const response = await options.backend.health();
43
52
  respond(res, response);
@@ -8,7 +8,7 @@ const DEFAULT_OPTIONS = {
8
8
  };
9
9
  function isUnrefableTimer(value) {
10
10
  return (typeof value === 'object' &&
11
- value !== null &&
11
+ value instanceof Object &&
12
12
  'unref' in value &&
13
13
  typeof value.unref === 'function');
14
14
  }
@@ -2,6 +2,7 @@ name: zintrust-schedules
2
2
 
3
3
  services:
4
4
  schedules:
5
+ image: ${SCHEDULES_IMAGE:-zintrust/zintrust-schedules:latest}
5
6
  build:
6
7
  context: .
7
8
  dockerfile: Dockerfile
@@ -21,13 +22,43 @@ services:
21
22
  REDIS_DB: ${REDIS_DB:-0}
22
23
 
23
24
  # Database (for job-tracking cleanup schedule)
25
+ # Supported: postgresql | mysql | sqlserver | sqlite | d1 | d1-remote
26
+ # Tip: to use mysql or sqlserver, start the corresponding profile:
27
+ # docker compose -f docker-compose.schedules.yml --profile mysql up -d
28
+ # docker compose -f docker-compose.schedules.yml --profile sqlserver up -d
24
29
  DB_CONNECTION: ${DB_CONNECTION:-postgresql}
30
+
31
+ # PostgreSQL
25
32
  DB_HOST: ${DB_HOST:-postgres}
26
- DB_PORT: ${DB_PORT:-5432}
33
+ DB_PORT_POSTGRESQL: ${DB_PORT_POSTGRESQL:-5432}
34
+ DB_DATABASE_POSTGRESQL: ${DB_DATABASE_POSTGRESQL:-zintrust}
35
+ DB_USERNAME_POSTGRESQL: ${DB_USERNAME_POSTGRESQL:-zintrust}
36
+ DB_PASSWORD_POSTGRESQL: ${DB_PASSWORD_POSTGRESQL:-zintrust}
37
+
38
+ # MySQL
39
+ DB_PORT: ${DB_PORT:-3306}
27
40
  DB_DATABASE: ${DB_DATABASE:-zintrust}
28
41
  DB_USERNAME: ${DB_USERNAME:-zintrust}
29
42
  DB_PASSWORD: ${DB_PASSWORD:-zintrust}
30
43
 
44
+ # SQL Server
45
+ DB_HOST_MSSQL: ${DB_HOST_MSSQL:-sqlserver}
46
+ DB_PORT_MSSQL: ${DB_PORT_MSSQL:-1433}
47
+ DB_DATABASE_MSSQL: ${DB_DATABASE_MSSQL:-zintrust}
48
+ DB_USERNAME_MSSQL: ${DB_USERNAME_MSSQL:-sa}
49
+ DB_PASSWORD_MSSQL: ${DB_PASSWORD_MSSQL:-YourStrong!Passw0rd}
50
+
51
+ # SQLite (no DB container; writes to local filesystem inside the container)
52
+ DB_DATABASE_SQLITE: ${DB_DATABASE_SQLITE:-.zintrust/dbs/zintrust.sqlite}
53
+
54
+ # Cloudflare D1 (requires Cloudflare credentials / remote proxy)
55
+ D1_DATABASE_ID: ${D1_DATABASE_ID:-}
56
+ D1_ACCOUNT_ID: ${D1_ACCOUNT_ID:-}
57
+ D1_API_TOKEN: ${D1_API_TOKEN:-}
58
+ D1_REMOTE_URL: ${D1_REMOTE_URL:-}
59
+ D1_REMOTE_KEY_ID: ${D1_REMOTE_KEY_ID:-}
60
+ D1_REMOTE_SECRET: ${D1_REMOTE_SECRET:-}
61
+
31
62
  # Job tracking cleanup schedule
32
63
  JOB_TRACKING_CLEANUP_ENABLED: ${JOB_TRACKING_CLEANUP_ENABLED:-false}
33
64
  JOB_TRACKING_CLEANUP_INTERVAL_MS: ${JOB_TRACKING_CLEANUP_INTERVAL_MS:-21600000}
@@ -37,8 +68,6 @@ services:
37
68
  JOB_TRACKING_CLEANUP_LOCK_PROVIDER: ${JOB_TRACKING_CLEANUP_LOCK_PROVIDER:-redis}
38
69
  command: ['node', 'dist/bin/zin.js', 'schedule:start']
39
70
  depends_on:
40
- postgres:
41
- condition: service_healthy
42
71
  redis:
43
72
  condition: service_healthy
44
73
  networks:
@@ -47,21 +76,61 @@ services:
47
76
  postgres:
48
77
  image: postgres:16-alpine
49
78
  environment:
50
- POSTGRES_DB: ${DB_DATABASE:-zintrust}
51
- POSTGRES_USER: ${DB_USERNAME:-zintrust}
52
- POSTGRES_PASSWORD: ${DB_PASSWORD:-zintrust}
79
+ POSTGRES_DB: ${DB_DATABASE_POSTGRESQL:-zintrust}
80
+ POSTGRES_USER: ${DB_USERNAME_POSTGRESQL:-zintrust}
81
+ POSTGRES_PASSWORD: ${DB_PASSWORD_POSTGRESQL:-zintrust}
53
82
  ports:
54
83
  - '${POSTGRES_PORT:-5432}:5432'
55
84
  volumes:
56
85
  - postgres_data:/var/lib/postgresql/data
57
86
  healthcheck:
58
- test: ['CMD-SHELL', 'pg_isready -U ${DB_USERNAME:-zintrust}']
87
+ test: ['CMD-SHELL', 'pg_isready -U ${DB_USERNAME_POSTGRESQL:-zintrust}']
59
88
  interval: 10s
60
89
  timeout: 5s
61
90
  retries: 5
62
91
  networks:
63
92
  - zintrust-network
64
93
 
94
+ mysql:
95
+ profiles: ['mysql']
96
+ image: mysql:8.4
97
+ environment:
98
+ MYSQL_DATABASE: ${DB_DATABASE:-zintrust}
99
+ MYSQL_USER: ${DB_USERNAME:-zintrust}
100
+ MYSQL_PASSWORD: ${DB_PASSWORD:-zintrust}
101
+ MYSQL_ROOT_PASSWORD: ${MYSQL_ROOT_PASSWORD:-root}
102
+ ports:
103
+ - '${MYSQL_PORT:-3306}:3306'
104
+ volumes:
105
+ - mysql_data:/var/lib/mysql
106
+ healthcheck:
107
+ test: ['CMD-SHELL', 'mysqladmin ping -h 127.0.0.1 -uroot -p${MYSQL_ROOT_PASSWORD:-root} --silent']
108
+ interval: 10s
109
+ timeout: 5s
110
+ retries: 10
111
+ networks:
112
+ - zintrust-network
113
+
114
+ sqlserver:
115
+ profiles: ['sqlserver']
116
+ image: mcr.microsoft.com/mssql/server:2022-latest
117
+ environment:
118
+ ACCEPT_EULA: 'Y'
119
+ MSSQL_PID: ${MSSQL_PID:-Developer}
120
+ MSSQL_SA_PASSWORD: ${MSSQL_SA_PASSWORD:-YourStrong!Passw0rd}
121
+ ports:
122
+ - '${SQLSERVER_PORT:-1433}:1433'
123
+ volumes:
124
+ - sqlserver_data:/var/opt/mssql
125
+ healthcheck:
126
+ test: ['CMD-SHELL', '/opt/mssql-tools18/bin/sqlcmd -S 127.0.0.1 -U sa -P "${MSSQL_SA_PASSWORD:-YourStrong!Passw0rd}" -Q "SELECT 1" 1>/dev/null']
127
+ interval: 10s
128
+ timeout: 10s
129
+ retries: 10
130
+ start_period: 20s
131
+ networks:
132
+ - zintrust-network
133
+
65
134
  redis:
66
135
  image: redis:7-alpine
67
136
  ports:
@@ -82,3 +151,5 @@ networks:
82
151
  volumes:
83
152
  postgres_data:
84
153
  redis_data:
154
+ mysql_data:
155
+ sqlserver_data: