@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,14 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Fixed fingerprint length used in machine-facing outputs.
|
|
3
|
+
*/
|
|
4
|
+
export declare const QUERY_FINGERPRINT_LENGTH = 12;
|
|
5
|
+
/**
|
|
6
|
+
* Normalize SQL text for stable statement fingerprinting.
|
|
7
|
+
*
|
|
8
|
+
* Fingerprint normalization is a compatibility contract for Issue #478.
|
|
9
|
+
*/
|
|
10
|
+
export declare function normalizeQueryFingerprintSource(sql: string): string;
|
|
11
|
+
/**
|
|
12
|
+
* Build a stable short fingerprint for a SQL statement.
|
|
13
|
+
*/
|
|
14
|
+
export declare function createQueryFingerprint(sql: string): string;
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.QUERY_FINGERPRINT_LENGTH = void 0;
|
|
4
|
+
exports.normalizeQueryFingerprintSource = normalizeQueryFingerprintSource;
|
|
5
|
+
exports.createQueryFingerprint = createQueryFingerprint;
|
|
6
|
+
const node_crypto_1 = require("node:crypto");
|
|
7
|
+
/**
|
|
8
|
+
* Fixed fingerprint length used in machine-facing outputs.
|
|
9
|
+
*/
|
|
10
|
+
exports.QUERY_FINGERPRINT_LENGTH = 12;
|
|
11
|
+
/**
|
|
12
|
+
* Normalize SQL text for stable statement fingerprinting.
|
|
13
|
+
*
|
|
14
|
+
* Fingerprint normalization is a compatibility contract for Issue #478.
|
|
15
|
+
*/
|
|
16
|
+
function normalizeQueryFingerprintSource(sql) {
|
|
17
|
+
const withoutLineComments = sql
|
|
18
|
+
.split('\n')
|
|
19
|
+
.map((line) => {
|
|
20
|
+
const commentStart = line.indexOf('--');
|
|
21
|
+
return commentStart >= 0 ? line.slice(0, commentStart) : line;
|
|
22
|
+
})
|
|
23
|
+
.join('\n');
|
|
24
|
+
const withoutBlockComments = withoutLineComments.replace(/\/\*[\s\S]*?\*\//g, ' ');
|
|
25
|
+
return withoutBlockComments.replace(/\s+/g, ' ').trim();
|
|
26
|
+
}
|
|
27
|
+
/**
|
|
28
|
+
* Build a stable short fingerprint for a SQL statement.
|
|
29
|
+
*/
|
|
30
|
+
function createQueryFingerprint(sql) {
|
|
31
|
+
const normalized = normalizeQueryFingerprintSource(sql);
|
|
32
|
+
return (0, node_crypto_1.createHash)('sha1').update(normalized).digest('hex').slice(0, exports.QUERY_FINGERPRINT_LENGTH);
|
|
33
|
+
}
|
|
34
|
+
//# sourceMappingURL=queryFingerprint.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"queryFingerprint.js","sourceRoot":"","sources":["../../src/utils/queryFingerprint.ts"],"names":[],"mappings":";;;AAYA,0EAWC;AAKD,wDAGC;AA/BD,6CAAyC;AAEzC;;GAEG;AACU,QAAA,wBAAwB,GAAG,EAAE,CAAC;AAE3C;;;;GAIG;AACH,SAAgB,+BAA+B,CAAC,GAAW;IACzD,MAAM,mBAAmB,GAAG,GAAG;SAC5B,KAAK,CAAC,IAAI,CAAC;SACX,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE;QACZ,MAAM,YAAY,GAAG,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;QACxC,OAAO,YAAY,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,YAAY,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;IAChE,CAAC,CAAC;SACD,IAAI,CAAC,IAAI,CAAC,CAAC;IAEd,MAAM,oBAAoB,GAAG,mBAAmB,CAAC,OAAO,CAAC,mBAAmB,EAAE,GAAG,CAAC,CAAC;IACnF,OAAO,oBAAoB,CAAC,OAAO,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC,IAAI,EAAE,CAAC;AAC1D,CAAC;AAED;;GAEG;AACH,SAAgB,sBAAsB,CAAC,GAAW;IAChD,MAAM,UAAU,GAAG,+BAA+B,CAAC,GAAG,CAAC,CAAC;IACxD,OAAO,IAAA,wBAAU,EAAC,MAAM,CAAC,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,gCAAwB,CAAC,CAAC;AAChG,CAAC"}
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Minimal SQL catalog spec shape shared across command-layer discovery flows.
|
|
3
|
+
*/
|
|
4
|
+
export interface SqlCatalogSpecLike {
|
|
5
|
+
id?: unknown;
|
|
6
|
+
sqlFile?: unknown;
|
|
7
|
+
params?: {
|
|
8
|
+
shape?: unknown;
|
|
9
|
+
example?: unknown;
|
|
10
|
+
};
|
|
11
|
+
output?: {
|
|
12
|
+
mapping?: {
|
|
13
|
+
prefix?: unknown;
|
|
14
|
+
columnMap?: unknown;
|
|
15
|
+
} | unknown;
|
|
16
|
+
};
|
|
17
|
+
}
|
|
18
|
+
/**
|
|
19
|
+
* Discovered SQL catalog spec paired with its source file path.
|
|
20
|
+
*/
|
|
21
|
+
export interface LoadedSqlCatalogSpec {
|
|
22
|
+
filePath: string;
|
|
23
|
+
spec: SqlCatalogSpecLike;
|
|
24
|
+
}
|
|
25
|
+
interface DiscoveryErrorFactory {
|
|
26
|
+
(message: string): Error;
|
|
27
|
+
}
|
|
28
|
+
/**
|
|
29
|
+
* Walk spec-like files under the provided root using deterministic ordering.
|
|
30
|
+
*/
|
|
31
|
+
export declare function walkSqlCatalogSpecFiles(rootDir: string, options?: {
|
|
32
|
+
excludeTestFiles?: boolean;
|
|
33
|
+
excludeGenerated?: boolean;
|
|
34
|
+
}): string[];
|
|
35
|
+
/**
|
|
36
|
+
* Load SQL catalog specs from a single file while preserving current lightweight parsing behavior.
|
|
37
|
+
*/
|
|
38
|
+
export declare function loadSqlCatalogSpecsFromFile(filePath: string, createError: DiscoveryErrorFactory): LoadedSqlCatalogSpec[];
|
|
39
|
+
/**
|
|
40
|
+
* Lightweight TS/JS object-literal extraction used by current command implementations.
|
|
41
|
+
*/
|
|
42
|
+
export declare function extractTsJsSpecBlocks(source: string): string[];
|
|
43
|
+
export declare function isPlainObject(value: unknown): value is Record<string, unknown>;
|
|
44
|
+
export {};
|
|
@@ -0,0 +1,166 @@
|
|
|
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.walkSqlCatalogSpecFiles = walkSqlCatalogSpecFiles;
|
|
7
|
+
exports.loadSqlCatalogSpecsFromFile = loadSqlCatalogSpecsFromFile;
|
|
8
|
+
exports.extractTsJsSpecBlocks = extractTsJsSpecBlocks;
|
|
9
|
+
exports.isPlainObject = isPlainObject;
|
|
10
|
+
const node_fs_1 = require("node:fs");
|
|
11
|
+
const node_path_1 = __importDefault(require("node:path"));
|
|
12
|
+
/**
|
|
13
|
+
* Walk spec-like files under the provided root using deterministic ordering.
|
|
14
|
+
*/
|
|
15
|
+
function walkSqlCatalogSpecFiles(rootDir, options) {
|
|
16
|
+
const files = [];
|
|
17
|
+
const stack = [rootDir];
|
|
18
|
+
while (stack.length > 0) {
|
|
19
|
+
const current = stack.pop();
|
|
20
|
+
const entries = (0, node_fs_1.readdirSync)(current, { withFileTypes: true })
|
|
21
|
+
.sort((a, b) => a.name.localeCompare(b.name));
|
|
22
|
+
for (const entry of entries) {
|
|
23
|
+
const absolute = node_path_1.default.join(current, entry.name);
|
|
24
|
+
if (entry.isDirectory()) {
|
|
25
|
+
stack.push(absolute);
|
|
26
|
+
continue;
|
|
27
|
+
}
|
|
28
|
+
if (!entry.isFile()) {
|
|
29
|
+
continue;
|
|
30
|
+
}
|
|
31
|
+
const lowered = entry.name.toLowerCase();
|
|
32
|
+
const isSpecLike = lowered.endsWith('.json') ||
|
|
33
|
+
lowered.endsWith('.ts') ||
|
|
34
|
+
lowered.endsWith('.js') ||
|
|
35
|
+
lowered.endsWith('.mts') ||
|
|
36
|
+
lowered.endsWith('.cts');
|
|
37
|
+
if (!isSpecLike) {
|
|
38
|
+
continue;
|
|
39
|
+
}
|
|
40
|
+
if ((options === null || options === void 0 ? void 0 : options.excludeTestFiles) && lowered.includes('.test.')) {
|
|
41
|
+
continue;
|
|
42
|
+
}
|
|
43
|
+
if ((options === null || options === void 0 ? void 0 : options.excludeGenerated) && isGeneratedSpecPath(absolute, rootDir)) {
|
|
44
|
+
continue;
|
|
45
|
+
}
|
|
46
|
+
files.push(absolute);
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
return files.sort((a, b) => a.localeCompare(b));
|
|
50
|
+
}
|
|
51
|
+
/**
|
|
52
|
+
* Load SQL catalog specs from a single file while preserving current lightweight parsing behavior.
|
|
53
|
+
*/
|
|
54
|
+
function loadSqlCatalogSpecsFromFile(filePath, createError) {
|
|
55
|
+
const ext = node_path_1.default.extname(filePath).toLowerCase();
|
|
56
|
+
if (ext === '.json') {
|
|
57
|
+
let parsed;
|
|
58
|
+
try {
|
|
59
|
+
parsed = JSON.parse((0, node_fs_1.readFileSync)(filePath, 'utf8'));
|
|
60
|
+
}
|
|
61
|
+
catch (error) {
|
|
62
|
+
throw createError(`Failed to parse spec file ${filePath}: ${error instanceof Error ? error.message : String(error)}`);
|
|
63
|
+
}
|
|
64
|
+
if (Array.isArray(parsed)) {
|
|
65
|
+
return parsed.map((spec) => ({ spec: spec, filePath }));
|
|
66
|
+
}
|
|
67
|
+
if (isPlainObject(parsed) && Array.isArray(parsed.specs)) {
|
|
68
|
+
const specs = parsed.specs;
|
|
69
|
+
return specs.map((spec) => ({ spec: spec, filePath }));
|
|
70
|
+
}
|
|
71
|
+
if (isPlainObject(parsed)) {
|
|
72
|
+
return [{ spec: parsed, filePath }];
|
|
73
|
+
}
|
|
74
|
+
throw createError(`Unsupported spec format in ${filePath}`);
|
|
75
|
+
}
|
|
76
|
+
const source = (0, node_fs_1.readFileSync)(filePath, 'utf8');
|
|
77
|
+
const blocks = extractTsJsSpecBlocks(source);
|
|
78
|
+
return blocks.map((block) => {
|
|
79
|
+
var _a, _b, _c, _d, _e, _f;
|
|
80
|
+
const id = (_a = block.match(/id\s*:\s*['"`]([^'"`]+)['"`]/)) === null || _a === void 0 ? void 0 : _a[1];
|
|
81
|
+
const sqlFile = (_b = block.match(/sqlFile\s*:\s*['"`]([^'"`]+)['"`]/)) === null || _b === void 0 ? void 0 : _b[1];
|
|
82
|
+
const shape = (_c = block.match(/shape\s*:\s*['"`](positional|named)['"`]/)) === null || _c === void 0 ? void 0 : _c[1];
|
|
83
|
+
const exampleIsArray = /example\s*:\s*\[/.test(block);
|
|
84
|
+
const exampleIsObject = /example\s*:\s*\{/.test(block);
|
|
85
|
+
const columnMapBlock = (_e = (_d = block.match(/columnMap\s*:\s*\{([\s\S]*?)\}/)) === null || _d === void 0 ? void 0 : _d[1]) !== null && _e !== void 0 ? _e : '';
|
|
86
|
+
const columnMap = {};
|
|
87
|
+
for (const match of Array.from(columnMapBlock.matchAll(/([A-Za-z_$][\w$]*)\s*:\s*['"`]([^'"`]+)['"`]/g))) {
|
|
88
|
+
columnMap[match[1]] = match[2];
|
|
89
|
+
}
|
|
90
|
+
const prefix = (_f = block.match(/prefix\s*:\s*['"`]([^'"`]*)['"`]/)) === null || _f === void 0 ? void 0 : _f[1];
|
|
91
|
+
const mapping = {
|
|
92
|
+
...(typeof prefix === 'string' ? { prefix } : {}),
|
|
93
|
+
...(Object.keys(columnMap).length > 0 ? { columnMap } : {})
|
|
94
|
+
};
|
|
95
|
+
return {
|
|
96
|
+
spec: {
|
|
97
|
+
id,
|
|
98
|
+
sqlFile,
|
|
99
|
+
params: {
|
|
100
|
+
shape,
|
|
101
|
+
example: exampleIsArray ? [] : exampleIsObject ? {} : undefined
|
|
102
|
+
},
|
|
103
|
+
output: Object.keys(mapping).length > 0 ? { mapping } : undefined
|
|
104
|
+
},
|
|
105
|
+
filePath
|
|
106
|
+
};
|
|
107
|
+
});
|
|
108
|
+
}
|
|
109
|
+
/**
|
|
110
|
+
* Lightweight TS/JS object-literal extraction used by current command implementations.
|
|
111
|
+
*/
|
|
112
|
+
function extractTsJsSpecBlocks(source) {
|
|
113
|
+
const blocks = [];
|
|
114
|
+
const seen = new Set();
|
|
115
|
+
const idRegex = /id\s*:\s*['"`][^'"`]+['"`]/g;
|
|
116
|
+
for (const match of Array.from(source.matchAll(idRegex))) {
|
|
117
|
+
if (typeof match.index !== 'number') {
|
|
118
|
+
continue;
|
|
119
|
+
}
|
|
120
|
+
const start = source.lastIndexOf('{', match.index);
|
|
121
|
+
if (start < 0) {
|
|
122
|
+
continue;
|
|
123
|
+
}
|
|
124
|
+
let depth = 0;
|
|
125
|
+
let end = -1;
|
|
126
|
+
for (let i = start; i < source.length; i += 1) {
|
|
127
|
+
const ch = source[i];
|
|
128
|
+
if (ch === '{') {
|
|
129
|
+
depth += 1;
|
|
130
|
+
}
|
|
131
|
+
else if (ch === '}') {
|
|
132
|
+
depth -= 1;
|
|
133
|
+
if (depth === 0) {
|
|
134
|
+
end = i;
|
|
135
|
+
break;
|
|
136
|
+
}
|
|
137
|
+
}
|
|
138
|
+
}
|
|
139
|
+
if (end < 0) {
|
|
140
|
+
continue;
|
|
141
|
+
}
|
|
142
|
+
const block = source.slice(start, end + 1);
|
|
143
|
+
if (!/sqlFile\s*:\s*['"`][^'"`]+['"`]/.test(block)) {
|
|
144
|
+
continue;
|
|
145
|
+
}
|
|
146
|
+
if (!seen.has(block)) {
|
|
147
|
+
seen.add(block);
|
|
148
|
+
blocks.push(block);
|
|
149
|
+
}
|
|
150
|
+
}
|
|
151
|
+
return blocks;
|
|
152
|
+
}
|
|
153
|
+
function isPlainObject(value) {
|
|
154
|
+
if (value === null || typeof value !== 'object' || Array.isArray(value)) {
|
|
155
|
+
return false;
|
|
156
|
+
}
|
|
157
|
+
const proto = Object.getPrototypeOf(value);
|
|
158
|
+
return proto === Object.prototype || proto === null;
|
|
159
|
+
}
|
|
160
|
+
function isGeneratedSpecPath(filePath, specsDir) {
|
|
161
|
+
const generatedDir = node_path_1.default.resolve(specsDir, 'generated');
|
|
162
|
+
const normalizedFilePath = node_path_1.default.resolve(filePath);
|
|
163
|
+
const relativePath = node_path_1.default.relative(generatedDir, normalizedFilePath);
|
|
164
|
+
return relativePath.length > 0 && !relativePath.startsWith('..') && !node_path_1.default.isAbsolute(relativePath);
|
|
165
|
+
}
|
|
166
|
+
//# sourceMappingURL=sqlCatalogDiscovery.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sqlCatalogDiscovery.js","sourceRoot":"","sources":["../../src/utils/sqlCatalogDiscovery.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Statement inventory entry derived from a catalog SQL file.
|
|
3
|
+
*/
|
|
4
|
+
export interface CatalogStatement {
|
|
5
|
+
catalogId: string;
|
|
6
|
+
queryId: string;
|
|
7
|
+
statementFingerprint: string;
|
|
8
|
+
sqlFile: string;
|
|
9
|
+
statementIndex: number;
|
|
10
|
+
statementText: string;
|
|
11
|
+
statementStartOffsetInFile: number;
|
|
12
|
+
}
|
|
13
|
+
/**
|
|
14
|
+
* Split a catalog SQL file into deterministic statement inventory rows.
|
|
15
|
+
*/
|
|
16
|
+
export declare function buildCatalogStatements(params: {
|
|
17
|
+
catalogId: string;
|
|
18
|
+
sqlFile: string;
|
|
19
|
+
sqlText: string;
|
|
20
|
+
}): CatalogStatement[];
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.buildCatalogStatements = buildCatalogStatements;
|
|
4
|
+
const rawsql_ts_1 = require("rawsql-ts");
|
|
5
|
+
const queryFingerprint_1 = require("./queryFingerprint");
|
|
6
|
+
/**
|
|
7
|
+
* Split a catalog SQL file into deterministic statement inventory rows.
|
|
8
|
+
*/
|
|
9
|
+
function buildCatalogStatements(params) {
|
|
10
|
+
const split = rawsql_ts_1.MultiQuerySplitter.split(params.sqlText);
|
|
11
|
+
return split.queries
|
|
12
|
+
.filter((query) => !query.isEmpty)
|
|
13
|
+
.map((query, index) => ({
|
|
14
|
+
catalogId: params.catalogId,
|
|
15
|
+
queryId: `${params.catalogId}:${index + 1}`,
|
|
16
|
+
statementFingerprint: (0, queryFingerprint_1.createQueryFingerprint)(query.sql),
|
|
17
|
+
sqlFile: params.sqlFile,
|
|
18
|
+
statementIndex: index + 1,
|
|
19
|
+
statementText: query.sql,
|
|
20
|
+
statementStartOffsetInFile: query.start
|
|
21
|
+
}));
|
|
22
|
+
}
|
|
23
|
+
//# sourceMappingURL=sqlCatalogStatements.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sqlCatalogStatements.js","sourceRoot":"","sources":["../../src/utils/sqlCatalogStatements.ts"],"names":[],"mappings":";;AAmBA,wDAiBC;AApCD,yCAA+C;AAC/C,yDAA4D;AAe5D;;GAEG;AACH,SAAgB,sBAAsB,CAAC,MAItC;IACC,MAAM,KAAK,GAAG,8BAAkB,CAAC,KAAK,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;IACvD,OAAO,KAAK,CAAC,OAAO;SACjB,MAAM,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC;SACjC,GAAG,CAAC,CAAC,KAAK,EAAE,KAAK,EAAE,EAAE,CAAC,CAAC;QACtB,SAAS,EAAE,MAAM,CAAC,SAAS;QAC3B,OAAO,EAAE,GAAG,MAAM,CAAC,SAAS,IAAI,KAAK,GAAG,CAAC,EAAE;QAC3C,oBAAoB,EAAE,IAAA,yCAAsB,EAAC,KAAK,CAAC,GAAG,CAAC;QACvD,OAAO,EAAE,MAAM,CAAC,OAAO;QACvB,cAAc,EAAE,KAAK,GAAG,CAAC;QACzB,aAAa,EAAE,KAAK,CAAC,GAAG;QACxB,0BAA0B,EAAE,KAAK,CAAC,KAAK;KACxC,CAAC,CAAC,CAAC;AACR,CAAC"}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
import type { TableDefinitionModel } from 'rawsql-ts';
|
|
2
|
+
import type { FixtureRow } from '@rawsql-ts/testkit-core';
|
|
3
|
+
/**
|
|
4
|
+
* Resolve a CLI argument into an absolute list of `.sql` files.
|
|
5
|
+
*/
|
|
6
|
+
export declare function resolveSqlFiles(pattern: string): string[];
|
|
7
|
+
/**
|
|
8
|
+
* Scan the configured DDL directories for CREATE TYPE ... AS ENUM definitions.
|
|
9
|
+
*/
|
|
10
|
+
export declare function extractEnumLabels(directories: string[], extensions?: string[]): Map<string, string[]>;
|
|
11
|
+
/**
|
|
12
|
+
* Build a fixture row for linting using minimal values derived from the column types.
|
|
13
|
+
*/
|
|
14
|
+
export declare function buildLintFixtureRow(definition: TableDefinitionModel, enumLabels: Map<string, string[]>): FixtureRow;
|
|
15
|
+
/**
|
|
16
|
+
* Infer a default value for a required column to keep Postgres happy.
|
|
17
|
+
*/
|
|
18
|
+
export declare function inferDefaultValue(typeName: string | undefined, enumLabels: Map<string, string[]>): unknown;
|
|
@@ -0,0 +1,270 @@
|
|
|
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.resolveSqlFiles = resolveSqlFiles;
|
|
7
|
+
exports.extractEnumLabels = extractEnumLabels;
|
|
8
|
+
exports.buildLintFixtureRow = buildLintFixtureRow;
|
|
9
|
+
exports.inferDefaultValue = inferDefaultValue;
|
|
10
|
+
const node_fs_1 = require("node:fs");
|
|
11
|
+
const node_path_1 = __importDefault(require("node:path"));
|
|
12
|
+
const fast_glob_1 = __importDefault(require("fast-glob"));
|
|
13
|
+
const options_1 = require("../commands/options");
|
|
14
|
+
const collectSqlFiles_1 = require("./collectSqlFiles");
|
|
15
|
+
/**
|
|
16
|
+
* Resolve a CLI argument into an absolute list of `.sql` files.
|
|
17
|
+
*/
|
|
18
|
+
function resolveSqlFiles(pattern) {
|
|
19
|
+
const absolutePattern = node_path_1.default.resolve(pattern);
|
|
20
|
+
if ((0, node_fs_1.existsSync)(absolutePattern)) {
|
|
21
|
+
const stats = (0, node_fs_1.lstatSync)(absolutePattern);
|
|
22
|
+
if (stats.isFile()) {
|
|
23
|
+
return [toPosixPattern(absolutePattern)];
|
|
24
|
+
}
|
|
25
|
+
if (stats.isDirectory()) {
|
|
26
|
+
const matches = fast_glob_1.default.sync(toPosixPattern(node_path_1.default.join(absolutePattern, '**', '*.sql')), {
|
|
27
|
+
absolute: true,
|
|
28
|
+
onlyFiles: true
|
|
29
|
+
});
|
|
30
|
+
if (matches.length === 0) {
|
|
31
|
+
throw new Error(`No SQL files were found under ${absolutePattern}`);
|
|
32
|
+
}
|
|
33
|
+
return matches.map(toPosixPattern).sort();
|
|
34
|
+
}
|
|
35
|
+
}
|
|
36
|
+
const globMatches = fast_glob_1.default.sync(toPosixPattern(pattern), {
|
|
37
|
+
absolute: true,
|
|
38
|
+
onlyFiles: true
|
|
39
|
+
});
|
|
40
|
+
if (globMatches.length === 0) {
|
|
41
|
+
throw new Error(`No SQL files matched ${pattern}`);
|
|
42
|
+
}
|
|
43
|
+
return globMatches.map(toPosixPattern).sort();
|
|
44
|
+
}
|
|
45
|
+
/**
|
|
46
|
+
* Scan the configured DDL directories for CREATE TYPE ... AS ENUM definitions.
|
|
47
|
+
*/
|
|
48
|
+
function extractEnumLabels(directories, extensions = options_1.DEFAULT_EXTENSIONS) {
|
|
49
|
+
const enums = new Map();
|
|
50
|
+
for (const directory of directories) {
|
|
51
|
+
if (!(0, node_fs_1.existsSync)(directory)) {
|
|
52
|
+
continue;
|
|
53
|
+
}
|
|
54
|
+
const files = (0, collectSqlFiles_1.collectSqlFiles)([directory], extensions);
|
|
55
|
+
for (const { sql } of files) {
|
|
56
|
+
for (const { name, labels } of parseEnumDefinitions(sql)) {
|
|
57
|
+
if (!labels.length) {
|
|
58
|
+
continue;
|
|
59
|
+
}
|
|
60
|
+
const normalized = normalizeQualifiedName(name);
|
|
61
|
+
if (!normalized) {
|
|
62
|
+
continue;
|
|
63
|
+
}
|
|
64
|
+
if (!enums.has(normalized)) {
|
|
65
|
+
enums.set(normalized, labels);
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
}
|
|
69
|
+
}
|
|
70
|
+
return enums;
|
|
71
|
+
}
|
|
72
|
+
/**
|
|
73
|
+
* Build a fixture row for linting using minimal values derived from the column types.
|
|
74
|
+
*/
|
|
75
|
+
function buildLintFixtureRow(definition, enumLabels) {
|
|
76
|
+
const row = {};
|
|
77
|
+
for (const column of definition.columns) {
|
|
78
|
+
row[column.name] = column.required
|
|
79
|
+
? inferDefaultValue(column.typeName, enumLabels)
|
|
80
|
+
: null;
|
|
81
|
+
}
|
|
82
|
+
return row;
|
|
83
|
+
}
|
|
84
|
+
/**
|
|
85
|
+
* Infer a default value for a required column to keep Postgres happy.
|
|
86
|
+
*/
|
|
87
|
+
function inferDefaultValue(typeName, enumLabels) {
|
|
88
|
+
if (!typeName) {
|
|
89
|
+
return '';
|
|
90
|
+
}
|
|
91
|
+
const normalized = normalizeTypeName(typeName);
|
|
92
|
+
const enumMatch = enumLabels.get(normalized.key);
|
|
93
|
+
if (enumMatch && enumMatch.length > 0) {
|
|
94
|
+
return enumMatch[0];
|
|
95
|
+
}
|
|
96
|
+
if (normalized.isArray) {
|
|
97
|
+
return '{}';
|
|
98
|
+
}
|
|
99
|
+
if (normalized.base.startsWith('int') ||
|
|
100
|
+
normalized.base.includes('serial') ||
|
|
101
|
+
normalized.base === 'numeric' ||
|
|
102
|
+
normalized.base === 'decimal' ||
|
|
103
|
+
normalized.base === 'real' ||
|
|
104
|
+
normalized.base === 'double precision') {
|
|
105
|
+
return 0;
|
|
106
|
+
}
|
|
107
|
+
if (normalized.base === 'boolean' || normalized.base === 'bool') {
|
|
108
|
+
return false;
|
|
109
|
+
}
|
|
110
|
+
if (normalized.base === 'uuid') {
|
|
111
|
+
return '00000000-0000-0000-0000-000000000000';
|
|
112
|
+
}
|
|
113
|
+
if (normalized.base.startsWith('character') ||
|
|
114
|
+
normalized.base.startsWith('varchar') ||
|
|
115
|
+
normalized.base === 'text' ||
|
|
116
|
+
normalized.base === 'citext' ||
|
|
117
|
+
normalized.base === 'name') {
|
|
118
|
+
return '';
|
|
119
|
+
}
|
|
120
|
+
if (normalized.base === 'date') {
|
|
121
|
+
return '1970-01-01';
|
|
122
|
+
}
|
|
123
|
+
if (normalized.base.startsWith('timestamp')) {
|
|
124
|
+
return '1970-01-01 00:00:00';
|
|
125
|
+
}
|
|
126
|
+
if (normalized.base.startsWith('time')) {
|
|
127
|
+
return '00:00:00';
|
|
128
|
+
}
|
|
129
|
+
if (normalized.base === 'json' || normalized.base === 'jsonb') {
|
|
130
|
+
return '{}';
|
|
131
|
+
}
|
|
132
|
+
return '';
|
|
133
|
+
}
|
|
134
|
+
function normalizeTypeName(typeName) {
|
|
135
|
+
const segments = splitQualifiedName(typeName);
|
|
136
|
+
if (segments.length === 0) {
|
|
137
|
+
return { base: '', key: '', isArray: false };
|
|
138
|
+
}
|
|
139
|
+
const cleaned = segments.map((token) => compactIdentifier(token).toLowerCase());
|
|
140
|
+
let isArray = false;
|
|
141
|
+
let lastSegment = cleaned[cleaned.length - 1];
|
|
142
|
+
if (lastSegment.endsWith('[]')) {
|
|
143
|
+
isArray = true;
|
|
144
|
+
lastSegment = lastSegment.slice(0, -2).trim();
|
|
145
|
+
}
|
|
146
|
+
const base = lastSegment.replace(/\(.*\)$/, '').trim();
|
|
147
|
+
cleaned[cleaned.length - 1] = base;
|
|
148
|
+
return {
|
|
149
|
+
base,
|
|
150
|
+
key: cleaned.join('.'),
|
|
151
|
+
isArray
|
|
152
|
+
};
|
|
153
|
+
}
|
|
154
|
+
function normalizeQualifiedName(value) {
|
|
155
|
+
const segments = splitQualifiedName(value);
|
|
156
|
+
if (segments.length === 0) {
|
|
157
|
+
return null;
|
|
158
|
+
}
|
|
159
|
+
const cleaned = segments.map((segment) => compactIdentifier(segment).toLowerCase());
|
|
160
|
+
return cleaned.join('.');
|
|
161
|
+
}
|
|
162
|
+
function splitQualifiedName(value) {
|
|
163
|
+
const parts = [];
|
|
164
|
+
let buffer = '';
|
|
165
|
+
let inQuotes = false;
|
|
166
|
+
for (let i = 0; i < value.length; i += 1) {
|
|
167
|
+
const char = value[i];
|
|
168
|
+
if (char === '"') {
|
|
169
|
+
buffer += char;
|
|
170
|
+
if (inQuotes && value[i + 1] === '"') {
|
|
171
|
+
buffer += '"';
|
|
172
|
+
i += 1;
|
|
173
|
+
continue;
|
|
174
|
+
}
|
|
175
|
+
inQuotes = !inQuotes;
|
|
176
|
+
continue;
|
|
177
|
+
}
|
|
178
|
+
if (char === '.' && !inQuotes) {
|
|
179
|
+
if (buffer.length > 0) {
|
|
180
|
+
parts.push(buffer);
|
|
181
|
+
}
|
|
182
|
+
buffer = '';
|
|
183
|
+
continue;
|
|
184
|
+
}
|
|
185
|
+
buffer += char;
|
|
186
|
+
}
|
|
187
|
+
if (buffer.length > 0) {
|
|
188
|
+
parts.push(buffer);
|
|
189
|
+
}
|
|
190
|
+
return parts
|
|
191
|
+
.map((segment) => segment.trim())
|
|
192
|
+
.filter(Boolean);
|
|
193
|
+
}
|
|
194
|
+
function compactIdentifier(value) {
|
|
195
|
+
const trimmed = value.trim();
|
|
196
|
+
if (trimmed.startsWith('"') && trimmed.endsWith('"')) {
|
|
197
|
+
return trimmed
|
|
198
|
+
.slice(1, -1)
|
|
199
|
+
.replace(/""/g, '"');
|
|
200
|
+
}
|
|
201
|
+
return trimmed.replace(/\s+/g, ' ');
|
|
202
|
+
}
|
|
203
|
+
function parseEnumDefinitions(sql) {
|
|
204
|
+
const results = [];
|
|
205
|
+
const regex = /create\s+type\s+(.+?)\s+as\s+enum\s*\(/gsi;
|
|
206
|
+
let match;
|
|
207
|
+
while ((match = regex.exec(sql))) {
|
|
208
|
+
const rawName = match[1].trim();
|
|
209
|
+
const openParenIndex = regex.lastIndex - 1;
|
|
210
|
+
if (openParenIndex < 0 || sql[openParenIndex] !== '(') {
|
|
211
|
+
continue;
|
|
212
|
+
}
|
|
213
|
+
const { labels, end } = parseEnumLabelList(sql, openParenIndex);
|
|
214
|
+
results.push({ name: rawName, labels });
|
|
215
|
+
regex.lastIndex = end;
|
|
216
|
+
}
|
|
217
|
+
return results;
|
|
218
|
+
}
|
|
219
|
+
function parseEnumLabelList(sql, startIndex) {
|
|
220
|
+
const labels = [];
|
|
221
|
+
let idx = startIndex + 1;
|
|
222
|
+
while (idx < sql.length) {
|
|
223
|
+
idx = skipWhitespace(sql, idx);
|
|
224
|
+
if (sql[idx] === ')') {
|
|
225
|
+
idx += 1;
|
|
226
|
+
break;
|
|
227
|
+
}
|
|
228
|
+
if (sql[idx] === ',') {
|
|
229
|
+
idx += 1;
|
|
230
|
+
continue;
|
|
231
|
+
}
|
|
232
|
+
if (sql[idx] !== "'") {
|
|
233
|
+
idx += 1;
|
|
234
|
+
continue;
|
|
235
|
+
}
|
|
236
|
+
const { value, newIndex } = parseStringLiteral(sql, idx);
|
|
237
|
+
labels.push(value);
|
|
238
|
+
idx = newIndex;
|
|
239
|
+
}
|
|
240
|
+
return { labels, end: idx };
|
|
241
|
+
}
|
|
242
|
+
function parseStringLiteral(sql, index) {
|
|
243
|
+
let idx = index + 1;
|
|
244
|
+
let value = '';
|
|
245
|
+
while (idx < sql.length) {
|
|
246
|
+
const char = sql[idx];
|
|
247
|
+
if (char === "'") {
|
|
248
|
+
if (sql[idx + 1] === "'") {
|
|
249
|
+
value += "'";
|
|
250
|
+
idx += 2;
|
|
251
|
+
continue;
|
|
252
|
+
}
|
|
253
|
+
idx += 1;
|
|
254
|
+
break;
|
|
255
|
+
}
|
|
256
|
+
value += char;
|
|
257
|
+
idx += 1;
|
|
258
|
+
}
|
|
259
|
+
return { value, newIndex: idx };
|
|
260
|
+
}
|
|
261
|
+
function skipWhitespace(sql, index) {
|
|
262
|
+
while (index < sql.length && /\s/.test(sql[index])) {
|
|
263
|
+
index += 1;
|
|
264
|
+
}
|
|
265
|
+
return index;
|
|
266
|
+
}
|
|
267
|
+
function toPosixPattern(value) {
|
|
268
|
+
return value.replace(/\\/g, '/');
|
|
269
|
+
}
|
|
270
|
+
//# sourceMappingURL=sqlLintHelpers.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sqlLintHelpers.js","sourceRoot":"","sources":["../../src/utils/sqlLintHelpers.ts"],"names":[],"mappings":"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"}
|