typesql-cli 0.20.0 → 0.21.1
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/cli.js +6 -5
- package/cli.js.map +1 -1
- package/code-generator2.d.ts.map +1 -1
- package/code-generator2.js +136 -102
- package/code-generator2.js.map +1 -1
- package/codegen/code-generator.d.ts +13 -0
- package/codegen/code-generator.d.ts.map +1 -0
- package/codegen/code-generator.js +107 -0
- package/codegen/code-generator.js.map +1 -0
- package/codegen/code-generator2.d.ts +10 -0
- package/codegen/code-generator2.d.ts.map +1 -0
- package/codegen/code-generator2.js +917 -0
- package/codegen/code-generator2.js.map +1 -0
- package/codegen/codegen-util.d.ts +1 -0
- package/codegen/codegen-util.d.ts.map +1 -0
- package/codegen/codegen-util.js +2 -0
- package/codegen/codegen-util.js.map +1 -0
- package/codegen/generic/codegen-util.d.ts +8 -0
- package/codegen/generic/codegen-util.d.ts.map +1 -0
- package/codegen/generic/codegen-util.js +89 -0
- package/codegen/generic/codegen-util.js.map +1 -0
- package/codegen/mysql2.d.ts +14 -0
- package/codegen/mysql2.d.ts.map +1 -0
- package/codegen/mysql2.js +608 -0
- package/codegen/mysql2.js.map +1 -0
- package/codegen/pg.d.ts +7 -0
- package/codegen/pg.d.ts.map +1 -0
- package/codegen/pg.js +707 -0
- package/codegen/pg.js.map +1 -0
- package/codegen/postgres-pg.d.ts +10 -0
- package/codegen/postgres-pg.d.ts.map +1 -0
- package/codegen/postgres-pg.js +917 -0
- package/codegen/postgres-pg.js.map +1 -0
- package/codegen/shared/codegen-util.d.ts +72 -0
- package/codegen/shared/codegen-util.d.ts.map +1 -0
- package/codegen/shared/codegen-util.js +487 -0
- package/codegen/shared/codegen-util.js.map +1 -0
- package/codegen/sqlite-code-generator.d.ts +15 -0
- package/codegen/sqlite-code-generator.d.ts.map +1 -0
- package/codegen/sqlite-code-generator.js +1049 -0
- package/codegen/sqlite-code-generator.js.map +1 -0
- package/codegen/sqlite.d.ts +11 -0
- package/codegen/sqlite.d.ts.map +1 -0
- package/codegen/sqlite.js +814 -0
- package/codegen/sqlite.js.map +1 -0
- package/describe-query.d.ts.map +1 -1
- package/describe-query.js +45 -32
- package/describe-query.js.map +1 -1
- package/dialects/postgres.d.ts +4 -1
- package/dialects/postgres.d.ts.map +1 -1
- package/dialects/postgres.js +4 -2
- package/dialects/postgres.js.map +1 -1
- package/drivers/sqlite.d.ts +4 -1
- package/drivers/sqlite.d.ts.map +1 -1
- package/drivers/sqlite.js +4 -1
- package/drivers/sqlite.js.map +1 -1
- package/drivers/types.d.ts +3 -1
- package/drivers/types.d.ts.map +1 -1
- package/generic/codegen-util.d.ts +8 -0
- package/generic/codegen-util.d.ts.map +1 -0
- package/generic/codegen-util.js +89 -0
- package/generic/codegen-util.js.map +1 -0
- package/mysql-mapping.d.ts +4 -1
- package/mysql-mapping.d.ts.map +1 -1
- package/mysql-mapping.js +5 -3
- package/mysql-mapping.js.map +1 -1
- package/mysql-query-analyzer/infer-column-nullability.js +1 -1
- package/mysql-query-analyzer/infer-column-nullability.js.map +1 -1
- package/mysql-query-analyzer/parse.d.ts.map +1 -1
- package/mysql-query-analyzer/parse.js +3 -2
- package/mysql-query-analyzer/parse.js.map +1 -1
- package/mysql-query-analyzer/select-columns.d.ts.map +1 -1
- package/mysql-query-analyzer/select-columns.js +1 -1
- package/mysql-query-analyzer/select-columns.js.map +1 -1
- package/mysql-query-analyzer/types.d.ts +3 -0
- package/mysql-query-analyzer/types.d.ts.map +1 -1
- package/package.json +12 -11
- package/postgres-pg.d.ts +10 -0
- package/postgres-pg.d.ts.map +1 -0
- package/postgres-pg.js +917 -0
- package/postgres-pg.js.map +1 -0
- package/postgres-query-analyzer/describe.d.ts +1 -1
- package/postgres-query-analyzer/describe.d.ts.map +1 -1
- package/postgres-query-analyzer/describe.js +86 -53
- package/postgres-query-analyzer/describe.js.map +1 -1
- package/postgres-query-analyzer/traverse.d.ts +1 -0
- package/postgres-query-analyzer/traverse.d.ts.map +1 -1
- package/postgres-query-analyzer/traverse.js +43 -21
- package/postgres-query-analyzer/traverse.js.map +1 -1
- package/postgres-query-analyzer/types.d.ts +1 -0
- package/postgres-query-analyzer/types.d.ts.map +1 -1
- package/postgres-query-analyzer/util.d.ts +9 -0
- package/postgres-query-analyzer/util.d.ts.map +1 -0
- package/postgres-query-analyzer/util.js +58 -0
- package/postgres-query-analyzer/util.js.map +1 -0
- package/rescript.d.ts +1 -0
- package/rescript.d.ts.map +1 -0
- package/rescript.js +2 -0
- package/rescript.js.map +1 -0
- package/sqlite-query-analyzer/parser.js +6 -3
- package/sqlite-query-analyzer/parser.js.map +1 -1
- package/sqlite-query-analyzer/replace-list-params.d.ts.map +1 -1
- package/sqlite-query-analyzer/replace-list-params.js.map +1 -1
- package/sqlite-query-analyzer/sqlite-code-generator.d.ts +15 -0
- package/sqlite-query-analyzer/sqlite-code-generator.d.ts.map +1 -0
- package/sqlite-query-analyzer/sqlite-code-generator.js +1049 -0
- package/sqlite-query-analyzer/sqlite-code-generator.js.map +1 -0
- package/sqlite-query-analyzer/sqlite-describe-nested-query.d.ts +1 -0
- package/sqlite-query-analyzer/sqlite-describe-nested-query.d.ts.map +1 -1
- package/sqlite-query-analyzer/sqlite-describe-nested-query.js.map +1 -1
- package/sqlite-query-analyzer/traverse.d.ts.map +1 -1
- package/sqlite-query-analyzer/traverse.js +6 -3
- package/sqlite-query-analyzer/traverse.js.map +1 -1
- package/sqlite.d.ts +43 -0
- package/sqlite.d.ts.map +1 -0
- package/sqlite.js +755 -0
- package/sqlite.js.map +1 -0
- package/ts-nested-descriptor.d.ts.map +1 -1
- package/ts-nested-descriptor.js +1 -1
- package/ts-nested-descriptor.js.map +1 -1
- package/types.d.ts +8 -1
- package/types.d.ts.map +1 -1
package/codegen/pg.js
ADDED
@@ -0,0 +1,707 @@
|
|
1
|
+
"use strict";
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
3
|
+
exports.generateCode = generateCode;
|
4
|
+
exports.generateCrud = generateCrud;
|
5
|
+
const codegen_util_1 = require("./shared/codegen-util");
|
6
|
+
const describe_1 = require("../postgres-query-analyzer/describe");
|
7
|
+
const postgres_1 = require("../dialects/postgres");
|
8
|
+
const neverthrow_1 = require("neverthrow");
|
9
|
+
const sqlite_1 = require("./sqlite");
|
10
|
+
const ts_nested_descriptor_1 = require("../ts-nested-descriptor");
|
11
|
+
const codegen_util_2 = require("./shared/codegen-util");
|
12
|
+
function generateCode(client, sql, queryName, schemaInfo) {
|
13
|
+
if (isEmptySql(sql)) {
|
14
|
+
return (0, neverthrow_1.okAsync)('');
|
15
|
+
}
|
16
|
+
return _describeQuery(client, sql, schemaInfo)
|
17
|
+
.map(schemaDef => generateTsCode(queryName, schemaDef, client.type));
|
18
|
+
}
|
19
|
+
function isEmptySql(sql) {
|
20
|
+
if (sql.trim() === '') {
|
21
|
+
return true;
|
22
|
+
}
|
23
|
+
const lines = sql.split('\n');
|
24
|
+
return lines.every(line => line.trim() === '' || line.trim().startsWith('//'));
|
25
|
+
}
|
26
|
+
function _describeQuery(databaseClient, sql, dbSchema) {
|
27
|
+
return (0, describe_1.describeQuery)(databaseClient.client, sql, dbSchema);
|
28
|
+
}
|
29
|
+
function generateTsCode(queryName, schemaDef, client) {
|
30
|
+
const { sql } = schemaDef;
|
31
|
+
const writer = (0, codegen_util_1.createCodeBlockWriter)();
|
32
|
+
const { camelCaseName, capitalizedName, dataTypeName, resultTypeName, paramsTypeName, orderByTypeName, dynamicParamsTypeName, selectColumnsTypeName, whereTypeName } = (0, codegen_util_1.createTypeNames)(queryName);
|
33
|
+
const tsDescriptor = createTsDescriptor(capitalizedName, schemaDef);
|
34
|
+
const uniqueParams = (0, codegen_util_1.removeDuplicatedParameters2)(tsDescriptor.parameters);
|
35
|
+
const generateOrderBy = tsDescriptor.orderByColumns != null && tsDescriptor.orderByColumns.length > 0;
|
36
|
+
const codeWriter = getCodeWriter(client);
|
37
|
+
codeWriter.writeImports(writer, schemaDef.queryType);
|
38
|
+
if (tsDescriptor.dynamicQuery2) {
|
39
|
+
writer.writeLine(`import { EOL } from 'os';`);
|
40
|
+
}
|
41
|
+
const uniqueDataParams = (0, codegen_util_1.removeDuplicatedParameters2)(tsDescriptor.data || []);
|
42
|
+
if (uniqueDataParams.length > 0) {
|
43
|
+
writer.blankLine();
|
44
|
+
writeDataType(writer, dataTypeName, uniqueDataParams);
|
45
|
+
}
|
46
|
+
const dynamicQueryInfo = tsDescriptor.dynamicQuery2;
|
47
|
+
const orderByField = tsDescriptor.orderByColumns != null && tsDescriptor.orderByColumns.length > 0 ? 'orderBy' : '';
|
48
|
+
if (dynamicQueryInfo) {
|
49
|
+
writer.blankLine();
|
50
|
+
(0, codegen_util_1.writeDynamicQueryParamType)(writer, queryName, uniqueParams.length > 0, orderByField);
|
51
|
+
}
|
52
|
+
if (uniqueParams.length > 0 || (orderByField && !dynamicQueryInfo)) {
|
53
|
+
writer.blankLine();
|
54
|
+
writeParamsType(writer, paramsTypeName, uniqueParams, generateOrderBy, orderByTypeName);
|
55
|
+
}
|
56
|
+
if (schemaDef.queryType !== 'Copy') {
|
57
|
+
writer.blankLine();
|
58
|
+
writeResultType(writer, resultTypeName, tsDescriptor.columns);
|
59
|
+
const flatten = schemaDef.columns.flatMap(col => flattenJsonTypes(createJsonType(capitalizedName, col.name), col.type));
|
60
|
+
flatten.forEach(type => {
|
61
|
+
writer.blankLine();
|
62
|
+
writeJsonTypes(writer, type.typeName, type.type);
|
63
|
+
});
|
64
|
+
}
|
65
|
+
if (dynamicQueryInfo) {
|
66
|
+
writer.blankLine();
|
67
|
+
writer.write(`export type ${selectColumnsTypeName} =`).block(() => {
|
68
|
+
tsDescriptor.columns.forEach((tsField) => {
|
69
|
+
writer.writeLine(`${tsField.name}?: boolean;`);
|
70
|
+
});
|
71
|
+
});
|
72
|
+
writer.blankLine();
|
73
|
+
(0, codegen_util_1.writeSelectFragements)(writer, dynamicQueryInfo.select, tsDescriptor.columns);
|
74
|
+
writer.blankLine();
|
75
|
+
(0, codegen_util_2.writeDynamicQueryOperators)(writer, whereTypeName, tsDescriptor.columns);
|
76
|
+
writer.blankLine();
|
77
|
+
let functionArguments = 'client: pg.Client | pg.Pool | pg.PoolClient';
|
78
|
+
// if (params.data.length > 0) {
|
79
|
+
// functionParams += `, data: ${dataType}`;
|
80
|
+
// }
|
81
|
+
const optional = uniqueDataParams.length > 0 || orderByField ? '' : '?';
|
82
|
+
functionArguments += `, params${optional}: ${dynamicParamsTypeName}`;
|
83
|
+
writer.write(`export async function ${camelCaseName}(${functionArguments}): Promise<${resultTypeName}[]>`).block(() => {
|
84
|
+
writer.blankLine();
|
85
|
+
writer.writeLine('const { sql, paramsValues } = buildSql(params);');
|
86
|
+
writer.write(`return client.query({ text: sql, rowMode: 'array', values: paramsValues })`).newLine();
|
87
|
+
writer.indent().write(`.then(res => res.rows.map(row => mapArrayTo${resultTypeName}(row, params?.select)));`);
|
88
|
+
});
|
89
|
+
writer.blankLine();
|
90
|
+
(0, codegen_util_2.writeBuildSqlFunction)(writer, {
|
91
|
+
dynamicParamsTypeName,
|
92
|
+
columns: tsDescriptor.columns,
|
93
|
+
parameters: tsDescriptor.parameters,
|
94
|
+
dynamicQueryInfo,
|
95
|
+
dialect: 'postgres',
|
96
|
+
hasOrderBy: tsDescriptor.orderByColumns != null,
|
97
|
+
toDrive: (variable, param) => `${variable}.${param.name}`
|
98
|
+
});
|
99
|
+
writer.blankLine();
|
100
|
+
(0, codegen_util_2.writeMapToResultFunction)(writer, {
|
101
|
+
columns: tsDescriptor.columns,
|
102
|
+
resultTypeName,
|
103
|
+
selectColumnsTypeName,
|
104
|
+
fromDriver: (variable, _param) => variable
|
105
|
+
});
|
106
|
+
writer.blankLine();
|
107
|
+
writer.write('type WhereConditionResult = ').block(() => {
|
108
|
+
writer.writeLine('sql: string;');
|
109
|
+
writer.writeLine('hasValue: boolean;');
|
110
|
+
writer.writeLine('values: any[];');
|
111
|
+
});
|
112
|
+
writer.blankLine();
|
113
|
+
(0, codegen_util_2.writeWhereConditionFunction)(writer, whereTypeName, tsDescriptor.columns);
|
114
|
+
if (tsDescriptor.orderByColumns != null) {
|
115
|
+
writer.blankLine();
|
116
|
+
(0, codegen_util_2.writeOrderByToObjectFunction)(writer, dynamicParamsTypeName);
|
117
|
+
writer.blankLine();
|
118
|
+
(0, codegen_util_2.writeBuildOrderByBlock)(writer, tsDescriptor.orderByColumns, orderByTypeName);
|
119
|
+
}
|
120
|
+
}
|
121
|
+
if (tsDescriptor.nestedDescriptor2) {
|
122
|
+
const relations = tsDescriptor.nestedDescriptor2 || [];
|
123
|
+
(0, codegen_util_1.writeNestedTypes)(writer, relations, capitalizedName);
|
124
|
+
}
|
125
|
+
if (!dynamicQueryInfo) {
|
126
|
+
writer.blankLine();
|
127
|
+
const execFunctionParams = {
|
128
|
+
sql,
|
129
|
+
queryType: tsDescriptor.queryType,
|
130
|
+
multipleRowsResult: tsDescriptor.multipleRowsResult,
|
131
|
+
functionName: queryName,
|
132
|
+
paramsType: paramsTypeName,
|
133
|
+
dataType: dataTypeName,
|
134
|
+
returnType: resultTypeName,
|
135
|
+
columns: tsDescriptor.columns,
|
136
|
+
parameters: tsDescriptor.parameters,
|
137
|
+
data: tsDescriptor.data || [],
|
138
|
+
returning: schemaDef.returning || false,
|
139
|
+
orderByTypeName: orderByTypeName,
|
140
|
+
orderByColumns: tsDescriptor.orderByColumns || [],
|
141
|
+
generateNested: tsDescriptor.nestedDescriptor2 != null,
|
142
|
+
nestedType: tsDescriptor.nestedDescriptor2 ? tsDescriptor.nestedDescriptor2[0].name : '',
|
143
|
+
};
|
144
|
+
codeWriter.writeExecFunction(writer, execFunctionParams);
|
145
|
+
}
|
146
|
+
if (tsDescriptor.nestedDescriptor2) {
|
147
|
+
const relations = tsDescriptor.nestedDescriptor2;
|
148
|
+
relations.forEach((relation) => {
|
149
|
+
(0, codegen_util_1.writeCollectFunction)(writer, relation, tsDescriptor.columns, capitalizedName, resultTypeName);
|
150
|
+
});
|
151
|
+
writer.blankLine();
|
152
|
+
(0, codegen_util_1.writeGroupByFunction)(writer);
|
153
|
+
}
|
154
|
+
return writer.toString();
|
155
|
+
}
|
156
|
+
const isJsonType = (t) => {
|
157
|
+
return typeof t === 'object' && t !== null && 'name' in t;
|
158
|
+
};
|
159
|
+
const isJsonObjType = (t) => t.name === 'json';
|
160
|
+
const isJsonMapType = (t) => t.name === 'json_map';
|
161
|
+
const isJsonArrayType = (t) => t.name === 'json[]';
|
162
|
+
const isJsonFieldType = (t) => t.name === 'json_field';
|
163
|
+
function flattenJsonTypes(parentName, type) {
|
164
|
+
const result = [];
|
165
|
+
const visit = (typeName, t) => {
|
166
|
+
if (!isJsonType(t)) {
|
167
|
+
return;
|
168
|
+
}
|
169
|
+
if (isJsonObjType(t)) {
|
170
|
+
result.push({ typeName, type: t });
|
171
|
+
for (const prop of t.properties) {
|
172
|
+
visit(createJsonType(typeName, prop.key), prop.type);
|
173
|
+
}
|
174
|
+
}
|
175
|
+
else if (isJsonMapType(t)) {
|
176
|
+
visit(typeName, t.type);
|
177
|
+
}
|
178
|
+
else if (isJsonArrayType(t)) {
|
179
|
+
for (const itemType of t.properties) {
|
180
|
+
visit(typeName, itemType);
|
181
|
+
}
|
182
|
+
}
|
183
|
+
};
|
184
|
+
visit(parentName, type);
|
185
|
+
return result;
|
186
|
+
}
|
187
|
+
function writeDataType(writer, dataTypeName, params) {
|
188
|
+
writer.write(`export type ${dataTypeName} =`).block(() => {
|
189
|
+
params.forEach((field) => {
|
190
|
+
const optionalOp = field.optional ? '?' : '';
|
191
|
+
const orNull = field.notNull ? '' : ' | null';
|
192
|
+
writer.writeLine(`${field.name}${optionalOp}: ${field.tsType}${orNull};`);
|
193
|
+
});
|
194
|
+
});
|
195
|
+
}
|
196
|
+
function writeParamsType(writer, paramsTypeName, params, generateOrderBy, orderByTypeName) {
|
197
|
+
writer.write(`export type ${paramsTypeName} =`).block(() => {
|
198
|
+
params.forEach((field) => {
|
199
|
+
const optionalOp = field.optional ? '?' : '';
|
200
|
+
const orNull = field.notNull ? '' : ' | null';
|
201
|
+
writer.writeLine(`${field.name}${optionalOp}: ${field.tsType}${orNull};`);
|
202
|
+
});
|
203
|
+
if (generateOrderBy) {
|
204
|
+
writer.writeLine(`orderBy: ${orderByTypeName}[];`);
|
205
|
+
}
|
206
|
+
});
|
207
|
+
}
|
208
|
+
function writeResultType(writer, resultTypeName, columns) {
|
209
|
+
writer.write(`export type ${resultTypeName} =`).block(() => {
|
210
|
+
columns.forEach((field) => {
|
211
|
+
const optionalOp = field.optional ? '?' : '';
|
212
|
+
const nullable = field.notNull ? '' : ' | null';
|
213
|
+
writer.writeLine(`${field.name}${optionalOp}: ${field.tsType}${nullable};`);
|
214
|
+
});
|
215
|
+
});
|
216
|
+
}
|
217
|
+
function createJsonType(capitalizedName, columnName) {
|
218
|
+
const jsonType = (0, codegen_util_1.capitalize)((0, codegen_util_1.convertToCamelCaseName)(columnName));
|
219
|
+
const fullName = `${capitalizedName}${jsonType}`;
|
220
|
+
return fullName;
|
221
|
+
}
|
222
|
+
function writeJsonTypes(writer, typeName, type) {
|
223
|
+
writer.write(`export type ${typeName}Type =`).block(() => {
|
224
|
+
type.properties.forEach((field) => {
|
225
|
+
if (isJsonObjType(field.type)) {
|
226
|
+
const nullable = field.type.notNull ? '' : ' | null';
|
227
|
+
const jsonTypeName = createJsonType(typeName, field.key);
|
228
|
+
writer.writeLine(`${field.key}: ${jsonTypeName}Type${nullable};`);
|
229
|
+
}
|
230
|
+
else if (isJsonArrayType(field.type)) {
|
231
|
+
const jsonParentName = createJsonType(typeName, field.key);
|
232
|
+
const jsonTypeName = createJsonArrayType(jsonParentName, field.type);
|
233
|
+
writer.writeLine(`${field.key}: ${jsonTypeName};`);
|
234
|
+
}
|
235
|
+
else if (isJsonFieldType(field.type)) {
|
236
|
+
const nullable = field.type.notNull ? '' : ' | null';
|
237
|
+
writer.writeLine(`${field.key}: ${postgres_1.mapper.mapColumnType(field.type.type, true)}${nullable};`);
|
238
|
+
}
|
239
|
+
});
|
240
|
+
});
|
241
|
+
}
|
242
|
+
function createTsDescriptor(capitalizedName, schemaDef) {
|
243
|
+
var _a;
|
244
|
+
const tsDescriptor = {
|
245
|
+
columns: getColumnsForQuery(capitalizedName, schemaDef),
|
246
|
+
parameters: schemaDef.parameters.map((param) => mapParameterToTsFieldDescriptor(param)),
|
247
|
+
sql: '',
|
248
|
+
queryType: schemaDef.queryType,
|
249
|
+
multipleRowsResult: schemaDef.multipleRowsResult,
|
250
|
+
parameterNames: [],
|
251
|
+
data: (_a = schemaDef.data) === null || _a === void 0 ? void 0 : _a.map(param => mapParameterToTsFieldDescriptor(param))
|
252
|
+
};
|
253
|
+
if (schemaDef.orderByColumns) {
|
254
|
+
tsDescriptor.orderByColumns = schemaDef.orderByColumns;
|
255
|
+
}
|
256
|
+
if (schemaDef.nestedInfo) {
|
257
|
+
const nestedDescriptor2 = schemaDef.nestedInfo.map((relation) => {
|
258
|
+
const tsRelation = {
|
259
|
+
groupIndex: relation.groupIndex,
|
260
|
+
name: relation.name,
|
261
|
+
fields: relation.fields.map((field) => mapPostgrsFieldToTsField(schemaDef.columns, field)),
|
262
|
+
relations: relation.relations.map((relation) => (0, ts_nested_descriptor_1.mapToTsRelation2)(relation))
|
263
|
+
};
|
264
|
+
return tsRelation;
|
265
|
+
});
|
266
|
+
tsDescriptor.nestedDescriptor2 = nestedDescriptor2;
|
267
|
+
}
|
268
|
+
if (schemaDef.dynamicSqlQuery2) {
|
269
|
+
tsDescriptor.dynamicQuery2 = schemaDef.dynamicSqlQuery2;
|
270
|
+
}
|
271
|
+
return tsDescriptor;
|
272
|
+
}
|
273
|
+
function createJsonArrayType(name, type) {
|
274
|
+
const typeNames = type.properties.flatMap(p => {
|
275
|
+
if (isJsonFieldType(p)) {
|
276
|
+
const baseType = postgres_1.mapper.mapColumnType(p.type, true);
|
277
|
+
if (!p.notNull) {
|
278
|
+
return [baseType, 'null'];
|
279
|
+
}
|
280
|
+
return [baseType];
|
281
|
+
}
|
282
|
+
return createTsType(name, p);
|
283
|
+
});
|
284
|
+
const uniqTypeNames = [...new Set(typeNames)];
|
285
|
+
const unionTypes = uniqTypeNames.join(' | ');
|
286
|
+
return uniqTypeNames.length === 1 ? `${unionTypes}[]` : `(${unionTypes})[]`;
|
287
|
+
}
|
288
|
+
function createJsonMapType(name, type) {
|
289
|
+
const valueType = isJsonFieldType(type.type) ? postgres_1.mapper.mapColumnType(type.type.type, true) : `${name}Type`;
|
290
|
+
return `Record<string, ${valueType} | undefined>`;
|
291
|
+
}
|
292
|
+
function createTsType(name, type) {
|
293
|
+
if (isJsonType(type)) {
|
294
|
+
if (isJsonObjType(type)) {
|
295
|
+
return `${name}Type`;
|
296
|
+
}
|
297
|
+
else if (isJsonArrayType(type)) {
|
298
|
+
return createJsonArrayType(name, type);
|
299
|
+
}
|
300
|
+
else if (isJsonMapType(type)) {
|
301
|
+
return createJsonMapType(name, type);
|
302
|
+
}
|
303
|
+
}
|
304
|
+
return postgres_1.mapper.mapColumnType(type);
|
305
|
+
}
|
306
|
+
function mapColumnInfoToTsFieldDescriptor(capitalizedName, col, dynamicQuery) {
|
307
|
+
const typeName = createJsonType(capitalizedName, col.name);
|
308
|
+
const tsField = {
|
309
|
+
name: col.name,
|
310
|
+
tsType: createTsType(typeName, col.type),
|
311
|
+
optional: dynamicQuery ? true : false,
|
312
|
+
notNull: dynamicQuery ? true : col.notNull
|
313
|
+
};
|
314
|
+
return tsField;
|
315
|
+
}
|
316
|
+
function mapParameterToTsFieldDescriptor(param) {
|
317
|
+
const tsDesc = {
|
318
|
+
name: param.name,
|
319
|
+
tsType: postgres_1.mapper.mapColumnType(param.type),
|
320
|
+
notNull: param.notNull ? param.notNull : false,
|
321
|
+
toDriver: '',
|
322
|
+
isArray: param.type.startsWith('_')
|
323
|
+
};
|
324
|
+
return tsDesc;
|
325
|
+
}
|
326
|
+
function getCodeWriter(client) {
|
327
|
+
return postgresCodeWriter;
|
328
|
+
}
|
329
|
+
const postgresCodeWriter = {
|
330
|
+
writeImports: function (writer, queryType) {
|
331
|
+
writer.writeLine(`import pg from 'pg';`);
|
332
|
+
if (queryType === 'Copy') {
|
333
|
+
writer.writeLine(`import { from as copyFrom } from 'pg-copy-streams';`);
|
334
|
+
writer.writeLine(`import { pipeline } from 'stream/promises';`);
|
335
|
+
writer.writeLine(`import { Readable } from 'stream';`);
|
336
|
+
}
|
337
|
+
},
|
338
|
+
writeExecFunction: function (writer, params) {
|
339
|
+
if (params.queryType === 'Copy') {
|
340
|
+
_writeCopyFunction(writer, params);
|
341
|
+
}
|
342
|
+
else {
|
343
|
+
_writeExecFunction(writer, params);
|
344
|
+
}
|
345
|
+
}
|
346
|
+
};
|
347
|
+
function _writeCopyFunction(writer, params) {
|
348
|
+
const { functionName, paramsType } = params;
|
349
|
+
writer.writeLine(`const columns = [${params.parameters.map(param => `'${param.name}'`).join(', ')}] as const;`);
|
350
|
+
writer.blankLine();
|
351
|
+
let functionParams = `client: pg.Client | pg.PoolClient, values: ${paramsType}[]`;
|
352
|
+
writer.write(`export async function ${functionName}(${functionParams}): Promise<void>`).block(() => {
|
353
|
+
writeSql(writer, params.sql);
|
354
|
+
writer.writeLine('const csv = jsonToCsv(values);');
|
355
|
+
writer.blankLine();
|
356
|
+
writer.writeLine('const sourceStream = Readable.from(csv);');
|
357
|
+
writer.writeLine('const stream = client.query(copyFrom(sql));');
|
358
|
+
writer.writeLine('await pipeline(sourceStream, stream)');
|
359
|
+
});
|
360
|
+
writer.blankLine();
|
361
|
+
writer.write(`function jsonToCsv(values: ${paramsType}[]): string`).block(() => {
|
362
|
+
writer.writeLine('return values');
|
363
|
+
writer.indent().write('.map(value =>').newLine();
|
364
|
+
writer.indent(2).write('columns.map(col => value[col])').newLine();
|
365
|
+
writer.indent(3).write('.map(val => escapeValue(val))').newLine();
|
366
|
+
writer.indent(3).write(`.join(',')`).newLine();
|
367
|
+
writer.indent().write(')').newLine();
|
368
|
+
writer.indent().write(`.join('\\n');`).newLine();
|
369
|
+
});
|
370
|
+
writer.blankLine();
|
371
|
+
writer.write(`function escapeValue(val: any): string`).block(() => {
|
372
|
+
writer.write('if (val == null)').block(() => {
|
373
|
+
writer.writeLine(`return '';`);
|
374
|
+
});
|
375
|
+
writer.writeLine('const str = String(val);');
|
376
|
+
writer.writeLine(`const escaped = str.replace(/"/g, '""');`);
|
377
|
+
writer.writeLine('return `"${escaped}"`;');
|
378
|
+
});
|
379
|
+
}
|
380
|
+
function _writeExecFunction(writer, params) {
|
381
|
+
const { functionName, paramsType, dataType, returnType, parameters, orderByTypeName, orderByColumns, generateNested, nestedType } = params;
|
382
|
+
let functionParams = params.queryType === 'Copy' ? 'client: pg.Client | pg.PoolClient' : 'client: pg.Client | pg.Pool | pg.PoolClient';
|
383
|
+
if (params.data.length > 0) {
|
384
|
+
functionParams += `, data: ${dataType}`;
|
385
|
+
}
|
386
|
+
if (parameters.length > 0 || orderByColumns.length > 0) {
|
387
|
+
functionParams += `, params: ${paramsType}`;
|
388
|
+
}
|
389
|
+
const allParamters = [...params.data.map(param => paramToDriver(param, 'data')),
|
390
|
+
...parameters.map(param => paramToDriver(param, 'params')),
|
391
|
+
...parameters.filter(param => isList(param)).map(param => `...params.${param.name}.slice(1)`)];
|
392
|
+
const paramValues = allParamters.length > 0 ? `, values: [${allParamters.join(', ')}]` : '';
|
393
|
+
const orNull = params.queryType === 'Select' ? ' | null' : '';
|
394
|
+
const functionReturnType = params.multipleRowsResult ? `${returnType}[]` : `${returnType}${orNull}`;
|
395
|
+
const hasListParams = parameters.some(param => !param.isArray && param.tsType.endsWith('[]'));
|
396
|
+
if (hasListParams) {
|
397
|
+
writer.writeLine('let currentIndex: number;');
|
398
|
+
}
|
399
|
+
writer.write(`export async function ${functionName}(${functionParams}): Promise<${functionReturnType}>`).block(() => {
|
400
|
+
if (hasListParams) {
|
401
|
+
writer.writeLine(`currentIndex = ${params.data.length + params.parameters.length};`);
|
402
|
+
}
|
403
|
+
writeSql(writer, params.sql);
|
404
|
+
if (params.queryType === 'Select' || params.returning) {
|
405
|
+
writer.write(`return client.query({ text: sql, rowMode: 'array'${paramValues} })`).newLine();
|
406
|
+
if (params.multipleRowsResult) {
|
407
|
+
writer.indent().write(`.then(res => res.rows.map(row => mapArrayTo${returnType}(row)));`);
|
408
|
+
}
|
409
|
+
else if (params.returning) {
|
410
|
+
writer.indent().write(`.then(res => mapArrayTo${returnType}(res.rows[0]));`);
|
411
|
+
}
|
412
|
+
else {
|
413
|
+
writer.indent().write(`.then(res => res.rows.length > 0 ? mapArrayTo${returnType}(res.rows[0]) : null);`);
|
414
|
+
}
|
415
|
+
}
|
416
|
+
else {
|
417
|
+
writer.write(`return client.query({ text: sql${paramValues} })`).newLine();
|
418
|
+
writer.indent().write(`.then(res => mapArrayTo${returnType}(res));`);
|
419
|
+
}
|
420
|
+
});
|
421
|
+
if (hasListParams) {
|
422
|
+
writer.blankLine();
|
423
|
+
writer.write(`function generatePlaceholders(param: string, paramsArray: any[]): string`).block(() => {
|
424
|
+
writer.write('return paramsArray').newLine();
|
425
|
+
writer.indent().write('.map((_, index) => {').newLine();
|
426
|
+
writer.indent(2).write(`if (index === 0) {`).newLine();
|
427
|
+
writer.indent(3).write(`return param`).newLine();
|
428
|
+
writer.indent(2).write(`}`).newLine();
|
429
|
+
writer.indent(2).write('currentIndex++;').newLine();
|
430
|
+
writer.indent(2).write('return `$${currentIndex}`;').newLine();
|
431
|
+
writer.indent().write('})');
|
432
|
+
writer.newLine();
|
433
|
+
writer.indent().write(`.join(', ');`);
|
434
|
+
});
|
435
|
+
}
|
436
|
+
writer.blankLine();
|
437
|
+
writer.write(`function mapArrayTo${returnType}(data: any) `).block(() => {
|
438
|
+
writer.write(`const result: ${returnType} = `).block(() => {
|
439
|
+
params.columns.forEach((col, index) => {
|
440
|
+
const separator = index < params.columns.length - 1 ? ',' : '';
|
441
|
+
if (params.queryType === 'Select' || params.returning) {
|
442
|
+
writer.writeLine(`${col.name}: ${toDriver(`data[${index}]`, col)}${separator}`);
|
443
|
+
}
|
444
|
+
else {
|
445
|
+
writer.writeLine(`${col.name}: data.${col.name}${separator}`);
|
446
|
+
}
|
447
|
+
});
|
448
|
+
});
|
449
|
+
writer.writeLine('return result;');
|
450
|
+
});
|
451
|
+
if (orderByColumns.length > 0) {
|
452
|
+
writer.blankLine();
|
453
|
+
(0, codegen_util_2.writeBuildOrderByBlock)(writer, orderByColumns, orderByTypeName);
|
454
|
+
}
|
455
|
+
if (generateNested) {
|
456
|
+
writer.blankLine();
|
457
|
+
const relationType = (0, codegen_util_1.generateRelationType)(functionName, nestedType);
|
458
|
+
writer.write(`export async function ${functionName}Nested(${functionParams}): Promise<${relationType}[]>`).block(() => {
|
459
|
+
const params = parameters.length > 0 ? ', params' : '';
|
460
|
+
writer.writeLine(`const selectResult = await ${functionName}(client${params});`);
|
461
|
+
writer.write('if (selectResult.length == 0)').block(() => {
|
462
|
+
writer.writeLine('return [];');
|
463
|
+
});
|
464
|
+
writer.writeLine(`return collect${relationType}(selectResult);`);
|
465
|
+
});
|
466
|
+
}
|
467
|
+
}
|
468
|
+
function writeSql(writer, sql) {
|
469
|
+
const sqlSplit = sql.trimEnd().split('\n');
|
470
|
+
writer.write('const sql = `').newLine();
|
471
|
+
sqlSplit.forEach((sqlLine) => {
|
472
|
+
writer.indent().write(sqlLine.trimEnd()).newLine();
|
473
|
+
});
|
474
|
+
writer.indent().write('`').newLine();
|
475
|
+
}
|
476
|
+
function getColumnsForQuery(capitalizedName, schemaDef) {
|
477
|
+
if (schemaDef.queryType === 'Select' || schemaDef.returning) {
|
478
|
+
const columns = schemaDef.columns.map(col => mapColumnInfoToTsFieldDescriptor(capitalizedName, col, schemaDef.dynamicSqlQuery2 != null));
|
479
|
+
const escapedColumnsNames = (0, codegen_util_1.renameInvalidNames)(schemaDef.columns.map((col) => col.name));
|
480
|
+
return columns.map((col, index) => (Object.assign(Object.assign({}, col), { name: escapedColumnsNames[index] })));
|
481
|
+
}
|
482
|
+
if (schemaDef.queryType === 'Copy') {
|
483
|
+
return [];
|
484
|
+
}
|
485
|
+
const columns = [
|
486
|
+
{
|
487
|
+
name: 'rowCount',
|
488
|
+
tsType: 'number',
|
489
|
+
notNull: true
|
490
|
+
}
|
491
|
+
];
|
492
|
+
return columns;
|
493
|
+
}
|
494
|
+
function toDriver(variableData, param) {
|
495
|
+
if (param.tsType === 'Date') {
|
496
|
+
if (param.notNull && !param.optional) {
|
497
|
+
return `new Date(${variableData})`;
|
498
|
+
}
|
499
|
+
return `${variableData} != null ? new Date(${variableData}) : ${variableData}`;
|
500
|
+
}
|
501
|
+
if (param.tsType === 'boolean') {
|
502
|
+
return `${variableData} != null ? Boolean(${variableData}) : ${variableData}`;
|
503
|
+
}
|
504
|
+
return variableData;
|
505
|
+
}
|
506
|
+
function paramToDriver(param, objName) {
|
507
|
+
if (!param.tsType.endsWith('[]')) {
|
508
|
+
return `${objName}.${param.name}`;
|
509
|
+
}
|
510
|
+
return param.isArray ? `[...${objName}.${param.name}]` : `${objName}.${param.name}[0]`;
|
511
|
+
}
|
512
|
+
function isList(param) {
|
513
|
+
return param.tsType.endsWith('[]') && !param.isArray;
|
514
|
+
}
|
515
|
+
function generateCrud(queryType, tableName, dbSchema) {
|
516
|
+
const queryName = (0, sqlite_1.getQueryName)(queryType, tableName);
|
517
|
+
const camelCaseName = (0, codegen_util_1.convertToCamelCaseName)(queryName);
|
518
|
+
const capitalizedName = (0, codegen_util_1.capitalize)(camelCaseName);
|
519
|
+
const dataTypeName = `${capitalizedName}Data`;
|
520
|
+
const resultTypeName = `${capitalizedName}Result`;
|
521
|
+
const paramsTypeName = `${capitalizedName}Params`;
|
522
|
+
const writer = (0, codegen_util_1.createCodeBlockWriter)();
|
523
|
+
const allColumns = dbSchema.filter((col) => col.table === tableName);
|
524
|
+
const keyColumns = allColumns.filter((col) => col.column_key === 'PRI');
|
525
|
+
if (keyColumns.length === 0) {
|
526
|
+
keyColumns.push(...allColumns.filter((col) => col.column_key === 'UNI'));
|
527
|
+
}
|
528
|
+
const keys = keyColumns.map(col => (Object.assign(Object.assign({}, mapPostgresColumnSchemaToTsFieldDescriptor(col)), { optional: false })));
|
529
|
+
const nonKeys = allColumns.filter(col => col.column_key !== 'PRI').map(col => mapPostgresColumnSchemaToTsFieldDescriptor(col));
|
530
|
+
const codeWriter = getCodeWriter('pg');
|
531
|
+
codeWriter.writeImports(writer, queryType);
|
532
|
+
const uniqueDataParams = queryType === 'Update' ? nonKeys.map(col => (Object.assign(Object.assign({}, col), { optional: true }))) : [];
|
533
|
+
if (uniqueDataParams.length > 0) {
|
534
|
+
writer.blankLine();
|
535
|
+
writeDataType(writer, dataTypeName, uniqueDataParams);
|
536
|
+
}
|
537
|
+
const uniqueParams = queryType === 'Insert' ? nonKeys : keys;
|
538
|
+
if (uniqueParams.length > 0) {
|
539
|
+
writer.blankLine();
|
540
|
+
writeParamsType(writer, paramsTypeName, uniqueParams, false, '');
|
541
|
+
}
|
542
|
+
writer.blankLine();
|
543
|
+
const columns = allColumns.map(col => (Object.assign(Object.assign({}, mapPostgresColumnSchemaToTsFieldDescriptor(col)), { optional: false })));
|
544
|
+
writeResultType(writer, resultTypeName, columns);
|
545
|
+
writer.blankLine();
|
546
|
+
const crudParameters = {
|
547
|
+
queryType,
|
548
|
+
tableName,
|
549
|
+
queryName,
|
550
|
+
dataTypeName,
|
551
|
+
paramsTypeName,
|
552
|
+
resultTypeName,
|
553
|
+
columns,
|
554
|
+
nonKeys: nonKeys,
|
555
|
+
keys: keys.map(col => col.name)
|
556
|
+
};
|
557
|
+
const result = writeCrud(writer, crudParameters);
|
558
|
+
return result;
|
559
|
+
}
|
560
|
+
function writeCrud(writer, crudParamters) {
|
561
|
+
const { queryType } = crudParamters;
|
562
|
+
switch (queryType) {
|
563
|
+
case 'Select':
|
564
|
+
return writeCrudSelect(writer, crudParamters);
|
565
|
+
case 'Insert':
|
566
|
+
return writeCrudInsert(writer, crudParamters);
|
567
|
+
case 'Update':
|
568
|
+
return writeCrudUpdate(writer, crudParamters);
|
569
|
+
case 'Delete':
|
570
|
+
return writeCrudDelete(writer, crudParamters);
|
571
|
+
}
|
572
|
+
}
|
573
|
+
function writeCrudSelect(writer, crudParamters) {
|
574
|
+
const { tableName, queryName, paramsTypeName, resultTypeName, columns, keys } = crudParamters;
|
575
|
+
writer.write(`export async function ${queryName}(client: pg.Client | pg.Pool | pg.PoolClient, params: ${paramsTypeName}): Promise<${resultTypeName} | null>`).block(() => {
|
576
|
+
writer.writeLine('const sql = `');
|
577
|
+
writer.indent().write('SELECT').newLine();
|
578
|
+
columns.forEach((col, columnIndex) => {
|
579
|
+
writer.indent(2).write(col.name);
|
580
|
+
writer.conditionalWrite(columnIndex < columns.length - 1, ',');
|
581
|
+
writer.newLine();
|
582
|
+
});
|
583
|
+
writer.indent().write(`FROM ${tableName}`).newLine();
|
584
|
+
const keyName = keys[0];
|
585
|
+
writer.indent().write(`WHERE ${keyName} = $1`).newLine();
|
586
|
+
writer.indent().write('`').newLine();
|
587
|
+
writer.writeLine(`return client.query({ text: sql, rowMode: 'array', values: [params.${keyName}] })`);
|
588
|
+
writer.indent(1).write(`.then(res => res.rows.length > 0 ? mapArrayTo${resultTypeName}(res.rows[0]) : null);`).newLine();
|
589
|
+
});
|
590
|
+
writer.blankLine();
|
591
|
+
writer.write(`function mapArrayTo${resultTypeName}(data: any) `).block(() => {
|
592
|
+
writer.write(`const result: ${resultTypeName} = `).block(() => {
|
593
|
+
columns.forEach((col, index) => {
|
594
|
+
const separator = index < columns.length - 1 ? ',' : '';
|
595
|
+
writer.writeLine(`${col.name}: ${toDriver(`data[${index}]`, col)}${separator}`);
|
596
|
+
});
|
597
|
+
});
|
598
|
+
writer.writeLine('return result;');
|
599
|
+
});
|
600
|
+
return writer.toString();
|
601
|
+
}
|
602
|
+
function writeCrudInsert(writer, crudParamters) {
|
603
|
+
const { tableName, queryName, paramsTypeName, resultTypeName, nonKeys } = crudParamters;
|
604
|
+
writer.write(`export async function ${queryName}(client: pg.Client | pg.Pool | pg.PoolClient, params: ${paramsTypeName}): Promise<${resultTypeName} | null>`).block(() => {
|
605
|
+
const hasOptional = nonKeys.some(field => field.optional);
|
606
|
+
if (hasOptional) {
|
607
|
+
writer.writeLine(`const insertColumns = [${nonKeys.map(col => `'${col.name}'`).join(', ')}] as const;`);
|
608
|
+
writer.writeLine('const columns: string[] = [];');
|
609
|
+
writer.writeLine('const placeholders: string[] = [];');
|
610
|
+
writer.writeLine('const values: unknown[] = [];');
|
611
|
+
writer.blankLine();
|
612
|
+
writer.writeLine('let parameterNumber = 1;');
|
613
|
+
writer.blankLine();
|
614
|
+
writer.write('for (const column of insertColumns)').block(() => {
|
615
|
+
writer.writeLine('const value = params[column];');
|
616
|
+
writer.write('if (value !== undefined)').block(() => {
|
617
|
+
writer.writeLine('columns.push(column);');
|
618
|
+
writer.writeLine('placeholders.push(`$${parameterNumber++}`);');
|
619
|
+
writer.writeLine('values.push(value);');
|
620
|
+
});
|
621
|
+
});
|
622
|
+
writer.blankLine();
|
623
|
+
writer.writeLine('const sql = columns.length === 0');
|
624
|
+
writer.indent().write('? `INSERT INTO roles DEFAULT VALUES RETURNING *`').newLine();
|
625
|
+
writer.indent().write(': `INSERT INTO roles (${columns.join(\', \')})').newLine();
|
626
|
+
writer.indent().write(`VALUES(\${placeholders.join(', ')})`).newLine();
|
627
|
+
writer.indent().write('RETURNING *`').newLine();
|
628
|
+
writer.blankLine();
|
629
|
+
writer.writeLine(`return client.query({ text: sql, values })`);
|
630
|
+
}
|
631
|
+
else {
|
632
|
+
writer.writeLine('const sql = `');
|
633
|
+
writer.indent().write(`INSERT INTO ${tableName} (${nonKeys.map(field => field.name).join(',')})`).newLine();
|
634
|
+
writer.indent().write(`VALUES (${nonKeys.map((_, index) => `$${index + 1}`).join(',')})`).newLine();
|
635
|
+
writer.indent().write('RETURNING *').newLine();
|
636
|
+
writer.indent().write('`').newLine();
|
637
|
+
writer.writeLine(`return client.query({ text: sql, values: [${nonKeys.map(col => `params.${col.name}`)}] })`);
|
638
|
+
}
|
639
|
+
writer.indent().write(`.then(res => res.rows[0] ?? null);`);
|
640
|
+
});
|
641
|
+
return writer.toString();
|
642
|
+
}
|
643
|
+
function writeCrudUpdate(writer, crudParamters) {
|
644
|
+
const { tableName, queryName, dataTypeName, paramsTypeName, resultTypeName, nonKeys, keys } = crudParamters;
|
645
|
+
writer.write(`export async function ${queryName}(client: pg.Client | pg.Pool | pg.PoolClient, data: ${dataTypeName}, params: ${paramsTypeName}): Promise<${resultTypeName} | null>`).block(() => {
|
646
|
+
writer.writeLine(`const updateColumns = [${nonKeys.map(col => `'${col.name}'`).join(', ')}] as const;`);
|
647
|
+
writer.writeLine('const updates: string[] = [];');
|
648
|
+
writer.writeLine('const values: unknown[] = [];');
|
649
|
+
writer.writeLine('let parameterNumber = 1;');
|
650
|
+
writer.blankLine();
|
651
|
+
writer.write('for (const column of updateColumns)').block(() => {
|
652
|
+
writer.writeLine('const value = data[column];');
|
653
|
+
writer.write('if (value !== undefined)').block(() => {
|
654
|
+
writer.writeLine('updates.push(`${column} = $${parameterNumber++}`);');
|
655
|
+
writer.writeLine('values.push(value);');
|
656
|
+
});
|
657
|
+
});
|
658
|
+
writer.writeLine('if (updates.length === 0) return null;');
|
659
|
+
const keyName = keys[0];
|
660
|
+
writer.writeLine(`values.push(params.${keyName});`);
|
661
|
+
writer.blankLine();
|
662
|
+
writer.writeLine(`const sql = \`UPDATE ${tableName} SET \${updates.join(', ')} WHERE ${keyName} = \$\${parameterNumber} RETURNING *\`;`);
|
663
|
+
writer.writeLine('return client.query({ text: sql, values })');
|
664
|
+
writer.indent().write('.then(res => res.rows[0] ?? null);');
|
665
|
+
});
|
666
|
+
return writer.toString();
|
667
|
+
}
|
668
|
+
function writeCrudDelete(writer, crudParamters) {
|
669
|
+
const { tableName, queryName, paramsTypeName, resultTypeName, columns, keys } = crudParamters;
|
670
|
+
const keyName = keys[0];
|
671
|
+
writer.write(`export async function ${queryName}(client: pg.Client | pg.Pool | pg.PoolClient, params: ${paramsTypeName}): Promise<${resultTypeName} | null>`).block(() => {
|
672
|
+
writer.writeLine('const sql = `');
|
673
|
+
writer.indent().write(`DELETE FROM ${tableName} WHERE ${keyName} = $1`).newLine();
|
674
|
+
writer.indent().write('`').newLine();
|
675
|
+
writer.writeLine(`return client.query({ text: sql, rowMode: 'array', values: [params.${keyName}] })`);
|
676
|
+
writer.indent(1).write(`.then(res => res.rows.length > 0 ? mapArrayTo${resultTypeName}(res.rows[0]) : null);`).newLine();
|
677
|
+
});
|
678
|
+
writer.blankLine();
|
679
|
+
writer.write(`function mapArrayTo${resultTypeName}(data: any) `).block(() => {
|
680
|
+
writer.write(`const result: ${resultTypeName} = `).block(() => {
|
681
|
+
columns.forEach((col, index) => {
|
682
|
+
const separator = index < columns.length - 1 ? ',' : '';
|
683
|
+
writer.writeLine(`${col.name}: ${toDriver(`data[${index}]`, col)}${separator}`);
|
684
|
+
});
|
685
|
+
});
|
686
|
+
writer.writeLine('return result;');
|
687
|
+
});
|
688
|
+
return writer.toString();
|
689
|
+
}
|
690
|
+
function mapPostgrsFieldToTsField(columns, field) {
|
691
|
+
const tsField = {
|
692
|
+
name: field.name,
|
693
|
+
index: field.index,
|
694
|
+
tsType: postgres_1.mapper.mapColumnType(columns[field.index].type),
|
695
|
+
notNull: columns[field.index].intrinsicNotNull
|
696
|
+
};
|
697
|
+
return tsField;
|
698
|
+
}
|
699
|
+
function mapPostgresColumnSchemaToTsFieldDescriptor(col) {
|
700
|
+
return {
|
701
|
+
name: col.column_name,
|
702
|
+
notNull: !col.is_nullable,
|
703
|
+
optional: col.column_default,
|
704
|
+
tsType: postgres_1.mapper.mapColumnType(col.type),
|
705
|
+
};
|
706
|
+
}
|
707
|
+
//# sourceMappingURL=pg.js.map
|