@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.
Files changed (47) hide show
  1. package/esm/dsl/Identifier.d.ts +152 -0
  2. package/esm/dsl/Identifier.d.ts.map +1 -1
  3. package/esm/dsl/Identifier.js +152 -0
  4. package/esm/dsl/Import.d.ts +221 -0
  5. package/esm/dsl/Import.d.ts.map +1 -1
  6. package/esm/dsl/Import.js +202 -0
  7. package/esm/dsl/operation/OperationBase.d.ts +181 -1
  8. package/esm/dsl/operation/OperationBase.d.ts.map +1 -1
  9. package/esm/dsl/operation/OperationBase.js +181 -1
  10. package/esm/oas/document/Document.d.ts +155 -1
  11. package/esm/oas/document/Document.d.ts.map +1 -1
  12. package/esm/oas/document/Document.js +141 -2
  13. package/esm/oas/object/Object.d.ts +255 -10
  14. package/esm/oas/object/Object.d.ts.map +1 -1
  15. package/esm/oas/object/Object.js +229 -10
  16. package/esm/types/GeneratorKeys.d.ts +336 -0
  17. package/esm/types/GeneratorKeys.d.ts.map +1 -1
  18. package/esm/types/GeneratorKeys.js +243 -0
  19. package/esm/types/GeneratorType.d.ts +119 -0
  20. package/esm/types/GeneratorType.d.ts.map +1 -1
  21. package/esm/types/Method.d.ts +109 -0
  22. package/esm/types/Method.d.ts.map +1 -1
  23. package/esm/types/Method.js +84 -0
  24. package/package.json +1 -1
  25. package/script/dsl/Identifier.d.ts +152 -0
  26. package/script/dsl/Identifier.d.ts.map +1 -1
  27. package/script/dsl/Identifier.js +152 -0
  28. package/script/dsl/Import.d.ts +221 -0
  29. package/script/dsl/Import.d.ts.map +1 -1
  30. package/script/dsl/Import.js +202 -0
  31. package/script/dsl/operation/OperationBase.d.ts +181 -1
  32. package/script/dsl/operation/OperationBase.d.ts.map +1 -1
  33. package/script/dsl/operation/OperationBase.js +181 -1
  34. package/script/oas/document/Document.d.ts +155 -1
  35. package/script/oas/document/Document.d.ts.map +1 -1
  36. package/script/oas/document/Document.js +141 -2
  37. package/script/oas/object/Object.d.ts +255 -10
  38. package/script/oas/object/Object.d.ts.map +1 -1
  39. package/script/oas/object/Object.js +229 -10
  40. package/script/types/GeneratorKeys.d.ts +336 -0
  41. package/script/types/GeneratorKeys.d.ts.map +1 -1
  42. package/script/types/GeneratorKeys.js +243 -0
  43. package/script/types/GeneratorType.d.ts +119 -0
  44. package/script/types/GeneratorType.d.ts.map +1 -1
  45. package/script/types/Method.d.ts +109 -0
  46. package/script/types/Method.d.ts.map +1 -1
  47. 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
- /** @experimental */
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":"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"}
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
- /** @experimental */
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,