@zintrust/core 0.1.41 → 0.1.42

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 (193) hide show
  1. package/package.json +17 -1
  2. package/src/boot/bootstrap.js +27 -11
  3. package/src/boot/registry/runtime.d.ts.map +1 -1
  4. package/src/boot/registry/runtime.js +11 -0
  5. package/src/cli/CLI.d.ts.map +1 -1
  6. package/src/cli/CLI.js +12 -0
  7. package/src/cli/commands/ConfigCommand.d.ts.map +1 -1
  8. package/src/cli/commands/ConfigCommand.js +3 -5
  9. package/src/cli/commands/D1LearnCommand.d.ts +9 -0
  10. package/src/cli/commands/D1LearnCommand.d.ts.map +1 -0
  11. package/src/cli/commands/D1LearnCommand.js +143 -0
  12. package/src/cli/commands/D1MigrateCommand.d.ts.map +1 -1
  13. package/src/cli/commands/D1MigrateCommand.js +55 -16
  14. package/src/cli/commands/InitContainerCommand.d.ts.map +1 -1
  15. package/src/cli/commands/InitContainerCommand.js +21 -6
  16. package/src/cli/commands/InitEcosystemCommand.d.ts +6 -0
  17. package/src/cli/commands/InitEcosystemCommand.d.ts.map +1 -0
  18. package/src/cli/commands/InitEcosystemCommand.js +51 -0
  19. package/src/cli/commands/MigrateCommand.d.ts.map +1 -1
  20. package/src/cli/commands/MigrateCommand.js +78 -36
  21. package/src/cli/commands/MigrateWorkerCommand.d.ts.map +1 -1
  22. package/src/cli/commands/MigrateWorkerCommand.js +36 -2
  23. package/src/cli/commands/PutCommand.d.ts +6 -0
  24. package/src/cli/commands/PutCommand.d.ts.map +1 -0
  25. package/src/cli/commands/PutCommand.js +173 -0
  26. package/src/cli/commands/QueueRecoveryCommand.d.ts.map +1 -1
  27. package/src/cli/commands/QueueRecoveryCommand.js +113 -14
  28. package/src/cli/commands/ScheduleListCommand.d.ts +6 -0
  29. package/src/cli/commands/ScheduleListCommand.d.ts.map +1 -0
  30. package/src/cli/commands/ScheduleListCommand.js +62 -0
  31. package/src/cli/commands/ScheduleRunCommand.d.ts +6 -0
  32. package/src/cli/commands/ScheduleRunCommand.d.ts.map +1 -0
  33. package/src/cli/commands/ScheduleRunCommand.js +32 -0
  34. package/src/cli/commands/ScheduleStartCommand.d.ts +6 -0
  35. package/src/cli/commands/ScheduleStartCommand.d.ts.map +1 -0
  36. package/src/cli/commands/ScheduleStartCommand.js +40 -0
  37. package/src/cli/commands/SecretsCommand.d.ts.map +1 -1
  38. package/src/cli/commands/SecretsCommand.js +2 -2
  39. package/src/cli/commands/schedule/ScheduleCliSupport.d.ts +6 -0
  40. package/src/cli/commands/schedule/ScheduleCliSupport.d.ts.map +1 -0
  41. package/src/cli/commands/schedule/ScheduleCliSupport.js +55 -0
  42. package/src/cli/config/ConfigManager.d.ts.map +1 -1
  43. package/src/cli/config/ConfigManager.js +8 -1
  44. package/src/cli/d1/D1SqlMigrations.d.ts.map +1 -1
  45. package/src/cli/d1/D1SqlMigrations.js +11 -1
  46. package/src/cli/d1/WranglerConfig.d.ts.map +1 -1
  47. package/src/cli/d1/WranglerConfig.js +34 -2
  48. package/src/cli/services/VersionChecker.d.ts.map +1 -1
  49. package/src/cli/services/VersionChecker.js +5 -1
  50. package/src/cli/utils/DatabaseCliUtils.d.ts.map +1 -1
  51. package/src/cli/utils/DatabaseCliUtils.js +6 -1
  52. package/src/cli/utils/EnvFileLoader.d.ts.map +1 -1
  53. package/src/cli/utils/EnvFileLoader.js +33 -14
  54. package/src/cli.d.ts +5 -0
  55. package/src/cli.d.ts.map +1 -0
  56. package/src/cli.js +4 -0
  57. package/src/collections/index.d.ts +2 -2
  58. package/src/collections/index.d.ts.map +1 -1
  59. package/src/collections/index.js +1 -1
  60. package/src/common/RemoteSignedJson.d.ts.map +1 -1
  61. package/src/common/RemoteSignedJson.js +49 -23
  62. package/src/common/utility.d.ts.map +1 -1
  63. package/src/common/utility.js +2 -6
  64. package/src/config/cloudflare.d.ts.map +1 -1
  65. package/src/config/cloudflare.js +19 -8
  66. package/src/config/env.js +2 -2
  67. package/src/helper/index.d.ts +225 -0
  68. package/src/helper/index.d.ts.map +1 -0
  69. package/src/helper/index.js +347 -0
  70. package/src/index.d.ts +3 -6
  71. package/src/index.d.ts.map +1 -1
  72. package/src/index.js +7 -9
  73. package/src/migrations/MigrationDiscovery.d.ts.map +1 -1
  74. package/src/migrations/MigrationDiscovery.js +2 -1
  75. package/src/orm/DatabaseAdapter.d.ts +1 -0
  76. package/src/orm/DatabaseAdapter.d.ts.map +1 -1
  77. package/src/orm/SchemaStatemenWriter.d.ts +15 -0
  78. package/src/orm/SchemaStatemenWriter.d.ts.map +1 -0
  79. package/src/orm/SchemaStatemenWriter.js +78 -0
  80. package/src/orm/adapters/D1Adapter.d.ts.map +1 -1
  81. package/src/orm/adapters/D1Adapter.js +52 -2
  82. package/src/orm/adapters/D1RemoteAdapter.d.ts.map +1 -1
  83. package/src/orm/adapters/D1RemoteAdapter.js +137 -89
  84. package/src/orm/adapters/MySQLProxyAdapter.d.ts.map +1 -1
  85. package/src/orm/adapters/MySQLProxyAdapter.js +100 -81
  86. package/src/orm/adapters/PostgreSQLProxyAdapter.d.ts.map +1 -1
  87. package/src/orm/adapters/PostgreSQLProxyAdapter.js +26 -10
  88. package/src/orm/adapters/SqlProxyAdapterUtils.d.ts.map +1 -1
  89. package/src/orm/adapters/SqlProxyAdapterUtils.js +2 -1
  90. package/src/orm/adapters/SqlProxyRegistryMode.d.ts +12 -0
  91. package/src/orm/adapters/SqlProxyRegistryMode.d.ts.map +1 -0
  92. package/src/orm/adapters/SqlProxyRegistryMode.js +24 -0
  93. package/src/orm/adapters/SqlServerProxyAdapter.d.ts +3 -0
  94. package/src/orm/adapters/SqlServerProxyAdapter.d.ts.map +1 -1
  95. package/src/orm/adapters/SqlServerProxyAdapter.js +125 -117
  96. package/src/orm/migrations/MigrationStore.js +1 -1
  97. package/src/proxy/ProxyRequestParsing.d.ts +9 -0
  98. package/src/proxy/ProxyRequestParsing.d.ts.map +1 -0
  99. package/src/proxy/ProxyRequestParsing.js +16 -0
  100. package/src/proxy/RequestValidator.d.ts.map +1 -1
  101. package/src/proxy/RequestValidator.js +2 -1
  102. package/src/proxy/SigningService.js +2 -2
  103. package/src/proxy/SqlProxyDbOverrides.d.ts +17 -0
  104. package/src/proxy/SqlProxyDbOverrides.d.ts.map +1 -0
  105. package/src/proxy/SqlProxyDbOverrides.js +1 -0
  106. package/src/proxy/SqlProxyServerDeps.d.ts +12 -0
  107. package/src/proxy/SqlProxyServerDeps.d.ts.map +1 -0
  108. package/src/proxy/SqlProxyServerDeps.js +9 -0
  109. package/src/proxy/StatementPayloadValidator.d.ts +13 -0
  110. package/src/proxy/StatementPayloadValidator.d.ts.map +1 -0
  111. package/src/proxy/StatementPayloadValidator.js +18 -0
  112. package/src/proxy/StatementRegistryLoader.d.ts +2 -0
  113. package/src/proxy/StatementRegistryLoader.d.ts.map +1 -0
  114. package/src/proxy/StatementRegistryLoader.js +36 -0
  115. package/src/proxy/StatementRegistryResolver.d.ts +15 -0
  116. package/src/proxy/StatementRegistryResolver.d.ts.map +1 -0
  117. package/src/proxy/StatementRegistryResolver.js +34 -0
  118. package/src/proxy/d1/ZintrustD1Proxy.d.ts +2 -1
  119. package/src/proxy/d1/ZintrustD1Proxy.d.ts.map +1 -1
  120. package/src/proxy/d1/ZintrustD1Proxy.js +2 -1
  121. package/src/proxy/isMutatingSql.d.ts +2 -0
  122. package/src/proxy/isMutatingSql.d.ts.map +1 -0
  123. package/src/proxy/isMutatingSql.js +12 -0
  124. package/src/proxy/kv/ZintrustKvProxy.d.ts +2 -1
  125. package/src/proxy/kv/ZintrustKvProxy.d.ts.map +1 -1
  126. package/src/proxy/kv/ZintrustKvProxy.js +2 -1
  127. package/src/proxy/mysql/MySqlProxyServer.d.ts +2 -8
  128. package/src/proxy/mysql/MySqlProxyServer.d.ts.map +1 -1
  129. package/src/proxy/mysql/MySqlProxyServer.js +84 -51
  130. package/src/proxy/postgres/PostgresProxyServer.d.ts +2 -8
  131. package/src/proxy/postgres/PostgresProxyServer.d.ts.map +1 -1
  132. package/src/proxy/postgres/PostgresProxyServer.js +86 -48
  133. package/src/proxy/smtp/SmtpProxyServer.d.ts.map +1 -1
  134. package/src/proxy/smtp/SmtpProxyServer.js +6 -5
  135. package/src/proxy/sqlserver/SqlServerProxyServer.d.ts +2 -8
  136. package/src/proxy/sqlserver/SqlServerProxyServer.d.ts.map +1 -1
  137. package/src/proxy/sqlserver/SqlServerProxyServer.js +84 -49
  138. package/src/proxy.d.ts +4 -0
  139. package/src/proxy.d.ts.map +1 -0
  140. package/src/proxy.js +3 -0
  141. package/src/scheduler/Schedule.d.ts +36 -0
  142. package/src/scheduler/Schedule.d.ts.map +1 -0
  143. package/src/scheduler/Schedule.js +197 -0
  144. package/src/scheduler/ScheduleHttpGateway.d.ts +8 -0
  145. package/src/scheduler/ScheduleHttpGateway.d.ts.map +1 -0
  146. package/src/scheduler/ScheduleHttpGateway.js +196 -0
  147. package/src/scheduler/ScheduleRunner.d.ts +6 -0
  148. package/src/scheduler/ScheduleRunner.d.ts.map +1 -1
  149. package/src/scheduler/ScheduleRunner.js +166 -29
  150. package/src/scheduler/SchedulerRuntime.d.ts +15 -0
  151. package/src/scheduler/SchedulerRuntime.d.ts.map +1 -0
  152. package/src/scheduler/SchedulerRuntime.js +79 -0
  153. package/src/scheduler/cron/Cron.d.ts +19 -0
  154. package/src/scheduler/cron/Cron.d.ts.map +1 -0
  155. package/src/scheduler/cron/Cron.js +200 -0
  156. package/src/scheduler/leader/SchedulerLeader.d.ts +14 -0
  157. package/src/scheduler/leader/SchedulerLeader.d.ts.map +1 -0
  158. package/src/scheduler/leader/SchedulerLeader.js +187 -0
  159. package/src/scheduler/state/ScheduleStateStore.d.ts +27 -0
  160. package/src/scheduler/state/ScheduleStateStore.d.ts.map +1 -0
  161. package/src/scheduler/state/ScheduleStateStore.js +27 -0
  162. package/src/scheduler/types.d.ts +10 -0
  163. package/src/scheduler/types.d.ts.map +1 -1
  164. package/src/schedules/index.d.ts +1 -0
  165. package/src/schedules/index.d.ts.map +1 -1
  166. package/src/schedules/index.js +1 -0
  167. package/src/schedules/job-tracking-cleanup.d.ts +4 -0
  168. package/src/schedules/job-tracking-cleanup.d.ts.map +1 -0
  169. package/src/schedules/job-tracking-cleanup.js +116 -0
  170. package/src/schedules/log-cleanup.d.ts +1 -2
  171. package/src/schedules/log-cleanup.d.ts.map +1 -1
  172. package/src/schedules/log-cleanup.js +12 -15
  173. package/src/security/Sanitizer.d.ts.map +1 -1
  174. package/src/security/Sanitizer.js +1 -9
  175. package/src/security/SignedRequest.d.ts.map +1 -1
  176. package/src/security/SignedRequest.js +2 -2
  177. package/src/templates/docker/docker-compose.ecosystem.yml.tpl +301 -0
  178. package/src/templates/docker/docker-compose.schedules.yml.tpl +84 -0
  179. package/src/templates/project/basic/app/Schedules/index.ts.tpl +0 -0
  180. package/src/templates/project/basic/config/database.ts.tpl +1 -1
  181. package/src/toolkit/Secrets/Manifest.d.ts.map +1 -1
  182. package/src/toolkit/Secrets/Manifest.js +5 -7
  183. package/src/tools/mail/drivers/Smtp.d.ts.map +1 -1
  184. package/src/tools/mail/drivers/Smtp.js +7 -1
  185. package/src/tools/queue/JobReconciliationRunner.d.ts.map +1 -1
  186. package/src/tools/queue/JobReconciliationRunner.js +7 -39
  187. package/src/tools/queue/JobRecoveryDaemon.d.ts.map +1 -1
  188. package/src/tools/queue/JobRecoveryDaemon.js +116 -18
  189. package/src/tools/queue/JobStateTracker.d.ts +10 -1
  190. package/src/tools/queue/JobStateTracker.d.ts.map +1 -1
  191. package/src/tools/queue/JobStateTracker.js +24 -2
  192. package/src/tools/queue/JobStateTrackerDbPersistence.d.ts.map +1 -1
  193. package/src/tools/queue/JobStateTrackerDbPersistence.js +93 -2
@@ -0,0 +1,62 @@
1
+ import { BaseCommand } from '../BaseCommand.js';
2
+ import { ScheduleCliSupport } from '../commands/schedule/ScheduleCliSupport.js';
3
+ import { Logger } from '../../config/logger.js';
4
+ import { SchedulerRuntime } from '../../scheduler/SchedulerRuntime.js';
5
+ const execute = async (options) => {
6
+ try {
7
+ await ScheduleCliSupport.registerAll();
8
+ const toIso = (ms) => typeof ms === 'number' && Number.isFinite(ms) ? new Date(ms).toISOString() : undefined;
9
+ const rows = (await SchedulerRuntime.listWithState())
10
+ .map(({ schedule: s, state }) => ({
11
+ name: s.name,
12
+ enabled: s.enabled !== false,
13
+ intervalMs: s.intervalMs,
14
+ cron: s.cron,
15
+ timezone: s.timezone,
16
+ runOnStart: s.runOnStart === true,
17
+ consecutiveFailures: state?.consecutiveFailures,
18
+ lastRunAt: toIso(state?.lastRunAt),
19
+ lastSuccessAt: toIso(state?.lastSuccessAt),
20
+ lastErrorAt: toIso(state?.lastErrorAt),
21
+ lastErrorMessage: state?.lastErrorMessage,
22
+ nextRunAt: toIso(state?.nextRunAt),
23
+ }))
24
+ .sort((a, b) => a.name.localeCompare(b.name));
25
+ if (options.json === true) {
26
+ Logger.info(JSON.stringify(rows, null, 2));
27
+ return;
28
+ }
29
+ if (rows.length === 0) {
30
+ Logger.info('No schedules registered');
31
+ return;
32
+ }
33
+ rows.forEach((row) => {
34
+ const hasText = (value) => typeof value === 'string' && value.trim().length > 0;
35
+ const tzSuffix = hasText(row.timezone) ? ` tz=${row.timezone}` : '';
36
+ const cadence = typeof row.cron === 'string' && row.cron.trim().length > 0
37
+ ? `cron=${row.cron}${tzSuffix}`
38
+ : `intervalMs=${row.intervalMs ?? 'manual'}`;
39
+ const hasStateInfo = [row.nextRunAt, row.lastSuccessAt, row.lastErrorAt].some(hasText);
40
+ const extra = hasStateInfo
41
+ ? ` next=${row.nextRunAt ?? '-'} lastOk=${row.lastSuccessAt ?? '-'} lastErr=${row.lastErrorAt ?? '-'}`
42
+ : '';
43
+ Logger.info(`${row.name} (enabled=${row.enabled}, ${cadence}, runOnStart=${row.runOnStart}, failures=${row.consecutiveFailures ?? 0})${extra}`);
44
+ });
45
+ }
46
+ finally {
47
+ await ScheduleCliSupport.shutdownCliResources();
48
+ }
49
+ };
50
+ export const ScheduleListCommand = Object.freeze({
51
+ create() {
52
+ return BaseCommand.create({
53
+ name: 'schedule:list',
54
+ description: 'List all registered schedules',
55
+ addOptions: (command) => {
56
+ command.option('--json', 'Output JSON');
57
+ },
58
+ execute,
59
+ });
60
+ },
61
+ });
62
+ export default ScheduleListCommand;
@@ -0,0 +1,6 @@
1
+ import type { IBaseCommand } from '../BaseCommand';
2
+ export declare const ScheduleRunCommand: Readonly<{
3
+ create(): IBaseCommand;
4
+ }>;
5
+ export default ScheduleRunCommand;
6
+ //# sourceMappingURL=ScheduleRunCommand.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ScheduleRunCommand.d.ts","sourceRoot":"","sources":["../../../../src/cli/commands/ScheduleRunCommand.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAkB,YAAY,EAAE,MAAM,kBAAkB,CAAC;AA0BrE,eAAO,MAAM,kBAAkB;cACnB,YAAY;EAUtB,CAAC;AAEH,eAAe,kBAAkB,CAAC"}
@@ -0,0 +1,32 @@
1
+ import { BaseCommand } from '../BaseCommand.js';
2
+ import { ScheduleCliSupport } from '../commands/schedule/ScheduleCliSupport.js';
3
+ import { Logger } from '../../config/logger.js';
4
+ import { ErrorFactory } from '../../exceptions/ZintrustError.js';
5
+ import { SchedulerRuntime } from '../../scheduler/SchedulerRuntime.js';
6
+ const execute = async (options) => {
7
+ const name = (options.name ?? '').trim();
8
+ if (name.length === 0)
9
+ throw ErrorFactory.createConfigError('--name is required');
10
+ try {
11
+ await ScheduleCliSupport.registerAll();
12
+ Logger.info('Running schedule once', { name });
13
+ await SchedulerRuntime.runOnce(name);
14
+ Logger.info('Schedule run completed', { name });
15
+ }
16
+ finally {
17
+ await ScheduleCliSupport.shutdownCliResources();
18
+ }
19
+ };
20
+ export const ScheduleRunCommand = Object.freeze({
21
+ create() {
22
+ return BaseCommand.create({
23
+ name: 'schedule:run',
24
+ description: 'Run a specific schedule once and exit',
25
+ addOptions: (command) => {
26
+ command.option('--name <name>', 'Schedule name to run');
27
+ },
28
+ execute,
29
+ });
30
+ },
31
+ });
32
+ export default ScheduleRunCommand;
@@ -0,0 +1,6 @@
1
+ import type { IBaseCommand } from '../BaseCommand';
2
+ export declare const ScheduleStartCommand: Readonly<{
3
+ create(): IBaseCommand;
4
+ }>;
5
+ export default ScheduleStartCommand;
6
+ //# sourceMappingURL=ScheduleStartCommand.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ScheduleStartCommand.d.ts","sourceRoot":"","sources":["../../../../src/cli/commands/ScheduleStartCommand.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAkB,YAAY,EAAE,MAAM,kBAAkB,CAAC;AA6CrE,eAAO,MAAM,oBAAoB;cACrB,YAAY;EAOtB,CAAC;AAEH,eAAe,oBAAoB,CAAC"}
@@ -0,0 +1,40 @@
1
+ import { BaseCommand } from '../BaseCommand.js';
2
+ import { ScheduleCliSupport } from '../commands/schedule/ScheduleCliSupport.js';
3
+ import { Env } from '../../config/env.js';
4
+ import { Logger } from '../../config/logger.js';
5
+ import { ErrorFactory } from '../../exceptions/ZintrustError.js';
6
+ import { SchedulerRuntime } from '../../scheduler/SchedulerRuntime.js';
7
+ const waitForSignal = async () => {
8
+ if (typeof process === 'undefined' || typeof process.once !== 'function') {
9
+ throw ErrorFactory.createGeneralError('schedule:start is only supported in Node.js runtimes');
10
+ }
11
+ return new Promise((resolve) => {
12
+ process.once('SIGTERM', () => resolve('SIGTERM'));
13
+ process.once('SIGINT', () => resolve('SIGINT'));
14
+ });
15
+ };
16
+ const execute = async (_options) => {
17
+ if (Env.getBool('SCHEDULES_ENABLED', false) === false) {
18
+ Logger.info('Schedules are disabled (SCHEDULES_ENABLED=false); exiting');
19
+ return;
20
+ }
21
+ await ScheduleCliSupport.registerAll();
22
+ const registeredCount = SchedulerRuntime.list().length;
23
+ Logger.info('Starting schedules daemon', { registeredCount });
24
+ SchedulerRuntime.start();
25
+ const signal = await waitForSignal();
26
+ Logger.info('Stopping schedules daemon', { signal });
27
+ const timeoutMs = Env.getInt('SCHEDULE_SHUTDOWN_TIMEOUT_MS', 30000);
28
+ await SchedulerRuntime.stop(timeoutMs);
29
+ Logger.info('Schedules daemon stopped');
30
+ };
31
+ export const ScheduleStartCommand = Object.freeze({
32
+ create() {
33
+ return BaseCommand.create({
34
+ name: 'schedule:start',
35
+ description: 'Start schedules and keep running until SIGINT/SIGTERM',
36
+ execute,
37
+ });
38
+ },
39
+ });
40
+ export default ScheduleStartCommand;
@@ -1 +1 @@
1
- {"version":3,"file":"SecretsCommand.d.ts","sourceRoot":"","sources":["../../../../src/cli/commands/SecretsCommand.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAEH,OAAO,EAAoC,KAAK,YAAY,EAAE,MAAM,kBAAkB,CAAC;AAsHvF,eAAO,MAAM,cAAc;cACf,YAAY;EAWtB,CAAC;AAEH,eAAe,cAAc,CAAC"}
1
+ {"version":3,"file":"SecretsCommand.d.ts","sourceRoot":"","sources":["../../../../src/cli/commands/SecretsCommand.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAEH,OAAO,EAAoC,KAAK,YAAY,EAAE,MAAM,kBAAkB,CAAC;AAqHvF,eAAO,MAAM,cAAc;cACf,YAAY;EAWtB,CAAC;AAEH,eAAe,cAAc,CAAC"}
@@ -10,10 +10,10 @@
10
10
  */
11
11
  import { BaseCommand } from '../BaseCommand.js';
12
12
  import { ErrorFactory } from '../../exceptions/ZintrustError.js';
13
+ import { isArray } from '../../helper/index.js';
13
14
  import { SecretsToolkit } from '../../toolkit/Secrets/index.js';
14
- const isUnknownArray = (value) => Array.isArray(value);
15
15
  const getArg = (args, index) => {
16
- if (!isUnknownArray(args))
16
+ if (!isArray(args))
17
17
  return undefined;
18
18
  const v = args[index];
19
19
  return typeof v === 'string' ? v : undefined;
@@ -0,0 +1,6 @@
1
+ export declare const ScheduleCliSupport: Readonly<{
2
+ registerAll(): Promise<void>;
3
+ shutdownCliResources: () => Promise<void>;
4
+ }>;
5
+ export default ScheduleCliSupport;
6
+ //# sourceMappingURL=ScheduleCliSupport.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ScheduleCliSupport.d.ts","sourceRoot":"","sources":["../../../../../src/cli/commands/schedule/ScheduleCliSupport.ts"],"names":[],"mappings":"AAwDA,eAAO,MAAM,kBAAkB;mBACR,OAAO,CAAC,IAAI,CAAC;gCA1BG,OAAO,CAAC,IAAI,CAAC;EAmClD,CAAC;AAEH,eAAe,kBAAkB,CAAC"}
@@ -0,0 +1,55 @@
1
+ import { databaseConfig } from '../../../config/database.js';
2
+ import { registerDatabasesFromRuntimeConfig } from '../../../orm/DatabaseRuntimeRegistration.js';
3
+ import { SchedulerRuntime } from '../../../scheduler/SchedulerRuntime.js';
4
+ const isSchedule = (value) => {
5
+ if (value === undefined || value === null || typeof value !== 'object')
6
+ return false;
7
+ return 'name' in value && typeof value.name === 'string';
8
+ };
9
+ const loadScheduleModules = async () => {
10
+ const coreSchedules = await import('../../../schedules/index.js');
11
+ let appSchedules = {};
12
+ try {
13
+ appSchedules = (await import('../../../../app/Schedules/index.js'));
14
+ }
15
+ catch {
16
+ appSchedules = {};
17
+ }
18
+ return {
19
+ core: Object.values(coreSchedules).filter(isSchedule),
20
+ app: Object.values(appSchedules).filter(isSchedule),
21
+ };
22
+ };
23
+ const shutdownCliResources = async () => {
24
+ try {
25
+ const mod = await import('../../../orm/ConnectionManager.js');
26
+ await mod.ConnectionManager.shutdownIfInitialized();
27
+ }
28
+ catch {
29
+ // best-effort
30
+ }
31
+ try {
32
+ const mod = await import('../../../orm/Database.js');
33
+ await mod.resetDatabase();
34
+ }
35
+ catch {
36
+ // best-effort
37
+ }
38
+ try {
39
+ const mod = (await import('../../../tools/queue/LockProvider.js'));
40
+ await mod.closeLockProvider?.();
41
+ }
42
+ catch {
43
+ // best-effort
44
+ }
45
+ };
46
+ export const ScheduleCliSupport = Object.freeze({
47
+ async registerAll() {
48
+ registerDatabasesFromRuntimeConfig(databaseConfig);
49
+ const modules = await loadScheduleModules();
50
+ SchedulerRuntime.registerMany(modules.core, 'core');
51
+ SchedulerRuntime.registerMany(modules.app, 'app');
52
+ },
53
+ shutdownCliResources,
54
+ });
55
+ export default ScheduleCliSupport;
@@ -1 +1 @@
1
- {"version":3,"file":"ConfigManager.d.ts","sourceRoot":"","sources":["../../../../src/cli/config/ConfigManager.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,KAAK,EACV,aAAa,EAAC,MAAM,0BAA0B,CAAC;AAYjD,MAAM,WAAW,cAAc;IAC7B,IAAI,IAAI,OAAO,CAAC,aAAa,CAAC,CAAC;IAC/B,IAAI,CAAC,MAAM,CAAC,EAAE,aAAa,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAC5C,SAAS,IAAI,aAAa,CAAC;IAC3B,GAAG,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC;IAC1B,GAAG,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,OAAO,GAAG,IAAI,CAAC;IACvC,MAAM,IAAI,OAAO,CAAC,OAAO,CAAC,CAAC;IAC3B,MAAM,CAAC,aAAa,CAAC,EAAE,OAAO,CAAC,aAAa,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAC9D,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;IACvB,KAAK,CAAC,OAAO,EAAE,OAAO,CAAC,aAAa,CAAC,GAAG,IAAI,CAAC;IAC7C,MAAM,IAAI,MAAM,CAAC;IACjB,UAAU,IAAI,MAAM,EAAE,CAAC;CACxB;AAkHD;;;;GAIG;AACH,eAAO,MAAM,aAAa;IACxB;;OAEG;wBACgB,MAAM,GAAgC,cAAc;IAqCvE;;OAEG;6BAC4B,OAAO,CAAC,IAAI,CAAC;IAS5C;;OAEG;uBACsB,OAAO,CAAC,cAAc,CAAC;IAOhD;;OAEG;wBACuB,OAAO,CAAC,cAAc,CAAC;EAKjD,CAAC"}
1
+ {"version":3,"file":"ConfigManager.d.ts","sourceRoot":"","sources":["../../../../src/cli/config/ConfigManager.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,0BAA0B,CAAC;AAgB9D,MAAM,WAAW,cAAc;IAC7B,IAAI,IAAI,OAAO,CAAC,aAAa,CAAC,CAAC;IAC/B,IAAI,CAAC,MAAM,CAAC,EAAE,aAAa,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAC5C,SAAS,IAAI,aAAa,CAAC;IAC3B,GAAG,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC;IAC1B,GAAG,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,OAAO,GAAG,IAAI,CAAC;IACvC,MAAM,IAAI,OAAO,CAAC,OAAO,CAAC,CAAC;IAC3B,MAAM,CAAC,aAAa,CAAC,EAAE,OAAO,CAAC,aAAa,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAC9D,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;IACvB,KAAK,CAAC,OAAO,EAAE,OAAO,CAAC,aAAa,CAAC,GAAG,IAAI,CAAC;IAC7C,MAAM,IAAI,MAAM,CAAC;IACjB,UAAU,IAAI,MAAM,EAAE,CAAC;CACxB;AAqHD;;;;GAIG;AACH,eAAO,MAAM,aAAa;IACxB;;OAEG;wBACgB,MAAM,GAAgC,cAAc;IAqCvE;;OAEG;6BAC4B,OAAO,CAAC,IAAI,CAAC;IAU5C;;OAEG;uBACsB,OAAO,CAAC,cAAc,CAAC;IAOhD;;OAEG;wBACuB,OAAO,CAAC,cAAc,CAAC;EAKjD,CAAC"}
@@ -5,8 +5,11 @@
5
5
  import { ConfigPaths, DEFAULT_CONFIG, getConfigValue, setConfigValue, } from '../config/ConfigSchema.js';
6
6
  import { Logger } from '../../config/logger.js';
7
7
  import { ErrorFactory } from '../../exceptions/ZintrustError.js';
8
- import { fsPromises as fs } from '../../node-singletons/fs.js';
9
8
  import * as path from '../../node-singletons/path.js';
9
+ const loadFsPromises = async () => {
10
+ const mod = await import('../../node-singletons/fs.js');
11
+ return mod.fsPromises;
12
+ };
10
13
  /**
11
14
  * Deep merge helper
12
15
  */
@@ -27,6 +30,7 @@ const deepMerge = (target, source) => {
27
30
  */
28
31
  async function loadConfig(state) {
29
32
  try {
33
+ const fs = await loadFsPromises();
30
34
  const content = await fs.readFile(state.configPath, 'utf-8');
31
35
  state.config = JSON.parse(content);
32
36
  return state.config;
@@ -50,6 +54,7 @@ async function saveConfig(state, newConfig) {
50
54
  throw ErrorFactory.createConfigError('No configuration to save');
51
55
  }
52
56
  try {
57
+ const fs = await loadFsPromises();
53
58
  // Ensure directory exists
54
59
  const dir = path.dirname(state.configPath);
55
60
  if (dir !== '.') {
@@ -77,6 +82,7 @@ function getConfig(state) {
77
82
  */
78
83
  async function configExists(configPath) {
79
84
  try {
85
+ const fs = await loadFsPromises();
80
86
  await fs.access(configPath);
81
87
  return true;
82
88
  }
@@ -148,6 +154,7 @@ export const ConfigManager = Object.freeze({
148
154
  */
149
155
  async ensureGlobalConfigDir() {
150
156
  try {
157
+ const fs = await loadFsPromises();
151
158
  await fs.mkdir(ConfigPaths.GLOBAL_DIR, { recursive: true });
152
159
  }
153
160
  catch (err) {
@@ -1 +1 @@
1
- {"version":3,"file":"D1SqlMigrations.d.ts","sourceRoot":"","sources":["../../../../src/cli/d1/D1SqlMigrations.ts"],"names":[],"mappings":"AAYA,KAAK,6BAA6B,GAAG;IACnC,WAAW,EAAE,MAAM,CAAC;IACpB,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;IAClB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,aAAa,CAAC,EAAE,OAAO,CAAC;IACxB,kBAAkB,CAAC,EAAE,MAAM,CAAC;IAC5B,SAAS,EAAE,MAAM,CAAC;CACnB,CAAC;AAEF,KAAK,qBAAqB,GAAG;IAC3B,UAAU,EAAE,MAAM,CAAC;IACnB,cAAc,EAAE,MAAM,CAAC;IACvB,cAAc,EAAE,MAAM,CAAC;IACvB,UAAU,EAAE,MAAM,EAAE,CAAC;CACtB,CAAC;AAoOF,eAAO,MAAM,eAAe;0BACE,6BAA6B,GAAG,OAAO,CAAC,qBAAqB,EAAE,CAAC;EAmC5F,CAAC"}
1
+ {"version":3,"file":"D1SqlMigrations.d.ts","sourceRoot":"","sources":["../../../../src/cli/d1/D1SqlMigrations.ts"],"names":[],"mappings":"AAYA,KAAK,6BAA6B,GAAG;IACnC,WAAW,EAAE,MAAM,CAAC;IACpB,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;IAClB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,aAAa,CAAC,EAAE,OAAO,CAAC;IACxB,kBAAkB,CAAC,EAAE,MAAM,CAAC;IAC5B,SAAS,EAAE,MAAM,CAAC;CACnB,CAAC;AAEF,KAAK,qBAAqB,GAAG;IAC3B,UAAU,EAAE,MAAM,CAAC;IACnB,cAAc,EAAE,MAAM,CAAC;IACvB,cAAc,EAAE,MAAM,CAAC;IACvB,UAAU,EAAE,MAAM,EAAE,CAAC;CACtB,CAAC;AA6OF,eAAO,MAAM,eAAe;0BACE,6BAA6B,GAAG,OAAO,CAAC,qBAAqB,EAAE,CAAC;EAmC5F,CAAC"}
@@ -25,6 +25,16 @@ const normalizeSql = (sql) => {
25
25
  return '';
26
26
  return trimmed.endsWith(';') ? trimmed : `${trimmed};`;
27
27
  };
28
+ const normalizeAlterTableAddColumn = (sql) => {
29
+ const lowered = sql.trimStart().toLowerCase();
30
+ if (!lowered.startsWith('alter table'))
31
+ return sql;
32
+ if (!/\badd\b/i.test(sql))
33
+ return sql;
34
+ if (/\badd\s+column\b/i.test(sql))
35
+ return sql;
36
+ return sql.replace(/\bADD\b\s+(?!COLUMN\b)/i, 'ADD COLUMN ');
37
+ };
28
38
  const interpolateSql = (sql, parameters) => {
29
39
  const placeholders = (sql.match(/\?/g) ?? []).length;
30
40
  if (placeholders !== parameters.length) {
@@ -90,7 +100,7 @@ const captureSql = (onSql, sql, parameters) => {
90
100
  const compiled = parameters.length > 0 ? interpolateSql(sql, parameters) : sql;
91
101
  if (!isMutatingSql(compiled))
92
102
  return;
93
- const normalized = normalizeSql(compiled);
103
+ const normalized = normalizeSql(normalizeAlterTableAddColumn(compiled));
94
104
  if (normalized !== '')
95
105
  onSql(normalized);
96
106
  };
@@ -1 +1 @@
1
- {"version":3,"file":"WranglerConfig.d.ts","sourceRoot":"","sources":["../../../../src/cli/d1/WranglerConfig.ts"],"names":[],"mappings":"AA2HA,eAAO,MAAM,cAAc;oCACO,MAAM,WAAW,MAAM,GAAG,MAAM;EAqBhE,CAAC"}
1
+ {"version":3,"file":"WranglerConfig.d.ts","sourceRoot":"","sources":["../../../../src/cli/d1/WranglerConfig.ts"],"names":[],"mappings":"AA+KA,eAAO,MAAM,cAAc;oCACO,MAAM,WAAW,MAAM,GAAG,MAAM;EAqBhE,CAAC"}
@@ -98,6 +98,38 @@ const stripJsonc = (input) => {
98
98
  }
99
99
  return out.join('');
100
100
  };
101
+ const createTrailingCommaState = () => ({
102
+ inString: false,
103
+ escaped: false,
104
+ });
105
+ const isWhitespace = (ch) => ch === ' ' || ch === '\n' || ch === '\r' || ch === '\t';
106
+ const shouldDropTrailingComma = (input, fromIndex) => {
107
+ let j = fromIndex;
108
+ while (j < input.length) {
109
+ const next = input[j] ?? '';
110
+ if (isWhitespace(next)) {
111
+ j += 1;
112
+ continue;
113
+ }
114
+ return next === '}' || next === ']';
115
+ }
116
+ return true;
117
+ };
118
+ const stripTrailingCommas = (input) => {
119
+ const state = createTrailingCommaState();
120
+ const out = [];
121
+ for (let i = 0; i < input.length; i += 1) {
122
+ const ch = input[i] ?? '';
123
+ if (handleString(state, ch, out))
124
+ continue;
125
+ if (tryStartString(state, ch, out))
126
+ continue;
127
+ if (ch === ',' && shouldDropTrailingComma(input, i + 1))
128
+ continue;
129
+ out.push(ch);
130
+ }
131
+ return out.join('');
132
+ };
101
133
  export const WranglerConfig = Object.freeze({
102
134
  getD1MigrationsDir(projectRoot, dbName) {
103
135
  const configPath = path.join(projectRoot, 'wrangler.jsonc');
@@ -105,12 +137,12 @@ export const WranglerConfig = Object.freeze({
105
137
  return 'migrations';
106
138
  try {
107
139
  const raw = fs.readFileSync(configPath, 'utf8');
108
- const parsed = JSON.parse(stripJsonc(raw));
140
+ const parsed = JSON.parse(stripTrailingCommas(stripJsonc(raw)));
109
141
  const list = parsed.d1_databases;
110
142
  if (!Array.isArray(list) || list.length === 0)
111
143
  return 'migrations';
112
144
  const match = typeof dbName === 'string'
113
- ? list.find((d) => d.database_name === dbName)
145
+ ? list.find((d) => d.binding === dbName || d.database_name === dbName)
114
146
  : (list[0] ?? undefined);
115
147
  const dir = match?.migrations_dir;
116
148
  return typeof dir === 'string' && dir.trim() !== '' ? dir : 'migrations';
@@ -1 +1 @@
1
- {"version":3,"file":"VersionChecker.d.ts","sourceRoot":"","sources":["../../../../src/cli/services/VersionChecker.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAc,KAAK,aAAa,EAAE,MAAM,kBAAkB,CAAC;AAKlE,UAAU,kBAAkB;IAC1B,cAAc,EAAE,MAAM,CAAC;IACvB,aAAa,EAAE,MAAM,CAAC;IACtB,UAAU,EAAE,OAAO,CAAC;IACpB,eAAe,EAAE,OAAO,CAAC;CAC1B;AAED,UAAU,kBAAkB;IAC1B,OAAO,EAAE,OAAO,CAAC;IACjB,aAAa,EAAE,MAAM,CAAC;IACtB,gBAAgB,EAAE,OAAO,CAAC;CAC3B;AAED,eAAO,MAAM,cAAc;IACzB;;OAEG;qCAC8B,MAAM,GAAG,MAAM,GAAG,IAAI;IAcvD;;OAEG;yBACkB,MAAM;IAkB3B;;OAEG;iBACU,kBAAkB;IAQ/B;;OAEG;0BACmB,OAAO;IAqC7B;;OAEG;oCAC6B,MAAM,GAAG,MAAM,GAAG,IAAI;IAwBtD;;OAEG;gCACyB,MAAM,GAAG,IAAI;IAezC;;OAEG;0BACyB,OAAO,CAAC,MAAM,CAAC;IA6B3C;;OAEG;4BAC2B,OAAO,CAAC,aAAa,CAAC;IAQpD;;OAEG;uBACgB,MAAM;IAIzB;;OAEG;qCAC8B,OAAO,GAAG,MAAM;IAuBjD;;OAEG;8BACuB,OAAO,GAAG,IAAI,IAAI,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC;IAInE;;OAEG;uCACgC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,MAAM,GAAG,IAAI;IAY1E;;OAEG;oCAC6B,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,MAAM,GAAG,IAAI;IAQvE;;OAEG;6BACsB,MAAM,UAAU,MAAM,GAAG,MAAM;IAuBxD;;OAEG;oBACmB,OAAO,CAAC,kBAAkB,GAAG,IAAI,CAAC;IAyBxD;;OAEG;sCAC+B,kBAAkB,GAAG,IAAI;IA4B3D;;OAEG;uBACsB,OAAO,CAAC,IAAI,CAAC;EAUtC,CAAC"}
1
+ {"version":3,"file":"VersionChecker.d.ts","sourceRoot":"","sources":["../../../../src/cli/services/VersionChecker.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAc,KAAK,aAAa,EAAE,MAAM,kBAAkB,CAAC;AAKlE,UAAU,kBAAkB;IAC1B,cAAc,EAAE,MAAM,CAAC;IACvB,aAAa,EAAE,MAAM,CAAC;IACtB,UAAU,EAAE,OAAO,CAAC;IACpB,eAAe,EAAE,OAAO,CAAC;CAC1B;AAED,UAAU,kBAAkB;IAC1B,OAAO,EAAE,OAAO,CAAC;IACjB,aAAa,EAAE,MAAM,CAAC;IACtB,gBAAgB,EAAE,OAAO,CAAC;CAC3B;AAED,eAAO,MAAM,cAAc;IACzB;;OAEG;qCAC8B,MAAM,GAAG,MAAM,GAAG,IAAI;IAcvD;;OAEG;yBACkB,MAAM;IAkB3B;;OAEG;iBACU,kBAAkB;IAQ/B;;OAEG;0BACmB,OAAO;IAyC7B;;OAEG;oCAC6B,MAAM,GAAG,MAAM,GAAG,IAAI;IAwBtD;;OAEG;gCACyB,MAAM,GAAG,IAAI;IAezC;;OAEG;0BACyB,OAAO,CAAC,MAAM,CAAC;IA6B3C;;OAEG;4BAC2B,OAAO,CAAC,aAAa,CAAC;IAQpD;;OAEG;uBACgB,MAAM;IAIzB;;OAEG;qCAC8B,OAAO,GAAG,MAAM;IAuBjD;;OAEG;8BACuB,OAAO,GAAG,IAAI,IAAI,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC;IAInE;;OAEG;uCACgC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,MAAM,GAAG,IAAI;IAY1E;;OAEG;oCAC6B,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,MAAM,GAAG,IAAI;IAQvE;;OAEG;6BACsB,MAAM,UAAU,MAAM,GAAG,MAAM;IAuBxD;;OAEG;oBACmB,OAAO,CAAC,kBAAkB,GAAG,IAAI,CAAC;IAyBxD;;OAEG;sCAC+B,kBAAkB,GAAG,IAAI;IA4B3D;;OAEG;uBACsB,OAAO,CAAC,IAAI,CAAC;EAUtC,CAAC"}
@@ -68,7 +68,11 @@ export const VersionChecker = Object.freeze({
68
68
  args.has('--version') ||
69
69
  args.has('help') ||
70
70
  args.has('new') ||
71
- args.has('migrate')) {
71
+ args.has('migrate') ||
72
+ // One-shot schedule commands should exit cleanly and not keep the event loop alive
73
+ // due to background network requests/keep-alive sockets.
74
+ args.has('schedule:run') ||
75
+ args.has('schedule:list')) {
72
76
  return false;
73
77
  }
74
78
  // Check last check time
@@ -1 +1 @@
1
- {"version":3,"file":"DatabaseCliUtils.d.ts","sourceRoot":"","sources":["../../../../src/cli/utils/DatabaseCliUtils.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,YAAY,EAAE,MAAM,kBAAkB,CAAC;AAGrE,OAAO,KAAK,EAAE,cAAc,IAAI,iBAAiB,EAAE,MAAM,sBAAsB,CAAC;AAEhF,MAAM,MAAM,gBAAgB,GAAG;IAC7B,MAAM,EAAE,MAAM,CAAC;IACf,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB,CAAC;AAEF,eAAO,MAAM,wBAAwB,GAAI,MAAM,gBAAgB,KAAG,iBAkCjE,CAAC;AAEF,eAAO,MAAM,kBAAkB,GAAI,SAAS,cAAc,KAAG,MAG5D,CAAC;AAEF,eAAO,MAAM,oBAAoB,GAAU,QAAQ;IACjD,GAAG,EAAE,YAAY,CAAC;IAClB,WAAW,EAAE,OAAO,CAAC;IACrB,OAAO,EAAE,MAAM,CAAC;IAChB,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB,KAAK,CAAC,EAAE,OAAO,CAAC;CACjB,KAAG,OAAO,CAAC,OAAO,CAalB,CAAC"}
1
+ {"version":3,"file":"DatabaseCliUtils.d.ts","sourceRoot":"","sources":["../../../../src/cli/utils/DatabaseCliUtils.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,YAAY,EAAE,MAAM,kBAAkB,CAAC;AAIrE,OAAO,KAAK,EAAE,cAAc,IAAI,iBAAiB,EAAE,MAAM,sBAAsB,CAAC;AAEhF,MAAM,MAAM,gBAAgB,GAAG;IAC7B,MAAM,EAAE,MAAM,CAAC;IACf,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB,CAAC;AAEF,eAAO,MAAM,wBAAwB,GAAI,MAAM,gBAAgB,KAAG,iBAwCjE,CAAC;AAEF,eAAO,MAAM,kBAAkB,GAAI,SAAS,cAAc,KAAG,MAG5D,CAAC;AAEF,eAAO,MAAM,oBAAoB,GAAU,QAAQ;IACjD,GAAG,EAAE,YAAY,CAAC;IAClB,WAAW,EAAE,OAAO,CAAC;IACrB,OAAO,EAAE,MAAM,CAAC;IAChB,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB,KAAK,CAAC,EAAE,OAAO,CAAC;CACjB,KAAG,OAAO,CAAC,OAAO,CAalB,CAAC"}
@@ -1,7 +1,12 @@
1
1
  import { PromptHelper } from '../PromptHelper.js';
2
2
  import { Env } from '../../config/env.js';
3
+ import { ErrorFactory } from '../../exceptions/ZintrustError.js';
3
4
  export const mapConnectionToOrmConfig = (conn) => {
4
5
  switch (conn.driver) {
6
+ case 'd1':
7
+ return { driver: 'd1' };
8
+ case 'd1-remote':
9
+ return { driver: 'd1-remote' };
5
10
  case 'sqlite':
6
11
  return { driver: 'sqlite', database: conn.database ?? ':memory:' };
7
12
  case 'postgresql':
@@ -32,7 +37,7 @@ export const mapConnectionToOrmConfig = (conn) => {
32
37
  password: conn.password,
33
38
  };
34
39
  default:
35
- return { driver: 'sqlite', database: ':memory:' };
40
+ throw ErrorFactory.createCliError(`Unsupported database driver for ORM migrations: ${String(conn.driver)}`);
36
41
  }
37
42
  };
38
43
  export const parseRollbackSteps = (options) => {
@@ -1 +1 @@
1
- {"version":3,"file":"EnvFileLoader.d.ts","sourceRoot":"","sources":["../../../../src/cli/utils/EnvFileLoader.ts"],"names":[],"mappings":"AAQA,KAAK,QAAQ,GAAG,aAAa,GAAG,YAAY,GAAG,SAAS,CAAC;AAoGzD,KAAK,WAAW,GAAG;IACjB,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,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;AAEF,KAAK,YAAY,GAAG;IAClB,OAAO,CAAC,EAAE,QAAQ,CAAC;IACnB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB,CAAC;AA2FF,eAAO,MAAM,aAAa;qBAlEH,WAAW,KAAQ,SAAS;wBAmC1B,SAAS;mCAEI,YAAY,KAAG,IAAI;oBA2BpC,SAAS;EAO5B,CAAC"}
1
+ {"version":3,"file":"EnvFileLoader.d.ts","sourceRoot":"","sources":["../../../../src/cli/utils/EnvFileLoader.ts"],"names":[],"mappings":"AAQA,KAAK,QAAQ,GAAG,aAAa,GAAG,YAAY,GAAG,SAAS,CAAC;AAwHzD,KAAK,WAAW,GAAG;IACjB,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,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;AAEF,KAAK,YAAY,GAAG;IAClB,OAAO,CAAC,EAAE,QAAQ,CAAC;IACnB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB,CAAC;AA2FF,eAAO,MAAM,aAAa;qBAlEH,WAAW,KAAQ,SAAS;wBAmC1B,SAAS;mCAEI,YAAY,KAAG,IAAI;oBA2BpC,SAAS;EAO5B,CAAC"}
@@ -1,6 +1,25 @@
1
1
  import { Env } from '../../config/env.js';
2
2
  import { existsSync, readFileSync } from '../../node-singletons/fs.js';
3
3
  import { join } from '../../node-singletons/path.js';
4
+ const safeEnvGet = (key, defaultValue = '') => {
5
+ const envAny = Env;
6
+ if (typeof envAny.get === 'function')
7
+ return envAny.get(key, defaultValue);
8
+ const fromProcess = typeof process === 'undefined' ? undefined : process.env?.[key];
9
+ if (typeof fromProcess === 'string' && fromProcess !== '')
10
+ return fromProcess;
11
+ return defaultValue;
12
+ };
13
+ const safeEnvSet = (key, value) => {
14
+ const envAny = Env;
15
+ if (typeof envAny.set === 'function') {
16
+ envAny.set(key, value);
17
+ return;
18
+ }
19
+ if (typeof process === 'undefined' || process.env === undefined)
20
+ return;
21
+ process.env[key] = value;
22
+ };
4
23
  const normalizeAppMode = (value) => {
5
24
  const normalized = value.trim().toLowerCase();
6
25
  if (normalized === 'production' || normalized === 'pro' || normalized === 'prod')
@@ -62,13 +81,13 @@ const parseEnvFile = (raw) => {
62
81
  };
63
82
  const applyToProcessEnv = (values, overrideExisting) => {
64
83
  for (const [key, value] of Object.entries(values)) {
65
- if (!overrideExisting && Env.get(key, '') !== '')
84
+ if (!overrideExisting && safeEnvGet(key, '') !== '')
66
85
  continue;
67
- Env.set(key, value);
86
+ safeEnvSet(key, value);
68
87
  }
69
88
  // Compatibility helpers
70
- if (Env.get('PORT', '') === '' && Env.get('APP_PORT', '') !== '') {
71
- Env.set('PORT', Env.get('APP_PORT', ''));
89
+ if (safeEnvGet('PORT', '') === '' && safeEnvGet('APP_PORT', '') !== '') {
90
+ safeEnvSet('PORT', safeEnvGet('APP_PORT', ''));
72
91
  }
73
92
  };
74
93
  const readEnvFileIfExists = (cwd, filename) => {
@@ -79,7 +98,7 @@ const readEnvFileIfExists = (cwd, filename) => {
79
98
  return parseEnvFile(raw);
80
99
  };
81
100
  const resolveAppMode = (cwd) => {
82
- const existing = Env.get('NODE_ENV', '');
101
+ const existing = safeEnvGet('NODE_ENV', '');
83
102
  if (existing.trim() !== '')
84
103
  return normalizeAppMode(existing);
85
104
  const fromDotEnv = readEnvFileIfExists(cwd, '.env');
@@ -131,7 +150,7 @@ const load = (options = {}) => {
131
150
  }
132
151
  // Set NODE_ENV to the normalized mode if we have one (after applying files)
133
152
  if (mode !== undefined) {
134
- Env.set('NODE_ENV', mode);
153
+ safeEnvSet('NODE_ENV', mode);
135
154
  }
136
155
  cached = { loadedFiles: files, mode };
137
156
  return cached;
@@ -141,21 +160,21 @@ const applyCliOverrides = (overrides) => {
141
160
  // Ensure base env is loaded first.
142
161
  ensureLoaded();
143
162
  if (typeof overrides.runtime === 'string' && overrides.runtime.trim() !== '') {
144
- Env.set('RUNTIME', overrides.runtime.trim());
163
+ safeEnvSet('RUNTIME', overrides.runtime.trim());
145
164
  }
146
165
  if (typeof overrides.nodeEnv === 'string') {
147
- Env.set('NODE_ENV', overrides.nodeEnv);
166
+ safeEnvSet('NODE_ENV', overrides.nodeEnv);
148
167
  }
149
168
  if (typeof overrides.port === 'number') {
150
- Env.set('PORT', String(overrides.port));
151
- Env.set('APP_PORT', String(overrides.port));
169
+ safeEnvSet('PORT', String(overrides.port));
170
+ safeEnvSet('APP_PORT', String(overrides.port));
152
171
  }
153
172
  // Keep PORT/APP_PORT in sync if only one exists.
154
- if (Env.get('PORT', '') === '' && Env.get('APP_PORT', '') !== '') {
155
- Env.set('PORT', Env.get('APP_PORT', ''));
173
+ if (safeEnvGet('PORT', '') === '' && safeEnvGet('APP_PORT', '') !== '') {
174
+ safeEnvSet('PORT', safeEnvGet('APP_PORT', ''));
156
175
  }
157
- if (Env.get('APP_PORT', '') === '' && Env.get('PORT', '') !== '') {
158
- Env.set('APP_PORT', Env.get('PORT', ''));
176
+ if (safeEnvGet('APP_PORT', '') === '' && safeEnvGet('PORT', '') !== '') {
177
+ safeEnvSet('APP_PORT', safeEnvGet('PORT', ''));
159
178
  }
160
179
  };
161
180
  const getState = () => ensureLoaded();
package/src/cli.d.ts ADDED
@@ -0,0 +1,5 @@
1
+ export { BaseCommand } from './cli/BaseCommand';
2
+ export type { CommandOptions } from './cli/BaseCommand';
3
+ export { CLI } from './cli/CLI';
4
+ export { ErrorHandler, EXIT_CODES } from './cli/ErrorHandler';
5
+ //# sourceMappingURL=cli.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cli.d.ts","sourceRoot":"","sources":["../../src/cli.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAC;AAC/C,YAAY,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAC;AACvD,OAAO,EAAE,GAAG,EAAE,MAAM,UAAU,CAAC;AAC/B,OAAO,EAAE,YAAY,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC"}
package/src/cli.js ADDED
@@ -0,0 +1,4 @@
1
+ // CLI utilities (for build tools and scripting)
2
+ export { BaseCommand } from './cli/BaseCommand.js';
3
+ export { CLI } from './cli/CLI.js';
4
+ export { ErrorHandler, EXIT_CODES } from './cli/ErrorHandler.js';
@@ -1,3 +1,3 @@
1
- export { collect, Collection } from '../collections/Collection';
2
- export type { ICollection, PrimitiveKey } from '../collections/Collection';
1
+ export { collect, Collection } from './Collection';
2
+ export type { ICollection, PrimitiveKey } from './Collection';
3
3
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/collections/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,UAAU,EAAE,MAAM,0BAA0B,CAAC;AAC/D,YAAY,EAAE,WAAW,EAAE,YAAY,EAAE,MAAM,0BAA0B,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/collections/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,UAAU,EAAE,MAAM,yBAAyB,CAAC;AAC9D,YAAY,EAAE,WAAW,EAAE,YAAY,EAAE,MAAM,yBAAyB,CAAC"}
@@ -1 +1 @@
1
- export { collect, Collection } from '../collections/Collection.js';
1
+ export { collect, Collection } from './Collection.js';
@@ -1 +1 @@
1
- {"version":3,"file":"RemoteSignedJson.d.ts","sourceRoot":"","sources":["../../../src/common/RemoteSignedJson.ts"],"names":[],"mappings":"AAIA,MAAM,MAAM,wBAAwB,GAAG;IACrC,OAAO,EAAE,MAAM,CAAC;IAChB,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,MAAM,CAAC;IACf,SAAS,EAAE,MAAM,CAAC;IAClB,0BAA0B,CAAC,EAAE,MAAM,CAAC;IAEpC,iBAAiB,EAAE,MAAM,CAAC;IAC1B,yBAAyB,EAAE,MAAM,CAAC;IAElC,QAAQ,EAAE;QACR,YAAY,EAAE,MAAM,CAAC;QACrB,SAAS,EAAE,MAAM,CAAC;QAClB,WAAW,EAAE,MAAM,CAAC;QACpB,QAAQ,EAAE,MAAM,CAAC;QACjB,KAAK,EAAE,MAAM,CAAC;QACd,QAAQ,EAAE,MAAM,CAAC;KAClB,CAAC;CACH,CAAC;AAiEF,eAAO,MAAM,gBAAgB;YACb,CAAC,YACH,wBAAwB,QAC5B,MAAM,WACH,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAC/B,OAAO,CAAC,CAAC,CAAC;EAuDb,CAAC;AAEH,eAAe,gBAAgB,CAAC"}
1
+ {"version":3,"file":"RemoteSignedJson.d.ts","sourceRoot":"","sources":["../../../src/common/RemoteSignedJson.ts"],"names":[],"mappings":"AAKA,MAAM,MAAM,wBAAwB,GAAG;IACrC,OAAO,EAAE,MAAM,CAAC;IAChB,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,MAAM,CAAC;IACf,SAAS,EAAE,MAAM,CAAC;IAClB,0BAA0B,CAAC,EAAE,MAAM,CAAC;IAEpC,iBAAiB,EAAE,MAAM,CAAC;IAC1B,yBAAyB,EAAE,MAAM,CAAC;IAElC,QAAQ,EAAE;QACR,YAAY,EAAE,MAAM,CAAC;QACrB,SAAS,EAAE,MAAM,CAAC;QAClB,WAAW,EAAE,MAAM,CAAC;QACpB,QAAQ,EAAE,MAAM,CAAC;QACjB,KAAK,EAAE,MAAM,CAAC;QACd,QAAQ,EAAE,MAAM,CAAC;KAClB,CAAC;CACH,CAAC;AAoHF,eAAO,MAAM,gBAAgB;YACb,CAAC,YACH,wBAAwB,QAC5B,MAAM,WACH,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAC/B,OAAO,CAAC,CAAC,CAAC;EAgCb,CAAC;AAEH,eAAe,gBAAgB,CAAC"}