chkit 0.1.0-beta.9 → 0.1.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +38 -2
- package/dist/bin/chkit.js +230 -203
- package/dist/bin/chkit.js.map +1 -1
- package/dist/bin/clickhouse-resource.d.ts +4 -0
- package/dist/bin/clickhouse-resource.d.ts.map +1 -0
- package/dist/bin/clickhouse-resource.js +11 -0
- package/dist/bin/clickhouse-resource.js.map +1 -0
- package/dist/bin/command-dispatch.d.ts +13 -0
- package/dist/bin/command-dispatch.d.ts.map +1 -0
- package/dist/bin/command-dispatch.js +186 -0
- package/dist/bin/command-dispatch.js.map +1 -0
- package/dist/bin/commands/check.d.ts +1 -1
- package/dist/bin/commands/check.d.ts.map +1 -1
- package/dist/bin/commands/check.js +157 -107
- package/dist/bin/commands/check.js.map +1 -1
- package/dist/bin/commands/drift.d.ts +6 -2
- package/dist/bin/commands/drift.d.ts.map +1 -1
- package/dist/bin/commands/drift.js +49 -8
- package/dist/bin/commands/drift.js.map +1 -1
- package/dist/bin/commands/generate.d.ts.map +1 -1
- package/dist/bin/commands/generate.js +4 -0
- package/dist/bin/commands/generate.js.map +1 -1
- package/dist/bin/commands/migrate.d.ts.map +1 -1
- package/dist/bin/commands/migrate.js +189 -171
- package/dist/bin/commands/migrate.js.map +1 -1
- package/dist/bin/commands/status.d.ts.map +1 -1
- package/dist/bin/commands/status.js +15 -5
- package/dist/bin/commands/status.js.map +1 -1
- package/dist/bin/config.d.ts.map +1 -1
- package/dist/bin/config.js +14 -5
- package/dist/bin/config.js.map +1 -1
- package/dist/bin/debug.d.ts +3 -0
- package/dist/bin/debug.d.ts.map +1 -0
- package/dist/bin/debug.js +14 -0
- package/dist/bin/debug.js.map +1 -0
- package/dist/bin/help.d.ts.map +1 -1
- package/dist/bin/help.js +1 -0
- package/dist/bin/help.js.map +1 -1
- package/dist/bin/internal-plugins/index.d.ts +3 -0
- package/dist/bin/internal-plugins/index.d.ts.map +1 -0
- package/dist/bin/internal-plugins/index.js +5 -0
- package/dist/bin/internal-plugins/index.js.map +1 -0
- package/dist/bin/internal-plugins/skill-hint.d.ts +31 -0
- package/dist/bin/internal-plugins/skill-hint.d.ts.map +1 -0
- package/dist/bin/internal-plugins/skill-hint.js +172 -0
- package/dist/bin/internal-plugins/skill-hint.js.map +1 -0
- package/dist/bin/journal-store.d.ts +3 -6
- package/dist/bin/journal-store.d.ts.map +1 -1
- package/dist/bin/journal-store.js +87 -16
- package/dist/bin/journal-store.js.map +1 -1
- package/dist/bin/json-output.d.ts +2 -5
- package/dist/bin/json-output.d.ts.map +1 -1
- package/dist/bin/json-output.js +1 -1
- package/dist/bin/json-output.js.map +1 -1
- package/dist/bin/lib.d.ts +2 -5
- package/dist/bin/lib.d.ts.map +1 -1
- package/dist/bin/lib.js +2 -5
- package/dist/bin/lib.js.map +1 -1
- package/dist/bin/logging.d.ts +3 -0
- package/dist/bin/logging.d.ts.map +1 -0
- package/dist/bin/logging.js +31 -0
- package/dist/bin/logging.js.map +1 -0
- package/dist/bin/migration-store.d.ts +2 -2
- package/dist/bin/migration-store.d.ts.map +1 -1
- package/dist/bin/migration-store.js +1 -1
- package/dist/bin/migration-store.js.map +1 -1
- package/dist/bin/plugin-runtime.d.ts +9 -1
- package/dist/bin/plugin-runtime.d.ts.map +1 -1
- package/dist/bin/plugin-runtime.js +251 -2
- package/dist/bin/plugin-runtime.js.map +1 -1
- package/dist/bin/safety-markers.d.ts +3 -4
- package/dist/bin/safety-markers.d.ts.map +1 -1
- package/dist/bin/safety-markers.js +4 -13
- package/dist/bin/safety-markers.js.map +1 -1
- package/dist/bin/schema-loader.d.ts +1 -1
- package/dist/bin/schema-loader.d.ts.map +1 -1
- package/dist/bin/schema-loader.js +7 -2
- package/dist/bin/schema-loader.js.map +1 -1
- package/dist/bin/table-scope.d.ts +1 -2
- package/dist/bin/table-scope.d.ts.map +1 -1
- package/dist/bin/table-scope.js +1 -1
- package/dist/bin/table-scope.js.map +1 -1
- package/dist/commands/check/command.d.ts +3 -0
- package/dist/commands/check/command.d.ts.map +1 -0
- package/dist/commands/check/command.js +106 -0
- package/dist/commands/check/command.js.map +1 -0
- package/dist/commands/check/output.d.ts +35 -0
- package/dist/commands/check/output.d.ts.map +1 -0
- package/dist/commands/check/output.js +105 -0
- package/dist/commands/check/output.js.map +1 -0
- package/dist/commands/drift/command.d.ts +3 -0
- package/dist/commands/drift/command.d.ts.map +1 -0
- package/dist/commands/drift/command.js +128 -0
- package/dist/commands/drift/command.js.map +1 -0
- package/dist/commands/drift/compare.d.ts +66 -0
- package/dist/commands/drift/compare.d.ts.map +1 -0
- package/dist/commands/drift/compare.js +220 -0
- package/dist/commands/drift/compare.js.map +1 -0
- package/dist/commands/drift/diff.d.ts +8 -0
- package/dist/commands/drift/diff.d.ts.map +1 -0
- package/dist/commands/drift/diff.js +46 -0
- package/dist/commands/drift/diff.js.map +1 -0
- package/dist/commands/drift/payload.d.ts +38 -0
- package/dist/commands/drift/payload.d.ts.map +1 -0
- package/dist/commands/drift/payload.js +111 -0
- package/dist/commands/drift/payload.js.map +1 -0
- package/dist/commands/generate/command.d.ts +3 -0
- package/dist/commands/generate/command.d.ts.map +1 -0
- package/dist/commands/generate/command.js +166 -0
- package/dist/commands/generate/command.js.map +1 -0
- package/dist/commands/generate/output.d.ts +8 -0
- package/dist/commands/generate/output.d.ts.map +1 -0
- package/dist/commands/generate/output.js +59 -0
- package/dist/commands/generate/output.js.map +1 -0
- package/dist/commands/generate/plan-pipeline.d.ts +7 -0
- package/dist/commands/generate/plan-pipeline.d.ts.map +1 -0
- package/dist/commands/generate/plan-pipeline.js +143 -0
- package/dist/commands/generate/plan-pipeline.js.map +1 -0
- package/dist/commands/generate/rename-mappings.d.ts +29 -0
- package/dist/commands/generate/rename-mappings.d.ts.map +1 -0
- package/dist/commands/generate/rename-mappings.js +195 -0
- package/dist/commands/generate/rename-mappings.js.map +1 -0
- package/dist/commands/init.d.ts +2 -0
- package/dist/commands/init.d.ts.map +1 -0
- package/dist/commands/init.js +101 -0
- package/dist/commands/init.js.map +1 -0
- package/dist/commands/migrate/apply.d.ts +33 -0
- package/dist/commands/migrate/apply.d.ts.map +1 -0
- package/dist/commands/migrate/apply.js +143 -0
- package/dist/commands/migrate/apply.js.map +1 -0
- package/dist/commands/migrate/async-apply.d.ts +30 -0
- package/dist/commands/migrate/async-apply.d.ts.map +1 -0
- package/dist/commands/migrate/async-apply.js +258 -0
- package/dist/commands/migrate/async-apply.js.map +1 -0
- package/dist/commands/migrate/command.d.ts +3 -0
- package/dist/commands/migrate/command.d.ts.map +1 -0
- package/dist/commands/migrate/command.js +207 -0
- package/dist/commands/migrate/command.js.map +1 -0
- package/dist/commands/migrate/destructive.d.ts +7 -0
- package/dist/commands/migrate/destructive.d.ts.map +1 -0
- package/dist/commands/migrate/destructive.js +24 -0
- package/dist/commands/migrate/destructive.js.map +1 -0
- package/dist/commands/migrate/prompts.d.ts +6 -0
- package/dist/commands/migrate/prompts.d.ts.map +1 -0
- package/dist/commands/migrate/prompts.js +40 -0
- package/dist/commands/migrate/prompts.js.map +1 -0
- package/dist/commands/migrate/scope.d.ts +12 -0
- package/dist/commands/migrate/scope.d.ts.map +1 -0
- package/dist/commands/migrate/scope.js +35 -0
- package/dist/commands/migrate/scope.js.map +1 -0
- package/dist/commands/plugin.d.ts +3 -0
- package/dist/commands/plugin.d.ts.map +1 -0
- package/dist/commands/plugin.js +129 -0
- package/dist/commands/plugin.js.map +1 -0
- package/dist/commands/query.d.ts +17 -0
- package/dist/commands/query.d.ts.map +1 -0
- package/dist/commands/query.js +155 -0
- package/dist/commands/query.js.map +1 -0
- package/dist/commands/skills.d.ts +13 -0
- package/dist/commands/skills.d.ts.map +1 -0
- package/dist/commands/skills.js +25 -0
- package/dist/commands/skills.js.map +1 -0
- package/dist/commands/status.d.ts +3 -0
- package/dist/commands/status.d.ts.map +1 -0
- package/dist/commands/status.js +69 -0
- package/dist/commands/status.js.map +1 -0
- package/dist/drift.d.ts +7 -6
- package/dist/drift.d.ts.map +1 -1
- package/dist/drift.js +19 -8
- package/dist/drift.js.map +1 -1
- package/dist/internal-plugins/core/plugin.d.ts +2 -0
- package/dist/internal-plugins/core/plugin.d.ts.map +1 -0
- package/dist/internal-plugins/core/plugin.js +21 -0
- package/dist/internal-plugins/core/plugin.js.map +1 -0
- package/dist/internal-plugins/index.d.ts +3 -0
- package/dist/internal-plugins/index.d.ts.map +1 -0
- package/dist/internal-plugins/index.js +6 -0
- package/dist/internal-plugins/index.js.map +1 -0
- package/dist/internal-plugins/skill-hint/agent-detect.d.ts +20 -0
- package/dist/internal-plugins/skill-hint/agent-detect.d.ts.map +1 -0
- package/dist/internal-plugins/skill-hint/agent-detect.js +68 -0
- package/dist/internal-plugins/skill-hint/agent-detect.js.map +1 -0
- package/dist/internal-plugins/skill-hint/plugin.d.ts +16 -0
- package/dist/internal-plugins/skill-hint/plugin.d.ts.map +1 -0
- package/dist/internal-plugins/skill-hint/plugin.js +60 -0
- package/dist/internal-plugins/skill-hint/plugin.js.map +1 -0
- package/dist/internal-plugins/skill-hint/prompt.d.ts +5 -0
- package/dist/internal-plugins/skill-hint/prompt.d.ts.map +1 -0
- package/dist/internal-plugins/skill-hint/prompt.js +37 -0
- package/dist/internal-plugins/skill-hint/prompt.js.map +1 -0
- package/dist/internal-plugins/skill-hint/state.d.ts +7 -0
- package/dist/internal-plugins/skill-hint/state.d.ts.map +1 -0
- package/dist/internal-plugins/skill-hint/state.js +23 -0
- package/dist/internal-plugins/skill-hint/state.js.map +1 -0
- package/dist/plugins.d.ts +109 -27
- package/dist/plugins.d.ts.map +1 -1
- package/dist/plugins.js +0 -6
- package/dist/plugins.js.map +1 -1
- package/dist/runtime/command-dispatch.d.ts +18 -0
- package/dist/runtime/command-dispatch.d.ts.map +1 -0
- package/dist/runtime/command-dispatch.js +227 -0
- package/dist/runtime/command-dispatch.js.map +1 -0
- package/dist/runtime/command-registry.d.ts +31 -0
- package/dist/runtime/command-registry.d.ts.map +1 -0
- package/dist/runtime/command-registry.js +74 -0
- package/dist/runtime/command-registry.js.map +1 -0
- package/dist/runtime/config-merge.d.ts +4 -0
- package/dist/runtime/config-merge.d.ts.map +1 -0
- package/dist/runtime/config-merge.js +72 -0
- package/dist/runtime/config-merge.js.map +1 -0
- package/dist/runtime/config.d.ts +30 -0
- package/dist/runtime/config.d.ts.map +1 -0
- package/dist/runtime/config.js +173 -0
- package/dist/runtime/config.js.map +1 -0
- package/dist/runtime/debug.d.ts +3 -0
- package/dist/runtime/debug.d.ts.map +1 -0
- package/dist/runtime/debug.js +14 -0
- package/dist/runtime/debug.js.map +1 -0
- package/dist/runtime/deps.d.ts +28 -0
- package/dist/runtime/deps.d.ts.map +1 -0
- package/dist/runtime/deps.js +91 -0
- package/dist/runtime/deps.js.map +1 -0
- package/dist/runtime/extract-config-path.d.ts +2 -0
- package/dist/runtime/extract-config-path.d.ts.map +1 -0
- package/dist/runtime/extract-config-path.js +13 -0
- package/dist/runtime/extract-config-path.js.map +1 -0
- package/dist/runtime/global-flags.d.ts +16 -0
- package/dist/runtime/global-flags.d.ts.map +1 -0
- package/dist/runtime/global-flags.js +7 -0
- package/dist/runtime/global-flags.js.map +1 -0
- package/dist/runtime/help.d.ts +5 -0
- package/dist/runtime/help.d.ts.map +1 -0
- package/dist/runtime/help.js +94 -0
- package/dist/runtime/help.js.map +1 -0
- package/dist/runtime/journal-store.d.ts +31 -0
- package/dist/runtime/journal-store.d.ts.map +1 -0
- package/dist/runtime/journal-store.js +250 -0
- package/dist/runtime/journal-store.js.map +1 -0
- package/dist/runtime/json-output.d.ts +25 -0
- package/dist/runtime/json-output.d.ts.map +1 -0
- package/dist/runtime/json-output.js +50 -0
- package/dist/runtime/json-output.js.map +1 -0
- package/dist/runtime/logging.d.ts +3 -0
- package/dist/runtime/logging.d.ts.map +1 -0
- package/dist/runtime/logging.js +31 -0
- package/dist/runtime/logging.js.map +1 -0
- package/dist/runtime/migration-metadata.d.ts +5 -0
- package/dist/runtime/migration-metadata.d.ts.map +1 -0
- package/dist/runtime/migration-metadata.js +29 -0
- package/dist/runtime/migration-metadata.js.map +1 -0
- package/dist/runtime/migration-store.d.ts +22 -0
- package/dist/runtime/migration-store.d.ts.map +1 -0
- package/dist/runtime/migration-store.js +60 -0
- package/dist/runtime/migration-store.js.map +1 -0
- package/dist/runtime/plugin-runtime/errors.d.ts +3 -0
- package/dist/runtime/plugin-runtime/errors.d.ts.map +1 -0
- package/dist/runtime/plugin-runtime/errors.js +13 -0
- package/dist/runtime/plugin-runtime/errors.js.map +1 -0
- package/dist/runtime/plugin-runtime/executor-debug.d.ts +3 -0
- package/dist/runtime/plugin-runtime/executor-debug.d.ts.map +1 -0
- package/dist/runtime/plugin-runtime/executor-debug.js +65 -0
- package/dist/runtime/plugin-runtime/executor-debug.js.map +1 -0
- package/dist/runtime/plugin-runtime/hooks.d.ts +23 -0
- package/dist/runtime/plugin-runtime/hooks.d.ts.map +1 -0
- package/dist/runtime/plugin-runtime/hooks.js +148 -0
- package/dist/runtime/plugin-runtime/hooks.js.map +1 -0
- package/dist/runtime/plugin-runtime/index.d.ts +9 -0
- package/dist/runtime/plugin-runtime/index.d.ts.map +1 -0
- package/dist/runtime/plugin-runtime/index.js +184 -0
- package/dist/runtime/plugin-runtime/index.js.map +1 -0
- package/dist/runtime/plugin-runtime/loader.d.ts +11 -0
- package/dist/runtime/plugin-runtime/loader.d.ts.map +1 -0
- package/dist/runtime/plugin-runtime/loader.js +37 -0
- package/dist/runtime/plugin-runtime/loader.js.map +1 -0
- package/dist/runtime/plugin-runtime/null-executor.d.ts +3 -0
- package/dist/runtime/plugin-runtime/null-executor.d.ts.map +1 -0
- package/dist/runtime/plugin-runtime/null-executor.js +17 -0
- package/dist/runtime/plugin-runtime/null-executor.js.map +1 -0
- package/dist/runtime/safety-markers.d.ts +56 -0
- package/dist/runtime/safety-markers.d.ts.map +1 -0
- package/dist/runtime/safety-markers.js +211 -0
- package/dist/runtime/safety-markers.js.map +1 -0
- package/dist/runtime/schema-loader.d.ts +3 -0
- package/dist/runtime/schema-loader.d.ts.map +1 -0
- package/dist/runtime/schema-loader.js +11 -0
- package/dist/runtime/schema-loader.js.map +1 -0
- package/dist/runtime/table-scope.d.ts +33 -0
- package/dist/runtime/table-scope.d.ts.map +1 -0
- package/dist/runtime/table-scope.js +167 -0
- package/dist/runtime/table-scope.js.map +1 -0
- package/dist/runtime/user-config.d.ts +4 -0
- package/dist/runtime/user-config.d.ts.map +1 -0
- package/dist/runtime/user-config.js +11 -0
- package/dist/runtime/user-config.js.map +1 -0
- package/dist/runtime/version.d.ts +2 -0
- package/dist/runtime/version.d.ts.map +1 -0
- package/dist/runtime/version.js +5 -0
- package/dist/runtime/version.js.map +1 -0
- package/package.json +24 -6
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
export declare const GLOBAL_FLAGS: readonly [{
|
|
2
|
+
readonly name: "--config";
|
|
3
|
+
readonly type: "string";
|
|
4
|
+
readonly description: "Path to config file";
|
|
5
|
+
readonly placeholder: "<path>";
|
|
6
|
+
}, {
|
|
7
|
+
readonly name: "--json";
|
|
8
|
+
readonly type: "boolean";
|
|
9
|
+
readonly description: "Emit machine-readable JSON output";
|
|
10
|
+
}, {
|
|
11
|
+
readonly name: "--table";
|
|
12
|
+
readonly type: "string";
|
|
13
|
+
readonly description: "Limit command scope to tables by exact name or trailing wildcard prefix";
|
|
14
|
+
readonly placeholder: "<selector>";
|
|
15
|
+
}];
|
|
16
|
+
//# sourceMappingURL=global-flags.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"global-flags.d.ts","sourceRoot":"","sources":["../../src/runtime/global-flags.ts"],"names":[],"mappings":"AAEA,eAAO,MAAM,YAAY;;;;;;;;;;;;;;EAId,CAAA"}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
import { defineFlags } from '@chkit/core';
|
|
2
|
+
export const GLOBAL_FLAGS = defineFlags([
|
|
3
|
+
{ name: '--config', type: 'string', description: 'Path to config file', placeholder: '<path>' },
|
|
4
|
+
{ name: '--json', type: 'boolean', description: 'Emit machine-readable JSON output' },
|
|
5
|
+
{ name: '--table', type: 'string', description: 'Limit command scope to tables by exact name or trailing wildcard prefix', placeholder: '<selector>' },
|
|
6
|
+
]);
|
|
7
|
+
//# sourceMappingURL=global-flags.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"global-flags.js","sourceRoot":"","sources":["../../src/runtime/global-flags.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,aAAa,CAAA;AAEzC,MAAM,CAAC,MAAM,YAAY,GAAG,WAAW,CAAC;IACtC,EAAE,IAAI,EAAE,UAAU,EAAE,IAAI,EAAE,QAAQ,EAAE,WAAW,EAAE,qBAAqB,EAAE,WAAW,EAAE,QAAQ,EAAE;IAC/F,EAAE,IAAI,EAAE,QAAQ,EAAE,IAAI,EAAE,SAAS,EAAE,WAAW,EAAE,mCAAmC,EAAE;IACrF,EAAE,IAAI,EAAE,SAAS,EAAE,IAAI,EAAE,QAAQ,EAAE,WAAW,EAAE,yEAAyE,EAAE,WAAW,EAAE,YAAY,EAAE;CAC9I,CAAC,CAAA"}
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
import type { FlagDef } from '../plugins.js';
|
|
2
|
+
import type { CommandRegistry, RegisteredCommand } from './command-registry.js';
|
|
3
|
+
export declare function formatGlobalHelp(registry: CommandRegistry, version: string): string;
|
|
4
|
+
export declare function formatCommandHelp(command: RegisteredCommand, globalFlags: readonly FlagDef[]): string;
|
|
5
|
+
//# sourceMappingURL=help.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"help.d.ts","sourceRoot":"","sources":["../../src/runtime/help.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,eAAe,CAAA;AAC5C,OAAO,KAAK,EAAE,eAAe,EAAE,iBAAiB,EAAE,MAAM,uBAAuB,CAAA;AAI/E,wBAAgB,gBAAgB,CAAC,QAAQ,EAAE,eAAe,EAAE,OAAO,EAAE,MAAM,GAAG,MAAM,CA6CnF;AAED,wBAAgB,iBAAiB,CAAC,OAAO,EAAE,iBAAiB,EAAE,WAAW,EAAE,SAAS,OAAO,EAAE,GAAG,MAAM,CAyCrG"}
|
|
@@ -0,0 +1,94 @@
|
|
|
1
|
+
const DOCS_URL = 'https://chkit.obsessiondb.com/';
|
|
2
|
+
export function formatGlobalHelp(registry, version) {
|
|
3
|
+
const lines = [];
|
|
4
|
+
lines.push(`chkit v${version} - ClickHouse toolkit`);
|
|
5
|
+
lines.push('');
|
|
6
|
+
lines.push('Usage:');
|
|
7
|
+
lines.push(' chkit <command> [options]');
|
|
8
|
+
lines.push('');
|
|
9
|
+
lines.push('Commands:');
|
|
10
|
+
lines.push(` ${'init'.padEnd(14)} Scaffold a new project with config and example schema`);
|
|
11
|
+
lines.push(` ${'skills'.padEnd(14)} Manage agent skills (proxies to the \`skills\` CLI)`);
|
|
12
|
+
const coreCommands = registry.commands.filter((c) => c.pluginName === 'core');
|
|
13
|
+
const pluginCommands = registry.commands.filter((c) => c.pluginName !== 'core');
|
|
14
|
+
for (const cmd of coreCommands) {
|
|
15
|
+
lines.push(` ${cmd.name.padEnd(14)} ${cmd.description}`);
|
|
16
|
+
}
|
|
17
|
+
if (pluginCommands.length > 0) {
|
|
18
|
+
lines.push('');
|
|
19
|
+
lines.push('Plugin commands:');
|
|
20
|
+
for (const cmd of pluginCommands) {
|
|
21
|
+
if (cmd.subcommands) {
|
|
22
|
+
lines.push(` ${cmd.name.padEnd(14)} ${cmd.description}`);
|
|
23
|
+
for (const sub of cmd.subcommands) {
|
|
24
|
+
lines.push(` ${sub.name.padEnd(12)} ${sub.description}`);
|
|
25
|
+
}
|
|
26
|
+
}
|
|
27
|
+
else {
|
|
28
|
+
lines.push(` ${cmd.name.padEnd(14)} ${cmd.description}`);
|
|
29
|
+
}
|
|
30
|
+
}
|
|
31
|
+
}
|
|
32
|
+
lines.push('');
|
|
33
|
+
lines.push('Global options:');
|
|
34
|
+
for (const flag of registry.globalFlags) {
|
|
35
|
+
lines.push(formatFlagLine(flag));
|
|
36
|
+
}
|
|
37
|
+
lines.push(formatFlagLine({ name: '-h, --help', type: 'boolean', description: 'Show help' }));
|
|
38
|
+
lines.push(formatFlagLine({ name: '-v, --version', type: 'boolean', description: 'Show version' }));
|
|
39
|
+
appendDocsHelp(lines);
|
|
40
|
+
return lines.join('\n');
|
|
41
|
+
}
|
|
42
|
+
export function formatCommandHelp(command, globalFlags) {
|
|
43
|
+
const lines = [];
|
|
44
|
+
if (command.subcommands) {
|
|
45
|
+
lines.push(`chkit ${command.name} <command> [options]`);
|
|
46
|
+
lines.push(` ${command.description}`);
|
|
47
|
+
lines.push('');
|
|
48
|
+
lines.push('Commands:');
|
|
49
|
+
for (const sub of command.subcommands) {
|
|
50
|
+
lines.push(` ${sub.name.padEnd(14)} ${sub.description}`);
|
|
51
|
+
}
|
|
52
|
+
}
|
|
53
|
+
else {
|
|
54
|
+
lines.push(`chkit ${command.name} [options]`);
|
|
55
|
+
lines.push(` ${command.description}`);
|
|
56
|
+
}
|
|
57
|
+
if (command.flags.length > 0) {
|
|
58
|
+
lines.push('');
|
|
59
|
+
lines.push('Options:');
|
|
60
|
+
for (const flag of command.flags) {
|
|
61
|
+
lines.push(formatFlagLine(flag));
|
|
62
|
+
}
|
|
63
|
+
}
|
|
64
|
+
for (const pf of command.pluginFlags) {
|
|
65
|
+
lines.push('');
|
|
66
|
+
lines.push(`Plugin: ${pf.pluginName}`);
|
|
67
|
+
for (const flag of pf.flags) {
|
|
68
|
+
lines.push(formatFlagLine(flag));
|
|
69
|
+
}
|
|
70
|
+
}
|
|
71
|
+
lines.push('');
|
|
72
|
+
lines.push('Global options:');
|
|
73
|
+
for (const flag of globalFlags) {
|
|
74
|
+
lines.push(formatFlagLine(flag));
|
|
75
|
+
}
|
|
76
|
+
appendDocsHelp(lines);
|
|
77
|
+
return lines.join('\n');
|
|
78
|
+
}
|
|
79
|
+
function appendDocsHelp(lines) {
|
|
80
|
+
lines.push('');
|
|
81
|
+
lines.push('Documentation:');
|
|
82
|
+
lines.push(` Full documentation: ${DOCS_URL}`);
|
|
83
|
+
lines.push(' Agent-readable markdown: fetch any docs page with Accept: text/markdown');
|
|
84
|
+
}
|
|
85
|
+
function formatFlagLine(flag) {
|
|
86
|
+
const nameStr = flag.name ?? '';
|
|
87
|
+
const placeholder = flag.placeholder ? ` ${flag.placeholder}` : '';
|
|
88
|
+
const label = `${nameStr}${placeholder}`;
|
|
89
|
+
if (label.length >= 22) {
|
|
90
|
+
return ` ${label}\n${''.padEnd(24)}${flag.description}`;
|
|
91
|
+
}
|
|
92
|
+
return ` ${label.padEnd(22)} ${flag.description}`;
|
|
93
|
+
}
|
|
94
|
+
//# sourceMappingURL=help.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"help.js","sourceRoot":"","sources":["../../src/runtime/help.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
import { type ClickHouseExecutor } from '@chkit/clickhouse';
|
|
2
|
+
import type { MigrationJournal, MigrationJournalEntry } from './migration-store.js';
|
|
3
|
+
export type OperationStatus = 'started' | 'completed' | 'failed';
|
|
4
|
+
export interface OperationState {
|
|
5
|
+
operationIndex: number;
|
|
6
|
+
operationKey: string;
|
|
7
|
+
operationType: string;
|
|
8
|
+
queryId: string;
|
|
9
|
+
status: OperationStatus;
|
|
10
|
+
startedAt: string;
|
|
11
|
+
finishedAt: string | null;
|
|
12
|
+
lastError: string;
|
|
13
|
+
}
|
|
14
|
+
export interface MigrationRowState {
|
|
15
|
+
name: string;
|
|
16
|
+
appliedAt: string;
|
|
17
|
+
checksum: string;
|
|
18
|
+
chkitVersion: string;
|
|
19
|
+
migrationCompleted: boolean;
|
|
20
|
+
operations: OperationState[];
|
|
21
|
+
}
|
|
22
|
+
export interface JournalStore {
|
|
23
|
+
readJournal(): Promise<MigrationJournal>;
|
|
24
|
+
readMigrationState(migrationName: string): Promise<MigrationRowState | null>;
|
|
25
|
+
writeMigrationState(state: MigrationRowState): Promise<void>;
|
|
26
|
+
appendEntry(entry: MigrationJournalEntry): Promise<void>;
|
|
27
|
+
readonly databaseMissing: boolean;
|
|
28
|
+
}
|
|
29
|
+
export declare function resolveJournalTableName(): string;
|
|
30
|
+
export declare function createJournalStore(db: ClickHouseExecutor, cluster?: string): JournalStore;
|
|
31
|
+
//# sourceMappingURL=journal-store.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"journal-store.d.ts","sourceRoot":"","sources":["../../src/runtime/journal-store.ts"],"names":[],"mappings":"AAAA,OAAO,EAA0B,KAAK,kBAAkB,EAAE,MAAM,mBAAmB,CAAA;AAGnF,OAAO,KAAK,EAAE,gBAAgB,EAAE,qBAAqB,EAAE,MAAM,sBAAsB,CAAA;AAInF,MAAM,MAAM,eAAe,GAAG,SAAS,GAAG,WAAW,GAAG,QAAQ,CAAA;AAEhE,MAAM,WAAW,cAAc;IAC7B,cAAc,EAAE,MAAM,CAAA;IACtB,YAAY,EAAE,MAAM,CAAA;IACpB,aAAa,EAAE,MAAM,CAAA;IACrB,OAAO,EAAE,MAAM,CAAA;IACf,MAAM,EAAE,eAAe,CAAA;IACvB,SAAS,EAAE,MAAM,CAAA;IACjB,UAAU,EAAE,MAAM,GAAG,IAAI,CAAA;IACzB,SAAS,EAAE,MAAM,CAAA;CAClB;AAED,MAAM,WAAW,iBAAiB;IAChC,IAAI,EAAE,MAAM,CAAA;IACZ,SAAS,EAAE,MAAM,CAAA;IACjB,QAAQ,EAAE,MAAM,CAAA;IAChB,YAAY,EAAE,MAAM,CAAA;IACpB,kBAAkB,EAAE,OAAO,CAAA;IAC3B,UAAU,EAAE,cAAc,EAAE,CAAA;CAC7B;AAED,MAAM,WAAW,YAAY;IAC3B,WAAW,IAAI,OAAO,CAAC,gBAAgB,CAAC,CAAA;IACxC,kBAAkB,CAAC,aAAa,EAAE,MAAM,GAAG,OAAO,CAAC,iBAAiB,GAAG,IAAI,CAAC,CAAA;IAC5E,mBAAmB,CAAC,KAAK,EAAE,iBAAiB,GAAG,OAAO,CAAC,IAAI,CAAC,CAAA;IAC5D,WAAW,CAAC,KAAK,EAAE,qBAAqB,GAAG,OAAO,CAAC,IAAI,CAAC,CAAA;IACxD,QAAQ,CAAC,eAAe,EAAE,OAAO,CAAA;CAClC;AAID,wBAAgB,uBAAuB,IAAI,MAAM,CAShD;AAgGD,wBAAgB,kBAAkB,CAAC,EAAE,EAAE,kBAAkB,EAAE,OAAO,CAAC,EAAE,MAAM,GAAG,YAAY,CAkLzF"}
|
|
@@ -0,0 +1,250 @@
|
|
|
1
|
+
import { isUnknownDatabaseError } from '@chkit/clickhouse';
|
|
2
|
+
import { onClusterClause } from '@chkit/core';
|
|
3
|
+
import { CLI_VERSION } from './version.js';
|
|
4
|
+
import { debug } from './debug.js';
|
|
5
|
+
const DEFAULT_JOURNAL_TABLE = '_chkit_migrations';
|
|
6
|
+
export function resolveJournalTableName() {
|
|
7
|
+
const candidate = process.env.CHKIT_JOURNAL_TABLE?.trim();
|
|
8
|
+
if (!candidate)
|
|
9
|
+
return DEFAULT_JOURNAL_TABLE;
|
|
10
|
+
if (!/^[A-Za-z_][A-Za-z0-9_]*$/.test(candidate)) {
|
|
11
|
+
throw new Error(`Invalid CHKIT_JOURNAL_TABLE "${candidate}". Expected unquoted identifier matching [A-Za-z_][A-Za-z0-9_]*`);
|
|
12
|
+
}
|
|
13
|
+
return candidate;
|
|
14
|
+
}
|
|
15
|
+
const OPERATIONS_TUPLE_TYPE = 'Array(Tuple(operation_index Int32, operation_key String, operation_type String, query_id String, status LowCardinality(String), started_at DateTime64(3, \'UTC\'), finished_at Nullable(DateTime64(3, \'UTC\')), last_error String))';
|
|
16
|
+
function isRetryableInsertRace(error) {
|
|
17
|
+
if (!(error instanceof Error))
|
|
18
|
+
return false;
|
|
19
|
+
const message = error.message;
|
|
20
|
+
return message.includes('INSERT race condition') || message.includes('Please retry the INSERT');
|
|
21
|
+
}
|
|
22
|
+
function escapeSqlString(value) {
|
|
23
|
+
return value.replace(/\\/g, '\\\\').replace(/'/g, "\\'");
|
|
24
|
+
}
|
|
25
|
+
function operationToTupleLiteral(op) {
|
|
26
|
+
const parts = [
|
|
27
|
+
String(op.operationIndex),
|
|
28
|
+
`'${escapeSqlString(op.operationKey)}'`,
|
|
29
|
+
`'${escapeSqlString(op.operationType)}'`,
|
|
30
|
+
`'${escapeSqlString(op.queryId)}'`,
|
|
31
|
+
`'${escapeSqlString(op.status)}'`,
|
|
32
|
+
`'${escapeSqlString(op.startedAt)}'`,
|
|
33
|
+
op.finishedAt === null ? 'NULL' : `'${escapeSqlString(op.finishedAt)}'`,
|
|
34
|
+
`'${escapeSqlString(op.lastError)}'`,
|
|
35
|
+
];
|
|
36
|
+
return `(${parts.join(',')})`;
|
|
37
|
+
}
|
|
38
|
+
function operationsArrayLiteral(operations) {
|
|
39
|
+
if (operations.length === 0)
|
|
40
|
+
return '[]';
|
|
41
|
+
return `[${operations.map(operationToTupleLiteral).join(',')}]`;
|
|
42
|
+
}
|
|
43
|
+
function operationFromTuple(row) {
|
|
44
|
+
return {
|
|
45
|
+
operationIndex: Number(row.operation_index),
|
|
46
|
+
operationKey: row.operation_key,
|
|
47
|
+
operationType: row.operation_type,
|
|
48
|
+
queryId: row.query_id,
|
|
49
|
+
status: row.status,
|
|
50
|
+
startedAt: row.started_at,
|
|
51
|
+
finishedAt: row.finished_at,
|
|
52
|
+
lastError: row.last_error,
|
|
53
|
+
};
|
|
54
|
+
}
|
|
55
|
+
// The native ClickHouse client returns a JS boolean; the ObsessionDB workbench
|
|
56
|
+
// API returns every cell as a string ("true"/"false"). Compare explicitly —
|
|
57
|
+
// `Boolean("false")` is `true`, which would silently corrupt the read.
|
|
58
|
+
function parseBool(value) {
|
|
59
|
+
return value === true || value === 1 || value === '1' || value === 'true';
|
|
60
|
+
}
|
|
61
|
+
// `operations` is selected via `toJSONString(...)`, so it arrives as a JSON
|
|
62
|
+
// string from every executor. Tolerate an already-decoded array too (mocks /
|
|
63
|
+
// any future typed executor) and degrade to [] on anything unparseable.
|
|
64
|
+
function parseOperations(value) {
|
|
65
|
+
if (value == null || value === '')
|
|
66
|
+
return [];
|
|
67
|
+
let decoded = value;
|
|
68
|
+
if (typeof value === 'string') {
|
|
69
|
+
try {
|
|
70
|
+
decoded = JSON.parse(value);
|
|
71
|
+
}
|
|
72
|
+
catch {
|
|
73
|
+
return [];
|
|
74
|
+
}
|
|
75
|
+
}
|
|
76
|
+
if (!Array.isArray(decoded))
|
|
77
|
+
return [];
|
|
78
|
+
return decoded.map((row) => operationFromTuple(row));
|
|
79
|
+
}
|
|
80
|
+
export function createJournalStore(db, cluster) {
|
|
81
|
+
const journalTable = resolveJournalTableName();
|
|
82
|
+
debug('journal', `journal table: ${journalTable}${process.env.CHKIT_JOURNAL_TABLE ? ' (from CHKIT_JOURNAL_TABLE)' : ''}${cluster ? ` (ON CLUSTER ${cluster})` : ''}`);
|
|
83
|
+
// In cluster mode the journal must be consistent across every node, so it uses
|
|
84
|
+
// a replicated engine with a no-`{shard}` Keeper path (one cluster-wide group)
|
|
85
|
+
// created `ON CLUSTER`. `{uuid}` is minted once per CREATE and propagated to
|
|
86
|
+
// all nodes by ON CLUSTER, so a dropped journal's stale Keeper entries can
|
|
87
|
+
// never collide with a recreate (REPLICA_ALREADY_EXISTS). The replica id is
|
|
88
|
+
// `{shard}_{replica}` rather than bare `{replica}`: because the path omits
|
|
89
|
+
// `{shard}`, all nodes across all shards share it, so the replica name must be
|
|
90
|
+
// unique cluster-wide — per-shard `{replica}` naming (the common multi-shard
|
|
91
|
+
// layout) would otherwise collide. The read path already uses SYNC REPLICA +
|
|
92
|
+
// FINAL + sequential consistency. Single-node/Cloud keeps the plain engine.
|
|
93
|
+
const onCluster = onClusterClause(cluster);
|
|
94
|
+
const journalEngine = cluster
|
|
95
|
+
? "ReplicatedReplacingMergeTree('/clickhouse/tables/{uuid}/chkit_journal', '{shard}_{replica}', applied_at)"
|
|
96
|
+
: 'ReplacingMergeTree(applied_at)';
|
|
97
|
+
const createTableSql = `CREATE TABLE IF NOT EXISTS ${journalTable}${onCluster} (
|
|
98
|
+
name String,
|
|
99
|
+
applied_at DateTime64(3, 'UTC'),
|
|
100
|
+
checksum String,
|
|
101
|
+
chkit_version String,
|
|
102
|
+
migration_completed Bool DEFAULT true,
|
|
103
|
+
operations ${OPERATIONS_TUPLE_TYPE} DEFAULT []
|
|
104
|
+
) ENGINE = ${journalEngine}
|
|
105
|
+
ORDER BY (name)
|
|
106
|
+
SETTINGS index_granularity = 1`;
|
|
107
|
+
let bootstrapped = false;
|
|
108
|
+
let _databaseMissing = false;
|
|
109
|
+
async function ensureTable() {
|
|
110
|
+
if (bootstrapped)
|
|
111
|
+
return;
|
|
112
|
+
debug('journal', `probing journal table "${journalTable}"`);
|
|
113
|
+
try {
|
|
114
|
+
await db.query(`SELECT name FROM ${journalTable} LIMIT 0`);
|
|
115
|
+
debug('journal', 'journal table exists — checking schema');
|
|
116
|
+
await ensureSchemaUpgraded();
|
|
117
|
+
bootstrapped = true;
|
|
118
|
+
return;
|
|
119
|
+
}
|
|
120
|
+
catch (error) {
|
|
121
|
+
if (isUnknownDatabaseError(error)) {
|
|
122
|
+
debug('journal', 'database does not exist');
|
|
123
|
+
_databaseMissing = true;
|
|
124
|
+
bootstrapped = true;
|
|
125
|
+
return;
|
|
126
|
+
}
|
|
127
|
+
}
|
|
128
|
+
debug('journal', 'creating journal table');
|
|
129
|
+
try {
|
|
130
|
+
await db.command(createTableSql);
|
|
131
|
+
}
|
|
132
|
+
catch (error) {
|
|
133
|
+
if (isUnknownDatabaseError(error)) {
|
|
134
|
+
debug('journal', 'database missing on CREATE — deferring');
|
|
135
|
+
_databaseMissing = true;
|
|
136
|
+
bootstrapped = true;
|
|
137
|
+
return;
|
|
138
|
+
}
|
|
139
|
+
throw error;
|
|
140
|
+
}
|
|
141
|
+
for (let attempt = 0; attempt < 10; attempt++) {
|
|
142
|
+
try {
|
|
143
|
+
await db.query(`SELECT name FROM ${journalTable} LIMIT 0`);
|
|
144
|
+
debug('journal', `DDL propagation confirmed (attempt ${attempt + 1})`);
|
|
145
|
+
break;
|
|
146
|
+
}
|
|
147
|
+
catch {
|
|
148
|
+
await new Promise((r) => setTimeout(r, 250));
|
|
149
|
+
}
|
|
150
|
+
}
|
|
151
|
+
bootstrapped = true;
|
|
152
|
+
}
|
|
153
|
+
async function ensureSchemaUpgraded() {
|
|
154
|
+
// Pre-existing journal tables predate per-operation tracking. Add the
|
|
155
|
+
// columns idempotently so older deployments pick them up on first run
|
|
156
|
+
// of the new chkit. ALTER ADD COLUMN IF NOT EXISTS is a metadata op,
|
|
157
|
+
// no data rewrite.
|
|
158
|
+
await db.command(`ALTER TABLE ${journalTable}${onCluster} ADD COLUMN IF NOT EXISTS migration_completed Bool DEFAULT true`);
|
|
159
|
+
await db.command(`ALTER TABLE ${journalTable}${onCluster} ADD COLUMN IF NOT EXISTS operations ${OPERATIONS_TUPLE_TYPE} DEFAULT []`);
|
|
160
|
+
}
|
|
161
|
+
async function trySyncReplica() {
|
|
162
|
+
try {
|
|
163
|
+
await db.command(`SYSTEM SYNC REPLICA ${journalTable}`);
|
|
164
|
+
}
|
|
165
|
+
catch {
|
|
166
|
+
// Non-replicated or single-node setups don't support SYSTEM SYNC REPLICA.
|
|
167
|
+
}
|
|
168
|
+
}
|
|
169
|
+
return {
|
|
170
|
+
get databaseMissing() {
|
|
171
|
+
return _databaseMissing;
|
|
172
|
+
},
|
|
173
|
+
async readJournal() {
|
|
174
|
+
debug('journal', 'reading journal');
|
|
175
|
+
await ensureTable();
|
|
176
|
+
if (_databaseMissing) {
|
|
177
|
+
debug('journal', 'database missing — returning empty journal');
|
|
178
|
+
return { version: 1, applied: [] };
|
|
179
|
+
}
|
|
180
|
+
await trySyncReplica();
|
|
181
|
+
const rows = await db.query(`SELECT name, applied_at, checksum, chkit_version FROM ${journalTable} FINAL WHERE migration_completed = true ORDER BY name SETTINGS select_sequential_consistency = 1`);
|
|
182
|
+
debug('journal', `journal has ${rows.length} applied entries`);
|
|
183
|
+
return {
|
|
184
|
+
version: 1,
|
|
185
|
+
applied: rows.map((row) => ({
|
|
186
|
+
name: row.name,
|
|
187
|
+
appliedAt: row.applied_at,
|
|
188
|
+
checksum: row.checksum,
|
|
189
|
+
})),
|
|
190
|
+
};
|
|
191
|
+
},
|
|
192
|
+
async readMigrationState(migrationName) {
|
|
193
|
+
await ensureTable();
|
|
194
|
+
if (_databaseMissing)
|
|
195
|
+
return null;
|
|
196
|
+
await trySyncReplica();
|
|
197
|
+
const rows = await db.query(`SELECT name, applied_at, checksum, chkit_version, migration_completed, toJSONString(operations) AS operations FROM ${journalTable} FINAL WHERE name = '${escapeSqlString(migrationName)}' LIMIT 1 SETTINGS select_sequential_consistency = 1`);
|
|
198
|
+
const row = rows[0];
|
|
199
|
+
if (!row)
|
|
200
|
+
return null;
|
|
201
|
+
return {
|
|
202
|
+
name: row.name,
|
|
203
|
+
appliedAt: row.applied_at,
|
|
204
|
+
checksum: row.checksum,
|
|
205
|
+
chkitVersion: row.chkit_version,
|
|
206
|
+
migrationCompleted: parseBool(row.migration_completed),
|
|
207
|
+
operations: parseOperations(row.operations),
|
|
208
|
+
};
|
|
209
|
+
},
|
|
210
|
+
async writeMigrationState(state) {
|
|
211
|
+
if (_databaseMissing) {
|
|
212
|
+
debug('journal', 'resetting databaseMissing flag — migration may have created the database');
|
|
213
|
+
_databaseMissing = false;
|
|
214
|
+
bootstrapped = false;
|
|
215
|
+
}
|
|
216
|
+
await ensureTable();
|
|
217
|
+
const insertSql = `INSERT INTO ${journalTable} (name, applied_at, checksum, chkit_version, migration_completed, operations) VALUES ('${escapeSqlString(state.name)}', '${escapeSqlString(state.appliedAt)}', '${escapeSqlString(state.checksum)}', '${escapeSqlString(state.chkitVersion || CLI_VERSION)}', ${state.migrationCompleted ? 'true' : 'false'}, ${operationsArrayLiteral(state.operations)})`;
|
|
218
|
+
const maxAttempts = 5;
|
|
219
|
+
for (let attempt = 1; attempt <= maxAttempts; attempt += 1) {
|
|
220
|
+
try {
|
|
221
|
+
await db.command(insertSql);
|
|
222
|
+
break;
|
|
223
|
+
}
|
|
224
|
+
catch (error) {
|
|
225
|
+
if (!isRetryableInsertRace(error) || attempt === maxAttempts) {
|
|
226
|
+
throw error;
|
|
227
|
+
}
|
|
228
|
+
debug('journal', `insert race detected — retrying (attempt ${attempt}/${maxAttempts})`);
|
|
229
|
+
await new Promise((r) => setTimeout(r, attempt * 150));
|
|
230
|
+
}
|
|
231
|
+
}
|
|
232
|
+
await trySyncReplica();
|
|
233
|
+
},
|
|
234
|
+
async appendEntry(entry) {
|
|
235
|
+
debug('journal', `appending entry: ${entry.name} (checksum: ${entry.checksum})`);
|
|
236
|
+
// Preserve any per-operation history that async statements wrote
|
|
237
|
+
// earlier in this migration's apply — we just flip migrationCompleted.
|
|
238
|
+
const existing = await this.readMigrationState(entry.name);
|
|
239
|
+
await this.writeMigrationState({
|
|
240
|
+
name: entry.name,
|
|
241
|
+
appliedAt: entry.appliedAt,
|
|
242
|
+
checksum: entry.checksum,
|
|
243
|
+
chkitVersion: CLI_VERSION,
|
|
244
|
+
migrationCompleted: true,
|
|
245
|
+
operations: existing?.operations ?? [],
|
|
246
|
+
});
|
|
247
|
+
},
|
|
248
|
+
};
|
|
249
|
+
}
|
|
250
|
+
//# sourceMappingURL=journal-store.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"journal-store.js","sourceRoot":"","sources":["../../src/runtime/journal-store.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,sBAAsB,EAA2B,MAAM,mBAAmB,CAAA;AACnF,OAAO,EAAE,eAAe,EAAE,MAAM,aAAa,CAAA;AAG7C,OAAO,EAAE,WAAW,EAAE,MAAM,cAAc,CAAA;AAC1C,OAAO,EAAE,KAAK,EAAE,MAAM,YAAY,CAAA;AAgClC,MAAM,qBAAqB,GAAG,mBAAmB,CAAA;AAEjD,MAAM,UAAU,uBAAuB;IACrC,MAAM,SAAS,GAAG,OAAO,CAAC,GAAG,CAAC,mBAAmB,EAAE,IAAI,EAAE,CAAA;IACzD,IAAI,CAAC,SAAS;QAAE,OAAO,qBAAqB,CAAA;IAC5C,IAAI,CAAC,0BAA0B,CAAC,IAAI,CAAC,SAAS,CAAC,EAAE,CAAC;QAChD,MAAM,IAAI,KAAK,CACb,gCAAgC,SAAS,iEAAiE,CAC3G,CAAA;IACH,CAAC;IACD,OAAO,SAAS,CAAA;AAClB,CAAC;AA2BD,MAAM,qBAAqB,GACzB,sOAAsO,CAAA;AAExO,SAAS,qBAAqB,CAAC,KAAc;IAC3C,IAAI,CAAC,CAAC,KAAK,YAAY,KAAK,CAAC;QAAE,OAAO,KAAK,CAAA;IAC3C,MAAM,OAAO,GAAG,KAAK,CAAC,OAAO,CAAA;IAC7B,OAAO,OAAO,CAAC,QAAQ,CAAC,uBAAuB,CAAC,IAAI,OAAO,CAAC,QAAQ,CAAC,yBAAyB,CAAC,CAAA;AACjG,CAAC;AAED,SAAS,eAAe,CAAC,KAAa;IACpC,OAAO,KAAK,CAAC,OAAO,CAAC,KAAK,EAAE,MAAM,CAAC,CAAC,OAAO,CAAC,IAAI,EAAE,KAAK,CAAC,CAAA;AAC1D,CAAC;AAED,SAAS,uBAAuB,CAAC,EAAkB;IACjD,MAAM,KAAK,GAAG;QACZ,MAAM,CAAC,EAAE,CAAC,cAAc,CAAC;QACzB,IAAI,eAAe,CAAC,EAAE,CAAC,YAAY,CAAC,GAAG;QACvC,IAAI,eAAe,CAAC,EAAE,CAAC,aAAa,CAAC,GAAG;QACxC,IAAI,eAAe,CAAC,EAAE,CAAC,OAAO,CAAC,GAAG;QAClC,IAAI,eAAe,CAAC,EAAE,CAAC,MAAM,CAAC,GAAG;QACjC,IAAI,eAAe,CAAC,EAAE,CAAC,SAAS,CAAC,GAAG;QACpC,EAAE,CAAC,UAAU,KAAK,IAAI,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,eAAe,CAAC,EAAE,CAAC,UAAU,CAAC,GAAG;QACvE,IAAI,eAAe,CAAC,EAAE,CAAC,SAAS,CAAC,GAAG;KACrC,CAAA;IACD,OAAO,IAAI,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,CAAA;AAC/B,CAAC;AAED,SAAS,sBAAsB,CAAC,UAA4B;IAC1D,IAAI,UAAU,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,IAAI,CAAA;IACxC,OAAO,IAAI,UAAU,CAAC,GAAG,CAAC,uBAAuB,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,CAAA;AACjE,CAAC;AAED,SAAS,kBAAkB,CAAC,GAAsB;IAChD,OAAO;QACL,cAAc,EAAE,MAAM,CAAC,GAAG,CAAC,eAAe,CAAC;QAC3C,YAAY,EAAE,GAAG,CAAC,aAAa;QAC/B,aAAa,EAAE,GAAG,CAAC,cAAc;QACjC,OAAO,EAAE,GAAG,CAAC,QAAQ;QACrB,MAAM,EAAE,GAAG,CAAC,MAAyB;QACrC,SAAS,EAAE,GAAG,CAAC,UAAU;QACzB,UAAU,EAAE,GAAG,CAAC,WAAW;QAC3B,SAAS,EAAE,GAAG,CAAC,UAAU;KAC1B,CAAA;AACH,CAAC;AAED,+EAA+E;AAC/E,4EAA4E;AAC5E,uEAAuE;AACvE,SAAS,SAAS,CAAC,KAAc;IAC/B,OAAO,KAAK,KAAK,IAAI,IAAI,KAAK,KAAK,CAAC,IAAI,KAAK,KAAK,GAAG,IAAI,KAAK,KAAK,MAAM,CAAA;AAC3E,CAAC;AAED,4EAA4E;AAC5E,6EAA6E;AAC7E,wEAAwE;AACxE,SAAS,eAAe,CAAC,KAAc;IACrC,IAAI,KAAK,IAAI,IAAI,IAAI,KAAK,KAAK,EAAE;QAAE,OAAO,EAAE,CAAA;IAC5C,IAAI,OAAO,GAAY,KAAK,CAAA;IAC5B,IAAI,OAAO,KAAK,KAAK,QAAQ,EAAE,CAAC;QAC9B,IAAI,CAAC;YACH,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,CAAA;QAC7B,CAAC;QAAC,MAAM,CAAC;YACP,OAAO,EAAE,CAAA;QACX,CAAC;IACH,CAAC;IACD,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,OAAO,CAAC;QAAE,OAAO,EAAE,CAAA;IACtC,OAAO,OAAO,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,kBAAkB,CAAC,GAAwB,CAAC,CAAC,CAAA;AAC3E,CAAC;AAED,MAAM,UAAU,kBAAkB,CAAC,EAAsB,EAAE,OAAgB;IACzE,MAAM,YAAY,GAAG,uBAAuB,EAAE,CAAA;IAC9C,KAAK,CAAC,SAAS,EAAE,kBAAkB,YAAY,GAAG,OAAO,CAAC,GAAG,CAAC,mBAAmB,CAAC,CAAC,CAAC,6BAA6B,CAAC,CAAC,CAAC,EAAE,GAAG,OAAO,CAAC,CAAC,CAAC,gBAAgB,OAAO,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAA;IACrK,+EAA+E;IAC/E,+EAA+E;IAC/E,6EAA6E;IAC7E,2EAA2E;IAC3E,4EAA4E;IAC5E,2EAA2E;IAC3E,+EAA+E;IAC/E,6EAA6E;IAC7E,6EAA6E;IAC7E,4EAA4E;IAC5E,MAAM,SAAS,GAAG,eAAe,CAAC,OAAO,CAAC,CAAA;IAC1C,MAAM,aAAa,GAAG,OAAO;QAC3B,CAAC,CAAC,0GAA0G;QAC5G,CAAC,CAAC,gCAAgC,CAAA;IACpC,MAAM,cAAc,GAAG,8BAA8B,YAAY,GAAG,SAAS;;;;;;iBAM9D,qBAAqB;aACzB,aAAa;;+BAEK,CAAA;IAE7B,IAAI,YAAY,GAAG,KAAK,CAAA;IACxB,IAAI,gBAAgB,GAAG,KAAK,CAAA;IAE5B,KAAK,UAAU,WAAW;QACxB,IAAI,YAAY;YAAE,OAAM;QACxB,KAAK,CAAC,SAAS,EAAE,0BAA0B,YAAY,GAAG,CAAC,CAAA;QAC3D,IAAI,CAAC;YACH,MAAM,EAAE,CAAC,KAAK,CAAC,oBAAoB,YAAY,UAAU,CAAC,CAAA;YAC1D,KAAK,CAAC,SAAS,EAAE,wCAAwC,CAAC,CAAA;YAC1D,MAAM,oBAAoB,EAAE,CAAA;YAC5B,YAAY,GAAG,IAAI,CAAA;YACnB,OAAM;QACR,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,IAAI,sBAAsB,CAAC,KAAK,CAAC,EAAE,CAAC;gBAClC,KAAK,CAAC,SAAS,EAAE,yBAAyB,CAAC,CAAA;gBAC3C,gBAAgB,GAAG,IAAI,CAAA;gBACvB,YAAY,GAAG,IAAI,CAAA;gBACnB,OAAM;YACR,CAAC;QACH,CAAC;QACD,KAAK,CAAC,SAAS,EAAE,wBAAwB,CAAC,CAAA;QAC1C,IAAI,CAAC;YACH,MAAM,EAAE,CAAC,OAAO,CAAC,cAAc,CAAC,CAAA;QAClC,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,IAAI,sBAAsB,CAAC,KAAK,CAAC,EAAE,CAAC;gBAClC,KAAK,CAAC,SAAS,EAAE,wCAAwC,CAAC,CAAA;gBAC1D,gBAAgB,GAAG,IAAI,CAAA;gBACvB,YAAY,GAAG,IAAI,CAAA;gBACnB,OAAM;YACR,CAAC;YACD,MAAM,KAAK,CAAA;QACb,CAAC;QACD,KAAK,IAAI,OAAO,GAAG,CAAC,EAAE,OAAO,GAAG,EAAE,EAAE,OAAO,EAAE,EAAE,CAAC;YAC9C,IAAI,CAAC;gBACH,MAAM,EAAE,CAAC,KAAK,CAAC,oBAAoB,YAAY,UAAU,CAAC,CAAA;gBAC1D,KAAK,CAAC,SAAS,EAAE,sCAAsC,OAAO,GAAG,CAAC,GAAG,CAAC,CAAA;gBACtE,MAAK;YACP,CAAC;YAAC,MAAM,CAAC;gBACP,MAAM,IAAI,OAAO,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,UAAU,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC,CAAA;YAC9C,CAAC;QACH,CAAC;QACD,YAAY,GAAG,IAAI,CAAA;IACrB,CAAC;IAED,KAAK,UAAU,oBAAoB;QACjC,sEAAsE;QACtE,sEAAsE;QACtE,qEAAqE;QACrE,mBAAmB;QACnB,MAAM,EAAE,CAAC,OAAO,CACd,eAAe,YAAY,GAAG,SAAS,iEAAiE,CACzG,CAAA;QACD,MAAM,EAAE,CAAC,OAAO,CACd,eAAe,YAAY,GAAG,SAAS,wCAAwC,qBAAqB,aAAa,CAClH,CAAA;IACH,CAAC;IAED,KAAK,UAAU,cAAc;QAC3B,IAAI,CAAC;YACH,MAAM,EAAE,CAAC,OAAO,CAAC,uBAAuB,YAAY,EAAE,CAAC,CAAA;QACzD,CAAC;QAAC,MAAM,CAAC;YACP,0EAA0E;QAC5E,CAAC;IACH,CAAC;IAED,OAAO;QACL,IAAI,eAAe;YACjB,OAAO,gBAAgB,CAAA;QACzB,CAAC;QAED,KAAK,CAAC,WAAW;YACf,KAAK,CAAC,SAAS,EAAE,iBAAiB,CAAC,CAAA;YACnC,MAAM,WAAW,EAAE,CAAA;YACnB,IAAI,gBAAgB,EAAE,CAAC;gBACrB,KAAK,CAAC,SAAS,EAAE,4CAA4C,CAAC,CAAA;gBAC9D,OAAO,EAAE,OAAO,EAAE,CAAC,EAAE,OAAO,EAAE,EAAE,EAAE,CAAA;YACpC,CAAC;YACD,MAAM,cAAc,EAAE,CAAA;YACtB,MAAM,IAAI,GAAG,MAAM,EAAE,CAAC,KAAK,CACzB,yDAAyD,YAAY,kGAAkG,CACxK,CAAA;YACD,KAAK,CAAC,SAAS,EAAE,eAAe,IAAI,CAAC,MAAM,kBAAkB,CAAC,CAAA;YAC9D,OAAO;gBACL,OAAO,EAAE,CAAC;gBACV,OAAO,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC;oBAC1B,IAAI,EAAE,GAAG,CAAC,IAAI;oBACd,SAAS,EAAE,GAAG,CAAC,UAAU;oBACzB,QAAQ,EAAE,GAAG,CAAC,QAAQ;iBACvB,CAAC,CAAC;aACJ,CAAA;QACH,CAAC;QAED,KAAK,CAAC,kBAAkB,CAAC,aAAqB;YAC5C,MAAM,WAAW,EAAE,CAAA;YACnB,IAAI,gBAAgB;gBAAE,OAAO,IAAI,CAAA;YACjC,MAAM,cAAc,EAAE,CAAA;YACtB,MAAM,IAAI,GAAG,MAAM,EAAE,CAAC,KAAK,CACzB,sHAAsH,YAAY,wBAAwB,eAAe,CAAC,aAAa,CAAC,sDAAsD,CAC/O,CAAA;YACD,MAAM,GAAG,GAAG,IAAI,CAAC,CAAC,CAAC,CAAA;YACnB,IAAI,CAAC,GAAG;gBAAE,OAAO,IAAI,CAAA;YACrB,OAAO;gBACL,IAAI,EAAE,GAAG,CAAC,IAAI;gBACd,SAAS,EAAE,GAAG,CAAC,UAAU;gBACzB,QAAQ,EAAE,GAAG,CAAC,QAAQ;gBACtB,YAAY,EAAE,GAAG,CAAC,aAAa;gBAC/B,kBAAkB,EAAE,SAAS,CAAC,GAAG,CAAC,mBAAmB,CAAC;gBACtD,UAAU,EAAE,eAAe,CAAC,GAAG,CAAC,UAAU,CAAC;aAC5C,CAAA;QACH,CAAC;QAED,KAAK,CAAC,mBAAmB,CAAC,KAAwB;YAChD,IAAI,gBAAgB,EAAE,CAAC;gBACrB,KAAK,CAAC,SAAS,EAAE,0EAA0E,CAAC,CAAA;gBAC5F,gBAAgB,GAAG,KAAK,CAAA;gBACxB,YAAY,GAAG,KAAK,CAAA;YACtB,CAAC;YACD,MAAM,WAAW,EAAE,CAAA;YACnB,MAAM,SAAS,GAAG,eAAe,YAAY,0FAA0F,eAAe,CAAC,KAAK,CAAC,IAAI,CAAC,OAAO,eAAe,CAAC,KAAK,CAAC,SAAS,CAAC,OAAO,eAAe,CAAC,KAAK,CAAC,QAAQ,CAAC,OAAO,eAAe,CAAC,KAAK,CAAC,YAAY,IAAI,WAAW,CAAC,MAAM,KAAK,CAAC,kBAAkB,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,OAAO,KAAK,sBAAsB,CAAC,KAAK,CAAC,UAAU,CAAC,GAAG,CAAA;YACzY,MAAM,WAAW,GAAG,CAAC,CAAA;YACrB,KAAK,IAAI,OAAO,GAAG,CAAC,EAAE,OAAO,IAAI,WAAW,EAAE,OAAO,IAAI,CAAC,EAAE,CAAC;gBAC3D,IAAI,CAAC;oBACH,MAAM,EAAE,CAAC,OAAO,CAAC,SAAS,CAAC,CAAA;oBAC3B,MAAK;gBACP,CAAC;gBAAC,OAAO,KAAK,EAAE,CAAC;oBACf,IAAI,CAAC,qBAAqB,CAAC,KAAK,CAAC,IAAI,OAAO,KAAK,WAAW,EAAE,CAAC;wBAC7D,MAAM,KAAK,CAAA;oBACb,CAAC;oBACD,KAAK,CAAC,SAAS,EAAE,4CAA4C,OAAO,IAAI,WAAW,GAAG,CAAC,CAAA;oBACvF,MAAM,IAAI,OAAO,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,UAAU,CAAC,CAAC,EAAE,OAAO,GAAG,GAAG,CAAC,CAAC,CAAA;gBACxD,CAAC;YACH,CAAC;YACD,MAAM,cAAc,EAAE,CAAA;QACxB,CAAC;QAED,KAAK,CAAC,WAAW,CAAC,KAA4B;YAC5C,KAAK,CAAC,SAAS,EAAE,oBAAoB,KAAK,CAAC,IAAI,eAAe,KAAK,CAAC,QAAQ,GAAG,CAAC,CAAA;YAChF,iEAAiE;YACjE,uEAAuE;YACvE,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,kBAAkB,CAAC,KAAK,CAAC,IAAI,CAAC,CAAA;YAC1D,MAAM,IAAI,CAAC,mBAAmB,CAAC;gBAC7B,IAAI,EAAE,KAAK,CAAC,IAAI;gBAChB,SAAS,EAAE,KAAK,CAAC,SAAS;gBAC1B,QAAQ,EAAE,KAAK,CAAC,QAAQ;gBACxB,YAAY,EAAE,WAAW;gBACzB,kBAAkB,EAAE,IAAI;gBACxB,UAAU,EAAE,QAAQ,EAAE,UAAU,IAAI,EAAE;aACvC,CAAC,CAAA;QACJ,CAAC;KACF,CAAA;AACH,CAAC"}
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
type Command = 'generate' | 'migrate' | 'status' | 'drift' | 'check' | 'plugin' | 'query';
|
|
2
|
+
/** Whether any JSON payload (success or error) has already been written to stdout. */
|
|
3
|
+
export declare function hasEmittedJson(): boolean;
|
|
4
|
+
export declare function printOutput(value: unknown, jsonMode: boolean): void;
|
|
5
|
+
export declare function emitJson<T extends object>(command: Command, payload: T): void;
|
|
6
|
+
export interface JsonError {
|
|
7
|
+
code: string;
|
|
8
|
+
message: string;
|
|
9
|
+
hint?: string;
|
|
10
|
+
}
|
|
11
|
+
export interface JsonErrorEnvelope {
|
|
12
|
+
command: string;
|
|
13
|
+
schemaVersion: number;
|
|
14
|
+
ok: false;
|
|
15
|
+
error: JsonError;
|
|
16
|
+
}
|
|
17
|
+
export declare function buildJsonErrorEnvelope(command: string, error: JsonError): JsonErrorEnvelope;
|
|
18
|
+
/**
|
|
19
|
+
* Emit a stable machine-readable error envelope to stdout for `--json` consumers.
|
|
20
|
+
* Without this, a thrown error left stdout empty and printed plain text to
|
|
21
|
+
* stderr, breaking any pipe to `jq` on the first failure.
|
|
22
|
+
*/
|
|
23
|
+
export declare function emitJsonError(command: string, error: JsonError): void;
|
|
24
|
+
export {};
|
|
25
|
+
//# sourceMappingURL=json-output.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"json-output.d.ts","sourceRoot":"","sources":["../../src/runtime/json-output.ts"],"names":[],"mappings":"AAAA,KAAK,OAAO,GACR,UAAU,GACV,SAAS,GACT,QAAQ,GACR,OAAO,GACP,OAAO,GACP,QAAQ,GACR,OAAO,CAAA;AAMX,sFAAsF;AACtF,wBAAgB,cAAc,IAAI,OAAO,CAExC;AAED,wBAAgB,WAAW,CAAC,KAAK,EAAE,OAAO,EAAE,QAAQ,EAAE,OAAO,GAAG,IAAI,CAgBnE;AAaD,wBAAgB,QAAQ,CAAC,CAAC,SAAS,MAAM,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,CAAC,GAAG,IAAI,CAE7E;AAED,MAAM,WAAW,SAAS;IACxB,IAAI,EAAE,MAAM,CAAA;IACZ,OAAO,EAAE,MAAM,CAAA;IACf,IAAI,CAAC,EAAE,MAAM,CAAA;CACd;AAED,MAAM,WAAW,iBAAiB;IAChC,OAAO,EAAE,MAAM,CAAA;IACf,aAAa,EAAE,MAAM,CAAA;IACrB,EAAE,EAAE,KAAK,CAAA;IACT,KAAK,EAAE,SAAS,CAAA;CACjB;AAED,wBAAgB,sBAAsB,CAAC,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,SAAS,GAAG,iBAAiB,CAO3F;AAED;;;;GAIG;AACH,wBAAgB,aAAa,CAAC,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,SAAS,GAAG,IAAI,CAGrE"}
|
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
const JSON_CONTRACT_VERSION = 1;
|
|
2
|
+
let jsonEmitted = false;
|
|
3
|
+
/** Whether any JSON payload (success or error) has already been written to stdout. */
|
|
4
|
+
export function hasEmittedJson() {
|
|
5
|
+
return jsonEmitted;
|
|
6
|
+
}
|
|
7
|
+
export function printOutput(value, jsonMode) {
|
|
8
|
+
if (jsonMode) {
|
|
9
|
+
jsonEmitted = true;
|
|
10
|
+
// Catch-all: never emit a bare JSON string. A command that prints a plain
|
|
11
|
+
// string under `--json` (e.g. a status line) is wrapped in a minimal object
|
|
12
|
+
// so the output is always a parseable object for `jq` consumers.
|
|
13
|
+
const payload = typeof value === 'string'
|
|
14
|
+
? { schemaVersion: JSON_CONTRACT_VERSION, message: value }
|
|
15
|
+
: value;
|
|
16
|
+
console.log(JSON.stringify(payload, null, 2));
|
|
17
|
+
return;
|
|
18
|
+
}
|
|
19
|
+
if (typeof value === 'string') {
|
|
20
|
+
console.log(value);
|
|
21
|
+
}
|
|
22
|
+
}
|
|
23
|
+
function jsonPayload(command, payload) {
|
|
24
|
+
return {
|
|
25
|
+
command,
|
|
26
|
+
schemaVersion: JSON_CONTRACT_VERSION,
|
|
27
|
+
...payload,
|
|
28
|
+
};
|
|
29
|
+
}
|
|
30
|
+
export function emitJson(command, payload) {
|
|
31
|
+
printOutput(jsonPayload(command, payload), true);
|
|
32
|
+
}
|
|
33
|
+
export function buildJsonErrorEnvelope(command, error) {
|
|
34
|
+
return {
|
|
35
|
+
command,
|
|
36
|
+
schemaVersion: JSON_CONTRACT_VERSION,
|
|
37
|
+
ok: false,
|
|
38
|
+
error,
|
|
39
|
+
};
|
|
40
|
+
}
|
|
41
|
+
/**
|
|
42
|
+
* Emit a stable machine-readable error envelope to stdout for `--json` consumers.
|
|
43
|
+
* Without this, a thrown error left stdout empty and printed plain text to
|
|
44
|
+
* stderr, breaking any pipe to `jq` on the first failure.
|
|
45
|
+
*/
|
|
46
|
+
export function emitJsonError(command, error) {
|
|
47
|
+
jsonEmitted = true;
|
|
48
|
+
console.log(JSON.stringify(buildJsonErrorEnvelope(command, error), null, 2));
|
|
49
|
+
}
|
|
50
|
+
//# sourceMappingURL=json-output.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"json-output.js","sourceRoot":"","sources":["../../src/runtime/json-output.ts"],"names":[],"mappings":"AASA,MAAM,qBAAqB,GAAG,CAAC,CAAA;AAE/B,IAAI,WAAW,GAAG,KAAK,CAAA;AAEvB,sFAAsF;AACtF,MAAM,UAAU,cAAc;IAC5B,OAAO,WAAW,CAAA;AACpB,CAAC;AAED,MAAM,UAAU,WAAW,CAAC,KAAc,EAAE,QAAiB;IAC3D,IAAI,QAAQ,EAAE,CAAC;QACb,WAAW,GAAG,IAAI,CAAA;QAClB,0EAA0E;QAC1E,4EAA4E;QAC5E,iEAAiE;QACjE,MAAM,OAAO,GACX,OAAO,KAAK,KAAK,QAAQ;YACvB,CAAC,CAAC,EAAE,aAAa,EAAE,qBAAqB,EAAE,OAAO,EAAE,KAAK,EAAE;YAC1D,CAAC,CAAC,KAAK,CAAA;QACX,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,OAAO,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAA;QAC7C,OAAM;IACR,CAAC;IACD,IAAI,OAAO,KAAK,KAAK,QAAQ,EAAE,CAAC;QAC9B,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,CAAA;IACpB,CAAC;AACH,CAAC;AAED,SAAS,WAAW,CAAmB,OAAgB,EAAE,OAAU;IAIjE,OAAO;QACL,OAAO;QACP,aAAa,EAAE,qBAAqB;QACpC,GAAG,OAAO;KACX,CAAA;AACH,CAAC;AAED,MAAM,UAAU,QAAQ,CAAmB,OAAgB,EAAE,OAAU;IACrE,WAAW,CAAC,WAAW,CAAC,OAAO,EAAE,OAAO,CAAC,EAAE,IAAI,CAAC,CAAA;AAClD,CAAC;AAeD,MAAM,UAAU,sBAAsB,CAAC,OAAe,EAAE,KAAgB;IACtE,OAAO;QACL,OAAO;QACP,aAAa,EAAE,qBAAqB;QACpC,EAAE,EAAE,KAAK;QACT,KAAK;KACN,CAAA;AACH,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,aAAa,CAAC,OAAe,EAAE,KAAgB;IAC7D,WAAW,GAAG,IAAI,CAAA;IAClB,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,sBAAsB,CAAC,OAAO,EAAE,KAAK,CAAC,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAA;AAC9E,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"logging.d.ts","sourceRoot":"","sources":["../../src/runtime/logging.ts"],"names":[],"mappings":"AAMA,wBAAgB,mBAAmB,IAAI,IAAI,CAuB1C;AAED,wBAAgB,cAAc,IAAI,OAAO,CAExC"}
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
import process from 'node:process';
|
|
2
|
+
import { configureSync, getConfig, getConsoleSink, getTextFormatter } from '@logtape/logtape';
|
|
3
|
+
const enabled = process.env.CHKIT_DEBUG === '1' || process.env.CHKIT_DEBUG === 'true';
|
|
4
|
+
export function configureCliLogging() {
|
|
5
|
+
if (!enabled || getConfig())
|
|
6
|
+
return;
|
|
7
|
+
configureSync({
|
|
8
|
+
sinks: {
|
|
9
|
+
console: getConsoleSink({
|
|
10
|
+
formatter: getTextFormatter({ timestamp: 'time' }),
|
|
11
|
+
}),
|
|
12
|
+
},
|
|
13
|
+
loggers: [
|
|
14
|
+
{
|
|
15
|
+
category: 'chkit',
|
|
16
|
+
sinks: ['console'],
|
|
17
|
+
lowestLevel: 'debug',
|
|
18
|
+
},
|
|
19
|
+
{
|
|
20
|
+
category: 'logtape',
|
|
21
|
+
sinks: ['console'],
|
|
22
|
+
lowestLevel: 'error',
|
|
23
|
+
},
|
|
24
|
+
],
|
|
25
|
+
reset: true,
|
|
26
|
+
});
|
|
27
|
+
}
|
|
28
|
+
export function isDebugEnabled() {
|
|
29
|
+
return enabled;
|
|
30
|
+
}
|
|
31
|
+
//# sourceMappingURL=logging.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"logging.js","sourceRoot":"","sources":["../../src/runtime/logging.ts"],"names":[],"mappings":"AAAA,OAAO,OAAO,MAAM,cAAc,CAAA;AAElC,OAAO,EAAE,aAAa,EAAE,SAAS,EAAE,cAAc,EAAE,gBAAgB,EAAE,MAAM,kBAAkB,CAAA;AAE7F,MAAM,OAAO,GAAG,OAAO,CAAC,GAAG,CAAC,WAAW,KAAK,GAAG,IAAI,OAAO,CAAC,GAAG,CAAC,WAAW,KAAK,MAAM,CAAA;AAErF,MAAM,UAAU,mBAAmB;IACjC,IAAI,CAAC,OAAO,IAAI,SAAS,EAAE;QAAE,OAAM;IAEnC,aAAa,CAAC;QACZ,KAAK,EAAE;YACL,OAAO,EAAE,cAAc,CAAC;gBACtB,SAAS,EAAE,gBAAgB,CAAC,EAAE,SAAS,EAAE,MAAM,EAAE,CAAC;aACnD,CAAC;SACH;QACD,OAAO,EAAE;YACP;gBACE,QAAQ,EAAE,OAAO;gBACjB,KAAK,EAAE,CAAC,SAAS,CAAC;gBAClB,WAAW,EAAE,OAAO;aACrB;YACD;gBACE,QAAQ,EAAE,SAAS;gBACnB,KAAK,EAAE,CAAC,SAAS,CAAC;gBAClB,WAAW,EAAE,OAAO;aACrB;SACF;QACD,KAAK,EAAE,IAAI;KACZ,CAAC,CAAA;AACJ,CAAC;AAED,MAAM,UAAU,cAAc;IAC5B,OAAO,OAAO,CAAA;AAChB,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"migration-metadata.d.ts","sourceRoot":"","sources":["../../src/runtime/migration-metadata.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,iBAAiB;IAChC,GAAG,CAAC,EAAE,MAAM,CAAA;CACb;AAMD,wBAAgB,wBAAwB,CAAC,GAAG,EAAE,MAAM,GAAG,iBAAiB,CAgBvE"}
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
const KNOWN_KEYS = new Set(['log']);
|
|
2
|
+
const META_LINE = /^--\s*([a-z][a-z0-9-]*)\s*:\s*(.+)$/i;
|
|
3
|
+
export function extractMigrationMetadata(sql) {
|
|
4
|
+
const meta = {};
|
|
5
|
+
for (const rawLine of sql.split('\n')) {
|
|
6
|
+
const line = rawLine.trim();
|
|
7
|
+
if (line === '')
|
|
8
|
+
continue;
|
|
9
|
+
if (!line.startsWith('--'))
|
|
10
|
+
break;
|
|
11
|
+
const match = line.match(META_LINE);
|
|
12
|
+
if (!match)
|
|
13
|
+
continue;
|
|
14
|
+
const key = match[1]?.toLowerCase();
|
|
15
|
+
const value = match[2]?.trim();
|
|
16
|
+
if (!key || !value)
|
|
17
|
+
continue;
|
|
18
|
+
if (!isKnownKey(key))
|
|
19
|
+
continue;
|
|
20
|
+
if (meta[key] !== undefined)
|
|
21
|
+
continue;
|
|
22
|
+
meta[key] = value;
|
|
23
|
+
}
|
|
24
|
+
return meta;
|
|
25
|
+
}
|
|
26
|
+
function isKnownKey(key) {
|
|
27
|
+
return KNOWN_KEYS.has(key);
|
|
28
|
+
}
|
|
29
|
+
//# sourceMappingURL=migration-metadata.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"migration-metadata.js","sourceRoot":"","sources":["../../src/runtime/migration-metadata.ts"],"names":[],"mappings":"AAIA,MAAM,UAAU,GAAG,IAAI,GAAG,CAA0B,CAAC,KAAK,CAAC,CAAC,CAAA;AAE5D,MAAM,SAAS,GAAG,sCAAsC,CAAA;AAExD,MAAM,UAAU,wBAAwB,CAAC,GAAW;IAClD,MAAM,IAAI,GAAsB,EAAE,CAAA;IAClC,KAAK,MAAM,OAAO,IAAI,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC;QACtC,MAAM,IAAI,GAAG,OAAO,CAAC,IAAI,EAAE,CAAA;QAC3B,IAAI,IAAI,KAAK,EAAE;YAAE,SAAQ;QACzB,IAAI,CAAC,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC;YAAE,MAAK;QACjC,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,SAAS,CAAC,CAAA;QACnC,IAAI,CAAC,KAAK;YAAE,SAAQ;QACpB,MAAM,GAAG,GAAG,KAAK,CAAC,CAAC,CAAC,EAAE,WAAW,EAAE,CAAA;QACnC,MAAM,KAAK,GAAG,KAAK,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,CAAA;QAC9B,IAAI,CAAC,GAAG,IAAI,CAAC,KAAK;YAAE,SAAQ;QAC5B,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC;YAAE,SAAQ;QAC9B,IAAI,IAAI,CAAC,GAAG,CAAC,KAAK,SAAS;YAAE,SAAQ;QACrC,IAAI,CAAC,GAAG,CAAC,GAAG,KAAK,CAAA;IACnB,CAAC;IACD,OAAO,IAAI,CAAA;AACb,CAAC;AAED,SAAS,UAAU,CAAC,GAAW;IAC7B,OAAO,UAAU,CAAC,GAAG,CAAC,GAA8B,CAAC,CAAA;AACvD,CAAC"}
|