@opra/common 0.28.1 → 0.29.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.
Files changed (51) hide show
  1. package/browser.js +203 -101
  2. package/cjs/document/data-type/complex-type-class.js +38 -13
  3. package/cjs/document/data-type/field-class.js +2 -1
  4. package/cjs/document/factory/api-document-factory.js +26 -3
  5. package/cjs/document/factory/type-document-factory.js +6 -3
  6. package/cjs/document/index.js +1 -1
  7. package/cjs/document/resource/collection-class.js +31 -27
  8. package/cjs/document/resource/collection-decorator.js +61 -33
  9. package/cjs/document/resource/{operation-decorator.js → crud-operation-decorator.js} +3 -2
  10. package/cjs/document/resource/crud-operation.js +49 -0
  11. package/cjs/document/resource/crud-resource.js +2 -2
  12. package/cjs/document/resource/endpoint.js +11 -3
  13. package/cjs/document/resource/singleton-class.js +20 -15
  14. package/cjs/document/resource/storage-decorator.js +10 -10
  15. package/esm/document/data-type/complex-type-class.js +38 -13
  16. package/esm/document/data-type/field-class.js +2 -1
  17. package/esm/document/factory/api-document-factory.js +26 -3
  18. package/esm/document/factory/type-document-factory.js +6 -3
  19. package/esm/document/index.js +1 -1
  20. package/esm/document/resource/collection-class.js +31 -27
  21. package/esm/document/resource/collection-decorator.js +54 -26
  22. package/esm/document/resource/{operation-decorator.js → crud-operation-decorator.js} +3 -2
  23. package/esm/document/resource/crud-operation.js +44 -0
  24. package/esm/document/resource/crud-resource.js +2 -2
  25. package/esm/document/resource/endpoint.js +11 -3
  26. package/esm/document/resource/singleton-class.js +20 -15
  27. package/esm/document/resource/storage-decorator.js +7 -7
  28. package/package.json +2 -1
  29. package/types/document/data-type/complex-type-class.d.ts +1 -1
  30. package/types/document/data-type/complex-type.d.ts +7 -3
  31. package/types/document/data-type/data-type.d.ts +3 -0
  32. package/types/document/data-type/field-class.d.ts +0 -2
  33. package/types/document/index.d.ts +1 -1
  34. package/types/document/resource/collection-class.d.ts +0 -9
  35. package/types/document/resource/collection-decorator.d.ts +12 -0
  36. package/types/document/resource/crud-operation-decorator.d.ts +6 -0
  37. package/types/document/resource/{operation.d.ts → crud-operation.d.ts} +12 -4
  38. package/types/document/resource/crud-resource.d.ts +3 -3
  39. package/types/document/resource/endpoint.d.ts +1 -1
  40. package/types/document/resource/resource-decorator.d.ts +3 -2
  41. package/types/document/resource/resource.d.ts +2 -2
  42. package/types/document/resource/singleton-class.d.ts +5 -5
  43. package/types/document/resource/singleton-decorator.d.ts +6 -0
  44. package/types/document/resource/storage-class.d.ts +4 -4
  45. package/types/schema/data-type/complex-type.interface.d.ts +1 -1
  46. package/types/schema/resource/collection.interface.d.ts +7 -7
  47. package/types/schema/resource/endpoint.interface.d.ts +2 -1
  48. package/types/schema/resource/singleton.interface.d.ts +0 -2
  49. package/cjs/document/resource/operation.js +0 -25
  50. package/esm/document/resource/operation.js +0 -20
  51. package/types/document/resource/operation-decorator.d.ts +0 -6
package/browser.js CHANGED
@@ -1074,6 +1074,7 @@ var Endpoint = class {
1074
1074
  constructor(resource, name, init) {
1075
1075
  this.resource = resource;
1076
1076
  this.name = name;
1077
+ this.options = {};
1077
1078
  Object.assign(this, init);
1078
1079
  this.parameters = new ResponsiveMap();
1079
1080
  if (init.parameters) {
@@ -1098,12 +1099,19 @@ var Endpoint = class {
1098
1099
  const schema = omitUndefined({
1099
1100
  description: this.description
1100
1101
  });
1102
+ if (Object.keys(this.options).length)
1103
+ schema.options = { ...this.options };
1101
1104
  if (this.parameters.size) {
1102
- schema.parameters = {};
1105
+ let i = 0;
1106
+ const parameters = {};
1103
1107
  for (const [name, param] of this.parameters.entries()) {
1104
- if (!param.isBuiltin)
1105
- schema.parameters[name] = param.exportSchema(options);
1108
+ if (!param.isBuiltin) {
1109
+ parameters[name] = param.exportSchema(options);
1110
+ i++;
1111
+ }
1106
1112
  }
1113
+ if (i)
1114
+ schema.parameters = parameters;
1107
1115
  }
1108
1116
  return schema;
1109
1117
  }
@@ -1409,7 +1417,7 @@ var FieldClass = class {
1409
1417
  }
1410
1418
  exportSchema(options) {
1411
1419
  return omitUndefined({
1412
- type: this.type.name ? this.type.name : this.type.exportSchema(options),
1420
+ type: this.type ? this.type.name ? this.type.name : this.type.exportSchema(options) : void 0,
1413
1421
  description: this.description,
1414
1422
  isArray: this.isArray,
1415
1423
  default: this.default,
@@ -1477,6 +1485,7 @@ var ComplexTypeClass = class extends DataType {
1477
1485
  constructor(document, init) {
1478
1486
  super(document, init);
1479
1487
  this.kind = opra_schema_ns_exports.ComplexType.Kind;
1488
+ this.fields = new ResponsiveMap();
1480
1489
  const own = this.own = {};
1481
1490
  own.ctor = init.ctor;
1482
1491
  if (init.base) {
@@ -1495,7 +1504,6 @@ var ComplexTypeClass = class extends DataType {
1495
1504
  this.additionalFields = true;
1496
1505
  else if (this.base?.additionalFields === "error" && !this.additionalFields)
1497
1506
  this.additionalFields = "error";
1498
- this.fields = new ResponsiveMap();
1499
1507
  if (this.base) {
1500
1508
  if (this.base.fields)
1501
1509
  for (const [k, el] of this.base.fields.entries()) {
@@ -1592,7 +1600,7 @@ var ComplexTypeClass = class extends DataType {
1592
1600
  Object.assign(out, omitUndefined({
1593
1601
  base: this.base ? this.base.name ? this.base.name : this.base.exportSchema(options) : void 0,
1594
1602
  abstract: this.abstract,
1595
- additionalFields: this.own.additionalFields
1603
+ additionalFields: this.own.additionalFields instanceof DataType ? this.own.additionalFields.name ? this.own.additionalFields.name : this.own.additionalFields.exportSchema(options) : this.own.additionalFields
1596
1604
  }));
1597
1605
  if (this.own.fields.size) {
1598
1606
  const fields = out.fields = {};
@@ -1616,9 +1624,10 @@ var ComplexTypeClass = class extends DataType {
1616
1624
  }
1617
1625
  generateCodec(codec, options) {
1618
1626
  const schema = this._generateCodecSchema(codec, options);
1627
+ const additionalFields = this.additionalFields instanceof DataType ? this.additionalFields.generateCodec(codec, options) : this.additionalFields;
1619
1628
  return vg4.isObject(schema, {
1620
1629
  ctor: this.ctor,
1621
- additionalFields: this.additionalFields ?? false,
1630
+ additionalFields,
1622
1631
  name: this.name,
1623
1632
  caseInSensitive: !options?.caseSensitive
1624
1633
  });
@@ -1627,16 +1636,26 @@ var ComplexTypeClass = class extends DataType {
1627
1636
  const schema = {};
1628
1637
  const pickOption = (options?.pick || []).map((x) => x.toLowerCase());
1629
1638
  const omitOption = (options?.omit || []).map((x) => x.toLowerCase());
1630
- for (const f of this.fields.values()) {
1631
- const nameLower = f.name.toLowerCase();
1632
- if (omitOption.find((x) => x === nameLower))
1639
+ const dedupedFieldNames = (options?.overwriteFields ? Array.from(/* @__PURE__ */ new Set([...this.fields.keys(), ...options?.overwriteFields.keys()])) : Array.from(this.fields.keys())).map((x) => x.toLocaleString());
1640
+ for (const nameLower of dedupedFieldNames) {
1641
+ const overwriteField = options?.overwriteFields?.get(nameLower);
1642
+ const field = this.fields.get(nameLower);
1643
+ if (!(field || overwriteField))
1633
1644
  continue;
1634
- if (pickOption.length && !pickOption.find((x) => x === nameLower || x.startsWith(nameLower + ".")))
1645
+ if (!overwriteField && (omitOption.find((x) => x === nameLower) || pickOption.length && !pickOption.find((x) => x === nameLower || x.startsWith(nameLower + "."))))
1635
1646
  continue;
1647
+ let f;
1648
+ if (overwriteField) {
1649
+ f = { ...overwriteField };
1650
+ if (!field)
1651
+ f.type = this.document.getDataType("any");
1652
+ Object.setPrototypeOf(f, field || ApiField.prototype);
1653
+ } else
1654
+ f = field;
1636
1655
  schema[f.name] = f.generateCodec(codec, {
1637
1656
  ...options,
1638
- pick: pickOption.filter((x) => x.startsWith(nameLower + ".")).map((x) => x.substring(x.indexOf(".") + 1)),
1639
- omit: omitOption.filter((x) => x.startsWith(nameLower + ".")).map((x) => x.substring(x.indexOf(".") + 1))
1657
+ pick: overwriteField ? [] : pickOption.filter((x) => x.startsWith(nameLower + ".")).map((x) => x.substring(x.indexOf(".") + 1)),
1658
+ omit: overwriteField ? [] : omitOption.filter((x) => x.startsWith(nameLower + ".")).map((x) => x.substring(x.indexOf(".") + 1))
1640
1659
  });
1641
1660
  }
1642
1661
  return schema;
@@ -2640,7 +2659,7 @@ var TypeDocumentFactory = class _TypeDocumentFactory {
2640
2659
  return dataType;
2641
2660
  throw new TypeError(`Class "${thunk.name}" doesn't have a valid DataType metadata`);
2642
2661
  }
2643
- name = metadata.name;
2662
+ name = metadata.anonymous ? void 0 : metadata.name;
2644
2663
  initArguments = cloneObject(metadata);
2645
2664
  ctor = thunk;
2646
2665
  } else if (typeof thunk === "object") {
@@ -2652,7 +2671,7 @@ var TypeDocumentFactory = class _TypeDocumentFactory {
2652
2671
  const metadata = thunk[DATATYPE_METADATA];
2653
2672
  if (!metadata)
2654
2673
  throw new TypeError(`No EnumType metadata found for object ${JSON.stringify(thunk).substring(0, 20)}...`);
2655
- name = metadata.name;
2674
+ name = metadata.anonymous ? void 0 : metadata.name;
2656
2675
  initArguments = cloneObject(metadata);
2657
2676
  initArguments.enumObject = thunk;
2658
2677
  }
@@ -2682,9 +2701,11 @@ var TypeDocumentFactory = class _TypeDocumentFactory {
2682
2701
  if (name)
2683
2702
  this.document.types.set(name, instance);
2684
2703
  await this.prepareDataTypeInitArguments(initArguments, ctor);
2685
- if (initArguments.kind === "ComplexType")
2704
+ if (initArguments.kind === "ComplexType") {
2705
+ if (typeof initArguments.additionalFields === "function")
2706
+ initArguments.additionalFields = await this.importDataType(initArguments.additionalFields);
2686
2707
  ComplexType2.apply(instance, [this.document, initArguments]);
2687
- else if (initArguments.kind === "SimpleType")
2708
+ } else if (initArguments.kind === "SimpleType")
2688
2709
  SimpleType2.apply(instance, [this.document, initArguments]);
2689
2710
  else if (initArguments.kind === "EnumType")
2690
2711
  EnumType2.apply(instance, [this.document, initArguments]);
@@ -10320,11 +10341,11 @@ var _wrapEntryValue = /* @__PURE__ */ __name((v) => {
10320
10341
  return new StringLiteral("" + v);
10321
10342
  }, "_wrapEntryValue");
10322
10343
 
10323
- // ../../build/common/esm/document/resource/operation.js
10344
+ // ../../build/common/esm/document/resource/crud-operation.js
10324
10345
  import * as vg7 from "valgen";
10325
- var Operation = class extends Endpoint {
10346
+ var CrudOperation = class extends Endpoint {
10326
10347
  static {
10327
- __name(this, "Operation");
10348
+ __name(this, "CrudOperation");
10328
10349
  }
10329
10350
  constructor(resource, name, init) {
10330
10351
  super(resource, name, init);
@@ -10335,6 +10356,26 @@ var Operation = class extends Endpoint {
10335
10356
  this.encodeReturning = vg7.isAny();
10336
10357
  this.returnType = init.returnType instanceof DataType ? init.returnType : this.resource.document.getDataType(init.returnType || "any");
10337
10358
  this.encodeReturning = this.returnType.generateCodec("encode", { operation: "read" });
10359
+ if (init.options?.inputOverwriteFields)
10360
+ this.inputOverwriteFields = new ResponsiveMap(init.options.inputOverwriteFields);
10361
+ if (init.options?.outputOverwriteFields)
10362
+ this.outputOverwriteFields = new ResponsiveMap(init.options.outputOverwriteFields);
10363
+ }
10364
+ exportSchema(options) {
10365
+ const schema = super.exportSchema(options);
10366
+ if (this.inputOverwriteFields) {
10367
+ const trg = schema.options.inputOverwriteFields = {};
10368
+ Array.from(this.inputOverwriteFields.entries()).forEach(([k, o]) => {
10369
+ trg[k] = ApiField.prototype.exportSchema.call(o, options);
10370
+ });
10371
+ }
10372
+ if (this.outputOverwriteFields) {
10373
+ const trg = schema.options.outputOverwriteFields = {};
10374
+ Array.from(this.outputOverwriteFields.entries()).forEach(([k, o]) => {
10375
+ trg[k] = ApiField.prototype.exportSchema.call(o, options);
10376
+ });
10377
+ }
10378
+ return schema;
10338
10379
  }
10339
10380
  };
10340
10381
 
@@ -10348,7 +10389,7 @@ var CrudResource = class extends Resource {
10348
10389
  this.operations = new ResponsiveMap();
10349
10390
  if (init.operations) {
10350
10391
  for (const [name, meta] of Object.entries(init.operations)) {
10351
- this.operations.set(name, new Operation(this, name, meta));
10392
+ this.operations.set(name, new CrudOperation(this, name, meta));
10352
10393
  }
10353
10394
  }
10354
10395
  }
@@ -10391,16 +10432,18 @@ var CollectionClass = class extends CrudResource {
10391
10432
  endpoint.defineParameter("include", { type: "string", isArray: true, isBuiltin: true });
10392
10433
  endpoint.decodeInput = this.type.generateCodec("decode", {
10393
10434
  partial: true,
10394
- pick: endpoint.inputPickFields,
10395
- omit: endpoint.inputOmitFields,
10396
- operation: "write"
10435
+ pick: endpoint.options.inputPickFields,
10436
+ omit: endpoint.options.inputOmitFields,
10437
+ operation: "write",
10438
+ overwriteFields: endpoint.inputOverwriteFields
10397
10439
  });
10398
10440
  endpoint.returnType = this.type;
10399
10441
  endpoint.encodeReturning = endpoint.returnType.generateCodec("encode", {
10400
10442
  partial: true,
10401
- pick: endpoint.outputPickFields,
10402
- omit: endpoint.outputOmitFields,
10403
- operation: "read"
10443
+ pick: endpoint.options.outputPickFields,
10444
+ omit: endpoint.options.outputOmitFields,
10445
+ operation: "read",
10446
+ overwriteFields: endpoint.outputOverwriteFields
10404
10447
  });
10405
10448
  }
10406
10449
  endpoint = this.operations.get("deleteMany");
@@ -10415,9 +10458,10 @@ var CollectionClass = class extends CrudResource {
10415
10458
  endpoint.returnType = this.type;
10416
10459
  endpoint.encodeReturning = endpoint.returnType.generateCodec("encode", {
10417
10460
  partial: true,
10418
- pick: endpoint.outputPickFields,
10419
- omit: endpoint.outputOmitFields,
10420
- operation: "read"
10461
+ pick: endpoint.options.outputPickFields,
10462
+ omit: endpoint.options.outputOmitFields,
10463
+ operation: "read",
10464
+ overwriteFields: endpoint.outputOverwriteFields
10421
10465
  });
10422
10466
  }
10423
10467
  endpoint = this.operations.get("findMany");
@@ -10434,9 +10478,10 @@ var CollectionClass = class extends CrudResource {
10434
10478
  endpoint.returnType = this.type;
10435
10479
  endpoint.encodeReturning = vg8.isArray(this.type.generateCodec("encode", {
10436
10480
  partial: true,
10437
- pick: endpoint.outputPickFields,
10438
- omit: endpoint.outputOmitFields,
10439
- operation: "read"
10481
+ pick: endpoint.options.outputPickFields,
10482
+ omit: endpoint.options.outputOmitFields,
10483
+ operation: "read",
10484
+ overwriteFields: endpoint.outputOverwriteFields
10440
10485
  }));
10441
10486
  }
10442
10487
  endpoint = this.operations.get("update");
@@ -10445,31 +10490,31 @@ var CollectionClass = class extends CrudResource {
10445
10490
  endpoint.defineParameter("omit", { type: "string", isArray: true, isBuiltin: true });
10446
10491
  endpoint.defineParameter("include", { type: "string", isArray: true, isBuiltin: true });
10447
10492
  endpoint.decodeInput = this.type.generateCodec("decode", {
10448
- pick: endpoint.inputPickFields,
10449
- omit: endpoint.inputOmitFields,
10450
- operation: "write"
10493
+ pick: endpoint.options.inputPickFields,
10494
+ omit: endpoint.options.inputOmitFields,
10495
+ operation: "write",
10496
+ overwriteFields: endpoint.inputOverwriteFields
10451
10497
  });
10452
10498
  endpoint.returnType = this.type;
10453
10499
  endpoint.encodeReturning = endpoint.returnType.generateCodec("encode", {
10454
10500
  partial: true,
10455
- pick: endpoint.outputPickFields,
10456
- omit: endpoint.outputOmitFields,
10457
- operation: "read"
10501
+ pick: endpoint.options.outputPickFields,
10502
+ omit: endpoint.options.outputOmitFields,
10503
+ operation: "read",
10504
+ overwriteFields: endpoint.outputOverwriteFields
10458
10505
  });
10459
10506
  }
10460
10507
  endpoint = this.operations.get("updateMany");
10461
10508
  if (endpoint) {
10462
10509
  endpoint.defineParameter("filter", { type: "string", isBuiltin: true });
10463
10510
  endpoint.decodeInput = this.type.generateCodec("decode", {
10464
- pick: endpoint.inputPickFields,
10465
- omit: endpoint.inputOmitFields,
10466
- operation: "write"
10511
+ pick: endpoint.options.inputPickFields,
10512
+ omit: endpoint.options.inputOmitFields,
10513
+ operation: "write",
10514
+ overwriteFields: endpoint.inputOverwriteFields
10467
10515
  });
10468
10516
  }
10469
10517
  }
10470
- getOperation(name) {
10471
- return super.getOperation(name);
10472
- }
10473
10518
  exportSchema(options) {
10474
10519
  return {
10475
10520
  ...super.exportSchema(options),
@@ -10516,7 +10561,7 @@ var CollectionClass = class extends CrudResource {
10516
10561
  if (!normalized)
10517
10562
  return;
10518
10563
  const findManyOp = this.getOperation("findMany");
10519
- const sortFields = findManyOp && findManyOp.sortFields;
10564
+ const sortFields = findManyOp && findManyOp.options.sortFields;
10520
10565
  (Array.isArray(normalized) ? normalized : [normalized]).forEach((field) => {
10521
10566
  if (!sortFields?.find((x) => x === field))
10522
10567
  throw new BadRequestError({
@@ -10535,13 +10580,13 @@ var CollectionClass = class extends CrudResource {
10535
10580
  throw new TypeError(`Invalid filter query. Left side should be a data field.`);
10536
10581
  const findManyOp = this.getOperation("findMany");
10537
10582
  const fieldLower = ast.left.value.toLowerCase();
10538
- const filterDef = (findManyOp && findManyOp.filters || []).find((f) => f.field.toLowerCase() === fieldLower);
10583
+ const filterDef = (findManyOp && findManyOp.options.filters || []).find((f) => f.field.toLowerCase() === fieldLower);
10539
10584
  if (!filterDef) {
10540
10585
  throw new BadRequestError({
10541
10586
  message: translate("error:UNACCEPTED_FILTER_FIELD", { field: ast.left.value })
10542
10587
  });
10543
10588
  }
10544
- if (!filterDef.operators?.includes(ast.op))
10589
+ if (filterDef.operators && !filterDef.operators.includes(ast.op))
10545
10590
  throw new BadRequestError({
10546
10591
  message: translate("error:UNACCEPTED_FILTER_OPERATION", { field: ast.left.value })
10547
10592
  });
@@ -10575,14 +10620,15 @@ var CollectionClass = class extends CrudResource {
10575
10620
  }
10576
10621
  };
10577
10622
 
10578
- // ../../build/common/esm/document/resource/operation-decorator.js
10579
- function createOperationDecorator(operation, options, list) {
10623
+ // ../../build/common/esm/document/resource/crud-operation-decorator.js
10624
+ function createOperationDecorator(operation, init, list) {
10580
10625
  const decorator = /* @__PURE__ */ __name((target, propertyKey) => {
10581
10626
  if (propertyKey !== operation)
10582
10627
  throw new TypeError(`Name of the handler name should be '${operation}'`);
10583
10628
  const resourceMetadata = Reflect.getOwnMetadata(RESOURCE_METADATA, target.constructor) || {};
10584
10629
  resourceMetadata.operations = resourceMetadata.operations || {};
10585
- const operationMeta = { ...options };
10630
+ const operationMeta = { ...init };
10631
+ operationMeta.options = operationMeta.options || {};
10586
10632
  resourceMetadata.operations[operation] = operationMeta;
10587
10633
  for (const fn of list)
10588
10634
  fn(operationMeta, target, propertyKey);
@@ -10618,23 +10664,31 @@ Object.assign(CollectionDecorator, ResourceDecorator);
10618
10664
  const list = [];
10619
10665
  const decorator = createOperationDecorator("create", options, list);
10620
10666
  decorator.InputMaxContentSize = (sizeInBytes) => {
10621
- list.push((operationMeta) => operationMeta.inputMaxContentSize = sizeInBytes);
10667
+ list.push((operationMeta) => operationMeta.options.inputMaxContentSize = sizeInBytes);
10622
10668
  return decorator;
10623
10669
  };
10624
10670
  decorator.InputPickFields = (...fields) => {
10625
- list.push((operationMeta) => operationMeta.inputPickFields = fields);
10671
+ list.push((operationMeta) => operationMeta.options.inputPickFields = fields);
10626
10672
  return decorator;
10627
10673
  };
10628
10674
  decorator.InputOmitFields = (...fields) => {
10629
- list.push((operationMeta) => operationMeta.inputOmitFields = fields);
10675
+ list.push((operationMeta) => operationMeta.options.inputOmitFields = fields);
10676
+ return decorator;
10677
+ };
10678
+ decorator.InputOverwriteFields = (fields) => {
10679
+ list.push((operationMeta) => operationMeta.options.inputOverwriteFields = fields);
10630
10680
  return decorator;
10631
10681
  };
10632
10682
  decorator.OutputPickFields = (...fields) => {
10633
- list.push((operationMeta) => operationMeta.outputPickFields = fields);
10683
+ list.push((operationMeta) => operationMeta.options.outputPickFields = fields);
10634
10684
  return decorator;
10635
10685
  };
10636
10686
  decorator.OutputOmitFields = (...fields) => {
10637
- list.push((operationMeta) => operationMeta.outputOmitFields = fields);
10687
+ list.push((operationMeta) => operationMeta.options.outputOmitFields = fields);
10688
+ return decorator;
10689
+ };
10690
+ decorator.OutputOverwriteFields = (fields) => {
10691
+ list.push((operationMeta) => operationMeta.options.outputOverwriteFields = fields);
10638
10692
  return decorator;
10639
10693
  };
10640
10694
  return decorator;
@@ -10654,8 +10708,8 @@ Object.assign(CollectionDecorator, ResourceDecorator);
10654
10708
  if (typeof operators === "string")
10655
10709
  operators = operators.split(/\s*[,| ]\s*/);
10656
10710
  list.push((operationMeta) => {
10657
- operationMeta.filters = operationMeta.filters || [];
10658
- operationMeta.filters.push(omitUndefined({ field, operators, notes }));
10711
+ operationMeta.options.filters = operationMeta.options.filters || [];
10712
+ operationMeta.options.filters.push(omitUndefined({ field, operators, notes }));
10659
10713
  });
10660
10714
  return decorator;
10661
10715
  };
@@ -10667,11 +10721,15 @@ Object.assign(CollectionDecorator, ResourceDecorator);
10667
10721
  const list = [];
10668
10722
  const decorator = createOperationDecorator("get", options, list);
10669
10723
  decorator.OutputPickFields = (...fields) => {
10670
- list.push((operationMeta) => operationMeta.outputPickFields = fields);
10724
+ list.push((operationMeta) => operationMeta.options.outputPickFields = fields);
10671
10725
  return decorator;
10672
10726
  };
10673
10727
  decorator.OutputOmitFields = (...fields) => {
10674
- list.push((operationMeta) => operationMeta.outputOmitFields = fields);
10728
+ list.push((operationMeta) => operationMeta.options.outputOmitFields = fields);
10729
+ return decorator;
10730
+ };
10731
+ decorator.OutputOverwriteFields = (fields) => {
10732
+ list.push((operationMeta) => operationMeta.options.outputOverwriteFields = fields);
10675
10733
  return decorator;
10676
10734
  };
10677
10735
  return decorator;
@@ -10682,28 +10740,32 @@ Object.assign(CollectionDecorator, ResourceDecorator);
10682
10740
  const list = [];
10683
10741
  const decorator = createOperationDecorator("findMany", options, list);
10684
10742
  decorator.SortFields = (...fields) => {
10685
- list.push((operationMeta) => operationMeta.sortFields = fields);
10743
+ list.push((operationMeta) => operationMeta.options.sortFields = fields);
10686
10744
  return decorator;
10687
10745
  };
10688
10746
  decorator.DefaultSort = (...fields) => {
10689
- list.push((operationMeta) => operationMeta.defaultSort = fields);
10747
+ list.push((operationMeta) => operationMeta.options.defaultSort = fields);
10690
10748
  return decorator;
10691
10749
  };
10692
10750
  decorator.Filter = (field, operators, notes) => {
10693
10751
  if (typeof operators === "string")
10694
10752
  operators = operators.split(/\s*[,| ]\s*/);
10695
10753
  list.push((operationMeta) => {
10696
- operationMeta.filters = operationMeta.filters || [];
10697
- operationMeta.filters.push(omitUndefined({ field, operators, notes }));
10754
+ operationMeta.options.filters = operationMeta.options.filters || [];
10755
+ operationMeta.options.filters.push(omitUndefined({ field, operators, notes }));
10698
10756
  });
10699
10757
  return decorator;
10700
10758
  };
10701
10759
  decorator.OutputPickFields = (...fields) => {
10702
- list.push((operationMeta) => operationMeta.outputPickFields = fields);
10760
+ list.push((operationMeta) => operationMeta.options.outputPickFields = fields);
10703
10761
  return decorator;
10704
10762
  };
10705
10763
  decorator.OutputOmitFields = (...fields) => {
10706
- list.push((operationMeta) => operationMeta.outputOmitFields = fields);
10764
+ list.push((operationMeta) => operationMeta.options.outputOmitFields = fields);
10765
+ return decorator;
10766
+ };
10767
+ decorator.OutputOverwriteFields = (fields) => {
10768
+ list.push((operationMeta) => operationMeta.options.outputOverwriteFields = fields);
10707
10769
  return decorator;
10708
10770
  };
10709
10771
  return decorator;
@@ -10716,23 +10778,31 @@ Object.assign(CollectionDecorator, ResourceDecorator);
10716
10778
  const list = [];
10717
10779
  const decorator = createOperationDecorator("update", options, list);
10718
10780
  decorator.InputMaxContentSize = (sizeInBytes) => {
10719
- list.push((operationMeta) => operationMeta.inputMaxContentSize = sizeInBytes);
10781
+ list.push((operationMeta) => operationMeta.options.inputMaxContentSize = sizeInBytes);
10720
10782
  return decorator;
10721
10783
  };
10722
10784
  decorator.InputPickFields = (...fields) => {
10723
- list.push((operationMeta) => operationMeta.inputPickFields = fields);
10785
+ list.push((operationMeta) => operationMeta.options.inputPickFields = fields);
10724
10786
  return decorator;
10725
10787
  };
10726
10788
  decorator.InputOmitFields = (...fields) => {
10727
- list.push((operationMeta) => operationMeta.inputOmitFields = fields);
10789
+ list.push((operationMeta) => operationMeta.options.inputOmitFields = fields);
10790
+ return decorator;
10791
+ };
10792
+ decorator.InputOverwriteFields = (fields) => {
10793
+ list.push((operationMeta) => operationMeta.options.inputOverwriteFields = fields);
10728
10794
  return decorator;
10729
10795
  };
10730
10796
  decorator.OutputPickFields = (...fields) => {
10731
- list.push((operationMeta) => operationMeta.outputPickFields = fields);
10797
+ list.push((operationMeta) => operationMeta.options.outputPickFields = fields);
10732
10798
  return decorator;
10733
10799
  };
10734
10800
  decorator.OutputOmitFields = (...fields) => {
10735
- list.push((operationMeta) => operationMeta.outputOmitFields = fields);
10801
+ list.push((operationMeta) => operationMeta.options.outputOmitFields = fields);
10802
+ return decorator;
10803
+ };
10804
+ decorator.OutputOverwriteFields = (fields) => {
10805
+ list.push((operationMeta) => operationMeta.options.outputOverwriteFields = fields);
10736
10806
  return decorator;
10737
10807
  };
10738
10808
  return decorator;
@@ -10746,23 +10816,27 @@ Object.assign(CollectionDecorator, ResourceDecorator);
10746
10816
  const options = typeof arg0 === "string" ? { description: arg0 } : { ...arg0 };
10747
10817
  const decorator = createOperationDecorator("updateMany", options, list);
10748
10818
  decorator.InputMaxContentSize = (sizeInBytes) => {
10749
- list.push((operationMeta) => operationMeta.inputMaxContentSize = sizeInBytes);
10819
+ list.push((operationMeta) => operationMeta.options.inputMaxContentSize = sizeInBytes);
10750
10820
  return decorator;
10751
10821
  };
10752
10822
  decorator.InputPickFields = (...fields) => {
10753
- list.push((operationMeta) => operationMeta.inputPickFields = fields);
10823
+ list.push((operationMeta) => operationMeta.options.inputPickFields = fields);
10754
10824
  return decorator;
10755
10825
  };
10756
10826
  decorator.InputOmitFields = (...fields) => {
10757
- list.push((operationMeta) => operationMeta.inputOmitFields = fields);
10827
+ list.push((operationMeta) => operationMeta.options.inputOmitFields = fields);
10828
+ return decorator;
10829
+ };
10830
+ decorator.InputOverwriteFields = (fields) => {
10831
+ list.push((operationMeta) => operationMeta.options.inputOverwriteFields = fields);
10758
10832
  return decorator;
10759
10833
  };
10760
10834
  decorator.Filter = (field, operators, notes) => {
10761
10835
  if (typeof operators === "string")
10762
10836
  operators = operators.split(/\s*[,| ]\s*/);
10763
10837
  list.push((operationMeta) => {
10764
- operationMeta.filters = operationMeta.filters || [];
10765
- operationMeta.filters.push(omitUndefined({ field, operators, notes }));
10838
+ operationMeta.options.filters = operationMeta.options.filters || [];
10839
+ operationMeta.options.filters.push(omitUndefined({ field, operators, notes }));
10766
10840
  });
10767
10841
  return decorator;
10768
10842
  };
@@ -10804,16 +10878,18 @@ var SingletonClass = class extends CrudResource {
10804
10878
  endpoint.defineParameter("include", { type: "string", isArray: true, isBuiltin: true });
10805
10879
  endpoint.decodeInput = this.type.generateCodec("decode", {
10806
10880
  partial: true,
10807
- pick: endpoint.inputPickFields,
10808
- omit: endpoint.inputOmitFields,
10809
- operation: "write"
10881
+ pick: endpoint.options.inputPickFields,
10882
+ omit: endpoint.options.inputOmitFields,
10883
+ operation: "write",
10884
+ overwriteFields: endpoint.inputOverwriteFields
10810
10885
  });
10811
10886
  endpoint.returnType = this.type;
10812
10887
  endpoint.encodeReturning = endpoint.returnType.generateCodec("encode", {
10813
10888
  partial: true,
10814
- pick: endpoint.outputPickFields,
10815
- omit: endpoint.outputOmitFields,
10816
- operation: "read"
10889
+ pick: endpoint.options.outputPickFields,
10890
+ omit: endpoint.options.outputOmitFields,
10891
+ operation: "read",
10892
+ overwriteFields: endpoint.outputOverwriteFields
10817
10893
  });
10818
10894
  }
10819
10895
  endpoint = this.operations.get("get");
@@ -10824,9 +10900,10 @@ var SingletonClass = class extends CrudResource {
10824
10900
  endpoint.returnType = this.type;
10825
10901
  endpoint.encodeReturning = endpoint.returnType.generateCodec("encode", {
10826
10902
  partial: true,
10827
- pick: endpoint.outputPickFields,
10828
- omit: endpoint.outputOmitFields,
10829
- operation: "read"
10903
+ pick: endpoint.options.outputPickFields,
10904
+ omit: endpoint.options.outputOmitFields,
10905
+ operation: "read",
10906
+ overwriteFields: endpoint.outputOverwriteFields
10830
10907
  });
10831
10908
  }
10832
10909
  endpoint = this.operations.get("update");
@@ -10835,16 +10912,18 @@ var SingletonClass = class extends CrudResource {
10835
10912
  endpoint.defineParameter("omit", { type: "string", isArray: true, isBuiltin: true });
10836
10913
  endpoint.defineParameter("include", { type: "string", isArray: true, isBuiltin: true });
10837
10914
  endpoint.decodeInput = this.type.generateCodec("decode", {
10838
- pick: endpoint.inputPickFields,
10839
- omit: endpoint.inputOmitFields,
10840
- operation: "write"
10915
+ pick: endpoint.options.inputPickFields,
10916
+ omit: endpoint.options.inputOmitFields,
10917
+ operation: "write",
10918
+ overwriteFields: endpoint.inputOverwriteFields
10841
10919
  });
10842
10920
  endpoint.returnType = this.type;
10843
10921
  endpoint.encodeReturning = endpoint.returnType.generateCodec("encode", {
10844
10922
  partial: true,
10845
- pick: endpoint.outputPickFields,
10846
- omit: endpoint.outputOmitFields,
10847
- operation: "read"
10923
+ pick: endpoint.options.outputPickFields,
10924
+ omit: endpoint.options.outputOmitFields,
10925
+ operation: "read",
10926
+ overwriteFields: endpoint.outputOverwriteFields
10848
10927
  });
10849
10928
  }
10850
10929
  }
@@ -10967,27 +11046,27 @@ Object.assign(StorageDecorator, ResourceDecorator);
10967
11046
  const list = [];
10968
11047
  const decorator = createOperationDecorator("post", options, list);
10969
11048
  decorator.MaxFields = (amount) => {
10970
- list.push((operationMeta) => operationMeta.maxFields = amount);
11049
+ list.push((operationMeta) => operationMeta.options.maxFields = amount);
10971
11050
  return decorator;
10972
11051
  };
10973
11052
  decorator.MaxFieldSize = (amount) => {
10974
- list.push((operationMeta) => operationMeta.maxFieldsSize = amount);
11053
+ list.push((operationMeta) => operationMeta.options.maxFieldsSize = amount);
10975
11054
  return decorator;
10976
11055
  };
10977
11056
  decorator.MaxFiles = (amount) => {
10978
- list.push((operationMeta) => operationMeta.maxFiles = amount);
11057
+ list.push((operationMeta) => operationMeta.options.maxFiles = amount);
10979
11058
  return decorator;
10980
11059
  };
10981
11060
  decorator.MaxFileSize = (sizeInBytes) => {
10982
- list.push((operationMeta) => operationMeta.maxFileSize = sizeInBytes);
11061
+ list.push((operationMeta) => operationMeta.options.maxFileSize = sizeInBytes);
10983
11062
  return decorator;
10984
11063
  };
10985
11064
  decorator.MaxTotalFileSize = (sizeInBytes) => {
10986
- list.push((operationMeta) => operationMeta.maxTotalFileSize = sizeInBytes);
11065
+ list.push((operationMeta) => operationMeta.options.maxTotalFileSize = sizeInBytes);
10987
11066
  return decorator;
10988
11067
  };
10989
11068
  decorator.MinFileSize = (sizeInBytes) => {
10990
- list.push((operationMeta) => operationMeta.minFileSize = sizeInBytes);
11069
+ list.push((operationMeta) => operationMeta.options.minFileSize = sizeInBytes);
10991
11070
  return decorator;
10992
11071
  };
10993
11072
  return decorator;
@@ -11153,9 +11232,9 @@ var ApiDocumentFactory = class _ApiDocumentFactory extends TypeDocumentFactory {
11153
11232
  return;
11154
11233
  const output = {};
11155
11234
  for (const [kA, oA] of Object.entries(source)) {
11156
- let parameters;
11235
+ const o = output[kA] = { ...oA };
11157
11236
  if (oA.parameters) {
11158
- parameters = {};
11237
+ const parameters = o.parameters = {};
11159
11238
  for (const [kP, oP] of Object.entries(oA.parameters)) {
11160
11239
  if (oP.enum) {
11161
11240
  oP.type = EnumType2(oP.enum, { name: kP + "Enum" });
@@ -11166,7 +11245,30 @@ var ApiDocumentFactory = class _ApiDocumentFactory extends TypeDocumentFactory {
11166
11245
  };
11167
11246
  }
11168
11247
  }
11169
- output[kA] = { ...oA, parameters };
11248
+ if (oA.options?.inputOverwriteFields) {
11249
+ const inputOverwriteFields = {};
11250
+ for (const [kP, oP] of Object.entries(oA.options.inputOverwriteFields)) {
11251
+ if (oP.enum) {
11252
+ oP.type = EnumType2(oP.enum, { name: kP + "Enum" });
11253
+ }
11254
+ inputOverwriteFields[kP] = { ...oP };
11255
+ if (oP.type)
11256
+ inputOverwriteFields[kP].type = await this.importDataType(oP.type);
11257
+ }
11258
+ o.options.inputOverwriteFields = inputOverwriteFields;
11259
+ }
11260
+ if (oA.options?.outputOverwriteFields) {
11261
+ const outputOverwriteFields = {};
11262
+ for (const [kP, oP] of Object.entries(oA.options.outputOverwriteFields)) {
11263
+ if (oP.enum) {
11264
+ oP.type = EnumType2(oP.enum, { name: kP + "Enum" });
11265
+ }
11266
+ outputOverwriteFields[kP] = { ...oP };
11267
+ if (oP.type)
11268
+ outputOverwriteFields[kP].type = await this.importDataType(oP.type);
11269
+ }
11270
+ o.options.outputOverwriteFields = outputOverwriteFields;
11271
+ }
11170
11272
  }
11171
11273
  return output;
11172
11274
  }, "convertEndpoints");
@@ -11935,6 +12037,7 @@ export {
11935
12037
  Collection2 as Collection,
11936
12038
  ComplexType2 as ComplexType,
11937
12039
  Container2 as Container,
12040
+ CrudOperation,
11938
12041
  CrudResource,
11939
12042
  DATATYPE_METADATA,
11940
12043
  DECORATOR,
@@ -11956,7 +12059,6 @@ export {
11956
12059
  NotAcceptableError,
11957
12060
  NotFoundError,
11958
12061
  OmitType,
11959
- Operation,
11960
12062
  OperationResult,
11961
12063
  OpraException,
11962
12064
  opra_filter_ns_exports as OpraFilter,