@opra/common 0.28.0 → 0.29.0

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 (52) hide show
  1. package/browser.js +209 -99
  2. package/cjs/document/data-type/complex-type-class.js +36 -13
  3. package/cjs/document/data-type/field-class.js +8 -10
  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 -20
  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 -10
  14. package/cjs/document/resource/storage-decorator.js +10 -10
  15. package/esm/document/data-type/complex-type-class.js +36 -13
  16. package/esm/document/data-type/field-class.js +8 -10
  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 -20
  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 -10
  27. package/esm/document/resource/storage-decorator.js +7 -7
  28. package/package.json +4 -3
  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 +4 -0
  32. package/types/document/data-type/field-class.d.ts +2 -4
  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/data-type/field.interface.d.ts +2 -0
  47. package/types/schema/resource/collection.interface.d.ts +7 -7
  48. package/types/schema/resource/endpoint.interface.d.ts +2 -1
  49. package/types/schema/resource/singleton.interface.d.ts +0 -2
  50. package/cjs/document/resource/operation.js +0 -25
  51. package/esm/document/resource/operation.js +0 -20
  52. 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
  }
@@ -1401,6 +1409,8 @@ var FieldClass = class {
1401
1409
  this.default = init.default;
1402
1410
  this.fixed = init.fixed;
1403
1411
  this.required = init.required;
1412
+ this.readonly = init.readonly;
1413
+ this.writeonly = init.writeonly;
1404
1414
  this.exclusive = init.exclusive;
1405
1415
  this.deprecated = init.deprecated;
1406
1416
  this.examples = init.examples;
@@ -1413,22 +1423,18 @@ var FieldClass = class {
1413
1423
  default: this.default,
1414
1424
  fixed: this.fixed,
1415
1425
  required: this.required,
1426
+ readonly: this.readonly,
1427
+ writeonly: this.writeonly,
1416
1428
  exclusive: this.exclusive,
1417
1429
  deprecated: this.deprecated,
1418
1430
  examples: this.examples
1419
1431
  });
1420
1432
  }
1421
- getDecoder() {
1422
- if (!this._decoder)
1423
- this._decoder = this.generateCodec("decode");
1424
- return this._decoder;
1425
- }
1426
- getEncoder() {
1427
- if (!this._encoder)
1428
- this._encoder = this.generateCodec("encode");
1429
- return this._encoder;
1430
- }
1431
1433
  generateCodec(codec, options) {
1434
+ if (options?.operation === "read" && this.writeonly)
1435
+ return vg3.isUndefined();
1436
+ if (options?.operation === "write" && this.readonly)
1437
+ return vg3.isUndefined();
1432
1438
  let fn = this.type.generateCodec(codec, options);
1433
1439
  if (this.isArray)
1434
1440
  fn = vg3.isArray(fn);
@@ -1479,6 +1485,7 @@ var ComplexTypeClass = class extends DataType {
1479
1485
  constructor(document, init) {
1480
1486
  super(document, init);
1481
1487
  this.kind = opra_schema_ns_exports.ComplexType.Kind;
1488
+ this.fields = new ResponsiveMap();
1482
1489
  const own = this.own = {};
1483
1490
  own.ctor = init.ctor;
1484
1491
  if (init.base) {
@@ -1497,7 +1504,6 @@ var ComplexTypeClass = class extends DataType {
1497
1504
  this.additionalFields = true;
1498
1505
  else if (this.base?.additionalFields === "error" && !this.additionalFields)
1499
1506
  this.additionalFields = "error";
1500
- this.fields = new ResponsiveMap();
1501
1507
  if (this.base) {
1502
1508
  if (this.base.fields)
1503
1509
  for (const [k, el] of this.base.fields.entries()) {
@@ -1594,7 +1600,7 @@ var ComplexTypeClass = class extends DataType {
1594
1600
  Object.assign(out, omitUndefined({
1595
1601
  base: this.base ? this.base.name ? this.base.name : this.base.exportSchema(options) : void 0,
1596
1602
  abstract: this.abstract,
1597
- 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
1598
1604
  }));
1599
1605
  if (this.own.fields.size) {
1600
1606
  const fields = out.fields = {};
@@ -1618,9 +1624,10 @@ var ComplexTypeClass = class extends DataType {
1618
1624
  }
1619
1625
  generateCodec(codec, options) {
1620
1626
  const schema = this._generateCodecSchema(codec, options);
1627
+ const additionalFields = this.additionalFields instanceof DataType ? this.additionalFields.generateCodec(codec, options) : this.additionalFields;
1621
1628
  return vg4.isObject(schema, {
1622
1629
  ctor: this.ctor,
1623
- additionalFields: this.additionalFields ?? false,
1630
+ additionalFields,
1624
1631
  name: this.name,
1625
1632
  caseInSensitive: !options?.caseSensitive
1626
1633
  });
@@ -1629,16 +1636,24 @@ var ComplexTypeClass = class extends DataType {
1629
1636
  const schema = {};
1630
1637
  const pickOption = (options?.pick || []).map((x) => x.toLowerCase());
1631
1638
  const omitOption = (options?.omit || []).map((x) => x.toLowerCase());
1632
- for (const f of this.fields.values()) {
1633
- const nameLower = f.name.toLowerCase();
1634
- 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))
1635
1644
  continue;
1636
- 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 + "."))))
1637
1646
  continue;
1647
+ let f;
1648
+ if (overwriteField) {
1649
+ f = { ...overwriteField };
1650
+ Object.setPrototypeOf(f, field || ApiField.prototype);
1651
+ } else
1652
+ f = field;
1638
1653
  schema[f.name] = f.generateCodec(codec, {
1639
1654
  ...options,
1640
- pick: pickOption.filter((x) => x.startsWith(nameLower + ".")).map((x) => x.substring(x.indexOf(".") + 1)),
1641
- omit: omitOption.filter((x) => x.startsWith(nameLower + ".")).map((x) => x.substring(x.indexOf(".") + 1))
1655
+ pick: overwriteField ? [] : pickOption.filter((x) => x.startsWith(nameLower + ".")).map((x) => x.substring(x.indexOf(".") + 1)),
1656
+ omit: overwriteField ? [] : omitOption.filter((x) => x.startsWith(nameLower + ".")).map((x) => x.substring(x.indexOf(".") + 1))
1642
1657
  });
1643
1658
  }
1644
1659
  return schema;
@@ -2642,7 +2657,7 @@ var TypeDocumentFactory = class _TypeDocumentFactory {
2642
2657
  return dataType;
2643
2658
  throw new TypeError(`Class "${thunk.name}" doesn't have a valid DataType metadata`);
2644
2659
  }
2645
- name = metadata.name;
2660
+ name = metadata.anonymous ? void 0 : metadata.name;
2646
2661
  initArguments = cloneObject(metadata);
2647
2662
  ctor = thunk;
2648
2663
  } else if (typeof thunk === "object") {
@@ -2654,7 +2669,7 @@ var TypeDocumentFactory = class _TypeDocumentFactory {
2654
2669
  const metadata = thunk[DATATYPE_METADATA];
2655
2670
  if (!metadata)
2656
2671
  throw new TypeError(`No EnumType metadata found for object ${JSON.stringify(thunk).substring(0, 20)}...`);
2657
- name = metadata.name;
2672
+ name = metadata.anonymous ? void 0 : metadata.name;
2658
2673
  initArguments = cloneObject(metadata);
2659
2674
  initArguments.enumObject = thunk;
2660
2675
  }
@@ -2684,9 +2699,11 @@ var TypeDocumentFactory = class _TypeDocumentFactory {
2684
2699
  if (name)
2685
2700
  this.document.types.set(name, instance);
2686
2701
  await this.prepareDataTypeInitArguments(initArguments, ctor);
2687
- if (initArguments.kind === "ComplexType")
2702
+ if (initArguments.kind === "ComplexType") {
2703
+ if (typeof initArguments.additionalFields === "function")
2704
+ initArguments.additionalFields = await this.importDataType(initArguments.additionalFields);
2688
2705
  ComplexType2.apply(instance, [this.document, initArguments]);
2689
- else if (initArguments.kind === "SimpleType")
2706
+ } else if (initArguments.kind === "SimpleType")
2690
2707
  SimpleType2.apply(instance, [this.document, initArguments]);
2691
2708
  else if (initArguments.kind === "EnumType")
2692
2709
  EnumType2.apply(instance, [this.document, initArguments]);
@@ -10322,11 +10339,11 @@ var _wrapEntryValue = /* @__PURE__ */ __name((v) => {
10322
10339
  return new StringLiteral("" + v);
10323
10340
  }, "_wrapEntryValue");
10324
10341
 
10325
- // ../../build/common/esm/document/resource/operation.js
10342
+ // ../../build/common/esm/document/resource/crud-operation.js
10326
10343
  import * as vg7 from "valgen";
10327
- var Operation = class extends Endpoint {
10344
+ var CrudOperation = class extends Endpoint {
10328
10345
  static {
10329
- __name(this, "Operation");
10346
+ __name(this, "CrudOperation");
10330
10347
  }
10331
10348
  constructor(resource, name, init) {
10332
10349
  super(resource, name, init);
@@ -10336,7 +10353,27 @@ var Operation = class extends Endpoint {
10336
10353
  this.decodeInput = vg7.isAny();
10337
10354
  this.encodeReturning = vg7.isAny();
10338
10355
  this.returnType = init.returnType instanceof DataType ? init.returnType : this.resource.document.getDataType(init.returnType || "any");
10339
- this.encodeReturning = this.returnType.generateCodec("encode");
10356
+ this.encodeReturning = this.returnType.generateCodec("encode", { operation: "read" });
10357
+ if (init.options.inputOverwriteFields)
10358
+ this.inputOverwriteFields = new ResponsiveMap(init.options.inputOverwriteFields);
10359
+ if (init.options.outputOverwriteFields)
10360
+ this.outputOverwriteFields = new ResponsiveMap(init.options.outputOverwriteFields);
10361
+ }
10362
+ exportSchema(options) {
10363
+ const schema = super.exportSchema(options);
10364
+ if (this.inputOverwriteFields) {
10365
+ const trg = schema.options.inputOverwriteFields = {};
10366
+ Array.from(this.inputOverwriteFields.entries()).forEach(([k, o]) => {
10367
+ trg[k] = ApiField.prototype.exportSchema.call(o, options);
10368
+ });
10369
+ }
10370
+ if (this.outputOverwriteFields) {
10371
+ const trg = schema.options.outputOverwriteFields = {};
10372
+ Array.from(this.outputOverwriteFields.entries()).forEach(([k, o]) => {
10373
+ trg[k] = ApiField.prototype.exportSchema.call(o, options);
10374
+ });
10375
+ }
10376
+ return schema;
10340
10377
  }
10341
10378
  };
10342
10379
 
@@ -10350,7 +10387,7 @@ var CrudResource = class extends Resource {
10350
10387
  this.operations = new ResponsiveMap();
10351
10388
  if (init.operations) {
10352
10389
  for (const [name, meta] of Object.entries(init.operations)) {
10353
- this.operations.set(name, new Operation(this, name, meta));
10390
+ this.operations.set(name, new CrudOperation(this, name, meta));
10354
10391
  }
10355
10392
  }
10356
10393
  }
@@ -10393,14 +10430,18 @@ var CollectionClass = class extends CrudResource {
10393
10430
  endpoint.defineParameter("include", { type: "string", isArray: true, isBuiltin: true });
10394
10431
  endpoint.decodeInput = this.type.generateCodec("decode", {
10395
10432
  partial: true,
10396
- pick: endpoint.inputPickFields,
10397
- omit: endpoint.inputOmitFields
10433
+ pick: endpoint.options.inputPickFields,
10434
+ omit: endpoint.options.inputOmitFields,
10435
+ operation: "write",
10436
+ overwriteFields: endpoint.inputOverwriteFields
10398
10437
  });
10399
10438
  endpoint.returnType = this.type;
10400
10439
  endpoint.encodeReturning = endpoint.returnType.generateCodec("encode", {
10401
10440
  partial: true,
10402
- pick: endpoint.outputPickFields,
10403
- omit: endpoint.outputOmitFields
10441
+ pick: endpoint.options.outputPickFields,
10442
+ omit: endpoint.options.outputOmitFields,
10443
+ operation: "read",
10444
+ overwriteFields: endpoint.outputOverwriteFields
10404
10445
  });
10405
10446
  }
10406
10447
  endpoint = this.operations.get("deleteMany");
@@ -10415,8 +10456,10 @@ var CollectionClass = class extends CrudResource {
10415
10456
  endpoint.returnType = this.type;
10416
10457
  endpoint.encodeReturning = endpoint.returnType.generateCodec("encode", {
10417
10458
  partial: true,
10418
- pick: endpoint.outputPickFields,
10419
- omit: endpoint.outputOmitFields
10459
+ pick: endpoint.options.outputPickFields,
10460
+ omit: endpoint.options.outputOmitFields,
10461
+ operation: "read",
10462
+ overwriteFields: endpoint.outputOverwriteFields
10420
10463
  });
10421
10464
  }
10422
10465
  endpoint = this.operations.get("findMany");
@@ -10433,8 +10476,10 @@ var CollectionClass = class extends CrudResource {
10433
10476
  endpoint.returnType = this.type;
10434
10477
  endpoint.encodeReturning = vg8.isArray(this.type.generateCodec("encode", {
10435
10478
  partial: true,
10436
- pick: endpoint.outputPickFields,
10437
- omit: endpoint.outputOmitFields
10479
+ pick: endpoint.options.outputPickFields,
10480
+ omit: endpoint.options.outputOmitFields,
10481
+ operation: "read",
10482
+ overwriteFields: endpoint.outputOverwriteFields
10438
10483
  }));
10439
10484
  }
10440
10485
  endpoint = this.operations.get("update");
@@ -10443,28 +10488,31 @@ var CollectionClass = class extends CrudResource {
10443
10488
  endpoint.defineParameter("omit", { type: "string", isArray: true, isBuiltin: true });
10444
10489
  endpoint.defineParameter("include", { type: "string", isArray: true, isBuiltin: true });
10445
10490
  endpoint.decodeInput = this.type.generateCodec("decode", {
10446
- pick: endpoint.inputPickFields,
10447
- omit: endpoint.inputOmitFields
10491
+ pick: endpoint.options.inputPickFields,
10492
+ omit: endpoint.options.inputOmitFields,
10493
+ operation: "write",
10494
+ overwriteFields: endpoint.inputOverwriteFields
10448
10495
  });
10449
10496
  endpoint.returnType = this.type;
10450
10497
  endpoint.encodeReturning = endpoint.returnType.generateCodec("encode", {
10451
10498
  partial: true,
10452
- pick: endpoint.outputPickFields,
10453
- omit: endpoint.outputOmitFields
10499
+ pick: endpoint.options.outputPickFields,
10500
+ omit: endpoint.options.outputOmitFields,
10501
+ operation: "read",
10502
+ overwriteFields: endpoint.outputOverwriteFields
10454
10503
  });
10455
10504
  }
10456
10505
  endpoint = this.operations.get("updateMany");
10457
10506
  if (endpoint) {
10458
10507
  endpoint.defineParameter("filter", { type: "string", isBuiltin: true });
10459
10508
  endpoint.decodeInput = this.type.generateCodec("decode", {
10460
- pick: endpoint.inputPickFields,
10461
- omit: endpoint.inputOmitFields
10509
+ pick: endpoint.options.inputPickFields,
10510
+ omit: endpoint.options.inputOmitFields,
10511
+ operation: "write",
10512
+ overwriteFields: endpoint.inputOverwriteFields
10462
10513
  });
10463
10514
  }
10464
10515
  }
10465
- getOperation(name) {
10466
- return super.getOperation(name);
10467
- }
10468
10516
  exportSchema(options) {
10469
10517
  return {
10470
10518
  ...super.exportSchema(options),
@@ -10511,7 +10559,7 @@ var CollectionClass = class extends CrudResource {
10511
10559
  if (!normalized)
10512
10560
  return;
10513
10561
  const findManyOp = this.getOperation("findMany");
10514
- const sortFields = findManyOp && findManyOp.sortFields;
10562
+ const sortFields = findManyOp && findManyOp.options.sortFields;
10515
10563
  (Array.isArray(normalized) ? normalized : [normalized]).forEach((field) => {
10516
10564
  if (!sortFields?.find((x) => x === field))
10517
10565
  throw new BadRequestError({
@@ -10530,13 +10578,13 @@ var CollectionClass = class extends CrudResource {
10530
10578
  throw new TypeError(`Invalid filter query. Left side should be a data field.`);
10531
10579
  const findManyOp = this.getOperation("findMany");
10532
10580
  const fieldLower = ast.left.value.toLowerCase();
10533
- const filterDef = (findManyOp && findManyOp.filters || []).find((f) => f.field.toLowerCase() === fieldLower);
10581
+ const filterDef = (findManyOp && findManyOp.options.filters || []).find((f) => f.field.toLowerCase() === fieldLower);
10534
10582
  if (!filterDef) {
10535
10583
  throw new BadRequestError({
10536
10584
  message: translate("error:UNACCEPTED_FILTER_FIELD", { field: ast.left.value })
10537
10585
  });
10538
10586
  }
10539
- if (!filterDef.operators?.includes(ast.op))
10587
+ if (filterDef.operators && !filterDef.operators.includes(ast.op))
10540
10588
  throw new BadRequestError({
10541
10589
  message: translate("error:UNACCEPTED_FILTER_OPERATION", { field: ast.left.value })
10542
10590
  });
@@ -10570,14 +10618,15 @@ var CollectionClass = class extends CrudResource {
10570
10618
  }
10571
10619
  };
10572
10620
 
10573
- // ../../build/common/esm/document/resource/operation-decorator.js
10574
- function createOperationDecorator(operation, options, list) {
10621
+ // ../../build/common/esm/document/resource/crud-operation-decorator.js
10622
+ function createOperationDecorator(operation, init, list) {
10575
10623
  const decorator = /* @__PURE__ */ __name((target, propertyKey) => {
10576
10624
  if (propertyKey !== operation)
10577
10625
  throw new TypeError(`Name of the handler name should be '${operation}'`);
10578
10626
  const resourceMetadata = Reflect.getOwnMetadata(RESOURCE_METADATA, target.constructor) || {};
10579
10627
  resourceMetadata.operations = resourceMetadata.operations || {};
10580
- const operationMeta = { ...options };
10628
+ const operationMeta = { ...init };
10629
+ operationMeta.options = operationMeta.options || {};
10581
10630
  resourceMetadata.operations[operation] = operationMeta;
10582
10631
  for (const fn of list)
10583
10632
  fn(operationMeta, target, propertyKey);
@@ -10613,23 +10662,31 @@ Object.assign(CollectionDecorator, ResourceDecorator);
10613
10662
  const list = [];
10614
10663
  const decorator = createOperationDecorator("create", options, list);
10615
10664
  decorator.InputMaxContentSize = (sizeInBytes) => {
10616
- list.push((operationMeta) => operationMeta.inputMaxContentSize = sizeInBytes);
10665
+ list.push((operationMeta) => operationMeta.options.inputMaxContentSize = sizeInBytes);
10617
10666
  return decorator;
10618
10667
  };
10619
10668
  decorator.InputPickFields = (...fields) => {
10620
- list.push((operationMeta) => operationMeta.inputPickFields = fields);
10669
+ list.push((operationMeta) => operationMeta.options.inputPickFields = fields);
10621
10670
  return decorator;
10622
10671
  };
10623
10672
  decorator.InputOmitFields = (...fields) => {
10624
- list.push((operationMeta) => operationMeta.inputOmitFields = fields);
10673
+ list.push((operationMeta) => operationMeta.options.inputOmitFields = fields);
10674
+ return decorator;
10675
+ };
10676
+ decorator.InputOverwriteFields = (fields) => {
10677
+ list.push((operationMeta) => operationMeta.options.inputOverwriteFields = fields);
10625
10678
  return decorator;
10626
10679
  };
10627
10680
  decorator.OutputPickFields = (...fields) => {
10628
- list.push((operationMeta) => operationMeta.outputPickFields = fields);
10681
+ list.push((operationMeta) => operationMeta.options.outputPickFields = fields);
10629
10682
  return decorator;
10630
10683
  };
10631
10684
  decorator.OutputOmitFields = (...fields) => {
10632
- list.push((operationMeta) => operationMeta.outputOmitFields = fields);
10685
+ list.push((operationMeta) => operationMeta.options.outputOmitFields = fields);
10686
+ return decorator;
10687
+ };
10688
+ decorator.OutputOverwriteFields = (fields) => {
10689
+ list.push((operationMeta) => operationMeta.options.outputOverwriteFields = fields);
10633
10690
  return decorator;
10634
10691
  };
10635
10692
  return decorator;
@@ -10649,8 +10706,8 @@ Object.assign(CollectionDecorator, ResourceDecorator);
10649
10706
  if (typeof operators === "string")
10650
10707
  operators = operators.split(/\s*[,| ]\s*/);
10651
10708
  list.push((operationMeta) => {
10652
- operationMeta.filters = operationMeta.filters || [];
10653
- operationMeta.filters.push(omitUndefined({ field, operators, notes }));
10709
+ operationMeta.options.filters = operationMeta.options.filters || [];
10710
+ operationMeta.options.filters.push(omitUndefined({ field, operators, notes }));
10654
10711
  });
10655
10712
  return decorator;
10656
10713
  };
@@ -10662,11 +10719,15 @@ Object.assign(CollectionDecorator, ResourceDecorator);
10662
10719
  const list = [];
10663
10720
  const decorator = createOperationDecorator("get", options, list);
10664
10721
  decorator.OutputPickFields = (...fields) => {
10665
- list.push((operationMeta) => operationMeta.outputPickFields = fields);
10722
+ list.push((operationMeta) => operationMeta.options.outputPickFields = fields);
10666
10723
  return decorator;
10667
10724
  };
10668
10725
  decorator.OutputOmitFields = (...fields) => {
10669
- list.push((operationMeta) => operationMeta.outputOmitFields = fields);
10726
+ list.push((operationMeta) => operationMeta.options.outputOmitFields = fields);
10727
+ return decorator;
10728
+ };
10729
+ decorator.OutputOverwriteFields = (fields) => {
10730
+ list.push((operationMeta) => operationMeta.options.outputOverwriteFields = fields);
10670
10731
  return decorator;
10671
10732
  };
10672
10733
  return decorator;
@@ -10677,28 +10738,32 @@ Object.assign(CollectionDecorator, ResourceDecorator);
10677
10738
  const list = [];
10678
10739
  const decorator = createOperationDecorator("findMany", options, list);
10679
10740
  decorator.SortFields = (...fields) => {
10680
- list.push((operationMeta) => operationMeta.sortFields = fields);
10741
+ list.push((operationMeta) => operationMeta.options.sortFields = fields);
10681
10742
  return decorator;
10682
10743
  };
10683
10744
  decorator.DefaultSort = (...fields) => {
10684
- list.push((operationMeta) => operationMeta.defaultSort = fields);
10745
+ list.push((operationMeta) => operationMeta.options.defaultSort = fields);
10685
10746
  return decorator;
10686
10747
  };
10687
10748
  decorator.Filter = (field, operators, notes) => {
10688
10749
  if (typeof operators === "string")
10689
10750
  operators = operators.split(/\s*[,| ]\s*/);
10690
10751
  list.push((operationMeta) => {
10691
- operationMeta.filters = operationMeta.filters || [];
10692
- operationMeta.filters.push(omitUndefined({ field, operators, notes }));
10752
+ operationMeta.options.filters = operationMeta.options.filters || [];
10753
+ operationMeta.options.filters.push(omitUndefined({ field, operators, notes }));
10693
10754
  });
10694
10755
  return decorator;
10695
10756
  };
10696
10757
  decorator.OutputPickFields = (...fields) => {
10697
- list.push((operationMeta) => operationMeta.outputPickFields = fields);
10758
+ list.push((operationMeta) => operationMeta.options.outputPickFields = fields);
10698
10759
  return decorator;
10699
10760
  };
10700
10761
  decorator.OutputOmitFields = (...fields) => {
10701
- list.push((operationMeta) => operationMeta.outputOmitFields = fields);
10762
+ list.push((operationMeta) => operationMeta.options.outputOmitFields = fields);
10763
+ return decorator;
10764
+ };
10765
+ decorator.OutputOverwriteFields = (fields) => {
10766
+ list.push((operationMeta) => operationMeta.options.outputOverwriteFields = fields);
10702
10767
  return decorator;
10703
10768
  };
10704
10769
  return decorator;
@@ -10711,23 +10776,31 @@ Object.assign(CollectionDecorator, ResourceDecorator);
10711
10776
  const list = [];
10712
10777
  const decorator = createOperationDecorator("update", options, list);
10713
10778
  decorator.InputMaxContentSize = (sizeInBytes) => {
10714
- list.push((operationMeta) => operationMeta.inputMaxContentSize = sizeInBytes);
10779
+ list.push((operationMeta) => operationMeta.options.inputMaxContentSize = sizeInBytes);
10715
10780
  return decorator;
10716
10781
  };
10717
10782
  decorator.InputPickFields = (...fields) => {
10718
- list.push((operationMeta) => operationMeta.inputPickFields = fields);
10783
+ list.push((operationMeta) => operationMeta.options.inputPickFields = fields);
10719
10784
  return decorator;
10720
10785
  };
10721
10786
  decorator.InputOmitFields = (...fields) => {
10722
- list.push((operationMeta) => operationMeta.inputOmitFields = fields);
10787
+ list.push((operationMeta) => operationMeta.options.inputOmitFields = fields);
10788
+ return decorator;
10789
+ };
10790
+ decorator.InputOverwriteFields = (fields) => {
10791
+ list.push((operationMeta) => operationMeta.options.inputOverwriteFields = fields);
10723
10792
  return decorator;
10724
10793
  };
10725
10794
  decorator.OutputPickFields = (...fields) => {
10726
- list.push((operationMeta) => operationMeta.outputPickFields = fields);
10795
+ list.push((operationMeta) => operationMeta.options.outputPickFields = fields);
10727
10796
  return decorator;
10728
10797
  };
10729
10798
  decorator.OutputOmitFields = (...fields) => {
10730
- list.push((operationMeta) => operationMeta.outputOmitFields = fields);
10799
+ list.push((operationMeta) => operationMeta.options.outputOmitFields = fields);
10800
+ return decorator;
10801
+ };
10802
+ decorator.OutputOverwriteFields = (fields) => {
10803
+ list.push((operationMeta) => operationMeta.options.outputOverwriteFields = fields);
10731
10804
  return decorator;
10732
10805
  };
10733
10806
  return decorator;
@@ -10741,23 +10814,27 @@ Object.assign(CollectionDecorator, ResourceDecorator);
10741
10814
  const options = typeof arg0 === "string" ? { description: arg0 } : { ...arg0 };
10742
10815
  const decorator = createOperationDecorator("updateMany", options, list);
10743
10816
  decorator.InputMaxContentSize = (sizeInBytes) => {
10744
- list.push((operationMeta) => operationMeta.inputMaxContentSize = sizeInBytes);
10817
+ list.push((operationMeta) => operationMeta.options.inputMaxContentSize = sizeInBytes);
10745
10818
  return decorator;
10746
10819
  };
10747
10820
  decorator.InputPickFields = (...fields) => {
10748
- list.push((operationMeta) => operationMeta.inputPickFields = fields);
10821
+ list.push((operationMeta) => operationMeta.options.inputPickFields = fields);
10749
10822
  return decorator;
10750
10823
  };
10751
10824
  decorator.InputOmitFields = (...fields) => {
10752
- list.push((operationMeta) => operationMeta.inputOmitFields = fields);
10825
+ list.push((operationMeta) => operationMeta.options.inputOmitFields = fields);
10826
+ return decorator;
10827
+ };
10828
+ decorator.InputOverwriteFields = (fields) => {
10829
+ list.push((operationMeta) => operationMeta.options.inputOverwriteFields = fields);
10753
10830
  return decorator;
10754
10831
  };
10755
10832
  decorator.Filter = (field, operators, notes) => {
10756
10833
  if (typeof operators === "string")
10757
10834
  operators = operators.split(/\s*[,| ]\s*/);
10758
10835
  list.push((operationMeta) => {
10759
- operationMeta.filters = operationMeta.filters || [];
10760
- operationMeta.filters.push(omitUndefined({ field, operators, notes }));
10836
+ operationMeta.options.filters = operationMeta.options.filters || [];
10837
+ operationMeta.options.filters.push(omitUndefined({ field, operators, notes }));
10761
10838
  });
10762
10839
  return decorator;
10763
10840
  };
@@ -10799,14 +10876,18 @@ var SingletonClass = class extends CrudResource {
10799
10876
  endpoint.defineParameter("include", { type: "string", isArray: true, isBuiltin: true });
10800
10877
  endpoint.decodeInput = this.type.generateCodec("decode", {
10801
10878
  partial: true,
10802
- pick: endpoint.inputPickFields,
10803
- omit: endpoint.inputOmitFields
10879
+ pick: endpoint.options.inputPickFields,
10880
+ omit: endpoint.options.inputOmitFields,
10881
+ operation: "write",
10882
+ overwriteFields: endpoint.inputOverwriteFields
10804
10883
  });
10805
10884
  endpoint.returnType = this.type;
10806
10885
  endpoint.encodeReturning = endpoint.returnType.generateCodec("encode", {
10807
10886
  partial: true,
10808
- pick: endpoint.outputPickFields,
10809
- omit: endpoint.outputOmitFields
10887
+ pick: endpoint.options.outputPickFields,
10888
+ omit: endpoint.options.outputOmitFields,
10889
+ operation: "read",
10890
+ overwriteFields: endpoint.outputOverwriteFields
10810
10891
  });
10811
10892
  }
10812
10893
  endpoint = this.operations.get("get");
@@ -10817,8 +10898,10 @@ var SingletonClass = class extends CrudResource {
10817
10898
  endpoint.returnType = this.type;
10818
10899
  endpoint.encodeReturning = endpoint.returnType.generateCodec("encode", {
10819
10900
  partial: true,
10820
- pick: endpoint.outputPickFields,
10821
- omit: endpoint.outputOmitFields
10901
+ pick: endpoint.options.outputPickFields,
10902
+ omit: endpoint.options.outputOmitFields,
10903
+ operation: "read",
10904
+ overwriteFields: endpoint.outputOverwriteFields
10822
10905
  });
10823
10906
  }
10824
10907
  endpoint = this.operations.get("update");
@@ -10827,14 +10910,18 @@ var SingletonClass = class extends CrudResource {
10827
10910
  endpoint.defineParameter("omit", { type: "string", isArray: true, isBuiltin: true });
10828
10911
  endpoint.defineParameter("include", { type: "string", isArray: true, isBuiltin: true });
10829
10912
  endpoint.decodeInput = this.type.generateCodec("decode", {
10830
- pick: endpoint.inputPickFields,
10831
- omit: endpoint.inputOmitFields
10913
+ pick: endpoint.options.inputPickFields,
10914
+ omit: endpoint.options.inputOmitFields,
10915
+ operation: "write",
10916
+ overwriteFields: endpoint.inputOverwriteFields
10832
10917
  });
10833
10918
  endpoint.returnType = this.type;
10834
10919
  endpoint.encodeReturning = endpoint.returnType.generateCodec("encode", {
10835
10920
  partial: true,
10836
- pick: endpoint.outputPickFields,
10837
- omit: endpoint.outputOmitFields
10921
+ pick: endpoint.options.outputPickFields,
10922
+ omit: endpoint.options.outputOmitFields,
10923
+ operation: "read",
10924
+ overwriteFields: endpoint.outputOverwriteFields
10838
10925
  });
10839
10926
  }
10840
10927
  }
@@ -10957,27 +11044,27 @@ Object.assign(StorageDecorator, ResourceDecorator);
10957
11044
  const list = [];
10958
11045
  const decorator = createOperationDecorator("post", options, list);
10959
11046
  decorator.MaxFields = (amount) => {
10960
- list.push((operationMeta) => operationMeta.maxFields = amount);
11047
+ list.push((operationMeta) => operationMeta.options.maxFields = amount);
10961
11048
  return decorator;
10962
11049
  };
10963
11050
  decorator.MaxFieldSize = (amount) => {
10964
- list.push((operationMeta) => operationMeta.maxFieldsSize = amount);
11051
+ list.push((operationMeta) => operationMeta.options.maxFieldsSize = amount);
10965
11052
  return decorator;
10966
11053
  };
10967
11054
  decorator.MaxFiles = (amount) => {
10968
- list.push((operationMeta) => operationMeta.maxFiles = amount);
11055
+ list.push((operationMeta) => operationMeta.options.maxFiles = amount);
10969
11056
  return decorator;
10970
11057
  };
10971
11058
  decorator.MaxFileSize = (sizeInBytes) => {
10972
- list.push((operationMeta) => operationMeta.maxFileSize = sizeInBytes);
11059
+ list.push((operationMeta) => operationMeta.options.maxFileSize = sizeInBytes);
10973
11060
  return decorator;
10974
11061
  };
10975
11062
  decorator.MaxTotalFileSize = (sizeInBytes) => {
10976
- list.push((operationMeta) => operationMeta.maxTotalFileSize = sizeInBytes);
11063
+ list.push((operationMeta) => operationMeta.options.maxTotalFileSize = sizeInBytes);
10977
11064
  return decorator;
10978
11065
  };
10979
11066
  decorator.MinFileSize = (sizeInBytes) => {
10980
- list.push((operationMeta) => operationMeta.minFileSize = sizeInBytes);
11067
+ list.push((operationMeta) => operationMeta.options.minFileSize = sizeInBytes);
10981
11068
  return decorator;
10982
11069
  };
10983
11070
  return decorator;
@@ -11143,9 +11230,9 @@ var ApiDocumentFactory = class _ApiDocumentFactory extends TypeDocumentFactory {
11143
11230
  return;
11144
11231
  const output = {};
11145
11232
  for (const [kA, oA] of Object.entries(source)) {
11146
- let parameters;
11233
+ const o = output[kA] = { ...oA };
11147
11234
  if (oA.parameters) {
11148
- parameters = {};
11235
+ const parameters = o.parameters = {};
11149
11236
  for (const [kP, oP] of Object.entries(oA.parameters)) {
11150
11237
  if (oP.enum) {
11151
11238
  oP.type = EnumType2(oP.enum, { name: kP + "Enum" });
@@ -11156,7 +11243,30 @@ var ApiDocumentFactory = class _ApiDocumentFactory extends TypeDocumentFactory {
11156
11243
  };
11157
11244
  }
11158
11245
  }
11159
- output[kA] = { ...oA, parameters };
11246
+ if (oA.options?.inputOverwriteFields) {
11247
+ const inputOverwriteFields = {};
11248
+ for (const [kP, oP] of Object.entries(oA.options.inputOverwriteFields)) {
11249
+ if (oP.enum) {
11250
+ oP.type = EnumType2(oP.enum, { name: kP + "Enum" });
11251
+ }
11252
+ inputOverwriteFields[kP] = { ...oP };
11253
+ if (oP.type)
11254
+ inputOverwriteFields[kP].type = await this.importDataType(oP.type);
11255
+ }
11256
+ o.options.inputOverwriteFields = inputOverwriteFields;
11257
+ }
11258
+ if (oA.options?.outputOverwriteFields) {
11259
+ const outputOverwriteFields = {};
11260
+ for (const [kP, oP] of Object.entries(oA.options.outputOverwriteFields)) {
11261
+ if (oP.enum) {
11262
+ oP.type = EnumType2(oP.enum, { name: kP + "Enum" });
11263
+ }
11264
+ outputOverwriteFields[kP] = { ...oP };
11265
+ if (oP.type)
11266
+ outputOverwriteFields[kP].type = await this.importDataType(oP.type);
11267
+ }
11268
+ o.options.outputOverwriteFields = outputOverwriteFields;
11269
+ }
11160
11270
  }
11161
11271
  return output;
11162
11272
  }, "convertEndpoints");
@@ -11925,6 +12035,7 @@ export {
11925
12035
  Collection2 as Collection,
11926
12036
  ComplexType2 as ComplexType,
11927
12037
  Container2 as Container,
12038
+ CrudOperation,
11928
12039
  CrudResource,
11929
12040
  DATATYPE_METADATA,
11930
12041
  DECORATOR,
@@ -11946,7 +12057,6 @@ export {
11946
12057
  NotAcceptableError,
11947
12058
  NotFoundError,
11948
12059
  OmitType,
11949
- Operation,
11950
12060
  OperationResult,
11951
12061
  OpraException,
11952
12062
  opra_filter_ns_exports as OpraFilter,