@relkit/openapi 0.0.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/LICENSE +21 -0
- package/README.md +5 -0
- package/dist/generate-request.d.ts +7 -0
- package/dist/generate-request.d.ts.map +1 -0
- package/dist/generate-request.js +112 -0
- package/dist/generate-request.js.map +1 -0
- package/dist/generate-response.d.ts +5 -0
- package/dist/generate-response.d.ts.map +1 -0
- package/dist/generate-response.js +150 -0
- package/dist/generate-response.js.map +1 -0
- package/dist/generate-services.d.ts +10 -0
- package/dist/generate-services.d.ts.map +1 -0
- package/dist/generate-services.js +49 -0
- package/dist/generate-services.js.map +1 -0
- package/dist/generate-tags.d.ts +11 -0
- package/dist/generate-tags.d.ts.map +1 -0
- package/dist/generate-tags.js +27 -0
- package/dist/generate-tags.js.map +1 -0
- package/dist/generate-utils.d.ts +5 -0
- package/dist/generate-utils.d.ts.map +1 -0
- package/dist/generate-utils.js +43 -0
- package/dist/generate-utils.js.map +1 -0
- package/dist/generate.d.ts +79 -0
- package/dist/generate.d.ts.map +1 -0
- package/dist/generate.js +71 -0
- package/dist/generate.js.map +1 -0
- package/dist/index.d.ts +2 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +2 -0
- package/dist/index.js.map +1 -0
- package/package.json +40 -0
package/LICENSE
ADDED
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
MIT License
|
|
2
|
+
|
|
3
|
+
Copyright (c) 2026 rel-kit
|
|
4
|
+
|
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
6
|
+
of this software and associated documentation files (the "Software"), to deal
|
|
7
|
+
in the Software without restriction, including without limitation the rights
|
|
8
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
9
|
+
copies of the Software, and to permit persons to whom the Software is
|
|
10
|
+
furnished to do so, subject to the following conditions:
|
|
11
|
+
|
|
12
|
+
The above copyright notice and this permission notice shall be included in all
|
|
13
|
+
copies or substantial portions of the Software.
|
|
14
|
+
|
|
15
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
16
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
17
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
18
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
19
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
20
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
21
|
+
SOFTWARE.
|
package/README.md
ADDED
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
import type { JsonValue } from "@relkit/contracts";
|
|
2
|
+
import type { OpenApiOperation, OpenApiParameter } from "./generate.js";
|
|
3
|
+
export declare function buildRequest(mapping: JsonValue, root: JsonValue, routePath: string): {
|
|
4
|
+
readonly parameters: OpenApiParameter[];
|
|
5
|
+
readonly body?: OpenApiOperation["requestBody"];
|
|
6
|
+
};
|
|
7
|
+
//# sourceMappingURL=generate-request.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"generate-request.d.ts","sourceRoot":"","sources":["../src/generate-request.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,mBAAmB,CAAC;AACnD,OAAO,KAAK,EAEV,gBAAgB,EAChB,gBAAgB,EAEjB,MAAM,eAAe,CAAC;AASvB,wBAAgB,YAAY,CAC1B,OAAO,EAAE,SAAS,EAClB,IAAI,EAAE,SAAS,EACf,SAAS,EAAE,MAAM,GAChB;IAAE,QAAQ,CAAC,UAAU,EAAE,gBAAgB,EAAE,CAAC;IAAC,QAAQ,CAAC,IAAI,CAAC,EAAE,gBAAgB,CAAC,aAAa,CAAC,CAAA;CAAE,CAiC9F"}
|
|
@@ -0,0 +1,112 @@
|
|
|
1
|
+
export function buildRequest(mapping, root, routePath) {
|
|
2
|
+
const parameters = [];
|
|
3
|
+
const bodies = [];
|
|
4
|
+
collect(mapping, [], root, parameters, bodies, false, false);
|
|
5
|
+
const routeNames = routeParameters(routePath);
|
|
6
|
+
const declared = new Set(routeNames);
|
|
7
|
+
const matching = parameters.filter((entry) => entry.in !== "path" || declared.has(entry.name));
|
|
8
|
+
const parameterKeys = new Set(matching.map((entry) => `${entry.in}:${entry.name}`));
|
|
9
|
+
for (const name of routeNames) {
|
|
10
|
+
if (!parameterKeys.has(`path:${name}`))
|
|
11
|
+
matching.push({ name, in: "path", required: true, schema: { type: "string" } });
|
|
12
|
+
}
|
|
13
|
+
matching.sort((left, right) => `${left.in}:${left.name}`.localeCompare(`${right.in}:${right.name}`));
|
|
14
|
+
if (bodies.length === 0)
|
|
15
|
+
return { parameters: matching };
|
|
16
|
+
const groups = new Map();
|
|
17
|
+
for (const entry of bodies) {
|
|
18
|
+
const media = entry.kind.startsWith("multipart") ? "multipart/form-data" : "application/json";
|
|
19
|
+
const group = groups.get(media) ?? [];
|
|
20
|
+
group.push(entry);
|
|
21
|
+
groups.set(media, group);
|
|
22
|
+
}
|
|
23
|
+
const content = {};
|
|
24
|
+
let required = false;
|
|
25
|
+
for (const [media, entries] of [...groups.entries()].sort(([left], [right]) => left.localeCompare(right))) {
|
|
26
|
+
required ||= entries.some((entry) => entry.required);
|
|
27
|
+
const whole = entries.length === 1 && entries[0]?.kind === "whole-body";
|
|
28
|
+
content[media] = { schema: whole ? entries[0].schema : objectSchema(entries) };
|
|
29
|
+
}
|
|
30
|
+
return { parameters: matching, body: { required, content } };
|
|
31
|
+
}
|
|
32
|
+
function collect(value, path, root, parameters, bodies, optional, defaulted) {
|
|
33
|
+
if (!isRecord(value) || typeof value.kind !== "string")
|
|
34
|
+
return;
|
|
35
|
+
if ((value.kind === "input" || value.kind === "nested") && isRecord(value.fields)) {
|
|
36
|
+
for (const [name, child] of Object.entries(value.fields))
|
|
37
|
+
collect(child, [...path, name], root, parameters, bodies, optional, defaulted);
|
|
38
|
+
return;
|
|
39
|
+
}
|
|
40
|
+
if (value.kind === "optional" || value.kind === "default" || value.kind === "transform") {
|
|
41
|
+
collect(value.value, path, root, parameters, bodies, optional || value.kind === "optional", defaulted || value.kind === "default");
|
|
42
|
+
return;
|
|
43
|
+
}
|
|
44
|
+
const schema = schemaAt(root, path) ?? {};
|
|
45
|
+
if (isParameterKind(value.kind)) {
|
|
46
|
+
const name = typeof value.name === "string" ? value.name : (path.at(-1) ?? "value");
|
|
47
|
+
parameters.push({
|
|
48
|
+
name,
|
|
49
|
+
in: value.kind === "path-segments" ? "path" : value.kind,
|
|
50
|
+
required: value.kind === "path" || value.kind === "path-segments" || (!optional && !defaulted),
|
|
51
|
+
schema: value.kind === "path-segments" ? { type: "string" } : schema,
|
|
52
|
+
});
|
|
53
|
+
}
|
|
54
|
+
else if (value.kind === "body" ||
|
|
55
|
+
value.kind === "multipart" ||
|
|
56
|
+
value.kind === "multipart-all" ||
|
|
57
|
+
value.kind === "whole-body") {
|
|
58
|
+
bodies.push({
|
|
59
|
+
kind: value.kind,
|
|
60
|
+
...(typeof value.name === "string" ? { name: value.name } : {}),
|
|
61
|
+
schema,
|
|
62
|
+
required: !optional && !defaulted,
|
|
63
|
+
});
|
|
64
|
+
}
|
|
65
|
+
}
|
|
66
|
+
function objectSchema(entries) {
|
|
67
|
+
const properties = {};
|
|
68
|
+
const required = [];
|
|
69
|
+
for (const entry of [...entries].sort((left, right) => String(left.name).localeCompare(String(right.name)))) {
|
|
70
|
+
if (entry.name === undefined)
|
|
71
|
+
return entry.schema;
|
|
72
|
+
properties[entry.name] = entry.schema;
|
|
73
|
+
if (entry.required)
|
|
74
|
+
required.push(entry.name);
|
|
75
|
+
}
|
|
76
|
+
return { type: "object", properties, ...(required.length === 0 ? {} : { required }) };
|
|
77
|
+
}
|
|
78
|
+
function schemaValue(value) {
|
|
79
|
+
if (!isRecord(value))
|
|
80
|
+
return undefined;
|
|
81
|
+
return value.$relkit === "schema" && isRecord(value.jsonSchema)
|
|
82
|
+
? value.jsonSchema
|
|
83
|
+
: value;
|
|
84
|
+
}
|
|
85
|
+
function schemaAt(root, path) {
|
|
86
|
+
let current = schemaValue(root);
|
|
87
|
+
for (const name of path) {
|
|
88
|
+
const properties = current?.properties;
|
|
89
|
+
if (!isRecord(properties))
|
|
90
|
+
return undefined;
|
|
91
|
+
current = schemaValue(properties[name]);
|
|
92
|
+
}
|
|
93
|
+
return current;
|
|
94
|
+
}
|
|
95
|
+
function routeParameters(path) {
|
|
96
|
+
return path.split("/").flatMap((segment, index) => {
|
|
97
|
+
if (segment.startsWith(":"))
|
|
98
|
+
return [parameterName(segment.slice(1), index)];
|
|
99
|
+
return segment.startsWith("*") ? [parameterName(segment.slice(1), index, "wildcard")] : [];
|
|
100
|
+
});
|
|
101
|
+
}
|
|
102
|
+
function parameterName(value, index, fallback = "param") {
|
|
103
|
+
const result = value.replace(/[^A-Za-z0-9_.-]/g, "_");
|
|
104
|
+
return result || `${fallback}${index}`;
|
|
105
|
+
}
|
|
106
|
+
function isParameterKind(value) {
|
|
107
|
+
return ["path", "path-segments", "query", "header", "cookie"].includes(value);
|
|
108
|
+
}
|
|
109
|
+
function isRecord(value) {
|
|
110
|
+
return value !== null && typeof value === "object" && !Array.isArray(value);
|
|
111
|
+
}
|
|
112
|
+
//# sourceMappingURL=generate-request.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"generate-request.js","sourceRoot":"","sources":["../src/generate-request.ts"],"names":[],"mappings":"AAeA,MAAM,UAAU,YAAY,CAC1B,OAAkB,EAClB,IAAe,EACf,SAAiB;IAEjB,MAAM,UAAU,GAAuB,EAAE,CAAC;IAC1C,MAAM,MAAM,GAAgB,EAAE,CAAC;IAC/B,OAAO,CAAC,OAAO,EAAE,EAAE,EAAE,IAAI,EAAE,UAAU,EAAE,MAAM,EAAE,KAAK,EAAE,KAAK,CAAC,CAAC;IAC7D,MAAM,UAAU,GAAG,eAAe,CAAC,SAAS,CAAC,CAAC;IAC9C,MAAM,QAAQ,GAAG,IAAI,GAAG,CAAC,UAAU,CAAC,CAAC;IACrC,MAAM,QAAQ,GAAG,UAAU,CAAC,MAAM,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,EAAE,KAAK,MAAM,IAAI,QAAQ,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC;IAC/F,MAAM,aAAa,GAAG,IAAI,GAAG,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,GAAG,KAAK,CAAC,EAAE,IAAI,KAAK,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC;IACpF,KAAK,MAAM,IAAI,IAAI,UAAU,EAAE,CAAC;QAC9B,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC,QAAQ,IAAI,EAAE,CAAC;YACpC,QAAQ,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,EAAE,EAAE,MAAM,EAAE,QAAQ,EAAE,IAAI,EAAE,MAAM,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,EAAE,CAAC,CAAC;IACpF,CAAC;IACD,QAAQ,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE,KAAK,EAAE,EAAE,CAC5B,GAAG,IAAI,CAAC,EAAE,IAAI,IAAI,CAAC,IAAI,EAAE,CAAC,aAAa,CAAC,GAAG,KAAK,CAAC,EAAE,IAAI,KAAK,CAAC,IAAI,EAAE,CAAC,CACrE,CAAC;IACF,IAAI,MAAM,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,EAAE,UAAU,EAAE,QAAQ,EAAE,CAAC;IACzD,MAAM,MAAM,GAAG,IAAI,GAAG,EAAuB,CAAC;IAC9C,KAAK,MAAM,KAAK,IAAI,MAAM,EAAE,CAAC;QAC3B,MAAM,KAAK,GAAG,KAAK,CAAC,IAAI,CAAC,UAAU,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,qBAAqB,CAAC,CAAC,CAAC,kBAAkB,CAAC;QAC9F,MAAM,KAAK,GAAG,MAAM,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC;QACtC,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QAClB,MAAM,CAAC,GAAG,CAAC,KAAK,EAAE,KAAK,CAAC,CAAC;IAC3B,CAAC;IACD,MAAM,OAAO,GAAqC,EAAE,CAAC;IACrD,IAAI,QAAQ,GAAG,KAAK,CAAC;IACrB,KAAK,MAAM,CAAC,KAAK,EAAE,OAAO,CAAC,IAAI,CAAC,GAAG,MAAM,CAAC,OAAO,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,KAAK,CAAC,EAAE,EAAE,CAC5E,IAAI,CAAC,aAAa,CAAC,KAAK,CAAC,CAC1B,EAAE,CAAC;QACF,QAAQ,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC;QACrD,MAAM,KAAK,GAAG,OAAO,CAAC,MAAM,KAAK,CAAC,IAAI,OAAO,CAAC,CAAC,CAAC,EAAE,IAAI,KAAK,YAAY,CAAC;QACxE,OAAO,CAAC,KAAK,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAE,CAAC,MAAM,CAAC,CAAC,CAAC,YAAY,CAAC,OAAO,CAAC,EAAE,CAAC;IAClF,CAAC;IACD,OAAO,EAAE,UAAU,EAAE,QAAQ,EAAE,IAAI,EAAE,EAAE,QAAQ,EAAE,OAAO,EAAE,EAAE,CAAC;AAC/D,CAAC;AAED,SAAS,OAAO,CACd,KAAc,EACd,IAAc,EACd,IAAe,EACf,UAA8B,EAC9B,MAAmB,EACnB,QAAiB,EACjB,SAAkB;IAElB,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC,IAAI,OAAO,KAAK,CAAC,IAAI,KAAK,QAAQ;QAAE,OAAO;IAC/D,IAAI,CAAC,KAAK,CAAC,IAAI,KAAK,OAAO,IAAI,KAAK,CAAC,IAAI,KAAK,QAAQ,CAAC,IAAI,QAAQ,CAAC,KAAK,CAAC,MAAM,CAAC,EAAE,CAAC;QAClF,KAAK,MAAM,CAAC,IAAI,EAAE,KAAK,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC,MAAM,CAAC;YACtD,OAAO,CAAC,KAAK,EAAE,CAAC,GAAG,IAAI,EAAE,IAAI,CAAC,EAAE,IAAI,EAAE,UAAU,EAAE,MAAM,EAAE,QAAQ,EAAE,SAAS,CAAC,CAAC;QACjF,OAAO;IACT,CAAC;IACD,IAAI,KAAK,CAAC,IAAI,KAAK,UAAU,IAAI,KAAK,CAAC,IAAI,KAAK,SAAS,IAAI,KAAK,CAAC,IAAI,KAAK,WAAW,EAAE,CAAC;QACxF,OAAO,CACL,KAAK,CAAC,KAAK,EACX,IAAI,EACJ,IAAI,EACJ,UAAU,EACV,MAAM,EACN,QAAQ,IAAI,KAAK,CAAC,IAAI,KAAK,UAAU,EACrC,SAAS,IAAI,KAAK,CAAC,IAAI,KAAK,SAAS,CACtC,CAAC;QACF,OAAO;IACT,CAAC;IACD,MAAM,MAAM,GAAG,QAAQ,CAAC,IAAI,EAAE,IAAI,CAAC,IAAI,EAAE,CAAC;IAC1C,IAAI,eAAe,CAAC,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC;QAChC,MAAM,IAAI,GAAG,OAAO,KAAK,CAAC,IAAI,KAAK,QAAQ,CAAC,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,IAAI,OAAO,CAAC,CAAC;QACpF,UAAU,CAAC,IAAI,CAAC;YACd,IAAI;YACJ,EAAE,EAAE,KAAK,CAAC,IAAI,KAAK,eAAe,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,KAAK,CAAC,IAAI;YACxD,QAAQ,EACN,KAAK,CAAC,IAAI,KAAK,MAAM,IAAI,KAAK,CAAC,IAAI,KAAK,eAAe,IAAI,CAAC,CAAC,QAAQ,IAAI,CAAC,SAAS,CAAC;YACtF,MAAM,EAAE,KAAK,CAAC,IAAI,KAAK,eAAe,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,QAAQ,EAAE,CAAC,CAAC,CAAC,MAAM;SACrE,CAAC,CAAC;IACL,CAAC;SAAM,IACL,KAAK,CAAC,IAAI,KAAK,MAAM;QACrB,KAAK,CAAC,IAAI,KAAK,WAAW;QAC1B,KAAK,CAAC,IAAI,KAAK,eAAe;QAC9B,KAAK,CAAC,IAAI,KAAK,YAAY,EAC3B,CAAC;QACD,MAAM,CAAC,IAAI,CAAC;YACV,IAAI,EAAE,KAAK,CAAC,IAAI;YAChB,GAAG,CAAC,OAAO,KAAK,CAAC,IAAI,KAAK,QAAQ,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,KAAK,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;YAC/D,MAAM;YACN,QAAQ,EAAE,CAAC,QAAQ,IAAI,CAAC,SAAS;SAClC,CAAC,CAAC;IACL,CAAC;AACH,CAAC;AAED,SAAS,YAAY,CAAC,OAA6B;IACjD,MAAM,UAAU,GAA8B,EAAE,CAAC;IACjD,MAAM,QAAQ,GAAa,EAAE,CAAC;IAC9B,KAAK,MAAM,KAAK,IAAI,CAAC,GAAG,OAAO,CAAC,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE,KAAK,EAAE,EAAE,CACpD,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,aAAa,CAAC,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CACpD,EAAE,CAAC;QACF,IAAI,KAAK,CAAC,IAAI,KAAK,SAAS;YAAE,OAAO,KAAK,CAAC,MAAM,CAAC;QAClD,UAAU,CAAC,KAAK,CAAC,IAAI,CAAC,GAAG,KAAK,CAAC,MAAM,CAAC;QACtC,IAAI,KAAK,CAAC,QAAQ;YAAE,QAAQ,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;IAChD,CAAC;IACD,OAAO,EAAE,IAAI,EAAE,QAAQ,EAAE,UAAU,EAAE,GAAG,CAAC,QAAQ,CAAC,MAAM,KAAK,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,QAAQ,EAAE,CAAC,EAAE,CAAC;AACxF,CAAC;AAED,SAAS,WAAW,CAAC,KAAc;IACjC,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC;QAAE,OAAO,SAAS,CAAC;IACvC,OAAO,KAAK,CAAC,OAAO,KAAK,QAAQ,IAAI,QAAQ,CAAC,KAAK,CAAC,UAAU,CAAC;QAC7D,CAAC,CAAE,KAAK,CAAC,UAA4B;QACrC,CAAC,CAAE,KAAuB,CAAC;AAC/B,CAAC;AAED,SAAS,QAAQ,CAAC,IAAe,EAAE,IAAuB;IACxD,IAAI,OAAO,GAAG,WAAW,CAAC,IAAI,CAAC,CAAC;IAChC,KAAK,MAAM,IAAI,IAAI,IAAI,EAAE,CAAC;QACxB,MAAM,UAAU,GAAG,OAAO,EAAE,UAAU,CAAC;QACvC,IAAI,CAAC,QAAQ,CAAC,UAAU,CAAC;YAAE,OAAO,SAAS,CAAC;QAC5C,OAAO,GAAG,WAAW,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC,CAAC;IAC1C,CAAC;IACD,OAAO,OAAO,CAAC;AACjB,CAAC;AAED,SAAS,eAAe,CAAC,IAAY;IACnC,OAAO,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,OAAO,CAAC,CAAC,OAAO,EAAE,KAAK,EAAE,EAAE;QAChD,IAAI,OAAO,CAAC,UAAU,CAAC,GAAG,CAAC;YAAE,OAAO,CAAC,aAAa,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC,CAAC;QAC7E,OAAO,OAAO,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,aAAa,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,UAAU,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;IAC7F,CAAC,CAAC,CAAC;AACL,CAAC;AAED,SAAS,aAAa,CAAC,KAAa,EAAE,KAAa,EAAE,QAAQ,GAAG,OAAO;IACrE,MAAM,MAAM,GAAG,KAAK,CAAC,OAAO,CAAC,kBAAkB,EAAE,GAAG,CAAC,CAAC;IACtD,OAAO,MAAM,IAAI,GAAG,QAAQ,GAAG,KAAK,EAAE,CAAC;AACzC,CAAC;AAED,SAAS,eAAe,CAAC,KAAa;IACpC,OAAO,CAAC,MAAM,EAAE,eAAe,EAAE,OAAO,EAAE,QAAQ,EAAE,QAAQ,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC;AAChF,CAAC;AAED,SAAS,QAAQ,CAAC,KAAc;IAC9B,OAAO,KAAK,KAAK,IAAI,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;AAC9E,CAAC"}
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
import type { JsonValue } from "@relkit/contracts";
|
|
2
|
+
import type { FunctionNode } from "@relkit/graph";
|
|
3
|
+
import type { OpenApiResponse } from "./generate.js";
|
|
4
|
+
export declare function buildResponses(values: JsonValue, target: FunctionNode): Record<string, OpenApiResponse>;
|
|
5
|
+
//# sourceMappingURL=generate-response.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"generate-response.d.ts","sourceRoot":"","sources":["../src/generate-response.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,mBAAmB,CAAC;AACnD,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,eAAe,CAAC;AAClD,OAAO,KAAK,EAAE,eAAe,EAAiB,MAAM,eAAe,CAAC;AA+BpE,wBAAgB,cAAc,CAC5B,MAAM,EAAE,SAAS,EACjB,MAAM,EAAE,YAAY,GACnB,MAAM,CAAC,MAAM,EAAE,eAAe,CAAC,CAgCjC"}
|
|
@@ -0,0 +1,150 @@
|
|
|
1
|
+
const validationSchema = {
|
|
2
|
+
type: "object",
|
|
3
|
+
required: ["error", "issues"],
|
|
4
|
+
properties: {
|
|
5
|
+
error: { const: "validation", type: "string" },
|
|
6
|
+
issues: {
|
|
7
|
+
type: "array",
|
|
8
|
+
items: {
|
|
9
|
+
type: "object",
|
|
10
|
+
required: ["code", "message", "path"],
|
|
11
|
+
properties: {
|
|
12
|
+
code: { type: "string" },
|
|
13
|
+
message: { type: "string" },
|
|
14
|
+
path: { type: "array", items: { anyOf: [{ type: "string" }, { type: "integer" }] } },
|
|
15
|
+
},
|
|
16
|
+
},
|
|
17
|
+
},
|
|
18
|
+
},
|
|
19
|
+
};
|
|
20
|
+
const rateLimitSchema = {
|
|
21
|
+
type: "object",
|
|
22
|
+
required: ["error", "retryAfterMs"],
|
|
23
|
+
properties: {
|
|
24
|
+
error: { const: "rate-limit", type: "string" },
|
|
25
|
+
retryAfterMs: { type: "integer", minimum: 0 },
|
|
26
|
+
},
|
|
27
|
+
};
|
|
28
|
+
export function buildResponses(values, target) {
|
|
29
|
+
const result = {};
|
|
30
|
+
const entries = (Array.isArray(values) ? values : [])
|
|
31
|
+
.filter(isRecord)
|
|
32
|
+
.sort((left, right) => Number(left.status) - Number(right.status) ||
|
|
33
|
+
String(left.id).localeCompare(String(right.id)));
|
|
34
|
+
const hasValidation = entries.some((entry) => entry.kind === "validation-error");
|
|
35
|
+
for (const entry of entries) {
|
|
36
|
+
const status = String(entry.status);
|
|
37
|
+
const schema = entry.kind === "success"
|
|
38
|
+
? (schemaValue(entry.schema) ?? schemaValue(target.output))
|
|
39
|
+
: entry.kind === "validation-error"
|
|
40
|
+
? (schemaValue(entry.schema) ?? validationSchema)
|
|
41
|
+
: entry.kind === "error"
|
|
42
|
+
? errorSchema(entry, target)
|
|
43
|
+
: schemaValue(entry.schema);
|
|
44
|
+
const rateLimited = status === "429" && String(entry.id).startsWith("rate-limit");
|
|
45
|
+
const next = makeResponse(rateLimited ? "Rate limit exceeded" : description(entry), status === "204" || status === "304"
|
|
46
|
+
? undefined
|
|
47
|
+
: (schema ?? (rateLimited ? rateLimitSchema : undefined)), rateLimited);
|
|
48
|
+
result[status] = result[status] === undefined ? next : mergeResponses(result[status], next);
|
|
49
|
+
}
|
|
50
|
+
if (!hasValidation)
|
|
51
|
+
result["422"] = makeResponse("Validation error", validationSchema);
|
|
52
|
+
return result;
|
|
53
|
+
}
|
|
54
|
+
function errorSchema(entry, target) {
|
|
55
|
+
const errorId = typeof entry.errorId === "string" ? entry.errorId : String(entry.id ?? "error");
|
|
56
|
+
const definition = Array.isArray(target.errors)
|
|
57
|
+
? target.errors.filter(isRecord).find((item) => item.id === errorId)
|
|
58
|
+
: undefined;
|
|
59
|
+
const definitionHttp = isRecord(definition?.http) ? definition.http : undefined;
|
|
60
|
+
const status = typeof definitionHttp?.status === "number" ? definitionHttp.status : undefined;
|
|
61
|
+
const retry = definition?.retry === "never" || definition?.retry === "later" ? definition.retry : undefined;
|
|
62
|
+
const data = schemaValue(entry.schema) ??
|
|
63
|
+
(definition === undefined ? undefined : schemaValue(definition.data));
|
|
64
|
+
return {
|
|
65
|
+
type: "object",
|
|
66
|
+
required: [
|
|
67
|
+
"kind",
|
|
68
|
+
"outcome",
|
|
69
|
+
"code",
|
|
70
|
+
"message",
|
|
71
|
+
...(data === undefined ? [] : ["data"]),
|
|
72
|
+
...(status === undefined ? [] : ["status"]),
|
|
73
|
+
"retry",
|
|
74
|
+
],
|
|
75
|
+
properties: {
|
|
76
|
+
kind: { const: "application", type: "string" },
|
|
77
|
+
outcome: { const: "declared-error", type: "string" },
|
|
78
|
+
code: { const: errorId, type: "string" },
|
|
79
|
+
message: { type: "string" },
|
|
80
|
+
...(data === undefined ? {} : { data }),
|
|
81
|
+
...(status === undefined
|
|
82
|
+
? { status: { type: "integer", minimum: 100, maximum: 599 } }
|
|
83
|
+
: { status: { const: status, type: "integer" } }),
|
|
84
|
+
retry: retry === undefined ? { enum: ["never", "later"] } : { const: retry, type: "string" },
|
|
85
|
+
},
|
|
86
|
+
};
|
|
87
|
+
}
|
|
88
|
+
function mergeResponses(left, right) {
|
|
89
|
+
const a = left.content?.["application/json"]?.schema;
|
|
90
|
+
const b = right.content?.["application/json"]?.schema;
|
|
91
|
+
if (!a || !b) {
|
|
92
|
+
return {
|
|
93
|
+
description: `${left.description}; ${right.description}`,
|
|
94
|
+
...(left.content === undefined ? right.content : { content: left.content }),
|
|
95
|
+
};
|
|
96
|
+
}
|
|
97
|
+
return {
|
|
98
|
+
description: `${left.description}; ${right.description}`,
|
|
99
|
+
content: { "application/json": { schema: { oneOf: [a, b] } } },
|
|
100
|
+
};
|
|
101
|
+
}
|
|
102
|
+
function makeResponse(description, schema, rateLimited = false) {
|
|
103
|
+
return {
|
|
104
|
+
description,
|
|
105
|
+
...(schema === undefined ? {} : { content: { "application/json": { schema } } }),
|
|
106
|
+
...(rateLimited ? { headers: rateLimitHeaders } : {}),
|
|
107
|
+
};
|
|
108
|
+
}
|
|
109
|
+
const rateLimitHeaders = {
|
|
110
|
+
"RateLimit-Policy": {
|
|
111
|
+
description: "Limit and window policy applied to the route",
|
|
112
|
+
schema: { type: "string" },
|
|
113
|
+
},
|
|
114
|
+
"RateLimit-Limit": {
|
|
115
|
+
description: "Request limit for the active window",
|
|
116
|
+
schema: { type: "integer" },
|
|
117
|
+
},
|
|
118
|
+
"RateLimit-Remaining": {
|
|
119
|
+
description: "Requests remaining in the active window",
|
|
120
|
+
schema: { type: "integer" },
|
|
121
|
+
},
|
|
122
|
+
"RateLimit-Reset": {
|
|
123
|
+
description: "Seconds until the active window resets",
|
|
124
|
+
schema: { type: "integer" },
|
|
125
|
+
},
|
|
126
|
+
"Retry-After": {
|
|
127
|
+
description: "Seconds before another request should be attempted",
|
|
128
|
+
schema: { type: "integer" },
|
|
129
|
+
},
|
|
130
|
+
};
|
|
131
|
+
function description(entry) {
|
|
132
|
+
if (entry.kind === "success")
|
|
133
|
+
return "Successful response";
|
|
134
|
+
if (entry.kind === "validation-error")
|
|
135
|
+
return "Validation error";
|
|
136
|
+
if (entry.kind === "error")
|
|
137
|
+
return `Declared error ${String(entry.errorId ?? entry.id)}`;
|
|
138
|
+
return `Response ${String(entry.id)}`;
|
|
139
|
+
}
|
|
140
|
+
function schemaValue(value) {
|
|
141
|
+
if (!isRecord(value))
|
|
142
|
+
return undefined;
|
|
143
|
+
return value.$relkit === "schema" && isRecord(value.jsonSchema)
|
|
144
|
+
? value.jsonSchema
|
|
145
|
+
: value;
|
|
146
|
+
}
|
|
147
|
+
function isRecord(value) {
|
|
148
|
+
return value !== null && typeof value === "object" && !Array.isArray(value);
|
|
149
|
+
}
|
|
150
|
+
//# sourceMappingURL=generate-response.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"generate-response.js","sourceRoot":"","sources":["../src/generate-response.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import type { ApplicationGraph, FunctionNode, ServiceNode } from "@relkit/graph";
|
|
2
|
+
import type { HttpGraphTrigger } from "./generate.js";
|
|
3
|
+
export interface OpenApiServiceContext {
|
|
4
|
+
readonly byId: Map<string, ServiceNode>;
|
|
5
|
+
readonly byFunction: Map<string, ServiceNode>;
|
|
6
|
+
readonly sources: ServiceNode[];
|
|
7
|
+
}
|
|
8
|
+
export declare function serviceContext(graph: ApplicationGraph): OpenApiServiceContext;
|
|
9
|
+
export declare function serviceFor(context: OpenApiServiceContext, trigger: HttpGraphTrigger, target: FunctionNode): ServiceNode | undefined;
|
|
10
|
+
//# sourceMappingURL=generate-services.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"generate-services.d.ts","sourceRoot":"","sources":["../src/generate-services.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,gBAAgB,EAAE,YAAY,EAAa,WAAW,EAAE,MAAM,eAAe,CAAC;AAC5F,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,eAAe,CAAC;AAEtD,MAAM,WAAW,qBAAqB;IACpC,QAAQ,CAAC,IAAI,EAAE,GAAG,CAAC,MAAM,EAAE,WAAW,CAAC,CAAC;IACxC,QAAQ,CAAC,UAAU,EAAE,GAAG,CAAC,MAAM,EAAE,WAAW,CAAC,CAAC;IAC9C,QAAQ,CAAC,OAAO,EAAE,WAAW,EAAE,CAAC;CACjC;AAED,wBAAgB,cAAc,CAAC,KAAK,EAAE,gBAAgB,GAAG,qBAAqB,CAS7E;AAED,wBAAgB,UAAU,CACxB,OAAO,EAAE,qBAAqB,EAC9B,OAAO,EAAE,gBAAgB,EACzB,MAAM,EAAE,YAAY,GACnB,WAAW,GAAG,SAAS,CAYzB"}
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
export function serviceContext(graph) {
|
|
2
|
+
const sources = graph.nodes.filter(isServiceNode);
|
|
3
|
+
const byId = new Map(sources.map((service) => [service.id, service]));
|
|
4
|
+
const byFunction = new Map();
|
|
5
|
+
for (const service of sources)
|
|
6
|
+
for (const member of service.members)
|
|
7
|
+
byFunction.set(member.functionId, service);
|
|
8
|
+
for (const node of graph.nodes)
|
|
9
|
+
if (node.kind === "function")
|
|
10
|
+
registerExplicitService(node, byId, byFunction, sources);
|
|
11
|
+
return { byId, byFunction, sources };
|
|
12
|
+
}
|
|
13
|
+
export function serviceFor(context, trigger, target) {
|
|
14
|
+
const memberService = context.byFunction.get(target.id);
|
|
15
|
+
if (memberService !== undefined)
|
|
16
|
+
return memberService;
|
|
17
|
+
const id = serviceId(trigger);
|
|
18
|
+
if (id === undefined)
|
|
19
|
+
return undefined;
|
|
20
|
+
const existing = context.byId.get(id);
|
|
21
|
+
if (existing !== undefined)
|
|
22
|
+
return existing;
|
|
23
|
+
const service = syntheticService(id, trigger.source);
|
|
24
|
+
context.byId.set(id, service);
|
|
25
|
+
context.byFunction.set(target.id, service);
|
|
26
|
+
context.sources.push(service);
|
|
27
|
+
return service;
|
|
28
|
+
}
|
|
29
|
+
function isServiceNode(node) {
|
|
30
|
+
return node.kind === "service";
|
|
31
|
+
}
|
|
32
|
+
function registerExplicitService(node, byId, byFunction, sources) {
|
|
33
|
+
const id = serviceId(node);
|
|
34
|
+
if (id === undefined || byFunction.has(node.id))
|
|
35
|
+
return;
|
|
36
|
+
const service = byId.get(id) ?? syntheticService(id, node.source);
|
|
37
|
+
byId.set(id, service);
|
|
38
|
+
byFunction.set(node.id, service);
|
|
39
|
+
if (!sources.some((entry) => entry.id === id))
|
|
40
|
+
sources.push(service);
|
|
41
|
+
}
|
|
42
|
+
function syntheticService(id, source) {
|
|
43
|
+
return { kind: "service", id, source, members: [], middleware: [] };
|
|
44
|
+
}
|
|
45
|
+
function serviceId(value) {
|
|
46
|
+
const id = value.serviceId;
|
|
47
|
+
return typeof id === "string" && id.length > 0 ? id : undefined;
|
|
48
|
+
}
|
|
49
|
+
//# sourceMappingURL=generate-services.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"generate-services.js","sourceRoot":"","sources":["../src/generate-services.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import type { ServiceNode } from "@relkit/graph";
|
|
2
|
+
export interface OpenApiTag {
|
|
3
|
+
readonly name: string;
|
|
4
|
+
readonly description?: string;
|
|
5
|
+
}
|
|
6
|
+
type ServiceTagSource = Pick<ServiceNode, "id" | "title" | "description" | "tags">;
|
|
7
|
+
export declare function serviceTagNames(service: ServiceTagSource): readonly string[];
|
|
8
|
+
export declare function operationTags(service: ServiceTagSource | undefined, routeTags: readonly string[] | undefined): readonly string[];
|
|
9
|
+
export declare function documentTags(services: readonly ServiceTagSource[], routeTags: readonly string[]): readonly OpenApiTag[];
|
|
10
|
+
export {};
|
|
11
|
+
//# sourceMappingURL=generate-tags.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"generate-tags.d.ts","sourceRoot":"","sources":["../src/generate-tags.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC;AAEjD,MAAM,WAAW,UAAU;IACzB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,WAAW,CAAC,EAAE,MAAM,CAAC;CAC/B;AAED,KAAK,gBAAgB,GAAG,IAAI,CAAC,WAAW,EAAE,IAAI,GAAG,OAAO,GAAG,aAAa,GAAG,MAAM,CAAC,CAAC;AAEnF,wBAAgB,eAAe,CAAC,OAAO,EAAE,gBAAgB,GAAG,SAAS,MAAM,EAAE,CAG5E;AAED,wBAAgB,aAAa,CAC3B,OAAO,EAAE,gBAAgB,GAAG,SAAS,EACrC,SAAS,EAAE,SAAS,MAAM,EAAE,GAAG,SAAS,GACvC,SAAS,MAAM,EAAE,CAMnB;AAED,wBAAgB,YAAY,CAC1B,QAAQ,EAAE,SAAS,gBAAgB,EAAE,EACrC,SAAS,EAAE,SAAS,MAAM,EAAE,GAC3B,SAAS,UAAU,EAAE,CAavB"}
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
export function serviceTagNames(service) {
|
|
2
|
+
const names = [...new Set((service.tags ?? []).filter((tag) => tag.length > 0))].sort();
|
|
3
|
+
return names.length === 0 ? [service.id] : names;
|
|
4
|
+
}
|
|
5
|
+
export function operationTags(service, routeTags) {
|
|
6
|
+
return [
|
|
7
|
+
...new Set([...(service === undefined ? [] : serviceTagNames(service)), ...(routeTags ?? [])]),
|
|
8
|
+
]
|
|
9
|
+
.filter((tag) => tag.length > 0)
|
|
10
|
+
.sort();
|
|
11
|
+
}
|
|
12
|
+
export function documentTags(services, routeTags) {
|
|
13
|
+
const tags = new Map();
|
|
14
|
+
for (const service of [...services].sort((left, right) => left.id.localeCompare(right.id))) {
|
|
15
|
+
for (const name of serviceTagNames(service)) {
|
|
16
|
+
if (!tags.has(name)) {
|
|
17
|
+
const description = service.description ?? service.title;
|
|
18
|
+
tags.set(name, description === undefined ? { name } : { name, description });
|
|
19
|
+
}
|
|
20
|
+
}
|
|
21
|
+
}
|
|
22
|
+
for (const name of [...new Set(routeTags)].filter((tag) => tag.length > 0).sort())
|
|
23
|
+
if (!tags.has(name))
|
|
24
|
+
tags.set(name, { name });
|
|
25
|
+
return [...tags.values()].sort((left, right) => left.name.localeCompare(right.name));
|
|
26
|
+
}
|
|
27
|
+
//# sourceMappingURL=generate-tags.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"generate-tags.js","sourceRoot":"","sources":["../src/generate-tags.ts"],"names":[],"mappings":"AASA,MAAM,UAAU,eAAe,CAAC,OAAyB;IACvD,MAAM,KAAK,GAAG,CAAC,GAAG,IAAI,GAAG,CAAC,CAAC,OAAO,CAAC,IAAI,IAAI,EAAE,CAAC,CAAC,MAAM,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,GAAG,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;IACxF,OAAO,KAAK,CAAC,MAAM,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC;AACnD,CAAC;AAED,MAAM,UAAU,aAAa,CAC3B,OAAqC,EACrC,SAAwC;IAExC,OAAO;QACL,GAAG,IAAI,GAAG,CAAC,CAAC,GAAG,CAAC,OAAO,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,eAAe,CAAC,OAAO,CAAC,CAAC,EAAE,GAAG,CAAC,SAAS,IAAI,EAAE,CAAC,CAAC,CAAC;KAC/F;SACE,MAAM,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,GAAG,CAAC,MAAM,GAAG,CAAC,CAAC;SAC/B,IAAI,EAAE,CAAC;AACZ,CAAC;AAED,MAAM,UAAU,YAAY,CAC1B,QAAqC,EACrC,SAA4B;IAE5B,MAAM,IAAI,GAAG,IAAI,GAAG,EAAsB,CAAC;IAC3C,KAAK,MAAM,OAAO,IAAI,CAAC,GAAG,QAAQ,CAAC,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE,KAAK,EAAE,EAAE,CAAC,IAAI,CAAC,EAAE,CAAC,aAAa,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC;QAC3F,KAAK,MAAM,IAAI,IAAI,eAAe,CAAC,OAAO,CAAC,EAAE,CAAC;YAC5C,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC;gBACpB,MAAM,WAAW,GAAG,OAAO,CAAC,WAAW,IAAI,OAAO,CAAC,KAAK,CAAC;gBACzD,IAAI,CAAC,GAAG,CAAC,IAAI,EAAE,WAAW,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,WAAW,EAAE,CAAC,CAAC;YAC/E,CAAC;QACH,CAAC;IACH,CAAC;IACD,KAAK,MAAM,IAAI,IAAI,CAAC,GAAG,IAAI,GAAG,CAAC,SAAS,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,GAAG,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,IAAI,EAAE;QAC/E,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC;YAAE,IAAI,CAAC,GAAG,CAAC,IAAI,EAAE,EAAE,IAAI,EAAE,CAAC,CAAC;IAChD,OAAO,CAAC,GAAG,IAAI,CAAC,MAAM,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE,KAAK,EAAE,EAAE,CAAC,IAAI,CAAC,IAAI,CAAC,aAAa,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC;AACvF,CAAC"}
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
import type { FunctionNode, ServiceNode } from "@relkit/graph";
|
|
2
|
+
import type { HttpGraphTrigger, OpenApiOperation } from "./generate.js";
|
|
3
|
+
export declare function buildOperation(trigger: HttpGraphTrigger, target: FunctionNode, routePath?: string, operationId?: string, service?: ServiceNode): OpenApiOperation;
|
|
4
|
+
export declare function openApiPath(value: string): string;
|
|
5
|
+
//# sourceMappingURL=generate-utils.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"generate-utils.d.ts","sourceRoot":"","sources":["../src/generate-utils.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC;AAC/D,OAAO,KAAK,EAAE,gBAAgB,EAAE,gBAAgB,EAAE,MAAM,eAAe,CAAC;AAKxE,wBAAgB,cAAc,CAC5B,OAAO,EAAE,gBAAgB,EACzB,MAAM,EAAE,YAAY,EACpB,SAAS,SAAsB,EAC/B,WAAW,SAAa,EACxB,OAAO,CAAC,EAAE,WAAW,GACpB,gBAAgB,CAsBlB;AAED,wBAAgB,WAAW,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAYjD"}
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
import { buildRequest } from "./generate-request.js";
|
|
2
|
+
import { buildResponses } from "./generate-response.js";
|
|
3
|
+
import { operationTags } from "./generate-tags.js";
|
|
4
|
+
export function buildOperation(trigger, target, routePath = trigger.config.path, operationId = trigger.id, service) {
|
|
5
|
+
const request = buildRequest(trigger.config.request, target.input, routePath);
|
|
6
|
+
const tags = operationTags(service, trigger.config.tags);
|
|
7
|
+
return {
|
|
8
|
+
operationId,
|
|
9
|
+
...(trigger.config.title === undefined ? {} : { summary: trigger.config.title }),
|
|
10
|
+
...(trigger.config.description === undefined
|
|
11
|
+
? {}
|
|
12
|
+
: { description: trigger.config.description }),
|
|
13
|
+
...(tags.length === 0 ? {} : { tags }),
|
|
14
|
+
...(request.parameters.length === 0 ? {} : { parameters: request.parameters }),
|
|
15
|
+
...(request.body === undefined ? {} : { requestBody: request.body }),
|
|
16
|
+
responses: buildResponses(trigger.config.responses, target),
|
|
17
|
+
"x-relkit": {
|
|
18
|
+
routeId: trigger.id,
|
|
19
|
+
functionId: target.id,
|
|
20
|
+
...(service === undefined ? {} : { serviceId: service.id }),
|
|
21
|
+
middleware: trigger.config.middleware.map((entry) => ({ ...entry })),
|
|
22
|
+
transforms: trigger.config.transforms.map((entry) => entry.id),
|
|
23
|
+
...(trigger.config.rateLimit === undefined ? {} : { rateLimit: trigger.config.rateLimit }),
|
|
24
|
+
},
|
|
25
|
+
};
|
|
26
|
+
}
|
|
27
|
+
export function openApiPath(value) {
|
|
28
|
+
return (value
|
|
29
|
+
.split("/")
|
|
30
|
+
.map((segment, index) => {
|
|
31
|
+
if (segment.startsWith(":"))
|
|
32
|
+
return `{${parameterName(segment.slice(1), index)}}`;
|
|
33
|
+
if (segment.startsWith("*"))
|
|
34
|
+
return `{${parameterName(segment.slice(1), index, "wildcard")}}`;
|
|
35
|
+
return segment;
|
|
36
|
+
})
|
|
37
|
+
.join("/") || "/");
|
|
38
|
+
}
|
|
39
|
+
function parameterName(value, index, fallback = "param") {
|
|
40
|
+
const result = value.replace(/[^A-Za-z0-9_.-]/g, "_");
|
|
41
|
+
return result || `${fallback}${index}`;
|
|
42
|
+
}
|
|
43
|
+
//# sourceMappingURL=generate-utils.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"generate-utils.js","sourceRoot":"","sources":["../src/generate-utils.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,79 @@
|
|
|
1
|
+
import { type JsonValue } from "@relkit/contracts";
|
|
2
|
+
import type { ApplicationGraph, GraphNode, HttpTriggerConfig } from "@relkit/graph";
|
|
3
|
+
import { type OpenApiTag } from "./generate-tags.js";
|
|
4
|
+
export type OpenApiSchema = {
|
|
5
|
+
readonly [key: string]: JsonValue;
|
|
6
|
+
};
|
|
7
|
+
export interface OpenApiParameter {
|
|
8
|
+
readonly name: string;
|
|
9
|
+
readonly in: "path" | "query" | "header" | "cookie";
|
|
10
|
+
readonly required: boolean;
|
|
11
|
+
readonly schema: OpenApiSchema;
|
|
12
|
+
}
|
|
13
|
+
export interface OpenApiMediaType {
|
|
14
|
+
readonly schema: OpenApiSchema;
|
|
15
|
+
}
|
|
16
|
+
export interface OpenApiResponse {
|
|
17
|
+
readonly description: string;
|
|
18
|
+
readonly content?: Readonly<Record<string, OpenApiMediaType>>;
|
|
19
|
+
readonly headers?: Readonly<Record<string, {
|
|
20
|
+
readonly description: string;
|
|
21
|
+
readonly schema: OpenApiSchema;
|
|
22
|
+
}>>;
|
|
23
|
+
}
|
|
24
|
+
export interface OpenApiOperation {
|
|
25
|
+
readonly operationId: string;
|
|
26
|
+
readonly summary?: string;
|
|
27
|
+
readonly description?: string;
|
|
28
|
+
readonly tags?: readonly string[];
|
|
29
|
+
readonly parameters?: readonly OpenApiParameter[];
|
|
30
|
+
readonly requestBody?: {
|
|
31
|
+
readonly required: boolean;
|
|
32
|
+
readonly content: Readonly<Record<string, OpenApiMediaType>>;
|
|
33
|
+
};
|
|
34
|
+
readonly responses: Readonly<Record<string, OpenApiResponse>>;
|
|
35
|
+
readonly "x-relkit": {
|
|
36
|
+
readonly routeId: string;
|
|
37
|
+
readonly functionId: string;
|
|
38
|
+
readonly serviceId?: string;
|
|
39
|
+
readonly middleware: readonly {
|
|
40
|
+
readonly id: string;
|
|
41
|
+
readonly path: string;
|
|
42
|
+
readonly order: number;
|
|
43
|
+
readonly match: "always" | "conditional";
|
|
44
|
+
}[];
|
|
45
|
+
readonly transforms: readonly string[];
|
|
46
|
+
readonly rateLimit?: JsonValue;
|
|
47
|
+
};
|
|
48
|
+
}
|
|
49
|
+
export interface OpenApiPathItem {
|
|
50
|
+
readonly [method: string]: OpenApiOperation | undefined;
|
|
51
|
+
}
|
|
52
|
+
export interface OpenApiDocument {
|
|
53
|
+
readonly openapi: "3.1.0";
|
|
54
|
+
readonly info: {
|
|
55
|
+
readonly title: string;
|
|
56
|
+
readonly version: string;
|
|
57
|
+
};
|
|
58
|
+
readonly jsonSchemaDialect: string;
|
|
59
|
+
readonly tags?: readonly OpenApiTag[];
|
|
60
|
+
readonly paths: Readonly<Record<string, OpenApiPathItem>>;
|
|
61
|
+
readonly "x-relkit": {
|
|
62
|
+
readonly version: number;
|
|
63
|
+
readonly contractVersion: number;
|
|
64
|
+
readonly graphVersion: number;
|
|
65
|
+
readonly generatorVersion: number;
|
|
66
|
+
};
|
|
67
|
+
}
|
|
68
|
+
export type HttpGraphTrigger = Extract<GraphNode, {
|
|
69
|
+
readonly kind: "trigger";
|
|
70
|
+
}> & {
|
|
71
|
+
readonly triggerType: "http";
|
|
72
|
+
readonly config: HttpTriggerConfig;
|
|
73
|
+
};
|
|
74
|
+
export type { OpenApiTag } from "./generate-tags.js";
|
|
75
|
+
/** Generates a deterministic OpenAPI 3.1 document from the serializable graph contract. */
|
|
76
|
+
export declare function generateOpenApi(graph: ApplicationGraph): OpenApiDocument;
|
|
77
|
+
/** Serializes OpenAPI with the repository's canonical JSON ordering. */
|
|
78
|
+
export declare function generateOpenApiJson(graph: ApplicationGraph): string;
|
|
79
|
+
//# sourceMappingURL=generate.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"generate.d.ts","sourceRoot":"","sources":["../src/generate.ts"],"names":[],"mappings":"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"}
|
package/dist/generate.js
ADDED
|
@@ -0,0 +1,71 @@
|
|
|
1
|
+
import { canonicalJson, CONTRACT_VERSION, GENERATOR_VERSION, GRAPH_VERSION, } from "@relkit/contracts";
|
|
2
|
+
import { buildOperation, openApiPath } from "./generate-utils.js";
|
|
3
|
+
import { documentTags } from "./generate-tags.js";
|
|
4
|
+
import { serviceContext, serviceFor } from "./generate-services.js";
|
|
5
|
+
/** Generates a deterministic OpenAPI 3.1 document from the serializable graph contract. */
|
|
6
|
+
export function generateOpenApi(graph) {
|
|
7
|
+
const functions = new Map(graph.nodes
|
|
8
|
+
.filter((node) => node.kind === "function")
|
|
9
|
+
.map((node) => [node.id, node]));
|
|
10
|
+
const triggers = graph.nodes
|
|
11
|
+
.filter(isHttpTrigger)
|
|
12
|
+
.sort((left, right) => openApiPath(left.config.path).localeCompare(openApiPath(right.config.path)) ||
|
|
13
|
+
left.config.method.localeCompare(right.config.method) ||
|
|
14
|
+
left.id.localeCompare(right.id));
|
|
15
|
+
const services = serviceContext(graph);
|
|
16
|
+
const paths = {};
|
|
17
|
+
for (const trigger of triggers) {
|
|
18
|
+
const target = functions.get(trigger.targetFunctionId);
|
|
19
|
+
if (target === undefined) {
|
|
20
|
+
throw new TypeError(`HTTP trigger "${trigger.id}" targets missing function "${trigger.targetFunctionId}".`);
|
|
21
|
+
}
|
|
22
|
+
const service = serviceFor(services, trigger, target);
|
|
23
|
+
for (const [index, routePath] of openApiPaths(trigger.config.path).entries()) {
|
|
24
|
+
const path = openApiPath(routePath);
|
|
25
|
+
const method = trigger.config.method.toLowerCase();
|
|
26
|
+
const item = paths[path] ?? {};
|
|
27
|
+
if (item[method] !== undefined)
|
|
28
|
+
throw new TypeError(`Duplicate OpenAPI route "${method.toUpperCase()} ${path}".`);
|
|
29
|
+
paths[path] = {
|
|
30
|
+
...item,
|
|
31
|
+
[method]: buildOperation(trigger, target, routePath, index === 0 ? trigger.id : `${trigger.id}.catch-all`, service),
|
|
32
|
+
};
|
|
33
|
+
}
|
|
34
|
+
}
|
|
35
|
+
const tags = documentTags(services.sources, triggers.flatMap((trigger) => trigger.config.tags ?? []));
|
|
36
|
+
return {
|
|
37
|
+
openapi: "3.1.0",
|
|
38
|
+
info: { title: graph.appId ?? "RelKit application", version: String(CONTRACT_VERSION) },
|
|
39
|
+
jsonSchemaDialect: "https://json-schema.org/draft/2020-12/schema",
|
|
40
|
+
...(tags.length === 0 ? {} : { tags }),
|
|
41
|
+
paths,
|
|
42
|
+
"x-relkit": {
|
|
43
|
+
version: CONTRACT_VERSION,
|
|
44
|
+
contractVersion: CONTRACT_VERSION,
|
|
45
|
+
graphVersion: GRAPH_VERSION,
|
|
46
|
+
generatorVersion: GENERATOR_VERSION,
|
|
47
|
+
},
|
|
48
|
+
};
|
|
49
|
+
}
|
|
50
|
+
function openApiPaths(path) {
|
|
51
|
+
const segments = path.split("/");
|
|
52
|
+
const optional = segments.findIndex((segment) => segment.startsWith("*") && segment.endsWith("?"));
|
|
53
|
+
if (optional < 0)
|
|
54
|
+
return [path];
|
|
55
|
+
const base = segments.slice(0, optional).join("/") || "/";
|
|
56
|
+
return [base, path.replace(/\?$/, "")];
|
|
57
|
+
}
|
|
58
|
+
/** Serializes OpenAPI with the repository's canonical JSON ordering. */
|
|
59
|
+
export function generateOpenApiJson(graph) {
|
|
60
|
+
return `${canonicalJson(generateOpenApi(graph))}\n`;
|
|
61
|
+
}
|
|
62
|
+
function isHttpTrigger(node) {
|
|
63
|
+
return (node.kind === "trigger" &&
|
|
64
|
+
node.triggerType === "http" &&
|
|
65
|
+
isRecord(node.config) &&
|
|
66
|
+
node.config.rawHandler !== true);
|
|
67
|
+
}
|
|
68
|
+
function isRecord(value) {
|
|
69
|
+
return value !== null && typeof value === "object" && !Array.isArray(value);
|
|
70
|
+
}
|
|
71
|
+
//# sourceMappingURL=generate.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"generate.js","sourceRoot":"","sources":["../src/generate.ts"],"names":[],"mappings":"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"}
|
package/dist/index.d.ts
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,eAAe,CAAC"}
|
package/dist/index.js
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,eAAe,CAAC"}
|
package/package.json
ADDED
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@relkit/openapi",
|
|
3
|
+
"version": "0.0.0",
|
|
4
|
+
"description": "Unsupported internal OpenAPI generator for RELKIT; use @relkit/cli.",
|
|
5
|
+
"license": "MIT",
|
|
6
|
+
"repository": {
|
|
7
|
+
"type": "git",
|
|
8
|
+
"url": "https://github.com/rel-kit/relkit.git",
|
|
9
|
+
"directory": "packages/openapi"
|
|
10
|
+
},
|
|
11
|
+
"homepage": "https://github.com/rel-kit/relkit#readme",
|
|
12
|
+
"bugs": {
|
|
13
|
+
"url": "https://github.com/rel-kit/relkit/issues"
|
|
14
|
+
},
|
|
15
|
+
"files": [
|
|
16
|
+
"dist"
|
|
17
|
+
],
|
|
18
|
+
"publishConfig": {
|
|
19
|
+
"access": "public"
|
|
20
|
+
},
|
|
21
|
+
"engines": {
|
|
22
|
+
"bun": ">=1.3.10"
|
|
23
|
+
},
|
|
24
|
+
"type": "module",
|
|
25
|
+
"exports": {
|
|
26
|
+
".": {
|
|
27
|
+
"types": "./dist/index.d.ts",
|
|
28
|
+
"import": "./dist/index.js"
|
|
29
|
+
}
|
|
30
|
+
},
|
|
31
|
+
"dependencies": {
|
|
32
|
+
"@relkit/contracts": "0.0.0",
|
|
33
|
+
"@relkit/graph": "0.0.0"
|
|
34
|
+
},
|
|
35
|
+
"scripts": {
|
|
36
|
+
"build": "tsc -b",
|
|
37
|
+
"check": "tsc -b --pretty false",
|
|
38
|
+
"typecheck": "tsc -b --pretty false"
|
|
39
|
+
}
|
|
40
|
+
}
|