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 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 GetArgsInclude<EN extends keyof EntityMeta, R extends keyof EntityMeta[EN]['relations'] = keyof EntityMeta[EN]['relations']> = [R] extends [never] ? {
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<EntityMeta[EN]['relations'][K]['entityName']>;
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 })
@@ -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
- const itemToPut = {
121
+ itemsToPut.push({
121
122
  _partition: entity,
122
123
  id,
123
124
  ...item
124
- };
125
- const response = await client.items.upsert(itemToPut);
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#${itemToPut._partition}|${itemToPut.id}`
133
+ charge: _lodash.default.sumBy(response, r => r.requestCharge),
134
+ request: `put#${itemsToPut[0]._partition}[${chunk.length}]`
129
135
  });
130
136
  }
131
137
  }
@@ -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
- const itemToPut = { _partition: entity, id, ...item };
81
- const response = await client.items.upsert(itemToPut);
82
- ctx?.log?.({ charge: response.requestCharge, request: `put#${itemToPut._partition}|${itemToPut.id}` });
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
  };
@@ -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
  }
@@ -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) {
@@ -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.decorators.entity) continue;
108
- if (options.entitiesDir) {
109
- imports.push(`import type { ${type.name} } from '../../${options.entitiesDir}/${key}'`);
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");
@@ -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.decorators.entity)
97
+ if (!type.fields)
98
98
  continue;
99
- if (options.entitiesDir) {
100
- imports.push(`import type { ${type.name} } from '../../${options.entitiesDir}/${key}'`);
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()
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "rads-db",
3
- "version": "3.0.74",
3
+ "version": "3.0.76",
4
4
  "packageManager": "pnpm@8.6.1",
5
5
  "description": "Say goodbye to boilerplate code and hello to efficient and elegant syntax.",
6
6
  "author": "",