Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1,683 changes: 866 additions & 817 deletions src/Umbraco.Community.SimpleTrees.Client/package-lock.json

Large diffs are not rendered by default.

10 changes: 5 additions & 5 deletions src/Umbraco.Community.SimpleTrees.Client/package.json
Original file line number Diff line number Diff line change
Expand Up @@ -11,12 +11,12 @@
},
"devDependencies": {
"lit": "^3.3.1",
"@hey-api/openapi-ts": "^0.80.1",
"@umbraco-cms/backoffice": "^16.1.0",
"typescript": "^5.8.3",
"vite": "^7.0.6"
"@hey-api/openapi-ts": "^0.82.4",
"@umbraco-cms/backoffice": "^16.2.0",
"typescript": "^5.9.2",
"vite": "^7.1.5"
},
"volta": {
"node": "22.14.0"
"node": "22.12.0"
}
}
Original file line number Diff line number Diff line change
@@ -1,4 +1,13 @@
import type { Client, Config, RequestOptions } from './types';
// This file is auto-generated by @hey-api/openapi-ts

import { createSseClient } from '../core/serverSentEvents.gen';
import type { HttpMethod } from '../core/types.gen';
import type {
Client,
Config,
RequestOptions,
ResolvedRequestOptions,
} from './types.gen';
import {
buildUrl,
createConfig,
Expand All @@ -7,7 +16,7 @@ import {
mergeConfigs,
mergeHeaders,
setAuthParams,
} from './utils';
} from './utils.gen';

type ReqInit = Omit<RequestInit, 'body' | 'headers'> & {
body?: any;
Expand All @@ -28,15 +37,16 @@ export const createClient = (config: Config = {}): Client => {
Request,
Response,
unknown,
RequestOptions
ResolvedRequestOptions
>();

const request: Client['request'] = async (options) => {
const beforeRequest = async (options: RequestOptions) => {
const opts = {
..._config,
...options,
fetch: options.fetch ?? _config.fetch ?? globalThis.fetch,
headers: mergeHeaders(_config.headers, options.headers),
serializedBody: undefined,
};

if (opts.security) {
Expand All @@ -50,19 +60,27 @@ export const createClient = (config: Config = {}): Client => {
await opts.requestValidator(opts);
}

if (opts.body && opts.bodySerializer) {
opts.body = opts.bodySerializer(opts.body);
if (opts.body !== undefined && opts.bodySerializer) {
opts.serializedBody = opts.bodySerializer(opts.body);
}

// remove Content-Type header if body is empty to avoid sending invalid requests
if (opts.body === undefined || opts.body === '') {
if (opts.body === undefined || opts.serializedBody === '') {
opts.headers.delete('Content-Type');
}

const url = buildUrl(opts);

return { opts, url };
};

const request: Client['request'] = async (options) => {
// @ts-expect-error
const { opts, url } = await beforeRequest(options);
const requestInit: ReqInit = {
redirect: 'follow',
...opts,
body: getValidRequestBody(opts),
};

let request = new Request(url, requestInit);
Expand Down Expand Up @@ -90,23 +108,41 @@ export const createClient = (config: Config = {}): Client => {
};

if (response.ok) {
const parseAs =
(opts.parseAs === 'auto'
? getParseAs(response.headers.get('Content-Type'))
: opts.parseAs) ?? 'json';

if (
response.status === 204 ||
response.headers.get('Content-Length') === '0'
) {
let emptyData: any;
switch (parseAs) {
case 'arrayBuffer':
case 'blob':
case 'text':
emptyData = await response[parseAs]();
break;
case 'formData':
emptyData = new FormData();
break;
case 'stream':
emptyData = response.body;
break;
case 'json':
default:
emptyData = {};
break;
}
return opts.responseStyle === 'data'
? {}
? emptyData
: {
data: {},
data: emptyData,
...result,
};
}

const parseAs =
(opts.parseAs === 'auto'
? getParseAs(response.headers.get('Content-Type'))
: opts.parseAs) ?? 'json';

let data: any;
switch (parseAs) {
case 'arrayBuffer':
Expand Down Expand Up @@ -176,20 +212,76 @@ export const createClient = (config: Config = {}): Client => {
};
};

function getValidRequestBody(options: ResolvedRequestOptions) {
const hasBody = options.body !== undefined;
const isSerializedBody = hasBody && options.bodySerializer;

if (isSerializedBody) {
const hasSerializedBody =
options.serializedBody !== undefined && options.serializedBody !== '';

return hasSerializedBody ? options.serializedBody : null;
}

// plain/text body
if (hasBody) {
return options.body;
}

// no body was provided
return undefined;
}

const makeMethodFn =
(method: Uppercase<HttpMethod>) => (options: RequestOptions) =>
request({ ...options, method });

const makeSseFn =
(method: Uppercase<HttpMethod>) => async (options: RequestOptions) => {
const { opts, url } = await beforeRequest(options);
return createSseClient({
...opts,
body: opts.body as BodyInit | null | undefined,
headers: opts.headers as unknown as Record<string, string>,
method,
onRequest: async (url, init) => {
let request = new Request(url, init);
for (const fn of interceptors.request._fns) {
if (fn) {
request = await fn(request, opts);
}
}
return request;
},
url,
});
};

return {
buildUrl,
connect: (options) => request({ ...options, method: 'CONNECT' }),
delete: (options) => request({ ...options, method: 'DELETE' }),
get: (options) => request({ ...options, method: 'GET' }),
connect: makeMethodFn('CONNECT'),
delete: makeMethodFn('DELETE'),
get: makeMethodFn('GET'),
getConfig,
head: (options) => request({ ...options, method: 'HEAD' }),
head: makeMethodFn('HEAD'),
interceptors,
options: (options) => request({ ...options, method: 'OPTIONS' }),
patch: (options) => request({ ...options, method: 'PATCH' }),
post: (options) => request({ ...options, method: 'POST' }),
put: (options) => request({ ...options, method: 'PUT' }),
options: makeMethodFn('OPTIONS'),
patch: makeMethodFn('PATCH'),
post: makeMethodFn('POST'),
put: makeMethodFn('PUT'),
request,
setConfig,
trace: (options) => request({ ...options, method: 'TRACE' }),
};
sse: {
connect: makeSseFn('CONNECT'),
delete: makeSseFn('DELETE'),
get: makeSseFn('GET'),
head: makeSseFn('HEAD'),
options: makeSseFn('OPTIONS'),
patch: makeSseFn('PATCH'),
post: makeSseFn('POST'),
put: makeSseFn('PUT'),
trace: makeSseFn('TRACE'),
},
trace: makeMethodFn('TRACE'),
} as Client;
};
17 changes: 10 additions & 7 deletions src/Umbraco.Community.SimpleTrees.Client/src/api/client/index.ts
Original file line number Diff line number Diff line change
@@ -1,12 +1,14 @@
export type { Auth } from '../core/auth';
export type { QuerySerializerOptions } from '../core/bodySerializer';
// This file is auto-generated by @hey-api/openapi-ts

export type { Auth } from '../core/auth.gen';
export type { QuerySerializerOptions } from '../core/bodySerializer.gen';
export {
formDataBodySerializer,
jsonBodySerializer,
urlSearchParamsBodySerializer,
} from '../core/bodySerializer';
export { buildClientParams } from '../core/params';
export { createClient } from './client';
} from '../core/bodySerializer.gen';
export { buildClientParams } from '../core/params.gen';
export { createClient } from './client.gen';
export type {
Client,
ClientOptions,
Expand All @@ -16,7 +18,8 @@ export type {
OptionsLegacyParser,
RequestOptions,
RequestResult,
ResolvedRequestOptions,
ResponseStyle,
TDataShape,
} from './types';
export { createConfig, mergeHeaders } from './utils';
} from './types.gen';
export { createConfig, mergeHeaders } from './utils.gen';
Loading
Loading