diff --git a/.github/workflows/labeler.yml b/.github/workflows/labeler.yml index bf474c478..1e3fdd376 100644 --- a/.github/workflows/labeler.yml +++ b/.github/workflows/labeler.yml @@ -9,4 +9,5 @@ jobs: pull-requests: write runs-on: ubuntu-latest steps: + - uses: actions/checkout@v4 - uses: actions/labeler@v5 diff --git a/.github/workflows/linting-icons.yml b/.github/workflows/linting-icons.yml index d768ff1b1..fc34e90f3 100644 --- a/.github/workflows/linting-icons.yml +++ b/.github/workflows/linting-icons.yml @@ -21,7 +21,7 @@ jobs: files: icons/* - name: Generate annotations - run: node ./scripts/lintFilenames.mjs + run: node ./scripts/lintFilenames.mts env: CHANGED_FILES: ${{ steps.changed-files.outputs.all_changed_files }} diff --git a/.github/workflows/lucide-astro.yml b/.github/workflows/lucide-astro.yml index 0dc46e62c..671b62624 100644 --- a/.github/workflows/lucide-astro.yml +++ b/.github/workflows/lucide-astro.yml @@ -16,7 +16,7 @@ jobs: - uses: pnpm/action-setup@v2 - uses: actions/setup-node@v4 with: - node-version: 18 + node-version-file: 'package.json' cache: 'pnpm' - name: Install dependencies @@ -32,7 +32,7 @@ jobs: - uses: pnpm/action-setup@v2 - uses: actions/setup-node@v3.8.1 with: - node-version: 18 + node-version-file: 'package.json' cache: 'pnpm' - name: Install dependencies diff --git a/.github/workflows/pull-request-icon-preview.yml b/.github/workflows/pull-request-icon-preview.yml index 364530bf9..fc99feee0 100644 --- a/.github/workflows/pull-request-icon-preview.yml +++ b/.github/workflows/pull-request-icon-preview.yml @@ -32,7 +32,7 @@ jobs: echo ${{ github.event.number }} > ./pr/NR - name: Generate comment markup - run: node ./scripts/generateChangedIconsCommentMarkup.mjs >> ./pr/comment-markup.md + run: node ./scripts/generateChangedIconsCommentMarkup.mts >> ./pr/comment-markup.md id: comment-markup env: CHANGED_FILES: ${{ steps.changed-files.outputs.all_changed_files }} diff --git a/lucide-font/lucide.svg b/lucide-font/lucide.svg new file mode 100644 index 000000000..e69de29bb diff --git a/package.json b/package.json index 8beff855a..fd5a84d67 100644 --- a/package.json +++ b/package.json @@ -17,16 +17,12 @@ "lucide-static": "pnpm --filter lucide-static", "build:outline-icons": "pnpm --filter outline-svg start", "build:font": "pnpm --filter docs prebuild:releaseJson && pnpm --filter build-font start", - "optimize": "node ./scripts/optimizeSvgs.mjs", - "addjsons": "node scripts/addMissingIconJsonFiles.mjs", - "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", + "optimize": "node ./scripts/optimizeSvgs.mts", + "addjsons": "node ./scripts/addMissingIconJsonFiles.mts", + "checkIcons": "node ./scripts/checkIconsAndCategories.mts", + "generate:changelog": "node ./scripts/generateChangelog.mts", + "generate:contributors": "node ./scripts/updateContributors.mts icons/*.svg", + "generate:nextJSAliases": "node ./scripts/generateNextJSAliases.mts", "postinstall": "husky install", "lint:es": "eslint .", "lint:format": "prettier \"**/*.{js,mjs,ts,jsx,tsx,html,css,scss,json,yml,yaml}\" --check", @@ -37,9 +33,9 @@ "lint": "pnpm lint:es && pnpm lint:format && pnpm lint:json", "format": "prettier \"**/*.{js,mjs,ts,jsx,tsx,html,css,scss,json,yml,yaml}\" --write", "prepare": "husky install", - "gi": "node ./scripts/generate/generateIcons.mjs", - "rename": "node scripts/rename/renameIcon.mjs", - "renamePattern": "node scripts/rename/renamePattern.mjs" + "gi": "node ./scripts/generate/generateIcons.mts", + "rename": "node ./scripts/rename/renameIcon.mts", + "renamePattern": "node ./scripts/rename/renamePattern.mts" }, "devDependencies": { "@html-eslint/eslint-plugin": "^0.19.1", diff --git a/packages/astro/package.json b/packages/astro/package.json index 5cf1fab00..bf1777e48 100644 --- a/packages/astro/package.json +++ b/packages/astro/package.json @@ -40,7 +40,7 @@ }, "scripts": { "build": "pnpm clean && pnpm copy:license && pnpm build:icons", - "build:icons": "build-icons --output=./src --templateSrc=./scripts/exportTemplate.mjs --renderUniqueKey --withAliases --aliasesFileExtension=.ts --iconFileExtension=.ts --exportFileName=index.ts --pretty=false", + "build:icons": "build-icons --output=./src --templateSrc=./scripts/exportTemplate.mts --renderUniqueKey --withAliases --aliasesFileExtension=.ts --iconFileExtension=.ts --exportFileName=index.ts --pretty=false", "clean": "rm -rf dist && rm -rf stats && rm -rf ./src/icons/*.ts", "copy:license": "cp ../../LICENSE ./LICENSE", "test": "pnpm build:icons && vitest run", diff --git a/packages/astro/scripts/exportTemplate.mjs b/packages/astro/scripts/exportTemplate.mts similarity index 86% rename from packages/astro/scripts/exportTemplate.mjs rename to packages/astro/scripts/exportTemplate.mts index c298a66d5..c8a41ed3a 100644 --- a/packages/astro/scripts/exportTemplate.mjs +++ b/packages/astro/scripts/exportTemplate.mts @@ -1,7 +1,7 @@ -/* eslint-disable import/no-extraneous-dependencies */ -import base64SVG from '@lucide/build-icons/utils/base64SVG.mjs'; +import base64SVG from '@lucide/build-icons/utils/base64SVG'; +import defineExportTemplate from '@lucide/build-icons/utils/defineExportTemplate'; -export default async ({ +export default defineExportTemplate(async ({ componentName, iconName, children, @@ -39,4 +39,4 @@ const ${componentName} = createLucideIcon('${iconName}', ${JSON.stringify(keyles export default ${componentName}; `; -}; +}); diff --git a/packages/lucide-angular/package.json b/packages/lucide-angular/package.json index 0c6ae4fa2..8b89b7fc7 100644 --- a/packages/lucide-angular/package.json +++ b/packages/lucide-angular/package.json @@ -29,7 +29,7 @@ "build": "pnpm clean && pnpm copy:license && pnpm build:icons && pnpm build:ng", "copy:license": "cp ../../LICENSE ./LICENSE", "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=lucide-icons.ts", + "build:icons": "build-icons --output=./src --templateSrc=./scripts/exportTemplate.mts --renderUniqueKey --withAliases --aliasesFileExtension=.ts --iconFileExtension=.ts --exportFileName=lucide-icons.ts", "build:ng": "ng build --configuration production", "test": "ng test --no-watch --no-progress --browsers=ChromeHeadlessCI", "test:watch": "ng test", diff --git a/packages/lucide-angular/scripts/exportTemplate.mjs b/packages/lucide-angular/scripts/exportTemplate.mts similarity index 81% rename from packages/lucide-angular/scripts/exportTemplate.mjs rename to packages/lucide-angular/scripts/exportTemplate.mts index e9a965090..6376483cf 100644 --- a/packages/lucide-angular/scripts/exportTemplate.mjs +++ b/packages/lucide-angular/scripts/exportTemplate.mts @@ -1,7 +1,7 @@ -/* eslint-disable import/no-extraneous-dependencies */ -import base64SVG from '@lucide/build-icons/utils/base64SVG.mjs'; +import base64SVG from '@lucide/build-icons/utils/base64SVG'; +import defineExportTemplate from '@lucide/build-icons/utils/defineExportTemplate'; -export default async ({ +export default defineExportTemplate(async ({ componentName, iconName, children, @@ -30,4 +30,4 @@ const ${componentName}: LucideIconData = ${JSON.stringify(children)}; //eslint-d export default ${componentName}; `; -}; +}); diff --git a/packages/lucide-preact/package.json b/packages/lucide-preact/package.json index ae7a80f77..4e64b91d3 100644 --- a/packages/lucide-preact/package.json +++ b/packages/lucide-preact/package.json @@ -36,7 +36,7 @@ "build": "pnpm clean && pnpm copy:license && pnpm build:icons && pnpm build:bundles", "copy:license": "cp ../../LICENSE ./LICENSE", "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:icons": "build-icons --output=./src --templateSrc=./scripts/exportTemplate.mts --renderUniqueKey --withAliases --aliasesFileExtension=.ts --iconFileExtension=.ts --exportFileName=index.ts", "build:bundles": "rollup -c ./rollup.config.mjs", "test": "pnpm build:icons && vitest run", "version": "pnpm version --git-tag-version=false" diff --git a/packages/lucide-preact/scripts/exportTemplate.mjs b/packages/lucide-preact/scripts/exportTemplate.mts similarity index 81% rename from packages/lucide-preact/scripts/exportTemplate.mjs rename to packages/lucide-preact/scripts/exportTemplate.mts index 1608ac7b7..28cc154bc 100644 --- a/packages/lucide-preact/scripts/exportTemplate.mjs +++ b/packages/lucide-preact/scripts/exportTemplate.mts @@ -1,7 +1,7 @@ -/* eslint-disable import/no-extraneous-dependencies */ -import base64SVG from '@lucide/build-icons/utils/base64SVG.mjs'; +import base64SVG from '@lucide/build-icons/utils/base64SVG'; +import defineExportTemplate from '@lucide/build-icons/utils/defineExportTemplate'; -export default async ({ +export default defineExportTemplate(async ({ componentName, iconName, children, @@ -30,4 +30,4 @@ const ${componentName} = createLucideIcon('${iconName}', ${JSON.stringify(childr export default ${componentName}; `; -}; +}); diff --git a/packages/lucide-react-native/package.json b/packages/lucide-react-native/package.json index f6d76b35d..decdb8b68 100644 --- a/packages/lucide-react-native/package.json +++ b/packages/lucide-react-native/package.json @@ -37,7 +37,7 @@ "build": "pnpm clean && pnpm copy:license && pnpm build:icons && pnpm build:bundles", "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 --renderUniqueKey --iconFileExtension=.ts --exportFileName=index.ts --withAliases --aliasesFileExtension=.ts", + "build:icons": "build-icons --output=./src --templateSrc=./scripts/exportTemplate.mts --renderUniqueKey --iconFileExtension=.ts --exportFileName=index.ts --withAliases --aliasesFileExtension=.ts", "build:bundles": "rollup -c ./rollup.config.mjs", "test": "pnpm build:icons && vitest run", "version": "pnpm version --git-tag-version=false" diff --git a/packages/lucide-react-native/scripts/exportTemplate.mjs b/packages/lucide-react-native/scripts/exportTemplate.mts similarity index 81% rename from packages/lucide-react-native/scripts/exportTemplate.mjs rename to packages/lucide-react-native/scripts/exportTemplate.mts index 74b5ea3f4..19ed41dd9 100644 --- a/packages/lucide-react-native/scripts/exportTemplate.mjs +++ b/packages/lucide-react-native/scripts/exportTemplate.mts @@ -1,7 +1,7 @@ -/* eslint-disable import/no-extraneous-dependencies */ -import base64SVG from '@lucide/build-icons/utils/base64SVG.mjs'; +import base64SVG from '@lucide/build-icons/utils/base64SVG'; +import defineExportTemplate from '@lucide/build-icons/utils/defineExportTemplate'; -export default async ({ +export default defineExportTemplate(async ({ componentName, iconName, children, @@ -30,4 +30,4 @@ const ${componentName} = createLucideIcon('${componentName}', ${JSON.stringify(c export default ${componentName}; `; -}; +}); diff --git a/packages/lucide-react/package.json b/packages/lucide-react/package.json index e68f55d1e..e282a1852 100644 --- a/packages/lucide-react/package.json +++ b/packages/lucide-react/package.json @@ -42,7 +42,7 @@ "build": "pnpm clean && pnpm copy:license && pnpm build:icons && pnpm typecheck && pnpm build:bundles", "copy:license": "cp ../../LICENSE ./LICENSE", "clean": "rm -rf dist && rm -rf stats && rm -rf ./src/icons/*.ts && rm -f dynamic.* && rm -f dynamicIconImports.d.ts", - "build:icons": "build-icons --output=./src --templateSrc=./scripts/exportTemplate.mjs --renderUniqueKey --withAliases --withDynamicImports --separateAliasesFile --aliasesFileExtension=.ts --iconFileExtension=.ts --exportFileName=index.ts", + "build:icons": "build-icons --output=./src --templateSrc=./scripts/exportTemplate.mts --renderUniqueKey --withAliases --withDynamicImports --separateAliasesFile --aliasesFileExtension=.ts --iconFileExtension=.ts --exportFileName=index.ts", "build:bundles": "rollup -c ./rollup.config.mjs", "typecheck": "tsc", "typecheck:watch": "tsc -w", diff --git a/packages/lucide-react/rollup.config.mjs b/packages/lucide-react/rollup.config.mjs index 2893d87bd..6d518653a 100644 --- a/packages/lucide-react/rollup.config.mjs +++ b/packages/lucide-react/rollup.config.mjs @@ -2,7 +2,7 @@ import plugins from '@lucide/rollup-plugins'; import preserveDirectives from 'rollup-plugin-preserve-directives'; import pkg from './package.json' with { type: 'json' }; import dts from 'rollup-plugin-dts'; -import getAliasesEntryNames from './scripts/getAliasesEntryNames.mjs'; +import getAliasesEntryNames from './scripts/getAliasesEntryNames.mts'; const aliasesEntries = await getAliasesEntryNames(); diff --git a/packages/lucide-react/scripts/exportTemplate.mjs b/packages/lucide-react/scripts/exportTemplate.mts similarity index 82% rename from packages/lucide-react/scripts/exportTemplate.mjs rename to packages/lucide-react/scripts/exportTemplate.mts index 167d858a0..02cfae27f 100644 --- a/packages/lucide-react/scripts/exportTemplate.mjs +++ b/packages/lucide-react/scripts/exportTemplate.mts @@ -1,7 +1,7 @@ -/* eslint-disable import/no-extraneous-dependencies */ -import base64SVG from '@lucide/build-icons/utils/base64SVG.mjs'; +import base64SVG from '@lucide/build-icons/utils/base64SVG'; +import defineExportTemplate from '@lucide/build-icons/utils/defineExportTemplate'; -export default async ({ +export default defineExportTemplate(async({ componentName, iconName, children, @@ -33,4 +33,4 @@ const ${componentName} = createLucideIcon('${iconName}', __iconNode); export default ${componentName}; `; -}; +}); diff --git a/packages/lucide-react/scripts/getAliasesEntryNames.mjs b/packages/lucide-react/scripts/getAliasesEntryNames.mts similarity index 77% rename from packages/lucide-react/scripts/getAliasesEntryNames.mjs rename to packages/lucide-react/scripts/getAliasesEntryNames.mts index 3f634c2ee..f8dcd40b4 100644 --- a/packages/lucide-react/scripts/getAliasesEntryNames.mjs +++ b/packages/lucide-react/scripts/getAliasesEntryNames.mts @@ -1,6 +1,5 @@ import path from 'path'; -// eslint-disable-next-line import/no-extraneous-dependencies -import getIconMetaData from '@lucide/build-icons/utils/getIconMetaData.mjs'; +import getIconMetaData from '@lucide/build-icons/utils/getIconMetaData'; const ICONS_DIR = path.resolve(process.cwd(), '../../icons'); @@ -12,6 +11,6 @@ export default async function getAliasesEntryNames() { const aliases = iconWithAliases.flatMap(({ aliases }) => aliases); return aliases - .map((alias) => (typeof alias === 'string' ? alias : alias.name)) + .map((alias) => (typeof alias === 'string' ? alias : alias?.name)) .map((alias) => path.join('src/icons', `${alias}.ts`)); } diff --git a/packages/lucide-react/tsconfig.json b/packages/lucide-react/tsconfig.json index 61ee72b00..adcad72fc 100644 --- a/packages/lucide-react/tsconfig.json +++ b/packages/lucide-react/tsconfig.json @@ -14,6 +14,7 @@ "skipLibCheck": true, "resolveJsonModule": true, "allowSyntheticDefaultImports": true, + "allowImportingTsExtensions": true, "downlevelIteration": true, "sourceMap": true, "outDir": "./dist", @@ -21,4 +22,5 @@ "types": ["@testing-library/jest-dom"], }, "exclude": ["**/node_modules"], + "include": ["src"], } diff --git a/packages/lucide-solid/package.json b/packages/lucide-solid/package.json index 9acba987c..e80382a24 100644 --- a/packages/lucide-solid/package.json +++ b/packages/lucide-solid/package.json @@ -61,7 +61,7 @@ "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 --separateAliasesFile --aliasesFileExtension=.ts --iconFileExtension=.tsx --exportFileName=index.ts", + "build:icons": "build-icons --output=./src --templateSrc=./scripts/exportTemplate.mts --renderUniqueKey --withAliases --separateAliasesFile --aliasesFileExtension=.ts --iconFileExtension=.tsx --exportFileName=index.ts", "test": "pnpm build:icons && vitest run", "version": "pnpm version --git-tag-version=false" }, diff --git a/packages/lucide-solid/scripts/exportTemplate.mjs b/packages/lucide-solid/scripts/exportTemplate.mts similarity index 83% rename from packages/lucide-solid/scripts/exportTemplate.mjs rename to packages/lucide-solid/scripts/exportTemplate.mts index 5c1a4a686..4a686a69b 100644 --- a/packages/lucide-solid/scripts/exportTemplate.mjs +++ b/packages/lucide-solid/scripts/exportTemplate.mts @@ -1,7 +1,7 @@ -/* eslint-disable import/no-extraneous-dependencies */ -import base64SVG from '@lucide/build-icons/utils/base64SVG.mjs'; +import base64SVG from '@lucide/build-icons/utils/base64SVG'; +import defineExportTemplate from '@lucide/build-icons/utils/defineExportTemplate'; -export default async ({ +export default defineExportTemplate(async ({ componentName, iconName, children, @@ -35,4 +35,4 @@ const ${componentName} = (props: LucideProps) => ( export default ${componentName}; `; -}; +}); diff --git a/packages/lucide-static/package.json b/packages/lucide-static/package.json index 21994448b..da37ad6f0 100644 --- a/packages/lucide-static/package.json +++ b/packages/lucide-static/package.json @@ -30,19 +30,20 @@ "scripts": { "copy:license": "cp ../../LICENSE ./LICENSE", "build": "pnpm clean && pnpm copy:license && pnpm build:icons && pnpm build:bundles && pnpm build:lib && pnpm build:tags", - "build:tags": "node ../../scripts/migrateIconsToTags.mjs", - "build:icons": "build-icons --output=./src --templateSrc=./scripts/exportTemplate.mjs --iconFileExtension=.ts --withAliases --aliasNamesOnly --aliasesFileExtension=.ts --exportFileName=index.ts", - "build:lib": "node ./scripts/buildLib.mjs", + "build:tags": "node ./scripts/migrateIconsToTags.mts", + "build:icons": "build-icons --output=./src --templateSrc=./scripts/exportTemplate.mts --iconFileExtension=.ts --withAliases --aliasNamesOnly --aliasesFileExtension=.ts --exportFileName=index.ts", + "build:lib": "node ./scripts/buildLib.mts", "build:bundles": "rollup -c rollup.config.mjs", "clean": "rm -rf lib && rm -rf build && rm -rf icons && rm -f sprite.svg", "version": "pnpm version --git-tag-version=false" }, "devDependencies": { + "@lucide/build-icons": "workspace:*", + "@lucide/helpers": "workspace:*", + "@lucide/rollup-plugins": "workspace:*", + "@types/node": "^22.15.30", "prettier": "^2.3.2", "svgson": "^5.2.1", - "@lucide/build-icons": "workspace:*", - "@lucide/rollup-plugins": "workspace:*", - "@lucide/helpers": "workspace:*", "rollup": "^4.40.0", "rollup-plugin-dts": "^6.2.1" } diff --git a/packages/lucide-static/scripts/buildLib.mjs b/packages/lucide-static/scripts/buildLib.mts similarity index 53% rename from packages/lucide-static/scripts/buildLib.mjs rename to packages/lucide-static/scripts/buildLib.mts index f08bafe69..f90be4a42 100644 --- a/packages/lucide-static/scripts/buildLib.mjs +++ b/packages/lucide-static/scripts/buildLib.mts @@ -1,18 +1,16 @@ import fs from 'fs'; import path from 'path'; -import getArgumentOptions from 'minimist'; import { parseSync } from 'svgson'; import { readSvgDirectory, getCurrentDirPath } from '@lucide/helpers'; -import readSvgs from './readSvgs.mjs'; -import generateSprite from './generateSprite.mjs'; -import generateIconNodes from './generateIconNodes.mjs'; -import copyIcons from './copyIcons.mjs'; +import readSvgs from './readSvgs.mts'; +import generateSprite from './generateSprite.mts'; +import generateIconNodes from './generateIconNodes.mts'; +import copyIcons from './copyIcons.mts'; import pkg from '../package.json' with { type: 'json' }; -const cliArguments = getArgumentOptions(process.argv.slice(2)); -const createDirectory = (dir) => { +const createDirectory = (dir: string) => { if (!fs.existsSync(dir)) { fs.mkdirSync(dir); } @@ -22,7 +20,7 @@ const currentDir = getCurrentDirPath(import.meta.url); const PACKAGE_DIR = path.resolve(currentDir, '../'); const ICONS_DIR = path.join(PACKAGE_DIR, '../../icons'); -const LIB_DIR = path.join(PACKAGE_DIR, cliArguments.output || 'lib'); +const LIB_DIR = path.join(PACKAGE_DIR, 'lib'); const ICON_MODULE_DIR = path.join(LIB_DIR, 'icons'); const license = `@license ${pkg.name} v${pkg.version} - ${pkg.license}`; @@ -33,14 +31,8 @@ createDirectory(ICON_MODULE_DIR); const svgFiles = await readSvgDirectory(ICONS_DIR); const svgs = await readSvgs(svgFiles, ICONS_DIR); -const parsedSvgs = svgs.map(({ name, contents }) => ({ - name, - contents, - parsedSvg: parseSync(contents), -})); - await Promise.all([ - generateSprite(parsedSvgs, PACKAGE_DIR, license), - generateIconNodes(parsedSvgs, PACKAGE_DIR), - copyIcons(parsedSvgs, PACKAGE_DIR, license), + generateSprite(svgs, PACKAGE_DIR, license), + generateIconNodes(svgs, PACKAGE_DIR), + copyIcons(svgs, PACKAGE_DIR, license), ]); diff --git a/packages/lucide-static/scripts/copyIcons.mjs b/packages/lucide-static/scripts/copyIcons.mts similarity index 80% rename from packages/lucide-static/scripts/copyIcons.mjs rename to packages/lucide-static/scripts/copyIcons.mts index 6624c169d..cfcb514cf 100644 --- a/packages/lucide-static/scripts/copyIcons.mjs +++ b/packages/lucide-static/scripts/copyIcons.mts @@ -1,7 +1,12 @@ import { writeFile } from 'fs/promises'; import { existsSync, unlinkSync, mkdirSync } from 'fs'; +import { type SVGFile } from './readSvgs.mts'; -export default async function copyIcons(parsedSvgs, packageDir, license) { +export default async function copyIcons( + parsedSvgs: SVGFile[], + packageDir: string, + license: string +) { const iconsDirectory = `${packageDir}/icons`; if (existsSync(iconsDirectory)) { diff --git a/packages/lucide-static/scripts/exportTemplate.mjs b/packages/lucide-static/scripts/exportTemplate.mts similarity index 69% rename from packages/lucide-static/scripts/exportTemplate.mjs rename to packages/lucide-static/scripts/exportTemplate.mts index 7d37bd4f1..4a74ad16d 100644 --- a/packages/lucide-static/scripts/exportTemplate.mjs +++ b/packages/lucide-static/scripts/exportTemplate.mts @@ -1,7 +1,7 @@ -/* eslint-disable import/no-extraneous-dependencies */ -import base64SVG from '@lucide/build-icons/utils/base64SVG.mjs'; +import base64SVG from '@lucide/build-icons/utils/base64SVG'; +import defineExportTemplate from '@lucide/build-icons/utils/defineExportTemplate'; -export default async ({ componentName, iconName, getSvg, deprecated, deprecationReason }) => { +export default defineExportTemplate(async ({ componentName, iconName, getSvg, deprecated, deprecationReason }) => { let svgContents = await getSvg(); const svgBase64 = base64SVG(svgContents); @@ -29,4 +29,4 @@ ${svgContents}\ export default ${componentName}; `; -}; +}); diff --git a/packages/lucide-static/scripts/generateIconNodes.mjs b/packages/lucide-static/scripts/generateIconNodes.mts similarity index 62% rename from packages/lucide-static/scripts/generateIconNodes.mjs rename to packages/lucide-static/scripts/generateIconNodes.mts index 5b34a2cea..a7b098dcb 100644 --- a/packages/lucide-static/scripts/generateIconNodes.mjs +++ b/packages/lucide-static/scripts/generateIconNodes.mts @@ -1,11 +1,12 @@ import { writeFile } from '@lucide/helpers'; +import { type SVGFile } from './readSvgs.mts'; -export default async function generateIconNodes(parsedSvgs, packageDir) { +export default async function generateIconNodes(parsedSvgs: SVGFile[], packageDir: string) { const iconNodes = parsedSvgs.reduce((acc, { name, parsedSvg }) => { acc[name] = parsedSvg.children.map(({ name, attributes }) => [name, attributes]); return acc; - }, {}); + }, {} as Record | undefined][]>); const iconNodesStringified = JSON.stringify(iconNodes, null, 2); diff --git a/packages/lucide-static/scripts/generateSprite.mjs b/packages/lucide-static/scripts/generateSprite.mts similarity index 62% rename from packages/lucide-static/scripts/generateSprite.mjs rename to packages/lucide-static/scripts/generateSprite.mts index 328ded79f..8e539b9f9 100644 --- a/packages/lucide-static/scripts/generateSprite.mjs +++ b/packages/lucide-static/scripts/generateSprite.mts @@ -1,36 +1,44 @@ /* eslint-disable import/no-extraneous-dependencies */ -import { stringify } from 'svgson'; +import { type INode, stringify } from 'svgson'; import { format } from 'prettier'; import { appendFile } from '@lucide/helpers'; +import { type SVGFile } from './readSvgs.mts'; -export default async function generateSprite(svgs, packageDir, license) { - const symbols = svgs.map(({ name, parsedSvg }) => ({ +export default async function generateSprite( + svgs: SVGFile[], + packageDir: string, + license: string +) { + const symbols = svgs.map(({ name, parsedSvg }) => ({ name: 'symbol', type: 'element', + value: '', attributes: { id: name, }, children: parsedSvg.children, })); - const spriteSvgObject = { + const spriteSvgObject: INode = { name: 'svg', type: 'element', attributes: { xmlns: 'http://www.w3.org/2000/svg', version: '1.1', }, + value: '', children: [ { name: 'defs', type: 'element', children: symbols, - }, + value: '', + } as INode, ], }; const spriteSvg = stringify(spriteSvgObject); - const prettifiedSprite = format(spriteSvg, { parser: 'babel' }).replace(/;/g, ''); + const prettifiedSprite = (await format(spriteSvg, { parser: 'babel' })).replace(/;/g, ''); const xmlMeta = `\n\n`; diff --git a/scripts/migrateIconsToTags.mjs b/packages/lucide-static/scripts/migrateIconsToTags.mts similarity index 81% rename from scripts/migrateIconsToTags.mjs rename to packages/lucide-static/scripts/migrateIconsToTags.mts index 73c62ad6b..979c065ba 100644 --- a/scripts/migrateIconsToTags.mjs +++ b/packages/lucide-static/scripts/migrateIconsToTags.mts @@ -1,5 +1,5 @@ import path from 'path'; -import { writeFile, getCurrentDirPath, readAllMetadata } from '../tools/build-helpers/helpers.mjs'; +import { writeFile, getCurrentDirPath, readAllMetadata } from '@lucide/helpers'; const currentDir = getCurrentDirPath(import.meta.url); const ICONS_DIR = path.resolve(currentDir, '../icons'); diff --git a/packages/lucide-static/scripts/readSvgs.mjs b/packages/lucide-static/scripts/readSvgs.mts similarity index 66% rename from packages/lucide-static/scripts/readSvgs.mjs rename to packages/lucide-static/scripts/readSvgs.mts index 0ec762e94..aae8cf51e 100644 --- a/packages/lucide-static/scripts/readSvgs.mjs +++ b/packages/lucide-static/scripts/readSvgs.mts @@ -1,6 +1,7 @@ /* eslint-disable import/no-extraneous-dependencies */ import { basename } from 'path'; import { readSvg } from '@lucide/helpers'; +import { type INode, parseSync } from 'svgson'; /** * Build an object in the format: `{ : }`. @@ -8,13 +9,23 @@ import { readSvg } from '@lucide/helpers'; * @param {Function} getSvg - A function that returns the contents of an SVG file given a filename. * @returns {Object} */ -export default function readSVGs(svgFiles, iconsDirectory) { +export default function readSVGs(svgFiles: string[], iconsDirectory: string) { const SVGReadPromises = svgFiles.map(async (svgFile) => { const name = basename(svgFile, '.svg'); const contents = await readSvg(svgFile, iconsDirectory); - return { name, contents }; + return { + name, + contents, + parsedSvg: parseSync(contents), + }; }); return Promise.all(SVGReadPromises); } + +export type SVGFile = { + name: string; + contents: string; + parsedSvg: INode +} diff --git a/packages/lucide-static/tsconfig.json b/packages/lucide-static/tsconfig.json index 7fdaedbf6..6e7572cfe 100644 --- a/packages/lucide-static/tsconfig.json +++ b/packages/lucide-static/tsconfig.json @@ -11,6 +11,7 @@ "allowJs": true, "lib": ["esnext", "dom"], "resolveJsonModule": true, + "allowImportingTsExtensions": true, "sourceMap": true, "outDir": "./dist", }, diff --git a/packages/lucide-svelte/package.json b/packages/lucide-svelte/package.json index 88d3c1912..05a8d20b0 100644 --- a/packages/lucide-svelte/package.json +++ b/packages/lucide-svelte/package.json @@ -49,9 +49,9 @@ "build": "pnpm clean && pnpm copy:license && pnpm build:icons && pnpm build:package && pnpm build:license", "copy:license": "cp ../../LICENSE ./LICENSE", "clean": "rm -rf dist && rm -rf stats && rm -rf ./src/icons/*.svelte && rm -f index.js", - "build:icons": "build-icons --output=./src --templateSrc=./scripts/exportTemplate.mjs --exportFileName=index.ts --iconFileExtension=.svelte --importImportFileExtension=.svelte --separateIconFileExport --separateIconFileExportExtension=.ts --withAliases --aliasesFileExtension=.ts --separateAliasesFile --separateAliasesFileExtension=.ts --aliasImportFileExtension=.js --pretty=false", + "build:icons": "build-icons --output=./src --templateSrc=./scripts/exportTemplate.mts --exportFileName=index.ts --iconFileExtension=.svelte --importImportFileExtension=.svelte --separateIconFileExport --separateIconFileExportExtension=.ts --withAliases --aliasesFileExtension=.ts --separateAliasesFile --separateAliasesFileExtension=.ts --aliasImportFileExtension=.js --pretty=false", "build:package": "svelte-package --input ./src", - "build:license": "node ./scripts/appendBlockComments.mjs", + "build:license": "node ./scripts/appendBlockComments.mts", "test": "pnpm copy:license && pnpm build:icons && vitest run", "test:watch": "vitest watch", "version": "pnpm version --git-tag-version=false" diff --git a/packages/lucide-svelte/scripts/appendBlockComments.mjs b/packages/lucide-svelte/scripts/appendBlockComments.mts similarity index 88% rename from packages/lucide-svelte/scripts/appendBlockComments.mjs rename to packages/lucide-svelte/scripts/appendBlockComments.mts index 6703b951b..2e6bf13c7 100644 --- a/packages/lucide-svelte/scripts/appendBlockComments.mjs +++ b/packages/lucide-svelte/scripts/appendBlockComments.mts @@ -2,7 +2,7 @@ import { lstatSync } from 'fs'; import { readdir, readFile, writeFile } from 'fs/promises'; import path from 'path'; import { getCurrentDirPath } from '@lucide/helpers'; -import { getJSBanner } from './license.mjs'; +import { getJSBanner } from './license.mts'; const currentDir = await getCurrentDirPath(import.meta.url); const targetDirectory = path.join(currentDir, '../dist'); @@ -21,7 +21,7 @@ for (const file of files) { if (filestat.isFile() === false || filestat.isDirectory()) continue; // eslint-disable-next-line no-await-in-loop - const contents = await readFile(filepath, { encoding: 'utf-8' }); + const contents = (await readFile(filepath, { encoding: 'utf-8' }) as unknown as string); let newContents = contents; const ext = path.extname(filepath); let license; @@ -38,7 +38,7 @@ for (const file of files) { if (/icons\/(.*?)\.svelte\.d\.ts/.test(filepath)) { const svelteFilepath = filepath.replace('.d.ts', ''); // eslint-disable-next-line no-await-in-loop - const svelteFileContents = await readFile(svelteFilepath, { encoding: 'utf-8' }); + const svelteFileContents = (await readFile(svelteFilepath, { encoding: 'utf-8' }) as unknown as string); const blockCommentRegex = /\/\*\*\n\s\*\s(@component\s@name)[\s\S]*?\*\//; const blockCommentMatch = blockCommentRegex.exec(svelteFileContents); diff --git a/packages/lucide-svelte/scripts/exportTemplate.mjs b/packages/lucide-svelte/scripts/exportTemplate.mts similarity index 80% rename from packages/lucide-svelte/scripts/exportTemplate.mjs rename to packages/lucide-svelte/scripts/exportTemplate.mts index acab05731..75051505a 100644 --- a/packages/lucide-svelte/scripts/exportTemplate.mjs +++ b/packages/lucide-svelte/scripts/exportTemplate.mts @@ -1,8 +1,8 @@ -/* eslint-disable import/no-extraneous-dependencies */ -import base64SVG from '@lucide/build-icons/utils/base64SVG.mjs'; -import { getJSBanner } from './license.mjs'; +import base64SVG from '@lucide/build-icons/utils/base64SVG'; +import { getJSBanner } from './license.mts'; +import defineExportTemplate from '@lucide/build-icons/utils/defineExportTemplate'; -export default async ({ +export default defineExportTemplate(async ({ iconName, children, componentName, @@ -40,4 +40,4 @@ const iconNode: IconNode = ${JSON.stringify(children)}; `; -}; +}); diff --git a/packages/lucide-svelte/scripts/license.mjs b/packages/lucide-svelte/scripts/license.mts similarity index 100% rename from packages/lucide-svelte/scripts/license.mjs rename to packages/lucide-svelte/scripts/license.mts diff --git a/packages/lucide-vue-next/package.json b/packages/lucide-vue-next/package.json index 227507966..44c832f0e 100644 --- a/packages/lucide-vue-next/package.json +++ b/packages/lucide-vue-next/package.json @@ -38,7 +38,7 @@ "build": "pnpm clean && pnpm copy:license && pnpm build:icons && pnpm build:bundles", "copy:license": "cp ../../LICENSE ./LICENSE", "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:icons": "build-icons --output=./src --templateSrc=./scripts/exportTemplate.mts --renderUniqueKey --withAliases --aliasesFileExtension=.ts --iconFileExtension=.ts --exportFileName=index.ts", "build:bundles": "rollup -c ./rollup.config.mjs", "test": "pnpm build:icons && vitest run", "test:watch": "vitest watch", diff --git a/packages/lucide-vue-next/scripts/exportTemplate.mjs b/packages/lucide-vue-next/scripts/exportTemplate.mts similarity index 87% rename from packages/lucide-vue-next/scripts/exportTemplate.mjs rename to packages/lucide-vue-next/scripts/exportTemplate.mts index e37c90a9a..19f401e67 100644 --- a/packages/lucide-vue-next/scripts/exportTemplate.mjs +++ b/packages/lucide-vue-next/scripts/exportTemplate.mts @@ -1,5 +1,4 @@ -/* eslint-disable import/no-extraneous-dependencies */ -import base64SVG from '@lucide/build-icons/utils/base64SVG.mjs'; +import base64SVG from '@lucide/build-icons/utils/base64SVG'; export default async ({ componentName, diff --git a/packages/lucide/package.json b/packages/lucide/package.json index 89dc4d3f6..f079a12bd 100644 --- a/packages/lucide/package.json +++ b/packages/lucide/package.json @@ -36,7 +36,7 @@ "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:icons": "build-icons --output=./src --templateSrc=./scripts/exportTemplate.mts --iconFileExtension=.ts --withAliases --aliasNamesOnly --aliasesFileExtension=.ts --exportFileName=index.ts", "build:bundle": "rollup -c rollup.config.mjs", "test": "pnpm build:icons && vitest run", "test:watch": "vitest watch", diff --git a/packages/lucide/scripts/exportTemplate.mjs b/packages/lucide/scripts/exportTemplate.mts similarity index 78% rename from packages/lucide/scripts/exportTemplate.mjs rename to packages/lucide/scripts/exportTemplate.mts index 66e18a6a8..130ce57c4 100644 --- a/packages/lucide/scripts/exportTemplate.mjs +++ b/packages/lucide/scripts/exportTemplate.mts @@ -1,7 +1,7 @@ -/* eslint-disable import/no-extraneous-dependencies */ -import base64SVG from '@lucide/build-icons/utils/base64SVG.mjs'; +import base64SVG from '@lucide/build-icons/utils/base64SVG'; +import defineExportTemplate from '@lucide/build-icons/utils/defineExportTemplate'; -export default async ({ +export default defineExportTemplate(async ({ componentName, iconName, children, @@ -30,4 +30,4 @@ const ${componentName}: IconNode = ${JSON.stringify(children)} export default ${componentName}; `; -}; +}); diff --git a/packages/svelte/package.json b/packages/svelte/package.json index d2139e3da..a1f3e6f3e 100644 --- a/packages/svelte/package.json +++ b/packages/svelte/package.json @@ -49,9 +49,9 @@ "build": "pnpm clean && pnpm copy:license && pnpm build:icons && pnpm build:package && pnpm build:license", "copy:license": "cp ../../LICENSE ./LICENSE", "clean": "rm -rf dist stats ./src/icons/*.{ts,svelte} ./src/aliases/{aliases,prefixed,suffixed}.ts", - "build:icons": "build-icons --output=./src --templateSrc=./scripts/exportTemplate.mjs --exportFileName=index.ts --iconFileExtension=.svelte --importImportFileExtension=.svelte --separateIconFileExport --separateIconFileExportExtension=.ts --withAliases --aliasesFileExtension=.ts --separateAliasesFile --separateAliasesFileExtension=.ts --aliasImportFileExtension=.js --pretty=false", + "build:icons": "build-icons --output=./src --templateSrc=./scripts/exportTemplate.mts --exportFileName=index.ts --iconFileExtension=.svelte --importImportFileExtension=.svelte --separateIconFileExport --separateIconFileExportExtension=.ts --withAliases --aliasesFileExtension=.ts --separateAliasesFile --separateAliasesFileExtension=.ts --aliasImportFileExtension=.js --pretty=false", "build:package": "svelte-package --input ./src", - "build:license": "node ./scripts/appendBlockComments.mjs", + "build:license": "node ./scripts/appendBlockComments.mts", "test": "pnpm copy:license && pnpm build:icons && vitest run", "test:watch": "vitest watch", "version": "pnpm version --git-tag-version=false" diff --git a/packages/svelte/scripts/appendBlockComments.mjs b/packages/svelte/scripts/appendBlockComments.mts similarity index 88% rename from packages/svelte/scripts/appendBlockComments.mjs rename to packages/svelte/scripts/appendBlockComments.mts index 9a6de5a9e..531454352 100644 --- a/packages/svelte/scripts/appendBlockComments.mjs +++ b/packages/svelte/scripts/appendBlockComments.mts @@ -2,7 +2,7 @@ import { lstatSync } from 'fs'; import { readdir, readFile, writeFile } from 'fs/promises'; import path from 'path'; import { getCurrentDirPath } from '@lucide/helpers'; -import { getJSBanner } from './license.mjs'; +import { getJSBanner } from './license.mts'; const currentDir = getCurrentDirPath(import.meta.url); const targetDirectory = path.join(currentDir, '../dist'); @@ -21,7 +21,7 @@ for (const file of files) { if (filestat.isFile() === false || filestat.isDirectory()) continue; // eslint-disable-next-line no-await-in-loop - const contents = await readFile(filepath, { encoding: 'utf-8' }); + const contents = (await readFile(filepath, { encoding: 'utf-8' })) as unknown as string; let newContents = contents; const ext = path.extname(filepath); let license; @@ -38,7 +38,7 @@ for (const file of files) { if (/icons\/(.*?)\.svelte\.d\.ts/.test(filepath)) { const svelteFilepath = filepath.replace('.d.ts', ''); // eslint-disable-next-line no-await-in-loop - const svelteFileContents = await readFile(svelteFilepath, { encoding: 'utf-8' }); + const svelteFileContents = (await readFile(svelteFilepath, { encoding: 'utf-8' })) as unknown as string;; const blockCommentRegex = /\/\*\*\n\s\*\s(@component\s@name)[\s\S]*?\*\//; const blockCommentMatch = blockCommentRegex.exec(svelteFileContents); diff --git a/packages/svelte/scripts/exportTemplate.mjs b/packages/svelte/scripts/exportTemplate.mts similarity index 80% rename from packages/svelte/scripts/exportTemplate.mjs rename to packages/svelte/scripts/exportTemplate.mts index 46e687e50..7aaa73b22 100644 --- a/packages/svelte/scripts/exportTemplate.mjs +++ b/packages/svelte/scripts/exportTemplate.mts @@ -1,8 +1,8 @@ -/* eslint-disable import/no-extraneous-dependencies */ -import base64SVG from '@lucide/build-icons/utils/base64SVG.mjs'; -import { getJSBanner } from './license.mjs'; +import base64SVG from '@lucide/build-icons/utils/base64SVG'; +import { getJSBanner } from './license.mts'; +import defineExportTemplate from '@lucide/build-icons/utils/defineExportTemplate'; -export default async ({ +export default defineExportTemplate(async ({ iconName, children, componentName, @@ -40,4 +40,4 @@ const iconNode: IconNode = ${JSON.stringify(children)}; {@render props.children?.()} `; -}; +}); diff --git a/packages/svelte/scripts/license.mjs b/packages/svelte/scripts/license.mts similarity index 100% rename from packages/svelte/scripts/license.mjs rename to packages/svelte/scripts/license.mts diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index d573c5568..035478de5 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -33,7 +33,7 @@ importers: version: 6.21.0(eslint@8.57.1)(typescript@5.8.3) ajv-cli: specifier: ^5.0.0 - version: 5.0.0(ts-node@10.9.2(@swc/core@1.7.23)(@types/node@22.15.18)(typescript@5.8.3)) + version: 5.0.0(ts-node@10.9.2(@swc/core@1.7.23)(@types/node@22.15.30)(typescript@5.8.3)) eslint: specifier: ^8.57.1 version: 8.57.1 @@ -187,13 +187,13 @@ importers: version: 3.5.0 vitepress: specifier: ^1.3.1 - version: 1.6.3(@algolia/client-search@5.25.0)(@types/node@22.15.18)(@types/react@18.3.21)(axios@1.7.4)(fuse.js@6.6.2)(less@4.2.0)(postcss@8.5.3)(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(sass@1.77.8)(search-insights@2.8.2)(stylus@0.56.0)(terser@5.39.2)(typescript@5.8.3) + version: 1.6.3(@algolia/client-search@5.25.0)(@types/node@22.15.30)(@types/react@18.3.21)(axios@1.7.4)(fuse.js@6.6.2)(less@4.2.0)(postcss@8.5.3)(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(sass@1.77.8)(search-insights@2.8.2)(stylus@0.56.0)(terser@5.39.2)(typescript@5.8.3) packages/astro: dependencies: astro: specifier: ^4 || ^5 - version: 5.5.2(@types/node@22.15.18)(jiti@2.4.2)(less@4.2.0)(rollup@4.40.2)(sass@1.77.8)(stylus@0.56.0)(terser@5.39.2)(typescript@5.8.3)(yaml@2.8.0) + version: 5.5.2(@types/node@22.15.30)(jiti@2.4.2)(less@4.2.0)(rollup@4.40.2)(sass@1.77.8)(stylus@0.56.0)(terser@5.39.2)(typescript@5.8.3)(yaml@2.8.0) devDependencies: '@astrojs/ts-plugin': specifier: ^1.10.4 @@ -221,7 +221,7 @@ importers: version: 5.8.3 vitest: specifier: ^3.1.3 - version: 3.1.3(@types/debug@4.1.12)(@types/node@22.15.18)(jiti@2.4.2)(jsdom@20.0.3)(less@4.2.0)(sass@1.77.8)(stylus@0.56.0)(terser@5.39.2)(yaml@2.8.0) + version: 3.1.3(@types/debug@4.1.12)(@types/node@22.15.30)(jiti@2.4.2)(jsdom@20.0.3)(less@4.2.0)(sass@1.77.8)(stylus@0.56.0)(terser@5.39.2)(yaml@2.8.0) packages/lucide: devDependencies: @@ -251,10 +251,10 @@ importers: version: 5.8.3 vite: specifier: ^6.3.4 - version: 6.3.4(@types/node@22.15.18)(jiti@2.4.2)(less@4.2.0)(sass@1.77.8)(stylus@0.56.0)(terser@5.39.2)(yaml@2.8.0) + version: 6.3.4(@types/node@22.15.30)(jiti@2.4.2)(less@4.2.0)(sass@1.77.8)(stylus@0.56.0)(terser@5.39.2)(yaml@2.8.0) vitest: specifier: ^3.1.3 - version: 3.1.3(@types/debug@4.1.12)(@types/node@22.15.18)(jiti@2.4.2)(jsdom@20.0.3)(less@4.2.0)(sass@1.77.8)(stylus@0.56.0)(terser@5.39.2)(yaml@2.8.0) + version: 3.1.3(@types/debug@4.1.12)(@types/node@22.15.30)(jiti@2.4.2)(jsdom@20.0.3)(less@4.2.0)(sass@1.77.8)(stylus@0.56.0)(terser@5.39.2)(yaml@2.8.0) packages/lucide-angular: devDependencies: @@ -375,7 +375,7 @@ importers: version: link:../shared '@preact/preset-vite': specifier: ^2.7.0 - version: 2.10.1(@babel/core@7.27.1)(preact@10.26.6)(vite@6.3.4(@types/node@22.15.18)(jiti@2.4.2)(less@4.2.0)(sass@1.77.8)(stylus@0.56.0)(terser@5.39.2)(yaml@2.8.0)) + version: 2.10.1(@babel/core@7.27.1)(preact@10.26.6)(vite@6.3.4(@types/node@22.15.30)(jiti@2.4.2)(less@4.2.0)(sass@1.77.8)(stylus@0.56.0)(terser@5.39.2)(yaml@2.8.0)) '@testing-library/jest-dom': specifier: ^6.1.4 version: 6.6.3 @@ -399,10 +399,10 @@ importers: version: 5.8.3 vite: specifier: ^6.3.4 - version: 6.3.4(@types/node@22.15.18)(jiti@2.4.2)(less@4.2.0)(sass@1.77.8)(stylus@0.56.0)(terser@5.39.2)(yaml@2.8.0) + version: 6.3.4(@types/node@22.15.30)(jiti@2.4.2)(less@4.2.0)(sass@1.77.8)(stylus@0.56.0)(terser@5.39.2)(yaml@2.8.0) vitest: specifier: ^3.1.3 - version: 3.1.3(@types/debug@4.1.12)(@types/node@22.15.18)(jiti@2.4.2)(jsdom@20.0.3)(less@4.2.0)(sass@1.77.8)(stylus@0.56.0)(terser@5.39.2)(yaml@2.8.0) + version: 3.1.3(@types/debug@4.1.12)(@types/node@22.15.30)(jiti@2.4.2)(jsdom@20.0.3)(less@4.2.0)(sass@1.77.8)(stylus@0.56.0)(terser@5.39.2)(yaml@2.8.0) packages/lucide-react: devDependencies: @@ -426,7 +426,7 @@ importers: version: 18.3.21 '@vitejs/plugin-react': specifier: ^4.4.1 - version: 4.4.1(vite@6.3.4(@types/node@22.15.18)(jiti@2.4.2)(less@4.2.0)(sass@1.77.8)(stylus@0.56.0)(terser@5.39.2)(yaml@2.8.0)) + version: 4.4.1(vite@6.3.4(@types/node@22.15.30)(jiti@2.4.2)(less@4.2.0)(sass@1.77.8)(stylus@0.56.0)(terser@5.39.2)(yaml@2.8.0)) jest-serializer-html: specifier: ^7.1.0 version: 7.1.0 @@ -450,10 +450,10 @@ importers: version: 5.8.3 vite: specifier: ^6.3.4 - version: 6.3.4(@types/node@22.15.18)(jiti@2.4.2)(less@4.2.0)(sass@1.77.8)(stylus@0.56.0)(terser@5.39.2)(yaml@2.8.0) + version: 6.3.4(@types/node@22.15.30)(jiti@2.4.2)(less@4.2.0)(sass@1.77.8)(stylus@0.56.0)(terser@5.39.2)(yaml@2.8.0) vitest: specifier: ^3.1.3 - version: 3.1.3(@types/debug@4.1.12)(@types/node@22.15.18)(jiti@2.4.2)(jsdom@20.0.3)(less@4.2.0)(sass@1.77.8)(stylus@0.56.0)(terser@5.39.2)(yaml@2.8.0) + version: 3.1.3(@types/debug@4.1.12)(@types/node@22.15.30)(jiti@2.4.2)(jsdom@20.0.3)(less@4.2.0)(sass@1.77.8)(stylus@0.56.0)(terser@5.39.2)(yaml@2.8.0) packages/lucide-react-native: devDependencies: @@ -480,7 +480,7 @@ importers: version: 18.3.21 '@vitejs/plugin-react': specifier: ^4.2.1 - version: 4.4.1(vite@6.3.4(@types/node@22.15.18)(jiti@2.4.2)(less@4.2.0)(sass@1.77.8)(stylus@0.56.0)(terser@5.39.2)(yaml@2.8.0)) + version: 4.4.1(vite@6.3.4(@types/node@22.15.30)(jiti@2.4.2)(less@4.2.0)(sass@1.77.8)(stylus@0.56.0)(terser@5.39.2)(yaml@2.8.0)) jest-serializer-html: specifier: ^7.1.0 version: 7.1.0 @@ -507,10 +507,10 @@ importers: version: 5.8.3 vite: specifier: ^6.3.4 - version: 6.3.4(@types/node@22.15.18)(jiti@2.4.2)(less@4.2.0)(sass@1.77.8)(stylus@0.56.0)(terser@5.39.2)(yaml@2.8.0) + version: 6.3.4(@types/node@22.15.30)(jiti@2.4.2)(less@4.2.0)(sass@1.77.8)(stylus@0.56.0)(terser@5.39.2)(yaml@2.8.0) vitest: specifier: ^3.1.3 - version: 3.1.3(@types/debug@4.1.12)(@types/node@22.15.18)(jiti@2.4.2)(jsdom@20.0.3)(less@4.2.0)(sass@1.77.8)(stylus@0.56.0)(terser@5.39.2)(yaml@2.8.0) + version: 3.1.3(@types/debug@4.1.12)(@types/node@22.15.30)(jiti@2.4.2)(jsdom@20.0.3)(less@4.2.0)(sass@1.77.8)(stylus@0.56.0)(terser@5.39.2)(yaml@2.8.0) packages/lucide-solid: devDependencies: @@ -561,13 +561,13 @@ importers: version: 5.8.3 vite: specifier: ^6.3.4 - version: 6.3.4(@types/node@22.15.18)(jiti@2.4.2)(less@4.2.0)(sass@1.77.8)(stylus@0.56.0)(terser@5.39.2)(yaml@2.8.0) + version: 6.3.4(@types/node@22.15.30)(jiti@2.4.2)(less@4.2.0)(sass@1.77.8)(stylus@0.56.0)(terser@5.39.2)(yaml@2.8.0) vite-plugin-solid: specifier: ^2.11.6 - version: 2.11.6(@testing-library/jest-dom@6.6.3)(solid-js@1.9.6)(vite@6.3.4(@types/node@22.15.18)(jiti@2.4.2)(less@4.2.0)(sass@1.77.8)(stylus@0.56.0)(terser@5.39.2)(yaml@2.8.0)) + version: 2.11.6(@testing-library/jest-dom@6.6.3)(solid-js@1.9.6)(vite@6.3.4(@types/node@22.15.30)(jiti@2.4.2)(less@4.2.0)(sass@1.77.8)(stylus@0.56.0)(terser@5.39.2)(yaml@2.8.0)) vitest: specifier: ^3.1.3 - version: 3.1.3(@types/debug@4.1.12)(@types/node@22.15.18)(jiti@2.4.2)(jsdom@20.0.3)(less@4.2.0)(sass@1.77.8)(stylus@0.56.0)(terser@5.39.2)(yaml@2.8.0) + version: 3.1.3(@types/debug@4.1.12)(@types/node@22.15.30)(jiti@2.4.2)(jsdom@20.0.3)(less@4.2.0)(sass@1.77.8)(stylus@0.56.0)(terser@5.39.2)(yaml@2.8.0) packages/lucide-static: devDependencies: @@ -580,6 +580,9 @@ importers: '@lucide/rollup-plugins': specifier: workspace:* version: link:../../tools/rollup-plugins + '@types/node': + specifier: ^22.15.30 + version: 22.15.30 prettier: specifier: ^2.3.2 version: 2.8.8 @@ -606,7 +609,7 @@ importers: version: 2.3.11(svelte@4.2.19)(typescript@5.8.3) '@sveltejs/vite-plugin-svelte': specifier: ^2.4.2 - version: 2.5.3(svelte@4.2.19)(vite@6.3.4(@types/node@22.15.18)(jiti@2.4.2)(less@4.2.0)(sass@1.77.8)(terser@5.39.2)(yaml@2.8.0)) + version: 2.5.3(svelte@4.2.19)(vite@6.3.4(@types/node@22.15.30)(jiti@2.4.2)(less@4.2.0)(sass@1.77.8)(terser@5.39.2)(yaml@2.8.0)) '@testing-library/jest-dom': specifier: ^6.1.4 version: 6.6.3 @@ -636,10 +639,10 @@ importers: version: 5.8.3 vite: specifier: ^6.3.4 - version: 6.3.4(@types/node@22.15.18)(jiti@2.4.2)(less@4.2.0)(sass@1.77.8)(stylus@0.56.0)(terser@5.39.2)(yaml@2.8.0) + version: 6.3.4(@types/node@22.15.30)(jiti@2.4.2)(less@4.2.0)(sass@1.77.8)(stylus@0.56.0)(terser@5.39.2)(yaml@2.8.0) vitest: specifier: ^3.1.3 - version: 3.1.3(@types/debug@4.1.12)(@types/node@22.15.18)(jiti@2.4.2)(jsdom@20.0.3)(less@4.2.0)(sass@1.77.8)(stylus@0.56.0)(terser@5.39.2)(yaml@2.8.0) + version: 3.1.3(@types/debug@4.1.12)(@types/node@22.15.30)(jiti@2.4.2)(jsdom@20.0.3)(less@4.2.0)(sass@1.77.8)(stylus@0.56.0)(terser@5.39.2)(yaml@2.8.0) packages/lucide-vue: devDependencies: @@ -660,7 +663,7 @@ importers: version: 5.9.0(vue-template-compiler@2.7.14(vue@2.7.14))(vue@2.7.14) '@vitejs/plugin-vue2': specifier: 2.2.0 - version: 2.2.0(vite@6.3.4(@types/node@22.15.18)(jiti@2.4.2)(less@4.2.0)(sass@1.77.8)(stylus@0.56.0)(terser@5.39.2)(yaml@2.8.0))(vue@2.7.14) + version: 2.2.0(vite@6.3.4(@types/node@22.15.30)(jiti@2.4.2)(less@4.2.0)(sass@1.77.8)(stylus@0.56.0)(terser@5.39.2)(yaml@2.8.0))(vue@2.7.14) '@vue/test-utils': specifier: 1.3.0 version: 1.3.0(vue-template-compiler@2.7.14(vue@2.7.14))(vue@2.7.14) @@ -672,10 +675,10 @@ importers: version: 5.8.3 vite: specifier: ^6.3.4 - version: 6.3.4(@types/node@22.15.18)(jiti@2.4.2)(less@4.2.0)(sass@1.77.8)(stylus@0.56.0)(terser@5.39.2)(yaml@2.8.0) + version: 6.3.4(@types/node@22.15.30)(jiti@2.4.2)(less@4.2.0)(sass@1.77.8)(stylus@0.56.0)(terser@5.39.2)(yaml@2.8.0) vitest: specifier: ^3.1.3 - version: 3.1.3(@types/debug@4.1.12)(@types/node@22.15.18)(jiti@2.4.2)(jsdom@20.0.3)(less@4.2.0)(sass@1.77.8)(stylus@0.56.0)(terser@5.39.2)(yaml@2.8.0) + version: 3.1.3(@types/debug@4.1.12)(@types/node@22.15.30)(jiti@2.4.2)(jsdom@20.0.3)(less@4.2.0)(sass@1.77.8)(stylus@0.56.0)(terser@5.39.2)(yaml@2.8.0) vue: specifier: 2.7.14 version: 2.7.14 @@ -702,7 +705,7 @@ importers: version: 8.1.0(@vue/compiler-sfc@3.5.14)(vue@3.5.14(typescript@5.8.3)) '@vitejs/plugin-vue': specifier: ^4.6.2 - version: 4.6.2(vite@6.3.4(@types/node@22.15.18)(jiti@2.4.2)(less@4.2.0)(sass@1.77.8)(stylus@0.56.0)(terser@5.39.2)(yaml@2.8.0))(vue@3.5.14(typescript@5.8.3)) + version: 4.6.2(vite@6.3.4(@types/node@22.15.30)(jiti@2.4.2)(less@4.2.0)(sass@1.77.8)(stylus@0.56.0)(terser@5.39.2)(yaml@2.8.0))(vue@3.5.14(typescript@5.8.3)) '@vue/test-utils': specifier: 2.4.5 version: 2.4.5 @@ -714,10 +717,10 @@ importers: version: 6.2.1(rollup@4.40.2)(typescript@5.8.3) vite: specifier: ^6.3.4 - version: 6.3.4(@types/node@22.15.18)(jiti@2.4.2)(less@4.2.0)(sass@1.77.8)(stylus@0.56.0)(terser@5.39.2)(yaml@2.8.0) + version: 6.3.4(@types/node@22.15.30)(jiti@2.4.2)(less@4.2.0)(sass@1.77.8)(stylus@0.56.0)(terser@5.39.2)(yaml@2.8.0) vitest: specifier: ^3.1.3 - version: 3.1.3(@types/debug@4.1.12)(@types/node@22.15.18)(jiti@2.4.2)(jsdom@20.0.3)(less@4.2.0)(sass@1.77.8)(stylus@0.56.0)(terser@5.39.2)(yaml@2.8.0) + version: 3.1.3(@types/debug@4.1.12)(@types/node@22.15.30)(jiti@2.4.2)(jsdom@20.0.3)(less@4.2.0)(sass@1.77.8)(stylus@0.56.0)(terser@5.39.2)(yaml@2.8.0) vue: specifier: ^3.4.21 version: 3.5.14(typescript@5.8.3) @@ -726,7 +729,7 @@ importers: devDependencies: vitest: specifier: ^3.1.3 - version: 3.1.3(@types/debug@4.1.12)(@types/node@22.15.18)(jiti@2.4.2)(jsdom@20.0.3)(less@4.2.0)(sass@1.77.8)(stylus@0.56.0)(terser@5.39.2)(yaml@2.8.0) + version: 3.1.3(@types/debug@4.1.12)(@types/node@22.15.30)(jiti@2.4.2)(jsdom@20.0.3)(less@4.2.0)(sass@1.77.8)(stylus@0.56.0)(terser@5.39.2)(yaml@2.8.0) packages/svelte: devDependencies: @@ -741,13 +744,13 @@ importers: version: 2.3.11(svelte@5.30.1)(typescript@5.8.3) '@sveltejs/vite-plugin-svelte': specifier: ^5.0.3 - version: 5.0.3(svelte@5.30.1)(vite@6.1.6(@types/node@22.15.18)(jiti@2.4.2)(less@4.2.0)(sass@1.77.8)(stylus@0.56.0)(terser@5.39.2)(yaml@2.8.0)) + version: 5.0.3(svelte@5.30.1)(vite@6.1.6(@types/node@22.15.30)(jiti@2.4.2)(less@4.2.0)(sass@1.77.8)(stylus@0.56.0)(terser@5.39.2)(yaml@2.8.0)) '@testing-library/jest-dom': specifier: ^6.1.4 version: 6.6.3 '@testing-library/svelte': specifier: ^5.2.7 - version: 5.2.7(svelte@5.30.1)(vite@6.1.6(@types/node@22.15.18)(jiti@2.4.2)(less@4.2.0)(sass@1.77.8)(stylus@0.56.0)(terser@5.39.2)(yaml@2.8.0))(vitest@3.1.3(@types/debug@4.1.12)(@types/node@22.15.18)(jiti@2.4.2)(jsdom@20.0.3)(less@4.2.0)(sass@1.77.8)(stylus@0.56.0)(terser@5.39.2)(yaml@2.8.0)) + version: 5.2.7(svelte@5.30.1)(vite@6.1.6(@types/node@22.15.30)(jiti@2.4.2)(less@4.2.0)(sass@1.77.8)(stylus@0.56.0)(terser@5.39.2)(yaml@2.8.0))(vitest@3.1.3(@types/debug@4.1.12)(@types/node@22.15.30)(jiti@2.4.2)(jsdom@20.0.3)(less@4.2.0)(sass@1.77.8)(stylus@0.56.0)(terser@5.39.2)(yaml@2.8.0)) '@tsconfig/svelte': specifier: ^5.0.4 version: 5.0.4 @@ -771,10 +774,10 @@ importers: version: 5.8.3 vite: specifier: 6.1.6 - version: 6.1.6(@types/node@22.15.18)(jiti@2.4.2)(less@4.2.0)(sass@1.77.8)(stylus@0.56.0)(terser@5.39.2)(yaml@2.8.0) + version: 6.1.6(@types/node@22.15.30)(jiti@2.4.2)(less@4.2.0)(sass@1.77.8)(stylus@0.56.0)(terser@5.39.2)(yaml@2.8.0) vitest: specifier: ^3.1.3 - version: 3.1.3(@types/debug@4.1.12)(@types/node@22.15.18)(jiti@2.4.2)(jsdom@20.0.3)(less@4.2.0)(sass@1.77.8)(stylus@0.56.0)(terser@5.39.2)(yaml@2.8.0) + version: 3.1.3(@types/debug@4.1.12)(@types/node@22.15.30)(jiti@2.4.2)(jsdom@20.0.3)(less@4.2.0)(sass@1.77.8)(stylus@0.56.0)(terser@5.39.2)(yaml@2.8.0) tools/build-font: dependencies: @@ -787,8 +790,22 @@ importers: svgtofont: specifier: ^6.0.0 version: 6.3.2(@types/svg2ttf@5.0.1)(chokidar@3.6.0) + devDependencies: + '@types/fs-extra': + specifier: ^11.0.4 + version: 11.0.4 + '@types/minimist': + specifier: ^1.2.5 + version: 1.2.5 + '@types/node': + specifier: ^22 + version: 22.15.30 - tools/build-helpers: {} + tools/build-helpers: + devDependencies: + '@types/node': + specifier: ^22 + version: 22.15.30 tools/build-icons: dependencies: @@ -808,6 +825,12 @@ importers: '@lucide/helpers': specifier: workspace:* version: link:../build-helpers + '@types/minimist': + specifier: ^1.2.5 + version: 1.2.5 + '@types/node': + specifier: ^22 + version: 22.15.30 tools/outline-svg: dependencies: @@ -5150,6 +5173,9 @@ packages: '@types/express@4.17.21': resolution: {integrity: sha512-ejlPM315qwLpaQlQDTjPdsUFSc6ZsP4AN6AlWnogPjQ7CVi7PYF3YVz+CY3jE2pwYf7E/7HlDAN0rV2GxTG0HQ==} + '@types/fs-extra@11.0.4': + resolution: {integrity: sha512-yTbItCNreRooED33qjunPthRcSjERP1r4MqCZc7wv0u2sUkzTFp45tgUfS5+r7FrZPdmCCNflLhVSP/o+SemsQ==} + '@types/fs-extra@8.1.2': resolution: {integrity: sha512-SvSrYXfWSc7R4eqnOzbQF4TZmfpNSM9FrSWLU3EUnWBuyZqNBOrv1B1JA3byUDPUl9z4Ab3jeZG2eDdySlgNMg==} @@ -5186,6 +5212,9 @@ packages: '@types/json5@0.0.29': resolution: {integrity: sha512-dRLjCWHYg4oaA77cxO64oO+7JwCwnIzkZPdrrC71jQmQtlhM556pwKo5bUzqvZndkVbeFLIIi+9TC40JNF5hNQ==} + '@types/jsonfile@6.1.4': + resolution: {integrity: sha512-D5qGUYwjvnNNextdU59/+fI+spnwtTFmyQP0h+PfIOSkNfpU6AOICUOkm4i0OnSk+NyjdPJrxCDro0sJsWlRpQ==} + '@types/linkify-it@5.0.0': resolution: {integrity: sha512-sVDA58zAw4eWAffKOaQH5/5j3XeayukzDk+ewSsnv3p4yJEZHCCzMDiZM8e0OUrRvmpGZ85jf4yDHkHsgBNr9Q==} @@ -5207,6 +5236,9 @@ packages: '@types/minimatch@5.1.2': resolution: {integrity: sha512-K0VQKziLUWkVKiRVrx4a40iPaxTUefQmjtkQofBkYRcoaaL/8rhwDWww9qWbrgicNOgnpIsMxyNIUM4+n6dUIA==} + '@types/minimist@1.2.5': + resolution: {integrity: sha512-hov8bUuiLiyFPGyFPE1lwWhmzYbirOXQNNo40+y3zow8aFVTeyn3VWL0VFFfdNddA8S4Vf0Tc062rzyNr7Paag==} + '@types/ms@2.1.0': resolution: {integrity: sha512-GsCCIZDE/p3i96vtEqx+7dBUGXrc7zeSK3wwPHIaRThS+9OhWIXRqzs4d6k1SVU8g91DrNRWxWUGhp5KXQb2VA==} @@ -5225,8 +5257,8 @@ packages: '@types/node@17.0.45': resolution: {integrity: sha512-w+tIMs3rq2afQdsPJlODhoUEKzFP1ayaoyl1CcnwtIlsVe7K7bA1NGm4s3PraqTLlXnbIN84zuBlxBWo1u9BLw==} - '@types/node@22.15.18': - resolution: {integrity: sha512-v1DKRfUdyW+jJhZNEI1PYy29S2YRxMV5AOO/x/SjKmW0acCIOqmbj6Haf9eHAhsPmrhlHSxEhv/1WszcLWV4cg==} + '@types/node@22.15.30': + resolution: {integrity: sha512-6Q7lr06bEHdlfplU6YRbgG1SFBdlsfNC4/lX+SkhiTs0cpJkOElmWls8PxDFv4yY/xKb8Y6SO0OmSX4wgqTZbA==} '@types/parse-json@4.0.2': resolution: {integrity: sha512-dISoDXWWQwUquiKsyZ4Ng+HX2KsPL7LyHKHQwgGFEA3IaKac4Obd+h2a/a6waisAoepJlBcx9paWqjA8/HVjCw==} @@ -16422,14 +16454,14 @@ snapshots: dependencies: '@jest/fake-timers': 29.7.0 '@jest/types': 29.6.3 - '@types/node': 12.20.55 + '@types/node': 22.15.30 jest-mock: 29.7.0 '@jest/fake-timers@29.7.0': dependencies: '@jest/types': 29.6.3 '@sinonjs/fake-timers': 10.3.0 - '@types/node': 12.20.55 + '@types/node': 22.15.30 jest-message-util: 29.7.0 jest-mock: 29.7.0 jest-util: 29.7.0 @@ -16463,7 +16495,7 @@ snapshots: '@jest/schemas': 29.6.3 '@types/istanbul-lib-coverage': 2.0.4 '@types/istanbul-reports': 3.0.1 - '@types/node': 12.20.55 + '@types/node': 22.15.30 '@types/yargs': 17.0.33 chalk: 4.1.2 @@ -17131,18 +17163,18 @@ snapshots: '@pkgjs/parseargs@0.11.0': optional: true - '@preact/preset-vite@2.10.1(@babel/core@7.27.1)(preact@10.26.6)(vite@6.3.4(@types/node@22.15.18)(jiti@2.4.2)(less@4.2.0)(sass@1.77.8)(stylus@0.56.0)(terser@5.39.2)(yaml@2.8.0))': + '@preact/preset-vite@2.10.1(@babel/core@7.27.1)(preact@10.26.6)(vite@6.3.4(@types/node@22.15.30)(jiti@2.4.2)(less@4.2.0)(sass@1.77.8)(stylus@0.56.0)(terser@5.39.2)(yaml@2.8.0))': dependencies: '@babel/core': 7.27.1 '@babel/plugin-transform-react-jsx': 7.23.4(@babel/core@7.27.1) '@babel/plugin-transform-react-jsx-development': 7.22.5(@babel/core@7.27.1) - '@prefresh/vite': 2.4.1(preact@10.26.6)(vite@6.3.4(@types/node@22.15.18)(jiti@2.4.2)(less@4.2.0)(sass@1.77.8)(stylus@0.56.0)(terser@5.39.2)(yaml@2.8.0)) + '@prefresh/vite': 2.4.1(preact@10.26.6)(vite@6.3.4(@types/node@22.15.30)(jiti@2.4.2)(less@4.2.0)(sass@1.77.8)(stylus@0.56.0)(terser@5.39.2)(yaml@2.8.0)) '@rollup/pluginutils': 4.2.1 babel-plugin-transform-hook-names: 1.0.2(@babel/core@7.27.1) debug: 4.3.4 kolorist: 1.8.0 - vite: 6.3.4(@types/node@22.15.18)(jiti@2.4.2)(less@4.2.0)(sass@1.77.8)(stylus@0.56.0)(terser@5.39.2)(yaml@2.8.0) - vite-prerender-plugin: 0.5.10(vite@6.3.4(@types/node@22.15.18)(jiti@2.4.2)(less@4.2.0)(sass@1.77.8)(stylus@0.56.0)(terser@5.39.2)(yaml@2.8.0)) + vite: 6.3.4(@types/node@22.15.30)(jiti@2.4.2)(less@4.2.0)(sass@1.77.8)(stylus@0.56.0)(terser@5.39.2)(yaml@2.8.0) + vite-prerender-plugin: 0.5.10(vite@6.3.4(@types/node@22.15.30)(jiti@2.4.2)(less@4.2.0)(sass@1.77.8)(stylus@0.56.0)(terser@5.39.2)(yaml@2.8.0)) transitivePeerDependencies: - preact - supports-color @@ -17155,7 +17187,7 @@ snapshots: '@prefresh/utils@1.2.0': {} - '@prefresh/vite@2.4.1(preact@10.26.6)(vite@6.3.4(@types/node@22.15.18)(jiti@2.4.2)(less@4.2.0)(sass@1.77.8)(stylus@0.56.0)(terser@5.39.2)(yaml@2.8.0))': + '@prefresh/vite@2.4.1(preact@10.26.6)(vite@6.3.4(@types/node@22.15.30)(jiti@2.4.2)(less@4.2.0)(sass@1.77.8)(stylus@0.56.0)(terser@5.39.2)(yaml@2.8.0))': dependencies: '@babel/core': 7.27.1 '@prefresh/babel-plugin': 0.5.0 @@ -17163,7 +17195,7 @@ snapshots: '@prefresh/utils': 1.2.0 '@rollup/pluginutils': 4.2.1 preact: 10.26.6 - vite: 6.3.4(@types/node@22.15.18)(jiti@2.4.2)(less@4.2.0)(sass@1.77.8)(stylus@0.56.0)(terser@5.39.2)(yaml@2.8.0) + vite: 6.3.4(@types/node@22.15.30)(jiti@2.4.2)(less@4.2.0)(sass@1.77.8)(stylus@0.56.0)(terser@5.39.2)(yaml@2.8.0) transitivePeerDependencies: - supports-color @@ -17837,48 +17869,48 @@ snapshots: transitivePeerDependencies: - typescript - '@sveltejs/vite-plugin-svelte-inspector@1.0.4(@sveltejs/vite-plugin-svelte@2.5.3(svelte@4.2.19)(vite@6.3.4(@types/node@22.15.18)(jiti@2.4.2)(less@4.2.0)(sass@1.77.8)(terser@5.39.2)(yaml@2.8.0)))(svelte@4.2.19)(vite@6.3.4(@types/node@22.15.18)(jiti@2.4.2)(less@4.2.0)(sass@1.77.8)(terser@5.39.2)(yaml@2.8.0))': + '@sveltejs/vite-plugin-svelte-inspector@1.0.4(@sveltejs/vite-plugin-svelte@2.5.3(svelte@4.2.19)(vite@6.3.4(@types/node@22.15.30)(jiti@2.4.2)(less@4.2.0)(sass@1.77.8)(terser@5.39.2)(yaml@2.8.0)))(svelte@4.2.19)(vite@6.3.4(@types/node@22.15.30)(jiti@2.4.2)(less@4.2.0)(sass@1.77.8)(terser@5.39.2)(yaml@2.8.0))': dependencies: - '@sveltejs/vite-plugin-svelte': 2.5.3(svelte@4.2.19)(vite@6.3.4(@types/node@22.15.18)(jiti@2.4.2)(less@4.2.0)(sass@1.77.8)(terser@5.39.2)(yaml@2.8.0)) + '@sveltejs/vite-plugin-svelte': 2.5.3(svelte@4.2.19)(vite@6.3.4(@types/node@22.15.30)(jiti@2.4.2)(less@4.2.0)(sass@1.77.8)(terser@5.39.2)(yaml@2.8.0)) debug: 4.4.0 svelte: 4.2.19 - vite: 6.3.4(@types/node@22.15.18)(jiti@2.4.2)(less@4.2.0)(sass@1.77.8)(stylus@0.56.0)(terser@5.39.2)(yaml@2.8.0) + vite: 6.3.4(@types/node@22.15.30)(jiti@2.4.2)(less@4.2.0)(sass@1.77.8)(stylus@0.56.0)(terser@5.39.2)(yaml@2.8.0) transitivePeerDependencies: - supports-color - '@sveltejs/vite-plugin-svelte-inspector@4.0.1(@sveltejs/vite-plugin-svelte@5.0.3(svelte@5.30.1)(vite@6.1.6(@types/node@22.15.18)(jiti@2.4.2)(less@4.2.0)(sass@1.77.8)(stylus@0.56.0)(terser@5.39.2)(yaml@2.8.0)))(svelte@5.30.1)(vite@6.1.6(@types/node@22.15.18)(jiti@2.4.2)(less@4.2.0)(sass@1.77.8)(stylus@0.56.0)(terser@5.39.2)(yaml@2.8.0))': + '@sveltejs/vite-plugin-svelte-inspector@4.0.1(@sveltejs/vite-plugin-svelte@5.0.3(svelte@5.30.1)(vite@6.1.6(@types/node@22.15.30)(jiti@2.4.2)(less@4.2.0)(sass@1.77.8)(stylus@0.56.0)(terser@5.39.2)(yaml@2.8.0)))(svelte@5.30.1)(vite@6.1.6(@types/node@22.15.30)(jiti@2.4.2)(less@4.2.0)(sass@1.77.8)(stylus@0.56.0)(terser@5.39.2)(yaml@2.8.0))': dependencies: - '@sveltejs/vite-plugin-svelte': 5.0.3(svelte@5.30.1)(vite@6.1.6(@types/node@22.15.18)(jiti@2.4.2)(less@4.2.0)(sass@1.77.8)(stylus@0.56.0)(terser@5.39.2)(yaml@2.8.0)) + '@sveltejs/vite-plugin-svelte': 5.0.3(svelte@5.30.1)(vite@6.1.6(@types/node@22.15.30)(jiti@2.4.2)(less@4.2.0)(sass@1.77.8)(stylus@0.56.0)(terser@5.39.2)(yaml@2.8.0)) debug: 4.4.0 svelte: 5.30.1 - vite: 6.1.6(@types/node@22.15.18)(jiti@2.4.2)(less@4.2.0)(sass@1.77.8)(stylus@0.56.0)(terser@5.39.2)(yaml@2.8.0) + vite: 6.1.6(@types/node@22.15.30)(jiti@2.4.2)(less@4.2.0)(sass@1.77.8)(stylus@0.56.0)(terser@5.39.2)(yaml@2.8.0) transitivePeerDependencies: - supports-color - '@sveltejs/vite-plugin-svelte@2.5.3(svelte@4.2.19)(vite@6.3.4(@types/node@22.15.18)(jiti@2.4.2)(less@4.2.0)(sass@1.77.8)(terser@5.39.2)(yaml@2.8.0))': + '@sveltejs/vite-plugin-svelte@2.5.3(svelte@4.2.19)(vite@6.3.4(@types/node@22.15.30)(jiti@2.4.2)(less@4.2.0)(sass@1.77.8)(terser@5.39.2)(yaml@2.8.0))': dependencies: - '@sveltejs/vite-plugin-svelte-inspector': 1.0.4(@sveltejs/vite-plugin-svelte@2.5.3(svelte@4.2.19)(vite@6.3.4(@types/node@22.15.18)(jiti@2.4.2)(less@4.2.0)(sass@1.77.8)(terser@5.39.2)(yaml@2.8.0)))(svelte@4.2.19)(vite@6.3.4(@types/node@22.15.18)(jiti@2.4.2)(less@4.2.0)(sass@1.77.8)(terser@5.39.2)(yaml@2.8.0)) + '@sveltejs/vite-plugin-svelte-inspector': 1.0.4(@sveltejs/vite-plugin-svelte@2.5.3(svelte@4.2.19)(vite@6.3.4(@types/node@22.15.30)(jiti@2.4.2)(less@4.2.0)(sass@1.77.8)(terser@5.39.2)(yaml@2.8.0)))(svelte@4.2.19)(vite@6.3.4(@types/node@22.15.30)(jiti@2.4.2)(less@4.2.0)(sass@1.77.8)(terser@5.39.2)(yaml@2.8.0)) debug: 4.4.0 deepmerge: 4.3.1 kleur: 4.1.5 magic-string: 0.30.17 svelte: 4.2.19 svelte-hmr: 0.15.3(svelte@4.2.19) - vite: 6.3.4(@types/node@22.15.18)(jiti@2.4.2)(less@4.2.0)(sass@1.77.8)(stylus@0.56.0)(terser@5.39.2)(yaml@2.8.0) - vitefu: 0.2.5(vite@6.3.4(@types/node@22.15.18)(jiti@2.4.2)(less@4.2.0)(sass@1.77.8)(terser@5.39.2)(yaml@2.8.0)) + vite: 6.3.4(@types/node@22.15.30)(jiti@2.4.2)(less@4.2.0)(sass@1.77.8)(stylus@0.56.0)(terser@5.39.2)(yaml@2.8.0) + vitefu: 0.2.5(vite@6.3.4(@types/node@22.15.30)(jiti@2.4.2)(less@4.2.0)(sass@1.77.8)(terser@5.39.2)(yaml@2.8.0)) transitivePeerDependencies: - supports-color - '@sveltejs/vite-plugin-svelte@5.0.3(svelte@5.30.1)(vite@6.1.6(@types/node@22.15.18)(jiti@2.4.2)(less@4.2.0)(sass@1.77.8)(stylus@0.56.0)(terser@5.39.2)(yaml@2.8.0))': + '@sveltejs/vite-plugin-svelte@5.0.3(svelte@5.30.1)(vite@6.1.6(@types/node@22.15.30)(jiti@2.4.2)(less@4.2.0)(sass@1.77.8)(stylus@0.56.0)(terser@5.39.2)(yaml@2.8.0))': dependencies: - '@sveltejs/vite-plugin-svelte-inspector': 4.0.1(@sveltejs/vite-plugin-svelte@5.0.3(svelte@5.30.1)(vite@6.1.6(@types/node@22.15.18)(jiti@2.4.2)(less@4.2.0)(sass@1.77.8)(stylus@0.56.0)(terser@5.39.2)(yaml@2.8.0)))(svelte@5.30.1)(vite@6.1.6(@types/node@22.15.18)(jiti@2.4.2)(less@4.2.0)(sass@1.77.8)(stylus@0.56.0)(terser@5.39.2)(yaml@2.8.0)) + '@sveltejs/vite-plugin-svelte-inspector': 4.0.1(@sveltejs/vite-plugin-svelte@5.0.3(svelte@5.30.1)(vite@6.1.6(@types/node@22.15.30)(jiti@2.4.2)(less@4.2.0)(sass@1.77.8)(stylus@0.56.0)(terser@5.39.2)(yaml@2.8.0)))(svelte@5.30.1)(vite@6.1.6(@types/node@22.15.30)(jiti@2.4.2)(less@4.2.0)(sass@1.77.8)(stylus@0.56.0)(terser@5.39.2)(yaml@2.8.0)) debug: 4.4.0 deepmerge: 4.3.1 kleur: 4.1.5 magic-string: 0.30.17 svelte: 5.30.1 - vite: 6.1.6(@types/node@22.15.18)(jiti@2.4.2)(less@4.2.0)(sass@1.77.8)(stylus@0.56.0)(terser@5.39.2)(yaml@2.8.0) - vitefu: 1.0.5(vite@6.1.6(@types/node@22.15.18)(jiti@2.4.2)(less@4.2.0)(sass@1.77.8)(stylus@0.56.0)(terser@5.39.2)(yaml@2.8.0)) + vite: 6.1.6(@types/node@22.15.30)(jiti@2.4.2)(less@4.2.0)(sass@1.77.8)(stylus@0.56.0)(terser@5.39.2)(yaml@2.8.0) + vitefu: 1.0.5(vite@6.1.6(@types/node@22.15.30)(jiti@2.4.2)(less@4.2.0)(sass@1.77.8)(stylus@0.56.0)(terser@5.39.2)(yaml@2.8.0)) transitivePeerDependencies: - supports-color @@ -18033,13 +18065,13 @@ snapshots: '@testing-library/dom': 9.3.4 svelte: 4.2.19 - '@testing-library/svelte@5.2.7(svelte@5.30.1)(vite@6.1.6(@types/node@22.15.18)(jiti@2.4.2)(less@4.2.0)(sass@1.77.8)(stylus@0.56.0)(terser@5.39.2)(yaml@2.8.0))(vitest@3.1.3(@types/debug@4.1.12)(@types/node@22.15.18)(jiti@2.4.2)(jsdom@20.0.3)(less@4.2.0)(sass@1.77.8)(stylus@0.56.0)(terser@5.39.2)(yaml@2.8.0))': + '@testing-library/svelte@5.2.7(svelte@5.30.1)(vite@6.1.6(@types/node@22.15.30)(jiti@2.4.2)(less@4.2.0)(sass@1.77.8)(stylus@0.56.0)(terser@5.39.2)(yaml@2.8.0))(vitest@3.1.3(@types/debug@4.1.12)(@types/node@22.15.30)(jiti@2.4.2)(jsdom@20.0.3)(less@4.2.0)(sass@1.77.8)(stylus@0.56.0)(terser@5.39.2)(yaml@2.8.0))': dependencies: '@testing-library/dom': 10.4.0 svelte: 5.30.1 optionalDependencies: - vite: 6.1.6(@types/node@22.15.18)(jiti@2.4.2)(less@4.2.0)(sass@1.77.8)(stylus@0.56.0)(terser@5.39.2)(yaml@2.8.0) - vitest: 3.1.3(@types/debug@4.1.12)(@types/node@22.15.18)(jiti@2.4.2)(jsdom@20.0.3)(less@4.2.0)(sass@1.77.8)(stylus@0.56.0)(terser@5.39.2)(yaml@2.8.0) + vite: 6.1.6(@types/node@22.15.30)(jiti@2.4.2)(less@4.2.0)(sass@1.77.8)(stylus@0.56.0)(terser@5.39.2)(yaml@2.8.0) + vitest: 3.1.3(@types/debug@4.1.12)(@types/node@22.15.30)(jiti@2.4.2)(jsdom@20.0.3)(less@4.2.0)(sass@1.77.8)(stylus@0.56.0)(terser@5.39.2)(yaml@2.8.0) '@testing-library/vue@5.9.0(vue-template-compiler@2.7.14(vue@2.7.14))(vue@2.7.14)': dependencies: @@ -18107,20 +18139,20 @@ snapshots: '@types/body-parser@1.19.5': dependencies: '@types/connect': 3.4.38 - '@types/node': 12.20.55 + '@types/node': 22.15.30 '@types/bonjour@3.5.13': dependencies: - '@types/node': 12.20.55 + '@types/node': 22.15.30 '@types/connect-history-api-fallback@1.5.4': dependencies: '@types/express-serve-static-core': 4.19.5 - '@types/node': 12.20.55 + '@types/node': 22.15.30 '@types/connect@3.4.38': dependencies: - '@types/node': 12.20.55 + '@types/node': 22.15.30 '@types/cookie@0.4.1': {} @@ -18128,7 +18160,7 @@ snapshots: '@types/cors@2.8.17': dependencies: - '@types/node': 12.20.55 + '@types/node': 22.15.30 '@types/debug@4.1.12': dependencies: @@ -18156,7 +18188,7 @@ snapshots: '@types/express-serve-static-core@4.19.5': dependencies: - '@types/node': 12.20.55 + '@types/node': 22.15.30 '@types/qs': 6.9.15 '@types/range-parser': 1.2.7 '@types/send': 0.17.4 @@ -18168,18 +18200,23 @@ snapshots: '@types/qs': 6.9.15 '@types/serve-static': 1.15.7 + '@types/fs-extra@11.0.4': + dependencies: + '@types/jsonfile': 6.1.4 + '@types/node': 22.15.30 + '@types/fs-extra@8.1.2': dependencies: - '@types/node': 12.20.55 + '@types/node': 22.15.30 '@types/glob@7.2.0': dependencies: '@types/minimatch': 5.1.2 - '@types/node': 12.20.55 + '@types/node': 22.15.30 '@types/graceful-fs@4.1.9': dependencies: - '@types/node': 12.20.55 + '@types/node': 22.15.30 '@types/hast@3.0.4': dependencies: @@ -18189,7 +18226,7 @@ snapshots: '@types/http-proxy@1.17.15': dependencies: - '@types/node': 12.20.55 + '@types/node': 22.15.30 '@types/istanbul-lib-coverage@2.0.4': {} @@ -18207,6 +18244,10 @@ snapshots: '@types/json5@0.0.29': {} + '@types/jsonfile@6.1.4': + dependencies: + '@types/node': 22.15.30 + '@types/linkify-it@5.0.0': {} '@types/markdown-it@14.1.2': @@ -18228,6 +18269,8 @@ snapshots: '@types/minimatch@5.1.2': {} + '@types/minimist@1.2.5': {} + '@types/ms@2.1.0': {} '@types/nlcst@2.0.3': @@ -18236,7 +18279,7 @@ snapshots: '@types/node-forge@1.3.11': dependencies: - '@types/node': 12.20.55 + '@types/node': 22.15.30 '@types/node@12.20.55': {} @@ -18244,7 +18287,7 @@ snapshots: '@types/node@17.0.45': {} - '@types/node@22.15.18': + '@types/node@22.15.30': dependencies: undici-types: 6.21.0 @@ -18271,7 +18314,7 @@ snapshots: '@types/resolve@1.17.1': dependencies: - '@types/node': 12.20.55 + '@types/node': 22.15.30 '@types/resolve@1.20.2': {} @@ -18279,18 +18322,18 @@ snapshots: '@types/sax@1.2.4': dependencies: - '@types/node': 12.20.55 + '@types/node': 22.15.30 '@types/sax@1.2.7': dependencies: - '@types/node': 22.15.18 + '@types/node': 22.15.30 '@types/semver@7.7.0': {} '@types/send@0.17.4': dependencies: '@types/mime': 1.3.5 - '@types/node': 12.20.55 + '@types/node': 22.15.30 '@types/serve-index@1.9.4': dependencies: @@ -18299,12 +18342,12 @@ snapshots: '@types/serve-static@1.15.7': dependencies: '@types/http-errors': 2.0.4 - '@types/node': 12.20.55 + '@types/node': 22.15.30 '@types/send': 0.17.4 '@types/sockjs@0.3.36': dependencies: - '@types/node': 12.20.55 + '@types/node': 22.15.30 '@types/stack-utils@2.0.1': {} @@ -18317,7 +18360,7 @@ snapshots: '@types/ws@8.5.12': dependencies: - '@types/node': 12.20.55 + '@types/node': 22.15.30 '@types/yargs-parser@21.0.3': {} @@ -18604,30 +18647,30 @@ snapshots: - encoding - supports-color - '@vitejs/plugin-react@4.4.1(vite@6.3.4(@types/node@22.15.18)(jiti@2.4.2)(less@4.2.0)(sass@1.77.8)(stylus@0.56.0)(terser@5.39.2)(yaml@2.8.0))': + '@vitejs/plugin-react@4.4.1(vite@6.3.4(@types/node@22.15.30)(jiti@2.4.2)(less@4.2.0)(sass@1.77.8)(stylus@0.56.0)(terser@5.39.2)(yaml@2.8.0))': dependencies: '@babel/core': 7.27.1 '@babel/plugin-transform-react-jsx-self': 7.25.9(@babel/core@7.27.1) '@babel/plugin-transform-react-jsx-source': 7.25.9(@babel/core@7.27.1) '@types/babel__core': 7.20.5 react-refresh: 0.17.0 - vite: 6.3.4(@types/node@22.15.18)(jiti@2.4.2)(less@4.2.0)(sass@1.77.8)(stylus@0.56.0)(terser@5.39.2)(yaml@2.8.0) + vite: 6.3.4(@types/node@22.15.30)(jiti@2.4.2)(less@4.2.0)(sass@1.77.8)(stylus@0.56.0)(terser@5.39.2)(yaml@2.8.0) transitivePeerDependencies: - supports-color - '@vitejs/plugin-vue2@2.2.0(vite@6.3.4(@types/node@22.15.18)(jiti@2.4.2)(less@4.2.0)(sass@1.77.8)(stylus@0.56.0)(terser@5.39.2)(yaml@2.8.0))(vue@2.7.14)': + '@vitejs/plugin-vue2@2.2.0(vite@6.3.4(@types/node@22.15.30)(jiti@2.4.2)(less@4.2.0)(sass@1.77.8)(stylus@0.56.0)(terser@5.39.2)(yaml@2.8.0))(vue@2.7.14)': dependencies: - vite: 6.3.4(@types/node@22.15.18)(jiti@2.4.2)(less@4.2.0)(sass@1.77.8)(stylus@0.56.0)(terser@5.39.2)(yaml@2.8.0) + vite: 6.3.4(@types/node@22.15.30)(jiti@2.4.2)(less@4.2.0)(sass@1.77.8)(stylus@0.56.0)(terser@5.39.2)(yaml@2.8.0) vue: 2.7.14 - '@vitejs/plugin-vue@4.6.2(vite@6.3.4(@types/node@22.15.18)(jiti@2.4.2)(less@4.2.0)(sass@1.77.8)(stylus@0.56.0)(terser@5.39.2)(yaml@2.8.0))(vue@3.5.14(typescript@5.8.3))': + '@vitejs/plugin-vue@4.6.2(vite@6.3.4(@types/node@22.15.30)(jiti@2.4.2)(less@4.2.0)(sass@1.77.8)(stylus@0.56.0)(terser@5.39.2)(yaml@2.8.0))(vue@3.5.14(typescript@5.8.3))': dependencies: - vite: 6.3.4(@types/node@22.15.18)(jiti@2.4.2)(less@4.2.0)(sass@1.77.8)(stylus@0.56.0)(terser@5.39.2)(yaml@2.8.0) + vite: 6.3.4(@types/node@22.15.30)(jiti@2.4.2)(less@4.2.0)(sass@1.77.8)(stylus@0.56.0)(terser@5.39.2)(yaml@2.8.0) vue: 3.5.14(typescript@5.8.3) - '@vitejs/plugin-vue@5.2.4(vite@5.4.14(@types/node@22.15.18)(less@4.2.0)(sass@1.77.8)(stylus@0.56.0)(terser@5.39.2))(vue@3.5.14(typescript@5.8.3))': + '@vitejs/plugin-vue@5.2.4(vite@5.4.14(@types/node@22.15.30)(less@4.2.0)(sass@1.77.8)(stylus@0.56.0)(terser@5.39.2))(vue@3.5.14(typescript@5.8.3))': dependencies: - vite: 5.4.14(@types/node@22.15.18)(less@4.2.0)(sass@1.77.8)(stylus@0.56.0)(terser@5.39.2) + vite: 5.4.14(@types/node@22.15.30)(less@4.2.0)(sass@1.77.8)(stylus@0.56.0)(terser@5.39.2) vue: 3.5.14(typescript@5.8.3) '@vitest/expect@3.1.3': @@ -18637,13 +18680,13 @@ snapshots: chai: 5.2.0 tinyrainbow: 2.0.0 - '@vitest/mocker@3.1.3(vite@6.3.4(@types/node@22.15.18)(jiti@2.4.2)(less@4.2.0)(sass@1.77.8)(terser@5.39.2)(yaml@2.8.0))': + '@vitest/mocker@3.1.3(vite@6.3.4(@types/node@22.15.30)(jiti@2.4.2)(less@4.2.0)(sass@1.77.8)(terser@5.39.2)(yaml@2.8.0))': dependencies: '@vitest/spy': 3.1.3 estree-walker: 3.0.3 magic-string: 0.30.17 optionalDependencies: - vite: 6.3.4(@types/node@22.15.18)(jiti@2.4.2)(less@4.2.0)(sass@1.77.8)(stylus@0.56.0)(terser@5.39.2)(yaml@2.8.0) + vite: 6.3.4(@types/node@22.15.30)(jiti@2.4.2)(less@4.2.0)(sass@1.77.8)(stylus@0.56.0)(terser@5.39.2)(yaml@2.8.0) '@vitest/pretty-format@3.1.3': dependencies: @@ -18969,7 +19012,7 @@ snapshots: clean-stack: 2.2.0 indent-string: 4.0.0 - ajv-cli@5.0.0(ts-node@10.9.2(@swc/core@1.7.23)(@types/node@22.15.18)(typescript@5.8.3)): + ajv-cli@5.0.0(ts-node@10.9.2(@swc/core@1.7.23)(@types/node@22.15.30)(typescript@5.8.3)): dependencies: ajv: 8.17.1 fast-json-patch: 2.2.1 @@ -18979,7 +19022,7 @@ snapshots: json5: 2.2.3 minimist: 1.2.8 optionalDependencies: - ts-node: 10.9.2(@swc/core@1.7.23)(@types/node@22.15.18)(typescript@5.8.3) + ts-node: 10.9.2(@swc/core@1.7.23)(@types/node@22.15.30)(typescript@5.8.3) ajv-formats@2.1.1(ajv@8.17.1): optionalDependencies: @@ -19209,7 +19252,7 @@ snapshots: dependencies: tslib: 2.8.1 - astro@5.5.2(@types/node@22.15.18)(jiti@2.4.2)(less@4.2.0)(rollup@4.40.2)(sass@1.77.8)(stylus@0.56.0)(terser@5.39.2)(typescript@5.8.3)(yaml@2.8.0): + astro@5.5.2(@types/node@22.15.30)(jiti@2.4.2)(less@4.2.0)(rollup@4.40.2)(sass@1.77.8)(stylus@0.56.0)(terser@5.39.2)(typescript@5.8.3)(yaml@2.8.0): dependencies: '@astrojs/compiler': 2.11.0 '@astrojs/internal-helpers': 0.6.1 @@ -19261,8 +19304,8 @@ snapshots: unist-util-visit: 5.0.0 unstorage: 1.15.0 vfile: 6.0.3 - vite: 6.2.2(@types/node@22.15.18)(jiti@2.4.2)(less@4.2.0)(sass@1.77.8)(stylus@0.56.0)(terser@5.39.2)(yaml@2.8.0) - vitefu: 1.0.6(vite@6.2.2(@types/node@22.15.18)(jiti@2.4.2)(less@4.2.0)(sass@1.77.8)(stylus@0.56.0)(terser@5.39.2)(yaml@2.8.0)) + vite: 6.2.2(@types/node@22.15.30)(jiti@2.4.2)(less@4.2.0)(sass@1.77.8)(stylus@0.56.0)(terser@5.39.2)(yaml@2.8.0) + vitefu: 1.0.6(vite@6.2.2(@types/node@22.15.30)(jiti@2.4.2)(less@4.2.0)(sass@1.77.8)(stylus@0.56.0)(terser@5.39.2)(yaml@2.8.0)) xxhash-wasm: 1.1.0 yargs-parser: 21.1.1 yocto-spinner: 0.2.1 @@ -19863,7 +19906,7 @@ snapshots: chrome-launcher@0.15.2: dependencies: - '@types/node': 22.15.18 + '@types/node': 22.15.30 escape-string-regexp: 4.0.0 is-wsl: 2.2.0 lighthouse-logger: 1.4.2 @@ -19874,7 +19917,7 @@ snapshots: chromium-edge-launcher@0.2.0: dependencies: - '@types/node': 22.15.18 + '@types/node': 22.15.30 escape-string-regexp: 4.0.0 is-wsl: 2.2.0 lighthouse-logger: 1.4.2 @@ -20670,7 +20713,7 @@ snapshots: dependencies: '@types/cookie': 0.4.1 '@types/cors': 2.8.17 - '@types/node': 12.20.55 + '@types/node': 22.15.30 accepts: 1.3.8 base64id: 2.0.0 cookie: 0.4.2 @@ -22717,7 +22760,7 @@ snapshots: '@jest/environment': 29.7.0 '@jest/fake-timers': 29.7.0 '@jest/types': 29.6.3 - '@types/node': 12.20.55 + '@types/node': 22.15.30 jest-mock: 29.7.0 jest-util: 29.7.0 @@ -22727,7 +22770,7 @@ snapshots: dependencies: '@jest/types': 29.6.3 '@types/graceful-fs': 4.1.9 - '@types/node': 12.20.55 + '@types/node': 22.15.30 anymatch: 3.1.3 fb-watchman: 2.0.2 graceful-fs: 4.2.11 @@ -22754,7 +22797,7 @@ snapshots: jest-mock@29.7.0: dependencies: '@jest/types': 29.6.3 - '@types/node': 12.20.55 + '@types/node': 22.15.30 jest-util: 29.7.0 jest-regex-util@29.6.3: {} @@ -22766,7 +22809,7 @@ snapshots: jest-util@29.7.0: dependencies: '@jest/types': 29.6.3 - '@types/node': 12.20.55 + '@types/node': 22.15.30 chalk: 4.1.2 ci-info: 3.8.0 graceful-fs: 4.2.11 @@ -22783,13 +22826,13 @@ snapshots: jest-worker@27.5.1: dependencies: - '@types/node': 12.20.55 + '@types/node': 22.15.30 merge-stream: 2.0.0 supports-color: 8.1.1 jest-worker@29.7.0: dependencies: - '@types/node': 22.15.18 + '@types/node': 22.15.30 jest-util: 29.7.0 merge-stream: 2.0.0 supports-color: 8.1.1 @@ -27297,14 +27340,14 @@ snapshots: optionalDependencies: '@swc/core': 1.7.23 - ts-node@10.9.2(@swc/core@1.7.23)(@types/node@22.15.18)(typescript@5.8.3): + ts-node@10.9.2(@swc/core@1.7.23)(@types/node@22.15.30)(typescript@5.8.3): dependencies: '@cspotcode/source-map-support': 0.8.1 '@tsconfig/node10': 1.0.11 '@tsconfig/node12': 1.0.11 '@tsconfig/node14': 1.0.3 '@tsconfig/node16': 1.0.4 - '@types/node': 22.15.18 + '@types/node': 22.15.30 acorn: 8.12.1 acorn-walk: 8.3.3 arg: 4.1.3 @@ -27732,13 +27775,13 @@ snapshots: '@types/unist': 3.0.3 vfile-message: 4.0.2 - vite-node@3.1.3(@types/node@22.15.18)(jiti@2.4.2)(less@4.2.0)(sass@1.77.8)(stylus@0.56.0)(terser@5.39.2)(yaml@2.8.0): + vite-node@3.1.3(@types/node@22.15.30)(jiti@2.4.2)(less@4.2.0)(sass@1.77.8)(stylus@0.56.0)(terser@5.39.2)(yaml@2.8.0): dependencies: cac: 6.7.14 debug: 4.4.0 es-module-lexer: 1.7.0 pathe: 2.0.3 - vite: 6.3.4(@types/node@22.15.18)(jiti@2.4.2)(less@4.2.0)(sass@1.77.8)(stylus@0.56.0)(terser@5.39.2)(yaml@2.8.0) + vite: 6.3.4(@types/node@22.15.30)(jiti@2.4.2)(less@4.2.0)(sass@1.77.8)(stylus@0.56.0)(terser@5.39.2)(yaml@2.8.0) transitivePeerDependencies: - '@types/node' - jiti @@ -27753,7 +27796,7 @@ snapshots: - tsx - yaml - vite-plugin-solid@2.11.6(@testing-library/jest-dom@6.6.3)(solid-js@1.9.6)(vite@6.3.4(@types/node@22.15.18)(jiti@2.4.2)(less@4.2.0)(sass@1.77.8)(stylus@0.56.0)(terser@5.39.2)(yaml@2.8.0)): + vite-plugin-solid@2.11.6(@testing-library/jest-dom@6.6.3)(solid-js@1.9.6)(vite@6.3.4(@types/node@22.15.30)(jiti@2.4.2)(less@4.2.0)(sass@1.77.8)(stylus@0.56.0)(terser@5.39.2)(yaml@2.8.0)): dependencies: '@babel/core': 7.27.1 '@types/babel__core': 7.20.5 @@ -27761,14 +27804,14 @@ snapshots: merge-anything: 5.1.7 solid-js: 1.9.6 solid-refresh: 0.6.3(solid-js@1.9.6) - vite: 6.3.4(@types/node@22.15.18)(jiti@2.4.2)(less@4.2.0)(sass@1.77.8)(stylus@0.56.0)(terser@5.39.2)(yaml@2.8.0) - vitefu: 1.0.5(vite@6.3.4(@types/node@22.15.18)(jiti@2.4.2)(less@4.2.0)(sass@1.77.8)(stylus@0.56.0)(terser@5.39.2)(yaml@2.8.0)) + vite: 6.3.4(@types/node@22.15.30)(jiti@2.4.2)(less@4.2.0)(sass@1.77.8)(stylus@0.56.0)(terser@5.39.2)(yaml@2.8.0) + vitefu: 1.0.5(vite@6.3.4(@types/node@22.15.30)(jiti@2.4.2)(less@4.2.0)(sass@1.77.8)(stylus@0.56.0)(terser@5.39.2)(yaml@2.8.0)) optionalDependencies: '@testing-library/jest-dom': 6.6.3 transitivePeerDependencies: - supports-color - vite-prerender-plugin@0.5.10(vite@6.3.4(@types/node@22.15.18)(jiti@2.4.2)(less@4.2.0)(sass@1.77.8)(stylus@0.56.0)(terser@5.39.2)(yaml@2.8.0)): + vite-prerender-plugin@0.5.10(vite@6.3.4(@types/node@22.15.30)(jiti@2.4.2)(less@4.2.0)(sass@1.77.8)(stylus@0.56.0)(terser@5.39.2)(yaml@2.8.0)): dependencies: kolorist: 1.8.0 magic-string: 0.30.17 @@ -27776,28 +27819,28 @@ snapshots: simple-code-frame: 1.3.0 source-map: 0.7.4 stack-trace: 1.0.0-pre2 - vite: 6.3.4(@types/node@22.15.18)(jiti@2.4.2)(less@4.2.0)(sass@1.77.8)(stylus@0.56.0)(terser@5.39.2)(yaml@2.8.0) + vite: 6.3.4(@types/node@22.15.30)(jiti@2.4.2)(less@4.2.0)(sass@1.77.8)(stylus@0.56.0)(terser@5.39.2)(yaml@2.8.0) - vite@5.4.14(@types/node@22.15.18)(less@4.2.0)(sass@1.77.8)(stylus@0.56.0)(terser@5.39.2): + vite@5.4.14(@types/node@22.15.30)(less@4.2.0)(sass@1.77.8)(stylus@0.56.0)(terser@5.39.2): dependencies: esbuild: 0.21.5 postcss: 8.4.49 rollup: 4.40.2 optionalDependencies: - '@types/node': 22.15.18 + '@types/node': 22.15.30 fsevents: 2.3.3 less: 4.2.0 sass: 1.77.8 stylus: 0.56.0 terser: 5.39.2 - vite@6.1.6(@types/node@22.15.18)(jiti@2.4.2)(less@4.2.0)(sass@1.77.8)(stylus@0.56.0)(terser@5.39.2)(yaml@2.8.0): + vite@6.1.6(@types/node@22.15.30)(jiti@2.4.2)(less@4.2.0)(sass@1.77.8)(stylus@0.56.0)(terser@5.39.2)(yaml@2.8.0): dependencies: esbuild: 0.24.2 postcss: 8.5.3 rollup: 4.40.2 optionalDependencies: - '@types/node': 22.15.18 + '@types/node': 22.15.30 fsevents: 2.3.3 jiti: 2.4.2 less: 4.2.0 @@ -27806,13 +27849,13 @@ snapshots: terser: 5.39.2 yaml: 2.8.0 - vite@6.2.2(@types/node@22.15.18)(jiti@2.4.2)(less@4.2.0)(sass@1.77.8)(stylus@0.56.0)(terser@5.39.2)(yaml@2.8.0): + vite@6.2.2(@types/node@22.15.30)(jiti@2.4.2)(less@4.2.0)(sass@1.77.8)(stylus@0.56.0)(terser@5.39.2)(yaml@2.8.0): dependencies: esbuild: 0.25.2 postcss: 8.5.3 rollup: 4.40.0 optionalDependencies: - '@types/node': 22.15.18 + '@types/node': 22.15.30 fsevents: 2.3.3 jiti: 2.4.2 less: 4.2.0 @@ -27821,7 +27864,7 @@ snapshots: terser: 5.39.2 yaml: 2.8.0 - vite@6.3.4(@types/node@22.15.18)(jiti@2.4.2)(less@4.2.0)(sass@1.77.8)(stylus@0.56.0)(terser@5.39.2)(yaml@2.8.0): + vite@6.3.4(@types/node@22.15.30)(jiti@2.4.2)(less@4.2.0)(sass@1.77.8)(stylus@0.56.0)(terser@5.39.2)(yaml@2.8.0): dependencies: esbuild: 0.25.4 fdir: 6.4.4(picomatch@4.0.2) @@ -27830,7 +27873,7 @@ snapshots: rollup: 4.40.2 tinyglobby: 0.2.13 optionalDependencies: - '@types/node': 22.15.18 + '@types/node': 22.15.30 fsevents: 2.3.3 jiti: 2.4.2 less: 4.2.0 @@ -27839,23 +27882,23 @@ snapshots: terser: 5.39.2 yaml: 2.8.0 - vitefu@0.2.5(vite@6.3.4(@types/node@22.15.18)(jiti@2.4.2)(less@4.2.0)(sass@1.77.8)(terser@5.39.2)(yaml@2.8.0)): + vitefu@0.2.5(vite@6.3.4(@types/node@22.15.30)(jiti@2.4.2)(less@4.2.0)(sass@1.77.8)(terser@5.39.2)(yaml@2.8.0)): optionalDependencies: - vite: 6.3.4(@types/node@22.15.18)(jiti@2.4.2)(less@4.2.0)(sass@1.77.8)(stylus@0.56.0)(terser@5.39.2)(yaml@2.8.0) + vite: 6.3.4(@types/node@22.15.30)(jiti@2.4.2)(less@4.2.0)(sass@1.77.8)(stylus@0.56.0)(terser@5.39.2)(yaml@2.8.0) - vitefu@1.0.5(vite@6.1.6(@types/node@22.15.18)(jiti@2.4.2)(less@4.2.0)(sass@1.77.8)(stylus@0.56.0)(terser@5.39.2)(yaml@2.8.0)): + vitefu@1.0.5(vite@6.1.6(@types/node@22.15.30)(jiti@2.4.2)(less@4.2.0)(sass@1.77.8)(stylus@0.56.0)(terser@5.39.2)(yaml@2.8.0)): optionalDependencies: - vite: 6.1.6(@types/node@22.15.18)(jiti@2.4.2)(less@4.2.0)(sass@1.77.8)(stylus@0.56.0)(terser@5.39.2)(yaml@2.8.0) + vite: 6.1.6(@types/node@22.15.30)(jiti@2.4.2)(less@4.2.0)(sass@1.77.8)(stylus@0.56.0)(terser@5.39.2)(yaml@2.8.0) - vitefu@1.0.5(vite@6.3.4(@types/node@22.15.18)(jiti@2.4.2)(less@4.2.0)(sass@1.77.8)(stylus@0.56.0)(terser@5.39.2)(yaml@2.8.0)): + vitefu@1.0.5(vite@6.3.4(@types/node@22.15.30)(jiti@2.4.2)(less@4.2.0)(sass@1.77.8)(stylus@0.56.0)(terser@5.39.2)(yaml@2.8.0)): optionalDependencies: - vite: 6.3.4(@types/node@22.15.18)(jiti@2.4.2)(less@4.2.0)(sass@1.77.8)(stylus@0.56.0)(terser@5.39.2)(yaml@2.8.0) + vite: 6.3.4(@types/node@22.15.30)(jiti@2.4.2)(less@4.2.0)(sass@1.77.8)(stylus@0.56.0)(terser@5.39.2)(yaml@2.8.0) - vitefu@1.0.6(vite@6.2.2(@types/node@22.15.18)(jiti@2.4.2)(less@4.2.0)(sass@1.77.8)(stylus@0.56.0)(terser@5.39.2)(yaml@2.8.0)): + vitefu@1.0.6(vite@6.2.2(@types/node@22.15.30)(jiti@2.4.2)(less@4.2.0)(sass@1.77.8)(stylus@0.56.0)(terser@5.39.2)(yaml@2.8.0)): optionalDependencies: - vite: 6.2.2(@types/node@22.15.18)(jiti@2.4.2)(less@4.2.0)(sass@1.77.8)(stylus@0.56.0)(terser@5.39.2)(yaml@2.8.0) + vite: 6.2.2(@types/node@22.15.30)(jiti@2.4.2)(less@4.2.0)(sass@1.77.8)(stylus@0.56.0)(terser@5.39.2)(yaml@2.8.0) - vitepress@1.6.3(@algolia/client-search@5.25.0)(@types/node@22.15.18)(@types/react@18.3.21)(axios@1.7.4)(fuse.js@6.6.2)(less@4.2.0)(postcss@8.5.3)(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(sass@1.77.8)(search-insights@2.8.2)(stylus@0.56.0)(terser@5.39.2)(typescript@5.8.3): + vitepress@1.6.3(@algolia/client-search@5.25.0)(@types/node@22.15.30)(@types/react@18.3.21)(axios@1.7.4)(fuse.js@6.6.2)(less@4.2.0)(postcss@8.5.3)(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(sass@1.77.8)(search-insights@2.8.2)(stylus@0.56.0)(terser@5.39.2)(typescript@5.8.3): dependencies: '@docsearch/css': 3.8.2 '@docsearch/js': 3.8.2(@algolia/client-search@5.25.0)(@types/react@18.3.21)(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(search-insights@2.8.2) @@ -27864,7 +27907,7 @@ snapshots: '@shikijs/transformers': 2.5.0 '@shikijs/types': 2.5.0 '@types/markdown-it': 14.1.2 - '@vitejs/plugin-vue': 5.2.4(vite@5.4.14(@types/node@22.15.18)(less@4.2.0)(sass@1.77.8)(stylus@0.56.0)(terser@5.39.2))(vue@3.5.14(typescript@5.8.3)) + '@vitejs/plugin-vue': 5.2.4(vite@5.4.14(@types/node@22.15.30)(less@4.2.0)(sass@1.77.8)(stylus@0.56.0)(terser@5.39.2))(vue@3.5.14(typescript@5.8.3)) '@vue/devtools-api': 7.7.6 '@vue/shared': 3.5.14 '@vueuse/core': 12.8.2(typescript@5.8.3) @@ -27873,7 +27916,7 @@ snapshots: mark.js: 8.11.1 minisearch: 7.1.2 shiki: 2.5.0 - vite: 5.4.14(@types/node@22.15.18)(less@4.2.0)(sass@1.77.8)(stylus@0.56.0)(terser@5.39.2) + vite: 5.4.14(@types/node@22.15.30)(less@4.2.0)(sass@1.77.8)(stylus@0.56.0)(terser@5.39.2) vue: 3.5.14(typescript@5.8.3) optionalDependencies: postcss: 8.5.3 @@ -27904,10 +27947,10 @@ snapshots: - typescript - universal-cookie - vitest@3.1.3(@types/debug@4.1.12)(@types/node@22.15.18)(jiti@2.4.2)(jsdom@20.0.3)(less@4.2.0)(sass@1.77.8)(stylus@0.56.0)(terser@5.39.2)(yaml@2.8.0): + vitest@3.1.3(@types/debug@4.1.12)(@types/node@22.15.30)(jiti@2.4.2)(jsdom@20.0.3)(less@4.2.0)(sass@1.77.8)(stylus@0.56.0)(terser@5.39.2)(yaml@2.8.0): dependencies: '@vitest/expect': 3.1.3 - '@vitest/mocker': 3.1.3(vite@6.3.4(@types/node@22.15.18)(jiti@2.4.2)(less@4.2.0)(sass@1.77.8)(terser@5.39.2)(yaml@2.8.0)) + '@vitest/mocker': 3.1.3(vite@6.3.4(@types/node@22.15.30)(jiti@2.4.2)(less@4.2.0)(sass@1.77.8)(terser@5.39.2)(yaml@2.8.0)) '@vitest/pretty-format': 3.1.3 '@vitest/runner': 3.1.3 '@vitest/snapshot': 3.1.3 @@ -27924,12 +27967,12 @@ snapshots: tinyglobby: 0.2.13 tinypool: 1.0.2 tinyrainbow: 2.0.0 - vite: 6.3.4(@types/node@22.15.18)(jiti@2.4.2)(less@4.2.0)(sass@1.77.8)(stylus@0.56.0)(terser@5.39.2)(yaml@2.8.0) - vite-node: 3.1.3(@types/node@22.15.18)(jiti@2.4.2)(less@4.2.0)(sass@1.77.8)(stylus@0.56.0)(terser@5.39.2)(yaml@2.8.0) + vite: 6.3.4(@types/node@22.15.30)(jiti@2.4.2)(less@4.2.0)(sass@1.77.8)(stylus@0.56.0)(terser@5.39.2)(yaml@2.8.0) + vite-node: 3.1.3(@types/node@22.15.30)(jiti@2.4.2)(less@4.2.0)(sass@1.77.8)(stylus@0.56.0)(terser@5.39.2)(yaml@2.8.0) why-is-node-running: 2.3.0 optionalDependencies: '@types/debug': 4.1.12 - '@types/node': 22.15.18 + '@types/node': 22.15.30 jsdom: 20.0.3 transitivePeerDependencies: - jiti diff --git a/scripts/addMissingIconJsonFiles.mjs b/scripts/addMissingIconJsonFiles.mts similarity index 81% rename from scripts/addMissingIconJsonFiles.mjs rename to scripts/addMissingIconJsonFiles.mts index 3a982c957..6d7f6bb1f 100644 --- a/scripts/addMissingIconJsonFiles.mjs +++ b/scripts/addMissingIconJsonFiles.mts @@ -4,13 +4,13 @@ import { readAllMetadata, readSvgDirectory, writeFile, -} from '../tools/build-helpers/helpers.mjs'; +} from '../tools/build-helpers/helpers.ts'; const currentDir = getCurrentDirPath(import.meta.url); const ICONS_DIR = path.resolve(currentDir, '../icons'); -const icons = readAllMetadata(ICONS_DIR); +const icons = await readAllMetadata(ICONS_DIR); -const svgFiles = readSvgDirectory(ICONS_DIR); +const svgFiles = await readSvgDirectory(ICONS_DIR); const iconNames = svgFiles.map((icon) => icon.split('.')[0]); diff --git a/scripts/checkIconsAndCategories.mjs b/scripts/checkIconsAndCategories.mts similarity index 80% rename from scripts/checkIconsAndCategories.mjs rename to scripts/checkIconsAndCategories.mts index a7266401d..a5d6dd9e4 100644 --- a/scripts/checkIconsAndCategories.mjs +++ b/scripts/checkIconsAndCategories.mts @@ -3,13 +3,17 @@ import { readSvgDirectory, getCurrentDirPath, readAllMetadata, -} from '../tools/build-helpers/helpers.mjs'; +} from '../tools/build-helpers/helpers.ts'; +import { type IconMetadata } from '../tools/build-icons/types.ts'; const currentDir = getCurrentDirPath(import.meta.url); const ICONS_DIR = path.resolve(currentDir, '../icons'); -const icons = await readAllMetadata(ICONS_DIR); +const icons = await readAllMetadata(ICONS_DIR) as Record; const CATEGORIES_DIR = path.resolve(currentDir, '../categories'); -const categories = await readAllMetadata(CATEGORIES_DIR); +const categories = await readAllMetadata(CATEGORIES_DIR) as Record;; console.log('Reading all icons'); @@ -31,7 +35,7 @@ Object.keys(icons).forEach((iconName) => { 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; @@ -41,7 +45,7 @@ Object.keys(icons).forEach((iconName) => { Object.keys(categories).forEach((categoryName) => { const category = categories[categoryName]; - if (!category.icon) { + if (!category?.icon) { console.error(`Category '${categoryName}' does not use an icon '${category.icon}'.`); error = true; } else if (typeof icons[category.icon] === 'undefined') { diff --git a/scripts/generate/generateIcons.mjs b/scripts/generate/generateIcons.mts similarity index 96% rename from scripts/generate/generateIcons.mjs rename to scripts/generate/generateIcons.mts index 01539ad46..6650df77e 100644 --- a/scripts/generate/generateIcons.mjs +++ b/scripts/generate/generateIcons.mts @@ -1,5 +1,5 @@ import path from 'path'; -import { getCurrentDirPath, writeFileIfNotExists } from '../../tools/build-helpers/helpers.mjs'; +import { getCurrentDirPath, writeFileIfNotExists } from '../../tools/build-helpers/helpers.ts'; const currentDir = getCurrentDirPath(import.meta.url); const ICONS_DIR = path.resolve(currentDir, '../../icons'); diff --git a/scripts/generateChangedIconsCommentMarkup.mjs b/scripts/generateChangedIconsCommentMarkup.mts similarity index 94% rename from scripts/generateChangedIconsCommentMarkup.mjs rename to scripts/generateChangedIconsCommentMarkup.mts index 80a19123e..5054a1d89 100644 --- a/scripts/generateChangedIconsCommentMarkup.mjs +++ b/scripts/generateChangedIconsCommentMarkup.mts @@ -7,7 +7,7 @@ import { getCurrentDirPath, minifySvg, toPascalCase, -} from '../tools/build-helpers/helpers.mjs'; +} from '../tools/build-helpers/helpers.ts'; const currentDir = getCurrentDirPath(import.meta.url); const ICONS_DIR = path.resolve(currentDir, '../icons'); @@ -30,7 +30,7 @@ if (changedFiles.length === 0) { process.exit(0); } -const getImageTagsByFiles = (files, getBaseUrl, width) => +const getImageTagsByFiles = (files: string[], getBaseUrl: (file: string) => string, width?: number) => files.map((file) => { const svgContent = fs.readFileSync(path.join(process.cwd(), file), 'utf-8'); const strippedAttrsSVG = svgContent.replace(/]*>/, ''); @@ -46,7 +46,7 @@ const getImageTagsByFiles = (files, getBaseUrl, width) => const svgFiles = await readSvgDirectory(ICONS_DIR); const svgFilePaths = svgFiles.map((file) => `icons/${file}`); -const iconsFilteredByName = (search) => svgFilePaths.filter((file) => file.includes(search)); +const iconsFilteredByName = (search: string) => svgFilePaths.filter((file) => file.includes(search)); const cohesionRandomImageTags = getImageTagsByFiles( shuffleArray(svgFilePaths).slice(0, changedFiles.length), diff --git a/scripts/generateChangelog.mjs b/scripts/generateChangelog.mts similarity index 85% rename from scripts/generateChangelog.mjs rename to scripts/generateChangelog.mts index 38ab0841a..19f75f5d6 100644 --- a/scripts/generateChangelog.mjs +++ b/scripts/generateChangelog.mts @@ -1,11 +1,11 @@ import getArgumentOptions from 'minimist'; -import githubApi from './githubApi.mjs'; +import githubApi from './githubApi.mts'; -const fetchCompareTags = (oldTag) => +const fetchCompareTags = (oldTag: string) => githubApi(`https://api.github.com/repos/lucide-icons/lucide/compare/${oldTag}...main`); const iconRegex = /icons\/(.*)\.svg/g; -const iconTemplate = ({ name, pullNumber, author }) => +const iconTemplate = ({ name, pullNumber, author }: { name: string, pullNumber: number, author: string }) => `- \`${name}\` (${pullNumber}) by @${author}`; const topics = [ @@ -47,7 +47,7 @@ const cliArguments = getArgumentOptions(process.argv.slice(2)); } const changedFiles = output.files.filter( - ({ filename }) => !filename.match(/docs\/(.*)|(.*)package\.json|tags.json/g), + ({ filename }: { filename: string }) => !filename.match(/docs\/(.*)|(.*)package\.json|tags.json/g), ); const commits = await Promise.all(changedFiles.map(fetchCommits)); @@ -76,11 +76,11 @@ const cliArguments = getArgumentOptions(process.argv.slice(2)); status, }; }) - .filter(Boolean) + .filter((commit): commit is NonNullable => Boolean(commit)) .filter(({ pullNumber }) => !!pullNumber); const changelog = topics.map(({ title, filter, template }) => { - const lines = mappedCommits.filter(filter).map(template); + const lines = mappedCommits.filter(filter).map(template); if (lines.length) { return [`## ${title}`, ' ', ...lines, ' ']; diff --git a/scripts/generateNextJSAliases.mjs b/scripts/generateNextJSAliases.mts similarity index 95% rename from scripts/generateNextJSAliases.mjs rename to scripts/generateNextJSAliases.mts index 763244ac3..bc269106a 100644 --- a/scripts/generateNextJSAliases.mjs +++ b/scripts/generateNextJSAliases.mts @@ -1,9 +1,9 @@ import path from 'path'; import { promises as fs } from 'fs'; -import { getCurrentDirPath, readSvgDirectory } from '../tools/build-helpers/helpers.mjs'; +import { getCurrentDirPath, readSvgDirectory } from '../tools/build-helpers/helpers.ts'; // 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) { +function pascalToKebabNextJSFlavour(str: string) { return str .replace(/([a-z])([A-Z])/g, '$1-$2') .replace(/([A-Z]+)([A-Z][a-z])/g, '$1-$2') diff --git a/scripts/githubApi.mjs b/scripts/githubApi.mts similarity index 88% rename from scripts/githubApi.mjs rename to scripts/githubApi.mts index 7aac19ba3..bd833b784 100644 --- a/scripts/githubApi.mjs +++ b/scripts/githubApi.mts @@ -1,4 +1,4 @@ -const githubApi = async (endpoint) => { +const githubApi = async (endpoint: string) => { const headers = new Headers(); const username = 'ericfennis'; const password = process.env.GITHUB_API_KEY; diff --git a/scripts/lintFilenames.mjs b/scripts/lintFilenames.mts similarity index 80% rename from scripts/lintFilenames.mjs rename to scripts/lintFilenames.mts index 106848ce7..912068be3 100644 --- a/scripts/lintFilenames.mjs +++ b/scripts/lintFilenames.mts @@ -17,11 +17,11 @@ cspell.stdout.on('data', (data) => { data .toString() .split('\n') - .forEach((line) => { + .forEach((line: string) => { const match = line.match(regex); if (match) { - const { line, message } = match.groups; - console.log(`::error file=${fileList[line - 1]},line=1,column=1::${message}`); + const { line, message } = match.groups ?? {}; + console.log(`::error file=${fileList[Number(line) - 1]},line=1,column=1::${message}`); } }); }); diff --git a/scripts/migrateCategoriesToIcons.mjs b/scripts/migrateCategoriesToIcons.mjs deleted file mode 100644 index ec221bbe2..000000000 --- a/scripts/migrateCategoriesToIcons.mjs +++ /dev/null @@ -1,23 +0,0 @@ -import path from 'path'; -import categories from '../categories.json' with { type: 'json' }; -import { - mergeArrays, - writeFile, - readAllMetadata, - getCurrentDirPath, -} from '../tools/build-helpers/helpers.mjs'; - -const currentDir = getCurrentDirPath(import.meta.url); -const ICONS_DIR = path.resolve(currentDir, '../icons'); -const icons = readAllMetadata(ICONS_DIR); - -Object.keys(categories).forEach((categoryName) => { - categories[categoryName].forEach((iconName) => { - icons[iconName].categories = mergeArrays(icons[iconName].categories, [categoryName]); - }); -}); - -Object.keys(icons).forEach((iconName) => { - const iconContent = JSON.stringify(icons[iconName], null, 2); - writeFile(iconContent, `${iconName}.json`, path.resolve(currentDir, '../icons')); -}); diff --git a/scripts/migrateIconsToCategories.mjs b/scripts/migrateIconsToCategories.mjs deleted file mode 100644 index ebc808775..000000000 --- a/scripts/migrateIconsToCategories.mjs +++ /dev/null @@ -1,25 +0,0 @@ -import path from 'path'; -import { writeFile, getCurrentDirPath, readAllMetadata } from '../tools/build-helpers/helpers.mjs'; - -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) => { - newCategories[categoryName] = newCategories[categoryName] || []; - newCategories[categoryName].push(iconName); - }); -}); - -const ordered = Object.keys(newCategories) - .sort() - .reduce((obj, key) => { - obj[key] = newCategories[key]; - return obj; - }, {}); - -const categoriesContent = JSON.stringify(ordered, null, 2); - -writeFile(categoriesContent, 'categories.json', path.resolve(currentDir, '..')); diff --git a/scripts/migrateTagsToIcons.mjs b/scripts/migrateTagsToIcons.mjs deleted file mode 100644 index 6c764593a..000000000 --- a/scripts/migrateTagsToIcons.mjs +++ /dev/null @@ -1,27 +0,0 @@ -import path from 'path'; -import tags from '../tags.json' with { type: 'json' }; -import { - readSvgDirectory, - readAllMetadata, - writeFile, - mergeArrays, - getCurrentDirPath, -} from '../tools/build-helpers/helpers.mjs'; - -const currentDir = getCurrentDirPath(import.meta.url); -const ICONS_DIR = path.resolve(currentDir, '../icons'); -const icons = readAllMetadata(ICONS_DIR); -const svgFiles = readSvgDirectory(ICONS_DIR); - -const iconNames = svgFiles.map((icon) => icon.split('.')[0]); - -iconNames.forEach((iconName) => { - icons[iconName] = icons[iconName] || { - $schema: '../icon.schema.json', - tags: [], - categories: [], - }; - icons[iconName].tags = mergeArrays(icons[iconName].tags, tags[iconName]); - const iconContent = JSON.stringify(icons[iconName], null, 2); - writeFile(iconContent, `${iconName}.json`, path.resolve(currentDir, '../icons')); -}); diff --git a/scripts/optimizeStagedSvgs.mjs b/scripts/optimizeStagedSvgs.mts similarity index 85% rename from scripts/optimizeStagedSvgs.mjs rename to scripts/optimizeStagedSvgs.mts index f9c719d14..f4da6bf5d 100644 --- a/scripts/optimizeStagedSvgs.mjs +++ b/scripts/optimizeStagedSvgs.mts @@ -5,7 +5,7 @@ const svgFiles = process.argv.slice(2); svgFiles.forEach(async (svgFile) => { console.log('Optimizing staged SVG file:', svgFile); - const content = fs.readFileSync(svgFile); + const content = fs.readFileSync(svgFile, 'utf-8'); const svg = await processSvg(content, svgFile); fs.writeFileSync(svgFile, svg, 'utf-8'); }); diff --git a/scripts/optimizeSvgs.mjs b/scripts/optimizeSvgs.mts similarity index 55% rename from scripts/optimizeSvgs.mjs rename to scripts/optimizeSvgs.mts index 2732501b6..89e560bcd 100644 --- a/scripts/optimizeSvgs.mjs +++ b/scripts/optimizeSvgs.mts @@ -1,15 +1,15 @@ import fs from 'fs'; import path from 'path'; -import { readSvgDirectory, writeSvgFile } from '../tools/build-helpers/helpers.mjs'; -import processSvg from './render/processSvg.mjs'; +import { readSvgDirectory, writeSvgFile } from '../tools/build-helpers/helpers.ts'; +import processSvg from './render/processSvg.mts'; const ICONS_DIR = path.resolve(process.cwd(), 'icons'); console.log(`Optimizing SVGs...`); -const svgFiles = readSvgDirectory(ICONS_DIR); +const svgFiles = await readSvgDirectory(ICONS_DIR); -svgFiles.forEach((svgFile) => { - const content = fs.readFileSync(path.join(ICONS_DIR, svgFile)); +svgFiles.forEach((svgFile: string) => { + const content = fs.readFileSync(path.join(ICONS_DIR, svgFile), 'utf-8'); processSvg(content, svgFile).then((svg) => writeSvgFile(svgFile, ICONS_DIR, svg)); }); diff --git a/scripts/rename/renameIcon.function.mjs b/scripts/rename/renameIcon.function.mts similarity index 87% rename from scripts/rename/renameIcon.function.mjs rename to scripts/rename/renameIcon.function.mts index 28606179c..c17b94fdc 100644 --- a/scripts/rename/renameIcon.function.mjs +++ b/scripts/rename/renameIcon.function.mts @@ -2,6 +2,7 @@ import path from 'path'; import fs from 'fs'; import { promisify } from 'util'; import simpleGit from 'simple-git'; +import { IconMetadata } from '../../tools/build-icons/types'; /** * Renames an icon and adds the old name as an alias. @@ -11,10 +12,10 @@ import simpleGit from 'simple-git'; * @param {boolean} logInfo * @param {boolean} addAlias */ -export async function renameIcon(ICONS_DIR, oldName, newName, logInfo = true, addAlias = true) { +export async function renameIcon(ICONS_DIR: string, oldName: string, newName: string, logInfo = true, addAlias = true) { const git = simpleGit(); - async function fileExists(filePath) { + async function fileExists(filePath: string) { try { await promisify(fs.access)(filePath); return true; @@ -44,7 +45,7 @@ export async function renameIcon(ICONS_DIR, oldName, newName, logInfo = true, ad await git.mv(oldJsonPath, newJsonPath); if (addAlias) { const json = fs.readFileSync(newJsonPath, 'utf8'); - const jsonData = JSON.parse(json); + const jsonData: IconMetadata = JSON.parse(json); if (Array.isArray(jsonData.aliases)) { jsonData.aliases = jsonData.aliases.filter( (alias) => (typeof alias === 'string' ? alias : alias.name) !== newName, diff --git a/scripts/rename/renameIcon.mjs b/scripts/rename/renameIcon.mts similarity index 78% rename from scripts/rename/renameIcon.mjs rename to scripts/rename/renameIcon.mts index 6c69271ee..f4c00965f 100644 --- a/scripts/rename/renameIcon.mjs +++ b/scripts/rename/renameIcon.mts @@ -1,6 +1,6 @@ import path from 'path'; -import { getCurrentDirPath } from '../../tools/build-helpers/helpers.mjs'; -import { renameIcon } from './renameIcon.function.mjs'; +import { getCurrentDirPath } from '../../tools/build-helpers/helpers.ts'; +import { renameIcon } from './renameIcon.function.mts'; async function main() { const oldName = path.basename(process.argv[2]).replace(/\.[^/.]+$/, ''); @@ -20,7 +20,11 @@ async function main() { const ICONS_DIR = path.resolve(currentDir, '../../icons'); await renameIcon(ICONS_DIR, oldName, newName); } catch (err) { - console.error(err.message); + if(err instanceof Error) { + console.error(err.message); + } else { + console.error('An unexpected error occurred:', err); + } process.exit(1); } } diff --git a/scripts/rename/renamePattern.mjs b/scripts/rename/renamePattern.mts similarity index 74% rename from scripts/rename/renamePattern.mjs rename to scripts/rename/renamePattern.mts index b1b5d545b..325c76cbb 100644 --- a/scripts/rename/renamePattern.mjs +++ b/scripts/rename/renamePattern.mts @@ -1,15 +1,17 @@ import path from 'path'; -import { getCurrentDirPath, readSvgDirectory } from '../../tools/build-helpers/helpers.mjs'; +import { getCurrentDirPath, readSvgDirectory } from '../../tools/build-helpers/helpers.ts'; import yargs from 'yargs/yargs'; import { hideBin } from 'yargs/helpers'; -import { renameIcon } from './renameIcon.function.mjs'; +import { renameIcon } from './renameIcon.function.mts'; +import { type Arguments } from 'yargs'; async function main() { const currentDir = getCurrentDirPath(import.meta.url); const ICONS_DIR = path.resolve(currentDir, '../../icons'); - const svgFiles = readSvgDirectory(ICONS_DIR); + const svgFiles = await readSvgDirectory(ICONS_DIR); const iconNames = svgFiles.map((icon) => icon.split('.')[0]).reverse(); - const argv = yargs(hideBin(process.argv)) + const argv = (yargs(hideBin(process.argv)) + // @ts-ignore .usage('$0 ', 'Renames all icons matching a pattern', (yargs) => { yargs .positional('pattern', { @@ -28,9 +30,14 @@ async function main() { 'dry-run': { type: 'boolean', default: false, alias: 'd' }, 'add-alias': { type: 'boolean', default: true, alias: 'a' }, }) - .parse(); + .parse()) as unknown as Arguments<{ + pattern: string; + replacement: string; + dryRun: boolean; + addAlias: boolean; + }>; - const pattern = new RegExp(argv.pattern, 'g'); + const pattern = new RegExp(argv?.pattern, 'g'); const replacement = argv.replacement.replaceAll(/\\([0-9]+)/g, (s, i) => `$${i}`); if (!(pattern instanceof RegExp)) { @@ -47,7 +54,11 @@ async function main() { await renameIcon(ICONS_DIR, oldName, newName, false, argv.addAlias); } } catch (err) { + if(err instanceof Error) { console.error(err.message); + } else { + console.error('An unexpected error occurred:', err); + } } } } diff --git a/scripts/render/processSvg.mjs b/scripts/render/processSvg.mts similarity index 79% rename from scripts/render/processSvg.mjs rename to scripts/render/processSvg.mts index b28de9511..cb5c3020d 100644 --- a/scripts/render/processSvg.mjs +++ b/scripts/render/processSvg.mts @@ -8,7 +8,7 @@ import DEFAULT_ATTRS from '../../tools/build-icons/render/default-attrs.json' wi * @param {string} svg - An SVG string. * @returns {Promise} An optimized svg */ -async function optimizeSvg(svg, path) { +async function optimizeSvg(svg: string, path: string) { const result = optimize(svg, { path, plugins: [ @@ -38,10 +38,16 @@ async function optimizeSvg(svg, path) { * @param {string} svg - An SVG string. * @returns {string} An SVG string, included with the default attributes. */ -function setAttrs(svg) { +function setAttrs(svg: string) { const contents = parseSync(svg); - contents.attributes = DEFAULT_ATTRS; + contents.attributes = { + ...DEFAULT_ATTRS, + width: String(DEFAULT_ATTRS.width), + height: String(DEFAULT_ATTRS.height), + "stroke-width": String(DEFAULT_ATTRS['stroke-width']), + ...contents.attributes, + }; return stringify(contents); } @@ -51,7 +57,7 @@ function setAttrs(svg) { * @param {string} svg An SVG string. * @returns {Promise} An optimized svg */ -function processSvg(svg, path) { +function processSvg(svg: string, path: string) { return ( optimizeSvg(svg, path) .then(setAttrs) diff --git a/scripts/updateContributors.mjs b/scripts/updateContributors.mts similarity index 78% rename from scripts/updateContributors.mjs rename to scripts/updateContributors.mts index 90dbe8c49..76428439d 100644 --- a/scripts/updateContributors.mjs +++ b/scripts/updateContributors.mts @@ -29,23 +29,29 @@ const getUserName = pMemoize( ); // Check that a commit changes more than just the icon name -const isCommitRelevant = async (hash, file) => { +const isCommitRelevant = async (hash: string, file: string) => { const summary = await git.diffSummary(['--diff-filter=AM', `${hash}~1`, hash]); return summary.files.some(({ file: name }) => name === file); }; -const getContributors = async (file, includeCoAuthors) => { +const getContributors = async (file: string, includeCoAuthors?: boolean) => { const { all } = await git.log([`HEAD~${FETCH_DEPTH}..`, '--', file]); const commits = file.endsWith('.svg') ? ( - await Promise.all(all.map((commit) => isCommitRelevant(commit.hash, file) && commit)) + await Promise.all(all.map(async (commit) => await isCommitRelevant(commit.hash, file) && commit)) ).filter(Boolean) : all; const emails = new Map(); for (let i = commits.length - 1; i >= 0; i -= 1) { const commit = commits[i]; - if (!IGNORED_COMMITS.includes(commit.hash)) { + + if(!commit || !commit.author_email) { + console.warn(`Skipping commit without author email: ${JSON.stringify(commit)}`); + continue; + } + + if ("hash" in commit && !IGNORED_COMMITS.includes(commit.hash)) { if (!emails.has(commit.author_email)) { emails.set(commit.author_email, getUserName(commit)); } @@ -55,8 +61,8 @@ const getContributors = async (file, includeCoAuthors) => { ); // eslint-disable-next-line no-restricted-syntax for (const match of matches) { - if (!emails.has(match.groups.email) && cache.has(match.groups.email)) { - emails.set(match.groups.email, Promise.resolve(cache.get(match.groups.email))); + if (!emails.has(match.groups?.email) && cache.has(match.groups?.email)) { + emails.set(match.groups?.email, Promise.resolve(cache.get(match.groups?.email))); } } } @@ -66,7 +72,7 @@ const getContributors = async (file, includeCoAuthors) => { return Promise.all(Array.from(emails.values())); }; -const files = process.env.CHANGED_FILES.split(' ') +const files = (process.env.CHANGED_FILES?.split(' ') ?? []) .map((file) => file.replace('.json', '.svg')) .filter((file, idx, arr) => arr.indexOf(file) === idx); @@ -81,7 +87,7 @@ await getContributors('icons'); await Promise.all( files.map(async (file) => { const jsonFile = path.join(process.cwd(), file.replace('.svg', '.json')); - const json = JSON.parse(fs.readFileSync(jsonFile)); + const json = JSON.parse(fs.readFileSync(jsonFile, 'utf-8')); const { tags, categories, aliases, contributors: previousContributors, ...rest } = json; const contributors = [ ...(previousContributors || []), diff --git a/scripts/updateGuidelineIcons.mjs b/scripts/updateGuidelineIcons.mts similarity index 100% rename from scripts/updateGuidelineIcons.mjs rename to scripts/updateGuidelineIcons.mts diff --git a/tools/build-font/main.mjs b/tools/build-font/main.ts similarity index 66% rename from tools/build-font/main.mjs rename to tools/build-font/main.ts index af7c8ff1d..74bb9990c 100644 --- a/tools/build-font/main.mjs +++ b/tools/build-font/main.ts @@ -26,38 +26,63 @@ async function getReleaseMetaData() { return releaseMetaData; } -function convertReleaseMetaData(releaseMetaData) { - return Object.entries(releaseMetaData) - .map(([key, value]) => [key, addAttribute(value, 'name', key)]) - .map(([, value]) => value) +type Releases = Record; + +type ReleaseMetaData = { + createdRelease: { + version: string; + date: string; + }; + changedRelease: { + version: string; + date: string; + }; +}; + +type ReleaseMetaDataWithName = ReleaseMetaData & { + name: string; +}; + +function convertReleaseMetaData(releases: Releases) { + return Object.entries(releases) + .map(([key, data]) => ({ + ...data, + name: key, + })) .sort((a, b) => sortMultiple(a, b, [sortByCreatedReleaseDate, sortByName])) - .map((value, index) => addAttribute(value, 'index', index)) - .map((value, index) => addAttribute(value, 'unicode', index + startUnicode)); + .map((value, index) => ({ ...value, index })) + .map((value, index) => ({ + ...value, + unicode: index + startUnicode, + })); } -function addAttribute(obj, attribute, value) { - obj[attribute] = value; - return obj; -} +type CollatorFunction = (a: ReleaseMetaDataWithName, b: ReleaseMetaDataWithName) => number; -function sortMultiple(a, b, collators = []) { - const comparison = collators.shift()(a, b); +function sortMultiple( + a: ReleaseMetaDataWithName, + b: ReleaseMetaDataWithName, + collators: CollatorFunction[] = [], +) { + const comparison = collators?.shift?.()?.(a, b) ?? 0; if (comparison === 0 && collators.length > 0) return sortMultiple(a, b, collators); return comparison; } -function sortByCreatedReleaseDate(a, b) { - const dates = [a, b].map((value) => new Date(value.createdRelease.date).valueOf()); - return (dates[0] > dates[1]) - (dates[0] < dates[1]); +function sortByCreatedReleaseDate(a: ReleaseMetaDataWithName, b: ReleaseMetaDataWithName) { + const [dateA, dateB] = [a, b].map((value) => new Date(value.createdRelease.date).valueOf()); + return Number(dateA > dateB) - Number(dateA < dateB); } -function sortByName(a, b) { +function sortByName(a: ReleaseMetaDataWithName, b: ReleaseMetaDataWithName) { return new Intl.Collator('en-US').compare(a.name, b.name); } -function getIconUnicode(name) { - const { unicode } = releaseMetaData.find(({ name: iconname }) => iconname === name); - return String.fromCharCode(unicode); +function getIconUnicode(name: string): [string, number] { + const { unicode } = releaseMetaData.find(({ name: iconName }) => iconName === name) ?? { + unicode: startUnicode, + }; + return [String.fromCharCode(unicode), startUnicode]; } async function init() { @@ -83,7 +108,7 @@ async function init() { generateInfoData: true, website: { title: 'Lucide', - logo: null, + logo: undefined, meta: { description: 'Lucide icons as TTF/EOT/WOFF/WOFF2/SVG.', keywords: 'Lucide,TTF,EOT,WOFF,WOFF2,SVG', diff --git a/tools/build-font/package.json b/tools/build-font/package.json index e9ebfb438..c3fd2d0da 100644 --- a/tools/build-font/package.json +++ b/tools/build-font/package.json @@ -3,9 +3,10 @@ "description": "A internal used package to build the font.", "private": true, "version": "1.0.0", - "main": "index.js", + "main": "main.ts", + "type": "module", "scripts": { - "start": "node ./main.mjs" + "start": "node ./main.ts" }, "keywords": [], "author": "", @@ -14,5 +15,10 @@ "fs-extra": "^11.2.0", "minimist": "^1.2.8", "svgtofont": "^6.0.0" + }, + "devDependencies": { + "@types/fs-extra": "^11.0.4", + "@types/minimist": "^1.2.5", + "@types/node": "^22" } } diff --git a/tools/build-font/tsconfig.json b/tools/build-font/tsconfig.json new file mode 100644 index 000000000..0faf8a35a --- /dev/null +++ b/tools/build-font/tsconfig.json @@ -0,0 +1,18 @@ +{ + "compilerOptions": { + "strict": true, + "declaration": true, + "noEmitOnError": true, + "noFallthroughCasesInSwitch": true, + "moduleResolution": "nodenext", + "module": "nodenext", + "target": "ESNext", + "esModuleInterop": true, + "lib": ["esnext"], + "resolveJsonModule": true, + "allowImportingTsExtensions": true, + "noEmit": true, + "sourceMap": true, + "outDir": "./dist", + }, +} diff --git a/tools/build-helpers/helpers.mjs b/tools/build-helpers/helpers.mjs deleted file mode 100644 index a1dc7cad3..000000000 --- a/tools/build-helpers/helpers.mjs +++ /dev/null @@ -1,20 +0,0 @@ -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/helpers.ts b/tools/build-helpers/helpers.ts new file mode 100644 index 000000000..3c828f285 --- /dev/null +++ b/tools/build-helpers/helpers.ts @@ -0,0 +1,20 @@ +export * from './src/toCamelCase.ts'; +export * from './src/toPascalCase.ts'; +export * from './src/toKebabCase.ts'; +export * from './src/resetFile.ts'; +export * from './src/readFile.ts'; +export * from './src/appendFile.ts'; +export * from './src/writeFile.ts'; +export * from './src/writeFileIfNotExists.ts'; +export * from './src/readAllMetadata.ts'; +export * from './src/readMetadata.ts'; +export * from './src/readSvgDirectory.ts'; +export * from './src/readSvg.ts'; +export * from './src/writeSvgFile.ts'; +export * from './src/hash.ts'; +export * from './src/generateHashedKey.ts'; +export * from './src/hasDuplicatedChildren.ts'; +export * from './src/mergeArrays.ts'; +export * from './src/getCurrentDirPath.ts'; +export * from './src/minifySvg.ts'; +export * from './src/shuffleArray.ts'; diff --git a/tools/build-helpers/package.json b/tools/build-helpers/package.json index a329d8b7c..2bb6f6b74 100644 --- a/tools/build-helpers/package.json +++ b/tools/build-helpers/package.json @@ -3,9 +3,12 @@ "private": true, "version": "1.0.0", "description": "A internal used package with helpers.", - "main": "helpers.mjs", - "types": "module", + "main": "helpers.ts", + "types": "helpers.ts", "author": "", "license": "ISC", - "type": "module" + "type": "module", + "devDependencies": { + "@types/node": "^22" + } } diff --git a/tools/build-helpers/src/appendFile.mjs b/tools/build-helpers/src/appendFile.ts similarity index 55% rename from tools/build-helpers/src/appendFile.mjs rename to tools/build-helpers/src/appendFile.ts index 11653a78d..b54da63db 100644 --- a/tools/build-helpers/src/appendFile.mjs +++ b/tools/build-helpers/src/appendFile.ts @@ -9,5 +9,8 @@ import path from 'path'; * @param {string} fileName * @param {string} outputDirectory */ -export const appendFile = (content, fileName, outputDirectory) => - fs.appendFile(path.join(outputDirectory, fileName), content, 'utf-8'); +export const appendFile = ( + content: string, + fileName: string, + outputDirectory: string, +): Promise => fs.appendFile(path.join(outputDirectory, fileName), content, 'utf-8'); diff --git a/tools/build-helpers/src/generateHashedKey.mjs b/tools/build-helpers/src/generateHashedKey.ts similarity index 60% rename from tools/build-helpers/src/generateHashedKey.mjs rename to tools/build-helpers/src/generateHashedKey.ts index ec9145318..2b1e1925a 100644 --- a/tools/build-helpers/src/generateHashedKey.mjs +++ b/tools/build-helpers/src/generateHashedKey.ts @@ -1,5 +1,5 @@ /* eslint-disable import/prefer-default-export */ -import { hash } from './hash.mjs'; +import { hash } from './hash.ts'; /** * Generate Hashed string based on name and attributes @@ -9,4 +9,10 @@ import { hash } from './hash.mjs'; * @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])); +export const generateHashedKey = ({ + name, + attributes, +}: { + name: string; + attributes: Record; +}): string => hash(JSON.stringify([name, attributes])); diff --git a/tools/build-helpers/src/getCurrentDirPath.mjs b/tools/build-helpers/src/getCurrentDirPath.ts similarity index 65% rename from tools/build-helpers/src/getCurrentDirPath.mjs rename to tools/build-helpers/src/getCurrentDirPath.ts index e0c2ddc78..365e1f31d 100644 --- a/tools/build-helpers/src/getCurrentDirPath.mjs +++ b/tools/build-helpers/src/getCurrentDirPath.ts @@ -8,4 +8,5 @@ import { fileURLToPath } from 'url'; * @param {string} currentPath * @returns {string} */ -export const getCurrentDirPath = (currentPath) => path.dirname(fileURLToPath(currentPath)); +export const getCurrentDirPath = (currentPath: string): string => + path.dirname(fileURLToPath(currentPath)); diff --git a/tools/build-helpers/src/hasDuplicatedChildren.mjs b/tools/build-helpers/src/hasDuplicatedChildren.ts similarity index 67% rename from tools/build-helpers/src/hasDuplicatedChildren.mjs rename to tools/build-helpers/src/hasDuplicatedChildren.ts index 866f0cd19..a151228d4 100644 --- a/tools/build-helpers/src/hasDuplicatedChildren.mjs +++ b/tools/build-helpers/src/hasDuplicatedChildren.ts @@ -1,5 +1,5 @@ /* eslint-disable import/prefer-default-export */ -import { generateHashedKey } from './generateHashedKey.mjs'; +import { generateHashedKey } from './generateHashedKey.ts'; /** * Checks if array of items contains duplicated items @@ -7,7 +7,9 @@ import { generateHashedKey } from './generateHashedKey.mjs'; * @param {array} children an array of items * @returns {Boolean} if items contains duplicated items. */ -export const hasDuplicatedChildren = (children) => { +export const hasDuplicatedChildren = ( + children: Array<{ name: string; attributes: Record }>, +): boolean => { const hashedKeys = children.map(generateHashedKey); return !hashedKeys.every( diff --git a/tools/build-helpers/src/hash.mjs b/tools/build-helpers/src/hash.ts similarity index 85% rename from tools/build-helpers/src/hash.mjs rename to tools/build-helpers/src/hash.ts index 52fe12c9e..4e1c17626 100644 --- a/tools/build-helpers/src/hash.mjs +++ b/tools/build-helpers/src/hash.ts @@ -6,7 +6,7 @@ * @param {number} seed * @returns {string} A hashed string of 6 characters */ -export const hash = (string, seed = 5381) => { +export const hash = (string: string, seed: number = 5381): string => { let i = string.length; while (i) { diff --git a/tools/build-helpers/src/mergeArrays.mjs b/tools/build-helpers/src/mergeArrays.ts similarity index 81% rename from tools/build-helpers/src/mergeArrays.mjs rename to tools/build-helpers/src/mergeArrays.ts index b72afe980..8144fd67a 100644 --- a/tools/build-helpers/src/mergeArrays.mjs +++ b/tools/build-helpers/src/mergeArrays.ts @@ -6,7 +6,7 @@ * @param {array} b * @returns {array} */ -export const mergeArrays = (a, b) => { +export const mergeArrays = (a: T[], b: T[]): T[] => { a = a.concat(b); a = a.filter((i, p) => a.indexOf(i) === p); return a; diff --git a/tools/build-helpers/src/minifySvg.mjs b/tools/build-helpers/src/minifySvg.ts similarity index 83% rename from tools/build-helpers/src/minifySvg.mjs rename to tools/build-helpers/src/minifySvg.ts index 9ce9d1d2c..61c784029 100644 --- a/tools/build-helpers/src/minifySvg.mjs +++ b/tools/build-helpers/src/minifySvg.ts @@ -5,7 +5,7 @@ * @param {string} string * @returns string */ -export function minifySvg(string) { +export function minifySvg(string: string): string { return string ? string .replace(/>[\r\n ]+<') diff --git a/tools/build-helpers/src/readAllMetadata.mjs b/tools/build-helpers/src/readAllMetadata.ts similarity index 78% rename from tools/build-helpers/src/readAllMetadata.mjs rename to tools/build-helpers/src/readAllMetadata.ts index 5990c24ad..eda0985af 100644 --- a/tools/build-helpers/src/readAllMetadata.mjs +++ b/tools/build-helpers/src/readAllMetadata.ts @@ -1,7 +1,6 @@ -/* eslint-disable import/prefer-default-export */ import fs from 'fs/promises'; import path from 'path'; -import { readMetadata } from './readMetadata.mjs'; +import { readMetadata } from './readMetadata.ts'; /** * Reads metadata from the icons/categories directories @@ -9,7 +8,7 @@ import { readMetadata } from './readMetadata.mjs'; * @param {string} directory * @returns {object} A map of icon or category metadata */ -export const readAllMetadata = async (directory) => { +export const readAllMetadata = async (directory: string): Promise> => { const directoryContent = await fs.readdir(directory); const metaDataPromises = directoryContent diff --git a/tools/build-helpers/src/readFile.mjs b/tools/build-helpers/src/readFile.ts similarity index 60% rename from tools/build-helpers/src/readFile.mjs rename to tools/build-helpers/src/readFile.ts index a862947e5..58d70a3aa 100644 --- a/tools/build-helpers/src/readFile.mjs +++ b/tools/build-helpers/src/readFile.ts @@ -8,4 +8,5 @@ import path from 'path'; * @param {string} path * @returns {string} The contents of a file */ -export const readFile = (path) => fs.readFile(path.resolve(__dirname, '../', path), 'utf-8'); +export const readFile = (filePath: string): Promise => + fs.readFile(path.resolve(__dirname, '../', filePath), 'utf-8'); diff --git a/tools/build-helpers/src/readMetadata.mjs b/tools/build-helpers/src/readMetadata.mjs deleted file mode 100644 index 120b5e886..000000000 --- a/tools/build-helpers/src/readMetadata.mjs +++ /dev/null @@ -1,16 +0,0 @@ -/* eslint-disable import/prefer-default-export */ -import fs from 'fs/promises'; -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 = async (fileName, directory) => { - const metadataFileContent = await fs.readFile(path.join(directory, fileName), 'utf-8'); - - return JSON.parse(metadataFileContent); -}; diff --git a/tools/build-helpers/src/readMetadata.ts b/tools/build-helpers/src/readMetadata.ts new file mode 100644 index 000000000..0b0a299fd --- /dev/null +++ b/tools/build-helpers/src/readMetadata.ts @@ -0,0 +1,23 @@ +/* eslint-disable import/prefer-default-export */ +import fs from 'fs/promises'; +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 = async (fileName: string, directory: string): Promise => { + let metadataFileContent: string | Buffer = await fs.readFile( + path.join(directory, fileName), + 'utf-8', + ); + + if (Buffer.isBuffer(metadataFileContent)) { + metadataFileContent = metadataFileContent.toString('utf-8'); + } + + return JSON.parse(metadataFileContent); +}; diff --git a/tools/build-helpers/src/readSvg.mjs b/tools/build-helpers/src/readSvg.ts similarity index 76% rename from tools/build-helpers/src/readSvg.mjs rename to tools/build-helpers/src/readSvg.ts index ed6931102..42a3b3e0a 100644 --- a/tools/build-helpers/src/readSvg.mjs +++ b/tools/build-helpers/src/readSvg.ts @@ -8,5 +8,5 @@ import path from 'path'; * @param {string} fileName * @param {string} directory */ -export const readSvg = (fileName, directory) => +export const readSvg = (fileName: string, directory: string): Promise => fs.readFile(path.join(directory, fileName), 'utf-8'); diff --git a/tools/build-helpers/src/readSvgDirectory.mjs b/tools/build-helpers/src/readSvgDirectory.ts similarity index 72% rename from tools/build-helpers/src/readSvgDirectory.mjs rename to tools/build-helpers/src/readSvgDirectory.ts index f22b5dffc..7091a668a 100644 --- a/tools/build-helpers/src/readSvgDirectory.mjs +++ b/tools/build-helpers/src/readSvgDirectory.ts @@ -1,4 +1,5 @@ /* eslint-disable import/prefer-default-export */ +import { type PathLike } from 'fs'; import fs from 'fs/promises'; import path from 'path'; @@ -9,7 +10,10 @@ import path from 'path'; * @param {string} fileExtension * @returns {array} An array of file paths containing svgs */ -export const readSvgDirectory = async (directory, fileExtension = '.svg') => { +export const readSvgDirectory = async ( + directory: PathLike, + fileExtension: string = '.svg', +): Promise => { const directoryContents = await fs.readdir(directory); return directoryContents.filter((file) => path.extname(file) === fileExtension); diff --git a/tools/build-helpers/src/resetFile.mjs b/tools/build-helpers/src/resetFile.ts similarity index 76% rename from tools/build-helpers/src/resetFile.mjs rename to tools/build-helpers/src/resetFile.ts index 7f11df3ca..f9d368340 100644 --- a/tools/build-helpers/src/resetFile.mjs +++ b/tools/build-helpers/src/resetFile.ts @@ -8,5 +8,5 @@ import path from 'path'; * @param {string} fileName * @param {string} outputDirectory */ -export const resetFile = (fileName, outputDirectory) => +export const resetFile = (fileName: string, outputDirectory: string): Promise => fs.writeFile(path.join(outputDirectory, fileName), '', 'utf-8'); diff --git a/tools/build-helpers/src/shuffleArray.mjs b/tools/build-helpers/src/shuffleArray.ts similarity index 85% rename from tools/build-helpers/src/shuffleArray.mjs rename to tools/build-helpers/src/shuffleArray.ts index 4959dcb0f..28429b831 100644 --- a/tools/build-helpers/src/shuffleArray.mjs +++ b/tools/build-helpers/src/shuffleArray.ts @@ -3,7 +3,7 @@ * @param {array} array * @returns {array} */ -export const shuffleArray = (array) => { +export const shuffleArray = (array: T[]): T[] => { // eslint-disable-next-line no-plusplus for (let i = array.length - 1; i > 0; i--) { const j = Math.floor(Math.random() * (i + 1)); diff --git a/tools/build-helpers/src/toCamelCase.mjs b/tools/build-helpers/src/toCamelCase.ts similarity index 83% rename from tools/build-helpers/src/toCamelCase.mjs rename to tools/build-helpers/src/toCamelCase.ts index be76c829e..1c963434a 100644 --- a/tools/build-helpers/src/toCamelCase.mjs +++ b/tools/build-helpers/src/toCamelCase.ts @@ -5,7 +5,7 @@ * @param {string} string * @returns {string} A camelized string */ -export const toCamelCase = (string) => +export const toCamelCase = (string: string): 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.ts similarity index 57% rename from tools/build-helpers/src/toKebabCase.mjs rename to tools/build-helpers/src/toKebabCase.ts index 1825511c3..e6449622e 100644 --- a/tools/build-helpers/src/toKebabCase.mjs +++ b/tools/build-helpers/src/toKebabCase.ts @@ -5,4 +5,5 @@ * @param {string} string * @returns {string} A kebabized string */ -export const toKebabCase = (string) => string.replace(/([a-z0-9])([A-Z])/g, '$1-$2').toLowerCase(); +export const toKebabCase = (string: string): 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.ts similarity index 71% rename from tools/build-helpers/src/toPascalCase.mjs rename to tools/build-helpers/src/toPascalCase.ts index 1e97d18c8..7ba41b3d0 100644 --- a/tools/build-helpers/src/toPascalCase.mjs +++ b/tools/build-helpers/src/toPascalCase.ts @@ -1,5 +1,5 @@ /* eslint-disable import/prefer-default-export */ -import { toCamelCase } from './toCamelCase.mjs'; +import { toCamelCase } from './toCamelCase.ts'; /** * Converts string to PascalCase @@ -7,7 +7,7 @@ import { toCamelCase } from './toCamelCase.mjs'; * @param {string} string * @returns {string} A pascalized string */ -export const toPascalCase = (string) => { +export const toPascalCase = (string: string): 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.ts similarity index 56% rename from tools/build-helpers/src/writeFile.mjs rename to tools/build-helpers/src/writeFile.ts index 9c2330d37..c165ea6e5 100644 --- a/tools/build-helpers/src/writeFile.mjs +++ b/tools/build-helpers/src/writeFile.ts @@ -9,5 +9,8 @@ import path from 'path'; * @param {string} fileName * @param {string} outputDirectory */ -export const writeFile = (content, fileName, outputDirectory) => - fs.writeFile(path.join(outputDirectory, fileName), content, 'utf-8'); +export const writeFile = ( + content: string, + fileName: string, + outputDirectory: string, +): Promise => fs.writeFile(path.join(outputDirectory, fileName), content, 'utf-8'); diff --git a/tools/build-helpers/src/writeFileIfNotExists.mjs b/tools/build-helpers/src/writeFileIfNotExists.ts similarity index 65% rename from tools/build-helpers/src/writeFileIfNotExists.mjs rename to tools/build-helpers/src/writeFileIfNotExists.ts index 44892d267..32a32adbb 100644 --- a/tools/build-helpers/src/writeFileIfNotExists.mjs +++ b/tools/build-helpers/src/writeFileIfNotExists.ts @@ -1,7 +1,7 @@ /* eslint-disable import/prefer-default-export */ -import fs from 'fs/promises'; +import fs from 'fs'; import path from 'path'; -import { writeFile } from './writeFile.mjs'; +import { writeFile } from './writeFile.ts'; /** * writes content to a file if it does not exist @@ -10,7 +10,11 @@ import { writeFile } from './writeFile.mjs'; * @param {string} fileName * @param {string} outputDirectory */ -export const writeFileIfNotExists = (content, fileName, outputDirectory) => { +export const writeFileIfNotExists = ( + content: string, + fileName: string, + outputDirectory: string, +): void => { 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.ts similarity index 55% rename from tools/build-helpers/src/writeSvgFile.mjs rename to tools/build-helpers/src/writeSvgFile.ts index 2651d786c..f798ae3c2 100644 --- a/tools/build-helpers/src/writeSvgFile.mjs +++ b/tools/build-helpers/src/writeSvgFile.ts @@ -9,5 +9,8 @@ import path from 'path'; * @param {string} outputDirectory * @param {string} content */ -export const writeSvgFile = (fileName, outputDirectory, content) => - fs.writeFile(path.join(outputDirectory, fileName), content, 'utf-8'); +export const writeSvgFile = ( + fileName: string, + outputDirectory: string, + content: string, +): Promise => fs.writeFile(path.join(outputDirectory, fileName), content, 'utf-8'); diff --git a/tools/build-helpers/tsconfig.json b/tools/build-helpers/tsconfig.json new file mode 100644 index 000000000..6df24e8cd --- /dev/null +++ b/tools/build-helpers/tsconfig.json @@ -0,0 +1,18 @@ +{ + "compilerOptions": { + "strict": true, + "declaration": true, + "noEmitOnError": true, + "noFallthroughCasesInSwitch": true, + "moduleResolution": "node", + "module": "ESNext", + "target": "ESNext", + "esModuleInterop": true, + "lib": ["esnext"], + "resolveJsonModule": true, + "allowImportingTsExtensions": true, + "noEmit": true, + "sourceMap": true, + "outDir": "./dist", + }, +} diff --git a/tools/build-icons/building/aliases/generateAliasesFiles.mjs b/tools/build-icons/building/aliases/generateAliasesFiles.ts similarity index 90% rename from tools/build-icons/building/aliases/generateAliasesFiles.mjs rename to tools/build-icons/building/aliases/generateAliasesFiles.ts index 1551dc2e4..ea9572b12 100644 --- a/tools/build-icons/building/aliases/generateAliasesFiles.mjs +++ b/tools/build-icons/building/aliases/generateAliasesFiles.ts @@ -2,8 +2,23 @@ import path from 'path'; import fs from 'fs'; // eslint-disable-next-line import/no-extraneous-dependencies import { toPascalCase, resetFile, appendFile } from '@lucide/helpers'; -import deprecationReasonTemplate from '../../utils/deprecationReasonTemplate.mjs'; -import getExportString from './getExportString.mjs'; +import deprecationReasonTemplate from '../../utils/deprecationReasonTemplate.ts'; +import getExportString from './getExportString.ts'; +import type { IconMetadata, IconNode } from '../../types.ts'; +import { type INode } from 'svgson'; + +interface GenerateAliasesFilesOptions { + iconNodes: Record; + outputDirectory: string; + fileExtension: string; + iconFileExtension?: string; + iconMetaData: Record; + aliasImportFileExtension: string; + aliasNamesOnly?: boolean; + separateAliasesFile?: boolean; + separateAliasesFileExtension?: string; + showLog?: boolean; +} export default async function generateAliasesFiles({ iconNodes, @@ -16,7 +31,7 @@ export default async function generateAliasesFiles({ separateAliasesFile = false, separateAliasesFileExtension, showLog = true, -}) { +}: GenerateAliasesFilesOptions) { const iconsDistDirectory = path.join(outputDirectory, `icons`); const icons = Object.keys(iconNodes); @@ -47,7 +62,7 @@ export default async function generateAliasesFiles({ return { name: alias, deprecated: false, - }; + } as const; } return alias; }); diff --git a/tools/build-icons/building/aliases/getExportString.mjs b/tools/build-icons/building/aliases/getExportString.ts similarity index 78% rename from tools/build-icons/building/aliases/getExportString.mjs rename to tools/build-icons/building/aliases/getExportString.ts index a0bd33edc..d4b48c034 100644 --- a/tools/build-icons/building/aliases/getExportString.mjs +++ b/tools/build-icons/building/aliases/getExportString.ts @@ -1,8 +1,8 @@ const getExportString = ( - componentName, - iconName, - aliasImportFileExtension, - deprecated, + componentName: string, + iconName: string, + aliasImportFileExtension: string, + deprecated?: boolean, deprecationReason = '', ) => deprecated diff --git a/tools/build-icons/building/generateDynamicImports.mjs b/tools/build-icons/building/generateDynamicImports.ts similarity index 81% rename from tools/build-icons/building/generateDynamicImports.mjs rename to tools/build-icons/building/generateDynamicImports.ts index 4d9988018..63043e77b 100644 --- a/tools/build-icons/building/generateDynamicImports.mjs +++ b/tools/build-icons/building/generateDynamicImports.ts @@ -1,5 +1,14 @@ import path from 'path'; import { resetFile, appendFile } from '@lucide/helpers'; +import type { IconMetadata, IconNode } from '../types.ts'; + +interface GenerateDynamicImports { + iconNodes: Record; + outputDirectory: string; + fileExtension: string; + iconMetaData: Record; + showLog?: boolean; +} export default async function generateDynamicImports({ iconNodes, @@ -7,7 +16,7 @@ export default async function generateDynamicImports({ fileExtension, iconMetaData, showLog = true, -}) { +}: GenerateDynamicImports) { const fileName = path.basename(`dynamicIconImports${fileExtension}`); const icons = Object.keys(iconNodes); diff --git a/tools/build-icons/building/generateExportsFile.mjs b/tools/build-icons/building/generateExportsFile.ts similarity index 86% rename from tools/build-icons/building/generateExportsFile.mjs rename to tools/build-icons/building/generateExportsFile.ts index 1b34186ad..0ba0d4186 100644 --- a/tools/build-icons/building/generateExportsFile.mjs +++ b/tools/build-icons/building/generateExportsFile.ts @@ -2,12 +2,13 @@ import path from 'path'; // eslint-disable-next-line import/no-extraneous-dependencies import { toPascalCase, toCamelCase, resetFile, appendFile } from '@lucide/helpers'; +import type { IconNode } from '../types.ts'; export default async function generateExportFile( - inputEntry, - outputDirectory, - iconNodes, - exportModuleNameCasing, + inputEntry: string, + outputDirectory: string, + iconNodes: IconNode, + exportModuleNameCasing: 'camel' | 'pascal', iconFileExtension = '', ) { const fileName = path.basename(inputEntry); diff --git a/tools/build-icons/building/generateIconFiles.mjs b/tools/build-icons/building/generateIconFiles.ts similarity index 70% rename from tools/build-icons/building/generateIconFiles.mjs rename to tools/build-icons/building/generateIconFiles.ts index 06fd7067e..9babf1cf2 100644 --- a/tools/build-icons/building/generateIconFiles.mjs +++ b/tools/build-icons/building/generateIconFiles.ts @@ -2,7 +2,22 @@ import fs from 'fs'; import path from 'path'; import prettier from 'prettier'; import { readSvg, toPascalCase } from '@lucide/helpers'; -import deprecationReasonTemplate from '../utils/deprecationReasonTemplate.mjs'; +import deprecationReasonTemplate from '../utils/deprecationReasonTemplate.ts'; +import type { IconMetadata, IconNode, Path, TemplateFunction } from '../types.ts'; +import { type INode } from 'svgson'; + +interface GenerateIconFiles { + iconNodes: Record; + outputDirectory: Path; + template: TemplateFunction; + showLog?: boolean; + iconFileExtension?: string; + separateIconFileExport?: boolean; + separateIconFileExportExtension?: string; + pretty?: boolean; + iconsDir: string; + iconMetaData: Record; +} function generateIconFiles({ iconNodes, @@ -15,7 +30,7 @@ function generateIconFiles({ pretty = true, iconsDir, iconMetaData, -}) { +}: GenerateIconFiles) { const icons = Object.keys(iconNodes); const iconsDistDirectory = path.join(outputDirectory, `icons`); @@ -27,13 +42,15 @@ function generateIconFiles({ const location = path.join(iconsDistDirectory, `${iconName}${iconFileExtension}`); const componentName = toPascalCase(iconName); - let { children } = iconNodes[iconName]; - children = children.map(({ name, attributes }) => [name, attributes]); + const children: IconNode = iconNodes[iconName].children.map(({ name, attributes }) => [ + name, + attributes, + ]); const getSvg = () => readSvg(`${iconName}.svg`, iconsDir); - const { deprecated = false, toBeRemovedInVersion = null } = iconMetaData[iconName]; + const { deprecated = false, toBeRemovedInVersion = undefined } = iconMetaData[iconName]; const deprecationReason = deprecated - ? deprecationReasonTemplate(iconMetaData[iconName].deprecationReason, { + ? deprecationReasonTemplate(iconMetaData[iconName]?.deprecationReason ?? '', { componentName, iconName, toBeRemovedInVersion, @@ -50,7 +67,7 @@ function generateIconFiles({ }); const output = pretty - ? prettier.format(elementTemplate, { + ? await prettier.format(elementTemplate, { singleQuote: true, trailingComma: 'all', printWidth: 100, diff --git a/tools/build-icons/cli.mjs b/tools/build-icons/cli.ts similarity index 75% rename from tools/build-icons/cli.mjs rename to tools/build-icons/cli.ts index 22e783e5e..7af5016fd 100755 --- a/tools/build-icons/cli.mjs +++ b/tools/build-icons/cli.ts @@ -4,16 +4,37 @@ import path from 'path'; import getArgumentOptions from 'minimist'; import { readSvgDirectory } from '@lucide/helpers'; -import renderIconsObject from './render/renderIconsObject.mjs'; -import generateIconFiles from './building/generateIconFiles.mjs'; -import generateExportsFile from './building/generateExportsFile.mjs'; +import renderIconsObject from './render/renderIconsObject.ts'; +import generateIconFiles from './building/generateIconFiles.ts'; +import generateExportsFile from './building/generateExportsFile.ts'; -import generateAliasesFiles from './building/aliases/generateAliasesFiles.mjs'; +import generateAliasesFiles from './building/aliases/generateAliasesFiles.ts'; // 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'; +import getIconMetaData from './utils/getIconMetaData.ts'; +import generateDynamicImports from './building/generateDynamicImports.ts'; -const cliArguments = getArgumentOptions(process.argv.slice(2)); +interface CliArguments { + renderUniqueKey?: boolean; + templateSrc?: string; + silent?: boolean; + iconFileExtension?: string; + importImportFileExtension?: string; + exportFileName?: string; + exportModuleNameCasing?: 'camel' | 'pascal'; + withAliases?: boolean; + aliasNamesOnly?: boolean; + withDynamicImports?: boolean; + separateAliasesFile?: boolean; + separateAliasesFileExtension?: string; + separateIconFileExport?: boolean; + separateIconFileExportExtension?: string; + aliasesFileExtension?: string; + aliasImportFileExtension?: string; + pretty?: boolean; + output: string | undefined; +} + +const cliArguments = getArgumentOptions(process.argv.slice(2)) as unknown as CliArguments; const ICONS_DIR = path.resolve(process.cwd(), '../../icons'); const OUTPUT_DIR = path.resolve(process.cwd(), cliArguments.output || '../build'); @@ -64,7 +85,7 @@ async function buildIcons() { iconFileExtension, separateIconFileExport, separateIconFileExportExtension, - pretty: JSON.parse(pretty), + pretty: JSON.parse(String(pretty)), iconsDir: ICONS_DIR, iconMetaData, }); diff --git a/tools/build-icons/index.mjs b/tools/build-icons/index.ts similarity index 58% rename from tools/build-icons/index.mjs rename to tools/build-icons/index.ts index f02361649..d7ffc125c 100644 --- a/tools/build-icons/index.mjs +++ b/tools/build-icons/index.ts @@ -1,3 +1,3 @@ -export { default as getAliases } from './utils/getAliases.mjs'; -export { default as getIconMetaData } from './utils/getIconMetaData.mjs'; -export { default as renderIconsObject } from './render/renderIconsObject.mjs'; +export { default as getAliases } from './utils/getAliases'; +export { default as getIconMetaData } from './utils/getIconMetaData'; +export { default as renderIconsObject } from './render/renderIconsObject'; diff --git a/tools/build-icons/package.json b/tools/build-icons/package.json index a623933b8..309b42a02 100644 --- a/tools/build-icons/package.json +++ b/tools/build-icons/package.json @@ -2,22 +2,38 @@ "name": "@lucide/build-icons", "description": "A internal used package to build icon code files for the lucide icon library packages.", "version": "1.1.0", - "main": "index.mjs", + "main": "index.ts", "type": "module", "scripts": { - "start": "node ./cli.mjs" + "start": "node ./cli.ts" }, "bin": { - "build-icons": "./cli.mjs" + "build-icons": "./cli.ts" }, "engines": { - "node": ">=23.0.0" + "node": ">= 23" + }, + "exports": { + ".": { + "import": "./index.ts", + "require": "./index.ts" + }, + "./cli": { + "import": "./cli.ts", + "require": "./cli.ts" + }, + "./utils/*": { + "import": "./utils/*.ts", + "require": "./utils/*.ts" + } }, "keywords": [], "author": "", "license": "ISC", "devDependencies": { - "@lucide/helpers": "workspace:*" + "@lucide/helpers": "workspace:*", + "@types/minimist": "^1.2.5", + "@types/node": "^22" }, "dependencies": { "minimist": "^1.2.7", diff --git a/tools/build-icons/render/renderIconsObject.mjs b/tools/build-icons/render/renderIconsObject.ts similarity index 82% rename from tools/build-icons/render/renderIconsObject.mjs rename to tools/build-icons/render/renderIconsObject.ts index 64848fb22..618c408d4 100644 --- a/tools/build-icons/render/renderIconsObject.mjs +++ b/tools/build-icons/render/renderIconsObject.ts @@ -1,16 +1,16 @@ import { basename } from 'path'; -import { parseSync } from 'svgson'; +import { type INode, parseSync } from 'svgson'; import { generateHashedKey, readSvg, hasDuplicatedChildren } from '@lucide/helpers'; /** * 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. + * @param {string} iconsDirectory - The directory where the icons are stored. * @returns {Object} */ export default async function generateIconObject( - svgFiles, - iconsDirectory, + svgFiles: string[], + iconsDirectory: string, renderUniqueKey = false, ) { const svgsContentPromises = svgFiles.map(async (svgFile) => { @@ -39,7 +39,7 @@ export default async function generateIconObject( const svgsContents = await Promise.all(svgsContentPromises); - return svgsContents.reduce((icons, icon) => { + return svgsContents.reduce>((icons, icon) => { icons[icon.name] = icon.contents; return icons; }, {}); diff --git a/tools/build-icons/tsconfig.json b/tools/build-icons/tsconfig.json index 458019778..b786f8c4a 100644 --- a/tools/build-icons/tsconfig.json +++ b/tools/build-icons/tsconfig.json @@ -1,6 +1,6 @@ { "compilerOptions": { - "strict": false, + "strict": true, "declaration": true, "noEmitOnError": true, "noFallthroughCasesInSwitch": true, @@ -8,10 +8,10 @@ "module": "ESNext", "target": "ESNext", "esModuleInterop": true, - "allowJs": true, "lib": ["esnext"], "resolveJsonModule": true, + "allowImportingTsExtensions": true, + "noEmit": true, "sourceMap": true, - "outDir": "./dist", }, } diff --git a/tools/build-icons/types.ts b/tools/build-icons/types.ts new file mode 100644 index 000000000..d20023407 --- /dev/null +++ b/tools/build-icons/types.ts @@ -0,0 +1,45 @@ +import { type INode } from 'svgson'; + +export type SVGProps = Record; + +export type IconNode = [tag: string, attrs: SVGProps][]; + +export type IconNodeWithChildren = [tag: string, attrs: SVGProps, children: IconNode]; + +export type TemplateFunction = (params: { + componentName: string; + iconName: string; + children: IconNode; + getSvg: () => Promise; + deprecated?: boolean; + deprecationReason?: string; +}) => Promise; + +export type Path = string; + +export type AliasDeprecationReason = 'alias.typo' | 'alias.name' | 'alias.duplicate'; + +export type AliasDeprecation = { + name: string; + deprecated: true; + deprecationReason: AliasDeprecationReason; + toBeRemovedInVersion: string; +}; + +export type IconDeprecationReason = 'icon.brand' | ''; + +export type IconMetadataBase = { + toBeRemovedInVersion?: string; + categories?: string[]; + aliases?: (string | AliasDeprecation)[]; + tags?: string[]; + deprecationReason?: IconDeprecationReason; + deprecated?: boolean; +}; + +export type IconMetadataWithDeprecation = IconMetadataBase & { + deprecated: true; + deprecationReason?: IconDeprecationReason; +}; + +export type IconMetadata = IconMetadataBase | IconMetadataWithDeprecation; diff --git a/tools/build-icons/utils/base64SVG.mjs b/tools/build-icons/utils/base64SVG.ts similarity index 84% rename from tools/build-icons/utils/base64SVG.mjs rename to tools/build-icons/utils/base64SVG.ts index b883d0fff..b4a833c7d 100644 --- a/tools/build-icons/utils/base64SVG.mjs +++ b/tools/build-icons/utils/base64SVG.ts @@ -1,4 +1,4 @@ -const base64SVG = (svgContents) => +const base64SVG = (svgContents: string) => Buffer.from( svgContents .replace('\n', '') diff --git a/tools/build-icons/utils/defineExportTemplate.ts b/tools/build-icons/utils/defineExportTemplate.ts new file mode 100644 index 000000000..201937439 --- /dev/null +++ b/tools/build-icons/utils/defineExportTemplate.ts @@ -0,0 +1,16 @@ +import { type IconNode } from '../types.ts'; + +export interface ExportTemplate { + componentName: string; + iconName: string; + children: IconNode; + getSvg: () => Promise; + deprecated: boolean; + deprecationReason: string; +} + +export type TemplateFunction = (params: ExportTemplate) => Promise; + +const defineExportTemplate = (exportFunction: TemplateFunction) => exportFunction; + +export default defineExportTemplate; diff --git a/tools/build-icons/utils/deprecationReasonTemplate.mjs b/tools/build-icons/utils/deprecationReasonTemplate.ts similarity index 74% rename from tools/build-icons/utils/deprecationReasonTemplate.mjs rename to tools/build-icons/utils/deprecationReasonTemplate.ts index cb13a3bba..c8f36804f 100644 --- a/tools/build-icons/utils/deprecationReasonTemplate.mjs +++ b/tools/build-icons/utils/deprecationReasonTemplate.ts @@ -1,6 +1,16 @@ +import type { AliasDeprecationReason, IconDeprecationReason } from '../types.ts'; + export default function deprecationReasonTemplate( - deprecationReason, - { componentName, iconName, toBeRemovedInVersion }, + deprecationReason: AliasDeprecationReason | IconDeprecationReason, + { + componentName, + iconName, + toBeRemovedInVersion, + }: { + componentName: string; + iconName: string; + toBeRemovedInVersion?: string; + }, ) { const removalNotice = toBeRemovedInVersion ? ` This ${ @@ -13,7 +23,7 @@ export default function deprecationReasonTemplate( return `Renamed because of typo, use {@link ${componentName}} instead.${removalNotice}`; case 'alias.duplicate': return `The icon was combined with another icon that shares the same use case, use {@link ${componentName}} instead.${removalNotice}`; - case 'alias.naming': + case 'alias.name': return `The name of this icon was changed because it didn't meet our guidelines anymore, use {@link ${componentName}} instead.${removalNotice}`; case 'icon.brand': return `Brand icons have been deprecated and are due to be removed, please refer to https://github.com/lucide-icons/lucide/issues/670. We recommend using https://simpleicons.org/?q=${iconName} instead.${removalNotice}`; diff --git a/tools/build-icons/utils/getAliases.mjs b/tools/build-icons/utils/getAliases.ts similarity index 85% rename from tools/build-icons/utils/getAliases.mjs rename to tools/build-icons/utils/getAliases.ts index 0ebcddc7f..e0b66ebc1 100644 --- a/tools/build-icons/utils/getAliases.mjs +++ b/tools/build-icons/utils/getAliases.ts @@ -1,7 +1,8 @@ import path from 'path'; import { readSvgDirectory } from '@lucide/helpers'; +import { Path } from '../types'; -async function getAliases(iconDirectory) { +async function getAliases(iconDirectory: Path) { const iconJsons = await readSvgDirectory(iconDirectory, '.json'); const aliasesEntries = await Promise.all( iconJsons.map(async (jsonFile) => { diff --git a/tools/build-icons/utils/getIconMetaData.mjs b/tools/build-icons/utils/getIconMetaData.ts similarity index 71% rename from tools/build-icons/utils/getIconMetaData.mjs rename to tools/build-icons/utils/getIconMetaData.ts index 922ddd0af..d835bb8e5 100644 --- a/tools/build-icons/utils/getIconMetaData.mjs +++ b/tools/build-icons/utils/getIconMetaData.ts @@ -1,10 +1,11 @@ import path from 'path'; import { readSvgDirectory } from '@lucide/helpers'; +import { type IconMetadata } from '../types.ts'; -async function getIconMetaData(iconDirectory) { +async function getIconMetaData(iconDirectory: string): Promise> { const iconJsons = await readSvgDirectory(iconDirectory, '.json'); const aliasesEntries = await Promise.all( - iconJsons.map(async (jsonFile) => { + iconJsons.map(async (jsonFile: string) => { /** eslint-disable */ const file = await import(path.join(iconDirectory, jsonFile), { with: { type: 'json' } }); return [path.basename(jsonFile, '.json'), file.default]; diff --git a/tools/outline-svg/main.mjs b/tools/outline-svg/main.ts similarity index 100% rename from tools/outline-svg/main.mjs rename to tools/outline-svg/main.ts diff --git a/tools/outline-svg/oslllo-svg-fixer.d.ts b/tools/outline-svg/oslllo-svg-fixer.d.ts new file mode 100644 index 000000000..645d9ef41 --- /dev/null +++ b/tools/outline-svg/oslllo-svg-fixer.d.ts @@ -0,0 +1,14 @@ +declare module 'oslllo-svg-fixer' { + export interface SVGFixerOptions { + showProgressBar?: boolean; + traceResolution?: number; + } + + export default function SVGFixer( + inputDir: string, + outputDir: string, + options?: SVGFixerOptions, + ): { + fix: () => Promise; + }; +} diff --git a/tools/outline-svg/package.json b/tools/outline-svg/package.json index 000ac98de..e6c8aa997 100644 --- a/tools/outline-svg/package.json +++ b/tools/outline-svg/package.json @@ -3,9 +3,10 @@ "description": "A internal used package to outline SVGs.", "private": true, "version": "2.0.0", - "main": "index.js", + "main": "main.ts", + "type": "module", "scripts": { - "start": "node ./main.mjs" + "start": "node ./main.ts" }, "keywords": [], "author": "", diff --git a/tools/outline-svg/tsconfig.json b/tools/outline-svg/tsconfig.json new file mode 100644 index 000000000..6df24e8cd --- /dev/null +++ b/tools/outline-svg/tsconfig.json @@ -0,0 +1,18 @@ +{ + "compilerOptions": { + "strict": true, + "declaration": true, + "noEmitOnError": true, + "noFallthroughCasesInSwitch": true, + "moduleResolution": "node", + "module": "ESNext", + "target": "ESNext", + "esModuleInterop": true, + "lib": ["esnext"], + "resolveJsonModule": true, + "allowImportingTsExtensions": true, + "noEmit": true, + "sourceMap": true, + "outDir": "./dist", + }, +} diff --git a/tsconfig.json b/tsconfig.json index 292f22632..862ed65b9 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -14,6 +14,7 @@ "skipLibCheck": true, "resolveJsonModule": true, "allowSyntheticDefaultImports": true, + "allowImportingTsExtensions": true, "downlevelIteration": true, "sourceMap": true, },