mirror of
https://github.com/simple-icons/simple-icons.git
synced 2024-12-16 01:10:30 +02: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",
|
||||
"devDependencies": {
|
||||
"editorconfig-checker": "4.0.2",
|
||||
"esbuild": "0.13.15",
|
||||
"husky": "7.0.2",
|
||||
"is-ci": "3.0.0",
|
||||
"jest": "27.2.5",
|
||||
@ -45,8 +46,7 @@
|
||||
"svg-path-segments": "1.0.0",
|
||||
"svglint": "1.0.9",
|
||||
"svgo": "2.7.0",
|
||||
"svgpath": "2.3.1",
|
||||
"uglify-js": "3.14.2"
|
||||
"svgpath": "2.3.1"
|
||||
},
|
||||
"scripts": {
|
||||
"build": "node scripts/build/package.js",
|
||||
|
@ -7,10 +7,10 @@
|
||||
* tree-shakeable
|
||||
*/
|
||||
|
||||
const fs = require('fs');
|
||||
const fs = require('fs').promises;
|
||||
const path = require('path');
|
||||
const util = require('util');
|
||||
const { minify } = require('uglify-js');
|
||||
const { transform: esbuildTransform } = require('esbuild');
|
||||
|
||||
const UTF8 = 'utf8';
|
||||
|
||||
@ -26,9 +26,6 @@ const templatesDir = path.resolve(__dirname, 'templates');
|
||||
const indexTemplateFile = path.resolve(templatesDir, 'index.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 {
|
||||
getIconSlug,
|
||||
@ -37,101 +34,111 @@ const {
|
||||
slugToVariableName,
|
||||
} = require('../utils.js');
|
||||
|
||||
// Local helper functions
|
||||
const escape = (value) => {
|
||||
return value.replace(/(?<!\\)'/g, "\\'");
|
||||
};
|
||||
const iconToKeyValue = (icon) => {
|
||||
return `'${icon.slug}':${iconToObject(icon)}`;
|
||||
};
|
||||
const licenseToObject = (license) => {
|
||||
if (license === undefined) {
|
||||
return;
|
||||
}
|
||||
const build = async () => {
|
||||
const indexTemplate = await fs.readFile(indexTemplateFile, UTF8);
|
||||
const iconObjectTemplate = await fs.readFile(iconObjectTemplateFile, UTF8);
|
||||
|
||||
if (license.url === undefined) {
|
||||
license.url = `https://spdx.org/licenses/${license.type}`;
|
||||
}
|
||||
return license;
|
||||
};
|
||||
const iconToObject = (icon) => {
|
||||
return util.format(
|
||||
iconObjectTemplate,
|
||||
escape(icon.title),
|
||||
escape(icon.slug),
|
||||
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);
|
||||
};
|
||||
// Local helper functions
|
||||
const escape = (value) => {
|
||||
return value.replace(/(?<!\\)'/g, "\\'");
|
||||
};
|
||||
const iconToKeyValue = (icon) => {
|
||||
return `'${icon.slug}':${iconToObject(icon)}`;
|
||||
};
|
||||
const licenseToObject = (license) => {
|
||||
if (license === undefined) {
|
||||
return;
|
||||
}
|
||||
|
||||
// 'main'
|
||||
const iconsBarrelMjs = [];
|
||||
const iconsBarrelJs = [];
|
||||
const iconsBarrelDts = [];
|
||||
const icons = [];
|
||||
data.icons.forEach((icon) => {
|
||||
const filename = getIconSlug(icon);
|
||||
const svgFilepath = path.resolve(iconsDir, `${filename}.svg`);
|
||||
icon.svg = fs.readFileSync(svgFilepath, UTF8).replace(/\r?\n/, '');
|
||||
icon.path = svgToPath(icon.svg);
|
||||
icon.slug = filename;
|
||||
icons.push(icon);
|
||||
if (license.url === undefined) {
|
||||
license.url = `https://spdx.org/licenses/${license.type}`;
|
||||
}
|
||||
return license;
|
||||
};
|
||||
const iconToObject = (icon) => {
|
||||
return util.format(
|
||||
iconObjectTemplate,
|
||||
escape(icon.title),
|
||||
escape(icon.slug),
|
||||
escape(titleToHtmlFriendly(icon.title)),
|
||||
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);
|
||||
const iconExportName = slugToVariableName(icon.slug);
|
||||
// 'main'
|
||||
const iconsBarrelMjs = [];
|
||||
const iconsBarrelJs = [];
|
||||
const iconsBarrelDts = [];
|
||||
const icons = [];
|
||||
|
||||
// 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}`,
|
||||
);
|
||||
writeJs(
|
||||
jsFilepath,
|
||||
`console.warn("warn -", ${message});module.exports=${iconObject};`,
|
||||
await Promise.all(
|
||||
data.icons.map(async (icon) => {
|
||||
const filename = getIconSlug(icon);
|
||||
const svgFilepath = path.resolve(iconsDir, `${filename}.svg`);
|
||||
icon.svg = (await fs.readFile(svgFilepath, UTF8)).replace(/\r?\n/, '');
|
||||
icon.path = svgToPath(icon.svg);
|
||||
icon.slug = filename;
|
||||
icons.push(icon);
|
||||
|
||||
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`);
|
||||
writeTs(
|
||||
dtsFilepath,
|
||||
`/**@deprecated ${newImportMessage}*/declare const i:import("../alias").I;export default i;`,
|
||||
// write our generic index.js
|
||||
const rawIndexJs = util.format(
|
||||
indexTemplate,
|
||||
icons.map(iconToKeyValue).join(','),
|
||||
);
|
||||
await writeJs(indexFile, rawIndexJs);
|
||||
|
||||
// add object to the barrel file
|
||||
iconsBarrelJs.push(`${iconExportName}:${iconObject},`);
|
||||
iconsBarrelMjs.push(`export const ${iconExportName}=${iconObject}`);
|
||||
iconsBarrelDts.push(`export const ${iconExportName}:I;`);
|
||||
});
|
||||
// write our file containing the exports of all icons in CommonJS ...
|
||||
const rawIconsJs = `module.exports={${iconsBarrelJs.join('')}};`;
|
||||
await writeJs(iconsJsFile, rawIconsJs);
|
||||
// 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
|
||||
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);
|
||||
build();
|
||||
|
Loading…
Reference in New Issue
Block a user