@rawsql-ts/ztd-cli 0.20.0 → 0.20.2
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/LICENSE +21 -0
- package/dist/commands/agents.d.ts +2 -0
- package/dist/commands/agents.js +68 -0
- package/dist/commands/agents.js.map +1 -0
- package/dist/commands/checkContract.d.ts +46 -0
- package/dist/commands/checkContract.js +359 -0
- package/dist/commands/checkContract.js.map +1 -0
- package/dist/commands/connectionOptions.d.ts +12 -0
- package/dist/commands/connectionOptions.js +22 -0
- package/dist/commands/connectionOptions.js.map +1 -0
- package/dist/commands/ddl.d.ts +7 -0
- package/dist/commands/ddl.js +145 -0
- package/dist/commands/ddl.js.map +1 -0
- package/dist/commands/describe.d.ts +23 -0
- package/dist/commands/describe.js +399 -0
- package/dist/commands/describe.js.map +1 -0
- package/dist/commands/diff.d.ts +24 -0
- package/dist/commands/diff.js +73 -0
- package/dist/commands/diff.js.map +1 -0
- package/dist/commands/genEntities.d.ts +14 -0
- package/dist/commands/genEntities.js +58 -0
- package/dist/commands/genEntities.js.map +1 -0
- package/dist/commands/init.d.ts +104 -0
- package/dist/commands/init.js +1480 -0
- package/dist/commands/init.js.map +1 -0
- package/dist/commands/lint.d.ts +89 -0
- package/dist/commands/lint.js +501 -0
- package/dist/commands/lint.js.map +1 -0
- package/dist/commands/modelGen.d.ts +60 -0
- package/dist/commands/modelGen.js +572 -0
- package/dist/commands/modelGen.js.map +1 -0
- package/dist/commands/options.d.ts +9 -0
- package/dist/commands/options.js +48 -0
- package/dist/commands/options.js.map +1 -0
- package/dist/commands/perf.d.ts +9 -0
- package/dist/commands/perf.js +374 -0
- package/dist/commands/perf.js.map +1 -0
- package/dist/commands/pull.d.ts +21 -0
- package/dist/commands/pull.js +115 -0
- package/dist/commands/pull.js.map +1 -0
- package/dist/commands/query.d.ts +9 -0
- package/dist/commands/query.js +377 -0
- package/dist/commands/query.js.map +1 -0
- package/dist/commands/testEvidence.d.ts +237 -0
- package/dist/commands/testEvidence.js +1220 -0
- package/dist/commands/testEvidence.js.map +1 -0
- package/dist/commands/ztdConfig.d.ts +30 -0
- package/dist/commands/ztdConfig.js +224 -0
- package/dist/commands/ztdConfig.js.map +1 -0
- package/dist/commands/ztdConfigCommand.d.ts +18 -0
- package/dist/commands/ztdConfigCommand.js +268 -0
- package/dist/commands/ztdConfigCommand.js.map +1 -0
- package/dist/index.d.ts +4 -0
- package/dist/index.js +127 -0
- package/dist/index.js.map +1 -0
- package/dist/perf/benchmark.d.ts +277 -0
- package/dist/perf/benchmark.js +2186 -0
- package/dist/perf/benchmark.js.map +1 -0
- package/dist/perf/sandbox.d.ts +73 -0
- package/dist/perf/sandbox.js +492 -0
- package/dist/perf/sandbox.js.map +1 -0
- package/dist/query/analysis.d.ts +20 -0
- package/dist/query/analysis.js +192 -0
- package/dist/query/analysis.js.map +1 -0
- package/dist/query/analyzeColumnUsage.d.ts +10 -0
- package/dist/query/analyzeColumnUsage.js +451 -0
- package/dist/query/analyzeColumnUsage.js.map +1 -0
- package/dist/query/analyzeTableUsage.d.ts +10 -0
- package/dist/query/analyzeTableUsage.js +318 -0
- package/dist/query/analyzeTableUsage.js.map +1 -0
- package/dist/query/execute.d.ts +40 -0
- package/dist/query/execute.js +784 -0
- package/dist/query/execute.js.map +1 -0
- package/dist/query/format.d.ts +1 -0
- package/dist/query/format.js +9 -0
- package/dist/query/format.js.map +1 -0
- package/dist/query/lint.d.ts +29 -0
- package/dist/query/lint.js +340 -0
- package/dist/query/lint.js.map +1 -0
- package/dist/query/location.d.ts +18 -0
- package/dist/query/location.js +204 -0
- package/dist/query/location.js.map +1 -0
- package/dist/query/patch.d.ts +21 -0
- package/dist/query/patch.js +151 -0
- package/dist/query/patch.js.map +1 -0
- package/dist/query/planner.d.ts +31 -0
- package/dist/query/planner.js +134 -0
- package/dist/query/planner.js.map +1 -0
- package/dist/query/report.d.ts +7 -0
- package/dist/query/report.js +19 -0
- package/dist/query/report.js.map +1 -0
- package/dist/query/scalarFilterAnalysis.d.ts +6 -0
- package/dist/query/scalarFilterAnalysis.js +212 -0
- package/dist/query/scalarFilterAnalysis.js.map +1 -0
- package/dist/query/slice.d.ts +17 -0
- package/dist/query/slice.js +204 -0
- package/dist/query/slice.js.map +1 -0
- package/dist/query/structure.d.ts +24 -0
- package/dist/query/structure.js +135 -0
- package/dist/query/structure.js.map +1 -0
- package/dist/query/targets.d.ts +2 -0
- package/dist/query/targets.js +6 -0
- package/dist/query/targets.js.map +1 -0
- package/dist/query/types.d.ts +97 -0
- package/dist/query/types.js +3 -0
- package/dist/query/types.js.map +1 -0
- package/dist/specs/sql/activeOrders.catalog.d.ts +12 -0
- package/dist/specs/sql/activeOrders.catalog.js +36 -0
- package/dist/specs/sql/activeOrders.catalog.js.map +1 -0
- package/dist/specs/sql/usersList.catalog.d.ts +8 -0
- package/dist/specs/sql/usersList.catalog.js +14 -0
- package/dist/specs/sql/usersList.catalog.js.map +1 -0
- package/dist/specs/sqlCatalogDefinition.d.ts +20 -0
- package/dist/specs/sqlCatalogDefinition.js +10 -0
- package/dist/specs/sqlCatalogDefinition.js.map +1 -0
- package/dist/utils/agentCli.d.ts +23 -0
- package/dist/utils/agentCli.js +84 -0
- package/dist/utils/agentCli.js.map +1 -0
- package/dist/utils/agentSafety.d.ts +4 -0
- package/dist/utils/agentSafety.js +50 -0
- package/dist/utils/agentSafety.js.map +1 -0
- package/dist/utils/agents.d.ts +31 -0
- package/dist/utils/agents.js +362 -0
- package/dist/utils/agents.js.map +1 -0
- package/dist/utils/collectSqlFiles.d.ts +9 -0
- package/dist/utils/collectSqlFiles.js +58 -0
- package/dist/utils/collectSqlFiles.js.map +1 -0
- package/dist/utils/connectionSummary.d.ts +3 -0
- package/dist/utils/connectionSummary.js +29 -0
- package/dist/utils/connectionSummary.js.map +1 -0
- package/dist/utils/dbConnection.d.ts +31 -0
- package/dist/utils/dbConnection.js +151 -0
- package/dist/utils/dbConnection.js.map +1 -0
- package/dist/utils/fs.d.ts +1 -0
- package/dist/utils/fs.js +12 -0
- package/dist/utils/fs.js.map +1 -0
- package/dist/utils/modelGenBinder.d.ts +8 -0
- package/dist/utils/modelGenBinder.js +31 -0
- package/dist/utils/modelGenBinder.js.map +1 -0
- package/dist/utils/modelGenRender.d.ts +29 -0
- package/dist/utils/modelGenRender.js +158 -0
- package/dist/utils/modelGenRender.js.map +1 -0
- package/dist/utils/modelGenScanner.d.ts +24 -0
- package/dist/utils/modelGenScanner.js +196 -0
- package/dist/utils/modelGenScanner.js.map +1 -0
- package/dist/utils/modelProbe.d.ts +14 -0
- package/dist/utils/modelProbe.js +121 -0
- package/dist/utils/modelProbe.js.map +1 -0
- package/dist/utils/normalizePulledSchema.d.ts +12 -0
- package/dist/utils/normalizePulledSchema.js +213 -0
- package/dist/utils/normalizePulledSchema.js.map +1 -0
- package/dist/utils/optionalDependencies.d.ts +43 -0
- package/dist/utils/optionalDependencies.js +134 -0
- package/dist/utils/optionalDependencies.js.map +1 -0
- package/dist/utils/pgDump.d.ts +12 -0
- package/dist/utils/pgDump.js +58 -0
- package/dist/utils/pgDump.js.map +1 -0
- package/dist/utils/queryFingerprint.d.ts +14 -0
- package/dist/utils/queryFingerprint.js +34 -0
- package/dist/utils/queryFingerprint.js.map +1 -0
- package/dist/utils/sqlCatalogDiscovery.d.ts +44 -0
- package/dist/utils/sqlCatalogDiscovery.js +166 -0
- package/dist/utils/sqlCatalogDiscovery.js.map +1 -0
- package/dist/utils/sqlCatalogStatements.d.ts +20 -0
- package/dist/utils/sqlCatalogStatements.js +23 -0
- package/dist/utils/sqlCatalogStatements.js.map +1 -0
- package/dist/utils/sqlLintHelpers.d.ts +18 -0
- package/dist/utils/sqlLintHelpers.js +270 -0
- package/dist/utils/sqlLintHelpers.js.map +1 -0
- package/dist/utils/telemetry.d.ts +71 -0
- package/dist/utils/telemetry.js +597 -0
- package/dist/utils/telemetry.js.map +1 -0
- package/dist/utils/typeMapper.d.ts +4 -0
- package/dist/utils/typeMapper.js +79 -0
- package/dist/utils/typeMapper.js.map +1 -0
- package/dist/utils/ztdProjectConfig.d.ts +41 -0
- package/dist/utils/ztdProjectConfig.js +182 -0
- package/dist/utils/ztdProjectConfig.js.map +1 -0
- package/package.json +19 -20
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.DEFAULT_TESTS_DIRECTORY = exports.DEFAULT_DDL_DIRECTORY = exports.DEFAULT_EXTENSIONS = void 0;
|
|
4
|
+
exports.collectDirectories = collectDirectories;
|
|
5
|
+
exports.collectValues = collectValues;
|
|
6
|
+
exports.normalizeDirectoryList = normalizeDirectoryList;
|
|
7
|
+
exports.parseExtensions = parseExtensions;
|
|
8
|
+
exports.resolveExtensions = resolveExtensions;
|
|
9
|
+
exports.parseCsvList = parseCsvList;
|
|
10
|
+
exports.DEFAULT_EXTENSIONS = ['.sql'];
|
|
11
|
+
exports.DEFAULT_DDL_DIRECTORY = 'ztd/ddl';
|
|
12
|
+
exports.DEFAULT_TESTS_DIRECTORY = 'tests';
|
|
13
|
+
const EXTENSION_TOKEN_PATTERN = /^[A-Za-z0-9_]+$/;
|
|
14
|
+
function collectDirectories(value, previous) {
|
|
15
|
+
return [...previous, value];
|
|
16
|
+
}
|
|
17
|
+
function collectValues(value, previous) {
|
|
18
|
+
return [...previous, value];
|
|
19
|
+
}
|
|
20
|
+
function normalizeDirectoryList(userDirectories, fallback) {
|
|
21
|
+
const candidates = (userDirectories !== null && userDirectories !== void 0 ? userDirectories : []).map((entry) => entry.trim()).filter(Boolean);
|
|
22
|
+
// Fall back to the configured default directory when no explicit paths are provided.
|
|
23
|
+
const directories = candidates.length ? candidates : [fallback];
|
|
24
|
+
return Array.from(new Set(directories));
|
|
25
|
+
}
|
|
26
|
+
function parseExtensions(value) {
|
|
27
|
+
const rawEntries = Array.isArray(value) ? value : value.split(',');
|
|
28
|
+
// Clean and normalize each candidate before deduplicating to ensure stable output.
|
|
29
|
+
const cleanedTokens = rawEntries
|
|
30
|
+
.map((entry) => entry.trim())
|
|
31
|
+
.filter((entry) => entry.length > 0 && entry !== '.')
|
|
32
|
+
.map((entry) => (entry.startsWith('.') ? entry.slice(1) : entry))
|
|
33
|
+
.filter((token) => token.length > 0 && EXTENSION_TOKEN_PATTERN.test(token))
|
|
34
|
+
.map((token) => `.${token.toLowerCase()}`);
|
|
35
|
+
return Array.from(new Set(cleanedTokens)).sort();
|
|
36
|
+
}
|
|
37
|
+
function resolveExtensions(input, fallback) {
|
|
38
|
+
// Use user-specified extensions when present; otherwise rely on the default list.
|
|
39
|
+
const normalized = (input === null || input === void 0 ? void 0 : input.length) ? input : fallback;
|
|
40
|
+
return Array.from(new Set(normalized));
|
|
41
|
+
}
|
|
42
|
+
function parseCsvList(value) {
|
|
43
|
+
return value
|
|
44
|
+
.split(',')
|
|
45
|
+
.map((entry) => entry.trim())
|
|
46
|
+
.filter((entry) => entry.length > 0);
|
|
47
|
+
}
|
|
48
|
+
//# sourceMappingURL=options.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"options.js","sourceRoot":"","sources":["../../src/commands/options.ts"],"names":[],"mappings":";;;AAKA,gDAEC;AAED,sCAEC;AAED,wDAKC;AAED,0CAYC;AAED,8CAIC;AAED,oCAKC;AA7CY,QAAA,kBAAkB,GAAG,CAAC,MAAM,CAAC,CAAC;AAC9B,QAAA,qBAAqB,GAAG,SAAS,CAAC;AAClC,QAAA,uBAAuB,GAAG,OAAO,CAAC;AAC/C,MAAM,uBAAuB,GAAG,iBAAiB,CAAC;AAElD,SAAgB,kBAAkB,CAAC,KAAa,EAAE,QAAkB;IAClE,OAAO,CAAC,GAAG,QAAQ,EAAE,KAAK,CAAC,CAAC;AAC9B,CAAC;AAED,SAAgB,aAAa,CAAC,KAAa,EAAE,QAAkB;IAC7D,OAAO,CAAC,GAAG,QAAQ,EAAE,KAAK,CAAC,CAAC;AAC9B,CAAC;AAED,SAAgB,sBAAsB,CAAC,eAAqC,EAAE,QAAgB;IAC5F,MAAM,UAAU,GAAG,CAAC,eAAe,aAAf,eAAe,cAAf,eAAe,GAAI,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;IACxF,qFAAqF;IACrF,MAAM,WAAW,GAAG,UAAU,CAAC,MAAM,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC;IAChE,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,GAAG,CAAC,WAAW,CAAC,CAAC,CAAC;AAC1C,CAAC;AAED,SAAgB,eAAe,CAAC,KAAwB;IACtD,MAAM,UAAU,GAAG,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;IAEnE,mFAAmF;IACnF,MAAM,aAAa,GAAG,UAAU;SAC7B,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC;SAC5B,MAAM,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC,IAAI,KAAK,KAAK,GAAG,CAAC;SACpD,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC,KAAK,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC;SAChE,MAAM,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC,IAAI,uBAAuB,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;SAC1E,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,IAAI,KAAK,CAAC,WAAW,EAAE,EAAE,CAAC,CAAC;IAE7C,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,GAAG,CAAC,aAAa,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;AACnD,CAAC;AAED,SAAgB,iBAAiB,CAAC,KAA2B,EAAE,QAAkB;IAC/E,kFAAkF;IAClF,MAAM,UAAU,GAAG,CAAA,KAAK,aAAL,KAAK,uBAAL,KAAK,CAAE,MAAM,EAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,QAAQ,CAAC;IACpD,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,GAAG,CAAC,UAAU,CAAC,CAAC,CAAC;AACzC,CAAC;AAED,SAAgB,YAAY,CAAC,KAAa;IACxC,OAAO,KAAK;SACT,KAAK,CAAC,GAAG,CAAC;SACV,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC;SAC5B,MAAM,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;AACzC,CAAC"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import { Command } from 'commander';
|
|
2
|
+
export declare const PERF_COMMAND_SPANS: {
|
|
3
|
+
readonly resolveRunOptions: "resolve-perf-run-options";
|
|
4
|
+
readonly executeBenchmark: "execute-perf-benchmark";
|
|
5
|
+
readonly renderBenchmark: "render-perf-report";
|
|
6
|
+
readonly loadDiff: "load-perf-report-diff";
|
|
7
|
+
readonly renderDiff: "render-perf-diff-output";
|
|
8
|
+
};
|
|
9
|
+
export declare function registerPerfCommands(program: Command): void;
|
|
@@ -0,0 +1,374 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
+
};
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
exports.PERF_COMMAND_SPANS = void 0;
|
|
7
|
+
exports.registerPerfCommands = registerPerfCommands;
|
|
8
|
+
const node_path_1 = __importDefault(require("node:path"));
|
|
9
|
+
const rawsql_ts_1 = require("rawsql-ts");
|
|
10
|
+
const sandbox_1 = require("../perf/sandbox");
|
|
11
|
+
const benchmark_1 = require("../perf/benchmark");
|
|
12
|
+
const agentCli_1 = require("../utils/agentCli");
|
|
13
|
+
const collectSqlFiles_1 = require("../utils/collectSqlFiles");
|
|
14
|
+
const telemetry_1 = require("../utils/telemetry");
|
|
15
|
+
const ztdProjectConfig_1 = require("../utils/ztdProjectConfig");
|
|
16
|
+
exports.PERF_COMMAND_SPANS = {
|
|
17
|
+
resolveRunOptions: 'resolve-perf-run-options',
|
|
18
|
+
executeBenchmark: 'execute-perf-benchmark',
|
|
19
|
+
renderBenchmark: 'render-perf-report',
|
|
20
|
+
loadDiff: 'load-perf-report-diff',
|
|
21
|
+
renderDiff: 'render-perf-diff-output',
|
|
22
|
+
};
|
|
23
|
+
function registerPerfCommands(program) {
|
|
24
|
+
const perf = program.command('perf').description('Opt-in perf sandbox workflows for reproducible SQL experiments');
|
|
25
|
+
perf.addHelpText('after', `
|
|
26
|
+
Examples:
|
|
27
|
+
$ ztd perf init
|
|
28
|
+
$ ztd perf db reset --dry-run
|
|
29
|
+
$ ztd perf seed --dry-run
|
|
30
|
+
$ ztd perf run --query src/sql/report.sql --dry-run
|
|
31
|
+
$ ztd perf report diff perf/evidence/run_001 perf/evidence/run_002
|
|
32
|
+
`);
|
|
33
|
+
perf
|
|
34
|
+
.command('init')
|
|
35
|
+
.description('Scaffold the perf sandbox configuration and Docker assets')
|
|
36
|
+
.option('--dry-run', 'Emit the perf scaffold plan without writing files')
|
|
37
|
+
.option('--json <payload>', 'Pass perf init options as a JSON object')
|
|
38
|
+
.action((options) => {
|
|
39
|
+
runPerfInitCommand(options);
|
|
40
|
+
});
|
|
41
|
+
const db = perf.command('db').description('Manage the perf sandbox database');
|
|
42
|
+
db
|
|
43
|
+
.command('reset')
|
|
44
|
+
.description('Recreate the perf sandbox schema from local DDL')
|
|
45
|
+
.option('--dry-run', 'Emit the reset plan without touching Docker or PostgreSQL')
|
|
46
|
+
.option('--json <payload>', 'Pass perf db reset options as a JSON object')
|
|
47
|
+
.action(async (options) => {
|
|
48
|
+
await runPerfDbResetCommand(options);
|
|
49
|
+
});
|
|
50
|
+
perf
|
|
51
|
+
.command('seed')
|
|
52
|
+
.description('Generate deterministic synthetic data from perf/seed.yml')
|
|
53
|
+
.option('--dry-run', 'Emit the seed plan without touching PostgreSQL')
|
|
54
|
+
.option('--json <payload>', 'Pass perf seed options as a JSON object')
|
|
55
|
+
.action(async (options) => {
|
|
56
|
+
await runPerfSeedCommand(options);
|
|
57
|
+
});
|
|
58
|
+
perf
|
|
59
|
+
.command('run')
|
|
60
|
+
.description('Benchmark one SQL query and capture evidence for AI-driven tuning loops')
|
|
61
|
+
.option('--query <sqlFile>', 'SQL file to benchmark inside the perf sandbox')
|
|
62
|
+
.option('--params <path>', 'JSON or YAML file with query parameters (object for named placeholders, array for positional)')
|
|
63
|
+
.option('--strategy <strategy>', 'Execution strategy (direct|decomposed)', 'direct')
|
|
64
|
+
.option('--material <cteNames>', 'Comma-separated CTEs to materialize when --strategy decomposed is used')
|
|
65
|
+
.option('--mode <mode>', 'Benchmark mode (auto|latency|completion)', 'auto')
|
|
66
|
+
.option('--repeat <count>', `Measured repetitions for latency mode (default: ${benchmark_1.PERF_BENCHMARK_DEFAULTS.repeat})`)
|
|
67
|
+
.option('--warmup <count>', `Warmup repetitions for latency mode (default: ${benchmark_1.PERF_BENCHMARK_DEFAULTS.warmup})`)
|
|
68
|
+
.option('--classify-threshold-seconds <seconds>', `Threshold for auto mode classification (default: ${benchmark_1.PERF_BENCHMARK_DEFAULTS.classifyThresholdSeconds})`)
|
|
69
|
+
.option('--timeout-minutes <minutes>', `Timeout for measured runs (default: ${benchmark_1.PERF_BENCHMARK_DEFAULTS.timeoutMinutes})`)
|
|
70
|
+
.option('--save', 'Persist benchmark evidence under perf/evidence/run_xxx')
|
|
71
|
+
.option('--dry-run', 'Resolve mode, params, and evidence shape without touching PostgreSQL')
|
|
72
|
+
.option('--label <name>', 'Attach a short label to the saved run directory')
|
|
73
|
+
.option('--json <payload>', 'Pass perf run options as a JSON object')
|
|
74
|
+
.action(async (options) => {
|
|
75
|
+
await runPerfRunCommand(options);
|
|
76
|
+
});
|
|
77
|
+
const report = perf.command('report').description('Compare saved perf benchmark evidence');
|
|
78
|
+
report
|
|
79
|
+
.command('diff <baselineDir> <candidateDir>')
|
|
80
|
+
.description('Compare two saved perf benchmark runs and highlight the primary metric delta')
|
|
81
|
+
.option('--format <format>', 'Output format (text|json)', 'text')
|
|
82
|
+
.option('--json <payload>', 'Pass perf report diff options as a JSON object')
|
|
83
|
+
.action((baselineDir, candidateDir, options) => {
|
|
84
|
+
runPerfReportDiffCommand(baselineDir, candidateDir, options);
|
|
85
|
+
});
|
|
86
|
+
}
|
|
87
|
+
function runPerfInitCommand(options) {
|
|
88
|
+
const merged = resolvePerfOptions(options);
|
|
89
|
+
const plan = (0, sandbox_1.buildPerfInitPlan)(process.cwd());
|
|
90
|
+
if (merged.dryRun) {
|
|
91
|
+
emitPerfResult('perf init', {
|
|
92
|
+
dryRun: true,
|
|
93
|
+
files: plan.files.map((file) => node_path_1.default.relative(process.cwd(), file.path).replace(/\\/g, '/'))
|
|
94
|
+
});
|
|
95
|
+
return;
|
|
96
|
+
}
|
|
97
|
+
const written = (0, sandbox_1.applyPerfInitPlan)(plan).map((file) => node_path_1.default.relative(process.cwd(), file).replace(/\\/g, '/'));
|
|
98
|
+
emitPerfResult('perf init', {
|
|
99
|
+
dryRun: false,
|
|
100
|
+
files: written
|
|
101
|
+
}, [`Perf sandbox initialized.`, ...written.map((file) => `- ${file}`)]);
|
|
102
|
+
}
|
|
103
|
+
async function runPerfDbResetCommand(options) {
|
|
104
|
+
const merged = resolvePerfOptions(options);
|
|
105
|
+
const ddlInventory = (0, sandbox_1.inspectPerfDdlInventory)(process.cwd(), { requireExistingDdlDir: true });
|
|
106
|
+
if (merged.dryRun) {
|
|
107
|
+
emitPerfResult('perf db reset', {
|
|
108
|
+
dryRun: true,
|
|
109
|
+
ddl_files: ddlInventory.files,
|
|
110
|
+
ddl_file_count: ddlInventory.files.length,
|
|
111
|
+
ddl_statement_count: ddlInventory.ddlStatementCount,
|
|
112
|
+
table_count: ddlInventory.tableCount,
|
|
113
|
+
index_count: ddlInventory.indexCount,
|
|
114
|
+
index_names: ddlInventory.indexNames
|
|
115
|
+
});
|
|
116
|
+
return;
|
|
117
|
+
}
|
|
118
|
+
const result = await (0, sandbox_1.resetPerfSandbox)(process.cwd());
|
|
119
|
+
const displayConnectionUrl = toDisplayConnectionUrl(result.connectionUrl);
|
|
120
|
+
const appliedInventory = (0, sandbox_1.inspectPerfDdlInventory)(process.cwd(), { requireExistingDdlDir: true });
|
|
121
|
+
emitPerfResult('perf db reset', {
|
|
122
|
+
dryRun: false,
|
|
123
|
+
connection_url: displayConnectionUrl,
|
|
124
|
+
used_docker: result.usedDocker,
|
|
125
|
+
ddl_files: result.appliedFiles,
|
|
126
|
+
ddl_statement_count: result.ddlStatements,
|
|
127
|
+
table_count: appliedInventory.tableCount,
|
|
128
|
+
index_count: appliedInventory.indexCount,
|
|
129
|
+
index_names: appliedInventory.indexNames
|
|
130
|
+
}, [
|
|
131
|
+
`Perf sandbox reset complete.`,
|
|
132
|
+
`Connection: ${displayConnectionUrl}`,
|
|
133
|
+
`DDL files: ${result.appliedFiles.length}`,
|
|
134
|
+
`DDL statements: ${result.ddlStatements}`,
|
|
135
|
+
`Tables: ${appliedInventory.tableCount}`,
|
|
136
|
+
`Indexes: ${appliedInventory.indexCount}`
|
|
137
|
+
]);
|
|
138
|
+
}
|
|
139
|
+
async function runPerfSeedCommand(options) {
|
|
140
|
+
const merged = resolvePerfOptions(options);
|
|
141
|
+
if (merged.dryRun) {
|
|
142
|
+
const plan = buildPerfSeedDryRunPlan(process.cwd());
|
|
143
|
+
emitPerfResult('perf seed', {
|
|
144
|
+
dryRun: true,
|
|
145
|
+
seed: plan.seed,
|
|
146
|
+
tables: plan.tables
|
|
147
|
+
});
|
|
148
|
+
return;
|
|
149
|
+
}
|
|
150
|
+
const result = await (0, sandbox_1.seedPerfSandbox)(process.cwd());
|
|
151
|
+
const displayConnectionUrl = toDisplayConnectionUrl(result.connectionUrl);
|
|
152
|
+
emitPerfResult('perf seed', {
|
|
153
|
+
dryRun: false,
|
|
154
|
+
connection_url: displayConnectionUrl,
|
|
155
|
+
used_docker: result.usedDocker,
|
|
156
|
+
seed: result.seed,
|
|
157
|
+
inserted_rows: result.insertedRows
|
|
158
|
+
}, [
|
|
159
|
+
`Perf seed complete.`,
|
|
160
|
+
`Connection: ${displayConnectionUrl}`,
|
|
161
|
+
`Seed: ${result.seed}`,
|
|
162
|
+
...Object.entries(result.insertedRows).map(([tableName, rows]) => `- ${tableName}: ${rows} rows`)
|
|
163
|
+
]);
|
|
164
|
+
}
|
|
165
|
+
async function runPerfRunCommand(options) {
|
|
166
|
+
const resolved = (0, telemetry_1.withSpanSync)(exports.PERF_COMMAND_SPANS.resolveRunOptions, () => {
|
|
167
|
+
var _a, _b;
|
|
168
|
+
const merged = options.json ? { ...options, ...(0, agentCli_1.parseJsonPayload)(options.json, '--json') } : options;
|
|
169
|
+
const queryFile = normalizeRequiredStringOption(merged.query, '--query');
|
|
170
|
+
return {
|
|
171
|
+
rootDir: process.cwd(),
|
|
172
|
+
queryFile,
|
|
173
|
+
paramsFile: normalizeOptionalStringOption(merged.params),
|
|
174
|
+
strategy: normalizePerfStrategy((_a = normalizeOptionalStringOption(merged.strategy)) !== null && _a !== void 0 ? _a : 'direct'),
|
|
175
|
+
material: normalizeCsvListOption(merged.material),
|
|
176
|
+
mode: normalizeBenchmarkMode((_b = normalizeOptionalStringOption(merged.mode)) !== null && _b !== void 0 ? _b : 'auto'),
|
|
177
|
+
repeat: normalizePositiveIntegerOption(merged.repeat, '--repeat', benchmark_1.PERF_BENCHMARK_DEFAULTS.repeat),
|
|
178
|
+
warmup: normalizeNonNegativeIntegerOption(merged.warmup, '--warmup', benchmark_1.PERF_BENCHMARK_DEFAULTS.warmup),
|
|
179
|
+
classifyThresholdSeconds: normalizePositiveIntegerOption(merged.classifyThresholdSeconds, '--classify-threshold-seconds', benchmark_1.PERF_BENCHMARK_DEFAULTS.classifyThresholdSeconds),
|
|
180
|
+
timeoutMinutes: normalizePositiveIntegerOption(merged.timeoutMinutes, '--timeout-minutes', benchmark_1.PERF_BENCHMARK_DEFAULTS.timeoutMinutes),
|
|
181
|
+
save: normalizeBooleanOption(merged.save),
|
|
182
|
+
dryRun: normalizeBooleanOption(merged.dryRun),
|
|
183
|
+
label: normalizeOptionalStringOption(merged.label)
|
|
184
|
+
};
|
|
185
|
+
}, {
|
|
186
|
+
jsonPayload: Boolean(options.json),
|
|
187
|
+
});
|
|
188
|
+
const report = await (0, telemetry_1.withSpan)(exports.PERF_COMMAND_SPANS.executeBenchmark, () => {
|
|
189
|
+
return (0, benchmark_1.runPerfBenchmark)(resolved);
|
|
190
|
+
}, {
|
|
191
|
+
strategy: resolved.strategy,
|
|
192
|
+
requestedMode: resolved.mode,
|
|
193
|
+
save: resolved.save,
|
|
194
|
+
dryRun: resolved.dryRun,
|
|
195
|
+
});
|
|
196
|
+
(0, telemetry_1.withSpanSync)(exports.PERF_COMMAND_SPANS.renderBenchmark, () => {
|
|
197
|
+
emitPerfReport('perf run', report);
|
|
198
|
+
}, {
|
|
199
|
+
selectedMode: report.selected_mode,
|
|
200
|
+
strategy: report.strategy,
|
|
201
|
+
saved: report.saved,
|
|
202
|
+
dryRun: report.dry_run,
|
|
203
|
+
});
|
|
204
|
+
}
|
|
205
|
+
function runPerfReportDiffCommand(baselineDir, candidateDir, options) {
|
|
206
|
+
const resolved = (0, telemetry_1.withSpanSync)(exports.PERF_COMMAND_SPANS.loadDiff, () => {
|
|
207
|
+
const merged = options.json ? { ...options, ...(0, agentCli_1.parseJsonPayload)(options.json, '--json') } : options;
|
|
208
|
+
const format = normalizePerfFormat(normalizeOptionalStringOption(merged.format));
|
|
209
|
+
const report = (0, benchmark_1.diffPerfBenchmarkReports)(node_path_1.default.resolve(process.cwd(), baselineDir), node_path_1.default.resolve(process.cwd(), candidateDir));
|
|
210
|
+
return { format, report };
|
|
211
|
+
}, {
|
|
212
|
+
jsonPayload: Boolean(options.json),
|
|
213
|
+
});
|
|
214
|
+
if ((0, agentCli_1.isJsonOutput)()) {
|
|
215
|
+
(0, telemetry_1.withSpanSync)(exports.PERF_COMMAND_SPANS.renderDiff, () => {
|
|
216
|
+
(0, agentCli_1.writeCommandEnvelope)('perf report diff', resolved.report);
|
|
217
|
+
}, {
|
|
218
|
+
format: resolved.format,
|
|
219
|
+
});
|
|
220
|
+
return;
|
|
221
|
+
}
|
|
222
|
+
(0, telemetry_1.withSpanSync)(exports.PERF_COMMAND_SPANS.renderDiff, () => {
|
|
223
|
+
process.stdout.write((0, benchmark_1.formatPerfDiffReport)(resolved.report, resolved.format));
|
|
224
|
+
}, {
|
|
225
|
+
format: resolved.format,
|
|
226
|
+
});
|
|
227
|
+
}
|
|
228
|
+
function buildPerfSeedDryRunPlan(rootDir) {
|
|
229
|
+
const config = (0, ztdProjectConfig_1.loadZtdProjectConfig)(rootDir);
|
|
230
|
+
const seedConfig = (0, sandbox_1.loadPerfSeedConfig)(rootDir);
|
|
231
|
+
const ddlSources = (0, collectSqlFiles_1.collectSqlFiles)([node_path_1.default.resolve(rootDir, config.ddlDir)], ['.sql']);
|
|
232
|
+
const definitions = ddlSources.flatMap((source) => {
|
|
233
|
+
const split = rawsql_ts_1.MultiQuerySplitter.split(source.sql);
|
|
234
|
+
return split.queries.flatMap((chunk) => {
|
|
235
|
+
const sql = chunk.sql.trim();
|
|
236
|
+
if (!sql) {
|
|
237
|
+
return [];
|
|
238
|
+
}
|
|
239
|
+
const parsed = rawsql_ts_1.SqlParser.parse(sql);
|
|
240
|
+
if (!(parsed instanceof rawsql_ts_1.CreateTableQuery)) {
|
|
241
|
+
return [];
|
|
242
|
+
}
|
|
243
|
+
return [(0, rawsql_ts_1.createTableDefinitionFromCreateTableQuery)(parsed)];
|
|
244
|
+
});
|
|
245
|
+
});
|
|
246
|
+
const tables = Object.fromEntries(Object.entries(seedConfig.tables).map(([tableName, tableConfig]) => {
|
|
247
|
+
const definition = definitions.find((candidate) => candidate.name === tableName || candidate.name === `${config.ddl.defaultSchema}.${tableName}`);
|
|
248
|
+
if (!definition) {
|
|
249
|
+
throw new Error(`No table definition found for perf seed table: ${tableName}`);
|
|
250
|
+
}
|
|
251
|
+
return [definition.name, (0, sandbox_1.buildInsertStatementsForTable)(definition, tableConfig.rows, seedConfig).length];
|
|
252
|
+
}));
|
|
253
|
+
return { seed: seedConfig.seed, tables };
|
|
254
|
+
}
|
|
255
|
+
function toDisplayConnectionUrl(connectionUrl) {
|
|
256
|
+
try {
|
|
257
|
+
const parsed = new URL(connectionUrl);
|
|
258
|
+
return `${parsed.protocol}//${parsed.host}${parsed.pathname}`;
|
|
259
|
+
}
|
|
260
|
+
catch {
|
|
261
|
+
return '[unavailable]';
|
|
262
|
+
}
|
|
263
|
+
}
|
|
264
|
+
function emitPerfResult(command, data, textLines) {
|
|
265
|
+
if ((0, agentCli_1.isJsonOutput)()) {
|
|
266
|
+
(0, agentCli_1.writeCommandEnvelope)(command, data);
|
|
267
|
+
return;
|
|
268
|
+
}
|
|
269
|
+
if (textLines) {
|
|
270
|
+
process.stdout.write(`${textLines.join('\n')}\n`);
|
|
271
|
+
return;
|
|
272
|
+
}
|
|
273
|
+
process.stdout.write(`${JSON.stringify(data, null, 2)}\n`);
|
|
274
|
+
}
|
|
275
|
+
function emitPerfReport(command, report) {
|
|
276
|
+
if ((0, agentCli_1.isJsonOutput)()) {
|
|
277
|
+
(0, agentCli_1.writeCommandEnvelope)(command, report);
|
|
278
|
+
return;
|
|
279
|
+
}
|
|
280
|
+
process.stdout.write((0, benchmark_1.formatPerfBenchmarkReport)(report, 'text'));
|
|
281
|
+
}
|
|
282
|
+
function resolvePerfOptions(options) {
|
|
283
|
+
const merged = options.json
|
|
284
|
+
? { ...options, ...(0, agentCli_1.parseJsonPayload)(options.json, '--json') }
|
|
285
|
+
: options;
|
|
286
|
+
if (merged.dryRun !== undefined && typeof merged.dryRun !== 'boolean') {
|
|
287
|
+
throw new Error('Expected --dry-run to resolve to a boolean.');
|
|
288
|
+
}
|
|
289
|
+
return {
|
|
290
|
+
dryRun: Boolean(merged.dryRun)
|
|
291
|
+
};
|
|
292
|
+
}
|
|
293
|
+
function normalizeOptionalStringOption(value) {
|
|
294
|
+
if (value === undefined || value === null || value === '') {
|
|
295
|
+
return undefined;
|
|
296
|
+
}
|
|
297
|
+
if (typeof value !== 'string') {
|
|
298
|
+
throw new Error(`Expected a string option but received ${typeof value}.`);
|
|
299
|
+
}
|
|
300
|
+
return value;
|
|
301
|
+
}
|
|
302
|
+
function normalizeRequiredStringOption(value, label) {
|
|
303
|
+
const normalized = normalizeOptionalStringOption(value);
|
|
304
|
+
if (!normalized) {
|
|
305
|
+
throw new Error(`${label} is required.`);
|
|
306
|
+
}
|
|
307
|
+
return normalized;
|
|
308
|
+
}
|
|
309
|
+
function normalizeBooleanOption(value) {
|
|
310
|
+
if (value === undefined) {
|
|
311
|
+
return false;
|
|
312
|
+
}
|
|
313
|
+
if (typeof value !== 'boolean') {
|
|
314
|
+
throw new Error(`Expected a boolean option but received ${typeof value}.`);
|
|
315
|
+
}
|
|
316
|
+
return value;
|
|
317
|
+
}
|
|
318
|
+
function normalizePositiveIntegerOption(value, label, fallback) {
|
|
319
|
+
if (value === undefined || value === null || value === '') {
|
|
320
|
+
return fallback;
|
|
321
|
+
}
|
|
322
|
+
const parsed = Number(value);
|
|
323
|
+
if (!Number.isInteger(parsed) || parsed <= 0) {
|
|
324
|
+
throw new Error(`${label} must be a positive integer.`);
|
|
325
|
+
}
|
|
326
|
+
return parsed;
|
|
327
|
+
}
|
|
328
|
+
function normalizeNonNegativeIntegerOption(value, label, fallback) {
|
|
329
|
+
if (value === undefined || value === null || value === '') {
|
|
330
|
+
return fallback;
|
|
331
|
+
}
|
|
332
|
+
const parsed = Number(value);
|
|
333
|
+
if (!Number.isInteger(parsed) || parsed < 0) {
|
|
334
|
+
throw new Error(`${label} must be a non-negative integer.`);
|
|
335
|
+
}
|
|
336
|
+
return parsed;
|
|
337
|
+
}
|
|
338
|
+
function normalizeCsvListOption(value) {
|
|
339
|
+
if (Array.isArray(value)) {
|
|
340
|
+
return value.map((entry) => {
|
|
341
|
+
if (typeof entry !== 'string') {
|
|
342
|
+
throw new Error(`Expected material entries to be strings but received ${typeof entry}.`);
|
|
343
|
+
}
|
|
344
|
+
return entry.trim();
|
|
345
|
+
}).filter(Boolean);
|
|
346
|
+
}
|
|
347
|
+
const normalized = normalizeOptionalStringOption(value);
|
|
348
|
+
if (!normalized) {
|
|
349
|
+
return [];
|
|
350
|
+
}
|
|
351
|
+
return normalized.split(',').map((entry) => entry.trim()).filter(Boolean);
|
|
352
|
+
}
|
|
353
|
+
function normalizePerfStrategy(value) {
|
|
354
|
+
const normalized = value.trim().toLowerCase();
|
|
355
|
+
if (normalized === 'direct' || normalized === 'decomposed') {
|
|
356
|
+
return normalized;
|
|
357
|
+
}
|
|
358
|
+
throw new Error(`Unsupported perf execution strategy: ${value}`);
|
|
359
|
+
}
|
|
360
|
+
function normalizeBenchmarkMode(value) {
|
|
361
|
+
const normalized = value.trim().toLowerCase();
|
|
362
|
+
if (normalized === 'auto' || normalized === 'latency' || normalized === 'completion') {
|
|
363
|
+
return normalized;
|
|
364
|
+
}
|
|
365
|
+
throw new Error(`Unsupported perf benchmark mode: ${value}`);
|
|
366
|
+
}
|
|
367
|
+
function normalizePerfFormat(value) {
|
|
368
|
+
const normalized = (value !== null && value !== void 0 ? value : 'text').trim().toLowerCase();
|
|
369
|
+
if (normalized === 'text' || normalized === 'json') {
|
|
370
|
+
return normalized;
|
|
371
|
+
}
|
|
372
|
+
throw new Error(`Unsupported format: ${value}`);
|
|
373
|
+
}
|
|
374
|
+
//# sourceMappingURL=perf.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"perf.js","sourceRoot":"","sources":["../../src/commands/perf.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
import type { DbConnectionContext } from '../utils/dbConnection';
|
|
2
|
+
export interface PullSchemaOptions {
|
|
3
|
+
url: string;
|
|
4
|
+
out: string;
|
|
5
|
+
pgDumpPath?: string;
|
|
6
|
+
pgDumpShell?: boolean;
|
|
7
|
+
schemas?: string[];
|
|
8
|
+
tables?: string[];
|
|
9
|
+
connectionContext?: DbConnectionContext;
|
|
10
|
+
dryRun?: boolean;
|
|
11
|
+
}
|
|
12
|
+
export interface PullSchemaResult {
|
|
13
|
+
outDir: string;
|
|
14
|
+
files: Array<{
|
|
15
|
+
schema: string;
|
|
16
|
+
filePath: string;
|
|
17
|
+
contents: string;
|
|
18
|
+
}>;
|
|
19
|
+
dryRun: boolean;
|
|
20
|
+
}
|
|
21
|
+
export declare function runPullSchema(options: PullSchemaOptions): PullSchemaResult;
|
|
@@ -0,0 +1,115 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
+
};
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
exports.runPullSchema = runPullSchema;
|
|
7
|
+
const node_fs_1 = require("node:fs");
|
|
8
|
+
const node_path_1 = __importDefault(require("node:path"));
|
|
9
|
+
const pgDump_1 = require("../utils/pgDump");
|
|
10
|
+
const fs_1 = require("../utils/fs");
|
|
11
|
+
const normalizePulledSchema_1 = require("../utils/normalizePulledSchema");
|
|
12
|
+
function runPullSchema(options) {
|
|
13
|
+
var _a, _b;
|
|
14
|
+
// Canonicalize CLI filters before invoking pg_dump so later steps can rely on consistent casing.
|
|
15
|
+
const schemaFilters = ((_a = options.schemas) !== null && _a !== void 0 ? _a : []).map((value) => normalizeSchemaName(value));
|
|
16
|
+
const tableFilters = ((_b = options.tables) !== null && _b !== void 0 ? _b : []).map((value) => parseTableSpecifier(value));
|
|
17
|
+
// Build the schema set that should survive the normalization pass.
|
|
18
|
+
const allowedSchemas = buildAllowedSchemas(schemaFilters, tableFilters);
|
|
19
|
+
// Invoke pg_dump once with the normalized filters so only the desired objects are exported.
|
|
20
|
+
const ddlSql = (0, pgDump_1.runPgDump)({
|
|
21
|
+
url: options.url,
|
|
22
|
+
pgDumpPath: options.pgDumpPath,
|
|
23
|
+
pgDumpShell: options.pgDumpShell,
|
|
24
|
+
extraArgs: buildPgDumpArguments(schemaFilters, tableFilters),
|
|
25
|
+
connectionContext: options.connectionContext
|
|
26
|
+
});
|
|
27
|
+
// Normalize and bucket the pg_dump output while respecting the requested schema set.
|
|
28
|
+
const normalizedMap = (0, normalizePulledSchema_1.normalizePulledSchema)(ddlSql, {
|
|
29
|
+
allowedSchemas: allowedSchemas.size ? allowedSchemas : undefined
|
|
30
|
+
});
|
|
31
|
+
if (normalizedMap.size === 0) {
|
|
32
|
+
// Help callers realize their filters may have excluded everything from the dump.
|
|
33
|
+
const filterHints = [];
|
|
34
|
+
if (schemaFilters.length) {
|
|
35
|
+
filterHints.push(`--schema ${schemaFilters.join(', ')}`);
|
|
36
|
+
}
|
|
37
|
+
if (tableFilters.length) {
|
|
38
|
+
filterHints.push(`--table ${tableFilters.map((table) => table.original).join(', ')}`);
|
|
39
|
+
}
|
|
40
|
+
const hint = filterHints.length ? ` Filters applied: ${filterHints.join('; ')}.` : '';
|
|
41
|
+
throw new Error(`The dump did not contain any supported DDL statements.${hint} Verify the schema/table filters match your database.`);
|
|
42
|
+
}
|
|
43
|
+
const outDir = node_path_1.default.resolve(options.out);
|
|
44
|
+
const files = Array.from(normalizedMap.entries())
|
|
45
|
+
.sort(([schemaA], [schemaB]) => schemaA.localeCompare(schemaB))
|
|
46
|
+
.map(([schema, statements]) => ({
|
|
47
|
+
schema,
|
|
48
|
+
filePath: node_path_1.default.join(outDir, `${sanitizeSchemaFileName(schema)}.sql`),
|
|
49
|
+
contents: buildSchemaFile(statements)
|
|
50
|
+
}));
|
|
51
|
+
if (!options.dryRun) {
|
|
52
|
+
(0, fs_1.ensureDirectory)(outDir);
|
|
53
|
+
// Remove the legacy schema.sql snapshot only when it is still present.
|
|
54
|
+
const legacySchemaFile = node_path_1.default.join(outDir, 'schema.sql');
|
|
55
|
+
if ((0, node_fs_1.existsSync)(legacySchemaFile)) {
|
|
56
|
+
(0, node_fs_1.rmSync)(legacySchemaFile, { force: true });
|
|
57
|
+
}
|
|
58
|
+
const schemasDir = node_path_1.default.join(outDir, 'schemas');
|
|
59
|
+
if ((0, node_fs_1.existsSync)(schemasDir)) {
|
|
60
|
+
(0, node_fs_1.rmSync)(schemasDir, { recursive: true, force: true });
|
|
61
|
+
}
|
|
62
|
+
// Persist each schema snapshot directly under the DDL directory for easier discovery.
|
|
63
|
+
for (const file of files) {
|
|
64
|
+
(0, node_fs_1.writeFileSync)(file.filePath, file.contents, 'utf8');
|
|
65
|
+
console.log(`Wrote normalized schema for ${file.schema} at ${file.filePath}`);
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
return { outDir, files, dryRun: Boolean(options.dryRun) };
|
|
69
|
+
}
|
|
70
|
+
function buildPgDumpArguments(schemaFilters, tableFilters) {
|
|
71
|
+
// Allow callers to target specific schemas or tables when invoking pg_dump.
|
|
72
|
+
const args = [];
|
|
73
|
+
for (const schema of schemaFilters) {
|
|
74
|
+
args.push('--schema', schema);
|
|
75
|
+
}
|
|
76
|
+
for (const table of tableFilters) {
|
|
77
|
+
args.push('--table', table.original);
|
|
78
|
+
}
|
|
79
|
+
return args;
|
|
80
|
+
}
|
|
81
|
+
function buildAllowedSchemas(schemaFilters, tableFilters) {
|
|
82
|
+
// Combine the schemas referenced via filters so the normalizer can limit output.
|
|
83
|
+
const combined = new Set(schemaFilters);
|
|
84
|
+
for (const table of tableFilters) {
|
|
85
|
+
combined.add(table.schema);
|
|
86
|
+
}
|
|
87
|
+
return combined;
|
|
88
|
+
}
|
|
89
|
+
function buildSchemaFile(statements) {
|
|
90
|
+
// Join the sorted statements with blank lines so the file stays readable.
|
|
91
|
+
const body = statements.map((statement) => statement.sql).join('\n\n');
|
|
92
|
+
return `${body}\n`;
|
|
93
|
+
}
|
|
94
|
+
function sanitizeSchemaFileName(schema) {
|
|
95
|
+
const sanitized = schema.replace(/[^a-z0-9_-]/g, '_').replace(/^_+|_+$/g, '');
|
|
96
|
+
// Fall back to a safe default when all characters were stripped away.
|
|
97
|
+
return sanitized || 'schema';
|
|
98
|
+
}
|
|
99
|
+
function normalizeSchemaName(value) {
|
|
100
|
+
// Trim, unquote, and lowercase schema names to keep filter comparison predictable.
|
|
101
|
+
return value.trim().replace(/^"|"$/g, '').toLowerCase();
|
|
102
|
+
}
|
|
103
|
+
function parseTableSpecifier(value) {
|
|
104
|
+
var _a, _b;
|
|
105
|
+
const trimmed = value.trim();
|
|
106
|
+
const qualifiedPattern = /^\s*(?:"([^"]+)"|([^".\s]+))\.(?:"([^"]+)"|([^".\s]+))\s*$/;
|
|
107
|
+
const match = trimmed.match(qualifiedPattern);
|
|
108
|
+
// Resolve the schema portion, falling back to public when the specifier is unqualified.
|
|
109
|
+
const schema = match ? (_b = (_a = match[1]) !== null && _a !== void 0 ? _a : match[2]) !== null && _b !== void 0 ? _b : 'public' : 'public';
|
|
110
|
+
return {
|
|
111
|
+
schema: normalizeSchemaName(schema),
|
|
112
|
+
original: trimmed
|
|
113
|
+
};
|
|
114
|
+
}
|
|
115
|
+
//# sourceMappingURL=pull.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"pull.js","sourceRoot":"","sources":["../../src/commands/pull.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import { Command } from 'commander';
|
|
2
|
+
export declare const QUERY_USES_COMMAND_SPANS: {
|
|
3
|
+
readonly resolveOptions: "resolve-query-options";
|
|
4
|
+
readonly renderOutput: "render-query-usage-output";
|
|
5
|
+
};
|
|
6
|
+
/**
|
|
7
|
+
* Register strict-first impact investigation commands on the CLI root.
|
|
8
|
+
*/
|
|
9
|
+
export declare function registerQueryCommands(program: Command): void;
|