Skip to content

Commit 39f811d

Browse files
jawnothinrenovate[bot]kerwanpluhnopenapi-ts-bot
authored
Nullable fix (#2)
* Update schema-object.ts * chore(deps): update dependency msw to v2.7.6 (openapi-ts#2287) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> * chore(deps): update dependency @types/node to v22.15.10 (openapi-ts#2293) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> * chore(deps): update dependency @shikijs/vitepress-twoslash to v3.4.0 (openapi-ts#2298) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> * chore(deps): update dependency @arethetypeswrong/cli to ^0.18.0 (openapi-ts#2272) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> * chore(deps): update dependency execa to v9.5.3 (openapi-ts#2303) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> * fix(metadata): fix thunk type detection (openapi-ts#2125) * Don't remove `null` type if a default is present. (openapi-ts#2145) * Don't remove `null` type if a default is present. * Don't remove `null` type from enums if default is present. * Don't remove `null` type if default is present (legacy) * [ci] release (openapi-ts#2307) * [ci] release * Add 2145 manually --------- Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com> Co-authored-by: Drew Powers <drew@pow.rs> * chore(deps): update dependency @types/react to v18.3.21 (openapi-ts#2218) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> * fix(openapi-fetch): fix overriding baseUrl per request without overriding default baseUrl (openapi-ts#2157) * Support $ref into `paths` (openapi-ts#2185) * React query handle 204 or zero content length (openapi-ts#2235) * fix(openapi-react-query): Handle 204 or zero Content-Length header by returning data as null * fix(openapi-react-query): updated and added 204 & zero Content-Length queryFn tests * chore(openapi-react-query): Fixed linting in test * chore(deps): update dependency @arethetypeswrong/cli to v0.18.1 (openapi-ts#2306) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> * chore(deps): update dependency msw to v2.8.2 (openapi-ts#2304) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> * Update Speakeasy URL (openapi-ts#2302) * chore(deps): update dependency @tanstack/react-query to v5.75.7 (openapi-ts#2301) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> * chore(deps): update dependency lint-staged to v15.5.2 (openapi-ts#2297) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> * feat(swr-openapi): add custom error types to query builder (openapi-ts#2147) * chore(deps): update vitest monorepo to v3 (openapi-ts#2284) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> * Encode the request body if Content-Type set (openapi-ts#2096) * Improve header handling (openapi-ts#2308) * [ci] release (openapi-ts#2309) * [ci] release * Release additional packages --------- Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com> Co-authored-by: Drew Powers <drew@pow.rs> * chore: update openapi-fetch test fixture (openapi-ts#2313) * Build packages with unbuild to improve CJS support (openapi-ts#2310) * [ci] release (openapi-ts#2314) * [ci] release * Fix major bump --------- Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com> Co-authored-by: Drew Powers <drew@pow.rs> * Update code of conduct source (openapi-ts#2316) Signed-off-by: Emmanuel Ferdman <emmanuelferdman@gmail.com> --------- Signed-off-by: Emmanuel Ferdman <emmanuelferdman@gmail.com> Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> Co-authored-by: Martin Paucot <contact@martin-paucot.fr> Co-authored-by: Theron Luhn <theron@luhn.com> Co-authored-by: openapi-ts-bot <openapi-ts@googlegroups.com> Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com> Co-authored-by: Drew Powers <drew@pow.rs> Co-authored-by: Luis Merino <mail@luismerino.name> Co-authored-by: Duncan Beevers <duncan@dweebd.com> Co-authored-by: Wheelebin <wheelebin@users.noreply.github.com> Co-authored-by: Nolan Di Mare Sullivan <nolan.dm.sullivan@gmail.com> Co-authored-by: しゅーまい <62363188+SSlime-s@users.noreply.github.com> Co-authored-by: Olga Bulat <obulat@gmail.com> Co-authored-by: Emmanuel Ferdman <emmanuelferdman@gmail.com>
1 parent b88ea37 commit 39f811d

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

68 files changed

+1149
-849
lines changed

README.md

+1-1
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,7 @@ Ultra-fast fetching for TypeScript generated automatically from your OpenAPI sch
1818

1919
<p align="center">
2020
<a href="https://zuplo.link/openapi-ts-gh"><img width="288" height="120" alt="Zuplo" src="./docs/public/assets/zuplo.svg"></a>
21-
<a href="https://www.speakeasy.com/product/sdk-generation?utm_source=pow_openapi_ts" target="_blank"><img width="288" height="120" src="./docs/public/assets/speakeasy.svg" /></a>
21+
<a href="https://www.speakeasy.com/editor?utm_source=pow_openapi_ts" target="_blank"><img width="288" height="120" src="./docs/public/assets/speakeasy.svg" /></a>
2222
</p>
2323

2424
### 🥈 Silver Sponsors

docs/CONTRIBUTING.md

+1-1
Original file line numberDiff line numberDiff line change
@@ -24,4 +24,4 @@ All of the above are welcome! But if you just opened a PR without discussing the
2424

2525
## Code of Conduct
2626

27-
All docs edits are held accountable to the [Code of Conduct](../../CODE_OF_CONDUCT.md) outlined in this project. Language in the documentation must be inclusive, kind, and respectful.
27+
All docs edits are held accountable to the [Code of Conduct](../CODE_OF_CONDUCT.md) outlined in this project. Language in the documentation must be inclusive, kind, and respectful.

docs/openapi-fetch/api.md

+16
Original file line numberDiff line numberDiff line change
@@ -192,6 +192,22 @@ or when instantiating the client.
192192

193193
:::
194194

195+
### URL-encoded body
196+
197+
To send a body request in `application/x-www-form-urlencoded` format, which is commonly used to transmit key-value pairs in APIs like OAuth 2.0, pass the appropriate header and body as an object. `openapi-fetch` will automatically encode the body to the correct format.
198+
199+
```ts
200+
const { data, error } = await client.POST("/tokens", {
201+
body: {
202+
clientId: "someClientId",
203+
clientSecret: "someClientSecret",
204+
},
205+
headers: {
206+
"Content-Type": "application/x-www-form-encoded",
207+
},
208+
});
209+
```
210+
195211
## Path serialization
196212

197213
openapi-fetch supports path serialization as [outlined in the 3.1 spec](https://swagger.io/docs/specification/serialization/#path). This happens automatically, based on the specific format in your OpenAPI schema:

package.json

+4-3
Original file line numberDiff line numberDiff line change
@@ -19,22 +19,23 @@
1919
"version": "pnpm run build && changeset version && pnpm i"
2020
},
2121
"devDependencies": {
22+
"@arethetypeswrong/cli": "^0.18.1",
2223
"@biomejs/biome": "^1.9.4",
2324
"@changesets/changelog-github": "^0.5.1",
2425
"@changesets/cli": "^2.29.2",
2526
"@playwright/test": "^1.52.0",
2627
"@size-limit/preset-small-lib": "^11.2.0",
2728
"@types/node": "^22.15.3",
28-
"del-cli": "^6.0.0",
2929
"prettier": "^3.5.3",
3030
"size-limit": "^11.2.0",
3131
"turbo": "^2.5.2",
3232
"typescript": "^5.8.3",
33-
"vitest": "^2.1.9"
33+
"unbuild": "^3.5.0",
34+
"vitest": "^3.1.3"
3435
},
3536
"size-limit": [
3637
{
37-
"path": "packages/openapi-fetch/dist/index.min.js",
38+
"path": "packages/openapi-fetch/dist/index.mjs",
3839
"limit": "7 kB",
3940
"brotli": false
4041
}

packages/openapi-fetch/.npmignore

+1
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
.turbo
2+
*.config.*
23
examples
34
test
45
test-results

packages/openapi-fetch/CHANGELOG.md

+14
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,19 @@
11
# openapi-fetch
22

3+
## 0.14.0
4+
5+
### Minor Changes
6+
7+
- [#2310](https://github.com/openapi-ts/openapi-typescript/pull/2310) [`e66b5ce`](https://github.com/openapi-ts/openapi-typescript/commit/e66b5ce63bfcdc57c6ee942e5ed4e7667e64c290) Thanks [@drwpow](https://github.com/drwpow)! - Build package with unbuild. Also remove the minified version (openapi-fetch is only useful in a TypeScript/bundler environment, so there’s no sense in loading it from a CDN clientside).
8+
9+
## 0.13.8
10+
11+
### Patch Changes
12+
13+
- [#2096](https://github.com/openapi-ts/openapi-typescript/pull/2096) [`0058128`](https://github.com/openapi-ts/openapi-typescript/commit/0058128afa258180793ae2071022d89a688d8ddc) Thanks [@obulat](https://github.com/obulat)! - Encode the request body if `Content-Type` header is `x-www-form-urlencoded`
14+
- [#2157](https://github.com/openapi-ts/openapi-typescript/pull/2157) [`419d9ac`](https://github.com/openapi-ts/openapi-typescript/commit/419d9ac6851cf780b81060ddc05c231c5225a17b) Thanks [@Rendez](https://github.com/Rendez)! - Fix overriding baseUrl per request without overriding default baseUrl
15+
- [#2308](https://github.com/openapi-ts/openapi-typescript/pull/2308) [`81c031d`](https://github.com/openapi-ts/openapi-typescript/commit/81c031da8584ed49b033ebfc67bbb3e1ca258699) Thanks [@drwpow](https://github.com/drwpow)! - Improve header handling
16+
317
## 0.13.7
418

519
### Patch Changes
+12
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
import { defineBuildConfig } from "unbuild";
2+
3+
export default defineBuildConfig({
4+
entries: ["./src/index.js"],
5+
declaration: "compatible",
6+
clean: true,
7+
sourcemap: true,
8+
rollup: {
9+
// Ship CommonJS-compatible bundle
10+
emitCJS: true,
11+
},
12+
});

packages/openapi-fetch/examples/vue-3/tsconfig.node.json

-1
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,6 @@
1111
"composite": true,
1212
"noEmit": true,
1313
"tsBuildInfoFile": "./node_modules/.tmp/tsconfig.node.tsbuildinfo",
14-
1514
"module": "ESNext",
1615
"moduleResolution": "Bundler",
1716
"types": ["node"]

packages/openapi-fetch/package.json

+13-23
Original file line numberDiff line numberDiff line change
@@ -1,26 +1,19 @@
11
{
22
"name": "@augwa/openapi-fetch",
33
"description": "Fast, type-safe fetch client for your OpenAPI schema. Only 6 kb (min). Works with React, Vue, Svelte, or vanilla JS.",
4-
"version": "0.13.7",
4+
"version": "0.14.0",
55
"author": {
66
"name": "Drew Powers",
77
"email": "drew@pow.rs"
88
},
99
"license": "MIT",
1010
"type": "module",
11-
"main": "./dist/index.js",
12-
"module": "./dist/index.js",
13-
"types": "./dist/index.d.ts",
11+
"main": "./dist/index.mjs",
1412
"exports": {
1513
".": {
16-
"import": {
17-
"types": "./dist/index.d.ts",
18-
"default": "./dist/index.js"
19-
},
20-
"require": {
21-
"types": "./dist/cjs/index.d.cts",
22-
"default": "./dist/cjs/index.cjs"
23-
}
14+
"import": "./dist/index.mjs",
15+
"require": "./dist/index.cjs",
16+
"default": "./dist/index.mjs"
2417
},
2518
"./*": "./*"
2619
},
@@ -47,19 +40,18 @@
4740
"svelte"
4841
],
4942
"scripts": {
50-
"build": "pnpm run build:clean && pnpm run build:js && pnpm run build:js-min && pnpm run build:cjs",
51-
"build:clean": "del-cli dist",
52-
"build:js": "mkdir -p dist && cp src/* dist",
53-
"build:js-min": "esbuild --bundle src/index.js --format=esm --minify --outfile=dist/index.min.js && cp dist/index.d.ts dist/index.min.d.ts",
54-
"build:cjs": "esbuild --bundle src/index.js --format=cjs --outfile=dist/cjs/index.cjs && cp dist/index.d.ts dist/cjs/index.d.cts",
43+
"build": "unbuild",
5544
"format": "biome format . --write",
56-
"lint": "biome check .",
45+
"lint": "pnpm run lint:js && pnpm run lint:ts && pnpm run lint:ts-no-strict",
46+
"lint:js": "biome check .",
47+
"lint:ts": "tsc --noEmit",
48+
"lint:ts-no-strict": "tsc --noEmit -p test/no-strict-null-checks/tsconfig.json",
5749
"generate-types": "openapi-typescript -c test/redocly.yaml",
50+
"prepack": "pnpm run build",
5851
"pretest": "pnpm run generate-types",
59-
"test": "pnpm run \"/^test:/\"",
52+
"test": "pnpm run test:js && pnpm run test:exports",
6053
"test:js": "vitest run",
61-
"test:ts": "tsc --noEmit",
62-
"test:ts-no-strict": "tsc --noEmit -p test/no-strict-null-checks/tsconfig.json",
54+
"test:exports": "pnpm run build && attw --pack .",
6355
"test-e2e": "playwright test",
6456
"bench:js": "vitest bench",
6557
"e2e-vite-build": "vite build test/e2e/app",
@@ -71,8 +63,6 @@
7163
},
7264
"devDependencies": {
7365
"axios": "^1.9.0",
74-
"del-cli": "^6.0.0",
75-
"esbuild": "^0.25.3",
7666
"execa": "^9.5.2",
7767
"express": "^5.0.0",
7868
"feature-fetch": "^0.0.43",

packages/openapi-fetch/src/index.js

+38-11
Original file line numberDiff line numberDiff line change
@@ -54,8 +54,9 @@ export default function createClient(clientOptions) {
5454
body,
5555
...init
5656
} = fetchOptions || {};
57+
let finalBaseUrl = baseUrl;
5758
if (localBaseUrl) {
58-
baseUrl = removeTrailingSlash(localBaseUrl);
59+
finalBaseUrl = removeTrailingSlash(localBaseUrl) ?? baseUrl;
5960
}
6061

6162
let querySerializer =
@@ -72,29 +73,46 @@ export default function createClient(clientOptions) {
7273
});
7374
}
7475

75-
const serializedBody = body === undefined ? undefined : bodySerializer(body);
76-
77-
const defaultHeaders =
76+
const serializedBody =
77+
body === undefined
78+
? undefined
79+
: bodySerializer(
80+
body,
81+
// Note: we declare mergeHeaders() both here and below because it’s a bit of a chicken-or-egg situation:
82+
// bodySerializer() needs all headers so we aren’t dropping ones set by the user, however,
83+
// the result of this ALSO sets the lowest-priority content-type header. So we re-merge below,
84+
// setting the content-type at the very beginning to be overwritten.
85+
// Lastly, based on the way headers work, it’s not a simple “present-or-not” check becauase null intentionally un-sets headers.
86+
mergeHeaders(baseHeaders, headers, params.header),
87+
);
88+
const finalHeaders = mergeHeaders(
7889
// with no body, we should not to set Content-Type
7990
serializedBody === undefined ||
80-
// if serialized body is FormData; browser will correctly set Content-Type & boundary expression
81-
serializedBody instanceof FormData
91+
// if serialized body is FormData; browser will correctly set Content-Type & boundary expression
92+
serializedBody instanceof FormData
8293
? {}
8394
: {
8495
"Content-Type": "application/json",
85-
};
96+
},
97+
baseHeaders,
98+
headers,
99+
params.header,
100+
);
86101

87102
const requestInit = {
88103
redirect: "follow",
89104
...baseOptions,
90105
...init,
91106
body: serializedBody,
92-
headers: mergeHeaders(defaultHeaders, baseHeaders, headers, params.header),
107+
headers: finalHeaders,
93108
};
94109

95110
let id;
96111
let options;
97-
let request = new CustomRequest(createFinalURL(schemaPath, { baseUrl, params, querySerializer }), requestInit);
112+
let request = new CustomRequest(
113+
createFinalURL(schemaPath, { baseUrl: finalBaseUrl, params, querySerializer }),
114+
requestInit,
115+
);
98116
let response;
99117

100118
/** Add custom parameters to Request object */
@@ -109,7 +127,7 @@ export default function createClient(clientOptions) {
109127

110128
// middleware (request)
111129
options = Object.freeze({
112-
baseUrl,
130+
baseUrl: finalBaseUrl,
113131
fetch,
114132
parseAs,
115133
querySerializer,
@@ -574,10 +592,19 @@ export function defaultPathSerializer(pathname, pathParams) {
574592
* Serialize body object to string
575593
* @type {import("./index.js").defaultBodySerializer}
576594
*/
577-
export function defaultBodySerializer(body) {
595+
export function defaultBodySerializer(body, headers) {
578596
if (body instanceof FormData) {
579597
return body;
580598
}
599+
if (headers) {
600+
const contentType =
601+
headers.get instanceof Function
602+
? (headers.get("Content-Type") ?? headers.get("content-type"))
603+
: (headers["Content-Type"] ?? headers["content-type"]);
604+
if (contentType === "application/x-www-form-urlencoded") {
605+
return new URLSearchParams(body).toString();
606+
}
607+
}
581608
return JSON.stringify(body);
582609
}
583610

packages/openapi-fetch/test/bench/index.bench.js

+1-1
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@ import { Fetcher } from "openapi-typescript-fetch";
33
import { createApiFetchClient } from "feature-fetch";
44
import superagent from "superagent";
55
import { afterAll, bench, describe, vi } from "vitest";
6-
import createClient, { createPathBasedClient } from "../../dist/index.js";
6+
import createClient, { createPathBasedClient } from "../../dist/index.mjs";
77
import * as openapiTSCodegen from "./openapi-typescript-codegen.min.js";
88

99
const BASE_URL = "https://api.test.local";

packages/openapi-fetch/test/common/create-client.test.ts

+19
Original file line numberDiff line numberDiff line change
@@ -38,6 +38,25 @@ describe("createClient options", () => {
3838
expect(actualURL.href).toBe("https://api.foo.bar/v3/resources");
3939
});
4040

41+
test("baseUrl per request causes no override on default baseUrl", async () => {
42+
let actualURL = new URL("https://fakeurl.example");
43+
const client = createObservedClient<paths>({ baseUrl: "https://api.foo.bar/v2/" }, async (req) => {
44+
actualURL = new URL(req.url);
45+
return Response.json([]);
46+
});
47+
48+
const localBaseUrl = "https://api.foo.bar/v3";
49+
await client.GET("/resources", { baseUrl: localBaseUrl });
50+
51+
// assert baseUrl and path mesh as expected
52+
expect(actualURL.href).toBe("https://api.foo.bar/v3/resources");
53+
54+
await client.GET("/resources");
55+
56+
// assert baseUrl and path mesh as expected
57+
expect(actualURL.href).toBe("https://api.foo.bar/v2/resources");
58+
});
59+
4160
describe("content-type", () => {
4261
const BODY_ACCEPTING_METHODS = [["PUT"], ["POST"], ["DELETE"], ["OPTIONS"], ["PATCH"]] as const;
4362
const ALL_METHODS = [...BODY_ACCEPTING_METHODS, ["GET"], ["HEAD"]] as const;

packages/openapi-fetch/test/common/request.test.ts

+13
Original file line numberDiff line numberDiff line change
@@ -265,6 +265,19 @@ describe("request", () => {
265265
expect(bodyUsed).toBe(true);
266266
expect(bodyText).toBe("0");
267267
});
268+
269+
test("`application/x-www-form-urlencoded` body", async () => {
270+
const { bodyUsed, bodyText } = await fireRequestAndGetBodyInformation({
271+
method: "POST",
272+
fetchOptions: {
273+
body: { key1: "value1", key2: "value2" },
274+
headers: { "Content-Type": "application/x-www-form-urlencoded" },
275+
},
276+
});
277+
278+
expect(bodyUsed).toBe(true);
279+
expect(bodyText).toBe("key1=value1&key2=value2");
280+
});
268281
});
269282

270283
test("cookie header is preserved", async () => {

packages/openapi-fetch/test/examples/schemas/github.d.ts

+3-3
Original file line numberDiff line numberDiff line change
@@ -32229,7 +32229,7 @@ export interface components {
3222932229
* @default RIGHT
3223032230
* @enum {string|null}
3223132231
*/
32232-
start_side: "LEFT" | "RIGHT";
32232+
start_side: "LEFT" | "RIGHT" | null;
3223332233
/**
3223432234
* @description The line of the blob to which the comment applies. The last line of the range for a multi-line comment
3223532235
* @example 2
@@ -33004,7 +33004,7 @@ export interface components {
3300433004
* @default RIGHT
3300533005
* @enum {string|null}
3300633006
*/
33007-
start_side: "LEFT" | "RIGHT";
33007+
start_side: "LEFT" | "RIGHT" | null;
3300833008
/**
3300933009
* @description The line of the blob to which the comment applies. The last line of the range for a multi-line comment
3301033010
* @example 2
@@ -108426,7 +108426,7 @@ export interface operations {
108426108426
/** @description The name of the task for the deployment (e.g., `deploy` or `deploy:migrations`). */
108427108427
task?: string;
108428108428
/** @description The name of the environment that was deployed to (e.g., `staging` or `production`). */
108429-
environment?: string;
108429+
environment?: string | null;
108430108430
/** @description The number of results per page (max 100). For more information, see "[Using pagination in the REST API](https://docs.github.com/rest/using-the-rest-api/using-pagination-in-the-rest-api)." */
108431108431
per_page?: components["parameters"]["per-page"];
108432108432
/** @description The page number of the results to fetch. For more information, see "[Using pagination in the REST API](https://docs.github.com/rest/using-the-rest-api/using-pagination-in-the-rest-api)." */

packages/openapi-metadata/.npmignore

+1
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
.turbo
2+
*.config.*
23
test
34
tsconfig*.json
45
vitest.config.ts

packages/openapi-metadata/CHANGELOG.md

+6
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,11 @@
11
# openapi-metadata
22

3+
## 0.2.1
4+
5+
### Patch Changes
6+
7+
- [#2125](https://github.com/openapi-ts/openapi-typescript/pull/2125) [`a041c2d`](https://github.com/openapi-ts/openapi-typescript/commit/a041c2d340a4f1573de726d1f960169440901b24) Thanks [@kerwanp](https://github.com/kerwanp)! - [#2123](https://github.com/openapi-ts/openapi-typescript/issues/2123) Fix thunk type detection
8+
39
## 0.2.0
410

511
### Minor Changes
+20
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
import { defineBuildConfig } from "unbuild";
2+
3+
export default defineBuildConfig({
4+
entries: [
5+
"./src/index.ts",
6+
"./src/decorators/index.ts",
7+
"./src/metadata/index.ts",
8+
"./src/errors/index.ts",
9+
"./src/ui/index.ts",
10+
],
11+
declaration: "compatible",
12+
clean: true,
13+
sourcemap: true,
14+
rollup: {
15+
// Ship CommonJS-compatible bundle
16+
emitCJS: true,
17+
// Don’t bundle .js files together to more closely match old exports (can remove in next major)
18+
output: { preserveModules: true },
19+
},
20+
});

0 commit comments

Comments
 (0)