From a6a4b0ef31139ef958e4012469743eb3add9d87e Mon Sep 17 00:00:00 2001 From: Eric Fennis Date: Sun, 31 Dec 2023 17:03:07 +0100 Subject: [PATCH 01/22] cleanup scripts --- .github/workflows/lucide-angular.yml | 17 +- .github/workflows/lucide-preact.yml | 3 - .github/workflows/lucide-react-native.yml | 3 - .github/workflows/lucide-react.yml | 17 +- .github/workflows/lucide-solid.yml | 17 +- .github/workflows/lucide-svelte.yml | 17 +- .github/workflows/lucide-vue-next.yml | 17 +- .github/workflows/lucide-vue.yml | 17 +- .github/workflows/lucide.yml | 17 +- package.json | 12 +- packages/lucide-preact/package.json | 2 +- packages/lucide-react-native/package.json | 4 +- packages/lucide-react/package.json | 2 +- packages/lucide-solid/package.json | 4 +- packages/lucide/package.json | 7 +- packages/lucide/scripts/buildTypes.mjs | 86 - scripts/addMissingIconJsonFiles.mjs | 18 +- scripts/buildIcons.mjs | 65 - scripts/checkIconsAndCategories.mjs | 14 +- scripts/generateSuperSVG.mjs | 57 - scripts/helpers.mjs | 9 +- scripts/migrateIconsToCategories.mjs | 15 +- scripts/optimizeStagedSvgs.mjs | 2 +- scripts/render/default-attrs.json | 11 - scripts/render/renderIconsObject.mjs | 39 - scripts/super-sprite.svg | 29892 ---------------- scripts/templates/defaultIconFileTemplate.mjs | 11 - 27 files changed, 157 insertions(+), 30218 deletions(-) delete mode 100644 packages/lucide/scripts/buildTypes.mjs delete mode 100644 scripts/buildIcons.mjs delete mode 100644 scripts/generateSuperSVG.mjs delete mode 100644 scripts/render/default-attrs.json delete mode 100644 scripts/render/renderIconsObject.mjs delete mode 100644 scripts/super-sprite.svg delete mode 100644 scripts/templates/defaultIconFileTemplate.mjs diff --git a/.github/workflows/lucide-angular.yml b/.github/workflows/lucide-angular.yml index 6a75a817adc..225d728a3fb 100644 --- a/.github/workflows/lucide-angular.yml +++ b/.github/workflows/lucide-angular.yml @@ -8,7 +8,7 @@ on: - pnpm-lock.yaml jobs: - lucide-angular: + build: runs-on: ubuntu-latest steps: - uses: actions/checkout@v3 @@ -26,5 +26,20 @@ jobs: - name: Build run: pnpm --filter lucide-angular build + test: + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v3 + - uses: pnpm/action-setup@v2 + with: + version: 8 + - uses: actions/setup-node@v3.8.1 + with: + node-version: 18 + cache: 'pnpm' + + - name: Install dependencies + run: pnpm install --frozen-lockfile + - name: Test run: pnpm --filter lucide-angular test diff --git a/.github/workflows/lucide-preact.yml b/.github/workflows/lucide-preact.yml index d5a40bc49d1..2a64a64bb42 100644 --- a/.github/workflows/lucide-preact.yml +++ b/.github/workflows/lucide-preact.yml @@ -24,8 +24,5 @@ jobs: - name: Install dependencies run: pnpm install --frozen-lockfile - - name: Build - run: pnpm --filter lucide-preact build - - name: Test run: pnpm --filter lucide-preact test diff --git a/.github/workflows/lucide-react-native.yml b/.github/workflows/lucide-react-native.yml index 9199b5b3352..5ce37e198e5 100644 --- a/.github/workflows/lucide-react-native.yml +++ b/.github/workflows/lucide-react-native.yml @@ -24,8 +24,5 @@ jobs: - name: Install dependencies run: pnpm install --frozen-lockfile - - name: Build - run: pnpm --filter lucide-react-native build - - name: Test run: pnpm --filter lucide-react-native test diff --git a/.github/workflows/lucide-react.yml b/.github/workflows/lucide-react.yml index 7c8e80c91a7..67ce8cdf5ac 100644 --- a/.github/workflows/lucide-react.yml +++ b/.github/workflows/lucide-react.yml @@ -10,7 +10,7 @@ on: - pnpm-lock.yaml jobs: - lucide-react: + build: runs-on: ubuntu-latest steps: - uses: actions/checkout@v3 @@ -28,5 +28,20 @@ jobs: - name: Build run: pnpm --filter lucide-react build + test: + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v3 + - uses: pnpm/action-setup@v2 + with: + version: 8 + - uses: actions/setup-node@v3.8.1 + with: + node-version: 18 + cache: 'pnpm' + + - name: Install dependencies + run: pnpm install --frozen-lockfile + - name: Test run: pnpm --filter lucide-react test diff --git a/.github/workflows/lucide-solid.yml b/.github/workflows/lucide-solid.yml index facdc04406e..86e016b519d 100644 --- a/.github/workflows/lucide-solid.yml +++ b/.github/workflows/lucide-solid.yml @@ -9,7 +9,7 @@ on: - pnpm-lock.yaml jobs: - lucide-solid: + build: runs-on: ubuntu-latest steps: - uses: actions/checkout@v3 @@ -27,5 +27,20 @@ jobs: - name: Build run: pnpm --filter lucide-solid build + test: + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v3 + - uses: pnpm/action-setup@v2 + with: + version: 8 + - uses: actions/setup-node@v3.8.1 + with: + node-version: 18 + cache: 'pnpm' + + - name: Install dependencies + run: pnpm install --frozen-lockfile + - name: Test run: pnpm --filter lucide-solid test diff --git a/.github/workflows/lucide-svelte.yml b/.github/workflows/lucide-svelte.yml index 6fbfb8063ba..12de7e9d79a 100644 --- a/.github/workflows/lucide-svelte.yml +++ b/.github/workflows/lucide-svelte.yml @@ -9,7 +9,7 @@ on: - pnpm-lock.yaml jobs: - lucide-svelte: + build: runs-on: ubuntu-latest steps: - uses: actions/checkout@v3 @@ -27,5 +27,20 @@ jobs: - name: Build run: pnpm --filter lucide-svelte build + test: + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v3 + - uses: pnpm/action-setup@v2 + with: + version: 8 + - uses: actions/setup-node@v3.8.1 + with: + node-version: 18 + cache: 'pnpm' + + - name: Install dependencies + run: pnpm install --frozen-lockfile + - name: Test run: pnpm --filter lucide-svelte test diff --git a/.github/workflows/lucide-vue-next.yml b/.github/workflows/lucide-vue-next.yml index e57d26d0458..d833cb6351e 100644 --- a/.github/workflows/lucide-vue-next.yml +++ b/.github/workflows/lucide-vue-next.yml @@ -9,7 +9,7 @@ on: - pnpm-lock.yaml jobs: - lucide-vue-next: + build: runs-on: ubuntu-latest steps: - uses: actions/checkout@v3 @@ -27,5 +27,20 @@ jobs: - name: Build run: pnpm --filter lucide-vue-next build + test: + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v3 + - uses: pnpm/action-setup@v2 + with: + version: 8 + - uses: actions/setup-node@v3.8.1 + with: + node-version: 18 + cache: 'pnpm' + + - name: Install dependencies + run: pnpm install --frozen-lockfile + - name: Test run: pnpm --filter lucide-vue-next test diff --git a/.github/workflows/lucide-vue.yml b/.github/workflows/lucide-vue.yml index 34a5da02eb0..c8c9a67499e 100644 --- a/.github/workflows/lucide-vue.yml +++ b/.github/workflows/lucide-vue.yml @@ -9,7 +9,7 @@ on: - pnpm-lock.yaml jobs: - lucide-vue: + build: runs-on: ubuntu-latest steps: - uses: actions/checkout@v3 @@ -27,5 +27,20 @@ jobs: - name: Build run: pnpm --filter lucide-vue build + test: + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v3 + - uses: pnpm/action-setup@v2 + with: + version: 8 + - uses: actions/setup-node@v3.8.1 + with: + node-version: 18 + cache: 'pnpm' + + - name: Install dependencies + run: pnpm install --frozen-lockfile + - name: Test run: pnpm --filter lucide-vue test diff --git a/.github/workflows/lucide.yml b/.github/workflows/lucide.yml index 61139855e77..fe6cdfa0f7f 100644 --- a/.github/workflows/lucide.yml +++ b/.github/workflows/lucide.yml @@ -9,7 +9,7 @@ on: - pnpm-lock.yaml jobs: - lucide: + build: runs-on: ubuntu-latest steps: - uses: actions/checkout@v3 @@ -27,5 +27,20 @@ jobs: - name: Build run: pnpm --filter lucide build + test: + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v3 + - uses: pnpm/action-setup@v2 + with: + version: 8 + - uses: actions/setup-node@v3.8.1 + with: + node-version: 18 + cache: 'pnpm' + + - name: Install dependencies + run: pnpm install --frozen-lockfile + - name: Test run: pnpm --filter lucide test diff --git a/package.json b/package.json index ede078ca8d8..93279bee98c 100644 --- a/package.json +++ b/package.json @@ -14,17 +14,15 @@ "lucide-vue-next": "pnpm --filter lucide-vue-next", "lucide-svelte": "pnpm --filter lucide-svelte", "lucide-static": "pnpm --filter lucide-static", - "build:icons": "node ./scripts/buildIcons.mjs --templateSrc ./packages/lucide/scripts/exportTemplate.mjs", "build:outline-icons": "pnpm --filter outline-svg start", "build:font": "pnpm --filter docs prebuild:releaseJson && pnpm --filter build-font start", - "generate:supersprite": "node ./scripts/generateSuperSVG.mjs", "optimize": "node ./scripts/optimizeSvgs.mjs", "addjsons": "node scripts/addMissingIconJsonFiles.mjs", - "checkIcons": "node scripts/checkIconsAndCategories.mjs --presets @babel/env", - "tags2icons": "node scripts/migrateTagsToIcons.mjs --presets @babel/env", - "icons2tags": "node scripts/migrateIconsToTags.mjs --presets @babel/env", - "icons2categories": "node scripts/migrateIconsToCategories.mjs --presets @babel/env", - "categories2icons": "node scripts/migrateCategoriesToIcons.mjs --presets @babel/env", + "checkIcons": "node scripts/checkIconsAndCategories.mjs", + "tags2icons": "node scripts/migrateTagsToIcons.mjs", + "icons2tags": "node scripts/migrateIconsToTags.mjs", + "icons2categories": "node scripts/migrateIconsToCategories.mjs", + "categories2icons": "node scripts/migrateCategoriesToIcons.mjs", "generate:changelog": "node ./scripts/generateChangelog.mjs", "generate:contributors": "node ./scripts/updateContributors.mjs icons/*.svg", "generate:nextJSAliases": "node ./scripts/generateNextJSAliases.mjs", diff --git a/packages/lucide-preact/package.json b/packages/lucide-preact/package.json index b3bae25bf53..70133e1489f 100644 --- a/packages/lucide-preact/package.json +++ b/packages/lucide-preact/package.json @@ -39,7 +39,7 @@ "build:icons": "build-icons --output=./src --templateSrc=./scripts/exportTemplate.mjs --renderUniqueKey --withAliases --aliasesFileExtension=.ts --iconFileExtension=.ts --exportFileName=index.ts", "build:types": "node ./scripts/buildTypes.mjs", "build:bundles": "rollup -c ./rollup.config.mjs", - "test": "vitest run", + "test": "pnpm build:icons && vitest run", "version": "pnpm version --git-tag-version=false" }, "devDependencies": { diff --git a/packages/lucide-react-native/package.json b/packages/lucide-react-native/package.json index 889930d759c..0aaac511f1e 100644 --- a/packages/lucide-react-native/package.json +++ b/packages/lucide-react-native/package.json @@ -36,11 +36,11 @@ "scripts": { "build": "pnpm clean && pnpm copy:license && pnpm build:icons && pnpm build:bundles && pnpm build:types", "copy:license": "cp ../../LICENSE ./LICENSE", - "clean": "rm -rf dist && rm -rf stats && rm -rf ./src/icons/*.js", + "clean": "rm -rf dist && rm -rf stats && rm -rf ./src/icons/*.ts", "build:icons": "build-icons --output=./src --templateSrc=./scripts/exportTemplate.mjs --renderUniqueKey --iconFileExtension=.ts --exportFileName=index.ts --withAliases --aliasesFileExtension=.ts", "build:types": "node ./scripts/buildTypes.mjs", "build:bundles": "rollup -c ./rollup.config.mjs", - "test": "vitest run", + "test": "pnpm build:icons && vitest run", "version": "pnpm version --git-tag-version=false" }, "devDependencies": { diff --git a/packages/lucide-react/package.json b/packages/lucide-react/package.json index 3100f933124..97b4d5a57e4 100644 --- a/packages/lucide-react/package.json +++ b/packages/lucide-react/package.json @@ -44,7 +44,7 @@ "build:bundles": "rollup -c ./rollup.config.mjs", "typecheck": "tsc", "typecheck:watch": "tsc -w", - "test": "vitest run", + "test": "pnpm build:icons && vitest run", "test:watch": "vitest watch", "version": "pnpm version --git-tag-version=false" }, diff --git a/packages/lucide-solid/package.json b/packages/lucide-solid/package.json index e5f96e47d4e..0c1efc1a725 100644 --- a/packages/lucide-solid/package.json +++ b/packages/lucide-solid/package.json @@ -43,12 +43,12 @@ "scripts": { "build": "pnpm clean && pnpm copy:license && pnpm build:icons && pnpm build:bundle && pnpm build:version", "copy:license": "cp ../../LICENSE ./LICENSE", - "clean": "rm -rf dist && rm -rf stats && rm -rf ./src/icons/*.js", + "clean": "rm -rf dist && rm -rf stats && rm -rf ./src/icons/*.ts", "build:transpile": "tsc --jsx preserve -t es2020 --rootDir src --outDir dist --noEmit false", "build:version": "node ./scripts/replaceVersion.mjs", "build:bundle": "rollup -c rollup.config.mjs", "build:icons": "build-icons --output=./src --templateSrc=./scripts/exportTemplate.mjs --renderUniqueKey --withAliases --aliasesFileExtension=.ts --iconFileExtension=.tsx --exportFileName=index.ts", - "test": "vitest run", + "test": "pnpm build:bundle && vitest run", "version": "pnpm version --git-tag-version=false" }, "devDependencies": { diff --git a/packages/lucide/package.json b/packages/lucide/package.json index 48e1a82fb3b..7bd06f44f81 100644 --- a/packages/lucide/package.json +++ b/packages/lucide/package.json @@ -33,13 +33,12 @@ "dist" ], "scripts": { - "build": "pnpm clean && pnpm copy:license && pnpm build:icons && pnpm build:bundles", + "build": "pnpm clean && pnpm copy:license && pnpm build:icons && pnpm build:bundle", "copy:license": "cp ../../LICENSE ./LICENSE", "clean": "rm -rf dist && rm -rf stats && rm -rf ./src/icons/*.ts", "build:icons": "build-icons --output=./src --templateSrc=./scripts/exportTemplate.mjs --iconFileExtension=.ts --withAliases --aliasNamesOnly --aliasesFileExtension=.ts --exportFileName=index.ts", - "build:types": "node ./scripts/buildTypes.mjs", - "build:bundles": "rollup -c rollup.config.mjs", - "test": "vitest run", + "build:bundle": "rollup -c rollup.config.mjs", + "test": "pnpm build:icons && vitest run", "version": "pnpm version --git-tag-version=false" }, "devDependencies": { diff --git a/packages/lucide/scripts/buildTypes.mjs b/packages/lucide/scripts/buildTypes.mjs deleted file mode 100644 index 239043f323e..00000000000 --- a/packages/lucide/scripts/buildTypes.mjs +++ /dev/null @@ -1,86 +0,0 @@ -import path from 'path'; - -import { - readSvgDirectory, - appendFile, - writeFile, - toPascalCase, - getCurrentDirPath, -} from '../../../scripts/helpers.mjs'; - -const currentDir = getCurrentDirPath(import.meta.url); - -const defaultAttributes = { - xmlns: 'http://www.w3.org/2000/svg', - width: 24, - height: 24, - viewBox: '0 0 24 24', - fill: 'none', - stroke: 'currentColor', - 'stroke-width': 2, - 'stroke-linecap': 'round', - 'stroke-linejoin': 'round', -}; - -const TARGET_DIR = path.join(currentDir, '../dist'); -const ICONS_DIR = path.resolve(currentDir, '../../../icons'); -const TYPES_FILE_NAME = 'lucide.d.ts'; - -// Generates header of d.ts file include some types and functions -const typeDefinitions = `\ -declare module 'lucide' - -export interface SVGProps extends Partial ${JSON.stringify(defaultAttributes, null, 2)} - -export declare type IconNodeChild = readonly [string, object]; -export declare type IconNode = readonly [tag: string, attrs: SVGProps, children?: IconNodeChild[]]; -export declare type CustomAttrs = { [attr:string]: any } -export type Icons = { [key: string]: IconNode } - -export interface CreateIconsOptions { - /** - * List of icons you want to replace - * - * For example: \`{ Menu, Circle}\`. - * - * For replace all icons in lucide library, import \`icons\` and use it. - */ - icons: Icons; - - /** - * Search HTML emelemt by \`nameAttr\` property. - * - * For example if define \`\`, fill by \`data-lucide\`. - * - * @default 'data-lucide' - */ - nameAttr?: string; - - /** - * Change defult attribute for show like color, fill, width , ... - * - * @default undefined - */ - attrs?: CustomAttrs; -} - -export function createElement(icon: IconNode): SVGSVGElement; -export function createIcons(options: CreateIconsOptions): void; - -export declare const icons: Icons; - -// Generated icons -`; - -writeFile(typeDefinitions, TYPES_FILE_NAME, TARGET_DIR); - -const svgFiles = readSvgDirectory(ICONS_DIR); - -svgFiles.forEach((svgFile) => { - const nameSvg = path.basename(svgFile, '.svg'); - const namePascal = toPascalCase(nameSvg); - - appendFile(`export declare const ${namePascal}: IconNode;\n`, TYPES_FILE_NAME, TARGET_DIR); -}); - -console.log(`Generated ${TYPES_FILE_NAME} file with`, svgFiles.length, 'icons'); diff --git a/scripts/addMissingIconJsonFiles.mjs b/scripts/addMissingIconJsonFiles.mjs index c0ac7cfd7fd..910b1fab2b4 100644 --- a/scripts/addMissingIconJsonFiles.mjs +++ b/scripts/addMissingIconJsonFiles.mjs @@ -1,5 +1,5 @@ import path from 'path'; -import {getCurrentDirPath, readAllMetadata, readSvgDirectory, writeFile} from './helpers.mjs'; +import { getCurrentDirPath, readAllMetadata, readSvgDirectory, writeFile } from './helpers.mjs'; const currentDir = getCurrentDirPath(import.meta.url); const ICONS_DIR = path.resolve(currentDir, '../icons'); @@ -9,13 +9,17 @@ const svgFiles = readSvgDirectory(ICONS_DIR); const iconNames = svgFiles.map((icon) => icon.split('.')[0]); -iconNames.forEach(iconName => { +iconNames.forEach((iconName) => { if (typeof icons[iconName] === 'undefined') { - const iconContent = JSON.stringify({ - "$schema": "../icon.schema.json", - "tags": [], - "categories": [] - }, null, 2); + const iconContent = JSON.stringify( + { + $schema: '../icon.schema.json', + tags: [], + categories: [], + }, + null, + 2, + ); writeFile(iconContent, `${iconName}.json`, path.resolve(currentDir, '..')); } }); diff --git a/scripts/buildIcons.mjs b/scripts/buildIcons.mjs deleted file mode 100644 index f05bb2e4cd9..00000000000 --- a/scripts/buildIcons.mjs +++ /dev/null @@ -1,65 +0,0 @@ -import fs from 'fs'; -import path from 'path'; -import getArgumentOptions from 'minimist'; - -import renderIconsObject from './render/renderIconsObject.mjs'; -import generateIconFiles from './building/generateIconFiles.mjs'; -import generateExportsFile from './building/generateExportsFile.mjs'; - -import { readSvgDirectory, getCurrentDirPath } from './helpers.mjs'; - -const cliArguments = getArgumentOptions(process.argv.slice(2)); - -const currentDir = getCurrentDirPath(import.meta.url); - -const ICONS_DIR = path.resolve(currentDir, '../icons'); -const OUTPUT_DIR = path.resolve(process.cwd(), cliArguments.output || '../build'); - -if (!fs.existsSync(OUTPUT_DIR)) { - fs.mkdirSync(OUTPUT_DIR); -} - -const { - renderUniqueKey = false, - templateSrc, - silent = false, - iconFileExtension = '.js', - exportFileName = 'index.js', - pretty = true, -} = cliArguments; - -async function buildIcons() { - if (templateSrc == null) { - throw new Error('No `templateSrc` argument given.'); - } - - const svgFiles = readSvgDirectory(ICONS_DIR); - - const icons = renderIconsObject(svgFiles, ICONS_DIR, renderUniqueKey); - - const { default: iconFileTemplate } = await import(path.resolve(process.cwd(), templateSrc)); - - // Generates iconsNodes files for each icon - generateIconFiles({ - iconNodes: icons, - outputDirectory: OUTPUT_DIR, - template: iconFileTemplate, - showLog: !silent, - iconFileExtension, - pretty: JSON.parse(pretty), - }); - - // Generates entry files for the compiler filled with icons exports - generateExportsFile( - path.join(OUTPUT_DIR, 'icons', exportFileName), - path.join(OUTPUT_DIR, 'icons'), - icons, - iconFileExtension, - ); -} - -try { - buildIcons(); -} catch (error) { - console.error(error); -} diff --git a/scripts/checkIconsAndCategories.mjs b/scripts/checkIconsAndCategories.mjs index ff7018b5ccb..39b237e8e8d 100644 --- a/scripts/checkIconsAndCategories.mjs +++ b/scripts/checkIconsAndCategories.mjs @@ -1,33 +1,33 @@ import path from 'path'; import { readSvgDirectory, getCurrentDirPath, readAllMetadata } from './helpers.mjs'; -const currentDir = getCurrentDirPath(import.meta.url) +const currentDir = getCurrentDirPath(import.meta.url); const ICONS_DIR = path.resolve(currentDir, '../icons'); const icons = readAllMetadata(ICONS_DIR); const CATEGORIES_DIR = path.resolve(currentDir, '../categories'); const categories = readAllMetadata(CATEGORIES_DIR); -console.log('Reading all icons') +console.log('Reading all icons'); const svgFiles = readSvgDirectory(ICONS_DIR); -const iconNames = svgFiles.map(icon => icon.split('.')[0]); +const iconNames = svgFiles.map((icon) => icon.split('.')[0]); let error = false; -iconNames.forEach(iconName => { +iconNames.forEach((iconName) => { if (typeof icons[iconName] === 'undefined') { console.error(`'${iconName}.svg' does not have a matching JSON file.`); error = true; } }); -Object.keys(icons).forEach(iconName => { +Object.keys(icons).forEach((iconName) => { const icon = icons[iconName]; if (iconNames.indexOf(iconName) === -1) { console.error(`'${iconName}.svg' does not exist.`); error = true; } - icon.categories.forEach(categoryName => { + icon.categories.forEach((categoryName) => { if (typeof categories[categoryName] === 'undefined') { console.error(`Icon '${iconName}' refers to the non-existing category '${categoryName}'.`); error = true; @@ -35,7 +35,7 @@ Object.keys(icons).forEach(iconName => { }); }); -Object.keys(categories).forEach(categoryName => { +Object.keys(categories).forEach((categoryName) => { const category = categories[categoryName]; if (!category.icon) { console.error(`Category '${categoryName}' does not use an icon '${category.icon}'.`); diff --git a/scripts/generateSuperSVG.mjs b/scripts/generateSuperSVG.mjs deleted file mode 100644 index 0700dfd012f..00000000000 --- a/scripts/generateSuperSVG.mjs +++ /dev/null @@ -1,57 +0,0 @@ -import path from 'path'; -import { stringify, parseSync } from 'svgson'; -import prettier from 'prettier'; -import { appendFile, readSvgDirectory, getCurrentDirPath } from './helpers.mjs'; - -import readSvgs from '../packages/lucide-static/scripts/readSvgs.mjs'; - -const currentDir = getCurrentDirPath(import.meta.url); - -const ICONS_DIR = path.resolve('icons'); -const PACKAGE_DIR = path.resolve(currentDir); - -export default function generateSprite(svgs, packageDir) { - const symbols = svgs.map(({ parsedSvg }, index) => { - const itemsPerRow = 10; - const numInRow = index % itemsPerRow; - const column = numInRow + 1; - const row = (index - numInRow) / itemsPerRow + 1; - return { - name: 'g', - type: 'element', - attributes: { - transform: `translate(${column * 24 - 24},${row * 24 - 24})`, - }, - children: [parsedSvg], - }; - }); - - const spriteSvgObject = { - name: 'svg', - type: 'element', - attributes: { - xmlns: 'http://www.w3.org/2000/svg', - version: '1.1', - }, - children: symbols, - }; - - const spriteSvg = stringify(spriteSvgObject); - const prettifiedSprite = prettier.format(spriteSvg, { parser: 'babel' }).replace(/;/g, ''); - - const xmlMeta = `\n`; - - appendFile(xmlMeta, `super-sprite.svg`, packageDir); - appendFile(prettifiedSprite, `super-sprite.svg`, packageDir); -} - -const svgFiles = readSvgDirectory(ICONS_DIR); -const svgs = readSvgs(svgFiles, ICONS_DIR); - -const parsedSvgs = svgs.map(({ name, contents }) => ({ - name, - contents, - parsedSvg: parseSync(contents), -})); - -generateSprite(parsedSvgs, PACKAGE_DIR); diff --git a/scripts/helpers.mjs b/scripts/helpers.mjs index e0cfc0f8fc8..0da79a6a7d5 100644 --- a/scripts/helpers.mjs +++ b/scripts/helpers.mjs @@ -90,12 +90,13 @@ export const writeFileIfNotExists = (content, fileName, outputDirectory) => { * @returns {object} A map of icon or category metadata */ export const readAllMetadata = (directory) => - fs.readdirSync(directory).filter((file) => path.extname(file) === '.json').reduce( - (acc, fileName, i) => { + fs + .readdirSync(directory) + .filter((file) => path.extname(file) === '.json') + .reduce((acc, fileName, i) => { acc[path.basename(fileName, '.json')] = readMetadata(fileName, directory); return acc; - }, {} - ); + }, {}); /** * Reads metadata for an icon or category diff --git a/scripts/migrateIconsToCategories.mjs b/scripts/migrateIconsToCategories.mjs index 86103ff3227..f2bab1d73e7 100644 --- a/scripts/migrateIconsToCategories.mjs +++ b/scripts/migrateIconsToCategories.mjs @@ -1,25 +1,24 @@ import path from 'path'; import { writeFile, getCurrentDirPath, readAllMetadata } from './helpers.mjs'; -const currentDir = getCurrentDirPath(import.meta.url) +const currentDir = getCurrentDirPath(import.meta.url); const ICONS_DIR = path.resolve(currentDir, '../icons'); const icons = readAllMetadata(ICONS_DIR); const newCategories = {}; -Object.keys(icons).forEach(iconName => { - icons[iconName].categories.forEach(categoryName => { +Object.keys(icons).forEach((iconName) => { + icons[iconName].categories.forEach((categoryName) => { newCategories[categoryName] = newCategories[categoryName] || []; newCategories[categoryName].push(iconName); }); }); -const ordered = Object.keys(newCategories).sort().reduce( - (obj, key) => { +const ordered = Object.keys(newCategories) + .sort() + .reduce((obj, key) => { obj[key] = newCategories[key]; return obj; - }, - {} -); + }, {}); const categoriesContent = JSON.stringify(ordered, null, 2); diff --git a/scripts/optimizeStagedSvgs.mjs b/scripts/optimizeStagedSvgs.mjs index 265acdb6c98..f9c719d1492 100644 --- a/scripts/optimizeStagedSvgs.mjs +++ b/scripts/optimizeStagedSvgs.mjs @@ -4,7 +4,7 @@ import processSvg from './render/processSvg.mjs'; const svgFiles = process.argv.slice(2); svgFiles.forEach(async (svgFile) => { - console.log('Optimizing staged SVG file:', svgFile) + console.log('Optimizing staged SVG file:', svgFile); const content = fs.readFileSync(svgFile); const svg = await processSvg(content, svgFile); fs.writeFileSync(svgFile, svg, 'utf-8'); diff --git a/scripts/render/default-attrs.json b/scripts/render/default-attrs.json deleted file mode 100644 index e57e91b7e86..00000000000 --- a/scripts/render/default-attrs.json +++ /dev/null @@ -1,11 +0,0 @@ -{ - "xmlns": "http://www.w3.org/2000/svg", - "width": 24, - "height": 24, - "viewBox": "0 0 24 24", - "fill": "none", - "stroke": "currentColor", - "stroke-width": 2, - "stroke-linecap": "round", - "stroke-linejoin": "round" -} diff --git a/scripts/render/renderIconsObject.mjs b/scripts/render/renderIconsObject.mjs deleted file mode 100644 index 5d19c56dbcc..00000000000 --- a/scripts/render/renderIconsObject.mjs +++ /dev/null @@ -1,39 +0,0 @@ -import { basename } from 'path'; -import { parseSync } from 'svgson'; -import { generateHashedKey, readSvg, hasDuplicatedChildren } from '../helpers.mjs'; - -/** - * Build an object in the format: `{ : }`. - * @param {string[]} svgFiles - A list of filenames. - * @param {Function} getSvg - A function that returns the contents of an SVG file given a filename. - * @returns {Object} - */ -export default (svgFiles, iconsDirectory, renderUniqueKey = false) => - svgFiles - .map((svgFile) => { - const name = basename(svgFile, '.svg'); - const svg = readSvg(svgFile, iconsDirectory); - const contents = parseSync(svg); - - if (!(contents.children && contents.children.length)) { - throw new Error(`${name}.svg has no children!`); - } - - if (hasDuplicatedChildren(contents.children)) { - throw new Error(`Duplicated children in ${name}.svg`); - } - - if (renderUniqueKey) { - contents.children = contents.children.map((child) => { - child.attributes.key = generateHashedKey(child); - - return child; - }); - } - - return { name, contents }; - }) - .reduce((icons, icon) => { - icons[icon.name] = icon.contents; - return icons; - }, {}); diff --git a/scripts/super-sprite.svg b/scripts/super-sprite.svg deleted file mode 100644 index 0e54911127c..00000000000 --- a/scripts/super-sprite.svg +++ /dev/null @@ -1,29892 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/scripts/templates/defaultIconFileTemplate.mjs b/scripts/templates/defaultIconFileTemplate.mjs deleted file mode 100644 index e836c684227..00000000000 --- a/scripts/templates/defaultIconFileTemplate.mjs +++ /dev/null @@ -1,11 +0,0 @@ -export default ({ componentName, children }) => ` -import defaultAttributes from '../defaultAttributes'; - -const ${componentName} = [ - 'svg', - defaultAttributes, - ${JSON.stringify(children)} -]; - -export default ${componentName}; -`; From 98228f0a54a89a6b6ab785f72175bc47a9a5789a Mon Sep 17 00:00:00 2001 From: Eric Fennis Date: Fri, 19 Apr 2024 13:58:32 +0200 Subject: [PATCH 02/22] Move helpers to package --- docs/package.json | 14 +- .../scripts}/writeIconDetails.mjs | 3 +- .../scripts}/writeIconMetaIndex.mjs | 2 +- {scripts => docs/scripts}/writeIconNodes.mjs | 4 +- .../scripts}/writeIconRelatedIcons.mjs | 2 +- .../scripts}/writeReleaseMetadata.mjs | 2 +- .../scripts}/writeVercelOutput.mjs | 0 pnpm-lock.yaml | 414 ++++-------------- scripts/addMissingIconJsonFiles.mjs | 2 +- scripts/checkIconsAndCategories.mjs | 2 +- scripts/generate/generateIcons.mjs | 2 +- scripts/generateNextJSAliases.mjs | 2 +- scripts/helpers.mjs | 193 -------- scripts/migrateCategoriesToIcons.mjs | 2 +- scripts/migrateIconsToCategories.mjs | 2 +- scripts/migrateIconsToTags.mjs | 2 +- scripts/migrateTagsToIcons.mjs | 2 +- scripts/optimizeSvgs.mjs | 2 +- tools/build-helpers/main.mjs | 18 + tools/build-helpers/package.json | 11 + tools/build-helpers/src/appendFile.mjs | 12 + tools/build-helpers/src/generateHashedKey.mjs | 11 + tools/build-helpers/src/getCurrentDirPath.mjs | 10 + .../src/hasDuplicatedChildren.mjs | 15 + tools/build-helpers/src/hash.mjs | 18 + tools/build-helpers/src/mergeArrays.mjs | 12 + tools/build-helpers/src/readAllMetadata.mjs | 17 + tools/build-helpers/src/readFile.mjs | 10 + tools/build-helpers/src/readMetadata.mjs | 12 + tools/build-helpers/src/readSvg.mjs | 11 + tools/build-helpers/src/readSvgDirectory.mjs | 11 + tools/build-helpers/src/resetFile.mjs | 11 + tools/build-helpers/src/toCamelCase.mjs | 10 + tools/build-helpers/src/toKebabCase.mjs | 7 + tools/build-helpers/src/toPascalCase.mjs | 13 + tools/build-helpers/src/writeFile.mjs | 12 + .../src/writeFileIfNotExists.mjs | 16 + tools/build-helpers/src/writeSvgFile.mjs | 12 + .../building/generateAliasesFile.mjs | 2 +- .../building/generateDynamicImports.mjs | 2 +- .../building/generateExportsFile.mjs | 2 +- .../building/generateIconFiles.mjs | 2 +- tools/build-icons/index.mjs | 1 + tools/build-icons/main.mjs | 2 +- tools/build-icons/package.json | 4 + .../build-icons/render/renderIconsObject.mjs | 2 +- tools/build-icons/utils/getAliases.mjs | 2 +- 47 files changed, 375 insertions(+), 545 deletions(-) rename {scripts => docs/scripts}/writeIconDetails.mjs (92%) rename {scripts => docs/scripts}/writeIconMetaIndex.mjs (93%) rename {scripts => docs/scripts}/writeIconNodes.mjs (93%) rename {scripts => docs/scripts}/writeIconRelatedIcons.mjs (97%) rename {scripts => docs/scripts}/writeReleaseMetadata.mjs (98%) rename {scripts => docs/scripts}/writeVercelOutput.mjs (100%) delete mode 100644 scripts/helpers.mjs create mode 100644 tools/build-helpers/main.mjs create mode 100644 tools/build-helpers/package.json create mode 100644 tools/build-helpers/src/appendFile.mjs create mode 100644 tools/build-helpers/src/generateHashedKey.mjs create mode 100644 tools/build-helpers/src/getCurrentDirPath.mjs create mode 100644 tools/build-helpers/src/hasDuplicatedChildren.mjs create mode 100644 tools/build-helpers/src/hash.mjs create mode 100644 tools/build-helpers/src/mergeArrays.mjs create mode 100644 tools/build-helpers/src/readAllMetadata.mjs create mode 100644 tools/build-helpers/src/readFile.mjs create mode 100644 tools/build-helpers/src/readMetadata.mjs create mode 100644 tools/build-helpers/src/readSvg.mjs create mode 100644 tools/build-helpers/src/readSvgDirectory.mjs create mode 100644 tools/build-helpers/src/resetFile.mjs create mode 100644 tools/build-helpers/src/toCamelCase.mjs create mode 100644 tools/build-helpers/src/toKebabCase.mjs create mode 100644 tools/build-helpers/src/toPascalCase.mjs create mode 100644 tools/build-helpers/src/writeFile.mjs create mode 100644 tools/build-helpers/src/writeFileIfNotExists.mjs create mode 100644 tools/build-helpers/src/writeSvgFile.mjs diff --git a/docs/package.json b/docs/package.json index f670cd543ee..a437be2e9d0 100644 --- a/docs/package.json +++ b/docs/package.json @@ -9,12 +9,12 @@ "docs:build": "vitepress build", "docs:preview": "vitepress preview", "build:docs": "vitepress build", - "prebuild:iconNodes": "node ../scripts/writeIconNodes.mjs", - "prebuild:metaJson": "node ../scripts/writeIconMetaIndex.mjs", - "prebuild:releaseJson": "node ../scripts/writeReleaseMetadata.mjs", - "prebuild:relatedIcons": "node ../scripts/writeIconRelatedIcons.mjs", - "prebuild:iconDetails": "node ../scripts/writeIconDetails.mjs", - "postbuild:vercelJson": "node ../scripts/writeVercelOutput.mjs", + "prebuild:iconNodes": "node ./scripts/writeIconNodes.mjs", + "prebuild:metaJson": "node ./scripts/writeIconMetaIndex.mjs", + "prebuild:releaseJson": "node ./scripts/writeReleaseMetadata.mjs", + "prebuild:relatedIcons": "node ./scripts/writeIconRelatedIcons.mjs", + "prebuild:iconDetails": "node ./scripts/writeIconDetails.mjs", + "postbuild:vercelJson": "node ./scripts/writeVercelOutput.mjs", "dev": "npx nitropack dev", "build:api": "npx nitropack build", "prebuild": "pnpm prebuild:iconNodes && pnpm prebuild:metaJson && pnpm prebuild:releaseJson && pnpm prebuild:relatedIcons && pnpm prebuild:iconDetails", @@ -24,6 +24,8 @@ "author": "Eric Fennis", "license": "ISC", "devDependencies": { + "@lucide/build-icons": "workspace:*", + "@lucide/build-helpers": "workspace:*", "@rollup/plugin-replace": "^5.0.2", "@types/semver": "^7.5.3", "h3": "^1.8.0", diff --git a/scripts/writeIconDetails.mjs b/docs/scripts/writeIconDetails.mjs similarity index 92% rename from scripts/writeIconDetails.mjs rename to docs/scripts/writeIconDetails.mjs index 95036bc82dc..31971cd6ff1 100644 --- a/scripts/writeIconDetails.mjs +++ b/docs/scripts/writeIconDetails.mjs @@ -1,7 +1,6 @@ import fs from 'fs'; import path from 'path'; -import renderIconsObject from './render/renderIconsObject.mjs'; -import { readSvgDirectory, toCamelCase } from './helpers.mjs'; +import { readSvgDirectory, toCamelCase } from '@lucide/build-helpers'; const currentDir = process.cwd(); const ICONS_DIR = path.resolve(currentDir, '../icons'); diff --git a/scripts/writeIconMetaIndex.mjs b/docs/scripts/writeIconMetaIndex.mjs similarity index 93% rename from scripts/writeIconMetaIndex.mjs rename to docs/scripts/writeIconMetaIndex.mjs index d2813d59bb6..06728d1c179 100644 --- a/scripts/writeIconMetaIndex.mjs +++ b/docs/scripts/writeIconMetaIndex.mjs @@ -1,6 +1,6 @@ import fs from 'fs'; import path from 'path'; -import { readSvgDirectory, toCamelCase } from './helpers.mjs'; +import { readSvgDirectory, toCamelCase } from '@lucide/build-helpers'; const currentDir = process.cwd(); const ICONS_DIR = path.resolve(currentDir, '../icons'); diff --git a/scripts/writeIconNodes.mjs b/docs/scripts/writeIconNodes.mjs similarity index 93% rename from scripts/writeIconNodes.mjs rename to docs/scripts/writeIconNodes.mjs index e9888882b1b..7ba2b3e24ee 100644 --- a/scripts/writeIconNodes.mjs +++ b/docs/scripts/writeIconNodes.mjs @@ -1,7 +1,7 @@ import fs from 'fs'; import path from 'path'; -import renderIconsObject from './render/renderIconsObject.mjs'; -import { readSvgDirectory, toCamelCase } from './helpers.mjs'; +import { renderIconsObject } from '@lucide/build-icons'; +import { readSvgDirectory, toCamelCase } from '@lucide/build-helpers'; const currentDir = process.cwd(); const ICONS_DIR = path.resolve(currentDir, '../icons'); diff --git a/scripts/writeIconRelatedIcons.mjs b/docs/scripts/writeIconRelatedIcons.mjs similarity index 97% rename from scripts/writeIconRelatedIcons.mjs rename to docs/scripts/writeIconRelatedIcons.mjs index 6a1c9e69815..cf48ede6bab 100644 --- a/scripts/writeIconRelatedIcons.mjs +++ b/docs/scripts/writeIconRelatedIcons.mjs @@ -1,6 +1,6 @@ import fs from 'fs'; import path from 'path'; -import { readSvgDirectory } from './helpers.mjs'; +import { readSvgDirectory } from '@lucide/build-helpers'; const currentDir = process.cwd(); const ICONS_DIR = path.resolve(currentDir, '../icons'); diff --git a/scripts/writeReleaseMetadata.mjs b/docs/scripts/writeReleaseMetadata.mjs similarity index 98% rename from scripts/writeReleaseMetadata.mjs rename to docs/scripts/writeReleaseMetadata.mjs index ba19c85e28d..834351793ce 100644 --- a/scripts/writeReleaseMetadata.mjs +++ b/docs/scripts/writeReleaseMetadata.mjs @@ -3,7 +3,7 @@ import fs from 'fs'; import path from 'path'; import { simpleGit } from 'simple-git'; import semver from 'semver'; -import { readSvgDirectory } from './helpers.mjs'; +import { readSvgDirectory } from '@lucide/build-helpers'; const DATE_OF_FORK = '2020-06-08T16:39:52+0100'; diff --git a/scripts/writeVercelOutput.mjs b/docs/scripts/writeVercelOutput.mjs similarity index 100% rename from scripts/writeVercelOutput.mjs rename to docs/scripts/writeVercelOutput.mjs diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index aa36efe661f..a2b2ddf51d5 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -158,6 +158,12 @@ importers: specifier: ^3.2.47 version: 3.3.4 devDependencies: + '@lucide/build-helpers': + specifier: workspace:* + version: link:../tools/build-helpers + '@lucide/build-icons': + specifier: workspace:* + version: link:../tools/build-icons '@rollup/plugin-replace': specifier: ^5.0.2 version: 5.0.2(rollup@3.27.0) @@ -677,8 +683,13 @@ importers: specifier: ^3.25.4 version: 3.25.4 + tools/build-helpers: {} + tools/build-icons: dependencies: + '@lucide/build-helpers': + specifier: ^1.0.0 + version: link:../build-helpers minimist: specifier: ^1.2.7 version: 1.2.8 @@ -5691,15 +5702,6 @@ packages: dev: true optional: true - /@esbuild/android-arm64@0.19.6: - resolution: {integrity: sha512-KQ/hbe9SJvIJ4sR+2PcZ41IBV+LPJyYp6V1K1P1xcMRup9iYsBoQn4MzE3mhMLOld27Au2eDcLlIREeKGUXpHQ==} - engines: {node: '>=12'} - cpu: [arm64] - os: [android] - requiresBuild: true - dev: true - optional: true - /@esbuild/android-arm64@0.19.9: resolution: {integrity: sha512-q4cR+6ZD0938R19MyEW3jEsMzbb/1rulLXiNAJQADD/XYp7pT+rOS5JGxvpRW8dFDEfjW4wLgC/3FXIw4zYglQ==} engines: {node: '>=12'} @@ -5726,15 +5728,6 @@ packages: dev: true optional: true - /@esbuild/android-arm@0.19.6: - resolution: {integrity: sha512-muPzBqXJKCbMYoNbb1JpZh/ynl0xS6/+pLjrofcR3Nad82SbsCogYzUE6Aq9QT3cLP0jR/IVK/NHC9b90mSHtg==} - engines: {node: '>=12'} - cpu: [arm] - os: [android] - requiresBuild: true - dev: true - optional: true - /@esbuild/android-arm@0.19.9: resolution: {integrity: sha512-jkYjjq7SdsWuNI6b5quymW0oC83NN5FdRPuCbs9HZ02mfVdAP8B8eeqLSYU3gb6OJEaY5CQabtTFbqBf26H3GA==} engines: {node: '>=12'} @@ -5753,15 +5746,6 @@ packages: dev: true optional: true - /@esbuild/android-x64@0.19.6: - resolution: {integrity: sha512-VVJVZQ7p5BBOKoNxd0Ly3xUM78Y4DyOoFKdkdAe2m11jbh0LEU4bPles4e/72EMl4tapko8o915UalN/5zhspg==} - engines: {node: '>=12'} - cpu: [x64] - os: [android] - requiresBuild: true - dev: true - optional: true - /@esbuild/android-x64@0.19.9: resolution: {integrity: sha512-KOqoPntWAH6ZxDwx1D6mRntIgZh9KodzgNOy5Ebt9ghzffOk9X2c1sPwtM9P+0eXbefnDhqYfkh5PLP5ULtWFA==} engines: {node: '>=12'} @@ -5780,15 +5764,6 @@ packages: dev: true optional: true - /@esbuild/darwin-arm64@0.19.6: - resolution: {integrity: sha512-91LoRp/uZAKx6ESNspL3I46ypwzdqyDLXZH7x2QYCLgtnaU08+AXEbabY2yExIz03/am0DivsTtbdxzGejfXpA==} - engines: {node: '>=12'} - cpu: [arm64] - os: [darwin] - requiresBuild: true - dev: true - optional: true - /@esbuild/darwin-arm64@0.19.9: resolution: {integrity: sha512-KBJ9S0AFyLVx2E5D8W0vExqRW01WqRtczUZ8NRu+Pi+87opZn5tL4Y0xT0mA4FtHctd0ZgwNoN639fUUGlNIWw==} engines: {node: '>=12'} @@ -5807,15 +5782,6 @@ packages: dev: true optional: true - /@esbuild/darwin-x64@0.19.6: - resolution: {integrity: sha512-QCGHw770ubjBU1J3ZkFJh671MFajGTYMZumPs9E/rqU52md6lIil97BR0CbPq6U+vTh3xnTNDHKRdR8ggHnmxQ==} - engines: {node: '>=12'} - cpu: [x64] - os: [darwin] - requiresBuild: true - dev: true - optional: true - /@esbuild/darwin-x64@0.19.9: resolution: {integrity: sha512-vE0VotmNTQaTdX0Q9dOHmMTao6ObjyPm58CHZr1UK7qpNleQyxlFlNCaHsHx6Uqv86VgPmR4o2wdNq3dP1qyDQ==} engines: {node: '>=12'} @@ -5834,15 +5800,6 @@ packages: dev: true optional: true - /@esbuild/freebsd-arm64@0.19.6: - resolution: {integrity: sha512-J53d0jGsDcLzWk9d9SPmlyF+wzVxjXpOH7jVW5ae7PvrDst4kiAz6sX+E8btz0GB6oH12zC+aHRD945jdjF2Vg==} - engines: {node: '>=12'} - cpu: [arm64] - os: [freebsd] - requiresBuild: true - dev: true - optional: true - /@esbuild/freebsd-arm64@0.19.9: resolution: {integrity: sha512-uFQyd/o1IjiEk3rUHSwUKkqZwqdvuD8GevWF065eqgYfexcVkxh+IJgwTaGZVu59XczZGcN/YMh9uF1fWD8j1g==} engines: {node: '>=12'} @@ -5861,15 +5818,6 @@ packages: dev: true optional: true - /@esbuild/freebsd-x64@0.19.6: - resolution: {integrity: sha512-hn9qvkjHSIB5Z9JgCCjED6YYVGCNpqB7dEGavBdG6EjBD8S/UcNUIlGcB35NCkMETkdYwfZSvD9VoDJX6VeUVA==} - engines: {node: '>=12'} - cpu: [x64] - os: [freebsd] - requiresBuild: true - dev: true - optional: true - /@esbuild/freebsd-x64@0.19.9: resolution: {integrity: sha512-WMLgWAtkdTbTu1AWacY7uoj/YtHthgqrqhf1OaEWnZb7PQgpt8eaA/F3LkV0E6K/Lc0cUr/uaVP/49iE4M4asA==} engines: {node: '>=12'} @@ -5888,15 +5836,6 @@ packages: dev: true optional: true - /@esbuild/linux-arm64@0.19.6: - resolution: {integrity: sha512-HQCOrk9XlH3KngASLaBfHpcoYEGUt829A9MyxaI8RMkfRA8SakG6YQEITAuwmtzFdEu5GU4eyhKcpv27dFaOBg==} - engines: {node: '>=12'} - cpu: [arm64] - os: [linux] - requiresBuild: true - dev: true - optional: true - /@esbuild/linux-arm64@0.19.9: resolution: {integrity: sha512-PiPblfe1BjK7WDAKR1Cr9O7VVPqVNpwFcPWgfn4xu0eMemzRp442hXyzF/fSwgrufI66FpHOEJk0yYdPInsmyQ==} engines: {node: '>=12'} @@ -5915,15 +5854,6 @@ packages: dev: true optional: true - /@esbuild/linux-arm@0.19.6: - resolution: {integrity: sha512-G8IR5zFgpXad/Zp7gr7ZyTKyqZuThU6z1JjmRyN1vSF8j0bOlGzUwFSMTbctLAdd7QHpeyu0cRiuKrqK1ZTwvQ==} - engines: {node: '>=12'} - cpu: [arm] - os: [linux] - requiresBuild: true - dev: true - optional: true - /@esbuild/linux-arm@0.19.9: resolution: {integrity: sha512-C/ChPohUYoyUaqn1h17m/6yt6OB14hbXvT8EgM1ZWaiiTYz7nWZR0SYmMnB5BzQA4GXl3BgBO1l8MYqL/He3qw==} engines: {node: '>=12'} @@ -5942,15 +5872,6 @@ packages: dev: true optional: true - /@esbuild/linux-ia32@0.19.6: - resolution: {integrity: sha512-22eOR08zL/OXkmEhxOfshfOGo8P69k8oKHkwkDrUlcB12S/sw/+COM4PhAPT0cAYW/gpqY2uXp3TpjQVJitz7w==} - engines: {node: '>=12'} - cpu: [ia32] - os: [linux] - requiresBuild: true - dev: true - optional: true - /@esbuild/linux-ia32@0.19.9: resolution: {integrity: sha512-f37i/0zE0MjDxijkPSQw1CO/7C27Eojqb+r3BbHVxMLkj8GCa78TrBZzvPyA/FNLUMzP3eyHCVkAopkKVja+6Q==} engines: {node: '>=12'} @@ -5986,15 +5907,6 @@ packages: dev: true optional: true - /@esbuild/linux-loong64@0.19.6: - resolution: {integrity: sha512-82RvaYAh/SUJyjWA8jDpyZCHQjmEggL//sC7F3VKYcBMumQjUL3C5WDl/tJpEiKtt7XrWmgjaLkrk205zfvwTA==} - engines: {node: '>=12'} - cpu: [loong64] - os: [linux] - requiresBuild: true - dev: true - optional: true - /@esbuild/linux-loong64@0.19.9: resolution: {integrity: sha512-t6mN147pUIf3t6wUt3FeumoOTPfmv9Cc6DQlsVBpB7eCpLOqQDyWBP1ymXn1lDw4fNUSb/gBcKAmvTP49oIkaA==} engines: {node: '>=12'} @@ -6013,15 +5925,6 @@ packages: dev: true optional: true - /@esbuild/linux-mips64el@0.19.6: - resolution: {integrity: sha512-8tvnwyYJpR618vboIv2l8tK2SuK/RqUIGMfMENkeDGo3hsEIrpGldMGYFcWxWeEILe5Fi72zoXLmhZ7PR23oQA==} - engines: {node: '>=12'} - cpu: [mips64el] - os: [linux] - requiresBuild: true - dev: true - optional: true - /@esbuild/linux-mips64el@0.19.9: resolution: {integrity: sha512-jg9fujJTNTQBuDXdmAg1eeJUL4Jds7BklOTkkH80ZgQIoCTdQrDaHYgbFZyeTq8zbY+axgptncko3v9p5hLZtw==} engines: {node: '>=12'} @@ -6040,15 +5943,6 @@ packages: dev: true optional: true - /@esbuild/linux-ppc64@0.19.6: - resolution: {integrity: sha512-Qt+D7xiPajxVNk5tQiEJwhmarNnLPdjXAoA5uWMpbfStZB0+YU6a3CtbWYSy+sgAsnyx4IGZjWsTzBzrvg/fMA==} - engines: {node: '>=12'} - cpu: [ppc64] - os: [linux] - requiresBuild: true - dev: true - optional: true - /@esbuild/linux-ppc64@0.19.9: resolution: {integrity: sha512-tkV0xUX0pUUgY4ha7z5BbDS85uI7ABw3V1d0RNTii7E9lbmV8Z37Pup2tsLV46SQWzjOeyDi1Q7Wx2+QM8WaCQ==} engines: {node: '>=12'} @@ -6067,15 +5961,6 @@ packages: dev: true optional: true - /@esbuild/linux-riscv64@0.19.6: - resolution: {integrity: sha512-lxRdk0iJ9CWYDH1Wpnnnc640ajF4RmQ+w6oHFZmAIYu577meE9Ka/DCtpOrwr9McMY11ocbp4jirgGgCi7Ls/g==} - engines: {node: '>=12'} - cpu: [riscv64] - os: [linux] - requiresBuild: true - dev: true - optional: true - /@esbuild/linux-riscv64@0.19.9: resolution: {integrity: sha512-DfLp8dj91cufgPZDXr9p3FoR++m3ZJ6uIXsXrIvJdOjXVREtXuQCjfMfvmc3LScAVmLjcfloyVtpn43D56JFHg==} engines: {node: '>=12'} @@ -6094,15 +5979,6 @@ packages: dev: true optional: true - /@esbuild/linux-s390x@0.19.6: - resolution: {integrity: sha512-MopyYV39vnfuykHanRWHGRcRC3AwU7b0QY4TI8ISLfAGfK+tMkXyFuyT1epw/lM0pflQlS53JoD22yN83DHZgA==} - engines: {node: '>=12'} - cpu: [s390x] - os: [linux] - requiresBuild: true - dev: true - optional: true - /@esbuild/linux-s390x@0.19.9: resolution: {integrity: sha512-zHbglfEdC88KMgCWpOl/zc6dDYJvWGLiUtmPRsr1OgCViu3z5GncvNVdf+6/56O2Ca8jUU+t1BW261V6kp8qdw==} engines: {node: '>=12'} @@ -6121,15 +5997,6 @@ packages: dev: true optional: true - /@esbuild/linux-x64@0.19.6: - resolution: {integrity: sha512-UWcieaBzsN8WYbzFF5Jq7QULETPcQvlX7KL4xWGIB54OknXJjBO37sPqk7N82WU13JGWvmDzFBi1weVBajPovg==} - engines: {node: '>=12'} - cpu: [x64] - os: [linux] - requiresBuild: true - dev: true - optional: true - /@esbuild/linux-x64@0.19.9: resolution: {integrity: sha512-JUjpystGFFmNrEHQnIVG8hKwvA2DN5o7RqiO1CVX8EN/F/gkCjkUMgVn6hzScpwnJtl2mPR6I9XV1oW8k9O+0A==} engines: {node: '>=12'} @@ -6148,15 +6015,6 @@ packages: dev: true optional: true - /@esbuild/netbsd-x64@0.19.6: - resolution: {integrity: sha512-EpWiLX0fzvZn1wxtLxZrEW+oQED9Pwpnh+w4Ffv8ZLuMhUoqR9q9rL4+qHW8F4Mg5oQEKxAoT0G+8JYNqCiR6g==} - engines: {node: '>=12'} - cpu: [x64] - os: [netbsd] - requiresBuild: true - dev: true - optional: true - /@esbuild/netbsd-x64@0.19.9: resolution: {integrity: sha512-GThgZPAwOBOsheA2RUlW5UeroRfESwMq/guy8uEe3wJlAOjpOXuSevLRd70NZ37ZrpO6RHGHgEHvPg1h3S1Jug==} engines: {node: '>=12'} @@ -6175,15 +6033,6 @@ packages: dev: true optional: true - /@esbuild/openbsd-x64@0.19.6: - resolution: {integrity: sha512-fFqTVEktM1PGs2sLKH4M5mhAVEzGpeZJuasAMRnvDZNCV0Cjvm1Hu35moL2vC0DOrAQjNTvj4zWrol/lwQ8Deg==} - engines: {node: '>=12'} - cpu: [x64] - os: [openbsd] - requiresBuild: true - dev: true - optional: true - /@esbuild/openbsd-x64@0.19.9: resolution: {integrity: sha512-Ki6PlzppaFVbLnD8PtlVQfsYw4S9n3eQl87cqgeIw+O3sRr9IghpfSKY62mggdt1yCSZ8QWvTZ9jo9fjDSg9uw==} engines: {node: '>=12'} @@ -6202,15 +6051,6 @@ packages: dev: true optional: true - /@esbuild/sunos-x64@0.19.6: - resolution: {integrity: sha512-M+XIAnBpaNvaVAhbe3uBXtgWyWynSdlww/JNZws0FlMPSBy+EpatPXNIlKAdtbFVII9OpX91ZfMb17TU3JKTBA==} - engines: {node: '>=12'} - cpu: [x64] - os: [sunos] - requiresBuild: true - dev: true - optional: true - /@esbuild/sunos-x64@0.19.9: resolution: {integrity: sha512-MLHj7k9hWh4y1ddkBpvRj2b9NCBhfgBt3VpWbHQnXRedVun/hC7sIyTGDGTfsGuXo4ebik2+3ShjcPbhtFwWDw==} engines: {node: '>=12'} @@ -6229,15 +6069,6 @@ packages: dev: true optional: true - /@esbuild/win32-arm64@0.19.6: - resolution: {integrity: sha512-2DchFXn7vp/B6Tc2eKdTsLzE0ygqKkNUhUBCNtMx2Llk4POIVMUq5rUYjdcedFlGLeRe1uLCpVvCmE+G8XYybA==} - engines: {node: '>=12'} - cpu: [arm64] - os: [win32] - requiresBuild: true - dev: true - optional: true - /@esbuild/win32-arm64@0.19.9: resolution: {integrity: sha512-GQoa6OrQ8G08guMFgeXPH7yE/8Dt0IfOGWJSfSH4uafwdC7rWwrfE6P9N8AtPGIjUzdo2+7bN8Xo3qC578olhg==} engines: {node: '>=12'} @@ -6256,15 +6087,6 @@ packages: dev: true optional: true - /@esbuild/win32-ia32@0.19.6: - resolution: {integrity: sha512-PBo/HPDQllyWdjwAVX+Gl2hH0dfBydL97BAH/grHKC8fubqp02aL4S63otZ25q3sBdINtOBbz1qTZQfXbP4VBg==} - engines: {node: '>=12'} - cpu: [ia32] - os: [win32] - requiresBuild: true - dev: true - optional: true - /@esbuild/win32-ia32@0.19.9: resolution: {integrity: sha512-UOozV7Ntykvr5tSOlGCrqU3NBr3d8JqPes0QWN2WOXfvkWVGRajC+Ym0/Wj88fUgecUCLDdJPDF0Nna2UK3Qtg==} engines: {node: '>=12'} @@ -6283,15 +6105,6 @@ packages: dev: true optional: true - /@esbuild/win32-x64@0.19.6: - resolution: {integrity: sha512-OE7yIdbDif2kKfrGa+V0vx/B3FJv2L4KnIiLlvtibPyO9UkgO3rzYE0HhpREo2vmJ1Ixq1zwm9/0er+3VOSZJA==} - engines: {node: '>=12'} - cpu: [x64] - os: [win32] - requiresBuild: true - dev: true - optional: true - /@esbuild/win32-x64@0.19.9: resolution: {integrity: sha512-oxoQgglOP7RH6iasDrhY+R/3cHrfwIDvRlT4CGChflq6twk8iENeVvMJjmvBb94Ik1Z+93iGO27err7w6l54GQ==} engines: {node: '>=12'} @@ -8074,7 +7887,7 @@ packages: dependencies: '@babel/core': 7.22.9 '@babel/helper-module-imports': 7.22.5 - '@rollup/pluginutils': 5.0.5(rollup@3.27.0) + '@rollup/pluginutils': 5.1.0(rollup@3.27.0) rollup: 3.27.0 dev: true @@ -8172,7 +7985,7 @@ packages: rollup: optional: true dependencies: - '@rollup/pluginutils': 5.0.2(rollup@3.27.0) + '@rollup/pluginutils': 5.1.0(rollup@3.27.0) '@types/resolve': 1.20.2 deepmerge: 4.3.1 is-builtin-module: 3.2.1 @@ -8222,7 +8035,7 @@ packages: rollup: optional: true dependencies: - '@rollup/pluginutils': 5.0.5(rollup@3.29.4) + '@rollup/pluginutils': 5.1.0(rollup@3.29.4) magic-string: 0.30.5 rollup: 3.29.4 @@ -8301,8 +8114,8 @@ packages: rollup: 3.27.0 dev: true - /@rollup/pluginutils@5.0.5(rollup@3.27.0): - resolution: {integrity: sha512-6aEYR910NyP73oHiJglti74iRyOwgFU4x3meH/H8OJx6Ry0j6cOVZ5X/wTvub7G7Ao6qaHBEaNsV3GLJkSsF+Q==} + /@rollup/pluginutils@5.1.0(rollup@3.27.0): + resolution: {integrity: sha512-XTIWOPPcpvyKI6L1NHo0lFlCyznUEyPmPY1mc3KpPVDYulHSTvyeLNVW00QTLIAFNhR3kYnJTQHeGqU4M3n09g==} engines: {node: '>=14.0.0'} peerDependencies: rollup: ^1.20.0||^2.0.0||^3.0.0||^4.0.0 @@ -8316,20 +8129,6 @@ packages: rollup: 3.27.0 dev: true - /@rollup/pluginutils@5.0.5(rollup@3.29.4): - resolution: {integrity: sha512-6aEYR910NyP73oHiJglti74iRyOwgFU4x3meH/H8OJx6Ry0j6cOVZ5X/wTvub7G7Ao6qaHBEaNsV3GLJkSsF+Q==} - engines: {node: '>=14.0.0'} - peerDependencies: - rollup: ^1.20.0||^2.0.0||^3.0.0||^4.0.0 - peerDependenciesMeta: - rollup: - optional: true - dependencies: - '@types/estree': 1.0.5 - estree-walker: 2.0.2 - picomatch: 2.3.1 - rollup: 3.29.4 - /@rollup/pluginutils@5.1.0(rollup@3.29.4): resolution: {integrity: sha512-XTIWOPPcpvyKI6L1NHo0lFlCyznUEyPmPY1mc3KpPVDYulHSTvyeLNVW00QTLIAFNhR3kYnJTQHeGqU4M3n09g==} engines: {node: '>=14.0.0'} @@ -8343,7 +8142,6 @@ packages: estree-walker: 2.0.2 picomatch: 2.3.1 rollup: 3.29.4 - dev: true /@rollup/rollup-android-arm-eabi@4.5.2: resolution: {integrity: sha512-ee7BudTwwrglFYSc3UnqInDDjCLWHKrFmGNi4aK7jlEyg4CyPa1DCMrZfsN1O13YT76UFEqXz2CoN7BCGpUlJw==} @@ -11594,7 +11392,7 @@ packages: resolution: {integrity: sha512-BWZRJgDEveT8uI+cliCwvYSSSSvb4xKoiiu5S0jaDbKBopQLQF7E+bq9xKk1pTcG+mUa3yXuFO7bD9d8Lr9Xxg==} dependencies: chokidar: 3.5.3 - defu: 6.1.3 + defu: 6.1.4 dotenv: 16.3.1 giget: 1.1.3 jiti: 1.21.0 @@ -12244,6 +12042,10 @@ packages: resolution: {integrity: sha512-mWYvfOLrfEc996hlKcdABeIiPHUPC6DM2QYZdGGOvhOTbA3tjm2eBwqlJpoFdjC89NI4Qt6h0Pu06Mp+1Pj5OQ==} dev: true + /cookie-es@1.1.0: + resolution: {integrity: sha512-L2rLOcK0wzWSfSDA33YR+PUHDG10a8px7rUHKWbGLP4YfbsMed2KFUw5fczvDPbT98DDe3LEzviswl810apTEw==} + dev: true + /cookie-signature@1.0.6: resolution: {integrity: sha512-QADzlaHc8icV8I7vbaJXJwod9HWYp8uCqf1xa4OfNu1T7JVxQIrUgOWtHdNDtPiywmFbiS12VjotIXLrKM3orQ==} dev: true @@ -12404,6 +12206,15 @@ packages: shebang-command: 2.0.0 which: 2.0.2 + /crossws@0.2.4: + resolution: {integrity: sha512-DAxroI2uSOgUKLz00NX6A8U/8EE3SZHmIND+10jkVSaypvyt57J5JEOxAQOL6lQxyzi/wZbTIwssU1uy69h5Vg==} + peerDependencies: + uWebSockets.js: '*' + peerDependenciesMeta: + uWebSockets.js: + optional: true + dev: true + /css-blank-pseudo@3.0.3(postcss@8.4.27): resolution: {integrity: sha512-VS90XWtsHGqoM0t4KpH053c4ehxZ2E6HtGI7x68YFV0pTo/QmkV/YFA+NnlvK8guxZVNWGQhVNJGC39Q8XF4OQ==} engines: {node: ^12 || ^14 || >=16} @@ -12825,8 +12636,8 @@ packages: resolution: {integrity: sha512-+uO4+qr7msjNNWKYPHqN/3+Dx3NFkmIzayk2L1MyZQlvgZb/J1A0fo410dpKrN2SnqFjt8n4JL8fDJE0wIgjFQ==} dev: true - /defu@6.1.3: - resolution: {integrity: sha512-Vy2wmG3NTkmHNg/kzpuvHhkqeIx3ODWqasgCRbKtbXEN0G+HpEEv9BtJLp7ZG1CZloFaC41Ah3ZFbq7aqCqMeQ==} + /defu@6.1.4: + resolution: {integrity: sha512-mEQCMmwJu317oSz8CwdIOdwf3xMif1ttiM8LTufzc3g6kR+9Pe236twL8j3IYT1F7GfRgGcW6MWxzZjLIkuHIg==} dev: true /del@2.2.2: @@ -12899,8 +12710,8 @@ packages: resolution: {integrity: sha512-M1Ob1zPSIvlARiJUkKqvAZ3VAqQY6Jcuth/pBKQ2b1dX/Qx0OnJ8Vux6J2H5PTMQeRzWrrbTu70VxBfv/OPDJA==} dev: true - /destr@2.0.2: - resolution: {integrity: sha512-65AlobnZMiCET00KaFFjUefxDX0khFA/E4myqZ7a6Sq1yZtR8+FVIvilVX66vF2uobSumxooYZChiRPCKNqhmg==} + /destr@2.0.3: + resolution: {integrity: sha512-2N3BOUU4gYMpTP24s5rF5iP7BDr7uNTCs4ozw3kf/eKfvWSIu93GEBi5m427YoyJoeOzQ5smuu4nNAPGb8idSQ==} dev: true /destroy@1.2.0: @@ -13997,36 +13808,6 @@ packages: '@esbuild/win32-x64': 0.18.20 dev: true - /esbuild@0.19.6: - resolution: {integrity: sha512-Xl7dntjA2OEIvpr9j0DVxxnog2fyTGnyVoQXAMQI6eR3mf9zCQds7VIKUDCotDgE/p4ncTgeRqgX8t5d6oP4Gw==} - engines: {node: '>=12'} - hasBin: true - requiresBuild: true - optionalDependencies: - '@esbuild/android-arm': 0.19.6 - '@esbuild/android-arm64': 0.19.6 - '@esbuild/android-x64': 0.19.6 - '@esbuild/darwin-arm64': 0.19.6 - '@esbuild/darwin-x64': 0.19.6 - '@esbuild/freebsd-arm64': 0.19.6 - '@esbuild/freebsd-x64': 0.19.6 - '@esbuild/linux-arm': 0.19.6 - '@esbuild/linux-arm64': 0.19.6 - '@esbuild/linux-ia32': 0.19.6 - '@esbuild/linux-loong64': 0.19.6 - '@esbuild/linux-mips64el': 0.19.6 - '@esbuild/linux-ppc64': 0.19.6 - '@esbuild/linux-riscv64': 0.19.6 - '@esbuild/linux-s390x': 0.19.6 - '@esbuild/linux-x64': 0.19.6 - '@esbuild/netbsd-x64': 0.19.6 - '@esbuild/openbsd-x64': 0.19.6 - '@esbuild/sunos-x64': 0.19.6 - '@esbuild/win32-arm64': 0.19.6 - '@esbuild/win32-ia32': 0.19.6 - '@esbuild/win32-x64': 0.19.6 - dev: true - /esbuild@0.19.9: resolution: {integrity: sha512-U9CHtKSy+EpPsEBa+/A2gMs/h3ylBC0H0KSqIg7tpztHerLi6nrrcoUJAkNCEPumx8yJ+Byic4BVwHgRbN0TBg==} engines: {node: '>=12'} @@ -15256,10 +15037,10 @@ packages: hasBin: true dependencies: colorette: 2.0.20 - defu: 6.1.3 + defu: 6.1.4 https-proxy-agent: 7.0.2 mri: 1.2.0 - node-fetch-native: 1.4.1 + node-fetch-native: 1.6.4 pathe: 1.1.1 tar: 6.2.0 transitivePeerDependencies: @@ -15468,17 +15249,21 @@ packages: duplexer: 0.1.2 dev: true - /h3-nightly@1.10.0-1701948668.39f9434: - resolution: {integrity: sha512-ZgDOpzAr8BO/sFzWYvLZLhg3d/NRbDeff+rA6vnoog0530NPEVfO3nIzCwY3nT+Z0faROooaiCyKaAPYbo7b9A==} + /h3-nightly@1.11.2-1713363481.de409c3: + resolution: {integrity: sha512-qs05KwczGWX5bW4lu5nKuh3tg3+ttBT21i8o8iXONN1LDLdD3CKPuGVO1wvWM86rfd2VMg2ELo4WPFzp8AOJgQ==} dependencies: - cookie-es: 1.0.0 - defu: 6.1.3 - destr: 2.0.2 - iron-webcrypto: 1.0.0 - radix3: 1.1.0 - ufo: 1.3.2 + cookie-es: 1.1.0 + crossws: 0.2.4 + defu: 6.1.4 + destr: 2.0.3 + iron-webcrypto: 1.1.0 + ohash: 1.1.3 + radix3: 1.1.2 + ufo: 1.5.3 uncrypto: 0.1.3 - unenv: 1.8.0 + unenv: 1.9.0 + transitivePeerDependencies: + - uWebSockets.js dev: true /h3@1.8.0: @@ -15497,14 +15282,14 @@ packages: /h3@1.9.0: resolution: {integrity: sha512-+F3ZqrNV/CFXXfZ2lXBINHi+rM4Xw3CDC5z2CDK3NMPocjonKipGLLDSkrqY9DOrioZNPTIdDMWfQKm//3X2DA==} dependencies: - cookie-es: 1.0.0 - defu: 6.1.3 - destr: 2.0.2 - iron-webcrypto: 1.0.0 - radix3: 1.1.0 - ufo: 1.3.2 + cookie-es: 1.1.0 + defu: 6.1.4 + destr: 2.0.3 + iron-webcrypto: 1.1.0 + radix3: 1.1.2 + ufo: 1.5.3 uncrypto: 0.1.3 - unenv: 1.8.0 + unenv: 1.9.0 dev: true /handle-thing@2.0.1: @@ -16177,8 +15962,8 @@ packages: resolution: {integrity: sha512-gScdcWHjTGclCU15CIv2r069NoQrys1UeUFFfaO1hL++ytLHkVw7N5nXJmFf3J2LEDMz1PkrvC0m62JEeu1axQ==} dev: true - /iron-webcrypto@1.0.0: - resolution: {integrity: sha512-anOK1Mktt8U1Xi7fCM3RELTuYbnFikQY5VtrDj7kPgpejV7d43tWKhzgioO0zpkazLEL/j/iayRqnJhrGfqUsg==} + /iron-webcrypto@1.1.0: + resolution: {integrity: sha512-5vgYsCakNlaQub1orZK5QmNYhwYtcllTkZBp5sfIaCqY93Cf6l+v2rtE+E4TMbcfjxDMCdrO8wmp7+ZvhDECLA==} dev: true /is-accessor-descriptor@0.1.6: @@ -17396,7 +17181,7 @@ packages: citty: 0.1.5 clipboardy: 3.0.0 consola: 3.2.3 - defu: 6.1.3 + defu: 6.1.4 get-port-please: 3.1.1 h3: 1.9.0 http-shutdown: 1.2.2 @@ -17405,7 +17190,7 @@ packages: node-forge: 1.3.1 pathe: 1.1.1 std-env: 3.6.0 - ufo: 1.3.2 + ufo: 1.5.3 untun: 0.1.3 uqr: 0.1.2 dev: true @@ -17583,14 +17368,9 @@ packages: tslib: 2.6.1 dev: true - /lru-cache@10.0.3: - resolution: {integrity: sha512-B7gr+F6MkqB3uzINHXNctGieGsRTMwIBgxkp0yq/5BwcuDzD4A8wQpHQW6vDAm1uKSLQghmRdD9sKqf2vJ1cEg==} - engines: {node: 14 || >=16.14} - /lru-cache@10.1.0: resolution: {integrity: sha512-/1clY/ui8CzjKFyjdvwPWJUYKiFVXG2I2cY0ssG7h4+hwk+XOIX7ZSG9Q7TW8TW3Kp3BUSqgFWBLgL4PJ+Blag==} engines: {node: 14 || >=16.14} - dev: true /lru-cache@5.1.1: resolution: {integrity: sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==} @@ -18453,7 +18233,7 @@ packages: acorn: 8.11.2 pathe: 1.1.1 pkg-types: 1.0.3 - ufo: 1.3.2 + ufo: 1.5.3 dev: true /moment@2.29.4: @@ -18667,9 +18447,9 @@ packages: chokidar: 3.5.3 citty: 0.1.5 consola: 3.2.3 - cookie-es: 1.0.0 - defu: 6.1.3 - destr: 2.0.2 + cookie-es: 1.1.0 + defu: 6.1.4 + destr: 2.0.3 dot-prop: 8.0.2 esbuild: 0.19.9 escape-string-regexp: 5.0.0 @@ -18677,7 +18457,7 @@ packages: fs-extra: 11.2.0 globby: 13.2.2 gzip-size: 7.0.0 - h3: /h3-nightly@1.10.0-1701948668.39f9434 + h3: /h3-nightly@1.11.2-1713363481.de409c3 hookable: 5.5.3 httpxy: 0.1.5 is-primitive: 3.0.1 @@ -18689,7 +18469,7 @@ packages: mime: 3.0.0 mlly: 1.4.2 mri: 1.2.0 - node-fetch-native: 1.4.1 + node-fetch-native: 1.6.4 ofetch: 1.3.3 ohash: 1.1.3 openapi-typescript: 6.7.3 @@ -18697,7 +18477,7 @@ packages: perfect-debounce: 1.0.0 pkg-types: 1.0.3 pretty-bytes: 6.1.1 - radix3: 1.1.0 + radix3: 1.1.2 rollup: 3.29.4 rollup-plugin-visualizer: 5.11.0(rollup@3.29.4) scule: 1.1.1 @@ -18705,10 +18485,10 @@ packages: serve-placeholder: 2.0.1 serve-static: 1.15.0 std-env: 3.6.0 - ufo: 1.3.2 + ufo: 1.5.3 uncrypto: 0.1.3 unctx: 2.3.1 - unenv: 1.8.0 + unenv: 1.9.0 unimport: 3.6.1(rollup@3.29.4) unstorage: 1.10.1 transitivePeerDependencies: @@ -18726,6 +18506,7 @@ packages: - encoding - idb-keyval - supports-color + - uWebSockets.js dev: true /no-case@3.0.4: @@ -18762,8 +18543,8 @@ packages: resolution: {integrity: sha512-F5kfEj95kX8tkDhUCYdV8dg3/8Olx/94zB8+ZNthFs6Bz31UpUi8Xh40TN3thLwXgrwXry1pEg9lJ++tLWTcqA==} dev: true - /node-fetch-native@1.4.1: - resolution: {integrity: sha512-NsXBU0UgBxo2rQLOeWNZqS3fvflWePMECr8CoSWoSTqCqGbVVsvl9vZu1HfQicYN0g5piV9Gh8RTEvo/uP752w==} + /node-fetch-native@1.6.4: + resolution: {integrity: sha512-IhOigYzAKHd244OC0JIMIUrjzctirCmPkaIfhDeGcEETWof5zKYUW7e7MYvChGWh/4CJeXEgsRyGzuF334rOOQ==} dev: true /node-fetch@2.6.12: @@ -19181,9 +18962,9 @@ packages: /ofetch@1.3.3: resolution: {integrity: sha512-s1ZCMmQWXy4b5K/TW9i/DtiN8Ku+xCiHcjQ6/J/nDdssirrQNOoB165Zu8EqLMA2lln1JUth9a0aW9Ap2ctrUg==} dependencies: - destr: 2.0.2 - node-fetch-native: 1.4.1 - ufo: 1.3.2 + destr: 2.0.3 + node-fetch-native: 1.6.4 + ufo: 1.5.3 dev: true /ohash@1.1.3: @@ -19598,7 +19379,7 @@ packages: resolution: {integrity: sha512-MkhCqzzBEpPvxxQ71Md0b1Kk51W01lrYvlMzSUaIzNsODdd7mqhiimSZlr+VegAz5Z6Vzt9Xg2ttE//XBhH3EQ==} engines: {node: '>=16 || 14 >=14.17'} dependencies: - lru-cache: 10.0.3 + lru-cache: 10.1.0 minipass: 7.0.3 dev: false @@ -20777,8 +20558,8 @@ packages: resolution: {integrity: sha512-y+AcwZ3HcUIGc9zGsNVf5+BY/LxL+z+4h4J3/pp8jxSmy1STaCocPS3qrj4tA5ehUSzqtqK+0Aygvz/r/8vy4g==} dev: true - /radix3@1.1.0: - resolution: {integrity: sha512-pNsHDxbGORSvuSScqNJ+3Km6QAVqk8CfsCBIEoDgpqLrkD2f3QM4I7d1ozJJ172OmIcoUcerZaNWqtLkRXTV3A==} + /radix3@1.1.2: + resolution: {integrity: sha512-b484I/7b8rDEdSDKckSSBA8knMpcdsXudlE/LNL639wFoHKwLbEkQFZHWEYwDC0wa0FKUcCY+GAF73Z7wxNVFA==} dev: true /randombytes@2.1.0: @@ -20815,8 +20596,8 @@ packages: /rc9@2.1.1: resolution: {integrity: sha512-lNeOl38Ws0eNxpO3+wD1I9rkHGQyj1NU1jlzv4go2CtEnEQEUfqnIvZG7W+bC/aXdJ27n5x/yUjb6RoT9tko+Q==} dependencies: - defu: 6.1.3 - destr: 2.0.2 + defu: 6.1.4 + destr: 2.0.3 flat: 5.0.2 dev: true @@ -21461,19 +21242,6 @@ packages: source-map-resolve: 0.6.0 dev: true - /rollup-plugin-svelte@7.1.6(rollup@3.27.0)(svelte@4.1.2): - resolution: {integrity: sha512-nVFRBpGWI2qUY1OcSiEEA/kjCY2+vAjO9BI8SzA7NRrh2GTunLd6w2EYmnMt/atgdg8GvcNjLsmZmbQs/u4SQA==} - engines: {node: '>=10'} - peerDependencies: - rollup: '>=2.0.0' - svelte: '>=3.5.0' - dependencies: - '@rollup/pluginutils': 4.2.1 - resolve.exports: 2.0.2 - rollup: 3.27.0 - svelte: 4.1.2 - dev: true - /rollup-plugin-visualizer@5.11.0(rollup@3.29.4): resolution: {integrity: sha512-exM0Ms2SN3AgTzMeW7y46neZQcyLY7eKwWAop1ZoRTCZwyrIRdMMJ6JjToAJbML77X/9N8ZEpmXG4Z/Clb9k8g==} engines: {node: '>=14'} @@ -21919,7 +21687,7 @@ packages: /serve-placeholder@2.0.1: resolution: {integrity: sha512-rUzLlXk4uPFnbEaIz3SW8VISTxMuONas88nYWjAWaM2W9VDbt9tyFOr3lq8RhVOFrT3XISoBw8vni5una8qMnQ==} dependencies: - defu: 6.1.3 + defu: 6.1.4 dev: true /serve-static@1.15.0: @@ -23532,8 +23300,8 @@ packages: resolution: {integrity: sha512-RsPyTbqORDNDxqAdQPQBpgqhWle1VcTSou/FraClYlHf6TZnQcGslpLcAphNR+sQW4q5lLWLbOsRlh9j24baQg==} dev: true - /ufo@1.3.2: - resolution: {integrity: sha512-o+ORpgGwaYQXgqGDwd+hkS4PuZ3QnmqMMxRuajK/a38L6fTpcE5GPIfrf+L/KemFzfUpeUQc1rRS1iDBozvnFA==} + /ufo@1.5.3: + resolution: {integrity: sha512-Y7HYmWaFwPUmkoQCUIAYpKqkOf+SbVj/2fJJZ4RJMCfZp0rTGwRbzQD+HghfnhKOjL9E01okqz+ncJskGYfBNw==} dev: true /uglify-es@3.3.9: @@ -23596,13 +23364,13 @@ packages: pathe: 1.1.1 dev: true - /unenv@1.8.0: - resolution: {integrity: sha512-uIGbdCWZfhRRmyKj1UioCepQ0jpq638j/Cf0xFTn4zD1nGJ2lSdzYHLzfdXN791oo/0juUiSWW1fBklXMTsuqg==} + /unenv@1.9.0: + resolution: {integrity: sha512-QKnFNznRxmbOF1hDgzpqrlIf6NC5sbZ2OJ+5Wl3OX8uM+LUJXbj4TXvLJCtwbPTmbMHCLIz6JLKNinNsMShK9g==} dependencies: consola: 3.2.3 - defu: 6.1.3 + defu: 6.1.4 mime: 3.0.0 - node-fetch-native: 1.4.1 + node-fetch-native: 1.6.4 pathe: 1.1.1 dev: true @@ -23811,15 +23579,15 @@ packages: dependencies: anymatch: 3.1.3 chokidar: 3.5.3 - destr: 2.0.2 + destr: 2.0.3 h3: 1.9.0 ioredis: 5.3.2 listhen: 1.5.5 lru-cache: 10.1.0 mri: 1.2.0 - node-fetch-native: 1.4.1 + node-fetch-native: 1.6.4 ofetch: 1.3.3 - ufo: 1.3.2 + ufo: 1.5.3 transitivePeerDependencies: - supports-color dev: true @@ -24111,7 +23879,7 @@ packages: terser: optional: true dependencies: - esbuild: 0.19.6 + esbuild: 0.19.9 postcss: 8.4.31 rollup: 4.5.2 optionalDependencies: diff --git a/scripts/addMissingIconJsonFiles.mjs b/scripts/addMissingIconJsonFiles.mjs index 910b1fab2b4..422d410b22d 100644 --- a/scripts/addMissingIconJsonFiles.mjs +++ b/scripts/addMissingIconJsonFiles.mjs @@ -1,5 +1,5 @@ import path from 'path'; -import { getCurrentDirPath, readAllMetadata, readSvgDirectory, writeFile } from './helpers.mjs'; +import { getCurrentDirPath, readAllMetadata, readSvgDirectory, writeFile } from '@lucide/build-helpers'; const currentDir = getCurrentDirPath(import.meta.url); const ICONS_DIR = path.resolve(currentDir, '../icons'); diff --git a/scripts/checkIconsAndCategories.mjs b/scripts/checkIconsAndCategories.mjs index 39b237e8e8d..0c1eabf8efa 100644 --- a/scripts/checkIconsAndCategories.mjs +++ b/scripts/checkIconsAndCategories.mjs @@ -1,5 +1,5 @@ import path from 'path'; -import { readSvgDirectory, getCurrentDirPath, readAllMetadata } from './helpers.mjs'; +import { readSvgDirectory, getCurrentDirPath, readAllMetadata } from '@lucide/build-helpers'; const currentDir = getCurrentDirPath(import.meta.url); const ICONS_DIR = path.resolve(currentDir, '../icons'); diff --git a/scripts/generate/generateIcons.mjs b/scripts/generate/generateIcons.mjs index 30882b8d097..3035724a4c3 100644 --- a/scripts/generate/generateIcons.mjs +++ b/scripts/generate/generateIcons.mjs @@ -1,5 +1,5 @@ import path from 'path'; -import {getCurrentDirPath, writeFileIfNotExists} from "../helpers.mjs"; +import { getCurrentDirPath, writeFileIfNotExists } from "@lucide/build-helpers"; const currentDir = getCurrentDirPath(import.meta.url); const ICONS_DIR = path.resolve(currentDir, '../../icons'); diff --git a/scripts/generateNextJSAliases.mjs b/scripts/generateNextJSAliases.mjs index f4f241a2892..c6f4a8a34d3 100644 --- a/scripts/generateNextJSAliases.mjs +++ b/scripts/generateNextJSAliases.mjs @@ -1,6 +1,6 @@ import path from 'path'; import { promises as fs } from 'fs'; -import { getCurrentDirPath, readSvgDirectory } from './helpers.mjs'; +import { getCurrentDirPath, readSvgDirectory } from '@lucide/build-helpers'; // This is a special case convertion NextJS uses for their modularize imports. We try to follow the same convention, to generate the same imports. function pascalToKebabNextJSFlavour(str) { diff --git a/scripts/helpers.mjs b/scripts/helpers.mjs deleted file mode 100644 index 0da79a6a7d5..00000000000 --- a/scripts/helpers.mjs +++ /dev/null @@ -1,193 +0,0 @@ -import fs from 'fs'; -import path from 'path'; -import { fileURLToPath } from 'url'; - -/** - * Converts string to CamelCase - * - * @param {string} string - * @returns {string} A camelized string - */ -export const toCamelCase = (string) => - string.replace(/^([A-Z])|[\s-_]+(\w)/g, (match, p1, p2) => - p2 ? p2.toUpperCase() : p1.toLowerCase(), - ); - -/** - * Converts string to PascalCase - * - * @param {string} string - * @returns {string} A pascalized string - */ -export const toPascalCase = (string) => { - const camelCase = toCamelCase(string); - - return camelCase.charAt(0).toUpperCase() + camelCase.slice(1); -}; - -/** - * Converts string to KebabCase - * - * @param {string} string - * @returns {string} A kebabized string - */ -export const toKebabCase = (string) => string.replace(/([a-z0-9])([A-Z])/g, '$1-$2').toLowerCase(); - -/** - * Resets the file contents. - * - * @param {string} fileName - * @param {string} outputDirectory - */ -export const resetFile = (fileName, outputDirectory) => - fs.writeFileSync(path.join(outputDirectory, fileName), '', 'utf-8'); - -/** - * Reads the file contents. - * - * @param {string} path - * @returns {string} The contents of a file - */ -export const readFile = (entry) => fs.readFileSync(path.resolve(__dirname, '../', entry), 'utf-8'); - -/** - * append content to a file - * - * @param {string} content - * @param {string} fileName - * @param {string} outputDirectory - */ -export const appendFile = (content, fileName, outputDirectory) => - fs.appendFileSync(path.join(outputDirectory, fileName), content, 'utf-8'); - -/** - * writes content to a file - * - * @param {string} content - * @param {string} fileName - * @param {string} outputDirectory - */ -export const writeFile = (content, fileName, outputDirectory) => - fs.writeFileSync(path.join(outputDirectory, fileName), content, 'utf-8'); - -/** - * writes content to a file if it does not exist - * - * @param {string} content - * @param {string} fileName - * @param {string} outputDirectory - */ -export const writeFileIfNotExists = (content, fileName, outputDirectory) => { - if (!fs.existsSync(path.join(outputDirectory, fileName))) { - writeFile(content, fileName, outputDirectory); - } -}; - -/** - * Reads metadata from the icons/categories directories - * - * @param {string} directory - * @returns {object} A map of icon or category metadata - */ -export const readAllMetadata = (directory) => - fs - .readdirSync(directory) - .filter((file) => path.extname(file) === '.json') - .reduce((acc, fileName, i) => { - acc[path.basename(fileName, '.json')] = readMetadata(fileName, directory); - return acc; - }, {}); - -/** - * Reads metadata for an icon or category - * - * @param {string} fileName - * @param {string} directory - * @returns {object} The metadata for the icon or category - */ -export const readMetadata = (fileName, directory) => - JSON.parse(fs.readFileSync(path.join(directory, fileName), 'utf-8')); - -/** - * reads the icon directory - * - * @param {string} directory - * @returns {array} An array of file paths containig svgs - */ -export const readSvgDirectory = (directory, fileExtension = '.svg') => - fs.readdirSync(directory).filter((file) => path.extname(file) === fileExtension); - -/** - * Read svg from directory - * - * @param {string} fileName - * @param {string} directory - */ -export const readSvg = (fileName, directory) => - fs.readFileSync(path.join(directory, fileName), 'utf-8'); - -/** - * writes content to a file - * - * @param {string} fileName - * @param {string} outputDirectory - * @param {string} content - */ -export const writeSvgFile = (fileName, outputDirectory, content) => - fs.writeFileSync(path.join(outputDirectory, fileName), content, 'utf-8'); - -/** - * djb2 hashing function - * - * @param {string} string - * @param {number} seed - * @returns {string} A hashed string of 6 characters - */ -export const hash = (string, seed = 5381) => { - let i = string.length; - - while (i) { - // eslint-disable-next-line no-bitwise, no-plusplus - seed = (seed * 33) ^ string.charCodeAt(--i); - } - - // eslint-disable-next-line no-bitwise - return (seed >>> 0).toString(36).substr(0, 6); -}; - -/** - * Generate Hashed string based on name and attributes - * - * @param {object} seed - * @param {string} seed.name A name, for example an icon name - * @param {object} seed.attributes An object of SVGElement Attrbutes - * @returns {string} A hashed string of 6 characters - */ -export const generateHashedKey = ({ name, attributes }) => hash(JSON.stringify([name, attributes])); - -/** - * Checks if array of items contains duplicated items - * - * @param {array} children an array of items - * @returns {Boolean} if items contains duplicated items. - */ -export const hasDuplicatedChildren = (children) => { - const hashedKeys = children.map(generateHashedKey); - - return !hashedKeys.every( - (key, index) => index === hashedKeys.findIndex((childKey) => childKey === key), - ); -}; - -/** - * @param {array} a - * @param {array} b - * @returns {array} - */ -export const mergeArrays = (a, b) => { - a = a.concat(b); - a = a.filter((i, p) => a.indexOf(i) === p); - return a; -}; - -export const getCurrentDirPath = (currentPath) => path.dirname(fileURLToPath(currentPath)); diff --git a/scripts/migrateCategoriesToIcons.mjs b/scripts/migrateCategoriesToIcons.mjs index 99cf9ea6301..665a3d37da5 100644 --- a/scripts/migrateCategoriesToIcons.mjs +++ b/scripts/migrateCategoriesToIcons.mjs @@ -1,6 +1,6 @@ import path from 'path'; import categories from '../categories.json' assert { type: 'json' }; -import { mergeArrays, writeFile, readAllMetadata, getCurrentDirPath } from './helpers.mjs'; +import { mergeArrays, writeFile, readAllMetadata, getCurrentDirPath } from '@lucide/build-helpers'; const currentDir = getCurrentDirPath(import.meta.url) const ICONS_DIR = path.resolve(currentDir, '../icons'); diff --git a/scripts/migrateIconsToCategories.mjs b/scripts/migrateIconsToCategories.mjs index f2bab1d73e7..32d3b40a228 100644 --- a/scripts/migrateIconsToCategories.mjs +++ b/scripts/migrateIconsToCategories.mjs @@ -1,5 +1,5 @@ import path from 'path'; -import { writeFile, getCurrentDirPath, readAllMetadata } from './helpers.mjs'; +import { writeFile, getCurrentDirPath, readAllMetadata } from '@lucide/build-helpers'; const currentDir = getCurrentDirPath(import.meta.url); const ICONS_DIR = path.resolve(currentDir, '../icons'); diff --git a/scripts/migrateIconsToTags.mjs b/scripts/migrateIconsToTags.mjs index 907f5b63538..40c5e11747e 100644 --- a/scripts/migrateIconsToTags.mjs +++ b/scripts/migrateIconsToTags.mjs @@ -1,5 +1,5 @@ import path from 'path'; -import { writeFile, getCurrentDirPath, readAllMetadata } from './helpers.mjs'; +import { writeFile, getCurrentDirPath, readAllMetadata } from '@lucide/build-helpers'; const currentDir = getCurrentDirPath(import.meta.url); const ICONS_DIR = path.resolve(currentDir, '../icons'); diff --git a/scripts/migrateTagsToIcons.mjs b/scripts/migrateTagsToIcons.mjs index 56ad77ace7f..5f02bf4ab9e 100644 --- a/scripts/migrateTagsToIcons.mjs +++ b/scripts/migrateTagsToIcons.mjs @@ -1,6 +1,6 @@ import path from 'path'; import tags from '../tags.json' assert { type: 'json' }; -import { readSvgDirectory, readAllMetadata, writeFile, mergeArrays, getCurrentDirPath } from './helpers.mjs'; +import { readSvgDirectory, readAllMetadata, writeFile, mergeArrays, getCurrentDirPath } from '@lucide/build-helpers'; const currentDir = getCurrentDirPath(import.meta.url) const ICONS_DIR = path.resolve(currentDir, '../icons'); diff --git a/scripts/optimizeSvgs.mjs b/scripts/optimizeSvgs.mjs index bbe50825024..100eca479bd 100644 --- a/scripts/optimizeSvgs.mjs +++ b/scripts/optimizeSvgs.mjs @@ -1,7 +1,7 @@ import fs from 'fs'; import path from 'path'; import processSvg from './render/processSvg.mjs'; -import { readSvgDirectory, writeSvgFile } from './helpers.mjs'; +import { readSvgDirectory, writeSvgFile } from '@lucide/build-helpers'; const ICONS_DIR = path.resolve(process.cwd(), 'icons'); diff --git a/tools/build-helpers/main.mjs b/tools/build-helpers/main.mjs new file mode 100644 index 00000000000..894765f8ed2 --- /dev/null +++ b/tools/build-helpers/main.mjs @@ -0,0 +1,18 @@ +export * from './src/toCamelCase.mjs' +export * from './src/toPascalCase.mjs' +export * from './src/toKebabCase.mjs' +export * from './src/resetFile.mjs' +export * from './src/readFile.mjs' +export * from './src/appendFile.mjs' +export * from './src/writeFile.mjs' +export * from './src/writeFileIfNotExists.mjs' +export * from './src/readAllMetadata.mjs' +export * from './src/readMetadata.mjs' +export * from './src/readSvgDirectory.mjs' +export * from './src/readSvg.mjs' +export * from './src/writeSvgFile.mjs' +export * from './src/hash.mjs' +export * from './src/generateHashedKey.mjs' +export * from './src/hasDuplicatedChildren.mjs' +export * from './src/mergeArrays.mjs' +export * from './src/getCurrentDirPath.mjs' diff --git a/tools/build-helpers/package.json b/tools/build-helpers/package.json new file mode 100644 index 00000000000..ea253c0aa5f --- /dev/null +++ b/tools/build-helpers/package.json @@ -0,0 +1,11 @@ +{ + "name": "@lucide/build-helpers", + "private": true, + "version": "1.0.0", + "description": "", + "main": "main.mjs", + "module": "main.mjs", + "author": "", + "license": "ISC", + "type": "module" +} diff --git a/tools/build-helpers/src/appendFile.mjs b/tools/build-helpers/src/appendFile.mjs new file mode 100644 index 00000000000..a45920a8497 --- /dev/null +++ b/tools/build-helpers/src/appendFile.mjs @@ -0,0 +1,12 @@ +import fs from 'fs'; +import path from 'path'; + +/** + * append content to a file + * + * @param {string} content + * @param {string} fileName + * @param {string} outputDirectory + */ +export const appendFile = (content, fileName, outputDirectory) => + fs.appendFileSync(path.join(outputDirectory, fileName), content, 'utf-8'); diff --git a/tools/build-helpers/src/generateHashedKey.mjs b/tools/build-helpers/src/generateHashedKey.mjs new file mode 100644 index 00000000000..6bb1aad55e8 --- /dev/null +++ b/tools/build-helpers/src/generateHashedKey.mjs @@ -0,0 +1,11 @@ +import { hash } from './hash.mjs'; + +/** + * Generate Hashed string based on name and attributes + * + * @param {object} seed + * @param {string} seed.name A name, for example an icon name + * @param {object} seed.attributes An object of SVGElement Attrbutes + * @returns {string} A hashed string of 6 characters + */ +export const generateHashedKey = ({ name, attributes }) => hash(JSON.stringify([name, attributes])); diff --git a/tools/build-helpers/src/getCurrentDirPath.mjs b/tools/build-helpers/src/getCurrentDirPath.mjs new file mode 100644 index 00000000000..ccd9126a858 --- /dev/null +++ b/tools/build-helpers/src/getCurrentDirPath.mjs @@ -0,0 +1,10 @@ +import path from 'path'; +import { fileURLToPath } from 'url'; + +/** + * Get the current directory path. + * + * @param {string} currentPath + * @returns {string} + */ +export const getCurrentDirPath = (currentPath) => path.dirname(fileURLToPath(currentPath)); diff --git a/tools/build-helpers/src/hasDuplicatedChildren.mjs b/tools/build-helpers/src/hasDuplicatedChildren.mjs new file mode 100644 index 00000000000..8e65cddfb78 --- /dev/null +++ b/tools/build-helpers/src/hasDuplicatedChildren.mjs @@ -0,0 +1,15 @@ +import { generateHashedKey } from './generateHashedKey.mjs' + +/** + * Checks if array of items contains duplicated items + * + * @param {array} children an array of items + * @returns {Boolean} if items contains duplicated items. + */ +export const hasDuplicatedChildren = (children) => { + const hashedKeys = children.map(generateHashedKey); + + return !hashedKeys.every( + (key, index) => index === hashedKeys.findIndex((childKey) => childKey === key), + ); +}; diff --git a/tools/build-helpers/src/hash.mjs b/tools/build-helpers/src/hash.mjs new file mode 100644 index 00000000000..616c4461466 --- /dev/null +++ b/tools/build-helpers/src/hash.mjs @@ -0,0 +1,18 @@ +/** + * djb2 hashing function + * + * @param {string} string + * @param {number} seed + * @returns {string} A hashed string of 6 characters + */ +export const hash = (string, seed = 5381) => { + let i = string.length; + + while (i) { + // eslint-disable-next-line no-bitwise, no-plusplus + seed = (seed * 33) ^ string.charCodeAt(--i); + } + + // eslint-disable-next-line no-bitwise + return (seed >>> 0).toString(36).substr(0, 6); +}; diff --git a/tools/build-helpers/src/mergeArrays.mjs b/tools/build-helpers/src/mergeArrays.mjs new file mode 100644 index 00000000000..bceafc71051 --- /dev/null +++ b/tools/build-helpers/src/mergeArrays.mjs @@ -0,0 +1,12 @@ +/** + * Merge two arrays and remove duplicates + * + * @param {array} a + * @param {array} b + * @returns {array} + */ +export const mergeArrays = (a, b) => { + a = a.concat(b); + a = a.filter((i, p) => a.indexOf(i) === p); + return a; +}; diff --git a/tools/build-helpers/src/readAllMetadata.mjs b/tools/build-helpers/src/readAllMetadata.mjs new file mode 100644 index 00000000000..300619830b5 --- /dev/null +++ b/tools/build-helpers/src/readAllMetadata.mjs @@ -0,0 +1,17 @@ +import fs from 'fs'; +import path from 'path'; + +/** + * Reads metadata from the icons/categories directories + * + * @param {string} directory + * @returns {object} A map of icon or category metadata + */ +export const readAllMetadata = (directory) => + fs + .readdirSync(directory) + .filter((file) => path.extname(file) === '.json') + .reduce((acc, fileName, i) => { + acc[path.basename(fileName, '.json')] = readMetadata(fileName, directory); + return acc; + }, {}); diff --git a/tools/build-helpers/src/readFile.mjs b/tools/build-helpers/src/readFile.mjs new file mode 100644 index 00000000000..61b65eb1081 --- /dev/null +++ b/tools/build-helpers/src/readFile.mjs @@ -0,0 +1,10 @@ +import fs from 'fs'; +import path from 'path'; + +/** + * Reads the file contents. + * + * @param {string} path + * @returns {string} The contents of a file + */ +export const readFile = (entry) => fs.readFileSync(path.resolve(__dirname, '../', entry), 'utf-8'); diff --git a/tools/build-helpers/src/readMetadata.mjs b/tools/build-helpers/src/readMetadata.mjs new file mode 100644 index 00000000000..04c0d062981 --- /dev/null +++ b/tools/build-helpers/src/readMetadata.mjs @@ -0,0 +1,12 @@ +import fs from 'fs'; +import path from 'path'; + +/** + * Reads metadata for an icon or category + * + * @param {string} fileName + * @param {string} directory + * @returns {object} The metadata for the icon or category + */ +export const readMetadata = (fileName, directory) => + JSON.parse(fs.readFileSync(path.join(directory, fileName), 'utf-8')); diff --git a/tools/build-helpers/src/readSvg.mjs b/tools/build-helpers/src/readSvg.mjs new file mode 100644 index 00000000000..525fa989917 --- /dev/null +++ b/tools/build-helpers/src/readSvg.mjs @@ -0,0 +1,11 @@ +import fs from 'fs'; +import path from 'path'; + +/** + * Read svg from directory + * + * @param {string} fileName + * @param {string} directory + */ +export const readSvg = (fileName, directory) => + fs.readFileSync(path.join(directory, fileName), 'utf-8'); diff --git a/tools/build-helpers/src/readSvgDirectory.mjs b/tools/build-helpers/src/readSvgDirectory.mjs new file mode 100644 index 00000000000..deaab8a9fe3 --- /dev/null +++ b/tools/build-helpers/src/readSvgDirectory.mjs @@ -0,0 +1,11 @@ +import fs from 'fs'; +import path from 'path'; + +/** + * reads the icon directory + * + * @param {string} directory + * @returns {array} An array of file paths containig svgs + */ +export const readSvgDirectory = (directory, fileExtension = '.svg') => + fs.readdirSync(directory).filter((file) => path.extname(file) === fileExtension); diff --git a/tools/build-helpers/src/resetFile.mjs b/tools/build-helpers/src/resetFile.mjs new file mode 100644 index 00000000000..5d4f61e7f5e --- /dev/null +++ b/tools/build-helpers/src/resetFile.mjs @@ -0,0 +1,11 @@ +import fs from 'fs'; +import path from 'path'; + +/** + * Resets the file contents. + * + * @param {string} fileName + * @param {string} outputDirectory + */ +export const resetFile = (fileName, outputDirectory) => + fs.writeFileSync(path.join(outputDirectory, fileName), '', 'utf-8'); diff --git a/tools/build-helpers/src/toCamelCase.mjs b/tools/build-helpers/src/toCamelCase.mjs new file mode 100644 index 00000000000..017afeb5edf --- /dev/null +++ b/tools/build-helpers/src/toCamelCase.mjs @@ -0,0 +1,10 @@ +/** + * Converts string to CamelCase + * + * @param {string} string + * @returns {string} A camelized string + */ +export const toCamelCase = (string) => + string.replace(/^([A-Z])|[\s-_]+(\w)/g, (match, p1, p2) => + p2 ? p2.toUpperCase() : p1.toLowerCase(), + ); diff --git a/tools/build-helpers/src/toKebabCase.mjs b/tools/build-helpers/src/toKebabCase.mjs new file mode 100644 index 00000000000..6a6c4b252e9 --- /dev/null +++ b/tools/build-helpers/src/toKebabCase.mjs @@ -0,0 +1,7 @@ +/** + * Converts string to KebabCase + * + * @param {string} string + * @returns {string} A kebabized string + */ +export const toKebabCase = (string) => string.replace(/([a-z0-9])([A-Z])/g, '$1-$2').toLowerCase(); diff --git a/tools/build-helpers/src/toPascalCase.mjs b/tools/build-helpers/src/toPascalCase.mjs new file mode 100644 index 00000000000..a0041243188 --- /dev/null +++ b/tools/build-helpers/src/toPascalCase.mjs @@ -0,0 +1,13 @@ +import { toCamelCase } from './toCamelCase.mjs'; + +/** + * Converts string to PascalCase + * + * @param {string} string + * @returns {string} A pascalized string + */ +export const toPascalCase = (string) => { + const camelCase = toCamelCase(string); + + return camelCase.charAt(0).toUpperCase() + camelCase.slice(1); +}; diff --git a/tools/build-helpers/src/writeFile.mjs b/tools/build-helpers/src/writeFile.mjs new file mode 100644 index 00000000000..8d71e85cdfb --- /dev/null +++ b/tools/build-helpers/src/writeFile.mjs @@ -0,0 +1,12 @@ +import fs from 'fs'; +import path from 'path'; + +/** + * writes content to a file + * + * @param {string} content + * @param {string} fileName + * @param {string} outputDirectory + */ +export const writeFile = (content, fileName, outputDirectory) => + fs.writeFileSync(path.join(outputDirectory, fileName), content, 'utf-8'); diff --git a/tools/build-helpers/src/writeFileIfNotExists.mjs b/tools/build-helpers/src/writeFileIfNotExists.mjs new file mode 100644 index 00000000000..710ce652af3 --- /dev/null +++ b/tools/build-helpers/src/writeFileIfNotExists.mjs @@ -0,0 +1,16 @@ +import fs from 'fs'; +import path from 'path'; +import { writeFile } from './writeFile.mjs'; + +/** + * writes content to a file if it does not exist + * + * @param {string} content + * @param {string} fileName + * @param {string} outputDirectory + */ +export const writeFileIfNotExists = (content, fileName, outputDirectory) => { + if (!fs.existsSync(path.join(outputDirectory, fileName))) { + writeFile(content, fileName, outputDirectory); + } +}; diff --git a/tools/build-helpers/src/writeSvgFile.mjs b/tools/build-helpers/src/writeSvgFile.mjs new file mode 100644 index 00000000000..385fc2722f4 --- /dev/null +++ b/tools/build-helpers/src/writeSvgFile.mjs @@ -0,0 +1,12 @@ +import fs from 'fs'; +import path from 'path'; + +/** + * writes content to a file + * + * @param {string} fileName + * @param {string} outputDirectory + * @param {string} content + */ +export const writeSvgFile = (fileName, outputDirectory, content) => + fs.writeFileSync(path.join(outputDirectory, fileName), content, 'utf-8'); diff --git a/tools/build-icons/building/generateAliasesFile.mjs b/tools/build-icons/building/generateAliasesFile.mjs index 47e7a31811f..d630947834d 100644 --- a/tools/build-icons/building/generateAliasesFile.mjs +++ b/tools/build-icons/building/generateAliasesFile.mjs @@ -1,6 +1,6 @@ import path from 'path'; import fs from 'fs'; -import { toPascalCase, resetFile, appendFile } from '../../../scripts/helpers.mjs'; +import { toPascalCase, resetFile, appendFile } from '@lucide/build-helpers'; const getImportString = (componentName, iconName, aliasImportFileExtension = '') => `export { default as ${componentName} } from './icons/${iconName}${aliasImportFileExtension}';\n`; diff --git a/tools/build-icons/building/generateDynamicImports.mjs b/tools/build-icons/building/generateDynamicImports.mjs index 62d35afb43a..46e1d733357 100644 --- a/tools/build-icons/building/generateDynamicImports.mjs +++ b/tools/build-icons/building/generateDynamicImports.mjs @@ -1,5 +1,5 @@ import path from 'path'; -import { resetFile, appendFile } from '../../../scripts/helpers.mjs'; +import { resetFile, appendFile } from '@lucide/build-helpers'; export default function generateDynamicImports({ iconNodes, diff --git a/tools/build-icons/building/generateExportsFile.mjs b/tools/build-icons/building/generateExportsFile.mjs index 3a57c838e66..40855c950c4 100644 --- a/tools/build-icons/building/generateExportsFile.mjs +++ b/tools/build-icons/building/generateExportsFile.mjs @@ -1,6 +1,6 @@ import path from 'path'; -import { toPascalCase, resetFile, appendFile } from '../../../scripts/helpers.mjs'; +import { toPascalCase, resetFile, appendFile } from '@lucide/build-helpers'; export default (inputEntry, outputDirectory, iconNodes, iconFileExtension = '') => { const fileName = path.basename(inputEntry); diff --git a/tools/build-icons/building/generateIconFiles.mjs b/tools/build-icons/building/generateIconFiles.mjs index 9540432939f..3031b011a58 100644 --- a/tools/build-icons/building/generateIconFiles.mjs +++ b/tools/build-icons/building/generateIconFiles.mjs @@ -1,7 +1,7 @@ import fs from 'fs'; import path from 'path'; import prettier from 'prettier'; -import { readSvg, toPascalCase } from '../../../scripts/helpers.mjs'; +import { readSvg, toPascalCase } from '@lucide/build-helpers'; export default ({ iconNodes, diff --git a/tools/build-icons/index.mjs b/tools/build-icons/index.mjs index 923e98a8cce..e6eb63bdddd 100644 --- a/tools/build-icons/index.mjs +++ b/tools/build-icons/index.mjs @@ -1,2 +1,3 @@ // eslint-disable-next-line import/prefer-default-export export { default as getAliases } from './utils/getAliases.mjs'; +export { default as renderIconsObject } from './render/renderIconsObject.mjs'; diff --git a/tools/build-icons/main.mjs b/tools/build-icons/main.mjs index ff0e34b46ea..60dc43e4a80 100755 --- a/tools/build-icons/main.mjs +++ b/tools/build-icons/main.mjs @@ -7,7 +7,7 @@ import renderIconsObject from './render/renderIconsObject.mjs'; import generateIconFiles from './building/generateIconFiles.mjs'; import generateExportsFile from './building/generateExportsFile.mjs'; -import { readSvgDirectory, getCurrentDirPath } from '../../scripts/helpers.mjs'; +import { readSvgDirectory, getCurrentDirPath } from '@lucide/build-helpers'; import generateAliasesFile from './building/generateAliasesFile.mjs'; import getAliases from './utils/getAliases.mjs'; import generateDynamicImports from './building/generateDynamicImports.mjs'; diff --git a/tools/build-icons/package.json b/tools/build-icons/package.json index e9ad967e21e..51944cb2b6d 100644 --- a/tools/build-icons/package.json +++ b/tools/build-icons/package.json @@ -17,7 +17,11 @@ "keywords": [], "author": "", "license": "ISC", + "devDependencies": { + "@lucide/build-helpers": "workspace:*" + }, "dependencies": { + "@lucide/build-helpers": "^1.0.0", "minimist": "^1.2.7", "node-fetch": "^3.2.10", "prettier": "2.7.1", diff --git a/tools/build-icons/render/renderIconsObject.mjs b/tools/build-icons/render/renderIconsObject.mjs index 050ee7a1303..1698c559bbf 100644 --- a/tools/build-icons/render/renderIconsObject.mjs +++ b/tools/build-icons/render/renderIconsObject.mjs @@ -1,6 +1,6 @@ import { basename } from 'path'; import { parseSync } from 'svgson'; -import { generateHashedKey, readSvg, hasDuplicatedChildren } from '../../../scripts/helpers.mjs'; +import { generateHashedKey, readSvg, hasDuplicatedChildren } from '@lucide/build-helpers'; /** * Build an object in the format: `{ : }`. diff --git a/tools/build-icons/utils/getAliases.mjs b/tools/build-icons/utils/getAliases.mjs index 91cc37989a0..243a2839753 100644 --- a/tools/build-icons/utils/getAliases.mjs +++ b/tools/build-icons/utils/getAliases.mjs @@ -1,5 +1,5 @@ import path from 'path'; -import { readSvgDirectory } from '../../../scripts/helpers.mjs'; +import { readSvgDirectory } from '@lucide/build-helpers'; async function getAliases(iconDirectory) { const iconJsons = readSvgDirectory(iconDirectory, '.json'); From 0cec7a01271529ef892e07cc2c4f4e53abc2ee5c Mon Sep 17 00:00:00 2001 From: Eric Fennis Date: Fri, 19 Apr 2024 14:08:45 +0200 Subject: [PATCH 03/22] Fixes scripts --- tools/build-helpers/main.mjs | 2 ++ tools/build-helpers/src/minifySvg.mjs | 14 ++++++++++++++ tools/build-helpers/src/readAllMetadata.mjs | 2 +- tools/build-helpers/src/readFile.mjs | 2 +- tools/build-helpers/src/readSvgDirectory.mjs | 3 ++- tools/build-helpers/src/shuffleArray.mjs | 12 ++++++++++++ 6 files changed, 32 insertions(+), 3 deletions(-) create mode 100644 tools/build-helpers/src/minifySvg.mjs create mode 100644 tools/build-helpers/src/shuffleArray.mjs diff --git a/tools/build-helpers/main.mjs b/tools/build-helpers/main.mjs index 894765f8ed2..1945ce38896 100644 --- a/tools/build-helpers/main.mjs +++ b/tools/build-helpers/main.mjs @@ -16,3 +16,5 @@ export * from './src/generateHashedKey.mjs' export * from './src/hasDuplicatedChildren.mjs' export * from './src/mergeArrays.mjs' export * from './src/getCurrentDirPath.mjs' +export * from './src/minifySvg.mjs' +export * from './src/shuffleArray.mjs' diff --git a/tools/build-helpers/src/minifySvg.mjs b/tools/build-helpers/src/minifySvg.mjs new file mode 100644 index 00000000000..3984f3e8cac --- /dev/null +++ b/tools/build-helpers/src/minifySvg.mjs @@ -0,0 +1,14 @@ +/** + * Minifies SVG + * + * @param {string} string + * @returns string + */ +export function minifySvg(string) { + return string + ? string + .replace(/>[\r\n ]+<') + .replace(/(<.*?>)|\s+/g, (m, $1) => $1 || ' ') + .trim() + : ''; +} diff --git a/tools/build-helpers/src/readAllMetadata.mjs b/tools/build-helpers/src/readAllMetadata.mjs index 300619830b5..226fdaa35ec 100644 --- a/tools/build-helpers/src/readAllMetadata.mjs +++ b/tools/build-helpers/src/readAllMetadata.mjs @@ -11,7 +11,7 @@ export const readAllMetadata = (directory) => fs .readdirSync(directory) .filter((file) => path.extname(file) === '.json') - .reduce((acc, fileName, i) => { + .reduce((acc, fileName) => { acc[path.basename(fileName, '.json')] = readMetadata(fileName, directory); return acc; }, {}); diff --git a/tools/build-helpers/src/readFile.mjs b/tools/build-helpers/src/readFile.mjs index 61b65eb1081..0d369059bed 100644 --- a/tools/build-helpers/src/readFile.mjs +++ b/tools/build-helpers/src/readFile.mjs @@ -7,4 +7,4 @@ import path from 'path'; * @param {string} path * @returns {string} The contents of a file */ -export const readFile = (entry) => fs.readFileSync(path.resolve(__dirname, '../', entry), 'utf-8'); +export const readFile = (path) => fs.readFileSync(path.resolve(__dirname, '../', path), 'utf-8'); diff --git a/tools/build-helpers/src/readSvgDirectory.mjs b/tools/build-helpers/src/readSvgDirectory.mjs index deaab8a9fe3..25a6d5382e3 100644 --- a/tools/build-helpers/src/readSvgDirectory.mjs +++ b/tools/build-helpers/src/readSvgDirectory.mjs @@ -5,7 +5,8 @@ import path from 'path'; * reads the icon directory * * @param {string} directory - * @returns {array} An array of file paths containig svgs + * @param {string} fileExtension + * @returns {array} An array of file paths containing svgs */ export const readSvgDirectory = (directory, fileExtension = '.svg') => fs.readdirSync(directory).filter((file) => path.extname(file) === fileExtension); diff --git a/tools/build-helpers/src/shuffleArray.mjs b/tools/build-helpers/src/shuffleArray.mjs new file mode 100644 index 00000000000..8bfaae8d478 --- /dev/null +++ b/tools/build-helpers/src/shuffleArray.mjs @@ -0,0 +1,12 @@ +/** + * @param {array} array + * @returns {array} + */ +export const shuffle = (array) => { + // eslint-disable-next-line no-plusplus + for (let i = array.length - 1; i > 0; i--) { + const j = Math.floor(Math.random() * (i + 1)); + [array[i], array[j]] = [array[j], array[i]]; + } + return array; +}; From 53d56c59ffe6b4066978989cf9c32873ae9e4612 Mon Sep 17 00:00:00 2001 From: Eric Fennis Date: Fri, 19 Apr 2024 14:26:38 +0200 Subject: [PATCH 04/22] Fix scripts --- docs/package.json | 1 + docs/scripts/writeIconRelatedIcons.mjs | 2 +- docs/scripts/writeVercelOutput.mjs | 6 ++-- icons/a-arrow-down.svg | 2 +- icons/diamond-minus.json | 2 +- icons/diamond-plus.json | 2 +- package.json | 2 ++ pnpm-lock.yaml | 39 +++++++++------------ scripts/rename/renameIcon.mjs | 2 +- scripts/rename/renamePattern.mjs | 6 ++-- scripts/render/processSvg.mjs | 2 +- tools/build-helpers/src/readAllMetadata.mjs | 1 + tools/build-icons/utils/getAliases.mjs | 16 +++++++++ 13 files changed, 49 insertions(+), 34 deletions(-) create mode 100644 tools/build-icons/utils/getAliases.mjs diff --git a/docs/package.json b/docs/package.json index 4ab01f5ba4c..957d579f6a2 100644 --- a/docs/package.json +++ b/docs/package.json @@ -26,6 +26,7 @@ "devDependencies": { "@lucide/build-icons": "workspace:*", "@lucide/build-helpers": "workspace:*", + "@lucide/shared": "workspace:*", "@rollup/plugin-replace": "^5.0.2", "@types/semver": "^7.5.3", "h3": "^1.8.0", diff --git a/docs/scripts/writeIconRelatedIcons.mjs b/docs/scripts/writeIconRelatedIcons.mjs index 79b95828b8a..10ca2a1a972 100644 --- a/docs/scripts/writeIconRelatedIcons.mjs +++ b/docs/scripts/writeIconRelatedIcons.mjs @@ -51,7 +51,7 @@ const getRelatedIcons = (currentIcon, icons) => { const iconsMetaDataPromises = svgFiles.map(async (iconName) => { // eslint-disable-next-line import/no-dynamic-require, global-require - const metaData = await import(`../icons/${iconName}`, { + const metaData = await import(`../../icons/${iconName}`, { assert: { type: 'json' }, }); diff --git a/docs/scripts/writeVercelOutput.mjs b/docs/scripts/writeVercelOutput.mjs index 5c9d741b637..a5bd59db460 100644 --- a/docs/scripts/writeVercelOutput.mjs +++ b/docs/scripts/writeVercelOutput.mjs @@ -1,8 +1,8 @@ import path from 'path'; import fs from 'fs'; -// eslint-disable-next-line import/no-named-as-default, import/no-named-as-default-member -import getIconMetaData from '../tools/build-icons/utils/getIconMetaData.mjs'; -import { getCurrentDirPath } from './helpers.mjs'; +/* eslint-disable import/no-extraneous-dependencies */ +import { getIconMetaData } from '@lucide/build-icons'; +import { getCurrentDirPath } from '@lucide/build-helpers'; const currentDir = process.cwd(); const scriptDir = getCurrentDirPath(import.meta.url); diff --git a/icons/a-arrow-down.svg b/icons/a-arrow-down.svg index 59f4ac860a1..5106437a72c 100644 --- a/icons/a-arrow-down.svg +++ b/icons/a-arrow-down.svg @@ -13,4 +13,4 @@ - \ No newline at end of file + diff --git a/icons/diamond-minus.json b/icons/diamond-minus.json index 06fba6c39ae..0c74e1c1c01 100644 --- a/icons/diamond-minus.json +++ b/icons/diamond-minus.json @@ -30,7 +30,7 @@ ], "categories": [ "multimedia", - "shape", + "shapes", "photography", "tools", "devices" diff --git a/icons/diamond-plus.json b/icons/diamond-plus.json index fa01de0084e..c8a37644128 100644 --- a/icons/diamond-plus.json +++ b/icons/diamond-plus.json @@ -25,7 +25,7 @@ ], "categories": [ "multimedia", - "shape", + "shapes", "photography", "tools", "devices" diff --git a/package.json b/package.json index 9577a0e99e1..8cd237f06fd 100644 --- a/package.json +++ b/package.json @@ -40,6 +40,8 @@ "renamePattern": "node scripts/rename/renamePattern.mjs" }, "devDependencies": { + "@lucide/build-icons": "workspace:*", + "@lucide/build-helpers": "workspace:*", "@html-eslint/eslint-plugin": "^0.19.1", "@html-eslint/parser": "^0.19.1", "@octokit/rest": "^19.0.13", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 124f74a6f3e..50e70001101 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -16,6 +16,12 @@ importers: '@html-eslint/parser': specifier: ^0.19.1 version: 0.19.1 + '@lucide/build-helpers': + specifier: workspace:* + version: link:tools/build-helpers + '@lucide/build-icons': + specifier: workspace:* + version: link:tools/build-icons '@octokit/rest': specifier: ^19.0.13 version: 19.0.13 @@ -167,6 +173,9 @@ importers: '@lucide/build-icons': specifier: workspace:* version: link:../tools/build-icons + '@lucide/shared': + specifier: workspace:* + version: link:../packages/shared '@rollup/plugin-replace': specifier: ^5.0.2 version: 5.0.2 @@ -10572,10 +10581,6 @@ packages: resolution: {integrity: sha512-mWYvfOLrfEc996hlKcdABeIiPHUPC6DM2QYZdGGOvhOTbA3tjm2eBwqlJpoFdjC89NI4Qt6h0Pu06Mp+1Pj5OQ==} dev: true - /cookie-es@1.1.0: - resolution: {integrity: sha512-L2rLOcK0wzWSfSDA33YR+PUHDG10a8px7rUHKWbGLP4YfbsMed2KFUw5fczvDPbT98DDe3LEzviswl810apTEw==} - dev: true - /cookie-signature@1.0.6: resolution: {integrity: sha512-QADzlaHc8icV8I7vbaJXJwod9HWYp8uCqf1xa4OfNu1T7JVxQIrUgOWtHdNDtPiywmFbiS12VjotIXLrKM3orQ==} dev: true @@ -10728,15 +10733,6 @@ packages: shebang-command: 2.0.0 which: 2.0.2 - /crossws@0.2.4: - resolution: {integrity: sha512-DAxroI2uSOgUKLz00NX6A8U/8EE3SZHmIND+10jkVSaypvyt57J5JEOxAQOL6lQxyzi/wZbTIwssU1uy69h5Vg==} - peerDependencies: - uWebSockets.js: '*' - peerDependenciesMeta: - uWebSockets.js: - optional: true - dev: true - /css-blank-pseudo@3.0.3(postcss@8.4.27): resolution: {integrity: sha512-VS90XWtsHGqoM0t4KpH053c4ehxZ2E6HtGI7x68YFV0pTo/QmkV/YFA+NnlvK8guxZVNWGQhVNJGC39Q8XF4OQ==} engines: {node: ^12 || ^14 || >=16} @@ -13512,10 +13508,10 @@ packages: dependencies: cookie-es: 1.0.0 defu: 6.1.4 - destr: 2.0.2 - iron-webcrypto: 1.0.0 + destr: 2.0.3 + iron-webcrypto: 1.1.0 ohash: 1.1.3 - radix3: 1.1.0 + radix3: 1.1.2 ufo: 1.4.0 uncrypto: 0.1.3 unenv: 1.9.0 @@ -16424,7 +16420,7 @@ packages: consola: 3.2.3 cookie-es: 1.0.0 defu: 6.1.4 - destr: 2.0.2 + destr: 2.0.3 dot-prop: 8.0.2 esbuild: 0.19.12 escape-string-regexp: 5.0.0 @@ -16453,7 +16449,7 @@ packages: perfect-debounce: 1.0.0 pkg-types: 1.0.3 pretty-bytes: 6.1.1 - radix3: 1.1.0 + radix3: 1.1.2 rollup: 4.9.6 rollup-plugin-visualizer: 5.12.0(rollup@4.9.6) scule: 1.3.0 @@ -16482,7 +16478,6 @@ packages: - encoding - idb-keyval - supports-color - - uWebSockets.js dev: true /no-case@3.0.4: @@ -16954,7 +16949,7 @@ packages: /ofetch@1.3.3: resolution: {integrity: sha512-s1ZCMmQWXy4b5K/TW9i/DtiN8Ku+xCiHcjQ6/J/nDdssirrQNOoB165Zu8EqLMA2lln1JUth9a0aW9Ap2ctrUg==} dependencies: - destr: 2.0.2 + destr: 2.0.3 node-fetch-native: 1.6.2 ufo: 1.4.0 dev: true @@ -18485,7 +18480,7 @@ packages: resolution: {integrity: sha512-lNeOl38Ws0eNxpO3+wD1I9rkHGQyj1NU1jlzv4go2CtEnEQEUfqnIvZG7W+bC/aXdJ27n5x/yUjb6RoT9tko+Q==} dependencies: defu: 6.1.4 - destr: 2.0.2 + destr: 2.0.3 flat: 5.0.2 dev: true @@ -21407,7 +21402,7 @@ packages: dependencies: anymatch: 3.1.3 chokidar: 3.5.3 - destr: 2.0.2 + destr: 2.0.3 h3: 1.10.1 ioredis: 5.3.2 listhen: 1.5.5 diff --git a/scripts/rename/renameIcon.mjs b/scripts/rename/renameIcon.mjs index aa8d2b57e9c..c68e692437c 100644 --- a/scripts/rename/renameIcon.mjs +++ b/scripts/rename/renameIcon.mjs @@ -1,5 +1,5 @@ import path from 'path'; -import { getCurrentDirPath } from '../helpers.mjs'; +import { getCurrentDirPath } from '@lucide/build-helpers'; import { renameIcon } from './renameIcon.function.mjs'; async function main() { diff --git a/scripts/rename/renamePattern.mjs b/scripts/rename/renamePattern.mjs index 23e8dc3d581..24893dae61a 100644 --- a/scripts/rename/renamePattern.mjs +++ b/scripts/rename/renamePattern.mjs @@ -1,8 +1,8 @@ import path from 'path'; -import { getCurrentDirPath, readSvgDirectory } from '../helpers.mjs'; -import { renameIcon } from './renameIcon.function.mjs'; +import { getCurrentDirPath, readSvgDirectory } from '@lucide/build-helpers'; import yargs from 'yargs/yargs'; import { hideBin } from 'yargs/helpers'; +import { renameIcon } from './renameIcon.function.mjs'; async function main() { const currentDir = getCurrentDirPath(import.meta.url); @@ -38,7 +38,7 @@ async function main() { process.exit(1); } - for (let oldName of iconNames.filter((name) => pattern.test(name))) { + for (const oldName of iconNames.filter((name) => pattern.test(name))) { const newName = oldName.replaceAll(pattern, replacement); console.log(`Renaming ${oldName} => ${newName}`); diff --git a/scripts/render/processSvg.mjs b/scripts/render/processSvg.mjs index 293dc870497..62ca11c0177 100644 --- a/scripts/render/processSvg.mjs +++ b/scripts/render/processSvg.mjs @@ -1,7 +1,7 @@ import { optimize } from 'svgo'; import * as prettier from 'prettier'; import { parseSync, stringify } from 'svgson'; -import DEFAULT_ATTRS from './default-attrs.json' assert { type: 'json' }; +import DEFAULT_ATTRS from '@lucide/build-icons/render/default-attrs.json' assert { type: 'json' }; /** * Optimize SVG with `svgo`. diff --git a/tools/build-helpers/src/readAllMetadata.mjs b/tools/build-helpers/src/readAllMetadata.mjs index 226fdaa35ec..425677b5eea 100644 --- a/tools/build-helpers/src/readAllMetadata.mjs +++ b/tools/build-helpers/src/readAllMetadata.mjs @@ -1,5 +1,6 @@ import fs from 'fs'; import path from 'path'; +import { readMetadata } from './readMetadata.mjs'; /** * Reads metadata from the icons/categories directories diff --git a/tools/build-icons/utils/getAliases.mjs b/tools/build-icons/utils/getAliases.mjs new file mode 100644 index 00000000000..243a2839753 --- /dev/null +++ b/tools/build-icons/utils/getAliases.mjs @@ -0,0 +1,16 @@ +import path from 'path'; +import { readSvgDirectory } from '@lucide/build-helpers'; + +async function getAliases(iconDirectory) { + const iconJsons = readSvgDirectory(iconDirectory, '.json'); + const aliasesEntries = await Promise.all( + iconJsons.map(async (jsonFile) => { + const file = await import( path.join(iconDirectory, jsonFile), { assert: { type: 'json' } }); + return [path.basename(jsonFile, '.json'), file.default] + }) + ) + + return Object.fromEntries(aliasesEntries); +} + +export default getAliases From aa333bf2c36e7fffc55108cc0230f08dc5c5f944 Mon Sep 17 00:00:00 2001 From: Eric Fennis Date: Fri, 19 Apr 2024 14:27:24 +0200 Subject: [PATCH 05/22] Formatting --- icons/arrow-down-0-1.json | 2 +- icons/arrow-down-1-0.json | 2 +- icons/arrow-down-a-z.json | 2 +- icons/arrow-down-z-a.json | 2 +- icons/arrow-up-0-1.json | 2 +- icons/arrow-up-1-0.json | 2 +- icons/arrow-up-a-z.json | 2 +- icons/arrow-up-z-a.json | 2 +- icons/axis-3d.json | 2 +- icons/file-axis-3d.json | 2 +- icons/grid-2x2.json | 2 +- icons/grid-3x3.json | 2 +- icons/move-3d.json | 2 +- icons/rotate-3d.json | 2 +- icons/scale-3d.json | 2 +- 15 files changed, 15 insertions(+), 15 deletions(-) diff --git a/icons/arrow-down-0-1.json b/icons/arrow-down-0-1.json index 032d9a0dec4..e4c171f2293 100644 --- a/icons/arrow-down-0-1.json +++ b/icons/arrow-down-0-1.json @@ -18,4 +18,4 @@ "aliases": [ "arrow-down-01" ] -} +} \ No newline at end of file diff --git a/icons/arrow-down-1-0.json b/icons/arrow-down-1-0.json index 102706d59a9..383f4bdc3fe 100644 --- a/icons/arrow-down-1-0.json +++ b/icons/arrow-down-1-0.json @@ -18,4 +18,4 @@ "aliases": [ "arrow-down-10" ] -} +} \ No newline at end of file diff --git a/icons/arrow-down-a-z.json b/icons/arrow-down-a-z.json index a311d9bb89a..883ccf06149 100644 --- a/icons/arrow-down-a-z.json +++ b/icons/arrow-down-a-z.json @@ -18,4 +18,4 @@ "aliases": [ "arrow-down-az" ] -} +} \ No newline at end of file diff --git a/icons/arrow-down-z-a.json b/icons/arrow-down-z-a.json index 0bad0989509..9a8962ec16e 100644 --- a/icons/arrow-down-z-a.json +++ b/icons/arrow-down-z-a.json @@ -19,4 +19,4 @@ "aliases": [ "arrow-down-za" ] -} +} \ No newline at end of file diff --git a/icons/arrow-up-0-1.json b/icons/arrow-up-0-1.json index c08093ebf2b..f03268b0a39 100644 --- a/icons/arrow-up-0-1.json +++ b/icons/arrow-up-0-1.json @@ -18,4 +18,4 @@ "aliases": [ "arrow-up-01" ] -} +} \ No newline at end of file diff --git a/icons/arrow-up-1-0.json b/icons/arrow-up-1-0.json index fb0749ecc54..998ffc9ffaa 100644 --- a/icons/arrow-up-1-0.json +++ b/icons/arrow-up-1-0.json @@ -18,4 +18,4 @@ "aliases": [ "arrow-up-10" ] -} +} \ No newline at end of file diff --git a/icons/arrow-up-a-z.json b/icons/arrow-up-a-z.json index e8fa97713fd..eb94eed7d06 100644 --- a/icons/arrow-up-a-z.json +++ b/icons/arrow-up-a-z.json @@ -18,4 +18,4 @@ "aliases": [ "arrow-up-az" ] -} +} \ No newline at end of file diff --git a/icons/arrow-up-z-a.json b/icons/arrow-up-z-a.json index e46f7ac4799..174c370bfca 100644 --- a/icons/arrow-up-z-a.json +++ b/icons/arrow-up-z-a.json @@ -19,4 +19,4 @@ "aliases": [ "arrow-up-za" ] -} +} \ No newline at end of file diff --git a/icons/axis-3d.json b/icons/axis-3d.json index e43ab304b79..664c5e4e6ed 100644 --- a/icons/axis-3d.json +++ b/icons/axis-3d.json @@ -13,4 +13,4 @@ "aliases": [ "axis-3-d" ] -} +} \ No newline at end of file diff --git a/icons/file-axis-3d.json b/icons/file-axis-3d.json index c3dc1243856..5a45cbfb108 100644 --- a/icons/file-axis-3d.json +++ b/icons/file-axis-3d.json @@ -17,4 +17,4 @@ "aliases": [ "file-axis-3-d" ] -} +} \ No newline at end of file diff --git a/icons/grid-2x2.json b/icons/grid-2x2.json index acf114b0187..53baa92d2ee 100644 --- a/icons/grid-2x2.json +++ b/icons/grid-2x2.json @@ -30,4 +30,4 @@ "aliases": [ "grid-2-x-2" ] -} +} \ No newline at end of file diff --git a/icons/grid-3x3.json b/icons/grid-3x3.json index 2e6ea56eabd..2bf56516971 100644 --- a/icons/grid-3x3.json +++ b/icons/grid-3x3.json @@ -21,4 +21,4 @@ "grid", "grid-3-x-3" ] -} +} \ No newline at end of file diff --git a/icons/move-3d.json b/icons/move-3d.json index 94bfe740765..faab605319d 100644 --- a/icons/move-3d.json +++ b/icons/move-3d.json @@ -18,4 +18,4 @@ "aliases": [ "move-3-d" ] -} +} \ No newline at end of file diff --git a/icons/rotate-3d.json b/icons/rotate-3d.json index 6f0ea1fa2a9..c2aa7d7a0c8 100644 --- a/icons/rotate-3d.json +++ b/icons/rotate-3d.json @@ -16,4 +16,4 @@ "aliases": [ "rotate-3-d" ] -} +} \ No newline at end of file diff --git a/icons/scale-3d.json b/icons/scale-3d.json index 6f5b0b508a5..c6c724fe681 100644 --- a/icons/scale-3d.json +++ b/icons/scale-3d.json @@ -17,4 +17,4 @@ "aliases": [ "scale-3-d" ] -} +} \ No newline at end of file From d235651c210a6837f7b6d567cc43038a1494c4ce Mon Sep 17 00:00:00 2001 From: Eric Fennis Date: Fri, 19 Apr 2024 14:34:28 +0200 Subject: [PATCH 06/22] Fix helpers import paths --- packages/lucide-static/scripts/buildLib.mjs | 2 +- packages/lucide-static/scripts/generateIconNodes.mjs | 2 +- packages/lucide-static/scripts/generateSprite.mjs | 2 +- packages/lucide-static/scripts/readSvgs.mjs | 2 +- packages/lucide-svelte/scripts/appendBlockComments.mjs | 9 +++++++-- packages/lucide-svelte/scripts/buildTypes.mjs | 2 +- scripts/generateChangedIconsCommentMarkup.mjs | 8 ++++---- 7 files changed, 16 insertions(+), 11 deletions(-) diff --git a/packages/lucide-static/scripts/buildLib.mjs b/packages/lucide-static/scripts/buildLib.mjs index 3c74df19fd0..40a27217f8c 100644 --- a/packages/lucide-static/scripts/buildLib.mjs +++ b/packages/lucide-static/scripts/buildLib.mjs @@ -4,7 +4,7 @@ import path from 'path'; import getArgumentOptions from 'minimist'; import { parseSync } from 'svgson'; -import { readSvgDirectory, getCurrentDirPath } from '../../../scripts/helpers.mjs'; +import { readSvgDirectory, getCurrentDirPath } from '@lucide/build-helpers'; import readSvgs from './readSvgs.mjs'; import generateSprite from './generateSprite.mjs'; import generateIconNodes from './generateIconNodes.mjs'; diff --git a/packages/lucide-static/scripts/generateIconNodes.mjs b/packages/lucide-static/scripts/generateIconNodes.mjs index 815ba4be0ff..861f97dd7f5 100644 --- a/packages/lucide-static/scripts/generateIconNodes.mjs +++ b/packages/lucide-static/scripts/generateIconNodes.mjs @@ -1,4 +1,4 @@ -import { writeFile } from '../../../scripts/helpers.mjs'; +import { writeFile } from '@lucide/build-helpers'; export default function generateIconNodes(parsedSvgs, packageDir) { const iconNodes = parsedSvgs.reduce((acc, { name, parsedSvg }) => { diff --git a/packages/lucide-static/scripts/generateSprite.mjs b/packages/lucide-static/scripts/generateSprite.mjs index 725a79258bf..d8ebb56e277 100644 --- a/packages/lucide-static/scripts/generateSprite.mjs +++ b/packages/lucide-static/scripts/generateSprite.mjs @@ -1,7 +1,7 @@ /* eslint-disable import/no-extraneous-dependencies */ import { stringify } from 'svgson'; import { format } from 'prettier'; -import { appendFile } from '../../../scripts/helpers.mjs'; +import { appendFile } from '@lucide/build-helpers'; export default function generateSprite(svgs, packageDir, license) { const symbols = svgs.map(({ name, parsedSvg }) => ({ diff --git a/packages/lucide-static/scripts/readSvgs.mjs b/packages/lucide-static/scripts/readSvgs.mjs index 24019c6f3c3..e033563af64 100644 --- a/packages/lucide-static/scripts/readSvgs.mjs +++ b/packages/lucide-static/scripts/readSvgs.mjs @@ -1,6 +1,6 @@ /* eslint-disable import/no-extraneous-dependencies */ import { basename } from 'path'; -import { readSvg } from '../../../scripts/helpers.mjs'; +import { readSvg } from '@lucide/build-helpers'; /** * Build an object in the format: `{ : }`. diff --git a/packages/lucide-svelte/scripts/appendBlockComments.mjs b/packages/lucide-svelte/scripts/appendBlockComments.mjs index a9666cc73b2..c09b75534b6 100644 --- a/packages/lucide-svelte/scripts/appendBlockComments.mjs +++ b/packages/lucide-svelte/scripts/appendBlockComments.mjs @@ -1,7 +1,7 @@ import { lstatSync } from 'fs'; import { readdir, readFile, writeFile } from 'fs/promises'; import path from 'path'; -import { getCurrentDirPath } from '../../../scripts/helpers.mjs'; +import { getCurrentDirPath } from '@lucide/build-helpers'; import { getJSBanner } from './license.mjs'; const currentDir = getCurrentDirPath(import.meta.url); @@ -12,12 +12,15 @@ const files = await readdir(targetDirectory, { encoding: 'utf-8', }); +// eslint-disable-next-line no-restricted-syntax for (const file of files) { const filepath = path.join(targetDirectory, file); const filestat = lstatSync(filepath); + // eslint-disable-next-line no-continue if (filestat.isFile() === false || filestat.isDirectory()) continue; + // eslint-disable-next-line no-await-in-loop const contents = await readFile(filepath, { encoding: 'utf-8' }); let newContents = contents; const ext = path.extname(filepath); @@ -34,7 +37,8 @@ for (const file of files) { // Places icon block comment at the top of the Svelte component class if (/icons\/(.*?)\.svelte\.d\.ts/.test(filepath)) { const svelteFilepath = filepath.replace('.d.ts', ''); - let svelteFileContents = await readFile(svelteFilepath, { encoding: 'utf-8' }); + // eslint-disable-next-line no-await-in-loop + const svelteFileContents = await readFile(svelteFilepath, { encoding: 'utf-8' }); const blockCommentRegex = /\/\*\*\n\s\*\s(@component\s@name)[\s\S]*?\*\//; const blockCommentMatch = blockCommentRegex.exec(svelteFileContents); @@ -54,6 +58,7 @@ for (const file of files) { } if (newContents !== contents) { + // eslint-disable-next-line no-await-in-loop await writeFile(filepath, newContents, { encoding: 'utf-8' }); } } diff --git a/packages/lucide-svelte/scripts/buildTypes.mjs b/packages/lucide-svelte/scripts/buildTypes.mjs index 5bd29df7718..d877a5e3486 100644 --- a/packages/lucide-svelte/scripts/buildTypes.mjs +++ b/packages/lucide-svelte/scripts/buildTypes.mjs @@ -7,7 +7,7 @@ import { resetFile, toPascalCase, getCurrentDirPath, -} from '../../../scripts/helpers.mjs'; +} from '@lucide/build-helpers'; const currentDir = getCurrentDirPath(import.meta.url); const targetDirectory = path.join(currentDir, '../dist'); diff --git a/scripts/generateChangedIconsCommentMarkup.mjs b/scripts/generateChangedIconsCommentMarkup.mjs index bf4fe28aef8..d8985df2c5f 100644 --- a/scripts/generateChangedIconsCommentMarkup.mjs +++ b/scripts/generateChangedIconsCommentMarkup.mjs @@ -2,12 +2,12 @@ import fs from 'fs'; import path from 'path'; import { parseSync } from 'svgson'; import { - shuffle, + shuffleArray, readSvgDirectory, getCurrentDirPath, minifySvg, toPascalCase, -} from './helpers.mjs'; +} from '@lucide/build-helpers'; const currentDir = getCurrentDirPath(import.meta.url); const ICONS_DIR = path.resolve(currentDir, '../icons'); @@ -38,12 +38,12 @@ const svgFiles = readSvgDirectory(ICONS_DIR).map((file) => `icons/${file}`); const iconsFilteredByName = (search) => svgFiles.filter((file) => file.includes(search)); const cohesionRandomImageTags = getImageTagsByFiles( - shuffle(svgFiles).slice(0, changedFiles.length), + shuffleArray(svgFiles).slice(0, changedFiles.length), () => `${BASE_URL}/stroke-width/2`, ).join(''); const cohesionSquaresImageTags = getImageTagsByFiles( - shuffle(iconsFilteredByName('square')).slice(0, changedFiles.length), + shuffleArray(iconsFilteredByName('square')).slice(0, changedFiles.length), () => `${BASE_URL}/stroke-width/2`, ).join(''); From d65b7e5dba5361637b5f0a954de5a115fbf1d4a6 Mon Sep 17 00:00:00 2001 From: Eric Fennis Date: Fri, 19 Apr 2024 14:35:38 +0200 Subject: [PATCH 07/22] Remove lucide-figma --- packages/lucide-figma/README.md | 25 -- packages/lucide-figma/cover.png | Bin 130175 -> 0 bytes packages/lucide-figma/icon.png | Bin 3697 -> 0 bytes packages/lucide-figma/manifest.json | 26 --- packages/lucide-figma/package.json | 30 --- packages/lucide-figma/src/api/fetchIcons.ts | 95 -------- .../src/components/EditBar/EditBar.tsx | 3 - .../src/components/EditBar/index.ts | 0 .../src/components/IconButton/IconButton.scss | 18 -- .../src/components/IconButton/IconButton.tsx | 37 --- .../src/components/IconButton/index.ts | 1 - .../src/components/Menu/Menu.scss | 30 --- .../lucide-figma/src/components/Menu/Menu.tsx | 26 --- .../lucide-figma/src/components/Menu/index.ts | 1 - .../src/components/Navigation/index.ts | 0 .../components/SearchInput/SearchInput.scss | 19 -- .../components/SearchInput/SearchInput.tsx | 31 --- .../src/components/SearchInput/index.ts | 1 - .../src/components/Skeleton/Skeleton.scss | 21 -- .../src/components/Skeleton/Skeleton.tsx | 13 -- .../src/components/icons/SearchIcon.tsx | 21 -- .../src/helpers/createIconComponent.ts | 50 ---- .../lucide-figma/src/helpers/filterIcons.ts | 9 - .../lucide-figma/src/helpers/iconNodeToSvg.ts | 11 - packages/lucide-figma/src/helpers/naming.ts | 20 -- packages/lucide-figma/src/hooks/useSearch.tsx | 14 -- .../lucide-figma/src/icons/search-large.svg | 1 - packages/lucide-figma/src/icons/search.svg | 1 - .../lucide-figma/src/interface/interface.html | 6 - .../lucide-figma/src/interface/interface.scss | 103 --------- .../lucide-figma/src/interface/interface.tsx | 57 ----- packages/lucide-figma/src/main.ts | 149 ------------ packages/lucide-figma/src/theme.ts | 8 - packages/lucide-figma/src/views/Icons.tsx | 52 ----- packages/lucide-figma/src/views/Info.tsx | 70 ------ packages/lucide-figma/src/views/index.ts | 2 - packages/lucide-figma/src/worker/worker.html | 4 - packages/lucide-figma/src/worker/worker.ts | 85 ------- packages/lucide-figma/tsconfig.json | 21 -- packages/lucide-figma/vite.config.ts | 40 ---- pnpm-lock.yaml | 217 ------------------ 41 files changed, 1318 deletions(-) delete mode 100644 packages/lucide-figma/README.md delete mode 100644 packages/lucide-figma/cover.png delete mode 100644 packages/lucide-figma/icon.png delete mode 100644 packages/lucide-figma/manifest.json delete mode 100644 packages/lucide-figma/package.json delete mode 100644 packages/lucide-figma/src/api/fetchIcons.ts delete mode 100644 packages/lucide-figma/src/components/EditBar/EditBar.tsx delete mode 100644 packages/lucide-figma/src/components/EditBar/index.ts delete mode 100644 packages/lucide-figma/src/components/IconButton/IconButton.scss delete mode 100644 packages/lucide-figma/src/components/IconButton/IconButton.tsx delete mode 100644 packages/lucide-figma/src/components/IconButton/index.ts delete mode 100644 packages/lucide-figma/src/components/Menu/Menu.scss delete mode 100644 packages/lucide-figma/src/components/Menu/Menu.tsx delete mode 100644 packages/lucide-figma/src/components/Menu/index.ts delete mode 100644 packages/lucide-figma/src/components/Navigation/index.ts delete mode 100644 packages/lucide-figma/src/components/SearchInput/SearchInput.scss delete mode 100644 packages/lucide-figma/src/components/SearchInput/SearchInput.tsx delete mode 100644 packages/lucide-figma/src/components/SearchInput/index.ts delete mode 100644 packages/lucide-figma/src/components/Skeleton/Skeleton.scss delete mode 100644 packages/lucide-figma/src/components/Skeleton/Skeleton.tsx delete mode 100644 packages/lucide-figma/src/components/icons/SearchIcon.tsx delete mode 100644 packages/lucide-figma/src/helpers/createIconComponent.ts delete mode 100644 packages/lucide-figma/src/helpers/filterIcons.ts delete mode 100644 packages/lucide-figma/src/helpers/iconNodeToSvg.ts delete mode 100644 packages/lucide-figma/src/helpers/naming.ts delete mode 100644 packages/lucide-figma/src/hooks/useSearch.tsx delete mode 100644 packages/lucide-figma/src/icons/search-large.svg delete mode 100644 packages/lucide-figma/src/icons/search.svg delete mode 100644 packages/lucide-figma/src/interface/interface.html delete mode 100644 packages/lucide-figma/src/interface/interface.scss delete mode 100644 packages/lucide-figma/src/interface/interface.tsx delete mode 100644 packages/lucide-figma/src/main.ts delete mode 100644 packages/lucide-figma/src/theme.ts delete mode 100644 packages/lucide-figma/src/views/Icons.tsx delete mode 100644 packages/lucide-figma/src/views/Info.tsx delete mode 100644 packages/lucide-figma/src/views/index.ts delete mode 100644 packages/lucide-figma/src/worker/worker.html delete mode 100644 packages/lucide-figma/src/worker/worker.ts delete mode 100644 packages/lucide-figma/tsconfig.json delete mode 100644 packages/lucide-figma/vite.config.ts diff --git a/packages/lucide-figma/README.md b/packages/lucide-figma/README.md deleted file mode 100644 index 00d1161c773..00000000000 --- a/packages/lucide-figma/README.md +++ /dev/null @@ -1,25 +0,0 @@ -# Lucide Figma plugin - -A Figma plugin for using Lucide Icons - -## Local development - -1. Install the dependencies - - ```sh - yarn - ``` - -2. Build the plugin - - ```sh - yarn watch - ``` - -3. Open the [Figma desktop app](https://www.figma.com/downloads/) - -4. Go to `Menu > Plugins > Development > New Plugin...` - -5. Choose `lucide/packages/lucide-figma/manifest.json` - -6. Run the plugin by going to `Menu > Plugins > Development > Lucide Icons` diff --git a/packages/lucide-figma/cover.png b/packages/lucide-figma/cover.png deleted file mode 100644 index f7704b7526f5c2ea5ee06f40124ca4b5541fe96c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 130175 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 z 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 diff --git a/packages/lucide-figma/icon.png b/packages/lucide-figma/icon.png deleted file mode 100644 index 69c89f768aee1760394d6487e745d42db1752884..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3697 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 sBt&{khj30Tk=w}|0%^ => { - const response = await fetch('https://unpkg.com/lucide-static@latest/package.json'); - const packageJson = await response.json(); - - if (cachedIcons && cachedIcons?.version === packageJson.version) { - return cachedIcons; - } - - const [iconNodesResponse, tagsResponse] = await Promise.all([ - fetch('https://lucide.dev/api/icon-nodes'), - fetch('https://lucide.dev/api/tags'), - ]); - - const iconNodes = await iconNodesResponse.json(); - const tags = await tagsResponse.json(); - const svgs = Object.keys(iconNodes).reduce((acc: { [key: string]: string }, iconName) => { - acc[iconName] = iconNodeToSvg(iconName, iconNodes[iconName]); - return acc; - }, {}); - - const lucideIcons: LucideIcons = { - version: packageJson.version, - tags, - iconNodes, - svgs, - }; - - parent.postMessage( - { - pluginMessage: { - type: 'setCachedIcons', - lucideIcons, - }, - }, - '*', - ); - - return lucideIcons; -}; - -export const getIcons = () => - new Promise(async (resolve, reject) => { - parent.postMessage( - { - pluginMessage: { - type: 'getCachedIcons', - }, - }, - '*', - ); - - window.onmessage = async (event) => { - if (event.type === 'message' && event?.data?.pluginMessage.type === 'cachedIcons') { - const lucideIcons = await fetchIcons(event?.data?.pluginMessage?.cachedIcons); - resolve(lucideIcons); - } - }; - }); - -type EventCallback = (lucideIcons: LucideIcons) => void; - -export const iconFetchListener = (callback: EventCallback) => { - fetchIcons(); - - const handleEvent = (event: MessageEvent) => { - if (event.type === 'message' && event?.data?.pluginMessage.type === 'cachedIcons') { - const lucideIcons = event?.data?.pluginMessage?.cachedIcons; - callback(lucideIcons); - } - }; - - window.addEventListener('message', handleEvent); - - const removeListener = () => { - window.removeEventListener('message', handleEvent); - }; - return removeListener; -}; diff --git a/packages/lucide-figma/src/components/EditBar/EditBar.tsx b/packages/lucide-figma/src/components/EditBar/EditBar.tsx deleted file mode 100644 index 772c2555499..00000000000 --- a/packages/lucide-figma/src/components/EditBar/EditBar.tsx +++ /dev/null @@ -1,3 +0,0 @@ -const EditBar = () => {}; - -export default EditBar; diff --git a/packages/lucide-figma/src/components/EditBar/index.ts b/packages/lucide-figma/src/components/EditBar/index.ts deleted file mode 100644 index e69de29bb2d..00000000000 diff --git a/packages/lucide-figma/src/components/IconButton/IconButton.scss b/packages/lucide-figma/src/components/IconButton/IconButton.scss deleted file mode 100644 index 78980aa5727..00000000000 --- a/packages/lucide-figma/src/components/IconButton/IconButton.scss +++ /dev/null @@ -1,18 +0,0 @@ -.icon-button { - padding: 8px; - color: var(--color-black); - background: transparent; - border: 0; - border-radius: 2px; - appearance: none; - outline: 0; - - &:hover { - background: rgba(0, 0, 0, 0.06); - } - - &:focus, - &:active { - box-shadow: inset 0 0 0 2px var(--color-blue); - } -} diff --git a/packages/lucide-figma/src/components/IconButton/IconButton.tsx b/packages/lucide-figma/src/components/IconButton/IconButton.tsx deleted file mode 100644 index 32e0bdc40d4..00000000000 --- a/packages/lucide-figma/src/components/IconButton/IconButton.tsx +++ /dev/null @@ -1,37 +0,0 @@ -import { renderToString } from 'react-dom/server'; -import { FC } from 'react'; -import './IconButton.scss'; - -interface IconButtonProps { - name: string; - component: FC; -} - -function IconButton({ name, component: IconComponent }: IconButtonProps) { - const onIconClick = () => { - const svg = renderToString(); - - parent.postMessage( - { - pluginMessage: { - type: 'drawIcon', - icon: { name, svg }, - }, - }, - '*', - ); - }; - - return ( - - ); -} - -export default IconButton; diff --git a/packages/lucide-figma/src/components/IconButton/index.ts b/packages/lucide-figma/src/components/IconButton/index.ts deleted file mode 100644 index 86c5e513af2..00000000000 --- a/packages/lucide-figma/src/components/IconButton/index.ts +++ /dev/null @@ -1 +0,0 @@ -export { default } from './IconButton'; diff --git a/packages/lucide-figma/src/components/Menu/Menu.scss b/packages/lucide-figma/src/components/Menu/Menu.scss deleted file mode 100644 index b1bb867081b..00000000000 --- a/packages/lucide-figma/src/components/Menu/Menu.scss +++ /dev/null @@ -1,30 +0,0 @@ -.menu { - display: flex; - align-items: center; - flex-shrink: 0; - height: 40px; - line-height: 40px; - border-bottom: 1px solid var(--color-border, #e5e5e5); - justify-content: flex-start; -} - -.menu-item { - font-weight: 500; - font-size: 11px; - color: var(--color-text-tertiary, #b3b3b3); - padding: 0 8px; - text-transform: capitalize; - cursor: pointer; - - &.active { - color: var(--color-text, #333333); - } - - &:first-child { - padding-left: 16px; - } - - &:last-child { - padding-right: 16px; - } -} diff --git a/packages/lucide-figma/src/components/Menu/Menu.tsx b/packages/lucide-figma/src/components/Menu/Menu.tsx deleted file mode 100644 index 42431154321..00000000000 --- a/packages/lucide-figma/src/components/Menu/Menu.tsx +++ /dev/null @@ -1,26 +0,0 @@ -import { useState } from 'react'; -import './Menu.scss'; - -interface MenuProps { - page: string; - setPage: (page: string) => void; -} - -const menuItems = ['icons', 'info']; - -const Menu = ({ page, setPage = (page) => {} }: MenuProps) => { - return ( - - ); -}; - -export default Menu; diff --git a/packages/lucide-figma/src/components/Menu/index.ts b/packages/lucide-figma/src/components/Menu/index.ts deleted file mode 100644 index a6de24ca955..00000000000 --- a/packages/lucide-figma/src/components/Menu/index.ts +++ /dev/null @@ -1 +0,0 @@ -export { default } from './Menu'; diff --git a/packages/lucide-figma/src/components/Navigation/index.ts b/packages/lucide-figma/src/components/Navigation/index.ts deleted file mode 100644 index e69de29bb2d..00000000000 diff --git a/packages/lucide-figma/src/components/SearchInput/SearchInput.scss b/packages/lucide-figma/src/components/SearchInput/SearchInput.scss deleted file mode 100644 index e6acd487a10..00000000000 --- a/packages/lucide-figma/src/components/SearchInput/SearchInput.scss +++ /dev/null @@ -1,19 +0,0 @@ -.search-input { - position: relative; - display: flex; - align-items: center; - - .icon { - position: absolute; - left: 16px; - } - input { - width: 100%; - height: 40px; - padding: 0 16px 0 36px; - font-family: inherit; - font-size: 11px; - border: 0; - outline: 0; - } -} diff --git a/packages/lucide-figma/src/components/SearchInput/SearchInput.tsx b/packages/lucide-figma/src/components/SearchInput/SearchInput.tsx deleted file mode 100644 index d895c657cb2..00000000000 --- a/packages/lucide-figma/src/components/SearchInput/SearchInput.tsx +++ /dev/null @@ -1,31 +0,0 @@ -import './SearchInput.scss'; -import { ChangeEvent } from 'react'; -import SearchIcon from '../icons/SearchIcon'; - -interface SearchInputProps extends React.HTMLProps { - value: string; - iconCount: number; - onChange: (event: ChangeEvent) => void; - placeholder: string; -} - -function SearchInput({ value, onChange, placeholder, className, ...props }: SearchInputProps) { - return ( -
- - -
- ); -} - -export default SearchInput; diff --git a/packages/lucide-figma/src/components/SearchInput/index.ts b/packages/lucide-figma/src/components/SearchInput/index.ts deleted file mode 100644 index 7e9c713e80a..00000000000 --- a/packages/lucide-figma/src/components/SearchInput/index.ts +++ /dev/null @@ -1 +0,0 @@ -export { default } from './SearchInput'; diff --git a/packages/lucide-figma/src/components/Skeleton/Skeleton.scss b/packages/lucide-figma/src/components/Skeleton/Skeleton.scss deleted file mode 100644 index 080e169a8ac..00000000000 --- a/packages/lucide-figma/src/components/Skeleton/Skeleton.scss +++ /dev/null @@ -1,21 +0,0 @@ -@keyframes load { - to { - background-position: 200% 0; - } -} - -.skeleton { - --block: rgba(0, 0, 0, 0.06); - --loader: hsl(0 0% 89%); - - background: - linear-gradient(-75deg, transparent 40%, var(--loader), transparent 60%) 0 0 / 200% 100%, - var(--block); - - border-radius: calc(var(--padding) * 0.5); - animation: load 2s infinite linear; - background-attachment: fixed; - width: 40px; - height: 40px; - border-radius: 2px; -} diff --git a/packages/lucide-figma/src/components/Skeleton/Skeleton.tsx b/packages/lucide-figma/src/components/Skeleton/Skeleton.tsx deleted file mode 100644 index e803b9adb26..00000000000 --- a/packages/lucide-figma/src/components/Skeleton/Skeleton.tsx +++ /dev/null @@ -1,13 +0,0 @@ -import './Skeleton.scss'; - -const Skeleton = () => { - return ( - <> - {Array.from({ length: 48 }, () => ( -
- ))} - - ); -}; - -export default Skeleton; diff --git a/packages/lucide-figma/src/components/icons/SearchIcon.tsx b/packages/lucide-figma/src/components/icons/SearchIcon.tsx deleted file mode 100644 index a072d05ad26..00000000000 --- a/packages/lucide-figma/src/components/icons/SearchIcon.tsx +++ /dev/null @@ -1,21 +0,0 @@ -import { createElement, forwardRef } from 'react'; - -const SearchIcon = (props: any) => ( - - - -); - -export default SearchIcon; diff --git a/packages/lucide-figma/src/helpers/createIconComponent.ts b/packages/lucide-figma/src/helpers/createIconComponent.ts deleted file mode 100644 index 89456f32af4..00000000000 --- a/packages/lucide-figma/src/helpers/createIconComponent.ts +++ /dev/null @@ -1,50 +0,0 @@ -import { forwardRef, createElement, SVGProps } from 'react'; -import { IconNode } from '../api/fetchIcons'; -import { toKebabCase } from '@lucide/shared'; - -const defaultAttributes = { - xmlns: 'http://www.w3.org/2000/svg', - width: 24, - height: 24, - viewBox: '0 0 24 24', - fill: 'none', - stroke: 'currentColor', - strokeWidth: 2, - strokeLinecap: 'round', - strokeLinejoin: 'round', -}; - -export interface LucideProps extends Partial> { - size?: string | number; -} - -const createIconComponent = (iconName: string, iconNode: IconNode) => { - const Component = forwardRef( - ({ color = 'currentColor', size = 24, strokeWidth = 2, children, ...rest }, ref) => - createElement( - 'svg', - { - ref, - ...defaultAttributes, - width: size, - height: size, - stroke: color, - strokeWidth, - className: `lucide lucide-${toKebabCase(iconName)}`, - ...rest, - }, - [ - ...iconNode.map(([tag, attrs]: [tag: string, attrs: SVGProps]) => - createElement(tag, attrs), - ), - ...([children] || []), - ], - ), - ); - - Component.displayName = `${iconName}`; - - return Component; -}; - -export default createIconComponent; diff --git a/packages/lucide-figma/src/helpers/filterIcons.ts b/packages/lucide-figma/src/helpers/filterIcons.ts deleted file mode 100644 index b76504fad50..00000000000 --- a/packages/lucide-figma/src/helpers/filterIcons.ts +++ /dev/null @@ -1,9 +0,0 @@ -import { Tags } from '../api/fetchIcons'; -import { Icon } from '../hooks/useSearch'; - -export default (icons: Icon[], tags: Tags, query: string) => - icons.filter(([name]: Icon) => { - const iconTags = tags && tags[name] ? tags[name] : []; - - return [name, ...iconTags].some((item: string) => item.toLowerCase().includes(query)); - }); diff --git a/packages/lucide-figma/src/helpers/iconNodeToSvg.ts b/packages/lucide-figma/src/helpers/iconNodeToSvg.ts deleted file mode 100644 index 66a72f927c4..00000000000 --- a/packages/lucide-figma/src/helpers/iconNodeToSvg.ts +++ /dev/null @@ -1,11 +0,0 @@ -import { createElement } from 'react'; -import { renderToString } from 'react-dom/server'; -import { IconNode } from '../api/fetchIcons'; -import createIconComponent from './createIconComponent'; - -const iconNodeToSvg = (iconName: string, iconNode: IconNode) => { - const IconComponent = createIconComponent(iconName, iconNode); - return renderToString(createElement(IconComponent)); -}; - -export default iconNodeToSvg; diff --git a/packages/lucide-figma/src/helpers/naming.ts b/packages/lucide-figma/src/helpers/naming.ts deleted file mode 100644 index b43bfe26e53..00000000000 --- a/packages/lucide-figma/src/helpers/naming.ts +++ /dev/null @@ -1,20 +0,0 @@ -/** - * Converts string to camelcase - * - * @param {string} string - */ -export const toCamelCase = (string: string) => - string.replace(/^([A-Z])|[\s-_]+(\w)/g, (match, p1, p2) => - p2 ? p2.toUpperCase() : p1.toLowerCase(), - ); - -/** - * Converts string to PascalCase - * - * @param {string} string - */ -export const toPascalCase = (string: string) => { - const camelCase = toCamelCase(string); - - return camelCase.charAt(0).toUpperCase() + camelCase.slice(1); -}; diff --git a/packages/lucide-figma/src/hooks/useSearch.tsx b/packages/lucide-figma/src/hooks/useSearch.tsx deleted file mode 100644 index 109482f2dcc..00000000000 --- a/packages/lucide-figma/src/hooks/useSearch.tsx +++ /dev/null @@ -1,14 +0,0 @@ -import { IconName, IconNode, Tags } from '../api/fetchIcons'; -import filterIcons from '../helpers/filterIcons'; - -export type Icon = [name: IconName, iconNode: IconNode]; - -function useSearch(icons: Icon[], tags: Tags, query: string) { - if (!query) return icons; - - const searchString = query.toLowerCase(); - - return filterIcons(icons, tags, searchString); -} - -export default useSearch; diff --git a/packages/lucide-figma/src/icons/search-large.svg b/packages/lucide-figma/src/icons/search-large.svg deleted file mode 100644 index 6e6a12b342f..00000000000 --- a/packages/lucide-figma/src/icons/search-large.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/packages/lucide-figma/src/icons/search.svg b/packages/lucide-figma/src/icons/search.svg deleted file mode 100644 index e6473bfb789..00000000000 --- a/packages/lucide-figma/src/icons/search.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/packages/lucide-figma/src/interface/interface.html b/packages/lucide-figma/src/interface/interface.html deleted file mode 100644 index cf1e5d1e83e..00000000000 --- a/packages/lucide-figma/src/interface/interface.html +++ /dev/null @@ -1,6 +0,0 @@ - - -
diff --git a/packages/lucide-figma/src/interface/interface.scss b/packages/lucide-figma/src/interface/interface.scss deleted file mode 100644 index 35ad229b9f9..00000000000 --- a/packages/lucide-figma/src/interface/interface.scss +++ /dev/null @@ -1,103 +0,0 @@ -@font-face { - font-family: Inter; - font-style: normal; - font-weight: 400; - font-display: swap; - src: - url('https://rsms.me/inter/font-files/Inter-Regular.woff2?v=3.9') format('woff2'), - url('https://rsms.me/inter/font-files/Inter-Regular.woff?v=3.9') format('woff'); -} - -@font-face { - font-family: Inter; - font-style: normal; - font-weight: 500; - font-display: swap; - src: - url('https://rsms.me/inter/font-files/Inter-Medium.woff2?v=3.9') format('woff2'), - url('https://rsms.me/inter/font-files/Inter-Medium.woff?v=3.9') format('woff'); -} - -:root { - --color-blue: #18a0fb; - --color-black: #333; -} - -body { - font-family: Inter, sans-serif; - font-size: 11px; - margin: 0; -} - -.search-input { - position: sticky; - top: 0; - border-bottom: 1px solid #e5e5e5; - backface-visibility: hidden; -} - -main { - padding-bottom: 8px; -} - -.icon-grid { - display: grid; - grid-template-columns: repeat(6, 1fr); - grid-gap: 8px; -} - -footer { - margin-top: 8px; - padding: 8px; - font-size: 12px; - color: rgba(0, 0, 0, 0.5); - - .footer-link { - color: inherit; - } -} - -.floating { - position: absolute; - bottom: -10px; - left: 0; - padding: 10px; - background: blue; -} - -.info-page { - display: flex; - flex-direction: column; - align-items: center; - justify-content: center; - padding: 24px; -} - -.lucide-logo { - width: 160px; -} - -.version { - margin-top: 8px; - padding: 8px; - font-weight: bold; - font-size: 18px; - color: rgba(0, 0, 0, 0.5); -} - -.link-list { - width: 160px; - margin: 0 auto; - padding-top: 24px; -} - -.info-link { - color: var(--color-blue); - display: block; - padding: 2px 0; - text-decoration: none; - - &:hover { - text-decoration: underline; - } -} diff --git a/packages/lucide-figma/src/interface/interface.tsx b/packages/lucide-figma/src/interface/interface.tsx deleted file mode 100644 index 1271ea2f088..00000000000 --- a/packages/lucide-figma/src/interface/interface.tsx +++ /dev/null @@ -1,57 +0,0 @@ -import { useEffect, useMemo, useState } from 'react'; -import ReactDOM from 'react-dom'; -import * as views from '../views'; - -type Views = typeof views; - -import useSearch, { Icon } from '../hooks/useSearch'; - -import { getIcons, iconFetchListener, LucideIcons } from '../api/fetchIcons'; -import './interface.scss'; -import Menu from '../components/Menu'; - -function App() { - const [page, setPage] = useState('icons'); - const [query, setQuery] = useState(''); - const [icons, setIcons] = useState([]); - const [tags, setTags] = useState({}); - const [version, setVersion] = useState(''); - - const searchResults = useMemo(() => useSearch(icons, tags, query), [icons, query]); - - const handleFetchResponse = async (lucideIcons: LucideIcons) => { - const icons = Object.entries(lucideIcons.iconNodes); - - setIcons(icons); - setTags(lucideIcons.tags); - setVersion(lucideIcons.version); - }; - - useEffect(() => { - const removeListener = iconFetchListener(handleFetchResponse); - - return removeListener; - }, []); - - const View = views?.[page as keyof Views] ?? views.icons; - - return ( -
- - -
- ); -} - -ReactDOM.render(, document.getElementById('root')); diff --git a/packages/lucide-figma/src/main.ts b/packages/lucide-figma/src/main.ts deleted file mode 100644 index 7815642f194..00000000000 --- a/packages/lucide-figma/src/main.ts +++ /dev/null @@ -1,149 +0,0 @@ -import type { LucideIcons } from './api/fetchIcons'; -import filterIcons from './helpers/filterIcons'; - -figma.showUI(__uiFiles__.worker, { visible: false }); - -let cachedIcons: LucideIcons; - -type InsertableNodes = FrameNode | GroupNode; - -function isInsertableNode(node: SceneNode): node is InsertableNodes { - return ['FRAME', 'GROUP'].includes(node.type); -} - -const setResults = ({ - result, - query, - lucideIcons, -}: { - result: SuggestionResults; - query: string; - lucideIcons: LucideIcons; -}) => { - const icons = Object.entries(lucideIcons.iconNodes); - - const suggestions = filterIcons(icons, lucideIcons.tags, query.toLowerCase()).map(([name]) => ({ - name, - icon: lucideIcons.svgs[name], - })); - - result.setSuggestions(suggestions); -}; - -// const styles = figma.getLocalPaintStyles(); -// const styleNames = styles.map((style) => style.name); -// console.log(styleNames); - -figma.parameters.on('input', async ({ parameters, key, query, result }) => { - if (key === 'icon-name') { - cachedIcons = await figma.clientStorage.getAsync(`lucide-icons`); - - if (cachedIcons && cachedIcons.iconNodes && cachedIcons.tags) { - setResults({ result, query, lucideIcons: cachedIcons }); - } - } - if (key === 'size') { - const iconSizes = [24, 36, 48, 72]; - result.setSuggestions( - iconSizes.map((size) => ({ - name: size.toString(), - data: size, - })), - ); - } -}); - -const drawIcon = ({ icon: { name, svg, size } }: any) => { - const min = 0; - const max = 100; - const randomPosition = () => Math.floor(Math.random() * (max - min + 1) + min); - - const icon = figma.createNodeFromSvg(svg); - icon.setPluginData('isLucideIcon', 'true'); - icon.setPluginData('iconName', name); - - const pluginData = icon.getPluginData('isLucideIcon'); - - icon.name = name; - icon.x = Math.round(figma.viewport.center.x + randomPosition()); - icon.y = Math.round(figma.viewport.center.y + randomPosition()); - - if (figma.currentPage.selection.length) { - let currentSelection = figma.currentPage.selection[0]; - const isLucideIcon = currentSelection.getPluginData('isLucideIcon'); - - // if(isLucideIcon && currentSelection?.parent) { - // return - // // currentSelection = currentSelection.parent as SceneNode - // } - - if (!isLucideIcon && isInsertableNode(currentSelection)) { - icon.x = currentSelection.type === 'GROUP' ? currentSelection.x : 0; - icon.y = currentSelection.type === 'GROUP' ? currentSelection.y : 0; - - currentSelection.appendChild(icon); - } - } - - figma.currentPage.selection = [icon]; - - // lock children - // icon.children.forEach((vectorNode, key) => { - // icon.children[key].locked = true - // }); -}; - -const setCachedIcons = async (pluginMessage: any) => { - if (pluginMessage.lucideIcons) { - await figma.clientStorage.setAsync(`lucide-icons`, pluginMessage.lucideIcons); - } -}; - -const getCachedIcons = async () => { - cachedIcons = await figma.clientStorage.getAsync(`lucide-icons`); - - const response = { type: 'cachedIcons' }; - - if (cachedIcons) { - Object.assign(response, { cachedIcons }); - } - - figma.ui.postMessage(response); -}; - -getCachedIcons(); - -figma.ui.onmessage = (event) => { - switch (event.type) { - case 'drawIcon': - drawIcon(event); - break; - case 'getCachedIcons': - getCachedIcons(); - break; - - case 'setCachedIcons': - setCachedIcons(event); - break; - - case 'close': - figma.closePlugin(); - break; - - default: - break; - } -}; - -figma.on('run', (event) => { - if (event.parameters) { - figma.ui.postMessage({ - type: 'getSvg', - iconName: event.parameters['icon-name'], - size: event.parameters['size'], - cachedIcons, - }); - } else { - figma.showUI(__uiFiles__.interface, { width: 300, height: 400 }); - } -}); diff --git a/packages/lucide-figma/src/theme.ts b/packages/lucide-figma/src/theme.ts deleted file mode 100644 index 7363c7d19ed..00000000000 --- a/packages/lucide-figma/src/theme.ts +++ /dev/null @@ -1,8 +0,0 @@ -export default { - space: [0, 4, 8, 12, 16], - fontSizes: [12, 14, 16], - colors: { - blue: '#18a0fb', - }, - radii: [0, 2], -}; diff --git a/packages/lucide-figma/src/views/Icons.tsx b/packages/lucide-figma/src/views/Icons.tsx deleted file mode 100644 index 2248b68d3e5..00000000000 --- a/packages/lucide-figma/src/views/Icons.tsx +++ /dev/null @@ -1,52 +0,0 @@ -import IconButton from '../components/IconButton'; -import SearchInput from '../components/SearchInput'; -import createIconComponent from '../helpers/createIconComponent'; -import { Icon } from '../hooks/useSearch'; -import Skeleton from '../components/Skeleton/Skeleton'; - -interface PageProps { - query: string; - setQuery: (query: string) => void; - searchResults: Icon[]; - icons: Icon[]; - version: string; -} - -const Icons = ({ query, setQuery, searchResults, icons, version }: PageProps) => { - return ( - <> - setQuery(event.target.value)} - placeholder={icons.length ? `Search ${icons.length} icons` : 'Loading icons ..'} - /> -
-
- {icons.length ? ( - searchResults.map(([name, iconNode]: any) => ( - - )) - ) : ( - - )} -
- -
- - ); -}; - -export default Icons; diff --git a/packages/lucide-figma/src/views/Info.tsx b/packages/lucide-figma/src/views/Info.tsx deleted file mode 100644 index fc41474a664..00000000000 --- a/packages/lucide-figma/src/views/Info.tsx +++ /dev/null @@ -1,70 +0,0 @@ -import { SyntheticEvent } from 'react'; - -interface PageProps { - version: string; -} - -const Info = ({ version }: PageProps) => { - const menuItems = [ - { - name: 'Report a bug', - url: 'https://github.com/lucide-icons/lucide/issues', - }, - { - name: 'Contribute an icon', - url: 'https://github.com/lucide-icons/lucide/blob/main/CONTRIBUTING.md', - }, - { - name: 'Website', - url: 'https://lucide.dev', - }, - { - name: 'Repository', - url: 'https://github.com/lucide-icons/lucide', - }, - { - name: 'License', - url: 'https://lucide.dev/license', - }, - { - name: 'Community Page', - url: 'https://www.figma.com/community/plugin/939567362549682242/Lucide-Icons', - }, - { - name: 'Supported Frameworks', - url: 'https://lucide.dev/packages', - }, - ]; - - const onClick = (url: string) => (event: SyntheticEvent) => { - event.preventDefault(); - - window.open(url, '_blank'); - }; - - return ( -
- Lucide Logo -

v{version}

-
- {menuItems.map(({ name, url }) => ( - - {name} - - ))} -
-
- ); -}; - -export default Info; diff --git a/packages/lucide-figma/src/views/index.ts b/packages/lucide-figma/src/views/index.ts deleted file mode 100644 index daed83c5eef..00000000000 --- a/packages/lucide-figma/src/views/index.ts +++ /dev/null @@ -1,2 +0,0 @@ -export { default as icons } from './Icons'; -export { default as info } from './Info'; diff --git a/packages/lucide-figma/src/worker/worker.html b/packages/lucide-figma/src/worker/worker.html deleted file mode 100644 index 1a11e9f5cdb..00000000000 --- a/packages/lucide-figma/src/worker/worker.html +++ /dev/null @@ -1,4 +0,0 @@ - diff --git a/packages/lucide-figma/src/worker/worker.ts b/packages/lucide-figma/src/worker/worker.ts deleted file mode 100644 index 97ce86ea76f..00000000000 --- a/packages/lucide-figma/src/worker/worker.ts +++ /dev/null @@ -1,85 +0,0 @@ -import { fetchIcons, LucideIcons } from '../api/fetchIcons'; -import createIconComponent from '../helpers/createIconComponent'; -import { renderToString } from 'react-dom/server'; -import { createElement } from 'react'; - -const getLatestIcons = async ({ cachedIcons }: any) => { - const lucideIcons = await fetchIcons(cachedIcons); - - parent.postMessage( - { - pluginMessage: { - type: 'latestIcons', - lucideIcons, - }, - }, - '*', - ); -}; - -const getSvg = async ({ - cachedIcons, - iconName, - size = 24, -}: { - cachedIcons: LucideIcons; - iconName: string; - size: number; -}) => { - if (!cachedIcons) { - return; - } - - console.log(iconName, size); - - const iconNode = cachedIcons.iconNodes[iconName]; - - if (iconNode) { - const IconComponent = createIconComponent(iconName, iconNode); - const svg = renderToString(createElement(IconComponent, { size })); - - parent.postMessage( - { - pluginMessage: { - type: 'drawIcon', - icon: { - name: iconName, - svg, - size, - }, - }, - }, - '*', - ); - - parent.postMessage( - { - pluginMessage: { - type: 'close', - }, - }, - '*', - ); - } -}; - -window.onmessage = async (event) => { - if (!event?.data?.pluginMessage) { - return; - } - - const { pluginMessage } = event.data; - - switch (pluginMessage.type) { - case 'getLatestIcons': - getLatestIcons(pluginMessage); - break; - - case 'getSvg': - getSvg(pluginMessage); - break; - - default: - break; - } -}; diff --git a/packages/lucide-figma/tsconfig.json b/packages/lucide-figma/tsconfig.json deleted file mode 100644 index c03a4f8d61e..00000000000 --- a/packages/lucide-figma/tsconfig.json +++ /dev/null @@ -1,21 +0,0 @@ -{ - "compilerOptions": { - "target": "ESNext", - "useDefineForClassFields": true, - "lib": ["DOM", "DOM.Iterable", "ESNext"], - "allowJs": true, - "skipLibCheck": true, - "esModuleInterop": false, - "allowSyntheticDefaultImports": true, - "strict": true, - "forceConsistentCasingInFileNames": true, - "module": "ESNext", - "moduleResolution": "Node", - "resolveJsonModule": true, - "isolatedModules": false, - "noEmit": true, - "jsx": "react-jsx", - "typeRoots": ["./node_modules/@types", "./node_modules/@figma"], - }, - "include": ["src"], -} diff --git a/packages/lucide-figma/vite.config.ts b/packages/lucide-figma/vite.config.ts deleted file mode 100644 index e590530739b..00000000000 --- a/packages/lucide-figma/vite.config.ts +++ /dev/null @@ -1,40 +0,0 @@ -import { defineConfig } from 'vite'; -import react from '@vitejs/plugin-react'; -import { viteSingleFile } from 'vite-plugin-singlefile'; -import { resolve } from 'path'; - -const entries = { - main: resolve(__dirname, 'src/main.ts'), - interface: resolve(__dirname, './src/interface/interface.html'), - worker: resolve(__dirname, './src/worker/worker.html'), -}; - -const input = {}; - -if (process.env['INPUT']) { - const entry = process.env['INPUT']; - input[entry] = entries[entry]; -} - -// https://vitejs.dev/config/ -export default defineConfig({ - plugins: [react(), viteSingleFile()], - build: { - target: 'esnext', - assetsInlineLimit: 100000000, - chunkSizeWarningLimit: 100000000, - cssCodeSplit: false, - brotliSize: false, - emptyOutDir: false, - rollupOptions: { - input, - inlineDynamicImports: true, - output: { - manualChunks: (chunk) => 'all.js', - entryFileNames: `assets/[name].js`, - chunkFileNames: `assets/[name].js`, - assetFileNames: `assets/[name].[ext]`, - }, - }, - }, -}); diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 50e70001101..53c29d77a44 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -337,43 +337,6 @@ importers: version: 0.11.8 publishDirectory: dist - packages/lucide-figma: - dependencies: - minimist: - specifier: ^1.2.6 - version: 1.2.8 - react: - specifier: ^17.0.0 - version: 17.0.2 - react-dom: - specifier: ^17.0.0 - version: 17.0.2(react@17.0.2) - devDependencies: - '@figma/plugin-typings': - specifier: ^1.36.0 - version: 1.72.0 - '@lucide/shared': - specifier: workspace:* - version: link:../shared - '@types/react': - specifier: ^17.0.0 - version: 17.0.62 - '@types/react-dom': - specifier: ^17.0.0 - version: 17.0.20 - '@vitejs/plugin-react': - specifier: ^1.0.0 - version: 1.3.2 - typescript: - specifier: ^4.3.2 - version: 4.9.5 - vite: - specifier: 5.0.13 - version: 5.0.13 - vite-plugin-singlefile: - specifier: ^0.5.1 - version: 0.5.1(vite@5.0.13) - packages/lucide-preact: devDependencies: '@lucide/build-icons': @@ -2458,16 +2421,6 @@ packages: '@babel/helper-plugin-utils': 7.22.5 dev: true - /@babel/plugin-syntax-jsx@7.23.3(@babel/core@7.22.9): - resolution: {integrity: sha512-EB2MELswq55OHUoRZLGg/zC7QWUKfNLpE57m/S2yr1uEneIgsTgrSzXP3NXEsMkVn76OlaVVnzN+ugObuYGwhg==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.22.9 - '@babel/helper-plugin-utils': 7.22.5 - dev: true - /@babel/plugin-syntax-jsx@7.23.3(@babel/core@7.23.9): resolution: {integrity: sha512-EB2MELswq55OHUoRZLGg/zC7QWUKfNLpE57m/S2yr1uEneIgsTgrSzXP3NXEsMkVn76OlaVVnzN+ugObuYGwhg==} engines: {node: '>=6.9.0'} @@ -3499,16 +3452,6 @@ packages: '@babel/helper-plugin-utils': 7.22.5 dev: true - /@babel/plugin-transform-react-jsx-development@7.22.5(@babel/core@7.22.9): - resolution: {integrity: sha512-bDhuzwWMuInwCYeDeMzyi7TaBgRQei6DqxhbyniL7/VG4RSS7HtSL2QbY4eESy1KJqlWt8g3xeEBGPuo+XqC8A==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.22.9 - '@babel/plugin-transform-react-jsx': 7.22.5(@babel/core@7.22.9) - dev: true - /@babel/plugin-transform-react-jsx-development@7.22.5(@babel/core@7.23.9): resolution: {integrity: sha512-bDhuzwWMuInwCYeDeMzyi7TaBgRQei6DqxhbyniL7/VG4RSS7HtSL2QbY4eESy1KJqlWt8g3xeEBGPuo+XqC8A==} engines: {node: '>=6.9.0'} @@ -3519,16 +3462,6 @@ packages: '@babel/plugin-transform-react-jsx': 7.22.5(@babel/core@7.23.9) dev: true - /@babel/plugin-transform-react-jsx-self@7.22.5(@babel/core@7.22.9): - resolution: {integrity: sha512-nTh2ogNUtxbiSbxaT4Ds6aXnXEipHweN9YRgOX/oNXdf0cCrGn/+2LozFa3lnPV5D90MkjhgckCPBrsoSc1a7g==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.22.9 - '@babel/helper-plugin-utils': 7.22.5 - dev: true - /@babel/plugin-transform-react-jsx-self@7.22.5(@babel/core@7.23.9): resolution: {integrity: sha512-nTh2ogNUtxbiSbxaT4Ds6aXnXEipHweN9YRgOX/oNXdf0cCrGn/+2LozFa3lnPV5D90MkjhgckCPBrsoSc1a7g==} engines: {node: '>=6.9.0'} @@ -3549,16 +3482,6 @@ packages: '@babel/helper-plugin-utils': 7.22.5 dev: true - /@babel/plugin-transform-react-jsx-source@7.22.5(@babel/core@7.22.9): - resolution: {integrity: sha512-yIiRO6yobeEIaI0RTbIr8iAK9FcBHLtZq0S89ZPjDLQXBA4xvghaKqI0etp/tF3htTM0sazJKKLz9oEiGRtu7w==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.22.9 - '@babel/helper-plugin-utils': 7.22.5 - dev: true - /@babel/plugin-transform-react-jsx-source@7.22.5(@babel/core@7.23.9): resolution: {integrity: sha512-yIiRO6yobeEIaI0RTbIr8iAK9FcBHLtZq0S89ZPjDLQXBA4xvghaKqI0etp/tF3htTM0sazJKKLz9oEiGRtu7w==} engines: {node: '>=6.9.0'} @@ -3579,20 +3502,6 @@ packages: '@babel/helper-plugin-utils': 7.22.5 dev: true - /@babel/plugin-transform-react-jsx@7.22.5(@babel/core@7.22.9): - resolution: {integrity: sha512-rog5gZaVbUip5iWDMTYbVM15XQq+RkUKhET/IHR6oizR+JEoN6CAfTTuHcK4vwUyzca30qqHqEpzBOnaRMWYMA==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.22.9 - '@babel/helper-annotate-as-pure': 7.22.5 - '@babel/helper-module-imports': 7.22.15 - '@babel/helper-plugin-utils': 7.22.5 - '@babel/plugin-syntax-jsx': 7.23.3(@babel/core@7.22.9) - '@babel/types': 7.23.9 - dev: true - /@babel/plugin-transform-react-jsx@7.22.5(@babel/core@7.23.9): resolution: {integrity: sha512-rog5gZaVbUip5iWDMTYbVM15XQq+RkUKhET/IHR6oizR+JEoN6CAfTTuHcK4vwUyzca30qqHqEpzBOnaRMWYMA==} engines: {node: '>=6.9.0'} @@ -5086,10 +4995,6 @@ packages: engines: {node: '>=14'} dev: true - /@figma/plugin-typings@1.72.0: - resolution: {integrity: sha512-SRW8qQOLf/QOtgP7OsUfw4oD6Z+tbenLR2PgNXGSh2SJohcnucIEEc7An5Wd5qTl35xfC4TmZE0YpTGMknVpgw==} - dev: true - /@floating-ui/core@1.6.0: resolution: {integrity: sha512-PcF++MykgmTj3CIyOQbKA/hDzOAiqI3mhuoN44WRCopIs1sgoDoU4oty4Jtqaj/y3oDU6fnVSm4QG0a3t5i0+g==} dependencies: @@ -6972,21 +6877,6 @@ packages: rollup: 4.9.6 dev: true - /@rollup/plugin-node-resolve@11.2.1(rollup@2.79.1): - resolution: {integrity: sha512-yc2n43jcqVyGE2sqV5/YCmocy9ArjVAP/BeXyTtADTBBX6V0e5UMqwO8CdQ0kzjb6zu5P1qMzsScCMRvE9OlVg==} - engines: {node: '>= 10.0.0'} - peerDependencies: - rollup: ^1.20.0||^2.0.0 - dependencies: - '@rollup/pluginutils': 3.1.0(rollup@2.79.1) - '@types/resolve': 1.17.1 - builtin-modules: 3.3.0 - deepmerge: 4.3.1 - is-module: 1.0.0 - resolve: 1.22.8 - rollup: 2.79.1 - dev: true - /@rollup/plugin-node-resolve@13.3.0(rollup@2.79.1): resolution: {integrity: sha512-Lus8rbUo1eEcnS4yTFKLZrVumLPY+YayBdWXgFSHYhTT2iJbMhoaaBL3xl5NCdeRytErGr8tZ0L71BMRmnlwSw==} engines: {node: '>= 10.0.0'} @@ -7859,26 +7749,12 @@ packages: resolution: {integrity: sha512-EEhsLsD6UsDM1yFhAvy0Cjr6VwmpMWqFBCb9w07wVugF7w9nfajxLuVmngTIpgS6svCnm6Vaw+MZhoDCKnOfsw==} dev: true - /@types/react-dom@17.0.20: - resolution: {integrity: sha512-4pzIjSxDueZZ90F52mU3aPoogkHIoSIDG+oQ+wQK7Cy2B9S+MvOqY0uEA/qawKz381qrEDkvpwyt8Bm31I8sbA==} - dependencies: - '@types/react': 17.0.62 - dev: true - /@types/react-dom@18.2.7: resolution: {integrity: sha512-GRaAEriuT4zp9N4p1i8BDBYmEyfo+xQ3yHjJU4eiK5NDa1RmUZG+unZABUTK4/Ox/M+GaHwb6Ow8rUITrtjszA==} dependencies: '@types/react': 18.2.55 dev: true - /@types/react@17.0.62: - resolution: {integrity: sha512-eANCyz9DG8p/Vdhr0ZKST8JV12PhH2ACCDYlFw6DIO+D+ca+uP4jtEDEpVqXZrh/uZdXQGwk7whJa3ah5DtyLw==} - dependencies: - '@types/prop-types': 15.7.5 - '@types/scheduler': 0.16.3 - csstype: 3.1.2 - dev: true - /@types/react@18.2.17: resolution: {integrity: sha512-u+e7OlgPPh+aryjOm5UJMX32OvB2E3QASOAqVMY6Ahs90djagxwv2ya0IctglNbNTexC12qCSMZG47KPfy1hAA==} dependencies: @@ -8355,22 +8231,6 @@ packages: - supports-color dev: true - /@vitejs/plugin-react@1.3.2: - resolution: {integrity: sha512-aurBNmMo0kz1O4qRoY+FM4epSA39y3ShWGuqfLRA/3z0oEJAdtoSfgA3aO98/PCCHAqMaduLxIxErWrVKIFzXA==} - engines: {node: '>=12.0.0'} - dependencies: - '@babel/core': 7.22.9 - '@babel/plugin-transform-react-jsx': 7.22.5(@babel/core@7.22.9) - '@babel/plugin-transform-react-jsx-development': 7.22.5(@babel/core@7.22.9) - '@babel/plugin-transform-react-jsx-self': 7.22.5(@babel/core@7.22.9) - '@babel/plugin-transform-react-jsx-source': 7.22.5(@babel/core@7.22.9) - '@rollup/pluginutils': 4.2.1 - react-refresh: 0.13.0 - resolve: 1.22.3 - transitivePeerDependencies: - - supports-color - dev: true - /@vitejs/plugin-react@4.2.1(vite@5.0.13): resolution: {integrity: sha512-oojO9IDc4nCUUi8qIR11KoQm0XFFLIwsRBwHRR4d/88IWghn1y6ckz/bJ8GHDCsYEJee8mDzqtJxh15/cisJNQ==} engines: {node: ^14.18.0 || >=16.0.0} @@ -12223,12 +12083,6 @@ packages: '@esbuild/win32-ia32': 0.19.12 '@esbuild/win32-x64': 0.19.12 - /esbuild@0.9.7: - resolution: {integrity: sha512-VtUf6aQ89VTmMLKrWHYG50uByMF4JQlVysb8dmg6cOgW8JnFCipmz7p+HNBl+RR3LLCuBxFGVauAe2wfnF9bLg==} - hasBin: true - requiresBuild: true - dev: true - /escalade@3.1.1: resolution: {integrity: sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==} engines: {node: '>=6'} @@ -14760,11 +14614,6 @@ packages: '@sideway/pinpoint': 2.0.0 dev: true - /joycon@3.1.1: - resolution: {integrity: sha512-34wB/Y7MW7bzjKRjUKTa46I2Z7eV62Rkhva+KkopW7Qvv/OSWBqvkSY7vusOPrNuZcUG3tApvdVgNB8POj3SPw==} - engines: {node: '>=10'} - dev: true - /jpeg-js@0.4.4: resolution: {integrity: sha512-WZzeDOEtTOBK4Mdsar0IqEU5sMr3vSV2RqkAIzUEV2BHnUfKGyswWFPFwK5EeDo93K3FohSHbLAjj0s1Wzd+dg==} dev: false @@ -18494,17 +18343,6 @@ packages: - utf-8-validate dev: true - /react-dom@17.0.2(react@17.0.2): - resolution: {integrity: sha512-s4h96KtLDUQlsENhMn1ar8t2bEa+q/YAtj8pPPdIjPDGBDIVNsrD9aXNWqspUe6AzKCIG0C1HZZLqLV7qpOBGA==} - peerDependencies: - react: 17.0.2 - dependencies: - loose-envify: 1.4.0 - object-assign: 4.1.1 - react: 17.0.2 - scheduler: 0.20.2 - dev: false - /react-dom@18.2.0(react@18.2.0): resolution: {integrity: sha512-6IMTriUmvsjHUjNtEDudZfuDQUoWXVxKHhlEGSk81n4YFS+r/Kl99wXiwlVXtPBtJenozv2P+hxDsw9eA7Xo6g==} peerDependencies: @@ -18593,11 +18431,6 @@ packages: - utf-8-validate dev: true - /react-refresh@0.13.0: - resolution: {integrity: sha512-XP8A9BT0CpRBD+NYLLeIhld/RqG9+gktUjW1FkE+Vm7OCinbG1SshcK5tb9ls4kzvjZr9mOQc7HYgBngEyPAXg==} - engines: {node: '>=0.10.0'} - dev: true - /react-refresh@0.14.0: resolution: {integrity: sha512-wViHqhAd8OHeLS/IRMJjTSDHF3U9eWi62F/MledQGPdJGDhodXJ9PBLNGr6WWL7qlH12Mt3TyTpbS+hGXMjCzQ==} engines: {node: '>=0.10.0'} @@ -18613,14 +18446,6 @@ packages: react-is: 18.2.0 dev: true - /react@17.0.2: - resolution: {integrity: sha512-gnhPt75i/dq/z3/6q/0asP78D0u592D5L1pd7M8P+dck6Fu/jJeL6iVVK23fptSUZj8Vjf++7wXA8UNclGQcbA==} - engines: {node: '>=0.10.0'} - dependencies: - loose-envify: 1.4.0 - object-assign: 4.1.1 - dev: false - /react@18.2.0: resolution: {integrity: sha512-/3IjMdb2L9QbBdWiW5e3P2/npwMBaU9mHCSCUzNln0ZCYbcfTsGbTJrU/kGemdH2IWmB2ioZ+zkxtmq6g09fGQ==} engines: {node: '>=0.10.0'} @@ -18890,15 +18715,6 @@ packages: supports-preserve-symlinks-flag: 1.0.0 dev: true - /resolve@1.22.3: - resolution: {integrity: sha512-P8ur/gp/AmbEzjr729bZnLjXK5Z+4P0zhIJgBgzqRih7hL7BOukHGtSTA3ACMY467GRFz3duQsi0bDZdR7DKdw==} - hasBin: true - dependencies: - is-core-module: 2.13.1 - path-parse: 1.0.7 - supports-preserve-symlinks-flag: 1.0.0 - dev: true - /resolve@1.22.4: resolution: {integrity: sha512-PXNdCiPqDqeUou+w1C2eTQbNfxKSuMxqTCuvlmmMsk1NWHL5fRrhY6Pl0qEYYc6+QqGClco1Qj8XnjPego4wfg==} hasBin: true @@ -19013,20 +18829,6 @@ packages: '@babel/code-frame': 7.23.5 dev: true - /rollup-plugin-esbuild@3.0.4(esbuild@0.9.7)(rollup@2.79.1): - resolution: {integrity: sha512-Txe/qWTx4NykWLwHjQ8vxXB1Mh6nTWnk7nl9lTYBN0DKnbvnSz4u2qiLqceLMZXTk//iYP5jnxlBNciNBp57LQ==} - engines: {node: '>=12'} - peerDependencies: - esbuild: '>=0.9.0' - rollup: ^1.20.0 || ^2.0.0 - dependencies: - '@rollup/pluginutils': 4.2.1 - esbuild: 0.9.7 - joycon: 3.1.1 - jsonc-parser: 3.2.1 - rollup: 2.79.1 - dev: true - /rollup-plugin-esbuild@6.1.1(esbuild@0.19.12)(rollup@4.9.6): resolution: {integrity: sha512-CehMY9FAqJD5OUaE/Mi1r5z0kNeYxItmRO2zG4Qnv2qWKF09J2lTy5GUzjJR354ZPrLkCj4fiBN41lo8PzBUhw==} engines: {node: '>=14.18.0'} @@ -19317,13 +19119,6 @@ packages: xmlchars: 2.2.0 dev: true - /scheduler@0.20.2: - resolution: {integrity: sha512-2eWfGgAqqWFGqtdMmcL5zCMK1U8KlXv8SQFGglL3CEtd0aDVDWgeF/YoCmvln55m5zSk3J/20hTaSBeSObsQDQ==} - dependencies: - loose-envify: 1.4.0 - object-assign: 4.1.1 - dev: false - /scheduler@0.23.0: resolution: {integrity: sha512-CtuThmgHNg7zIZWAXi3AsyIzA3n4xx7aNyjwC2VJldO2LMVDhFK+63xGqq6CsJH4rTAt6/M+N4GhZiDYPx9eUw==} dependencies: @@ -21589,18 +21384,6 @@ packages: - terser dev: true - /vite-plugin-singlefile@0.5.1(vite@5.0.13): - resolution: {integrity: sha512-yA9lWd6bSet0Br4/s34YPNnVBlDl2MbxlHDRrLrBCncD7q+HO5GGsw29Ymp+ydZ3eb4UU2GECgX2MJZW+qnoeQ==} - peerDependencies: - vite: ^2.1.2 - dependencies: - '@rollup/plugin-node-resolve': 11.2.1(rollup@2.79.1) - esbuild: 0.9.7 - rollup: 2.79.1 - rollup-plugin-esbuild: 3.0.4(esbuild@0.9.7)(rollup@2.79.1) - vite: 5.0.13 - dev: true - /vite-plugin-solid@2.10.1(@testing-library/jest-dom@6.4.2)(solid-js@1.8.14)(vite@5.0.13): resolution: {integrity: sha512-kfVdNLWaJqaJVL52U6iCCKNW/nXE7bS1VVGOWPGllOkJfcNILymVSY0LCBLSnyy0iYnRtrXpiHm14rMuzeC7CA==} peerDependencies: From 5489dff9a1f2ae32e1b0348f8a329fa72db875f9 Mon Sep 17 00:00:00 2001 From: Eric Fennis Date: Fri, 19 Apr 2024 14:36:39 +0200 Subject: [PATCH 08/22] Rename helpers package --- docs/package.json | 2 +- docs/scripts/writeIconDetails.mjs | 2 +- docs/scripts/writeIconMetaIndex.mjs | 2 +- docs/scripts/writeIconNodes.mjs | 2 +- docs/scripts/writeIconRelatedIcons.mjs | 2 +- docs/scripts/writeReleaseMetadata.mjs | 2 +- docs/scripts/writeVercelOutput.mjs | 2 +- package.json | 2 +- packages/lucide-static/scripts/buildLib.mjs | 2 +- packages/lucide-static/scripts/generateIconNodes.mjs | 2 +- packages/lucide-static/scripts/generateSprite.mjs | 2 +- packages/lucide-static/scripts/readSvgs.mjs | 2 +- packages/lucide-svelte/scripts/appendBlockComments.mjs | 2 +- packages/lucide-svelte/scripts/buildTypes.mjs | 2 +- pnpm-lock.yaml | 6 +++--- scripts/addMissingIconJsonFiles.mjs | 2 +- scripts/checkIconsAndCategories.mjs | 2 +- scripts/generate/generateIcons.mjs | 2 +- scripts/generateChangedIconsCommentMarkup.mjs | 2 +- scripts/generateNextJSAliases.mjs | 2 +- scripts/migrateCategoriesToIcons.mjs | 2 +- scripts/migrateIconsToCategories.mjs | 2 +- scripts/migrateIconsToTags.mjs | 2 +- scripts/migrateTagsToIcons.mjs | 2 +- scripts/optimizeSvgs.mjs | 2 +- scripts/rename/renameIcon.mjs | 2 +- scripts/rename/renamePattern.mjs | 2 +- tools/build-helpers/package.json | 2 +- tools/build-icons/building/generateAliasesFile.mjs | 2 +- tools/build-icons/building/generateDynamicImports.mjs | 2 +- tools/build-icons/building/generateExportsFile.mjs | 2 +- tools/build-icons/building/generateIconFiles.mjs | 2 +- tools/build-icons/main.mjs | 2 +- tools/build-icons/package.json | 4 ++-- tools/build-icons/render/renderIconsObject.mjs | 2 +- tools/build-icons/utils/getAliases.mjs | 2 +- tools/build-icons/utils/getIconMetaData.mjs | 2 +- 37 files changed, 40 insertions(+), 40 deletions(-) diff --git a/docs/package.json b/docs/package.json index 957d579f6a2..c70c4bf0f06 100644 --- a/docs/package.json +++ b/docs/package.json @@ -25,7 +25,7 @@ "license": "ISC", "devDependencies": { "@lucide/build-icons": "workspace:*", - "@lucide/build-helpers": "workspace:*", + "@lucide/helpers": "workspace:*", "@lucide/shared": "workspace:*", "@rollup/plugin-replace": "^5.0.2", "@types/semver": "^7.5.3", diff --git a/docs/scripts/writeIconDetails.mjs b/docs/scripts/writeIconDetails.mjs index 95d3541f4fd..98bf03d04cb 100644 --- a/docs/scripts/writeIconDetails.mjs +++ b/docs/scripts/writeIconDetails.mjs @@ -1,6 +1,6 @@ import fs from 'fs'; import path from 'path'; -import { readSvgDirectory, toCamelCase } from '@lucide/build-helpers'; +import { readSvgDirectory, toCamelCase } from '@lucide/helpers'; const currentDir = process.cwd(); const ICONS_DIR = path.resolve(currentDir, '../icons'); diff --git a/docs/scripts/writeIconMetaIndex.mjs b/docs/scripts/writeIconMetaIndex.mjs index 06728d1c179..58f012f9d83 100644 --- a/docs/scripts/writeIconMetaIndex.mjs +++ b/docs/scripts/writeIconMetaIndex.mjs @@ -1,6 +1,6 @@ import fs from 'fs'; import path from 'path'; -import { readSvgDirectory, toCamelCase } from '@lucide/build-helpers'; +import { readSvgDirectory, toCamelCase } from '@lucide/helpers'; const currentDir = process.cwd(); const ICONS_DIR = path.resolve(currentDir, '../icons'); diff --git a/docs/scripts/writeIconNodes.mjs b/docs/scripts/writeIconNodes.mjs index 7ba2b3e24ee..477c9ce3bee 100644 --- a/docs/scripts/writeIconNodes.mjs +++ b/docs/scripts/writeIconNodes.mjs @@ -1,7 +1,7 @@ import fs from 'fs'; import path from 'path'; import { renderIconsObject } from '@lucide/build-icons'; -import { readSvgDirectory, toCamelCase } from '@lucide/build-helpers'; +import { readSvgDirectory, toCamelCase } from '@lucide/helpers'; const currentDir = process.cwd(); const ICONS_DIR = path.resolve(currentDir, '../icons'); diff --git a/docs/scripts/writeIconRelatedIcons.mjs b/docs/scripts/writeIconRelatedIcons.mjs index 10ca2a1a972..60771dfa43c 100644 --- a/docs/scripts/writeIconRelatedIcons.mjs +++ b/docs/scripts/writeIconRelatedIcons.mjs @@ -1,6 +1,6 @@ import fs from 'fs'; import path from 'path'; -import { readSvgDirectory } from '@lucide/build-helpers'; +import { readSvgDirectory } from '@lucide/helpers'; const currentDir = process.cwd(); const ICONS_DIR = path.resolve(currentDir, '../icons'); diff --git a/docs/scripts/writeReleaseMetadata.mjs b/docs/scripts/writeReleaseMetadata.mjs index 834351793ce..0fdf8edf962 100644 --- a/docs/scripts/writeReleaseMetadata.mjs +++ b/docs/scripts/writeReleaseMetadata.mjs @@ -3,7 +3,7 @@ import fs from 'fs'; import path from 'path'; import { simpleGit } from 'simple-git'; import semver from 'semver'; -import { readSvgDirectory } from '@lucide/build-helpers'; +import { readSvgDirectory } from '@lucide/helpers'; const DATE_OF_FORK = '2020-06-08T16:39:52+0100'; diff --git a/docs/scripts/writeVercelOutput.mjs b/docs/scripts/writeVercelOutput.mjs index a5bd59db460..7c6cc95a925 100644 --- a/docs/scripts/writeVercelOutput.mjs +++ b/docs/scripts/writeVercelOutput.mjs @@ -2,7 +2,7 @@ import path from 'path'; import fs from 'fs'; /* eslint-disable import/no-extraneous-dependencies */ import { getIconMetaData } from '@lucide/build-icons'; -import { getCurrentDirPath } from '@lucide/build-helpers'; +import { getCurrentDirPath } from '@lucide/helpers'; const currentDir = process.cwd(); const scriptDir = getCurrentDirPath(import.meta.url); diff --git a/package.json b/package.json index 8cd237f06fd..9e34eb86acf 100644 --- a/package.json +++ b/package.json @@ -41,7 +41,7 @@ }, "devDependencies": { "@lucide/build-icons": "workspace:*", - "@lucide/build-helpers": "workspace:*", + "@lucide/helpers": "workspace:*", "@html-eslint/eslint-plugin": "^0.19.1", "@html-eslint/parser": "^0.19.1", "@octokit/rest": "^19.0.13", diff --git a/packages/lucide-static/scripts/buildLib.mjs b/packages/lucide-static/scripts/buildLib.mjs index 40a27217f8c..8f35c4b5e4d 100644 --- a/packages/lucide-static/scripts/buildLib.mjs +++ b/packages/lucide-static/scripts/buildLib.mjs @@ -4,7 +4,7 @@ import path from 'path'; import getArgumentOptions from 'minimist'; import { parseSync } from 'svgson'; -import { readSvgDirectory, getCurrentDirPath } from '@lucide/build-helpers'; +import { readSvgDirectory, getCurrentDirPath } from '@lucide/helpers'; import readSvgs from './readSvgs.mjs'; import generateSprite from './generateSprite.mjs'; import generateIconNodes from './generateIconNodes.mjs'; diff --git a/packages/lucide-static/scripts/generateIconNodes.mjs b/packages/lucide-static/scripts/generateIconNodes.mjs index 861f97dd7f5..1cd8d16428f 100644 --- a/packages/lucide-static/scripts/generateIconNodes.mjs +++ b/packages/lucide-static/scripts/generateIconNodes.mjs @@ -1,4 +1,4 @@ -import { writeFile } from '@lucide/build-helpers'; +import { writeFile } from '@lucide/helpers'; export default function generateIconNodes(parsedSvgs, packageDir) { const iconNodes = parsedSvgs.reduce((acc, { name, parsedSvg }) => { diff --git a/packages/lucide-static/scripts/generateSprite.mjs b/packages/lucide-static/scripts/generateSprite.mjs index d8ebb56e277..e753c502804 100644 --- a/packages/lucide-static/scripts/generateSprite.mjs +++ b/packages/lucide-static/scripts/generateSprite.mjs @@ -1,7 +1,7 @@ /* eslint-disable import/no-extraneous-dependencies */ import { stringify } from 'svgson'; import { format } from 'prettier'; -import { appendFile } from '@lucide/build-helpers'; +import { appendFile } from '@lucide/helpers'; export default function generateSprite(svgs, packageDir, license) { const symbols = svgs.map(({ name, parsedSvg }) => ({ diff --git a/packages/lucide-static/scripts/readSvgs.mjs b/packages/lucide-static/scripts/readSvgs.mjs index e033563af64..8c0f4c1a006 100644 --- a/packages/lucide-static/scripts/readSvgs.mjs +++ b/packages/lucide-static/scripts/readSvgs.mjs @@ -1,6 +1,6 @@ /* eslint-disable import/no-extraneous-dependencies */ import { basename } from 'path'; -import { readSvg } from '@lucide/build-helpers'; +import { readSvg } from '@lucide/helpers'; /** * Build an object in the format: `{ : }`. diff --git a/packages/lucide-svelte/scripts/appendBlockComments.mjs b/packages/lucide-svelte/scripts/appendBlockComments.mjs index c09b75534b6..9a6de5a9ec2 100644 --- a/packages/lucide-svelte/scripts/appendBlockComments.mjs +++ b/packages/lucide-svelte/scripts/appendBlockComments.mjs @@ -1,7 +1,7 @@ import { lstatSync } from 'fs'; import { readdir, readFile, writeFile } from 'fs/promises'; import path from 'path'; -import { getCurrentDirPath } from '@lucide/build-helpers'; +import { getCurrentDirPath } from '@lucide/helpers'; import { getJSBanner } from './license.mjs'; const currentDir = getCurrentDirPath(import.meta.url); diff --git a/packages/lucide-svelte/scripts/buildTypes.mjs b/packages/lucide-svelte/scripts/buildTypes.mjs index d877a5e3486..b63d40f0adb 100644 --- a/packages/lucide-svelte/scripts/buildTypes.mjs +++ b/packages/lucide-svelte/scripts/buildTypes.mjs @@ -7,7 +7,7 @@ import { resetFile, toPascalCase, getCurrentDirPath, -} from '@lucide/build-helpers'; +} from '@lucide/helpers'; const currentDir = getCurrentDirPath(import.meta.url); const targetDirectory = path.join(currentDir, '../dist'); diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 53c29d77a44..9a4b363f011 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -16,7 +16,7 @@ importers: '@html-eslint/parser': specifier: ^0.19.1 version: 0.19.1 - '@lucide/build-helpers': + '@lucide/helpers': specifier: workspace:* version: link:tools/build-helpers '@lucide/build-icons': @@ -167,7 +167,7 @@ importers: specifier: ^3.4.13 version: 3.4.18(typescript@4.9.5) devDependencies: - '@lucide/build-helpers': + '@lucide/helpers': specifier: workspace:* version: link:../tools/build-helpers '@lucide/build-icons': @@ -703,7 +703,7 @@ importers: tools/build-icons: dependencies: - '@lucide/build-helpers': + '@lucide/helpers': specifier: ^1.0.0 version: link:../build-helpers minimist: diff --git a/scripts/addMissingIconJsonFiles.mjs b/scripts/addMissingIconJsonFiles.mjs index 422d410b22d..aba7df8c0d4 100644 --- a/scripts/addMissingIconJsonFiles.mjs +++ b/scripts/addMissingIconJsonFiles.mjs @@ -1,5 +1,5 @@ import path from 'path'; -import { getCurrentDirPath, readAllMetadata, readSvgDirectory, writeFile } from '@lucide/build-helpers'; +import { getCurrentDirPath, readAllMetadata, readSvgDirectory, writeFile } from '@lucide/helpers'; const currentDir = getCurrentDirPath(import.meta.url); const ICONS_DIR = path.resolve(currentDir, '../icons'); diff --git a/scripts/checkIconsAndCategories.mjs b/scripts/checkIconsAndCategories.mjs index 0c1eabf8efa..0e24d8285f7 100644 --- a/scripts/checkIconsAndCategories.mjs +++ b/scripts/checkIconsAndCategories.mjs @@ -1,5 +1,5 @@ import path from 'path'; -import { readSvgDirectory, getCurrentDirPath, readAllMetadata } from '@lucide/build-helpers'; +import { readSvgDirectory, getCurrentDirPath, readAllMetadata } from '@lucide/helpers'; const currentDir = getCurrentDirPath(import.meta.url); const ICONS_DIR = path.resolve(currentDir, '../icons'); diff --git a/scripts/generate/generateIcons.mjs b/scripts/generate/generateIcons.mjs index 50ecd79e71b..a8f9d3637a1 100644 --- a/scripts/generate/generateIcons.mjs +++ b/scripts/generate/generateIcons.mjs @@ -1,5 +1,5 @@ import path from 'path'; -import { getCurrentDirPath, writeFileIfNotExists } from "@lucide/build-helpers"; +import { getCurrentDirPath, writeFileIfNotExists } from "@lucide/helpers"; const currentDir = getCurrentDirPath(import.meta.url); const ICONS_DIR = path.resolve(currentDir, '../../icons'); diff --git a/scripts/generateChangedIconsCommentMarkup.mjs b/scripts/generateChangedIconsCommentMarkup.mjs index d8985df2c5f..e1e134f3220 100644 --- a/scripts/generateChangedIconsCommentMarkup.mjs +++ b/scripts/generateChangedIconsCommentMarkup.mjs @@ -7,7 +7,7 @@ import { getCurrentDirPath, minifySvg, toPascalCase, -} from '@lucide/build-helpers'; +} from '@lucide/helpers'; const currentDir = getCurrentDirPath(import.meta.url); const ICONS_DIR = path.resolve(currentDir, '../icons'); diff --git a/scripts/generateNextJSAliases.mjs b/scripts/generateNextJSAliases.mjs index c6f4a8a34d3..d9f45162a07 100644 --- a/scripts/generateNextJSAliases.mjs +++ b/scripts/generateNextJSAliases.mjs @@ -1,6 +1,6 @@ import path from 'path'; import { promises as fs } from 'fs'; -import { getCurrentDirPath, readSvgDirectory } from '@lucide/build-helpers'; +import { getCurrentDirPath, readSvgDirectory } from '@lucide/helpers'; // This is a special case convertion NextJS uses for their modularize imports. We try to follow the same convention, to generate the same imports. function pascalToKebabNextJSFlavour(str) { diff --git a/scripts/migrateCategoriesToIcons.mjs b/scripts/migrateCategoriesToIcons.mjs index d06662d1789..4c06238e41c 100644 --- a/scripts/migrateCategoriesToIcons.mjs +++ b/scripts/migrateCategoriesToIcons.mjs @@ -1,6 +1,6 @@ import path from 'path'; import categories from '../categories.json' assert { type: 'json' }; -import { mergeArrays, writeFile, readAllMetadata, getCurrentDirPath } from '@lucide/build-helpers'; +import { mergeArrays, writeFile, readAllMetadata, getCurrentDirPath } from '@lucide/helpers'; const currentDir = getCurrentDirPath(import.meta.url); const ICONS_DIR = path.resolve(currentDir, '../icons'); diff --git a/scripts/migrateIconsToCategories.mjs b/scripts/migrateIconsToCategories.mjs index 32d3b40a228..aba30de9075 100644 --- a/scripts/migrateIconsToCategories.mjs +++ b/scripts/migrateIconsToCategories.mjs @@ -1,5 +1,5 @@ import path from 'path'; -import { writeFile, getCurrentDirPath, readAllMetadata } from '@lucide/build-helpers'; +import { writeFile, getCurrentDirPath, readAllMetadata } from '@lucide/helpers'; const currentDir = getCurrentDirPath(import.meta.url); const ICONS_DIR = path.resolve(currentDir, '../icons'); diff --git a/scripts/migrateIconsToTags.mjs b/scripts/migrateIconsToTags.mjs index 40c5e11747e..b64636b180f 100644 --- a/scripts/migrateIconsToTags.mjs +++ b/scripts/migrateIconsToTags.mjs @@ -1,5 +1,5 @@ import path from 'path'; -import { writeFile, getCurrentDirPath, readAllMetadata } from '@lucide/build-helpers'; +import { writeFile, getCurrentDirPath, readAllMetadata } from '@lucide/helpers'; const currentDir = getCurrentDirPath(import.meta.url); const ICONS_DIR = path.resolve(currentDir, '../icons'); diff --git a/scripts/migrateTagsToIcons.mjs b/scripts/migrateTagsToIcons.mjs index cf3dbde51a8..322e7d83524 100644 --- a/scripts/migrateTagsToIcons.mjs +++ b/scripts/migrateTagsToIcons.mjs @@ -6,7 +6,7 @@ import { writeFile, mergeArrays, getCurrentDirPath, -} from '@lucide/build-helpers'; +} from '@lucide/helpers'; const currentDir = getCurrentDirPath(import.meta.url); const ICONS_DIR = path.resolve(currentDir, '../icons'); diff --git a/scripts/optimizeSvgs.mjs b/scripts/optimizeSvgs.mjs index 100eca479bd..8367a113a71 100644 --- a/scripts/optimizeSvgs.mjs +++ b/scripts/optimizeSvgs.mjs @@ -1,7 +1,7 @@ import fs from 'fs'; import path from 'path'; +import { readSvgDirectory, writeSvgFile } from '@lucide/helpers'; import processSvg from './render/processSvg.mjs'; -import { readSvgDirectory, writeSvgFile } from '@lucide/build-helpers'; const ICONS_DIR = path.resolve(process.cwd(), 'icons'); diff --git a/scripts/rename/renameIcon.mjs b/scripts/rename/renameIcon.mjs index c68e692437c..949c84493c7 100644 --- a/scripts/rename/renameIcon.mjs +++ b/scripts/rename/renameIcon.mjs @@ -1,5 +1,5 @@ import path from 'path'; -import { getCurrentDirPath } from '@lucide/build-helpers'; +import { getCurrentDirPath } from '@lucide/helpers'; import { renameIcon } from './renameIcon.function.mjs'; async function main() { diff --git a/scripts/rename/renamePattern.mjs b/scripts/rename/renamePattern.mjs index 24893dae61a..e64a9d0cb04 100644 --- a/scripts/rename/renamePattern.mjs +++ b/scripts/rename/renamePattern.mjs @@ -1,5 +1,5 @@ import path from 'path'; -import { getCurrentDirPath, readSvgDirectory } from '@lucide/build-helpers'; +import { getCurrentDirPath, readSvgDirectory } from '@lucide/helpers'; import yargs from 'yargs/yargs'; import { hideBin } from 'yargs/helpers'; import { renameIcon } from './renameIcon.function.mjs'; diff --git a/tools/build-helpers/package.json b/tools/build-helpers/package.json index ea253c0aa5f..6992e950bd0 100644 --- a/tools/build-helpers/package.json +++ b/tools/build-helpers/package.json @@ -1,5 +1,5 @@ { - "name": "@lucide/build-helpers", + "name": "@lucide/helpers", "private": true, "version": "1.0.0", "description": "", diff --git a/tools/build-icons/building/generateAliasesFile.mjs b/tools/build-icons/building/generateAliasesFile.mjs index 6ad5f03195f..9b96cf6c1f4 100644 --- a/tools/build-icons/building/generateAliasesFile.mjs +++ b/tools/build-icons/building/generateAliasesFile.mjs @@ -1,6 +1,6 @@ import path from 'path'; import fs from 'fs'; -import { toPascalCase, resetFile, appendFile } from '@lucide/build-helpers'; +import { toPascalCase, resetFile, appendFile } from '@lucide/helpers'; const getImportString = (componentName, iconName, aliasImportFileExtension = '') => `export { default as ${componentName} } from './icons/${iconName}${aliasImportFileExtension}';\n`; diff --git a/tools/build-icons/building/generateDynamicImports.mjs b/tools/build-icons/building/generateDynamicImports.mjs index 46e1d733357..4a2e046938a 100644 --- a/tools/build-icons/building/generateDynamicImports.mjs +++ b/tools/build-icons/building/generateDynamicImports.mjs @@ -1,5 +1,5 @@ import path from 'path'; -import { resetFile, appendFile } from '@lucide/build-helpers'; +import { resetFile, appendFile } from '@lucide/helpers'; export default function generateDynamicImports({ iconNodes, diff --git a/tools/build-icons/building/generateExportsFile.mjs b/tools/build-icons/building/generateExportsFile.mjs index 40855c950c4..95a98e2d61c 100644 --- a/tools/build-icons/building/generateExportsFile.mjs +++ b/tools/build-icons/building/generateExportsFile.mjs @@ -1,6 +1,6 @@ import path from 'path'; -import { toPascalCase, resetFile, appendFile } from '@lucide/build-helpers'; +import { toPascalCase, resetFile, appendFile } from '@lucide/helpers'; export default (inputEntry, outputDirectory, iconNodes, iconFileExtension = '') => { const fileName = path.basename(inputEntry); diff --git a/tools/build-icons/building/generateIconFiles.mjs b/tools/build-icons/building/generateIconFiles.mjs index 7be01938653..020af97b215 100644 --- a/tools/build-icons/building/generateIconFiles.mjs +++ b/tools/build-icons/building/generateIconFiles.mjs @@ -1,7 +1,7 @@ import fs from 'fs'; import path from 'path'; import prettier from 'prettier'; -import { readSvg, toPascalCase } from '@lucide/build-helpers'; +import { readSvg, toPascalCase } from '@lucide/helpers'; export default ({ iconNodes, diff --git a/tools/build-icons/main.mjs b/tools/build-icons/main.mjs index b07b8e67207..541ccbb20b5 100755 --- a/tools/build-icons/main.mjs +++ b/tools/build-icons/main.mjs @@ -7,7 +7,7 @@ import renderIconsObject from './render/renderIconsObject.mjs'; import generateIconFiles from './building/generateIconFiles.mjs'; import generateExportsFile from './building/generateExportsFile.mjs'; -import { readSvgDirectory, getCurrentDirPath } from '@lucide/build-helpers'; +import { readSvgDirectory, getCurrentDirPath } from '@lucide/helpers'; import generateAliasesFile from './building/generateAliasesFile.mjs'; import getIconMetaData from './utils/getIconMetaData.mjs'; import generateDynamicImports from './building/generateDynamicImports.mjs'; diff --git a/tools/build-icons/package.json b/tools/build-icons/package.json index 781355ad3b6..83efa5e8618 100644 --- a/tools/build-icons/package.json +++ b/tools/build-icons/package.json @@ -18,10 +18,10 @@ "author": "", "license": "ISC", "devDependencies": { - "@lucide/build-helpers": "workspace:*" + "@lucide/helpers": "workspace:*" }, "dependencies": { - "@lucide/build-helpers": "^1.0.0", + "@lucide/helpers": "^1.0.0", "minimist": "^1.2.7", "node-fetch": "^3.2.10", "prettier": "2.7.1", diff --git a/tools/build-icons/render/renderIconsObject.mjs b/tools/build-icons/render/renderIconsObject.mjs index 1698c559bbf..64ed3d7262f 100644 --- a/tools/build-icons/render/renderIconsObject.mjs +++ b/tools/build-icons/render/renderIconsObject.mjs @@ -1,6 +1,6 @@ import { basename } from 'path'; import { parseSync } from 'svgson'; -import { generateHashedKey, readSvg, hasDuplicatedChildren } from '@lucide/build-helpers'; +import { generateHashedKey, readSvg, hasDuplicatedChildren } from '@lucide/helpers'; /** * Build an object in the format: `{ : }`. diff --git a/tools/build-icons/utils/getAliases.mjs b/tools/build-icons/utils/getAliases.mjs index 243a2839753..e9d17a2566e 100644 --- a/tools/build-icons/utils/getAliases.mjs +++ b/tools/build-icons/utils/getAliases.mjs @@ -1,5 +1,5 @@ import path from 'path'; -import { readSvgDirectory } from '@lucide/build-helpers'; +import { readSvgDirectory } from '@lucide/helpers'; async function getAliases(iconDirectory) { const iconJsons = readSvgDirectory(iconDirectory, '.json'); diff --git a/tools/build-icons/utils/getIconMetaData.mjs b/tools/build-icons/utils/getIconMetaData.mjs index d9d75dfe2e4..bddca575fa6 100644 --- a/tools/build-icons/utils/getIconMetaData.mjs +++ b/tools/build-icons/utils/getIconMetaData.mjs @@ -1,5 +1,5 @@ import path from 'path'; -import { readSvgDirectory } from '@lucide/build-helpers'; +import { readSvgDirectory } from '@lucide/helpers'; async function getIconMetaData(iconDirectory) { const iconJsons = readSvgDirectory(iconDirectory, '.json'); From 6968f6d6604d0ea554b17b39c6010aeae4ce856e Mon Sep 17 00:00:00 2001 From: Eric Fennis Date: Fri, 19 Apr 2024 15:04:55 +0200 Subject: [PATCH 09/22] Fix build --- .eslintrc.js | 2 +- .github/workflows/pull-request.yml | 6 ++++-- packages/lucide-solid/package.json | 2 +- packages/lucide-svelte/package.json | 2 +- packages/lucide-vue-next/package.json | 2 +- packages/lucide-vue/package.json | 2 +- 6 files changed, 9 insertions(+), 7 deletions(-) diff --git a/.eslintrc.js b/.eslintrc.js index 6378b679d5f..c6bd5fed049 100644 --- a/.eslintrc.js +++ b/.eslintrc.js @@ -1,4 +1,4 @@ -const DEFAULT_ATTRS = require('./scripts/render/default-attrs.json'); +const DEFAULT_ATTRS = require('@lucide/build-icons/render/default-attrs.json'); module.exports = { root: true, diff --git a/.github/workflows/pull-request.yml b/.github/workflows/pull-request.yml index d80b39eec88..8ded86c1a16 100644 --- a/.github/workflows/pull-request.yml +++ b/.github/workflows/pull-request.yml @@ -45,8 +45,9 @@ jobs: with: files: icons/* - uses: actions/setup-node@v4 + - uses: pnpm/action-setup@v2 - name: Install simple-git (safer and faster than installing all deps) - run: npm install simple-git + run: pnpm install simple-git - name: Generate annotations run: node ./scripts/updateContributors.mjs env: @@ -95,8 +96,9 @@ jobs: body-includes: Added or changed icons - uses: actions/setup-node@v4 + - uses: pnpm/action-setup@v2 - name: Install svgson for code preview (safer and faster than installing all deps) - run: npm install svgson + run: pnpm install svgson - name: Generate comment markup run: node ./scripts/generateChangedIconsCommentMarkup.mjs >> comment-markup.md diff --git a/packages/lucide-solid/package.json b/packages/lucide-solid/package.json index e414ac3a88d..c879bcbef1f 100644 --- a/packages/lucide-solid/package.json +++ b/packages/lucide-solid/package.json @@ -49,7 +49,7 @@ "build:version": "node ./scripts/replaceVersion.mjs", "build:bundle": "rollup -c rollup.config.mjs", "build:icons": "build-icons --output=./src --templateSrc=./scripts/exportTemplate.mjs --renderUniqueKey --withAliases --aliasesFileExtension=.ts --iconFileExtension=.tsx --exportFileName=index.ts", - "test": "pnpm build:bundle && vitest run", + "test": "pnpm build:icons && vitest run", "version": "pnpm version --git-tag-version=false" }, "devDependencies": { diff --git a/packages/lucide-svelte/package.json b/packages/lucide-svelte/package.json index 7898ed92cf4..cab5227d880 100644 --- a/packages/lucide-svelte/package.json +++ b/packages/lucide-svelte/package.json @@ -51,7 +51,7 @@ "build:icons": "build-icons --output=./src --templateSrc=./scripts/exportTemplate.mjs --exportFileName=index.ts --iconFileExtension=.svelte --importImportFileExtension=.svelte --withAliases --aliasesFileExtension=.ts --aliasImportFileExtension=.svelte --pretty=false", "build:package": "svelte-package --input ./src", "build:license": "node ./scripts/appendBlockComments.mjs", - "test": "vitest run", + "test": "pnpm build:icons && vitest run", "version": "pnpm version --git-tag-version=false" }, "devDependencies": { diff --git a/packages/lucide-vue-next/package.json b/packages/lucide-vue-next/package.json index 063513574ac..f04a91fce41 100644 --- a/packages/lucide-vue-next/package.json +++ b/packages/lucide-vue-next/package.json @@ -40,7 +40,7 @@ "clean": "rm -rf dist && rm -rf ./src/icons/*.ts", "build:icons": "build-icons --output=./src --templateSrc=./scripts/exportTemplate.mjs --renderUniqueKey --withAliases --aliasesFileExtension=.ts --iconFileExtension=.ts --exportFileName=index.ts", "build:bundles": "rollup -c ./rollup.config.mjs", - "test": "vitest run", + "test": "pnpm build:icons && vitest run", "version": "pnpm version --git-tag-version=false" }, "devDependencies": { diff --git a/packages/lucide-vue/package.json b/packages/lucide-vue/package.json index 140938fcf35..ce7240d8291 100644 --- a/packages/lucide-vue/package.json +++ b/packages/lucide-vue/package.json @@ -39,7 +39,7 @@ "clean": "rm -rf dist && rm -rf stats && rm -rf ./src/icons/*.js", "build:icons": "build-icons --output=./src --templateSrc=./scripts/exportTemplate.mjs --renderUniqueKey --withAliases --aliasesFileExtension=.ts --iconFileExtension=.ts --exportFileName=index.ts", "build:bundles": "rollup -c ./rollup.config.mjs", - "test": "vitest run", + "test": "pnpm build:icons && vitest run", "version": "pnpm version --git-tag-version=false" }, "devDependencies": { From 65b2549f94f6b1f9821901589702dfb986bcb4d6 Mon Sep 17 00:00:00 2001 From: Eric Fennis Date: Fri, 19 Apr 2024 15:22:28 +0200 Subject: [PATCH 10/22] formatting --- .github/workflows/pull-request.yml | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/.github/workflows/pull-request.yml b/.github/workflows/pull-request.yml index 8ded86c1a16..e9c74708328 100644 --- a/.github/workflows/pull-request.yml +++ b/.github/workflows/pull-request.yml @@ -39,21 +39,26 @@ jobs: with: fetch-depth: 0 ref: refs/pull/${{ github.event.pull_request.number }}/merge + - name: Get changed files id: changed-files uses: tj-actions/changed-files@v41 with: files: icons/* + - uses: actions/setup-node@v4 - uses: pnpm/action-setup@v2 + - name: Install simple-git (safer and faster than installing all deps) run: pnpm install simple-git + - name: Generate annotations run: node ./scripts/updateContributors.mjs env: GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} FETCH_DEPTH: ${{ github.event.pull_request.commits }} CHANGED_FILES: ${{ steps.changed-files.outputs.all_changed_files }} + - name: Generate annotations env: ANNOTATION_SEVERITY: notice @@ -97,6 +102,7 @@ jobs: - uses: actions/setup-node@v4 - uses: pnpm/action-setup@v2 + - name: Install svgson for code preview (safer and faster than installing all deps) run: pnpm install svgson From b10bb7db72e7ff279febf7d7cdfae7c57b2b687b Mon Sep 17 00:00:00 2001 From: Eric Fennis Date: Fri, 19 Apr 2024 18:33:07 +0200 Subject: [PATCH 11/22] Adjust main build-icons file --- tools/build-helpers/package.json | 4 ++-- tools/build-icons/main.mjs | 7 +++---- 2 files changed, 5 insertions(+), 6 deletions(-) diff --git a/tools/build-helpers/package.json b/tools/build-helpers/package.json index 6992e950bd0..5956a41e63c 100644 --- a/tools/build-helpers/package.json +++ b/tools/build-helpers/package.json @@ -2,9 +2,9 @@ "name": "@lucide/helpers", "private": true, "version": "1.0.0", - "description": "", + "description": "A internal used package with helpers.", "main": "main.mjs", - "module": "main.mjs", + "types": "module", "author": "", "license": "ISC", "type": "module" diff --git a/tools/build-icons/main.mjs b/tools/build-icons/main.mjs index 541ccbb20b5..bd8ccc65774 100755 --- a/tools/build-icons/main.mjs +++ b/tools/build-icons/main.mjs @@ -3,20 +3,19 @@ import fs from 'fs'; import path from 'path'; import getArgumentOptions from 'minimist'; +// eslint-disable-next-line import/no-extraneous-dependencies +import { readSvgDirectory } from '@lucide/helpers'; import renderIconsObject from './render/renderIconsObject.mjs'; import generateIconFiles from './building/generateIconFiles.mjs'; import generateExportsFile from './building/generateExportsFile.mjs'; -import { readSvgDirectory, getCurrentDirPath } from '@lucide/helpers'; import generateAliasesFile from './building/generateAliasesFile.mjs'; import getIconMetaData from './utils/getIconMetaData.mjs'; import generateDynamicImports from './building/generateDynamicImports.mjs'; const cliArguments = getArgumentOptions(process.argv.slice(2)); -const currentDir = getCurrentDirPath(import.meta.url); - -const ICONS_DIR = path.resolve(currentDir, '../../icons'); +const ICONS_DIR = path.resolve(process.cwd(), '../../icons'); const OUTPUT_DIR = path.resolve(process.cwd(), cliArguments.output || '../build'); if (!fs.existsSync(OUTPUT_DIR)) { From 86a3a6590d6bb2852b241a9664695566a00a9c9a Mon Sep 17 00:00:00 2001 From: Eric Fennis Date: Sat, 20 Apr 2024 12:08:32 +0200 Subject: [PATCH 12/22] Add export casing --- tools/build-icons/building/generateExportsFile.mjs | 12 +++++++++--- tools/build-icons/main.mjs | 2 ++ 2 files changed, 11 insertions(+), 3 deletions(-) diff --git a/tools/build-icons/building/generateExportsFile.mjs b/tools/build-icons/building/generateExportsFile.mjs index 95a98e2d61c..43e5ce634e9 100644 --- a/tools/build-icons/building/generateExportsFile.mjs +++ b/tools/build-icons/building/generateExportsFile.mjs @@ -1,8 +1,8 @@ import path from 'path'; -import { toPascalCase, resetFile, appendFile } from '@lucide/helpers'; +import { toPascalCase, toCamelCase, resetFile, appendFile } from '@lucide/helpers'; -export default (inputEntry, outputDirectory, iconNodes, iconFileExtension = '') => { +export default (inputEntry, outputDirectory, iconNodes, exportModuleNameCasing, iconFileExtension = '') => { const fileName = path.basename(inputEntry); // Reset file @@ -12,7 +12,13 @@ export default (inputEntry, outputDirectory, iconNodes, iconFileExtension = '') // Generate Import for Icon VNodes icons.forEach((iconName) => { - const componentName = toPascalCase(iconName); + let componentName + + if(exportModuleNameCasing === 'camel') { + componentName = toCamelCase(iconName); + } else if(exportModuleNameCasing === 'pascal') { + componentName = toPascalCase(iconName); + } const importString = `export { default as ${componentName} } from './${iconName}${iconFileExtension}';\n`; appendFile(importString, fileName, outputDirectory); }); diff --git a/tools/build-icons/main.mjs b/tools/build-icons/main.mjs index bd8ccc65774..a965558bead 100755 --- a/tools/build-icons/main.mjs +++ b/tools/build-icons/main.mjs @@ -29,6 +29,7 @@ const { iconFileExtension = '.js', importImportFileExtension = '', exportFileName = 'index.js', + exportModuleNameCasing = 'pascal', withAliases = false, aliasNamesOnly = false, withDynamicImports = false, @@ -91,6 +92,7 @@ async function buildIcons() { path.join(OUTPUT_DIR, 'icons', exportFileName), path.join(OUTPUT_DIR, 'icons'), icons, + exportModuleNameCasing, importImportFileExtension, ); } From 37e3acfcfe1ce850b21194cd6ec0ceac1e86a053 Mon Sep 17 00:00:00 2001 From: Eric Fennis Date: Sat, 20 Apr 2024 12:20:09 +0200 Subject: [PATCH 13/22] Adds `exportModuleNameCasing` fro lab project --- tools/build-icons/building/generateAliasesFile.mjs | 7 ++++--- tools/build-icons/main.mjs | 1 + 2 files changed, 5 insertions(+), 3 deletions(-) diff --git a/tools/build-icons/building/generateAliasesFile.mjs b/tools/build-icons/building/generateAliasesFile.mjs index 9b96cf6c1f4..b411c81f683 100644 --- a/tools/build-icons/building/generateAliasesFile.mjs +++ b/tools/build-icons/building/generateAliasesFile.mjs @@ -1,6 +1,6 @@ import path from 'path'; import fs from 'fs'; -import { toPascalCase, resetFile, appendFile } from '@lucide/helpers'; +import { toPascalCase, resetFile, appendFile, toCamelCase } from '@lucide/helpers'; const getImportString = (componentName, iconName, aliasImportFileExtension = '') => `export { default as ${componentName} } from './icons/${iconName}${aliasImportFileExtension}';\n`; @@ -12,6 +12,7 @@ export default async function generateAliasesFile({ iconFileExtension = '.js', iconMetaData, aliasImportFileExtension, + exportModuleNameCasing, aliasNamesOnly = false, separateAliasesFile = false, showLog = true, @@ -26,7 +27,7 @@ export default async function generateAliasesFile({ // Generate Import for Icon VNodes await Promise.all( icons.map(async (iconName, index) => { - const componentName = toPascalCase(iconName); + const componentName = exportModuleNameCasing === 'pascal' ? toPascalCase(iconName) : toCamelCase(iconName); const iconAliases = iconMetaData[iconName]?.aliases; let importString = ''; @@ -51,7 +52,7 @@ export default async function generateAliasesFile({ if (iconAliases != null && Array.isArray(iconAliases)) { await Promise.all( iconAliases.map(async (alias) => { - const componentNameAlias = toPascalCase(alias); + const componentNameAlias = exportModuleNameCasing === 'pascal' ? toPascalCase(alias) : toCamelCase(alias);; if (separateAliasesFile) { const output = `export { default } from "./${iconName}"`; diff --git a/tools/build-icons/main.mjs b/tools/build-icons/main.mjs index a965558bead..34009984756 100755 --- a/tools/build-icons/main.mjs +++ b/tools/build-icons/main.mjs @@ -72,6 +72,7 @@ async function buildIcons() { iconFileExtension, outputDirectory: OUTPUT_DIR, fileExtension: aliasesFileExtension, + exportModuleNameCasing, aliasImportFileExtension, separateAliasesFile, showLog: !silent, From 200fbd6e2962cd3f8d9d5e1748d78dfa7e7c0240 Mon Sep 17 00:00:00 2001 From: Eric Fennis Date: Fri, 3 May 2024 12:08:44 +0200 Subject: [PATCH 14/22] format files --- scripts/generate/generateIcons.mjs | 2 +- tools/build-helpers/main.mjs | 40 +++++++++---------- tools/build-helpers/src/appendFile.mjs | 1 + tools/build-helpers/src/generateHashedKey.mjs | 1 + tools/build-helpers/src/getCurrentDirPath.mjs | 1 + .../src/hasDuplicatedChildren.mjs | 3 +- tools/build-helpers/src/hash.mjs | 1 + tools/build-helpers/src/mergeArrays.mjs | 1 + tools/build-helpers/src/minifySvg.mjs | 1 + tools/build-helpers/src/readAllMetadata.mjs | 1 + tools/build-helpers/src/readFile.mjs | 1 + tools/build-helpers/src/readMetadata.mjs | 1 + tools/build-helpers/src/readSvg.mjs | 1 + tools/build-helpers/src/readSvgDirectory.mjs | 1 + tools/build-helpers/src/resetFile.mjs | 1 + tools/build-helpers/src/shuffleArray.mjs | 1 + tools/build-helpers/src/toCamelCase.mjs | 1 + tools/build-helpers/src/toKebabCase.mjs | 1 + tools/build-helpers/src/toPascalCase.mjs | 1 + tools/build-helpers/src/writeFile.mjs | 1 + .../src/writeFileIfNotExists.mjs | 1 + tools/build-helpers/src/writeSvgFile.mjs | 1 + .../building/generateAliasesFile.mjs | 18 +++++---- .../building/generateExportsFile.mjs | 14 +++++-- tools/build-icons/utils/getAliases.mjs | 8 ++-- 25 files changed, 66 insertions(+), 38 deletions(-) diff --git a/scripts/generate/generateIcons.mjs b/scripts/generate/generateIcons.mjs index a8f9d3637a1..22f8f4ed579 100644 --- a/scripts/generate/generateIcons.mjs +++ b/scripts/generate/generateIcons.mjs @@ -1,5 +1,5 @@ import path from 'path'; -import { getCurrentDirPath, writeFileIfNotExists } from "@lucide/helpers"; +import { getCurrentDirPath, writeFileIfNotExists } from '@lucide/helpers'; const currentDir = getCurrentDirPath(import.meta.url); const ICONS_DIR = path.resolve(currentDir, '../../icons'); diff --git a/tools/build-helpers/main.mjs b/tools/build-helpers/main.mjs index 1945ce38896..a1dc7cad3e0 100644 --- a/tools/build-helpers/main.mjs +++ b/tools/build-helpers/main.mjs @@ -1,20 +1,20 @@ -export * from './src/toCamelCase.mjs' -export * from './src/toPascalCase.mjs' -export * from './src/toKebabCase.mjs' -export * from './src/resetFile.mjs' -export * from './src/readFile.mjs' -export * from './src/appendFile.mjs' -export * from './src/writeFile.mjs' -export * from './src/writeFileIfNotExists.mjs' -export * from './src/readAllMetadata.mjs' -export * from './src/readMetadata.mjs' -export * from './src/readSvgDirectory.mjs' -export * from './src/readSvg.mjs' -export * from './src/writeSvgFile.mjs' -export * from './src/hash.mjs' -export * from './src/generateHashedKey.mjs' -export * from './src/hasDuplicatedChildren.mjs' -export * from './src/mergeArrays.mjs' -export * from './src/getCurrentDirPath.mjs' -export * from './src/minifySvg.mjs' -export * from './src/shuffleArray.mjs' +export * from './src/toCamelCase.mjs'; +export * from './src/toPascalCase.mjs'; +export * from './src/toKebabCase.mjs'; +export * from './src/resetFile.mjs'; +export * from './src/readFile.mjs'; +export * from './src/appendFile.mjs'; +export * from './src/writeFile.mjs'; +export * from './src/writeFileIfNotExists.mjs'; +export * from './src/readAllMetadata.mjs'; +export * from './src/readMetadata.mjs'; +export * from './src/readSvgDirectory.mjs'; +export * from './src/readSvg.mjs'; +export * from './src/writeSvgFile.mjs'; +export * from './src/hash.mjs'; +export * from './src/generateHashedKey.mjs'; +export * from './src/hasDuplicatedChildren.mjs'; +export * from './src/mergeArrays.mjs'; +export * from './src/getCurrentDirPath.mjs'; +export * from './src/minifySvg.mjs'; +export * from './src/shuffleArray.mjs'; diff --git a/tools/build-helpers/src/appendFile.mjs b/tools/build-helpers/src/appendFile.mjs index a45920a8497..4bb2a674d7a 100644 --- a/tools/build-helpers/src/appendFile.mjs +++ b/tools/build-helpers/src/appendFile.mjs @@ -1,3 +1,4 @@ +/* eslint-disable import/prefer-default-export */ import fs from 'fs'; import path from 'path'; diff --git a/tools/build-helpers/src/generateHashedKey.mjs b/tools/build-helpers/src/generateHashedKey.mjs index 6bb1aad55e8..ec914531894 100644 --- a/tools/build-helpers/src/generateHashedKey.mjs +++ b/tools/build-helpers/src/generateHashedKey.mjs @@ -1,3 +1,4 @@ +/* eslint-disable import/prefer-default-export */ import { hash } from './hash.mjs'; /** diff --git a/tools/build-helpers/src/getCurrentDirPath.mjs b/tools/build-helpers/src/getCurrentDirPath.mjs index ccd9126a858..e0c2ddc781e 100644 --- a/tools/build-helpers/src/getCurrentDirPath.mjs +++ b/tools/build-helpers/src/getCurrentDirPath.mjs @@ -1,3 +1,4 @@ +/* eslint-disable import/prefer-default-export */ import path from 'path'; import { fileURLToPath } from 'url'; diff --git a/tools/build-helpers/src/hasDuplicatedChildren.mjs b/tools/build-helpers/src/hasDuplicatedChildren.mjs index 8e65cddfb78..866f0cd1927 100644 --- a/tools/build-helpers/src/hasDuplicatedChildren.mjs +++ b/tools/build-helpers/src/hasDuplicatedChildren.mjs @@ -1,4 +1,5 @@ -import { generateHashedKey } from './generateHashedKey.mjs' +/* eslint-disable import/prefer-default-export */ +import { generateHashedKey } from './generateHashedKey.mjs'; /** * Checks if array of items contains duplicated items diff --git a/tools/build-helpers/src/hash.mjs b/tools/build-helpers/src/hash.mjs index 616c4461466..52fe12c9e1f 100644 --- a/tools/build-helpers/src/hash.mjs +++ b/tools/build-helpers/src/hash.mjs @@ -1,3 +1,4 @@ +/* eslint-disable import/prefer-default-export */ /** * djb2 hashing function * diff --git a/tools/build-helpers/src/mergeArrays.mjs b/tools/build-helpers/src/mergeArrays.mjs index bceafc71051..b72afe98099 100644 --- a/tools/build-helpers/src/mergeArrays.mjs +++ b/tools/build-helpers/src/mergeArrays.mjs @@ -1,3 +1,4 @@ +/* eslint-disable import/prefer-default-export */ /** * Merge two arrays and remove duplicates * diff --git a/tools/build-helpers/src/minifySvg.mjs b/tools/build-helpers/src/minifySvg.mjs index 3984f3e8cac..9ce9d1d2cc8 100644 --- a/tools/build-helpers/src/minifySvg.mjs +++ b/tools/build-helpers/src/minifySvg.mjs @@ -1,3 +1,4 @@ +/* eslint-disable import/prefer-default-export */ /** * Minifies SVG * diff --git a/tools/build-helpers/src/readAllMetadata.mjs b/tools/build-helpers/src/readAllMetadata.mjs index 425677b5eea..e42cdabb1cb 100644 --- a/tools/build-helpers/src/readAllMetadata.mjs +++ b/tools/build-helpers/src/readAllMetadata.mjs @@ -1,3 +1,4 @@ +/* eslint-disable import/prefer-default-export */ import fs from 'fs'; import path from 'path'; import { readMetadata } from './readMetadata.mjs'; diff --git a/tools/build-helpers/src/readFile.mjs b/tools/build-helpers/src/readFile.mjs index 0d369059bed..710ab0479ae 100644 --- a/tools/build-helpers/src/readFile.mjs +++ b/tools/build-helpers/src/readFile.mjs @@ -1,3 +1,4 @@ +/* eslint-disable import/prefer-default-export */ import fs from 'fs'; import path from 'path'; diff --git a/tools/build-helpers/src/readMetadata.mjs b/tools/build-helpers/src/readMetadata.mjs index 04c0d062981..d1fca91f384 100644 --- a/tools/build-helpers/src/readMetadata.mjs +++ b/tools/build-helpers/src/readMetadata.mjs @@ -1,3 +1,4 @@ +/* eslint-disable import/prefer-default-export */ import fs from 'fs'; import path from 'path'; diff --git a/tools/build-helpers/src/readSvg.mjs b/tools/build-helpers/src/readSvg.mjs index 525fa989917..d046e7d6610 100644 --- a/tools/build-helpers/src/readSvg.mjs +++ b/tools/build-helpers/src/readSvg.mjs @@ -1,3 +1,4 @@ +/* eslint-disable import/prefer-default-export */ import fs from 'fs'; import path from 'path'; diff --git a/tools/build-helpers/src/readSvgDirectory.mjs b/tools/build-helpers/src/readSvgDirectory.mjs index 25a6d5382e3..f88c62b9e57 100644 --- a/tools/build-helpers/src/readSvgDirectory.mjs +++ b/tools/build-helpers/src/readSvgDirectory.mjs @@ -1,3 +1,4 @@ +/* eslint-disable import/prefer-default-export */ import fs from 'fs'; import path from 'path'; diff --git a/tools/build-helpers/src/resetFile.mjs b/tools/build-helpers/src/resetFile.mjs index 5d4f61e7f5e..1b483646c9c 100644 --- a/tools/build-helpers/src/resetFile.mjs +++ b/tools/build-helpers/src/resetFile.mjs @@ -1,3 +1,4 @@ +/* eslint-disable import/prefer-default-export */ import fs from 'fs'; import path from 'path'; diff --git a/tools/build-helpers/src/shuffleArray.mjs b/tools/build-helpers/src/shuffleArray.mjs index 8bfaae8d478..489e3dc3244 100644 --- a/tools/build-helpers/src/shuffleArray.mjs +++ b/tools/build-helpers/src/shuffleArray.mjs @@ -1,3 +1,4 @@ +/* eslint-disable import/prefer-default-export */ /** * @param {array} array * @returns {array} diff --git a/tools/build-helpers/src/toCamelCase.mjs b/tools/build-helpers/src/toCamelCase.mjs index 017afeb5edf..be76c829e38 100644 --- a/tools/build-helpers/src/toCamelCase.mjs +++ b/tools/build-helpers/src/toCamelCase.mjs @@ -1,3 +1,4 @@ +/* eslint-disable import/prefer-default-export */ /** * Converts string to CamelCase * diff --git a/tools/build-helpers/src/toKebabCase.mjs b/tools/build-helpers/src/toKebabCase.mjs index 6a6c4b252e9..1825511c320 100644 --- a/tools/build-helpers/src/toKebabCase.mjs +++ b/tools/build-helpers/src/toKebabCase.mjs @@ -1,3 +1,4 @@ +/* eslint-disable import/prefer-default-export */ /** * Converts string to KebabCase * diff --git a/tools/build-helpers/src/toPascalCase.mjs b/tools/build-helpers/src/toPascalCase.mjs index a0041243188..1e97d18c880 100644 --- a/tools/build-helpers/src/toPascalCase.mjs +++ b/tools/build-helpers/src/toPascalCase.mjs @@ -1,3 +1,4 @@ +/* eslint-disable import/prefer-default-export */ import { toCamelCase } from './toCamelCase.mjs'; /** diff --git a/tools/build-helpers/src/writeFile.mjs b/tools/build-helpers/src/writeFile.mjs index 8d71e85cdfb..bc301c64f69 100644 --- a/tools/build-helpers/src/writeFile.mjs +++ b/tools/build-helpers/src/writeFile.mjs @@ -1,3 +1,4 @@ +/* eslint-disable import/prefer-default-export */ import fs from 'fs'; import path from 'path'; diff --git a/tools/build-helpers/src/writeFileIfNotExists.mjs b/tools/build-helpers/src/writeFileIfNotExists.mjs index 710ce652af3..0d734e8263e 100644 --- a/tools/build-helpers/src/writeFileIfNotExists.mjs +++ b/tools/build-helpers/src/writeFileIfNotExists.mjs @@ -1,3 +1,4 @@ +/* eslint-disable import/prefer-default-export */ import fs from 'fs'; import path from 'path'; import { writeFile } from './writeFile.mjs'; diff --git a/tools/build-helpers/src/writeSvgFile.mjs b/tools/build-helpers/src/writeSvgFile.mjs index 385fc2722f4..4c9218a77bf 100644 --- a/tools/build-helpers/src/writeSvgFile.mjs +++ b/tools/build-helpers/src/writeSvgFile.mjs @@ -1,3 +1,4 @@ +/* eslint-disable import/prefer-default-export */ import fs from 'fs'; import path from 'path'; diff --git a/tools/build-icons/building/generateAliasesFile.mjs b/tools/build-icons/building/generateAliasesFile.mjs index b411c81f683..92b26130636 100644 --- a/tools/build-icons/building/generateAliasesFile.mjs +++ b/tools/build-icons/building/generateAliasesFile.mjs @@ -27,7 +27,8 @@ export default async function generateAliasesFile({ // Generate Import for Icon VNodes await Promise.all( icons.map(async (iconName, index) => { - const componentName = exportModuleNameCasing === 'pascal' ? toPascalCase(iconName) : toCamelCase(iconName); + const componentName = + exportModuleNameCasing === 'pascal' ? toPascalCase(iconName) : toCamelCase(iconName); const iconAliases = iconMetaData[iconName]?.aliases; let importString = ''; @@ -45,14 +46,15 @@ export default async function generateAliasesFile({ importString += getImportString( `Lucide${componentName}`, iconName, - aliasImportFileExtension, + aliasImportFileExtension ); } if (iconAliases != null && Array.isArray(iconAliases)) { await Promise.all( iconAliases.map(async (alias) => { - const componentNameAlias = exportModuleNameCasing === 'pascal' ? toPascalCase(alias) : toCamelCase(alias);; + const componentNameAlias = + exportModuleNameCasing === 'pascal' ? toPascalCase(alias) : toCamelCase(alias); if (separateAliasesFile) { const output = `export { default } from "./${iconName}"`; @@ -71,28 +73,28 @@ export default async function generateAliasesFile({ importString += getImportString( componentNameAlias, exportFileIcon, - aliasImportFileExtension, + aliasImportFileExtension ); if (!aliasNamesOnly) { importString += getImportString( `${componentNameAlias}Icon`, exportFileIcon, - aliasImportFileExtension, + aliasImportFileExtension ); importString += getImportString( `Lucide${componentNameAlias}`, exportFileIcon, - aliasImportFileExtension, + aliasImportFileExtension ); } - }), + }) ); } appendFile(importString, fileName, outputDirectory); - }), + }) ); appendFile('\n', fileName, outputDirectory); diff --git a/tools/build-icons/building/generateExportsFile.mjs b/tools/build-icons/building/generateExportsFile.mjs index 43e5ce634e9..6badfaec682 100644 --- a/tools/build-icons/building/generateExportsFile.mjs +++ b/tools/build-icons/building/generateExportsFile.mjs @@ -2,7 +2,13 @@ import path from 'path'; import { toPascalCase, toCamelCase, resetFile, appendFile } from '@lucide/helpers'; -export default (inputEntry, outputDirectory, iconNodes, exportModuleNameCasing, iconFileExtension = '') => { +export default ( + inputEntry, + outputDirectory, + iconNodes, + exportModuleNameCasing, + iconFileExtension = '' +) => { const fileName = path.basename(inputEntry); // Reset file @@ -12,11 +18,11 @@ export default (inputEntry, outputDirectory, iconNodes, exportModuleNameCasing, // Generate Import for Icon VNodes icons.forEach((iconName) => { - let componentName + let componentName; - if(exportModuleNameCasing === 'camel') { + if (exportModuleNameCasing === 'camel') { componentName = toCamelCase(iconName); - } else if(exportModuleNameCasing === 'pascal') { + } else if (exportModuleNameCasing === 'pascal') { componentName = toPascalCase(iconName); } const importString = `export { default as ${componentName} } from './${iconName}${iconFileExtension}';\n`; diff --git a/tools/build-icons/utils/getAliases.mjs b/tools/build-icons/utils/getAliases.mjs index e9d17a2566e..51b888ea363 100644 --- a/tools/build-icons/utils/getAliases.mjs +++ b/tools/build-icons/utils/getAliases.mjs @@ -5,12 +5,12 @@ async function getAliases(iconDirectory) { const iconJsons = readSvgDirectory(iconDirectory, '.json'); const aliasesEntries = await Promise.all( iconJsons.map(async (jsonFile) => { - const file = await import( path.join(iconDirectory, jsonFile), { assert: { type: 'json' } }); - return [path.basename(jsonFile, '.json'), file.default] + const file = await import(path.join(iconDirectory, jsonFile), { assert: { type: 'json' } }); + return [path.basename(jsonFile, '.json'), file.default]; }) - ) + ); return Object.fromEntries(aliasesEntries); } -export default getAliases +export default getAliases; From 997f6364a720bee1d42fb5577a26cf6b8f22d049 Mon Sep 17 00:00:00 2001 From: Eric Fennis Date: Tue, 7 May 2024 11:51:41 +0200 Subject: [PATCH 15/22] Bump package version @lucide/build-icons --- tools/build-icons/package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tools/build-icons/package.json b/tools/build-icons/package.json index 5f13fbf897b..be69c9e1c80 100644 --- a/tools/build-icons/package.json +++ b/tools/build-icons/package.json @@ -1,7 +1,7 @@ { "name": "@lucide/build-icons", "description": "A internal used package to build icon code files for the lucide icon library packages.", - "version": "1.0.0", + "version": "1.1.0", "main": "index.mjs", "type": "module", "scripts": { From c4e576d0a05c0bccf7b6d8f6ebbf146f6a6d3f69 Mon Sep 17 00:00:00 2001 From: Eric Fennis Date: Fri, 21 Jun 2024 13:14:04 +0200 Subject: [PATCH 16/22] Revert changes in icons --- icons/a-arrow-down.svg | 2 +- icons/arrow-down-0-1.json | 2 +- icons/arrow-down-1-0.json | 2 +- icons/arrow-down-a-z.json | 2 +- icons/arrow-down-z-a.json | 2 +- icons/arrow-up-0-1.json | 2 +- icons/arrow-up-1-0.json | 2 +- icons/arrow-up-a-z.json | 2 +- icons/arrow-up-z-a.json | 2 +- icons/axis-3d.json | 2 +- icons/book-heart.svg | 2 +- icons/castle.svg | 4 ++-- icons/church.svg | 2 +- icons/earth.svg | 4 ++-- icons/file-axis-3d.json | 2 +- icons/fuel.svg | 2 +- icons/grab.svg | 8 ++++---- icons/grid-2x2.json | 2 +- icons/grid-3x3.json | 2 +- icons/guitar.svg | 2 +- icons/hand-metal.svg | 2 +- icons/hand.svg | 6 +++--- icons/hard-hat.svg | 2 +- icons/lasso-select.svg | 6 +++--- icons/mail-search.svg | 2 +- icons/mailbox.svg | 2 +- icons/mic-vocal.svg | 2 +- icons/move-3d.json | 2 +- icons/party-popper.svg | 6 +++--- icons/piggy-bank.svg | 2 +- icons/plug-2.svg | 2 +- icons/pointer.svg | 6 +++--- icons/radiation.svg | 6 +++--- icons/rat.svg | 4 ++-- icons/redo-2.svg | 2 +- icons/rotate-3d.json | 2 +- icons/scale-3d.json | 2 +- icons/shrub.svg | 2 +- icons/stethoscope.svg | 4 ++-- icons/sticker.svg | 2 +- icons/store.svg | 2 +- icons/swatch-book.svg | 2 +- icons/test-tube-diagonal.svg | 2 +- icons/test-tube.svg | 2 +- icons/test-tubes.svg | 4 ++-- icons/thumbs-down.svg | 2 +- icons/thumbs-up.svg | 2 +- icons/trees.svg | 2 +- icons/undo-2.svg | 2 +- icons/university.svg | 2 +- icons/utensils.svg | 2 +- 51 files changed, 69 insertions(+), 69 deletions(-) diff --git a/icons/a-arrow-down.svg b/icons/a-arrow-down.svg index 5106437a72c..59f4ac860a1 100644 --- a/icons/a-arrow-down.svg +++ b/icons/a-arrow-down.svg @@ -13,4 +13,4 @@ - + \ No newline at end of file diff --git a/icons/arrow-down-0-1.json b/icons/arrow-down-0-1.json index e4c171f2293..032d9a0dec4 100644 --- a/icons/arrow-down-0-1.json +++ b/icons/arrow-down-0-1.json @@ -18,4 +18,4 @@ "aliases": [ "arrow-down-01" ] -} \ No newline at end of file +} diff --git a/icons/arrow-down-1-0.json b/icons/arrow-down-1-0.json index 383f4bdc3fe..102706d59a9 100644 --- a/icons/arrow-down-1-0.json +++ b/icons/arrow-down-1-0.json @@ -18,4 +18,4 @@ "aliases": [ "arrow-down-10" ] -} \ No newline at end of file +} diff --git a/icons/arrow-down-a-z.json b/icons/arrow-down-a-z.json index 883ccf06149..a311d9bb89a 100644 --- a/icons/arrow-down-a-z.json +++ b/icons/arrow-down-a-z.json @@ -18,4 +18,4 @@ "aliases": [ "arrow-down-az" ] -} \ No newline at end of file +} diff --git a/icons/arrow-down-z-a.json b/icons/arrow-down-z-a.json index 9a8962ec16e..0bad0989509 100644 --- a/icons/arrow-down-z-a.json +++ b/icons/arrow-down-z-a.json @@ -19,4 +19,4 @@ "aliases": [ "arrow-down-za" ] -} \ No newline at end of file +} diff --git a/icons/arrow-up-0-1.json b/icons/arrow-up-0-1.json index f03268b0a39..c08093ebf2b 100644 --- a/icons/arrow-up-0-1.json +++ b/icons/arrow-up-0-1.json @@ -18,4 +18,4 @@ "aliases": [ "arrow-up-01" ] -} \ No newline at end of file +} diff --git a/icons/arrow-up-1-0.json b/icons/arrow-up-1-0.json index 998ffc9ffaa..fb0749ecc54 100644 --- a/icons/arrow-up-1-0.json +++ b/icons/arrow-up-1-0.json @@ -18,4 +18,4 @@ "aliases": [ "arrow-up-10" ] -} \ No newline at end of file +} diff --git a/icons/arrow-up-a-z.json b/icons/arrow-up-a-z.json index eb94eed7d06..e8fa97713fd 100644 --- a/icons/arrow-up-a-z.json +++ b/icons/arrow-up-a-z.json @@ -18,4 +18,4 @@ "aliases": [ "arrow-up-az" ] -} \ No newline at end of file +} diff --git a/icons/arrow-up-z-a.json b/icons/arrow-up-z-a.json index 174c370bfca..e46f7ac4799 100644 --- a/icons/arrow-up-z-a.json +++ b/icons/arrow-up-z-a.json @@ -19,4 +19,4 @@ "aliases": [ "arrow-up-za" ] -} \ No newline at end of file +} diff --git a/icons/axis-3d.json b/icons/axis-3d.json index 664c5e4e6ed..e43ab304b79 100644 --- a/icons/axis-3d.json +++ b/icons/axis-3d.json @@ -13,4 +13,4 @@ "aliases": [ "axis-3-d" ] -} \ No newline at end of file +} diff --git a/icons/book-heart.svg b/icons/book-heart.svg index 18dc3e25eac..77cffae0dd4 100644 --- a/icons/book-heart.svg +++ b/icons/book-heart.svg @@ -10,5 +10,5 @@ stroke-linejoin="round" > - + diff --git a/icons/castle.svg b/icons/castle.svg index 6a3f05198f1..d7673f41f2c 100644 --- a/icons/castle.svg +++ b/icons/castle.svg @@ -9,9 +9,9 @@ stroke-linecap="round" stroke-linejoin="round" > - + - + diff --git a/icons/church.svg b/icons/church.svg index 5425f6a7a6c..c3ea5fce39d 100644 --- a/icons/church.svg +++ b/icons/church.svg @@ -10,7 +10,7 @@ stroke-linejoin="round" > - + diff --git a/icons/earth.svg b/icons/earth.svg index b9d0d03916a..b682a309ae1 100644 --- a/icons/earth.svg +++ b/icons/earth.svg @@ -10,7 +10,7 @@ stroke-linejoin="round" > - - + + diff --git a/icons/file-axis-3d.json b/icons/file-axis-3d.json index 5a45cbfb108..c3dc1243856 100644 --- a/icons/file-axis-3d.json +++ b/icons/file-axis-3d.json @@ -17,4 +17,4 @@ "aliases": [ "file-axis-3-d" ] -} \ No newline at end of file +} diff --git a/icons/fuel.svg b/icons/fuel.svg index 12831ce8a24..0704d039902 100644 --- a/icons/fuel.svg +++ b/icons/fuel.svg @@ -12,5 +12,5 @@ - + diff --git a/icons/grab.svg b/icons/grab.svg index fe2da383a68..d2a5abb0513 100644 --- a/icons/grab.svg +++ b/icons/grab.svg @@ -9,9 +9,9 @@ stroke-linecap="round" stroke-linejoin="round" > - - - - + + + + diff --git a/icons/grid-2x2.json b/icons/grid-2x2.json index 53baa92d2ee..acf114b0187 100644 --- a/icons/grid-2x2.json +++ b/icons/grid-2x2.json @@ -30,4 +30,4 @@ "aliases": [ "grid-2-x-2" ] -} \ No newline at end of file +} diff --git a/icons/grid-3x3.json b/icons/grid-3x3.json index 2bf56516971..2e6ea56eabd 100644 --- a/icons/grid-3x3.json +++ b/icons/grid-3x3.json @@ -21,4 +21,4 @@ "grid", "grid-3-x-3" ] -} \ No newline at end of file +} diff --git a/icons/guitar.svg b/icons/guitar.svg index bb0f2988c40..9d48887494a 100644 --- a/icons/guitar.svg +++ b/icons/guitar.svg @@ -13,5 +13,5 @@ - + diff --git a/icons/hand-metal.svg b/icons/hand-metal.svg index 0b663c0f45c..f8e72e325b4 100644 --- a/icons/hand-metal.svg +++ b/icons/hand-metal.svg @@ -9,7 +9,7 @@ stroke-linecap="round" stroke-linejoin="round" > - + diff --git a/icons/hand.svg b/icons/hand.svg index 3a1f6f34cfc..30af9046926 100644 --- a/icons/hand.svg +++ b/icons/hand.svg @@ -9,8 +9,8 @@ stroke-linecap="round" stroke-linejoin="round" > - - - + + + diff --git a/icons/hard-hat.svg b/icons/hard-hat.svg index ab61e2e95e7..50056a6f235 100644 --- a/icons/hard-hat.svg +++ b/icons/hard-hat.svg @@ -9,7 +9,7 @@ stroke-linecap="round" stroke-linejoin="round" > - + diff --git a/icons/lasso-select.svg b/icons/lasso-select.svg index 90a1cc73ce7..d5f7c99ab8f 100644 --- a/icons/lasso-select.svg +++ b/icons/lasso-select.svg @@ -11,7 +11,7 @@ > - - - + + + diff --git a/icons/mail-search.svg b/icons/mail-search.svg index bf3eba70f81..b7c11fc4364 100644 --- a/icons/mail-search.svg +++ b/icons/mail-search.svg @@ -11,7 +11,7 @@ > - + diff --git a/icons/mailbox.svg b/icons/mailbox.svg index 3d9c8c2deb3..747f7099d7c 100644 --- a/icons/mailbox.svg +++ b/icons/mailbox.svg @@ -9,7 +9,7 @@ stroke-linecap="round" stroke-linejoin="round" > - + diff --git a/icons/mic-vocal.svg b/icons/mic-vocal.svg index b791a20dd9f..acd8cda67e1 100644 --- a/icons/mic-vocal.svg +++ b/icons/mic-vocal.svg @@ -10,6 +10,6 @@ stroke-linejoin="round" > - + diff --git a/icons/move-3d.json b/icons/move-3d.json index faab605319d..94bfe740765 100644 --- a/icons/move-3d.json +++ b/icons/move-3d.json @@ -18,4 +18,4 @@ "aliases": [ "move-3-d" ] -} \ No newline at end of file +} diff --git a/icons/party-popper.svg b/icons/party-popper.svg index d6e0daf68b6..2547a7f4d31 100644 --- a/icons/party-popper.svg +++ b/icons/party-popper.svg @@ -15,7 +15,7 @@ - - - + + + diff --git a/icons/piggy-bank.svg b/icons/piggy-bank.svg index 8fc740b52ba..597f9486e1b 100644 --- a/icons/piggy-bank.svg +++ b/icons/piggy-bank.svg @@ -9,7 +9,7 @@ stroke-linecap="round" stroke-linejoin="round" > - + diff --git a/icons/plug-2.svg b/icons/plug-2.svg index 7eb77ba643f..fe7fef2e047 100644 --- a/icons/plug-2.svg +++ b/icons/plug-2.svg @@ -13,5 +13,5 @@ - + diff --git a/icons/pointer.svg b/icons/pointer.svg index ddf45d42431..fdde19f4a28 100644 --- a/icons/pointer.svg +++ b/icons/pointer.svg @@ -10,8 +10,8 @@ stroke-linejoin="round" > - - - + + + diff --git a/icons/radiation.svg b/icons/radiation.svg index 2f0bc2cfe78..40d2b46ba39 100644 --- a/icons/radiation.svg +++ b/icons/radiation.svg @@ -10,7 +10,7 @@ stroke-linejoin="round" > - - - + + + diff --git a/icons/rat.svg b/icons/rat.svg index f655631d75f..e113c3674b7 100644 --- a/icons/rat.svg +++ b/icons/rat.svg @@ -9,8 +9,8 @@ stroke-linecap="round" stroke-linejoin="round" > - - + + diff --git a/icons/redo-2.svg b/icons/redo-2.svg index 5c59c147176..72371c8d34b 100644 --- a/icons/redo-2.svg +++ b/icons/redo-2.svg @@ -10,5 +10,5 @@ stroke-linejoin="round" > - + diff --git a/icons/rotate-3d.json b/icons/rotate-3d.json index c2aa7d7a0c8..6f0ea1fa2a9 100644 --- a/icons/rotate-3d.json +++ b/icons/rotate-3d.json @@ -16,4 +16,4 @@ "aliases": [ "rotate-3-d" ] -} \ No newline at end of file +} diff --git a/icons/scale-3d.json b/icons/scale-3d.json index c6c724fe681..6f5b0b508a5 100644 --- a/icons/scale-3d.json +++ b/icons/scale-3d.json @@ -17,4 +17,4 @@ "aliases": [ "scale-3-d" ] -} \ No newline at end of file +} diff --git a/icons/shrub.svg b/icons/shrub.svg index 25414728471..22e566c0bb0 100644 --- a/icons/shrub.svg +++ b/icons/shrub.svg @@ -10,6 +10,6 @@ stroke-linejoin="round" > - + diff --git a/icons/stethoscope.svg b/icons/stethoscope.svg index f0b295735b4..7d1a1c57098 100644 --- a/icons/stethoscope.svg +++ b/icons/stethoscope.svg @@ -9,7 +9,7 @@ stroke-linecap="round" stroke-linejoin="round" > - - + + diff --git a/icons/sticker.svg b/icons/sticker.svg index 69bbbd39162..ca9c7cad8e5 100644 --- a/icons/sticker.svg +++ b/icons/sticker.svg @@ -9,7 +9,7 @@ stroke-linecap="round" stroke-linejoin="round" > - + diff --git a/icons/store.svg b/icons/store.svg index 8c536fe0e0b..89c0c9ee0e8 100644 --- a/icons/store.svg +++ b/icons/store.svg @@ -13,5 +13,5 @@ - + diff --git a/icons/swatch-book.svg b/icons/swatch-book.svg index cbf87cba0ea..5daba1edd76 100644 --- a/icons/swatch-book.svg +++ b/icons/swatch-book.svg @@ -11,6 +11,6 @@ > - + diff --git a/icons/test-tube-diagonal.svg b/icons/test-tube-diagonal.svg index 7288cf9622a..233adea9254 100644 --- a/icons/test-tube-diagonal.svg +++ b/icons/test-tube-diagonal.svg @@ -9,7 +9,7 @@ stroke-linecap="round" stroke-linejoin="round" > - + diff --git a/icons/test-tube.svg b/icons/test-tube.svg index b5453d07692..bf38c2eb4bf 100644 --- a/icons/test-tube.svg +++ b/icons/test-tube.svg @@ -9,7 +9,7 @@ stroke-linecap="round" stroke-linejoin="round" > - + diff --git a/icons/test-tubes.svg b/icons/test-tubes.svg index 4bd2127781b..fd5eff1dd63 100644 --- a/icons/test-tubes.svg +++ b/icons/test-tubes.svg @@ -9,8 +9,8 @@ stroke-linecap="round" stroke-linejoin="round" > - - + + diff --git a/icons/thumbs-down.svg b/icons/thumbs-down.svg index f15459f3e3b..1d3ee758fd2 100644 --- a/icons/thumbs-down.svg +++ b/icons/thumbs-down.svg @@ -10,5 +10,5 @@ stroke-linejoin="round" > - + diff --git a/icons/thumbs-up.svg b/icons/thumbs-up.svg index a7915f46ae8..cc536c03cd0 100644 --- a/icons/thumbs-up.svg +++ b/icons/thumbs-up.svg @@ -10,5 +10,5 @@ stroke-linejoin="round" > - + diff --git a/icons/trees.svg b/icons/trees.svg index 37a38b58833..15c03c75abf 100644 --- a/icons/trees.svg +++ b/icons/trees.svg @@ -9,7 +9,7 @@ stroke-linecap="round" stroke-linejoin="round" > - + diff --git a/icons/undo-2.svg b/icons/undo-2.svg index b38d9e1350a..3e93594c0a4 100644 --- a/icons/undo-2.svg +++ b/icons/undo-2.svg @@ -10,5 +10,5 @@ stroke-linejoin="round" > - + diff --git a/icons/university.svg b/icons/university.svg index 4ec47bfbe39..ceb05e5b86a 100644 --- a/icons/university.svg +++ b/icons/university.svg @@ -15,5 +15,5 @@ - + diff --git a/icons/utensils.svg b/icons/utensils.svg index 61c33243b9f..ff060490021 100644 --- a/icons/utensils.svg +++ b/icons/utensils.svg @@ -11,5 +11,5 @@ > - + From 05762a47975eee8788e6c8fa348eb77ee22c838f Mon Sep 17 00:00:00 2001 From: Eric Fennis Date: Fri, 21 Jun 2024 17:07:19 +0200 Subject: [PATCH 17/22] Revert changes in PR yml --- .github/workflows/pull-request.yml | 12 ++---------- 1 file changed, 2 insertions(+), 10 deletions(-) diff --git a/.github/workflows/pull-request.yml b/.github/workflows/pull-request.yml index 0f91c5c0402..ec3bb52cc58 100644 --- a/.github/workflows/pull-request.yml +++ b/.github/workflows/pull-request.yml @@ -39,26 +39,20 @@ jobs: with: fetch-depth: 0 ref: refs/pull/${{ github.event.pull_request.number }}/merge - - name: Get changed files id: changed-files uses: tj-actions/changed-files@v41 with: files: icons/* - - uses: actions/setup-node@v4 - - uses: pnpm/action-setup@v2 - - name: Install simple-git (safer and faster than installing all deps) - run: pnpm install simple-git - + run: npm install simple-git - name: Generate annotations run: node ./scripts/updateContributors.mjs env: GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} FETCH_DEPTH: ${{ github.event.pull_request.commits }} CHANGED_FILES: ${{ steps.changed-files.outputs.all_changed_files }} - - name: Generate annotations env: ANNOTATION_SEVERITY: notice @@ -111,10 +105,8 @@ jobs: body-includes: Added or changed icons - uses: actions/setup-node@v4 - - uses: pnpm/action-setup@v2 - - name: Install svgson for code preview (safer and faster than installing all deps) - run: pnpm install svgson + run: npm install svgson - name: Generate comment markup run: node ./scripts/generateChangedIconsCommentMarkup.mjs >> comment-markup.md From 1c6262b7329c7f10e65a1552c3b42da2cad61f40 Mon Sep 17 00:00:00 2001 From: Eric Fennis Date: Fri, 21 Jun 2024 17:21:16 +0200 Subject: [PATCH 18/22] Fix lint issues --- .eslintrc.js | 8 +++++++- docs/scripts/writeVercelOutput.mjs | 1 - packages/lucide-static/scripts/buildLib.mjs | 3 +-- tools/build-icons/building/generateAliasesFile.mjs | 8 ++++---- tools/build-icons/cli.mjs | 2 +- tools/build-icons/utils/getIconMetaData.mjs | 1 + 6 files changed, 14 insertions(+), 9 deletions(-) diff --git a/.eslintrc.js b/.eslintrc.js index c6bd5fed049..247379beb28 100644 --- a/.eslintrc.js +++ b/.eslintrc.js @@ -15,7 +15,13 @@ module.exports = { 'no-use-before-define': 'off', 'import/no-extraneous-dependencies': [ 'error', - { devDependencies: ['**/*.test.js', '**/*.spec.js', './scripts/**'] }, + { + devDependencies: [ + '**/*.test.js', + '**/*.spec.js', + '**/scripts/**', + ] + }, ], 'import/extensions': [ 'error', diff --git a/docs/scripts/writeVercelOutput.mjs b/docs/scripts/writeVercelOutput.mjs index b6ec20df8e7..87885d16606 100644 --- a/docs/scripts/writeVercelOutput.mjs +++ b/docs/scripts/writeVercelOutput.mjs @@ -1,6 +1,5 @@ import path from 'path'; import fs from 'fs'; -/* eslint-disable import/no-extraneous-dependencies */ import { getIconMetaData } from '@lucide/build-icons'; import { getCurrentDirPath } from '@lucide/helpers'; diff --git a/packages/lucide-static/scripts/buildLib.mjs b/packages/lucide-static/scripts/buildLib.mjs index 8f35c4b5e4d..a654be7e14d 100644 --- a/packages/lucide-static/scripts/buildLib.mjs +++ b/packages/lucide-static/scripts/buildLib.mjs @@ -1,4 +1,3 @@ -/* eslint-disable import/no-extraneous-dependencies */ import fs from 'fs'; import path from 'path'; import getArgumentOptions from 'minimist'; @@ -10,7 +9,7 @@ import generateSprite from './generateSprite.mjs'; import generateIconNodes from './generateIconNodes.mjs'; import copyIcons from './copyIcons.mjs'; -import pkg from '../package.json' assert { type: 'json' }; +import pkg from '../package.json' with { type: 'json' }; const cliArguments = getArgumentOptions(process.argv.slice(2)); const createDirectory = (dir) => { diff --git a/tools/build-icons/building/generateAliasesFile.mjs b/tools/build-icons/building/generateAliasesFile.mjs index ccb8f2c973f..2da0cb6b80c 100644 --- a/tools/build-icons/building/generateAliasesFile.mjs +++ b/tools/build-icons/building/generateAliasesFile.mjs @@ -8,7 +8,7 @@ const getImportString = ( iconName, aliasImportFileExtension, deprecated, - deprecationReason = '', + deprecationReason = '' ) => deprecated ? `export {\n` + @@ -100,7 +100,7 @@ export default async function generateAliasesFile({ exportFileIcon, aliasImportFileExtension, alias.deprecated, - deprecationReason, + deprecationReason ); if (!aliasNamesOnly) { @@ -109,7 +109,7 @@ export default async function generateAliasesFile({ exportFileIcon, aliasImportFileExtension, alias.deprecated, - deprecationReason, + deprecationReason ); importString += getImportString( @@ -117,7 +117,7 @@ export default async function generateAliasesFile({ exportFileIcon, aliasImportFileExtension, alias.deprecated, - deprecationReason, + deprecationReason ); } }) diff --git a/tools/build-icons/cli.mjs b/tools/build-icons/cli.mjs index 34009984756..3c1f60e376c 100755 --- a/tools/build-icons/cli.mjs +++ b/tools/build-icons/cli.mjs @@ -3,13 +3,13 @@ import fs from 'fs'; import path from 'path'; import getArgumentOptions from 'minimist'; -// eslint-disable-next-line import/no-extraneous-dependencies import { readSvgDirectory } from '@lucide/helpers'; import renderIconsObject from './render/renderIconsObject.mjs'; import generateIconFiles from './building/generateIconFiles.mjs'; import generateExportsFile from './building/generateExportsFile.mjs'; import generateAliasesFile from './building/generateAliasesFile.mjs'; +// eslint-disable-next-line import/no-named-as-default, import/no-named-as-default-member import getIconMetaData from './utils/getIconMetaData.mjs'; import generateDynamicImports from './building/generateDynamicImports.mjs'; diff --git a/tools/build-icons/utils/getIconMetaData.mjs b/tools/build-icons/utils/getIconMetaData.mjs index bddca575fa6..7c8c149caee 100644 --- a/tools/build-icons/utils/getIconMetaData.mjs +++ b/tools/build-icons/utils/getIconMetaData.mjs @@ -5,6 +5,7 @@ async function getIconMetaData(iconDirectory) { const iconJsons = readSvgDirectory(iconDirectory, '.json'); const aliasesEntries = await Promise.all( iconJsons.map(async (jsonFile) => { + /** eslint-disable */ const file = await import(path.join(iconDirectory, jsonFile), { assert: { type: 'json' } }); return [path.basename(jsonFile, '.json'), file.default]; }), From 117b098f236b93fcb88b8b90cb6638f353e39ea4 Mon Sep 17 00:00:00 2001 From: Eric Fennis Date: Fri, 21 Jun 2024 18:47:45 +0200 Subject: [PATCH 19/22] Fix site build --- docs/.vitepress/data/packageData.json | 11 ---- docs/.vitepress/lib/fetchPackages.ts | 6 -- .../components/packages/PackageList.data.ts | 3 +- .../theme/components/packages/PackageList.vue | 3 +- .../components/packages/PackageListItem.vue | 2 +- docs/package.json | 1 - pnpm-lock.yaml | 56 +++++++------------ 7 files changed, 26 insertions(+), 56 deletions(-) diff --git a/docs/.vitepress/data/packageData.json b/docs/.vitepress/data/packageData.json index 2e9bc22e9e4..613ed60e793 100644 --- a/docs/.vitepress/data/packageData.json +++ b/docs/.vitepress/data/packageData.json @@ -158,16 +158,5 @@ "href": "https://www.npmjs.com/package/lucide-static" } ] - }, - "lucide-flutter": { - "order": 9, - "icon": "flutter", - "shields": [ - { - "alt": "flutter", - "src": "https://img.shields.io/pub/v/lucide_icons", - "href": "https://img.shields.io/pub/v/lucide_icons" - } - ] } } diff --git a/docs/.vitepress/lib/fetchPackages.ts b/docs/.vitepress/lib/fetchPackages.ts index 9f6796547e7..aede2783964 100644 --- a/docs/.vitepress/lib/fetchPackages.ts +++ b/docs/.vitepress/lib/fetchPackages.ts @@ -1,6 +1,5 @@ import { promises as fs, constants } from 'fs'; import path from 'path'; -import yaml from 'js-yaml'; import { PackageItem } from '../theme/types'; const fileExist = (filePath) => @@ -27,11 +26,6 @@ const fetchPackages = async (): Promise => { return JSON.parse(await fs.readFile(jsonFilePath, 'utf-8')); } - const ymlFilePath = path.resolve(filePath, 'pubspec.yaml'); - if (await fileExist(ymlFilePath)) { - return yaml.load(await fs.readFile(ymlFilePath, 'utf-8')); - } - return null; }), ); diff --git a/docs/.vitepress/theme/components/packages/PackageList.data.ts b/docs/.vitepress/theme/components/packages/PackageList.data.ts index 8d38ba3d551..0649ded640c 100644 --- a/docs/.vitepress/theme/components/packages/PackageList.data.ts +++ b/docs/.vitepress/theme/components/packages/PackageList.data.ts @@ -5,9 +5,10 @@ import fetchPackages from '../../../lib/fetchPackages'; export default { async load() { const packages = await fetchPackages(); + return { packages: packages - .filter((p) => p.name in packageData) + .filter((p) => p?.name != null && p.name in packageData) .map((pData) => ({ ...pData, ...packageData[pData.name], diff --git a/docs/.vitepress/theme/components/packages/PackageList.vue b/docs/.vitepress/theme/components/packages/PackageList.vue index 8cbdc67f2d6..ba321ff4d0e 100644 --- a/docs/.vitepress/theme/components/packages/PackageList.vue +++ b/docs/.vitepress/theme/components/packages/PackageList.vue @@ -1,7 +1,8 @@ +import PackageListItem from "./PackageListItem.vue"; +