@alagoni97/cli 0.72.1
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/LICENSE +201 -0
- package/README.md +336 -0
- package/bin/dev.cmd +3 -0
- package/bin/dev.mjs +3 -0
- package/bin/run.cmd +3 -0
- package/bin/run.mjs +4 -0
- package/dist/LoggingInterface.d.ts +123 -0
- package/dist/LoggingInterface.js +300 -0
- package/dist/PersistedConfig.d.ts +46 -0
- package/dist/PersistedConfig.js +94 -0
- package/dist/browser/adapters/output.d.ts +69 -0
- package/dist/browser/adapters/output.js +91 -0
- package/dist/browser/config.d.ts +18 -0
- package/dist/browser/config.js +59 -0
- package/dist/browser/generate.d.ts +20 -0
- package/dist/browser/generate.js +129 -0
- package/dist/browser/index.d.ts +17 -0
- package/dist/browser/index.js +26 -0
- package/dist/browser/parser.d.ts +9 -0
- package/dist/browser/parser.js +61 -0
- package/dist/browser/shims/asyncapi-parser.d.ts +30 -0
- package/dist/browser/shims/asyncapi-parser.js +52 -0
- package/dist/browser/shims/fs.d.ts +190 -0
- package/dist/browser/shims/fs.js +188 -0
- package/dist/browser/shims/json-schema-ref-parser.d.ts +73 -0
- package/dist/browser/shims/json-schema-ref-parser.js +246 -0
- package/dist/browser/shims/swagger-parser.d.ts +20 -0
- package/dist/browser/shims/swagger-parser.js +40 -0
- package/dist/codegen/configurationSchemaBuilder.d.ts +15 -0
- package/dist/codegen/configurationSchemaBuilder.js +48 -0
- package/dist/codegen/configurations.d.ts +29 -0
- package/dist/codegen/configurations.js +260 -0
- package/dist/codegen/detection.d.ts +19 -0
- package/dist/codegen/detection.js +174 -0
- package/dist/codegen/errors.d.ts +111 -0
- package/dist/codegen/errors.js +352 -0
- package/dist/codegen/generators/generic/custom.d.ts +75 -0
- package/dist/codegen/generators/generic/custom.js +66 -0
- package/dist/codegen/generators/index.d.ts +14 -0
- package/dist/codegen/generators/index.js +42 -0
- package/dist/codegen/generators/typescript/channels/asyncapi.d.ts +10 -0
- package/dist/codegen/generators/typescript/channels/asyncapi.js +131 -0
- package/dist/codegen/generators/typescript/channels/index.d.ts +8 -0
- package/dist/codegen/generators/typescript/channels/index.js +142 -0
- package/dist/codegen/generators/typescript/channels/openapi.d.ts +9 -0
- package/dist/codegen/generators/typescript/channels/openapi.js +168 -0
- package/dist/codegen/generators/typescript/channels/protocols/amqp/index.d.ts +7 -0
- package/dist/codegen/generators/typescript/channels/protocols/amqp/index.js +149 -0
- package/dist/codegen/generators/typescript/channels/protocols/amqp/publishExchange.d.ts +5 -0
- package/dist/codegen/generators/typescript/channels/protocols/amqp/publishExchange.js +106 -0
- package/dist/codegen/generators/typescript/channels/protocols/amqp/publishQueue.d.ts +3 -0
- package/dist/codegen/generators/typescript/channels/protocols/amqp/publishQueue.js +102 -0
- package/dist/codegen/generators/typescript/channels/protocols/amqp/subscribeQueue.d.ts +3 -0
- package/dist/codegen/generators/typescript/channels/protocols/amqp/subscribeQueue.js +133 -0
- package/dist/codegen/generators/typescript/channels/protocols/eventsource/express.d.ts +3 -0
- package/dist/codegen/generators/typescript/channels/protocols/eventsource/express.js +100 -0
- package/dist/codegen/generators/typescript/channels/protocols/eventsource/fetch.d.ts +5 -0
- package/dist/codegen/generators/typescript/channels/protocols/eventsource/fetch.js +144 -0
- package/dist/codegen/generators/typescript/channels/protocols/eventsource/index.d.ts +6 -0
- package/dist/codegen/generators/typescript/channels/protocols/eventsource/index.js +132 -0
- package/dist/codegen/generators/typescript/channels/protocols/http/client.d.ts +10 -0
- package/dist/codegen/generators/typescript/channels/protocols/http/client.js +224 -0
- package/dist/codegen/generators/typescript/channels/protocols/http/common-types.d.ts +14 -0
- package/dist/codegen/generators/typescript/channels/protocols/http/common-types.js +800 -0
- package/dist/codegen/generators/typescript/channels/protocols/http/index.d.ts +8 -0
- package/dist/codegen/generators/typescript/channels/protocols/http/index.js +96 -0
- package/dist/codegen/generators/typescript/channels/protocols/http/security.d.ts +48 -0
- package/dist/codegen/generators/typescript/channels/protocols/http/security.js +491 -0
- package/dist/codegen/generators/typescript/channels/protocols/kafka/index.d.ts +6 -0
- package/dist/codegen/generators/typescript/channels/protocols/kafka/index.js +127 -0
- package/dist/codegen/generators/typescript/channels/protocols/kafka/publish.d.ts +3 -0
- package/dist/codegen/generators/typescript/channels/protocols/kafka/publish.js +108 -0
- package/dist/codegen/generators/typescript/channels/protocols/kafka/subscribe.d.ts +3 -0
- package/dist/codegen/generators/typescript/channels/protocols/kafka/subscribe.js +154 -0
- package/dist/codegen/generators/typescript/channels/protocols/kafka/utils.d.ts +11 -0
- package/dist/codegen/generators/typescript/channels/protocols/kafka/utils.js +58 -0
- package/dist/codegen/generators/typescript/channels/protocols/mqtt/index.d.ts +6 -0
- package/dist/codegen/generators/typescript/channels/protocols/mqtt/index.js +113 -0
- package/dist/codegen/generators/typescript/channels/protocols/mqtt/publish.d.ts +3 -0
- package/dist/codegen/generators/typescript/channels/protocols/mqtt/publish.js +99 -0
- package/dist/codegen/generators/typescript/channels/protocols/mqtt/subscribe.d.ts +3 -0
- package/dist/codegen/generators/typescript/channels/protocols/mqtt/subscribe.js +186 -0
- package/dist/codegen/generators/typescript/channels/protocols/nats/corePublish.d.ts +3 -0
- package/dist/codegen/generators/typescript/channels/protocols/nats/corePublish.js +90 -0
- package/dist/codegen/generators/typescript/channels/protocols/nats/coreReply.d.ts +3 -0
- package/dist/codegen/generators/typescript/channels/protocols/nats/coreReply.js +142 -0
- package/dist/codegen/generators/typescript/channels/protocols/nats/coreRequest.d.ts +3 -0
- package/dist/codegen/generators/typescript/channels/protocols/nats/coreRequest.js +100 -0
- package/dist/codegen/generators/typescript/channels/protocols/nats/coreSubscribe.d.ts +3 -0
- package/dist/codegen/generators/typescript/channels/protocols/nats/coreSubscribe.js +143 -0
- package/dist/codegen/generators/typescript/channels/protocols/nats/index.d.ts +11 -0
- package/dist/codegen/generators/typescript/channels/protocols/nats/index.js +224 -0
- package/dist/codegen/generators/typescript/channels/protocols/nats/jetstreamPublish.d.ts +3 -0
- package/dist/codegen/generators/typescript/channels/protocols/nats/jetstreamPublish.js +89 -0
- package/dist/codegen/generators/typescript/channels/protocols/nats/jetstreamPullSubscribe.d.ts +3 -0
- package/dist/codegen/generators/typescript/channels/protocols/nats/jetstreamPullSubscribe.js +146 -0
- package/dist/codegen/generators/typescript/channels/protocols/nats/jetstreamPushSubscription.d.ts +3 -0
- package/dist/codegen/generators/typescript/channels/protocols/nats/jetstreamPushSubscription.js +149 -0
- package/dist/codegen/generators/typescript/channels/protocols/nats/utils.d.ts +35 -0
- package/dist/codegen/generators/typescript/channels/protocols/nats/utils.js +120 -0
- package/dist/codegen/generators/typescript/channels/protocols/websocket/index.d.ts +7 -0
- package/dist/codegen/generators/typescript/channels/protocols/websocket/index.js +152 -0
- package/dist/codegen/generators/typescript/channels/protocols/websocket/publish.d.ts +3 -0
- package/dist/codegen/generators/typescript/channels/protocols/websocket/publish.js +64 -0
- package/dist/codegen/generators/typescript/channels/protocols/websocket/register.d.ts +3 -0
- package/dist/codegen/generators/typescript/channels/protocols/websocket/register.js +115 -0
- package/dist/codegen/generators/typescript/channels/protocols/websocket/subscribe.d.ts +3 -0
- package/dist/codegen/generators/typescript/channels/protocols/websocket/subscribe.js +151 -0
- package/dist/codegen/generators/typescript/channels/types.d.ts +181 -0
- package/dist/codegen/generators/typescript/channels/types.js +131 -0
- package/dist/codegen/generators/typescript/channels/utils.d.ts +64 -0
- package/dist/codegen/generators/typescript/channels/utils.js +163 -0
- package/dist/codegen/generators/typescript/client/index.d.ts +8 -0
- package/dist/codegen/generators/typescript/client/index.js +61 -0
- package/dist/codegen/generators/typescript/client/protocols/nats/corePublish.d.ts +6 -0
- package/dist/codegen/generators/typescript/client/protocols/nats/corePublish.js +53 -0
- package/dist/codegen/generators/typescript/client/protocols/nats/coreSubscribe.d.ts +6 -0
- package/dist/codegen/generators/typescript/client/protocols/nats/coreSubscribe.js +90 -0
- package/dist/codegen/generators/typescript/client/protocols/nats/jetStreamPullSubscription.d.ts +6 -0
- package/dist/codegen/generators/typescript/client/protocols/nats/jetStreamPullSubscription.js +83 -0
- package/dist/codegen/generators/typescript/client/protocols/nats/jetstreamPublish.d.ts +6 -0
- package/dist/codegen/generators/typescript/client/protocols/nats/jetstreamPublish.js +54 -0
- package/dist/codegen/generators/typescript/client/protocols/nats/jetstreamPushSubscription.d.ts +6 -0
- package/dist/codegen/generators/typescript/client/protocols/nats/jetstreamPushSubscription.js +82 -0
- package/dist/codegen/generators/typescript/client/protocols/nats.d.ts +2 -0
- package/dist/codegen/generators/typescript/client/protocols/nats.js +182 -0
- package/dist/codegen/generators/typescript/client/types.d.ts +49 -0
- package/dist/codegen/generators/typescript/client/types.js +37 -0
- package/dist/codegen/generators/typescript/headers.d.ts +54 -0
- package/dist/codegen/generators/typescript/headers.js +138 -0
- package/dist/codegen/generators/typescript/index.d.ts +7 -0
- package/dist/codegen/generators/typescript/index.js +38 -0
- package/dist/codegen/generators/typescript/models.d.ts +21761 -0
- package/dist/codegen/generators/typescript/models.js +64 -0
- package/dist/codegen/generators/typescript/parameters.d.ts +37 -0
- package/dist/codegen/generators/typescript/parameters.js +101 -0
- package/dist/codegen/generators/typescript/payloads.d.ts +73 -0
- package/dist/codegen/generators/typescript/payloads.js +250 -0
- package/dist/codegen/generators/typescript/types.d.ts +34 -0
- package/dist/codegen/generators/typescript/types.js +70 -0
- package/dist/codegen/generators/typescript/utils.d.ts +38 -0
- package/dist/codegen/generators/typescript/utils.js +195 -0
- package/dist/codegen/index.d.ts +7 -0
- package/dist/codegen/index.js +38 -0
- package/dist/codegen/inputs/asyncapi/generators/headers.d.ts +3 -0
- package/dist/codegen/inputs/asyncapi/generators/headers.js +41 -0
- package/dist/codegen/inputs/asyncapi/generators/parameters.d.ts +14 -0
- package/dist/codegen/inputs/asyncapi/generators/parameters.js +120 -0
- package/dist/codegen/inputs/asyncapi/generators/payloads.d.ts +16 -0
- package/dist/codegen/inputs/asyncapi/generators/payloads.js +124 -0
- package/dist/codegen/inputs/asyncapi/generators/types.d.ts +9 -0
- package/dist/codegen/inputs/asyncapi/generators/types.js +61 -0
- package/dist/codegen/inputs/asyncapi/index.d.ts +1 -0
- package/dist/codegen/inputs/asyncapi/index.js +7 -0
- package/dist/codegen/inputs/asyncapi/parser.d.ts +4 -0
- package/dist/codegen/inputs/asyncapi/parser.js +90 -0
- package/dist/codegen/inputs/index.d.ts +3 -0
- package/dist/codegen/inputs/index.js +19 -0
- package/dist/codegen/inputs/jsonschema/generators/index.d.ts +1 -0
- package/dist/codegen/inputs/jsonschema/generators/index.js +5 -0
- package/dist/codegen/inputs/jsonschema/generators/models.d.ts +7 -0
- package/dist/codegen/inputs/jsonschema/generators/models.js +26 -0
- package/dist/codegen/inputs/jsonschema/index.d.ts +1 -0
- package/dist/codegen/inputs/jsonschema/index.js +7 -0
- package/dist/codegen/inputs/jsonschema/parser.d.ts +31 -0
- package/dist/codegen/inputs/jsonschema/parser.js +128 -0
- package/dist/codegen/inputs/openapi/generators/headers.d.ts +3 -0
- package/dist/codegen/inputs/openapi/generators/headers.js +101 -0
- package/dist/codegen/inputs/openapi/generators/parameters.d.ts +10 -0
- package/dist/codegen/inputs/openapi/generators/parameters.js +852 -0
- package/dist/codegen/inputs/openapi/generators/payloads.d.ts +3 -0
- package/dist/codegen/inputs/openapi/generators/payloads.js +231 -0
- package/dist/codegen/inputs/openapi/generators/types.d.ts +9 -0
- package/dist/codegen/inputs/openapi/generators/types.js +86 -0
- package/dist/codegen/inputs/openapi/index.d.ts +2 -0
- package/dist/codegen/inputs/openapi/index.js +8 -0
- package/dist/codegen/inputs/openapi/parser.d.ts +4 -0
- package/dist/codegen/inputs/openapi/parser.js +115 -0
- package/dist/codegen/inputs/openapi/security.d.ts +56 -0
- package/dist/codegen/inputs/openapi/security.js +193 -0
- package/dist/codegen/modelina/index.d.ts +2 -0
- package/dist/codegen/modelina/index.js +20 -0
- package/dist/codegen/modelina/presets/index.d.ts +3 -0
- package/dist/codegen/modelina/presets/index.js +14 -0
- package/dist/codegen/modelina/presets/primitives.d.ts +34 -0
- package/dist/codegen/modelina/presets/primitives.js +211 -0
- package/dist/codegen/modelina/presets/union.d.ts +33 -0
- package/dist/codegen/modelina/presets/union.js +197 -0
- package/dist/codegen/modelina/presets/validation.d.ts +66 -0
- package/dist/codegen/modelina/presets/validation.js +183 -0
- package/dist/codegen/modelina/types.d.ts +61845 -0
- package/dist/codegen/modelina/types.js +412 -0
- package/dist/codegen/output/filesystem.d.ts +30 -0
- package/dist/codegen/output/filesystem.js +61 -0
- package/dist/codegen/output/index.d.ts +16 -0
- package/dist/codegen/output/index.js +57 -0
- package/dist/codegen/output/memory.d.ts +54 -0
- package/dist/codegen/output/memory.js +81 -0
- package/dist/codegen/output/modelina.d.ts +30 -0
- package/dist/codegen/output/modelina.js +30 -0
- package/dist/codegen/output/types.d.ts +47 -0
- package/dist/codegen/output/types.js +6 -0
- package/dist/codegen/renderer.d.ts +13 -0
- package/dist/codegen/renderer.js +309 -0
- package/dist/codegen/schemaPostProcess.d.ts +25 -0
- package/dist/codegen/schemaPostProcess.js +38 -0
- package/dist/codegen/types.d.ts +285187 -0
- package/dist/codegen/types.js +177 -0
- package/dist/codegen/utils.d.ts +126 -0
- package/dist/codegen/utils.js +373 -0
- package/dist/commands/base.d.ts +18 -0
- package/dist/commands/base.js +59 -0
- package/dist/commands/generate.d.ts +46 -0
- package/dist/commands/generate.js +305 -0
- package/dist/commands/init.d.ts +55 -0
- package/dist/commands/init.js +544 -0
- package/dist/commands/telemetry.d.ts +25 -0
- package/dist/commands/telemetry.js +115 -0
- package/dist/index.d.ts +29 -0
- package/dist/index.js +35 -0
- package/dist/telemetry/anonymize.d.ts +19 -0
- package/dist/telemetry/anonymize.js +73 -0
- package/dist/telemetry/collector.d.ts +26 -0
- package/dist/telemetry/collector.js +57 -0
- package/dist/telemetry/config.d.ts +32 -0
- package/dist/telemetry/config.js +97 -0
- package/dist/telemetry/events.d.ts +72 -0
- package/dist/telemetry/events.js +5 -0
- package/dist/telemetry/index.d.ts +46 -0
- package/dist/telemetry/index.js +91 -0
- package/dist/telemetry/notice.d.ts +8 -0
- package/dist/telemetry/notice.js +50 -0
- package/dist/telemetry/sender.d.ts +14 -0
- package/dist/telemetry/sender.js +125 -0
- package/dist/utils/gitignore.d.ts +66 -0
- package/dist/utils/gitignore.js +111 -0
- package/dist/utils/inputSource.d.ts +3 -0
- package/dist/utils/inputSource.js +26 -0
- package/dist/utils/refResolvers.d.ts +29 -0
- package/dist/utils/refResolvers.js +83 -0
- package/dist/utils/remoteFetch.d.ts +18 -0
- package/dist/utils/remoteFetch.js +64 -0
- package/oclif.manifest.json +510 -0
- package/package.json +155 -0
|
@@ -0,0 +1,81 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.MemoryAdapter = void 0;
|
|
4
|
+
/**
|
|
5
|
+
* MemoryAdapter stores files in memory using a Map.
|
|
6
|
+
* Used in browser context for in-memory code generation.
|
|
7
|
+
*/
|
|
8
|
+
class MemoryAdapter {
|
|
9
|
+
files = new Map();
|
|
10
|
+
basePath;
|
|
11
|
+
constructor(options) {
|
|
12
|
+
// Normalize basePath - remove trailing slashes
|
|
13
|
+
this.basePath = (options?.basePath ?? '').replace(/\/+$/, '');
|
|
14
|
+
}
|
|
15
|
+
/**
|
|
16
|
+
* Write content to memory.
|
|
17
|
+
*/
|
|
18
|
+
async write(filePath, content) {
|
|
19
|
+
const resolvedPath = this.resolvePath(filePath);
|
|
20
|
+
this.files.set(resolvedPath, content);
|
|
21
|
+
}
|
|
22
|
+
/**
|
|
23
|
+
* No-op for memory adapter - directories are virtual.
|
|
24
|
+
*/
|
|
25
|
+
async mkdir(_dirPath, _options) {
|
|
26
|
+
// No-op - directories are virtual in memory
|
|
27
|
+
}
|
|
28
|
+
/**
|
|
29
|
+
* Get all file paths that were written.
|
|
30
|
+
*/
|
|
31
|
+
getWrittenFiles() {
|
|
32
|
+
return [...this.files.keys()];
|
|
33
|
+
}
|
|
34
|
+
/**
|
|
35
|
+
* Get all files with their content.
|
|
36
|
+
*/
|
|
37
|
+
getAllFiles() {
|
|
38
|
+
const result = {};
|
|
39
|
+
for (const [filePath, content] of this.files) {
|
|
40
|
+
result[filePath] = content;
|
|
41
|
+
}
|
|
42
|
+
return result;
|
|
43
|
+
}
|
|
44
|
+
/**
|
|
45
|
+
* Read a file from memory.
|
|
46
|
+
* @param filePath - The file path
|
|
47
|
+
* @returns The file content, or undefined if not found
|
|
48
|
+
*/
|
|
49
|
+
read(filePath) {
|
|
50
|
+
return this.files.get(this.resolvePath(filePath));
|
|
51
|
+
}
|
|
52
|
+
/**
|
|
53
|
+
* Clear all files from memory.
|
|
54
|
+
*/
|
|
55
|
+
clear() {
|
|
56
|
+
this.files.clear();
|
|
57
|
+
}
|
|
58
|
+
/**
|
|
59
|
+
* Check if a file exists.
|
|
60
|
+
*/
|
|
61
|
+
has(filePath) {
|
|
62
|
+
return this.files.has(this.resolvePath(filePath));
|
|
63
|
+
}
|
|
64
|
+
/**
|
|
65
|
+
* Get the number of files.
|
|
66
|
+
*/
|
|
67
|
+
get size() {
|
|
68
|
+
return this.files.size;
|
|
69
|
+
}
|
|
70
|
+
/**
|
|
71
|
+
* Resolve a file path with the base path.
|
|
72
|
+
*/
|
|
73
|
+
resolvePath(filePath) {
|
|
74
|
+
if (!this.basePath) {
|
|
75
|
+
return filePath;
|
|
76
|
+
}
|
|
77
|
+
// Normalize to avoid double slashes
|
|
78
|
+
return `${this.basePath}/${filePath}`.replace(/\/+/g, '/');
|
|
79
|
+
}
|
|
80
|
+
}
|
|
81
|
+
exports.MemoryAdapter = MemoryAdapter;
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Modelina integration for pure-core code generation.
|
|
3
|
+
* Generates models in-memory and returns them as GeneratedFile[].
|
|
4
|
+
* No I/O is performed - writing files is handled by the CLI layer.
|
|
5
|
+
*/
|
|
6
|
+
import { TypeScriptFileGenerator, TypeScriptRenderCompleteModelOptions, OutputModel } from '@asyncapi/modelina';
|
|
7
|
+
import { GeneratedFile } from '../types';
|
|
8
|
+
export interface GenerateModelsArgs {
|
|
9
|
+
/** The Modelina generator instance */
|
|
10
|
+
generator: TypeScriptFileGenerator;
|
|
11
|
+
/** The input schema (JSON Schema or any format Modelina accepts) */
|
|
12
|
+
input: unknown;
|
|
13
|
+
/** The output path to use for file names (e.g., 'src/models') */
|
|
14
|
+
outputPath: string;
|
|
15
|
+
/** Optional render options */
|
|
16
|
+
options?: Partial<TypeScriptRenderCompleteModelOptions>;
|
|
17
|
+
}
|
|
18
|
+
export interface GenerateModelsResult {
|
|
19
|
+
/** The generated models */
|
|
20
|
+
models: OutputModel[];
|
|
21
|
+
/** Generated files with path and content */
|
|
22
|
+
files: GeneratedFile[];
|
|
23
|
+
}
|
|
24
|
+
/**
|
|
25
|
+
* Generate models using Modelina.
|
|
26
|
+
* Returns files as data - no I/O is performed.
|
|
27
|
+
*
|
|
28
|
+
* @returns The generated models and files
|
|
29
|
+
*/
|
|
30
|
+
export declare function generateModels({ generator, input, outputPath, options }: GenerateModelsArgs): Promise<GenerateModelsResult>;
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.generateModels = void 0;
|
|
4
|
+
/**
|
|
5
|
+
* Generate models using Modelina.
|
|
6
|
+
* Returns files as data - no I/O is performed.
|
|
7
|
+
*
|
|
8
|
+
* @returns The generated models and files
|
|
9
|
+
*/
|
|
10
|
+
async function generateModels({ generator, input, outputPath, options = {} }) {
|
|
11
|
+
const files = [];
|
|
12
|
+
// Use Modelina's generateCompleteModels() which returns OutputModel[] with rendered content
|
|
13
|
+
// This is the same method used by generateToFiles() internally, but without writing to disk
|
|
14
|
+
const models = await generator.generateCompleteModels(input, {
|
|
15
|
+
exportType: options.exportType ?? 'named'
|
|
16
|
+
});
|
|
17
|
+
// Filter out any models that weren't successfully generated
|
|
18
|
+
const validModels = models.filter((model) => model.modelName !== '');
|
|
19
|
+
// Collect files as data (no I/O)
|
|
20
|
+
for (const model of validModels) {
|
|
21
|
+
const fileName = `${model.modelName}.ts`;
|
|
22
|
+
const filePath = `${outputPath}/${fileName}`;
|
|
23
|
+
files.push({ path: filePath, content: model.result });
|
|
24
|
+
}
|
|
25
|
+
return {
|
|
26
|
+
models: validModels,
|
|
27
|
+
files
|
|
28
|
+
};
|
|
29
|
+
}
|
|
30
|
+
exports.generateModels = generateModels;
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Output adapter types for abstracting file output operations.
|
|
3
|
+
* Allows generators to work in both CLI (filesystem) and browser (memory) environments.
|
|
4
|
+
*/
|
|
5
|
+
/**
|
|
6
|
+
* Abstract interface for file output operations.
|
|
7
|
+
* Allows generators to work in both CLI (filesystem) and browser (memory) environments.
|
|
8
|
+
*/
|
|
9
|
+
export interface OutputAdapter {
|
|
10
|
+
/**
|
|
11
|
+
* Write content to a file path.
|
|
12
|
+
* @param filePath - The file path to write to (relative or absolute)
|
|
13
|
+
* @param content - The content to write
|
|
14
|
+
*/
|
|
15
|
+
write(filePath: string, content: string): Promise<void>;
|
|
16
|
+
/**
|
|
17
|
+
* Create a directory.
|
|
18
|
+
* @param dirPath - The directory path to create
|
|
19
|
+
* @param options - Options (e.g., recursive)
|
|
20
|
+
*/
|
|
21
|
+
mkdir(dirPath: string, options?: {
|
|
22
|
+
recursive?: boolean;
|
|
23
|
+
}): Promise<void>;
|
|
24
|
+
/**
|
|
25
|
+
* Get all written files (for tracking/reporting).
|
|
26
|
+
* @returns Array of file paths that were written
|
|
27
|
+
*/
|
|
28
|
+
getWrittenFiles(): string[];
|
|
29
|
+
/**
|
|
30
|
+
* Get all files with their content.
|
|
31
|
+
* For FileSystemAdapter, this returns an empty object (use getWrittenFiles() for paths).
|
|
32
|
+
* For MemoryAdapter, this returns all files with their content.
|
|
33
|
+
* @returns Record of path to content
|
|
34
|
+
*/
|
|
35
|
+
getAllFiles(): Record<string, string>;
|
|
36
|
+
}
|
|
37
|
+
/**
|
|
38
|
+
* Options for OutputAdapter implementations.
|
|
39
|
+
*/
|
|
40
|
+
export interface OutputAdapterOptions {
|
|
41
|
+
/**
|
|
42
|
+
* Base path for resolving relative paths.
|
|
43
|
+
* For FileSystemAdapter: directory on disk
|
|
44
|
+
* For MemoryAdapter: prefix for virtual paths
|
|
45
|
+
*/
|
|
46
|
+
basePath?: string;
|
|
47
|
+
}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import { GenerationResult, Generators, GeneratorsInternal, RenderTypes, RunGeneratorContext } from './types';
|
|
2
|
+
import Graph from 'graphology';
|
|
3
|
+
export type Node = {
|
|
4
|
+
generator: Generators;
|
|
5
|
+
};
|
|
6
|
+
type GraphType = Graph<Node>;
|
|
7
|
+
export declare function renderGenerator(generator: GeneratorsInternal, context: RunGeneratorContext, renderedContext: Record<string, unknown>): Promise<RenderTypes>;
|
|
8
|
+
export declare function determineRenderGraph(context: RunGeneratorContext): GraphType;
|
|
9
|
+
/**
|
|
10
|
+
* Recursively go over all nodes and render those that are ready to be rendered (no dependencies that have not been rendered) and recursively do it until no nodes are left
|
|
11
|
+
*/
|
|
12
|
+
export declare function renderGraph(context: RunGeneratorContext, graph: GraphType): Promise<GenerationResult>;
|
|
13
|
+
export {};
|
|
@@ -0,0 +1,309 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
+
};
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
exports.renderGraph = exports.determineRenderGraph = exports.renderGenerator = void 0;
|
|
7
|
+
const LoggingInterface_1 = require("../LoggingInterface");
|
|
8
|
+
const generators_1 = require("./generators");
|
|
9
|
+
const path_1 = __importDefault(require("path"));
|
|
10
|
+
const graphology_1 = __importDefault(require("graphology"));
|
|
11
|
+
const utils_1 = require("./utils");
|
|
12
|
+
const models_1 = require("./generators/typescript/models");
|
|
13
|
+
const errors_1 = require("./errors");
|
|
14
|
+
//eslint-disable-next-line sonarjs/cognitive-complexity
|
|
15
|
+
async function renderGenerator(generator, context, renderedContext) {
|
|
16
|
+
const { configuration, asyncapiDocument, openapiDocument, jsonSchemaDocument, configFilePath } = context;
|
|
17
|
+
const outputPath = path_1.default.resolve(path_1.default.dirname(configFilePath), generator.outputPath ?? '');
|
|
18
|
+
const language = generator.language
|
|
19
|
+
? generator.language
|
|
20
|
+
: configuration.language;
|
|
21
|
+
LoggingInterface_1.Logger.debug(`Generator ${generator.id}: outputPath=${outputPath}, language=${language}, preset=${generator.preset}`);
|
|
22
|
+
// Check if this generator is compatible with the input type
|
|
23
|
+
if (configuration.inputType === 'jsonschema' &&
|
|
24
|
+
generator.preset !== 'models' &&
|
|
25
|
+
generator.preset !== 'custom') {
|
|
26
|
+
throw (0, errors_1.createUnsupportedPresetForInputError)({
|
|
27
|
+
preset: generator.preset,
|
|
28
|
+
inputType: 'jsonschema',
|
|
29
|
+
supportedPresets: ['models', 'custom']
|
|
30
|
+
});
|
|
31
|
+
}
|
|
32
|
+
switch (generator.preset) {
|
|
33
|
+
case 'payloads': {
|
|
34
|
+
switch (language) {
|
|
35
|
+
case 'typescript': {
|
|
36
|
+
return (0, generators_1.generateTypescriptPayload)({
|
|
37
|
+
asyncapiDocument,
|
|
38
|
+
openapiDocument,
|
|
39
|
+
generator: {
|
|
40
|
+
...generator,
|
|
41
|
+
outputPath
|
|
42
|
+
},
|
|
43
|
+
config: configuration,
|
|
44
|
+
inputType: configuration.inputType,
|
|
45
|
+
dependencyOutputs: renderedContext
|
|
46
|
+
});
|
|
47
|
+
}
|
|
48
|
+
default: {
|
|
49
|
+
throw (0, errors_1.createUnsupportedLanguageError)({
|
|
50
|
+
preset: 'payloads',
|
|
51
|
+
language: language ?? 'unknown'
|
|
52
|
+
});
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
}
|
|
56
|
+
case 'parameters': {
|
|
57
|
+
switch (language) {
|
|
58
|
+
case 'typescript': {
|
|
59
|
+
return (0, generators_1.generateTypescriptParameters)({
|
|
60
|
+
generator: {
|
|
61
|
+
...generator,
|
|
62
|
+
outputPath
|
|
63
|
+
},
|
|
64
|
+
config: configuration,
|
|
65
|
+
inputType: configuration.inputType,
|
|
66
|
+
asyncapiDocument,
|
|
67
|
+
openapiDocument,
|
|
68
|
+
dependencyOutputs: renderedContext
|
|
69
|
+
});
|
|
70
|
+
}
|
|
71
|
+
default: {
|
|
72
|
+
throw (0, errors_1.createUnsupportedLanguageError)({
|
|
73
|
+
preset: 'parameters',
|
|
74
|
+
language: language ?? 'unknown'
|
|
75
|
+
});
|
|
76
|
+
}
|
|
77
|
+
}
|
|
78
|
+
}
|
|
79
|
+
case 'headers': {
|
|
80
|
+
switch (language) {
|
|
81
|
+
case 'typescript': {
|
|
82
|
+
return (0, generators_1.generateTypescriptHeaders)({
|
|
83
|
+
asyncapiDocument,
|
|
84
|
+
openapiDocument,
|
|
85
|
+
generator: {
|
|
86
|
+
...generator,
|
|
87
|
+
outputPath
|
|
88
|
+
},
|
|
89
|
+
config: configuration,
|
|
90
|
+
inputType: configuration.inputType,
|
|
91
|
+
dependencyOutputs: renderedContext
|
|
92
|
+
});
|
|
93
|
+
}
|
|
94
|
+
default: {
|
|
95
|
+
throw (0, errors_1.createUnsupportedLanguageError)({
|
|
96
|
+
preset: 'headers',
|
|
97
|
+
language: language ?? 'unknown'
|
|
98
|
+
});
|
|
99
|
+
}
|
|
100
|
+
}
|
|
101
|
+
}
|
|
102
|
+
case 'types': {
|
|
103
|
+
switch (language) {
|
|
104
|
+
case 'typescript': {
|
|
105
|
+
return (0, generators_1.generateTypescriptTypes)({
|
|
106
|
+
asyncapiDocument,
|
|
107
|
+
openapiDocument,
|
|
108
|
+
generator: {
|
|
109
|
+
...generator,
|
|
110
|
+
outputPath
|
|
111
|
+
},
|
|
112
|
+
config: configuration,
|
|
113
|
+
inputType: configuration.inputType,
|
|
114
|
+
dependencyOutputs: renderedContext
|
|
115
|
+
});
|
|
116
|
+
}
|
|
117
|
+
default: {
|
|
118
|
+
throw (0, errors_1.createUnsupportedLanguageError)({
|
|
119
|
+
preset: 'types',
|
|
120
|
+
language: language ?? 'unknown'
|
|
121
|
+
});
|
|
122
|
+
}
|
|
123
|
+
}
|
|
124
|
+
}
|
|
125
|
+
case 'channels': {
|
|
126
|
+
switch (language) {
|
|
127
|
+
case 'typescript': {
|
|
128
|
+
return (0, generators_1.generateTypeScriptChannels)({
|
|
129
|
+
asyncapiDocument,
|
|
130
|
+
openapiDocument,
|
|
131
|
+
generator: {
|
|
132
|
+
...generator,
|
|
133
|
+
outputPath
|
|
134
|
+
},
|
|
135
|
+
config: configuration,
|
|
136
|
+
inputType: configuration.inputType,
|
|
137
|
+
dependencyOutputs: renderedContext
|
|
138
|
+
});
|
|
139
|
+
}
|
|
140
|
+
default: {
|
|
141
|
+
throw (0, errors_1.createUnsupportedLanguageError)({
|
|
142
|
+
preset: 'channels',
|
|
143
|
+
language: language ?? 'unknown'
|
|
144
|
+
});
|
|
145
|
+
}
|
|
146
|
+
}
|
|
147
|
+
}
|
|
148
|
+
case 'client': {
|
|
149
|
+
switch (language) {
|
|
150
|
+
case 'typescript': {
|
|
151
|
+
return (0, generators_1.generateTypeScriptClient)({
|
|
152
|
+
asyncapiDocument,
|
|
153
|
+
openapiDocument,
|
|
154
|
+
generator: {
|
|
155
|
+
...generator,
|
|
156
|
+
outputPath
|
|
157
|
+
},
|
|
158
|
+
config: configuration,
|
|
159
|
+
inputType: configuration.inputType,
|
|
160
|
+
dependencyOutputs: renderedContext
|
|
161
|
+
});
|
|
162
|
+
}
|
|
163
|
+
default: {
|
|
164
|
+
throw (0, errors_1.createUnsupportedLanguageError)({
|
|
165
|
+
preset: 'client',
|
|
166
|
+
language: language ?? 'unknown'
|
|
167
|
+
});
|
|
168
|
+
}
|
|
169
|
+
}
|
|
170
|
+
}
|
|
171
|
+
case 'models': {
|
|
172
|
+
switch (language) {
|
|
173
|
+
case 'typescript': {
|
|
174
|
+
return (0, models_1.generateTypescriptModels)({
|
|
175
|
+
asyncapiDocument,
|
|
176
|
+
openapiDocument,
|
|
177
|
+
jsonSchemaDocument,
|
|
178
|
+
generator: {
|
|
179
|
+
...generator,
|
|
180
|
+
outputPath
|
|
181
|
+
},
|
|
182
|
+
config: configuration,
|
|
183
|
+
inputType: configuration.inputType,
|
|
184
|
+
dependencyOutputs: renderedContext
|
|
185
|
+
});
|
|
186
|
+
}
|
|
187
|
+
default: {
|
|
188
|
+
throw (0, errors_1.createUnsupportedLanguageError)({
|
|
189
|
+
preset: 'models',
|
|
190
|
+
language: language ?? 'unknown'
|
|
191
|
+
});
|
|
192
|
+
}
|
|
193
|
+
}
|
|
194
|
+
}
|
|
195
|
+
case 'custom': {
|
|
196
|
+
return generator.renderFunction({
|
|
197
|
+
asyncapiDocument,
|
|
198
|
+
openapiDocument,
|
|
199
|
+
jsonSchemaDocument,
|
|
200
|
+
inputType: configuration.inputType,
|
|
201
|
+
dependencyOutputs: renderedContext,
|
|
202
|
+
generator
|
|
203
|
+
}, generator.options);
|
|
204
|
+
}
|
|
205
|
+
// No default
|
|
206
|
+
}
|
|
207
|
+
}
|
|
208
|
+
exports.renderGenerator = renderGenerator;
|
|
209
|
+
function determineRenderGraph(context) {
|
|
210
|
+
const { configuration } = context;
|
|
211
|
+
const duplicateGenerators = (0, utils_1.findDuplicatesInArray)(context.configuration.generators, 'id');
|
|
212
|
+
if (duplicateGenerators.length > 0) {
|
|
213
|
+
throw (0, errors_1.createDuplicateGeneratorIdError)({ duplicateIds: duplicateGenerators });
|
|
214
|
+
}
|
|
215
|
+
const graph = new graphology_1.default({ allowSelfLoops: true, type: 'directed' });
|
|
216
|
+
for (const generator of configuration.generators) {
|
|
217
|
+
graph.addNode(generator.id, { generator });
|
|
218
|
+
}
|
|
219
|
+
for (const generator of configuration.generators) {
|
|
220
|
+
for (const dependency of generator.dependencies ?? []) {
|
|
221
|
+
graph.addDirectedEdge(dependency, generator.id);
|
|
222
|
+
}
|
|
223
|
+
}
|
|
224
|
+
if (graph.selfLoopCount !== 0) {
|
|
225
|
+
throw (0, errors_1.createCircularDependencyError)();
|
|
226
|
+
}
|
|
227
|
+
return graph;
|
|
228
|
+
}
|
|
229
|
+
exports.determineRenderGraph = determineRenderGraph;
|
|
230
|
+
/**
|
|
231
|
+
* Extract files from render result.
|
|
232
|
+
* Generators now return `files: GeneratedFile[]` instead of `filesWritten: string[]`.
|
|
233
|
+
*/
|
|
234
|
+
function extractFilesFromResult(result) {
|
|
235
|
+
// Type guard to check for files property
|
|
236
|
+
if (result &&
|
|
237
|
+
typeof result === 'object' &&
|
|
238
|
+
'files' in result &&
|
|
239
|
+
Array.isArray(result.files)) {
|
|
240
|
+
return result.files;
|
|
241
|
+
}
|
|
242
|
+
return [];
|
|
243
|
+
}
|
|
244
|
+
/**
|
|
245
|
+
* Recursively go over all nodes and render those that are ready to be rendered (no dependencies that have not been rendered) and recursively do it until no nodes are left
|
|
246
|
+
*/
|
|
247
|
+
// eslint-disable-next-line sonarjs/cognitive-complexity
|
|
248
|
+
async function renderGraph(context, graph) {
|
|
249
|
+
const startTime = Date.now();
|
|
250
|
+
const renderedContext = {};
|
|
251
|
+
const generatorResults = [];
|
|
252
|
+
const recursivelyRenderGenerators = async (nodesToRender, previousCount) => {
|
|
253
|
+
const count = nodesToRender.length;
|
|
254
|
+
if (previousCount === count) {
|
|
255
|
+
throw (0, errors_1.createCircularDependencyError)();
|
|
256
|
+
}
|
|
257
|
+
const nodesToRenderNext = [];
|
|
258
|
+
const alreadyRenderedNodes = Object.keys(renderedContext);
|
|
259
|
+
for (const nodeEntry of nodesToRender) {
|
|
260
|
+
const dependencies = graph.inEdgeEntries(nodeEntry.node);
|
|
261
|
+
//check if all dependencies have been rendered, if not, wait until later
|
|
262
|
+
let allRendered = true;
|
|
263
|
+
for (const dependency of dependencies) {
|
|
264
|
+
if (!alreadyRenderedNodes.includes(dependency.source)) {
|
|
265
|
+
allRendered = false;
|
|
266
|
+
break;
|
|
267
|
+
}
|
|
268
|
+
}
|
|
269
|
+
if (allRendered) {
|
|
270
|
+
const generatorStartTime = Date.now();
|
|
271
|
+
const generator = nodeEntry.attributes.generator;
|
|
272
|
+
LoggingInterface_1.Logger.updateSpinner(`Generating ${generator.preset}...`);
|
|
273
|
+
const result = await renderGenerator(generator, context, renderedContext);
|
|
274
|
+
renderedContext[nodeEntry.node] = result;
|
|
275
|
+
// Extract files from result
|
|
276
|
+
const files = extractFilesFromResult(result);
|
|
277
|
+
// Record generator result with files
|
|
278
|
+
generatorResults.push({
|
|
279
|
+
id: generator.id,
|
|
280
|
+
preset: generator.preset,
|
|
281
|
+
files,
|
|
282
|
+
duration: Date.now() - generatorStartTime
|
|
283
|
+
});
|
|
284
|
+
}
|
|
285
|
+
else {
|
|
286
|
+
nodesToRenderNext.push(nodeEntry);
|
|
287
|
+
}
|
|
288
|
+
}
|
|
289
|
+
if (nodesToRenderNext.length > 0) {
|
|
290
|
+
await recursivelyRenderGenerators(nodesToRenderNext, count);
|
|
291
|
+
}
|
|
292
|
+
};
|
|
293
|
+
await recursivelyRenderGenerators([...graph.nodeEntries()]);
|
|
294
|
+
// Collect all files (deduplicated by path)
|
|
295
|
+
const allFilesMap = new Map();
|
|
296
|
+
for (const result of generatorResults) {
|
|
297
|
+
for (const file of result.files) {
|
|
298
|
+
// Later files with same path override earlier ones
|
|
299
|
+
allFilesMap.set(file.path, file);
|
|
300
|
+
}
|
|
301
|
+
}
|
|
302
|
+
const allFiles = Array.from(allFilesMap.values());
|
|
303
|
+
return {
|
|
304
|
+
generators: generatorResults,
|
|
305
|
+
files: allFiles,
|
|
306
|
+
totalDuration: Date.now() - startTime
|
|
307
|
+
};
|
|
308
|
+
}
|
|
309
|
+
exports.renderGraph = renderGraph;
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Post-processors for `zod-to-json-schema`. Splits a single Zod source-of-truth
|
|
3
|
+
* (markdown-enabled `.describe()` text) into two JSON Schema variants:
|
|
4
|
+
* a clean one (markdown links stripped) and a markdown one (description
|
|
5
|
+
* renamed to `markdownDescription` so Monaco renders it as markdown).
|
|
6
|
+
*/
|
|
7
|
+
import type { PostProcessCallback } from 'zod-to-json-schema';
|
|
8
|
+
/**
|
|
9
|
+
* Replace markdown links of the form `[text](https://...)` with their link
|
|
10
|
+
* text. Leaves plain bracketed text (e.g. `[string]`) untouched because the
|
|
11
|
+
* expression requires `(http://` or `(https://` immediately after.
|
|
12
|
+
*/
|
|
13
|
+
export declare function stripMarkdownLinks(text: string): string;
|
|
14
|
+
/**
|
|
15
|
+
* Strip markdown link wrappers from a JSON Schema node's description.
|
|
16
|
+
* Used to produce the canonical schema consumed by CLI validation and IDEs
|
|
17
|
+
* that don't understand markdown.
|
|
18
|
+
*/
|
|
19
|
+
export declare const postProcessClean: PostProcessCallback;
|
|
20
|
+
/**
|
|
21
|
+
* Rename a JSON Schema node's `description` to `markdownDescription` so
|
|
22
|
+
* Monaco-based editors render the text as markdown (and links become
|
|
23
|
+
* clickable) in hover tooltips.
|
|
24
|
+
*/
|
|
25
|
+
export declare const postProcessMarkdown: PostProcessCallback;
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.postProcessMarkdown = exports.postProcessClean = exports.stripMarkdownLinks = void 0;
|
|
4
|
+
const MD_LINK_RE = /\[([^\]]+)\]\(https?:\/\/[^)]+\)/g;
|
|
5
|
+
/**
|
|
6
|
+
* Replace markdown links of the form `[text](https://...)` with their link
|
|
7
|
+
* text. Leaves plain bracketed text (e.g. `[string]`) untouched because the
|
|
8
|
+
* expression requires `(http://` or `(https://` immediately after.
|
|
9
|
+
*/
|
|
10
|
+
function stripMarkdownLinks(text) {
|
|
11
|
+
return text.replace(MD_LINK_RE, '$1');
|
|
12
|
+
}
|
|
13
|
+
exports.stripMarkdownLinks = stripMarkdownLinks;
|
|
14
|
+
/**
|
|
15
|
+
* Strip markdown link wrappers from a JSON Schema node's description.
|
|
16
|
+
* Used to produce the canonical schema consumed by CLI validation and IDEs
|
|
17
|
+
* that don't understand markdown.
|
|
18
|
+
*/
|
|
19
|
+
const postProcessClean = (out) => {
|
|
20
|
+
if (out && typeof out.description === 'string') {
|
|
21
|
+
out.description = stripMarkdownLinks(out.description);
|
|
22
|
+
}
|
|
23
|
+
return out;
|
|
24
|
+
};
|
|
25
|
+
exports.postProcessClean = postProcessClean;
|
|
26
|
+
/**
|
|
27
|
+
* Rename a JSON Schema node's `description` to `markdownDescription` so
|
|
28
|
+
* Monaco-based editors render the text as markdown (and links become
|
|
29
|
+
* clickable) in hover tooltips.
|
|
30
|
+
*/
|
|
31
|
+
const postProcessMarkdown = (out) => {
|
|
32
|
+
if (out && typeof out.description === 'string') {
|
|
33
|
+
out.markdownDescription = out.description;
|
|
34
|
+
delete out.description;
|
|
35
|
+
}
|
|
36
|
+
return out;
|
|
37
|
+
};
|
|
38
|
+
exports.postProcessMarkdown = postProcessMarkdown;
|