UNPKG

@soleil-se/eslint-config

Version:

ESLint configuration for Sitevision apps and projects.

113 lines (95 loc) 3.17 kB
/* 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();