Skip to content

Instantly share code, notes, and snippets.

@mkczarkowski
Last active August 13, 2022 06:54
Show Gist options
  • Save mkczarkowski/bb1ebf7e47b22139d676686ebaeeab88 to your computer and use it in GitHub Desktop.
Save mkczarkowski/bb1ebf7e47b22139d676686ebaeeab88 to your computer and use it in GitHub Desktop.
#!/usr/bin/env node
var fs = require('fs')
let appPath = process.cwd()
const execSync = require('child_process').execSync
let installedEslintConfig;
try {
const packageJson = JSON.parse(fs.readFileSync('./package.json'))
const devDepsNames = Object.keys(packageJson.devDependencies)
installedEslintConfig = devDepsNames.find(dep => dep.includes('@sr/eslint-config-'))
} catch {
console.error(`Encountered issue when parsing the package.json. Does it exist in this directory? Does it have devDependencies defined?`)
return;
}
if (installedEslintConfig) {
console.info(`Detected ${installedEslintConfig}`);
const config = configsDeps()[installedEslintConfig]
updateDeps(config)
createEslintConfig()
createTsconfigEslintIfNeeded(config)
createPrettierConfigIfNeeded(config)
createStylelintConfigIfNeeded(config)
} else {
console.error(`You don't have any @sr/eslint-config installed as dev dependency in this directory`)
}
function updateDeps(config) {
const packages = config.deps.join(' ')
execSync(`npm uninstall ${packages}`)
execSync(`npm install eslint@8 @rushstack/eslint-patch --force -DE`)
execSync(`npm install ${installedEslintConfig}@${config.version} --force -DE`)
console.info(`${installedEslintConfig}: Installed peerDependencies`);
if (config.stylelint) {
execSync(`npm install @sr/stylelint-config -DE`)
execSync(`npx install-peerdeps --dev @sr/stylelint-config`)
console.info(`${installedEslintConfig}: Installed stylelint`);
}
if (config.prettier) {
execSync(`npm install @sr/prettier-config@0.1.1 -DE`)
execSync(`npx install-peerdeps --dev @sr/prettier-config@0.1.1`)
console.info(`${installedEslintConfig}: Installed prettier`);
}
}
async function createEslintConfig() {
try {
const newEslintRc = {
parserOptions: {tsconfigRootDir: '!! REPLACE THIS WITH __dirname !!', sourceType: 'module'},
extends: [installedEslintConfig],
root: true
}
if (fs.existsSync(`${appPath}/.eslintrc.yaml`)) {
fs.unlinkSync(`${appPath}/.eslintrc.yaml`)
}
await fs.writeFile(`${appPath}/.eslintrc.js`, `require("@rushstack/eslint-patch/modern-module-resolution");\n\nmodule.exports = ${JSON.stringify(newEslintRc)}`, (err) => {
if (!err) {
console.info(`${installedEslintConfig}: .eslintrc.js has been successfully created - please update the file with proper __dirname reference`)
}
})
} catch (ex) {
console.error(ex)
}
}
async function createTsconfigEslintIfNeeded(config) {
if (config.tsconfig && !fs.existsSync(`${appPath}/tsconfig.eslint.json`)) {
await fs.writeFile(`${appPath}/tsconfig.eslint.json`, JSON.stringify(config.tsconfig), (err) => {
if (!err) {
console.info(`${installedEslintConfig}: tsconfig.eslint.json has been successfully created`)
}
})
}
}
async function createPrettierConfigIfNeeded(config) {
if (config.prettier && !fs.existsSync(`${appPath}/.prettierrc.js`)) {
await fs.writeFile(`${appPath}/.prettierrc.js`, `module.exports = { ...require("@sr/prettier-config") };`, (err) => {
if (!err) {
console.info(`${installedEslintConfig}: .prettierrc.js has been successfully created`)
}
})
}
}
async function createStylelintConfigIfNeeded(config) {
if (config.stylelint && !fs.existsSync(`${appPath}/stylelint.config.js`)) {
await fs.writeFile(`${appPath}/stylelint.config.js`, `module.exports = { ...require("@sr/stylelint-config") };`, (err) => {
if (!err) {
console.info(`${installedEslintConfig}: stylelint.config.js has been successfully created`)
}
})
console.log(`Created stylelint.config.js`);
}
}
function configsDeps() {
return {
'@sr/eslint-config-angular': {
tsconfig: {
'extends': './tsconfig.json',
'include': ['src/**/*.ts'],
'compilerOptions': {
'baseUrl': '.',
'paths': {}
}
},
stylelint: true,
prettier: true,
version: '5',
deps: [
'@angular-eslint/eslint-plugin',
'@angular-eslint/eslint-plugin-template',
'@angular-eslint/template-parser',
'@typescript-eslint/eslint-plugin',
'@typescript-eslint/parser',
'eslint-config-prettier',
'eslint-plugin-change-detection-strategy',
'eslint-plugin-functional',
'eslint-plugin-no-autofix',
'eslint-plugin-prettier',
'eslint-plugin-rxjs',
'eslint-plugin-rxjs-angular',
'eslint-plugin-security'
]
},
'@sr/eslint-config-nodets': {
tsconfig: {
'extends': './tsconfig.json',
'include': ['dev/**/*.ts', 'lib/**/*.ts', 'specs/**/*.ts', 'test/**/*.ts'],
'compilerOptions': {
'baseUrl': '.',
'paths': {}
}
},
stylelint: false,
prettier: true,
version: '2',
deps: [
'@smartrecruiters/eslint-config',
'@typescript-eslint/eslint-plugin',
'@typescript-eslint/parser',
'eslint-config-prettier',
'eslint-plugin-import',
'eslint-plugin-prettier',
'eslint-plugin-security'
]
},
'@sr/eslint-config-nodejs': {
tsconfig: false,
stylelint: false,
prettier: true,
version: '2',
deps: [
'@smartrecruiters/eslint-config',
'eslint-config-prettier',
'eslint-plugin-prettier',
'eslint-plugin-promise'
]
},
'@sr/eslint-config-angularjs': {
tsconfig: false,
stylelint: true,
prettier: true,
version: '2',
deps: [
'@smartrecruiters/eslint-config',
'eslint-plugin-angular',
'eslint-config-prettier',
'eslint-plugin-prettier',
'eslint-plugin-promise'
]
},
'@sr/eslint-config-react': {
tsconfig: false,
stylelint: true,
prettier: true,
version: '2',
deps: [
'@smartrecruiters/eslint-config',
'eslint-config-prettier',
'eslint-plugin-prettier',
'eslint-plugin-promise',
'eslint-config-airbnb',
'eslint-plugin-jsx-a11y',
'eslint-plugin-react',
'eslint-plugin-react-hooks',
'eslint-plugin-security'
]
}
}
}
{
"name": "install-new-ui-linter",
"version": "1.0.0",
"bin": "./index.js"
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment