rads-db 3.0.74 → 3.0.76
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/dist/index.cjs +12 -0
- package/dist/index.d.ts +4 -2
- package/dist/index.mjs +12 -0
- package/drivers/azureCosmos.cjs +11 -5
- package/drivers/azureCosmos.mjs +14 -3
- package/integrations/lib.cjs +12 -6
- package/integrations/lib.mjs +8 -6
- package/integrations/node.cjs +8 -4
- package/integrations/node.mjs +8 -4
- package/package.json +1 -1
package/dist/index.cjs
CHANGED
|
@@ -662,6 +662,9 @@ async function handleInclude(computedContext, include, result, ctx) {
|
|
|
662
662
|
const { schema, typeName } = computedContext;
|
|
663
663
|
const fields = schema[typeName].fields || {};
|
|
664
664
|
const fieldsToInclude = ___default.keys(include).filter((key) => include[key]);
|
|
665
|
+
const nestedFieldsToInclude = fieldsToInclude.filter(
|
|
666
|
+
(key) => !fields[key].isRelation && !fields[key].isInverseRelation && schema[fields[key].type]?.fields
|
|
667
|
+
);
|
|
665
668
|
const relationsToInclude = fieldsToInclude.filter((key) => fields[key].isRelation);
|
|
666
669
|
const args = {
|
|
667
670
|
entityTypeName: typeName,
|
|
@@ -670,6 +673,15 @@ async function handleInclude(computedContext, include, result, ctx) {
|
|
|
670
673
|
result,
|
|
671
674
|
include
|
|
672
675
|
};
|
|
676
|
+
for (const nf of nestedFieldsToInclude) {
|
|
677
|
+
const resultsWithNestedField = result.filter((item) => item[nf]);
|
|
678
|
+
await handleInclude(
|
|
679
|
+
{ ...computedContext, typeName: fields[nf].type },
|
|
680
|
+
include[nf],
|
|
681
|
+
resultsWithNestedField.map((x) => x[nf]),
|
|
682
|
+
ctx
|
|
683
|
+
);
|
|
684
|
+
}
|
|
673
685
|
const inverseRelationsToInclude = fieldsToInclude.filter((key) => fields[key].isInverseRelation);
|
|
674
686
|
const downloadRelationsPromises = relationsToInclude.map(
|
|
675
687
|
(fieldName) => downloadRelatedDocuments({ ...args, fieldName })
|
package/dist/index.d.ts
CHANGED
|
@@ -42,12 +42,13 @@ type GetManyArgsAny = GetManyArgs<any>;
|
|
|
42
42
|
type GetArgsAny = GetArgs<any>;
|
|
43
43
|
type GetAggArgsAny = GetAggArgs<any>;
|
|
44
44
|
type VerifyManyArgsAny = VerifyManyArgs<any>;
|
|
45
|
-
type
|
|
45
|
+
type RelationsAndNestedObjects<EN extends keyof EntityMeta> = EntityMeta[EN]['relations'] & EntityMeta[EN]['nestedObjects'];
|
|
46
|
+
type GetArgsInclude<EN extends keyof EntityMeta, R extends keyof RelationsAndNestedObjects<EN> = keyof RelationsAndNestedObjects<EN>> = [R] extends [never] ? {
|
|
46
47
|
_pick?: EntityMeta[EN]['primitives'][];
|
|
47
48
|
} : {
|
|
48
49
|
_pick?: EntityMeta[EN]['primitives'][];
|
|
49
50
|
} & {
|
|
50
|
-
[K in R]?: GetArgsInclude<
|
|
51
|
+
[K in R]?: GetArgsInclude<RelationsAndNestedObjects<EN>[K]['entityName']>;
|
|
51
52
|
};
|
|
52
53
|
type GetAggResponse<EN extends keyof EntityMeta, A extends GetAggArgs<EN>> = {
|
|
53
54
|
[K in A['agg'][0]]: K extends '_count' ? number : number | undefined;
|
|
@@ -250,6 +251,7 @@ interface TypeDefinition {
|
|
|
250
251
|
handlePlural?: string;
|
|
251
252
|
isExtending?: string;
|
|
252
253
|
keepHistoryFields?: string[];
|
|
254
|
+
sourceFile?: string;
|
|
253
255
|
}
|
|
254
256
|
interface FileUploadResult {
|
|
255
257
|
url: string;
|
package/dist/index.mjs
CHANGED
|
@@ -655,6 +655,9 @@ async function handleInclude(computedContext, include, result, ctx) {
|
|
|
655
655
|
const { schema, typeName } = computedContext;
|
|
656
656
|
const fields = schema[typeName].fields || {};
|
|
657
657
|
const fieldsToInclude = _.keys(include).filter((key) => include[key]);
|
|
658
|
+
const nestedFieldsToInclude = fieldsToInclude.filter(
|
|
659
|
+
(key) => !fields[key].isRelation && !fields[key].isInverseRelation && schema[fields[key].type]?.fields
|
|
660
|
+
);
|
|
658
661
|
const relationsToInclude = fieldsToInclude.filter((key) => fields[key].isRelation);
|
|
659
662
|
const args = {
|
|
660
663
|
entityTypeName: typeName,
|
|
@@ -663,6 +666,15 @@ async function handleInclude(computedContext, include, result, ctx) {
|
|
|
663
666
|
result,
|
|
664
667
|
include
|
|
665
668
|
};
|
|
669
|
+
for (const nf of nestedFieldsToInclude) {
|
|
670
|
+
const resultsWithNestedField = result.filter((item) => item[nf]);
|
|
671
|
+
await handleInclude(
|
|
672
|
+
{ ...computedContext, typeName: fields[nf].type },
|
|
673
|
+
include[nf],
|
|
674
|
+
resultsWithNestedField.map((x) => x[nf]),
|
|
675
|
+
ctx
|
|
676
|
+
);
|
|
677
|
+
}
|
|
666
678
|
const inverseRelationsToInclude = fieldsToInclude.filter((key) => fields[key].isInverseRelation);
|
|
667
679
|
const downloadRelationsPromises = relationsToInclude.map(
|
|
668
680
|
(fieldName) => downloadRelatedDocuments({ ...args, fieldName })
|
package/drivers/azureCosmos.cjs
CHANGED
|
@@ -114,18 +114,24 @@ var _default = options => (schema, entity) => {
|
|
|
114
114
|
};
|
|
115
115
|
},
|
|
116
116
|
async putMany(items, ctx) {
|
|
117
|
+
const itemsToPut = [];
|
|
117
118
|
for (const item of items) {
|
|
118
119
|
const id = item?.id;
|
|
119
120
|
if (!id) throw new Error(`You must provide an id`);
|
|
120
|
-
|
|
121
|
+
itemsToPut.push({
|
|
121
122
|
_partition: entity,
|
|
122
123
|
id,
|
|
123
124
|
...item
|
|
124
|
-
};
|
|
125
|
-
|
|
125
|
+
});
|
|
126
|
+
}
|
|
127
|
+
for (const chunk of _lodash.default.chunk(itemsToPut, 200)) {
|
|
128
|
+
const response = await client.items.bulk(chunk.map(x => ({
|
|
129
|
+
operationType: "Upsert",
|
|
130
|
+
resourceBody: x
|
|
131
|
+
})));
|
|
126
132
|
ctx?.log?.({
|
|
127
|
-
charge: response.requestCharge,
|
|
128
|
-
request: `put#${
|
|
133
|
+
charge: _lodash.default.sumBy(response, r => r.requestCharge),
|
|
134
|
+
request: `put#${itemsToPut[0]._partition}[${chunk.length}]`
|
|
129
135
|
});
|
|
130
136
|
}
|
|
131
137
|
}
|
package/drivers/azureCosmos.mjs
CHANGED
|
@@ -73,13 +73,24 @@ export default (options) => (schema, entity) => {
|
|
|
73
73
|
return { nodes, cursor };
|
|
74
74
|
},
|
|
75
75
|
async putMany(items, ctx) {
|
|
76
|
+
const itemsToPut = [];
|
|
76
77
|
for (const item of items) {
|
|
77
78
|
const id = item?.id;
|
|
78
79
|
if (!id)
|
|
79
80
|
throw new Error(`You must provide an id`);
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
81
|
+
itemsToPut.push({ _partition: entity, id, ...item });
|
|
82
|
+
}
|
|
83
|
+
for (const chunk of _.chunk(itemsToPut, 200)) {
|
|
84
|
+
const response = await client.items.bulk(
|
|
85
|
+
chunk.map((x) => ({
|
|
86
|
+
operationType: "Upsert",
|
|
87
|
+
resourceBody: x
|
|
88
|
+
}))
|
|
89
|
+
);
|
|
90
|
+
ctx?.log?.({
|
|
91
|
+
charge: _.sumBy(response, (r) => r.requestCharge),
|
|
92
|
+
request: `put#${itemsToPut[0]._partition}[${chunk.length}]`
|
|
93
|
+
});
|
|
83
94
|
}
|
|
84
95
|
}
|
|
85
96
|
};
|
package/integrations/lib.cjs
CHANGED
|
@@ -193,7 +193,8 @@ function parseClassDeclaration(typeDeclaration, typeName, ctx) {
|
|
|
193
193
|
decorators,
|
|
194
194
|
fields,
|
|
195
195
|
isExtending,
|
|
196
|
-
comment
|
|
196
|
+
comment,
|
|
197
|
+
sourceFile: ctx.sourceFile.fileName
|
|
197
198
|
};
|
|
198
199
|
return result;
|
|
199
200
|
}
|
|
@@ -212,7 +213,8 @@ function parseTypeAliasDeclaration(typeDeclaration, typeName, ctx) {
|
|
|
212
213
|
name,
|
|
213
214
|
enumValues,
|
|
214
215
|
comment,
|
|
215
|
-
decorators: {}
|
|
216
|
+
decorators: {},
|
|
217
|
+
sourceFile: ctx.sourceFile.fileName
|
|
216
218
|
};
|
|
217
219
|
}
|
|
218
220
|
if (typeAliasType.kind === _typescript.SyntaxKind.TypeOperator && typeAliasType.operator === _typescript.SyntaxKind.KeyOfKeyword) {
|
|
@@ -221,7 +223,8 @@ function parseTypeAliasDeclaration(typeDeclaration, typeName, ctx) {
|
|
|
221
223
|
name,
|
|
222
224
|
enumValues,
|
|
223
225
|
comment,
|
|
224
|
-
decorators: {}
|
|
226
|
+
decorators: {},
|
|
227
|
+
sourceFile: ctx.sourceFile.fileName
|
|
225
228
|
};
|
|
226
229
|
}
|
|
227
230
|
throw new Error(`Unexpected type definition - ${typeDeclaration.getText(ctx.sourceFile)}. Did you mean 'class'?`);
|
|
@@ -352,7 +355,8 @@ function parseFieldTypeRecordEnum(parsedType, parentName, fieldName, ctx) {
|
|
|
352
355
|
ctx.result[newTypeName] = {
|
|
353
356
|
name: newTypeName,
|
|
354
357
|
decorators: {},
|
|
355
|
-
fields: _lodash.default.keyBy(fieldsArray, "name")
|
|
358
|
+
fields: _lodash.default.keyBy(fieldsArray, "name"),
|
|
359
|
+
sourceFile: ctx.sourceFile.fileName
|
|
356
360
|
};
|
|
357
361
|
parsedType.type = newTypeName;
|
|
358
362
|
}
|
|
@@ -410,7 +414,8 @@ function parseFieldTypeInlineEnum(parsedType, parentName, fieldName, ctx) {
|
|
|
410
414
|
ctx.result[newTypeName] = {
|
|
411
415
|
name: newTypeName,
|
|
412
416
|
decorators: {},
|
|
413
|
-
enumValues
|
|
417
|
+
enumValues,
|
|
418
|
+
sourceFile: ctx.sourceFile.fileName
|
|
414
419
|
};
|
|
415
420
|
parsedType.type = newTypeName;
|
|
416
421
|
}
|
|
@@ -423,7 +428,8 @@ function parseFieldTypeKeyofEnum(parsedType, parentName, fieldName, ctx) {
|
|
|
423
428
|
ctx.result[newTypeName] = {
|
|
424
429
|
name: newTypeName,
|
|
425
430
|
decorators: {},
|
|
426
|
-
enumValues
|
|
431
|
+
enumValues,
|
|
432
|
+
sourceFile: ctx.sourceFile.fileName
|
|
427
433
|
};
|
|
428
434
|
parsedType.type = newTypeName;
|
|
429
435
|
}
|
package/integrations/lib.mjs
CHANGED
|
@@ -170,7 +170,8 @@ function parseClassDeclaration(typeDeclaration, typeName, ctx) {
|
|
|
170
170
|
decorators,
|
|
171
171
|
fields,
|
|
172
172
|
isExtending,
|
|
173
|
-
comment
|
|
173
|
+
comment,
|
|
174
|
+
sourceFile: ctx.sourceFile.fileName
|
|
174
175
|
};
|
|
175
176
|
return result;
|
|
176
177
|
}
|
|
@@ -187,11 +188,11 @@ function parseTypeAliasDeclaration(typeDeclaration, typeName, ctx) {
|
|
|
187
188
|
if (typeAliasType.kind === SyntaxKind.UnionType) {
|
|
188
189
|
const typeAliasValue = typeAliasDeclaration.type;
|
|
189
190
|
const enumValues = getEnumValues(typeAliasValue, typeDeclaration, ctx);
|
|
190
|
-
return { name, enumValues, comment, decorators: {} };
|
|
191
|
+
return { name, enumValues, comment, decorators: {}, sourceFile: ctx.sourceFile.fileName };
|
|
191
192
|
}
|
|
192
193
|
if (typeAliasType.kind === SyntaxKind.TypeOperator && typeAliasType.operator === SyntaxKind.KeyOfKeyword) {
|
|
193
194
|
const enumValues = getEnumValuesFromKeyOf(typeAliasType, ctx);
|
|
194
|
-
return { name, enumValues, comment, decorators: {} };
|
|
195
|
+
return { name, enumValues, comment, decorators: {}, sourceFile: ctx.sourceFile.fileName };
|
|
195
196
|
}
|
|
196
197
|
throw new Error(`Unexpected type definition - ${typeDeclaration.getText(ctx.sourceFile)}. Did you mean 'class'?`);
|
|
197
198
|
}
|
|
@@ -327,7 +328,8 @@ function parseFieldTypeRecordEnum(parsedType, parentName, fieldName, ctx) {
|
|
|
327
328
|
ctx.result[newTypeName] = {
|
|
328
329
|
name: newTypeName,
|
|
329
330
|
decorators: {},
|
|
330
|
-
fields: _.keyBy(fieldsArray, "name")
|
|
331
|
+
fields: _.keyBy(fieldsArray, "name"),
|
|
332
|
+
sourceFile: ctx.sourceFile.fileName
|
|
331
333
|
};
|
|
332
334
|
parsedType.type = newTypeName;
|
|
333
335
|
}
|
|
@@ -388,7 +390,7 @@ function parseFieldTypeInlineEnum(parsedType, parentName, fieldName, ctx) {
|
|
|
388
390
|
const nt = parsedType.nodeType;
|
|
389
391
|
const enumValues = getEnumValues(nt, parsedType.node, ctx);
|
|
390
392
|
const newTypeName = `${parentName}_${_.upperFirst(fieldName)}`;
|
|
391
|
-
ctx.result[newTypeName] = { name: newTypeName, decorators: {}, enumValues };
|
|
393
|
+
ctx.result[newTypeName] = { name: newTypeName, decorators: {}, enumValues, sourceFile: ctx.sourceFile.fileName };
|
|
392
394
|
parsedType.type = newTypeName;
|
|
393
395
|
}
|
|
394
396
|
function parseFieldTypeKeyofEnum(parsedType, parentName, fieldName, ctx) {
|
|
@@ -399,7 +401,7 @@ function parseFieldTypeKeyofEnum(parsedType, parentName, fieldName, ctx) {
|
|
|
399
401
|
return;
|
|
400
402
|
const enumValues = getEnumValuesFromKeyOf(nt, ctx);
|
|
401
403
|
const newTypeName = `${parentName}_${_.upperFirst(fieldName)}`;
|
|
402
|
-
ctx.result[newTypeName] = { name: newTypeName, decorators: {}, enumValues };
|
|
404
|
+
ctx.result[newTypeName] = { name: newTypeName, decorators: {}, enumValues, sourceFile: ctx.sourceFile.fileName };
|
|
403
405
|
parsedType.type = newTypeName;
|
|
404
406
|
}
|
|
405
407
|
function getEnumValuesFromKeyOf(nodeType, ctx) {
|
package/integrations/node.cjs
CHANGED
|
@@ -104,11 +104,13 @@ function getIndexDts(schema, options) {
|
|
|
104
104
|
const schemaTypesStr = options.entitiesDir ? "" : getEntityTypesStrFromSchema(schema);
|
|
105
105
|
for (const key in schema) {
|
|
106
106
|
const type = schema[key];
|
|
107
|
-
if (!type.
|
|
108
|
-
if (options.entitiesDir) {
|
|
109
|
-
imports.push(`import type { ${type.name} } from '../../${options.entitiesDir}/${
|
|
107
|
+
if (!type.fields) continue;
|
|
108
|
+
if (options.entitiesDir && type.sourceFile) {
|
|
109
|
+
imports.push(`import type { ${type.name} } from '../../${options.entitiesDir}/${type.sourceFile}'`);
|
|
110
|
+
}
|
|
111
|
+
if (type.decorators?.entity) {
|
|
112
|
+
rootFields.push(`${type.handle}: EntityMethods<${type.name}, '${type.name}'>`);
|
|
110
113
|
}
|
|
111
|
-
rootFields.push(`${type.handle}: EntityMethods<${type.name}, '${type.name}'>`);
|
|
112
114
|
const fieldsArray = Object.values(type.fields);
|
|
113
115
|
const relations = _lodash.default.fromPairs(fieldsArray.filter(f => f.isRelation).map(f => [f.name, {
|
|
114
116
|
entity: f.type,
|
|
@@ -118,6 +120,7 @@ function getIndexDts(schema, options) {
|
|
|
118
120
|
type: type.name,
|
|
119
121
|
whereType: `${type.name}_Where`,
|
|
120
122
|
relationsStr: _lodash.default.keys(relations).map(k => `${k}: { entityName: '${relations[k].entity}', entity: ${relations[k].entity}, denormFields: ${relations[k].denormFields} }`),
|
|
123
|
+
nestedObjectsStr: fieldsArray.filter(f => schema[f.type]?.fields && !f.isRelation && !f.isChange && !f.isInverseRelation).map(f => `${f.name}: { entityName: '${f.type}' }`),
|
|
121
124
|
aggregates: fieldsArray.filter(f => f.type === "number" && !f.isArray).map(x => `'${x.name}'`).join(" | "),
|
|
122
125
|
primitives: fieldsArray.filter(f => !schema[f.type]?.decorators?.entity).map(x => `'${x.name}'`).join(" | ")
|
|
123
126
|
});
|
|
@@ -137,6 +140,7 @@ ${whereFields.join("\n")}
|
|
|
137
140
|
whereType: ${x.whereType}
|
|
138
141
|
primitives: ${x.primitives || "never"}
|
|
139
142
|
aggregates: ${x.aggregates || "never"}
|
|
143
|
+
nestedObjects: {${x.nestedObjectsStr}}
|
|
140
144
|
relations: {${x.relationsStr}}
|
|
141
145
|
}
|
|
142
146
|
`.trim()).join("\n");
|
package/integrations/node.mjs
CHANGED
|
@@ -94,12 +94,14 @@ export function getIndexDts(schema, options) {
|
|
|
94
94
|
const schemaTypesStr = options.entitiesDir ? "" : getEntityTypesStrFromSchema(schema);
|
|
95
95
|
for (const key in schema) {
|
|
96
96
|
const type = schema[key];
|
|
97
|
-
if (!type.
|
|
97
|
+
if (!type.fields)
|
|
98
98
|
continue;
|
|
99
|
-
if (options.entitiesDir) {
|
|
100
|
-
imports.push(`import type { ${type.name} } from '../../${options.entitiesDir}/${
|
|
99
|
+
if (options.entitiesDir && type.sourceFile) {
|
|
100
|
+
imports.push(`import type { ${type.name} } from '../../${options.entitiesDir}/${type.sourceFile}'`);
|
|
101
|
+
}
|
|
102
|
+
if (type.decorators?.entity) {
|
|
103
|
+
rootFields.push(`${type.handle}: EntityMethods<${type.name}, '${type.name}'>`);
|
|
101
104
|
}
|
|
102
|
-
rootFields.push(`${type.handle}: EntityMethods<${type.name}, '${type.name}'>`);
|
|
103
105
|
const fieldsArray = Object.values(type.fields);
|
|
104
106
|
const relations = _.fromPairs(
|
|
105
107
|
fieldsArray.filter((f) => f.isRelation).map((f) => [
|
|
@@ -113,6 +115,7 @@ export function getIndexDts(schema, options) {
|
|
|
113
115
|
relationsStr: _.keys(relations).map(
|
|
114
116
|
(k) => `${k}: { entityName: '${relations[k].entity}', entity: ${relations[k].entity}, denormFields: ${relations[k].denormFields} }`
|
|
115
117
|
),
|
|
118
|
+
nestedObjectsStr: fieldsArray.filter((f) => schema[f.type]?.fields && !f.isRelation && !f.isChange && !f.isInverseRelation).map((f) => `${f.name}: { entityName: '${f.type}' }`),
|
|
116
119
|
aggregates: fieldsArray.filter((f) => f.type === "number" && !f.isArray).map((x) => `'${x.name}'`).join(" | "),
|
|
117
120
|
primitives: fieldsArray.filter((f) => !schema[f.type]?.decorators?.entity).map((x) => `'${x.name}'`).join(" | ")
|
|
118
121
|
});
|
|
@@ -136,6 +139,7 @@ ${whereFields.join("\n")}
|
|
|
136
139
|
whereType: ${x.whereType}
|
|
137
140
|
primitives: ${x.primitives || "never"}
|
|
138
141
|
aggregates: ${x.aggregates || "never"}
|
|
142
|
+
nestedObjects: {${x.nestedObjectsStr}}
|
|
139
143
|
relations: {${x.relationsStr}}
|
|
140
144
|
}
|
|
141
145
|
`.trim()
|