b8b104506d
The PR further reduces the `create-next-app` installation size by another 80 KiB: - Replace the callback version of Node.js built-in `dns` API usage with `dns/promise` + async/await - Replace `got` w/ `fetch` since Next.js and `create-next-app` now target Node.js 18.17.0+ - Download and extract the tar.gz file in the memory (without creating temporary files). This improves the performance. - Some other minor refinements. Following these changes, the size of `dist/index.js` is now 536 KiB.
50 lines
1.4 KiB
TypeScript
50 lines
1.4 KiB
TypeScript
/* eslint-disable import/no-extraneous-dependencies */
|
|
import { yellow } from 'picocolors'
|
|
import spawn from 'cross-spawn'
|
|
import type { PackageManager } from './get-pkg-manager'
|
|
|
|
/**
|
|
* Spawn a package manager installation based on user preference.
|
|
*
|
|
* @returns A Promise that resolves once the installation is finished.
|
|
*/
|
|
export async function install(
|
|
/** Indicate which package manager to use. */
|
|
packageManager: PackageManager,
|
|
/** Indicate whether there is an active Internet connection.*/
|
|
isOnline: boolean
|
|
): Promise<void> {
|
|
const args: string[] = ['install']
|
|
if (!isOnline) {
|
|
console.log(
|
|
yellow('You appear to be offline.\nFalling back to the local cache.')
|
|
)
|
|
args.push('--offline')
|
|
}
|
|
/**
|
|
* Return a Promise that resolves once the installation is finished.
|
|
*/
|
|
return new Promise((resolve, reject) => {
|
|
/**
|
|
* Spawn the installation process.
|
|
*/
|
|
const child = spawn(packageManager, args, {
|
|
stdio: 'inherit',
|
|
env: {
|
|
...process.env,
|
|
ADBLOCK: '1',
|
|
// we set NODE_ENV to development as pnpm skips dev
|
|
// dependencies when production
|
|
NODE_ENV: 'development',
|
|
DISABLE_OPENCOLLECTIVE: '1',
|
|
},
|
|
})
|
|
child.on('close', (code) => {
|
|
if (code !== 0) {
|
|
reject({ command: `${packageManager} ${args.join(' ')}` })
|
|
return
|
|
}
|
|
resolve()
|
|
})
|
|
})
|
|
}
|