@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.
- package/package.json +17 -1
- package/src/boot/bootstrap.js +27 -11
- package/src/boot/registry/runtime.d.ts.map +1 -1
- package/src/boot/registry/runtime.js +11 -0
- package/src/cli/CLI.d.ts.map +1 -1
- package/src/cli/CLI.js +12 -0
- package/src/cli/commands/ConfigCommand.d.ts.map +1 -1
- package/src/cli/commands/ConfigCommand.js +3 -5
- package/src/cli/commands/D1LearnCommand.d.ts +9 -0
- package/src/cli/commands/D1LearnCommand.d.ts.map +1 -0
- package/src/cli/commands/D1LearnCommand.js +143 -0
- package/src/cli/commands/D1MigrateCommand.d.ts.map +1 -1
- package/src/cli/commands/D1MigrateCommand.js +55 -16
- package/src/cli/commands/InitContainerCommand.d.ts.map +1 -1
- package/src/cli/commands/InitContainerCommand.js +21 -6
- package/src/cli/commands/InitEcosystemCommand.d.ts +6 -0
- package/src/cli/commands/InitEcosystemCommand.d.ts.map +1 -0
- package/src/cli/commands/InitEcosystemCommand.js +51 -0
- package/src/cli/commands/MigrateCommand.d.ts.map +1 -1
- package/src/cli/commands/MigrateCommand.js +78 -36
- package/src/cli/commands/MigrateWorkerCommand.d.ts.map +1 -1
- package/src/cli/commands/MigrateWorkerCommand.js +36 -2
- package/src/cli/commands/PutCommand.d.ts +6 -0
- package/src/cli/commands/PutCommand.d.ts.map +1 -0
- package/src/cli/commands/PutCommand.js +173 -0
- package/src/cli/commands/QueueRecoveryCommand.d.ts.map +1 -1
- package/src/cli/commands/QueueRecoveryCommand.js +113 -14
- package/src/cli/commands/ScheduleListCommand.d.ts +6 -0
- package/src/cli/commands/ScheduleListCommand.d.ts.map +1 -0
- package/src/cli/commands/ScheduleListCommand.js +62 -0
- package/src/cli/commands/ScheduleRunCommand.d.ts +6 -0
- package/src/cli/commands/ScheduleRunCommand.d.ts.map +1 -0
- package/src/cli/commands/ScheduleRunCommand.js +32 -0
- package/src/cli/commands/ScheduleStartCommand.d.ts +6 -0
- package/src/cli/commands/ScheduleStartCommand.d.ts.map +1 -0
- package/src/cli/commands/ScheduleStartCommand.js +40 -0
- package/src/cli/commands/SecretsCommand.d.ts.map +1 -1
- package/src/cli/commands/SecretsCommand.js +2 -2
- package/src/cli/commands/schedule/ScheduleCliSupport.d.ts +6 -0
- package/src/cli/commands/schedule/ScheduleCliSupport.d.ts.map +1 -0
- package/src/cli/commands/schedule/ScheduleCliSupport.js +55 -0
- package/src/cli/config/ConfigManager.d.ts.map +1 -1
- package/src/cli/config/ConfigManager.js +8 -1
- package/src/cli/d1/D1SqlMigrations.d.ts.map +1 -1
- package/src/cli/d1/D1SqlMigrations.js +11 -1
- package/src/cli/d1/WranglerConfig.d.ts.map +1 -1
- package/src/cli/d1/WranglerConfig.js +34 -2
- package/src/cli/services/VersionChecker.d.ts.map +1 -1
- package/src/cli/services/VersionChecker.js +5 -1
- package/src/cli/utils/DatabaseCliUtils.d.ts.map +1 -1
- package/src/cli/utils/DatabaseCliUtils.js +6 -1
- package/src/cli/utils/EnvFileLoader.d.ts.map +1 -1
- package/src/cli/utils/EnvFileLoader.js +33 -14
- package/src/cli.d.ts +5 -0
- package/src/cli.d.ts.map +1 -0
- package/src/cli.js +4 -0
- package/src/collections/index.d.ts +2 -2
- package/src/collections/index.d.ts.map +1 -1
- package/src/collections/index.js +1 -1
- package/src/common/RemoteSignedJson.d.ts.map +1 -1
- package/src/common/RemoteSignedJson.js +49 -23
- package/src/common/utility.d.ts.map +1 -1
- package/src/common/utility.js +2 -6
- package/src/config/cloudflare.d.ts.map +1 -1
- package/src/config/cloudflare.js +19 -8
- package/src/config/env.js +2 -2
- package/src/helper/index.d.ts +225 -0
- package/src/helper/index.d.ts.map +1 -0
- package/src/helper/index.js +347 -0
- package/src/index.d.ts +3 -6
- package/src/index.d.ts.map +1 -1
- package/src/index.js +7 -9
- package/src/migrations/MigrationDiscovery.d.ts.map +1 -1
- package/src/migrations/MigrationDiscovery.js +2 -1
- package/src/orm/DatabaseAdapter.d.ts +1 -0
- package/src/orm/DatabaseAdapter.d.ts.map +1 -1
- package/src/orm/SchemaStatemenWriter.d.ts +15 -0
- package/src/orm/SchemaStatemenWriter.d.ts.map +1 -0
- package/src/orm/SchemaStatemenWriter.js +78 -0
- package/src/orm/adapters/D1Adapter.d.ts.map +1 -1
- package/src/orm/adapters/D1Adapter.js +52 -2
- package/src/orm/adapters/D1RemoteAdapter.d.ts.map +1 -1
- package/src/orm/adapters/D1RemoteAdapter.js +137 -89
- package/src/orm/adapters/MySQLProxyAdapter.d.ts.map +1 -1
- package/src/orm/adapters/MySQLProxyAdapter.js +100 -81
- package/src/orm/adapters/PostgreSQLProxyAdapter.d.ts.map +1 -1
- package/src/orm/adapters/PostgreSQLProxyAdapter.js +26 -10
- package/src/orm/adapters/SqlProxyAdapterUtils.d.ts.map +1 -1
- package/src/orm/adapters/SqlProxyAdapterUtils.js +2 -1
- package/src/orm/adapters/SqlProxyRegistryMode.d.ts +12 -0
- package/src/orm/adapters/SqlProxyRegistryMode.d.ts.map +1 -0
- package/src/orm/adapters/SqlProxyRegistryMode.js +24 -0
- package/src/orm/adapters/SqlServerProxyAdapter.d.ts +3 -0
- package/src/orm/adapters/SqlServerProxyAdapter.d.ts.map +1 -1
- package/src/orm/adapters/SqlServerProxyAdapter.js +125 -117
- package/src/orm/migrations/MigrationStore.js +1 -1
- package/src/proxy/ProxyRequestParsing.d.ts +9 -0
- package/src/proxy/ProxyRequestParsing.d.ts.map +1 -0
- package/src/proxy/ProxyRequestParsing.js +16 -0
- package/src/proxy/RequestValidator.d.ts.map +1 -1
- package/src/proxy/RequestValidator.js +2 -1
- package/src/proxy/SigningService.js +2 -2
- package/src/proxy/SqlProxyDbOverrides.d.ts +17 -0
- package/src/proxy/SqlProxyDbOverrides.d.ts.map +1 -0
- package/src/proxy/SqlProxyDbOverrides.js +1 -0
- package/src/proxy/SqlProxyServerDeps.d.ts +12 -0
- package/src/proxy/SqlProxyServerDeps.d.ts.map +1 -0
- package/src/proxy/SqlProxyServerDeps.js +9 -0
- package/src/proxy/StatementPayloadValidator.d.ts +13 -0
- package/src/proxy/StatementPayloadValidator.d.ts.map +1 -0
- package/src/proxy/StatementPayloadValidator.js +18 -0
- package/src/proxy/StatementRegistryLoader.d.ts +2 -0
- package/src/proxy/StatementRegistryLoader.d.ts.map +1 -0
- package/src/proxy/StatementRegistryLoader.js +36 -0
- package/src/proxy/StatementRegistryResolver.d.ts +15 -0
- package/src/proxy/StatementRegistryResolver.d.ts.map +1 -0
- package/src/proxy/StatementRegistryResolver.js +34 -0
- package/src/proxy/d1/ZintrustD1Proxy.d.ts +2 -1
- package/src/proxy/d1/ZintrustD1Proxy.d.ts.map +1 -1
- package/src/proxy/d1/ZintrustD1Proxy.js +2 -1
- package/src/proxy/isMutatingSql.d.ts +2 -0
- package/src/proxy/isMutatingSql.d.ts.map +1 -0
- package/src/proxy/isMutatingSql.js +12 -0
- package/src/proxy/kv/ZintrustKvProxy.d.ts +2 -1
- package/src/proxy/kv/ZintrustKvProxy.d.ts.map +1 -1
- package/src/proxy/kv/ZintrustKvProxy.js +2 -1
- package/src/proxy/mysql/MySqlProxyServer.d.ts +2 -8
- package/src/proxy/mysql/MySqlProxyServer.d.ts.map +1 -1
- package/src/proxy/mysql/MySqlProxyServer.js +84 -51
- package/src/proxy/postgres/PostgresProxyServer.d.ts +2 -8
- package/src/proxy/postgres/PostgresProxyServer.d.ts.map +1 -1
- package/src/proxy/postgres/PostgresProxyServer.js +86 -48
- package/src/proxy/smtp/SmtpProxyServer.d.ts.map +1 -1
- package/src/proxy/smtp/SmtpProxyServer.js +6 -5
- package/src/proxy/sqlserver/SqlServerProxyServer.d.ts +2 -8
- package/src/proxy/sqlserver/SqlServerProxyServer.d.ts.map +1 -1
- package/src/proxy/sqlserver/SqlServerProxyServer.js +84 -49
- package/src/proxy.d.ts +4 -0
- package/src/proxy.d.ts.map +1 -0
- package/src/proxy.js +3 -0
- package/src/scheduler/Schedule.d.ts +36 -0
- package/src/scheduler/Schedule.d.ts.map +1 -0
- package/src/scheduler/Schedule.js +197 -0
- package/src/scheduler/ScheduleHttpGateway.d.ts +8 -0
- package/src/scheduler/ScheduleHttpGateway.d.ts.map +1 -0
- package/src/scheduler/ScheduleHttpGateway.js +196 -0
- package/src/scheduler/ScheduleRunner.d.ts +6 -0
- package/src/scheduler/ScheduleRunner.d.ts.map +1 -1
- package/src/scheduler/ScheduleRunner.js +166 -29
- package/src/scheduler/SchedulerRuntime.d.ts +15 -0
- package/src/scheduler/SchedulerRuntime.d.ts.map +1 -0
- package/src/scheduler/SchedulerRuntime.js +79 -0
- package/src/scheduler/cron/Cron.d.ts +19 -0
- package/src/scheduler/cron/Cron.d.ts.map +1 -0
- package/src/scheduler/cron/Cron.js +200 -0
- package/src/scheduler/leader/SchedulerLeader.d.ts +14 -0
- package/src/scheduler/leader/SchedulerLeader.d.ts.map +1 -0
- package/src/scheduler/leader/SchedulerLeader.js +187 -0
- package/src/scheduler/state/ScheduleStateStore.d.ts +27 -0
- package/src/scheduler/state/ScheduleStateStore.d.ts.map +1 -0
- package/src/scheduler/state/ScheduleStateStore.js +27 -0
- package/src/scheduler/types.d.ts +10 -0
- package/src/scheduler/types.d.ts.map +1 -1
- package/src/schedules/index.d.ts +1 -0
- package/src/schedules/index.d.ts.map +1 -1
- package/src/schedules/index.js +1 -0
- package/src/schedules/job-tracking-cleanup.d.ts +4 -0
- package/src/schedules/job-tracking-cleanup.d.ts.map +1 -0
- package/src/schedules/job-tracking-cleanup.js +116 -0
- package/src/schedules/log-cleanup.d.ts +1 -2
- package/src/schedules/log-cleanup.d.ts.map +1 -1
- package/src/schedules/log-cleanup.js +12 -15
- package/src/security/Sanitizer.d.ts.map +1 -1
- package/src/security/Sanitizer.js +1 -9
- package/src/security/SignedRequest.d.ts.map +1 -1
- package/src/security/SignedRequest.js +2 -2
- package/src/templates/docker/docker-compose.ecosystem.yml.tpl +301 -0
- package/src/templates/docker/docker-compose.schedules.yml.tpl +84 -0
- package/src/templates/project/basic/app/Schedules/index.ts.tpl +0 -0
- package/src/templates/project/basic/config/database.ts.tpl +1 -1
- package/src/toolkit/Secrets/Manifest.d.ts.map +1 -1
- package/src/toolkit/Secrets/Manifest.js +5 -7
- package/src/tools/mail/drivers/Smtp.d.ts.map +1 -1
- package/src/tools/mail/drivers/Smtp.js +7 -1
- package/src/tools/queue/JobReconciliationRunner.d.ts.map +1 -1
- package/src/tools/queue/JobReconciliationRunner.js +7 -39
- package/src/tools/queue/JobRecoveryDaemon.d.ts.map +1 -1
- package/src/tools/queue/JobRecoveryDaemon.js +116 -18
- package/src/tools/queue/JobStateTracker.d.ts +10 -1
- package/src/tools/queue/JobStateTracker.d.ts.map +1 -1
- package/src/tools/queue/JobStateTracker.js +24 -2
- package/src/tools/queue/JobStateTrackerDbPersistence.d.ts.map +1 -1
- 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 @@
|
|
|
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 @@
|
|
|
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;
|
|
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 (!
|
|
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 @@
|
|
|
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,
|
|
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;
|
|
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":"
|
|
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;
|
|
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;
|
|
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
|
-
|
|
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;
|
|
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 &&
|
|
84
|
+
if (!overrideExisting && safeEnvGet(key, '') !== '')
|
|
66
85
|
continue;
|
|
67
|
-
|
|
86
|
+
safeEnvSet(key, value);
|
|
68
87
|
}
|
|
69
88
|
// Compatibility helpers
|
|
70
|
-
if (
|
|
71
|
-
|
|
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 =
|
|
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
|
-
|
|
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
|
-
|
|
163
|
+
safeEnvSet('RUNTIME', overrides.runtime.trim());
|
|
145
164
|
}
|
|
146
165
|
if (typeof overrides.nodeEnv === 'string') {
|
|
147
|
-
|
|
166
|
+
safeEnvSet('NODE_ENV', overrides.nodeEnv);
|
|
148
167
|
}
|
|
149
168
|
if (typeof overrides.port === 'number') {
|
|
150
|
-
|
|
151
|
-
|
|
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 (
|
|
155
|
-
|
|
173
|
+
if (safeEnvGet('PORT', '') === '' && safeEnvGet('APP_PORT', '') !== '') {
|
|
174
|
+
safeEnvSet('PORT', safeEnvGet('APP_PORT', ''));
|
|
156
175
|
}
|
|
157
|
-
if (
|
|
158
|
-
|
|
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
package/src/cli.d.ts.map
ADDED
|
@@ -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
|
@@ -1,3 +1,3 @@
|
|
|
1
|
-
export { collect, Collection } from '
|
|
2
|
-
export type { ICollection, PrimitiveKey } from '
|
|
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,
|
|
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"}
|
package/src/collections/index.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
export { collect, Collection } from '
|
|
1
|
+
export { collect, Collection } from './Collection.js';
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"RemoteSignedJson.d.ts","sourceRoot":"","sources":["../../../src/common/RemoteSignedJson.ts"],"names":[],"mappings":"
|
|
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"}
|