@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.
- package/dist/generated/ast.d.ts +4 -1
- package/dist/generated/ast.d.ts.map +1 -1
- package/dist/generated/ast.js +5 -1
- package/dist/generated/ast.js.map +1 -1
- package/dist/generated/grammar.d.ts.map +1 -1
- package/dist/generated/grammar.js +371 -326
- package/dist/generated/grammar.js.map +1 -1
- package/dist/index.d.ts +3 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +1 -0
- package/dist/index.js.map +1 -1
- package/dist/resolvers/asyncapi.d.ts +54 -0
- package/dist/resolvers/asyncapi.d.ts.map +1 -0
- package/dist/resolvers/asyncapi.js +483 -0
- package/dist/resolvers/asyncapi.js.map +1 -0
- package/dist/resolvers/index.d.ts +8 -0
- package/dist/resolvers/index.d.ts.map +1 -0
- package/dist/resolvers/index.js +6 -0
- package/dist/resolvers/index.js.map +1 -0
- package/dist/resolvers/openapi.d.ts +44 -0
- package/dist/resolvers/openapi.d.ts.map +1 -0
- package/dist/resolvers/openapi.js +182 -0
- package/dist/resolvers/openapi.js.map +1 -0
- package/dist/resolvers/resolve.d.ts +25 -0
- package/dist/resolvers/resolve.d.ts.map +1 -0
- package/dist/resolvers/resolve.js +329 -0
- package/dist/resolvers/resolve.js.map +1 -0
- package/dist/resolvers/types.d.ts +44 -0
- package/dist/resolvers/types.d.ts.map +1 -0
- package/dist/resolvers/types.js +2 -0
- package/dist/resolvers/types.js.map +1 -0
- package/package.json +3 -1
- package/syntaxes/ec.tmLanguage.json +1 -1
|
@@ -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
|