@team-supercharge/oasg 14.0.0-remove-instant-mapping-634c95c0.0 → 14.0.1-fix-twine-1e8d510b.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md CHANGED
@@ -777,6 +777,10 @@ describe('Auth', function () {
777
777
 
778
778
  This section covers the breaking changes and their migrations across major version upgrades.
779
779
 
780
+ ## From `13.x.x` to `14.0.0`
781
+
782
+ Several dependencies have been upgraded, and OASg now uses `node` version 20.15.0 and `npm` version 10 by default. If your project still uses `node@18`, you should upgrade first.
783
+
780
784
  ## From `12.x.x` to `13.0.1`
781
785
 
782
786
  > ❗ Due to version `13.0.0` has been published before erroneously (then unpublished) to the NPM registry, this version of the artifact won't be available either as an NPM package or a Docker base image. Please use the `13.0.1` patch version instead.
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@team-supercharge/oasg",
3
- "version": "14.0.0-remove-instant-mapping-634c95c0.0",
3
+ "version": "14.0.1-fix-twine-1e8d510b.0",
4
4
  "description": "Node-based tool to lint OpenAPI documents and generate clients, servers and documentation from them",
5
5
  "author": "Supercharge",
6
6
  "license": "MIT",
@@ -15,8 +15,8 @@
15
15
  "url": "git@gitlab.com:team-supercharge/oasg.git"
16
16
  },
17
17
  "engines": {
18
- "node": "^18",
19
- "npm": "^9"
18
+ "node": "^20.15",
19
+ "npm": "^10"
20
20
  },
21
21
  "files": [
22
22
  "bin",
@@ -28,9 +28,9 @@
28
28
  "dependencies": {
29
29
  "@apidevtools/json-schema-ref-parser": "^10.1.0",
30
30
  "@apidevtools/swagger-parser": "^10.1.0",
31
- "@redocly/cli": "1.2.0",
32
- "@stoplight/prism-cli": "4.14.1",
33
- "@stoplight/spectral-cli": "6.6.0",
31
+ "@redocly/cli": "1.17.1",
32
+ "@stoplight/prism-cli": "5.8.2",
33
+ "@stoplight/spectral-cli": "6.11.1",
34
34
  "ajv": "^8.12.0",
35
35
  "command-exists": "^1.2.9",
36
36
  "express": "^4.18.2",
@@ -39,11 +39,12 @@
39
39
  "js-yaml": "^4.1.0",
40
40
  "json-schema-merge-allof": "^0.8.1",
41
41
  "openapi-typescript-validator-ext-ref": "^3.2.0-external-ref-support",
42
- "swagger-ui-express": "^4.6.2",
42
+ "swagger-ui-express": "^5.0.1",
43
43
  "yamljs": "^0.3.0",
44
44
  "yargs": "^17.7.1"
45
45
  },
46
46
  "devDependencies": {
47
+ "@types/jest": "^29.5.12",
47
48
  "execa": "^5.0.0",
48
49
  "fs-extra": "^11.1.1",
49
50
  "jest": "^29.5.0"
@@ -10,6 +10,14 @@
10
10
  "documentationProvider": "none",
11
11
  "annotationLibrary": "none",
12
12
  "useSpringBoot3": true,
13
+ "typeMappings": {
14
+ "OffsetDateTime": "java.time.Instant",
15
+ "Date": "java.time.LocalDate"
16
+ },
17
+ "importMappings": {
18
+ "java.time.OffsetDateTime": "java.time.Instant",
19
+ "java.util.Date": "java.time.LocalDate"
20
+ },
13
21
  "inlineSchemaOptions": {
14
22
  "ARRAY_ITEM_SUFFIX": "",
15
23
  "MAP_ITEM_SUFFIX": "",
@@ -8,6 +8,16 @@
8
8
  "documentationProvider": "none",
9
9
  "annotationLibrary": "none",
10
10
  "useSpringBoot3": true,
11
+ "typeMappings": {
12
+ "DateTime": "java.time.Instant",
13
+ "java.time.OffsetDateTime": "java.time.Instant",
14
+ "java.util.Date": "java.time.LocalDate"
15
+ },
16
+ "importMappings": {
17
+ "DateTime": "java.time.Instant",
18
+ "java.time.OffsetDateTime": "java.time.Instant",
19
+ "java.util.Date": "java.time.LocalDate"
20
+ },
11
21
  "inlineSchemaOptions": {
12
22
  "ARRAY_ITEM_SUFFIX": "",
13
23
  "MAP_ITEM_SUFFIX": "",
@@ -15,11 +15,12 @@
15
15
  "peerDependencies": {
16
16
  "@nestjs/common": "^9.0.0 || ^10.0.0",
17
17
  "@nestjs/core": "^9.0.0 || ^10.0.0",
18
- "@nestjs/platform-express": "^9.0.0 || ^10.0.0"
18
+ "@nestjs/platform-express": "^9.0.0 || ^10.0.0",
19
+ "@types/validator": "13.11.7"
19
20
  },
20
21
  "dependencies": {
21
22
  "class-transformer": "^0.5.1",
22
- "class-validator": "^0.14.0"
23
+ "class-validator": "0.14.0"
23
24
  },
24
25
  "devDependencies": {
25
26
  "@nestjs/common": "^9.0.0",
@@ -77,7 +77,7 @@ export class OptionalParseBoolPipe implements PipeTransform<string | boolean> {
77
77
  }
78
78
  }
79
79
 
80
- export class OptionalParseEnumPipe<T = any> implements PipeTransform<T> {
80
+ export class OptionalParseEnumPipe<T extends { [key: string]: any } = any> implements PipeTransform<T> {
81
81
  constructor(private readonly enumType: T) {
82
82
  if (!enumType) {
83
83
  throw new Error(
@@ -12,7 +12,7 @@ function rewritePathParameters(fileName) {
12
12
  const contents = fs.readFileSync(file, 'utf-8');
13
13
 
14
14
  var result = contents.replace(/\${this\.configuration\.encodeParam\({name:\s&quot;/g, ':');
15
- result = result.replace(/&quot;.*}\)}/g, '');
15
+ result = result.replace(/&quot;.*?}\)}/g, '');
16
16
 
17
17
  var options = { flag : 'w', encoding: 'utf8' };
18
18
  fs.writeFileSync(file, result, options);
@@ -10,5 +10,15 @@
10
10
  "ARRAY_ITEM_SUFFIX": "",
11
11
  "MAP_ITEM_SUFFIX": "",
12
12
  "SKIP_SCHEMA_REUSE": "true"
13
+ },
14
+ "files": {
15
+ "hook.mustache": {
16
+ "destinationFilename": ".hook.ts",
17
+ "templateType": "API"
18
+ },
19
+ "use-api.hook.mustache": {
20
+ "folder": "src/apis",
21
+ "destinationFilename": "use-api.hook.tsx"
22
+ }
13
23
  }
14
24
  }
@@ -0,0 +1,18 @@
1
+ /* tslint:disable */
2
+ /* eslint-disable */
3
+ {{#useSagaAndRecords}}
4
+ export * from './SagaApiManager{{importFileExtension}}'
5
+ export * from './allSagas{{importFileExtension}}'
6
+ {{/useSagaAndRecords}}
7
+ export * from './use-api.hook{{importFileExtension}}';
8
+ {{#apiInfo}}
9
+ {{#apis}}
10
+ {{#operations}}
11
+ export * from './{{ classFilename }}{{importFileExtension}}';
12
+ export * from './{{ classFilename }}.hook{{importFileExtension}}';
13
+ {{#useSagaAndRecords}}
14
+ export * from './{{{ classFilename }}}Sagas{{importFileExtension}}';
15
+ {{/useSagaAndRecords}}
16
+ {{/operations}}
17
+ {{/apis}}
18
+ {{/apiInfo}}
@@ -0,0 +1,111 @@
1
+ /* tslint:disable */
2
+ /* eslint-disable */
3
+ {{>licenseInfo}}
4
+
5
+ import { useMutation, UseMutationOptions, UseMutationResult, useQuery, UseQueryOptions, UseQueryResult } from '@tanstack/react-query';
6
+ import { useApi } from './use-api.hook';
7
+ {{#imports.0}}
8
+ import type {
9
+ {{#imports}}
10
+ {{className}},
11
+ {{/imports}}
12
+ } from '../models/index{{importFileExtension}}';
13
+ {{/imports.0}}
14
+ {{#operations}}
15
+ import {
16
+ {{classname}},
17
+ {{#operation}}
18
+ {{#allParams.0}}
19
+ {{#prefixParameterInterfaces}}{{classname}}{{/prefixParameterInterfaces}}{{operationIdCamelCase}}Request,
20
+ {{/allParams.0}}
21
+ {{/operation}}
22
+ } from './{{ classFilename }}{{importFileExtension}}';
23
+ {{/operations}}
24
+
25
+ {{#operations}}
26
+ {{#operation}}
27
+
28
+ export type {{classname}}{{#lambda.titlecase}}{{nickname}}{{/lambda.titlecase}}Parameters =
29
+ {{^useSingleRequestParameter}}
30
+ { parameters: Parameters<{{classname}}['{{nickname}}']>};
31
+ {{/useSingleRequestParameter}}
32
+ {{#useSingleRequestParameter}}
33
+ {{#allParams.0}}{{#prefixParameterInterfaces}}{{classname}}{{/prefixParameterInterfaces}}{{operationIdCamelCase}}Request{{/allParams.0}}{{^allParams.0}}void{{/allParams.0}};
34
+ {{/useSingleRequestParameter}}
35
+
36
+ /**
37
+ {{#notes}}
38
+ * {{&notes}}
39
+ {{/notes}}
40
+ {{#summary}}
41
+ * {{&summary}}
42
+ {{/summary}}
43
+ {{#isDeprecated}}
44
+ * @deprecated
45
+ {{/isDeprecated}}
46
+ */
47
+ export const use{{classname}}{{#lambda.titlecase}}{{nickname}}{{/lambda.titlecase}}Mutation = <TContext = unknown>(
48
+ { onSuccess, ...options }: Omit<UseMutationOptions<{{{returnType}}}{{^returnType}}void{{/returnType}}, Error, {{classname}}{{#lambda.titlecase}}{{nickname}}{{/lambda.titlecase}}Parameters, TContext>, 'mutationFn'> = {}
49
+ ): UseMutationResult<{{{returnType}}}{{^returnType}}void{{/returnType}}, Error, {{classname}}{{#lambda.titlecase}}{{nickname}}{{/lambda.titlecase}}Parameters, TContext> => {
50
+ const api = useApi({{classname}});
51
+ return useMutation<{{{returnType}}}{{^returnType}}void{{/returnType}}, Error, {{classname}}{{#lambda.titlecase}}{{nickname}}{{/lambda.titlecase}}Parameters, TContext>({
52
+ {{^useSingleRequestParameter}}
53
+ mutationFn: ({ parameters }) => api.{{nickname}}(...parameters),
54
+ {{/useSingleRequestParameter}}
55
+ {{#useSingleRequestParameter}}
56
+ {{#allParams.0}}
57
+ mutationFn: (parameters) => api.{{nickname}}(parameters),
58
+ {{/allParams.0}}
59
+ {{^allParams.0}}
60
+ mutationFn: () => api.{{nickname}}(),
61
+ {{/allParams.0}}
62
+ {{/useSingleRequestParameter}}
63
+ ...options,
64
+ });
65
+ }
66
+ /**
67
+ {{#notes}}
68
+ * {{&notes}}
69
+ {{/notes}}
70
+ {{#summary}}
71
+ * {{&summary}}
72
+ {{/summary}}
73
+ {{#isDeprecated}}
74
+ * @deprecated
75
+ {{/isDeprecated}}
76
+ */
77
+ export const use{{classname}}{{#lambda.titlecase}}{{nickname}}{{/lambda.titlecase}}Query = (
78
+ options: Partial<Omit<UseQueryOptions<{{{returnType}}}{{^returnType}}void{{/returnType}}>, 'queryFn'>> = {}
79
+ {{^useSingleRequestParameter}}
80
+ ,{parameters}: Partial<{{classname}}{{#lambda.titlecase}}{{nickname}}{{/lambda.titlecase}}Parameters>
81
+ {{/useSingleRequestParameter}}
82
+ {{#useSingleRequestParameter}}
83
+ {{#allParams.0}}
84
+ ,parameter: {{classname}}{{#lambda.titlecase}}{{nickname}}{{/lambda.titlecase}}Parameters | undefined
85
+ {{/allParams.0}}
86
+ {{/useSingleRequestParameter}}
87
+ ): UseQueryResult<{{{returnType}}}{{^returnType}}void{{/returnType}}> => {
88
+ const api = useApi({{classname}});
89
+ return useQuery<{{{returnType}}}{{^returnType}}void{{/returnType}}>({
90
+ {{^useSingleRequestParameter}}
91
+ queryKey: ['{{classname}}','{{nickname}}', ...requestParameters],
92
+ queryFn: ({ signal }) => api.{{nickname}}(...requestParameters.slice(0, -1), { ...requestParameters[requestParameters.length - 1], signal }),
93
+ enabled: !!parameters,
94
+ {{/useSingleRequestParameter}}
95
+ {{#useSingleRequestParameter}}
96
+ {{#allParams.0}}
97
+ queryKey: ['{{classname}}','{{nickname}}', parameter],
98
+ queryFn: ({ signal }) => api.{{nickname}}(parameter, { signal }),
99
+ enabled: !!parameter,
100
+ {{/allParams.0}}
101
+ {{^allParams.0}}
102
+ queryKey: ['{{classname}}','{{nickname}}'],
103
+ queryFn: ({ signal }) => api.{{nickname}}({ signal }),
104
+ {{/allParams.0}}
105
+ {{/useSingleRequestParameter}}
106
+ ...options,
107
+ });
108
+ }
109
+ {{/operation}}
110
+
111
+ {{/operations}}
@@ -0,0 +1,45 @@
1
+ {
2
+ "name": "{{npmName}}",
3
+ "version": "{{npmVersion}}",
4
+ "description": "OpenAPI client for {{npmName}}",
5
+ "author": "OpenAPI-Generator",
6
+ "repository": {
7
+ "type": "git",
8
+ "url": "https://{{gitHost}}/{{gitUserId}}/{{gitRepoId}}.git"
9
+ },
10
+ {{#packageAsSourceOnlyLibrary}}
11
+ "main": "./index.ts",
12
+ {{/packageAsSourceOnlyLibrary}}
13
+ {{^packageAsSourceOnlyLibrary}}
14
+ "main": "./dist/index.js",
15
+ "typings": "./dist/index.d.ts",
16
+ {{#supportsES6}}
17
+ "module": "./dist/esm/index.js",
18
+ "sideEffects": false,
19
+ {{/supportsES6}}
20
+ "scripts": {
21
+ "build": "tsc{{#supportsES6}} && tsc -p tsconfig.esm.json{{/supportsES6}}"{{^sagasAndRecords}},
22
+ "prepare": "npm run build"{{/sagasAndRecords}}
23
+ },
24
+ {{/packageAsSourceOnlyLibrary}}
25
+ "devDependencies": {
26
+ {{#sagasAndRecords}}
27
+ "immutable": "^4.0.0-rc.12",
28
+ "normalizr": "^3.6.1",
29
+ "redux-saga": "^1.1.3",
30
+ "redux-ts-simple": "^3.2.0",
31
+ "reselect": "^4.0.0",
32
+ {{/sagasAndRecords}}
33
+ "typescript": "^4.0",
34
+ "@types/react": "^18.2.24"
35
+ },
36
+ "peerDependencies": {
37
+ "react": "^18.2.0",
38
+ "@tanstack/react-query": "^5.12.2"
39
+ }{{#npmRepository}},{{/npmRepository}}
40
+ {{#npmRepository}}
41
+ "publishConfig": {
42
+ "registry": "{{npmRepository}}"
43
+ }
44
+ {{/npmRepository}}
45
+ }
@@ -0,0 +1,8 @@
1
+ {
2
+ "extends": "./tsconfig.json",
3
+ "compilerOptions": {
4
+ "module": "esnext",
5
+ "outDir": "dist/esm",
6
+ "jsx": "react-jsx"
7
+ }
8
+ }
@@ -0,0 +1,26 @@
1
+ {
2
+ "compilerOptions": {
3
+ "declaration": true,
4
+ "target": "{{#supportsES6}}es6{{/supportsES6}}{{^supportsES6}}es5{{/supportsES6}}",
5
+ {{#sagasAndRecords}}
6
+ "strict": true,
7
+ {{/sagasAndRecords}}
8
+ "module": "commonjs",
9
+ "moduleResolution": "node",
10
+ "outDir": "dist",
11
+ {{^supportsES6}}
12
+ "lib": [
13
+ "es6",
14
+ "dom"
15
+ ],
16
+ {{/supportsES6}}
17
+ "typeRoots": [
18
+ "node_modules/@types"
19
+ ],
20
+ "jsx": "react-jsx",
21
+ },
22
+ "exclude": [
23
+ "dist",
24
+ "node_modules"
25
+ ]
26
+ }
@@ -0,0 +1,155 @@
1
+ import {
2
+ createContext,
3
+ useContext,
4
+ useCallback,
5
+ useMemo,
6
+ FC,
7
+ PropsWithChildren,
8
+ } from "react";
9
+ import * as runtime from '../runtime';
10
+ {{#apiInfo}}
11
+ {{#apis}}
12
+ {{#operations}}
13
+ import { {{classname}} } from './{{ classFilename }}{{importFileExtension}}';
14
+ {{/operations}}
15
+ {{/apis}}
16
+
17
+
18
+ type APIS_IN_ORDER = [
19
+ {{#apis}}
20
+ {{#operations}}
21
+ {{classname}},
22
+ {{/operations}}
23
+ {{/apis}}
24
+ ];
25
+
26
+ export type APIS = APIS_IN_ORDER[number];
27
+
28
+ export declare interface Type<T> extends Function {
29
+ new (...args: any[]): T;
30
+ }
31
+
32
+ export const ApiContext = createContext<{ getApi: <T extends APIS>(api: Type<T>) => T | undefined }>({
33
+ getApi: () => undefined,
34
+ });
35
+
36
+ export const getApiInstance = <TArray extends APIS[], T extends TArray[number]>(
37
+ api: Type<T>,
38
+ apis: TArray
39
+ ): T => {
40
+ return apis.find((a) => a instanceof api) as T;
41
+ };
42
+
43
+ export const ApiProvider: FC<PropsWithChildren<{ apis: APIS[] }>> = ({
44
+ apis,
45
+ children,
46
+ }) => {
47
+ const parent = useContext(ApiContext);
48
+ const getApi = useCallback(<T extends APIS>(api: Type<T>): T => {
49
+ const apiInstance = (apis.find((a) => a instanceof api) ?? parent.getApi(api)) as T | undefined;
50
+ if (!apiInstance) {
51
+ throw new Error(`API instance for ${api.name} not found. Please provide it using ApiProvider from '{{npmName}}'`);
52
+ }
53
+ return apiInstance;
54
+ }, [apis, parent.getApi]);
55
+ const value = useMemo(() => ({ getApi }), [getApi]);
56
+
57
+ return (
58
+ <ApiContext.Provider value={value}>
59
+ {children}
60
+ </ApiContext.Provider>
61
+ );
62
+ };
63
+
64
+ export const useApi = <T extends APIS>(api: Type<T>): T => {
65
+ const { getApi } = useContext(ApiContext);
66
+ return getApi(api);
67
+ }
68
+
69
+ export const ApiConfigContext = createContext<runtime.ConfigurationParameters>({});
70
+
71
+ export const ApiConfigProvider: FC<PropsWithChildren<{ config: runtime.ConfigurationParameters }>> = ({
72
+ config,
73
+ children,
74
+ }) => {
75
+ return (
76
+ <ApiConfigContext.Provider value={config}>
77
+ {children}
78
+ </ApiConfigContext.Provider>
79
+ );
80
+ };
81
+
82
+ export const ApiConfigWithInheritProvider: FC<PropsWithChildren<{ config: runtime.ConfigurationParameters }>> = ({
83
+ config,
84
+ children,
85
+ }) => {
86
+ const parent = useContext(ApiConfigContext);
87
+ const value = useMemo(() => ({
88
+ ...parent,
89
+ ...config,
90
+ middleware: [...parent.middleware ?? [], ...config.middleware ?? []],
91
+ headers: { ...parent.headers, ...config.headers },
92
+ }), [parent, config]);
93
+
94
+ return (
95
+ <ApiConfigContext.Provider value={value}>
96
+ {children}
97
+ </ApiConfigContext.Provider>
98
+ );
99
+ };
100
+
101
+ export const useApiConfig = (): runtime.Configuration => {
102
+ const configParameters = useContext(ApiConfigContext);
103
+ const config = useMemo(() => new runtime.Configuration(configParameters), [configParameters]);
104
+ return config;
105
+ }
106
+
107
+ type ReadonlyApiConstructorToType<T> = T extends [
108
+ infer ARRAYFIRST,
109
+ ...infer ARRAYREST
110
+ ]
111
+ ? ARRAYFIRST extends InstanceType<infer ARRAYFIRSTTYPE>
112
+ ? [InstanceType<ARRAYFIRST>, ...ReadonlyApiConstructorToType<ARRAYREST>]
113
+ : []
114
+ : [];
115
+
116
+ type ApiConstructorToType<T extends Array<unknown>> = T[0] extends undefined
117
+ ? APIS_IN_ORDER
118
+ : ReadonlyApiConstructorToType<T> extends []
119
+ ? APIS[]
120
+ : ReadonlyApiConstructorToType<T>;
121
+
122
+ export const createApiInstances = <T extends Type<APIS>[]>(
123
+ config: runtime.Configuration,
124
+ apis: T = [] as unknown as T
125
+ ): ApiConstructorToType<T> => {
126
+ if (apis.length > 0) {
127
+ return apis.map((api) => new api(config)) as ApiConstructorToType<T>;
128
+ }
129
+ return [
130
+ {{#apis}}
131
+ {{#operations}}
132
+ new {{classname}}(config),
133
+ {{/operations}}
134
+ {{/apis}}
135
+ ] as unknown as ApiConstructorToType<T>;
136
+ };
137
+
138
+ export const useCreateApiInstances = <T extends Type<APIS>[]>(
139
+ apis: T = [] as unknown as T
140
+ ): ApiConstructorToType<T> => {
141
+ const config = useApiConfig();
142
+ return useMemo(() => createApiInstances(config, apis), [apis, config]);
143
+ };
144
+ {{/apiInfo}}
145
+
146
+ export const ApiInstancesProvider: FC<PropsWithChildren<{ apis: Type<APIS>[] }>> = (
147
+ { apis, children }
148
+ ) => {
149
+ const apiInstances = useCreateApiInstances(apis);
150
+ return (
151
+ <ApiProvider apis={apiInstances}>
152
+ {children}
153
+ </ApiProvider>
154
+ );
155
+ };
@@ -12,6 +12,12 @@
12
12
  "documentationProvider": "none",
13
13
  "annotationLibrary": "none",
14
14
  "useSpringBoot3": true,
15
+ "typeMappings": {
16
+ "OffsetDateTime": "java.time.Instant"
17
+ },
18
+ "importMappings": {
19
+ "java.time.OffsetDateTime": "java.time.Instant"
20
+ },
15
21
  "inlineSchemaOptions": {
16
22
  "ARRAY_ITEM_SUFFIX": "",
17
23
  "MAP_ITEM_SUFFIX": "",
@@ -9,9 +9,13 @@
9
9
  "documentationProvider": "none",
10
10
  "useSpringBoot3": true,
11
11
  "typeMappings": {
12
+ "DateTime": "java.time.Instant",
13
+ "OffsetDateTime": "java.time.Instant",
12
14
  "org.springframework.core.io.Resource": "org.springframework.web.multipart.MultipartFile"
13
15
  },
14
16
  "importMappings": {
17
+ "DateTime": "java.time.Instant",
18
+ "java.time.OffsetDateTime": "java.time.Instant",
15
19
  "org.springframework.core.io.Resource": "org.springframework.web.multipart.MultipartFile"
16
20
  },
17
21
  "inlineSchemaOptions": {