@skmtc/core 0.0.782 → 0.0.785
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/esm/context/CoreContext.d.ts +175 -0
- package/esm/context/CoreContext.d.ts.map +1 -1
- package/esm/context/CoreContext.js +178 -0
- package/esm/dsl/ContentBase.d.ts +115 -0
- package/esm/dsl/ContentBase.d.ts.map +1 -1
- package/esm/dsl/ContentBase.js +110 -0
- package/esm/dsl/File.d.ts +208 -0
- package/esm/dsl/File.d.ts.map +1 -1
- package/esm/dsl/File.js +197 -0
- package/esm/dsl/model/ModelBase.d.ts +257 -0
- package/esm/dsl/model/ModelBase.d.ts.map +1 -1
- package/esm/dsl/model/ModelBase.js +248 -0
- package/esm/dsl/operation/OperationBase.d.ts +175 -0
- package/esm/dsl/operation/OperationBase.d.ts.map +1 -1
- package/esm/dsl/operation/OperationBase.js +166 -0
- package/esm/helpers/strings.d.ts +63 -0
- package/esm/helpers/strings.d.ts.map +1 -1
- package/esm/helpers/strings.js +59 -0
- package/esm/mod.d.ts +66 -0
- package/esm/mod.d.ts.map +1 -1
- package/esm/mod.js +66 -0
- package/esm/run/toArtifacts.d.ts +114 -0
- package/esm/run/toArtifacts.d.ts.map +1 -1
- package/esm/run/toArtifacts.js +86 -0
- package/esm/types/Settings.d.ts +129 -0
- package/esm/types/Settings.d.ts.map +1 -1
- package/esm/types/Settings.js +3 -0
- package/esm/typescript/List.d.ts +111 -0
- package/esm/typescript/List.d.ts.map +1 -1
- package/esm/typescript/List.js +106 -0
- package/package.json +5 -1
- package/script/context/CoreContext.d.ts +175 -0
- package/script/context/CoreContext.d.ts.map +1 -1
- package/script/context/CoreContext.js +178 -0
- package/script/dsl/ContentBase.d.ts +115 -0
- package/script/dsl/ContentBase.d.ts.map +1 -1
- package/script/dsl/ContentBase.js +110 -0
- package/script/dsl/File.d.ts +208 -0
- package/script/dsl/File.d.ts.map +1 -1
- package/script/dsl/File.js +197 -0
- package/script/dsl/model/ModelBase.d.ts +257 -0
- package/script/dsl/model/ModelBase.d.ts.map +1 -1
- package/script/dsl/model/ModelBase.js +248 -0
- package/script/dsl/operation/OperationBase.d.ts +175 -0
- package/script/dsl/operation/OperationBase.d.ts.map +1 -1
- package/script/dsl/operation/OperationBase.js +166 -0
- package/script/helpers/strings.d.ts +63 -0
- package/script/helpers/strings.d.ts.map +1 -1
- package/script/helpers/strings.js +59 -0
- package/script/mod.d.ts +66 -0
- package/script/mod.d.ts.map +1 -1
- package/script/mod.js +66 -0
- package/script/run/toArtifacts.d.ts +114 -0
- package/script/run/toArtifacts.d.ts.map +1 -1
- package/script/run/toArtifacts.js +86 -0
- package/script/types/Settings.d.ts +129 -0
- package/script/types/Settings.d.ts.map +1 -1
- package/script/types/Settings.js +3 -0
- package/script/typescript/List.d.ts +111 -0
- package/script/typescript/List.d.ts.map +1 -1
- package/script/typescript/List.js +106 -0
|
@@ -12,17 +12,192 @@ import type { RefName } from '../../types/RefName.js';
|
|
|
12
12
|
import { OasSchema } from '../../oas/schema/Schema.js';
|
|
13
13
|
import { OasRef } from '../../oas/ref/Ref.js';
|
|
14
14
|
import { OasVoid } from '../../oas/void/Void.js';
|
|
15
|
+
/**
|
|
16
|
+
* Constructor arguments for {@link OperationBase}.
|
|
17
|
+
*
|
|
18
|
+
* @template EnrichmentType - Optional type for custom enrichment data
|
|
19
|
+
*/
|
|
15
20
|
export type OperationBaseArgs<EnrichmentType = undefined> = {
|
|
21
|
+
/** The generation context providing access to the processing pipeline */
|
|
16
22
|
context: GenerateContext;
|
|
23
|
+
/** Content settings including export path and enrichment configuration */
|
|
17
24
|
settings: ContentSettings<EnrichmentType>;
|
|
25
|
+
/** Unique identifier for this generator type */
|
|
18
26
|
generatorKey: GeneratorKey;
|
|
27
|
+
/** The OpenAPI operation being processed */
|
|
19
28
|
operation: OasOperation;
|
|
20
29
|
};
|
|
30
|
+
/**
|
|
31
|
+
* Base class for operation generators in the SKMTC DSL system.
|
|
32
|
+
*
|
|
33
|
+
* `OperationBase` extends {@link ContentBase} to provide specialized functionality for
|
|
34
|
+
* generating code from OpenAPI operations. It offers type-safe methods for inserting
|
|
35
|
+
* related operations and models, managing complex operation dependencies, and handling
|
|
36
|
+
* enrichments specific to API operations.
|
|
37
|
+
*
|
|
38
|
+
* This class serves as the foundation for creating custom operation generators that
|
|
39
|
+
* transform OpenAPI operations into various code artifacts like API clients, server
|
|
40
|
+
* handlers, validation middleware, or documentation.
|
|
41
|
+
*
|
|
42
|
+
* ## Key Features
|
|
43
|
+
*
|
|
44
|
+
* - **Operation Insertion**: Insert related operations with automatic dependency tracking
|
|
45
|
+
* - **Model Integration**: Seamlessly insert related models from operation schemas
|
|
46
|
+
* - **Schema Normalization**: Handle complex request/response schema references
|
|
47
|
+
* - **Export Management**: Control which operations are exported from generated files
|
|
48
|
+
* - **Enrichment Support**: Extend functionality with operation-specific enrichment data
|
|
49
|
+
* - **Type Safety**: Full TypeScript support with generic enrichment types
|
|
50
|
+
*
|
|
51
|
+
* @template EnrichmentType - Optional type for custom enrichment data
|
|
52
|
+
*
|
|
53
|
+
* @example Basic API client generator
|
|
54
|
+
* ```typescript
|
|
55
|
+
* import { OperationBase, Definition } from '@skmtc/core';
|
|
56
|
+
*
|
|
57
|
+
* class ApiClientMethod extends OperationBase {
|
|
58
|
+
* toDefinition(): Definition {
|
|
59
|
+
* const { method, path, operationId } = this.operation;
|
|
60
|
+
*
|
|
61
|
+
* return new Definition({
|
|
62
|
+
* name: operationId || `${method}${this.pascalCasePath()}`,
|
|
63
|
+
* content: `async ${operationId}(${this.generateParameters()}) {
|
|
64
|
+
* return this.request('${method}', '${path}', ${this.generateRequestBody()});
|
|
65
|
+
* }`
|
|
66
|
+
* });
|
|
67
|
+
* }
|
|
68
|
+
* }
|
|
69
|
+
* ```
|
|
70
|
+
*
|
|
71
|
+
* @example With request/response models
|
|
72
|
+
* ```typescript
|
|
73
|
+
* class TypedApiMethod extends OperationBase {
|
|
74
|
+
* toDefinition(): Definition {
|
|
75
|
+
* const operation = this.operation;
|
|
76
|
+
*
|
|
77
|
+
* // Generate request model if needed
|
|
78
|
+
* let requestType = 'void';
|
|
79
|
+
* if (operation.requestBody?.content?.['application/json']?.schema) {
|
|
80
|
+
* const requestModel = this.insertNormalizedModel(
|
|
81
|
+
* new RequestModel({ ... }),
|
|
82
|
+
* {
|
|
83
|
+
* schema: operation.requestBody.content['application/json'].schema,
|
|
84
|
+
* fallbackName: `${operation.operationId}Request`
|
|
85
|
+
* }
|
|
86
|
+
* );
|
|
87
|
+
* requestType = requestModel.value;
|
|
88
|
+
* }
|
|
89
|
+
*
|
|
90
|
+
* // Generate response model
|
|
91
|
+
* const responseSchema = operation.responses?.['200']?.content?.['application/json']?.schema;
|
|
92
|
+
* const responseModel = this.insertNormalizedModel(
|
|
93
|
+
* new ResponseModel({ ... }),
|
|
94
|
+
* { schema: responseSchema, fallbackName: `${operation.operationId}Response` }
|
|
95
|
+
* );
|
|
96
|
+
*
|
|
97
|
+
* return new Definition({
|
|
98
|
+
* name: operation.operationId,
|
|
99
|
+
* content: `async ${operation.operationId}(data: ${requestType}): Promise<${responseModel.value}> {
|
|
100
|
+
* return this.request('${operation.method}', '${operation.path}', data);
|
|
101
|
+
* }`
|
|
102
|
+
* });
|
|
103
|
+
* }
|
|
104
|
+
* }
|
|
105
|
+
* ```
|
|
106
|
+
*
|
|
107
|
+
* @example With enrichments
|
|
108
|
+
* ```typescript
|
|
109
|
+
* type AuthEnrichment = {
|
|
110
|
+
* requiresAuth: boolean;
|
|
111
|
+
* permissions: string[];
|
|
112
|
+
* };
|
|
113
|
+
*
|
|
114
|
+
* class SecuredApiMethod extends OperationBase<AuthEnrichment> {
|
|
115
|
+
* toDefinition(): Definition {
|
|
116
|
+
* const enrichment = this.settings.enrichment;
|
|
117
|
+
* const requiresAuth = enrichment?.requiresAuth ?? false;
|
|
118
|
+
*
|
|
119
|
+
* const authCheck = requiresAuth
|
|
120
|
+
* ? 'this.checkAuth();'
|
|
121
|
+
* : '';
|
|
122
|
+
*
|
|
123
|
+
* return new Definition({
|
|
124
|
+
* name: this.operation.operationId,
|
|
125
|
+
* content: `async ${this.operation.operationId}() {
|
|
126
|
+
* ${authCheck}
|
|
127
|
+
* return this.request('${this.operation.method}', '${this.operation.path}');
|
|
128
|
+
* }`
|
|
129
|
+
* });
|
|
130
|
+
* }
|
|
131
|
+
* }
|
|
132
|
+
* ```
|
|
133
|
+
*/
|
|
21
134
|
export declare class OperationBase<EnrichmentType = undefined> extends ContentBase {
|
|
135
|
+
/** Content settings including export path and enrichment configuration */
|
|
22
136
|
settings: ContentSettings<EnrichmentType>;
|
|
137
|
+
/** The OpenAPI operation being processed */
|
|
23
138
|
operation: OasOperation;
|
|
139
|
+
/** Generator key identifying this generator type */
|
|
24
140
|
generatorKey: GeneratorKey;
|
|
141
|
+
/**
|
|
142
|
+
* Creates a new OperationBase instance.
|
|
143
|
+
*
|
|
144
|
+
* @param args - Operation generator configuration
|
|
145
|
+
* @param args.context - The generation context providing pipeline access
|
|
146
|
+
* @param args.settings - Content settings with export path and enrichments
|
|
147
|
+
* @param args.generatorKey - Unique identifier for this generator type
|
|
148
|
+
* @param args.operation - The OpenAPI operation being processed
|
|
149
|
+
*
|
|
150
|
+
* @example
|
|
151
|
+
* ```typescript
|
|
152
|
+
* const operation = new OperationBase({
|
|
153
|
+
* context: generateContext,
|
|
154
|
+
* settings: {
|
|
155
|
+
* exportPath: './src/api.ts',
|
|
156
|
+
* enrichment: customEnrichments
|
|
157
|
+
* },
|
|
158
|
+
* generatorKey: 'api-client',
|
|
159
|
+
* operation: oasOperation
|
|
160
|
+
* });
|
|
161
|
+
* ```
|
|
162
|
+
*/
|
|
25
163
|
constructor({ context, generatorKey, settings, operation }: OperationBaseArgs<EnrichmentType>);
|
|
164
|
+
/**
|
|
165
|
+
* Inserts a related operation with forced generation.
|
|
166
|
+
*
|
|
167
|
+
* This method adds a related operation to the current generation context, ensuring
|
|
168
|
+
* it will be generated regardless of whether it already exists. This is useful for
|
|
169
|
+
* operations that depend on other operations or need to generate helper operations.
|
|
170
|
+
*
|
|
171
|
+
* @template V - Type of generated value returned by the insertable
|
|
172
|
+
* @template EnrichmentType - Type of enrichment data for the insertable
|
|
173
|
+
* @param insertable - The operation generator to insert
|
|
174
|
+
* @param operation - The OpenAPI operation to process
|
|
175
|
+
* @param options - Insertion options
|
|
176
|
+
* @param options.noExport - Whether to skip exporting the inserted operation
|
|
177
|
+
* @returns Inserted operation reference with generated value
|
|
178
|
+
*
|
|
179
|
+
* @example Inserting helper operations
|
|
180
|
+
* ```typescript
|
|
181
|
+
* class CrudApiClient extends OperationBase {
|
|
182
|
+
* toDefinition(): Definition {
|
|
183
|
+
* // Insert a related validation operation
|
|
184
|
+
* const validator = this.insertOperation(
|
|
185
|
+
* new ValidationOperation({ ... }),
|
|
186
|
+
* this.operation,
|
|
187
|
+
* { noExport: true }
|
|
188
|
+
* );
|
|
189
|
+
*
|
|
190
|
+
* return new Definition({
|
|
191
|
+
* name: this.operation.operationId,
|
|
192
|
+
* content: `async ${this.operation.operationId}(data: any) {
|
|
193
|
+
* ${validator.value}(data);
|
|
194
|
+
* return this.request('${this.operation.method}', '${this.operation.path}', data);
|
|
195
|
+
* }`
|
|
196
|
+
* });
|
|
197
|
+
* }
|
|
198
|
+
* }
|
|
199
|
+
* ```
|
|
200
|
+
*/
|
|
26
201
|
insertOperation<V extends GeneratedValue, EnrichmentType = undefined>(insertable: OperationInsertable<V, EnrichmentType>, operation: OasOperation, options?: Pick<InsertOperationOptions<'force'>, 'noExport'>): Inserted<V, 'force', EnrichmentType>;
|
|
27
202
|
insertModel<V extends GeneratedValue, EnrichmentType = undefined>(insertable: ModelInsertable<V, EnrichmentType>, refName: RefName, options?: Pick<InsertModelOptions<'force'>, 'noExport'>): Inserted<V, 'force', EnrichmentType>;
|
|
28
203
|
insertNormalizedModel<V extends GeneratedValue, Schema extends OasSchema | OasRef<'schema'> | OasVoid, EnrichmentType = undefined>(insertable: ModelInsertable<V, EnrichmentType>, { schema, fallbackName }: Omit<InsertNormalisedModelArgs<Schema>, 'destinationPath'>, options?: Pick<InsertModelOptions<'force'>, 'noExport'>): InsertNormalisedModelReturn<V, Schema>;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"OperationBase.d.ts","sourceRoot":"","sources":["../../../src/dsl/operation/OperationBase.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,YAAY,CAAA;AACrD,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,kCAAkC,CAAA;AACpE,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,uBAAuB,CAAA;AAC5D,OAAO,KAAK,EACV,gBAAgB,EAChB,eAAe,EAEf,qBAAqB,EACrB,sBAAsB,EACtB,kBAAkB,EAClB,yBAAyB,EACzB,2BAA2B,EAC5B,MAAM,kCAAkC,CAAA;AACzC,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,+BAA+B,CAAA;AACnE,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,8BAA8B,CAAA;AAChE,OAAO,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAA;AAC/C,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAA;AAElD,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,gBAAgB,CAAA;AAC9C,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAA;AACxD,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,wBAAwB,CAAA;AACrD,OAAO,EAAE,SAAS,EAAE,MAAM,4BAA4B,CAAA;AACtD,OAAO,EAAE,MAAM,EAAE,MAAM,sBAAsB,CAAA;AAC7C,OAAO,EAAE,OAAO,EAAE,MAAM,wBAAwB,CAAA;AAEhD,MAAM,MAAM,iBAAiB,CAAC,cAAc,GAAG,SAAS,IAAI;IAC1D,OAAO,EAAE,eAAe,CAAA;IACxB,QAAQ,EAAE,eAAe,CAAC,cAAc,CAAC,CAAA;IACzC,YAAY,EAAE,YAAY,CAAA;IAC1B,SAAS,EAAE,YAAY,CAAA;CACxB,CAAA;AAED,qBAAa,aAAa,CAAC,cAAc,GAAG,SAAS,CAAE,SAAQ,WAAW;IACxE,QAAQ,EAAE,eAAe,CAAC,cAAc,CAAC,CAAA;
|
|
1
|
+
{"version":3,"file":"OperationBase.d.ts","sourceRoot":"","sources":["../../../src/dsl/operation/OperationBase.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,YAAY,CAAA;AACrD,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,kCAAkC,CAAA;AACpE,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,uBAAuB,CAAA;AAC5D,OAAO,KAAK,EACV,gBAAgB,EAChB,eAAe,EAEf,qBAAqB,EACrB,sBAAsB,EACtB,kBAAkB,EAClB,yBAAyB,EACzB,2BAA2B,EAC5B,MAAM,kCAAkC,CAAA;AACzC,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,+BAA+B,CAAA;AACnE,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,8BAA8B,CAAA;AAChE,OAAO,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAA;AAC/C,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAA;AAElD,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,gBAAgB,CAAA;AAC9C,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAA;AACxD,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,wBAAwB,CAAA;AACrD,OAAO,EAAE,SAAS,EAAE,MAAM,4BAA4B,CAAA;AACtD,OAAO,EAAE,MAAM,EAAE,MAAM,sBAAsB,CAAA;AAC7C,OAAO,EAAE,OAAO,EAAE,MAAM,wBAAwB,CAAA;AAEhD;;;;GAIG;AACH,MAAM,MAAM,iBAAiB,CAAC,cAAc,GAAG,SAAS,IAAI;IAC1D,yEAAyE;IACzE,OAAO,EAAE,eAAe,CAAA;IACxB,0EAA0E;IAC1E,QAAQ,EAAE,eAAe,CAAC,cAAc,CAAC,CAAA;IACzC,gDAAgD;IAChD,YAAY,EAAE,YAAY,CAAA;IAC1B,4CAA4C;IAC5C,SAAS,EAAE,YAAY,CAAA;CACxB,CAAA;AAED;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAuGG;AACH,qBAAa,aAAa,CAAC,cAAc,GAAG,SAAS,CAAE,SAAQ,WAAW;IACxE,0EAA0E;IAC1E,QAAQ,EAAE,eAAe,CAAC,cAAc,CAAC,CAAA;IAEzC,4CAA4C;IAC5C,SAAS,EAAE,YAAY,CAAA;IAEvB,oDAAoD;IAC3C,YAAY,EAAE,YAAY,CAAA;IAEnC;;;;;;;;;;;;;;;;;;;;;OAqBG;gBACS,EAAE,OAAO,EAAE,YAAY,EAAE,QAAQ,EAAE,SAAS,EAAE,EAAE,iBAAiB,CAAC,cAAc,CAAC;IAQ7F;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;OAoCG;IACH,eAAe,CAAC,CAAC,SAAS,cAAc,EAAE,cAAc,GAAG,SAAS,EAClE,UAAU,EAAE,mBAAmB,CAAC,CAAC,EAAE,cAAc,CAAC,EAClD,SAAS,EAAE,YAAY,EACvB,OAAO,GAAE,IAAI,CAAC,sBAAsB,CAAC,OAAO,CAAC,EAAE,UAAU,CAAM,GAC9D,QAAQ,CAAC,CAAC,EAAE,OAAO,EAAE,cAAc,CAAC;IAQvC,WAAW,CAAC,CAAC,SAAS,cAAc,EAAE,cAAc,GAAG,SAAS,EAC9D,UAAU,EAAE,eAAe,CAAC,CAAC,EAAE,cAAc,CAAC,EAC9C,OAAO,EAAE,OAAO,EAChB,OAAO,GAAE,IAAI,CAAC,kBAAkB,CAAC,OAAO,CAAC,EAAE,UAAU,CAAM,GAC1D,QAAQ,CAAC,CAAC,EAAE,OAAO,EAAE,cAAc,CAAC;IAQvC,qBAAqB,CACnB,CAAC,SAAS,cAAc,EACxB,MAAM,SAAS,SAAS,GAAG,MAAM,CAAC,QAAQ,CAAC,GAAG,OAAO,EACrD,cAAc,GAAG,SAAS,EAE1B,UAAU,EAAE,eAAe,CAAC,CAAC,EAAE,cAAc,CAAC,EAC9C,EAAE,MAAM,EAAE,YAAY,EAAE,EAAE,IAAI,CAAC,yBAAyB,CAAC,MAAM,CAAC,EAAE,iBAAiB,CAAC,EACpF,OAAO,GAAE,IAAI,CAAC,kBAAkB,CAAC,OAAO,CAAC,EAAE,UAAU,CAAM,GAC1D,2BAA2B,CAAC,CAAC,EAAE,MAAM,CAAC;IAYzC,oBAAoB;IACpB,iBAAiB,CAAC,CAAC,SAAS,cAAc,EAAE,EAC1C,UAAU,EACV,KAAK,EACL,QAAQ,EACT,EAAE,IAAI,CAAC,qBAAqB,CAAC,CAAC,CAAC,EAAE,iBAAiB,CAAC,GAAG,UAAU,CAAC,CAAC,CAAC;IAS3D,QAAQ,CAAC,IAAI,EAAE,gBAAgB;CAMzC"}
|
|
@@ -2,21 +2,150 @@
|
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
3
|
exports.OperationBase = void 0;
|
|
4
4
|
const ContentBase_js_1 = require("../ContentBase.js");
|
|
5
|
+
/**
|
|
6
|
+
* Base class for operation generators in the SKMTC DSL system.
|
|
7
|
+
*
|
|
8
|
+
* `OperationBase` extends {@link ContentBase} to provide specialized functionality for
|
|
9
|
+
* generating code from OpenAPI operations. It offers type-safe methods for inserting
|
|
10
|
+
* related operations and models, managing complex operation dependencies, and handling
|
|
11
|
+
* enrichments specific to API operations.
|
|
12
|
+
*
|
|
13
|
+
* This class serves as the foundation for creating custom operation generators that
|
|
14
|
+
* transform OpenAPI operations into various code artifacts like API clients, server
|
|
15
|
+
* handlers, validation middleware, or documentation.
|
|
16
|
+
*
|
|
17
|
+
* ## Key Features
|
|
18
|
+
*
|
|
19
|
+
* - **Operation Insertion**: Insert related operations with automatic dependency tracking
|
|
20
|
+
* - **Model Integration**: Seamlessly insert related models from operation schemas
|
|
21
|
+
* - **Schema Normalization**: Handle complex request/response schema references
|
|
22
|
+
* - **Export Management**: Control which operations are exported from generated files
|
|
23
|
+
* - **Enrichment Support**: Extend functionality with operation-specific enrichment data
|
|
24
|
+
* - **Type Safety**: Full TypeScript support with generic enrichment types
|
|
25
|
+
*
|
|
26
|
+
* @template EnrichmentType - Optional type for custom enrichment data
|
|
27
|
+
*
|
|
28
|
+
* @example Basic API client generator
|
|
29
|
+
* ```typescript
|
|
30
|
+
* import { OperationBase, Definition } from '@skmtc/core';
|
|
31
|
+
*
|
|
32
|
+
* class ApiClientMethod extends OperationBase {
|
|
33
|
+
* toDefinition(): Definition {
|
|
34
|
+
* const { method, path, operationId } = this.operation;
|
|
35
|
+
*
|
|
36
|
+
* return new Definition({
|
|
37
|
+
* name: operationId || `${method}${this.pascalCasePath()}`,
|
|
38
|
+
* content: `async ${operationId}(${this.generateParameters()}) {
|
|
39
|
+
* return this.request('${method}', '${path}', ${this.generateRequestBody()});
|
|
40
|
+
* }`
|
|
41
|
+
* });
|
|
42
|
+
* }
|
|
43
|
+
* }
|
|
44
|
+
* ```
|
|
45
|
+
*
|
|
46
|
+
* @example With request/response models
|
|
47
|
+
* ```typescript
|
|
48
|
+
* class TypedApiMethod extends OperationBase {
|
|
49
|
+
* toDefinition(): Definition {
|
|
50
|
+
* const operation = this.operation;
|
|
51
|
+
*
|
|
52
|
+
* // Generate request model if needed
|
|
53
|
+
* let requestType = 'void';
|
|
54
|
+
* if (operation.requestBody?.content?.['application/json']?.schema) {
|
|
55
|
+
* const requestModel = this.insertNormalizedModel(
|
|
56
|
+
* new RequestModel({ ... }),
|
|
57
|
+
* {
|
|
58
|
+
* schema: operation.requestBody.content['application/json'].schema,
|
|
59
|
+
* fallbackName: `${operation.operationId}Request`
|
|
60
|
+
* }
|
|
61
|
+
* );
|
|
62
|
+
* requestType = requestModel.value;
|
|
63
|
+
* }
|
|
64
|
+
*
|
|
65
|
+
* // Generate response model
|
|
66
|
+
* const responseSchema = operation.responses?.['200']?.content?.['application/json']?.schema;
|
|
67
|
+
* const responseModel = this.insertNormalizedModel(
|
|
68
|
+
* new ResponseModel({ ... }),
|
|
69
|
+
* { schema: responseSchema, fallbackName: `${operation.operationId}Response` }
|
|
70
|
+
* );
|
|
71
|
+
*
|
|
72
|
+
* return new Definition({
|
|
73
|
+
* name: operation.operationId,
|
|
74
|
+
* content: `async ${operation.operationId}(data: ${requestType}): Promise<${responseModel.value}> {
|
|
75
|
+
* return this.request('${operation.method}', '${operation.path}', data);
|
|
76
|
+
* }`
|
|
77
|
+
* });
|
|
78
|
+
* }
|
|
79
|
+
* }
|
|
80
|
+
* ```
|
|
81
|
+
*
|
|
82
|
+
* @example With enrichments
|
|
83
|
+
* ```typescript
|
|
84
|
+
* type AuthEnrichment = {
|
|
85
|
+
* requiresAuth: boolean;
|
|
86
|
+
* permissions: string[];
|
|
87
|
+
* };
|
|
88
|
+
*
|
|
89
|
+
* class SecuredApiMethod extends OperationBase<AuthEnrichment> {
|
|
90
|
+
* toDefinition(): Definition {
|
|
91
|
+
* const enrichment = this.settings.enrichment;
|
|
92
|
+
* const requiresAuth = enrichment?.requiresAuth ?? false;
|
|
93
|
+
*
|
|
94
|
+
* const authCheck = requiresAuth
|
|
95
|
+
* ? 'this.checkAuth();'
|
|
96
|
+
* : '';
|
|
97
|
+
*
|
|
98
|
+
* return new Definition({
|
|
99
|
+
* name: this.operation.operationId,
|
|
100
|
+
* content: `async ${this.operation.operationId}() {
|
|
101
|
+
* ${authCheck}
|
|
102
|
+
* return this.request('${this.operation.method}', '${this.operation.path}');
|
|
103
|
+
* }`
|
|
104
|
+
* });
|
|
105
|
+
* }
|
|
106
|
+
* }
|
|
107
|
+
* ```
|
|
108
|
+
*/
|
|
5
109
|
class OperationBase extends ContentBase_js_1.ContentBase {
|
|
110
|
+
/**
|
|
111
|
+
* Creates a new OperationBase instance.
|
|
112
|
+
*
|
|
113
|
+
* @param args - Operation generator configuration
|
|
114
|
+
* @param args.context - The generation context providing pipeline access
|
|
115
|
+
* @param args.settings - Content settings with export path and enrichments
|
|
116
|
+
* @param args.generatorKey - Unique identifier for this generator type
|
|
117
|
+
* @param args.operation - The OpenAPI operation being processed
|
|
118
|
+
*
|
|
119
|
+
* @example
|
|
120
|
+
* ```typescript
|
|
121
|
+
* const operation = new OperationBase({
|
|
122
|
+
* context: generateContext,
|
|
123
|
+
* settings: {
|
|
124
|
+
* exportPath: './src/api.ts',
|
|
125
|
+
* enrichment: customEnrichments
|
|
126
|
+
* },
|
|
127
|
+
* generatorKey: 'api-client',
|
|
128
|
+
* operation: oasOperation
|
|
129
|
+
* });
|
|
130
|
+
* ```
|
|
131
|
+
*/
|
|
6
132
|
constructor({ context, generatorKey, settings, operation }) {
|
|
7
133
|
super({ context });
|
|
134
|
+
/** Content settings including export path and enrichment configuration */
|
|
8
135
|
Object.defineProperty(this, "settings", {
|
|
9
136
|
enumerable: true,
|
|
10
137
|
configurable: true,
|
|
11
138
|
writable: true,
|
|
12
139
|
value: void 0
|
|
13
140
|
});
|
|
141
|
+
/** The OpenAPI operation being processed */
|
|
14
142
|
Object.defineProperty(this, "operation", {
|
|
15
143
|
enumerable: true,
|
|
16
144
|
configurable: true,
|
|
17
145
|
writable: true,
|
|
18
146
|
value: void 0
|
|
19
147
|
});
|
|
148
|
+
/** Generator key identifying this generator type */
|
|
20
149
|
Object.defineProperty(this, "generatorKey", {
|
|
21
150
|
enumerable: true,
|
|
22
151
|
configurable: true,
|
|
@@ -27,6 +156,43 @@ class OperationBase extends ContentBase_js_1.ContentBase {
|
|
|
27
156
|
this.operation = operation;
|
|
28
157
|
this.settings = settings;
|
|
29
158
|
}
|
|
159
|
+
/**
|
|
160
|
+
* Inserts a related operation with forced generation.
|
|
161
|
+
*
|
|
162
|
+
* This method adds a related operation to the current generation context, ensuring
|
|
163
|
+
* it will be generated regardless of whether it already exists. This is useful for
|
|
164
|
+
* operations that depend on other operations or need to generate helper operations.
|
|
165
|
+
*
|
|
166
|
+
* @template V - Type of generated value returned by the insertable
|
|
167
|
+
* @template EnrichmentType - Type of enrichment data for the insertable
|
|
168
|
+
* @param insertable - The operation generator to insert
|
|
169
|
+
* @param operation - The OpenAPI operation to process
|
|
170
|
+
* @param options - Insertion options
|
|
171
|
+
* @param options.noExport - Whether to skip exporting the inserted operation
|
|
172
|
+
* @returns Inserted operation reference with generated value
|
|
173
|
+
*
|
|
174
|
+
* @example Inserting helper operations
|
|
175
|
+
* ```typescript
|
|
176
|
+
* class CrudApiClient extends OperationBase {
|
|
177
|
+
* toDefinition(): Definition {
|
|
178
|
+
* // Insert a related validation operation
|
|
179
|
+
* const validator = this.insertOperation(
|
|
180
|
+
* new ValidationOperation({ ... }),
|
|
181
|
+
* this.operation,
|
|
182
|
+
* { noExport: true }
|
|
183
|
+
* );
|
|
184
|
+
*
|
|
185
|
+
* return new Definition({
|
|
186
|
+
* name: this.operation.operationId,
|
|
187
|
+
* content: `async ${this.operation.operationId}(data: any) {
|
|
188
|
+
* ${validator.value}(data);
|
|
189
|
+
* return this.request('${this.operation.method}', '${this.operation.path}', data);
|
|
190
|
+
* }`
|
|
191
|
+
* });
|
|
192
|
+
* }
|
|
193
|
+
* }
|
|
194
|
+
* ```
|
|
195
|
+
*/
|
|
30
196
|
insertOperation(insertable, operation, options = {}) {
|
|
31
197
|
return this.context.insertOperation(insertable, operation, {
|
|
32
198
|
generation: 'force',
|
|
@@ -1,9 +1,72 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Capitalizes the first character of a string.
|
|
3
|
+
*
|
|
4
|
+
* @param str - The string to capitalize
|
|
5
|
+
* @returns The string with the first character uppercased
|
|
6
|
+
*
|
|
7
|
+
* @example
|
|
8
|
+
* ```typescript
|
|
9
|
+
* capitalize('hello world'); // 'Hello world'
|
|
10
|
+
* capitalize('API'); // 'API'
|
|
11
|
+
* capitalize(''); // ''
|
|
12
|
+
* ```
|
|
13
|
+
*/
|
|
1
14
|
import "../_dnt.polyfills.js";
|
|
2
15
|
export declare const capitalize: (str: string) => string;
|
|
16
|
+
/**
|
|
17
|
+
* Decapitalizes (lowercases) the first character of a string.
|
|
18
|
+
*
|
|
19
|
+
* @param str - The string to decapitalize
|
|
20
|
+
* @returns The string with the first character lowercased
|
|
21
|
+
*
|
|
22
|
+
* @example
|
|
23
|
+
* ```typescript
|
|
24
|
+
* decapitalize('Hello World'); // 'hello World'
|
|
25
|
+
* decapitalize('API'); // 'aPI'
|
|
26
|
+
* decapitalize(''); // ''
|
|
27
|
+
* ```
|
|
28
|
+
*/
|
|
3
29
|
export declare const decapitalize: (str: string) => string;
|
|
30
|
+
/**
|
|
31
|
+
* Options for controlling camelCase conversion behavior.
|
|
32
|
+
*/
|
|
4
33
|
type CamelCaseOptions = {
|
|
34
|
+
/** Whether to capitalize the first character (PascalCase) */
|
|
5
35
|
upperFirst?: boolean;
|
|
6
36
|
};
|
|
37
|
+
/**
|
|
38
|
+
* Converts a string to camelCase, removing non-alphanumeric characters.
|
|
39
|
+
*
|
|
40
|
+
* This function handles various input formats including kebab-case, snake_case,
|
|
41
|
+
* space-separated words, and mixed formats. It intelligently capitalizes words
|
|
42
|
+
* after the first unless `upperFirst` is specified.
|
|
43
|
+
*
|
|
44
|
+
* @param str - The string to convert to camelCase
|
|
45
|
+
* @param options - Options to control the conversion
|
|
46
|
+
* @param options.upperFirst - Whether to capitalize the first character (default: false)
|
|
47
|
+
* @returns The camelCase version of the input string
|
|
48
|
+
*
|
|
49
|
+
* @example Basic usage
|
|
50
|
+
* ```typescript
|
|
51
|
+
* camelCase('hello world'); // 'helloWorld'
|
|
52
|
+
* camelCase('user-name'); // 'userName'
|
|
53
|
+
* camelCase('api_key'); // 'apiKey'
|
|
54
|
+
* camelCase('HTTP-Response'); // 'httpResponse'
|
|
55
|
+
* ```
|
|
56
|
+
*
|
|
57
|
+
* @example PascalCase (upperFirst)
|
|
58
|
+
* ```typescript
|
|
59
|
+
* camelCase('user profile', { upperFirst: true }); // 'UserProfile'
|
|
60
|
+
* camelCase('api-client', { upperFirst: true }); // 'ApiClient'
|
|
61
|
+
* ```
|
|
62
|
+
*
|
|
63
|
+
* @example Complex inputs
|
|
64
|
+
* ```typescript
|
|
65
|
+
* camelCase('get-user-by-id'); // 'getUserById'
|
|
66
|
+
* camelCase('XML_HTTP_Request'); // 'xmlHttpRequest'
|
|
67
|
+
* camelCase('2fa-enabled'); // '2faEnabled'
|
|
68
|
+
* ```
|
|
69
|
+
*/
|
|
7
70
|
export declare const camelCase: (str: string, { upperFirst }?: CamelCaseOptions) => string;
|
|
8
71
|
export {};
|
|
9
72
|
//# sourceMappingURL=strings.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"strings.d.ts","sourceRoot":"","sources":["../../src/helpers/strings.ts"],"names":[],"mappings":"AAAA,OAAO,sBAAsB,CAAC;
|
|
1
|
+
{"version":3,"file":"strings.d.ts","sourceRoot":"","sources":["../../src/helpers/strings.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AACH,OAAO,sBAAsB,CAAC;AAE9B,eAAO,MAAM,UAAU,GAAI,KAAK,MAAM,KAAG,MAExC,CAAA;AAED;;;;;;;;;;;;GAYG;AACH,eAAO,MAAM,YAAY,GAAI,KAAK,MAAM,KAAG,MAE1C,CAAA;AAED;;GAEG;AACH,KAAK,gBAAgB,GAAG;IACtB,6DAA6D;IAC7D,UAAU,CAAC,EAAE,OAAO,CAAA;CACrB,CAAA;AAED;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAgCG;AACH,eAAO,MAAM,SAAS,GAAI,KAAK,MAAM,EAAE,iBAAgB,gBAAqB,KAAG,MAgB9E,CAAA"}
|
|
@@ -1,15 +1,74 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
3
|
exports.camelCase = exports.decapitalize = exports.capitalize = void 0;
|
|
4
|
+
/**
|
|
5
|
+
* Capitalizes the first character of a string.
|
|
6
|
+
*
|
|
7
|
+
* @param str - The string to capitalize
|
|
8
|
+
* @returns The string with the first character uppercased
|
|
9
|
+
*
|
|
10
|
+
* @example
|
|
11
|
+
* ```typescript
|
|
12
|
+
* capitalize('hello world'); // 'Hello world'
|
|
13
|
+
* capitalize('API'); // 'API'
|
|
14
|
+
* capitalize(''); // ''
|
|
15
|
+
* ```
|
|
16
|
+
*/
|
|
4
17
|
require("../_dnt.polyfills.js");
|
|
5
18
|
const capitalize = (str) => {
|
|
6
19
|
return str.charAt(0).toUpperCase() + str.slice(1);
|
|
7
20
|
};
|
|
8
21
|
exports.capitalize = capitalize;
|
|
22
|
+
/**
|
|
23
|
+
* Decapitalizes (lowercases) the first character of a string.
|
|
24
|
+
*
|
|
25
|
+
* @param str - The string to decapitalize
|
|
26
|
+
* @returns The string with the first character lowercased
|
|
27
|
+
*
|
|
28
|
+
* @example
|
|
29
|
+
* ```typescript
|
|
30
|
+
* decapitalize('Hello World'); // 'hello World'
|
|
31
|
+
* decapitalize('API'); // 'aPI'
|
|
32
|
+
* decapitalize(''); // ''
|
|
33
|
+
* ```
|
|
34
|
+
*/
|
|
9
35
|
const decapitalize = (str) => {
|
|
10
36
|
return str.charAt(0).toLocaleLowerCase() + str.slice(1);
|
|
11
37
|
};
|
|
12
38
|
exports.decapitalize = decapitalize;
|
|
39
|
+
/**
|
|
40
|
+
* Converts a string to camelCase, removing non-alphanumeric characters.
|
|
41
|
+
*
|
|
42
|
+
* This function handles various input formats including kebab-case, snake_case,
|
|
43
|
+
* space-separated words, and mixed formats. It intelligently capitalizes words
|
|
44
|
+
* after the first unless `upperFirst` is specified.
|
|
45
|
+
*
|
|
46
|
+
* @param str - The string to convert to camelCase
|
|
47
|
+
* @param options - Options to control the conversion
|
|
48
|
+
* @param options.upperFirst - Whether to capitalize the first character (default: false)
|
|
49
|
+
* @returns The camelCase version of the input string
|
|
50
|
+
*
|
|
51
|
+
* @example Basic usage
|
|
52
|
+
* ```typescript
|
|
53
|
+
* camelCase('hello world'); // 'helloWorld'
|
|
54
|
+
* camelCase('user-name'); // 'userName'
|
|
55
|
+
* camelCase('api_key'); // 'apiKey'
|
|
56
|
+
* camelCase('HTTP-Response'); // 'httpResponse'
|
|
57
|
+
* ```
|
|
58
|
+
*
|
|
59
|
+
* @example PascalCase (upperFirst)
|
|
60
|
+
* ```typescript
|
|
61
|
+
* camelCase('user profile', { upperFirst: true }); // 'UserProfile'
|
|
62
|
+
* camelCase('api-client', { upperFirst: true }); // 'ApiClient'
|
|
63
|
+
* ```
|
|
64
|
+
*
|
|
65
|
+
* @example Complex inputs
|
|
66
|
+
* ```typescript
|
|
67
|
+
* camelCase('get-user-by-id'); // 'getUserById'
|
|
68
|
+
* camelCase('XML_HTTP_Request'); // 'xmlHttpRequest'
|
|
69
|
+
* camelCase('2fa-enabled'); // '2faEnabled'
|
|
70
|
+
* ```
|
|
71
|
+
*/
|
|
13
72
|
const camelCase = (str, { upperFirst } = {}) => {
|
|
14
73
|
let doCapitalize = Boolean(upperFirst);
|
|
15
74
|
const camelCased = str.replace(/[^a-zA-Z0-9]+([a-zA-Z0-9]+)/g, (_, matched) => {
|
package/script/mod.d.ts
CHANGED
|
@@ -1,3 +1,69 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @module SKMTC Core
|
|
3
|
+
*
|
|
4
|
+
* SKMTC (Schema Kit Mapping & Type Conversion) is a powerful TypeScript/Deno library
|
|
5
|
+
* for processing OpenAPI v3 documents and generating code artifacts. It provides a
|
|
6
|
+
* comprehensive three-phase pipeline for parsing, generating, and rendering OpenAPI
|
|
7
|
+
* schemas into various output formats.
|
|
8
|
+
*
|
|
9
|
+
* ## Quick Start
|
|
10
|
+
*
|
|
11
|
+
* ```typescript
|
|
12
|
+
* import { toArtifacts } from '@skmtc/core';
|
|
13
|
+
*
|
|
14
|
+
* const result = await toArtifacts({
|
|
15
|
+
* traceId: 'my-trace',
|
|
16
|
+
* spanId: 'my-span',
|
|
17
|
+
* documentObject: openApiDoc,
|
|
18
|
+
* settings: clientSettings,
|
|
19
|
+
* toGeneratorConfigMap: () => generatorMap,
|
|
20
|
+
* startAt: Date.now(),
|
|
21
|
+
* silent: false
|
|
22
|
+
* });
|
|
23
|
+
*
|
|
24
|
+
* console.log(result.artifacts); // Generated code files
|
|
25
|
+
* console.log(result.manifest); // Generation metadata
|
|
26
|
+
* ```
|
|
27
|
+
*
|
|
28
|
+
* ## Architecture
|
|
29
|
+
*
|
|
30
|
+
* The library follows a three-phase pipeline:
|
|
31
|
+
* - **Parse Phase**: Converts OpenAPI v3 JSON into internal OAS objects
|
|
32
|
+
* - **Generate Phase**: Transforms OAS objects into generator artifacts
|
|
33
|
+
* - **Render Phase**: Renders artifacts to formatted files
|
|
34
|
+
*
|
|
35
|
+
* ## Key Components
|
|
36
|
+
*
|
|
37
|
+
* - {@link CoreContext} - Main orchestration class for the pipeline
|
|
38
|
+
* - {@link toArtifacts} - Primary transformation function
|
|
39
|
+
* - {@link ContentBase} - Base class for creating generators
|
|
40
|
+
* - {@link ModelBase} and {@link OperationBase} - DSL building blocks
|
|
41
|
+
* - {@link List} - Powerful string manipulation and code generation utility
|
|
42
|
+
*
|
|
43
|
+
* ## Type System
|
|
44
|
+
*
|
|
45
|
+
* The library provides comprehensive TypeScript types for OpenAPI schemas,
|
|
46
|
+
* generator configurations, and output artifacts. All major types are
|
|
47
|
+
* validated using Valibot schemas for runtime safety.
|
|
48
|
+
*
|
|
49
|
+
* @example Basic Usage
|
|
50
|
+
* ```typescript
|
|
51
|
+
* import { CoreContext } from '@skmtc/core';
|
|
52
|
+
*
|
|
53
|
+
* const context = new CoreContext({
|
|
54
|
+
* spanId: 'my-span',
|
|
55
|
+
* silent: false
|
|
56
|
+
* });
|
|
57
|
+
*
|
|
58
|
+
* const result = await context.toArtifacts({
|
|
59
|
+
* documentObject: myOpenApiDoc,
|
|
60
|
+
* settings: mySettings,
|
|
61
|
+
* toGeneratorConfigMap: () => myGenerators,
|
|
62
|
+
* prettier: prettierConfig,
|
|
63
|
+
* silent: false
|
|
64
|
+
* });
|
|
65
|
+
* ```
|
|
66
|
+
*/
|
|
1
67
|
import "./_dnt.polyfills.js";
|
|
2
68
|
export * from './app/validate.js';
|
|
3
69
|
export * from './context/CoreContext.js';
|
package/script/mod.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"mod.d.ts","sourceRoot":"","sources":["../src/mod.ts"],"names":[],"mappings":"AAAA,OAAO,qBAAqB,CAAC;
|
|
1
|
+
{"version":3,"file":"mod.d.ts","sourceRoot":"","sources":["../src/mod.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAiEG;AACH,OAAO,qBAAqB,CAAC;AAG7B,cAAc,mBAAmB,CAAA;AACjC,cAAc,0BAA0B,CAAA;AACxC,cAAc,8BAA8B,CAAA;AAC5C,cAAc,2BAA2B,CAAA;AACzC,cAAc,oBAAoB,CAAA;AAClC,cAAc,sBAAsB,CAAA;AACpC,cAAc,0BAA0B,CAAA;AACxC,cAAc,qBAAqB,CAAA;AACnC,cAAc,qBAAqB,CAAA;AACnC,cAAc,6BAA6B,CAAA;AAC3C,cAAc,qBAAqB,CAAA;AACnC,cAAc,iBAAiB,CAAA;AAC/B,cAAc,mBAAmB,CAAA;AACjC,cAAc,0BAA0B,CAAA;AACxC,cAAc,4BAA4B,CAAA;AAC1C,cAAc,4BAA4B,CAAA;AAC1C,cAAc,6BAA6B,CAAA;AAC3C,cAAc,sBAAsB,CAAA;AACpC,cAAc,kCAAkC,CAAA;AAChD,cAAc,oCAAoC,CAAA;AAClD,cAAc,oCAAoC,CAAA;AAClD,cAAc,qCAAqC,CAAA;AACnD,cAAc,0BAA0B,CAAA;AACxC,cAAc,qBAAqB,CAAA;AACnC,cAAc,8BAA8B,CAAA;AAC5C,cAAc,2BAA2B,CAAA;AACzC,cAAc,8BAA8B,CAAA;AAC5C,cAAc,sBAAsB,CAAA;AACpC,cAAc,yBAAyB,CAAA;AACvC,cAAc,qBAAqB,CAAA;AACnC,cAAc,qBAAqB,CAAA;AACnC,cAAc,sBAAsB,CAAA;AACpC,cAAc,8BAA8B,CAAA;AAC5C,cAAc,qCAAqC,CAAA;AACnD,cAAc,sBAAsB,CAAA;AACpC,cAAc,0BAA0B,CAAA;AACxC,cAAc,gCAAgC,CAAA;AAC9C,cAAc,sCAAsC,CAAA;AACpD,cAAc,4BAA4B,CAAA;AAC1C,cAAc,oBAAoB,CAAA;AAClC,cAAc,0BAA0B,CAAA;AACxC,cAAc,wBAAwB,CAAA;AACtC,cAAc,wBAAwB,CAAA;AACtC,cAAc,8BAA8B,CAAA;AAC5C,cAAc,8BAA8B,CAAA;AAC5C,cAAc,kBAAkB,CAAA;AAChC,cAAc,kCAAkC,CAAA;AAChD,cAAc,4BAA4B,CAAA;AAC1C,cAAc,wBAAwB,CAAA;AACtC,cAAc,wBAAwB,CAAA;AACtC,cAAc,kBAAkB,CAAA;AAChC,cAAc,sBAAsB,CAAA;AACpC,cAAc,0BAA0B,CAAA;AACxC,cAAc,oBAAoB,CAAA;AAClC,cAAc,sBAAsB,CAAA;AACpC,cAAc,2BAA2B,CAAA;AACzC,cAAc,wBAAwB,CAAA;AACtC,cAAc,qBAAqB,CAAA;AACnC,cAAc,8BAA8B,CAAA;AAC5C,cAAc,wBAAwB,CAAA;AACtC,cAAc,2BAA2B,CAAA;AACzC,cAAc,0BAA0B,CAAA;AACxC,cAAc,0BAA0B,CAAA;AACxC,cAAc,qBAAqB,CAAA;AACnC,cAAc,mBAAmB,CAAA;AACjC,cAAc,sBAAsB,CAAA;AACpC,cAAc,yBAAyB,CAAA;AACvC,cAAc,2BAA2B,CAAA;AACzC,cAAc,oBAAoB,CAAA;AAClC,cAAc,oBAAoB,CAAA;AAClC,cAAc,qBAAqB,CAAA;AACnC,cAAc,uBAAuB,CAAA;AACrC,cAAc,mCAAmC,CAAA;AACjD,cAAc,6BAA6B,CAAA;AAC3C,cAAc,2BAA2B,CAAA;AACzC,cAAc,sBAAsB,CAAA;AACpC,cAAc,4BAA4B,CAAA;AAC1C,cAAc,uCAAuC,CAAA;AACrD,cAAc,gCAAgC,CAAA;AAC9C,cAAc,8BAA8B,CAAA;AAC5C,cAAc,iCAAiC,CAAA"}
|