diff --git a/packages/icons/.npmignore b/packages/icons/.npmignore new file mode 100644 index 000000000..fc28543eb --- /dev/null +++ b/packages/icons/.npmignore @@ -0,0 +1,10 @@ +stats +node_modules +tests +scripts +build +src +babel.config.js +jest.config.js +rollup.config.js +yarn.error.log diff --git a/packages/icons/package.json b/packages/icons/package.json new file mode 100644 index 000000000..0fca0285f --- /dev/null +++ b/packages/icons/package.json @@ -0,0 +1,46 @@ +{ + "name": "@lucide/icons", + "description": "Lucide is a community-run fork of Feather Icons, open for anyone to contribute icons.", + "version": "0.0.1", + "license": "ISC", + "homepage": "https://lucide.dev", + "bugs": "https://github.com/lucide-icons/lucide/issues", + "repository": { + "type": "git", + "url": "https://github.com/lucide-icons/lucide.git" + }, + "keywords": [ + "Lucide", + "Feather", + "Icons", + "Icon", + "SVG", + "Feather Icons", + "Fontawesome", + "Font Awesome" + ], + "source": "src/lucide-icons.js", + "main": "dist/cjs/lucide-icons.js", + "module": "dist/esm/lucide-icons.js", + "typings": "dist/lucide-icons.d.ts", + "sideEffects": false, + "scripts": { + "copy:license": "cp ../../LICENSE ./LICENSE", + "build": "pnpm clean && pnpm copy:license && pnpm build:icons && pnpm build:bundles", + "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: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": { + "prettier": "^2.3.2", + "svgson": "^5.2.1", + "@lucide/build-icons": "workspace:*", + "@lucide/rollup-plugins": "workspace:*", + "@lucide/helpers": "workspace:*", + "rollup": "^4.22.4", + "rollup-plugin-dts": "^6.1.0" + } +} diff --git a/packages/icons/rollup.config.mjs b/packages/icons/rollup.config.mjs new file mode 100644 index 000000000..8161f5b7c --- /dev/null +++ b/packages/icons/rollup.config.mjs @@ -0,0 +1,59 @@ +import plugins from '@lucide/rollup-plugins'; +import dts from 'rollup-plugin-dts'; +import pkg from './package.json' assert { type: 'json' }; + +const outputFileName = pkg.name; +const outputDir = 'dist'; +const inputs = ['src/lucide-icons.ts']; +const bundles = [ + { + format: 'cjs', + inputs, + outputDir, + }, + { + format: 'esm', + inputs, + outputDir, + preserveModules: true, + }, +]; + +const configs = bundles + .map(({ inputs, outputDir, format, minify, preserveModules }) => + inputs.map((input) => ({ + input, + plugins: plugins({ pkg, minify }), + output: { + name: outputFileName, + ...(preserveModules + ? { + dir: `${outputDir}/${format}`, + } + : { + file: `${outputDir}/${format}/${outputFileName}${minify ? '.min' : ''}.js`, + }), + format, + sourcemap: true, + preserveModules, + }, + })), + ) + .flat(); + +const typesFileConfig = { + input: inputs[0], + output: [ + { + file: `${outputDir}/${outputFileName}.d.ts`, + format: 'esm', + }, + ], + plugins: [ + dts({ + include: ['src'], + }), + ], +}; + +export default [...configs, typesFileConfig]; diff --git a/packages/icons/scripts/exportTemplate.mjs b/packages/icons/scripts/exportTemplate.mjs new file mode 100644 index 000000000..54169a0f6 --- /dev/null +++ b/packages/icons/scripts/exportTemplate.mjs @@ -0,0 +1,24 @@ +/* eslint-disable import/no-extraneous-dependencies */ +import base64SVG from '@lucide/build-icons/utils/base64SVG.mjs'; +import { toCamelCase } from '@lucide/helpers'; + +export default ({ iconName, children, getSvg, deprecated, deprecationReason }) => { + const svgContents = getSvg(); + const svgBase64 = base64SVG(svgContents); + const exportName = toCamelCase(iconName) + + return ` +/** + * @name ${iconName} + * @description Lucide SVG string. + * + * @preview ![img](data:image/svg+xml;base64,${svgBase64}) - https://lucide.dev/icons/${iconName} + * + * @returns {IconNode} + * ${deprecated ? `@deprecated ${deprecationReason}` : ''} + */ +const ${exportName}: string = ${JSON.stringify(children)} + +export default ${exportName}; +`; +}; diff --git a/packages/icons/src/aliases/index.ts b/packages/icons/src/aliases/index.ts new file mode 100644 index 000000000..26527c62e --- /dev/null +++ b/packages/icons/src/aliases/index.ts @@ -0,0 +1 @@ +export * from './aliases'; diff --git a/packages/icons/src/icons/.gitkeep b/packages/icons/src/icons/.gitkeep new file mode 100644 index 000000000..e3d85f774 --- /dev/null +++ b/packages/icons/src/icons/.gitkeep @@ -0,0 +1 @@ +Folder for generated icons diff --git a/packages/icons/src/lucide-icons.ts b/packages/icons/src/lucide-icons.ts new file mode 100644 index 000000000..098bba469 --- /dev/null +++ b/packages/icons/src/lucide-icons.ts @@ -0,0 +1,2 @@ +export * from './icons'; +export * from './aliases'; diff --git a/packages/icons/tsconfig.json b/packages/icons/tsconfig.json new file mode 100644 index 000000000..7fdaedbf6 --- /dev/null +++ b/packages/icons/tsconfig.json @@ -0,0 +1,17 @@ +{ + "compilerOptions": { + "strict": true, + "declaration": true, + "noEmitOnError": true, + "noFallthroughCasesInSwitch": true, + "moduleResolution": "node", + "module": "ESNext", + "target": "ESNext", + "esModuleInterop": true, + "allowJs": true, + "lib": ["esnext", "dom"], + "resolveJsonModule": true, + "sourceMap": true, + "outDir": "./dist", + }, +} diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index ff6b3db4d..a95b917c4 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -183,6 +183,30 @@ importers: specifier: ^1.3.1 version: 1.3.3(@algolia/client-search@4.19.1)(@types/node@20.4.5)(@types/react@18.2.55)(axios@1.7.4)(fuse.js@6.6.2)(less@4.2.0)(postcss@8.4.49)(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.31.6)(typescript@5.3.3) + packages/icons: + devDependencies: + '@lucide/build-icons': + specifier: workspace:* + version: link:../../tools/build-icons + '@lucide/helpers': + specifier: workspace:* + version: link:../../tools/build-helpers + '@lucide/rollup-plugins': + specifier: workspace:* + version: link:../../tools/rollup-plugins + prettier: + specifier: ^2.3.2 + version: 2.8.8 + rollup: + specifier: ^4.22.4 + version: 4.22.4 + rollup-plugin-dts: + specifier: ^6.1.0 + version: 6.1.0(rollup@4.22.4)(typescript@5.3.3) + svgson: + specifier: ^5.2.1 + version: 5.3.1 + packages/lucide: devDependencies: '@lucide/build-icons': @@ -17591,18 +17615,6 @@ snapshots: postcss: 8.4.49 source-map: 0.6.1 - '@vue/compiler-sfc@3.4.18': - dependencies: - '@babel/parser': 7.23.9 - '@vue/compiler-core': 3.4.18 - '@vue/compiler-dom': 3.4.18 - '@vue/compiler-ssr': 3.4.18 - '@vue/shared': 3.4.18 - estree-walker: 2.0.2 - magic-string: 0.30.11 - postcss: 8.4.41 - source-map-js: 1.2.1 - '@vue/compiler-sfc@3.4.21': dependencies: '@babel/parser': 7.26.1