Compare commits

...
Author SHA1 Message Date
Rodrigo RodriguesandEric Fennis c55aab36b5 feat(lab): added trap icon (#4427)
* Added icons/trap.svg

* Added icons/trap.json

* Update trap.json with use cases

add use cases

* Move to lab

---------

Co-authored-by: Eric Fennis <eric.fennis@gmail.com>
2026-11-12 09:37:10 +01:00
Daud Tariq bfe90f03d9 fix(lucide-react-native): include license banner once instead of in every module (#5194)
With `preserveModules`, rollup-plugin-license prepends the @license banner
to every emitted module, so all ~2,370 files in dist/esm and dist/cjs carried
it. Minifiers keep @license comments, so consumer bundles ended up with the
text repeated many times (#3744).

Add an opt-in `licenseBannerExclude` option to the shared rollup plugins and
use it in lucide-react-native to keep the banner only on `Icon`. Every icon
imports `createLucideIcon`, which imports `Icon`, and direct use of the `Icon`
component imports it too, so the license is still included in production
builds, exactly once.

Other packages are unchanged: the option defaults to no filtering.
2026-11-12 08:20:16 +01:00
4 changed files with 85 additions and 4 deletions
+34
View File
@@ -0,0 +1,34 @@
{
"$schema": "../icon.schema.json",
"contributors": [
"rrod497"
],
"use-cases": [
"Phishing & Scam: Flag malicious links, fake websites, or deceptive social engineering tactics.",
"Data Privacy Alert: Indicate risk of user data getting exposed, tracked, or lockdown by restrictive user agreements.",
"Financial & Law Pitfalls: Represent risky investment schemes or contracts.",
"Gaming: Gameplay icon for trap mechanics, field hazards, or skills that immobilize targets"
],
"tags": [
"trap",
"danger",
"deception",
"risk",
"scam",
"harm",
"harmful",
"security",
"phishing",
"pitfall",
"hazard",
"immobilize",
"unsafe",
"control",
"injury",
"hunt"
],
"categories": [
"security",
"tools"
]
}
+16
View File
@@ -0,0 +1,16 @@
<svg
xmlns="http://www.w3.org/2000/svg"
width="24"
height="24"
viewBox="0 0 24 24"
fill="none"
stroke="currentColor"
stroke-width="2"
stroke-linecap="round"
stroke-linejoin="round"
>
<path d="M10.056 15.528 3 12c-.8-.4-1-1-1-2a5 5 0 0 1 2-4l1 3h2.3l.7 2h2.2l1.123 3.118" />
<path d="M13.944 15.528 21 12c.8-.4 1-1 1-2a5 5 90 0 0-2-4l-1 3h-2.3l-.7 2h-2.2l-1.123 3.118" />
<path d="M7 18h10" />
<circle cx="12" cy="16" r="2" />
</svg>

After

Width:  |  Height:  |  Size: 459 B

@@ -37,9 +37,16 @@ const bundles = [
const typesModuleMatcher = /[/\\]src[/\\]types\.(d\.)?ts$/;
// With `preserveModules`, every output module would get its own license banner, which
// repeats it ~2,000 times in consumer bundles (#3744). Every icon, and any direct use of
// the `Icon` component, imports `Icon`, so keeping the banner only there includes it
// exactly once in any bundle that renders an icon.
const licenseModuleMatcher = /[/\\]src[/\\]Icon\.ts$/;
const isNotLicenseChunk = (chunk) => !licenseModuleMatcher.test(chunk.facadeModuleId ?? '');
const configs = bundles.map(({ inputs, outputDir, format, preserveModules, extension = 'js' }) => ({
input: inputs,
plugins: plugins({ pkg }),
plugins: plugins({ pkg, licenseBannerExclude: isNotLicenseChunk }),
external: ['react', 'react-native-svg'],
output: {
name: packageName,
+27 -3
View File
@@ -5,12 +5,33 @@ import esbuild from 'rollup-plugin-esbuild';
import { nodeResolve } from '@rollup/plugin-node-resolve';
import summary from 'rollup-plugin-summary';
/**
* Wraps a plugin's `renderChunk` hook so it is skipped for chunks matching `exclude`.
* Used to keep the license banner to a single chunk that every consumer path imports,
* instead of repeating it in every module emitted with `preserveModules`.
*/
const skipRenderChunk = (plugin, exclude) => {
if (!exclude) return plugin;
const { renderChunk } = plugin;
return {
...plugin,
renderChunk(code, chunk, ...rest) {
if (exclude(chunk)) return null;
return renderChunk.call(this, code, chunk, ...rest);
},
};
};
const plugins = ({
pkg,
minify = false,
withEsbuild = true,
esbuildOptions = {},
withSummary = false,
licenseBannerExclude,
}) =>
[
withEsbuild
@@ -23,12 +44,15 @@ const plugins = ({
extensions: ['.js', '.ts', '.jsx', '.tsx'],
resolveOnly: [/^@lucide\/.*$/],
}),
license({
banner: `@license ${pkg.name} v${pkg.version} - ${pkg.license}
skipRenderChunk(
license({
banner: `@license ${pkg.name} v${pkg.version} - ${pkg.license}
This source code is licensed under the ${pkg.license} license.
See the LICENSE file in the root directory of this source tree.`,
}),
}),
licenseBannerExclude,
),
withSummary ? summary() : null,
visualizer({
sourcemap: true,