vona-module-a-openapi 5.0.72 → 5.1.2

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 (94) hide show
  1. package/LICENSE +0 -0
  2. package/dist/.metadata/index.d.ts +1 -0
  3. package/dist/.metadata/index.d.ts.map +1 -0
  4. package/dist/.metadata/this.d.ts +1 -0
  5. package/dist/.metadata/this.d.ts.map +1 -0
  6. package/dist/bean/bean.openapi.d.ts +1 -0
  7. package/dist/bean/bean.openapi.d.ts.map +1 -0
  8. package/dist/bean/summerCache.json.d.ts +1 -0
  9. package/dist/bean/summerCache.json.d.ts.map +1 -0
  10. package/dist/config/config.d.ts +1 -0
  11. package/dist/config/config.d.ts.map +1 -0
  12. package/dist/index.d.ts +1 -0
  13. package/dist/index.d.ts.map +1 -0
  14. package/dist/index.js +1 -0
  15. package/dist/index.js.map +1 -0
  16. package/dist/lib/index.d.ts +1 -0
  17. package/dist/lib/index.d.ts.map +1 -0
  18. package/dist/lib/zod/index.d.ts +1 -0
  19. package/dist/lib/zod/index.d.ts.map +1 -0
  20. package/dist/lib/zod/schemaRefCustomAdapter.d.ts +1 -0
  21. package/dist/lib/zod/schemaRefCustomAdapter.d.ts.map +1 -0
  22. package/dist/main.d.ts +1 -0
  23. package/dist/main.d.ts.map +1 -0
  24. package/dist/service/openapi.d.ts +1 -0
  25. package/dist/service/openapi.d.ts.map +1 -0
  26. package/dist/types/actions.d.ts +1 -0
  27. package/dist/types/actions.d.ts.map +1 -0
  28. package/dist/types/behavior.d.ts +1 -0
  29. package/dist/types/behavior.d.ts.map +1 -0
  30. package/dist/types/captcha.d.ts +3 -2
  31. package/dist/types/captcha.d.ts.map +1 -0
  32. package/dist/types/component.d.ts +1 -0
  33. package/dist/types/component.d.ts.map +1 -0
  34. package/dist/types/date.d.ts +1 -0
  35. package/dist/types/date.d.ts.map +1 -0
  36. package/dist/types/decorator.d.ts +1 -0
  37. package/dist/types/decorator.d.ts.map +1 -0
  38. package/dist/types/formProvider.d.ts +1 -0
  39. package/dist/types/formProvider.d.ts.map +1 -0
  40. package/dist/types/index.d.ts +6 -0
  41. package/dist/types/index.d.ts.map +1 -0
  42. package/dist/types/openapi.d.ts +1 -0
  43. package/dist/types/openapi.d.ts.map +1 -0
  44. package/dist/types/permissions.d.ts +1 -0
  45. package/dist/types/permissions.d.ts.map +1 -0
  46. package/dist/types/resource.d.ts +1 -0
  47. package/dist/types/resource.d.ts.map +1 -0
  48. package/dist/types/resourceMeta.d.ts +1 -0
  49. package/dist/types/resourceMeta.d.ts.map +1 -0
  50. package/dist/types/resourcePicker.d.ts +11 -0
  51. package/dist/types/resourcePicker.d.ts.map +1 -0
  52. package/dist/types/rest.d.ts +18 -7
  53. package/dist/types/rest.d.ts.map +1 -0
  54. package/dist/types/select.d.ts +16 -0
  55. package/dist/types/select.d.ts.map +1 -0
  56. package/dist/types/table.d.ts +23 -0
  57. package/dist/types/table.d.ts.map +1 -0
  58. package/dist/types/tableProvider.d.ts +1 -0
  59. package/dist/types/tableProvider.d.ts.map +1 -0
  60. package/dist/types/textarea.d.ts +11 -0
  61. package/dist/types/textarea.d.ts.map +1 -0
  62. package/dist/types/toggle.d.ts +4 -0
  63. package/dist/types/toggle.d.ts.map +1 -0
  64. package/package.json +33 -29
  65. package/src/.metadata/index.ts +139 -0
  66. package/src/.metadata/this.ts +2 -0
  67. package/src/bean/bean.openapi.ts +84 -0
  68. package/src/bean/summerCache.json.ts +17 -0
  69. package/src/config/config.ts +35 -0
  70. package/src/index.ts +3 -0
  71. package/src/lib/index.ts +1 -0
  72. package/src/lib/zod/index.ts +1 -0
  73. package/src/lib/zod/schemaRefCustomAdapter.ts +29 -0
  74. package/src/main.ts +14 -0
  75. package/src/service/openapi.ts +400 -0
  76. package/src/types/actions.ts +18 -0
  77. package/src/types/behavior.ts +11 -0
  78. package/src/types/captcha.ts +5 -0
  79. package/src/types/component.ts +14 -0
  80. package/src/types/date.ts +25 -0
  81. package/src/types/decorator.ts +45 -0
  82. package/src/types/formProvider.ts +21 -0
  83. package/src/types/index.ts +20 -0
  84. package/src/types/openapi.ts +7 -0
  85. package/src/types/permissions.ts +18 -0
  86. package/src/types/resource.ts +1 -0
  87. package/src/types/resourceMeta.ts +38 -0
  88. package/src/types/resourcePicker.ts +11 -0
  89. package/src/types/rest.ts +133 -0
  90. package/src/types/select.ts +16 -0
  91. package/src/types/table.ts +27 -0
  92. package/src/types/tableProvider.ts +10 -0
  93. package/src/types/textarea.ts +10 -0
  94. package/src/types/toggle.ts +3 -0
@@ -0,0 +1,139 @@
1
+ // eslint-disable
2
+ /** bean: begin */
3
+ export * from '../bean/bean.openapi.ts';
4
+
5
+ import 'vona';
6
+ declare module 'vona' {
7
+
8
+
9
+ }
10
+ declare module 'vona-module-a-openapi' {
11
+
12
+ export interface BeanOpenapi {
13
+ /** @internal */
14
+ get scope(): ScopeModuleAOpenapi;
15
+ }
16
+ }
17
+ /** bean: end */
18
+ /** bean: begin */
19
+ import type { BeanOpenapi } from '../bean/bean.openapi.ts';
20
+ import 'vona';
21
+ declare module 'vona' {
22
+ export interface IBeanRecordGlobal {
23
+ 'openapi': BeanOpenapi;
24
+ }
25
+ }
26
+ /** bean: end */
27
+ /** service: begin */
28
+ export * from '../service/openapi.ts';
29
+
30
+ import 'vona-module-a-bean';
31
+ declare module 'vona-module-a-bean' {
32
+
33
+ export interface IServiceRecord {
34
+ 'a-openapi:openapi': never;
35
+ }
36
+
37
+
38
+ }
39
+ declare module 'vona-module-a-openapi' {
40
+
41
+ export interface ServiceOpenapi {
42
+ /** @internal */
43
+ get scope(): ScopeModuleAOpenapi;
44
+ }
45
+
46
+ export interface ServiceOpenapi {
47
+ get $beanFullName(): 'a-openapi.service.openapi';
48
+ get $onionName(): 'a-openapi:openapi';
49
+
50
+ }
51
+ }
52
+ /** service: end */
53
+ /** service: begin */
54
+ import type { ServiceOpenapi } from '../service/openapi.ts';
55
+ export interface IModuleService {
56
+ 'openapi': ServiceOpenapi;
57
+ }
58
+ /** service: end */
59
+ /** service: begin */
60
+
61
+ import 'vona';
62
+ declare module 'vona' {
63
+ export interface IBeanRecordGeneral {
64
+ 'a-openapi.service.openapi': ServiceOpenapi;
65
+ }
66
+ }
67
+ /** service: end */
68
+ /** summerCache: begin */
69
+ export * from '../bean/summerCache.json.ts';
70
+
71
+ import { type IDecoratorSummerCacheOptions } from 'vona-module-a-summer';
72
+ declare module 'vona-module-a-summer' {
73
+
74
+ export interface ISummerCacheRecord {
75
+ 'a-openapi:json': IDecoratorSummerCacheOptions;
76
+ }
77
+
78
+
79
+ }
80
+ declare module 'vona-module-a-openapi' {
81
+
82
+ export interface SummerCacheJson {
83
+ /** @internal */
84
+ get scope(): ScopeModuleAOpenapi;
85
+ }
86
+
87
+ export interface SummerCacheJson {
88
+ get $beanFullName(): 'a-openapi.summerCache.json';
89
+ get $onionName(): 'a-openapi:json';
90
+ get $onionOptions(): IDecoratorSummerCacheOptions;
91
+ }
92
+ }
93
+ /** summerCache: end */
94
+ /** summerCache: begin */
95
+ import type { SummerCacheJson } from '../bean/summerCache.json.ts';
96
+ export interface IModuleSummerCache {
97
+ 'json': SummerCacheJson;
98
+ }
99
+ /** summerCache: end */
100
+ /** config: begin */
101
+ export * from '../config/config.ts';
102
+ import type { config } from '../config/config.ts';
103
+ /** config: end */
104
+ /** main: begin */
105
+ export * from '../main.ts';
106
+ /** main: end */
107
+ /** scope: begin */
108
+ import { BeanScopeBase, type BeanScopeUtil, type TypeModuleConfig } from 'vona';
109
+ import { Scope } from 'vona-module-a-bean';
110
+
111
+ @Scope()
112
+ export class ScopeModuleAOpenapi extends BeanScopeBase {}
113
+
114
+ export interface ScopeModuleAOpenapi {
115
+ util: BeanScopeUtil;
116
+ config: TypeModuleConfig<typeof config>;
117
+ service: IModuleService;
118
+ summerCache: IModuleSummerCache;
119
+ }
120
+
121
+ import 'vona';
122
+ declare module 'vona' {
123
+ export interface IBeanScopeRecord {
124
+ 'a-openapi': ScopeModuleAOpenapi;
125
+ }
126
+
127
+ export interface IBeanScopeContainer {
128
+ openapi: ScopeModuleAOpenapi;
129
+ }
130
+
131
+ export interface IBeanScopeConfig {
132
+ 'a-openapi': ReturnType<typeof config>;
133
+ }
134
+
135
+
136
+
137
+
138
+ }
139
+ /** scope: end */
@@ -0,0 +1,2 @@
1
+ export const __ThisModule__ = 'a-openapi';
2
+ export { ScopeModuleAOpenapi as ScopeModule } from './index.ts';
@@ -0,0 +1,84 @@
1
+ import type { Constructable } from 'vona';
2
+ import type { ICachingActionKeyInfo } from 'vona-module-a-caching';
3
+ import type { IOpenapiObject } from 'vona-module-a-openapiutils';
4
+
5
+ import { OpenApiGeneratorV3, OpenApiGeneratorV31, OpenAPIRegistry } from '@cabloy/zod-to-openapi';
6
+ import { appResource, BeanBase, beanFullNameFromOnionName } from 'vona';
7
+ import { Bean } from 'vona-module-a-bean';
8
+ import { Caching } from 'vona-module-a-caching';
9
+ import { $schema } from 'vona-module-a-openapiutils';
10
+
11
+ @Bean()
12
+ export class BeanOpenapi extends BeanBase {
13
+ public async clearAllCaches() {
14
+ const cacheOpenapiSchema = this.bean.summer.cache(beanFullNameFromOnionName('a-openapi:json', 'summerCache'));
15
+ await cacheOpenapiSchema.clear();
16
+ const cacheSwagger = this.bean.summer.cache(beanFullNameFromOnionName('a-swagger:swagger', 'summerCache'));
17
+ await cacheSwagger.clear();
18
+ const cacheRapidoc = this.bean.summer.cache(beanFullNameFromOnionName('a-swagger:rapidoc', 'summerCache'));
19
+ await cacheRapidoc.clear();
20
+ }
21
+
22
+ // need not cache
23
+ async generateJsonOfClass<K extends keyof IOpenapiObject>(schemaClass: Constructable, version: K = 'V31' as any): Promise<IOpenapiObject[K]> {
24
+ return await this.generateJsonOfClasses([schemaClass], version);
25
+ }
26
+
27
+ // need not cache
28
+ async generateJsonOfClasses<K extends keyof IOpenapiObject>(schemaClasses: Constructable[], version: K = 'V31' as any): Promise<IOpenapiObject[K]> {
29
+ const registry = new OpenAPIRegistry();
30
+ // schema: independent
31
+ let counter = 0;
32
+ for (const schemaClass of schemaClasses) {
33
+ const schema = $schema(schemaClass);
34
+ let beanFullName = appResource.getBeanFullName(schemaClass);
35
+ if (!beanFullName) {
36
+ beanFullName = `${schemaClass.name}_${counter++}`;
37
+ }
38
+ registry.register(beanFullName, schema);
39
+ }
40
+ const generator = version === 'V30' ? new OpenApiGeneratorV3(registry.definitions) : new OpenApiGeneratorV31(registry.definitions);
41
+ const apiObj = generator.generateDocument(this.scope.config.generateDocument[version]);
42
+ this.scope.service.openapi.translate(apiObj, 'rest');
43
+ return apiObj as IOpenapiObject[K];
44
+ }
45
+
46
+ protected generateJsonCacheKey(info: ICachingActionKeyInfo) {
47
+ const version = info.args[0] ?? 'V31';
48
+ const locale = this.ctx.locale;
49
+ return `${info.prop}_${version}_${locale}`;
50
+ }
51
+
52
+ protected generateJsonOfControllerActionCacheKey(info: ICachingActionKeyInfo) {
53
+ const [controller, actionKey, version] = info.args;
54
+ const beanOptions = appResource.getBean(controller)!;
55
+ const beanFullName = beanOptions.beanFullName;
56
+ const locale = this.ctx.locale;
57
+ return `${info.prop}_${beanFullName}_${actionKey}_${version ?? 'V31'}_${locale}`;
58
+ }
59
+
60
+ @Caching.get({ cacheName: 'a-openapi:json', cacheKeyFn: 'generateJsonCacheKey' })
61
+ async generateJson<K extends keyof IOpenapiObject>(version: K = 'V31' as any): Promise<IOpenapiObject[K]> {
62
+ const registry = this.scope.service.openapi.collectRegistry();
63
+ const generator = version === 'V30' ? new OpenApiGeneratorV3(registry.definitions) : new OpenApiGeneratorV31(registry.definitions);
64
+ const apiObj = generator.generateDocument(this.scope.config.generateDocument[version]);
65
+ this.scope.service.openapi.translate(apiObj, 'api');
66
+ return apiObj as IOpenapiObject[K];
67
+ }
68
+
69
+ @Caching.get({ cacheName: 'a-openapi:json', cacheKeyFn: 'generateJsonOfControllerActionCacheKey' })
70
+ async generateJsonOfControllerAction<K extends keyof IOpenapiObject>(
71
+ controller: Constructable,
72
+ actionKey: string,
73
+ version: K = 'V31' as any,
74
+ ): Promise<IOpenapiObject[K]> {
75
+ const registry = new OpenAPIRegistry();
76
+ const beanOptions = appResource.getBean(controller);
77
+ if (!beanOptions) throw new Error('invalid controller');
78
+ this.scope.service.openapi.collectController(registry, beanOptions.module, controller, actionKey);
79
+ const generator = version === 'V30' ? new OpenApiGeneratorV3(registry.definitions) : new OpenApiGeneratorV31(registry.definitions);
80
+ const apiObj = generator.generateDocument(this.scope.config.generateDocument[version]);
81
+ this.scope.service.openapi.translate(apiObj, 'rest');
82
+ return apiObj as IOpenapiObject[K];
83
+ }
84
+ }
@@ -0,0 +1,17 @@
1
+ import type { ISummerCacheGet, TSummerCacheActionOptions } from 'vona-module-a-summer';
2
+
3
+ import { BeanSummerCacheBase, SummerCache } from 'vona-module-a-summer';
4
+
5
+ export type TSummerCacheJsonKey = any;
6
+ export type TSummerCacheJsonData = any;
7
+
8
+ @SummerCache({ preset: 'mem' })
9
+ export class SummerCacheJson
10
+ extends BeanSummerCacheBase<TSummerCacheJsonKey, TSummerCacheJsonData>
11
+ implements ISummerCacheGet<TSummerCacheJsonKey, TSummerCacheJsonData>
12
+ {
13
+ async getNative(
14
+ _key?: TSummerCacheJsonKey,
15
+ _options?: TSummerCacheActionOptions<TSummerCacheJsonKey, TSummerCacheJsonData>,
16
+ ): Promise<TSummerCacheJsonData | undefined> {}
17
+ }
@@ -0,0 +1,35 @@
1
+ import type { OpenAPIObjectConfig as OpenAPIObjectConfigV30 } from '@cabloy/zod-to-openapi/dist/v3.0/openapi-generator.ts';
2
+ import type { OpenAPIObjectConfigV31 } from '@cabloy/zod-to-openapi/dist/v3.1/openapi-generator.ts';
3
+ import type { VonaApplication } from 'vona';
4
+ import type { TypeOpenApiVersion, TypeSecuritySchemes } from 'vona-module-a-openapiutils';
5
+
6
+ export function config(_app: VonaApplication) {
7
+ return {
8
+ defaultVersion: 'V31' as TypeOpenApiVersion,
9
+ generateDocument: {
10
+ V30: {
11
+ openapi: '3.0.0',
12
+ info: {
13
+ version: '5.0.0',
14
+ title: 'Vona',
15
+ description: 'Vona API',
16
+ },
17
+ } as OpenAPIObjectConfigV30,
18
+ V31: {
19
+ openapi: '3.1.0',
20
+ info: {
21
+ version: '5.0.0',
22
+ title: 'Vona',
23
+ description: 'Vona API',
24
+ },
25
+ } as OpenAPIObjectConfigV31,
26
+ },
27
+ securitySchemes: {
28
+ bearerAuth: {
29
+ type: 'http',
30
+ scheme: 'bearer',
31
+ bearerFormat: 'JWT',
32
+ },
33
+ } as TypeSecuritySchemes,
34
+ };
35
+ }
package/src/index.ts ADDED
@@ -0,0 +1,3 @@
1
+ export * from './.metadata/index.ts';
2
+ export * from './lib/index.ts';
3
+ export * from './types/index.ts';
@@ -0,0 +1 @@
1
+ export * from './zod/index.ts';
@@ -0,0 +1 @@
1
+ export * from './schemaRefCustomAdapter.ts';
@@ -0,0 +1,29 @@
1
+ import type { VonaApplication } from 'vona';
2
+
3
+ import { ZodMetadata } from '@cabloy/zod-openapi';
4
+ import { OpenApiGeneratorV31, OpenAPIRegistry } from '@cabloy/zod-to-openapi';
5
+ import { cast } from 'vona';
6
+
7
+ export function schemaRefCustomAdapter(_app: VonaApplication) {
8
+ const registry = new OpenAPIRegistry();
9
+ const generator31 = new OpenApiGeneratorV31(registry.definitions);
10
+ _patchGenerator(generator31);
11
+ }
12
+
13
+ function _patchGenerator(generator: any) {
14
+ const gen = Object.getPrototypeOf(cast(generator).generator);
15
+ gen.generateSchemaWithRef = function (zodSchema) {
16
+ // schema ref
17
+ zodSchema = ZodMetadata.resolveLazySchema(zodSchema);
18
+ const refId = ZodMetadata.getRefId(zodSchema);
19
+ if (!refId) {
20
+ return this.generateSimpleSchema(zodSchema);
21
+ }
22
+ if (this.schemaRefs[refId] === undefined) {
23
+ this.schemaRefs[refId] = null;
24
+ const result = this.generateSimpleSchema(zodSchema);
25
+ this.schemaRefs[refId] = result;
26
+ }
27
+ return { $ref: this.generateSchemaRef(refId) };
28
+ };
29
+ }
package/src/main.ts ADDED
@@ -0,0 +1,14 @@
1
+ import type { IModuleMain } from 'vona';
2
+
3
+ import { BeanSimple } from 'vona';
4
+
5
+ import { schemaRefCustomAdapter } from './lib/zod/schemaRefCustomAdapter.ts';
6
+
7
+ export class Main extends BeanSimple implements IModuleMain {
8
+ async moduleLoading() {}
9
+ async moduleLoaded() {
10
+ schemaRefCustomAdapter(this.app);
11
+ }
12
+
13
+ async configLoaded(_config: any) {}
14
+ }