@skmtc/core 0.0.785 → 0.0.786
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/dsl/Identifier.d.ts +152 -0
- package/esm/dsl/Identifier.d.ts.map +1 -1
- package/esm/dsl/Identifier.js +152 -0
- package/esm/dsl/Import.d.ts +221 -0
- package/esm/dsl/Import.d.ts.map +1 -1
- package/esm/dsl/Import.js +202 -0
- package/esm/dsl/operation/OperationBase.d.ts +181 -1
- package/esm/dsl/operation/OperationBase.d.ts.map +1 -1
- package/esm/dsl/operation/OperationBase.js +181 -1
- package/esm/oas/document/Document.d.ts +155 -1
- package/esm/oas/document/Document.d.ts.map +1 -1
- package/esm/oas/document/Document.js +141 -2
- package/esm/oas/object/Object.d.ts +255 -10
- package/esm/oas/object/Object.d.ts.map +1 -1
- package/esm/oas/object/Object.js +229 -10
- package/esm/types/GeneratorKeys.d.ts +336 -0
- package/esm/types/GeneratorKeys.d.ts.map +1 -1
- package/esm/types/GeneratorKeys.js +243 -0
- package/esm/types/GeneratorType.d.ts +119 -0
- package/esm/types/GeneratorType.d.ts.map +1 -1
- package/esm/types/Method.d.ts +109 -0
- package/esm/types/Method.d.ts.map +1 -1
- package/esm/types/Method.js +84 -0
- package/package.json +1 -1
- package/script/dsl/Identifier.d.ts +152 -0
- package/script/dsl/Identifier.d.ts.map +1 -1
- package/script/dsl/Identifier.js +152 -0
- package/script/dsl/Import.d.ts +221 -0
- package/script/dsl/Import.d.ts.map +1 -1
- package/script/dsl/Import.js +202 -0
- package/script/dsl/operation/OperationBase.d.ts +181 -1
- package/script/dsl/operation/OperationBase.d.ts.map +1 -1
- package/script/dsl/operation/OperationBase.js +181 -1
- package/script/oas/document/Document.d.ts +155 -1
- package/script/oas/document/Document.d.ts.map +1 -1
- package/script/oas/document/Document.js +141 -2
- package/script/oas/object/Object.d.ts +255 -10
- package/script/oas/object/Object.d.ts.map +1 -1
- package/script/oas/object/Object.js +229 -10
- package/script/types/GeneratorKeys.d.ts +336 -0
- package/script/types/GeneratorKeys.d.ts.map +1 -1
- package/script/types/GeneratorKeys.js +243 -0
- package/script/types/GeneratorType.d.ts +119 -0
- package/script/types/GeneratorType.d.ts.map +1 -1
- package/script/types/Method.d.ts +109 -0
- package/script/types/Method.d.ts.map +1 -1
- package/script/types/Method.js +84 -0
package/esm/dsl/Import.js
CHANGED
|
@@ -1,11 +1,101 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Represents a TypeScript import statement in the SKMTC DSL system.
|
|
3
|
+
*
|
|
4
|
+
* The `Import` class generates properly formatted import statements for TypeScript
|
|
5
|
+
* files, handling named imports with optional aliases. It's used throughout the
|
|
6
|
+
* code generation pipeline to manage module dependencies.
|
|
7
|
+
*
|
|
8
|
+
* This class supports both simple string imports and aliased imports, making it
|
|
9
|
+
* easy to avoid naming conflicts and provide cleaner import statements.
|
|
10
|
+
*
|
|
11
|
+
* @example Basic named imports
|
|
12
|
+
* ```typescript
|
|
13
|
+
* import { Import } from '@skmtc/core';
|
|
14
|
+
*
|
|
15
|
+
* const basicImport = new Import({
|
|
16
|
+
* module: './types',
|
|
17
|
+
* importNames: ['User', 'Product', 'Order']
|
|
18
|
+
* });
|
|
19
|
+
*
|
|
20
|
+
* console.log(basicImport.toString());
|
|
21
|
+
* // import { User, Product, Order } from './types'
|
|
22
|
+
* ```
|
|
23
|
+
*
|
|
24
|
+
* @example Imports with aliases
|
|
25
|
+
* ```typescript
|
|
26
|
+
* const aliasedImport = new Import({
|
|
27
|
+
* module: 'react',
|
|
28
|
+
* importNames: [
|
|
29
|
+
* 'useState',
|
|
30
|
+
* 'useEffect',
|
|
31
|
+
* { 'default': 'React' } // Import default as React
|
|
32
|
+
* ]
|
|
33
|
+
* });
|
|
34
|
+
*
|
|
35
|
+
* console.log(aliasedImport.toString());
|
|
36
|
+
* // import { useState, useEffect, default as React } from 'react'
|
|
37
|
+
* ```
|
|
38
|
+
*
|
|
39
|
+
* @example Mixed imports
|
|
40
|
+
* ```typescript
|
|
41
|
+
* const mixedImport = new Import({
|
|
42
|
+
* module: './api/client',
|
|
43
|
+
* importNames: [
|
|
44
|
+
* 'ApiClient',
|
|
45
|
+
* { 'RequestOptions': 'Options' }, // Alias to avoid conflicts
|
|
46
|
+
* 'ResponseType'
|
|
47
|
+
* ]
|
|
48
|
+
* });
|
|
49
|
+
*
|
|
50
|
+
* console.log(mixedImport.toString());
|
|
51
|
+
* // import { ApiClient, RequestOptions as Options, ResponseType } from './api/client'
|
|
52
|
+
* ```
|
|
53
|
+
*
|
|
54
|
+
* @example Using in File generation
|
|
55
|
+
* ```typescript
|
|
56
|
+
* import { File, Import } from '@skmtc/core';
|
|
57
|
+
*
|
|
58
|
+
* const file = new File({ path: './generated.ts', settings: undefined });
|
|
59
|
+
*
|
|
60
|
+
* // Add import to file
|
|
61
|
+
* file.imports.set('./types', new Set(['User', 'Product']));
|
|
62
|
+
*
|
|
63
|
+
* // Or create Import directly for more control
|
|
64
|
+
* const customImport = new Import({
|
|
65
|
+
* module: './helpers',
|
|
66
|
+
* importNames: [{ 'validateEmail': 'emailValidator' }]
|
|
67
|
+
* });
|
|
68
|
+
* ```
|
|
69
|
+
*/
|
|
1
70
|
export class Import {
|
|
71
|
+
/**
|
|
72
|
+
* Creates a new Import instance.
|
|
73
|
+
*
|
|
74
|
+
* @param args - Import configuration
|
|
75
|
+
* @param args.module - The module path to import from (e.g., './types', 'react')
|
|
76
|
+
* @param args.importNames - Array of import names, can be strings or alias objects
|
|
77
|
+
*
|
|
78
|
+
* @example
|
|
79
|
+
* ```typescript
|
|
80
|
+
* const importStatement = new Import({
|
|
81
|
+
* module: './models/User',
|
|
82
|
+
* importNames: [
|
|
83
|
+
* 'User', // Simple import
|
|
84
|
+
* { 'UserType': 'IUser' }, // Aliased import
|
|
85
|
+
* 'createUser' // Another simple import
|
|
86
|
+
* ]
|
|
87
|
+
* });
|
|
88
|
+
* ```
|
|
89
|
+
*/
|
|
2
90
|
constructor({ module, importNames }) {
|
|
91
|
+
/** The module path to import from */
|
|
3
92
|
Object.defineProperty(this, "module", {
|
|
4
93
|
enumerable: true,
|
|
5
94
|
configurable: true,
|
|
6
95
|
writable: true,
|
|
7
96
|
value: void 0
|
|
8
97
|
});
|
|
98
|
+
/** Array of parsed import names with potential aliases */
|
|
9
99
|
Object.defineProperty(this, "importNames", {
|
|
10
100
|
enumerable: true,
|
|
11
101
|
configurable: true,
|
|
@@ -15,25 +105,116 @@ export class Import {
|
|
|
15
105
|
this.module = module;
|
|
16
106
|
this.importNames = importNames.map(importName => new ImportName(importName));
|
|
17
107
|
}
|
|
108
|
+
/**
|
|
109
|
+
* Converts the import to a record format.
|
|
110
|
+
*
|
|
111
|
+
* This method creates a record representation where the module path is the key
|
|
112
|
+
* and the import names are the value. Useful for serialization or when working
|
|
113
|
+
* with import maps.
|
|
114
|
+
*
|
|
115
|
+
* @returns A record with module as key and import names as value
|
|
116
|
+
*
|
|
117
|
+
* @example
|
|
118
|
+
* ```typescript
|
|
119
|
+
* const importStatement = new Import({
|
|
120
|
+
* module: './types',
|
|
121
|
+
* importNames: ['User', { 'Product': 'IProduct' }]
|
|
122
|
+
* });
|
|
123
|
+
*
|
|
124
|
+
* const record = importStatement.toRecord();
|
|
125
|
+
* console.log(record);
|
|
126
|
+
* // {
|
|
127
|
+
* // './types': ['User', { 'Product': 'IProduct' }]
|
|
128
|
+
* // }
|
|
129
|
+
* ```
|
|
130
|
+
*/
|
|
18
131
|
toRecord() {
|
|
19
132
|
return {
|
|
20
133
|
[this.module]: this.importNames.map(({ name, alias }) => alias ? { [name]: alias } : name)
|
|
21
134
|
};
|
|
22
135
|
}
|
|
136
|
+
/**
|
|
137
|
+
* Generates the TypeScript import statement string.
|
|
138
|
+
*
|
|
139
|
+
* This method produces a properly formatted ES6 import statement that can be
|
|
140
|
+
* written directly to a TypeScript file. It handles both simple and aliased
|
|
141
|
+
* imports correctly.
|
|
142
|
+
*
|
|
143
|
+
* @returns The formatted import statement string
|
|
144
|
+
*
|
|
145
|
+
* @example
|
|
146
|
+
* ```typescript
|
|
147
|
+
* const basicImport = new Import({
|
|
148
|
+
* module: './utils',
|
|
149
|
+
* importNames: ['formatDate', 'parseJson']
|
|
150
|
+
* });
|
|
151
|
+
*
|
|
152
|
+
* console.log(basicImport.toString());
|
|
153
|
+
* // import { formatDate, parseJson } from './utils'
|
|
154
|
+
*
|
|
155
|
+
* const aliasedImport = new Import({
|
|
156
|
+
* module: 'lodash',
|
|
157
|
+
* importNames: [{ 'isEqual': 'deepEqual' }, 'cloneDeep']
|
|
158
|
+
* });
|
|
159
|
+
*
|
|
160
|
+
* console.log(aliasedImport.toString());
|
|
161
|
+
* // import { isEqual as deepEqual, cloneDeep } from 'lodash'
|
|
162
|
+
* ```
|
|
163
|
+
*
|
|
164
|
+
* @todo Move syntax to typescript package to enable language-agnostic use
|
|
165
|
+
*/
|
|
23
166
|
toString() {
|
|
24
167
|
// @TODO move syntax to typescript package to enable
|
|
25
168
|
// language agnostic use
|
|
26
169
|
return `import { ${this.importNames.join(', ')} } from '${this.module}'`;
|
|
27
170
|
}
|
|
28
171
|
}
|
|
172
|
+
/**
|
|
173
|
+
* Represents a single import name with optional aliasing.
|
|
174
|
+
*
|
|
175
|
+
* This class handles the parsing and formatting of individual import specifiers,
|
|
176
|
+
* supporting both simple imports and aliased imports. It's used internally by
|
|
177
|
+
* the {@link Import} class to manage import statement components.
|
|
178
|
+
*
|
|
179
|
+
* @example Simple import name
|
|
180
|
+
* ```typescript
|
|
181
|
+
* const simple = new ImportName('useState');
|
|
182
|
+
* console.log(simple.toString()); // 'useState'
|
|
183
|
+
* ```
|
|
184
|
+
*
|
|
185
|
+
* @example Aliased import name
|
|
186
|
+
* ```typescript
|
|
187
|
+
* const aliased = new ImportName({ 'React': 'ReactLib' });
|
|
188
|
+
* console.log(aliased.toString()); // 'React as ReactLib'
|
|
189
|
+
* ```
|
|
190
|
+
*/
|
|
29
191
|
export class ImportName {
|
|
192
|
+
/**
|
|
193
|
+
* Creates a new ImportName instance.
|
|
194
|
+
*
|
|
195
|
+
* @param name - Either a string for simple imports or an object for aliased imports
|
|
196
|
+
*
|
|
197
|
+
* @example Simple import
|
|
198
|
+
* ```typescript
|
|
199
|
+
* const importName = new ImportName('User');
|
|
200
|
+
* // Results in: User
|
|
201
|
+
* ```
|
|
202
|
+
*
|
|
203
|
+
* @example Aliased import
|
|
204
|
+
* ```typescript
|
|
205
|
+
* const importName = new ImportName({ 'UserInterface': 'IUser' });
|
|
206
|
+
* // Results in: UserInterface as IUser
|
|
207
|
+
* ```
|
|
208
|
+
*/
|
|
30
209
|
constructor(name) {
|
|
210
|
+
/** The original name being imported */
|
|
31
211
|
Object.defineProperty(this, "name", {
|
|
32
212
|
enumerable: true,
|
|
33
213
|
configurable: true,
|
|
34
214
|
writable: true,
|
|
35
215
|
value: void 0
|
|
36
216
|
});
|
|
217
|
+
/** The alias to use (if any) */
|
|
37
218
|
Object.defineProperty(this, "alias", {
|
|
38
219
|
enumerable: true,
|
|
39
220
|
configurable: true,
|
|
@@ -49,6 +230,27 @@ export class ImportName {
|
|
|
49
230
|
this.alias = alias;
|
|
50
231
|
}
|
|
51
232
|
}
|
|
233
|
+
/**
|
|
234
|
+
* Generates the string representation of the import name.
|
|
235
|
+
*
|
|
236
|
+
* This method creates the appropriate import specifier syntax,
|
|
237
|
+
* either a simple name or an aliased import using TypeScript's
|
|
238
|
+
* 'as' keyword.
|
|
239
|
+
*
|
|
240
|
+
* @returns The formatted import specifier string
|
|
241
|
+
*
|
|
242
|
+
* @example Simple import
|
|
243
|
+
* ```typescript
|
|
244
|
+
* const simple = new ImportName('useState');
|
|
245
|
+
* console.log(simple.toString()); // 'useState'
|
|
246
|
+
* ```
|
|
247
|
+
*
|
|
248
|
+
* @example Aliased import
|
|
249
|
+
* ```typescript
|
|
250
|
+
* const aliased = new ImportName({ 'Component': 'ReactComponent' });
|
|
251
|
+
* console.log(aliased.toString()); // 'Component as ReactComponent'
|
|
252
|
+
* ```
|
|
253
|
+
*/
|
|
52
254
|
toString() {
|
|
53
255
|
return this.alias ? `${this.name} as ${this.alias}` : this.name;
|
|
54
256
|
}
|
|
@@ -199,10 +199,190 @@ export declare class OperationBase<EnrichmentType = undefined> extends ContentBa
|
|
|
199
199
|
* ```
|
|
200
200
|
*/
|
|
201
201
|
insertOperation<V extends GeneratedValue, EnrichmentType = undefined>(insertable: OperationInsertable<V, EnrichmentType>, operation: OasOperation, options?: Pick<InsertOperationOptions<'force'>, 'noExport'>): Inserted<V, 'force', EnrichmentType>;
|
|
202
|
+
/**
|
|
203
|
+
* Inserts a related model with forced generation.
|
|
204
|
+
*
|
|
205
|
+
* This method adds a model to the current generation context, typically used
|
|
206
|
+
* for request/response models or other types related to the operation. The model
|
|
207
|
+
* will be generated and can be referenced in the operation code.
|
|
208
|
+
*
|
|
209
|
+
* @template V - Type of generated value returned by the insertable
|
|
210
|
+
* @template EnrichmentType - Type of enrichment data for the insertable
|
|
211
|
+
* @param insertable - The model generator to insert
|
|
212
|
+
* @param refName - Reference name for the inserted model
|
|
213
|
+
* @param options - Insertion options
|
|
214
|
+
* @param options.noExport - Whether to skip exporting the inserted model
|
|
215
|
+
* @returns Inserted model reference with generated value
|
|
216
|
+
*
|
|
217
|
+
* @example Inserting request/response models
|
|
218
|
+
* ```typescript
|
|
219
|
+
* class ApiOperation extends OperationBase {
|
|
220
|
+
* toDefinition(): Definition {
|
|
221
|
+
* // Insert request model
|
|
222
|
+
* const requestModel = this.insertModel(
|
|
223
|
+
* new RequestModel({ ... }),
|
|
224
|
+
* 'CreateUserRequest'
|
|
225
|
+
* );
|
|
226
|
+
*
|
|
227
|
+
* // Insert response model
|
|
228
|
+
* const responseModel = this.insertModel(
|
|
229
|
+
* new ResponseModel({ ... }),
|
|
230
|
+
* 'CreateUserResponse'
|
|
231
|
+
* );
|
|
232
|
+
*
|
|
233
|
+
* return new Definition({
|
|
234
|
+
* name: this.operation.operationId,
|
|
235
|
+
* content: `async ${this.operation.operationId}(data: ${requestModel.value}): Promise<${responseModel.value}> {
|
|
236
|
+
* return this.request('${this.operation.method}', '${this.operation.path}', data);
|
|
237
|
+
* }`
|
|
238
|
+
* });
|
|
239
|
+
* }
|
|
240
|
+
* }
|
|
241
|
+
* ```
|
|
242
|
+
*/
|
|
202
243
|
insertModel<V extends GeneratedValue, EnrichmentType = undefined>(insertable: ModelInsertable<V, EnrichmentType>, refName: RefName, options?: Pick<InsertModelOptions<'force'>, 'noExport'>): Inserted<V, 'force', EnrichmentType>;
|
|
244
|
+
/**
|
|
245
|
+
* Inserts a related model with automatic schema normalization and reference resolution.
|
|
246
|
+
*
|
|
247
|
+
* This method intelligently handles schema references from operation request/response
|
|
248
|
+
* bodies, automatically resolving schema references to appropriate model names.
|
|
249
|
+
* This is particularly useful for operations with complex request/response schemas.
|
|
250
|
+
*
|
|
251
|
+
* @template V - Type of generated value returned by the insertable
|
|
252
|
+
* @template Schema - Type of OpenAPI schema (schema object, reference, or void)
|
|
253
|
+
* @template EnrichmentType - Type of enrichment data for the insertable
|
|
254
|
+
* @param insertable - The model generator to insert
|
|
255
|
+
* @param args - Schema normalization arguments
|
|
256
|
+
* @param args.schema - The OpenAPI schema to normalize (from request/response)
|
|
257
|
+
* @param args.fallbackName - Name to use if schema is not a reference
|
|
258
|
+
* @param options - Insertion options
|
|
259
|
+
* @param options.noExport - Whether to skip exporting the inserted model
|
|
260
|
+
* @returns Inserted model reference with normalized name and generated value
|
|
261
|
+
*
|
|
262
|
+
* @example Handling operation request/response schemas
|
|
263
|
+
* ```typescript
|
|
264
|
+
* class RestApiOperation extends OperationBase {
|
|
265
|
+
* toDefinition(): Definition {
|
|
266
|
+
* const operation = this.operation;
|
|
267
|
+
*
|
|
268
|
+
* // Handle request body schema
|
|
269
|
+
* let requestType = 'void';
|
|
270
|
+
* const requestSchema = operation.requestBody?.content?.['application/json']?.schema;
|
|
271
|
+
* if (requestSchema) {
|
|
272
|
+
* const requestModel = this.insertNormalizedModel(
|
|
273
|
+
* new TypeScriptInterface({ ... }),
|
|
274
|
+
* {
|
|
275
|
+
* schema: requestSchema,
|
|
276
|
+
* fallbackName: `${operation.operationId}Request`
|
|
277
|
+
* }
|
|
278
|
+
* );
|
|
279
|
+
* requestType = requestModel.value;
|
|
280
|
+
* }
|
|
281
|
+
*
|
|
282
|
+
* // Handle response schema
|
|
283
|
+
* const responseSchema = operation.responses?.['200']?.content?.['application/json']?.schema;
|
|
284
|
+
* const responseModel = this.insertNormalizedModel(
|
|
285
|
+
* new TypeScriptInterface({ ... }),
|
|
286
|
+
* {
|
|
287
|
+
* schema: responseSchema,
|
|
288
|
+
* fallbackName: `${operation.operationId}Response`
|
|
289
|
+
* }
|
|
290
|
+
* );
|
|
291
|
+
*
|
|
292
|
+
* return new Definition({
|
|
293
|
+
* name: operation.operationId,
|
|
294
|
+
* content: `async ${operation.operationId}(data: ${requestType}): Promise<${responseModel.value}>`
|
|
295
|
+
* });
|
|
296
|
+
* }
|
|
297
|
+
* }
|
|
298
|
+
* ```
|
|
299
|
+
*/
|
|
203
300
|
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>;
|
|
204
|
-
/**
|
|
301
|
+
/**
|
|
302
|
+
* Defines and registers a new definition in the generation context.
|
|
303
|
+
*
|
|
304
|
+
* This is an experimental method that allows creating and registering
|
|
305
|
+
* definitions directly without going through the standard insertion flow.
|
|
306
|
+
* Use with caution as the API may change in future versions.
|
|
307
|
+
*
|
|
308
|
+
* @experimental This method's API may change in future versions
|
|
309
|
+
* @template V - Type of generated value
|
|
310
|
+
* @param args - Definition arguments
|
|
311
|
+
* @param args.identifier - Unique identifier for the definition
|
|
312
|
+
* @param args.value - The generated value to associate with the definition
|
|
313
|
+
* @param args.noExport - Whether to skip exporting the definition
|
|
314
|
+
* @returns The created and registered definition
|
|
315
|
+
*
|
|
316
|
+
* @example Creating inline definitions
|
|
317
|
+
* ```typescript
|
|
318
|
+
* class InlineHelperOperation extends OperationBase {
|
|
319
|
+
* toDefinition(): Definition {
|
|
320
|
+
* // Create an inline helper function
|
|
321
|
+
* const helper = this.defineAndRegister({
|
|
322
|
+
* identifier: 'validateRequest',
|
|
323
|
+
* value: 'function validateRequest(data: any) { ... }',
|
|
324
|
+
* noExport: true
|
|
325
|
+
* });
|
|
326
|
+
*
|
|
327
|
+
* return new Definition({
|
|
328
|
+
* name: this.operation.operationId,
|
|
329
|
+
* content: `async ${this.operation.operationId}(data: any) {
|
|
330
|
+
* ${helper.value}(data);
|
|
331
|
+
* return this.request('${this.operation.method}', '${this.operation.path}', data);
|
|
332
|
+
* }`
|
|
333
|
+
* });
|
|
334
|
+
* }
|
|
335
|
+
* }
|
|
336
|
+
* ```
|
|
337
|
+
*/
|
|
205
338
|
defineAndRegister<V extends GeneratedValue>({ identifier, value, noExport }: Omit<DefineAndRegisterArgs<V>, 'destinationPath'>): Definition<V>;
|
|
339
|
+
/**
|
|
340
|
+
* Registers a file-level artifact with the generation context.
|
|
341
|
+
*
|
|
342
|
+
* This method allows the operation generator to register additional content
|
|
343
|
+
* (like imports, exports, or file-level definitions) that should be included
|
|
344
|
+
* in the generated file. The registration is automatically scoped to this
|
|
345
|
+
* operation's export path.
|
|
346
|
+
*
|
|
347
|
+
* @param args - Registration arguments
|
|
348
|
+
* @param args.content - The content to register (import, export, etc.)
|
|
349
|
+
* @param args.phase - When to register the content ('pre' or 'post')
|
|
350
|
+
*
|
|
351
|
+
* @example Registering API client imports
|
|
352
|
+
* ```typescript
|
|
353
|
+
* class HttpOperation extends OperationBase {
|
|
354
|
+
* toDefinition(): Definition {
|
|
355
|
+
* // Register imports needed for HTTP operations
|
|
356
|
+
* this.register({
|
|
357
|
+
* content: "import { ApiClient } from './client';",
|
|
358
|
+
* phase: 'pre'
|
|
359
|
+
* });
|
|
360
|
+
*
|
|
361
|
+
* this.register({
|
|
362
|
+
* content: "import { RequestOptions } from './types';",
|
|
363
|
+
* phase: 'pre'
|
|
364
|
+
* });
|
|
365
|
+
*
|
|
366
|
+
* return new Definition({ ... });
|
|
367
|
+
* }
|
|
368
|
+
* }
|
|
369
|
+
* ```
|
|
370
|
+
*
|
|
371
|
+
* @example Registering utility exports
|
|
372
|
+
* ```typescript
|
|
373
|
+
* class ApiOperationGroup extends OperationBase {
|
|
374
|
+
* toDefinition(): Definition {
|
|
375
|
+
* // Register a utility export after all operations
|
|
376
|
+
* this.register({
|
|
377
|
+
* content: "export const API_VERSION = '1.0';",
|
|
378
|
+
* phase: 'post'
|
|
379
|
+
* });
|
|
380
|
+
*
|
|
381
|
+
* return new Definition({ ... });
|
|
382
|
+
* }
|
|
383
|
+
* }
|
|
384
|
+
* ```
|
|
385
|
+
*/
|
|
206
386
|
register(args: BaseRegisterArgs): void;
|
|
207
387
|
}
|
|
208
388
|
//# sourceMappingURL=OperationBase.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"OperationBase.d.ts","sourceRoot":"","sources":["../../../src/dsl/operation/OperationBase.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"OperationBase.d.ts","sourceRoot":"","sources":["../../../src/dsl/operation/OperationBase.ts"],"names":[],"mappings":"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"}
|
|
@@ -197,6 +197,47 @@ export class OperationBase extends ContentBase {
|
|
|
197
197
|
noExport: options.noExport
|
|
198
198
|
});
|
|
199
199
|
}
|
|
200
|
+
/**
|
|
201
|
+
* Inserts a related model with forced generation.
|
|
202
|
+
*
|
|
203
|
+
* This method adds a model to the current generation context, typically used
|
|
204
|
+
* for request/response models or other types related to the operation. The model
|
|
205
|
+
* will be generated and can be referenced in the operation code.
|
|
206
|
+
*
|
|
207
|
+
* @template V - Type of generated value returned by the insertable
|
|
208
|
+
* @template EnrichmentType - Type of enrichment data for the insertable
|
|
209
|
+
* @param insertable - The model generator to insert
|
|
210
|
+
* @param refName - Reference name for the inserted model
|
|
211
|
+
* @param options - Insertion options
|
|
212
|
+
* @param options.noExport - Whether to skip exporting the inserted model
|
|
213
|
+
* @returns Inserted model reference with generated value
|
|
214
|
+
*
|
|
215
|
+
* @example Inserting request/response models
|
|
216
|
+
* ```typescript
|
|
217
|
+
* class ApiOperation extends OperationBase {
|
|
218
|
+
* toDefinition(): Definition {
|
|
219
|
+
* // Insert request model
|
|
220
|
+
* const requestModel = this.insertModel(
|
|
221
|
+
* new RequestModel({ ... }),
|
|
222
|
+
* 'CreateUserRequest'
|
|
223
|
+
* );
|
|
224
|
+
*
|
|
225
|
+
* // Insert response model
|
|
226
|
+
* const responseModel = this.insertModel(
|
|
227
|
+
* new ResponseModel({ ... }),
|
|
228
|
+
* 'CreateUserResponse'
|
|
229
|
+
* );
|
|
230
|
+
*
|
|
231
|
+
* return new Definition({
|
|
232
|
+
* name: this.operation.operationId,
|
|
233
|
+
* content: `async ${this.operation.operationId}(data: ${requestModel.value}): Promise<${responseModel.value}> {
|
|
234
|
+
* return this.request('${this.operation.method}', '${this.operation.path}', data);
|
|
235
|
+
* }`
|
|
236
|
+
* });
|
|
237
|
+
* }
|
|
238
|
+
* }
|
|
239
|
+
* ```
|
|
240
|
+
*/
|
|
200
241
|
insertModel(insertable, refName, options = {}) {
|
|
201
242
|
return this.context.insertModel(insertable, refName, {
|
|
202
243
|
generation: 'force',
|
|
@@ -204,6 +245,62 @@ export class OperationBase extends ContentBase {
|
|
|
204
245
|
noExport: options.noExport
|
|
205
246
|
});
|
|
206
247
|
}
|
|
248
|
+
/**
|
|
249
|
+
* Inserts a related model with automatic schema normalization and reference resolution.
|
|
250
|
+
*
|
|
251
|
+
* This method intelligently handles schema references from operation request/response
|
|
252
|
+
* bodies, automatically resolving schema references to appropriate model names.
|
|
253
|
+
* This is particularly useful for operations with complex request/response schemas.
|
|
254
|
+
*
|
|
255
|
+
* @template V - Type of generated value returned by the insertable
|
|
256
|
+
* @template Schema - Type of OpenAPI schema (schema object, reference, or void)
|
|
257
|
+
* @template EnrichmentType - Type of enrichment data for the insertable
|
|
258
|
+
* @param insertable - The model generator to insert
|
|
259
|
+
* @param args - Schema normalization arguments
|
|
260
|
+
* @param args.schema - The OpenAPI schema to normalize (from request/response)
|
|
261
|
+
* @param args.fallbackName - Name to use if schema is not a reference
|
|
262
|
+
* @param options - Insertion options
|
|
263
|
+
* @param options.noExport - Whether to skip exporting the inserted model
|
|
264
|
+
* @returns Inserted model reference with normalized name and generated value
|
|
265
|
+
*
|
|
266
|
+
* @example Handling operation request/response schemas
|
|
267
|
+
* ```typescript
|
|
268
|
+
* class RestApiOperation extends OperationBase {
|
|
269
|
+
* toDefinition(): Definition {
|
|
270
|
+
* const operation = this.operation;
|
|
271
|
+
*
|
|
272
|
+
* // Handle request body schema
|
|
273
|
+
* let requestType = 'void';
|
|
274
|
+
* const requestSchema = operation.requestBody?.content?.['application/json']?.schema;
|
|
275
|
+
* if (requestSchema) {
|
|
276
|
+
* const requestModel = this.insertNormalizedModel(
|
|
277
|
+
* new TypeScriptInterface({ ... }),
|
|
278
|
+
* {
|
|
279
|
+
* schema: requestSchema,
|
|
280
|
+
* fallbackName: `${operation.operationId}Request`
|
|
281
|
+
* }
|
|
282
|
+
* );
|
|
283
|
+
* requestType = requestModel.value;
|
|
284
|
+
* }
|
|
285
|
+
*
|
|
286
|
+
* // Handle response schema
|
|
287
|
+
* const responseSchema = operation.responses?.['200']?.content?.['application/json']?.schema;
|
|
288
|
+
* const responseModel = this.insertNormalizedModel(
|
|
289
|
+
* new TypeScriptInterface({ ... }),
|
|
290
|
+
* {
|
|
291
|
+
* schema: responseSchema,
|
|
292
|
+
* fallbackName: `${operation.operationId}Response`
|
|
293
|
+
* }
|
|
294
|
+
* );
|
|
295
|
+
*
|
|
296
|
+
* return new Definition({
|
|
297
|
+
* name: operation.operationId,
|
|
298
|
+
* content: `async ${operation.operationId}(data: ${requestType}): Promise<${responseModel.value}>`
|
|
299
|
+
* });
|
|
300
|
+
* }
|
|
301
|
+
* }
|
|
302
|
+
* ```
|
|
303
|
+
*/
|
|
207
304
|
insertNormalizedModel(insertable, { schema, fallbackName }, options = {}) {
|
|
208
305
|
return this.context.insertNormalisedModel(insertable, {
|
|
209
306
|
schema,
|
|
@@ -211,7 +308,43 @@ export class OperationBase extends ContentBase {
|
|
|
211
308
|
destinationPath: this.settings.exportPath
|
|
212
309
|
}, options);
|
|
213
310
|
}
|
|
214
|
-
/**
|
|
311
|
+
/**
|
|
312
|
+
* Defines and registers a new definition in the generation context.
|
|
313
|
+
*
|
|
314
|
+
* This is an experimental method that allows creating and registering
|
|
315
|
+
* definitions directly without going through the standard insertion flow.
|
|
316
|
+
* Use with caution as the API may change in future versions.
|
|
317
|
+
*
|
|
318
|
+
* @experimental This method's API may change in future versions
|
|
319
|
+
* @template V - Type of generated value
|
|
320
|
+
* @param args - Definition arguments
|
|
321
|
+
* @param args.identifier - Unique identifier for the definition
|
|
322
|
+
* @param args.value - The generated value to associate with the definition
|
|
323
|
+
* @param args.noExport - Whether to skip exporting the definition
|
|
324
|
+
* @returns The created and registered definition
|
|
325
|
+
*
|
|
326
|
+
* @example Creating inline definitions
|
|
327
|
+
* ```typescript
|
|
328
|
+
* class InlineHelperOperation extends OperationBase {
|
|
329
|
+
* toDefinition(): Definition {
|
|
330
|
+
* // Create an inline helper function
|
|
331
|
+
* const helper = this.defineAndRegister({
|
|
332
|
+
* identifier: 'validateRequest',
|
|
333
|
+
* value: 'function validateRequest(data: any) { ... }',
|
|
334
|
+
* noExport: true
|
|
335
|
+
* });
|
|
336
|
+
*
|
|
337
|
+
* return new Definition({
|
|
338
|
+
* name: this.operation.operationId,
|
|
339
|
+
* content: `async ${this.operation.operationId}(data: any) {
|
|
340
|
+
* ${helper.value}(data);
|
|
341
|
+
* return this.request('${this.operation.method}', '${this.operation.path}', data);
|
|
342
|
+
* }`
|
|
343
|
+
* });
|
|
344
|
+
* }
|
|
345
|
+
* }
|
|
346
|
+
* ```
|
|
347
|
+
*/
|
|
215
348
|
defineAndRegister({ identifier, value, noExport }) {
|
|
216
349
|
return this.context.defineAndRegister({
|
|
217
350
|
identifier,
|
|
@@ -220,6 +353,53 @@ export class OperationBase extends ContentBase {
|
|
|
220
353
|
noExport
|
|
221
354
|
});
|
|
222
355
|
}
|
|
356
|
+
/**
|
|
357
|
+
* Registers a file-level artifact with the generation context.
|
|
358
|
+
*
|
|
359
|
+
* This method allows the operation generator to register additional content
|
|
360
|
+
* (like imports, exports, or file-level definitions) that should be included
|
|
361
|
+
* in the generated file. The registration is automatically scoped to this
|
|
362
|
+
* operation's export path.
|
|
363
|
+
*
|
|
364
|
+
* @param args - Registration arguments
|
|
365
|
+
* @param args.content - The content to register (import, export, etc.)
|
|
366
|
+
* @param args.phase - When to register the content ('pre' or 'post')
|
|
367
|
+
*
|
|
368
|
+
* @example Registering API client imports
|
|
369
|
+
* ```typescript
|
|
370
|
+
* class HttpOperation extends OperationBase {
|
|
371
|
+
* toDefinition(): Definition {
|
|
372
|
+
* // Register imports needed for HTTP operations
|
|
373
|
+
* this.register({
|
|
374
|
+
* content: "import { ApiClient } from './client';",
|
|
375
|
+
* phase: 'pre'
|
|
376
|
+
* });
|
|
377
|
+
*
|
|
378
|
+
* this.register({
|
|
379
|
+
* content: "import { RequestOptions } from './types';",
|
|
380
|
+
* phase: 'pre'
|
|
381
|
+
* });
|
|
382
|
+
*
|
|
383
|
+
* return new Definition({ ... });
|
|
384
|
+
* }
|
|
385
|
+
* }
|
|
386
|
+
* ```
|
|
387
|
+
*
|
|
388
|
+
* @example Registering utility exports
|
|
389
|
+
* ```typescript
|
|
390
|
+
* class ApiOperationGroup extends OperationBase {
|
|
391
|
+
* toDefinition(): Definition {
|
|
392
|
+
* // Register a utility export after all operations
|
|
393
|
+
* this.register({
|
|
394
|
+
* content: "export const API_VERSION = '1.0';",
|
|
395
|
+
* phase: 'post'
|
|
396
|
+
* });
|
|
397
|
+
*
|
|
398
|
+
* return new Definition({ ... });
|
|
399
|
+
* }
|
|
400
|
+
* }
|
|
401
|
+
* ```
|
|
402
|
+
*/
|
|
223
403
|
register(args) {
|
|
224
404
|
this.context.register({
|
|
225
405
|
...args,
|