@soleil-se/run
Version:
Run various utility scripts for creating apps, configs or migration tasks.
93 lines (83 loc) • 3.64 kB
JavaScript
import { replaceInFileSync } from 'replace-in-file';
import { execSync } from 'node:child_process';
import { readFileSync, existsSync, rmSync } from 'node:fs';
const packages = [
['@soleil/sv-create-app', '@soleil-se/create-app'],
['@soleil/sv-create-config', '@soleil-se/create-build-config'],
['@soleil/sv-project-build', '@soleil-se/build-project'],
['@soleil/sv-app-build', '@soleil-se/build-app'],
['@soleil/sv-sass-build', '@soleil-se/build-sass'],
['@soleil/sv-js-build', '@soleil-se/build-js'],
['@soleil/sv-snippets-sync', '@soleil-se/build-snippets'],
['@soleil/config-requester', '@soleil-se/config-requester'],
['@soleil/config-validate', '@soleil-se/config-validate'],
['@soleil/eslint-config-sitevision', '@soleil-se/eslint-config'],
['@soleil/mediaflow-selector-svelte', '@soleil-se/config-mediaflow-svelte'],
['@soleil/stylelint-config', '@soleil-se/stylelint-config'],
['@soleil/svelte-config', '@soleil-se/config-svelte'],
['@soleil-api/i18n', '@soleil-se/i18n'],
['@soleil-api/http-error', '@soleil-se/http-error'],
['@soleil-api/webapp-util', '@soleil-se/app-util'],
['@soleil-api/output-util-helper', '@soleil-se/output-util-helper'],
['@soleil-api/requester-wrapper', '@soleil-se/requester'],
['@soleil-api/search-helper', '@soleil-se/search-helper'],
];
const scripts = [
['sv-app-build', 'build-app'],
['sv-create-app', 'create-app'],
['sv-create-config', 'create-build-config'],
['sv-js-build', 'build-js'],
['sv-sass-build', 'build-sass'],
['sv-snippets-sync', 'build-snippets'],
['sv-project-build', 'build-project'],
['npx --registry=https://npm.soleilit.se', 'npx'],
];
export default function migrateNpm() {
if(existsSync('yarn.lock')) {
console.log('Yarn lockfile found, please remove it and migrate to npm as package manager before proceeding.');
return;
}
const isApp = existsSync('manifest.json');
console.log(`Updating package names and scripts in ${isApp ? 'app' : 'project root'}...`);
packages.forEach(([from, to]) => {
replaceInFileSync({
files: isApp ? './**/*' : './*',
from: new RegExp(from, 'g'),
to,
ignore: ['node_modules/**/*', 'package-lock.json', 'pnpm-lock.yaml'],
glob: {
dot: true,
},
});
});
scripts.forEach(([from, to]) => {
replaceInFileSync({
files: './package.json',
from: new RegExp(from, 'g'),
to,
});
});
const packageJson = JSON.parse(readFileSync('./package.json', 'utf8'));
const dependencies = [
...Object.keys(packageJson.dependencies),
...Object.keys(packageJson.devDependencies),
];
const hasLegacyDependencies = dependencies.some((dep) => dep.startsWith('@soleil/')) || dependencies.some((dep) => dep.startsWith('@soleil-api/'));
if (!hasLegacyDependencies && existsSync('.npmrc')) {
console.log('Removing .npmrc since no @soleil or @soleil-api packages are used...');
rmSync('.npmrc');
}
const isPnpm = existsSync('pnpm-lock.yaml');
console.log(`Running ${isPnpm ? 'pnpm' : 'npm'} install...`);
execSync(`${isPnpm ? 'pnpm' : 'npm'} install`, { stdio: 'inherit' });
if (!isPnpm && existsSync('node_modules/@soleil-se/build-app/node_modules/@babel/preset-env')) {
console.log('\nInvalid location for @babel/preset-env, hoisting to root node_modules directory...\n');
replaceInFileSync({
files: './package-lock.json',
from: /node_modules\/@soleil-se\/build-app\/node_modules\/@babel\/preset-env/gm,
to: 'node_modules/@babel/preset-env',
});
execSync(`${isPnpm ? 'pnpm' : 'npm'} install`, { stdio: 'inherit' });
}
console.log('\nDone!');
}