From 675158df16c39b320ad1eb256911347e0cc380b2 Mon Sep 17 00:00:00 2001 From: Han Yeong-woo Date: Thu, 18 Jan 2024 20:36:48 +0900 Subject: [PATCH] Cleanup tools (#1756) * Use prettier own instead of eslint plugin * Extend prettier config angular eslint * Upgrade root prettier to 3 * Fix css syntax errors * Change eslint ignore to prettier ignore * Ignore formatting for outputs * Fix lint-staged error when edited multiple files * Bump pnpm version * Remove unnecessary pnpm config --------- Co-authored-by: Eric Fennis --- .eslintrc.js | 11 +--- .github/actions/build-and-test.yml | 2 +- .github/actions/check-icons.yml | 2 +- .prettierignore | 16 +++++ .../icon.css | 2 +- .../global-styling-css-example/icon.css | 2 +- lint-staged.config.mjs | 23 +++++++ package.json | 28 ++------- packages/lucide-angular/.eslintrc.js | 1 + packages/lucide-angular/package.json | 2 - packages/lucide-vue/src/createLucideIcon.ts | 2 +- pnpm-lock.yaml | 61 +++---------------- prettier.config.mjs | 16 +++++ scripts/generateSuperSVG.mjs | 8 +-- scripts/render/processSvg.mjs | 2 +- 15 files changed, 79 insertions(+), 99 deletions(-) create mode 100644 .prettierignore create mode 100644 lint-staged.config.mjs create mode 100644 prettier.config.mjs diff --git a/.eslintrc.js b/.eslintrc.js index 049c95d76..ff086ba21 100644 --- a/.eslintrc.js +++ b/.eslintrc.js @@ -7,20 +7,12 @@ module.exports = { node: true, }, extends: ['airbnb-base', 'prettier'], - plugins: ['import', 'prettier', '@html-eslint'], + plugins: ['import', '@html-eslint'], rules: { 'no-console': 'off', 'no-param-reassign': 'off', 'no-shadow': 'off', 'no-use-before-define': 'off', - 'prettier/prettier': [ - 'error', - { - singleQuote: true, - trailingComma: 'all', - printWidth: 100 - }, - ], 'import/no-extraneous-dependencies': [ 'error', { devDependencies: ['**/*.test.js', '**/*.spec.js', './scripts/**'] }, @@ -46,7 +38,6 @@ module.exports = { files: ['./icons/*.svg'], parser: '@html-eslint/parser', rules: { - 'prettier/prettier': 'off', '@html-eslint/require-doctype': 'off', '@html-eslint/no-duplicate-attrs': 'error', '@html-eslint/no-inline-styles': 'error', diff --git a/.github/actions/build-and-test.yml b/.github/actions/build-and-test.yml index 47c3293eb..2a0b9fa8d 100644 --- a/.github/actions/build-and-test.yml +++ b/.github/actions/build-and-test.yml @@ -18,7 +18,7 @@ runs: name: Install pnpm id: pnpm-install with: - version: 7 + version: 8 run_install: false - name: Get pnpm store directory diff --git a/.github/actions/check-icons.yml b/.github/actions/check-icons.yml index 369918355..ad9af1f9e 100644 --- a/.github/actions/check-icons.yml +++ b/.github/actions/check-icons.yml @@ -18,7 +18,7 @@ runs: name: Install pnpm id: pnpm-install with: - version: 7 + version: 8 run_install: false - name: Get pnpm store directory diff --git a/.prettierignore b/.prettierignore new file mode 100644 index 000000000..943334f5e --- /dev/null +++ b/.prettierignore @@ -0,0 +1,16 @@ +pnpm-lock.yaml + +# lucide-angular +packages/lucide-angular/.angular/cache + +# lucide-static +packages/lucide-static/icons +packages/lucide-static/lib +packages/lucide-static/sprite.svg +packages/lucide-static/tags.json +packages/lucide-static/icon-nodes.json +packages/lucide-static/font + +# lucide-svelte +packages/lucide-svelte/src/icons/*.svelte +packages/lucide-svelte/.svelte-kit diff --git a/docs/guide/advanced/examples/global-styling-absolute-strokewidth-example/icon.css b/docs/guide/advanced/examples/global-styling-absolute-strokewidth-example/icon.css index 29d869df7..aaf7940fe 100644 --- a/docs/guide/advanced/examples/global-styling-absolute-strokewidth-example/icon.css +++ b/docs/guide/advanced/examples/global-styling-absolute-strokewidth-example/icon.css @@ -11,6 +11,6 @@ .app { display: grid; grid-template-columns: 1fr 1fr 1fr; - grid-template-rows: 1fr 1fr 1fr + grid-template-rows: 1fr 1fr 1fr; gap: 6px; } diff --git a/docs/guide/advanced/examples/global-styling-css-example/icon.css b/docs/guide/advanced/examples/global-styling-css-example/icon.css index 796d2db8f..37a1efd40 100644 --- a/docs/guide/advanced/examples/global-styling-css-example/icon.css +++ b/docs/guide/advanced/examples/global-styling-css-example/icon.css @@ -9,6 +9,6 @@ .app { display: grid; grid-template-columns: 1fr 1fr 1fr; - grid-template-rows: 1fr 1fr 1fr + grid-template-rows: 1fr 1fr 1fr; gap: 6px; } diff --git a/lint-staged.config.mjs b/lint-staged.config.mjs new file mode 100644 index 000000000..7ba870a29 --- /dev/null +++ b/lint-staged.config.mjs @@ -0,0 +1,23 @@ +/** + * @param {string[]} filenames + * @returns {string} + */ +const filenamesToAjvOption = (filenames) => filenames.map((filename) => `-d ${filename}`).join(' '); + +/** @satisfies {import('lint-staged').Config} */ +const config = { + 'icons/*.svg': [ + 'node ./scripts/optimizeStagedSvgs.mjs', + 'node ./scripts/generateNextJSAliases.mjs', + ], + 'icons/*.json': (filenames) => [ + `ajv --spec=draft2020 -s icon.schema.json ${filenamesToAjvOption(filenames)}`, + `prettier --write ${filenames.join(' ')}`, + ], + 'categories/*.json': (filenames) => [ + `ajv --spec=draft2020 -s category.schema.json ${filenamesToAjvOption(filenames)}`, + `prettier --write ${filenames.join(' ')}`, + ], +}; + +export default config; diff --git a/package.json b/package.json index ede078ca8..4e75453fd 100644 --- a/package.json +++ b/package.json @@ -30,10 +30,11 @@ "generate:nextJSAliases": "node ./scripts/generateNextJSAliases.mjs", "postinstall": "husky install", "lint:es": "eslint .", + "lint:format": "prettier \"**/*.{js,mjs,ts,jsx,tsx,html,css,scss,json,yml,yaml}\" --write", "lint:json:icons": "ajv --spec=draft2020 -s icon.schema.json -d 'icons/*.json' > /dev/null", "lint:json:categories": "ajv --spec=draft2020 -s category.schema.json -d 'categories/*.json' > /dev/null", "lint:json": "pnpm run lint:json:icons && pnpm run lint:json:categories", - "lint": "pnpm lint:es && pnpm lint:json", + "lint": "pnpm lint:es && pnpm lint:format && pnpm lint:json", "prepare": "husky install", "gi": "node ./scripts/generate/generateIcons.mjs" }, @@ -52,40 +53,19 @@ "eslint-import-resolver-custom-alias": "^1.3.2", "eslint-import-resolver-typescript": "^3.6.1", "eslint-plugin-import": "^2.29.1", - "eslint-plugin-prettier": "^4.2.1", "husky": "^8.0.3", "lint-staged": "^13.3.0", "minimist": "^1.2.8", "node-fetch": "^3.3.2", "p-memoize": "^7.1.1", - "prettier": "2.7.1", + "prettier": "3.1.1", "semver": "^7.5.4", "simple-git": "^3.21.0", "svgo": "^3.1.0", "svgson": "^5.3.1" }, - "lint-staged": { - "icons/*.svg": [ - "node ./scripts/optimizeStagedSvgs.mjs", - "node ./scripts/generateNextJSAliases.mjs" - ], - "icons/*.json": [ - "ajv --spec=draft2020 -s icon.schema.json -d", - "prettier --write --print-width=0" - ], - "categories/*.json": [ - "ajv --spec=draft2020 -s category.schema.json -d", - "prettier --write --print-width=0" - ] - }, - "packageManager": "pnpm@8.7.1", + "packageManager": "pnpm@8.14.0+sha256.9cebf61abd83f68177b29484da72da9751390eaad46dfc3072d266bfbb1ba7bf", "pnpm": { - "peerDependencyRules": { - "ignoreMissing": [ - "@babel/core", - "@babel/preset-env" - ] - }, "packageExtensions": { "vue-template-compiler": { "peerDependencies": { diff --git a/packages/lucide-angular/.eslintrc.js b/packages/lucide-angular/.eslintrc.js index b61e1886a..9f2a56033 100644 --- a/packages/lucide-angular/.eslintrc.js +++ b/packages/lucide-angular/.eslintrc.js @@ -8,6 +8,7 @@ module.exports = { 'plugin:@typescript-eslint/recommended', 'plugin:@angular-eslint/recommended', 'plugin:@angular-eslint/template/process-inline-templates', + 'prettier', ], rules: { '@angular-eslint/directive-selector': [ diff --git a/packages/lucide-angular/package.json b/packages/lucide-angular/package.json index eb9c66f0e..ee47d7c50 100644 --- a/packages/lucide-angular/package.json +++ b/packages/lucide-angular/package.json @@ -34,7 +34,6 @@ "test": "ng test --no-watch --no-progress --browsers=ChromeHeadlessCI", "test:watch": "ng test", "lint": "npx eslint 'src/**/*.{js,jsx,ts,tsx,html,css,scss}' --quiet --fix", - "format": "npx prettier 'src/**/*.{js,jsx,ts,tsx,html,css,scss}' --write", "e2e": "ng e2e", "version": "pnpm version --git-tag-version=false" }, @@ -59,7 +58,6 @@ "@typescript-eslint/parser": "5.48.2", "eslint": "^8.33.0", "eslint-config-prettier": "^8.5.0", - "eslint-plugin-prettier": "^4.2.1", "jasmine-core": "~4.0.0", "jasmine-spec-reporter": "~7.0.0", "karma": "~6.3.0", diff --git a/packages/lucide-vue/src/createLucideIcon.ts b/packages/lucide-vue/src/createLucideIcon.ts index 0a236d8f7..694c2c8ee 100644 --- a/packages/lucide-vue/src/createLucideIcon.ts +++ b/packages/lucide-vue/src/createLucideIcon.ts @@ -59,7 +59,7 @@ export default (iconName: string, iconNode: IconNode): Component => ({ return createElement( 'svg', { - // eslint-disable-next-line prettier/prettier + // prettier-ignore class: [defaultClass, data.class, data.staticClass, data.attrs && data.attrs.class].filter(Boolean), style: [data.style, data.staticStyle, data.attrs && data.attrs.style].filter(Boolean), attrs: { diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 905d86688..19da0425c 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -52,9 +52,6 @@ importers: eslint-plugin-import: specifier: ^2.29.1 version: 2.29.1(@typescript-eslint/parser@6.14.0)(eslint-import-resolver-typescript@3.6.1)(eslint@8.56.0) - eslint-plugin-prettier: - specifier: ^4.2.1 - version: 4.2.1(eslint-config-prettier@8.10.0)(eslint@8.56.0)(prettier@2.7.1) husky: specifier: ^8.0.3 version: 8.0.3 @@ -71,8 +68,8 @@ importers: specifier: ^7.1.1 version: 7.1.1 prettier: - specifier: 2.7.1 - version: 2.7.1 + specifier: 3.1.1 + version: 3.1.1 semver: specifier: ^7.5.4 version: 7.5.4 @@ -275,9 +272,6 @@ importers: eslint-config-prettier: specifier: ^8.5.0 version: 8.10.0(eslint@8.56.0) - eslint-plugin-prettier: - specifier: ^4.2.1 - version: 4.2.1(eslint-config-prettier@8.10.0)(eslint@8.56.0)(prettier@2.8.8) jasmine-core: specifier: ~4.0.0 version: 4.0.1 @@ -12822,40 +12816,6 @@ packages: - supports-color dev: true - /eslint-plugin-prettier@4.2.1(eslint-config-prettier@8.10.0)(eslint@8.56.0)(prettier@2.7.1): - resolution: {integrity: sha512-f/0rXLXUt0oFYs8ra4w49wYZBG5GKZpAYsJSm6rnYL5uVDjd+zowwMwVZHnAjf4edNrKpCDYfXDgmRE/Ak7QyQ==} - engines: {node: '>=12.0.0'} - peerDependencies: - eslint: '>=7.28.0' - eslint-config-prettier: '*' - prettier: '>=2.0.0' - peerDependenciesMeta: - eslint-config-prettier: - optional: true - dependencies: - eslint: 8.56.0 - eslint-config-prettier: 8.10.0(eslint@8.56.0) - prettier: 2.7.1 - prettier-linter-helpers: 1.0.0 - dev: true - - /eslint-plugin-prettier@4.2.1(eslint-config-prettier@8.10.0)(eslint@8.56.0)(prettier@2.8.8): - resolution: {integrity: sha512-f/0rXLXUt0oFYs8ra4w49wYZBG5GKZpAYsJSm6rnYL5uVDjd+zowwMwVZHnAjf4edNrKpCDYfXDgmRE/Ak7QyQ==} - engines: {node: '>=12.0.0'} - peerDependencies: - eslint: '>=7.28.0' - eslint-config-prettier: '*' - prettier: '>=2.0.0' - peerDependenciesMeta: - eslint-config-prettier: - optional: true - dependencies: - eslint: 8.56.0 - eslint-config-prettier: 8.10.0(eslint@8.56.0) - prettier: 2.8.8 - prettier-linter-helpers: 1.0.0 - dev: true - /eslint-scope@5.1.1: resolution: {integrity: sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==} engines: {node: '>=8.0.0'} @@ -13205,10 +13165,6 @@ packages: resolution: {integrity: sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==} dev: true - /fast-diff@1.3.0: - resolution: {integrity: sha512-VxPP4NqbUjj6MaAOafWeUn2cXWLcCtljklUtZf0Ind4XQ+QPtmA0b18zZy0jIQx+ExRVCR/ZQpBmik5lXshNsw==} - dev: true - /fast-fifo@1.3.2: resolution: {integrity: sha512-/d9sfos4yxzpwkDkuN7k2SqFKtYNmCTzgfEpz82x34IM9/zc8KGxQoXg1liNC/izpRM/MBdt44Nmx41ZWqk+FQ==} dev: true @@ -18764,13 +18720,6 @@ packages: engines: {node: '>= 0.8.0'} dev: true - /prettier-linter-helpers@1.0.0: - resolution: {integrity: sha512-GbK2cP9nraSSUF9N2XwUwqfzlAFlMNYYl+ShE/V+H8a9uNl/oUqB1w2EL54Jh0OlyRSd8RfWYJ3coVS4TROP2w==} - engines: {node: '>=6.0.0'} - dependencies: - fast-diff: 1.3.0 - dev: true - /prettier@2.7.1: resolution: {integrity: sha512-ujppO+MkdPqoVINuDFDRLClm7D78qbDt0/NR+wp5FqEZOoTNAjPHWj17QRhu7geIHJfcNhRk1XVQmF8Bp3ye+g==} engines: {node: '>=10.13.0'} @@ -18782,6 +18731,12 @@ packages: hasBin: true dev: true + /prettier@3.1.1: + resolution: {integrity: sha512-22UbSzg8luF4UuZtzgiUOfcGM8s4tjBv6dJRT7j275NXsy2jb4aJa4NNveul5x4eqlF1wuhuR2RElK71RvmVaw==} + engines: {node: '>=14'} + hasBin: true + dev: true + /pretty-bytes@5.6.0: resolution: {integrity: sha512-FFw039TmrBqFK8ma/7OL3sDz/VytdtJr044/QUJtH0wK9lb9jLq9tJyIxUwtQJHwar2BqtiA4iCWSwo9JLkzFg==} engines: {node: '>=6'} diff --git a/prettier.config.mjs b/prettier.config.mjs new file mode 100644 index 000000000..ca4c70878 --- /dev/null +++ b/prettier.config.mjs @@ -0,0 +1,16 @@ +/** @satisfies {import('prettier').Config} */ +const config = { + singleQuote: true, + trailingComma: 'all', + printWidth: 100, + overrides: [ + { + files: ['icons/*.json', 'categories/*.json'], + options: { + printWidth: 0, + }, + }, + ], +}; + +export default config; diff --git a/scripts/generateSuperSVG.mjs b/scripts/generateSuperSVG.mjs index 0700dfd01..78b5730f1 100644 --- a/scripts/generateSuperSVG.mjs +++ b/scripts/generateSuperSVG.mjs @@ -1,6 +1,6 @@ import path from 'path'; import { stringify, parseSync } from 'svgson'; -import prettier from 'prettier'; +import * as prettier from 'prettier'; import { appendFile, readSvgDirectory, getCurrentDirPath } from './helpers.mjs'; import readSvgs from '../packages/lucide-static/scripts/readSvgs.mjs'; @@ -10,7 +10,7 @@ const currentDir = getCurrentDirPath(import.meta.url); const ICONS_DIR = path.resolve('icons'); const PACKAGE_DIR = path.resolve(currentDir); -export default function generateSprite(svgs, packageDir) { +async function generateSprite(svgs, packageDir) { const symbols = svgs.map(({ parsedSvg }, index) => { const itemsPerRow = 10; const numInRow = index % itemsPerRow; @@ -37,7 +37,7 @@ export default function generateSprite(svgs, packageDir) { }; const spriteSvg = stringify(spriteSvgObject); - const prettifiedSprite = prettier.format(spriteSvg, { parser: 'babel' }).replace(/;/g, ''); + const prettifiedSprite = (await prettier.format(spriteSvg, { parser: 'babel' })).replace(/;/g, ''); const xmlMeta = `\n`; @@ -54,4 +54,4 @@ const parsedSvgs = svgs.map(({ name, contents }) => ({ parsedSvg: parseSync(contents), })); -generateSprite(parsedSvgs, PACKAGE_DIR); +await generateSprite(parsedSvgs, PACKAGE_DIR); diff --git a/scripts/render/processSvg.mjs b/scripts/render/processSvg.mjs index dce979711..f404eb3b6 100644 --- a/scripts/render/processSvg.mjs +++ b/scripts/render/processSvg.mjs @@ -1,5 +1,5 @@ import {optimize} from 'svgo'; -import prettier from 'prettier'; +import * as prettier from 'prettier'; import {parseSync, stringify} from 'svgson'; import DEFAULT_ATTRS from './default-attrs.json' assert { type: 'json' };