@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,501 @@
|
|
|
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.runSqlLint = runSqlLint;
|
|
7
|
+
exports.registerLintCommand = registerLintCommand;
|
|
8
|
+
exports.resolveLintCommandInput = resolveLintCommandInput;
|
|
9
|
+
exports.buildLintCommandFailureData = buildLintCommandFailureData;
|
|
10
|
+
exports.buildLintContainerStartError = buildLintContainerStartError;
|
|
11
|
+
exports.buildLintConnectionError = buildLintConnectionError;
|
|
12
|
+
exports.detectMaxPositionalParamIndex = detectMaxPositionalParamIndex;
|
|
13
|
+
exports.buildLintDefaultBindings = buildLintDefaultBindings;
|
|
14
|
+
exports.buildParserFailure = buildParserFailure;
|
|
15
|
+
const node_fs_1 = require("node:fs");
|
|
16
|
+
const node_child_process_1 = require("node:child_process");
|
|
17
|
+
const node_path_1 = __importDefault(require("node:path"));
|
|
18
|
+
const rawsql_ts_1 = require("rawsql-ts");
|
|
19
|
+
const optionalDependencies_1 = require("../utils/optionalDependencies");
|
|
20
|
+
const ztdProjectConfig_1 = require("../utils/ztdProjectConfig");
|
|
21
|
+
const sqlLintHelpers_1 = require("../utils/sqlLintHelpers");
|
|
22
|
+
const agentCli_1 = require("../utils/agentCli");
|
|
23
|
+
/**
|
|
24
|
+
* Validate every SQL file against the configured DDL fixtures by replaying each
|
|
25
|
+
* statement through the adapter-provided testkit client.
|
|
26
|
+
* @param options Configuration values that describe which files and schemas to lint.
|
|
27
|
+
* @returns A summary of the failures observed and how many files were processed.
|
|
28
|
+
*/
|
|
29
|
+
async function runSqlLint(options) {
|
|
30
|
+
const { sqlFiles, ddlDirectories, defaultSchema, searchPath, ddlLint, client } = options;
|
|
31
|
+
const testkitCore = await (0, optionalDependencies_1.ensureTestkitCoreModule)();
|
|
32
|
+
const adapter = await (0, optionalDependencies_1.ensureAdapterNodePgModule)();
|
|
33
|
+
const constructors = {
|
|
34
|
+
TableNameResolver: testkitCore.TableNameResolver,
|
|
35
|
+
DdlFixtureLoader: testkitCore.DdlFixtureLoader,
|
|
36
|
+
DdlLintError: testkitCore.DdlLintError,
|
|
37
|
+
MissingFixtureError: testkitCore.MissingFixtureError,
|
|
38
|
+
SchemaValidationError: testkitCore.SchemaValidationError,
|
|
39
|
+
QueryRewriteError: testkitCore.QueryRewriteError
|
|
40
|
+
};
|
|
41
|
+
let tableDefinitions;
|
|
42
|
+
try {
|
|
43
|
+
const resolver = new constructors.TableNameResolver({ defaultSchema, searchPath });
|
|
44
|
+
const loader = new constructors.DdlFixtureLoader({
|
|
45
|
+
directories: ddlDirectories,
|
|
46
|
+
tableNameResolver: resolver,
|
|
47
|
+
ddlLint
|
|
48
|
+
});
|
|
49
|
+
const fixtures = loader.getFixtures();
|
|
50
|
+
tableDefinitions = fixtures.map((fixture) => fixture.tableDefinition);
|
|
51
|
+
}
|
|
52
|
+
catch (error) {
|
|
53
|
+
return {
|
|
54
|
+
failures: [buildTransformFailureFromLoaderError(error, ddlDirectories, constructors)],
|
|
55
|
+
filesChecked: sqlFiles.length
|
|
56
|
+
};
|
|
57
|
+
}
|
|
58
|
+
const enumLabels = (0, sqlLintHelpers_1.extractEnumLabels)(ddlDirectories);
|
|
59
|
+
const tableRows = tableDefinitions.map((definition) => ({
|
|
60
|
+
tableName: definition.name,
|
|
61
|
+
rows: [(0, sqlLintHelpers_1.buildLintFixtureRow)(definition, enumLabels)]
|
|
62
|
+
}));
|
|
63
|
+
let rewrittenStatement = null;
|
|
64
|
+
const testkit = adapter.createPgTestkitClient({
|
|
65
|
+
connectionFactory: async () => client,
|
|
66
|
+
tableDefinitions,
|
|
67
|
+
tableRows,
|
|
68
|
+
defaultSchema,
|
|
69
|
+
searchPath,
|
|
70
|
+
onExecute: (sql) => {
|
|
71
|
+
rewrittenStatement = sql;
|
|
72
|
+
}
|
|
73
|
+
});
|
|
74
|
+
const failures = [];
|
|
75
|
+
try {
|
|
76
|
+
for (const filePath of sqlFiles) {
|
|
77
|
+
const contents = readFileSafe(filePath);
|
|
78
|
+
await lintFile(filePath, contents, testkit, failures, () => {
|
|
79
|
+
rewrittenStatement = null;
|
|
80
|
+
}, () => rewrittenStatement, constructors);
|
|
81
|
+
}
|
|
82
|
+
}
|
|
83
|
+
finally {
|
|
84
|
+
await testkit.close();
|
|
85
|
+
}
|
|
86
|
+
return {
|
|
87
|
+
failures,
|
|
88
|
+
filesChecked: sqlFiles.length
|
|
89
|
+
};
|
|
90
|
+
}
|
|
91
|
+
/**
|
|
92
|
+
* Register the `ztd lint` CLI command that validates raw SQL with a temporary Postgres instance.
|
|
93
|
+
* @param program CLI root command that receives the lint subcommand.
|
|
94
|
+
*/
|
|
95
|
+
function registerLintCommand(program) {
|
|
96
|
+
program
|
|
97
|
+
.command('lint [path]')
|
|
98
|
+
.description('Lint SQL files for syntax and analysis correctness via ZTD')
|
|
99
|
+
.option('--json <payload>', 'Pass lint options as a JSON object')
|
|
100
|
+
.action(async (pattern, options) => {
|
|
101
|
+
try {
|
|
102
|
+
const resolved = resolveLintCommandInput(pattern, options);
|
|
103
|
+
await runLintCommand(resolved.path);
|
|
104
|
+
}
|
|
105
|
+
catch (error) {
|
|
106
|
+
if ((0, agentCli_1.isJsonOutput)()) {
|
|
107
|
+
(0, agentCli_1.writeCommandResultEnvelope)('lint', false, buildLintCommandFailureData(error));
|
|
108
|
+
}
|
|
109
|
+
throw error;
|
|
110
|
+
}
|
|
111
|
+
});
|
|
112
|
+
}
|
|
113
|
+
async function runLintCommand(pattern) {
|
|
114
|
+
var _a, _b;
|
|
115
|
+
const config = (0, ztdProjectConfig_1.loadZtdProjectConfig)();
|
|
116
|
+
const projectRoot = process.cwd();
|
|
117
|
+
const ddlRoot = node_path_1.default.resolve(projectRoot, config.ddlDir);
|
|
118
|
+
const sqlFiles = (0, sqlLintHelpers_1.resolveSqlFiles)(pattern);
|
|
119
|
+
const databaseUrl = (_a = process.env.ZTD_TEST_DATABASE_URL) === null || _a === void 0 ? void 0 : _a.trim();
|
|
120
|
+
const connectionUrl = databaseUrl && databaseUrl.length > 0 ? databaseUrl : null;
|
|
121
|
+
if (!connectionUrl) {
|
|
122
|
+
assertDockerReadyForLint();
|
|
123
|
+
}
|
|
124
|
+
const pgModule = await (0, optionalDependencies_1.ensurePgModule)();
|
|
125
|
+
const { Client: PgClient } = pgModule;
|
|
126
|
+
let client = null;
|
|
127
|
+
let container = null;
|
|
128
|
+
try {
|
|
129
|
+
let resolvedConnectionUrl = connectionUrl;
|
|
130
|
+
if (!resolvedConnectionUrl) {
|
|
131
|
+
const containerModule = await (0, optionalDependencies_1.ensurePostgresContainerModule)().catch((error) => {
|
|
132
|
+
const baseMessage = error instanceof Error ? error.message : String(error);
|
|
133
|
+
throw new Error(`${baseMessage} Or set ZTD_TEST_DATABASE_URL to reuse an existing Postgres connection.`);
|
|
134
|
+
});
|
|
135
|
+
const { PostgreSqlContainer } = containerModule;
|
|
136
|
+
const started = await new PostgreSqlContainer((_b = process.env.ZTD_TEST_DB_IMAGE) !== null && _b !== void 0 ? _b : 'postgres:16-alpine')
|
|
137
|
+
.withDatabase('ztdlint')
|
|
138
|
+
.withUsername('ztd')
|
|
139
|
+
.withPassword('ztd')
|
|
140
|
+
.start()
|
|
141
|
+
.catch((error) => {
|
|
142
|
+
throw buildLintContainerStartError(error);
|
|
143
|
+
});
|
|
144
|
+
container = started;
|
|
145
|
+
resolvedConnectionUrl = started.getConnectionUri();
|
|
146
|
+
}
|
|
147
|
+
client = new PgClient({
|
|
148
|
+
connectionString: resolvedConnectionUrl,
|
|
149
|
+
connectionTimeoutMillis: resolveDbConnectTimeoutMs()
|
|
150
|
+
});
|
|
151
|
+
await client.connect().catch((error) => {
|
|
152
|
+
throw buildLintConnectionError(error, Boolean(connectionUrl));
|
|
153
|
+
});
|
|
154
|
+
const result = await runSqlLint({
|
|
155
|
+
sqlFiles,
|
|
156
|
+
ddlDirectories: [ddlRoot],
|
|
157
|
+
defaultSchema: config.ddl.defaultSchema,
|
|
158
|
+
searchPath: config.ddl.searchPath,
|
|
159
|
+
ddlLint: config.ddlLint,
|
|
160
|
+
client
|
|
161
|
+
});
|
|
162
|
+
if (result.failures.length > 0) {
|
|
163
|
+
if ((0, agentCli_1.isJsonOutput)()) {
|
|
164
|
+
(0, agentCli_1.writeCommandResultEnvelope)('lint', false, {
|
|
165
|
+
schemaVersion: 1,
|
|
166
|
+
filesChecked: result.filesChecked,
|
|
167
|
+
failures: result.failures
|
|
168
|
+
});
|
|
169
|
+
}
|
|
170
|
+
reportFailures(result.failures);
|
|
171
|
+
process.exitCode = 1;
|
|
172
|
+
throw new Error('ztd lint failed');
|
|
173
|
+
}
|
|
174
|
+
if ((0, agentCli_1.isJsonOutput)()) {
|
|
175
|
+
(0, agentCli_1.writeCommandResultEnvelope)('lint', true, {
|
|
176
|
+
schemaVersion: 1,
|
|
177
|
+
filesChecked: result.filesChecked,
|
|
178
|
+
failures: []
|
|
179
|
+
});
|
|
180
|
+
}
|
|
181
|
+
}
|
|
182
|
+
finally {
|
|
183
|
+
await (client === null || client === void 0 ? void 0 : client.end().catch(() => undefined));
|
|
184
|
+
await (container === null || container === void 0 ? void 0 : container.stop());
|
|
185
|
+
}
|
|
186
|
+
}
|
|
187
|
+
function resolveLintCommandInput(pattern, options) {
|
|
188
|
+
const merged = options.json
|
|
189
|
+
? { path: pattern, ...options, ...(0, agentCli_1.parseJsonPayload)(options.json, '--json') }
|
|
190
|
+
: { path: pattern, ...options };
|
|
191
|
+
if (typeof merged.path !== 'string' || merged.path.trim().length === 0) {
|
|
192
|
+
throw new Error('A lint path must be provided either as a positional argument or via --json {"path":"..."}');
|
|
193
|
+
}
|
|
194
|
+
return { path: merged.path };
|
|
195
|
+
}
|
|
196
|
+
function buildLintCommandFailureData(error) {
|
|
197
|
+
return {
|
|
198
|
+
schemaVersion: 1,
|
|
199
|
+
filesChecked: 0,
|
|
200
|
+
failures: [],
|
|
201
|
+
error: error instanceof Error ? error.message : String(error)
|
|
202
|
+
};
|
|
203
|
+
}
|
|
204
|
+
function resolveDbConnectTimeoutMs() {
|
|
205
|
+
var _a;
|
|
206
|
+
const raw = (_a = process.env.ZTD_DB_CONNECT_TIMEOUT_MS) === null || _a === void 0 ? void 0 : _a.trim();
|
|
207
|
+
if (!raw) {
|
|
208
|
+
return 3000;
|
|
209
|
+
}
|
|
210
|
+
const parsed = Number(raw);
|
|
211
|
+
if (!Number.isFinite(parsed) || parsed <= 0) {
|
|
212
|
+
return 3000;
|
|
213
|
+
}
|
|
214
|
+
return Math.floor(parsed);
|
|
215
|
+
}
|
|
216
|
+
function assertDockerReadyForLint() {
|
|
217
|
+
var _a;
|
|
218
|
+
// Run a quick Docker CLI probe so daemon-off states fail before lint does heavier setup.
|
|
219
|
+
const probe = (0, node_child_process_1.spawnSync)('docker', ['info', '--format', '{{json .ServerVersion}}'], {
|
|
220
|
+
encoding: 'utf8',
|
|
221
|
+
timeout: 3000
|
|
222
|
+
});
|
|
223
|
+
if (probe.error || probe.status !== 0) {
|
|
224
|
+
const stderr = ((_a = probe.stderr) !== null && _a !== void 0 ? _a : '').trim();
|
|
225
|
+
const detail = stderr.length > 0 ? ` (${stderr})` : '';
|
|
226
|
+
throw new Error(`Docker is not reachable. Start Docker Desktop/service before running ztd lint without ZTD_TEST_DATABASE_URL.${detail}`);
|
|
227
|
+
}
|
|
228
|
+
}
|
|
229
|
+
function buildLintContainerStartError(error) {
|
|
230
|
+
const message = error instanceof Error ? error.message : String(error);
|
|
231
|
+
if (message.toLowerCase().includes('container runtime strategy') || message.toLowerCase().includes('docker')) {
|
|
232
|
+
return new Error(`${message} Start Docker Desktop/service, or set ZTD_TEST_DATABASE_URL to use an existing Postgres.`);
|
|
233
|
+
}
|
|
234
|
+
return new Error(message);
|
|
235
|
+
}
|
|
236
|
+
function buildLintConnectionError(error, usingExternalConnection) {
|
|
237
|
+
const message = error instanceof Error ? error.message : String(error);
|
|
238
|
+
const guidance = usingExternalConnection
|
|
239
|
+
? 'Check ZTD_TEST_DATABASE_URL and verify the ZTD-owned test database is reachable.'
|
|
240
|
+
: 'Check Docker Desktop/service and retry, or set ZTD_TEST_DATABASE_URL to skip container startup.';
|
|
241
|
+
return new Error(`Failed to connect to PostgreSQL for ztd lint. ${guidance} (${message})`);
|
|
242
|
+
}
|
|
243
|
+
function readFileSafe(filePath) {
|
|
244
|
+
return (0, node_fs_1.readFileSync)(filePath, 'utf8');
|
|
245
|
+
}
|
|
246
|
+
async function lintFile(filePath, contents, testkit, failures, resetRewritten, getRewritten, constructors) {
|
|
247
|
+
let split;
|
|
248
|
+
try {
|
|
249
|
+
split = rawsql_ts_1.MultiQuerySplitter.split(contents);
|
|
250
|
+
}
|
|
251
|
+
catch (error) {
|
|
252
|
+
failures.push(buildParserFailure(filePath, contents, error));
|
|
253
|
+
return;
|
|
254
|
+
}
|
|
255
|
+
// Validate every statement that survives the splitter to catch syntax and semantic issues.
|
|
256
|
+
for (const chunk of split.queries) {
|
|
257
|
+
if (chunk.isEmpty) {
|
|
258
|
+
continue;
|
|
259
|
+
}
|
|
260
|
+
const statement = chunk.sql.trim();
|
|
261
|
+
if (!statement) {
|
|
262
|
+
continue;
|
|
263
|
+
}
|
|
264
|
+
try {
|
|
265
|
+
rawsql_ts_1.SqlParser.parse(statement);
|
|
266
|
+
}
|
|
267
|
+
catch (parseError) {
|
|
268
|
+
failures.push(buildParserFailure(filePath, statement, parseError));
|
|
269
|
+
continue;
|
|
270
|
+
}
|
|
271
|
+
try {
|
|
272
|
+
resetRewritten();
|
|
273
|
+
await executeValidationStatement(testkit, statement);
|
|
274
|
+
}
|
|
275
|
+
catch (error) {
|
|
276
|
+
failures.push(buildStatementFailure(filePath, statement, contents, error, getRewritten(), constructors));
|
|
277
|
+
}
|
|
278
|
+
}
|
|
279
|
+
}
|
|
280
|
+
async function executeValidationStatement(testkit, statement) {
|
|
281
|
+
const bindings = buildLintDefaultBindings(statement);
|
|
282
|
+
// Execute the rewritten statement so fixtures are applied before Postgres validation.
|
|
283
|
+
await testkit.query(statement, bindings);
|
|
284
|
+
}
|
|
285
|
+
/**
|
|
286
|
+
* Detects the highest positional placeholder index used in SQL text.
|
|
287
|
+
* @param sql SQL text that may contain PostgreSQL-style placeholders such as $1.
|
|
288
|
+
* @returns The maximum placeholder index, or 0 when no positional placeholders exist.
|
|
289
|
+
*/
|
|
290
|
+
function detectMaxPositionalParamIndex(sql) {
|
|
291
|
+
const positionalPattern = /\$([1-9]\d*)/g;
|
|
292
|
+
let max = 0;
|
|
293
|
+
let match;
|
|
294
|
+
while ((match = positionalPattern.exec(sql)) !== null) {
|
|
295
|
+
const index = Number(match[1]);
|
|
296
|
+
if (Number.isFinite(index) && index > max) {
|
|
297
|
+
max = index;
|
|
298
|
+
}
|
|
299
|
+
}
|
|
300
|
+
return max;
|
|
301
|
+
}
|
|
302
|
+
function detectNamedParams(sql) {
|
|
303
|
+
const namedPattern = /(^|[^:]):([A-Za-z_][A-Za-z0-9_]*)/g;
|
|
304
|
+
const names = new Set();
|
|
305
|
+
let match;
|
|
306
|
+
while ((match = namedPattern.exec(sql)) !== null) {
|
|
307
|
+
names.add(match[2]);
|
|
308
|
+
}
|
|
309
|
+
return Array.from(names);
|
|
310
|
+
}
|
|
311
|
+
/**
|
|
312
|
+
* Builds deterministic placeholder bindings for lint execution.
|
|
313
|
+
* Named placeholders receive a keyed object and positional placeholders receive an indexed array.
|
|
314
|
+
* @param sql Statement text to inspect for placeholders.
|
|
315
|
+
* @returns Bind values or undefined when the statement has no placeholders.
|
|
316
|
+
*/
|
|
317
|
+
function buildLintDefaultBindings(sql) {
|
|
318
|
+
const namedParams = detectNamedParams(sql);
|
|
319
|
+
if (namedParams.length > 0) {
|
|
320
|
+
return Object.fromEntries(namedParams.map((name) => [name, null]));
|
|
321
|
+
}
|
|
322
|
+
const maxPositionalIndex = detectMaxPositionalParamIndex(sql);
|
|
323
|
+
if (maxPositionalIndex > 0) {
|
|
324
|
+
return Array.from({ length: maxPositionalIndex }, () => null);
|
|
325
|
+
}
|
|
326
|
+
return undefined;
|
|
327
|
+
}
|
|
328
|
+
/**
|
|
329
|
+
* Build a parser failure record that surfaces rawsql-ts errors from runSqlLint.
|
|
330
|
+
* @param filePath The SQL file that triggered the parser issue.
|
|
331
|
+
* @param contents Statement contents to display alongside the error.
|
|
332
|
+
* @param error The parser error produced by rawsql-ts.
|
|
333
|
+
* @returns A failure record that keeps the command output consistent.
|
|
334
|
+
*/
|
|
335
|
+
function buildParserFailure(filePath, contents, error) {
|
|
336
|
+
const message = `RawSQL parser: ${error instanceof Error ? error.message : 'Unknown parser error'}`;
|
|
337
|
+
return buildLintFailure({
|
|
338
|
+
kind: 'parser',
|
|
339
|
+
filePath,
|
|
340
|
+
statement: contents,
|
|
341
|
+
message,
|
|
342
|
+
location: null
|
|
343
|
+
});
|
|
344
|
+
}
|
|
345
|
+
function buildStatementFailure(filePath, statement, contents, error, rewritten, constructors) {
|
|
346
|
+
if (isTransformError(error, constructors)) {
|
|
347
|
+
return buildTransformFailureFromStatement(filePath, statement, error, rewritten, constructors);
|
|
348
|
+
}
|
|
349
|
+
return buildDbFailure(filePath, statement, contents, error, rewritten);
|
|
350
|
+
}
|
|
351
|
+
function buildDbFailure(filePath, statement, contents, error, rewritten) {
|
|
352
|
+
var _a;
|
|
353
|
+
const pgError = error;
|
|
354
|
+
const position = typeof pgError.position === 'string'
|
|
355
|
+
? Number(pgError.position) - 1
|
|
356
|
+
: typeof pgError.position === 'number'
|
|
357
|
+
? pgError.position
|
|
358
|
+
: undefined;
|
|
359
|
+
const location = position !== undefined ? findLineColumn(contents, position) : null;
|
|
360
|
+
const details = {};
|
|
361
|
+
if (typeof pgError.code === 'string') {
|
|
362
|
+
details.code = pgError.code;
|
|
363
|
+
}
|
|
364
|
+
if (typeof pgError.position === 'string' && !Number.isNaN(Number(pgError.position))) {
|
|
365
|
+
details.position = Number(pgError.position);
|
|
366
|
+
}
|
|
367
|
+
else if (typeof pgError.position === 'number') {
|
|
368
|
+
details.position = pgError.position;
|
|
369
|
+
}
|
|
370
|
+
if (typeof pgError.detail === 'string') {
|
|
371
|
+
details.detail = pgError.detail;
|
|
372
|
+
}
|
|
373
|
+
if (typeof pgError.hint === 'string') {
|
|
374
|
+
details.hint = pgError.hint;
|
|
375
|
+
}
|
|
376
|
+
return buildLintFailure({
|
|
377
|
+
kind: 'db',
|
|
378
|
+
filePath,
|
|
379
|
+
statement,
|
|
380
|
+
message: (_a = pgError.message) !== null && _a !== void 0 ? _a : 'Unknown error',
|
|
381
|
+
location,
|
|
382
|
+
rewritten,
|
|
383
|
+
details: Object.keys(details).length > 0 ? details : undefined
|
|
384
|
+
});
|
|
385
|
+
}
|
|
386
|
+
function buildTransformFailureFromStatement(filePath, statement, error, rewritten, constructors) {
|
|
387
|
+
const message = `ZTD transform: ${error.message}`;
|
|
388
|
+
const details = getTransformDetails(error, constructors);
|
|
389
|
+
return buildLintFailure({
|
|
390
|
+
kind: 'transform',
|
|
391
|
+
filePath,
|
|
392
|
+
statement,
|
|
393
|
+
message,
|
|
394
|
+
location: null,
|
|
395
|
+
rewritten,
|
|
396
|
+
details
|
|
397
|
+
});
|
|
398
|
+
}
|
|
399
|
+
function buildTransformFailureFromLoaderError(error, ddlDirectories, constructors) {
|
|
400
|
+
if (error instanceof constructors.DdlLintError &&
|
|
401
|
+
error.diagnostics.length > 0) {
|
|
402
|
+
const diag = error.diagnostics[0];
|
|
403
|
+
const filePath = resolveDdlFailurePath(diag.source, ddlDirectories);
|
|
404
|
+
return buildLintFailure({
|
|
405
|
+
kind: 'transform',
|
|
406
|
+
filePath,
|
|
407
|
+
message: `ZTD transform: ${diag.message}`,
|
|
408
|
+
location: null,
|
|
409
|
+
details: { code: diag.code }
|
|
410
|
+
});
|
|
411
|
+
}
|
|
412
|
+
const filePath = resolveDdlFailurePath(undefined, ddlDirectories);
|
|
413
|
+
return buildLintFailure({
|
|
414
|
+
kind: 'transform',
|
|
415
|
+
filePath,
|
|
416
|
+
message: `ZTD transform: ${error instanceof Error ? error.message : 'Unknown transform error'}`,
|
|
417
|
+
location: null
|
|
418
|
+
});
|
|
419
|
+
}
|
|
420
|
+
function resolveDdlFailurePath(source, directories) {
|
|
421
|
+
if (source) {
|
|
422
|
+
return node_path_1.default.resolve(process.cwd(), source);
|
|
423
|
+
}
|
|
424
|
+
if (directories.length) {
|
|
425
|
+
return node_path_1.default.resolve(directories[0]);
|
|
426
|
+
}
|
|
427
|
+
return process.cwd();
|
|
428
|
+
}
|
|
429
|
+
function getTransformDetails(error, constructors) {
|
|
430
|
+
if (error instanceof constructors.MissingFixtureError) {
|
|
431
|
+
return { code: 'missing-fixture' };
|
|
432
|
+
}
|
|
433
|
+
if (error instanceof constructors.SchemaValidationError) {
|
|
434
|
+
return { code: 'schema-validation' };
|
|
435
|
+
}
|
|
436
|
+
if (error instanceof constructors.QueryRewriteError) {
|
|
437
|
+
return { code: 'query-rewrite' };
|
|
438
|
+
}
|
|
439
|
+
return undefined;
|
|
440
|
+
}
|
|
441
|
+
function isTransformError(error, constructors) {
|
|
442
|
+
return (error instanceof constructors.MissingFixtureError ||
|
|
443
|
+
error instanceof constructors.SchemaValidationError ||
|
|
444
|
+
error instanceof constructors.QueryRewriteError);
|
|
445
|
+
}
|
|
446
|
+
function buildLintFailure(params) {
|
|
447
|
+
var _a, _b;
|
|
448
|
+
return {
|
|
449
|
+
kind: params.kind,
|
|
450
|
+
filePath: params.filePath,
|
|
451
|
+
statement: params.statement,
|
|
452
|
+
message: params.message,
|
|
453
|
+
location: (_a = params.location) !== null && _a !== void 0 ? _a : null,
|
|
454
|
+
rewritten: (_b = params.rewritten) !== null && _b !== void 0 ? _b : null,
|
|
455
|
+
details: params.details
|
|
456
|
+
};
|
|
457
|
+
}
|
|
458
|
+
function findLineColumn(contents, position) {
|
|
459
|
+
const lines = contents.split(/\r?\n/);
|
|
460
|
+
let offset = 0;
|
|
461
|
+
for (let i = 0; i < lines.length; i += 1) {
|
|
462
|
+
const lineLength = lines[i].length + 1;
|
|
463
|
+
if (position < offset + lineLength) {
|
|
464
|
+
return {
|
|
465
|
+
line: i + 1,
|
|
466
|
+
column: position - offset + 1
|
|
467
|
+
};
|
|
468
|
+
}
|
|
469
|
+
offset += lineLength;
|
|
470
|
+
}
|
|
471
|
+
return {
|
|
472
|
+
line: lines.length,
|
|
473
|
+
column: lines[lines.length - 1].length + 1
|
|
474
|
+
};
|
|
475
|
+
}
|
|
476
|
+
function reportFailures(failures) {
|
|
477
|
+
var _a, _b, _c, _d;
|
|
478
|
+
for (const failure of failures) {
|
|
479
|
+
console.error(`\n[${failure.filePath}] (${failure.kind}) ${failure.message}`);
|
|
480
|
+
if (failure.location) {
|
|
481
|
+
console.error(`at line ${failure.location.line} column ${failure.location.column}`);
|
|
482
|
+
}
|
|
483
|
+
if (((_a = failure.details) === null || _a === void 0 ? void 0 : _a.position) !== undefined) {
|
|
484
|
+
console.error(`position: ${failure.details.position}`);
|
|
485
|
+
}
|
|
486
|
+
if ((_b = failure.details) === null || _b === void 0 ? void 0 : _b.code) {
|
|
487
|
+
console.error(`code: ${failure.details.code}`);
|
|
488
|
+
}
|
|
489
|
+
if ((_c = failure.details) === null || _c === void 0 ? void 0 : _c.detail) {
|
|
490
|
+
console.error(`detail: ${failure.details.detail}`);
|
|
491
|
+
}
|
|
492
|
+
if ((_d = failure.details) === null || _d === void 0 ? void 0 : _d.hint) {
|
|
493
|
+
console.error(`hint: ${failure.details.hint}`);
|
|
494
|
+
}
|
|
495
|
+
if (failure.rewritten) {
|
|
496
|
+
console.error('rewritten SQL:');
|
|
497
|
+
console.error(failure.rewritten);
|
|
498
|
+
}
|
|
499
|
+
}
|
|
500
|
+
}
|
|
501
|
+
//# sourceMappingURL=lint.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"lint.js","sourceRoot":"","sources":["../../src/commands/lint.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,60 @@
|
|
|
1
|
+
import { Command } from 'commander';
|
|
2
|
+
import { type ModelGenFormat } from '../utils/modelGenRender';
|
|
3
|
+
import { type SqlScanResult } from '../utils/modelGenScanner';
|
|
4
|
+
import { type ConnectionCliOptions } from './connectionOptions';
|
|
5
|
+
interface ModelGenCommandOptions extends ConnectionCliOptions {
|
|
6
|
+
out?: string;
|
|
7
|
+
format?: ModelGenFormat;
|
|
8
|
+
sqlRoot?: string;
|
|
9
|
+
allowPositional?: boolean;
|
|
10
|
+
debugProbe?: boolean;
|
|
11
|
+
probeMode?: ModelGenProbeMode;
|
|
12
|
+
ddlDir?: string;
|
|
13
|
+
importStyle?: ModelGenImportStyle;
|
|
14
|
+
importFrom?: string;
|
|
15
|
+
dryRun?: boolean;
|
|
16
|
+
describeOutput?: boolean;
|
|
17
|
+
json?: string;
|
|
18
|
+
}
|
|
19
|
+
type ModelGenProbeMode = 'live' | 'ztd';
|
|
20
|
+
type ModelGenImportStyle = 'package' | 'relative';
|
|
21
|
+
interface ModelGenZtdProbeOptions {
|
|
22
|
+
ddlDirectories: string[];
|
|
23
|
+
defaultSchema: string;
|
|
24
|
+
searchPath: string[];
|
|
25
|
+
}
|
|
26
|
+
interface ModelGenZtdFixtureState {
|
|
27
|
+
tableDefinitions: unknown[];
|
|
28
|
+
tableRows: Array<{
|
|
29
|
+
tableName: string;
|
|
30
|
+
rows: Array<Record<string, unknown>>;
|
|
31
|
+
}>;
|
|
32
|
+
}
|
|
33
|
+
export declare const MODEL_GEN_SPAN_NAMES: {
|
|
34
|
+
readonly resolveInputs: "resolve-model-gen-inputs";
|
|
35
|
+
readonly placeholderScan: "placeholder-scan";
|
|
36
|
+
readonly probeClientConnect: "probe-client-connect";
|
|
37
|
+
readonly probeQueryColumns: "probe-query-columns";
|
|
38
|
+
readonly typeInference: "type-inference";
|
|
39
|
+
readonly renderOutput: "render-generated-output";
|
|
40
|
+
readonly fileEmit: "file-emit";
|
|
41
|
+
};
|
|
42
|
+
interface ModelGenZtdProbeInput {
|
|
43
|
+
ddlDir?: string;
|
|
44
|
+
rootDir?: string;
|
|
45
|
+
}
|
|
46
|
+
export declare function runModelGen(sqlFilePath: string, options: ModelGenCommandOptions): Promise<string>;
|
|
47
|
+
export declare function registerModelGenCommand(program: Command): void;
|
|
48
|
+
export declare function resolveCliConnectionWithProbeGuidance(options: ModelGenCommandOptions, probeMode: ModelGenProbeMode): import("../utils/dbConnection").ResolvedDatabaseConnection;
|
|
49
|
+
export declare function buildModelGenConnectionFailure(error: unknown, probeMode: ModelGenProbeMode): Error;
|
|
50
|
+
export declare function bindProbeSql(sqlSource: string, scan: SqlScanResult, allowPositional: boolean): {
|
|
51
|
+
boundSql: string;
|
|
52
|
+
orderedParamNames: string[];
|
|
53
|
+
};
|
|
54
|
+
export declare function resolveModelGenZtdProbeOptions(options: ModelGenZtdProbeInput): ModelGenZtdProbeOptions;
|
|
55
|
+
export declare function resolveSqlContractImportSpecifier(options: Pick<ModelGenCommandOptions, 'out' | 'importStyle' | 'importFrom'> & {
|
|
56
|
+
rootDir?: string;
|
|
57
|
+
}): string;
|
|
58
|
+
export declare function loadModelGenZtdFixtureState(options: ModelGenZtdProbeOptions): Promise<ModelGenZtdFixtureState>;
|
|
59
|
+
export declare function normalizeCliPath(filePath: string): string;
|
|
60
|
+
export {};
|