chore(scripts): Refactor scripts to typescript (#3316)

* Adjust typescript types

* adjust types

* fix types in all helper files

* Fix types

* Migrate js files to ts files

* Refactor to TS files

* Rename extentions

* Adjust imports

* Fix builds

* Update lockfile

* Fix last typescript migration

* Fix entry path @lucide/outline-svg

* Fix types

* add checkout step

* format files

* Format files
This commit is contained in:
Eric Fennis
2025-06-18 15:47:24 +02:00
committed by GitHub
parent 7517894f2d
commit 3e644fda2d
111 changed files with 833 additions and 527 deletions

View File

@@ -9,4 +9,5 @@ jobs:
pull-requests: write
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- uses: actions/labeler@v5

View File

@@ -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 }}

View File

@@ -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

View File

@@ -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 }}

0
lucide-font/lucide.svg Normal file
View File

View File

@@ -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",

View File

@@ -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",

View File

@@ -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};
`;
};
});

View File

@@ -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",

View File

@@ -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};
`;
};
});

View File

@@ -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"

View File

@@ -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};
`;
};
});

View File

@@ -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"

View File

@@ -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};
`;
};
});

View File

@@ -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",

View File

@@ -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();

View File

@@ -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};
`;
};
});

View File

@@ -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`));
}

View File

@@ -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"],
}

View File

@@ -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"
},

View File

@@ -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};
`;
};
});

View File

@@ -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"
}

View File

@@ -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),
]);

View File

@@ -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)) {

View File

@@ -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};
`;
};
});

View File

@@ -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<string, [string, Record<string, unknown> | undefined][]>);
const iconNodesStringified = JSON.stringify(iconNodes, null, 2);

View File

@@ -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<INode>(({ 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 = `<?xml version="1.0" encoding="utf-8"?>\n<!-- ${license} -->\n`;

View File

@@ -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');

View File

@@ -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: `{ <name>: <contents> }`.
@@ -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
}

View File

@@ -11,6 +11,7 @@
"allowJs": true,
"lib": ["esnext", "dom"],
"resolveJsonModule": true,
"allowImportingTsExtensions": true,
"sourceMap": true,
"outDir": "./dist",
},

View File

@@ -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"

View File

@@ -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);

View File

@@ -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)};
<slot/>
</Icon>
`;
};
});

View File

@@ -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",

View File

@@ -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,

View File

@@ -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",

View File

@@ -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};
`;
};
});

View File

@@ -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"

View File

@@ -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);

View File

@@ -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?.()}
</Icon>
`;
};
});

317
pnpm-lock.yaml generated
View File

@@ -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

View File

@@ -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]);

View File

@@ -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<string, IconMetadata>;
const CATEGORIES_DIR = path.resolve(currentDir, '../categories');
const categories = await readAllMetadata(CATEGORIES_DIR);
const categories = await readAllMetadata(CATEGORIES_DIR) as Record<string, {
icon: string;
name: string;
}>;;
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') {

View File

@@ -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');

View File

@@ -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(/<svg[^>]*>/, '<svg>');
@@ -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),

View File

@@ -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<typeof commit> => 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<string>(template);
if (lines.length) {
return [`## ${title}`, ' ', ...lines, ' '];

View File

@@ -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')

View File

@@ -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;

View File

@@ -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}`);
}
});
});

View File

@@ -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'));
});

View File

@@ -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, '..'));

View File

@@ -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'));
});

View File

@@ -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');
});

View File

@@ -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));
});

View File

@@ -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,

View File

@@ -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);
}
}

View File

@@ -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 <pattern> <replacement>', '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);
}
}
}
}

View File

@@ -8,7 +8,7 @@ import DEFAULT_ATTRS from '../../tools/build-icons/render/default-attrs.json' wi
* @param {string} svg - An SVG string.
* @returns {Promise<string>} 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<string>} An optimized svg
*/
function processSvg(svg, path) {
function processSvg(svg: string, path: string) {
return (
optimizeSvg(svg, path)
.then(setAttrs)

View File

@@ -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 || []),

View File

@@ -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<string, ReleaseMetaData>;
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',

View File

@@ -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"
}
}

View File

@@ -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",
},
}

View File

@@ -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';

View File

@@ -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';

View File

@@ -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"
}
}

View File

@@ -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<void> => fs.appendFile(path.join(outputDirectory, fileName), content, 'utf-8');

View File

@@ -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, unknown>;
}): string => hash(JSON.stringify([name, attributes]));

View File

@@ -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));

View File

@@ -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<string, unknown> }>,
): boolean => {
const hashedKeys = children.map(generateHashedKey);
return !hashedKeys.every(

View File

@@ -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) {

View File

@@ -6,7 +6,7 @@
* @param {array} b
* @returns {array}
*/
export const mergeArrays = (a, b) => {
export const mergeArrays = <T>(a: T[], b: T[]): T[] => {
a = a.concat(b);
a = a.filter((i, p) => a.indexOf(i) === p);
return a;

View File

@@ -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 ]+</g, '><')

View File

@@ -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<Record<string, unknown>> => {
const directoryContent = await fs.readdir(directory);
const metaDataPromises = directoryContent

View File

@@ -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<string | Buffer> =>
fs.readFile(path.resolve(__dirname, '../', filePath), 'utf-8');

View File

@@ -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);
};

View File

@@ -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<unknown> => {
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);
};

View File

@@ -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<string> =>
fs.readFile(path.join(directory, fileName), 'utf-8');

View File

@@ -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<string[]> => {
const directoryContents = await fs.readdir(directory);
return directoryContents.filter((file) => path.extname(file) === fileExtension);

View File

@@ -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<void> =>
fs.writeFile(path.join(outputDirectory, fileName), '', 'utf-8');

View File

@@ -3,7 +3,7 @@
* @param {array} array
* @returns {array}
*/
export const shuffleArray = (array) => {
export const shuffleArray = <T>(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));

View File

@@ -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(),
);

View File

@@ -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();

View File

@@ -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);

View File

@@ -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<void> => fs.writeFile(path.join(outputDirectory, fileName), content, 'utf-8');

View File

@@ -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);
}

View File

@@ -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<void> => fs.writeFile(path.join(outputDirectory, fileName), content, 'utf-8');

View File

@@ -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",
},
}

View File

@@ -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<string, INode>;
outputDirectory: string;
fileExtension: string;
iconFileExtension?: string;
iconMetaData: Record<string, IconMetadata>;
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;
});

View File

@@ -1,8 +1,8 @@
const getExportString = (
componentName,
iconName,
aliasImportFileExtension,
deprecated,
componentName: string,
iconName: string,
aliasImportFileExtension: string,
deprecated?: boolean,
deprecationReason = '',
) =>
deprecated

View File

@@ -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<string, IconNode>;
outputDirectory: string;
fileExtension: string;
iconMetaData: Record<string, IconMetadata>;
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);

View File

@@ -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);

View File

@@ -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<string, INode>;
outputDirectory: Path;
template: TemplateFunction;
showLog?: boolean;
iconFileExtension?: string;
separateIconFileExport?: boolean;
separateIconFileExportExtension?: string;
pretty?: boolean;
iconsDir: string;
iconMetaData: Record<string, IconMetadata>;
}
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,

View File

@@ -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,
});

View File

@@ -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';

View File

@@ -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",

View File

@@ -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: `{ <name>: <contents> }`.
* @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<Record<string, INode>>((icons, icon) => {
icons[icon.name] = icon.contents;
return icons;
}, {});

View File

@@ -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",
},
}

Some files were not shown because too many files have changed in this diff Show More