@checkdigit/eslint-athena-plugin 1.0.0-PR.2-dcdf
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.txt +21 -0
- package/README.md +17 -0
- package/SECURITY.md +13 -0
- package/dist-mjs/athena/api-locator.mjs +66 -0
- package/dist-mjs/athena/api-matcher.mjs +206 -0
- package/dist-mjs/athena/athena.mjs +165 -0
- package/dist-mjs/athena/column.mjs +1 -0
- package/dist-mjs/athena/context.mjs +21 -0
- package/dist-mjs/athena/index.mjs +1 -0
- package/dist-mjs/athena/service-table.mjs +45 -0
- package/dist-mjs/athena/sql-file.mjs +123 -0
- package/dist-mjs/athena/types.mjs +1 -0
- package/dist-mjs/athena/validate.mjs +619 -0
- package/dist-mjs/athena/visitor.mjs +291 -0
- package/dist-mjs/get-documentation-url.mjs +9 -0
- package/dist-mjs/index.mjs +56 -0
- package/dist-mjs/openapi/deref-schema.mjs +20 -0
- package/dist-mjs/openapi/generate-schema.mjs +375 -0
- package/dist-mjs/openapi/service-schema-generator.mjs +176 -0
- package/dist-mjs/peggy/athena-peggy.mjs +20700 -0
- package/dist-mjs/service.mjs +9 -0
- package/dist-mjs/sql-parser.mjs +28 -0
- package/dist-types/athena/api-locator.d.ts +2 -0
- package/dist-types/athena/api-matcher.d.ts +14 -0
- package/dist-types/athena/athena.d.ts +5 -0
- package/dist-types/athena/column.d.ts +1 -0
- package/dist-types/athena/context.d.ts +21 -0
- package/dist-types/athena/index.d.ts +8 -0
- package/dist-types/athena/service-table.d.ts +8 -0
- package/dist-types/athena/sql-file.d.ts +5 -0
- package/dist-types/athena/types.d.ts +493 -0
- package/dist-types/athena/validate.d.ts +14 -0
- package/dist-types/athena/visitor.d.ts +75 -0
- package/dist-types/get-documentation-url.d.ts +1 -0
- package/dist-types/index.d.ts +5 -0
- package/dist-types/openapi/deref-schema.d.ts +1 -0
- package/dist-types/openapi/generate-schema.d.ts +33 -0
- package/dist-types/openapi/service-schema-generator.d.ts +5 -0
- package/dist-types/peggy/athena-peggy.d.ts +13 -0
- package/dist-types/service.d.ts +2 -0
- package/dist-types/sql-parser.d.ts +25 -0
- package/package.json +1 -0
- package/src/api/v1/swagger.yml +619 -0
- package/src/api/v2/swagger.yml +477 -0
- package/src/athena/api-locator.ts +78 -0
- package/src/athena/api-matcher.ts +323 -0
- package/src/athena/athena.ts +224 -0
- package/src/athena/column.ts +4 -0
- package/src/athena/context.ts +47 -0
- package/src/athena/index.ts +13 -0
- package/src/athena/service-table.ts +78 -0
- package/src/athena/sql-file.ts +161 -0
- package/src/athena/types.ts +568 -0
- package/src/athena/validate.ts +902 -0
- package/src/athena/visitor.ts +406 -0
- package/src/get-documentation-url.ts +7 -0
- package/src/index.ts +67 -0
- package/src/openapi/deref-schema.ts +20 -0
- package/src/openapi/generate-schema.ts +553 -0
- package/src/openapi/service-schema-generator.ts +241 -0
- package/src/peggy/athena-peggy.ts +22149 -0
- package/src/peggy/athena.peggy +2971 -0
- package/src/service.ts +11 -0
- package/src/services/eslintAthenaPlugin/v1/swagger.schema.deref.json +1931 -0
- package/src/services/eslintAthenaPlugin/v2/swagger.schema.deref.json +978 -0
- package/src/sql-parser.ts +53 -0
|
@@ -0,0 +1,375 @@
|
|
|
1
|
+
// src/openapi/generate-schema.ts
|
|
2
|
+
import { strict as assert } from "node:assert";
|
|
3
|
+
import { promises as fs } from "node:fs";
|
|
4
|
+
import debug from "debug";
|
|
5
|
+
import { getReasonPhrase } from "http-status-codes";
|
|
6
|
+
import pointer from "json-pointer";
|
|
7
|
+
import jsYaml from "js-yaml";
|
|
8
|
+
import { generateSchemasForService } from "./service-schema-generator.mjs";
|
|
9
|
+
var commandName = "generate-schema";
|
|
10
|
+
var log = debug("openapi-cli:generate-schema");
|
|
11
|
+
var ALL_OPERATION_METHODS = [
|
|
12
|
+
"get",
|
|
13
|
+
"put",
|
|
14
|
+
"post",
|
|
15
|
+
"head",
|
|
16
|
+
"trace",
|
|
17
|
+
"patch",
|
|
18
|
+
"delete",
|
|
19
|
+
"options"
|
|
20
|
+
];
|
|
21
|
+
var JSON_SCHEMA_META_2020_URL = "https://json-schema.org/draft/2020-12/schema";
|
|
22
|
+
var OPENAPI_SCHEMA_DEFINITIONS_REFERENCE_URI_BASE = "#/components/schemas/";
|
|
23
|
+
var SWAGGER_SCHEMA_FILENAME = "swagger.schema.json";
|
|
24
|
+
function isRequestBodyAllowed(method) {
|
|
25
|
+
return ["post", "put", "patch"].includes(method);
|
|
26
|
+
}
|
|
27
|
+
function isReferenceObject(schema) {
|
|
28
|
+
return Object.hasOwn(schema, "$ref");
|
|
29
|
+
}
|
|
30
|
+
function resolve(document, reference) {
|
|
31
|
+
if (!isReferenceObject(reference)) {
|
|
32
|
+
return reference;
|
|
33
|
+
}
|
|
34
|
+
const referencePointer = reference.$ref.slice(1);
|
|
35
|
+
const resolvedReference = pointer.get(document, referencePointer);
|
|
36
|
+
return resolve(document, resolvedReference);
|
|
37
|
+
}
|
|
38
|
+
function getParameters(parameters, document) {
|
|
39
|
+
return parameters.map((parameter) => resolve(document, parameter));
|
|
40
|
+
}
|
|
41
|
+
function getRequestParametersSchema(operation, parameterType, document) {
|
|
42
|
+
if (operation.parameters === void 0) {
|
|
43
|
+
return;
|
|
44
|
+
}
|
|
45
|
+
const parameters = getParameters(operation.parameters, document).filter(
|
|
46
|
+
(parameter) => parameter.in === parameterType
|
|
47
|
+
);
|
|
48
|
+
if (parameters.length === 0) {
|
|
49
|
+
return;
|
|
50
|
+
}
|
|
51
|
+
const parametersSchema = Object.fromEntries(
|
|
52
|
+
parameters.map((parameter) => [
|
|
53
|
+
parameterType === "header" ? parameter.name.toLowerCase() : parameter.name,
|
|
54
|
+
parameter.schema ?? { type: "string" }
|
|
55
|
+
])
|
|
56
|
+
);
|
|
57
|
+
const requiredParameterNames = parameters.filter((parameter) => parameter.required === true).map(
|
|
58
|
+
(parameter) => parameterType === "header" ? parameter.name.toLowerCase() : parameter.name
|
|
59
|
+
);
|
|
60
|
+
const schema = {
|
|
61
|
+
type: "object",
|
|
62
|
+
// header parameters can have additional properties, we allow them in the runtime validation
|
|
63
|
+
additionalProperties: parameterType === "header",
|
|
64
|
+
properties: parametersSchema,
|
|
65
|
+
...requiredParameterNames.length > 0 ? { required: requiredParameterNames } : {}
|
|
66
|
+
};
|
|
67
|
+
return schema;
|
|
68
|
+
}
|
|
69
|
+
function getBodySchema(contents) {
|
|
70
|
+
const schema = Object.values(contents ?? {})[0]?.schema;
|
|
71
|
+
return schema !== void 0 && Object.keys(schema).length > 0 ? schema : void 0;
|
|
72
|
+
}
|
|
73
|
+
function getRequestBodySchema(operation, document) {
|
|
74
|
+
if (!Object.hasOwn(operation, "requestBody")) {
|
|
75
|
+
return {
|
|
76
|
+
isRequestBodyRequired: false,
|
|
77
|
+
requestBodySchema: void 0
|
|
78
|
+
};
|
|
79
|
+
}
|
|
80
|
+
const requestBody = resolve(document, operation.requestBody);
|
|
81
|
+
return {
|
|
82
|
+
isRequestBodyRequired: requestBody?.required,
|
|
83
|
+
requestBodySchema: getBodySchema(requestBody?.content)
|
|
84
|
+
};
|
|
85
|
+
}
|
|
86
|
+
function getRequestContextSchema(method, operation, operationId, document, apiSchemasBaseUri) {
|
|
87
|
+
const requestPathParametersSchema = getRequestParametersSchema(
|
|
88
|
+
operation,
|
|
89
|
+
"path",
|
|
90
|
+
document
|
|
91
|
+
);
|
|
92
|
+
const requestQueryParametersSchema = getRequestParametersSchema(
|
|
93
|
+
operation,
|
|
94
|
+
"query",
|
|
95
|
+
document
|
|
96
|
+
);
|
|
97
|
+
const requestHeadersSchema = getRequestParametersSchema(
|
|
98
|
+
operation,
|
|
99
|
+
"header",
|
|
100
|
+
document
|
|
101
|
+
);
|
|
102
|
+
const { requestBodySchema, isRequestBodyRequired } = getRequestBodySchema(
|
|
103
|
+
operation,
|
|
104
|
+
document
|
|
105
|
+
);
|
|
106
|
+
if (requestBodySchema !== void 0 && !isRequestBodyAllowed(method)) {
|
|
107
|
+
throw new Error(`Request body is not allowed for ${method} method`);
|
|
108
|
+
}
|
|
109
|
+
const responseContextSchemaName = `${operationId}RequestContext`;
|
|
110
|
+
const requestContextSchema = {
|
|
111
|
+
$schema: JSON_SCHEMA_META_2020_URL,
|
|
112
|
+
$id: `${apiSchemasBaseUri}/${responseContextSchemaName}`,
|
|
113
|
+
type: "object",
|
|
114
|
+
properties: {
|
|
115
|
+
...requestPathParametersSchema ? { params: requestPathParametersSchema } : {},
|
|
116
|
+
...requestQueryParametersSchema ? { query: requestQueryParametersSchema } : {},
|
|
117
|
+
headers: requestHeadersSchema ?? {
|
|
118
|
+
type: "object",
|
|
119
|
+
additionalProperties: true
|
|
120
|
+
},
|
|
121
|
+
...requestBodySchema ? { body: requestBodySchema } : {}
|
|
122
|
+
},
|
|
123
|
+
required: [
|
|
124
|
+
...requestPathParametersSchema?.required ? ["params"] : [],
|
|
125
|
+
...requestQueryParametersSchema?.required ? ["query"] : [],
|
|
126
|
+
...requestHeadersSchema?.required ? ["headers"] : [],
|
|
127
|
+
...isRequestBodyRequired === true ? ["body"] : []
|
|
128
|
+
],
|
|
129
|
+
additionalProperties: false
|
|
130
|
+
};
|
|
131
|
+
return requestContextSchema;
|
|
132
|
+
}
|
|
133
|
+
function getResponseReason(status) {
|
|
134
|
+
return status === "default" ? `Default` : getReasonPhrase(status).replaceAll(/\s/gu, "");
|
|
135
|
+
}
|
|
136
|
+
function getResponseBodySchema(response) {
|
|
137
|
+
return getBodySchema(response.content);
|
|
138
|
+
}
|
|
139
|
+
function getResponseHeadersSchema(headers, document) {
|
|
140
|
+
if (headers === void 0 || Object.keys(headers).length === 0) {
|
|
141
|
+
return void 0;
|
|
142
|
+
}
|
|
143
|
+
const resolvedHeaders = Object.fromEntries(
|
|
144
|
+
Object.entries(headers).map(([name, header]) => [
|
|
145
|
+
name.toLowerCase(),
|
|
146
|
+
resolve(document, header)
|
|
147
|
+
])
|
|
148
|
+
);
|
|
149
|
+
const resolvedHeaderSchemas = Object.fromEntries(
|
|
150
|
+
Object.entries(resolvedHeaders).map(([name, header]) => [
|
|
151
|
+
name,
|
|
152
|
+
header.schema ?? { type: "string" }
|
|
153
|
+
])
|
|
154
|
+
);
|
|
155
|
+
const requiredHeaderNames = Object.entries(resolvedHeaders).filter(([, header]) => header.required === true).map(([name]) => name);
|
|
156
|
+
return {
|
|
157
|
+
type: "object",
|
|
158
|
+
properties: resolvedHeaderSchemas,
|
|
159
|
+
...requiredHeaderNames.length === 0 ? {} : { required: requiredHeaderNames }
|
|
160
|
+
};
|
|
161
|
+
}
|
|
162
|
+
function getResponseSchema(status, response, document, apiSchemasBaseUri, operationId) {
|
|
163
|
+
const resolvedResponse = resolve(document, response);
|
|
164
|
+
const responseBodySchema = getResponseBodySchema(resolvedResponse);
|
|
165
|
+
const responseHeadersSchema = getResponseHeadersSchema(
|
|
166
|
+
resolvedResponse.headers,
|
|
167
|
+
document
|
|
168
|
+
);
|
|
169
|
+
const schemaName = `${operationId}Response${getResponseReason(status)}`;
|
|
170
|
+
return {
|
|
171
|
+
$schema: JSON_SCHEMA_META_2020_URL,
|
|
172
|
+
$id: `${apiSchemasBaseUri}/${schemaName}`,
|
|
173
|
+
type: "object",
|
|
174
|
+
properties: {
|
|
175
|
+
headers: responseHeadersSchema ?? {
|
|
176
|
+
type: "object",
|
|
177
|
+
additionalProperties: true
|
|
178
|
+
},
|
|
179
|
+
...responseBodySchema ? { body: responseBodySchema } : {}
|
|
180
|
+
},
|
|
181
|
+
required: [
|
|
182
|
+
...responseHeadersSchema?.required !== void 0 && responseHeadersSchema.required.length > 0 ? ["headers"] : [],
|
|
183
|
+
...responseBodySchema ? ["body"] : []
|
|
184
|
+
],
|
|
185
|
+
additionalProperties: false
|
|
186
|
+
};
|
|
187
|
+
}
|
|
188
|
+
function getResponseContextSchemas(operation, operationId, document, apiSchemasBaseUri) {
|
|
189
|
+
assert.ok(
|
|
190
|
+
operation.responses !== void 0,
|
|
191
|
+
"Operation responses must be defined"
|
|
192
|
+
);
|
|
193
|
+
return Object.fromEntries(
|
|
194
|
+
Object.entries(operation.responses).map(([status, response]) => [
|
|
195
|
+
status.toLowerCase(),
|
|
196
|
+
getResponseSchema(
|
|
197
|
+
status.toLowerCase(),
|
|
198
|
+
response,
|
|
199
|
+
document,
|
|
200
|
+
apiSchemasBaseUri,
|
|
201
|
+
operationId
|
|
202
|
+
)
|
|
203
|
+
])
|
|
204
|
+
);
|
|
205
|
+
}
|
|
206
|
+
function getOperationId(path, method, operation, operationIds) {
|
|
207
|
+
const operationIdBase = operation.operationId ?? `${path}-${method}`;
|
|
208
|
+
const parts = operationIdBase.split(/[-=/]/u);
|
|
209
|
+
const operationId = parts.filter((part) => part.trim() !== "" && !/\{.*\}/u.test(part)).map((part) => `${part[0]?.toUpperCase() ?? ""}${part.slice(1)}`).join("");
|
|
210
|
+
if (!operationIds.has(operationId)) {
|
|
211
|
+
return operationId;
|
|
212
|
+
}
|
|
213
|
+
let operationIdIndex = 1;
|
|
214
|
+
while (operationIds.has(`${operationId}${operationIdIndex.toString()}`)) {
|
|
215
|
+
operationIdIndex += 1;
|
|
216
|
+
}
|
|
217
|
+
return `${operationId}${operationIdIndex.toString()}`;
|
|
218
|
+
}
|
|
219
|
+
function updateOpenapiSchemaDefinitionsReferences(value, relativeSchemaDefinitionReferenceUri, key) {
|
|
220
|
+
if (typeof value === "string" && key === "$ref" && value.startsWith(OPENAPI_SCHEMA_DEFINITIONS_REFERENCE_URI_BASE)) {
|
|
221
|
+
return value.replace(
|
|
222
|
+
OPENAPI_SCHEMA_DEFINITIONS_REFERENCE_URI_BASE,
|
|
223
|
+
relativeSchemaDefinitionReferenceUri
|
|
224
|
+
);
|
|
225
|
+
}
|
|
226
|
+
if (Array.isArray(value)) {
|
|
227
|
+
return value.map(
|
|
228
|
+
(item) => updateOpenapiSchemaDefinitionsReferences(
|
|
229
|
+
item,
|
|
230
|
+
relativeSchemaDefinitionReferenceUri
|
|
231
|
+
)
|
|
232
|
+
);
|
|
233
|
+
}
|
|
234
|
+
if (typeof value === "object" && value !== null) {
|
|
235
|
+
return Object.fromEntries(
|
|
236
|
+
Object.entries(value).map(([childKey, childValue]) => [
|
|
237
|
+
childKey,
|
|
238
|
+
updateOpenapiSchemaDefinitionsReferences(
|
|
239
|
+
childValue,
|
|
240
|
+
relativeSchemaDefinitionReferenceUri,
|
|
241
|
+
childKey
|
|
242
|
+
)
|
|
243
|
+
])
|
|
244
|
+
);
|
|
245
|
+
}
|
|
246
|
+
return value;
|
|
247
|
+
}
|
|
248
|
+
function getFirehoseLoggedExtension(obj) {
|
|
249
|
+
const record = obj;
|
|
250
|
+
return record["x-firehose-logged"] ?? record["x-firehoseLogged"];
|
|
251
|
+
}
|
|
252
|
+
function buildApiSchemaFromDocument(document, organization, serviceName) {
|
|
253
|
+
if (document.paths === void 0) {
|
|
254
|
+
return void 0;
|
|
255
|
+
}
|
|
256
|
+
const serverUri = document.servers?.[0]?.url;
|
|
257
|
+
if (serverUri === void 0) {
|
|
258
|
+
return void 0;
|
|
259
|
+
}
|
|
260
|
+
const serverPathname = serverUri.startsWith("http") ? new URL(serverUri).pathname : serverUri;
|
|
261
|
+
const endpointSchemasBaseUri = `https://${serviceName}.${organization}${serverPathname}/schemas`;
|
|
262
|
+
const apiSchemasBaseUri = `${endpointSchemasBaseUri}/api`;
|
|
263
|
+
const apiSchemas = {};
|
|
264
|
+
const allSchemas = { apis: apiSchemas };
|
|
265
|
+
const operationIds = /* @__PURE__ */ new Set();
|
|
266
|
+
const documentFirehoseLogged = getFirehoseLoggedExtension(document);
|
|
267
|
+
log("document firehose logged value", documentFirehoseLogged);
|
|
268
|
+
for (const [path, pathItems] of Object.entries(document.paths)) {
|
|
269
|
+
const koaPath = path.replaceAll(/\{(?<param>[^}]+)\}/gu, ":$<param>");
|
|
270
|
+
const pathSchemas = {};
|
|
271
|
+
apiSchemas[`${serverPathname}${koaPath}`] = pathSchemas;
|
|
272
|
+
for (const method of ALL_OPERATION_METHODS) {
|
|
273
|
+
const operation = pathItems?.[method];
|
|
274
|
+
if (operation !== void 0) {
|
|
275
|
+
const operationFirehoseLogged = getFirehoseLoggedExtension(operation);
|
|
276
|
+
log("operation firehose logged value", operationFirehoseLogged);
|
|
277
|
+
const effectiveFirehoseLogged = operationFirehoseLogged ?? documentFirehoseLogged;
|
|
278
|
+
if (effectiveFirehoseLogged !== true) {
|
|
279
|
+
continue;
|
|
280
|
+
}
|
|
281
|
+
const operationId = getOperationId(
|
|
282
|
+
path,
|
|
283
|
+
method,
|
|
284
|
+
operation,
|
|
285
|
+
operationIds
|
|
286
|
+
);
|
|
287
|
+
operationIds.add(operationId);
|
|
288
|
+
pathSchemas[method] = {
|
|
289
|
+
request: getRequestContextSchema(
|
|
290
|
+
method,
|
|
291
|
+
operation,
|
|
292
|
+
operationId,
|
|
293
|
+
document,
|
|
294
|
+
apiSchemasBaseUri
|
|
295
|
+
),
|
|
296
|
+
responses: getResponseContextSchemas(
|
|
297
|
+
operation,
|
|
298
|
+
operationId,
|
|
299
|
+
document,
|
|
300
|
+
apiSchemasBaseUri
|
|
301
|
+
)
|
|
302
|
+
};
|
|
303
|
+
}
|
|
304
|
+
}
|
|
305
|
+
}
|
|
306
|
+
if (document.components?.schemas !== void 0) {
|
|
307
|
+
allSchemas.definitions = Object.fromEntries(
|
|
308
|
+
Object.entries(document.components.schemas).map(([name, schema]) => [
|
|
309
|
+
name,
|
|
310
|
+
{
|
|
311
|
+
$schema: JSON_SCHEMA_META_2020_URL,
|
|
312
|
+
$id: `${endpointSchemasBaseUri}/definitions/${name}`,
|
|
313
|
+
...schema
|
|
314
|
+
}
|
|
315
|
+
])
|
|
316
|
+
);
|
|
317
|
+
}
|
|
318
|
+
const relativeSchemaDefinitionReferenceUri = `${serverPathname}/schemas/definitions/`;
|
|
319
|
+
return updateOpenapiSchemaDefinitionsReferences(
|
|
320
|
+
structuredClone(allSchemas),
|
|
321
|
+
relativeSchemaDefinitionReferenceUri
|
|
322
|
+
);
|
|
323
|
+
}
|
|
324
|
+
function buildApiSchemaFromYaml(yamlContent, organization, serviceName) {
|
|
325
|
+
const document = jsYaml.load(yamlContent);
|
|
326
|
+
return buildApiSchemaFromDocument(document, organization, serviceName);
|
|
327
|
+
}
|
|
328
|
+
async function generateEndpointSchemas(organization, serviceName, root, endpoint) {
|
|
329
|
+
const documentContents = await fs.readFile(
|
|
330
|
+
`${root}/${endpoint}/swagger.yml`,
|
|
331
|
+
"utf8"
|
|
332
|
+
);
|
|
333
|
+
const document = await jsYaml.load(documentContents);
|
|
334
|
+
const normalizedApiSchemas = buildApiSchemaFromDocument(
|
|
335
|
+
document,
|
|
336
|
+
organization,
|
|
337
|
+
serviceName
|
|
338
|
+
);
|
|
339
|
+
if (normalizedApiSchemas === void 0) {
|
|
340
|
+
return;
|
|
341
|
+
}
|
|
342
|
+
const swaggerSchemaFilename = `${root}/${endpoint}/${SWAGGER_SCHEMA_FILENAME}`;
|
|
343
|
+
await fs.writeFile(
|
|
344
|
+
swaggerSchemaFilename,
|
|
345
|
+
JSON.stringify(normalizedApiSchemas, void 0, 2)
|
|
346
|
+
);
|
|
347
|
+
log(`Generated schema ${swaggerSchemaFilename}`);
|
|
348
|
+
}
|
|
349
|
+
async function generateSchemas() {
|
|
350
|
+
const serviceJsonPackageFile = await fs.readFile(`./package.json`, "utf8");
|
|
351
|
+
const packageJson = JSON.parse(serviceJsonPackageFile);
|
|
352
|
+
const [organization, serviceName] = packageJson.name.slice(1).split("/");
|
|
353
|
+
assert.ok(
|
|
354
|
+
organization !== void 0 && serviceName !== void 0,
|
|
355
|
+
"Invalid package name"
|
|
356
|
+
);
|
|
357
|
+
await Promise.all(
|
|
358
|
+
packageJson.service.api.endpoints.map(
|
|
359
|
+
(endpoint) => generateEndpointSchemas(
|
|
360
|
+
organization,
|
|
361
|
+
serviceName,
|
|
362
|
+
packageJson.service.api.root,
|
|
363
|
+
endpoint
|
|
364
|
+
)
|
|
365
|
+
)
|
|
366
|
+
);
|
|
367
|
+
}
|
|
368
|
+
export {
|
|
369
|
+
SWAGGER_SCHEMA_FILENAME,
|
|
370
|
+
buildApiSchemaFromYaml,
|
|
371
|
+
commandName,
|
|
372
|
+
generateSchemas,
|
|
373
|
+
generateSchemasForService
|
|
374
|
+
};
|
|
375
|
+
//# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vc3JjL29wZW5hcGkvZ2VuZXJhdGUtc2NoZW1hLnRzIl0sCiAgIm1hcHBpbmdzIjogIjtBQUVBLFNBQVMsVUFBVSxjQUFjO0FBQ2pDLFNBQVMsWUFBWSxVQUFVO0FBRS9CLE9BQU8sV0FBVztBQUNsQixTQUFTLHVCQUF1QjtBQUNoQyxPQUFPLGFBQWE7QUFDcEIsT0FBTyxZQUFZO0FBS25CLFNBQVMsaUNBQWlDO0FBRG5DLElBQU0sY0FBYztBQUczQixJQUFNLE1BQU0sTUFBTSw2QkFBNkI7QUFFL0MsSUFBTSx3QkFBd0I7QUFBQSxFQUM1QjtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFDRjtBQUNBLElBQU0sNEJBQ0o7QUFDRixJQUFNLGdEQUFnRDtBQUMvQyxJQUFNLDBCQUEwQjtBQWtDdkMsU0FBUyxxQkFBcUIsUUFBeUI7QUFDckQsU0FBTyxDQUFDLFFBQVEsT0FBTyxPQUFPLEVBQUUsU0FBUyxNQUFNO0FBQ2pEO0FBRUEsU0FBUyxrQkFBa0IsUUFBZ0Q7QUFDekUsU0FBTyxPQUFPLE9BQU8sUUFBK0IsTUFBTTtBQUM1RDtBQUVBLFNBQVMsUUFDUCxVQUNBLFdBQ0c7QUFDSCxNQUFJLENBQUMsa0JBQWtCLFNBQVMsR0FBRztBQUNqQyxXQUFPO0FBQUEsRUFDVDtBQUVBLFFBQU0sbUJBQW1CLFVBQVUsS0FBSyxNQUFNLENBQUM7QUFDL0MsUUFBTSxvQkFBb0IsUUFBUSxJQUFJLFVBQVUsZ0JBQWdCO0FBR2hFLFNBQU8sUUFBUSxVQUFVLGlCQUFpQjtBQUM1QztBQUVBLFNBQVMsY0FDUCxZQUNBLFVBQ3VCO0FBQ3ZCLFNBQU8sV0FBVyxJQUFJLENBQUMsY0FBYyxRQUFRLFVBQVUsU0FBUyxDQUFDO0FBQ25FO0FBRUEsU0FBUywyQkFDUCxXQUNBLGVBQ0EsVUFDOEI7QUFDOUIsTUFBSSxVQUFVLGVBQWUsUUFBVztBQUN0QztBQUFBLEVBQ0Y7QUFF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
|
|
@@ -0,0 +1,176 @@
|
|
|
1
|
+
// src/openapi/service-schema-generator.ts
|
|
2
|
+
import { existsSync, mkdirSync, readFileSync, writeFileSync } from "node:fs";
|
|
3
|
+
import debug from "debug";
|
|
4
|
+
import { buildApiSchemaFromYaml } from "./generate-schema.mjs";
|
|
5
|
+
var log = debug("eslint-athena-plugin:athena:service-schema-generator");
|
|
6
|
+
var ORGANIZATIONS = ["checkdigit"];
|
|
7
|
+
var SWAGGER_SCHEMA_DEREF_FILENAME = "swagger.schema.deref.json";
|
|
8
|
+
function errorMessageFromError(error) {
|
|
9
|
+
return error instanceof Error ? error.message : String(error);
|
|
10
|
+
}
|
|
11
|
+
function derefApiSchemas(schemas) {
|
|
12
|
+
const definitions = schemas.definitions ?? {};
|
|
13
|
+
function derefValue(value, resolving = /* @__PURE__ */ new Set()) {
|
|
14
|
+
if (value === null || typeof value !== "object") {
|
|
15
|
+
return value;
|
|
16
|
+
}
|
|
17
|
+
if (Array.isArray(value)) {
|
|
18
|
+
return value.map((item) => derefValue(item, resolving));
|
|
19
|
+
}
|
|
20
|
+
const obj = value;
|
|
21
|
+
if (typeof obj["$ref"] === "string") {
|
|
22
|
+
const refName = /\/definitions\/(?<name>[^/]+)$/u.exec(obj["$ref"])?.groups?.["name"];
|
|
23
|
+
if (refName !== void 0 && !resolving.has(refName)) {
|
|
24
|
+
return derefValue(
|
|
25
|
+
definitions[refName],
|
|
26
|
+
/* @__PURE__ */ new Set([...resolving, refName])
|
|
27
|
+
);
|
|
28
|
+
}
|
|
29
|
+
}
|
|
30
|
+
return Object.fromEntries(
|
|
31
|
+
Object.entries(obj).map(([key, val]) => [
|
|
32
|
+
key,
|
|
33
|
+
derefValue(val, resolving)
|
|
34
|
+
])
|
|
35
|
+
);
|
|
36
|
+
}
|
|
37
|
+
const resolvedApis = derefValue(schemas.apis);
|
|
38
|
+
if (schemas.definitions !== void 0) {
|
|
39
|
+
return {
|
|
40
|
+
apis: resolvedApis,
|
|
41
|
+
definitions: derefValue(schemas.definitions)
|
|
42
|
+
};
|
|
43
|
+
}
|
|
44
|
+
return { apis: resolvedApis };
|
|
45
|
+
}
|
|
46
|
+
function readServiceConfig(packageJsonContent, org, serviceName) {
|
|
47
|
+
const packageJson = JSON.parse(packageJsonContent);
|
|
48
|
+
const apiRoot = packageJson.service?.api?.root;
|
|
49
|
+
const apiEndpoints = packageJson.service?.api?.endpoints;
|
|
50
|
+
if (apiRoot === void 0 || apiEndpoints === void 0 || apiEndpoints.length === 0) {
|
|
51
|
+
return void 0;
|
|
52
|
+
}
|
|
53
|
+
const [pkgOrg = org, pkgServiceName = serviceName] = packageJson.name?.slice(1).split("/") ?? [];
|
|
54
|
+
return {
|
|
55
|
+
organization: pkgOrg,
|
|
56
|
+
serviceName: pkgServiceName,
|
|
57
|
+
apiRoot,
|
|
58
|
+
endpoints: apiEndpoints
|
|
59
|
+
};
|
|
60
|
+
}
|
|
61
|
+
function findServiceLocally(serviceFolder, org, serviceName) {
|
|
62
|
+
const config = readServiceConfig(
|
|
63
|
+
readFileSync(`${serviceFolder}/package.json`, "utf-8"),
|
|
64
|
+
org,
|
|
65
|
+
serviceName
|
|
66
|
+
);
|
|
67
|
+
if (config === void 0) {
|
|
68
|
+
return void 0;
|
|
69
|
+
}
|
|
70
|
+
const endpoints = [];
|
|
71
|
+
for (const endpoint of config.endpoints) {
|
|
72
|
+
const swaggerPath = `${serviceFolder}/${config.apiRoot}/${endpoint}/swagger.yml`;
|
|
73
|
+
if (existsSync(swaggerPath)) {
|
|
74
|
+
endpoints.push({
|
|
75
|
+
path: endpoint,
|
|
76
|
+
yamlContent: readFileSync(swaggerPath, "utf-8")
|
|
77
|
+
});
|
|
78
|
+
}
|
|
79
|
+
}
|
|
80
|
+
if (endpoints.length > 0) {
|
|
81
|
+
return {
|
|
82
|
+
organization: config.organization,
|
|
83
|
+
serviceName: config.serviceName,
|
|
84
|
+
endpoints
|
|
85
|
+
};
|
|
86
|
+
}
|
|
87
|
+
return void 0;
|
|
88
|
+
}
|
|
89
|
+
function findServiceInProject(serviceName) {
|
|
90
|
+
const packageJson = JSON.parse(readFileSync("./package.json", "utf-8"));
|
|
91
|
+
const [org, projectName] = (packageJson.name ?? "").slice(1).split("/");
|
|
92
|
+
if (org === void 0 || projectName !== serviceName) {
|
|
93
|
+
return void 0;
|
|
94
|
+
}
|
|
95
|
+
log(
|
|
96
|
+
`[schema-generator] '${serviceName}' is the current project, reading local swagger files`
|
|
97
|
+
);
|
|
98
|
+
return findServiceLocally(".", org, serviceName);
|
|
99
|
+
}
|
|
100
|
+
function findServiceInNodeModules(serviceName) {
|
|
101
|
+
for (const org of ORGANIZATIONS) {
|
|
102
|
+
const serviceFolder = `node_modules/@${org}/${serviceName}`;
|
|
103
|
+
if (!existsSync(serviceFolder)) {
|
|
104
|
+
log(
|
|
105
|
+
`[schema-generator] not found in node_modules: @${org}/${serviceName}`
|
|
106
|
+
);
|
|
107
|
+
continue;
|
|
108
|
+
}
|
|
109
|
+
try {
|
|
110
|
+
log(
|
|
111
|
+
`[schema-generator] found in node_modules: @${org}/${serviceName}, reading swagger files`
|
|
112
|
+
);
|
|
113
|
+
const source = findServiceLocally(serviceFolder, org, serviceName);
|
|
114
|
+
if (source !== void 0) {
|
|
115
|
+
return source;
|
|
116
|
+
}
|
|
117
|
+
log(
|
|
118
|
+
`[schema-generator] no swagger schema inside node_modules/@${org}/${serviceName}`
|
|
119
|
+
);
|
|
120
|
+
} catch (error) {
|
|
121
|
+
log(
|
|
122
|
+
`[schema-generator] error reading node_modules/@${org}/${serviceName}: ${errorMessageFromError(error)}`
|
|
123
|
+
);
|
|
124
|
+
}
|
|
125
|
+
}
|
|
126
|
+
return void 0;
|
|
127
|
+
}
|
|
128
|
+
function generateSchemasForService(serviceName, outputDir) {
|
|
129
|
+
log(`[schema-generator] locating service '${serviceName}'`);
|
|
130
|
+
const source = findServiceInProject(serviceName) ?? findServiceInNodeModules(serviceName);
|
|
131
|
+
if (source === void 0) {
|
|
132
|
+
log(
|
|
133
|
+
`[schema-generator] '${serviceName}' not found \u2014 ensure it is listed as a devDependency or the repo is accessible via git`
|
|
134
|
+
);
|
|
135
|
+
return [];
|
|
136
|
+
}
|
|
137
|
+
log(
|
|
138
|
+
`[schema-generator] found '${serviceName}' (${source.endpoints.length.toString()} endpoint(s))`
|
|
139
|
+
);
|
|
140
|
+
const results = [];
|
|
141
|
+
for (const { path: endpoint, yamlContent } of source.endpoints) {
|
|
142
|
+
try {
|
|
143
|
+
const rawSchema = buildApiSchemaFromYaml(
|
|
144
|
+
yamlContent,
|
|
145
|
+
source.organization,
|
|
146
|
+
source.serviceName
|
|
147
|
+
);
|
|
148
|
+
if (rawSchema === void 0) {
|
|
149
|
+
continue;
|
|
150
|
+
}
|
|
151
|
+
const schema = derefApiSchemas(rawSchema);
|
|
152
|
+
results.push({ schema, endpoint });
|
|
153
|
+
if (outputDir !== void 0) {
|
|
154
|
+
const versionFolder = endpoint.split("/").at(-1) ?? endpoint;
|
|
155
|
+
const dir = `${outputDir}/${versionFolder}`;
|
|
156
|
+
mkdirSync(dir, { recursive: true });
|
|
157
|
+
writeFileSync(
|
|
158
|
+
`${dir}/${SWAGGER_SCHEMA_DEREF_FILENAME}`,
|
|
159
|
+
JSON.stringify(schema, void 0, 2)
|
|
160
|
+
);
|
|
161
|
+
log(
|
|
162
|
+
`[schema-generator] cached schema to ${dir}/${SWAGGER_SCHEMA_DEREF_FILENAME}`
|
|
163
|
+
);
|
|
164
|
+
}
|
|
165
|
+
} catch (error) {
|
|
166
|
+
log(
|
|
167
|
+
`[schema-generator] error processing endpoint ${endpoint}: ${errorMessageFromError(error)}`
|
|
168
|
+
);
|
|
169
|
+
}
|
|
170
|
+
}
|
|
171
|
+
return results;
|
|
172
|
+
}
|
|
173
|
+
export {
|
|
174
|
+
generateSchemasForService
|
|
175
|
+
};
|
|
176
|
+
//# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vc3JjL29wZW5hcGkvc2VydmljZS1zY2hlbWEtZ2VuZXJhdG9yLnRzIl0sCiAgIm1hcHBpbmdzIjogIjtBQUVBLFNBQVMsWUFBWSxXQUFXLGNBQWMscUJBQXFCO0FBRW5FLE9BQU8sV0FBVztBQUVsQixTQUEwQiw4QkFBOEI7QUFFeEQsSUFBTSxNQUFNLE1BQU0sc0RBQXNEO0FBRXhFLElBQU0sZ0JBQWdCLENBQUMsWUFBWTtBQUNuQyxJQUFNLGdDQUFnQztBQUV0QyxTQUFTLHNCQUFzQixPQUF3QjtBQUNyRCxTQUFPLGlCQUFpQixRQUFRLE1BQU0sVUFBVSxPQUFPLEtBQUs7QUFDOUQ7QUFhQSxTQUFTLGdCQUFnQixTQUFpQztBQUN4RCxRQUFNLGNBQWMsUUFBUSxlQUFlLENBQUM7QUFFNUMsV0FBUyxXQUNQLE9BQ0EsWUFBeUIsb0JBQUksSUFBWSxHQUNoQztBQUNULFFBQUksVUFBVSxRQUFRLE9BQU8sVUFBVSxVQUFVO0FBQy9DLGFBQU87QUFBQSxJQUNUO0FBQ0EsUUFBSSxNQUFNLFFBQVEsS0FBSyxHQUFHO0FBQ3hCLGFBQU8sTUFBTSxJQUFJLENBQUMsU0FBUyxXQUFXLE1BQU0sU0FBUyxDQUFDO0FBQUEsSUFDeEQ7QUFDQSxVQUFNLE1BQU07QUFDWixRQUFJLE9BQU8sSUFBSSxNQUFNLE1BQU0sVUFBVTtBQUNuQyxZQUFNLFVBQVUsa0NBQWtDLEtBQUssSUFBSSxNQUFNLENBQUMsR0FDOUQsU0FBUyxNQUFNO0FBQ25CLFVBQUksWUFBWSxVQUFhLENBQUMsVUFBVSxJQUFJLE9BQU8sR0FBRztBQUNwRCxlQUFPO0FBQUEsVUFDTCxZQUFZLE9BQU87QUFBQSxVQUNuQixvQkFBSSxJQUFZLENBQUMsR0FBRyxXQUFXLE9BQU8sQ0FBQztBQUFBLFFBQ3pDO0FBQUEsTUFDRjtBQUFBLElBQ0Y7QUFDQSxXQUFPLE9BQU87QUFBQSxNQUNaLE9BQU8sUUFBUSxHQUFHLEVBQUUsSUFBSSxDQUFDLENBQUMsS0FBSyxHQUFHLE1BQU07QUFB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
|