ts-openapi-codegen 1.0.0-beta.4 → 1.0.0-beta.5
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/README.md +35 -1
- package/dist/cli/index.js +2 -1
- package/dist/common/Options.d.ts +1 -0
- package/dist/common/Options.d.ts.map +1 -1
- package/dist/common/__tests__/mergeObjectSchemas.test.js +1 -1
- package/dist/core/Context.d.ts +10 -1
- package/dist/core/Context.d.ts.map +1 -1
- package/dist/core/Context.js +8 -1
- package/dist/core/api/v2/parser/__tests__/getType.test.js +3 -3
- package/dist/core/api/v2/parser/getOperationParameters.d.ts.map +1 -1
- package/dist/core/api/v2/parser/getOperationParameters.js +9 -7
- package/dist/core/api/v3/parser/__tests__/getType.test.js +3 -3
- package/dist/core/api/v3/parser/getOperation.d.ts.map +1 -1
- package/dist/core/api/v3/parser/getOperation.js +4 -2
- package/dist/core/api/v3/parser/getOperationParameters.d.ts.map +1 -1
- package/dist/core/api/v3/parser/getOperationParameters.js +9 -7
- package/dist/core/index.d.ts.map +1 -1
- package/dist/core/index.js +3 -2
- package/dist/core/types/Consts.d.ts +10 -0
- package/dist/core/types/Consts.d.ts.map +1 -1
- package/dist/core/types/Consts.js +11 -1
- package/dist/core/types/Models.d.ts +3 -0
- package/dist/core/types/Models.d.ts.map +1 -1
- package/dist/core/utils/__mocks__/createOperationParameter.d.ts +3 -0
- package/dist/core/utils/__mocks__/createOperationParameter.d.ts.map +1 -0
- package/dist/core/utils/__mocks__/createOperationParameter.js +28 -0
- package/dist/core/utils/__tests__/sortByRequiredExtended.test.d.ts +2 -0
- package/dist/core/utils/__tests__/sortByRequiredExtended.test.d.ts.map +1 -0
- package/dist/core/utils/__tests__/sortByRequiredExtended.test.js +145 -0
- package/dist/core/utils/__tests__/sortByRequiredSimple.test.d.ts +2 -0
- package/dist/core/utils/__tests__/sortByRequiredSimple.test.d.ts.map +1 -0
- package/dist/core/utils/__tests__/sortByRequiredSimple.test.js +80 -0
- package/dist/core/utils/__tests__/writeClient.test.js +3 -3
- package/dist/core/utils/__tests__/writeClientCore.test.js +2 -2
- package/dist/core/utils/__tests__/writeClientIndex.test.js +2 -2
- package/dist/core/utils/__tests__/writeClientModels.test.js +2 -2
- package/dist/core/utils/__tests__/writeClientSchemas.test.js +2 -2
- package/dist/core/utils/__tests__/writeClientServices.test.js +2 -2
- package/dist/core/utils/getOpenApiSpec.d.ts.map +1 -1
- package/dist/core/utils/getOpenApiSpec.js +0 -7
- package/dist/core/utils/getPropertyGroupExtended.d.ts +4 -0
- package/dist/core/utils/getPropertyGroupExtended.d.ts.map +1 -0
- package/dist/core/utils/getPropertyGroupExtended.js +10 -0
- package/dist/core/utils/getPropertyGroupSimple.d.ts +3 -0
- package/dist/core/utils/getPropertyGroupSimple.d.ts.map +1 -0
- package/dist/core/utils/getPropertyGroupSimple.js +9 -0
- package/dist/core/utils/precompileTemplates.js +1 -1
- package/dist/core/utils/sortByRequiredExtended.d.ts +3 -0
- package/dist/core/utils/sortByRequiredExtended.d.ts.map +1 -0
- package/dist/core/utils/sortByRequiredExtended.js +15 -0
- package/dist/core/utils/sortByRequiredSimple.d.ts +3 -0
- package/dist/core/utils/sortByRequiredSimple.d.ts.map +1 -0
- package/dist/core/utils/sortByRequiredSimple.js +10 -0
- package/package.json +1 -1
- package/dist/core/utils/__tests__/sortByRequired.test.d.ts +0 -2
- package/dist/core/utils/__tests__/sortByRequired.test.d.ts.map +0 -1
- package/dist/core/utils/__tests__/sortByRequired.test.js +0 -108
- package/dist/core/utils/sortByRequired.d.ts +0 -3
- package/dist/core/utils/sortByRequired.d.ts.map +0 -1
- package/dist/core/utils/sortByRequired.js +0 -18
package/README.md
CHANGED
|
@@ -57,7 +57,7 @@ $ openapi --help
|
|
|
57
57
|
-os, --outputServices <value> Output directory for services
|
|
58
58
|
-om, --outputModels <value> Output directory for models
|
|
59
59
|
-osm, --outputSchemas <value> Output directory for schemas
|
|
60
|
-
-c, --
|
|
60
|
+
-c, --httpClient <value> HTTP client to generate [fetch, xhr, node] (default: "fetch")
|
|
61
61
|
--useOptions <value> Use options instead of arguments (default: false)
|
|
62
62
|
--useUnionTypes <value> Use union types instead of enums (default: false)
|
|
63
63
|
--exportCore <value> Write core files to disk (default: true)
|
|
@@ -69,6 +69,7 @@ $ openapi --help
|
|
|
69
69
|
--enumPrefix <value> Prefix for enum model(default: "E")
|
|
70
70
|
--typePrefix <value> Prefix for type model(default: "T")
|
|
71
71
|
--useCancelableRequest Use cancelled promise as returned data type in request(default: false)
|
|
72
|
+
-s, --sortByRequired Property sorting strategy: simplified or extended
|
|
72
73
|
|
|
73
74
|
Examples
|
|
74
75
|
$ openapi --input ./spec.json
|
|
@@ -389,6 +390,39 @@ const MyForm = () => (
|
|
|
389
390
|
|
|
390
391
|
```
|
|
391
392
|
|
|
393
|
+
### Cancelable promise `--useCancelableRequest`
|
|
394
|
+
By default, the OpenAPI generator generates services for accessing the API that use non-cancellable requests. Therefore, we have added the ability to switch the generator to generate canceled API requests. To do this, use the flag `--useCancelableRequest`.
|
|
395
|
+
An example of a cancelled request would look like this:
|
|
396
|
+
|
|
397
|
+
```typescript
|
|
398
|
+
export function request<T>(config: TOpenAPIConfig, options: ApiRequestOptions): CancelablePromise<T> {
|
|
399
|
+
return new CancelablePromise(async(resolve, reject, onCancel) => {
|
|
400
|
+
const url = `${config.BASE}${options.path}`.replace('{api-version}', config.VERSION);
|
|
401
|
+
try {
|
|
402
|
+
if (!onCancel.isCancelled) {
|
|
403
|
+
const response = await sendRequest(options, url, config, onCancel);
|
|
404
|
+
const responseBody = await getResponseBody(response);
|
|
405
|
+
const responseHeader = getResponseHeader(response, options.responseHeader);
|
|
406
|
+
const result: ApiResult = {
|
|
407
|
+
url,
|
|
408
|
+
ok: response.ok,
|
|
409
|
+
status: response.status,
|
|
410
|
+
statusText: response.statusText,
|
|
411
|
+
body: responseHeader || responseBody,
|
|
412
|
+
};
|
|
413
|
+
|
|
414
|
+
catchErrors(options, result);
|
|
415
|
+
resolve(result.body);
|
|
416
|
+
}
|
|
417
|
+
} catch (e) {
|
|
418
|
+
reject(e);
|
|
419
|
+
}
|
|
420
|
+
});
|
|
421
|
+
}
|
|
422
|
+
```
|
|
423
|
+
|
|
424
|
+
### Sorting strategy for function arguments `--sortByRequired`
|
|
425
|
+
By default, the OpenAPI generator sorts the parameters of service functions according to a simplified scheme. If you need a more strict sorting option, then you need to use the sortByRequired flag. The simplified sorting option is similar to the one used in version 0.2.3 of the OpenAPI generator. This flag allows you to upgrade to a new version of the generator if you are "stuck" on version 0.2.3.
|
|
392
426
|
|
|
393
427
|
### Enum with custom names and descriptions
|
|
394
428
|
You can use `x-enum-varnames` and `x-enum-descriptions` in your spec to generate enum with custom names and descriptions.
|
package/dist/cli/index.js
CHANGED
|
@@ -7,7 +7,7 @@ const runGenerateOpenApi_1 = require("./generate/runGenerateOpenApi");
|
|
|
7
7
|
const APP_NAME = 'ts-openapi-codegen-cli';
|
|
8
8
|
const APP_VERSION = '1.0.0';
|
|
9
9
|
const program = new commander_1.Command();
|
|
10
|
-
program.version(APP_VERSION).name(APP_NAME).description('
|
|
10
|
+
program.version(APP_VERSION).name(APP_NAME).description('Description').addHelpText('before', 'Additional text');
|
|
11
11
|
program
|
|
12
12
|
.command('generate')
|
|
13
13
|
.usage('[options]')
|
|
@@ -33,6 +33,7 @@ program
|
|
|
33
33
|
.option('--useCancelableRequest <value>', 'Use cancelled promise as returned data type in request(default: false)', false)
|
|
34
34
|
.addOption(new commander_1.Option('-l, --logLevel <level>', 'Logging level').choices([...Object.values(Enums_1.ELogLevel)]).default(Enums_1.ELogLevel.ERROR))
|
|
35
35
|
.addOption(new commander_1.Option('-t, --logTarget <target>', 'Target of logging').choices([...Object.values(Enums_1.ELogOutput)]).default(Enums_1.ELogOutput.CONSOLE))
|
|
36
|
+
.option('-s, --sortByRequired', 'Property sorting strategy: simplified or extended')
|
|
36
37
|
.action(async (options) => {
|
|
37
38
|
await (0, runGenerateOpenApi_1.runGenerateOpenApi)(options);
|
|
38
39
|
});
|
package/dist/common/Options.d.ts
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Options.d.ts","sourceRoot":"","sources":["../../src/common/Options.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,qBAAqB,CAAC;AAEjD,MAAM,MAAM,QAAQ,GAAG;IACnB,KAAK,EAAE,MAAM,GAAG,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;IACpC,MAAM,EAAE,MAAM,CAAC;IACf,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,UAAU,CAAC,EAAE,UAAU,CAAC;IACxB,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,aAAa,CAAC,EAAE,OAAO,CAAC;IACxB,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,cAAc,CAAC,EAAE,OAAO,CAAC;IACzB,YAAY,CAAC,EAAE,OAAO,CAAC;IACvB,aAAa,CAAC,EAAE,OAAO,CAAC;IACxB,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,oBAAoB,CAAC,EAAE,OAAO,CAAC;
|
|
1
|
+
{"version":3,"file":"Options.d.ts","sourceRoot":"","sources":["../../src/common/Options.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,qBAAqB,CAAC;AAEjD,MAAM,MAAM,QAAQ,GAAG;IACnB,KAAK,EAAE,MAAM,GAAG,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;IACpC,MAAM,EAAE,MAAM,CAAC;IACf,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,UAAU,CAAC,EAAE,UAAU,CAAC;IACxB,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,aAAa,CAAC,EAAE,OAAO,CAAC;IACxB,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,cAAc,CAAC,EAAE,OAAO,CAAC;IACzB,YAAY,CAAC,EAAE,OAAO,CAAC;IACvB,aAAa,CAAC,EAAE,OAAO,CAAC;IACxB,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,oBAAoB,CAAC,EAAE,OAAO,CAAC;IAC/B,cAAc,CAAC,EAAE,OAAO,CAAC;CAC5B,CAAC;AAEF,MAAM,MAAM,aAAa,GAAG;IAC1B,KAAK,EAAE,QAAQ,EAAE,CAAC;CACnB,GAAG,IAAI,CAAC,QAAQ,EAAE,OAAO,GAAG,QAAQ,CAAC,CAAC"}
|
|
@@ -27,7 +27,7 @@ const mergeObjectSchemas_1 = require("../VersionedSchema/Utils/mergeObjectSchema
|
|
|
27
27
|
};
|
|
28
28
|
const invalidData = {
|
|
29
29
|
input: 'source/path',
|
|
30
|
-
httpClient: 'invalid-client',
|
|
30
|
+
httpClient: 'invalid-client',
|
|
31
31
|
};
|
|
32
32
|
node_assert_1.default.equal(OptionsSchemaV2_1.optionsSchemaV2.validate(validData).error, null, 'Valid data should pass optionsSchemaV2 validation');
|
|
33
33
|
node_assert_1.default.notEqual(OptionsSchemaV2_1.optionsSchemaV2.validate(invalidData).error, null, 'Invalid data should fail optionsSchemaV2 validation');
|
package/dist/core/Context.d.ts
CHANGED
|
@@ -1,6 +1,12 @@
|
|
|
1
1
|
import { JSONSchema4Type, JSONSchema6Type, JSONSchema7Type } from 'json-schema';
|
|
2
2
|
import RefParser from 'json-schema-ref-parser';
|
|
3
3
|
import { IOutput, Prefix } from './types/Models';
|
|
4
|
+
type TContextProps = {
|
|
5
|
+
input: string | Record<string, any>;
|
|
6
|
+
output: IOutput;
|
|
7
|
+
prefix?: Prefix;
|
|
8
|
+
sortByRequired?: boolean;
|
|
9
|
+
};
|
|
4
10
|
/**
|
|
5
11
|
* A Context wich can share a data between methods
|
|
6
12
|
*/
|
|
@@ -9,7 +15,8 @@ export declare class Context {
|
|
|
9
15
|
private _root;
|
|
10
16
|
private _output;
|
|
11
17
|
prefix: Prefix;
|
|
12
|
-
|
|
18
|
+
private _sortByRequired;
|
|
19
|
+
constructor({ input, output, prefix, sortByRequired }: TContextProps);
|
|
13
20
|
addRefs(refs: RefParser.$Refs): Context;
|
|
14
21
|
values(...types: string[]): Record<string, any>;
|
|
15
22
|
get($ref: string): JSONSchema4Type | JSONSchema6Type | JSONSchema7Type;
|
|
@@ -17,5 +24,7 @@ export declare class Context {
|
|
|
17
24
|
exists($ref: string): boolean;
|
|
18
25
|
fileName(): string;
|
|
19
26
|
get output(): IOutput;
|
|
27
|
+
get sortByRequired(): boolean;
|
|
20
28
|
}
|
|
29
|
+
export {};
|
|
21
30
|
//# sourceMappingURL=Context.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Context.d.ts","sourceRoot":"","sources":["../../src/core/Context.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,eAAe,EAAE,eAAe,EAAE,eAAe,EAAE,MAAM,aAAa,CAAC;AAChF,OAAO,SAAS,MAAM,wBAAwB,CAAC;AAE/C,OAAO,EAAS,OAAO,EAAE,MAAM,EAAE,MAAM,gBAAgB,CAAC;AAKxD;;GAEG;AACH,qBAAa,OAAO;IAChB,OAAO,CAAC,KAAK,CAA8B;IAC3C,OAAO,CAAC,KAAK,CAAoB;IACjC,OAAO,CAAC,OAAO,CAAU;IAClB,MAAM,EAAE,MAAM,CAInB;
|
|
1
|
+
{"version":3,"file":"Context.d.ts","sourceRoot":"","sources":["../../src/core/Context.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,eAAe,EAAE,eAAe,EAAE,eAAe,EAAE,MAAM,aAAa,CAAC;AAChF,OAAO,SAAS,MAAM,wBAAwB,CAAC;AAE/C,OAAO,EAAS,OAAO,EAAE,MAAM,EAAE,MAAM,gBAAgB,CAAC;AAKxD,KAAK,aAAa,GAAG;IACjB,KAAK,EAAE,MAAM,GAAG,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;IACpC,MAAM,EAAE,OAAO,CAAC;IAChB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,cAAc,CAAC,EAAE,OAAO,CAAC;CAC5B,CAAA;AAED;;GAEG;AACH,qBAAa,OAAO;IAChB,OAAO,CAAC,KAAK,CAA8B;IAC3C,OAAO,CAAC,KAAK,CAAoB;IACjC,OAAO,CAAC,OAAO,CAAU;IAClB,MAAM,EAAE,MAAM,CAInB;IAEF,OAAO,CAAC,eAAe,CAAkB;gBAE7B,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,cAAc,EAAE,EAAE,aAAa;IAmB7D,OAAO,CAAC,IAAI,EAAE,SAAS,CAAC,KAAK,GAAG,OAAO;IAKvC,MAAM,CAAC,GAAG,KAAK,EAAE,MAAM,EAAE,GAAG,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC;IAO/C,GAAG,CAAC,IAAI,EAAE,MAAM,GAAG,eAAe,GAAG,eAAe,GAAG,eAAe;IAOtE,KAAK,CAAC,GAAG,KAAK,EAAE,MAAM,EAAE,GAAG,MAAM,EAAE;IAOnC,MAAM,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO;IAO7B,QAAQ,IAAI,MAAM;IAOzB,IAAW,MAAM,YAKhB;IAED,IAAW,cAAc,YAExB;CACJ"}
|
package/dist/core/Context.js
CHANGED
|
@@ -16,7 +16,8 @@ class Context {
|
|
|
16
16
|
enum: 'E',
|
|
17
17
|
type: 'T',
|
|
18
18
|
};
|
|
19
|
-
|
|
19
|
+
_sortByRequired = false;
|
|
20
|
+
constructor({ input, output, prefix, sortByRequired }) {
|
|
20
21
|
this._output = output;
|
|
21
22
|
this._refs = {};
|
|
22
23
|
if ((0, isString_1.isString)(input)) {
|
|
@@ -28,6 +29,9 @@ class Context {
|
|
|
28
29
|
if (prefix) {
|
|
29
30
|
this.prefix = prefix;
|
|
30
31
|
}
|
|
32
|
+
if (sortByRequired !== undefined && sortByRequired !== null) {
|
|
33
|
+
this._sortByRequired = sortByRequired;
|
|
34
|
+
}
|
|
31
35
|
return this;
|
|
32
36
|
}
|
|
33
37
|
addRefs(refs) {
|
|
@@ -70,5 +74,8 @@ class Context {
|
|
|
70
74
|
}
|
|
71
75
|
return this._output;
|
|
72
76
|
}
|
|
77
|
+
get sortByRequired() {
|
|
78
|
+
return this._sortByRequired;
|
|
79
|
+
}
|
|
73
80
|
}
|
|
74
81
|
exports.Context = Context;
|
|
@@ -14,7 +14,7 @@ const Parser_1 = require("../../Parser");
|
|
|
14
14
|
// eslint-disable-next-line @typescript-eslint/ban-ts-comment
|
|
15
15
|
// @ts-ignore
|
|
16
16
|
const parser = new json_schema_ref_parser_1.default();
|
|
17
|
-
const context = new Context_1.Context('test/spec/v3.yml', (0, getOutputPaths_1.getOutputPaths)({ output: './generated' }));
|
|
17
|
+
const context = new Context_1.Context({ input: 'test/spec/v3.yml', output: (0, getOutputPaths_1.getOutputPaths)({ output: './generated' }) });
|
|
18
18
|
context.addRefs(await parser.resolve('test/spec/v3.yml'));
|
|
19
19
|
const type = new Parser_1.Parser(context).getType('int', '');
|
|
20
20
|
node_assert_1.default.strictEqual(type.type, 'number');
|
|
@@ -26,7 +26,7 @@ const Parser_1 = require("../../Parser");
|
|
|
26
26
|
// eslint-disable-next-line @typescript-eslint/ban-ts-comment
|
|
27
27
|
// @ts-ignore
|
|
28
28
|
const parser = new json_schema_ref_parser_1.default();
|
|
29
|
-
const context = new Context_1.Context('test/spec/v3.yml', (0, getOutputPaths_1.getOutputPaths)({ output: './generated' }));
|
|
29
|
+
const context = new Context_1.Context({ input: 'test/spec/v3.yml', output: (0, getOutputPaths_1.getOutputPaths)({ output: './generated' }) });
|
|
30
30
|
context.addRefs(await parser.resolve('test/spec/v3.yml'));
|
|
31
31
|
const type = new Parser_1.Parser(context).getType('schemas/ModelWithString.yml', '');
|
|
32
32
|
node_assert_1.default.strictEqual(type.type, 'IModelWithString');
|
|
@@ -53,7 +53,7 @@ const Parser_1 = require("../../Parser");
|
|
|
53
53
|
// eslint-disable-next-line @typescript-eslint/ban-ts-comment
|
|
54
54
|
// @ts-ignore
|
|
55
55
|
const parser = new json_schema_ref_parser_1.default();
|
|
56
|
-
const context = new Context_1.Context(object, (0, getOutputPaths_1.getOutputPaths)({ output: './generated' }));
|
|
56
|
+
const context = new Context_1.Context({ input: object, output: (0, getOutputPaths_1.getOutputPaths)({ output: './generated' }) });
|
|
57
57
|
context.addRefs(await parser.resolve(object));
|
|
58
58
|
const type = new Parser_1.Parser(context).getType('#/components/schemas/someSpecialSchema', '');
|
|
59
59
|
node_assert_1.default.strictEqual(type.type, 'ISomeSpecialSchema');
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"getOperationParameters.d.ts","sourceRoot":"","sources":["../../../../../src/core/api/v2/parser/getOperationParameters.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,iDAAiD,CAAC;
|
|
1
|
+
{"version":3,"file":"getOperationParameters.d.ts","sourceRoot":"","sources":["../../../../../src/core/api/v2/parser/getOperationParameters.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,iDAAiD,CAAC;AAG3F,OAAO,EAAE,MAAM,EAAE,MAAM,WAAW,CAAC;AACnC,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,wBAAwB,CAAC;AACtD,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,iCAAiC,CAAC;AAExE,wBAAgB,sBAAsB,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,EAAE,UAAU,EAAE,gBAAgB,EAAE,GAAG,mBAAmB,CA+D1H"}
|
|
@@ -1,7 +1,8 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
3
|
exports.getOperationParameters = getOperationParameters;
|
|
4
|
-
const
|
|
4
|
+
const sortByRequiredExtended_1 = require("../../../utils/sortByRequiredExtended");
|
|
5
|
+
const sortByRequiredSimple_1 = require("../../../utils/sortByRequiredSimple");
|
|
5
6
|
function getOperationParameters(openApi, parameters) {
|
|
6
7
|
const operationParameters = {
|
|
7
8
|
imports: [],
|
|
@@ -49,11 +50,12 @@ function getOperationParameters(openApi, parameters) {
|
|
|
49
50
|
}
|
|
50
51
|
}
|
|
51
52
|
});
|
|
52
|
-
|
|
53
|
-
operationParameters.
|
|
54
|
-
operationParameters.
|
|
55
|
-
operationParameters.
|
|
56
|
-
operationParameters.
|
|
57
|
-
operationParameters.
|
|
53
|
+
const sortByRequired = this.context.sortByRequired ? sortByRequiredExtended_1.sortByRequiredExtended : sortByRequiredSimple_1.sortByRequiredSimple;
|
|
54
|
+
operationParameters.parameters = operationParameters.parameters.sort(sortByRequired);
|
|
55
|
+
operationParameters.parametersPath = operationParameters.parametersPath.sort(sortByRequired);
|
|
56
|
+
operationParameters.parametersQuery = operationParameters.parametersQuery.sort(sortByRequired);
|
|
57
|
+
operationParameters.parametersForm = operationParameters.parametersForm.sort(sortByRequired);
|
|
58
|
+
operationParameters.parametersCookie = operationParameters.parametersCookie.sort(sortByRequired);
|
|
59
|
+
operationParameters.parametersHeader = operationParameters.parametersHeader.sort(sortByRequired);
|
|
58
60
|
return operationParameters;
|
|
59
61
|
}
|
|
@@ -14,7 +14,7 @@ const Parser_1 = require("../../Parser");
|
|
|
14
14
|
// eslint-disable-next-line @typescript-eslint/ban-ts-comment
|
|
15
15
|
// @ts-ignore
|
|
16
16
|
const parser = new json_schema_ref_parser_1.default();
|
|
17
|
-
const context = new Context_1.Context('test/spec/v3.yml', (0, getOutputPaths_1.getOutputPaths)({ output: './generated' }));
|
|
17
|
+
const context = new Context_1.Context({ input: 'test/spec/v3.yml', output: (0, getOutputPaths_1.getOutputPaths)({ output: './generated' }) });
|
|
18
18
|
context.addRefs(await parser.resolve('test/spec/v3.yml'));
|
|
19
19
|
const type = new Parser_1.Parser(context).getType('int', '');
|
|
20
20
|
node_assert_1.default.strictEqual(type.type, 'number');
|
|
@@ -26,7 +26,7 @@ const Parser_1 = require("../../Parser");
|
|
|
26
26
|
// eslint-disable-next-line @typescript-eslint/ban-ts-comment
|
|
27
27
|
// @ts-ignore
|
|
28
28
|
const parser = new json_schema_ref_parser_1.default();
|
|
29
|
-
const context = new Context_1.Context('test/spec/v3.yml', (0, getOutputPaths_1.getOutputPaths)({ output: './generated' }));
|
|
29
|
+
const context = new Context_1.Context({ input: 'test/spec/v3.yml', output: (0, getOutputPaths_1.getOutputPaths)({ output: './generated' }) });
|
|
30
30
|
context.addRefs(await parser.resolve('test/spec/v3.yml'));
|
|
31
31
|
const type = new Parser_1.Parser(context).getType('schemas/ModelWithString.yml', '');
|
|
32
32
|
node_assert_1.default.strictEqual(type.type, 'IModelWithString');
|
|
@@ -53,7 +53,7 @@ const Parser_1 = require("../../Parser");
|
|
|
53
53
|
// eslint-disable-next-line @typescript-eslint/ban-ts-comment
|
|
54
54
|
// @ts-ignore
|
|
55
55
|
const parser = new json_schema_ref_parser_1.default();
|
|
56
|
-
const context = new Context_1.Context(object, (0, getOutputPaths_1.getOutputPaths)({ output: './generated' }));
|
|
56
|
+
const context = new Context_1.Context({ input: object, output: (0, getOutputPaths_1.getOutputPaths)({ output: './generated' }) });
|
|
57
57
|
context.addRefs(await parser.resolve(object));
|
|
58
58
|
const type = new Parser_1.Parser(context).getType('#/components/schemas/someSpecialSchema', '');
|
|
59
59
|
node_assert_1.default.strictEqual(type.type, 'ISomeSpecialSchema');
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"getOperation.d.ts","sourceRoot":"","sources":["../../../../../src/core/api/v3/parser/getOperation.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,uCAAuC,CAAC;AACvE,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,iDAAiD,CAAC;
|
|
1
|
+
{"version":3,"file":"getOperation.d.ts","sourceRoot":"","sources":["../../../../../src/core/api/v3/parser/getOperation.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,uCAAuC,CAAC;AACvE,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,iDAAiD,CAAC;AAS3F,OAAO,EAAE,MAAM,EAAE,MAAM,WAAW,CAAC;AACnC,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,wBAAwB,CAAC;AACtD,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,iCAAiC,CAAC;AAGxE,wBAAgB,YAAY,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,EAAE,GAAG,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,EAAE,EAAE,gBAAgB,EAAE,UAAU,EAAE,mBAAmB,EAAE,gBAAgB,EAAE,MAAM,GAAG,SAAS,CAgEpL"}
|
|
@@ -7,7 +7,8 @@ const getOperationName_1 = require("../../../utils/getOperationName");
|
|
|
7
7
|
const getOperationPath_1 = require("../../../utils/getOperationPath");
|
|
8
8
|
const getOperationResponseHeader_1 = require("../../../utils/getOperationResponseHeader");
|
|
9
9
|
const getOperationResults_1 = require("../../../utils/getOperationResults");
|
|
10
|
-
const
|
|
10
|
+
const sortByRequiredExtended_1 = require("../../../utils/sortByRequiredExtended");
|
|
11
|
+
const sortByRequiredSimple_1 = require("../../../utils/sortByRequiredSimple");
|
|
11
12
|
function getOperation(openApi, url, method, op, pathParams, serviceClassName) {
|
|
12
13
|
const operationNameFallback = `${method}${serviceClassName}`;
|
|
13
14
|
const operationName = (0, getOperationName_1.getOperationName)(op.operationId || operationNameFallback);
|
|
@@ -46,11 +47,12 @@ function getOperation(openApi, url, method, op, pathParams, serviceClassName) {
|
|
|
46
47
|
operation.parametersBody = parameters.parametersBody;
|
|
47
48
|
}
|
|
48
49
|
if (op.requestBody) {
|
|
50
|
+
const sortByRequired = this.context.sortByRequired ? sortByRequiredExtended_1.sortByRequiredExtended : sortByRequiredSimple_1.sortByRequiredSimple;
|
|
49
51
|
const requestBodyDef = (op.requestBody.$ref ? this.context.get(op.requestBody.$ref) : op.requestBody);
|
|
50
52
|
const requestBody = this.getOperationRequestBody(openApi, requestBodyDef, '');
|
|
51
53
|
operation.imports.push(...requestBody.imports);
|
|
52
54
|
operation.parameters.push(requestBody);
|
|
53
|
-
operation.parameters = operation.parameters.sort(
|
|
55
|
+
operation.parameters = operation.parameters.sort(sortByRequired);
|
|
54
56
|
operation.parametersBody = requestBody;
|
|
55
57
|
}
|
|
56
58
|
// Parse the operation responses.
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"getOperationParameters.d.ts","sourceRoot":"","sources":["../../../../../src/core/api/v3/parser/getOperationParameters.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,iDAAiD,CAAC;
|
|
1
|
+
{"version":3,"file":"getOperationParameters.d.ts","sourceRoot":"","sources":["../../../../../src/core/api/v3/parser/getOperationParameters.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,iDAAiD,CAAC;AAG3F,OAAO,EAAE,MAAM,EAAE,MAAM,WAAW,CAAC;AACnC,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,wBAAwB,CAAC;AACtD,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,iCAAiC,CAAC;AAExE,wBAAgB,sBAAsB,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,EAAE,UAAU,EAAE,gBAAgB,EAAE,GAAG,mBAAmB,CAgE1H"}
|
|
@@ -1,7 +1,8 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
3
|
exports.getOperationParameters = getOperationParameters;
|
|
4
|
-
const
|
|
4
|
+
const sortByRequiredExtended_1 = require("../../../utils/sortByRequiredExtended");
|
|
5
|
+
const sortByRequiredSimple_1 = require("../../../utils/sortByRequiredSimple");
|
|
5
6
|
function getOperationParameters(openApi, parameters) {
|
|
6
7
|
const operationParameters = {
|
|
7
8
|
imports: [],
|
|
@@ -49,11 +50,12 @@ function getOperationParameters(openApi, parameters) {
|
|
|
49
50
|
}
|
|
50
51
|
}
|
|
51
52
|
});
|
|
52
|
-
|
|
53
|
-
operationParameters.
|
|
54
|
-
operationParameters.
|
|
55
|
-
operationParameters.
|
|
56
|
-
operationParameters.
|
|
57
|
-
operationParameters.
|
|
53
|
+
const sortByRequired = this.context.sortByRequired ? sortByRequiredExtended_1.sortByRequiredExtended : sortByRequiredSimple_1.sortByRequiredSimple;
|
|
54
|
+
operationParameters.parameters = operationParameters.parameters.sort(sortByRequired);
|
|
55
|
+
operationParameters.parametersPath = operationParameters.parametersPath.sort(sortByRequired);
|
|
56
|
+
operationParameters.parametersQuery = operationParameters.parametersQuery.sort(sortByRequired);
|
|
57
|
+
operationParameters.parametersForm = operationParameters.parametersForm.sort(sortByRequired);
|
|
58
|
+
operationParameters.parametersCookie = operationParameters.parametersCookie.sort(sortByRequired);
|
|
59
|
+
operationParameters.parametersHeader = operationParameters.parametersHeader.sort(sortByRequired);
|
|
58
60
|
return operationParameters;
|
|
59
61
|
}
|
package/dist/core/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/core/index.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,aAAa,EAAE,QAAQ,EAAE,MAAM,mBAAmB,CAAC;AAmB5D,OAAO,EAAE,UAAU,EAAE,MAAM,eAAe,CAAC;
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/core/index.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,aAAa,EAAE,QAAQ,EAAE,MAAM,mBAAmB,CAAC;AAmB5D,OAAO,EAAE,UAAU,EAAE,MAAM,eAAe,CAAC;AAyH3C,wBAAsB,QAAQ,CAAC,OAAO,EAAE,QAAQ,GAAG,QAAQ,EAAE,GAAG,aAAa,GAAG,OAAO,CAAC,IAAI,CAAC,CAmD5F"}
|
package/dist/core/index.js
CHANGED
|
@@ -47,8 +47,9 @@ Object.defineProperty(exports, "HttpClient", { enumerable: true, get: function (
|
|
|
47
47
|
* @param enumPrefix: Prefix for enum model(E)
|
|
48
48
|
* @param typePrefix: Prefix for type model(T)
|
|
49
49
|
* @param useCancelableRequest Use cancelable request type.
|
|
50
|
+
* @param sortByRequired Property sorting strategy: simplified or extended
|
|
50
51
|
*/
|
|
51
|
-
async function generateFrom({ input, output, outputCore, outputServices, outputModels, outputSchemas, httpClient = Enums_1.HttpClient.FETCH, useOptions = false, useUnionTypes = false, exportCore = true, exportServices = true, exportModels = true, exportSchemas = false, clean = true, request, write = true, interfacePrefix = 'I', enumPrefix = 'E', typePrefix = 'T', useCancelableRequest = false, }, writeClient) {
|
|
52
|
+
async function generateFrom({ input, output, outputCore, outputServices, outputModels, outputSchemas, httpClient = Enums_1.HttpClient.FETCH, useOptions = false, useUnionTypes = false, exportCore = true, exportServices = true, exportModels = true, exportSchemas = false, clean = true, request, write = true, interfacePrefix = 'I', enumPrefix = 'E', typePrefix = 'T', useCancelableRequest = false, sortByRequired = false, }, writeClient) {
|
|
52
53
|
const outputPaths = (0, getOutputPaths_1.getOutputPaths)({
|
|
53
54
|
output,
|
|
54
55
|
outputCore,
|
|
@@ -56,7 +57,7 @@ async function generateFrom({ input, output, outputCore, outputServices, outputM
|
|
|
56
57
|
outputModels,
|
|
57
58
|
outputSchemas,
|
|
58
59
|
});
|
|
59
|
-
const context = new Context_1.Context(input, outputPaths, { interface: interfacePrefix, enum: enumPrefix, type: typePrefix });
|
|
60
|
+
const context = new Context_1.Context({ input, output: outputPaths, prefix: { interface: interfacePrefix, enum: enumPrefix, type: typePrefix }, sortByRequired });
|
|
60
61
|
const openApi = (0, isString_1.isString)(input) ? await (0, getOpenApiSpec_1.getOpenApiSpec)(context, input) : input;
|
|
61
62
|
const openApiVersion = (0, getOpenApiVersion_1.getOpenApiVersion)(openApi);
|
|
62
63
|
const templates = (0, registerHandlebarTemplates_1.registerHandlebarTemplates)({
|
|
@@ -1,2 +1,12 @@
|
|
|
1
1
|
export declare const SEARCH_REGEXP: RegExp;
|
|
2
|
+
export declare const GROUP_PRIORITY_EXTENDED: {
|
|
3
|
+
readonly required: 0;
|
|
4
|
+
readonly 'required-with-default': 1;
|
|
5
|
+
readonly optional: 2;
|
|
6
|
+
readonly 'optional-with-default': 3;
|
|
7
|
+
};
|
|
8
|
+
export declare const GROUP_PRIORITY_SIMPLE: {
|
|
9
|
+
readonly 'requires-value': 0;
|
|
10
|
+
readonly other: 1;
|
|
11
|
+
};
|
|
2
12
|
//# sourceMappingURL=Consts.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Consts.d.ts","sourceRoot":"","sources":["../../../src/core/types/Consts.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,aAAa,QAAQ,CAAC"}
|
|
1
|
+
{"version":3,"file":"Consts.d.ts","sourceRoot":"","sources":["../../../src/core/types/Consts.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,aAAa,QAAQ,CAAC;AAEnC,eAAO,MAAM,uBAAuB;;;;;CAK1B,CAAC;AAEX,eAAO,MAAM,qBAAqB;;;CAGxB,CAAC"}
|
|
@@ -1,4 +1,14 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.SEARCH_REGEXP = void 0;
|
|
3
|
+
exports.GROUP_PRIORITY_SIMPLE = exports.GROUP_PRIORITY_EXTENDED = exports.SEARCH_REGEXP = void 0;
|
|
4
4
|
exports.SEARCH_REGEXP = /\\/g;
|
|
5
|
+
exports.GROUP_PRIORITY_EXTENDED = {
|
|
6
|
+
required: 0,
|
|
7
|
+
'required-with-default': 1,
|
|
8
|
+
optional: 2,
|
|
9
|
+
'optional-with-default': 3,
|
|
10
|
+
};
|
|
11
|
+
exports.GROUP_PRIORITY_SIMPLE = {
|
|
12
|
+
'requires-value': 0,
|
|
13
|
+
'other': 1
|
|
14
|
+
};
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import { GROUP_PRIORITY_EXTENDED, GROUP_PRIORITY_SIMPLE } from './Consts';
|
|
1
2
|
import { TypeRef } from './Enums';
|
|
2
3
|
/**
|
|
3
4
|
* @param output The relative location of the output directory(or index)
|
|
@@ -31,4 +32,6 @@ export interface Prefix {
|
|
|
31
32
|
enum: string;
|
|
32
33
|
type: string;
|
|
33
34
|
}
|
|
35
|
+
export type TPropertyGroupExtended = keyof typeof GROUP_PRIORITY_EXTENDED;
|
|
36
|
+
export type TPropertyGroupSimple = keyof typeof GROUP_PRIORITY_SIMPLE;
|
|
34
37
|
//# sourceMappingURL=Models.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Models.d.ts","sourceRoot":"","sources":["../../../src/core/types/Models.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,SAAS,CAAC;AAElC;;;;;;GAMG;AACH,MAAM,WAAW,OAAO;IACpB,MAAM,EAAE,MAAM,CAAC;IACf,UAAU,EAAE,MAAM,CAAC;IACnB,cAAc,EAAE,MAAM,CAAC;IACvB,YAAY,EAAE,MAAM,CAAC;IACrB,aAAa,EAAE,MAAM,CAAC;CACzB;AAED;;;;GAIG;AACH,MAAM,WAAW,YAAY;IACzB,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,EAAE,OAAO,CAAC;CACjB;AAED,MAAM,WAAW,KAAK;IAClB,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,CAAC,EAAE,MAAM,CAAC;CACrB;AAED,MAAM,WAAW,MAAM;IACnB,SAAS,EAAE,MAAM,CAAC;IAClB,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;CAChB"}
|
|
1
|
+
{"version":3,"file":"Models.d.ts","sourceRoot":"","sources":["../../../src/core/types/Models.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,uBAAuB,EAAE,qBAAqB,EAAE,MAAM,UAAU,CAAC;AAC1E,OAAO,EAAE,OAAO,EAAE,MAAM,SAAS,CAAC;AAElC;;;;;;GAMG;AACH,MAAM,WAAW,OAAO;IACpB,MAAM,EAAE,MAAM,CAAC;IACf,UAAU,EAAE,MAAM,CAAC;IACnB,cAAc,EAAE,MAAM,CAAC;IACvB,YAAY,EAAE,MAAM,CAAC;IACrB,aAAa,EAAE,MAAM,CAAC;CACzB;AAED;;;;GAIG;AACH,MAAM,WAAW,YAAY;IACzB,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,EAAE,OAAO,CAAC;CACjB;AAED,MAAM,WAAW,KAAK;IAClB,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,CAAC,EAAE,MAAM,CAAC;CACrB;AAED,MAAM,WAAW,MAAM;IACnB,SAAS,EAAE,MAAM,CAAC;IAClB,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;CAChB;AAED,MAAM,MAAM,sBAAsB,GAAG,MAAM,OAAO,uBAAuB,CAAC;AAE1E,MAAM,MAAM,oBAAoB,GAAG,MAAM,OAAO,qBAAqB,CAAC"}
|
|
@@ -0,0 +1,3 @@
|
|
|
1
|
+
import { OperationParameter } from '../../types/shared/OperationParameter.model';
|
|
2
|
+
export declare function createOperationParameter(name: string, options?: Partial<Pick<OperationParameter, 'isRequired' | 'default' | 'description'>>): OperationParameter;
|
|
3
|
+
//# sourceMappingURL=createOperationParameter.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"createOperationParameter.d.ts","sourceRoot":"","sources":["../../../../src/core/utils/__mocks__/createOperationParameter.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,kBAAkB,EAAE,MAAM,6CAA6C,CAAC;AAEjF,wBAAgB,wBAAwB,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,GAAE,OAAO,CAAC,IAAI,CAAC,kBAAkB,EAAE,YAAY,GAAG,SAAS,GAAG,aAAa,CAAC,CAAM,GAAG,kBAAkB,CAwBpK"}
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.createOperationParameter = createOperationParameter;
|
|
4
|
+
function createOperationParameter(name, options = {}) {
|
|
5
|
+
return {
|
|
6
|
+
name,
|
|
7
|
+
isRequired: options.isRequired ?? false,
|
|
8
|
+
default: options.default,
|
|
9
|
+
description: options.description ?? null,
|
|
10
|
+
in: 'query',
|
|
11
|
+
prop: '',
|
|
12
|
+
export: 'reference',
|
|
13
|
+
alias: '',
|
|
14
|
+
path: '',
|
|
15
|
+
type: 'string',
|
|
16
|
+
base: '',
|
|
17
|
+
template: null,
|
|
18
|
+
link: null,
|
|
19
|
+
isDefinition: false,
|
|
20
|
+
isReadOnly: false,
|
|
21
|
+
isNullable: false,
|
|
22
|
+
imports: [],
|
|
23
|
+
enum: [],
|
|
24
|
+
enums: [],
|
|
25
|
+
properties: [],
|
|
26
|
+
mediaType: null,
|
|
27
|
+
};
|
|
28
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sortByRequiredExtended.test.d.ts","sourceRoot":"","sources":["../../../../src/core/utils/__tests__/sortByRequiredExtended.test.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,145 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
+
};
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
const node_assert_1 = __importDefault(require("node:assert"));
|
|
7
|
+
const node_test_1 = require("node:test");
|
|
8
|
+
const createOperationParameter_1 = require("../__mocks__/createOperationParameter");
|
|
9
|
+
const sortByRequiredExtended_1 = require("../sortByRequiredExtended");
|
|
10
|
+
(0, node_test_1.describe)('sortByRequiredExtended', () => {
|
|
11
|
+
// Тесты для сравнения между разными группами
|
|
12
|
+
(0, node_test_1.test)('@unit: должна сортировать группы в порядке: required, required-with-default, optional, optional-with-default', () => {
|
|
13
|
+
const params = [
|
|
14
|
+
(0, createOperationParameter_1.createOperationParameter)('optional', { isRequired: false }), // Группа 2
|
|
15
|
+
(0, createOperationParameter_1.createOperationParameter)('required', { isRequired: true }), // Группа 0
|
|
16
|
+
(0, createOperationParameter_1.createOperationParameter)('optional-with-default', { isRequired: false, default: 'def' }), // Группа 3
|
|
17
|
+
(0, createOperationParameter_1.createOperationParameter)('required-with-default', { isRequired: true, default: 'def' }) // Группа 1
|
|
18
|
+
];
|
|
19
|
+
params.sort(sortByRequiredExtended_1.sortByRequiredExtended);
|
|
20
|
+
const sortedNames = params.map(p => p.name);
|
|
21
|
+
node_assert_1.default.deepStrictEqual(sortedNames, [
|
|
22
|
+
'required',
|
|
23
|
+
'required-with-default',
|
|
24
|
+
'optional',
|
|
25
|
+
'optional-with-default'
|
|
26
|
+
]);
|
|
27
|
+
});
|
|
28
|
+
// Тесты для сравнения внутри групп
|
|
29
|
+
(0, node_test_1.test)('@unit: должна сортировать по имени внутри группы required', () => {
|
|
30
|
+
const params = [
|
|
31
|
+
(0, createOperationParameter_1.createOperationParameter)('Beta', { isRequired: true }),
|
|
32
|
+
(0, createOperationParameter_1.createOperationParameter)('Alpha', { isRequired: true }),
|
|
33
|
+
(0, createOperationParameter_1.createOperationParameter)('Gamma', { isRequired: true })
|
|
34
|
+
];
|
|
35
|
+
params.sort(sortByRequiredExtended_1.sortByRequiredExtended);
|
|
36
|
+
const sortedNames = params.map(p => p.name);
|
|
37
|
+
node_assert_1.default.deepStrictEqual(sortedNames, ['Alpha', 'Beta', 'Gamma']);
|
|
38
|
+
});
|
|
39
|
+
(0, node_test_1.test)('@unit: должна сортировать по имени внутри группы required-with-default', () => {
|
|
40
|
+
const params = [
|
|
41
|
+
(0, createOperationParameter_1.createOperationParameter)('Zeta', { isRequired: true, default: 'def' }),
|
|
42
|
+
(0, createOperationParameter_1.createOperationParameter)('Beta', { isRequired: true, default: 'def' }),
|
|
43
|
+
(0, createOperationParameter_1.createOperationParameter)('Alpha', { isRequired: true, default: 'def' })
|
|
44
|
+
];
|
|
45
|
+
params.sort(sortByRequiredExtended_1.sortByRequiredExtended);
|
|
46
|
+
const sortedNames = params.map(p => p.name);
|
|
47
|
+
node_assert_1.default.deepStrictEqual(sortedNames, ['Alpha', 'Beta', 'Zeta']);
|
|
48
|
+
});
|
|
49
|
+
(0, node_test_1.test)('@unit: должна сортировать по имени внутри группы optional', () => {
|
|
50
|
+
const params = [
|
|
51
|
+
(0, createOperationParameter_1.createOperationParameter)('Second', { isRequired: false }),
|
|
52
|
+
(0, createOperationParameter_1.createOperationParameter)('First', { isRequired: false }),
|
|
53
|
+
(0, createOperationParameter_1.createOperationParameter)('Third', { isRequired: false })
|
|
54
|
+
];
|
|
55
|
+
params.sort(sortByRequiredExtended_1.sortByRequiredExtended);
|
|
56
|
+
const sortedNames = params.map(p => p.name);
|
|
57
|
+
node_assert_1.default.deepStrictEqual(sortedNames, ['First', 'Second', 'Third']);
|
|
58
|
+
});
|
|
59
|
+
(0, node_test_1.test)('@unit: должна сортировать по имени внутри группы optional-with-default', () => {
|
|
60
|
+
const params = [
|
|
61
|
+
(0, createOperationParameter_1.createOperationParameter)('Dog', { isRequired: false, default: 'def' }),
|
|
62
|
+
(0, createOperationParameter_1.createOperationParameter)('Cat', { isRequired: false, default: 'def' }),
|
|
63
|
+
(0, createOperationParameter_1.createOperationParameter)('Bird', { isRequired: false, default: 'def' })
|
|
64
|
+
];
|
|
65
|
+
params.sort(sortByRequiredExtended_1.sortByRequiredExtended);
|
|
66
|
+
const sortedNames = params.map(p => p.name);
|
|
67
|
+
node_assert_1.default.deepStrictEqual(sortedNames, ['Bird', 'Cat', 'Dog']);
|
|
68
|
+
});
|
|
69
|
+
// Тесты для всех возможных пар групп
|
|
70
|
+
const groupPairs = [
|
|
71
|
+
['required', 'required-with-default'],
|
|
72
|
+
['required', 'optional'],
|
|
73
|
+
['required', 'optional-with-default'],
|
|
74
|
+
['required-with-default', 'optional'],
|
|
75
|
+
['required-with-default', 'optional-with-default'],
|
|
76
|
+
['optional', 'optional-with-default']
|
|
77
|
+
];
|
|
78
|
+
for (const [groupA, groupB] of groupPairs) {
|
|
79
|
+
(0, node_test_1.test)(`@unit: должна помещать "${groupA}" перед "${groupB}"`, () => {
|
|
80
|
+
const paramA = (0, createOperationParameter_1.createOperationParameter)('A', createOptionsForGroup(groupA));
|
|
81
|
+
const paramB = (0, createOperationParameter_1.createOperationParameter)('B', createOptionsForGroup(groupB));
|
|
82
|
+
// A должен идти перед B
|
|
83
|
+
node_assert_1.default.ok((0, sortByRequiredExtended_1.sortByRequiredExtended)(paramA, paramB) < 0);
|
|
84
|
+
// B должен идти после A
|
|
85
|
+
node_assert_1.default.ok((0, sortByRequiredExtended_1.sortByRequiredExtended)(paramB, paramA) > 0);
|
|
86
|
+
});
|
|
87
|
+
}
|
|
88
|
+
// Вспомогательная функция для создания параметров по группе
|
|
89
|
+
function createOptionsForGroup(group) {
|
|
90
|
+
switch (group) {
|
|
91
|
+
case 'required':
|
|
92
|
+
return { isRequired: true };
|
|
93
|
+
case 'required-with-default':
|
|
94
|
+
return { isRequired: true, default: 'default' };
|
|
95
|
+
case 'optional':
|
|
96
|
+
return { isRequired: false };
|
|
97
|
+
case 'optional-with-default':
|
|
98
|
+
return { isRequired: false, default: 'default' };
|
|
99
|
+
}
|
|
100
|
+
}
|
|
101
|
+
// Тесты на равные группы
|
|
102
|
+
(0, node_test_1.test)('@unit: должна возвращать 0 для одинаковых параметров', () => {
|
|
103
|
+
const param1 = (0, createOperationParameter_1.createOperationParameter)('Test', { isRequired: true });
|
|
104
|
+
const param2 = (0, createOperationParameter_1.createOperationParameter)('Test', { isRequired: true });
|
|
105
|
+
node_assert_1.default.strictEqual((0, sortByRequiredExtended_1.sortByRequiredExtended)(param1, param2), 0);
|
|
106
|
+
});
|
|
107
|
+
// Тест на обработку параметров с одинаковыми именами
|
|
108
|
+
(0, node_test_1.test)('@unit: должна возвращать 0 для параметров с одинаковыми именами в одной группе', () => {
|
|
109
|
+
const param1 = (0, createOperationParameter_1.createOperationParameter)('Same', { isRequired: false, default: 'def' });
|
|
110
|
+
const param2 = (0, createOperationParameter_1.createOperationParameter)('Same', { isRequired: false, default: 'def' });
|
|
111
|
+
node_assert_1.default.strictEqual((0, sortByRequiredExtended_1.sortByRequiredExtended)(param1, param2), 0);
|
|
112
|
+
});
|
|
113
|
+
// Тест на смешанные группы с одинаковыми приоритетами
|
|
114
|
+
(0, node_test_1.test)('@unit: должна сортировать только по имени при одинаковых группах', () => {
|
|
115
|
+
const params = [
|
|
116
|
+
(0, createOperationParameter_1.createOperationParameter)('Beta', { isRequired: false }), // optional
|
|
117
|
+
(0, createOperationParameter_1.createOperationParameter)('Alpha', { isRequired: true }), // required
|
|
118
|
+
(0, createOperationParameter_1.createOperationParameter)('Gamma', { isRequired: false }), // optional
|
|
119
|
+
(0, createOperationParameter_1.createOperationParameter)('Delta', { isRequired: true, default: 'def' }), // required-with-default
|
|
120
|
+
(0, createOperationParameter_1.createOperationParameter)('Epsilon', { isRequired: false, default: 'def' }), // optional-with-default
|
|
121
|
+
(0, createOperationParameter_1.createOperationParameter)('Alpha2', { isRequired: true }) // required
|
|
122
|
+
];
|
|
123
|
+
params.sort(sortByRequiredExtended_1.sortByRequiredExtended);
|
|
124
|
+
const sortedNames = params.map(p => p.name);
|
|
125
|
+
node_assert_1.default.deepStrictEqual(sortedNames, [
|
|
126
|
+
'Alpha', // required
|
|
127
|
+
'Alpha2', // required
|
|
128
|
+
'Delta', // required-with-default
|
|
129
|
+
'Beta', // optional
|
|
130
|
+
'Gamma', // optional
|
|
131
|
+
'Epsilon' // optional-with-default
|
|
132
|
+
]);
|
|
133
|
+
});
|
|
134
|
+
// Тест на пограничные случаи
|
|
135
|
+
(0, node_test_1.test)('@unit: должна корректно обрабатывать пустые имена', () => {
|
|
136
|
+
const params = [
|
|
137
|
+
(0, createOperationParameter_1.createOperationParameter)('', { isRequired: true }),
|
|
138
|
+
(0, createOperationParameter_1.createOperationParameter)('B', { isRequired: true }),
|
|
139
|
+
(0, createOperationParameter_1.createOperationParameter)('A', { isRequired: true })
|
|
140
|
+
];
|
|
141
|
+
params.sort(sortByRequiredExtended_1.sortByRequiredExtended);
|
|
142
|
+
const sortedNames = params.map(p => p.name);
|
|
143
|
+
node_assert_1.default.deepStrictEqual(sortedNames, ['', 'A', 'B']);
|
|
144
|
+
});
|
|
145
|
+
});
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sortByRequiredSimple.test.d.ts","sourceRoot":"","sources":["../../../../src/core/utils/__tests__/sortByRequiredSimple.test.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,80 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
+
};
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
const strict_1 = __importDefault(require("node:assert/strict"));
|
|
7
|
+
const node_test_1 = require("node:test");
|
|
8
|
+
const createOperationParameter_1 = require("../__mocks__/createOperationParameter");
|
|
9
|
+
const sortByRequiredSimple_1 = require("../sortByRequiredSimple");
|
|
10
|
+
(0, node_test_1.describe)('sortByRequiredSimple', () => {
|
|
11
|
+
(0, node_test_1.test)('@unit: должна помещать обязательные параметры без default перед необязательными', () => {
|
|
12
|
+
const a = (0, createOperationParameter_1.createOperationParameter)('required', { isRequired: true });
|
|
13
|
+
const b = (0, createOperationParameter_1.createOperationParameter)('optional', { isRequired: false });
|
|
14
|
+
strict_1.default.strictEqual((0, sortByRequiredSimple_1.sortByRequiredSimple)(a, b), -1);
|
|
15
|
+
strict_1.default.strictEqual((0, sortByRequiredSimple_1.sortByRequiredSimple)(b, a), 1);
|
|
16
|
+
});
|
|
17
|
+
(0, node_test_1.test)('@unit: должна считать равными два обязательных параметра без default', () => {
|
|
18
|
+
const a = (0, createOperationParameter_1.createOperationParameter)('A', { isRequired: true });
|
|
19
|
+
const b = (0, createOperationParameter_1.createOperationParameter)('B', { isRequired: true });
|
|
20
|
+
strict_1.default.strictEqual((0, sortByRequiredSimple_1.sortByRequiredSimple)(a, b), 0);
|
|
21
|
+
});
|
|
22
|
+
(0, node_test_1.test)('@unit: должна считать равными два необязательных параметра', () => {
|
|
23
|
+
const a = (0, createOperationParameter_1.createOperationParameter)('A', { isRequired: false });
|
|
24
|
+
const b = (0, createOperationParameter_1.createOperationParameter)('B', { isRequired: false });
|
|
25
|
+
strict_1.default.strictEqual((0, sortByRequiredSimple_1.sortByRequiredSimple)(a, b), 0);
|
|
26
|
+
});
|
|
27
|
+
(0, node_test_1.test)('@unit: должна помещать обязательные без default перед обязательными с default', () => {
|
|
28
|
+
const a = (0, createOperationParameter_1.createOperationParameter)('required', { isRequired: true });
|
|
29
|
+
const b = (0, createOperationParameter_1.createOperationParameter)('required-with-default', { isRequired: true, default: 'test' });
|
|
30
|
+
strict_1.default.strictEqual((0, sortByRequiredSimple_1.sortByRequiredSimple)(a, b), -1);
|
|
31
|
+
strict_1.default.strictEqual((0, sortByRequiredSimple_1.sortByRequiredSimple)(b, a), 1);
|
|
32
|
+
});
|
|
33
|
+
(0, node_test_1.test)('@unit: должна считать равными два обязательных параметра с default', () => {
|
|
34
|
+
const a = (0, createOperationParameter_1.createOperationParameter)('A', { isRequired: true, default: 'a' });
|
|
35
|
+
const b = (0, createOperationParameter_1.createOperationParameter)('B', { isRequired: true, default: 'b' });
|
|
36
|
+
strict_1.default.strictEqual((0, sortByRequiredSimple_1.sortByRequiredSimple)(a, b), 0);
|
|
37
|
+
});
|
|
38
|
+
(0, node_test_1.test)('@unit: должна помещать обязательные без default перед необязательными с default', () => {
|
|
39
|
+
const a = (0, createOperationParameter_1.createOperationParameter)('required', { isRequired: true });
|
|
40
|
+
const b = (0, createOperationParameter_1.createOperationParameter)('optional-with-default', { isRequired: false, default: 'test' });
|
|
41
|
+
strict_1.default.strictEqual((0, sortByRequiredSimple_1.sortByRequiredSimple)(a, b), -1);
|
|
42
|
+
strict_1.default.strictEqual((0, sortByRequiredSimple_1.sortByRequiredSimple)(b, a), 1);
|
|
43
|
+
});
|
|
44
|
+
(0, node_test_1.test)('@unit: должна считать равными два необязательных параметра с default', () => {
|
|
45
|
+
const a = (0, createOperationParameter_1.createOperationParameter)('A', { isRequired: false, default: 'a' });
|
|
46
|
+
const b = (0, createOperationParameter_1.createOperationParameter)('B', { isRequired: false, default: 'b' });
|
|
47
|
+
strict_1.default.strictEqual((0, sortByRequiredSimple_1.sortByRequiredSimple)(a, b), 0);
|
|
48
|
+
});
|
|
49
|
+
(0, node_test_1.test)('@unit: должна считать равными обязательный с default и необязательный без default', () => {
|
|
50
|
+
const a = (0, createOperationParameter_1.createOperationParameter)('required-with-default', { isRequired: true, default: 'test' });
|
|
51
|
+
const b = (0, createOperationParameter_1.createOperationParameter)('optional', { isRequired: false });
|
|
52
|
+
strict_1.default.strictEqual((0, sortByRequiredSimple_1.sortByRequiredSimple)(a, b), 0);
|
|
53
|
+
strict_1.default.strictEqual((0, sortByRequiredSimple_1.sortByRequiredSimple)(b, a), 0);
|
|
54
|
+
});
|
|
55
|
+
(0, node_test_1.test)('@unit: должна корректно работать с undefined значениями', () => {
|
|
56
|
+
const a = (0, createOperationParameter_1.createOperationParameter)('required', { isRequired: true });
|
|
57
|
+
const b = (0, createOperationParameter_1.createOperationParameter)('required-with-default', { isRequired: true, default: undefined });
|
|
58
|
+
strict_1.default.strictEqual((0, sortByRequiredSimple_1.sortByRequiredSimple)(a, b), 0);
|
|
59
|
+
});
|
|
60
|
+
(0, node_test_1.test)('@unit: should sort params', () => {
|
|
61
|
+
const optionalParameter = (0, createOperationParameter_1.createOperationParameter)('optional', { description: '3. Опциональный параметр без значения по умолчанию', isRequired: false });
|
|
62
|
+
const optionalParameterWithDefault = (0, createOperationParameter_1.createOperationParameter)('optional-with-default', {
|
|
63
|
+
description: '4. Опциональный параметр со значением по умолчанию',
|
|
64
|
+
isRequired: false,
|
|
65
|
+
default: 'Hello World!',
|
|
66
|
+
});
|
|
67
|
+
const requiredParameter = (0, createOperationParameter_1.createOperationParameter)('required', { description: '1. Обязательный параметр без значения по умолчанию', isRequired: true });
|
|
68
|
+
const requiredParameterWithDefault = (0, createOperationParameter_1.createOperationParameter)('required-with-default', {
|
|
69
|
+
description: '2. Обязательный параметр со значением по умолчанию',
|
|
70
|
+
isRequired: true,
|
|
71
|
+
default: 'Hello World!',
|
|
72
|
+
});
|
|
73
|
+
strict_1.default.deepStrictEqual([optionalParameterWithDefault, optionalParameter, requiredParameterWithDefault, requiredParameter].sort(sortByRequiredSimple_1.sortByRequiredSimple), [
|
|
74
|
+
requiredParameter,
|
|
75
|
+
optionalParameterWithDefault,
|
|
76
|
+
optionalParameter,
|
|
77
|
+
requiredParameterWithDefault,
|
|
78
|
+
]);
|
|
79
|
+
});
|
|
80
|
+
});
|
|
@@ -12,10 +12,10 @@ const writeClient_1 = require("../writeClient");
|
|
|
12
12
|
(0, node_test_1.test)('@unit: writeClient should write to filesystem', async () => {
|
|
13
13
|
const mkdirCalls = [];
|
|
14
14
|
const writeFileCalls = [];
|
|
15
|
-
//
|
|
15
|
+
// We keep the original implementations
|
|
16
16
|
const originalMkdir = fileSystem_1.fileSystem.mkdir;
|
|
17
17
|
const originalWriteFile = fileSystem_1.fileSystem.writeFile;
|
|
18
|
-
//
|
|
18
|
+
// Mock the functions
|
|
19
19
|
fileSystem_1.fileSystem.mkdir = node_test_1.mock.fn(async (path) => {
|
|
20
20
|
mkdirCalls.push(path);
|
|
21
21
|
return path;
|
|
@@ -62,7 +62,7 @@ const writeClient_1 = require("../writeClient");
|
|
|
62
62
|
});
|
|
63
63
|
strict_1.default.ok(mkdirCalls.length > 0, 'mkdir should be called at least once');
|
|
64
64
|
strict_1.default.ok(writeFileCalls.length > 0, 'writeFile should be called at least once');
|
|
65
|
-
//
|
|
65
|
+
// Restoring the original implementations
|
|
66
66
|
fileSystem_1.fileSystem.mkdir = originalMkdir;
|
|
67
67
|
fileSystem_1.fileSystem.writeFile = originalWriteFile;
|
|
68
68
|
});
|
|
@@ -10,7 +10,7 @@ const fileSystem_1 = require("../fileSystem");
|
|
|
10
10
|
const writeClientCore_1 = require("../writeClientCore");
|
|
11
11
|
(0, node_test_1.test)('@unit: writeClientCore writes to filesystem', async () => {
|
|
12
12
|
const writeFileCalls = [];
|
|
13
|
-
//
|
|
13
|
+
// Re-assigning the function manually with a mock
|
|
14
14
|
const originalWriteFile = fileSystem_1.fileSystem.writeFile;
|
|
15
15
|
fileSystem_1.fileSystem.writeFile = node_test_1.mock.fn(async (path, content) => {
|
|
16
16
|
writeFileCalls.push([path, content]);
|
|
@@ -47,6 +47,6 @@ const writeClientCore_1 = require("../writeClientCore");
|
|
|
47
47
|
node_assert_1.default.ok(writeFileCalls.some(([filePath, content]) => filePath.toString().includes('request.ts') && content.toString().includes('request')), 'Expected writeFile to be called with request content for request.ts');
|
|
48
48
|
node_assert_1.default.ok(writeFileCalls.some(([filePath, content]) => filePath.toString().includes('CancelablePromise.ts') && content.toString().includes('cancelablePromise')), 'Expected writeFile to be called with cancelablePromise content for CancelablePromise.ts');
|
|
49
49
|
node_assert_1.default.ok(writeFileCalls.some(([filePath, content]) => filePath.toString().includes('HttpStatusCode.ts') && content.toString().includes('httpStatusCode')), 'Expected writeFile to be called with httpStatusCode content for HttpStatusCode.ts');
|
|
50
|
-
//
|
|
50
|
+
// Restoring the original function
|
|
51
51
|
fileSystem_1.fileSystem.writeFile = originalWriteFile;
|
|
52
52
|
});
|
|
@@ -9,7 +9,7 @@ const fileSystem_1 = require("../fileSystem");
|
|
|
9
9
|
const writeClientIndex_1 = require("../writeClientIndex");
|
|
10
10
|
(0, node_test_1.test)('@unit: writeClientIndex writes to filesystem', async () => {
|
|
11
11
|
const writeFileCalls = [];
|
|
12
|
-
//
|
|
12
|
+
// Re-assigning the function manually with a mock
|
|
13
13
|
const originalWriteFile = fileSystem_1.fileSystem.writeFile;
|
|
14
14
|
fileSystem_1.fileSystem.writeFile = node_test_1.mock.fn(async (path, content) => {
|
|
15
15
|
writeFileCalls.push([path, content]);
|
|
@@ -33,6 +33,6 @@ const writeClientIndex_1 = require("../writeClientIndex");
|
|
|
33
33
|
};
|
|
34
34
|
await (0, writeClientIndex_1.writeClientIndex)({ templates, outputPath: '/', core: [], models: [], schemas: [], services: [] });
|
|
35
35
|
node_assert_1.default.ok(writeFileCalls.some(([filePath, content]) => filePath.toString().includes('index.ts') && content.toString().includes('index')), 'Expected writeFile to be called with index content for index.ts');
|
|
36
|
-
//
|
|
36
|
+
// Restoring the original function
|
|
37
37
|
fileSystem_1.fileSystem.writeFile = originalWriteFile;
|
|
38
38
|
});
|
|
@@ -10,7 +10,7 @@ const fileSystem_1 = require("../fileSystem");
|
|
|
10
10
|
const writeClientModels_1 = require("../writeClientModels");
|
|
11
11
|
(0, node_test_1.test)('@unit: writeClientModels writes to filesystem', async () => {
|
|
12
12
|
const writeFileCalls = [];
|
|
13
|
-
//
|
|
13
|
+
// Re-assigning the function manually with a mock
|
|
14
14
|
const originalWriteFile = fileSystem_1.fileSystem.writeFile;
|
|
15
15
|
fileSystem_1.fileSystem.writeFile = node_test_1.mock.fn(async (path, content) => {
|
|
16
16
|
writeFileCalls.push([path, content]);
|
|
@@ -61,6 +61,6 @@ const writeClientModels_1 = require("../writeClientModels");
|
|
|
61
61
|
useUnionTypes: false,
|
|
62
62
|
});
|
|
63
63
|
node_assert_1.default.ok(writeFileCalls.some(([filePath, content]) => filePath.toString().includes('MyModel.ts') && content.toString().includes('model')), 'Expected writeFile to be called with model content for MyModel.ts');
|
|
64
|
-
//
|
|
64
|
+
// Restoring the original function
|
|
65
65
|
fileSystem_1.fileSystem.writeFile = originalWriteFile;
|
|
66
66
|
});
|
|
@@ -10,7 +10,7 @@ const fileSystem_1 = require("../fileSystem");
|
|
|
10
10
|
const writeClientSchemas_1 = require("../writeClientSchemas");
|
|
11
11
|
(0, node_test_1.test)('@unit: writeClientSchemas writes to filesystem', async () => {
|
|
12
12
|
const writeFileCalls = [];
|
|
13
|
-
//
|
|
13
|
+
// Re-assigning the function manually with a mock
|
|
14
14
|
const originalWriteFile = fileSystem_1.fileSystem.writeFile;
|
|
15
15
|
fileSystem_1.fileSystem.writeFile = node_test_1.mock.fn(async (path, content) => {
|
|
16
16
|
writeFileCalls.push([path, content]);
|
|
@@ -61,6 +61,6 @@ const writeClientSchemas_1 = require("../writeClientSchemas");
|
|
|
61
61
|
useUnionTypes: false,
|
|
62
62
|
});
|
|
63
63
|
node_assert_1.default.ok(writeFileCalls.some(([filePath, content]) => filePath.toString().includes('MyModelSchema.ts') && content.toString().includes('schema')), 'Expected writeFile to be called with schema content for MyModelSchema.ts');
|
|
64
|
-
//
|
|
64
|
+
// Restoring the original function
|
|
65
65
|
fileSystem_1.fileSystem.writeFile = originalWriteFile;
|
|
66
66
|
});
|
|
@@ -10,7 +10,7 @@ const fileSystem_1 = require("../fileSystem");
|
|
|
10
10
|
const writeClientServices_1 = require("../writeClientServices");
|
|
11
11
|
(0, node_test_1.test)('@unit: writeClientServices writes to filesystem', async () => {
|
|
12
12
|
const writeFileCalls = [];
|
|
13
|
-
//
|
|
13
|
+
// Re-assigning the function manually with a mock
|
|
14
14
|
const originalWriteFile = fileSystem_1.fileSystem.writeFile;
|
|
15
15
|
fileSystem_1.fileSystem.writeFile = node_test_1.mock.fn(async (path, content) => {
|
|
16
16
|
writeFileCalls.push([path, content]);
|
|
@@ -54,7 +54,7 @@ const writeClientServices_1 = require("../writeClientServices");
|
|
|
54
54
|
useCancelableRequest: false,
|
|
55
55
|
});
|
|
56
56
|
node_assert_1.default.ok(writeFileCalls.some(([filePath, content]) => filePath.toString().includes('MyService.ts') && content.toString().includes('service')), 'Expected writeFile to be called with service content for MyService.ts');
|
|
57
|
-
//
|
|
57
|
+
// Restoring the original function
|
|
58
58
|
// eslint-disable-next-line @typescript-eslint/ban-ts-comment
|
|
59
59
|
// @ts-ignore
|
|
60
60
|
fileSystem_1.fileSystem.writeFile = originalWriteFile;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"getOpenApiSpec.d.ts","sourceRoot":"","sources":["../../../src/core/utils/getOpenApiSpec.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,OAAO,EAAE,MAAM,YAAY,CAAC;AACrC,OAAO,EAAE,aAAa,EAAE,MAAM,qCAAqC,CAAC;AAsBpE;;;;;GAKG;AACH,wBAAsB,cAAc,CAAC,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,aAAa,CAAC,
|
|
1
|
+
{"version":3,"file":"getOpenApiSpec.d.ts","sourceRoot":"","sources":["../../../src/core/utils/getOpenApiSpec.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,OAAO,EAAE,MAAM,YAAY,CAAC;AACrC,OAAO,EAAE,aAAa,EAAE,MAAM,qCAAqC,CAAC;AAsBpE;;;;;GAKG;AACH,wBAAsB,cAAc,CAAC,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,aAAa,CAAC,CAmC5F"}
|
|
@@ -40,13 +40,7 @@ async function getOpenApiSpec(context, input) {
|
|
|
40
40
|
if (!fileExists) {
|
|
41
41
|
throw new Error(`Could not read OpenApi spec: "${absoluteInput}"`);
|
|
42
42
|
}
|
|
43
|
-
// 2. Вызываем статический метод вместо new RefParser()
|
|
44
|
-
// resolve() разбирает все $ref, но не разворачивает ссылки
|
|
45
43
|
const resolvedRefs = await json_schema_ref_parser_1.default.resolve(absoluteInput);
|
|
46
|
-
// Если вам нужны сами ссылки (instances of $Refs), можно сделать так:
|
|
47
|
-
// const $refs = (await RefParser.parse(absoluteInput)).$refs;
|
|
48
|
-
// context.addRefs($refs);
|
|
49
|
-
// В вашем случае — пробрасываем то, что вернул resolve()
|
|
50
44
|
context.addRefs(resolvedRefs);
|
|
51
45
|
const raw = resolvedRefs.get(absoluteInput);
|
|
52
46
|
if (!raw || typeof raw !== 'object' || Array.isArray(raw) || !('paths' in raw)) {
|
|
@@ -57,7 +51,6 @@ async function getOpenApiSpec(context, input) {
|
|
|
57
51
|
for (const [pathKey, value] of Object.entries(mainSchema.paths)) {
|
|
58
52
|
const maybeRef = value;
|
|
59
53
|
if (maybeRef.$ref) {
|
|
60
|
-
// ваша функция replaceRef возвращает раскрученный объект
|
|
61
54
|
newPaths[pathKey] = replaceRef(context.get(maybeRef.$ref), context, (0, pathHelpers_1.dirName)(maybeRef.$ref));
|
|
62
55
|
}
|
|
63
56
|
else {
|
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
import { TPropertyGroupExtended } from '../types/Models';
|
|
2
|
+
import { OperationParameter } from '../types/shared/OperationParameter.model';
|
|
3
|
+
export declare function getPropertyGroupExtended(prop: OperationParameter): TPropertyGroupExtended;
|
|
4
|
+
//# sourceMappingURL=getPropertyGroupExtended.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"getPropertyGroupExtended.d.ts","sourceRoot":"","sources":["../../../src/core/utils/getPropertyGroupExtended.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,sBAAsB,EAAE,MAAM,iBAAiB,CAAC;AACzD,OAAO,EAAE,kBAAkB,EAAE,MAAM,0CAA0C,CAAC;AAG9E,wBAAgB,wBAAwB,CAAC,IAAI,EAAE,kBAAkB,GAAG,sBAAsB,CAKzF"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.getPropertyGroupExtended = getPropertyGroupExtended;
|
|
4
|
+
// Auxiliary function for defining a property group
|
|
5
|
+
function getPropertyGroupExtended(prop) {
|
|
6
|
+
if (prop.isRequired) {
|
|
7
|
+
return prop.default === undefined ? 'required' : 'required-with-default';
|
|
8
|
+
}
|
|
9
|
+
return prop.default === undefined ? 'optional' : 'optional-with-default';
|
|
10
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"getPropertyGroupSimple.d.ts","sourceRoot":"","sources":["../../../src/core/utils/getPropertyGroupSimple.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,oBAAoB,EAAE,MAAM,iBAAiB,CAAC;AAGvD,wBAAgB,sBAAsB,CAAC,IAAI,EAAE,GAAG,GAAG,oBAAoB,CAItE"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.getPropertyGroupSimple = getPropertyGroupSimple;
|
|
4
|
+
// Auxiliary function for defining a property group
|
|
5
|
+
function getPropertyGroupSimple(prop) {
|
|
6
|
+
return prop.isRequired && prop.default === undefined
|
|
7
|
+
? 'requires-value'
|
|
8
|
+
: 'other';
|
|
9
|
+
}
|
|
@@ -18,7 +18,7 @@ const header = `// This is an automatically generated file for the hbs template.
|
|
|
18
18
|
// @ts-nocheck
|
|
19
19
|
export default `;
|
|
20
20
|
/**
|
|
21
|
-
*
|
|
21
|
+
* Function for template precompilation (hbs) before further use
|
|
22
22
|
*/
|
|
23
23
|
const precompileTemplates = () => {
|
|
24
24
|
const logger = new Logger_1.Logger({
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sortByRequiredExtended.d.ts","sourceRoot":"","sources":["../../../src/core/utils/sortByRequiredExtended.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,kBAAkB,EAAE,MAAM,0CAA0C,CAAC;AAG9E,wBAAgB,sBAAsB,CAAC,CAAC,EAAE,kBAAkB,EAAE,CAAC,EAAE,kBAAkB,GAAG,MAAM,CAW3F"}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.sortByRequiredExtended = sortByRequiredExtended;
|
|
4
|
+
const Consts_1 = require("../types/Consts");
|
|
5
|
+
const getPropertyGroupExtended_1 = require("./getPropertyGroupExtended");
|
|
6
|
+
function sortByRequiredExtended(a, b) {
|
|
7
|
+
const groupA = (0, getPropertyGroupExtended_1.getPropertyGroupExtended)(a);
|
|
8
|
+
const groupB = (0, getPropertyGroupExtended_1.getPropertyGroupExtended)(b);
|
|
9
|
+
// If the groups are different, we sort them by priority.
|
|
10
|
+
if (groupA !== groupB) {
|
|
11
|
+
return Consts_1.GROUP_PRIORITY_EXTENDED[groupA] - Consts_1.GROUP_PRIORITY_EXTENDED[groupB];
|
|
12
|
+
}
|
|
13
|
+
// If the groups are the same, we sort them by name.
|
|
14
|
+
return a.name.localeCompare(b.name);
|
|
15
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sortByRequiredSimple.d.ts","sourceRoot":"","sources":["../../../src/core/utils/sortByRequiredSimple.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,0CAA0C,CAAC;AAGnF,wBAAgB,oBAAoB,CAAC,CAAC,EAAE,kBAAkB,EAAE,CAAC,EAAE,kBAAkB,GAAG,MAAM,CAKzF"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.sortByRequiredSimple = sortByRequiredSimple;
|
|
4
|
+
const Consts_1 = require("../types/Consts");
|
|
5
|
+
const getPropertyGroupSimple_1 = require("./getPropertyGroupSimple");
|
|
6
|
+
function sortByRequiredSimple(a, b) {
|
|
7
|
+
const groupA = (0, getPropertyGroupSimple_1.getPropertyGroupSimple)(a);
|
|
8
|
+
const groupB = (0, getPropertyGroupSimple_1.getPropertyGroupSimple)(b);
|
|
9
|
+
return Consts_1.GROUP_PRIORITY_SIMPLE[groupA] - Consts_1.GROUP_PRIORITY_SIMPLE[groupB];
|
|
10
|
+
}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "ts-openapi-codegen",
|
|
3
|
-
"version": "1.0.0-beta.
|
|
3
|
+
"version": "1.0.0-beta.5",
|
|
4
4
|
"description": "Library that generates Typescript clients based on the OpenAPI specification. It bases on openapi-typescript-codegen",
|
|
5
5
|
"author": "Alexey Zverev",
|
|
6
6
|
"homepage": "https://github.com/ozonophore/openapi-codegen.git",
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"sortByRequired.test.d.ts","sourceRoot":"","sources":["../../../../src/core/utils/__tests__/sortByRequired.test.ts"],"names":[],"mappings":""}
|
|
@@ -1,108 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
-
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
-
};
|
|
5
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
-
const node_assert_1 = __importDefault(require("node:assert"));
|
|
7
|
-
const node_test_1 = require("node:test");
|
|
8
|
-
const sortByRequired_1 = require("../sortByRequired");
|
|
9
|
-
(0, node_test_1.describe)('sortByRequired', () => {
|
|
10
|
-
(0, node_test_1.test)('@unit: should sort params', () => {
|
|
11
|
-
const paramOptional = {
|
|
12
|
-
in: 'query',
|
|
13
|
-
prop: 'parameterOptionalStringWithNoDefault',
|
|
14
|
-
export: 'generic',
|
|
15
|
-
name: 'parameterOptionalStringWithNoDefault',
|
|
16
|
-
alias: '',
|
|
17
|
-
path: '',
|
|
18
|
-
type: 'string',
|
|
19
|
-
base: 'string',
|
|
20
|
-
template: null,
|
|
21
|
-
link: null,
|
|
22
|
-
description: '3. This is a optional string with no default',
|
|
23
|
-
isDefinition: false,
|
|
24
|
-
isReadOnly: false,
|
|
25
|
-
isRequired: false,
|
|
26
|
-
isNullable: false,
|
|
27
|
-
imports: [],
|
|
28
|
-
enum: [],
|
|
29
|
-
enums: [],
|
|
30
|
-
properties: [],
|
|
31
|
-
mediaType: null,
|
|
32
|
-
};
|
|
33
|
-
const paramOptionalWithDefault = {
|
|
34
|
-
in: 'query',
|
|
35
|
-
prop: 'parameterOptionalStringWithNoDefault',
|
|
36
|
-
export: 'generic',
|
|
37
|
-
name: 'parameterOptionalStringWithNoDefault',
|
|
38
|
-
alias: '',
|
|
39
|
-
path: '',
|
|
40
|
-
type: 'string',
|
|
41
|
-
base: 'string',
|
|
42
|
-
template: null,
|
|
43
|
-
link: null,
|
|
44
|
-
description: '3. This is a optional string with no default',
|
|
45
|
-
isDefinition: false,
|
|
46
|
-
isReadOnly: false,
|
|
47
|
-
isRequired: false,
|
|
48
|
-
isNullable: false,
|
|
49
|
-
imports: [],
|
|
50
|
-
enum: [],
|
|
51
|
-
enums: [],
|
|
52
|
-
properties: [],
|
|
53
|
-
mediaType: null,
|
|
54
|
-
default: 'Hello World!',
|
|
55
|
-
};
|
|
56
|
-
const paramRequiredWithDefault = {
|
|
57
|
-
in: 'query',
|
|
58
|
-
prop: 'parameterStringWithDefault',
|
|
59
|
-
export: 'generic',
|
|
60
|
-
name: 'parameterStringWithDefault',
|
|
61
|
-
alias: '',
|
|
62
|
-
path: '',
|
|
63
|
-
type: 'string',
|
|
64
|
-
base: 'string',
|
|
65
|
-
template: null,
|
|
66
|
-
link: null,
|
|
67
|
-
description: '2. This is a string with default',
|
|
68
|
-
isDefinition: false,
|
|
69
|
-
isReadOnly: false,
|
|
70
|
-
isRequired: true,
|
|
71
|
-
isNullable: false,
|
|
72
|
-
imports: [],
|
|
73
|
-
enum: [],
|
|
74
|
-
enums: [],
|
|
75
|
-
properties: [],
|
|
76
|
-
mediaType: null,
|
|
77
|
-
default: 'Hello World!',
|
|
78
|
-
};
|
|
79
|
-
const paramRequiredWithoutDefault = {
|
|
80
|
-
in: 'query',
|
|
81
|
-
prop: 'parameterStringWithoutDefault',
|
|
82
|
-
export: 'generic',
|
|
83
|
-
name: 'parameterStringWithoutDefault',
|
|
84
|
-
alias: '',
|
|
85
|
-
path: '',
|
|
86
|
-
type: 'string',
|
|
87
|
-
base: 'string',
|
|
88
|
-
template: null,
|
|
89
|
-
link: null,
|
|
90
|
-
description: '1. This is a string without default',
|
|
91
|
-
isDefinition: false,
|
|
92
|
-
isReadOnly: false,
|
|
93
|
-
isRequired: true,
|
|
94
|
-
isNullable: false,
|
|
95
|
-
imports: [],
|
|
96
|
-
enum: [],
|
|
97
|
-
enums: [],
|
|
98
|
-
properties: [],
|
|
99
|
-
mediaType: null,
|
|
100
|
-
};
|
|
101
|
-
node_assert_1.default.deepStrictEqual([paramOptionalWithDefault, paramOptional, paramRequiredWithDefault, paramRequiredWithoutDefault].sort(sortByRequired_1.sortByRequired), [
|
|
102
|
-
paramRequiredWithoutDefault,
|
|
103
|
-
paramRequiredWithDefault,
|
|
104
|
-
paramOptionalWithDefault,
|
|
105
|
-
paramOptional,
|
|
106
|
-
]);
|
|
107
|
-
});
|
|
108
|
-
});
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"sortByRequired.d.ts","sourceRoot":"","sources":["../../../src/core/utils/sortByRequired.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,0CAA0C,CAAC;AAEnF,wBAAgB,cAAc,CAAC,CAAC,EAAE,kBAAkB,EAAE,CAAC,EAAE,kBAAkB,GAAG,MAAM,CAcnF"}
|
|
@@ -1,18 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.sortByRequired = sortByRequired;
|
|
4
|
-
function sortByRequired(a, b) {
|
|
5
|
-
if (!a.isRequired && b.isRequired) {
|
|
6
|
-
return 1;
|
|
7
|
-
}
|
|
8
|
-
if (a.isRequired && !b.isRequired) {
|
|
9
|
-
return -1;
|
|
10
|
-
}
|
|
11
|
-
if ((a.isRequired && a.default === undefined && b.default !== undefined) || (a.isRequired && a.default !== undefined && b.default === undefined)) {
|
|
12
|
-
return -1;
|
|
13
|
-
}
|
|
14
|
-
if ((a.isRequired && a.default !== undefined && b.default === undefined) || (!a.isRequired && a.default === undefined && b.default !== undefined)) {
|
|
15
|
-
return 1;
|
|
16
|
-
}
|
|
17
|
-
return 0;
|
|
18
|
-
}
|