@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.
Files changed (179) hide show
  1. package/LICENSE +21 -0
  2. package/dist/commands/agents.d.ts +2 -0
  3. package/dist/commands/agents.js +68 -0
  4. package/dist/commands/agents.js.map +1 -0
  5. package/dist/commands/checkContract.d.ts +46 -0
  6. package/dist/commands/checkContract.js +359 -0
  7. package/dist/commands/checkContract.js.map +1 -0
  8. package/dist/commands/connectionOptions.d.ts +12 -0
  9. package/dist/commands/connectionOptions.js +22 -0
  10. package/dist/commands/connectionOptions.js.map +1 -0
  11. package/dist/commands/ddl.d.ts +7 -0
  12. package/dist/commands/ddl.js +145 -0
  13. package/dist/commands/ddl.js.map +1 -0
  14. package/dist/commands/describe.d.ts +23 -0
  15. package/dist/commands/describe.js +399 -0
  16. package/dist/commands/describe.js.map +1 -0
  17. package/dist/commands/diff.d.ts +24 -0
  18. package/dist/commands/diff.js +73 -0
  19. package/dist/commands/diff.js.map +1 -0
  20. package/dist/commands/genEntities.d.ts +14 -0
  21. package/dist/commands/genEntities.js +58 -0
  22. package/dist/commands/genEntities.js.map +1 -0
  23. package/dist/commands/init.d.ts +104 -0
  24. package/dist/commands/init.js +1480 -0
  25. package/dist/commands/init.js.map +1 -0
  26. package/dist/commands/lint.d.ts +89 -0
  27. package/dist/commands/lint.js +501 -0
  28. package/dist/commands/lint.js.map +1 -0
  29. package/dist/commands/modelGen.d.ts +60 -0
  30. package/dist/commands/modelGen.js +572 -0
  31. package/dist/commands/modelGen.js.map +1 -0
  32. package/dist/commands/options.d.ts +9 -0
  33. package/dist/commands/options.js +48 -0
  34. package/dist/commands/options.js.map +1 -0
  35. package/dist/commands/perf.d.ts +9 -0
  36. package/dist/commands/perf.js +374 -0
  37. package/dist/commands/perf.js.map +1 -0
  38. package/dist/commands/pull.d.ts +21 -0
  39. package/dist/commands/pull.js +115 -0
  40. package/dist/commands/pull.js.map +1 -0
  41. package/dist/commands/query.d.ts +9 -0
  42. package/dist/commands/query.js +377 -0
  43. package/dist/commands/query.js.map +1 -0
  44. package/dist/commands/testEvidence.d.ts +237 -0
  45. package/dist/commands/testEvidence.js +1220 -0
  46. package/dist/commands/testEvidence.js.map +1 -0
  47. package/dist/commands/ztdConfig.d.ts +30 -0
  48. package/dist/commands/ztdConfig.js +224 -0
  49. package/dist/commands/ztdConfig.js.map +1 -0
  50. package/dist/commands/ztdConfigCommand.d.ts +18 -0
  51. package/dist/commands/ztdConfigCommand.js +268 -0
  52. package/dist/commands/ztdConfigCommand.js.map +1 -0
  53. package/dist/index.d.ts +4 -0
  54. package/dist/index.js +127 -0
  55. package/dist/index.js.map +1 -0
  56. package/dist/perf/benchmark.d.ts +277 -0
  57. package/dist/perf/benchmark.js +2186 -0
  58. package/dist/perf/benchmark.js.map +1 -0
  59. package/dist/perf/sandbox.d.ts +73 -0
  60. package/dist/perf/sandbox.js +492 -0
  61. package/dist/perf/sandbox.js.map +1 -0
  62. package/dist/query/analysis.d.ts +20 -0
  63. package/dist/query/analysis.js +192 -0
  64. package/dist/query/analysis.js.map +1 -0
  65. package/dist/query/analyzeColumnUsage.d.ts +10 -0
  66. package/dist/query/analyzeColumnUsage.js +451 -0
  67. package/dist/query/analyzeColumnUsage.js.map +1 -0
  68. package/dist/query/analyzeTableUsage.d.ts +10 -0
  69. package/dist/query/analyzeTableUsage.js +318 -0
  70. package/dist/query/analyzeTableUsage.js.map +1 -0
  71. package/dist/query/execute.d.ts +40 -0
  72. package/dist/query/execute.js +784 -0
  73. package/dist/query/execute.js.map +1 -0
  74. package/dist/query/format.d.ts +1 -0
  75. package/dist/query/format.js +9 -0
  76. package/dist/query/format.js.map +1 -0
  77. package/dist/query/lint.d.ts +29 -0
  78. package/dist/query/lint.js +340 -0
  79. package/dist/query/lint.js.map +1 -0
  80. package/dist/query/location.d.ts +18 -0
  81. package/dist/query/location.js +204 -0
  82. package/dist/query/location.js.map +1 -0
  83. package/dist/query/patch.d.ts +21 -0
  84. package/dist/query/patch.js +151 -0
  85. package/dist/query/patch.js.map +1 -0
  86. package/dist/query/planner.d.ts +31 -0
  87. package/dist/query/planner.js +134 -0
  88. package/dist/query/planner.js.map +1 -0
  89. package/dist/query/report.d.ts +7 -0
  90. package/dist/query/report.js +19 -0
  91. package/dist/query/report.js.map +1 -0
  92. package/dist/query/scalarFilterAnalysis.d.ts +6 -0
  93. package/dist/query/scalarFilterAnalysis.js +212 -0
  94. package/dist/query/scalarFilterAnalysis.js.map +1 -0
  95. package/dist/query/slice.d.ts +17 -0
  96. package/dist/query/slice.js +204 -0
  97. package/dist/query/slice.js.map +1 -0
  98. package/dist/query/structure.d.ts +24 -0
  99. package/dist/query/structure.js +135 -0
  100. package/dist/query/structure.js.map +1 -0
  101. package/dist/query/targets.d.ts +2 -0
  102. package/dist/query/targets.js +6 -0
  103. package/dist/query/targets.js.map +1 -0
  104. package/dist/query/types.d.ts +97 -0
  105. package/dist/query/types.js +3 -0
  106. package/dist/query/types.js.map +1 -0
  107. package/dist/specs/sql/activeOrders.catalog.d.ts +12 -0
  108. package/dist/specs/sql/activeOrders.catalog.js +36 -0
  109. package/dist/specs/sql/activeOrders.catalog.js.map +1 -0
  110. package/dist/specs/sql/usersList.catalog.d.ts +8 -0
  111. package/dist/specs/sql/usersList.catalog.js +14 -0
  112. package/dist/specs/sql/usersList.catalog.js.map +1 -0
  113. package/dist/specs/sqlCatalogDefinition.d.ts +20 -0
  114. package/dist/specs/sqlCatalogDefinition.js +10 -0
  115. package/dist/specs/sqlCatalogDefinition.js.map +1 -0
  116. package/dist/utils/agentCli.d.ts +23 -0
  117. package/dist/utils/agentCli.js +84 -0
  118. package/dist/utils/agentCli.js.map +1 -0
  119. package/dist/utils/agentSafety.d.ts +4 -0
  120. package/dist/utils/agentSafety.js +50 -0
  121. package/dist/utils/agentSafety.js.map +1 -0
  122. package/dist/utils/agents.d.ts +31 -0
  123. package/dist/utils/agents.js +362 -0
  124. package/dist/utils/agents.js.map +1 -0
  125. package/dist/utils/collectSqlFiles.d.ts +9 -0
  126. package/dist/utils/collectSqlFiles.js +58 -0
  127. package/dist/utils/collectSqlFiles.js.map +1 -0
  128. package/dist/utils/connectionSummary.d.ts +3 -0
  129. package/dist/utils/connectionSummary.js +29 -0
  130. package/dist/utils/connectionSummary.js.map +1 -0
  131. package/dist/utils/dbConnection.d.ts +31 -0
  132. package/dist/utils/dbConnection.js +151 -0
  133. package/dist/utils/dbConnection.js.map +1 -0
  134. package/dist/utils/fs.d.ts +1 -0
  135. package/dist/utils/fs.js +12 -0
  136. package/dist/utils/fs.js.map +1 -0
  137. package/dist/utils/modelGenBinder.d.ts +8 -0
  138. package/dist/utils/modelGenBinder.js +31 -0
  139. package/dist/utils/modelGenBinder.js.map +1 -0
  140. package/dist/utils/modelGenRender.d.ts +29 -0
  141. package/dist/utils/modelGenRender.js +158 -0
  142. package/dist/utils/modelGenRender.js.map +1 -0
  143. package/dist/utils/modelGenScanner.d.ts +24 -0
  144. package/dist/utils/modelGenScanner.js +196 -0
  145. package/dist/utils/modelGenScanner.js.map +1 -0
  146. package/dist/utils/modelProbe.d.ts +14 -0
  147. package/dist/utils/modelProbe.js +121 -0
  148. package/dist/utils/modelProbe.js.map +1 -0
  149. package/dist/utils/normalizePulledSchema.d.ts +12 -0
  150. package/dist/utils/normalizePulledSchema.js +213 -0
  151. package/dist/utils/normalizePulledSchema.js.map +1 -0
  152. package/dist/utils/optionalDependencies.d.ts +43 -0
  153. package/dist/utils/optionalDependencies.js +134 -0
  154. package/dist/utils/optionalDependencies.js.map +1 -0
  155. package/dist/utils/pgDump.d.ts +12 -0
  156. package/dist/utils/pgDump.js +58 -0
  157. package/dist/utils/pgDump.js.map +1 -0
  158. package/dist/utils/queryFingerprint.d.ts +14 -0
  159. package/dist/utils/queryFingerprint.js +34 -0
  160. package/dist/utils/queryFingerprint.js.map +1 -0
  161. package/dist/utils/sqlCatalogDiscovery.d.ts +44 -0
  162. package/dist/utils/sqlCatalogDiscovery.js +166 -0
  163. package/dist/utils/sqlCatalogDiscovery.js.map +1 -0
  164. package/dist/utils/sqlCatalogStatements.d.ts +20 -0
  165. package/dist/utils/sqlCatalogStatements.js +23 -0
  166. package/dist/utils/sqlCatalogStatements.js.map +1 -0
  167. package/dist/utils/sqlLintHelpers.d.ts +18 -0
  168. package/dist/utils/sqlLintHelpers.js +270 -0
  169. package/dist/utils/sqlLintHelpers.js.map +1 -0
  170. package/dist/utils/telemetry.d.ts +71 -0
  171. package/dist/utils/telemetry.js +597 -0
  172. package/dist/utils/telemetry.js.map +1 -0
  173. package/dist/utils/typeMapper.d.ts +4 -0
  174. package/dist/utils/typeMapper.js +79 -0
  175. package/dist/utils/typeMapper.js.map +1 -0
  176. package/dist/utils/ztdProjectConfig.d.ts +41 -0
  177. package/dist/utils/ztdProjectConfig.js +182 -0
  178. package/dist/utils/ztdProjectConfig.js.map +1 -0
  179. package/package.json +19 -20
@@ -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[];