vona-module-a-openapi 5.0.32 → 5.0.33

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.js CHANGED
@@ -1,6 +1,6 @@
1
1
  import { registerMappedClassMetadataKey, appMetadata, appResource, cast, deepExtend, BeanInfo, BeanBase, LocaleModuleNameSeparator, HttpStatus, BeanSimple, BeanScopeBase, useApp, beanFullNameFromOnionName } from 'vona';
2
2
  import * as ModuleInfo from '@cabloy/module-info';
3
- import { isClass, isEmptyObject, isNil } from '@cabloy/utils';
3
+ import { isEmptyObject, isClass, isNil } from '@cabloy/utils';
4
4
  import { toUpperCaseFirstChar } from '@cabloy/word-utils';
5
5
  import { getInnerTypeName, coerceWithNil } from '@cabloy/zod-query';
6
6
  import { OpenApiGeneratorV3, OpenApiGeneratorV31, OpenAPIRegistry } from '@cabloy/zod-to-openapi';
@@ -54,8 +54,6 @@ function getTargetDecoratorRuleColumnsMap(target) {
54
54
  return map;
55
55
  }
56
56
  function mergeFieldsOpenapiMetadata(target) {
57
- // rules
58
- const rules = getTargetDecoratorRules(target.prototype);
59
57
  // beanOptions
60
58
  const beanOptions = appResource.getBean(target);
61
59
  const fields = cast(beanOptions?.options)?.fields;
@@ -63,18 +61,36 @@ function mergeFieldsOpenapiMetadata(target) {
63
61
  for (const key in fields) {
64
62
  const field = fields[key];
65
63
  if (!field) continue;
66
- const schemaCurrent = rules[key];
67
- const metadataCurrent = schemaCurrent ? ZodMetadata.getOpenapiMetadata(schemaCurrent) : undefined;
68
- if (Object.prototype.hasOwnProperty.call(field, 'parseAsync')) {
69
- const schema = field;
64
+ mergeFieldOpenapiMetadata(target.prototype, key, field);
65
+ }
66
+ }
67
+
68
+ // fieldRule maybe undefined
69
+ function mergeFieldOpenapiMetadata(target, prop, fieldRule) {
70
+ // rules
71
+ const rules = getTargetDecoratorRules(target);
72
+ // rule
73
+ const schemaCurrent = rules[prop];
74
+ const metadataCurrent = schemaCurrent ? ZodMetadata.getOpenapiMetadata(schemaCurrent) : undefined;
75
+ // merge
76
+ if (Object.prototype.hasOwnProperty.call(fieldRule, 'parseAsync')) {
77
+ const schema = fieldRule;
78
+ if (isEmptyObject(metadataCurrent)) {
79
+ rules[prop] = schema;
80
+ } else {
70
81
  const metadataCustom = ZodMetadata.getOpenapiMetadata(schema);
71
- rules[key] = schema.openapi(deepExtend({}, metadataCurrent, metadataCustom));
82
+ rules[prop] = schema.openapi(deepExtend({}, metadataCurrent, metadataCustom));
83
+ }
84
+ } else {
85
+ if (schemaCurrent) {
86
+ if (!isEmptyObject(fieldRule)) {
87
+ rules[prop] = schemaCurrent.openapi(deepExtend({}, metadataCurrent, fieldRule));
88
+ }
72
89
  } else {
73
- // use deepExtend for sure strict
74
- if (schemaCurrent) {
75
- rules[key] = schemaCurrent.openapi(deepExtend({}, metadataCurrent, field));
90
+ if (isEmptyObject(fieldRule)) {
91
+ rules[prop] = z.any();
76
92
  } else {
77
- rules[key] = z.any().openapi(deepExtend({}, field));
93
+ rules[prop] = z.any().openapi(fieldRule);
78
94
  }
79
95
  }
80
96
  }
@@ -269,11 +285,13 @@ let ServiceOpenapi = (_dec$2 = Service(), _dec2$2 = BeanInfo({
269
285
  _translateSchema(schema, generateJsonScene) {
270
286
  if (!schema) return;
271
287
  if (schema.type === 'object' && schema.required === undefined) schema.required = [];
288
+ // schema
272
289
  this._translateStrings(schema, ['title', 'description']);
273
290
  if (generateJsonScene === 'api' && !schema.description && schema.title) {
274
291
  schema.description = schema.title;
275
292
  delete schema.title;
276
293
  }
294
+ // properties
277
295
  const properties = cast(schema).properties;
278
296
  if (properties && typeof properties === 'object') {
279
297
  for (const prop in properties) {
@@ -281,6 +299,11 @@ let ServiceOpenapi = (_dec$2 = Service(), _dec2$2 = BeanInfo({
281
299
  this._translateSchema(propObj, generateJsonScene);
282
300
  }
283
301
  }
302
+ // items
303
+ const items = cast(schema).items;
304
+ if (items && typeof items === 'object') {
305
+ this._translateSchema(items, generateJsonScene);
306
+ }
284
307
  }
285
308
  _translateStrings(obj, keys) {
286
309
  for (const key of keys) {
@@ -628,11 +651,9 @@ let ScopeModuleAOpenapi = (_dec = Scope(), _dec2 = BeanInfo({
628
651
 
629
652
  function Field(...schemaLikes) {
630
653
  return function (target, prop) {
631
- // rules
632
- const rules = getTargetDecoratorRules(target);
633
- // rule
634
654
  const metaType = appMetadata.getDesignType(target, prop);
635
- rules[prop] = makeSchemaLikes(schemaLikes, metaType);
655
+ const schema = makeSchemaLikes(schemaLikes, metaType);
656
+ mergeFieldOpenapiMetadata(target, prop, schema);
636
657
  };
637
658
  }
638
659
 
@@ -969,4 +990,4 @@ const OrderBusinessBase = 1000;
969
990
  const OrderUnknownBase = 10000;
970
991
  const OrderMaxBase = 100000;
971
992
 
972
- export { $schema, $schemaLazy, Api, Main, OrderBusinessBase, OrderCoreBase, OrderMaxBase, OrderUnknownBase, ScopeModuleAOpenapi, ServiceOpenapi, SummerCacheJson, SymbolRouteHandlersArgumentsMeta, SymbolRouteHandlersArgumentsValue, SymbolSchemaDynamicRefId, addSchemaDynamic, bodySchemaWrapperDefault, config, getSchemaDynamic, getSchemasDynamic, getTargetDecoratorRuleColumns, getTargetDecoratorRuleColumnsMap, getTargetDecoratorRules, makeSchemaLike, makeSchemaLikes, mergeFieldsOpenapiMetadata, prepareClassType, schemaRefCustomAdapter, v };
993
+ export { $schema, $schemaLazy, Api, Main, OrderBusinessBase, OrderCoreBase, OrderMaxBase, OrderUnknownBase, ScopeModuleAOpenapi, ServiceOpenapi, SummerCacheJson, SymbolRouteHandlersArgumentsMeta, SymbolRouteHandlersArgumentsValue, SymbolSchemaDynamicRefId, addSchemaDynamic, bodySchemaWrapperDefault, config, getSchemaDynamic, getSchemasDynamic, getTargetDecoratorRuleColumns, getTargetDecoratorRuleColumnsMap, getTargetDecoratorRules, makeSchemaLike, makeSchemaLikes, mergeFieldOpenapiMetadata, mergeFieldsOpenapiMetadata, prepareClassType, schemaRefCustomAdapter, v };
@@ -1,7 +1,10 @@
1
1
  import type { Constructable } from 'vona';
2
2
  import type { TypeDecoratorRules } from 'vona-module-a-openapiutils';
3
+ import type { TypeOpenapiMetadata } from '../types/rest.ts';
4
+ import { z } from 'zod';
3
5
  export declare function getTargetDecoratorRules(target: object, disableRegisterMetadata?: boolean): TypeDecoratorRules;
4
6
  export declare function getTargetDecoratorRuleColumns(target: object): string[];
5
7
  export declare function getTargetDecoratorRuleColumnsMap(target: object): Record<string, string>;
6
8
  export declare function mergeFieldsOpenapiMetadata(target: Constructable): void;
9
+ export declare function mergeFieldOpenapiMetadata(target: object, prop: string, fieldRule?: TypeOpenapiMetadata | z.ZodType): void;
7
10
  export declare function prepareClassType<T>(classType: (() => Constructable<T>) | Constructable<T>): Constructable<T>;
@@ -17,6 +17,7 @@ export interface ISchemaObjectExtensionFieldRest {
17
17
  form?: Omit<ISchemaObjectExtensionFieldRest, 'table' | 'form'>;
18
18
  }
19
19
  export interface ISchemaObjectExtensionField {
20
+ exclude?: boolean;
20
21
  rest?: ISchemaObjectExtensionFieldRest;
21
22
  query?: ISchemaObjectExtensionFieldQuery;
22
23
  captcha?: ISchemaObjectExtensionFieldCaptcha;
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "vona-module-a-openapi",
3
3
  "type": "module",
4
- "version": "5.0.32",
4
+ "version": "5.0.33",
5
5
  "title": "a-openapi",
6
6
  "vonaModule": {
7
7
  "capabilities": {