diff --git a/scripts/compat.js b/scripts/compat.js index aef701a07fc8..68703eef9166 100644 --- a/scripts/compat.js +++ b/scripts/compat.js @@ -1,79 +1,97 @@ let fs = require('fs') let path = require('path') +let { spawn } = require('child_process') + let merge = require('lodash/merge') let fastGlob = require('fast-glob') let postcss7 = fastGlob.sync(['./**/*.postcss7.*']).filter((file) => !file.startsWith('lib/')) let postcss8 = fastGlob.sync(['./**/*.postcss8.*']).filter((file) => !file.startsWith('lib/')) -if (process.argv.includes('--prepare')) { - if (postcss8.length > 0) { - console.error('\n\n[ABORT] Already in PostCSS 7 compatibility mode!\n\n') - process.exit(1) - } +async function run() { + if (process.argv.includes('--prepare')) { + if (postcss8.length > 0) { + console.error('\n\n[ABORT] Already in PostCSS 7 compatibility mode!\n\n') + process.exit(1) + } - let mainPackageJson = require('../package.json') - let compatPackageJson = require('../package.postcss7.json') + let mainPackageJson = require('../package.json') + let compatPackageJson = require('../package.postcss7.json') - // Use postcss7 files - for (let file of postcss7) { - let bareFile = file.replace('.postcss7', '') - let postcss8File = file.replace('.postcss7', '.postcss8') + // Use postcss7 files + for (let file of postcss7) { + let bareFile = file.replace('.postcss7', '') + let postcss8File = file.replace('.postcss7', '.postcss8') - // Backup - copy(fromRootPath(bareFile), fromRootPath(postcss8File)) + // Backup + copy(fromRootPath(bareFile), fromRootPath(postcss8File)) - // Swap - copy(fromRootPath(file), fromRootPath(bareFile)) - } + // Swap + copy(fromRootPath(file), fromRootPath(bareFile)) + } - // Deep merge package.json contents - let packageJson = merge({}, mainPackageJson, compatPackageJson) + // Deep merge package.json contents + let packageJson = merge({}, mainPackageJson, compatPackageJson) - // Remove peerDependencies - delete packageJson.peerDependencies + // Remove peerDependencies + delete packageJson.peerDependencies - // Cleanup devDependencies - for (let key in packageJson.devDependencies) { - if (key.includes('postcss')) delete packageJson.devDependencies[key] - } + // Cleanup devDependencies + for (let key in packageJson.devDependencies) { + if (key.includes('postcss')) delete packageJson.devDependencies[key] + } - // Use new name - packageJson.name = '@tailwindcss/postcss7-compat' + // Use new name + packageJson.name = '@tailwindcss/postcss7-compat' - // Make sure you can publish - packageJson.publishConfig = { access: 'public' } + // Make sure you can publish + packageJson.publishConfig = { access: 'public' } - // Write package.json with the new contents - fs.writeFileSync(fromRootPath('package.json'), JSON.stringify(packageJson, null, 2), 'utf8') + // Write package.json with the new contents + fs.writeFileSync(fromRootPath('package.json'), JSON.stringify(packageJson, null, 2), 'utf8') - // Print some useful information to make publishing easy - console.log() - console.log('You can safely publish `tailwindcss` in PostCSS 7 compatibility mode:\n') - console.log() -} else if (process.argv.includes('--restore')) { - if (postcss8.length === 0) { - console.error('\n\n[ABORT] Already in latest PostCSS mode!\n\n') - process.exit(1) - } + // Nuke node_modules + fs.rmdirSync(fromRootPath('node_modules'), { recursive: true }) - // Use postcss8 files - for (let file of postcss8) { - let bareFile = file.replace('.postcss8', '') + // NPM Install with all correct stuff + await npmInstall() - // Restore - copy(fromRootPath(file), fromRootPath(bareFile)) + // Print some useful information to make publishing easy + console.log() + console.log('You can safely publish `tailwindcss` in PostCSS 7 compatibility mode:\n') + console.log() + } else if (process.argv.includes('--restore')) { + if (postcss8.length === 0) { + console.error('\n\n[ABORT] Already in latest PostCSS mode!\n\n') + process.exit(1) + } - // Remove - fs.unlinkSync(fromRootPath(file)) - } + // Use postcss8 files + for (let file of postcss8) { + let bareFile = file.replace('.postcss8', '') + + // Restore + copy(fromRootPath(file), fromRootPath(bareFile)) + + // Remove + fs.unlinkSync(fromRootPath(file)) + } + + // Nuke node_modules + fs.rmdirSync(fromRootPath('node_modules'), { recursive: true }) - // Done - console.log() - console.log('Restored from PostCSS 7 mode to latest PostCSS mode!') - console.log() + // NPM Install with all correct stuff + await npmInstall() + + // Done + console.log() + console.log('Restored from PostCSS 7 mode to latest PostCSS mode!') + console.log() + } } +run() + // --- function fromRootPath(...paths) { @@ -83,3 +101,21 @@ function fromRootPath(...paths) { function copy(fromPath, toPath) { fs.copyFileSync(fromPath, toPath) } + +function npmInstall() { + return new Promise((resolve, reject) => { + let child = spawn('npm', ['install', '--force']) + + child.stdout.on('data', (data) => { + console.log(data.toString()) + }) + + child.stderr.on('data', (data) => { + console.error(data.toString()) + }) + + child.on('close', (code, signal) => { + ;(signal === 'SIGTERM' ? resolve : code === 0 ? resolve : reject)() + }) + }) +}