mirror of
https://github.com/Mibew/simple-icons.git
synced 2025-04-14 08:39:33 +03:00
make building async and minify with esbuild (#6898)
* make building async and minify with esbuild * switch from fs/promises to fs.promises * cleanup fs.promises * fix conflicts * fix conflicts * revert test file changes
This commit is contained in:
parent
62ef64d9cd
commit
8010341b97
@ -32,6 +32,7 @@
|
|||||||
"license": "CC0-1.0",
|
"license": "CC0-1.0",
|
||||||
"devDependencies": {
|
"devDependencies": {
|
||||||
"editorconfig-checker": "4.0.2",
|
"editorconfig-checker": "4.0.2",
|
||||||
|
"esbuild": "0.13.15",
|
||||||
"husky": "7.0.2",
|
"husky": "7.0.2",
|
||||||
"is-ci": "3.0.0",
|
"is-ci": "3.0.0",
|
||||||
"jest": "27.2.5",
|
"jest": "27.2.5",
|
||||||
@ -45,8 +46,7 @@
|
|||||||
"svg-path-segments": "1.0.0",
|
"svg-path-segments": "1.0.0",
|
||||||
"svglint": "1.0.9",
|
"svglint": "1.0.9",
|
||||||
"svgo": "2.7.0",
|
"svgo": "2.7.0",
|
||||||
"svgpath": "2.3.1",
|
"svgpath": "2.3.1"
|
||||||
"uglify-js": "3.14.2"
|
|
||||||
},
|
},
|
||||||
"scripts": {
|
"scripts": {
|
||||||
"build": "node scripts/build/package.js",
|
"build": "node scripts/build/package.js",
|
||||||
|
@ -7,10 +7,10 @@
|
|||||||
* tree-shakeable
|
* tree-shakeable
|
||||||
*/
|
*/
|
||||||
|
|
||||||
const fs = require('fs');
|
const fs = require('fs').promises;
|
||||||
const path = require('path');
|
const path = require('path');
|
||||||
const util = require('util');
|
const util = require('util');
|
||||||
const { minify } = require('uglify-js');
|
const { transform: esbuildTransform } = require('esbuild');
|
||||||
|
|
||||||
const UTF8 = 'utf8';
|
const UTF8 = 'utf8';
|
||||||
|
|
||||||
@ -26,9 +26,6 @@ const templatesDir = path.resolve(__dirname, 'templates');
|
|||||||
const indexTemplateFile = path.resolve(templatesDir, 'index.js');
|
const indexTemplateFile = path.resolve(templatesDir, 'index.js');
|
||||||
const iconObjectTemplateFile = path.resolve(templatesDir, 'icon-object.js');
|
const iconObjectTemplateFile = path.resolve(templatesDir, 'icon-object.js');
|
||||||
|
|
||||||
const indexTemplate = fs.readFileSync(indexTemplateFile, UTF8);
|
|
||||||
const iconObjectTemplate = fs.readFileSync(iconObjectTemplateFile, UTF8);
|
|
||||||
|
|
||||||
const data = require(dataFile);
|
const data = require(dataFile);
|
||||||
const {
|
const {
|
||||||
getIconSlug,
|
getIconSlug,
|
||||||
@ -37,101 +34,111 @@ const {
|
|||||||
slugToVariableName,
|
slugToVariableName,
|
||||||
} = require('../utils.js');
|
} = require('../utils.js');
|
||||||
|
|
||||||
// Local helper functions
|
const build = async () => {
|
||||||
const escape = (value) => {
|
const indexTemplate = await fs.readFile(indexTemplateFile, UTF8);
|
||||||
return value.replace(/(?<!\\)'/g, "\\'");
|
const iconObjectTemplate = await fs.readFile(iconObjectTemplateFile, UTF8);
|
||||||
};
|
|
||||||
const iconToKeyValue = (icon) => {
|
|
||||||
return `'${icon.slug}':${iconToObject(icon)}`;
|
|
||||||
};
|
|
||||||
const licenseToObject = (license) => {
|
|
||||||
if (license === undefined) {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (license.url === undefined) {
|
// Local helper functions
|
||||||
license.url = `https://spdx.org/licenses/${license.type}`;
|
const escape = (value) => {
|
||||||
}
|
return value.replace(/(?<!\\)'/g, "\\'");
|
||||||
return license;
|
};
|
||||||
};
|
const iconToKeyValue = (icon) => {
|
||||||
const iconToObject = (icon) => {
|
return `'${icon.slug}':${iconToObject(icon)}`;
|
||||||
return util.format(
|
};
|
||||||
iconObjectTemplate,
|
const licenseToObject = (license) => {
|
||||||
escape(icon.title),
|
if (license === undefined) {
|
||||||
escape(icon.slug),
|
return;
|
||||||
escape(titleToHtmlFriendly(icon.title)),
|
}
|
||||||
escape(icon.path),
|
|
||||||
escape(icon.source),
|
|
||||||
escape(icon.hex),
|
|
||||||
icon.guidelines ? `'${escape(icon.guidelines)}'` : undefined,
|
|
||||||
licenseToObject(icon.license),
|
|
||||||
);
|
|
||||||
};
|
|
||||||
const writeJs = (filepath, rawJavaScript) => {
|
|
||||||
const { error, code } = minify(rawJavaScript);
|
|
||||||
if (error) {
|
|
||||||
console.error(error);
|
|
||||||
process.exit(1);
|
|
||||||
} else {
|
|
||||||
fs.writeFileSync(filepath, code);
|
|
||||||
}
|
|
||||||
};
|
|
||||||
const writeTs = (filepath, rawTypeScript) => {
|
|
||||||
fs.writeFileSync(filepath, rawTypeScript);
|
|
||||||
};
|
|
||||||
|
|
||||||
// 'main'
|
if (license.url === undefined) {
|
||||||
const iconsBarrelMjs = [];
|
license.url = `https://spdx.org/licenses/${license.type}`;
|
||||||
const iconsBarrelJs = [];
|
}
|
||||||
const iconsBarrelDts = [];
|
return license;
|
||||||
const icons = [];
|
};
|
||||||
data.icons.forEach((icon) => {
|
const iconToObject = (icon) => {
|
||||||
const filename = getIconSlug(icon);
|
return util.format(
|
||||||
const svgFilepath = path.resolve(iconsDir, `${filename}.svg`);
|
iconObjectTemplate,
|
||||||
icon.svg = fs.readFileSync(svgFilepath, UTF8).replace(/\r?\n/, '');
|
escape(icon.title),
|
||||||
icon.path = svgToPath(icon.svg);
|
escape(icon.slug),
|
||||||
icon.slug = filename;
|
escape(titleToHtmlFriendly(icon.title)),
|
||||||
icons.push(icon);
|
escape(icon.path),
|
||||||
|
escape(icon.source),
|
||||||
|
escape(icon.hex),
|
||||||
|
icon.guidelines ? `'${escape(icon.guidelines)}'` : undefined,
|
||||||
|
licenseToObject(icon.license),
|
||||||
|
);
|
||||||
|
};
|
||||||
|
const writeJs = async (filepath, rawJavaScript) => {
|
||||||
|
const { code } = await esbuildTransform(rawJavaScript, {
|
||||||
|
minify: true,
|
||||||
|
});
|
||||||
|
await fs.writeFile(filepath, code);
|
||||||
|
};
|
||||||
|
const writeTs = async (filepath, rawTypeScript) => {
|
||||||
|
await fs.writeFile(filepath, rawTypeScript);
|
||||||
|
};
|
||||||
|
|
||||||
const iconObject = iconToObject(icon);
|
// 'main'
|
||||||
const iconExportName = slugToVariableName(icon.slug);
|
const iconsBarrelMjs = [];
|
||||||
|
const iconsBarrelJs = [];
|
||||||
|
const iconsBarrelDts = [];
|
||||||
|
const icons = [];
|
||||||
|
|
||||||
// write the static .js file for the icon
|
await Promise.all(
|
||||||
const jsFilepath = path.resolve(iconsDir, `${filename}.js`);
|
data.icons.map(async (icon) => {
|
||||||
const newImportMessage = `use "const { ${iconExportName} } = require('simple-icons/icons');" instead`;
|
const filename = getIconSlug(icon);
|
||||||
const message = JSON.stringify(
|
const svgFilepath = path.resolve(iconsDir, `${filename}.svg`);
|
||||||
`Imports like "const ${icon.slug} = require('simple-icons/icons/${icon.slug}');" have been deprecated in v6.0.0 and will no longer work from v7.0.0, ${newImportMessage}`,
|
icon.svg = (await fs.readFile(svgFilepath, UTF8)).replace(/\r?\n/, '');
|
||||||
);
|
icon.path = svgToPath(icon.svg);
|
||||||
writeJs(
|
icon.slug = filename;
|
||||||
jsFilepath,
|
icons.push(icon);
|
||||||
`console.warn("warn -", ${message});module.exports=${iconObject};`,
|
|
||||||
|
const iconObject = iconToObject(icon);
|
||||||
|
|
||||||
|
const iconExportName = slugToVariableName(icon.slug);
|
||||||
|
|
||||||
|
// write the static .js file for the icon
|
||||||
|
const jsFilepath = path.resolve(iconsDir, `${filename}.js`);
|
||||||
|
const newImportMessage = `use "const { ${iconExportName} } = require('simple-icons/icons');" instead`;
|
||||||
|
const message = JSON.stringify(
|
||||||
|
`Imports like "const ${icon.slug} = require('simple-icons/icons/${icon.slug}');" have been deprecated in v6.0.0 and will no longer work from v7.0.0, ${newImportMessage}`,
|
||||||
|
);
|
||||||
|
|
||||||
|
const dtsFilepath = path.resolve(iconsDir, `${filename}.d.ts`);
|
||||||
|
await Promise.all([
|
||||||
|
writeJs(
|
||||||
|
jsFilepath,
|
||||||
|
`console.warn("warn -", ${message});module.exports=${iconObject};`,
|
||||||
|
),
|
||||||
|
writeTs(
|
||||||
|
dtsFilepath,
|
||||||
|
`/**@deprecated ${newImportMessage}*/declare const i:import("../alias").I;export default i;`,
|
||||||
|
),
|
||||||
|
]);
|
||||||
|
|
||||||
|
// add object to the barrel file
|
||||||
|
iconsBarrelJs.push(`${iconExportName}:${iconObject},`);
|
||||||
|
iconsBarrelMjs.push(`export const ${iconExportName}=${iconObject}`);
|
||||||
|
iconsBarrelDts.push(`export const ${iconExportName}:I;`);
|
||||||
|
}),
|
||||||
);
|
);
|
||||||
|
|
||||||
const dtsFilepath = path.resolve(iconsDir, `${filename}.d.ts`);
|
// write our generic index.js
|
||||||
writeTs(
|
const rawIndexJs = util.format(
|
||||||
dtsFilepath,
|
indexTemplate,
|
||||||
`/**@deprecated ${newImportMessage}*/declare const i:import("../alias").I;export default i;`,
|
icons.map(iconToKeyValue).join(','),
|
||||||
);
|
);
|
||||||
|
await writeJs(indexFile, rawIndexJs);
|
||||||
|
|
||||||
// add object to the barrel file
|
// write our file containing the exports of all icons in CommonJS ...
|
||||||
iconsBarrelJs.push(`${iconExportName}:${iconObject},`);
|
const rawIconsJs = `module.exports={${iconsBarrelJs.join('')}};`;
|
||||||
iconsBarrelMjs.push(`export const ${iconExportName}=${iconObject}`);
|
await writeJs(iconsJsFile, rawIconsJs);
|
||||||
iconsBarrelDts.push(`export const ${iconExportName}:I;`);
|
// and ESM
|
||||||
});
|
const rawIconsMjs = iconsBarrelMjs.join('');
|
||||||
|
await writeJs(iconsMjsFile, rawIconsMjs);
|
||||||
|
// and create a type declaration file
|
||||||
|
const rawIconsDts = `import {I} from "./alias";${iconsBarrelDts.join('')}`;
|
||||||
|
await writeTs(iconsDtsFile, rawIconsDts);
|
||||||
|
};
|
||||||
|
|
||||||
// write our generic index.js
|
build();
|
||||||
const rawIndexJs = util.format(
|
|
||||||
indexTemplate,
|
|
||||||
icons.map(iconToKeyValue).join(','),
|
|
||||||
);
|
|
||||||
writeJs(indexFile, rawIndexJs);
|
|
||||||
|
|
||||||
// write our file containing the exports of all icons in CommonJS ...
|
|
||||||
const rawIconsJs = `module.exports={${iconsBarrelJs.join('')}};`;
|
|
||||||
writeJs(iconsJsFile, rawIconsJs);
|
|
||||||
// and ESM
|
|
||||||
const rawIconsMjs = iconsBarrelMjs.join('');
|
|
||||||
writeJs(iconsMjsFile, rawIconsMjs);
|
|
||||||
// and create a type declaration file
|
|
||||||
const rawIconsDts = `import {I} from "./alias";${iconsBarrelDts.join('')}`;
|
|
||||||
writeTs(iconsDtsFile, rawIconsDts);
|
|
||||||
|
Loading…
Reference in New Issue
Block a user