@rawsql-ts/ztd-cli 0.19.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/README.md +4 -4
- 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
- package/templates/README.md +1 -1
- package/templates/README.webapi.md +1 -1
- package/templates/src/catalog/runtime/_coercions.local-source.ts +0 -30
- package/templates/src/local/sql-contract.ts +0 -1
|
@@ -0,0 +1,492 @@
|
|
|
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.resolvePerfExternalDatabaseUrl = resolvePerfExternalDatabaseUrl;
|
|
7
|
+
exports.buildPerfInitPlan = buildPerfInitPlan;
|
|
8
|
+
exports.applyPerfInitPlan = applyPerfInitPlan;
|
|
9
|
+
exports.inspectPerfDdlInventory = inspectPerfDdlInventory;
|
|
10
|
+
exports.resetPerfSandbox = resetPerfSandbox;
|
|
11
|
+
exports.seedPerfSandbox = seedPerfSandbox;
|
|
12
|
+
exports.parsePerfSeedYaml = parsePerfSeedYaml;
|
|
13
|
+
exports.buildInsertStatementsForTable = buildInsertStatementsForTable;
|
|
14
|
+
exports.loadPerfSandboxConfig = loadPerfSandboxConfig;
|
|
15
|
+
exports.loadPerfSeedConfig = loadPerfSeedConfig;
|
|
16
|
+
exports.ensurePerfConnection = ensurePerfConnection;
|
|
17
|
+
const node_fs_1 = require("node:fs");
|
|
18
|
+
const node_path_1 = __importDefault(require("node:path"));
|
|
19
|
+
const node_child_process_1 = require("node:child_process");
|
|
20
|
+
const rawsql_ts_1 = require("rawsql-ts");
|
|
21
|
+
const collectSqlFiles_1 = require("../utils/collectSqlFiles");
|
|
22
|
+
const optionalDependencies_1 = require("../utils/optionalDependencies");
|
|
23
|
+
const ztdProjectConfig_1 = require("../utils/ztdProjectConfig");
|
|
24
|
+
function resolvePerfExternalDatabaseUrl(env = process.env) {
|
|
25
|
+
var _a;
|
|
26
|
+
const explicitUrl = ((_a = env.ZTD_TEST_DATABASE_URL) !== null && _a !== void 0 ? _a : '').trim();
|
|
27
|
+
return explicitUrl || null;
|
|
28
|
+
}
|
|
29
|
+
const DEFAULT_PERF_SANDBOX = {
|
|
30
|
+
dockerImage: 'postgres:16-alpine',
|
|
31
|
+
containerName: 'ztd-perf-sandbox',
|
|
32
|
+
database: 'ztd_perf',
|
|
33
|
+
username: 'ztd_perf',
|
|
34
|
+
password: 'ztd_perf',
|
|
35
|
+
port: 55432,
|
|
36
|
+
seed: 496
|
|
37
|
+
};
|
|
38
|
+
const PERF_DIRECTORY = 'perf';
|
|
39
|
+
const PERF_SANDBOX_CONFIG = 'sandbox.json';
|
|
40
|
+
const PERF_SEED_CONFIG = 'seed.yml';
|
|
41
|
+
const PERF_PARAMS_CONFIG = 'params.yml';
|
|
42
|
+
const PERF_DOCKER_COMPOSE = 'docker-compose.yml';
|
|
43
|
+
const PERF_README = 'README.md';
|
|
44
|
+
const PERF_GITIGNORE = '.gitignore';
|
|
45
|
+
function buildPerfInitPlan(rootDir) {
|
|
46
|
+
const perfDir = node_path_1.default.join(rootDir, PERF_DIRECTORY);
|
|
47
|
+
const sandbox = DEFAULT_PERF_SANDBOX;
|
|
48
|
+
return {
|
|
49
|
+
rootDir,
|
|
50
|
+
files: [
|
|
51
|
+
{
|
|
52
|
+
path: node_path_1.default.join(perfDir, PERF_SANDBOX_CONFIG),
|
|
53
|
+
contents: `${JSON.stringify(sandbox, null, 2)}\n`
|
|
54
|
+
},
|
|
55
|
+
{
|
|
56
|
+
path: node_path_1.default.join(perfDir, PERF_SEED_CONFIG),
|
|
57
|
+
contents: buildDefaultSeedYaml(sandbox.seed)
|
|
58
|
+
},
|
|
59
|
+
{
|
|
60
|
+
path: node_path_1.default.join(perfDir, PERF_PARAMS_CONFIG),
|
|
61
|
+
contents: ['# Default benchmark parameter presets for future perf runs.', 'params: {}', ''].join('\n')
|
|
62
|
+
},
|
|
63
|
+
{
|
|
64
|
+
path: node_path_1.default.join(perfDir, PERF_DOCKER_COMPOSE),
|
|
65
|
+
contents: buildDockerComposeYaml(sandbox)
|
|
66
|
+
},
|
|
67
|
+
{
|
|
68
|
+
path: node_path_1.default.join(perfDir, PERF_README),
|
|
69
|
+
contents: buildPerfReadme()
|
|
70
|
+
},
|
|
71
|
+
{
|
|
72
|
+
path: node_path_1.default.join(perfDir, PERF_GITIGNORE),
|
|
73
|
+
contents: ['evidence/', '.tmp/', ''].join('\n')
|
|
74
|
+
}
|
|
75
|
+
]
|
|
76
|
+
};
|
|
77
|
+
}
|
|
78
|
+
function applyPerfInitPlan(plan) {
|
|
79
|
+
const written = [];
|
|
80
|
+
for (const file of plan.files) {
|
|
81
|
+
(0, node_fs_1.mkdirSync)(node_path_1.default.dirname(file.path), { recursive: true });
|
|
82
|
+
(0, node_fs_1.writeFileSync)(file.path, file.contents, 'utf8');
|
|
83
|
+
written.push(file.path);
|
|
84
|
+
}
|
|
85
|
+
return written;
|
|
86
|
+
}
|
|
87
|
+
function inspectPerfDdlInventory(rootDir, options = {}) {
|
|
88
|
+
const config = (0, ztdProjectConfig_1.loadZtdProjectConfig)(rootDir);
|
|
89
|
+
const ddlRoot = node_path_1.default.resolve(rootDir, config.ddlDir);
|
|
90
|
+
if (!(0, node_fs_1.existsSync)(ddlRoot)) {
|
|
91
|
+
if (options.requireExistingDdlDir) {
|
|
92
|
+
throw new Error(`Perf DDL directory does not exist: ${ddlRoot}`);
|
|
93
|
+
}
|
|
94
|
+
return {
|
|
95
|
+
files: [],
|
|
96
|
+
statements: [],
|
|
97
|
+
ddlStatementCount: 0,
|
|
98
|
+
tableCount: 0,
|
|
99
|
+
indexCount: 0,
|
|
100
|
+
indexNames: []
|
|
101
|
+
};
|
|
102
|
+
}
|
|
103
|
+
const ddlSources = (0, collectSqlFiles_1.collectSqlFiles)([ddlRoot], ['.sql']);
|
|
104
|
+
const statements = [];
|
|
105
|
+
const indexNames = [];
|
|
106
|
+
let tableCount = 0;
|
|
107
|
+
let indexCount = 0;
|
|
108
|
+
for (const source of ddlSources) {
|
|
109
|
+
const split = rawsql_ts_1.MultiQuerySplitter.split(source.sql);
|
|
110
|
+
for (const chunk of split.queries) {
|
|
111
|
+
const sql = chunk.sql.trim();
|
|
112
|
+
if (!sql) {
|
|
113
|
+
continue;
|
|
114
|
+
}
|
|
115
|
+
const parsed = rawsql_ts_1.SqlParser.parse(sql);
|
|
116
|
+
let kind = 'other';
|
|
117
|
+
if (parsed instanceof rawsql_ts_1.CreateTableQuery) {
|
|
118
|
+
kind = 'table';
|
|
119
|
+
tableCount += 1;
|
|
120
|
+
}
|
|
121
|
+
else if (parsed instanceof rawsql_ts_1.CreateIndexStatement) {
|
|
122
|
+
kind = 'index';
|
|
123
|
+
indexCount += 1;
|
|
124
|
+
indexNames.push(String(parsed.indexName));
|
|
125
|
+
}
|
|
126
|
+
statements.push({
|
|
127
|
+
file: source.path,
|
|
128
|
+
sql,
|
|
129
|
+
kind
|
|
130
|
+
});
|
|
131
|
+
}
|
|
132
|
+
}
|
|
133
|
+
return {
|
|
134
|
+
files: ddlSources.map((source) => source.path),
|
|
135
|
+
statements,
|
|
136
|
+
ddlStatementCount: statements.length,
|
|
137
|
+
tableCount,
|
|
138
|
+
indexCount,
|
|
139
|
+
indexNames
|
|
140
|
+
};
|
|
141
|
+
}
|
|
142
|
+
async function resetPerfSandbox(rootDir) {
|
|
143
|
+
const sandboxConfig = loadPerfSandboxConfig(rootDir);
|
|
144
|
+
const resolvedConnection = await ensurePerfConnection(rootDir, sandboxConfig);
|
|
145
|
+
const ddlInventory = inspectPerfDdlInventory(rootDir, { requireExistingDdlDir: true });
|
|
146
|
+
const pg = await (0, optionalDependencies_1.ensurePgModule)();
|
|
147
|
+
const client = new pg.Client({ connectionString: resolvedConnection.connectionUrl, connectionTimeoutMillis: 3000 });
|
|
148
|
+
try {
|
|
149
|
+
await client.connect();
|
|
150
|
+
await client.query('BEGIN');
|
|
151
|
+
try {
|
|
152
|
+
await client.query('DROP SCHEMA public CASCADE; CREATE SCHEMA public;');
|
|
153
|
+
for (const statement of ddlInventory.statements) {
|
|
154
|
+
await client.query(statement.sql);
|
|
155
|
+
}
|
|
156
|
+
await client.query('COMMIT');
|
|
157
|
+
}
|
|
158
|
+
catch (error) {
|
|
159
|
+
await client.query('ROLLBACK').catch(() => undefined);
|
|
160
|
+
throw error;
|
|
161
|
+
}
|
|
162
|
+
return {
|
|
163
|
+
connectionUrl: resolvedConnection.connectionUrl,
|
|
164
|
+
appliedFiles: ddlInventory.files,
|
|
165
|
+
ddlStatements: ddlInventory.ddlStatementCount,
|
|
166
|
+
usedDocker: resolvedConnection.usedDocker
|
|
167
|
+
};
|
|
168
|
+
}
|
|
169
|
+
finally {
|
|
170
|
+
await client.end().catch(() => undefined);
|
|
171
|
+
}
|
|
172
|
+
}
|
|
173
|
+
async function seedPerfSandbox(rootDir) {
|
|
174
|
+
const config = (0, ztdProjectConfig_1.loadZtdProjectConfig)(rootDir);
|
|
175
|
+
const sandboxConfig = loadPerfSandboxConfig(rootDir);
|
|
176
|
+
const seedConfig = loadPerfSeedConfig(rootDir);
|
|
177
|
+
const resolvedConnection = await ensurePerfConnection(rootDir, sandboxConfig);
|
|
178
|
+
const definitions = loadTableDefinitions(rootDir, config.ddlDir);
|
|
179
|
+
const pg = await (0, optionalDependencies_1.ensurePgModule)();
|
|
180
|
+
const client = new pg.Client({ connectionString: resolvedConnection.connectionUrl, connectionTimeoutMillis: 3000 });
|
|
181
|
+
const insertedRows = {};
|
|
182
|
+
try {
|
|
183
|
+
await client.connect();
|
|
184
|
+
for (const [tableName, tableSeed] of Object.entries(seedConfig.tables)) {
|
|
185
|
+
const definition = resolveTableDefinition(definitions, tableName, config.ddl.defaultSchema);
|
|
186
|
+
if (!definition) {
|
|
187
|
+
throw new Error(`No table definition found for perf seed table: ${tableName}`);
|
|
188
|
+
}
|
|
189
|
+
const statements = buildInsertStatementsForTable(definition, tableSeed.rows, seedConfig);
|
|
190
|
+
for (const statement of statements) {
|
|
191
|
+
await client.query(statement.sql, statement.values);
|
|
192
|
+
}
|
|
193
|
+
insertedRows[definition.name] = statements.length;
|
|
194
|
+
}
|
|
195
|
+
return {
|
|
196
|
+
connectionUrl: resolvedConnection.connectionUrl,
|
|
197
|
+
insertedRows,
|
|
198
|
+
seed: seedConfig.seed,
|
|
199
|
+
usedDocker: resolvedConnection.usedDocker
|
|
200
|
+
};
|
|
201
|
+
}
|
|
202
|
+
finally {
|
|
203
|
+
await client.end().catch(() => undefined);
|
|
204
|
+
}
|
|
205
|
+
}
|
|
206
|
+
function parsePerfSeedYaml(contents) {
|
|
207
|
+
const lines = contents.replace(/\r\n/g, '\n').split('\n');
|
|
208
|
+
const config = { seed: DEFAULT_PERF_SANDBOX.seed, tables: {}, columns: {} };
|
|
209
|
+
let section = null;
|
|
210
|
+
let currentKey = null;
|
|
211
|
+
for (const rawLine of lines) {
|
|
212
|
+
const line = rawLine.replace(/#.*$/, '');
|
|
213
|
+
if (!line.trim()) {
|
|
214
|
+
continue;
|
|
215
|
+
}
|
|
216
|
+
if (!line.startsWith(' ')) {
|
|
217
|
+
const [key, rawValue] = line.split(':', 2);
|
|
218
|
+
const normalizedKey = key.trim();
|
|
219
|
+
section = normalizedKey === 'tables' ? 'tables' : normalizedKey === 'columns' ? 'columns' : null;
|
|
220
|
+
currentKey = null;
|
|
221
|
+
if (normalizedKey === 'seed') {
|
|
222
|
+
config.seed = Number((rawValue !== null && rawValue !== void 0 ? rawValue : '').trim()) || DEFAULT_PERF_SANDBOX.seed;
|
|
223
|
+
}
|
|
224
|
+
continue;
|
|
225
|
+
}
|
|
226
|
+
if (line.startsWith(' ') && !line.startsWith(' ')) {
|
|
227
|
+
currentKey = line.trim().replace(/:$/, '');
|
|
228
|
+
if (section === 'tables') {
|
|
229
|
+
config.tables[currentKey] = { rows: 0 };
|
|
230
|
+
}
|
|
231
|
+
if (section === 'columns') {
|
|
232
|
+
config.columns[currentKey] = {};
|
|
233
|
+
}
|
|
234
|
+
continue;
|
|
235
|
+
}
|
|
236
|
+
if (!currentKey || !section) {
|
|
237
|
+
continue;
|
|
238
|
+
}
|
|
239
|
+
const trimmed = line.trim();
|
|
240
|
+
const [property, rawValue] = trimmed.split(':', 2);
|
|
241
|
+
const value = (rawValue !== null && rawValue !== void 0 ? rawValue : '').trim();
|
|
242
|
+
if (section === 'tables' && property === 'rows') {
|
|
243
|
+
config.tables[currentKey].rows = Number(value);
|
|
244
|
+
continue;
|
|
245
|
+
}
|
|
246
|
+
if (section === 'columns') {
|
|
247
|
+
if (property === 'skew') {
|
|
248
|
+
config.columns[currentKey].skew = Number(value);
|
|
249
|
+
continue;
|
|
250
|
+
}
|
|
251
|
+
if (property === 'values') {
|
|
252
|
+
config.columns[currentKey].values = parseInlineYamlArray(value);
|
|
253
|
+
}
|
|
254
|
+
}
|
|
255
|
+
}
|
|
256
|
+
return config;
|
|
257
|
+
}
|
|
258
|
+
function buildInsertStatementsForTable(definition, rowCount, seedConfig) {
|
|
259
|
+
const statements = [];
|
|
260
|
+
const rng = createDeterministicRng(seedConfig.seed + hashString(definition.name));
|
|
261
|
+
const insertableColumns = definition.columns.filter((column) => !column.defaultValue);
|
|
262
|
+
for (let index = 0; index < rowCount; index += 1) {
|
|
263
|
+
if (insertableColumns.length === 0) {
|
|
264
|
+
statements.push({
|
|
265
|
+
sql: `INSERT INTO ${quoteQualifiedName(definition.name)} DEFAULT VALUES;`,
|
|
266
|
+
values: []
|
|
267
|
+
});
|
|
268
|
+
continue;
|
|
269
|
+
}
|
|
270
|
+
const values = insertableColumns.map((column) => { var _a; return buildSyntheticValue(definition.name, column.name, column.typeName, index, rng, seedConfig, (_a = column.isNotNull) !== null && _a !== void 0 ? _a : false); });
|
|
271
|
+
const placeholders = values.map((_, valueIndex) => `$${valueIndex + 1}`).join(', ');
|
|
272
|
+
const columnList = insertableColumns.map((column) => `"${column.name}"`).join(', ');
|
|
273
|
+
statements.push({
|
|
274
|
+
sql: `INSERT INTO ${quoteQualifiedName(definition.name)} (${columnList}) VALUES (${placeholders});`,
|
|
275
|
+
values
|
|
276
|
+
});
|
|
277
|
+
}
|
|
278
|
+
return statements;
|
|
279
|
+
}
|
|
280
|
+
function loadPerfSandboxConfig(rootDir) {
|
|
281
|
+
const filePath = node_path_1.default.join(rootDir, PERF_DIRECTORY, PERF_SANDBOX_CONFIG);
|
|
282
|
+
if (!(0, node_fs_1.existsSync)(filePath)) {
|
|
283
|
+
return DEFAULT_PERF_SANDBOX;
|
|
284
|
+
}
|
|
285
|
+
return {
|
|
286
|
+
...DEFAULT_PERF_SANDBOX,
|
|
287
|
+
...JSON.parse((0, node_fs_1.readFileSync)(filePath, 'utf8'))
|
|
288
|
+
};
|
|
289
|
+
}
|
|
290
|
+
function loadPerfSeedConfig(rootDir) {
|
|
291
|
+
const filePath = node_path_1.default.join(rootDir, PERF_DIRECTORY, PERF_SEED_CONFIG);
|
|
292
|
+
if (!(0, node_fs_1.existsSync)(filePath)) {
|
|
293
|
+
return parsePerfSeedYaml(buildDefaultSeedYaml(DEFAULT_PERF_SANDBOX.seed));
|
|
294
|
+
}
|
|
295
|
+
return parsePerfSeedYaml((0, node_fs_1.readFileSync)(filePath, 'utf8'));
|
|
296
|
+
}
|
|
297
|
+
function buildDefaultSeedYaml(seed) {
|
|
298
|
+
return [
|
|
299
|
+
'# Deterministic row counts for the perf sandbox.',
|
|
300
|
+
`seed: ${seed}`,
|
|
301
|
+
'tables:',
|
|
302
|
+
' users:',
|
|
303
|
+
' rows: 10000',
|
|
304
|
+
' orders:',
|
|
305
|
+
' rows: 50000',
|
|
306
|
+
'columns:',
|
|
307
|
+
' public.users.status:',
|
|
308
|
+
' values: [active, inactive]',
|
|
309
|
+
' skew: 0.85',
|
|
310
|
+
''
|
|
311
|
+
].join('\n');
|
|
312
|
+
}
|
|
313
|
+
function buildDockerComposeYaml(config) {
|
|
314
|
+
return [
|
|
315
|
+
'services:',
|
|
316
|
+
' perf-db:',
|
|
317
|
+
` image: ${config.dockerImage}`,
|
|
318
|
+
` container_name: ${config.containerName}`,
|
|
319
|
+
' restart: unless-stopped',
|
|
320
|
+
' environment:',
|
|
321
|
+
` POSTGRES_DB: ${config.database}`,
|
|
322
|
+
` POSTGRES_USER: ${config.username}`,
|
|
323
|
+
` POSTGRES_PASSWORD: ${config.password}`,
|
|
324
|
+
' ports:',
|
|
325
|
+
` - "${config.port}:5432"`,
|
|
326
|
+
' healthcheck:',
|
|
327
|
+
' test: ["CMD-SHELL", "pg_isready -U $$POSTGRES_USER -d $$POSTGRES_DB"]',
|
|
328
|
+
' interval: 3s',
|
|
329
|
+
' timeout: 3s',
|
|
330
|
+
' retries: 20',
|
|
331
|
+
''
|
|
332
|
+
].join('\n');
|
|
333
|
+
}
|
|
334
|
+
function buildPerfReadme() {
|
|
335
|
+
return [
|
|
336
|
+
'# Perf Sandbox',
|
|
337
|
+
'',
|
|
338
|
+
'This directory hosts the opt-in performance sandbox used by `ztd perf` commands.',
|
|
339
|
+
'',
|
|
340
|
+
'Suggested workflow:',
|
|
341
|
+
'1. `ztd perf init`',
|
|
342
|
+
'2. `ztd perf db reset`',
|
|
343
|
+
'3. `ztd perf seed`',
|
|
344
|
+
'',
|
|
345
|
+
'The reset step replays local `ztd/ddl/*.sql`, including physical tables and indexes.',
|
|
346
|
+
'',
|
|
347
|
+
'The sandbox is intentionally separated from default ZTD workflows.',
|
|
348
|
+
''
|
|
349
|
+
].join('\n');
|
|
350
|
+
}
|
|
351
|
+
function parseInlineYamlArray(value) {
|
|
352
|
+
const trimmed = value.trim();
|
|
353
|
+
if (!trimmed.startsWith('[') || !trimmed.endsWith(']')) {
|
|
354
|
+
return [];
|
|
355
|
+
}
|
|
356
|
+
return trimmed
|
|
357
|
+
.slice(1, -1)
|
|
358
|
+
.split(',')
|
|
359
|
+
.map((item) => item.trim())
|
|
360
|
+
.filter((item) => item.length > 0);
|
|
361
|
+
}
|
|
362
|
+
function loadTableDefinitions(rootDir, ddlDir) {
|
|
363
|
+
const ddlSources = (0, collectSqlFiles_1.collectSqlFiles)([node_path_1.default.resolve(rootDir, ddlDir)], ['.sql']);
|
|
364
|
+
const definitions = [];
|
|
365
|
+
for (const source of ddlSources) {
|
|
366
|
+
const split = rawsql_ts_1.MultiQuerySplitter.split(source.sql);
|
|
367
|
+
for (const chunk of split.queries) {
|
|
368
|
+
const sql = chunk.sql.trim();
|
|
369
|
+
if (!sql) {
|
|
370
|
+
continue;
|
|
371
|
+
}
|
|
372
|
+
const parsed = rawsql_ts_1.SqlParser.parse(sql);
|
|
373
|
+
if (!(parsed instanceof rawsql_ts_1.CreateTableQuery)) {
|
|
374
|
+
continue;
|
|
375
|
+
}
|
|
376
|
+
definitions.push((0, rawsql_ts_1.createTableDefinitionFromCreateTableQuery)(parsed));
|
|
377
|
+
}
|
|
378
|
+
}
|
|
379
|
+
return definitions;
|
|
380
|
+
}
|
|
381
|
+
function resolveTableDefinition(definitions, requestedName, defaultSchema) {
|
|
382
|
+
const normalized = requestedName.includes('.') ? requestedName : `${defaultSchema}.${requestedName}`;
|
|
383
|
+
return definitions.find((definition) => definition.name === normalized || definition.name === requestedName);
|
|
384
|
+
}
|
|
385
|
+
async function ensurePerfConnection(rootDir, config) {
|
|
386
|
+
var _a;
|
|
387
|
+
const externalUrl = resolvePerfExternalDatabaseUrl();
|
|
388
|
+
if (externalUrl) {
|
|
389
|
+
return { connectionUrl: externalUrl, usedDocker: false };
|
|
390
|
+
}
|
|
391
|
+
const ignoredDefaultDatabaseUrl = ((_a = process.env.DATABASE_URL) !== null && _a !== void 0 ? _a : '').trim();
|
|
392
|
+
const composeFile = node_path_1.default.join(rootDir, PERF_DIRECTORY, PERF_DOCKER_COMPOSE);
|
|
393
|
+
if (!(0, node_fs_1.existsSync)(composeFile)) {
|
|
394
|
+
if (ignoredDefaultDatabaseUrl) {
|
|
395
|
+
throw new Error('Perf sandbox ignores DATABASE_URL for ZTD-owned workflows. Set ZTD_TEST_DATABASE_URL explicitly or run `ztd perf init` first.');
|
|
396
|
+
}
|
|
397
|
+
throw new Error('Perf sandbox is not initialized. Run `ztd perf init` first.');
|
|
398
|
+
}
|
|
399
|
+
assertDockerReadyForPerf();
|
|
400
|
+
runDockerCompose(rootDir, composeFile, ['up', '-d']);
|
|
401
|
+
const connectionUrl = buildSandboxConnectionUrl(config);
|
|
402
|
+
await waitForDatabase(connectionUrl);
|
|
403
|
+
return { connectionUrl, usedDocker: true };
|
|
404
|
+
}
|
|
405
|
+
function buildSandboxConnectionUrl(config) {
|
|
406
|
+
return `postgres://${config.username}:${config.password}@127.0.0.1:${config.port}/${config.database}`;
|
|
407
|
+
}
|
|
408
|
+
function assertDockerReadyForPerf() {
|
|
409
|
+
var _a;
|
|
410
|
+
const probe = (0, node_child_process_1.spawnSync)('docker', ['info', '--format', '{{json .ServerVersion}}'], { encoding: 'utf8', timeout: 3000 });
|
|
411
|
+
if (probe.error || probe.status !== 0) {
|
|
412
|
+
const detail = ((_a = probe.stderr) !== null && _a !== void 0 ? _a : '').trim();
|
|
413
|
+
throw new Error(`Docker is not reachable for ztd perf.${detail ? ` (${detail})` : ''}`);
|
|
414
|
+
}
|
|
415
|
+
}
|
|
416
|
+
function runDockerCompose(rootDir, composeFile, args) {
|
|
417
|
+
var _a;
|
|
418
|
+
const result = (0, node_child_process_1.spawnSync)('docker', ['compose', '-f', composeFile, ...args], { cwd: rootDir, encoding: 'utf8', timeout: 30000 });
|
|
419
|
+
if (result.error || result.status !== 0) {
|
|
420
|
+
throw new Error(`Docker compose failed for ztd perf: ${(result.stderr || result.stdout || ((_a = result.error) === null || _a === void 0 ? void 0 : _a.message) || 'unknown error').trim()}`);
|
|
421
|
+
}
|
|
422
|
+
}
|
|
423
|
+
async function waitForDatabase(connectionUrl) {
|
|
424
|
+
const pg = await (0, optionalDependencies_1.ensurePgModule)();
|
|
425
|
+
const startedAt = Date.now();
|
|
426
|
+
while (Date.now() - startedAt < 30000) {
|
|
427
|
+
const client = new pg.Client({ connectionString: connectionUrl, connectionTimeoutMillis: 2000 });
|
|
428
|
+
try {
|
|
429
|
+
await client.connect();
|
|
430
|
+
await client.end();
|
|
431
|
+
return;
|
|
432
|
+
}
|
|
433
|
+
catch {
|
|
434
|
+
await client.end().catch(() => undefined);
|
|
435
|
+
await new Promise((resolve) => setTimeout(resolve, 1000));
|
|
436
|
+
}
|
|
437
|
+
}
|
|
438
|
+
throw new Error('Timed out waiting for the perf sandbox database to become ready.');
|
|
439
|
+
}
|
|
440
|
+
function buildSyntheticValue(tableName, columnName, typeName, index, rng, seedConfig, isNotNull) {
|
|
441
|
+
var _a, _b;
|
|
442
|
+
const override = (_a = seedConfig.columns[`${tableName}.${columnName}`]) !== null && _a !== void 0 ? _a : seedConfig.columns[columnName];
|
|
443
|
+
if ((override === null || override === void 0 ? void 0 : override.values) && override.values.length > 0) {
|
|
444
|
+
const skew = typeof override.skew === 'number' && override.skew > 0 && override.skew < 1 ? override.skew : undefined;
|
|
445
|
+
if (skew && override.values.length > 1 && rng() < skew) {
|
|
446
|
+
return override.values[0];
|
|
447
|
+
}
|
|
448
|
+
return (_b = override.values[Math.floor(rng() * override.values.length)]) !== null && _b !== void 0 ? _b : override.values[0];
|
|
449
|
+
}
|
|
450
|
+
if (!isNotNull && index % 7 === 0) {
|
|
451
|
+
return null;
|
|
452
|
+
}
|
|
453
|
+
const normalizedType = (typeName !== null && typeName !== void 0 ? typeName : 'text').toLowerCase();
|
|
454
|
+
if (normalizedType.includes('int') || normalizedType.includes('serial')) {
|
|
455
|
+
return index + 1;
|
|
456
|
+
}
|
|
457
|
+
if (normalizedType.includes('numeric') || normalizedType.includes('decimal')) {
|
|
458
|
+
return Number(((index + 1) * 1.11).toFixed(2));
|
|
459
|
+
}
|
|
460
|
+
if (normalizedType.includes('bool')) {
|
|
461
|
+
return index % 2 === 0;
|
|
462
|
+
}
|
|
463
|
+
if (normalizedType.includes('date') && !normalizedType.includes('time')) {
|
|
464
|
+
return `2024-01-${String((index % 28) + 1).padStart(2, '0')}`;
|
|
465
|
+
}
|
|
466
|
+
if (normalizedType.includes('time')) {
|
|
467
|
+
return `2024-01-01T${String(index % 24).padStart(2, '0')}:00:00.000Z`;
|
|
468
|
+
}
|
|
469
|
+
if (normalizedType.includes('uuid')) {
|
|
470
|
+
const suffix = String(index + 1).padStart(12, '0');
|
|
471
|
+
return `00000000-0000-4000-8000-${suffix}`;
|
|
472
|
+
}
|
|
473
|
+
return `${tableName.replace(/\./g, '_')}_${columnName}_${index + 1}`;
|
|
474
|
+
}
|
|
475
|
+
function createDeterministicRng(seed) {
|
|
476
|
+
let state = seed >>> 0;
|
|
477
|
+
return () => {
|
|
478
|
+
state = (state * 1664525 + 1013904223) >>> 0;
|
|
479
|
+
return state / 0x100000000;
|
|
480
|
+
};
|
|
481
|
+
}
|
|
482
|
+
function hashString(value) {
|
|
483
|
+
let hash = 0;
|
|
484
|
+
for (let index = 0; index < value.length; index += 1) {
|
|
485
|
+
hash = ((hash << 5) - hash + value.charCodeAt(index)) | 0;
|
|
486
|
+
}
|
|
487
|
+
return Math.abs(hash);
|
|
488
|
+
}
|
|
489
|
+
function quoteQualifiedName(name) {
|
|
490
|
+
return name.split('.').map((segment) => `"${segment}"`).join('.');
|
|
491
|
+
}
|
|
492
|
+
//# sourceMappingURL=sandbox.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sandbox.js","sourceRoot":"","sources":["../../src/perf/sandbox.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
import { BinarySelectQuery, CTECollector, DeleteQuery, InsertQuery, SimpleSelectQuery, SqlParser, UpdateQuery, ValuesQuery } from 'rawsql-ts';
|
|
2
|
+
import { SourceExpression } from 'rawsql-ts';
|
|
3
|
+
export type SupportedStatement = SimpleSelectQuery | BinarySelectQuery | ValuesQuery | InsertQuery | UpdateQuery | DeleteQuery;
|
|
4
|
+
export interface QueryAnalysis {
|
|
5
|
+
statement: SupportedStatement;
|
|
6
|
+
ctes: ReturnType<CTECollector['collect']>;
|
|
7
|
+
cteNames: string[];
|
|
8
|
+
dependencyMap: Map<string, string[]>;
|
|
9
|
+
rootDependencies: string[];
|
|
10
|
+
}
|
|
11
|
+
export declare function assertSupportedStatement(parsed: ReturnType<typeof SqlParser.parse>, commandName: string): SupportedStatement;
|
|
12
|
+
export declare function analyzeStatement(statement: SupportedStatement): QueryAnalysis;
|
|
13
|
+
export declare function detectQueryType(statement: SupportedStatement): 'SELECT' | 'INSERT' | 'UPDATE' | 'DELETE';
|
|
14
|
+
export declare function buildDependencyMap(statement: SupportedStatement, ctes: ReturnType<CTECollector['collect']>): Map<string, string[]>;
|
|
15
|
+
export declare function collectRootDependencies(statement: SupportedStatement, cteNames: string[]): string[];
|
|
16
|
+
export declare function collectReachableCtes(rootDependencies: string[], dependencyMap: Map<string, string[]>, stopSet?: ReadonlySet<string>): Set<string>;
|
|
17
|
+
export declare function collectDependencyClosure(targetName: string, dependencyMap: Map<string, string[]>, stopSet?: ReadonlySet<string>): string[];
|
|
18
|
+
export declare function collectDirectSources(statement: SupportedStatement): SourceExpression[];
|
|
19
|
+
export declare function isSelectStatement(statement: SupportedStatement): statement is SimpleSelectQuery | BinarySelectQuery | ValuesQuery;
|
|
20
|
+
export declare function uniquePreservingOrder(values: string[]): string[];
|