Skip to content

Commit

Permalink
feat: Add lazy load variation for each icon
Browse files Browse the repository at this point in the history
  • Loading branch information
rivka-ungar committed Oct 9, 2024
1 parent 2d95c2a commit ade5b2d
Show file tree
Hide file tree
Showing 3 changed files with 53 additions and 2 deletions.
1 change: 1 addition & 0 deletions packages/icons/.gitignore
Original file line number Diff line number Diff line change
@@ -1,2 +1,3 @@
src/react
src/lazy
src/svg/index.ts
13 changes: 11 additions & 2 deletions packages/icons/package.json
Original file line number Diff line number Diff line change
Expand Up @@ -26,6 +26,11 @@
"types": "./dist/svg/index.d.ts",
"import": "./dist/svg/index.js",
"default": "./dist/svg/index.js"
},
"./lazy": {
"types": "./dist/lazt/index.d.ts",
"import": "./dist/lazy/index.js",
"default": "./dist/lazy/index.js"
}
},
"typesVersions": {
Expand All @@ -38,6 +43,9 @@
],
"raw": [
"./dist/svg/index.d.ts"
],
"lazy": [
"./dist/lazy/index.d.ts"
]
}
},
Expand All @@ -46,15 +54,16 @@
],
"scripts": {
"plop": "plop",
"build": "yarn clean && yarn build:react-icons && yarn generate-svg-index && rollup -c",
"build": "yarn clean && yarn build:react-icons && yarn generate-lazy-icons && yarn generate-svg-index && rollup -c",
"build:react-icons": "svg2react-icon --typescript --keep-colors src/svg/ src/react/ --no-sub-dir",
"clean": "rm -rf dist",
"test": "vitest",
"lint": "eslint . --max-warnings 0 && yarn validate-icons",
"lint:fix": "yarn lint -- --fix",
"validate-icons": "node scripts/validate-meta.js && node scripts/validate-icons-colors.js",
"generate-meta": "node scripts/generate-meta.js",
"generate-svg-index": "node scripts/generate-svg-index.js"
"generate-svg-index": "node scripts/generate-svg-index.js",
"generate-lazy-icons": "node scripts/generate-lazy-icons.js"
},
"devDependencies": {
"@rollup/plugin-node-resolve": "^15.0.1",
Expand Down
41 changes: 41 additions & 0 deletions packages/icons/scripts/generate-lazy-icons.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,41 @@
import fs from "fs";
import path from "path";

const REACT_ICONS_FOLDER = path.resolve("./src/react");
const LAZY_EXPORTS_FOLDER = path.resolve("./src/lazy");

if (!fs.existsSync(LAZY_EXPORTS_FOLDER)) {
fs.mkdirSync(LAZY_EXPORTS_FOLDER);
}

const iconFiles = fs.readdirSync(REACT_ICONS_FOLDER).filter(file => file.endsWith(".tsx"));

iconFiles.forEach(file => {
const fileNameWithoutExtension = path.basename(file, ".tsx");
const lazyComponentCode = `import React, { lazy, Suspense } from 'react';
const ${fileNameWithoutExtension}Icon = lazy(() => import('../react/${fileNameWithoutExtension}'));
const ${fileNameWithoutExtension} = ({ fallback = <div />, ...props }) => (
<Suspense fallback={fallback}>
<${fileNameWithoutExtension}Icon {...props} />
</Suspense>
);
export default ${fileNameWithoutExtension};
`;

fs.writeFileSync(path.join(LAZY_EXPORTS_FOLDER, `${fileNameWithoutExtension}.tsx`), lazyComponentCode);
});

// Create an index.js file that exports all lazy-loaded components
const indexContent = iconFiles
.map(file => {
const fileNameWithoutExtension = path.basename(file, ".tsx");
return `export { default as Lazy${fileNameWithoutExtension}Icon } from './${fileNameWithoutExtension}';`;
})
.join("\n");

fs.writeFileSync(path.join(LAZY_EXPORTS_FOLDER, "index.ts"), indexContent);

console.log(`Generated lazy components and index.ts for ${iconFiles.length} icons.`);

0 comments on commit ade5b2d

Please sign in to comment.