mirror of
				https://github.com/Mibew/simple-icons.git
				synced 2025-10-31 10:31:06 +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,14 +34,18 @@ 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); | ||||||
|  |   const iconObjectTemplate = await fs.readFile(iconObjectTemplateFile, UTF8); | ||||||
|  | 
 | ||||||
|  |   // Local helper functions
 | ||||||
|  |   const escape = (value) => { | ||||||
|     return value.replace(/(?<!\\)'/g, "\\'"); |     return value.replace(/(?<!\\)'/g, "\\'"); | ||||||
| }; |   }; | ||||||
| const iconToKeyValue = (icon) => { |   const iconToKeyValue = (icon) => { | ||||||
|     return `'${icon.slug}':${iconToObject(icon)}`; |     return `'${icon.slug}':${iconToObject(icon)}`; | ||||||
| }; |   }; | ||||||
| const licenseToObject = (license) => { |   const licenseToObject = (license) => { | ||||||
|     if (license === undefined) { |     if (license === undefined) { | ||||||
|       return; |       return; | ||||||
|     } |     } | ||||||
| @ -53,8 +54,8 @@ const licenseToObject = (license) => { | |||||||
|       license.url = `https://spdx.org/licenses/${license.type}`; |       license.url = `https://spdx.org/licenses/${license.type}`; | ||||||
|     } |     } | ||||||
|     return license; |     return license; | ||||||
| }; |   }; | ||||||
| const iconToObject = (icon) => { |   const iconToObject = (icon) => { | ||||||
|     return util.format( |     return util.format( | ||||||
|       iconObjectTemplate, |       iconObjectTemplate, | ||||||
|       escape(icon.title), |       escape(icon.title), | ||||||
| @ -66,34 +67,34 @@ const iconToObject = (icon) => { | |||||||
|       icon.guidelines ? `'${escape(icon.guidelines)}'` : undefined, |       icon.guidelines ? `'${escape(icon.guidelines)}'` : undefined, | ||||||
|       licenseToObject(icon.license), |       licenseToObject(icon.license), | ||||||
|     ); |     ); | ||||||
| }; |   }; | ||||||
| const writeJs = (filepath, rawJavaScript) => { |   const writeJs = async (filepath, rawJavaScript) => { | ||||||
|   const { error, code } = minify(rawJavaScript); |     const { code } = await esbuildTransform(rawJavaScript, { | ||||||
|   if (error) { |       minify: true, | ||||||
|     console.error(error); |     }); | ||||||
|     process.exit(1); |     await fs.writeFile(filepath, code); | ||||||
|   } else { |   }; | ||||||
|     fs.writeFileSync(filepath, code); |   const writeTs = async (filepath, rawTypeScript) => { | ||||||
|   } |     await fs.writeFile(filepath, rawTypeScript); | ||||||
| }; |   }; | ||||||
| const writeTs = (filepath, rawTypeScript) => { |  | ||||||
|   fs.writeFileSync(filepath, rawTypeScript); |  | ||||||
| }; |  | ||||||
| 
 | 
 | ||||||
| // 'main'
 |   // 'main'
 | ||||||
| const iconsBarrelMjs = []; |   const iconsBarrelMjs = []; | ||||||
| const iconsBarrelJs = []; |   const iconsBarrelJs = []; | ||||||
| const iconsBarrelDts = []; |   const iconsBarrelDts = []; | ||||||
| const icons = []; |   const icons = []; | ||||||
| data.icons.forEach((icon) => { | 
 | ||||||
|  |   await Promise.all( | ||||||
|  |     data.icons.map(async (icon) => { | ||||||
|       const filename = getIconSlug(icon); |       const filename = getIconSlug(icon); | ||||||
|       const svgFilepath = path.resolve(iconsDir, `${filename}.svg`); |       const svgFilepath = path.resolve(iconsDir, `${filename}.svg`); | ||||||
|   icon.svg = fs.readFileSync(svgFilepath, UTF8).replace(/\r?\n/, ''); |       icon.svg = (await fs.readFile(svgFilepath, UTF8)).replace(/\r?\n/, ''); | ||||||
|       icon.path = svgToPath(icon.svg); |       icon.path = svgToPath(icon.svg); | ||||||
|       icon.slug = filename; |       icon.slug = filename; | ||||||
|       icons.push(icon); |       icons.push(icon); | ||||||
| 
 | 
 | ||||||
|       const iconObject = iconToObject(icon); |       const iconObject = iconToObject(icon); | ||||||
|  | 
 | ||||||
|       const iconExportName = slugToVariableName(icon.slug); |       const iconExportName = slugToVariableName(icon.slug); | ||||||
| 
 | 
 | ||||||
|       // write the static .js file for the icon
 |       // write the static .js file for the icon
 | ||||||
| @ -102,36 +103,42 @@ data.icons.forEach((icon) => { | |||||||
|       const message = JSON.stringify( |       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}`, |         `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( |         writeJs( | ||||||
|           jsFilepath, |           jsFilepath, | ||||||
|           `console.warn("warn -", ${message});module.exports=${iconObject};`, |           `console.warn("warn -", ${message});module.exports=${iconObject};`, | ||||||
|   ); |         ), | ||||||
| 
 |  | ||||||
|   const dtsFilepath = path.resolve(iconsDir, `${filename}.d.ts`); |  | ||||||
|         writeTs( |         writeTs( | ||||||
|           dtsFilepath, |           dtsFilepath, | ||||||
|           `/**@deprecated ${newImportMessage}*/declare const i:import("../alias").I;export default i;`, |           `/**@deprecated ${newImportMessage}*/declare const i:import("../alias").I;export default i;`, | ||||||
|   ); |         ), | ||||||
|  |       ]); | ||||||
| 
 | 
 | ||||||
|       // add object to the barrel file
 |       // add object to the barrel file
 | ||||||
|       iconsBarrelJs.push(`${iconExportName}:${iconObject},`); |       iconsBarrelJs.push(`${iconExportName}:${iconObject},`); | ||||||
|       iconsBarrelMjs.push(`export const ${iconExportName}=${iconObject}`); |       iconsBarrelMjs.push(`export const ${iconExportName}=${iconObject}`); | ||||||
|       iconsBarrelDts.push(`export const ${iconExportName}:I;`); |       iconsBarrelDts.push(`export const ${iconExportName}:I;`); | ||||||
| }); |     }), | ||||||
|  |   ); | ||||||
| 
 | 
 | ||||||
| // write our generic index.js
 |   // write our generic index.js
 | ||||||
| const rawIndexJs = util.format( |   const rawIndexJs = util.format( | ||||||
|     indexTemplate, |     indexTemplate, | ||||||
|     icons.map(iconToKeyValue).join(','), |     icons.map(iconToKeyValue).join(','), | ||||||
| ); |   ); | ||||||
| writeJs(indexFile, rawIndexJs); |   await writeJs(indexFile, rawIndexJs); | ||||||
| 
 | 
 | ||||||
| // write our file containing the exports of all icons in CommonJS ...
 |   // write our file containing the exports of all icons in CommonJS ...
 | ||||||
| const rawIconsJs = `module.exports={${iconsBarrelJs.join('')}};`; |   const rawIconsJs = `module.exports={${iconsBarrelJs.join('')}};`; | ||||||
| writeJs(iconsJsFile, rawIconsJs); |   await writeJs(iconsJsFile, rawIconsJs); | ||||||
| // and ESM
 |   // and ESM
 | ||||||
| const rawIconsMjs = iconsBarrelMjs.join(''); |   const rawIconsMjs = iconsBarrelMjs.join(''); | ||||||
| writeJs(iconsMjsFile, rawIconsMjs); |   await writeJs(iconsMjsFile, rawIconsMjs); | ||||||
| // and create a type declaration file
 |   // and create a type declaration file
 | ||||||
| const rawIconsDts = `import {I} from "./alias";${iconsBarrelDts.join('')}`; |   const rawIconsDts = `import {I} from "./alias";${iconsBarrelDts.join('')}`; | ||||||
| writeTs(iconsDtsFile, rawIconsDts); |   await writeTs(iconsDtsFile, rawIconsDts); | ||||||
|  | }; | ||||||
|  | 
 | ||||||
|  | build(); | ||||||
|  | |||||||
		Loading…
	
		Reference in New Issue
	
	Block a user