mirror of
https://github.com/hanzoai/next.js.git
synced 2026-09-24 17:00:51 +00:00
## What is `pack-next`? This is a script we use for developing turbopack. It builds tarballs for all the next.js packages, including `next-swc`, and then provides instructions about how to modify a project's `package.json` to install from that tarball. ## What does this PR do? If you provide a `--project ~/path/to/directory` argument to `pnpm pack-next`, we'll auto-update the `package.json` there for you, instead of telling you how to do it manually! This also understands the React 19 RC peer dependencies, which is something that was missing from the generated instructions. ## Supported Package Managers I've tested this with `npm` and `pnpm`. - `bun` fails with `ENOTDIR` for unknown reasons (maybe it's trying to handle the local tarball as a directory instead of a tarball?). - `yarn` fails due to an upstream issue: https://github.com/yarnpkg/yarn/issues/6339 This does generate the entries for yarn's `resolutions` feature, assuming the upstream issue is eventually fixed. ## Why Rust and `cargo xtask`? https://github.com/matklad/cargo-xtask I'd love for these Turbopack-centric scripts to be written in Rust with xtask, since they're mostly touched by the turbopack team. However, it's also hard to justify putting too much effort into these development scripts, so I don't want to rewrite the whole thing right now. I figured I'd write the new functionality in Rust and call it from the old JS script. ## Test Plan Perform a fresh checkout of shadcn/ui, and then: ``` pnpm pack-next --project ~/shadcn-ui/apps/www/ ``` ``` Found workspace! Patching "/home/bgw.linux/shadcn-ui/package.json" with overrides. Successfully patched "/home/bgw.linux/shadcn-ui/package.json" to use local tarball files! Run `pnpm i` or `npm i` to install the overrides ``` Check the resulting changes to `~/shadcn-ui`: ```diff diff --git a/package.json b/package.json index be47ad7..262c13b 100644 --- a/package.json +++ b/package.json @@ -63,12 +63,31 @@ "tsx": "^4.1.4", "turbo": "^1.9.9", "vite-tsconfig-paths": "^4.2.0", - "vitest": "^0.31.1" + "vitest": "^0.31.1", + "@next/swc": "file:/home/bgw.linux/next.js/tarballs/next-swc.tar" }, "devDependencies": { "@types/node": "^20.11.27", "@types/react": "^18.2.65", "@types/react-dom": "^18.2.22", "typescript": "^5.5.3" + }, + "overrides": { + "next": "file:/home/bgw.linux/next.js/tarballs/next.tar", + "@next/mdx": "file:/home/bgw.linux/next.js/tarballs/next-mdx.tar", + "@next/env": "file:/home/bgw.linux/next.js/tarballs/next-env.tar", + "@next/bundle-analyzer": "file:/home/bgw.linux/next.js/tarballs/next-bundle-analyzer.tar", + "@next/swc": "file:/home/bgw.linux/next.js/tarballs/next-swc.tar", + "react": "19.0.0-rc-7771d3a7-20240827", + "react-dom": "19.0.0-rc-7771d3a7-20240827" + }, + "resolutions": { + "next": "file:/home/bgw.linux/next.js/tarballs/next.tar", + "@next/mdx": "file:/home/bgw.linux/next.js/tarballs/next-mdx.tar", + "@next/env": "file:/home/bgw.linux/next.js/tarballs/next-env.tar", + "@next/bundle-analyzer": "file:/home/bgw.linux/next.js/tarballs/next-bundle-analyzer.tar", + "@next/swc": "file:/home/bgw.linux/next.js/tarballs/next-swc.tar", + "react": "19.0.0-rc-7771d3a7-20240827", + "react-dom": "19.0.0-rc-7771d3a7-20240827" } } ```
58 lines
1.3 KiB
JavaScript
Executable File
58 lines
1.3 KiB
JavaScript
Executable File
#!/usr/bin/env node
|
|
|
|
const {
|
|
NEXT_DIR,
|
|
booleanArg,
|
|
execAsyncWithOutput,
|
|
namedValueArg,
|
|
} = require('./pack-util.cjs')
|
|
const { rmSync } = require('fs')
|
|
const path = require('path')
|
|
|
|
const args = process.argv.slice(2)
|
|
|
|
// strip --no-build and --project when called from pack-next.cjs
|
|
booleanArg(args, '--no-build')
|
|
namedValueArg(args, '--project')
|
|
|
|
const targetDir = path.join(NEXT_DIR, 'target')
|
|
|
|
module.exports = (async () => {
|
|
for (let i = 0; i < 2; i++) {
|
|
try {
|
|
await execAsyncWithOutput(
|
|
'Build native modules',
|
|
['pnpm', 'run', 'swc-build-native', ...args],
|
|
{
|
|
shell: process.platform === 'win32' ? 'powershell.exe' : false,
|
|
env: {
|
|
COLOR: 'always',
|
|
TTY: '1',
|
|
...process.env,
|
|
},
|
|
}
|
|
)
|
|
} catch (e) {
|
|
if (
|
|
e.stderr
|
|
.toString()
|
|
.includes('the compiler unexpectedly panicked. this is a bug.')
|
|
) {
|
|
rmSync(path.join(targetDir, 'release/incremental'), {
|
|
recursive: true,
|
|
force: true,
|
|
})
|
|
rmSync(path.join(targetDir, 'debug/incremental'), {
|
|
recursive: true,
|
|
force: true,
|
|
})
|
|
continue
|
|
}
|
|
delete e.stdout
|
|
delete e.stderr
|
|
throw e
|
|
}
|
|
break
|
|
}
|
|
})()
|