@eventcatalog/language-server 0.4.1 → 0.6.0

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.
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/resolvers/index.ts"],"names":[],"mappings":"AAUA,OAAO,EACL,SAAS,EACT,eAAe,EACf,eAAe,EACf,cAAc,EACd,WAAW,EACX,WAAW,EACX,WAAW,GACZ,MAAM,eAAe,CAAC;AACvB,OAAO,EACL,gBAAgB,EAChB,qBAAqB,EACrB,kBAAkB,EAClB,kBAAkB,GACnB,MAAM,cAAc,CAAC;AAEtB,OAAO,EACL,kBAAkB,EAClB,uBAAuB,EACvB,cAAc,GACf,MAAM,cAAc,CAAC;AACtB,0IAA0I;AAC1I,OAAO,EACL,kBAAkB,IAAI,sBAAsB,EAC5C,uBAAuB,IAAI,2BAA2B,GACvD,MAAM,cAAc,CAAC"}
@@ -0,0 +1,44 @@
1
+ import type { SpecMessage, SpecService, ResolveError } from "./types.js";
2
+ export interface ParsedOpenApiSpec {
3
+ messages: Map<string, SpecMessage & {
4
+ messageType: "command" | "query";
5
+ }>;
6
+ info?: {
7
+ title?: string;
8
+ version?: string;
9
+ description?: string;
10
+ };
11
+ errors: ResolveError[];
12
+ }
13
+ /**
14
+ * Derive a PascalCase operation name from an HTTP method and path.
15
+ * e.g. GET /orders/{id}/items -> GetOrdersIdItems
16
+ */
17
+ export declare function operationNameFromPath(method: string, path: string): string;
18
+ /**
19
+ * Parse an OpenAPI v3.0 or v3.1 document and extract operations as messages.
20
+ */
21
+ export declare function parseOpenApiSpec(content: string): ParsedOpenApiSpec;
22
+ /**
23
+ * Extract a full service definition from an OpenAPI spec.
24
+ * All operations are "receives" (the service receives HTTP requests).
25
+ * No channels are generated for OpenAPI specs.
26
+ */
27
+ export declare function extractOpenApiService(content: string, serviceName?: string): {
28
+ service: SpecService;
29
+ errors: ResolveError[];
30
+ };
31
+ /**
32
+ * Convert an OpenAPI SpecService to a full .ec definition string.
33
+ * Generates standalone command/query definitions with summaries,
34
+ * followed by the service block with receives statements.
35
+ */
36
+ export declare function openApiServiceToEc(service: SpecService): string;
37
+ /**
38
+ * Convert an OpenAPI message to an .ec definition string.
39
+ * Uses the message's messageType to determine whether it's a command or query.
40
+ */
41
+ export declare function openApiMessageToEc(msg: SpecMessage & {
42
+ messageType: "command" | "query";
43
+ }): string;
44
+ //# sourceMappingURL=openapi.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"openapi.d.ts","sourceRoot":"","sources":["../../src/resolvers/openapi.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EACV,WAAW,EAEX,WAAW,EACX,YAAY,EACb,MAAM,YAAY,CAAC;AAQpB,MAAM,WAAW,iBAAiB;IAChC,QAAQ,EAAE,GAAG,CAAC,MAAM,EAAE,WAAW,GAAG;QAAE,WAAW,EAAE,SAAS,GAAG,OAAO,CAAA;KAAE,CAAC,CAAC;IAC1E,IAAI,CAAC,EAAE;QAAE,KAAK,CAAC,EAAE,MAAM,CAAC;QAAC,OAAO,CAAC,EAAE,MAAM,CAAC;QAAC,WAAW,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC;IAClE,MAAM,EAAE,YAAY,EAAE,CAAC;CACxB;AAED;;;GAGG;AACH,wBAAgB,qBAAqB,CAAC,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,MAAM,CAc1E;AAED;;GAEG;AACH,wBAAgB,gBAAgB,CAAC,OAAO,EAAE,MAAM,GAAG,iBAAiB,CAwFnE;AAED;;;;GAIG;AACH,wBAAgB,qBAAqB,CACnC,OAAO,EAAE,MAAM,EACf,WAAW,CAAC,EAAE,MAAM,GACnB;IAAE,OAAO,EAAE,WAAW,CAAC;IAAC,MAAM,EAAE,YAAY,EAAE,CAAA;CAAE,CA4ClD;AAED;;;;GAIG;AACH,wBAAgB,kBAAkB,CAAC,OAAO,EAAE,WAAW,GAAG,MAAM,CA0B/D;AAED;;;GAGG;AACH,wBAAgB,kBAAkB,CAChC,GAAG,EAAE,WAAW,GAAG;IAAE,WAAW,EAAE,SAAS,GAAG,OAAO,CAAA;CAAE,GACtD,MAAM,CAKR"}
@@ -0,0 +1,182 @@
1
+ import yaml from "js-yaml";
2
+ import { ecBlock, escapeEc, sanitizeServiceName, serviceToEc, } from "./asyncapi.js";
3
+ /**
4
+ * Derive a PascalCase operation name from an HTTP method and path.
5
+ * e.g. GET /orders/{id}/items -> GetOrdersIdItems
6
+ */
7
+ export function operationNameFromPath(method, path) {
8
+ const parts = path
9
+ .split("/")
10
+ .filter(Boolean)
11
+ .map((segment) => {
12
+ // Strip braces from path params
13
+ const clean = segment.replace(/[{}]/g, "");
14
+ // PascalCase each segment
15
+ return clean.charAt(0).toUpperCase() + clean.slice(1);
16
+ });
17
+ const methodPart = method.charAt(0).toUpperCase() + method.slice(1).toLowerCase();
18
+ return methodPart + parts.join("");
19
+ }
20
+ /**
21
+ * Parse an OpenAPI v3.0 or v3.1 document and extract operations as messages.
22
+ */
23
+ export function parseOpenApiSpec(content) {
24
+ let doc;
25
+ try {
26
+ // Try JSON first for .json files
27
+ try {
28
+ doc = JSON.parse(content);
29
+ }
30
+ catch {
31
+ doc = yaml.load(content);
32
+ }
33
+ }
34
+ catch (e) {
35
+ return {
36
+ messages: new Map(),
37
+ errors: [
38
+ {
39
+ message: `Failed to parse OpenAPI spec: ${String(e)}`,
40
+ line: 1,
41
+ column: 1,
42
+ },
43
+ ],
44
+ };
45
+ }
46
+ if (!doc || typeof doc !== "object") {
47
+ return {
48
+ messages: new Map(),
49
+ errors: [
50
+ { message: "OpenAPI file is empty or invalid", line: 1, column: 1 },
51
+ ],
52
+ };
53
+ }
54
+ const openApiVersion = String(doc.openapi || "");
55
+ if (!openApiVersion.startsWith("3.0") && !openApiVersion.startsWith("3.1")) {
56
+ return {
57
+ messages: new Map(),
58
+ errors: [
59
+ {
60
+ message: `Unsupported OpenAPI version: "${openApiVersion}". Only 3.0.x and 3.1.x are supported.`,
61
+ line: 1,
62
+ column: 1,
63
+ },
64
+ ],
65
+ };
66
+ }
67
+ const messages = new Map();
68
+ const paths = doc.paths || {};
69
+ const specVersion = doc.info?.version;
70
+ for (const [path, pathItem] of Object.entries(paths)) {
71
+ if (!pathItem || typeof pathItem !== "object")
72
+ continue;
73
+ for (const method of ["get", "post", "put", "patch", "delete"]) {
74
+ const op = pathItem[method];
75
+ if (!op)
76
+ continue;
77
+ const name = op.operationId || operationNameFromPath(method, path);
78
+ const overrideType = op["x-eventcatalog-message-type"];
79
+ const messageType = overrideType === "command" || overrideType === "query"
80
+ ? overrideType
81
+ : method === "get"
82
+ ? "query"
83
+ : "command";
84
+ messages.set(name, {
85
+ name,
86
+ summary: op.summary,
87
+ description: op.description,
88
+ version: specVersion,
89
+ messageType,
90
+ });
91
+ }
92
+ }
93
+ const info = doc.info
94
+ ? {
95
+ title: doc.info.title,
96
+ version: doc.info.version,
97
+ description: doc.info.description,
98
+ }
99
+ : undefined;
100
+ return { messages, info, errors: [] };
101
+ }
102
+ /**
103
+ * Extract a full service definition from an OpenAPI spec.
104
+ * All operations are "receives" (the service receives HTTP requests).
105
+ * No channels are generated for OpenAPI specs.
106
+ */
107
+ export function extractOpenApiService(content, serviceName) {
108
+ const emptyService = (name) => ({
109
+ name,
110
+ operations: [],
111
+ channels: [],
112
+ messages: [],
113
+ });
114
+ const parsed = parseOpenApiSpec(content);
115
+ if (parsed.errors.length > 0) {
116
+ return {
117
+ service: emptyService(serviceName || "UnknownService"),
118
+ errors: parsed.errors,
119
+ };
120
+ }
121
+ const name = serviceName || sanitizeServiceName(parsed.info?.title) || "UnknownService";
122
+ const version = parsed.info?.version;
123
+ const summary = parsed.info?.description?.trim().split("\n")[0];
124
+ const operations = [];
125
+ const messages = [];
126
+ for (const msg of parsed.messages.values()) {
127
+ operations.push({
128
+ action: "receive",
129
+ channelName: "",
130
+ messageName: msg.name,
131
+ messageType: msg.messageType,
132
+ summary: msg.summary,
133
+ });
134
+ messages.push({
135
+ name: msg.name,
136
+ summary: msg.summary,
137
+ description: msg.description,
138
+ version: msg.version,
139
+ });
140
+ }
141
+ return {
142
+ service: { name, version, summary, operations, channels: [], messages },
143
+ errors: [],
144
+ };
145
+ }
146
+ /**
147
+ * Convert an OpenAPI SpecService to a full .ec definition string.
148
+ * Generates standalone command/query definitions with summaries,
149
+ * followed by the service block with receives statements.
150
+ */
151
+ export function openApiServiceToEc(service) {
152
+ const parts = [];
153
+ // Build a map of messageName -> messageType from operations
154
+ const messageTypeMap = new Map();
155
+ for (const op of service.operations) {
156
+ if (op.messageType === "command" || op.messageType === "query") {
157
+ messageTypeMap.set(op.messageName, op.messageType);
158
+ }
159
+ }
160
+ // Generate standalone message definitions with summaries
161
+ for (const msg of service.messages) {
162
+ const msgType = messageTypeMap.get(msg.name) || "command";
163
+ parts.push(ecBlock(msgType, msg.name, [
164
+ msg.version && `version ${msg.version}`,
165
+ msg.summary && `summary "${escapeEc(msg.summary)}"`,
166
+ ]));
167
+ }
168
+ // Generate the service block
169
+ parts.push(serviceToEc(service));
170
+ return parts.join("\n\n");
171
+ }
172
+ /**
173
+ * Convert an OpenAPI message to an .ec definition string.
174
+ * Uses the message's messageType to determine whether it's a command or query.
175
+ */
176
+ export function openApiMessageToEc(msg) {
177
+ return ecBlock(msg.messageType, msg.name, [
178
+ msg.version && `version ${msg.version}`,
179
+ msg.summary && `summary "${escapeEc(msg.summary)}"`,
180
+ ]);
181
+ }
182
+ //# sourceMappingURL=openapi.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"openapi.js","sourceRoot":"","sources":["../../src/resolvers/openapi.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,25 @@
1
+ import type { SpecResolveResult, FetchFn } from "./types.js";
2
+ type SpecType = "asyncapi" | "openapi" | "unknown";
3
+ /**
4
+ * Detect whether a spec document is AsyncAPI or OpenAPI based on its content.
5
+ */
6
+ export declare function detectSpecType(content: string): SpecType;
7
+ /**
8
+ * Resolve all spec imports in a set of files (sync, local files only).
9
+ * Scans .ec files for `import <type> { ... } from "*.yml"` and
10
+ * `import ServiceName from "*.yml"` statements, auto-detects whether
11
+ * each spec is AsyncAPI or OpenAPI, and replaces the imports with
12
+ * synthesized .ec definitions.
13
+ * Spec files (YAML/JSON) are excluded from the output.
14
+ * URL imports are left untouched - use resolveSpecImportsAsync for those.
15
+ */
16
+ export declare function resolveSpecImports(files: Record<string, string>): SpecResolveResult;
17
+ /**
18
+ * Resolve all spec imports including remote URLs (async).
19
+ * Fetches remote specs via the provided fetchFn, then resolves all imports.
20
+ * Auto-detects AsyncAPI vs OpenAPI from file content.
21
+ * For local file imports, looks them up in the files map.
22
+ */
23
+ export declare function resolveSpecImportsAsync(files: Record<string, string>, fetchFn: FetchFn): Promise<SpecResolveResult>;
24
+ export {};
25
+ //# sourceMappingURL=resolve.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"resolve.d.ts","sourceRoot":"","sources":["../../src/resolvers/resolve.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAKV,iBAAiB,EACjB,OAAO,EACR,MAAM,YAAY,CAAC;AA4BpB,KAAK,QAAQ,GAAG,UAAU,GAAG,SAAS,GAAG,SAAS,CAAC;AAEnD;;GAEG;AACH,wBAAgB,cAAc,CAAC,OAAO,EAAE,MAAM,GAAG,QAAQ,CAexD;AA8SD;;;;;;;;GAQG;AACH,wBAAgB,kBAAkB,CAChC,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAC5B,iBAAiB,CAoBnB;AAED;;;;;GAKG;AACH,wBAAsB,uBAAuB,CAC3C,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,EAC7B,OAAO,EAAE,OAAO,GACf,OAAO,CAAC,iBAAiB,CAAC,CAiD5B"}
@@ -0,0 +1,329 @@
1
+ import yaml from "js-yaml";
2
+ import { parseSpec, extractService, messageToEc, channelToEc, serviceToEc, } from "./asyncapi.js";
3
+ import { parseOpenApiSpec, extractOpenApiService, openApiServiceToEc, openApiMessageToEc, } from "./openapi.js";
4
+ // Matches: import events { OrderCreated } from "./spec.yml"
5
+ // Matches: import channels { orderEvents } from "./spec.yml"
6
+ // Matches: import events { OrderCreated } from "https://example.com/spec.yml"
7
+ // Also matches .json files for OpenAPI specs
8
+ const SPEC_IMPORT_RE = /import\s+(events|commands|queries|channels)\s*\{([^}]*)\}\s*from\s*"([^"]+\.(?:ya?ml|json))"\s*\n?/g;
9
+ // Matches: import OrderService from "./spec.yml"
10
+ // A bare identifier (no braces, no resource type keyword) imports a full service
11
+ // Also matches .json files for OpenAPI specs
12
+ const SERVICE_IMPORT_RE = /import\s+([A-Z][a-zA-Z0-9_]*)\s+from\s*"([^"]+\.(?:ya?ml|json))"\s*\n?/g;
13
+ /**
14
+ * Detect whether a spec document is AsyncAPI or OpenAPI based on its content.
15
+ */
16
+ export function detectSpecType(content) {
17
+ try {
18
+ let doc;
19
+ try {
20
+ doc = JSON.parse(content);
21
+ }
22
+ catch {
23
+ doc = yaml.load(content);
24
+ }
25
+ if (!doc || typeof doc !== "object")
26
+ return "unknown";
27
+ if (doc.asyncapi)
28
+ return "asyncapi";
29
+ if (doc.openapi)
30
+ return "openapi";
31
+ return "unknown";
32
+ }
33
+ catch {
34
+ return "unknown";
35
+ }
36
+ }
37
+ function findImports(source) {
38
+ const imports = [];
39
+ SPEC_IMPORT_RE.lastIndex = 0;
40
+ let match;
41
+ while ((match = SPEC_IMPORT_RE.exec(source)) !== null) {
42
+ imports.push({
43
+ full: match[0],
44
+ resourceType: match[1],
45
+ importNames: match[2]
46
+ .split(",")
47
+ .map((s) => s.trim())
48
+ .filter(Boolean),
49
+ specPath: match[3],
50
+ });
51
+ }
52
+ return imports;
53
+ }
54
+ function findServiceImports(source) {
55
+ const imports = [];
56
+ SERVICE_IMPORT_RE.lastIndex = 0;
57
+ let match;
58
+ while ((match = SERVICE_IMPORT_RE.exec(source)) !== null) {
59
+ imports.push({
60
+ full: match[0],
61
+ serviceName: match[1],
62
+ specPath: match[2],
63
+ });
64
+ }
65
+ return imports;
66
+ }
67
+ function resolveAsyncApiImportToEc(imp, specContent, cachedParsedSpecs) {
68
+ const errors = [];
69
+ const cacheKey = normalizeSpecKey(imp.specPath);
70
+ if (!cachedParsedSpecs.has(cacheKey)) {
71
+ const parsed = parseSpec(specContent);
72
+ cachedParsedSpecs.set(cacheKey, parsed);
73
+ errors.push(...parsed.errors);
74
+ }
75
+ const parsed = cachedParsedSpecs.get(cacheKey);
76
+ const isChannelImport = imp.resourceType === "channels";
77
+ const catalog = isChannelImport ? parsed.channels : parsed.messages;
78
+ const typeName = isChannelImport ? "Channel" : "Message";
79
+ const ecDefs = imp.importNames.map((name) => {
80
+ const resource = catalog.get(name);
81
+ if (!resource) {
82
+ errors.push({
83
+ message: `${typeName} "${name}" not found in AsyncAPI spec "${imp.specPath}". Available: ${[...catalog.keys()].join(", ") || "(none)"}`,
84
+ line: 1,
85
+ column: 1,
86
+ });
87
+ return `// ERROR: "${name}" not found in ${imp.specPath}`;
88
+ }
89
+ return isChannelImport
90
+ ? channelToEc(resource)
91
+ : messageToEc(resource, imp.resourceType);
92
+ });
93
+ return { ec: ecDefs.join("\n\n"), errors };
94
+ }
95
+ function resolveOpenApiImportToEc(imp, specContent, cachedParsedSpecs) {
96
+ const errors = [];
97
+ // OpenAPI does not support event or channel imports
98
+ if (imp.resourceType === "events") {
99
+ errors.push({
100
+ message: `OpenAPI specs contain commands and queries, not events. Use "import commands" or "import queries" instead for "${imp.specPath}".`,
101
+ line: 1,
102
+ column: 1,
103
+ });
104
+ return {
105
+ ec: `// ERROR: OpenAPI specs do not contain events`,
106
+ errors,
107
+ };
108
+ }
109
+ if (imp.resourceType === "channels") {
110
+ errors.push({
111
+ message: `OpenAPI specs do not contain channels for "${imp.specPath}".`,
112
+ line: 1,
113
+ column: 1,
114
+ });
115
+ return {
116
+ ec: `// ERROR: OpenAPI specs do not contain channels`,
117
+ errors,
118
+ };
119
+ }
120
+ const cacheKey = normalizeSpecKey(imp.specPath);
121
+ if (!cachedParsedSpecs.has(cacheKey)) {
122
+ const parsed = parseOpenApiSpec(specContent);
123
+ cachedParsedSpecs.set(cacheKey, parsed);
124
+ errors.push(...parsed.errors);
125
+ }
126
+ const parsed = cachedParsedSpecs.get(cacheKey);
127
+ // Map the import keyword to the expected message type
128
+ const expectedType = imp.resourceType === "commands" ? "command" : "query";
129
+ const ecDefs = imp.importNames.map((name) => {
130
+ const msg = parsed.messages.get(name);
131
+ if (!msg) {
132
+ errors.push({
133
+ message: `Message "${name}" not found in OpenAPI spec "${imp.specPath}". Available: ${[...parsed.messages.keys()].join(", ") || "(none)"}`,
134
+ line: 1,
135
+ column: 1,
136
+ });
137
+ return `// ERROR: "${name}" not found in ${imp.specPath}`;
138
+ }
139
+ // Enforce that the message type matches the import keyword
140
+ if (msg.messageType !== expectedType) {
141
+ errors.push({
142
+ message: `"${name}" is a ${msg.messageType} but was imported as "${imp.resourceType}" in "${imp.specPath}". Use "import ${msg.messageType === "command" ? "commands" : "queries"} { ${name} }" instead.`,
143
+ line: 1,
144
+ column: 1,
145
+ });
146
+ return `// ERROR: "${name}" is a ${msg.messageType}, not a ${expectedType}`;
147
+ }
148
+ return openApiMessageToEc(msg);
149
+ });
150
+ return { ec: ecDefs.join("\n\n"), errors };
151
+ }
152
+ function resolveServiceImportToEc(imp, specContent, specType) {
153
+ if (specType === "openapi") {
154
+ const { service, errors } = extractOpenApiService(specContent, imp.serviceName);
155
+ return { ec: openApiServiceToEc(service), errors };
156
+ }
157
+ // Default to AsyncAPI
158
+ const { service, errors } = extractService(specContent, imp.serviceName);
159
+ return { ec: serviceToEc(service), errors };
160
+ }
161
+ function isUrl(path) {
162
+ return path.startsWith("https://") || path.startsWith("http://");
163
+ }
164
+ function normalizeSpecKey(specPath) {
165
+ return isUrl(specPath) ? specPath : specPath.replace(/^\.\//, "");
166
+ }
167
+ function lookupLocalSpec(specPath, files) {
168
+ const normalizedPath = specPath.replace(/^\.\//, "");
169
+ return (files[specPath] ?? files[normalizedPath] ?? files[`./${normalizedPath}`]);
170
+ }
171
+ function isSpecFile(filename) {
172
+ return (filename.endsWith(".yml") ||
173
+ filename.endsWith(".yaml") ||
174
+ filename.endsWith(".json"));
175
+ }
176
+ const SKIP = Symbol("skip");
177
+ /**
178
+ * Core resolution logic shared by sync and async resolvers.
179
+ * Given a spec content lookup function, resolves all imports in .ec files.
180
+ * Auto-detects whether each spec is AsyncAPI or OpenAPI.
181
+ * Return `SKIP` from the callback to leave an import untouched;
182
+ * return `undefined` to replace it with an error comment.
183
+ */
184
+ function resolveFileImports(files, getSpecContent) {
185
+ const errors = [];
186
+ const newFiles = {};
187
+ const cachedAsyncApiSpecs = new Map();
188
+ const cachedOpenApiSpecs = new Map();
189
+ const specTypeCache = new Map();
190
+ function getSpecType(specPath, content) {
191
+ const cacheKey = normalizeSpecKey(specPath);
192
+ if (!specTypeCache.has(cacheKey)) {
193
+ specTypeCache.set(cacheKey, detectSpecType(content));
194
+ }
195
+ return specTypeCache.get(cacheKey);
196
+ }
197
+ for (const [filename, source] of Object.entries(files)) {
198
+ if (isSpecFile(filename))
199
+ continue;
200
+ const imports = findImports(source);
201
+ const serviceImports = findServiceImports(source);
202
+ if (imports.length === 0 && serviceImports.length === 0) {
203
+ newFiles[filename] = source;
204
+ continue;
205
+ }
206
+ let result = source;
207
+ // Resolve resource imports (import events { ... } from "spec.yml")
208
+ for (const imp of imports) {
209
+ const specContent = getSpecContent(imp.specPath);
210
+ if (specContent === SKIP)
211
+ continue;
212
+ if (!specContent) {
213
+ result = result.replace(imp.full, `// ERROR: Spec file not available: ${imp.specPath}`);
214
+ continue;
215
+ }
216
+ const specType = getSpecType(imp.specPath, specContent);
217
+ let resolution;
218
+ if (specType === "openapi") {
219
+ resolution = resolveOpenApiImportToEc(imp, specContent, cachedOpenApiSpecs);
220
+ }
221
+ else {
222
+ resolution = resolveAsyncApiImportToEc(imp, specContent, cachedAsyncApiSpecs);
223
+ }
224
+ errors.push(...resolution.errors);
225
+ result = result.replace(imp.full, resolution.ec);
226
+ }
227
+ // Resolve service imports (import ServiceName from "spec.yml")
228
+ for (const imp of serviceImports) {
229
+ const specContent = getSpecContent(imp.specPath);
230
+ if (specContent === SKIP)
231
+ continue;
232
+ if (!specContent) {
233
+ result = result.replace(imp.full, `// ERROR: Spec file not available: ${imp.specPath}`);
234
+ continue;
235
+ }
236
+ const specType = getSpecType(imp.specPath, specContent);
237
+ const resolution = resolveServiceImportToEc(imp, specContent, specType);
238
+ errors.push(...resolution.errors);
239
+ result = result.replace(imp.full, resolution.ec);
240
+ }
241
+ newFiles[filename] = result;
242
+ }
243
+ return { files: newFiles, errors };
244
+ }
245
+ /**
246
+ * Resolve all spec imports in a set of files (sync, local files only).
247
+ * Scans .ec files for `import <type> { ... } from "*.yml"` and
248
+ * `import ServiceName from "*.yml"` statements, auto-detects whether
249
+ * each spec is AsyncAPI or OpenAPI, and replaces the imports with
250
+ * synthesized .ec definitions.
251
+ * Spec files (YAML/JSON) are excluded from the output.
252
+ * URL imports are left untouched - use resolveSpecImportsAsync for those.
253
+ */
254
+ export function resolveSpecImports(files) {
255
+ const notFoundErrors = [];
256
+ const result = resolveFileImports(files, (specPath) => {
257
+ if (isUrl(specPath))
258
+ return SKIP;
259
+ const content = lookupLocalSpec(specPath, files);
260
+ if (!content) {
261
+ notFoundErrors.push({
262
+ message: `Spec file not found: "${specPath}"`,
263
+ line: 1,
264
+ column: 1,
265
+ });
266
+ }
267
+ return content;
268
+ });
269
+ return {
270
+ files: result.files,
271
+ errors: [...notFoundErrors, ...result.errors],
272
+ };
273
+ }
274
+ /**
275
+ * Resolve all spec imports including remote URLs (async).
276
+ * Fetches remote specs via the provided fetchFn, then resolves all imports.
277
+ * Auto-detects AsyncAPI vs OpenAPI from file content.
278
+ * For local file imports, looks them up in the files map.
279
+ */
280
+ export async function resolveSpecImportsAsync(files, fetchFn) {
281
+ // Collect all unique remote URLs that need fetching
282
+ const urlsToFetch = new Set();
283
+ for (const [filename, source] of Object.entries(files)) {
284
+ if (isSpecFile(filename))
285
+ continue;
286
+ for (const imp of findImports(source)) {
287
+ if (isUrl(imp.specPath))
288
+ urlsToFetch.add(imp.specPath);
289
+ }
290
+ for (const imp of findServiceImports(source)) {
291
+ if (isUrl(imp.specPath))
292
+ urlsToFetch.add(imp.specPath);
293
+ }
294
+ }
295
+ // Fetch all remote specs in parallel
296
+ const fetchErrors = [];
297
+ const fetchedSpecs = new Map();
298
+ await Promise.all([...urlsToFetch].map(async (url) => {
299
+ try {
300
+ fetchedSpecs.set(url, await fetchFn(url));
301
+ }
302
+ catch (err) {
303
+ fetchErrors.push({
304
+ message: `Failed to fetch spec "${url}": ${String(err)}`,
305
+ line: 1,
306
+ column: 1,
307
+ });
308
+ }
309
+ }));
310
+ const notFoundErrors = [];
311
+ const result = resolveFileImports(files, (specPath) => {
312
+ if (isUrl(specPath))
313
+ return fetchedSpecs.get(specPath);
314
+ const content = lookupLocalSpec(specPath, files);
315
+ if (!content) {
316
+ notFoundErrors.push({
317
+ message: `Spec file not found: "${specPath}"`,
318
+ line: 1,
319
+ column: 1,
320
+ });
321
+ }
322
+ return content;
323
+ });
324
+ return {
325
+ files: result.files,
326
+ errors: [...fetchErrors, ...notFoundErrors, ...result.errors],
327
+ };
328
+ }
329
+ //# sourceMappingURL=resolve.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"resolve.js","sourceRoot":"","sources":["../../src/resolvers/resolve.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,44 @@
1
+ export type ResourceType = "events" | "commands" | "queries" | "channels";
2
+ export interface SpecMessage {
3
+ name: string;
4
+ summary?: string;
5
+ description?: string;
6
+ version?: string;
7
+ }
8
+ export interface SpecChannel {
9
+ name: string;
10
+ address?: string;
11
+ protocol?: string;
12
+ summary?: string;
13
+ version?: string;
14
+ }
15
+ export interface SpecOperation {
16
+ action: "send" | "receive";
17
+ channelName: string;
18
+ messageName: string;
19
+ messageType?: "event" | "command" | "query";
20
+ summary?: string;
21
+ }
22
+ export interface SpecService {
23
+ name: string;
24
+ version?: string;
25
+ summary?: string;
26
+ operations: SpecOperation[];
27
+ channels: SpecChannel[];
28
+ messages: SpecMessage[];
29
+ }
30
+ export interface ResolveError {
31
+ message: string;
32
+ line: number;
33
+ column: number;
34
+ }
35
+ export interface SpecResolveResult {
36
+ files: Record<string, string>;
37
+ errors: ResolveError[];
38
+ }
39
+ /**
40
+ * A fetch function that takes a URL and returns the response text.
41
+ * Allows callers to provide their own fetch implementation (browser fetch, node-fetch, etc.)
42
+ */
43
+ export type FetchFn = (url: string) => Promise<string>;
44
+ //# sourceMappingURL=types.d.ts.map