@openapi-qraft/plugin 1.11.0-beta.0 → 1.11.0-beta.2
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/CHANGELOG.md +8 -0
- package/dist/lib/QraftCommand.d.ts.map +1 -1
- package/dist/lib/QraftCommand.js +15 -17
- package/dist/lib/QraftCommand.js.map +1 -1
- package/dist/lib/createServicePathMatch.d.ts +15 -0
- package/dist/lib/createServicePathMatch.d.ts.map +1 -0
- package/dist/lib/createServicePathMatch.js +37 -0
- package/dist/lib/createServicePathMatch.js.map +1 -0
- package/dist/lib/filterDocumentPaths.d.ts +2 -7
- package/dist/lib/filterDocumentPaths.d.ts.map +1 -1
- package/dist/lib/filterDocumentPaths.js +1 -21
- package/dist/lib/filterDocumentPaths.js.map +1 -1
- package/dist/lib/open-api/OpenAPISchemaType.d.ts +1 -1
- package/dist/lib/open-api/OpenAPISchemaType.d.ts.map +1 -1
- package/dist/lib/open-api/getServices.d.ts +1 -1
- package/dist/lib/open-api/readSchema.d.ts +1 -2
- package/dist/lib/open-api/readSchema.d.ts.map +1 -1
- package/dist/lib/open-api/readSchema.js.map +1 -1
- package/dist/lib/predefineSchemaParameters.d.ts +28 -0
- package/dist/lib/predefineSchemaParameters.d.ts.map +1 -0
- package/dist/lib/predefineSchemaParameters.js +188 -0
- package/dist/lib/predefineSchemaParameters.js.map +1 -0
- package/package.json +1 -1
- package/src/lib/QraftCommand.ts +37 -24
- package/src/lib/createServicePathMatch.ts +46 -0
- package/src/lib/filterDocumentPaths.ts +4 -31
- package/src/lib/open-api/OpenAPISchemaType.ts +1 -1
- package/src/lib/open-api/readSchema.ts +1 -3
- package/src/lib/predefineSchemaParameters.ts +311 -0
package/CHANGELOG.md
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"QraftCommand.d.ts","sourceRoot":"","sources":["../../src/lib/QraftCommand.ts"],"names":[],"mappings":";AACA,OAAO,EAAE,OAAO,EAAE,KAAK,MAAM,EAAE,MAAM,WAAW,CAAC;AAIjD,OAAO,EAAiB,GAAG,EAAE,MAAM,UAAU,CAAC;AAC9C,OAAY,EAAE,GAAG,EAAE,MAAM,KAAK,CAAC;
|
|
1
|
+
{"version":3,"file":"QraftCommand.d.ts","sourceRoot":"","sources":["../../src/lib/QraftCommand.ts"],"names":[],"mappings":";AACA,OAAO,EAAE,OAAO,EAAE,KAAK,MAAM,EAAE,MAAM,WAAW,CAAC;AAIjD,OAAO,EAAiB,GAAG,EAAE,MAAM,UAAU,CAAC;AAC9C,OAAY,EAAE,GAAG,EAAE,MAAM,KAAK,CAAC;AAI/B,OAAO,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC;AAEnD,OAAO,EAAe,KAAK,OAAO,EAAE,MAAM,2BAA2B,CAAC;AACtE,OAAO,EAAE,iBAAiB,EAAE,MAAM,iCAAiC,CAAC;AAEpE,OAAO,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC;AAQnD,qBAAa,YAAa,SAAQ,OAAO;IACvC,SAAS,CAAC,QAAQ,CAAC,GAAG,EAAE,GAAG,CAAC;IAC5B,SAAS,CAAC,uBAAuB,EAAE,0BAA0B,EAAE,CAAM;;IA2CrE,MAAM,CAAC,QAAQ,EAAE,0BAA0B,GAAG,IAAI;IAK5C,cAAc,CAAC,GAAG,UAAU,EAAE,GAAG,EAAE;IA+GzC,SAAS,CAAC,oBAAoB,CAAC,QAAQ,EAAE,0BAA0B;IAInE,MAAM,CACJ,KAAK,EAAE,MAAM,EACb,WAAW,CAAC,EAAE,MAAM,EACpB,YAAY,CAAC,EAAE,MAAM,GAAG,OAAO,GAAG,MAAM,EAAE,GACzC,IAAI;IACP,MAAM,CAAC,CAAC,EACN,KAAK,EAAE,MAAM,EACb,WAAW,EAAE,MAAM,EACnB,QAAQ,EAAE,CAAC,KAAK,EAAE,MAAM,EAAE,QAAQ,EAAE,CAAC,KAAK,CAAC,EAC3C,YAAY,CAAC,EAAE,CAAC,GACf,IAAI;IACP,qEAAqE;IACrE,MAAM,CACJ,KAAK,EAAE,MAAM,EACb,WAAW,EAAE,MAAM,EACnB,MAAM,EAAE,MAAM,EACd,YAAY,CAAC,EAAE,MAAM,GAAG,OAAO,GAAG,MAAM,EAAE,GACzC,IAAI;IA8BP,cAAc,CACZ,KAAK,EAAE,MAAM,EACb,WAAW,CAAC,EAAE,MAAM,EACpB,YAAY,CAAC,EAAE,MAAM,GAAG,OAAO,GAAG,MAAM,EAAE,GACzC,IAAI;IACP,cAAc,CAAC,CAAC,EACd,KAAK,EAAE,MAAM,EACb,WAAW,EAAE,MAAM,EACnB,QAAQ,EAAE,CAAC,KAAK,EAAE,MAAM,EAAE,QAAQ,EAAE,CAAC,KAAK,CAAC,EAC3C,YAAY,CAAC,EAAE,CAAC,GACf,IAAI;IACP,qEAAqE;IACrE,cAAc,CACZ,KAAK,EAAE,MAAM,EACb,WAAW,EAAE,MAAM,EACnB,MAAM,EAAE,MAAM,EACd,YAAY,CAAC,EAAE,MAAM,GAAG,OAAO,GAAG,MAAM,EAAE,GACzC,IAAI;IA8BP,SAAS,CAAC,iBAAiB,CAAC,MAAM,EAAE;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,SAAS,EAAE,OAAO,CAAA;KAAE;CAe1E;AAWD,MAAM,MAAM,0BAA0B,GAAG,CACvC,OAAO,EAAE;IACP;;OAEG;IACH,MAAM,EAAE,MAAM,EAAE,CAAC;IACjB;;OAEG;IACH,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;IAC1B;;OAEG;IACH,OAAO,EAAE,GAAG,CAAC;IACb;;OAEG;IACH,QAAQ,EAAE,OAAO,EAAE,CAAC;IACpB;;OAEG;IACH,MAAM,EAAE,iBAAiB,CAAC;IAC1B;;OAEG;IACH,MAAM,EAAE,aAAa,CAAC;CACvB,EACD,OAAO,EAAE,CAAC,KAAK,EAAE,aAAa,EAAE,KAAK,IAAI,KACtC,OAAO,CAAC,IAAI,CAAC,CAAC;AAmFnB;;;GAGG;AACH,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,MAAM;;;EAoB7C"}
|
package/dist/lib/QraftCommand.js
CHANGED
|
@@ -5,10 +5,12 @@ import { sep } from 'node:path';
|
|
|
5
5
|
import process from 'node:process';
|
|
6
6
|
import { pathToFileURL } from 'node:url';
|
|
7
7
|
import ora from 'ora';
|
|
8
|
+
import { parsePathGlobs } from './createServicePathMatch.js';
|
|
8
9
|
import { filterDocumentPaths } from './filterDocumentPaths.js';
|
|
9
10
|
import { handleSchemaInput } from './handleSchemaInput.js';
|
|
10
11
|
import { getServices } from './open-api/getServices.js';
|
|
11
12
|
import { readSchema } from './open-api/readSchema.js';
|
|
13
|
+
import { parseOperationPredefinedParametersOption, createPredefinedParametersGlobMap, predefineSchemaParameters, } from './predefineSchemaParameters.js';
|
|
12
14
|
import { writeGeneratorFiles } from './writeGeneratorFiles.js';
|
|
13
15
|
export class QraftCommand extends Command {
|
|
14
16
|
cwd;
|
|
@@ -21,6 +23,7 @@ export class QraftCommand extends Command {
|
|
|
21
23
|
.requiredOption('-o, --output-dir <path>', 'Output directory for generated services')
|
|
22
24
|
.option('-rm, --clean', 'Clean output directory before generating services')
|
|
23
25
|
.option('--filter-services <glob-pattern>', 'Filter services to be generated by glob pattern. Eg: "/user/**,/post/**". See NPM `micromatch` package for more details.')
|
|
26
|
+
.option('--operation-predefined-parameters <patterns...>', 'Predefined parameters for services. The specified services parameters will be optional. Eg: "/**:header.x-monite-version,query.x-api-key.;/user/**,/post/**:header.x-monite-entity-id"')
|
|
24
27
|
.option('--postfix-services <string>', 'Postfix to be added to the generated service name (eg: Service)')
|
|
25
28
|
.option('--service-name-base <endpoint[<index>] | tags>', 'Use OpenAPI Operation `endpoint[<index>]` path part (e.g.: "/0/1/2") or `tags` as the base name of the service.', 'endpoint[0]')
|
|
26
29
|
.option('--file-header <string>', 'Header to be added to the generated file (eg: /* eslint-disable */)');
|
|
@@ -45,7 +48,17 @@ export class QraftCommand extends Command {
|
|
|
45
48
|
const spinner = ora('Starting ⛏︎').start();
|
|
46
49
|
const input = handleSchemaInput(inputs[0], this.cwd, spinner);
|
|
47
50
|
spinner.text = 'Reading OpenAPI Schema';
|
|
48
|
-
|
|
51
|
+
let schema = filterDocumentPaths(await readSchema(input), parsePathGlobs(args.filterServices));
|
|
52
|
+
if (args.operationPredefinedParameters) {
|
|
53
|
+
const predefinedParametersGlobMap = createPredefinedParametersGlobMap(schema, parseOperationPredefinedParametersOption(...args.operationPredefinedParameters));
|
|
54
|
+
const predefinedParametersErrors = Object.values(predefinedParametersGlobMap).flatMap(({ errors }) => errors);
|
|
55
|
+
if (predefinedParametersErrors.length) {
|
|
56
|
+
predefinedParametersErrors.forEach((error) => spinner.warn(error));
|
|
57
|
+
spinner.fail('Error occurred during operation predefined parameters setup.');
|
|
58
|
+
process.exit(1);
|
|
59
|
+
}
|
|
60
|
+
schema = predefineSchemaParameters(schema, predefinedParametersGlobMap);
|
|
61
|
+
}
|
|
49
62
|
spinner.text = 'Getting OpenAPI Services';
|
|
50
63
|
const services = getServices(schema, {
|
|
51
64
|
postfixServices: args.postfixServices,
|
|
@@ -60,7 +73,7 @@ export class QraftCommand extends Command {
|
|
|
60
73
|
args,
|
|
61
74
|
spinner,
|
|
62
75
|
services,
|
|
63
|
-
schema,
|
|
76
|
+
schema: schema,
|
|
64
77
|
output: {
|
|
65
78
|
dir: outputDir,
|
|
66
79
|
clean: args.clean,
|
|
@@ -132,21 +145,6 @@ export class QraftCommand extends Command {
|
|
|
132
145
|
function normalizeOutputDirPath(outputDir) {
|
|
133
146
|
return pathToFileURL(outputDir.endsWith(sep) ? outputDir : `${outputDir}${sep}`);
|
|
134
147
|
}
|
|
135
|
-
/**
|
|
136
|
-
* Parse services filter option to array
|
|
137
|
-
* @example
|
|
138
|
-
* ```ts
|
|
139
|
-
* parseServicesFilterOption('/user/**,/post/**')
|
|
140
|
-
* ```
|
|
141
|
-
* @param endpointGlobs
|
|
142
|
-
*/
|
|
143
|
-
function parseServicesFilterOption(endpointGlobs) {
|
|
144
|
-
return endpointGlobs
|
|
145
|
-
? endpointGlobs
|
|
146
|
-
.split(',')
|
|
147
|
-
.filter((item) => Boolean(typeof item === 'string' && item.trim()))
|
|
148
|
-
: undefined;
|
|
149
|
-
}
|
|
150
148
|
function findSimilarOption({ flags, mandatory, }, options) {
|
|
151
149
|
const newOptionParsedFlags = splitOptionFlags(flags);
|
|
152
150
|
/** @see {@link https://github.com/tj/commander.js/blob/83c3f4e391754d2f80b179acc4bccc2d4d0c863d/lib/option.js#L15} Source implementation */
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"QraftCommand.js","sourceRoot":"","sources":["../../src/lib/QraftCommand.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"QraftCommand.js","sourceRoot":"","sources":["../../src/lib/QraftCommand.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Create a function to match service paths
|
|
3
|
+
* @param servicesGlob
|
|
4
|
+
*/
|
|
5
|
+
export declare const createServicePathMatch: (servicesGlob: string[]) => (path: string) => boolean;
|
|
6
|
+
/**
|
|
7
|
+
* Parse services filter option to array
|
|
8
|
+
* @example
|
|
9
|
+
* ```ts
|
|
10
|
+
* parsePathGlobs('/user/**,/post/**')
|
|
11
|
+
* ```
|
|
12
|
+
* @param endpointGlobs
|
|
13
|
+
*/
|
|
14
|
+
export declare function parsePathGlobs(endpointGlobs: string): string[] | undefined;
|
|
15
|
+
//# sourceMappingURL=createServicePathMatch.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"createServicePathMatch.d.ts","sourceRoot":"","sources":["../../src/lib/createServicePathMatch.ts"],"names":[],"mappings":"AAEA;;;GAGG;AACH,eAAO,MAAM,sBAAsB,iBAAkB,MAAM,EAAE,YAgBjB,MAAM,YAKjD,CAAC;AAEF;;;;;;;GAOG;AACH,wBAAgB,cAAc,CAAC,aAAa,EAAE,MAAM,GAAG,MAAM,EAAE,GAAG,SAAS,CAQ1E"}
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
import micromatch from 'micromatch';
|
|
2
|
+
/**
|
|
3
|
+
* Create a function to match service paths
|
|
4
|
+
* @param servicesGlob
|
|
5
|
+
*/
|
|
6
|
+
export const createServicePathMatch = (servicesGlob) => {
|
|
7
|
+
const servicePathGlobs = servicesGlob.reduce((acc, glob) => {
|
|
8
|
+
glob.startsWith('!')
|
|
9
|
+
? acc.ignore.push(glob.slice(1))
|
|
10
|
+
: acc.match.push(glob);
|
|
11
|
+
return acc;
|
|
12
|
+
}, {
|
|
13
|
+
match: [],
|
|
14
|
+
ignore: [],
|
|
15
|
+
});
|
|
16
|
+
return function isServicePatchMatch(path) {
|
|
17
|
+
return micromatch.isMatch(path, servicePathGlobs.match, {
|
|
18
|
+
ignore: servicePathGlobs.ignore,
|
|
19
|
+
});
|
|
20
|
+
};
|
|
21
|
+
};
|
|
22
|
+
/**
|
|
23
|
+
* Parse services filter option to array
|
|
24
|
+
* @example
|
|
25
|
+
* ```ts
|
|
26
|
+
* parsePathGlobs('/user/**,/post/**')
|
|
27
|
+
* ```
|
|
28
|
+
* @param endpointGlobs
|
|
29
|
+
*/
|
|
30
|
+
export function parsePathGlobs(endpointGlobs) {
|
|
31
|
+
return endpointGlobs
|
|
32
|
+
? endpointGlobs
|
|
33
|
+
.split(',')
|
|
34
|
+
.filter((item) => Boolean(typeof item === 'string' && item.trim()))
|
|
35
|
+
: undefined;
|
|
36
|
+
}
|
|
37
|
+
//# sourceMappingURL=createServicePathMatch.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"createServicePathMatch.js","sourceRoot":"","sources":["../../src/lib/createServicePathMatch.ts"],"names":[],"mappings":"AAAA,OAAO,UAAU,MAAM,YAAY,CAAC;AAEpC;;;GAGG;AACH,MAAM,CAAC,MAAM,sBAAsB,GAAG,CAAC,YAAsB,EAAE,EAAE;IAC/D,MAAM,gBAAgB,GAAG,YAAY,CAAC,MAAM,CAG1C,CAAC,GAAG,EAAE,IAAI,EAAE,EAAE;QACZ,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC;YAClB,CAAC,CAAC,GAAG,CAAC,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;YAChC,CAAC,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACzB,OAAO,GAAG,CAAC;IACb,CAAC,EACD;QACE,KAAK,EAAE,EAAE;QACT,MAAM,EAAE,EAAE;KACX,CACF,CAAC;IAEF,OAAO,SAAS,mBAAmB,CAAC,IAAY;QAC9C,OAAO,UAAU,CAAC,OAAO,CAAC,IAAI,EAAE,gBAAgB,CAAC,KAAK,EAAE;YACtD,MAAM,EAAE,gBAAgB,CAAC,MAAM;SAChC,CAAC,CAAC;IACL,CAAC,CAAC;AACJ,CAAC,CAAC;AAEF;;;;;;;GAOG;AACH,MAAM,UAAU,cAAc,CAAC,aAAqB;IAClD,OAAO,aAAa;QAClB,CAAC,CAAC,aAAa;aACV,KAAK,CAAC,GAAG,CAAC;aACV,MAAM,CAAC,CAAC,IAAa,EAAkB,EAAE,CACxC,OAAO,CAAC,OAAO,IAAI,KAAK,QAAQ,IAAI,IAAI,CAAC,IAAI,EAAE,CAAC,CACjD;QACL,CAAC,CAAC,SAAS,CAAC;AAChB,CAAC"}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import type
|
|
1
|
+
import { type OpenAPI3 } from 'openapi-typescript/src/types.js';
|
|
2
2
|
/**
|
|
3
3
|
* Filter the schema to only include paths that match the servicesGlob
|
|
4
4
|
* @param schema OpenAPI schema
|
|
@@ -9,10 +9,5 @@ import type { OpenAPISchemaType } from './open-api/OpenAPISchemaType.js';
|
|
|
9
9
|
* filterDocumentPaths(schema, ['/user/**', '/post/**', '!/user/internal'])
|
|
10
10
|
* ```
|
|
11
11
|
*/
|
|
12
|
-
export declare const filterDocumentPaths: (schema:
|
|
13
|
-
/**
|
|
14
|
-
* Create a function to match service paths
|
|
15
|
-
* @param servicesGlob
|
|
16
|
-
*/
|
|
17
|
-
export declare const createServicePathMatch: (servicesGlob: string[]) => (path: string) => boolean;
|
|
12
|
+
export declare const filterDocumentPaths: (schema: OpenAPI3, servicesGlob: string[] | undefined) => OpenAPI3;
|
|
18
13
|
//# sourceMappingURL=filterDocumentPaths.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"filterDocumentPaths.d.ts","sourceRoot":"","sources":["../../src/lib/filterDocumentPaths.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"filterDocumentPaths.d.ts","sourceRoot":"","sources":["../../src/lib/filterDocumentPaths.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,QAAQ,EAAE,MAAM,iCAAiC,CAAC;AAIhE;;;;;;;;;GASG;AACH,eAAO,MAAM,mBAAmB,WACtB,QAAQ,gBACF,MAAM,EAAE,GAAG,SAAS,KACjC,QAaF,CAAC"}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import
|
|
1
|
+
import { createServicePathMatch } from './createServicePathMatch.js';
|
|
2
2
|
/**
|
|
3
3
|
* Filter the schema to only include paths that match the servicesGlob
|
|
4
4
|
* @param schema OpenAPI schema
|
|
@@ -23,24 +23,4 @@ export const filterDocumentPaths = (schema, servicesGlob) => {
|
|
|
23
23
|
}
|
|
24
24
|
return { ...schema, paths };
|
|
25
25
|
};
|
|
26
|
-
/**
|
|
27
|
-
* Create a function to match service paths
|
|
28
|
-
* @param servicesGlob
|
|
29
|
-
*/
|
|
30
|
-
export const createServicePathMatch = (servicesGlob) => {
|
|
31
|
-
const servicePathGlobs = servicesGlob.reduce((acc, glob) => {
|
|
32
|
-
glob.startsWith('!')
|
|
33
|
-
? acc.ignore.push(glob.slice(1))
|
|
34
|
-
: acc.match.push(glob);
|
|
35
|
-
return acc;
|
|
36
|
-
}, {
|
|
37
|
-
match: [],
|
|
38
|
-
ignore: [],
|
|
39
|
-
});
|
|
40
|
-
return function isServicePatchMatch(path) {
|
|
41
|
-
return micromatch.isMatch(path, servicePathGlobs.match, {
|
|
42
|
-
ignore: servicePathGlobs.ignore,
|
|
43
|
-
});
|
|
44
|
-
};
|
|
45
|
-
};
|
|
46
26
|
//# sourceMappingURL=filterDocumentPaths.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"filterDocumentPaths.js","sourceRoot":"","sources":["../../src/lib/filterDocumentPaths.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"filterDocumentPaths.js","sourceRoot":"","sources":["../../src/lib/filterDocumentPaths.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,sBAAsB,EAAE,MAAM,6BAA6B,CAAC;AAErE;;;;;;;;;GASG;AACH,MAAM,CAAC,MAAM,mBAAmB,GAAG,CACjC,MAAgB,EAChB,YAAkC,EACxB,EAAE;IACZ,IAAI,CAAC,YAAY;QAAE,OAAO,MAAM,CAAC;IAEjC,MAAM,WAAW,GAAG,sBAAsB,CAAC,YAAY,CAAC,CAAC;IACzD,MAAM,KAAK,GAAwB,EAAE,CAAC;IAEtC,KAAK,MAAM,IAAI,IAAI,MAAM,CAAC,KAAK,EAAE,CAAC;QAChC,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,cAAc,CAAC,IAAI,CAAC,MAAM,CAAC,KAAK,EAAE,IAAI,CAAC;YAAE,SAAS;QACxE,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC;YAAE,SAAS;QACjC,KAAK,CAAC,IAAI,CAAC,GAAG,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;IACnC,CAAC;IAED,OAAO,EAAE,GAAG,MAAM,EAAE,KAAK,EAAE,CAAC;AAC9B,CAAC,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"OpenAPISchemaType.d.ts","sourceRoot":"","sources":["../../../src/lib/open-api/OpenAPISchemaType.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,iBAAiB,GAAG;IAC9B,OAAO,EAAE,MAAM,CAAC;IAChB,IAAI,EAAE;QACJ,KAAK,EAAE,MAAM,CAAC;QACd,OAAO,EAAE,MAAM,CAAC;KACjB,CAAC;IACF,KAAK,EAAE;QACL,CAAC,IAAI,EAAE,MAAM,GAAG;YACd,CAAC,MAAM,EAAE,MAAM,GAAG;gBAChB,IAAI,CAAC,EAAE,MAAM,EAAE,CAAC;gBAChB,WAAW,CAAC,EAAE,MAAM,CAAC;gBACrB,OAAO,CAAC,EAAE,MAAM,CAAC;gBACjB,WAAW,CAAC,EAAE,MAAM,CAAC;gBACrB,UAAU,CAAC,EAAE,
|
|
1
|
+
{"version":3,"file":"OpenAPISchemaType.d.ts","sourceRoot":"","sources":["../../../src/lib/open-api/OpenAPISchemaType.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,iBAAiB,GAAG;IAC9B,OAAO,EAAE,MAAM,CAAC;IAChB,IAAI,EAAE;QACJ,KAAK,EAAE,MAAM,CAAC;QACd,OAAO,EAAE,MAAM,CAAC;KACjB,CAAC;IACF,KAAK,EAAE;QACL,CAAC,IAAI,EAAE,MAAM,GAAG;YACd,CAAC,MAAM,EAAE,MAAM,GAAG;gBAChB,IAAI,CAAC,EAAE,MAAM,EAAE,CAAC;gBAChB,WAAW,CAAC,EAAE,MAAM,CAAC;gBACrB,OAAO,CAAC,EAAE,MAAM,CAAC;gBACjB,WAAW,CAAC,EAAE,MAAM,CAAC;gBACrB,UAAU,CAAC,EAAE,KAAK,CAAC,GAAG,CAAC,CAAC;gBACxB,UAAU,CAAC,EAAE,OAAO,CAAC;gBACrB,WAAW,CAAC,EAAE;oBACZ,OAAO,EAAE;wBACP,CAAC,WAAW,EAAE,MAAM,GAAG;4BACrB,MAAM,EAAE,GAAG,CAAC;yBACb,CAAC;qBACH,CAAC;iBACH,CAAC;gBACF,SAAS,EAAE;qBACR,UAAU,IAAI,MAAM,GAAG,SAAS,GAAG;wBAClC,WAAW,EAAE,MAAM,CAAC;wBACpB,OAAO,EAAE;4BACP,CAAC,WAAW,EAAE,MAAM,GAAG;gCACrB,MAAM,EAAE,GAAG,CAAC;6BACb,CAAC;yBACH,CAAC;qBACH;iBACF,CAAC;gBACF,QAAQ,CAAC,EAAE,KAAK,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,EAAE,GAAG,SAAS,CAAC,CAAC,CAAC;aACxD,CAAC;SACH,CAAC;KACH,CAAC;CACH,CAAC"}
|
|
@@ -32,5 +32,5 @@ export interface ServiceOutputOptions {
|
|
|
32
32
|
serviceNameBase?: ServiceBaseName;
|
|
33
33
|
}
|
|
34
34
|
export declare const getServices: (openApiJson: OpenAPISchemaType, { postfixServices, serviceNameBase, }?: ServiceOutputOptions) => Service[];
|
|
35
|
-
export declare const supportedMethod: (method: unknown) => method is "get" | "put" | "post" | "
|
|
35
|
+
export declare const supportedMethod: (method: unknown) => method is "get" | "put" | "post" | "delete" | "options" | "head" | "patch" | "trace";
|
|
36
36
|
//# sourceMappingURL=getServices.d.ts.map
|
|
@@ -2,6 +2,5 @@
|
|
|
2
2
|
/// <reference types="node" resolution-mode="require"/>
|
|
3
3
|
import type { Readable } from 'node:stream';
|
|
4
4
|
import type { OpenAPI3 } from 'openapi-typescript';
|
|
5
|
-
|
|
6
|
-
export declare const readSchema: (source: string | URL | OpenAPI3 | Readable | Buffer) => Promise<OpenAPISchemaType>;
|
|
5
|
+
export declare const readSchema: (source: string | URL | OpenAPI3 | Readable | Buffer) => Promise<OpenAPI3>;
|
|
7
6
|
//# sourceMappingURL=readSchema.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"readSchema.d.ts","sourceRoot":"","sources":["../../../src/lib/open-api/readSchema.ts"],"names":[],"mappings":";;AAEA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAC;AAC5C,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,oBAAoB,CAAC;AAGnD,
|
|
1
|
+
{"version":3,"file":"readSchema.d.ts","sourceRoot":"","sources":["../../../src/lib/open-api/readSchema.ts"],"names":[],"mappings":";;AAEA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAC;AAC5C,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,oBAAoB,CAAC;AAGnD,eAAO,MAAM,UAAU,WACb,MAAM,GAAG,GAAG,GAAG,QAAQ,GAAG,QAAQ,GAAG,MAAM,sBAiBpD,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"readSchema.js","sourceRoot":"","sources":["../../../src/lib/open-api/readSchema.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,uBAAuB,CAAC;AAIrD,OAAO,EAAE,iBAAiB,EAAE,MAAM,sCAAsC,CAAC;
|
|
1
|
+
{"version":3,"file":"readSchema.js","sourceRoot":"","sources":["../../../src/lib/open-api/readSchema.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,uBAAuB,CAAC;AAIrD,OAAO,EAAE,iBAAiB,EAAE,MAAM,sCAAsC,CAAC;AAEzE,MAAM,CAAC,MAAM,UAAU,GAAG,KAAK,EAC7B,MAAmD,EACnD,EAAE;IACF,MAAM,KAAK,GAAG,MAAM,YAAY,CAC9B;QACE,KAAK,EAAE;YACL,8BAA8B,EAAE,EAAE,QAAQ,EAAE,OAAO,EAAE,EAAE,wCAAwC;SAChG;KACF,EACD,EAAE,OAAO,EAAE,CAAC,SAAS,CAAC,EAAE,CACzB,CAAC;IAEF,MAAM,MAAM,GAAG,MAAM,iBAAiB,CAAC,MAAM,EAAE;QAC7C,KAAK;QACL,MAAM,EAAE,KAAK;KACd,CAAC,CAAC;IAEH,OAAO,MAAkB,CAAC;AAC5B,CAAC,CAAC"}
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
import { OperationObject, ParameterObject } from 'openapi-typescript';
|
|
2
|
+
import { type OpenAPI3, ReferenceObject } from 'openapi-typescript/src/types.js';
|
|
3
|
+
export declare function predefineSchemaParameters(schema: OpenAPI3, predefinedParametersGlobMap: PredefinedParametersGlobMap): OpenAPI3;
|
|
4
|
+
type PredefinedParametersOptionMap = Record<string, Pick<ParameterObject, 'in' | 'name'>[]>;
|
|
5
|
+
/**
|
|
6
|
+
* Parses the given configuration string into a structured format.
|
|
7
|
+
*
|
|
8
|
+
* @param optionItems - The configuration string to parse. Eg. `/foo,/bar/**:header.x-monite-version,query.x-api-key`.
|
|
9
|
+
* @returns The parsed configuration.
|
|
10
|
+
*
|
|
11
|
+
* @example
|
|
12
|
+
* ```ts
|
|
13
|
+
* const parsedConfig = parseOperationPredefinedParametersOption("/foo,/bar/**:header.x-monite-version,query.x-api-key");
|
|
14
|
+
* ```
|
|
15
|
+
*/
|
|
16
|
+
declare function parseOperationPredefinedParametersOption(...optionItems: string[]): PredefinedParametersOptionMap;
|
|
17
|
+
type PredefinedParametersGlobMap = {
|
|
18
|
+
[glob: string]: {
|
|
19
|
+
paths: string[];
|
|
20
|
+
parameters: ParameterObject[];
|
|
21
|
+
errors: string[];
|
|
22
|
+
};
|
|
23
|
+
};
|
|
24
|
+
export declare function createPredefinedParametersGlobMap(schema: OpenAPI3, predefinedParameters: PredefinedParametersOptionMap): PredefinedParametersGlobMap;
|
|
25
|
+
export declare function assertIsOperationObject(operationItem: OperationObject | ReferenceObject): asserts operationItem is OperationObject;
|
|
26
|
+
export declare function assertIsParameterObjects(parameterObjects: Array<ParameterObject | ReferenceObject>): asserts parameterObjects is Array<ParameterObject>;
|
|
27
|
+
export { parseOperationPredefinedParametersOption };
|
|
28
|
+
//# sourceMappingURL=predefineSchemaParameters.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"predefineSchemaParameters.d.ts","sourceRoot":"","sources":["../../src/lib/predefineSchemaParameters.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,eAAe,EAAE,MAAM,oBAAoB,CAAC;AACtE,OAAO,EACL,KAAK,QAAQ,EAEb,eAAe,EAChB,MAAM,iCAAiC,CAAC;AAOzC,wBAAgB,yBAAyB,CACvC,MAAM,EAAE,QAAQ,EAChB,2BAA2B,EAAE,2BAA2B,GACvD,QAAQ,CAoEV;AAED,KAAK,6BAA6B,GAAG,MAAM,CACzC,MAAM,EACN,IAAI,CAAC,eAAe,EAAE,IAAI,GAAG,MAAM,CAAC,EAAE,CACvC,CAAC;AAEF;;;;;;;;;;GAUG;AACH,iBAAS,wCAAwC,CAC/C,GAAG,WAAW,EAAE,MAAM,EAAE,GACvB,6BAA6B,CAuC/B;AAED,KAAK,2BAA2B,GAAG;IACjC,CAAC,IAAI,EAAE,MAAM,GAAG;QACd,KAAK,EAAE,MAAM,EAAE,CAAC;QAChB,UAAU,EAAE,eAAe,EAAE,CAAC;QAC9B,MAAM,EAAE,MAAM,EAAE,CAAC;KAClB,CAAC;CACH,CAAC;AAEF,wBAAgB,iCAAiC,CAC/C,MAAM,EAAE,QAAQ,EAChB,oBAAoB,EAAE,6BAA6B,GAClD,2BAA2B,CAyG7B;AA4BD,wBAAgB,uBAAuB,CACrC,aAAa,EAAE,eAAe,GAAG,eAAe,GAC/C,OAAO,CAAC,aAAa,IAAI,eAAe,CAM1C;AAED,wBAAgB,wBAAwB,CACtC,gBAAgB,EAAE,KAAK,CAAC,eAAe,GAAG,eAAe,CAAC,GACzD,OAAO,CAAC,gBAAgB,IAAI,KAAK,CAAC,eAAe,CAAC,CAQpD;AAED,OAAO,EAAE,wCAAwC,EAAE,CAAC"}
|
|
@@ -0,0 +1,188 @@
|
|
|
1
|
+
import { createServicePathMatch, parsePathGlobs, } from './createServicePathMatch.js';
|
|
2
|
+
export function predefineSchemaParameters(schema, predefinedParametersGlobMap) {
|
|
3
|
+
const predefinedSchemaPaths = {};
|
|
4
|
+
for (const path in schema.paths) {
|
|
5
|
+
if (!Object.prototype.hasOwnProperty.call(schema.paths, path))
|
|
6
|
+
continue;
|
|
7
|
+
const service = schema.paths[path];
|
|
8
|
+
assertIsPathItemObject(service);
|
|
9
|
+
predefinedSchemaPaths[path] = { ...service };
|
|
10
|
+
for (const _method in service) {
|
|
11
|
+
const method = _method;
|
|
12
|
+
if (!Object.prototype.hasOwnProperty.call(service, method))
|
|
13
|
+
continue;
|
|
14
|
+
const operation = service[method];
|
|
15
|
+
assertIsOperationObject(operation);
|
|
16
|
+
for (const predefinedParametersGlob of Object.values(predefinedParametersGlobMap)) {
|
|
17
|
+
if (!predefinedParametersGlob.paths.includes(path)) {
|
|
18
|
+
continue;
|
|
19
|
+
}
|
|
20
|
+
const predefinedPathItem = predefinedSchemaPaths[path];
|
|
21
|
+
if (predefinedPathItem)
|
|
22
|
+
assertIsPathItemObject(predefinedPathItem);
|
|
23
|
+
const predefinedOperation = predefinedPathItem?.[method];
|
|
24
|
+
if (predefinedOperation)
|
|
25
|
+
assertIsOperationObject(predefinedOperation);
|
|
26
|
+
const operationParameters = predefinedOperation?.parameters ?? operation.parameters ?? [];
|
|
27
|
+
assertIsParameterObjects(operationParameters);
|
|
28
|
+
const predefinedParameters = operationParameters.map((operationParameter) => {
|
|
29
|
+
if (findPredefinedOperationParameter(operationParameter, predefinedParametersGlob.parameters)) {
|
|
30
|
+
return {
|
|
31
|
+
...operationParameter,
|
|
32
|
+
required: false,
|
|
33
|
+
};
|
|
34
|
+
}
|
|
35
|
+
return operationParameter;
|
|
36
|
+
});
|
|
37
|
+
Object.assign(predefinedSchemaPaths[path], {
|
|
38
|
+
[method]: {
|
|
39
|
+
...operation,
|
|
40
|
+
parameters: predefinedParameters,
|
|
41
|
+
},
|
|
42
|
+
});
|
|
43
|
+
}
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
return {
|
|
47
|
+
...schema,
|
|
48
|
+
paths: predefinedSchemaPaths,
|
|
49
|
+
};
|
|
50
|
+
}
|
|
51
|
+
/**
|
|
52
|
+
* Parses the given configuration string into a structured format.
|
|
53
|
+
*
|
|
54
|
+
* @param optionItems - The configuration string to parse. Eg. `/foo,/bar/**:header.x-monite-version,query.x-api-key`.
|
|
55
|
+
* @returns The parsed configuration.
|
|
56
|
+
*
|
|
57
|
+
* @example
|
|
58
|
+
* ```ts
|
|
59
|
+
* const parsedConfig = parseOperationPredefinedParametersOption("/foo,/bar/**:header.x-monite-version,query.x-api-key");
|
|
60
|
+
* ```
|
|
61
|
+
*/
|
|
62
|
+
function parseOperationPredefinedParametersOption(...optionItems) {
|
|
63
|
+
const globParametersMap = {};
|
|
64
|
+
for (const optionItem of optionItems) {
|
|
65
|
+
const [pathGlob, options] = optionItem.split(':').map((s) => s.trim());
|
|
66
|
+
const parameters = {
|
|
67
|
+
header: [],
|
|
68
|
+
query: [],
|
|
69
|
+
cookie: [],
|
|
70
|
+
};
|
|
71
|
+
if (options) {
|
|
72
|
+
options
|
|
73
|
+
.split(',')
|
|
74
|
+
.map((option) => option.trim())
|
|
75
|
+
.filter(Boolean)
|
|
76
|
+
.forEach((option) => {
|
|
77
|
+
const [type, key] = option.split('.').map((s) => s.trim());
|
|
78
|
+
if (type !== 'header' && type !== 'query' && type !== 'cookie')
|
|
79
|
+
throw new Error(`Invalid option type: ${type} in ${option}. Must be one of 'header', 'query', or 'cookie'`);
|
|
80
|
+
if (!parameters[type].includes(key))
|
|
81
|
+
parameters[type].push(key);
|
|
82
|
+
});
|
|
83
|
+
}
|
|
84
|
+
if (pathGlob in globParametersMap) {
|
|
85
|
+
throw new Error(`Duplicate path: ${pathGlob} in config string.`);
|
|
86
|
+
}
|
|
87
|
+
globParametersMap[pathGlob] = Object.entries(parameters).flatMap(([inLocation, names]) => names.map((name) => ({ in: inLocation, name })));
|
|
88
|
+
}
|
|
89
|
+
return globParametersMap;
|
|
90
|
+
}
|
|
91
|
+
export function createPredefinedParametersGlobMap(schema, predefinedParameters) {
|
|
92
|
+
const predefinedParametersGlobMap = {};
|
|
93
|
+
const servicePredefinedParametersList = Object.entries(predefinedParameters).map(([pathGlobs, parameters]) => {
|
|
94
|
+
const globs = parsePathGlobs(pathGlobs);
|
|
95
|
+
if (!globs)
|
|
96
|
+
throw new Error(`Invalid path glob: ${pathGlobs}. Must be a comma-separated list of globs.`);
|
|
97
|
+
return {
|
|
98
|
+
pathGlobs,
|
|
99
|
+
parameters,
|
|
100
|
+
isPathMatch: createServicePathMatch(globs),
|
|
101
|
+
};
|
|
102
|
+
});
|
|
103
|
+
for (const path in schema.paths) {
|
|
104
|
+
if (!Object.prototype.hasOwnProperty.call(schema.paths, path))
|
|
105
|
+
continue;
|
|
106
|
+
for (const { pathGlobs, parameters: parametersToPredefine, isPathMatch, } of servicePredefinedParametersList) {
|
|
107
|
+
if (!isPathMatch(path))
|
|
108
|
+
continue;
|
|
109
|
+
const service = schema.paths[path];
|
|
110
|
+
assertIsPathItemObject(service);
|
|
111
|
+
for (const _method in service) {
|
|
112
|
+
const method = _method;
|
|
113
|
+
if (!Object.prototype.hasOwnProperty.call(service, method))
|
|
114
|
+
continue;
|
|
115
|
+
const operation = service[method];
|
|
116
|
+
assertIsOperationObject(operation);
|
|
117
|
+
const operationParameters = operation.parameters ?? [];
|
|
118
|
+
assertIsParameterObjects(operationParameters);
|
|
119
|
+
if (!(pathGlobs in predefinedParametersGlobMap))
|
|
120
|
+
predefinedParametersGlobMap[pathGlobs] = {
|
|
121
|
+
paths: [],
|
|
122
|
+
parameters: [],
|
|
123
|
+
errors: [],
|
|
124
|
+
};
|
|
125
|
+
const predefinedPathGlob = predefinedParametersGlobMap[pathGlobs];
|
|
126
|
+
for (const parameterSchemaToPredefine of parametersToPredefine) {
|
|
127
|
+
const parameterToPredefine = findPredefinedOperationParameter(parameterSchemaToPredefine, operationParameters);
|
|
128
|
+
if (!parameterToPredefine) {
|
|
129
|
+
predefinedPathGlob.errors.push(`Missing predefined parameter '${parameterSchemaToPredefine.in}' '${parameterSchemaToPredefine.name}' in '${method} ${path}' in '${pathGlobs}'`);
|
|
130
|
+
continue;
|
|
131
|
+
}
|
|
132
|
+
const existingParameterToPredefine = findPredefinedOperationParameter(parameterToPredefine, predefinedPathGlob.parameters);
|
|
133
|
+
if (existingParameterToPredefine) {
|
|
134
|
+
if (!shallowEqualParameterTypes(parameterToPredefine, existingParameterToPredefine)) {
|
|
135
|
+
predefinedPathGlob.errors.push(`Parameter '${parameterSchemaToPredefine.in}' '${parameterToPredefine.name}' in '${method} ${path}' has conflicting types with predefined parameter '${parameterToPredefine.name}' in '${pathGlobs}'`);
|
|
136
|
+
}
|
|
137
|
+
else {
|
|
138
|
+
if (!predefinedPathGlob.paths.includes(path))
|
|
139
|
+
predefinedPathGlob.paths.push(path);
|
|
140
|
+
}
|
|
141
|
+
}
|
|
142
|
+
else {
|
|
143
|
+
predefinedPathGlob.parameters.push(parameterToPredefine);
|
|
144
|
+
if (!predefinedPathGlob.paths.includes(path))
|
|
145
|
+
predefinedPathGlob.paths.push(path);
|
|
146
|
+
}
|
|
147
|
+
}
|
|
148
|
+
}
|
|
149
|
+
}
|
|
150
|
+
}
|
|
151
|
+
Object.entries(predefinedParameters).forEach(([pathGlobs]) => {
|
|
152
|
+
if (!predefinedParametersGlobMap[pathGlobs]) {
|
|
153
|
+
predefinedParametersGlobMap[pathGlobs] = {
|
|
154
|
+
paths: [],
|
|
155
|
+
parameters: [],
|
|
156
|
+
errors: [`No matching paths found for '${pathGlobs}'`],
|
|
157
|
+
};
|
|
158
|
+
}
|
|
159
|
+
});
|
|
160
|
+
return predefinedParametersGlobMap;
|
|
161
|
+
}
|
|
162
|
+
function findPredefinedOperationParameter(parameterSchemaToPredefine, operationParameters) {
|
|
163
|
+
return operationParameters.find((operationParameter) => operationParameter.in === parameterSchemaToPredefine.in &&
|
|
164
|
+
operationParameter.name === parameterSchemaToPredefine.name);
|
|
165
|
+
}
|
|
166
|
+
function shallowEqualParameterTypes(a, b) {
|
|
167
|
+
if ('schema' in a || 'schema' in b)
|
|
168
|
+
return 'schema' in a && 'schema' in b && a.schema?.type === b.schema?.type;
|
|
169
|
+
}
|
|
170
|
+
function assertIsPathItemObject(pathItem) {
|
|
171
|
+
if ('$ref' in pathItem) {
|
|
172
|
+
throw new Error(`Expected a PathItemObject, but got a ReferenceObject: ${pathItem}`);
|
|
173
|
+
}
|
|
174
|
+
}
|
|
175
|
+
export function assertIsOperationObject(operationItem) {
|
|
176
|
+
if ('$ref' in operationItem) {
|
|
177
|
+
throw new Error(`Expected a OperationObject, but got a ReferenceObject: ${operationItem}`);
|
|
178
|
+
}
|
|
179
|
+
}
|
|
180
|
+
export function assertIsParameterObjects(parameterObjects) {
|
|
181
|
+
parameterObjects.forEach((parameterObject) => {
|
|
182
|
+
if ('$ref' in parameterObject) {
|
|
183
|
+
throw new Error(`Expected a ParameterObject, but got a ReferenceObject: ${parameterObject}`);
|
|
184
|
+
}
|
|
185
|
+
});
|
|
186
|
+
}
|
|
187
|
+
export { parseOperationPredefinedParametersOption };
|
|
188
|
+
//# sourceMappingURL=predefineSchemaParameters.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"predefineSchemaParameters.js","sourceRoot":"","sources":["../../src/lib/predefineSchemaParameters.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
package/src/lib/QraftCommand.ts
CHANGED
|
@@ -6,6 +6,7 @@ import process from 'node:process';
|
|
|
6
6
|
import { pathToFileURL, URL } from 'node:url';
|
|
7
7
|
import ora, { Ora } from 'ora';
|
|
8
8
|
|
|
9
|
+
import { parsePathGlobs } from './createServicePathMatch.js';
|
|
9
10
|
import { filterDocumentPaths } from './filterDocumentPaths.js';
|
|
10
11
|
import { GeneratorFile } from './GeneratorFile.js';
|
|
11
12
|
import { handleSchemaInput } from './handleSchemaInput.js';
|
|
@@ -13,6 +14,11 @@ import { getServices, type Service } from './open-api/getServices.js';
|
|
|
13
14
|
import { OpenAPISchemaType } from './open-api/OpenAPISchemaType.js';
|
|
14
15
|
import { readSchema } from './open-api/readSchema.js';
|
|
15
16
|
import { OutputOptions } from './OutputOptions.js';
|
|
17
|
+
import {
|
|
18
|
+
parseOperationPredefinedParametersOption,
|
|
19
|
+
createPredefinedParametersGlobMap,
|
|
20
|
+
predefineSchemaParameters,
|
|
21
|
+
} from './predefineSchemaParameters.js';
|
|
16
22
|
import { writeGeneratorFiles } from './writeGeneratorFiles.js';
|
|
17
23
|
|
|
18
24
|
export class QraftCommand extends Command {
|
|
@@ -41,6 +47,10 @@ export class QraftCommand extends Command {
|
|
|
41
47
|
'--filter-services <glob-pattern>',
|
|
42
48
|
'Filter services to be generated by glob pattern. Eg: "/user/**,/post/**". See NPM `micromatch` package for more details.'
|
|
43
49
|
)
|
|
50
|
+
.option(
|
|
51
|
+
'--operation-predefined-parameters <patterns...>',
|
|
52
|
+
'Predefined parameters for services. The specified services parameters will be optional. Eg: "/**:header.x-monite-version,query.x-api-key.;/user/**,/post/**:header.x-monite-entity-id"'
|
|
53
|
+
)
|
|
44
54
|
.option(
|
|
45
55
|
'--postfix-services <string>',
|
|
46
56
|
'Postfix to be added to the generated service name (eg: Service)'
|
|
@@ -90,13 +100,36 @@ export class QraftCommand extends Command {
|
|
|
90
100
|
const input = handleSchemaInput(inputs[0], this.cwd, spinner);
|
|
91
101
|
|
|
92
102
|
spinner.text = 'Reading OpenAPI Schema';
|
|
93
|
-
|
|
103
|
+
let schema = filterDocumentPaths(
|
|
94
104
|
await readSchema(input),
|
|
95
|
-
|
|
105
|
+
parsePathGlobs(args.filterServices)
|
|
96
106
|
);
|
|
97
107
|
|
|
108
|
+
if (args.operationPredefinedParameters) {
|
|
109
|
+
const predefinedParametersGlobMap = createPredefinedParametersGlobMap(
|
|
110
|
+
schema,
|
|
111
|
+
parseOperationPredefinedParametersOption(
|
|
112
|
+
...args.operationPredefinedParameters
|
|
113
|
+
)
|
|
114
|
+
);
|
|
115
|
+
|
|
116
|
+
const predefinedParametersErrors = Object.values(
|
|
117
|
+
predefinedParametersGlobMap
|
|
118
|
+
).flatMap(({ errors }) => errors);
|
|
119
|
+
|
|
120
|
+
if (predefinedParametersErrors.length) {
|
|
121
|
+
predefinedParametersErrors.forEach((error) => spinner.warn(error));
|
|
122
|
+
spinner.fail(
|
|
123
|
+
'Error occurred during operation predefined parameters setup.'
|
|
124
|
+
);
|
|
125
|
+
process.exit(1);
|
|
126
|
+
}
|
|
127
|
+
|
|
128
|
+
schema = predefineSchemaParameters(schema, predefinedParametersGlobMap);
|
|
129
|
+
}
|
|
130
|
+
|
|
98
131
|
spinner.text = 'Getting OpenAPI Services';
|
|
99
|
-
const services = getServices(schema, {
|
|
132
|
+
const services = getServices(schema as OpenAPISchemaType, {
|
|
100
133
|
postfixServices: args.postfixServices,
|
|
101
134
|
serviceNameBase: args.serviceNameBase,
|
|
102
135
|
});
|
|
@@ -114,7 +147,7 @@ export class QraftCommand extends Command {
|
|
|
114
147
|
args,
|
|
115
148
|
spinner,
|
|
116
149
|
services,
|
|
117
|
-
schema,
|
|
150
|
+
schema: schema as OpenAPISchemaType,
|
|
118
151
|
output: {
|
|
119
152
|
dir: outputDir,
|
|
120
153
|
clean: args.clean,
|
|
@@ -273,26 +306,6 @@ function normalizeOutputDirPath(outputDir: string): URL {
|
|
|
273
306
|
);
|
|
274
307
|
}
|
|
275
308
|
|
|
276
|
-
/**
|
|
277
|
-
* Parse services filter option to array
|
|
278
|
-
* @example
|
|
279
|
-
* ```ts
|
|
280
|
-
* parseServicesFilterOption('/user/**,/post/**')
|
|
281
|
-
* ```
|
|
282
|
-
* @param endpointGlobs
|
|
283
|
-
*/
|
|
284
|
-
function parseServicesFilterOption(
|
|
285
|
-
endpointGlobs: string
|
|
286
|
-
): string[] | undefined {
|
|
287
|
-
return endpointGlobs
|
|
288
|
-
? endpointGlobs
|
|
289
|
-
.split(',')
|
|
290
|
-
.filter((item: unknown): item is string =>
|
|
291
|
-
Boolean(typeof item === 'string' && item.trim())
|
|
292
|
-
)
|
|
293
|
-
: undefined;
|
|
294
|
-
}
|
|
295
|
-
|
|
296
309
|
export type QraftCommandActionCallback = (
|
|
297
310
|
options: {
|
|
298
311
|
/**
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
import micromatch from 'micromatch';
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* Create a function to match service paths
|
|
5
|
+
* @param servicesGlob
|
|
6
|
+
*/
|
|
7
|
+
export const createServicePathMatch = (servicesGlob: string[]) => {
|
|
8
|
+
const servicePathGlobs = servicesGlob.reduce<
|
|
9
|
+
Record<'match' | 'ignore', string[]>
|
|
10
|
+
>(
|
|
11
|
+
(acc, glob) => {
|
|
12
|
+
glob.startsWith('!')
|
|
13
|
+
? acc.ignore.push(glob.slice(1))
|
|
14
|
+
: acc.match.push(glob);
|
|
15
|
+
return acc;
|
|
16
|
+
},
|
|
17
|
+
{
|
|
18
|
+
match: [],
|
|
19
|
+
ignore: [],
|
|
20
|
+
}
|
|
21
|
+
);
|
|
22
|
+
|
|
23
|
+
return function isServicePatchMatch(path: string) {
|
|
24
|
+
return micromatch.isMatch(path, servicePathGlobs.match, {
|
|
25
|
+
ignore: servicePathGlobs.ignore,
|
|
26
|
+
});
|
|
27
|
+
};
|
|
28
|
+
};
|
|
29
|
+
|
|
30
|
+
/**
|
|
31
|
+
* Parse services filter option to array
|
|
32
|
+
* @example
|
|
33
|
+
* ```ts
|
|
34
|
+
* parsePathGlobs('/user/**,/post/**')
|
|
35
|
+
* ```
|
|
36
|
+
* @param endpointGlobs
|
|
37
|
+
*/
|
|
38
|
+
export function parsePathGlobs(endpointGlobs: string): string[] | undefined {
|
|
39
|
+
return endpointGlobs
|
|
40
|
+
? endpointGlobs
|
|
41
|
+
.split(',')
|
|
42
|
+
.filter((item: unknown): item is string =>
|
|
43
|
+
Boolean(typeof item === 'string' && item.trim())
|
|
44
|
+
)
|
|
45
|
+
: undefined;
|
|
46
|
+
}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
|
-
import
|
|
1
|
+
import { type OpenAPI3 } from 'openapi-typescript/src/types.js';
|
|
2
2
|
|
|
3
|
-
import
|
|
3
|
+
import { createServicePathMatch } from './createServicePathMatch.js';
|
|
4
4
|
|
|
5
5
|
/**
|
|
6
6
|
* Filter the schema to only include paths that match the servicesGlob
|
|
@@ -13,9 +13,9 @@ import type { OpenAPISchemaType } from './open-api/OpenAPISchemaType.js';
|
|
|
13
13
|
* ```
|
|
14
14
|
*/
|
|
15
15
|
export const filterDocumentPaths = (
|
|
16
|
-
schema:
|
|
16
|
+
schema: OpenAPI3,
|
|
17
17
|
servicesGlob: string[] | undefined
|
|
18
|
-
) => {
|
|
18
|
+
): OpenAPI3 => {
|
|
19
19
|
if (!servicesGlob) return schema;
|
|
20
20
|
|
|
21
21
|
const isPathMatch = createServicePathMatch(servicesGlob);
|
|
@@ -29,30 +29,3 @@ export const filterDocumentPaths = (
|
|
|
29
29
|
|
|
30
30
|
return { ...schema, paths };
|
|
31
31
|
};
|
|
32
|
-
|
|
33
|
-
/**
|
|
34
|
-
* Create a function to match service paths
|
|
35
|
-
* @param servicesGlob
|
|
36
|
-
*/
|
|
37
|
-
export const createServicePathMatch = (servicesGlob: string[]) => {
|
|
38
|
-
const servicePathGlobs = servicesGlob.reduce<
|
|
39
|
-
Record<'match' | 'ignore', string[]>
|
|
40
|
-
>(
|
|
41
|
-
(acc, glob) => {
|
|
42
|
-
glob.startsWith('!')
|
|
43
|
-
? acc.ignore.push(glob.slice(1))
|
|
44
|
-
: acc.match.push(glob);
|
|
45
|
-
return acc;
|
|
46
|
-
},
|
|
47
|
-
{
|
|
48
|
-
match: [],
|
|
49
|
-
ignore: [],
|
|
50
|
-
}
|
|
51
|
-
);
|
|
52
|
-
|
|
53
|
-
return function isServicePatchMatch(path: string) {
|
|
54
|
-
return micromatch.isMatch(path, servicePathGlobs.match, {
|
|
55
|
-
ignore: servicePathGlobs.ignore,
|
|
56
|
-
});
|
|
57
|
-
};
|
|
58
|
-
};
|
|
@@ -4,8 +4,6 @@ import type { Readable } from 'node:stream';
|
|
|
4
4
|
import type { OpenAPI3 } from 'openapi-typescript';
|
|
5
5
|
import { validateAndBundle } from 'openapi-typescript/dist/lib/redoc.js';
|
|
6
6
|
|
|
7
|
-
import { OpenAPISchemaType } from './OpenAPISchemaType.js';
|
|
8
|
-
|
|
9
7
|
export const readSchema = async (
|
|
10
8
|
source: string | URL | OpenAPI3 | Readable | Buffer
|
|
11
9
|
) => {
|
|
@@ -23,5 +21,5 @@ export const readSchema = async (
|
|
|
23
21
|
silent: false,
|
|
24
22
|
});
|
|
25
23
|
|
|
26
|
-
return parsed as
|
|
24
|
+
return parsed as OpenAPI3;
|
|
27
25
|
};
|
|
@@ -0,0 +1,311 @@
|
|
|
1
|
+
import { OperationObject, ParameterObject } from 'openapi-typescript';
|
|
2
|
+
import {
|
|
3
|
+
type OpenAPI3,
|
|
4
|
+
PathItemObject,
|
|
5
|
+
ReferenceObject,
|
|
6
|
+
} from 'openapi-typescript/src/types.js';
|
|
7
|
+
|
|
8
|
+
import {
|
|
9
|
+
createServicePathMatch,
|
|
10
|
+
parsePathGlobs,
|
|
11
|
+
} from './createServicePathMatch.js';
|
|
12
|
+
|
|
13
|
+
export function predefineSchemaParameters(
|
|
14
|
+
schema: OpenAPI3,
|
|
15
|
+
predefinedParametersGlobMap: PredefinedParametersGlobMap
|
|
16
|
+
): OpenAPI3 {
|
|
17
|
+
const predefinedSchemaPaths: typeof schema.paths = {};
|
|
18
|
+
|
|
19
|
+
for (const path in schema.paths) {
|
|
20
|
+
if (!Object.prototype.hasOwnProperty.call(schema.paths, path)) continue;
|
|
21
|
+
|
|
22
|
+
const service = schema.paths[path];
|
|
23
|
+
|
|
24
|
+
assertIsPathItemObject(service);
|
|
25
|
+
|
|
26
|
+
predefinedSchemaPaths[path] = { ...service };
|
|
27
|
+
|
|
28
|
+
for (const _method in service) {
|
|
29
|
+
const method = _method as keyof typeof service;
|
|
30
|
+
if (!Object.prototype.hasOwnProperty.call(service, method)) continue;
|
|
31
|
+
|
|
32
|
+
const operation = service[method];
|
|
33
|
+
assertIsOperationObject(operation);
|
|
34
|
+
|
|
35
|
+
for (const predefinedParametersGlob of Object.values(
|
|
36
|
+
predefinedParametersGlobMap
|
|
37
|
+
)) {
|
|
38
|
+
if (!predefinedParametersGlob.paths.includes(path)) {
|
|
39
|
+
continue;
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
const predefinedPathItem = predefinedSchemaPaths[path];
|
|
43
|
+
if (predefinedPathItem) assertIsPathItemObject(predefinedPathItem);
|
|
44
|
+
const predefinedOperation = predefinedPathItem?.[method];
|
|
45
|
+
if (predefinedOperation) assertIsOperationObject(predefinedOperation);
|
|
46
|
+
|
|
47
|
+
const operationParameters =
|
|
48
|
+
predefinedOperation?.parameters ?? operation.parameters ?? [];
|
|
49
|
+
|
|
50
|
+
assertIsParameterObjects(operationParameters);
|
|
51
|
+
|
|
52
|
+
const predefinedParameters = operationParameters.map(
|
|
53
|
+
(operationParameter) => {
|
|
54
|
+
if (
|
|
55
|
+
findPredefinedOperationParameter(
|
|
56
|
+
operationParameter,
|
|
57
|
+
predefinedParametersGlob.parameters
|
|
58
|
+
)
|
|
59
|
+
) {
|
|
60
|
+
return {
|
|
61
|
+
...operationParameter,
|
|
62
|
+
required: false,
|
|
63
|
+
};
|
|
64
|
+
}
|
|
65
|
+
|
|
66
|
+
return operationParameter;
|
|
67
|
+
}
|
|
68
|
+
);
|
|
69
|
+
|
|
70
|
+
Object.assign(predefinedSchemaPaths[path], {
|
|
71
|
+
[method]: {
|
|
72
|
+
...operation,
|
|
73
|
+
parameters: predefinedParameters,
|
|
74
|
+
},
|
|
75
|
+
});
|
|
76
|
+
}
|
|
77
|
+
}
|
|
78
|
+
}
|
|
79
|
+
|
|
80
|
+
return {
|
|
81
|
+
...schema,
|
|
82
|
+
paths: predefinedSchemaPaths,
|
|
83
|
+
};
|
|
84
|
+
}
|
|
85
|
+
|
|
86
|
+
type PredefinedParametersOptionMap = Record<
|
|
87
|
+
string,
|
|
88
|
+
Pick<ParameterObject, 'in' | 'name'>[]
|
|
89
|
+
>;
|
|
90
|
+
|
|
91
|
+
/**
|
|
92
|
+
* Parses the given configuration string into a structured format.
|
|
93
|
+
*
|
|
94
|
+
* @param optionItems - The configuration string to parse. Eg. `/foo,/bar/**:header.x-monite-version,query.x-api-key`.
|
|
95
|
+
* @returns The parsed configuration.
|
|
96
|
+
*
|
|
97
|
+
* @example
|
|
98
|
+
* ```ts
|
|
99
|
+
* const parsedConfig = parseOperationPredefinedParametersOption("/foo,/bar/**:header.x-monite-version,query.x-api-key");
|
|
100
|
+
* ```
|
|
101
|
+
*/
|
|
102
|
+
function parseOperationPredefinedParametersOption(
|
|
103
|
+
...optionItems: string[]
|
|
104
|
+
): PredefinedParametersOptionMap {
|
|
105
|
+
const globParametersMap: PredefinedParametersOptionMap = {};
|
|
106
|
+
|
|
107
|
+
for (const optionItem of optionItems) {
|
|
108
|
+
const [pathGlob, options] = optionItem.split(':').map((s) => s.trim());
|
|
109
|
+
const parameters: Record<'header' | 'query' | 'cookie', string[]> = {
|
|
110
|
+
header: [],
|
|
111
|
+
query: [],
|
|
112
|
+
cookie: [],
|
|
113
|
+
};
|
|
114
|
+
|
|
115
|
+
if (options) {
|
|
116
|
+
options
|
|
117
|
+
.split(',')
|
|
118
|
+
.map((option) => option.trim())
|
|
119
|
+
.filter(Boolean)
|
|
120
|
+
.forEach((option) => {
|
|
121
|
+
const [type, key] = option.split('.').map((s) => s.trim());
|
|
122
|
+
|
|
123
|
+
if (type !== 'header' && type !== 'query' && type !== 'cookie')
|
|
124
|
+
throw new Error(
|
|
125
|
+
`Invalid option type: ${type} in ${option}. Must be one of 'header', 'query', or 'cookie'`
|
|
126
|
+
);
|
|
127
|
+
|
|
128
|
+
if (!parameters[type].includes(key)) parameters[type].push(key);
|
|
129
|
+
});
|
|
130
|
+
}
|
|
131
|
+
|
|
132
|
+
if (pathGlob in globParametersMap) {
|
|
133
|
+
throw new Error(`Duplicate path: ${pathGlob} in config string.`);
|
|
134
|
+
}
|
|
135
|
+
|
|
136
|
+
globParametersMap[pathGlob] = Object.entries(parameters).flatMap(
|
|
137
|
+
([inLocation, names]) =>
|
|
138
|
+
names.map((name) => ({ in: inLocation as ParameterObject['in'], name }))
|
|
139
|
+
);
|
|
140
|
+
}
|
|
141
|
+
|
|
142
|
+
return globParametersMap;
|
|
143
|
+
}
|
|
144
|
+
|
|
145
|
+
type PredefinedParametersGlobMap = {
|
|
146
|
+
[glob: string]: {
|
|
147
|
+
paths: string[];
|
|
148
|
+
parameters: ParameterObject[];
|
|
149
|
+
errors: string[];
|
|
150
|
+
};
|
|
151
|
+
};
|
|
152
|
+
|
|
153
|
+
export function createPredefinedParametersGlobMap(
|
|
154
|
+
schema: OpenAPI3,
|
|
155
|
+
predefinedParameters: PredefinedParametersOptionMap
|
|
156
|
+
): PredefinedParametersGlobMap {
|
|
157
|
+
const predefinedParametersGlobMap: PredefinedParametersGlobMap = {};
|
|
158
|
+
|
|
159
|
+
const servicePredefinedParametersList = Object.entries(
|
|
160
|
+
predefinedParameters
|
|
161
|
+
).map(([pathGlobs, parameters]) => {
|
|
162
|
+
const globs = parsePathGlobs(pathGlobs);
|
|
163
|
+
if (!globs)
|
|
164
|
+
throw new Error(
|
|
165
|
+
`Invalid path glob: ${pathGlobs}. Must be a comma-separated list of globs.`
|
|
166
|
+
);
|
|
167
|
+
|
|
168
|
+
return {
|
|
169
|
+
pathGlobs,
|
|
170
|
+
parameters,
|
|
171
|
+
isPathMatch: createServicePathMatch(globs),
|
|
172
|
+
};
|
|
173
|
+
});
|
|
174
|
+
|
|
175
|
+
for (const path in schema.paths) {
|
|
176
|
+
if (!Object.prototype.hasOwnProperty.call(schema.paths, path)) continue;
|
|
177
|
+
for (const {
|
|
178
|
+
pathGlobs,
|
|
179
|
+
parameters: parametersToPredefine,
|
|
180
|
+
isPathMatch,
|
|
181
|
+
} of servicePredefinedParametersList) {
|
|
182
|
+
if (!isPathMatch(path)) continue;
|
|
183
|
+
|
|
184
|
+
const service = schema.paths[path];
|
|
185
|
+
|
|
186
|
+
assertIsPathItemObject(service);
|
|
187
|
+
|
|
188
|
+
for (const _method in service) {
|
|
189
|
+
const method = _method as keyof typeof service;
|
|
190
|
+
if (!Object.prototype.hasOwnProperty.call(service, method)) continue;
|
|
191
|
+
|
|
192
|
+
const operation = service[method];
|
|
193
|
+
assertIsOperationObject(operation);
|
|
194
|
+
|
|
195
|
+
const operationParameters = operation.parameters ?? [];
|
|
196
|
+
assertIsParameterObjects(operationParameters);
|
|
197
|
+
|
|
198
|
+
if (!(pathGlobs in predefinedParametersGlobMap))
|
|
199
|
+
predefinedParametersGlobMap[pathGlobs] = {
|
|
200
|
+
paths: [],
|
|
201
|
+
parameters: [],
|
|
202
|
+
errors: [],
|
|
203
|
+
};
|
|
204
|
+
|
|
205
|
+
const predefinedPathGlob = predefinedParametersGlobMap[pathGlobs];
|
|
206
|
+
|
|
207
|
+
for (const parameterSchemaToPredefine of parametersToPredefine) {
|
|
208
|
+
const parameterToPredefine = findPredefinedOperationParameter(
|
|
209
|
+
parameterSchemaToPredefine,
|
|
210
|
+
operationParameters
|
|
211
|
+
);
|
|
212
|
+
|
|
213
|
+
if (!parameterToPredefine) {
|
|
214
|
+
predefinedPathGlob.errors.push(
|
|
215
|
+
`Missing predefined parameter '${parameterSchemaToPredefine.in}' '${parameterSchemaToPredefine.name}' in '${method} ${path}' in '${pathGlobs}'`
|
|
216
|
+
);
|
|
217
|
+
|
|
218
|
+
continue;
|
|
219
|
+
}
|
|
220
|
+
|
|
221
|
+
const existingParameterToPredefine = findPredefinedOperationParameter(
|
|
222
|
+
parameterToPredefine,
|
|
223
|
+
predefinedPathGlob.parameters
|
|
224
|
+
);
|
|
225
|
+
|
|
226
|
+
if (existingParameterToPredefine) {
|
|
227
|
+
if (
|
|
228
|
+
!shallowEqualParameterTypes(
|
|
229
|
+
parameterToPredefine,
|
|
230
|
+
existingParameterToPredefine
|
|
231
|
+
)
|
|
232
|
+
) {
|
|
233
|
+
predefinedPathGlob.errors.push(
|
|
234
|
+
`Parameter '${parameterSchemaToPredefine.in}' '${parameterToPredefine.name}' in '${method} ${path}' has conflicting types with predefined parameter '${parameterToPredefine.name}' in '${pathGlobs}'`
|
|
235
|
+
);
|
|
236
|
+
} else {
|
|
237
|
+
if (!predefinedPathGlob.paths.includes(path))
|
|
238
|
+
predefinedPathGlob.paths.push(path);
|
|
239
|
+
}
|
|
240
|
+
} else {
|
|
241
|
+
predefinedPathGlob.parameters.push(parameterToPredefine);
|
|
242
|
+
if (!predefinedPathGlob.paths.includes(path))
|
|
243
|
+
predefinedPathGlob.paths.push(path);
|
|
244
|
+
}
|
|
245
|
+
}
|
|
246
|
+
}
|
|
247
|
+
}
|
|
248
|
+
}
|
|
249
|
+
|
|
250
|
+
Object.entries(predefinedParameters).forEach(([pathGlobs]) => {
|
|
251
|
+
if (!predefinedParametersGlobMap[pathGlobs]) {
|
|
252
|
+
predefinedParametersGlobMap[pathGlobs] = {
|
|
253
|
+
paths: [],
|
|
254
|
+
parameters: [],
|
|
255
|
+
errors: [`No matching paths found for '${pathGlobs}'`],
|
|
256
|
+
};
|
|
257
|
+
}
|
|
258
|
+
});
|
|
259
|
+
|
|
260
|
+
return predefinedParametersGlobMap;
|
|
261
|
+
}
|
|
262
|
+
|
|
263
|
+
function findPredefinedOperationParameter(
|
|
264
|
+
parameterSchemaToPredefine: { in: string; name: string },
|
|
265
|
+
operationParameters: Array<ParameterObject>
|
|
266
|
+
) {
|
|
267
|
+
return operationParameters.find(
|
|
268
|
+
(operationParameter) =>
|
|
269
|
+
operationParameter.in === parameterSchemaToPredefine.in &&
|
|
270
|
+
operationParameter.name === parameterSchemaToPredefine.name
|
|
271
|
+
);
|
|
272
|
+
}
|
|
273
|
+
|
|
274
|
+
function shallowEqualParameterTypes(a: ParameterObject, b: ParameterObject) {
|
|
275
|
+
if ('schema' in a || 'schema' in b)
|
|
276
|
+
return 'schema' in a && 'schema' in b && a.schema?.type === b.schema?.type;
|
|
277
|
+
}
|
|
278
|
+
|
|
279
|
+
function assertIsPathItemObject(
|
|
280
|
+
pathItem: PathItemObject | ReferenceObject
|
|
281
|
+
): asserts pathItem is PathItemObject {
|
|
282
|
+
if ('$ref' in pathItem) {
|
|
283
|
+
throw new Error(
|
|
284
|
+
`Expected a PathItemObject, but got a ReferenceObject: ${pathItem}`
|
|
285
|
+
);
|
|
286
|
+
}
|
|
287
|
+
}
|
|
288
|
+
|
|
289
|
+
export function assertIsOperationObject(
|
|
290
|
+
operationItem: OperationObject | ReferenceObject
|
|
291
|
+
): asserts operationItem is OperationObject {
|
|
292
|
+
if ('$ref' in operationItem) {
|
|
293
|
+
throw new Error(
|
|
294
|
+
`Expected a OperationObject, but got a ReferenceObject: ${operationItem}`
|
|
295
|
+
);
|
|
296
|
+
}
|
|
297
|
+
}
|
|
298
|
+
|
|
299
|
+
export function assertIsParameterObjects(
|
|
300
|
+
parameterObjects: Array<ParameterObject | ReferenceObject>
|
|
301
|
+
): asserts parameterObjects is Array<ParameterObject> {
|
|
302
|
+
parameterObjects.forEach((parameterObject) => {
|
|
303
|
+
if ('$ref' in parameterObject) {
|
|
304
|
+
throw new Error(
|
|
305
|
+
`Expected a ParameterObject, but got a ReferenceObject: ${parameterObject}`
|
|
306
|
+
);
|
|
307
|
+
}
|
|
308
|
+
});
|
|
309
|
+
}
|
|
310
|
+
|
|
311
|
+
export { parseOperationPredefinedParametersOption };
|