rads-db 3.0.4 → 3.0.7
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/integrations/lib.cjs +144 -61
- package/integrations/lib.mjs +139 -54
- package/integrations/node.cjs +2 -2
- package/integrations/node.mjs +12 -2
- package/package.json +1 -1
package/integrations/lib.cjs
CHANGED
|
@@ -114,6 +114,7 @@ function getOrder(f) {
|
|
|
114
114
|
return decorator.order ?? defaultOrders[decorator.preset] ?? 0;
|
|
115
115
|
}
|
|
116
116
|
function parseType(typeDeclaration, typeName, ctx) {
|
|
117
|
+
if (ctx.result[typeName]) return ctx.result[typeName];
|
|
117
118
|
const {
|
|
118
119
|
modifiers
|
|
119
120
|
} = typeDeclaration;
|
|
@@ -155,15 +156,27 @@ function parseType(typeDeclaration, typeName, ctx) {
|
|
|
155
156
|
}
|
|
156
157
|
if (typeDeclaration.kind === _typescript.SyntaxKind.TypeAliasDeclaration) {
|
|
157
158
|
const typeAliasDeclaration = typeDeclaration;
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
|
|
159
|
+
const typeAliasType = typeAliasDeclaration.type;
|
|
160
|
+
if (typeAliasType.kind === _typescript.SyntaxKind.UnionType) {
|
|
161
|
+
const typeAliasValue = typeAliasDeclaration.type;
|
|
162
|
+
const enumValues = getEnumValues(typeAliasValue, typeDeclaration, ctx);
|
|
163
|
+
return {
|
|
164
|
+
name,
|
|
165
|
+
decorators,
|
|
166
|
+
enumValues,
|
|
167
|
+
comment
|
|
168
|
+
};
|
|
169
|
+
}
|
|
170
|
+
if (typeAliasType.kind === _typescript.SyntaxKind.TypeOperator && typeAliasType.operator === _typescript.SyntaxKind.KeyOfKeyword) {
|
|
171
|
+
const enumValues = getEnumValuesFromKeyOf(typeAliasType, ctx);
|
|
172
|
+
return {
|
|
173
|
+
name,
|
|
174
|
+
decorators,
|
|
175
|
+
enumValues,
|
|
176
|
+
comment
|
|
177
|
+
};
|
|
178
|
+
}
|
|
179
|
+
throw new Error(`Unexpected type definition - ${typeDeclaration.getText(ctx.sourceFile)}. Did you mean 'class'?`);
|
|
167
180
|
}
|
|
168
181
|
throw new Error(`Unexpected type kind - "${name}"`);
|
|
169
182
|
}
|
|
@@ -227,64 +240,132 @@ function parseClassMember(node, parentName, ctx) {
|
|
|
227
240
|
return result;
|
|
228
241
|
}
|
|
229
242
|
function parseFieldType(ctx, parentName, fieldName, node, defaultValueDescription) {
|
|
230
|
-
|
|
231
|
-
|
|
232
|
-
|
|
233
|
-
|
|
234
|
-
|
|
235
|
-
|
|
236
|
-
nodeType
|
|
237
|
-
|
|
238
|
-
|
|
239
|
-
|
|
240
|
-
|
|
241
|
-
|
|
242
|
-
|
|
243
|
-
|
|
244
|
-
|
|
245
|
-
|
|
246
|
-
|
|
247
|
-
|
|
248
|
-
|
|
249
|
-
|
|
250
|
-
if (nt.typeArguments[1]) {
|
|
251
|
-
const ta = nt.typeArguments[1];
|
|
252
|
-
relationDenormFields = getRelationDenormFields(ctx, ta);
|
|
253
|
-
}
|
|
254
|
-
}
|
|
255
|
-
}
|
|
256
|
-
let type;
|
|
257
|
-
if (nodeType?.kind === _typescript.SyntaxKind.UnionType) {
|
|
258
|
-
const newTypeName = `${parentName}_${_lodash.default.upperFirst(fieldName)}`;
|
|
259
|
-
ctx.result[newTypeName] = {
|
|
260
|
-
name: newTypeName,
|
|
261
|
-
decorators: {},
|
|
262
|
-
enumValues: getEnumValues(nodeType, node, ctx)
|
|
263
|
-
};
|
|
264
|
-
type = newTypeName;
|
|
265
|
-
}
|
|
266
|
-
type = type ?? nodeType?.getText(ctx.sourceFile) ?? defaultValueDescription?.type;
|
|
267
|
-
if (!type) throw new Error(`Cannot detect property type: '${node.getText(ctx.sourceFile)}'`);
|
|
268
|
-
let isChange;
|
|
269
|
-
if (type.startsWith("Change<")) {
|
|
270
|
-
type = type.slice(7, -1);
|
|
271
|
-
if (!ctx.typesMap[type]) throw new Error(`Unexpected property type: '${type}'`);
|
|
272
|
-
isChange = true;
|
|
243
|
+
const parsedType = {
|
|
244
|
+
isArray: false,
|
|
245
|
+
isRelation: false,
|
|
246
|
+
isChange: false,
|
|
247
|
+
relationDenormFields: void 0,
|
|
248
|
+
type: void 0,
|
|
249
|
+
nodeType: node.type,
|
|
250
|
+
node
|
|
251
|
+
};
|
|
252
|
+
parseFieldTypeArray(parsedType, parentName);
|
|
253
|
+
parseFieldTypeRelation(parsedType, parentName, ctx);
|
|
254
|
+
parseFieldTypeInlineEnum(parsedType, parentName, fieldName, ctx);
|
|
255
|
+
parseFieldTypeKeyofEnum(parsedType, parentName, fieldName, ctx);
|
|
256
|
+
parseFieldTypeRecordEnum(parsedType, parentName, fieldName, ctx);
|
|
257
|
+
parsedType.type = parsedType.type ?? parsedType.nodeType?.getText(ctx.sourceFile) ?? defaultValueDescription?.type;
|
|
258
|
+
if (!parsedType.type) throw new Error(`Cannot detect property type: '${node.getText(ctx.sourceFile)}'`);
|
|
259
|
+
if (parsedType.type.startsWith("Change<")) {
|
|
260
|
+
parsedType.type = parsedType.type.slice(7, -1);
|
|
261
|
+
if (!ctx.typesMap[parsedType.type]) throw new Error(`Unexpected property type: '${parsedType.type}'`);
|
|
262
|
+
parsedType.isChange = true;
|
|
273
263
|
} else {
|
|
274
|
-
if (!supportedPrimitiveTypes.includes(type) && !ctx.typesMap[type] && !ctx.result[type] && type !== "thisReference") {
|
|
275
|
-
throw new Error(`Unexpected property type: '${type}'`);
|
|
264
|
+
if (!supportedPrimitiveTypes.includes(parsedType.type) && !ctx.typesMap[parsedType.type] && !ctx.result[parsedType.type] && parsedType.type !== "thisReference") {
|
|
265
|
+
throw new Error(`Unexpected property type: '${parsedType.type}'`);
|
|
276
266
|
}
|
|
277
267
|
}
|
|
278
268
|
if (defaultValueDescription && defaultValueDescription.type !== "thisReference") {
|
|
279
|
-
verifyDefaultValueType(isArray, defaultValueDescription, type, supportedPrimitiveTypes, ctx);
|
|
269
|
+
verifyDefaultValueType(parsedType.isArray, defaultValueDescription, parsedType.type, supportedPrimitiveTypes, ctx);
|
|
280
270
|
}
|
|
281
271
|
return {
|
|
282
|
-
isArray,
|
|
283
|
-
isRelation,
|
|
284
|
-
isChange,
|
|
285
|
-
relationDenormFields,
|
|
286
|
-
type
|
|
272
|
+
isArray: parsedType.isArray || void 0,
|
|
273
|
+
isRelation: parsedType.isRelation || void 0,
|
|
274
|
+
isChange: parsedType.isChange || void 0,
|
|
275
|
+
relationDenormFields: parsedType.relationDenormFields,
|
|
276
|
+
type: parsedType.type
|
|
277
|
+
};
|
|
278
|
+
}
|
|
279
|
+
function parseFieldTypeRecordEnum(parsedType, parentName, fieldName, ctx) {
|
|
280
|
+
if (parsedType.nodeType?.kind !== _typescript.SyntaxKind.TypeReference) return;
|
|
281
|
+
const nt = parsedType.nodeType;
|
|
282
|
+
if (nt.typeName.getText(ctx.sourceFile) !== "Record") return;
|
|
283
|
+
if (nt.typeArguments?.length !== 2) return;
|
|
284
|
+
const keyTypeName = nt.typeArguments[0].getText(ctx.sourceFile);
|
|
285
|
+
const valueTypeName = nt.typeArguments[1].getText(ctx.sourceFile);
|
|
286
|
+
const keyType = ctx.typesMap[keyTypeName];
|
|
287
|
+
if (!keyType) return;
|
|
288
|
+
if (!ctx.result[keyTypeName]) ctx.result[keyTypeName] = parseType(keyType.node, keyTypeName, ctx);
|
|
289
|
+
const enumValues = ctx.result[keyTypeName].enumValues;
|
|
290
|
+
if (!enumValues) throw new Error(`Unexpected type - ${keyTypeName}`);
|
|
291
|
+
const newTypeName = `${parentName}_${_lodash.default.upperFirst(fieldName)}`;
|
|
292
|
+
const fieldsArray = enumValues.map(v => ({
|
|
293
|
+
name: v,
|
|
294
|
+
type: valueTypeName,
|
|
295
|
+
isRequired: true
|
|
296
|
+
}));
|
|
297
|
+
ctx.result[newTypeName] = {
|
|
298
|
+
name: newTypeName,
|
|
299
|
+
decorators: {},
|
|
300
|
+
fields: _lodash.default.keyBy(fieldsArray, "name")
|
|
287
301
|
};
|
|
302
|
+
parsedType.type = newTypeName;
|
|
303
|
+
}
|
|
304
|
+
function parseFieldTypeArray(parsedType, parentName) {
|
|
305
|
+
if (parsedType.nodeType?.kind !== _typescript.SyntaxKind.ArrayType) return;
|
|
306
|
+
parsedType.isArray = true;
|
|
307
|
+
parsedType.nodeType = parsedType.nodeType.elementType;
|
|
308
|
+
if (parsedType.nodeType?.kind === _typescript.SyntaxKind.ParenthesizedType) {
|
|
309
|
+
parsedType.nodeType = parsedType.nodeType.type;
|
|
310
|
+
}
|
|
311
|
+
if (parsedType.nodeType?.kind === _typescript.SyntaxKind.ArrayType) {
|
|
312
|
+
throw new Error(`Nested arrays are not supported (${parentName})`);
|
|
313
|
+
}
|
|
314
|
+
}
|
|
315
|
+
function parseFieldTypeRelation(parsedType, parentName, ctx) {
|
|
316
|
+
if (parsedType.nodeType?.kind !== _typescript.SyntaxKind.TypeReference) return;
|
|
317
|
+
const nt = parsedType.nodeType;
|
|
318
|
+
if (nt.typeName.getText(ctx.sourceFile) === "Relation") {
|
|
319
|
+
if (!nt.typeArguments?.length) throw new Error(`Missing type argument for Relation<>: '${parentName}'`);
|
|
320
|
+
parsedType.nodeType = nt.typeArguments[0];
|
|
321
|
+
parsedType.isRelation = true;
|
|
322
|
+
if (nt.typeArguments[1]) {
|
|
323
|
+
const ta = nt.typeArguments[1];
|
|
324
|
+
parsedType.relationDenormFields = getRelationDenormFields(ctx, ta);
|
|
325
|
+
}
|
|
326
|
+
}
|
|
327
|
+
}
|
|
328
|
+
function parseFieldTypeInlineEnum(parsedType, parentName, fieldName, ctx) {
|
|
329
|
+
if (parsedType.nodeType?.kind !== _typescript.SyntaxKind.UnionType) return;
|
|
330
|
+
const nt = parsedType.nodeType;
|
|
331
|
+
const enumValues = getEnumValues(nt, parsedType.node, ctx);
|
|
332
|
+
const newTypeName = `${parentName}_${_lodash.default.upperFirst(fieldName)}`;
|
|
333
|
+
ctx.result[newTypeName] = {
|
|
334
|
+
name: newTypeName,
|
|
335
|
+
decorators: {},
|
|
336
|
+
enumValues
|
|
337
|
+
};
|
|
338
|
+
parsedType.type = newTypeName;
|
|
339
|
+
}
|
|
340
|
+
function parseFieldTypeKeyofEnum(parsedType, parentName, fieldName, ctx) {
|
|
341
|
+
if (parsedType.nodeType?.kind !== _typescript.SyntaxKind.TypeOperator) return;
|
|
342
|
+
const nt = parsedType.nodeType;
|
|
343
|
+
if (nt.operator !== _typescript.SyntaxKind.KeyOfKeyword) return;
|
|
344
|
+
const enumValues = getEnumValuesFromKeyOf(nt, ctx);
|
|
345
|
+
const newTypeName = `${parentName}_${_lodash.default.upperFirst(fieldName)}`;
|
|
346
|
+
ctx.result[newTypeName] = {
|
|
347
|
+
name: newTypeName,
|
|
348
|
+
decorators: {},
|
|
349
|
+
enumValues
|
|
350
|
+
};
|
|
351
|
+
parsedType.type = newTypeName;
|
|
352
|
+
}
|
|
353
|
+
function getEnumValuesFromKeyOf(nodeType, ctx) {
|
|
354
|
+
if (nodeType.type.kind !== _typescript.SyntaxKind.TypeReference) {
|
|
355
|
+
throw new Error(`Unexpected type - ${nodeType.type.getText(ctx.sourceFile)}`);
|
|
356
|
+
}
|
|
357
|
+
const typeReferenceNode = nodeType.type;
|
|
358
|
+
if (typeReferenceNode.typeName.kind !== _typescript.SyntaxKind.Identifier) {
|
|
359
|
+
throw new Error(`Unexpected type - ${typeReferenceNode.getText(ctx.sourceFile)}`);
|
|
360
|
+
}
|
|
361
|
+
const typeName = typeReferenceNode.typeName.text;
|
|
362
|
+
const type = ctx.typesMap[typeName];
|
|
363
|
+
if (!type) {
|
|
364
|
+
throw new Error(`Unexpected type - ${typeName}`);
|
|
365
|
+
}
|
|
366
|
+
if (!ctx.result[typeName]) ctx.result[typeName] = parseType(type.node, typeName, ctx);
|
|
367
|
+
if (!ctx.result[typeName].fields) throw new Error(`Unexpected type - ${typeName}`);
|
|
368
|
+
return Object.keys(ctx.result[typeName].fields);
|
|
288
369
|
}
|
|
289
370
|
function getRelationDenormFields(ctx, node) {
|
|
290
371
|
if (node.kind === _typescript.SyntaxKind.LiteralType) {
|
|
@@ -309,9 +390,11 @@ function verifyDefaultValueType(isArray, defaultValueDescription, type, supporte
|
|
|
309
390
|
if (supportedPrimitiveTypes2.includes(type) && defaultValueDescription.type !== type) {
|
|
310
391
|
throw new Error(`Default value type is different from field type: '${type}'`);
|
|
311
392
|
}
|
|
393
|
+
if (!ctx.result[type] && ctx.typesMap[type]) ctx.result[type] = parseType(ctx.typesMap[type].node, type, ctx);
|
|
312
394
|
const enumValues = ctx.result[type]?.enumValues;
|
|
313
395
|
if (enumValues && !enumValues.includes(defaultValueDescription.value)) {
|
|
314
|
-
|
|
396
|
+
const enumValuesStr = enumValues.map(x => `'x'`).join(", ");
|
|
397
|
+
throw new Error(`Default value must be one of: ${enumValuesStr}`);
|
|
315
398
|
}
|
|
316
399
|
}
|
|
317
400
|
}
|
package/integrations/lib.mjs
CHANGED
|
@@ -99,6 +99,8 @@ function getOrder(f) {
|
|
|
99
99
|
return decorator.order ?? defaultOrders[decorator.preset] ?? 0;
|
|
100
100
|
}
|
|
101
101
|
function parseType(typeDeclaration, typeName, ctx) {
|
|
102
|
+
if (ctx.result[typeName])
|
|
103
|
+
return ctx.result[typeName];
|
|
102
104
|
const { modifiers } = typeDeclaration;
|
|
103
105
|
const nameNode = typeDeclaration.name;
|
|
104
106
|
if (!nameNode || nameNode.kind !== SyntaxKind.Identifier)
|
|
@@ -136,12 +138,17 @@ function parseType(typeDeclaration, typeName, ctx) {
|
|
|
136
138
|
}
|
|
137
139
|
if (typeDeclaration.kind === SyntaxKind.TypeAliasDeclaration) {
|
|
138
140
|
const typeAliasDeclaration = typeDeclaration;
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
if (typeDeclaration)
|
|
141
|
+
const typeAliasType = typeAliasDeclaration.type;
|
|
142
|
+
if (typeAliasType.kind === SyntaxKind.UnionType) {
|
|
143
|
+
const typeAliasValue = typeAliasDeclaration.type;
|
|
144
|
+
const enumValues = getEnumValues(typeAliasValue, typeDeclaration, ctx);
|
|
144
145
|
return { name, decorators, enumValues, comment };
|
|
146
|
+
}
|
|
147
|
+
if (typeAliasType.kind === SyntaxKind.TypeOperator && typeAliasType.operator === SyntaxKind.KeyOfKeyword) {
|
|
148
|
+
const enumValues = getEnumValuesFromKeyOf(typeAliasType, ctx);
|
|
149
|
+
return { name, decorators, enumValues, comment };
|
|
150
|
+
}
|
|
151
|
+
throw new Error(`Unexpected type definition - ${typeDeclaration.getText(ctx.sourceFile)}. Did you mean 'class'?`);
|
|
145
152
|
}
|
|
146
153
|
throw new Error(`Unexpected type kind - "${name}"`);
|
|
147
154
|
}
|
|
@@ -206,61 +213,136 @@ function parseClassMember(node, parentName, ctx) {
|
|
|
206
213
|
return result;
|
|
207
214
|
}
|
|
208
215
|
function parseFieldType(ctx, parentName, fieldName, node, defaultValueDescription) {
|
|
209
|
-
|
|
210
|
-
|
|
211
|
-
|
|
212
|
-
|
|
213
|
-
|
|
214
|
-
|
|
215
|
-
nodeType
|
|
216
|
-
|
|
217
|
-
|
|
218
|
-
|
|
219
|
-
|
|
220
|
-
|
|
216
|
+
const parsedType = {
|
|
217
|
+
isArray: false,
|
|
218
|
+
isRelation: false,
|
|
219
|
+
isChange: false,
|
|
220
|
+
relationDenormFields: void 0,
|
|
221
|
+
type: void 0,
|
|
222
|
+
nodeType: node.type,
|
|
223
|
+
node
|
|
224
|
+
};
|
|
225
|
+
parseFieldTypeArray(parsedType, parentName);
|
|
226
|
+
parseFieldTypeRelation(parsedType, parentName, ctx);
|
|
227
|
+
parseFieldTypeInlineEnum(parsedType, parentName, fieldName, ctx);
|
|
228
|
+
parseFieldTypeKeyofEnum(parsedType, parentName, fieldName, ctx);
|
|
229
|
+
parseFieldTypeRecordEnum(parsedType, parentName, fieldName, ctx);
|
|
230
|
+
parsedType.type = parsedType.type ?? parsedType.nodeType?.getText(ctx.sourceFile) ?? defaultValueDescription?.type;
|
|
231
|
+
if (!parsedType.type)
|
|
232
|
+
throw new Error(`Cannot detect property type: '${node.getText(ctx.sourceFile)}'`);
|
|
233
|
+
if (parsedType.type.startsWith("Change<")) {
|
|
234
|
+
parsedType.type = parsedType.type.slice(7, -1);
|
|
235
|
+
if (!ctx.typesMap[parsedType.type])
|
|
236
|
+
throw new Error(`Unexpected property type: '${parsedType.type}'`);
|
|
237
|
+
parsedType.isChange = true;
|
|
238
|
+
} else {
|
|
239
|
+
if (!supportedPrimitiveTypes.includes(parsedType.type) && !ctx.typesMap[parsedType.type] && !ctx.result[parsedType.type] && parsedType.type !== "thisReference") {
|
|
240
|
+
throw new Error(`Unexpected property type: '${parsedType.type}'`);
|
|
221
241
|
}
|
|
222
242
|
}
|
|
223
|
-
if (
|
|
224
|
-
|
|
225
|
-
if (nt.typeName.getText(ctx.sourceFile) === "Relation") {
|
|
226
|
-
if (!nt.typeArguments?.length)
|
|
227
|
-
throw new Error(`Missing type argument for Relation<>: '${parentName}'`);
|
|
228
|
-
nodeType = nt.typeArguments[0];
|
|
229
|
-
isRelation = true;
|
|
230
|
-
if (nt.typeArguments[1]) {
|
|
231
|
-
const ta = nt.typeArguments[1];
|
|
232
|
-
relationDenormFields = getRelationDenormFields(ctx, ta);
|
|
233
|
-
}
|
|
234
|
-
}
|
|
243
|
+
if (defaultValueDescription && defaultValueDescription.type !== "thisReference") {
|
|
244
|
+
verifyDefaultValueType(parsedType.isArray, defaultValueDescription, parsedType.type, supportedPrimitiveTypes, ctx);
|
|
235
245
|
}
|
|
236
|
-
|
|
237
|
-
|
|
238
|
-
|
|
239
|
-
|
|
240
|
-
|
|
241
|
-
|
|
242
|
-
|
|
243
|
-
|
|
244
|
-
|
|
246
|
+
return {
|
|
247
|
+
isArray: parsedType.isArray || void 0,
|
|
248
|
+
isRelation: parsedType.isRelation || void 0,
|
|
249
|
+
isChange: parsedType.isChange || void 0,
|
|
250
|
+
relationDenormFields: parsedType.relationDenormFields,
|
|
251
|
+
type: parsedType.type
|
|
252
|
+
};
|
|
253
|
+
}
|
|
254
|
+
function parseFieldTypeRecordEnum(parsedType, parentName, fieldName, ctx) {
|
|
255
|
+
if (parsedType.nodeType?.kind !== SyntaxKind.TypeReference)
|
|
256
|
+
return;
|
|
257
|
+
const nt = parsedType.nodeType;
|
|
258
|
+
if (nt.typeName.getText(ctx.sourceFile) !== "Record")
|
|
259
|
+
return;
|
|
260
|
+
if (nt.typeArguments?.length !== 2)
|
|
261
|
+
return;
|
|
262
|
+
const keyTypeName = nt.typeArguments[0].getText(ctx.sourceFile);
|
|
263
|
+
const valueTypeName = nt.typeArguments[1].getText(ctx.sourceFile);
|
|
264
|
+
const keyType = ctx.typesMap[keyTypeName];
|
|
265
|
+
if (!keyType)
|
|
266
|
+
return;
|
|
267
|
+
if (!ctx.result[keyTypeName])
|
|
268
|
+
ctx.result[keyTypeName] = parseType(keyType.node, keyTypeName, ctx);
|
|
269
|
+
const enumValues = ctx.result[keyTypeName].enumValues;
|
|
270
|
+
if (!enumValues)
|
|
271
|
+
throw new Error(`Unexpected type - ${keyTypeName}`);
|
|
272
|
+
const newTypeName = `${parentName}_${_.upperFirst(fieldName)}`;
|
|
273
|
+
const fieldsArray = enumValues.map((v) => ({ name: v, type: valueTypeName, isRequired: true }));
|
|
274
|
+
ctx.result[newTypeName] = {
|
|
275
|
+
name: newTypeName,
|
|
276
|
+
decorators: {},
|
|
277
|
+
fields: _.keyBy(fieldsArray, "name")
|
|
278
|
+
};
|
|
279
|
+
parsedType.type = newTypeName;
|
|
280
|
+
}
|
|
281
|
+
function parseFieldTypeArray(parsedType, parentName) {
|
|
282
|
+
if (parsedType.nodeType?.kind !== SyntaxKind.ArrayType)
|
|
283
|
+
return;
|
|
284
|
+
parsedType.isArray = true;
|
|
285
|
+
parsedType.nodeType = parsedType.nodeType.elementType;
|
|
286
|
+
if (parsedType.nodeType?.kind === SyntaxKind.ParenthesizedType) {
|
|
287
|
+
parsedType.nodeType = parsedType.nodeType.type;
|
|
245
288
|
}
|
|
246
|
-
|
|
247
|
-
|
|
248
|
-
|
|
249
|
-
|
|
250
|
-
|
|
251
|
-
|
|
252
|
-
|
|
253
|
-
|
|
254
|
-
|
|
255
|
-
|
|
256
|
-
|
|
257
|
-
|
|
289
|
+
if (parsedType.nodeType?.kind === SyntaxKind.ArrayType) {
|
|
290
|
+
throw new Error(`Nested arrays are not supported (${parentName})`);
|
|
291
|
+
}
|
|
292
|
+
}
|
|
293
|
+
function parseFieldTypeRelation(parsedType, parentName, ctx) {
|
|
294
|
+
if (parsedType.nodeType?.kind !== SyntaxKind.TypeReference)
|
|
295
|
+
return;
|
|
296
|
+
const nt = parsedType.nodeType;
|
|
297
|
+
if (nt.typeName.getText(ctx.sourceFile) === "Relation") {
|
|
298
|
+
if (!nt.typeArguments?.length)
|
|
299
|
+
throw new Error(`Missing type argument for Relation<>: '${parentName}'`);
|
|
300
|
+
parsedType.nodeType = nt.typeArguments[0];
|
|
301
|
+
parsedType.isRelation = true;
|
|
302
|
+
if (nt.typeArguments[1]) {
|
|
303
|
+
const ta = nt.typeArguments[1];
|
|
304
|
+
parsedType.relationDenormFields = getRelationDenormFields(ctx, ta);
|
|
258
305
|
}
|
|
259
306
|
}
|
|
260
|
-
|
|
261
|
-
|
|
307
|
+
}
|
|
308
|
+
function parseFieldTypeInlineEnum(parsedType, parentName, fieldName, ctx) {
|
|
309
|
+
if (parsedType.nodeType?.kind !== SyntaxKind.UnionType)
|
|
310
|
+
return;
|
|
311
|
+
const nt = parsedType.nodeType;
|
|
312
|
+
const enumValues = getEnumValues(nt, parsedType.node, ctx);
|
|
313
|
+
const newTypeName = `${parentName}_${_.upperFirst(fieldName)}`;
|
|
314
|
+
ctx.result[newTypeName] = { name: newTypeName, decorators: {}, enumValues };
|
|
315
|
+
parsedType.type = newTypeName;
|
|
316
|
+
}
|
|
317
|
+
function parseFieldTypeKeyofEnum(parsedType, parentName, fieldName, ctx) {
|
|
318
|
+
if (parsedType.nodeType?.kind !== SyntaxKind.TypeOperator)
|
|
319
|
+
return;
|
|
320
|
+
const nt = parsedType.nodeType;
|
|
321
|
+
if (nt.operator !== SyntaxKind.KeyOfKeyword)
|
|
322
|
+
return;
|
|
323
|
+
const enumValues = getEnumValuesFromKeyOf(nt, ctx);
|
|
324
|
+
const newTypeName = `${parentName}_${_.upperFirst(fieldName)}`;
|
|
325
|
+
ctx.result[newTypeName] = { name: newTypeName, decorators: {}, enumValues };
|
|
326
|
+
parsedType.type = newTypeName;
|
|
327
|
+
}
|
|
328
|
+
function getEnumValuesFromKeyOf(nodeType, ctx) {
|
|
329
|
+
if (nodeType.type.kind !== SyntaxKind.TypeReference) {
|
|
330
|
+
throw new Error(`Unexpected type - ${nodeType.type.getText(ctx.sourceFile)}`);
|
|
262
331
|
}
|
|
263
|
-
|
|
332
|
+
const typeReferenceNode = nodeType.type;
|
|
333
|
+
if (typeReferenceNode.typeName.kind !== SyntaxKind.Identifier) {
|
|
334
|
+
throw new Error(`Unexpected type - ${typeReferenceNode.getText(ctx.sourceFile)}`);
|
|
335
|
+
}
|
|
336
|
+
const typeName = typeReferenceNode.typeName.text;
|
|
337
|
+
const type = ctx.typesMap[typeName];
|
|
338
|
+
if (!type) {
|
|
339
|
+
throw new Error(`Unexpected type - ${typeName}`);
|
|
340
|
+
}
|
|
341
|
+
if (!ctx.result[typeName])
|
|
342
|
+
ctx.result[typeName] = parseType(type.node, typeName, ctx);
|
|
343
|
+
if (!ctx.result[typeName].fields)
|
|
344
|
+
throw new Error(`Unexpected type - ${typeName}`);
|
|
345
|
+
return Object.keys(ctx.result[typeName].fields);
|
|
264
346
|
}
|
|
265
347
|
function getRelationDenormFields(ctx, node) {
|
|
266
348
|
if (node.kind === SyntaxKind.LiteralType) {
|
|
@@ -285,9 +367,12 @@ function verifyDefaultValueType(isArray, defaultValueDescription, type, supporte
|
|
|
285
367
|
if (supportedPrimitiveTypes2.includes(type) && defaultValueDescription.type !== type) {
|
|
286
368
|
throw new Error(`Default value type is different from field type: '${type}'`);
|
|
287
369
|
}
|
|
370
|
+
if (!ctx.result[type] && ctx.typesMap[type])
|
|
371
|
+
ctx.result[type] = parseType(ctx.typesMap[type].node, type, ctx);
|
|
288
372
|
const enumValues = ctx.result[type]?.enumValues;
|
|
289
373
|
if (enumValues && !enumValues.includes(defaultValueDescription.value)) {
|
|
290
|
-
|
|
374
|
+
const enumValuesStr = enumValues.map((x) => `'x'`).join(", ");
|
|
375
|
+
throw new Error(`Default value must be one of: ${enumValuesStr}`);
|
|
291
376
|
}
|
|
292
377
|
}
|
|
293
378
|
}
|
package/integrations/node.cjs
CHANGED
|
@@ -159,10 +159,10 @@ function getWhereFieldsFor(schema, type, fieldKey) {
|
|
|
159
159
|
return [`${name}?: ${fieldTypeName}_Where`, ...commonWhereFields];
|
|
160
160
|
}
|
|
161
161
|
if (isEnum) {
|
|
162
|
-
return [`${name}?: ${fieldTypeName}`, ...getWhereFieldsForString(fieldKey), ...commonWhereFields];
|
|
162
|
+
return [`${name}?: ${fieldTypeName}`, `${name}_in?: ${fieldTypeName}[]`, ...getWhereFieldsForString(fieldKey), ...commonWhereFields];
|
|
163
163
|
}
|
|
164
164
|
if (isPrimitive) {
|
|
165
|
-
return [`${name}?: ${fieldTypeName}`, ...getWhereFieldsForPrimitive(schema, type, fieldKey), ...commonWhereFields];
|
|
165
|
+
return [`${name}?: ${fieldTypeName}`, `${name}_in?: ${fieldTypeName}[]`, ...getWhereFieldsForPrimitive(schema, type, fieldKey), ...commonWhereFields];
|
|
166
166
|
}
|
|
167
167
|
throw new Error(`Unknown type: ${fieldTypeName}`);
|
|
168
168
|
}
|
package/integrations/node.mjs
CHANGED
|
@@ -165,10 +165,20 @@ function getWhereFieldsFor(schema, type, fieldKey) {
|
|
|
165
165
|
return [`${name}?: ${fieldTypeName}_Where`, ...commonWhereFields];
|
|
166
166
|
}
|
|
167
167
|
if (isEnum) {
|
|
168
|
-
return [
|
|
168
|
+
return [
|
|
169
|
+
`${name}?: ${fieldTypeName}`,
|
|
170
|
+
`${name}_in?: ${fieldTypeName}[]`,
|
|
171
|
+
...getWhereFieldsForString(fieldKey),
|
|
172
|
+
...commonWhereFields
|
|
173
|
+
];
|
|
169
174
|
}
|
|
170
175
|
if (isPrimitive) {
|
|
171
|
-
return [
|
|
176
|
+
return [
|
|
177
|
+
`${name}?: ${fieldTypeName}`,
|
|
178
|
+
`${name}_in?: ${fieldTypeName}[]`,
|
|
179
|
+
...getWhereFieldsForPrimitive(schema, type, fieldKey),
|
|
180
|
+
...commonWhereFields
|
|
181
|
+
];
|
|
172
182
|
}
|
|
173
183
|
throw new Error(`Unknown type: ${fieldTypeName}`);
|
|
174
184
|
}
|