Skip to content

Commit 82eb57f

Browse files
authored
Merge pull request #2072 from umbraco/dependabot/npm_and_yarn/hey-api/openapi-ts-0.48.1
Bump @hey-api/openapi-ts from 0.37.3 to 0.48.1
2 parents 25410af + 41c1c37 commit 82eb57f

File tree

15 files changed

+22396
-14764
lines changed

15 files changed

+22396
-14764
lines changed
Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
import { defineConfig } from '@hey-api/openapi-ts';
2+
3+
export default defineConfig({
4+
client: 'fetch',
5+
input: 'https://raw.githubusercontent.com/umbraco/Umbraco-CMS/v14/dev/src/Umbraco.Cms.Api.Management/OpenApi.json',
6+
output: {
7+
path: 'src/external/backend-api/src',
8+
format: 'prettier',
9+
lint: 'eslint',
10+
},
11+
schemas: false,
12+
services: {
13+
asClass: true,
14+
},
15+
types: {
16+
enums: 'typescript',
17+
},
18+
});
Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
import { defineConfig } from '@hey-api/openapi-ts';
2+
3+
export default defineConfig({
4+
client: 'fetch',
5+
debug: true,
6+
input: 'http://localhost:11000/umbraco/swagger/management/swagger.json',
7+
output: {
8+
path: 'src/external/backend-api/src',
9+
format: 'prettier',
10+
lint: 'eslint',
11+
},
12+
schemas: false,
13+
services: {
14+
asClass: true,
15+
},
16+
types: {
17+
enums: 'typescript',
18+
},
19+
});
Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
import { defineConfig } from '@hey-api/openapi-ts';
2+
3+
export default defineConfig({
4+
client: 'fetch',
5+
debug: true,
6+
input: '../Umbraco.Cms.Api.Management/OpenApi.json',
7+
output: {
8+
path: 'src/external/backend-api/src',
9+
format: 'prettier',
10+
lint: 'eslint',
11+
},
12+
schemas: false,
13+
services: {
14+
asClass: true,
15+
},
16+
types: {
17+
enums: 'typescript',
18+
},
19+
});

package-lock.json

Lines changed: 31 additions & 23 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

package.json

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -159,9 +159,9 @@
159159
"example": "node ./devops/example-runner/index.js",
160160
"format:fix": "npm run format -- --write",
161161
"format": "prettier 'src/**/*.ts' --check",
162-
"generate:server-api-local": "openapi-ts --input ../Umbraco.Cms.Api.Management/OpenApi.json --output src/external/backend-api/src --debug true --enums typescript --lint true --schemas false",
163-
"generate:server-api-dev": "openapi-ts --input http://localhost:11000/umbraco/swagger/management/swagger.json --output src/external/backend-api/src --debug true --enums typescript --lint true --schemas false",
164-
"generate:server-api": "openapi-ts --input https://raw.githubusercontent.com/umbraco/Umbraco-CMS/v14/dev/src/Umbraco.Cms.Api.Management/OpenApi.json --output src/external/backend-api/src --debug true --enums typescript --lint true --schemas false",
162+
"generate:server-api-local": "openapi-ts --file devops/openapi-ts/openapi-ts.local.config.js",
163+
"generate:server-api-dev": "openapi-ts --file devops/openapi-ts/openapi-ts.dev.config.js",
164+
"generate:server-api": "openapi-ts --file devops/openapi-ts/openapi-ts.config.js",
165165
"generate:icons": "node ./devops/icons/index.js",
166166
"generate:overrides": "node ./devops/tsc/index.js",
167167
"generate:jsonschema:dist": "typescript-json-schema --required --include \"./src/packages/core/extension-registry/umbraco-package.ts\" --out dist-cms/umbraco-package-schema.json tsconfig.json UmbracoPackage",
@@ -211,7 +211,7 @@
211211
"devDependencies": {
212212
"@babel/core": "^7.24.3",
213213
"@eslint/js": "^9.6.0",
214-
"@hey-api/openapi-ts": "^0.37.3",
214+
"@hey-api/openapi-ts": "^0.48.1",
215215
"@mdx-js/react": "^3.0.0",
216216
"@open-wc/testing": "^4.0.0",
217217
"@playwright/test": "^1.41.1",

src/external/backend-api/src/core/ApiRequestOptions.ts

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
export type ApiRequestOptions = {
1+
export type ApiRequestOptions<T = unknown> = {
22
readonly method: 'GET' | 'PUT' | 'POST' | 'DELETE' | 'OPTIONS' | 'HEAD' | 'PATCH';
33
readonly url: string;
44
readonly path?: Record<string, unknown>;
@@ -9,5 +9,6 @@ export type ApiRequestOptions = {
99
readonly body?: any;
1010
readonly mediaType?: string;
1111
readonly responseHeader?: string;
12-
readonly errors?: Record<number, string>;
12+
readonly responseTransformer?: (data: unknown) => Promise<T>;
13+
readonly errors?: Record<number | string, string>;
1314
};

src/external/backend-api/src/core/OpenAPI.ts

Lines changed: 11 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@ import type { ApiRequestOptions } from './ApiRequestOptions';
22

33
type Headers = Record<string, string>;
44
type Middleware<T> = (value: T) => T | Promise<T>;
5-
type Resolver<T> = (options: ApiRequestOptions) => Promise<T>;
5+
type Resolver<T> = (options: ApiRequestOptions<T>) => Promise<T>;
66

77
export class Interceptors<T> {
88
_fns: Middleware<T>[];
@@ -11,17 +11,14 @@ export class Interceptors<T> {
1111
this._fns = [];
1212
}
1313

14-
eject(fn: Middleware<T>) {
14+
eject(fn: Middleware<T>): void {
1515
const index = this._fns.indexOf(fn);
1616
if (index !== -1) {
17-
this._fns = [
18-
...this._fns.slice(0, index),
19-
...this._fns.slice(index + 1),
20-
];
17+
this._fns = [...this._fns.slice(0, index), ...this._fns.slice(index + 1)];
2118
}
2219
}
2320

24-
use(fn: Middleware<T>) {
21+
use(fn: Middleware<T>): void {
2522
this._fns = [...this._fns, fn];
2623
}
2724
}
@@ -36,8 +33,10 @@ export type OpenAPIConfig = {
3633
USERNAME?: string | Resolver<string> | undefined;
3734
VERSION: string;
3835
WITH_CREDENTIALS: boolean;
39-
interceptors: {request: Interceptors<RequestInit>;
40-
response: Interceptors<Response>;};
36+
interceptors: {
37+
request: Interceptors<RequestInit>;
38+
response: Interceptors<Response>;
39+
};
4140
};
4241

4342
export const OpenAPI: OpenAPIConfig = {
@@ -50,6 +49,8 @@ export const OpenAPI: OpenAPIConfig = {
5049
USERNAME: undefined,
5150
VERSION: 'Latest',
5251
WITH_CREDENTIALS: false,
53-
interceptors: {request: new Interceptors(),response: new Interceptors(),
52+
interceptors: {
53+
request: new Interceptors(),
54+
response: new Interceptors(),
5455
},
5556
};

src/external/backend-api/src/core/request.ts

Lines changed: 20 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -42,7 +42,9 @@ export const getQueryString = (params: Record<string, unknown>): string => {
4242
return;
4343
}
4444

45-
if (Array.isArray(value)) {
45+
if (value instanceof Date) {
46+
append(key, value.toISOString());
47+
} else if (Array.isArray(value)) {
4648
value.forEach(v => encodePair(key, v));
4749
} else if (typeof value === 'object') {
4850
Object.entries(value).forEach(([k, v]) => encodePair(`${key}[${k}]`, v));
@@ -99,20 +101,24 @@ export const getFormData = (options: ApiRequestOptions): FormData | undefined =>
99101
return undefined;
100102
};
101103

102-
type Resolver<T> = (options: ApiRequestOptions) => Promise<T>;
104+
type Resolver<T> = (options: ApiRequestOptions<T>) => Promise<T>;
103105

104-
export const resolve = async <T>(options: ApiRequestOptions, resolver?: T | Resolver<T>): Promise<T | undefined> => {
106+
export const resolve = async <T>(options: ApiRequestOptions<T>, resolver?: T | Resolver<T>): Promise<T | undefined> => {
105107
if (typeof resolver === 'function') {
106108
return (resolver as Resolver<T>)(options);
107109
}
108110
return resolver;
109111
};
110112

111-
export const getHeaders = async (config: OpenAPIConfig, options: ApiRequestOptions): Promise<Headers> => {
113+
export const getHeaders = async <T>(config: OpenAPIConfig, options: ApiRequestOptions<T>): Promise<Headers> => {
112114
const [token, username, password, additionalHeaders] = await Promise.all([
115+
// @ts-ignore
113116
resolve(options, config.TOKEN),
117+
// @ts-ignore
114118
resolve(options, config.USERNAME),
119+
// @ts-ignore
115120
resolve(options, config.PASSWORD),
121+
// @ts-ignore
116122
resolve(options, config.HEADERS),
117123
]);
118124

@@ -154,7 +160,7 @@ export const getHeaders = async (config: OpenAPIConfig, options: ApiRequestOptio
154160
export const getRequestBody = (options: ApiRequestOptions): unknown => {
155161
if (options.body !== undefined) {
156162
if (options.mediaType?.includes('application/json') || options.mediaType?.includes('+json')) {
157-
return JSON.stringify(options.body)
163+
return JSON.stringify(options.body);
158164
} else if (isString(options.body) || isBlob(options.body) || isFormData(options.body)) {
159165
return options.body;
160166
} else {
@@ -187,7 +193,7 @@ export const sendRequest = async (
187193
}
188194

189195
for (const fn of config.interceptors.request._fns) {
190-
request = await fn(request)
196+
request = await fn(request);
191197
}
192198

193199
onCancel(() => controller.abort());
@@ -302,7 +308,7 @@ export const catchErrorCodes = (options: ApiRequestOptions, result: ApiResult):
302308
* @returns CancelablePromise<T>
303309
* @throws ApiError
304310
*/
305-
export const request = <T>(config: OpenAPIConfig, options: ApiRequestOptions): CancelablePromise<T> => {
311+
export const request = <T>(config: OpenAPIConfig, options: ApiRequestOptions<T>): CancelablePromise<T> => {
306312
return new CancelablePromise(async (resolve, reject, onCancel) => {
307313
try {
308314
const url = getUrl(config, options);
@@ -314,18 +320,23 @@ export const request = <T>(config: OpenAPIConfig, options: ApiRequestOptions): C
314320
let response = await sendRequest(config, options, url, body, formData, headers, onCancel);
315321

316322
for (const fn of config.interceptors.response._fns) {
317-
response = await fn(response)
323+
response = await fn(response);
318324
}
319325

320326
const responseBody = await getResponseBody(response);
321327
const responseHeader = getResponseHeader(response, options.responseHeader);
322328

329+
let transformedBody = responseBody;
330+
if (options.responseTransformer && response.ok) {
331+
transformedBody = await options.responseTransformer(responseBody)
332+
}
333+
323334
const result: ApiResult = {
324335
url,
325336
ok: response.ok,
326337
status: response.status,
327338
statusText: response.statusText,
328-
body: responseHeader ?? responseBody,
339+
body: responseHeader ?? transformedBody,
329340
};
330341

331342
catchErrorCodes(options, result);

src/external/backend-api/src/index.ts

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
1-
1+
// This file is auto-generated by @hey-api/openapi-ts
22
export { ApiError } from './core/ApiError';
33
export { CancelablePromise, CancelError } from './core/CancelablePromise';
44
export { OpenAPI, type OpenAPIConfig } from './core/OpenAPI';
5-
export * from './models';
6-
export * from './services';
5+
export * from './services.gen';
6+
export * from './types.gen';

0 commit comments

Comments
 (0)