@map-colonies/openapi-helpers 3.0.0 → 3.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -0,0 +1,102 @@
|
|
|
1
|
+
import fs from 'node:fs/promises';
|
|
2
|
+
import { parseArgs } from 'node:util';
|
|
3
|
+
import path from 'node:path';
|
|
4
|
+
import { dereference } from '@apidevtools/json-schema-ref-parser';
|
|
5
|
+
import { format, resolveConfig } from 'prettier';
|
|
6
|
+
import * as changeCase from 'change-case';
|
|
7
|
+
const ARGS_SLICE = 2;
|
|
8
|
+
const { values: { format: shouldFormat }, positionals, } = parseArgs({
|
|
9
|
+
args: process.argv.slice(ARGS_SLICE),
|
|
10
|
+
options: {
|
|
11
|
+
format: { type: 'boolean', alias: 'f' },
|
|
12
|
+
},
|
|
13
|
+
allowPositionals: true,
|
|
14
|
+
});
|
|
15
|
+
const [openapiPath, destinationPath] = positionals;
|
|
16
|
+
if (openapiPath === undefined || destinationPath === undefined) {
|
|
17
|
+
console.error('Usage: generateErrors <openapiPath> <destinationPath>');
|
|
18
|
+
process.exit(1);
|
|
19
|
+
}
|
|
20
|
+
const openapi = await dereference(openapiPath);
|
|
21
|
+
if (openapi.paths === undefined) {
|
|
22
|
+
console.error('No paths found in the OpenAPI document.');
|
|
23
|
+
process.exit(1);
|
|
24
|
+
}
|
|
25
|
+
const errorCodes = new Set();
|
|
26
|
+
function extractCodeFromSchema(schema) {
|
|
27
|
+
// Handle direct code property
|
|
28
|
+
if (schema.type === 'object' && schema.properties?.code) {
|
|
29
|
+
const codeProperty = schema.properties.code;
|
|
30
|
+
// Handle enum values
|
|
31
|
+
if (codeProperty.enum) {
|
|
32
|
+
codeProperty.enum.map(String).forEach((code) => {
|
|
33
|
+
errorCodes.add(code);
|
|
34
|
+
});
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
// Handle allOf combinations
|
|
38
|
+
if (schema.allOf) {
|
|
39
|
+
for (const subSchema of schema.allOf) {
|
|
40
|
+
extractCodeFromSchema(subSchema);
|
|
41
|
+
}
|
|
42
|
+
}
|
|
43
|
+
// Handle oneOf combinations
|
|
44
|
+
if (schema.oneOf) {
|
|
45
|
+
for (const subSchema of schema.oneOf) {
|
|
46
|
+
extractCodeFromSchema(subSchema);
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
// Handle anyOf combinations
|
|
50
|
+
if (schema.anyOf) {
|
|
51
|
+
for (const subSchema of schema.anyOf) {
|
|
52
|
+
extractCodeFromSchema(subSchema);
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
}
|
|
56
|
+
function createError(code) {
|
|
57
|
+
let className = changeCase.pascalCase(code);
|
|
58
|
+
if (!className.endsWith('Error')) {
|
|
59
|
+
className += 'Error';
|
|
60
|
+
}
|
|
61
|
+
return `export class ${className} extends Error {
|
|
62
|
+
public readonly code = '${code}';
|
|
63
|
+
/**
|
|
64
|
+
* Creates an instance of ${className}.
|
|
65
|
+
* @param message - The error message.
|
|
66
|
+
* @param cause - Optional original error or server response data.
|
|
67
|
+
*/
|
|
68
|
+
public constructor(message: string, cause?: unknown) {
|
|
69
|
+
super(message, { cause });
|
|
70
|
+
Object.setPrototypeOf(this, new.target.prototype);
|
|
71
|
+
}
|
|
72
|
+
};\n`;
|
|
73
|
+
}
|
|
74
|
+
for (const [, methods] of Object.entries(openapi.paths)) {
|
|
75
|
+
for (const [key, operation] of Object.entries(methods)) {
|
|
76
|
+
if (['servers', 'parameters'].includes(key)) {
|
|
77
|
+
continue;
|
|
78
|
+
}
|
|
79
|
+
for (const [statusCode, response] of Object.entries(operation.responses ?? {})) {
|
|
80
|
+
if (statusCode.startsWith('2') || statusCode.startsWith('3')) {
|
|
81
|
+
continue; // Skip successful and redirection responses
|
|
82
|
+
}
|
|
83
|
+
const schema = response.content?.['application/json']?.schema;
|
|
84
|
+
if (schema) {
|
|
85
|
+
extractCodeFromSchema(schema);
|
|
86
|
+
}
|
|
87
|
+
}
|
|
88
|
+
}
|
|
89
|
+
}
|
|
90
|
+
if (errorCodes.size === 0) {
|
|
91
|
+
console.warn('No error codes found in the OpenAPI document.');
|
|
92
|
+
process.exit(0);
|
|
93
|
+
}
|
|
94
|
+
let errorFile = errorCodes.values().map(createError).toArray().join('\n');
|
|
95
|
+
if (shouldFormat === true) {
|
|
96
|
+
const prettierOptions = await resolveConfig('./src/index.ts');
|
|
97
|
+
errorFile = await format(errorFile, { ...prettierOptions, parser: 'typescript' });
|
|
98
|
+
}
|
|
99
|
+
const directory = path.dirname(destinationPath);
|
|
100
|
+
await fs.mkdir(directory, { recursive: true });
|
|
101
|
+
await fs.writeFile(destinationPath, errorFile);
|
|
102
|
+
//# sourceMappingURL=generateErrors.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"generateErrors.mjs","sourceRoot":"","sources":["../../src/generator/generateErrors.mts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@map-colonies/openapi-helpers",
|
|
3
|
-
"version": "3.
|
|
3
|
+
"version": "3.1.0",
|
|
4
4
|
"description": "A package that provides utilities for working with openapi files",
|
|
5
5
|
"exports": {
|
|
6
6
|
"./requestSender": {
|
|
@@ -49,6 +49,8 @@
|
|
|
49
49
|
},
|
|
50
50
|
"homepage": "https://github.com/MapColonies/openapi-helpers#readme",
|
|
51
51
|
"dependencies": {
|
|
52
|
+
"@apidevtools/json-schema-ref-parser": "^14.1.1",
|
|
53
|
+
"change-case": "^5.4.4",
|
|
52
54
|
"oas-normalize": "^14.1.2",
|
|
53
55
|
"ts-essentials": "^10.1.1",
|
|
54
56
|
"yaml": "^2.8.0"
|