@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,10 @@
|
|
|
1
|
+
import { ChannelInterface, OperationInterface } from '@asyncapi/parser';
|
|
2
|
+
import { TypeScriptParameterRenderType } from '../parameters';
|
|
3
|
+
import { TypeScriptPayloadRenderType } from '../payloads';
|
|
4
|
+
import { TypeScriptHeadersRenderType } from '../headers';
|
|
5
|
+
import { ChannelFunctionTypes, TypeScriptChannelRenderedFunctionType, SupportedProtocols, TypeScriptChannelsContext } from './types';
|
|
6
|
+
type Action = 'send' | 'receive' | 'subscribe' | 'publish';
|
|
7
|
+
export declare function shouldRenderFunctionType(givenFunctionTypes: ChannelFunctionTypes[] | undefined, functionTypesToCheckFor: ChannelFunctionTypes | ChannelFunctionTypes[], action: Action, reverseOperation: boolean): boolean;
|
|
8
|
+
export declare function generateTypeScriptChannelsForAsyncAPI(context: TypeScriptChannelsContext, parameters: TypeScriptParameterRenderType, payloads: TypeScriptPayloadRenderType, headers: TypeScriptHeadersRenderType, protocolsToUse: SupportedProtocols[], protocolCodeFunctions: Record<string, string[]>, externalProtocolFunctionInformation: Record<string, TypeScriptChannelRenderedFunctionType[]>, protocolDependencies: Record<string, string[]>): Promise<void>;
|
|
9
|
+
export declare function getFunctionTypeMappingFromAsyncAPI(object: OperationInterface | ChannelInterface): ChannelFunctionTypes[] | undefined;
|
|
10
|
+
export {};
|
|
@@ -0,0 +1,131 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.getFunctionTypeMappingFromAsyncAPI = exports.generateTypeScriptChannelsForAsyncAPI = exports.shouldRenderFunctionType = void 0;
|
|
4
|
+
const types_1 = require("./types");
|
|
5
|
+
const utils_1 = require("../../../utils");
|
|
6
|
+
const utils_2 = require("./utils");
|
|
7
|
+
const nats_1 = require("./protocols/nats");
|
|
8
|
+
const kafka_1 = require("./protocols/kafka");
|
|
9
|
+
const mqtt_1 = require("./protocols/mqtt");
|
|
10
|
+
const amqp_1 = require("./protocols/amqp");
|
|
11
|
+
const eventsource_1 = require("./protocols/eventsource");
|
|
12
|
+
const http_1 = require("./protocols/http");
|
|
13
|
+
const websocket_1 = require("./protocols/websocket");
|
|
14
|
+
const errors_1 = require("../../../errors");
|
|
15
|
+
// eslint-disable-next-line sonarjs/cognitive-complexity
|
|
16
|
+
function shouldRenderFunctionType(givenFunctionTypes, functionTypesToCheckFor, action, reverseOperation) {
|
|
17
|
+
const listToCheck = [
|
|
18
|
+
...(Array.isArray(functionTypesToCheckFor)
|
|
19
|
+
? functionTypesToCheckFor
|
|
20
|
+
: [functionTypesToCheckFor])
|
|
21
|
+
];
|
|
22
|
+
const hasSendingOperation = action === 'send' || action === 'subscribe';
|
|
23
|
+
const hasReceivingOperation = action === 'receive' || action === 'publish';
|
|
24
|
+
const hasFunctionMappingConfig = givenFunctionTypes !== undefined;
|
|
25
|
+
const checkForSending = listToCheck.some((item) => types_1.sendingFunctionTypes.includes(item));
|
|
26
|
+
const checkForReceiving = listToCheck.some((item) => types_1.receivingFunctionTypes.includes(item));
|
|
27
|
+
const hasFunctionType = (givenFunctionTypes ?? []).some((item) => listToCheck.includes(item));
|
|
28
|
+
if (hasFunctionMappingConfig) {
|
|
29
|
+
if (hasFunctionType) {
|
|
30
|
+
const renderForSending = checkForSending && hasSendingOperation;
|
|
31
|
+
const renderForReceiving = checkForReceiving && hasReceivingOperation;
|
|
32
|
+
return renderForSending || renderForReceiving;
|
|
33
|
+
}
|
|
34
|
+
return false;
|
|
35
|
+
}
|
|
36
|
+
if (reverseOperation) {
|
|
37
|
+
const renderForSending = hasSendingOperation && checkForReceiving;
|
|
38
|
+
const renderForReceiving = hasReceivingOperation && checkForSending;
|
|
39
|
+
return renderForSending || renderForReceiving;
|
|
40
|
+
}
|
|
41
|
+
const renderForSending = checkForSending && hasSendingOperation;
|
|
42
|
+
const renderForReceiving = checkForReceiving && hasReceivingOperation;
|
|
43
|
+
return renderForSending || renderForReceiving;
|
|
44
|
+
}
|
|
45
|
+
exports.shouldRenderFunctionType = shouldRenderFunctionType;
|
|
46
|
+
async function generateTypeScriptChannelsForAsyncAPI(context, parameters, payloads, headers, protocolsToUse, protocolCodeFunctions, externalProtocolFunctionInformation, protocolDependencies) {
|
|
47
|
+
const { asyncapiDocument } = validateAsyncapiContext(context);
|
|
48
|
+
const channels = asyncapiDocument
|
|
49
|
+
.allChannels()
|
|
50
|
+
.all()
|
|
51
|
+
.filter((channel) => channel.address() && channel.messages().length > 0);
|
|
52
|
+
// Collect payload/parameter/header imports for each protocol
|
|
53
|
+
const importExtension = (0, utils_1.resolveImportExtension)(context.generator, context.config);
|
|
54
|
+
for (const protocol of protocolsToUse) {
|
|
55
|
+
// eslint-disable-next-line security/detect-object-injection
|
|
56
|
+
const deps = protocolDependencies[protocol];
|
|
57
|
+
(0, utils_2.collectProtocolDependencies)(payloads, parameters, headers, context, deps, importExtension);
|
|
58
|
+
}
|
|
59
|
+
for (const channel of channels) {
|
|
60
|
+
const subName = (0, utils_1.findNameFromChannel)(channel);
|
|
61
|
+
let parameter = undefined;
|
|
62
|
+
if (channel.parameters().length > 0) {
|
|
63
|
+
parameter = parameters.channelModels[channel.id()];
|
|
64
|
+
if (parameter === undefined) {
|
|
65
|
+
throw (0, errors_1.createMissingParameterError)({
|
|
66
|
+
channelOrOperation: channel.id(),
|
|
67
|
+
protocol: 'channels'
|
|
68
|
+
});
|
|
69
|
+
}
|
|
70
|
+
}
|
|
71
|
+
// Headers are now always available, but the specific channel may not have headers defined
|
|
72
|
+
const headerModel = headers.channelModels[channel.id()];
|
|
73
|
+
for (const protocol of protocolsToUse) {
|
|
74
|
+
const protocolContext = {
|
|
75
|
+
...context,
|
|
76
|
+
subName,
|
|
77
|
+
topic: channel.address(),
|
|
78
|
+
parameter: parameter?.model,
|
|
79
|
+
headers: headerModel?.model,
|
|
80
|
+
payloads
|
|
81
|
+
};
|
|
82
|
+
switch (protocol) {
|
|
83
|
+
case 'nats':
|
|
84
|
+
await (0, nats_1.generateNatsChannels)(protocolContext, channel, protocolCodeFunctions, externalProtocolFunctionInformation, protocolDependencies['nats']);
|
|
85
|
+
break;
|
|
86
|
+
case 'kafka':
|
|
87
|
+
await (0, kafka_1.generateKafkaChannels)(protocolContext, channel, protocolCodeFunctions, externalProtocolFunctionInformation, protocolDependencies['kafka']);
|
|
88
|
+
break;
|
|
89
|
+
case 'mqtt':
|
|
90
|
+
await (0, mqtt_1.generateMqttChannels)(protocolContext, channel, protocolCodeFunctions, externalProtocolFunctionInformation, protocolDependencies['mqtt']);
|
|
91
|
+
break;
|
|
92
|
+
case 'amqp':
|
|
93
|
+
await (0, amqp_1.generateAmqpChannels)(protocolContext, channel, protocolCodeFunctions, externalProtocolFunctionInformation, protocolDependencies['amqp']);
|
|
94
|
+
break;
|
|
95
|
+
case 'http_client':
|
|
96
|
+
await (0, http_1.generatehttpChannels)(protocolContext, channel, protocolCodeFunctions, externalProtocolFunctionInformation, protocolDependencies['http_client']);
|
|
97
|
+
break;
|
|
98
|
+
case 'event_source':
|
|
99
|
+
await (0, eventsource_1.generateEventSourceChannels)(protocolContext, channel, protocolCodeFunctions, externalProtocolFunctionInformation, protocolDependencies['event_source']);
|
|
100
|
+
break;
|
|
101
|
+
case 'websocket':
|
|
102
|
+
await (0, websocket_1.generateWebSocketChannels)(protocolContext, channel, protocolCodeFunctions, externalProtocolFunctionInformation, protocolDependencies['websocket']);
|
|
103
|
+
break;
|
|
104
|
+
default:
|
|
105
|
+
break;
|
|
106
|
+
}
|
|
107
|
+
}
|
|
108
|
+
}
|
|
109
|
+
}
|
|
110
|
+
exports.generateTypeScriptChannelsForAsyncAPI = generateTypeScriptChannelsForAsyncAPI;
|
|
111
|
+
function validateAsyncapiContext(context) {
|
|
112
|
+
const { asyncapiDocument, inputType } = context;
|
|
113
|
+
if (inputType !== 'asyncapi') {
|
|
114
|
+
throw (0, errors_1.createMissingInputDocumentError)({
|
|
115
|
+
expectedType: 'asyncapi',
|
|
116
|
+
generatorPreset: 'channels'
|
|
117
|
+
});
|
|
118
|
+
}
|
|
119
|
+
if (asyncapiDocument === undefined) {
|
|
120
|
+
throw (0, errors_1.createMissingInputDocumentError)({
|
|
121
|
+
expectedType: 'asyncapi',
|
|
122
|
+
generatorPreset: 'channels'
|
|
123
|
+
});
|
|
124
|
+
}
|
|
125
|
+
return { asyncapiDocument };
|
|
126
|
+
}
|
|
127
|
+
function getFunctionTypeMappingFromAsyncAPI(object) {
|
|
128
|
+
return (object.extensions().get('x-the-codegen-project')?.value()
|
|
129
|
+
?.functionTypeMapping ?? undefined);
|
|
130
|
+
}
|
|
131
|
+
exports.getFunctionTypeMappingFromAsyncAPI = getFunctionTypeMappingFromAsyncAPI;
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import { TheCodegenConfiguration } from '../../../types';
|
|
2
|
+
import { TypeScriptChannelRenderedFunctionType, TypeScriptChannelRenderType, TypeScriptChannelsContext, TypeScriptChannelsGenerator, defaultTypeScriptChannelsGenerator, TypeScriptChannelsGeneratorInternal, zodTypescriptChannelsGenerator, ChannelFunctionTypes } from './types';
|
|
3
|
+
export { TypeScriptChannelRenderedFunctionType, TypeScriptChannelRenderType, TypeScriptChannelsContext, defaultTypeScriptChannelsGenerator, TypeScriptChannelsGenerator, TypeScriptChannelsGeneratorInternal, zodTypescriptChannelsGenerator, ChannelFunctionTypes };
|
|
4
|
+
export declare function generateTypeScriptChannels(context: TypeScriptChannelsContext): Promise<TypeScriptChannelRenderType>;
|
|
5
|
+
/**
|
|
6
|
+
* Make sure we include all dependencies, if not added manually, is added to the generators.
|
|
7
|
+
*/
|
|
8
|
+
export declare function includeTypeScriptChannelDependencies(config: TheCodegenConfiguration, generator: TypeScriptChannelsGenerator): unknown[];
|
|
@@ -0,0 +1,142 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.includeTypeScriptChannelDependencies = exports.generateTypeScriptChannels = exports.ChannelFunctionTypes = exports.zodTypescriptChannelsGenerator = exports.defaultTypeScriptChannelsGenerator = void 0;
|
|
4
|
+
const utils_1 = require("../../../utils");
|
|
5
|
+
const parameters_1 = require("../parameters");
|
|
6
|
+
const payloads_1 = require("../payloads");
|
|
7
|
+
const headers_1 = require("../headers");
|
|
8
|
+
const types_1 = require("./types");
|
|
9
|
+
Object.defineProperty(exports, "defaultTypeScriptChannelsGenerator", { enumerable: true, get: function () { return types_1.defaultTypeScriptChannelsGenerator; } });
|
|
10
|
+
Object.defineProperty(exports, "zodTypescriptChannelsGenerator", { enumerable: true, get: function () { return types_1.zodTypescriptChannelsGenerator; } });
|
|
11
|
+
Object.defineProperty(exports, "ChannelFunctionTypes", { enumerable: true, get: function () { return types_1.ChannelFunctionTypes; } });
|
|
12
|
+
const asyncapi_1 = require("./asyncapi");
|
|
13
|
+
const openapi_1 = require("./openapi");
|
|
14
|
+
// eslint-disable-next-line sonarjs/cognitive-complexity
|
|
15
|
+
async function generateTypeScriptChannels(context) {
|
|
16
|
+
const protocolCodeFunctions = {};
|
|
17
|
+
const externalProtocolFunctionInformation = {};
|
|
18
|
+
const { parameters, payloads, headers } = validateContext(context);
|
|
19
|
+
const generator = context.generator;
|
|
20
|
+
const protocolsToUse = generator.protocols;
|
|
21
|
+
const protocolDependencies = {};
|
|
22
|
+
for (const protocol of protocolsToUse) {
|
|
23
|
+
protocolCodeFunctions[protocol] = [];
|
|
24
|
+
externalProtocolFunctionInformation[protocol] = [];
|
|
25
|
+
protocolDependencies[protocol] = [];
|
|
26
|
+
}
|
|
27
|
+
if (context.inputType === 'asyncapi') {
|
|
28
|
+
await (0, asyncapi_1.generateTypeScriptChannelsForAsyncAPI)(context, parameters, payloads, headers, protocolsToUse, protocolCodeFunctions, externalProtocolFunctionInformation, protocolDependencies);
|
|
29
|
+
}
|
|
30
|
+
else if (context.inputType === 'openapi') {
|
|
31
|
+
await (0, openapi_1.generateTypeScriptChannelsForOpenAPI)(context, parameters, payloads, headers, protocolsToUse, protocolCodeFunctions, externalProtocolFunctionInformation, protocolDependencies);
|
|
32
|
+
}
|
|
33
|
+
return await finalizeGeneration(context, protocolDependencies, protocolCodeFunctions, externalProtocolFunctionInformation, parameters, payloads);
|
|
34
|
+
}
|
|
35
|
+
exports.generateTypeScriptChannels = generateTypeScriptChannels;
|
|
36
|
+
async function finalizeGeneration(context, protocolDependencies, protocolCodeFunctions, externalProtocolFunctionInformation, parameters, payloads) {
|
|
37
|
+
const files = [];
|
|
38
|
+
const generatedProtocols = [];
|
|
39
|
+
const protocolFiles = {};
|
|
40
|
+
// Generate one file per protocol
|
|
41
|
+
for (const [protocol, functions] of Object.entries(protocolCodeFunctions)) {
|
|
42
|
+
if (functions.length === 0) {
|
|
43
|
+
continue;
|
|
44
|
+
}
|
|
45
|
+
const deps = [...new Set(protocolDependencies[protocol] || [])];
|
|
46
|
+
// Get function names for the export statement
|
|
47
|
+
const functionNames = (externalProtocolFunctionInformation[protocol] || []).map((fn) => fn.functionName);
|
|
48
|
+
// Functions are defined first, then exported by name at the end
|
|
49
|
+
const depsSection = deps.join('\n');
|
|
50
|
+
const depsNewline = deps.length > 0 ? '\n\n' : '';
|
|
51
|
+
const functionsSection = functions.join('\n\n');
|
|
52
|
+
const exportSection = functionNames.length > 0
|
|
53
|
+
? `\n\nexport { ${functionNames.join(', ')} };`
|
|
54
|
+
: '';
|
|
55
|
+
const fileContent = `${depsSection}${depsNewline}${functionsSection}${exportSection}\n`;
|
|
56
|
+
const protocolFilePath = (0, utils_1.joinPath)(context.generator.outputPath, `${protocol}.ts`);
|
|
57
|
+
files.push({ path: protocolFilePath, content: fileContent });
|
|
58
|
+
generatedProtocols.push(protocol);
|
|
59
|
+
protocolFiles[protocol] = fileContent;
|
|
60
|
+
}
|
|
61
|
+
// Generate index.ts with namespace re-exports
|
|
62
|
+
let indexContent;
|
|
63
|
+
if (generatedProtocols.length > 0) {
|
|
64
|
+
const ext = (0, utils_1.resolveImportExtension)(context.generator, context.config);
|
|
65
|
+
const imports = generatedProtocols
|
|
66
|
+
.map((p) => {
|
|
67
|
+
const importPath = (0, utils_1.appendImportExtension)(`./${p}`, ext);
|
|
68
|
+
return `import * as ${p} from '${importPath}';`;
|
|
69
|
+
})
|
|
70
|
+
.join('\n');
|
|
71
|
+
const exports = generatedProtocols.join(', ');
|
|
72
|
+
indexContent = `${imports}\n\nexport {${exports}};\n`;
|
|
73
|
+
}
|
|
74
|
+
else {
|
|
75
|
+
indexContent = '// No protocols generated\n';
|
|
76
|
+
}
|
|
77
|
+
const indexFilePath = (0, utils_1.joinPath)(context.generator.outputPath, 'index.ts');
|
|
78
|
+
files.push({ path: indexFilePath, content: indexContent });
|
|
79
|
+
return {
|
|
80
|
+
parameterRender: parameters,
|
|
81
|
+
payloadRender: payloads,
|
|
82
|
+
generator: context.generator,
|
|
83
|
+
renderedFunctions: externalProtocolFunctionInformation,
|
|
84
|
+
result: indexContent,
|
|
85
|
+
protocolFiles,
|
|
86
|
+
files
|
|
87
|
+
};
|
|
88
|
+
}
|
|
89
|
+
function validateContext(context) {
|
|
90
|
+
const { generator } = context;
|
|
91
|
+
if (!context.dependencyOutputs) {
|
|
92
|
+
throw new Error('Internal error, could not determine previous rendered outputs that is required for channel typescript generator');
|
|
93
|
+
}
|
|
94
|
+
const payloads = context.dependencyOutputs[generator.payloadGeneratorId];
|
|
95
|
+
const parameters = context.dependencyOutputs[generator.parameterGeneratorId];
|
|
96
|
+
const headers = context.dependencyOutputs[generator.headerGeneratorId];
|
|
97
|
+
if (!payloads) {
|
|
98
|
+
throw new Error('Internal error, could not determine previous rendered payloads generator that is required for channel TypeScript generator');
|
|
99
|
+
}
|
|
100
|
+
if (!parameters) {
|
|
101
|
+
throw new Error('Internal error, could not determine previous rendered parameters generator that is required for channel TypeScript generator');
|
|
102
|
+
}
|
|
103
|
+
if (!headers) {
|
|
104
|
+
throw new Error('Internal error, could not determine previous rendered headers generator that is required for channel TypeScript generator');
|
|
105
|
+
}
|
|
106
|
+
return { payloads, parameters, headers };
|
|
107
|
+
}
|
|
108
|
+
/**
|
|
109
|
+
* Make sure we include all dependencies, if not added manually, is added to the generators.
|
|
110
|
+
*/
|
|
111
|
+
function includeTypeScriptChannelDependencies(config, generator) {
|
|
112
|
+
const newGenerators = [];
|
|
113
|
+
const parameterGeneratorId = generator.parameterGeneratorId;
|
|
114
|
+
const payloadGeneratorId = generator.payloadGeneratorId;
|
|
115
|
+
const headerGeneratorId = generator.headerGeneratorId;
|
|
116
|
+
const hasParameterGenerator = config.generators.find((generatorSearch) => generatorSearch.id === parameterGeneratorId) !== undefined;
|
|
117
|
+
const hasPayloadGenerator = config.generators.find((generatorSearch) => generatorSearch.id === payloadGeneratorId) !== undefined;
|
|
118
|
+
const hasHeaderGenerator = config.generators.find((generatorSearch) => generatorSearch.id === headerGeneratorId) !== undefined;
|
|
119
|
+
if (!hasParameterGenerator) {
|
|
120
|
+
const defaultChannelParameterGenerator = {
|
|
121
|
+
...parameters_1.defaultTypeScriptParametersOptions,
|
|
122
|
+
outputPath: (0, utils_1.joinPath)(generator.outputPath ?? '', './parameter')
|
|
123
|
+
};
|
|
124
|
+
newGenerators.push(defaultChannelParameterGenerator);
|
|
125
|
+
}
|
|
126
|
+
if (!hasPayloadGenerator) {
|
|
127
|
+
const defaultChannelPayloadGenerator = {
|
|
128
|
+
...payloads_1.defaultTypeScriptPayloadGenerator,
|
|
129
|
+
outputPath: (0, utils_1.joinPath)(generator.outputPath ?? '', './payload')
|
|
130
|
+
};
|
|
131
|
+
newGenerators.push(defaultChannelPayloadGenerator);
|
|
132
|
+
}
|
|
133
|
+
if (!hasHeaderGenerator) {
|
|
134
|
+
const defaultChannelHeaderGenerator = {
|
|
135
|
+
...headers_1.defaultTypeScriptHeadersOptions,
|
|
136
|
+
outputPath: (0, utils_1.joinPath)(generator.outputPath ?? '', './headers')
|
|
137
|
+
};
|
|
138
|
+
newGenerators.push(defaultChannelHeaderGenerator);
|
|
139
|
+
}
|
|
140
|
+
return newGenerators;
|
|
141
|
+
}
|
|
142
|
+
exports.includeTypeScriptChannelDependencies = includeTypeScriptChannelDependencies;
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import { TypeScriptParameterRenderType } from '../parameters';
|
|
2
|
+
import { TypeScriptPayloadRenderType } from '../payloads';
|
|
3
|
+
import { TypeScriptHeadersRenderType } from '../headers';
|
|
4
|
+
import { TypeScriptChannelRenderedFunctionType, SupportedProtocols, TypeScriptChannelsContext } from './types';
|
|
5
|
+
/**
|
|
6
|
+
* Generates TypeScript HTTP client channels from an OpenAPI document.
|
|
7
|
+
* Only supports http_client protocol - other protocols are ignored for OpenAPI input.
|
|
8
|
+
*/
|
|
9
|
+
export declare function generateTypeScriptChannelsForOpenAPI(context: TypeScriptChannelsContext, parameters: TypeScriptParameterRenderType, payloads: TypeScriptPayloadRenderType, headers: TypeScriptHeadersRenderType, protocolsToUse: SupportedProtocols[], protocolCodeFunctions: Record<string, string[]>, externalProtocolFunctionInformation: Record<string, TypeScriptChannelRenderedFunctionType[]>, protocolDependencies: Record<string, string[]>): Promise<void>;
|
|
@@ -0,0 +1,168 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.generateTypeScriptChannelsForOpenAPI = void 0;
|
|
4
|
+
const utils_1 = require("./utils");
|
|
5
|
+
const http_1 = require("./protocols/http");
|
|
6
|
+
const utils_2 = require("./utils");
|
|
7
|
+
const utils_3 = require("../utils");
|
|
8
|
+
const errors_1 = require("../../../errors");
|
|
9
|
+
const utils_4 = require("../../../utils");
|
|
10
|
+
const security_1 = require("../../../inputs/openapi/security");
|
|
11
|
+
const HTTP_METHODS = [
|
|
12
|
+
'get',
|
|
13
|
+
'post',
|
|
14
|
+
'put',
|
|
15
|
+
'patch',
|
|
16
|
+
'delete',
|
|
17
|
+
'options',
|
|
18
|
+
'head'
|
|
19
|
+
];
|
|
20
|
+
const METHODS_WITH_BODY = ['post', 'put', 'patch'];
|
|
21
|
+
/**
|
|
22
|
+
* Generates TypeScript HTTP client channels from an OpenAPI document.
|
|
23
|
+
* Only supports http_client protocol - other protocols are ignored for OpenAPI input.
|
|
24
|
+
*/
|
|
25
|
+
async function generateTypeScriptChannelsForOpenAPI(context, parameters, payloads, headers, protocolsToUse, protocolCodeFunctions, externalProtocolFunctionInformation, protocolDependencies) {
|
|
26
|
+
// Only http_client is supported for OpenAPI
|
|
27
|
+
if (!protocolsToUse.includes('http_client')) {
|
|
28
|
+
return;
|
|
29
|
+
}
|
|
30
|
+
const { openapiDocument } = validateOpenAPIContext(context);
|
|
31
|
+
// Extract security schemes from the OpenAPI document
|
|
32
|
+
const securitySchemes = (0, security_1.extractSecuritySchemes)(openapiDocument);
|
|
33
|
+
// Collect dependencies
|
|
34
|
+
const deps = protocolDependencies['http_client'];
|
|
35
|
+
const importExtension = (0, utils_4.resolveImportExtension)(context.generator, context.config);
|
|
36
|
+
(0, utils_1.collectProtocolDependencies)(payloads, parameters, headers, context, deps, importExtension);
|
|
37
|
+
// Process all operations and collect renders
|
|
38
|
+
const renders = processOpenAPIOperations(openapiDocument, payloads, parameters);
|
|
39
|
+
// Generate common types once (stateless check)
|
|
40
|
+
// Pass security schemes to generate only relevant auth types
|
|
41
|
+
if (protocolCodeFunctions['http_client'].length === 0 && renders.length > 0) {
|
|
42
|
+
const commonTypesCode = (0, http_1.renderHttpCommonTypes)(securitySchemes);
|
|
43
|
+
protocolCodeFunctions['http_client'].unshift(commonTypesCode);
|
|
44
|
+
}
|
|
45
|
+
// Add renders to output
|
|
46
|
+
protocolCodeFunctions['http_client'].push(...renders.map((r) => r.code));
|
|
47
|
+
externalProtocolFunctionInformation['http_client'].push(...renders.map((r) => ({
|
|
48
|
+
functionType: r.functionType,
|
|
49
|
+
functionName: r.functionName,
|
|
50
|
+
messageType: r.messageType ?? '',
|
|
51
|
+
replyType: r.replyType,
|
|
52
|
+
parameterType: undefined
|
|
53
|
+
})));
|
|
54
|
+
// Add dependencies
|
|
55
|
+
const renderedDeps = renders.flatMap((r) => r.dependencies);
|
|
56
|
+
deps.push(...new Set(renderedDeps));
|
|
57
|
+
}
|
|
58
|
+
exports.generateTypeScriptChannelsForOpenAPI = generateTypeScriptChannelsForOpenAPI;
|
|
59
|
+
/**
|
|
60
|
+
* Process all OpenAPI operations and generate HTTP client functions.
|
|
61
|
+
*/
|
|
62
|
+
function processOpenAPIOperations(openapiDocument, payloads, parameters) {
|
|
63
|
+
const renders = [];
|
|
64
|
+
for (const [path, pathItem] of Object.entries(openapiDocument.paths ?? {})) {
|
|
65
|
+
if (!pathItem) {
|
|
66
|
+
continue;
|
|
67
|
+
}
|
|
68
|
+
for (const method of HTTP_METHODS) {
|
|
69
|
+
const render = processOperation(pathItem, method, path, payloads, parameters);
|
|
70
|
+
if (render) {
|
|
71
|
+
renders.push(render);
|
|
72
|
+
}
|
|
73
|
+
}
|
|
74
|
+
}
|
|
75
|
+
return renders;
|
|
76
|
+
}
|
|
77
|
+
/**
|
|
78
|
+
* Process a single OpenAPI operation and generate an HTTP client function.
|
|
79
|
+
*/
|
|
80
|
+
function processOperation(pathItem, method, path, payloads, parameters) {
|
|
81
|
+
// eslint-disable-next-line security/detect-object-injection
|
|
82
|
+
const operation = pathItem[method];
|
|
83
|
+
if (!operation) {
|
|
84
|
+
return undefined;
|
|
85
|
+
}
|
|
86
|
+
const operationId = getOperationId(operation, method, path);
|
|
87
|
+
const hasBody = METHODS_WITH_BODY.includes(method);
|
|
88
|
+
// Look up payloads
|
|
89
|
+
const requestPayload = hasBody
|
|
90
|
+
? // eslint-disable-next-line security/detect-object-injection
|
|
91
|
+
payloads.operationModels[operationId]
|
|
92
|
+
: undefined;
|
|
93
|
+
const responsePayloadKey = `${operationId}_Response`;
|
|
94
|
+
// eslint-disable-next-line security/detect-object-injection
|
|
95
|
+
const responsePayload = payloads.operationModels[responsePayloadKey];
|
|
96
|
+
// Look up parameters
|
|
97
|
+
// eslint-disable-next-line security/detect-object-injection
|
|
98
|
+
const parameterModel = parameters.channelModels[operationId];
|
|
99
|
+
// Get message types - handle undefined payloads
|
|
100
|
+
const requestMessageInfo = requestPayload
|
|
101
|
+
? (0, utils_2.getMessageTypeAndModule)(requestPayload)
|
|
102
|
+
: {
|
|
103
|
+
messageModule: undefined,
|
|
104
|
+
messageType: undefined,
|
|
105
|
+
includesStatusCodes: false
|
|
106
|
+
};
|
|
107
|
+
const responseMessageInfo = responsePayload
|
|
108
|
+
? (0, utils_2.getMessageTypeAndModule)(responsePayload)
|
|
109
|
+
: {
|
|
110
|
+
messageModule: undefined,
|
|
111
|
+
messageType: undefined,
|
|
112
|
+
includesStatusCodes: false
|
|
113
|
+
};
|
|
114
|
+
const { messageModule: requestMessageModule, messageType: requestMessageType } = requestMessageInfo;
|
|
115
|
+
const { messageModule: replyMessageModule, messageType: replyMessageType, includesStatusCodes: replyIncludesStatusCodes } = responseMessageInfo;
|
|
116
|
+
// Skip if no response type (nothing to generate)
|
|
117
|
+
if (!replyMessageType) {
|
|
118
|
+
return undefined;
|
|
119
|
+
}
|
|
120
|
+
// Extract operation metadata for JSDoc
|
|
121
|
+
const description = operation.description ?? operation.summary;
|
|
122
|
+
const deprecated = operation.deprecated === true;
|
|
123
|
+
// Generate the HTTP client function
|
|
124
|
+
return (0, http_1.renderHttpFetchClient)({
|
|
125
|
+
subName: (0, utils_3.pascalCase)(operationId),
|
|
126
|
+
requestMessageModule: hasBody ? requestMessageModule : undefined,
|
|
127
|
+
requestMessageType: hasBody ? requestMessageType : undefined,
|
|
128
|
+
replyMessageModule,
|
|
129
|
+
replyMessageType,
|
|
130
|
+
requestTopic: path,
|
|
131
|
+
method: method.toUpperCase(),
|
|
132
|
+
channelParameters: parameterModel?.model,
|
|
133
|
+
includesStatusCodes: replyIncludesStatusCodes,
|
|
134
|
+
description,
|
|
135
|
+
deprecated
|
|
136
|
+
});
|
|
137
|
+
}
|
|
138
|
+
/**
|
|
139
|
+
* Validates the context is for OpenAPI input and has a parsed document.
|
|
140
|
+
*/
|
|
141
|
+
function validateOpenAPIContext(context) {
|
|
142
|
+
const { openapiDocument, inputType } = context;
|
|
143
|
+
if (inputType !== 'openapi') {
|
|
144
|
+
throw (0, errors_1.createMissingInputDocumentError)({
|
|
145
|
+
expectedType: 'openapi',
|
|
146
|
+
generatorPreset: 'channels'
|
|
147
|
+
});
|
|
148
|
+
}
|
|
149
|
+
if (!openapiDocument) {
|
|
150
|
+
throw (0, errors_1.createMissingInputDocumentError)({
|
|
151
|
+
expectedType: 'openapi',
|
|
152
|
+
generatorPreset: 'channels'
|
|
153
|
+
});
|
|
154
|
+
}
|
|
155
|
+
return { openapiDocument };
|
|
156
|
+
}
|
|
157
|
+
/**
|
|
158
|
+
* Gets the operation ID from an OpenAPI operation.
|
|
159
|
+
* Falls back to generating one from method+path if not present.
|
|
160
|
+
*/
|
|
161
|
+
function getOperationId(operation, method, path) {
|
|
162
|
+
if (operation.operationId) {
|
|
163
|
+
return operation.operationId;
|
|
164
|
+
}
|
|
165
|
+
// Generate from method + path
|
|
166
|
+
const sanitizedPath = path.replace(/[^a-zA-Z0-9]/g, '');
|
|
167
|
+
return `${method}${sanitizedPath}`;
|
|
168
|
+
}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
import { TypeScriptChannelRenderedFunctionType, TypeScriptChannelsGeneratorContext } from '../../types';
|
|
2
|
+
import { renderPublishExchange } from './publishExchange';
|
|
3
|
+
import { renderPublishQueue } from './publishQueue';
|
|
4
|
+
import { renderSubscribeQueue } from './subscribeQueue';
|
|
5
|
+
import { ChannelInterface } from '@asyncapi/parser';
|
|
6
|
+
export { renderPublishExchange, renderPublishQueue, renderSubscribeQueue };
|
|
7
|
+
export declare function generateAmqpChannels(context: TypeScriptChannelsGeneratorContext, channel: ChannelInterface, protocolCodeFunctions: Record<string, string[]>, externalProtocolFunctionInformation: Record<string, TypeScriptChannelRenderedFunctionType[]>, dependencies: string[]): Promise<void>;
|
|
@@ -0,0 +1,149 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.generateAmqpChannels = exports.renderSubscribeQueue = exports.renderPublishQueue = exports.renderPublishExchange = void 0;
|
|
4
|
+
/* eslint-disable sonarjs/cognitive-complexity */
|
|
5
|
+
/* eslint-disable security/detect-object-injection */
|
|
6
|
+
const types_1 = require("../../types");
|
|
7
|
+
const utils_1 = require("../../../../../utils");
|
|
8
|
+
const utils_2 = require("../../utils");
|
|
9
|
+
const asyncapi_1 = require("../../asyncapi");
|
|
10
|
+
const publishExchange_1 = require("./publishExchange");
|
|
11
|
+
Object.defineProperty(exports, "renderPublishExchange", { enumerable: true, get: function () { return publishExchange_1.renderPublishExchange; } });
|
|
12
|
+
const publishQueue_1 = require("./publishQueue");
|
|
13
|
+
Object.defineProperty(exports, "renderPublishQueue", { enumerable: true, get: function () { return publishQueue_1.renderPublishQueue; } });
|
|
14
|
+
const subscribeQueue_1 = require("./subscribeQueue");
|
|
15
|
+
Object.defineProperty(exports, "renderSubscribeQueue", { enumerable: true, get: function () { return subscribeQueue_1.renderSubscribeQueue; } });
|
|
16
|
+
const errors_1 = require("../../../../../errors");
|
|
17
|
+
async function generateAmqpChannels(context, channel, protocolCodeFunctions, externalProtocolFunctionInformation, dependencies) {
|
|
18
|
+
const { parameter, topic } = context;
|
|
19
|
+
const ignoreOperation = !context.generator.asyncapiGenerateForOperations;
|
|
20
|
+
const amqpContext = {
|
|
21
|
+
channelParameters: parameter,
|
|
22
|
+
channelHeaders: context.headers, // AMQP supports message properties as headers
|
|
23
|
+
topic,
|
|
24
|
+
messageType: '',
|
|
25
|
+
subName: context.subName,
|
|
26
|
+
payloadGenerator: context.payloads
|
|
27
|
+
};
|
|
28
|
+
const operations = channel.operations().all();
|
|
29
|
+
const renders = operations.length > 0 && !ignoreOperation
|
|
30
|
+
? await generateForOperations(context, channel, amqpContext)
|
|
31
|
+
: await generateForChannels(context, channel, amqpContext);
|
|
32
|
+
addRendersToExternal(renders, protocolCodeFunctions, externalProtocolFunctionInformation, dependencies, parameter);
|
|
33
|
+
}
|
|
34
|
+
exports.generateAmqpChannels = generateAmqpChannels;
|
|
35
|
+
function addRendersToExternal(renders, protocolCodeFunctions, externalProtocolFunctionInformation, dependencies, parameter) {
|
|
36
|
+
protocolCodeFunctions['amqp'].push(...renders.map((value) => value.code));
|
|
37
|
+
externalProtocolFunctionInformation['amqp'].push(...renders.map((value) => ({
|
|
38
|
+
functionType: value.functionType,
|
|
39
|
+
functionName: value.functionName,
|
|
40
|
+
messageType: value.messageType,
|
|
41
|
+
replyType: value.replyType,
|
|
42
|
+
parameterType: parameter?.type
|
|
43
|
+
})));
|
|
44
|
+
const renderedDependencies = renders
|
|
45
|
+
.map((value) => value.dependencies)
|
|
46
|
+
.flat(Infinity);
|
|
47
|
+
dependencies.push(...new Set(renderedDependencies));
|
|
48
|
+
}
|
|
49
|
+
async function generateForOperations(context, channel, amqpContext) {
|
|
50
|
+
const renders = [];
|
|
51
|
+
const { generator, payloads } = context;
|
|
52
|
+
const functionTypeMapping = generator.functionTypeMapping?.[channel.id()];
|
|
53
|
+
const exchangeName = channel.bindings().get('amqp')?.value()?.exchange?.name;
|
|
54
|
+
for (const operation of channel.operations().all()) {
|
|
55
|
+
const updatedFunctionTypeMapping = (0, asyncapi_1.getFunctionTypeMappingFromAsyncAPI)(operation) ?? functionTypeMapping;
|
|
56
|
+
const payloadId = (0, utils_1.findOperationId)(operation, channel);
|
|
57
|
+
const payload = payloads.operationModels[payloadId];
|
|
58
|
+
if (!payload) {
|
|
59
|
+
throw (0, errors_1.createMissingPayloadError)({
|
|
60
|
+
channelOrOperation: payloadId,
|
|
61
|
+
protocol: 'AMQP'
|
|
62
|
+
});
|
|
63
|
+
}
|
|
64
|
+
const { messageModule, messageType } = (0, utils_2.getMessageTypeAndModule)(payload);
|
|
65
|
+
if (messageType === undefined) {
|
|
66
|
+
throw new Error(`Could not find message type for channel typescript generator for AMQP`);
|
|
67
|
+
}
|
|
68
|
+
// Extract operation metadata for JSDoc
|
|
69
|
+
const { description, deprecated } = (0, utils_1.getOperationMetadata)(operation);
|
|
70
|
+
const updatedContext = {
|
|
71
|
+
...amqpContext,
|
|
72
|
+
messageType,
|
|
73
|
+
messageModule,
|
|
74
|
+
subName: (0, utils_1.findNameFromOperation)(operation, channel),
|
|
75
|
+
description,
|
|
76
|
+
deprecated
|
|
77
|
+
};
|
|
78
|
+
renders.push(...generateOperationRenders(operation, updatedContext, updatedFunctionTypeMapping, generator, exchangeName));
|
|
79
|
+
}
|
|
80
|
+
return renders;
|
|
81
|
+
}
|
|
82
|
+
function generateOperationRenders(operation, amqpContext, functionTypeMapping, generator, exchangeName) {
|
|
83
|
+
const renders = [];
|
|
84
|
+
const action = operation.action();
|
|
85
|
+
const renderChecks = [
|
|
86
|
+
{
|
|
87
|
+
check: types_1.ChannelFunctionTypes.AMQP_EXCHANGE_PUBLISH,
|
|
88
|
+
render: publishExchange_1.renderPublishExchange,
|
|
89
|
+
additionalProperties: { exchange: exchangeName }
|
|
90
|
+
},
|
|
91
|
+
{
|
|
92
|
+
check: types_1.ChannelFunctionTypes.AMQP_QUEUE_PUBLISH,
|
|
93
|
+
render: publishQueue_1.renderPublishQueue
|
|
94
|
+
},
|
|
95
|
+
{
|
|
96
|
+
check: types_1.ChannelFunctionTypes.AMQP_QUEUE_SUBSCRIBE,
|
|
97
|
+
render: subscribeQueue_1.renderSubscribeQueue
|
|
98
|
+
}
|
|
99
|
+
];
|
|
100
|
+
for (const { check, render, additionalProperties } of renderChecks) {
|
|
101
|
+
if ((0, asyncapi_1.shouldRenderFunctionType)(functionTypeMapping, check, action, generator.asyncapiReverseOperations)) {
|
|
102
|
+
renders.push(render({ ...amqpContext, additionalProperties }));
|
|
103
|
+
}
|
|
104
|
+
}
|
|
105
|
+
return renders;
|
|
106
|
+
}
|
|
107
|
+
async function generateForChannels(context, channel, amqpContext) {
|
|
108
|
+
const renders = [];
|
|
109
|
+
const { generator, payloads } = context;
|
|
110
|
+
const functionTypeMapping = (0, asyncapi_1.getFunctionTypeMappingFromAsyncAPI)(channel) ??
|
|
111
|
+
generator.functionTypeMapping?.[channel.id()];
|
|
112
|
+
const exchangeName = channel.bindings().get('amqp')?.value()?.exchange?.name;
|
|
113
|
+
const payload = payloads.channelModels[channel.id()];
|
|
114
|
+
if (!payload) {
|
|
115
|
+
throw (0, errors_1.createMissingPayloadError)({
|
|
116
|
+
channelOrOperation: channel.id(),
|
|
117
|
+
protocol: 'AMQP'
|
|
118
|
+
});
|
|
119
|
+
}
|
|
120
|
+
const { messageModule, messageType } = (0, utils_2.getMessageTypeAndModule)(payload);
|
|
121
|
+
if (messageType === undefined) {
|
|
122
|
+
throw new Error(`Could not find message type for channel typescript generator for AMQP`);
|
|
123
|
+
}
|
|
124
|
+
const updatedContext = { ...amqpContext, messageType, messageModule };
|
|
125
|
+
const renderChecks = [
|
|
126
|
+
{
|
|
127
|
+
check: types_1.ChannelFunctionTypes.AMQP_EXCHANGE_PUBLISH,
|
|
128
|
+
render: publishExchange_1.renderPublishExchange,
|
|
129
|
+
action: 'send',
|
|
130
|
+
additionalProperties: { exchange: exchangeName }
|
|
131
|
+
},
|
|
132
|
+
{
|
|
133
|
+
check: types_1.ChannelFunctionTypes.AMQP_QUEUE_PUBLISH,
|
|
134
|
+
render: publishQueue_1.renderPublishQueue,
|
|
135
|
+
action: 'send'
|
|
136
|
+
},
|
|
137
|
+
{
|
|
138
|
+
check: types_1.ChannelFunctionTypes.AMQP_QUEUE_SUBSCRIBE,
|
|
139
|
+
render: subscribeQueue_1.renderSubscribeQueue,
|
|
140
|
+
action: 'receive'
|
|
141
|
+
}
|
|
142
|
+
];
|
|
143
|
+
for (const { check, render, action, additionalProperties } of renderChecks) {
|
|
144
|
+
if ((0, asyncapi_1.shouldRenderFunctionType)(functionTypeMapping, check, action, generator.asyncapiReverseOperations)) {
|
|
145
|
+
renders.push(render({ ...updatedContext, additionalProperties }));
|
|
146
|
+
}
|
|
147
|
+
}
|
|
148
|
+
return renders;
|
|
149
|
+
}
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
import { SingleFunctionRenderType } from '../../../../../types';
|
|
2
|
+
import { RenderRegularParameters } from '../../types';
|
|
3
|
+
export declare function renderPublishExchange({ topic, messageType, messageModule, channelParameters, channelHeaders, subName, functionName, additionalProperties, description, deprecated }: RenderRegularParameters<{
|
|
4
|
+
exchange: string | undefined;
|
|
5
|
+
}>): SingleFunctionRenderType;
|