@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,151 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.resolveZtdOwnedTestConnection = resolveZtdOwnedTestConnection;
|
|
4
|
+
exports.resolveExplicitTargetConnection = resolveExplicitTargetConnection;
|
|
5
|
+
const DEFAULT_PORT = 5432;
|
|
6
|
+
const ZTD_TEST_DATABASE_ENV = 'ZTD_TEST_DATABASE_URL';
|
|
7
|
+
/**
|
|
8
|
+
* Resolves the single implicit database owned by ztd-cli.
|
|
9
|
+
* @returns The managed ZTD test database connection plus sanitized context metadata.
|
|
10
|
+
*/
|
|
11
|
+
function resolveZtdOwnedTestConnection() {
|
|
12
|
+
var _a;
|
|
13
|
+
const envUrl = ((_a = process.env[ZTD_TEST_DATABASE_ENV]) !== null && _a !== void 0 ? _a : '').trim();
|
|
14
|
+
if (!envUrl) {
|
|
15
|
+
throw new Error(`${ZTD_TEST_DATABASE_ENV} is required for this ZTD-owned workflow. ztd-cli does not read DATABASE_URL implicitly.`);
|
|
16
|
+
}
|
|
17
|
+
return {
|
|
18
|
+
url: envUrl,
|
|
19
|
+
context: {
|
|
20
|
+
source: 'ztd-test-env',
|
|
21
|
+
...parseUrlContext(envUrl)
|
|
22
|
+
}
|
|
23
|
+
};
|
|
24
|
+
}
|
|
25
|
+
/**
|
|
26
|
+
* Resolves an explicit non-ZTD target connection.
|
|
27
|
+
* @param flags - Explicit target fields supplied by the caller.
|
|
28
|
+
* @param explicitUrl - Fully-qualified explicit target URL.
|
|
29
|
+
* @returns The target connection plus sanitized context metadata.
|
|
30
|
+
*/
|
|
31
|
+
function resolveExplicitTargetConnection(flags, explicitUrl) {
|
|
32
|
+
const trimmedExplicitUrl = explicitUrl === null || explicitUrl === void 0 ? void 0 : explicitUrl.trim();
|
|
33
|
+
if (trimmedExplicitUrl) {
|
|
34
|
+
// Explicit URLs always win so callers can override any partially supplied field set.
|
|
35
|
+
return {
|
|
36
|
+
url: trimmedExplicitUrl,
|
|
37
|
+
context: {
|
|
38
|
+
source: 'explicit-url',
|
|
39
|
+
...parseUrlContext(trimmedExplicitUrl)
|
|
40
|
+
}
|
|
41
|
+
};
|
|
42
|
+
}
|
|
43
|
+
if (hasExplicitFlags(flags)) {
|
|
44
|
+
return resolveFromFlags(flags);
|
|
45
|
+
}
|
|
46
|
+
throw new Error('This command does not use implicit database settings. Pass --url or --db-* explicitly.');
|
|
47
|
+
}
|
|
48
|
+
/** Determines whether the caller provided any explicit target flag. */
|
|
49
|
+
function hasExplicitFlags(flags) {
|
|
50
|
+
return Boolean(flags.host ||
|
|
51
|
+
flags.port ||
|
|
52
|
+
flags.user ||
|
|
53
|
+
flags.password ||
|
|
54
|
+
flags.database);
|
|
55
|
+
}
|
|
56
|
+
/**
|
|
57
|
+
* Builds a complete explicit target connection when flag-based overrides are present.
|
|
58
|
+
* @param flags - Explicit connection fields supplied by the caller.
|
|
59
|
+
* @returns The canonical PostgreSQL URL plus metadata about the explicit target.
|
|
60
|
+
*/
|
|
61
|
+
function resolveFromFlags(flags) {
|
|
62
|
+
const missing = [];
|
|
63
|
+
if (!flags.host) {
|
|
64
|
+
missing.push('--db-host');
|
|
65
|
+
}
|
|
66
|
+
if (!flags.user) {
|
|
67
|
+
missing.push('--db-user');
|
|
68
|
+
}
|
|
69
|
+
if (!flags.database) {
|
|
70
|
+
missing.push('--db-name');
|
|
71
|
+
}
|
|
72
|
+
// Fail partial flag combinations so callers do not accidentally inspect the wrong target.
|
|
73
|
+
if (missing.length) {
|
|
74
|
+
throw new Error(`Incomplete explicit target database flags. Missing ${missing.join(', ')}. Provide all required fields or use --url.`);
|
|
75
|
+
}
|
|
76
|
+
const port = normalizePort(flags.port);
|
|
77
|
+
const numericPort = port !== null && port !== void 0 ? port : DEFAULT_PORT;
|
|
78
|
+
const url = buildConnectionUrl({
|
|
79
|
+
host: flags.host,
|
|
80
|
+
port: numericPort,
|
|
81
|
+
user: flags.user,
|
|
82
|
+
password: flags.password,
|
|
83
|
+
database: flags.database
|
|
84
|
+
});
|
|
85
|
+
return {
|
|
86
|
+
url,
|
|
87
|
+
context: {
|
|
88
|
+
source: 'explicit-flags',
|
|
89
|
+
host: flags.host,
|
|
90
|
+
port: numericPort,
|
|
91
|
+
user: flags.user,
|
|
92
|
+
database: flags.database
|
|
93
|
+
}
|
|
94
|
+
};
|
|
95
|
+
}
|
|
96
|
+
/**
|
|
97
|
+
* Normalizes a port string/number into a valid TCP port or undefined when absent.
|
|
98
|
+
* @param port - User-supplied port string or number.
|
|
99
|
+
* @returns The validated numeric port or undefined when the input is missing.
|
|
100
|
+
*/
|
|
101
|
+
function normalizePort(port) {
|
|
102
|
+
if (port === undefined) {
|
|
103
|
+
return undefined;
|
|
104
|
+
}
|
|
105
|
+
const parsed = typeof port === 'number' ? port : Number(port);
|
|
106
|
+
if (!Number.isFinite(parsed) || !Number.isInteger(parsed) || parsed <= 0 || parsed > 65535) {
|
|
107
|
+
throw new Error('The port must be a positive integer between 1 and 65535.');
|
|
108
|
+
}
|
|
109
|
+
return parsed;
|
|
110
|
+
}
|
|
111
|
+
/**
|
|
112
|
+
* Builds a canonical PostgreSQL connection URL from parsed segments.
|
|
113
|
+
* @param host - The database host address.
|
|
114
|
+
* @param port - The numeric TCP port to target.
|
|
115
|
+
* @param user - Username to embed in the URL.
|
|
116
|
+
* @param password - Optional password component.
|
|
117
|
+
* @param database - Database name applied to the pathname.
|
|
118
|
+
* @returns Fully-qualified PostgreSQL URL.
|
|
119
|
+
*/
|
|
120
|
+
function buildConnectionUrl({ host, port, user, password, database }) {
|
|
121
|
+
const url = new URL('postgresql://');
|
|
122
|
+
url.hostname = host;
|
|
123
|
+
url.port = port.toString();
|
|
124
|
+
url.username = user;
|
|
125
|
+
if (password) {
|
|
126
|
+
url.password = password;
|
|
127
|
+
}
|
|
128
|
+
url.pathname = `/${database}`;
|
|
129
|
+
return url.toString();
|
|
130
|
+
}
|
|
131
|
+
/**
|
|
132
|
+
* Extracts host/user/database metadata from a PostgreSQL-style URL.
|
|
133
|
+
* @param urlValue - Connection string provided by the caller.
|
|
134
|
+
* @returns Partial context describing host, port, user, and database.
|
|
135
|
+
*/
|
|
136
|
+
function parseUrlContext(urlValue) {
|
|
137
|
+
try {
|
|
138
|
+
const parsed = new URL(urlValue);
|
|
139
|
+
const database = parsed.pathname ? parsed.pathname.replace(/^\//, '') : undefined;
|
|
140
|
+
return {
|
|
141
|
+
host: parsed.hostname || undefined,
|
|
142
|
+
port: parsed.port ? Number(parsed.port) : undefined,
|
|
143
|
+
user: parsed.username || undefined,
|
|
144
|
+
database: database && database.length ? database : undefined
|
|
145
|
+
};
|
|
146
|
+
}
|
|
147
|
+
catch {
|
|
148
|
+
return {};
|
|
149
|
+
}
|
|
150
|
+
}
|
|
151
|
+
//# sourceMappingURL=dbConnection.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"dbConnection.js","sourceRoot":"","sources":["../../src/utils/dbConnection.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export declare function ensureDirectory(directory: string): void;
|
package/dist/utils/fs.js
ADDED
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.ensureDirectory = ensureDirectory;
|
|
4
|
+
const node_fs_1 = require("node:fs");
|
|
5
|
+
function ensureDirectory(directory) {
|
|
6
|
+
if (!directory || (0, node_fs_1.existsSync)(directory)) {
|
|
7
|
+
return;
|
|
8
|
+
}
|
|
9
|
+
// Create the destination hierarchy so calling code can emit files safely.
|
|
10
|
+
(0, node_fs_1.mkdirSync)(directory, { recursive: true });
|
|
11
|
+
}
|
|
12
|
+
//# sourceMappingURL=fs.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"fs.js","sourceRoot":"","sources":["../../src/utils/fs.ts"],"names":[],"mappings":";;AAEA,0CAOC;AATD,qCAAgD;AAEhD,SAAgB,eAAe,CAAC,SAAiB;IAC/C,IAAI,CAAC,SAAS,IAAI,IAAA,oBAAU,EAAC,SAAS,CAAC,EAAE,CAAC;QACxC,OAAO;IACT,CAAC;IAED,0EAA0E;IAC1E,IAAA,mBAAS,EAAC,SAAS,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;AAC5C,CAAC"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
export interface BoundModelGenSql {
|
|
2
|
+
boundSql: string;
|
|
3
|
+
orderedParamNames: string[];
|
|
4
|
+
}
|
|
5
|
+
/**
|
|
6
|
+
* Converts `:name` placeholders to indexed PostgreSQL placeholders while preserving string/comment boundaries.
|
|
7
|
+
*/
|
|
8
|
+
export declare function bindModelGenNamedSql(sql: string): BoundModelGenSql;
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.bindModelGenNamedSql = bindModelGenNamedSql;
|
|
4
|
+
const modelGenScanner_1 = require("./modelGenScanner");
|
|
5
|
+
/**
|
|
6
|
+
* Converts `:name` placeholders to indexed PostgreSQL placeholders while preserving string/comment boundaries.
|
|
7
|
+
*/
|
|
8
|
+
function bindModelGenNamedSql(sql) {
|
|
9
|
+
const scan = (0, modelGenScanner_1.scanModelGenSql)(sql);
|
|
10
|
+
if (scan.mode !== 'named') {
|
|
11
|
+
throw new Error('bindModelGenNamedSql expected named SQL placeholders.');
|
|
12
|
+
}
|
|
13
|
+
const orderedParamNames = [];
|
|
14
|
+
const slotByName = new Map();
|
|
15
|
+
let cursor = 0;
|
|
16
|
+
let boundSql = '';
|
|
17
|
+
for (const token of scan.namedTokens) {
|
|
18
|
+
boundSql += sql.slice(cursor, token.start);
|
|
19
|
+
let slot = slotByName.get(token.name);
|
|
20
|
+
if (!slot) {
|
|
21
|
+
orderedParamNames.push(token.name);
|
|
22
|
+
slot = orderedParamNames.length;
|
|
23
|
+
slotByName.set(token.name, slot);
|
|
24
|
+
}
|
|
25
|
+
boundSql += `$${slot}`;
|
|
26
|
+
cursor = token.end;
|
|
27
|
+
}
|
|
28
|
+
boundSql += sql.slice(cursor);
|
|
29
|
+
return { boundSql, orderedParamNames };
|
|
30
|
+
}
|
|
31
|
+
//# sourceMappingURL=modelGenBinder.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"modelGenBinder.js","sourceRoot":"","sources":["../../src/utils/modelGenBinder.ts"],"names":[],"mappings":";;AAUA,oDAyBC;AAnCD,uDAAoD;AAOpD;;GAEG;AACH,SAAgB,oBAAoB,CAAC,GAAW;IAC9C,MAAM,IAAI,GAAG,IAAA,iCAAe,EAAC,GAAG,CAAC,CAAC;IAClC,IAAI,IAAI,CAAC,IAAI,KAAK,OAAO,EAAE,CAAC;QAC1B,MAAM,IAAI,KAAK,CAAC,uDAAuD,CAAC,CAAC;IAC3E,CAAC;IAED,MAAM,iBAAiB,GAAa,EAAE,CAAC;IACvC,MAAM,UAAU,GAAG,IAAI,GAAG,EAAkB,CAAC;IAC7C,IAAI,MAAM,GAAG,CAAC,CAAC;IACf,IAAI,QAAQ,GAAG,EAAE,CAAC;IAElB,KAAK,MAAM,KAAK,IAAI,IAAI,CAAC,WAAW,EAAE,CAAC;QACrC,QAAQ,IAAI,GAAG,CAAC,KAAK,CAAC,MAAM,EAAE,KAAK,CAAC,KAAK,CAAC,CAAC;QAC3C,IAAI,IAAI,GAAG,UAAU,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;QACtC,IAAI,CAAC,IAAI,EAAE,CAAC;YACV,iBAAiB,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;YACnC,IAAI,GAAG,iBAAiB,CAAC,MAAM,CAAC;YAChC,UAAU,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC;QACnC,CAAC;QACD,QAAQ,IAAI,IAAI,IAAI,EAAE,CAAC;QACvB,MAAM,GAAG,KAAK,CAAC,GAAG,CAAC;IACrB,CAAC;IAED,QAAQ,IAAI,GAAG,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;IAC9B,OAAO,EAAE,QAAQ,EAAE,iBAAiB,EAAE,CAAC;AACzC,CAAC"}
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
export type ModelGenFormat = 'interface' | 'row-mapping' | 'spec';
|
|
2
|
+
export interface ModelGenColumn {
|
|
3
|
+
columnName: string;
|
|
4
|
+
propertyName: string;
|
|
5
|
+
tsType: string;
|
|
6
|
+
}
|
|
7
|
+
export interface RenderModelGenInput {
|
|
8
|
+
command: string;
|
|
9
|
+
format: ModelGenFormat;
|
|
10
|
+
sqlContractImport: string;
|
|
11
|
+
sqlFile: string;
|
|
12
|
+
specId: string;
|
|
13
|
+
interfaceName: string;
|
|
14
|
+
mappingName: string;
|
|
15
|
+
specName: string;
|
|
16
|
+
placeholderMode: 'named' | 'positional' | 'none';
|
|
17
|
+
allowPositional: boolean;
|
|
18
|
+
orderedParamNames: string[];
|
|
19
|
+
columns: ModelGenColumn[];
|
|
20
|
+
}
|
|
21
|
+
export declare function renderModelGenFile(input: RenderModelGenInput): string;
|
|
22
|
+
export declare function toModelPropertyName(columnName: string): string;
|
|
23
|
+
export declare function deriveModelGenNames(relativeSqlFile: string): {
|
|
24
|
+
interfaceName: string;
|
|
25
|
+
mappingName: string;
|
|
26
|
+
specName: string;
|
|
27
|
+
specId: string;
|
|
28
|
+
};
|
|
29
|
+
export declare function normalizeGeneratedSqlFile(relativeSqlFile: string): string;
|
|
@@ -0,0 +1,158 @@
|
|
|
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.renderModelGenFile = renderModelGenFile;
|
|
7
|
+
exports.toModelPropertyName = toModelPropertyName;
|
|
8
|
+
exports.deriveModelGenNames = deriveModelGenNames;
|
|
9
|
+
exports.normalizeGeneratedSqlFile = normalizeGeneratedSqlFile;
|
|
10
|
+
const node_path_1 = __importDefault(require("node:path"));
|
|
11
|
+
function renderModelGenFile(input) {
|
|
12
|
+
const parts = [];
|
|
13
|
+
parts.push(`// Generated by: ${input.command}`);
|
|
14
|
+
parts.push('// DO NOT COMMIT without review. Adjust nullability, cardinality, normalization, and example values as needed.');
|
|
15
|
+
parts.push('// Review rowMapping.key and rerun this command after SQL or schema changes.');
|
|
16
|
+
if (input.allowPositional && input.placeholderMode === 'positional') {
|
|
17
|
+
parts.push('// Legacy warning: this scaffold was generated from positional placeholders. Prefer rewriting the SQL asset to named parameters (:name).');
|
|
18
|
+
}
|
|
19
|
+
else {
|
|
20
|
+
parts.push('// names-first reminder: SQL asset files should use named parameters (:name).');
|
|
21
|
+
}
|
|
22
|
+
parts.push('');
|
|
23
|
+
if (input.format === 'row-mapping' || input.format === 'spec') {
|
|
24
|
+
const importNames = input.format === 'spec' ? 'rowMapping, type QuerySpec' : 'rowMapping';
|
|
25
|
+
parts.push(`import { ${importNames} } from ${renderTsStringLiteral(input.sqlContractImport)};`);
|
|
26
|
+
parts.push('');
|
|
27
|
+
}
|
|
28
|
+
parts.push(renderInterface(input.interfaceName, input.columns));
|
|
29
|
+
if (input.format === 'row-mapping' || input.format === 'spec') {
|
|
30
|
+
parts.push('');
|
|
31
|
+
parts.push(renderMapping(input.mappingName, input.interfaceName, input.columns));
|
|
32
|
+
}
|
|
33
|
+
if (input.format === 'spec') {
|
|
34
|
+
parts.push('');
|
|
35
|
+
parts.push(renderSpec(input));
|
|
36
|
+
}
|
|
37
|
+
return `${parts.join('\n')}\n`;
|
|
38
|
+
}
|
|
39
|
+
function toModelPropertyName(columnName) {
|
|
40
|
+
var _a;
|
|
41
|
+
const normalized = columnName
|
|
42
|
+
.trim()
|
|
43
|
+
.replace(/[^A-Za-z0-9]+/g, ' ')
|
|
44
|
+
.split(' ')
|
|
45
|
+
.filter(Boolean)
|
|
46
|
+
.map((segment, index) => {
|
|
47
|
+
const lower = segment.toLowerCase();
|
|
48
|
+
if (index === 0) {
|
|
49
|
+
return lower;
|
|
50
|
+
}
|
|
51
|
+
return lower.charAt(0).toUpperCase() + lower.slice(1);
|
|
52
|
+
})
|
|
53
|
+
.join('');
|
|
54
|
+
const prefixed = /^[A-Za-z_]/.test((_a = normalized.charAt(0)) !== null && _a !== void 0 ? _a : '') ? normalized : `_${normalized}`;
|
|
55
|
+
if (!prefixed) {
|
|
56
|
+
throw new Error(`Failed to derive a TypeScript property name from column "${columnName}".`);
|
|
57
|
+
}
|
|
58
|
+
return prefixed;
|
|
59
|
+
}
|
|
60
|
+
function deriveModelGenNames(relativeSqlFile) {
|
|
61
|
+
var _a;
|
|
62
|
+
const withoutExtension = relativeSqlFile.replace(/\.[^.]+$/u, '');
|
|
63
|
+
const normalizedPath = withoutExtension.replace(/\\/g, '/');
|
|
64
|
+
const segments = normalizedPath.split('/').filter(Boolean);
|
|
65
|
+
const lastSegment = (_a = segments[segments.length - 1]) !== null && _a !== void 0 ? _a : 'query';
|
|
66
|
+
const interfaceName = `${toPascalCase(lastSegment)}Row`;
|
|
67
|
+
const baseCamel = toCamelCase(lastSegment);
|
|
68
|
+
const specId = segments.length === 1
|
|
69
|
+
? baseCamel
|
|
70
|
+
: `${segments.slice(0, -1).join('.')}.${baseCamel}`;
|
|
71
|
+
return {
|
|
72
|
+
interfaceName,
|
|
73
|
+
mappingName: `${baseCamel}Mapping`,
|
|
74
|
+
specName: `${baseCamel}Spec`,
|
|
75
|
+
specId
|
|
76
|
+
};
|
|
77
|
+
}
|
|
78
|
+
function normalizeGeneratedSqlFile(relativeSqlFile) {
|
|
79
|
+
return relativeSqlFile.split(node_path_1.default.sep).join('/').replace(/\\/g, '/');
|
|
80
|
+
}
|
|
81
|
+
function renderInterface(interfaceName, columns) {
|
|
82
|
+
const fields = columns.map((column) => ` ${column.propertyName}: ${column.tsType};`).join('\n');
|
|
83
|
+
return `export interface ${interfaceName} {\n${fields}\n}`;
|
|
84
|
+
}
|
|
85
|
+
function renderMapping(mappingName, interfaceName, columns) {
|
|
86
|
+
var _a, _b;
|
|
87
|
+
const keyName = (_b = (_a = columns[0]) === null || _a === void 0 ? void 0 : _a.propertyName) !== null && _b !== void 0 ? _b : 'id';
|
|
88
|
+
const mapEntries = columns
|
|
89
|
+
.map((column) => ` ${column.propertyName}: ${renderTsStringLiteral(column.columnName)},`)
|
|
90
|
+
.join('\n');
|
|
91
|
+
return `export const ${mappingName} = rowMapping<${interfaceName}>({\n name: ${renderTsStringLiteral(interfaceName.replace(/Row$/u, ''))},\n key: ${renderTsStringLiteral(keyName)},\n columnMap: {\n${mapEntries}\n },\n});`;
|
|
92
|
+
}
|
|
93
|
+
function renderSpec(input) {
|
|
94
|
+
const paramsType = renderParamsType(input.placeholderMode, input.orderedParamNames);
|
|
95
|
+
const paramsExample = renderParamsExample(input.placeholderMode, input.orderedParamNames);
|
|
96
|
+
const outputExample = input.columns
|
|
97
|
+
.map((column) => ` ${column.propertyName}: ${renderExampleValue(column.tsType)},`)
|
|
98
|
+
.join('\n');
|
|
99
|
+
return `export const ${input.specName}: QuerySpec<${paramsType}, ${input.interfaceName}> = {\n id: ${renderTsStringLiteral(input.specId)},\n sqlFile: ${renderTsStringLiteral(input.sqlFile)},\n params: { shape: ${renderTsStringLiteral(input.placeholderMode === 'none' ? 'positional' : input.placeholderMode)}, example: ${paramsExample} },\n output: {\n mapping: ${input.mappingName},\n example: {\n${outputExample}\n },\n },\n};`;
|
|
100
|
+
}
|
|
101
|
+
function renderParamsType(mode, orderedParamNames) {
|
|
102
|
+
if (mode === 'named') {
|
|
103
|
+
return `{ ${orderedParamNames.map((name) => `${name}: unknown`).join('; ')} }`;
|
|
104
|
+
}
|
|
105
|
+
if (mode === 'positional') {
|
|
106
|
+
return 'unknown[]';
|
|
107
|
+
}
|
|
108
|
+
return '[]';
|
|
109
|
+
}
|
|
110
|
+
function renderParamsExample(mode, orderedParamNames) {
|
|
111
|
+
if (mode === 'named') {
|
|
112
|
+
const properties = orderedParamNames.map((name) => `${name}: null`).join(', ');
|
|
113
|
+
return `{ ${properties} }`;
|
|
114
|
+
}
|
|
115
|
+
if (mode === 'positional') {
|
|
116
|
+
return `[${orderedParamNames.map(() => 'null').join(', ')}]`;
|
|
117
|
+
}
|
|
118
|
+
return '[]';
|
|
119
|
+
}
|
|
120
|
+
function renderExampleValue(tsType) {
|
|
121
|
+
if (tsType.endsWith('[]')) {
|
|
122
|
+
return '[]';
|
|
123
|
+
}
|
|
124
|
+
if (tsType === 'number') {
|
|
125
|
+
return '0';
|
|
126
|
+
}
|
|
127
|
+
if (tsType === 'string') {
|
|
128
|
+
return "''";
|
|
129
|
+
}
|
|
130
|
+
if (tsType === 'boolean') {
|
|
131
|
+
return 'false';
|
|
132
|
+
}
|
|
133
|
+
if (tsType === 'Uint8Array') {
|
|
134
|
+
return 'new Uint8Array()';
|
|
135
|
+
}
|
|
136
|
+
if (tsType === 'any') {
|
|
137
|
+
return 'null';
|
|
138
|
+
}
|
|
139
|
+
return 'null as unknown';
|
|
140
|
+
}
|
|
141
|
+
function renderTsStringLiteral(value) {
|
|
142
|
+
return `'${value.replace(/\\/g, '\\\\').replace(/'/g, '\\\'')}'`;
|
|
143
|
+
}
|
|
144
|
+
function toPascalCase(value) {
|
|
145
|
+
return value
|
|
146
|
+
.split(/[^A-Za-z0-9]+/u)
|
|
147
|
+
.filter(Boolean)
|
|
148
|
+
.map((segment) => {
|
|
149
|
+
const lower = segment.toLowerCase();
|
|
150
|
+
return lower.charAt(0).toUpperCase() + lower.slice(1);
|
|
151
|
+
})
|
|
152
|
+
.join('') || 'Query';
|
|
153
|
+
}
|
|
154
|
+
function toCamelCase(value) {
|
|
155
|
+
const pascal = toPascalCase(value);
|
|
156
|
+
return pascal.charAt(0).toLowerCase() + pascal.slice(1);
|
|
157
|
+
}
|
|
158
|
+
//# sourceMappingURL=modelGenRender.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"modelGenRender.js","sourceRoot":"","sources":["../../src/utils/modelGenRender.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
export type PlaceholderMode = 'none' | 'named' | 'positional';
|
|
2
|
+
export interface SqlScanNamedToken {
|
|
3
|
+
start: number;
|
|
4
|
+
end: number;
|
|
5
|
+
name: string;
|
|
6
|
+
}
|
|
7
|
+
export interface SqlScanResult {
|
|
8
|
+
mode: PlaceholderMode;
|
|
9
|
+
namedTokens: SqlScanNamedToken[];
|
|
10
|
+
positionalTokens: Array<{
|
|
11
|
+
start: number;
|
|
12
|
+
end: number;
|
|
13
|
+
token: string;
|
|
14
|
+
}>;
|
|
15
|
+
}
|
|
16
|
+
export declare class ModelGenSqlScanError extends Error {
|
|
17
|
+
readonly token: string;
|
|
18
|
+
constructor(message: string, token: string);
|
|
19
|
+
}
|
|
20
|
+
/**
|
|
21
|
+
* Scans SQL text for supported/unsupported placeholder styles without fully parsing SQL grammar.
|
|
22
|
+
* The scanner guarantees that it will not inspect inside string literals, quoted identifiers, or comments.
|
|
23
|
+
*/
|
|
24
|
+
export declare function scanModelGenSql(sql: string): SqlScanResult;
|
|
@@ -0,0 +1,196 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.ModelGenSqlScanError = void 0;
|
|
4
|
+
exports.scanModelGenSql = scanModelGenSql;
|
|
5
|
+
const IDENTIFIER_START_PATTERN = /[A-Za-z_]/;
|
|
6
|
+
const IDENTIFIER_PART_PATTERN = /[A-Za-z0-9_]/;
|
|
7
|
+
class ModelGenSqlScanError extends Error {
|
|
8
|
+
constructor(message, token) {
|
|
9
|
+
super(message);
|
|
10
|
+
this.name = 'ModelGenSqlScanError';
|
|
11
|
+
this.token = token;
|
|
12
|
+
}
|
|
13
|
+
}
|
|
14
|
+
exports.ModelGenSqlScanError = ModelGenSqlScanError;
|
|
15
|
+
/**
|
|
16
|
+
* Scans SQL text for supported/unsupported placeholder styles without fully parsing SQL grammar.
|
|
17
|
+
* The scanner guarantees that it will not inspect inside string literals, quoted identifiers, or comments.
|
|
18
|
+
*/
|
|
19
|
+
function scanModelGenSql(sql) {
|
|
20
|
+
var _a, _b;
|
|
21
|
+
const namedTokens = [];
|
|
22
|
+
const positionalTokens = [];
|
|
23
|
+
let index = 0;
|
|
24
|
+
while (index < sql.length) {
|
|
25
|
+
const current = sql[index];
|
|
26
|
+
const next = (_a = sql[index + 1]) !== null && _a !== void 0 ? _a : '';
|
|
27
|
+
if (current === '\'') {
|
|
28
|
+
index = skipSingleQuotedString(sql, index);
|
|
29
|
+
continue;
|
|
30
|
+
}
|
|
31
|
+
if (current === '"') {
|
|
32
|
+
index = skipDoubleQuotedIdentifier(sql, index);
|
|
33
|
+
continue;
|
|
34
|
+
}
|
|
35
|
+
if (current === '-' && next === '-') {
|
|
36
|
+
index = skipLineComment(sql, index);
|
|
37
|
+
continue;
|
|
38
|
+
}
|
|
39
|
+
if (current === '/' && next === '*') {
|
|
40
|
+
index = skipBlockComment(sql, index);
|
|
41
|
+
continue;
|
|
42
|
+
}
|
|
43
|
+
if (current === '$') {
|
|
44
|
+
const dollarQuote = readDollarQuoteDelimiter(sql, index);
|
|
45
|
+
if (dollarQuote) {
|
|
46
|
+
index = skipDollarQuotedString(sql, index, dollarQuote);
|
|
47
|
+
continue;
|
|
48
|
+
}
|
|
49
|
+
if (/[0-9]/.test(next)) {
|
|
50
|
+
const end = consumeDigits(sql, index + 1);
|
|
51
|
+
positionalTokens.push({ start: index, end, token: sql.slice(index, end) });
|
|
52
|
+
index = end;
|
|
53
|
+
continue;
|
|
54
|
+
}
|
|
55
|
+
if (next === '{') {
|
|
56
|
+
throw new ModelGenSqlScanError('Detected unsupported placeholder syntax "${name}".', consumeUnsupportedToken(sql, index));
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
|
+
if (current === '?') {
|
|
60
|
+
throw new ModelGenSqlScanError('Detected unsupported placeholder syntax "?".', '?');
|
|
61
|
+
}
|
|
62
|
+
if (current === '@' && IDENTIFIER_START_PATTERN.test(next)) {
|
|
63
|
+
throw new ModelGenSqlScanError('Detected unsupported placeholder syntax "@name".', consumeUnsupportedToken(sql, index));
|
|
64
|
+
}
|
|
65
|
+
if (current === ':') {
|
|
66
|
+
// PostgreSQL casts use `::`, which must not be treated as a named placeholder.
|
|
67
|
+
if (next === ':') {
|
|
68
|
+
index += 2;
|
|
69
|
+
continue;
|
|
70
|
+
}
|
|
71
|
+
if (IDENTIFIER_START_PATTERN.test(next)) {
|
|
72
|
+
const end = consumeIdentifier(sql, index + 1);
|
|
73
|
+
if (((_b = sql[end]) !== null && _b !== void 0 ? _b : '') === '-') {
|
|
74
|
+
throw new ModelGenSqlScanError('Detected unsupported named parameter syntax.', consumeUnsupportedToken(sql, index));
|
|
75
|
+
}
|
|
76
|
+
namedTokens.push({
|
|
77
|
+
start: index,
|
|
78
|
+
end,
|
|
79
|
+
name: sql.slice(index + 1, end)
|
|
80
|
+
});
|
|
81
|
+
index = end;
|
|
82
|
+
continue;
|
|
83
|
+
}
|
|
84
|
+
if (/[0-9]/.test(next)) {
|
|
85
|
+
throw new ModelGenSqlScanError('Detected unsupported placeholder syntax ":1".', consumeUnsupportedToken(sql, index));
|
|
86
|
+
}
|
|
87
|
+
if (next && !isStructuralDelimiter(next)) {
|
|
88
|
+
throw new ModelGenSqlScanError('Detected unsupported named parameter syntax.', consumeUnsupportedToken(sql, index));
|
|
89
|
+
}
|
|
90
|
+
}
|
|
91
|
+
index += 1;
|
|
92
|
+
}
|
|
93
|
+
if (namedTokens.length > 0 && positionalTokens.length > 0) {
|
|
94
|
+
throw new ModelGenSqlScanError('Detected mixed named and positional placeholder styles.', 'mixed');
|
|
95
|
+
}
|
|
96
|
+
return {
|
|
97
|
+
mode: namedTokens.length > 0
|
|
98
|
+
? 'named'
|
|
99
|
+
: positionalTokens.length > 0
|
|
100
|
+
? 'positional'
|
|
101
|
+
: 'none',
|
|
102
|
+
namedTokens,
|
|
103
|
+
positionalTokens
|
|
104
|
+
};
|
|
105
|
+
}
|
|
106
|
+
function skipSingleQuotedString(sql, start) {
|
|
107
|
+
let index = start + 1;
|
|
108
|
+
while (index < sql.length) {
|
|
109
|
+
if (sql[index] === '\'' && sql[index + 1] === '\'') {
|
|
110
|
+
index += 2;
|
|
111
|
+
continue;
|
|
112
|
+
}
|
|
113
|
+
if (sql[index] === '\'') {
|
|
114
|
+
return index + 1;
|
|
115
|
+
}
|
|
116
|
+
index += 1;
|
|
117
|
+
}
|
|
118
|
+
return sql.length;
|
|
119
|
+
}
|
|
120
|
+
function skipDoubleQuotedIdentifier(sql, start) {
|
|
121
|
+
let index = start + 1;
|
|
122
|
+
while (index < sql.length) {
|
|
123
|
+
if (sql[index] === '"' && sql[index + 1] === '"') {
|
|
124
|
+
index += 2;
|
|
125
|
+
continue;
|
|
126
|
+
}
|
|
127
|
+
if (sql[index] === '"') {
|
|
128
|
+
return index + 1;
|
|
129
|
+
}
|
|
130
|
+
index += 1;
|
|
131
|
+
}
|
|
132
|
+
return sql.length;
|
|
133
|
+
}
|
|
134
|
+
function skipLineComment(sql, start) {
|
|
135
|
+
let index = start + 2;
|
|
136
|
+
while (index < sql.length && sql[index] !== '\n') {
|
|
137
|
+
index += 1;
|
|
138
|
+
}
|
|
139
|
+
return index;
|
|
140
|
+
}
|
|
141
|
+
function skipBlockComment(sql, start) {
|
|
142
|
+
let index = start + 2;
|
|
143
|
+
while (index < sql.length) {
|
|
144
|
+
if (sql[index] === '*' && sql[index + 1] === '/') {
|
|
145
|
+
return index + 2;
|
|
146
|
+
}
|
|
147
|
+
index += 1;
|
|
148
|
+
}
|
|
149
|
+
return sql.length;
|
|
150
|
+
}
|
|
151
|
+
function readDollarQuoteDelimiter(sql, start) {
|
|
152
|
+
var _a;
|
|
153
|
+
let index = start + 1;
|
|
154
|
+
while (index < sql.length && /[A-Za-z0-9_]/.test((_a = sql[index]) !== null && _a !== void 0 ? _a : '')) {
|
|
155
|
+
index += 1;
|
|
156
|
+
}
|
|
157
|
+
if (sql[index] !== '$') {
|
|
158
|
+
return null;
|
|
159
|
+
}
|
|
160
|
+
return sql.slice(start, index + 1);
|
|
161
|
+
}
|
|
162
|
+
function skipDollarQuotedString(sql, start, delimiter) {
|
|
163
|
+
const end = sql.indexOf(delimiter, start + delimiter.length);
|
|
164
|
+
if (end < 0) {
|
|
165
|
+
return sql.length;
|
|
166
|
+
}
|
|
167
|
+
return end + delimiter.length;
|
|
168
|
+
}
|
|
169
|
+
function consumeDigits(sql, start) {
|
|
170
|
+
var _a;
|
|
171
|
+
let index = start;
|
|
172
|
+
while (index < sql.length && /[0-9]/.test((_a = sql[index]) !== null && _a !== void 0 ? _a : '')) {
|
|
173
|
+
index += 1;
|
|
174
|
+
}
|
|
175
|
+
return index;
|
|
176
|
+
}
|
|
177
|
+
function consumeIdentifier(sql, start) {
|
|
178
|
+
var _a;
|
|
179
|
+
let index = start;
|
|
180
|
+
while (index < sql.length && IDENTIFIER_PART_PATTERN.test((_a = sql[index]) !== null && _a !== void 0 ? _a : '')) {
|
|
181
|
+
index += 1;
|
|
182
|
+
}
|
|
183
|
+
return index;
|
|
184
|
+
}
|
|
185
|
+
function consumeUnsupportedToken(sql, start) {
|
|
186
|
+
var _a;
|
|
187
|
+
let index = start + 1;
|
|
188
|
+
while (index < sql.length && !isStructuralDelimiter((_a = sql[index]) !== null && _a !== void 0 ? _a : '')) {
|
|
189
|
+
index += 1;
|
|
190
|
+
}
|
|
191
|
+
return sql.slice(start, index);
|
|
192
|
+
}
|
|
193
|
+
function isStructuralDelimiter(value) {
|
|
194
|
+
return /\s|[,;()<>+=*/%|&!~[\]{}]/.test(value);
|
|
195
|
+
}
|
|
196
|
+
//# sourceMappingURL=modelGenScanner.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"modelGenScanner.js","sourceRoot":"","sources":["../../src/utils/modelGenScanner.ts"],"names":[],"mappings":"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"}
|