@soleil-se/run
Version:
Run various utility scripts for creating apps, configs or migration tasks.
102 lines (86 loc) • 3.65 kB
JavaScript
import { replaceInFileSync } from 'replace-in-file';
import { execSync } from 'node:child_process';
import { readFileSync, existsSync, writeFileSync } from 'node:fs';
const imports = [
['@soleil-se/app-util/server/svelte\'', '@soleil-se/app-util/server/svelte/5\''],
['@soleil-se/app-util/server/svelte/3', '@soleil-se/app-util/server/svelte/5'],
['@soleil-se/app-util/server/svelte/4', '@soleil-se/app-util/server/svelte/5'],
['@soleil-se/app-util/client/svelte\'', '@soleil-se/app-util/client/svelte/5\''],
['@soleil-se/app-util/client/svelte/3', '@soleil-se/app-util/client/svelte/5'],
['@soleil-se/app-util/client/svelte/4', '@soleil-se/app-util/client/svelte/5'],
];
function readJsonFileSync(file) {
try {
return JSON.parse(readFileSync(file, 'utf-8'));
} catch {
console.error(`Error reading JSON file: ${file}`);
return {};
}
}
function writeJsonFileSync(file, content) {
try {
return writeFileSync(file, JSON.stringify(content, null, 2));
} catch (error) {
console.error(`Error writing to JSON file: ${file}`, error);
return {};
}
}
function isEligible() {
const packageFile = readJsonFileSync('./package.json');
return [
...Object.keys(packageFile.dependencies || {}),
...Object.keys(packageFile.devDependencies || {}),
].some((dependency) => dependency.startsWith('@soleil-se'));
}
function updateDependencies() {
const isPnpm = existsSync('pnpm-lock.yaml');
console.log(`Updating dependencies with ${isPnpm ? 'pnpm' : 'npm'}...`);
execSync(`${isPnpm ? 'pnpm' : 'npm'} install svelte@5 svelte-preprocess@6 @soleil-se/build-app@latest @soleil-se/config-svelte@latest @soleil-se/app-util@latest`, { stdio: 'inherit' });
}
function updateImports() {
console.log('Updating imports for Svelte 5...');
imports.forEach(([from, to]) => {
replaceInFileSync({
files: './**/*',
from: new RegExp(from, 'g'),
to,
ignore: ['node_modules/**/*', 'package-lock.json', 'pnpm-lock.yaml'],
});
});
}
function updateConfig() {
console.log('Updating app config initialization in config/config.js and config_global/config.js for Svelte 5...');
const content = `import { createConfigApp } from '@soleil-se/config-svelte';
import validate from '@soleil-se/config-validate';
import { mount } from 'svelte';
import App from './App.svelte';
window.validate = validate;
createConfigApp(({ target, props }) => mount(App, { target, props }));
`;
if (existsSync('config/config.js') && readFileSync('config/config.js').toString().includes('@soleil-se/config-svelte')) {
writeFileSync('config/config.js', content);
}
if (existsSync('config_global/config.js') && readFileSync('config_global/config.js').toString().includes('@soleil-se/config-svelte')) {
writeFileSync('config_global/config.js', content);
}
}
function setTypeModule() {
const packageFile = readJsonFileSync('./package.json');
if (packageFile.type !== 'module') {
console.log('Setting package.json type to module...');
packageFile.type = 'module';
writeJsonFileSync('./package.json', packageFile);
}
}
export default function main() {
if (!isEligible()) {
console.error('App dependencies needs to be migrated to the @soleil-se scope first, run the npm migration script first.');
process.exit(1);
}
updateDependencies();
updateImports();
updateConfig();
setTypeModule();
console.log('Done!');
console.log('To migrate components to Svelte 5 use the official migration tool by running "npx sv migrate svelte-5" or migrate per component with Ctrl + Shift + P and "Svelte: Migrate Component to Svelte 5 Syntax" in VS Code.');
}