@soleil-se/eslint-config
Version:
ESLint configuration for Sitevision apps and projects.
113 lines (95 loc) • 3.17 kB
JavaScript
/* eslint-disable no-console */
import fs from 'node:fs';
import { execSync } from 'node:child_process';
import { createRequire } from 'node:module';
const require = createRequire(import.meta.url);
const { name, version } = require('./package.json');
const dependencies = {
[name]: `^${version}`,
eslint: '^9.18.0',
};
const eslintConfigFileContent = `import config from '${name}';
export default [
...config,
];
`;
const prettierConfigFileContent = `export { default } from '${name}/prettier';
`;
function readJsonFileSync(file) {
try {
return JSON.parse(fs.readFileSync(file, 'utf-8'));
} catch {
console.error(`Error reading JSON file: ${file}`);
return {};
}
}
function writeJsonFileSync(file, content) {
try {
return fs.writeFileSync(file, JSON.stringify(content, null, 2));
} catch (error) {
console.error(`Error writing to JSON file: ${file}`, error);
return {};
}
}
async function printStartup() {
console.log(`\nSetting up ESLint + Prettier dependencies and configuration for ${name}@${version}.`);
}
function removeDependencies(packageFile) {
const oldDependencies = [
'eslint-config-airbnb-base',
'eslint-plugin-import',
'eslint-plugin-svelte',
'eslint-config-prettier',
'eslint-plugin-prettier',
'eslint-plugin-svelte3',
];
console.log('\nRemoving old dependecies...');
const devDependencies = { ...packageFile.devDependencies };
oldDependencies.forEach((dependency) => delete devDependencies[dependency]);
return { ...packageFile, devDependencies };
}
function installDependencies() {
const packageManager = fs.existsSync('pnpm-lock.yaml') ? 'pnpm' : 'npm';
const dependencyVersions = Object
.entries(dependencies)
.map((dependency) => `${dependency[0]}@${dependency[1]}`)
.join(' ');
const command = `${packageManager} i ${dependencyVersions} --save-dev`;
console.log(`\nInstalling dependecies...\n> ${command}`);
execSync(command, { cwd: '.', env: process.env, stdio: 'inherit' });
}
function removeOldConfigFiles() {
['.eslintrc.js', '.eslintrc.cjs', '.eslintignore', '.prettierrc.js', '.prettierrc.cjs'].forEach((file) => {
if (fs.existsSync(file)) fs.unlinkSync(file);
});
}
function renameToCjsIfNeeded() {
['.stylelintrc.js', 'svelte.config.js'].forEach((file) => {
if (fs.existsSync(file)) {
const content = fs.readFileSync(file, 'utf-8');
if (content.includes('module.exports')) {
fs.renameSync(file, file.replace('.js', '.cjs'));
}
}
});
}
function setupFiles() {
console.log('\nSetting up configuration files...');
removeOldConfigFiles();
renameToCjsIfNeeded();
fs.writeFileSync('./eslint.config.js', eslintConfigFileContent);
fs.writeFileSync('./prettier.config.js', prettierConfigFileContent);
}
function setup() {
printStartup();
let packageFile = readJsonFileSync('./package.json');
packageFile = removeDependencies(packageFile);
if (packageFile.type !== 'module') {
packageFile.type = 'module';
}
writeJsonFileSync('./package.json', packageFile);
installDependencies();
setupFiles();
console.log('\nESLint + Prettier setup complete!');
}
setup();