Skip to content

Commit 62da4fe

Browse files
fix: Update to latest Ink and React 19 and bundle React and Ink into CLI (#138)
* Update to latest Ink and React 19 * bundle into CLI
1 parent 60335a9 commit 62da4fe

File tree

5 files changed

+59
-36
lines changed

5 files changed

+59
-36
lines changed

build/fakeReactDevtoolsCore.js

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
module.exports = {};

build/utils.cjs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
module.exports.nodeExternals = [
1+
module.exports.externalModules = [
22
...Object.keys(require("../package.json").dependencies),
33
...require("module").builtinModules,
44
...require("module").builtinModules.map((mod) => `node:${mod}`),

esbuild.cjs

Lines changed: 29 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
1-
const fs = require("fs");
1+
const { join } = require("path");
22
const esbuild = require("esbuild");
3-
const { nodeExternals, define } = require("./build/utils.cjs");
3+
const { externalModules, define } = require("./build/utils.cjs");
44
const {
55
moduleReplacementPlugin,
66
forbidImportsPlugin,
@@ -13,6 +13,17 @@ const preventPitcherClientImportsPlugin = forbidImportsPlugin([
1313
"@codesandbox/pitcher-common",
1414
]);
1515

16+
const devtoolsStubPlugin = {
17+
name: "stub-react-devtools",
18+
setup(build) {
19+
// whenever someone does `import 'react-devtools-core'`, redirect to our empty.js
20+
build.onResolve({ filter: /^react-devtools-core$/ }, () => ({
21+
path: join(__dirname, "build/fakeReactDevtoolsCore.js"),
22+
namespace: "file",
23+
}));
24+
},
25+
};
26+
1627
/**
1728
* BROWSER CLIENT BUILD
1829
*/
@@ -74,7 +85,7 @@ const nodeClientCjsBuild = esbuild.build({
7485
// .cjs extension is required because "type": "module" is set in package.json
7586
outfile: "dist/cjs/node.cjs",
7687
platform: "node",
77-
external: nodeExternals,
88+
external: externalModules,
7889
plugins: [preventPitcherClientImportsPlugin],
7990
});
8091

@@ -84,7 +95,7 @@ const nodeClientEsmBuild = esbuild.build({
8495
format: "esm",
8596
outfile: "dist/esm/node.js",
8697
platform: "node",
87-
external: nodeExternals,
98+
external: externalModules,
8899
plugins: [preventPitcherClientImportsPlugin],
89100
});
90101

@@ -99,7 +110,7 @@ const sdkCjsBuild = esbuild.build({
99110
platform: "node",
100111
// .cjs extension is required because "type": "module" is set in package.json
101112
outfile: "dist/cjs/index.cjs",
102-
external: nodeExternals,
113+
external: externalModules,
103114
});
104115

105116
const sdkEsmBuild = esbuild.build({
@@ -109,7 +120,7 @@ const sdkEsmBuild = esbuild.build({
109120
define,
110121
platform: "node",
111122
outfile: "dist/esm/index.js",
112-
external: nodeExternals,
123+
external: externalModules,
113124
plugins: [preventPitcherClientImportsPlugin],
114125
});
115126

@@ -124,10 +135,19 @@ const cliBuild = esbuild.build({
124135
format: "esm",
125136
platform: "node",
126137
banner: {
127-
js: `#!/usr/bin/env node\n\n`,
138+
js: `#!/usr/bin/env node\n\nimport { createRequire } from "module";\nconst require = createRequire(import.meta.url);\n`,
128139
},
129-
external: [...nodeExternals, "@codesandbox/sdk"],
130-
plugins: [preventPitcherClientImportsPlugin],
140+
external: [
141+
// We have to bundle React and Ink into the bundle because Ink supports React 18 in v5 and React 19 in v6,
142+
// but this breaks when running the CLI in the project folder as it might have either React version and we do not
143+
// want users to manually install React and correct Ink version as peer dependencies
144+
...externalModules.filter(
145+
(mod) =>
146+
mod !== "react" && mod !== "ink" && mod !== "@tanstack/react-query"
147+
),
148+
"@codesandbox/sdk",
149+
],
150+
plugins: [preventPitcherClientImportsPlugin, devtoolsStubPlugin],
131151
});
132152

133153
Promise.all([

package-lock.json

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

package.json

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -73,6 +73,9 @@
7373
"@types/node": "^22.15.30",
7474
"@types/react": "^19.1.5",
7575
"@types/yargs": "^17.0.33",
76+
"ink": "^6.1.0",
77+
"react": "^19.1.1",
78+
"@tanstack/react-query": "^5.76.1",
7679
"buffer-browserify": "^0.2.5",
7780
"crypto-browserify": "^3.12.1",
7881
"esbuild": "^0.25.0",
@@ -88,24 +91,21 @@
8891
},
8992
"dependencies": {
9093
"@codesandbox/pitcher-client": "1.1.7",
91-
"@inkjs/ui": "^2.0.0",
9294
"@hey-api/client-fetch": "^0.7.3",
95+
"@inkjs/ui": "^2.0.0",
9396
"@msgpack/msgpack": "^3.1.0",
94-
"@tanstack/react-query": "^5.76.1",
9597
"blessed": "^0.1.81",
9698
"blessed-contrib": "^4.11.0",
9799
"cli-table3": "^0.6.3",
98-
"ink": "^5.2.1",
99100
"isbinaryfile": "^5.0.4",
100101
"isomorphic-ws": "^5.0.0",
101102
"ora": "^8.2.0",
102103
"path": "^0.12.7",
103-
"react": "^18.3.1",
104104
"readline": "^1.3.0",
105105
"util": "^0.12.5",
106106
"yargs": "^17.7.2"
107107
},
108108
"optionalDependencies": {
109109
"@sentry/node": "^9.29.0"
110110
}
111-
}
111+
}

0 commit comments

Comments
 (0)