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,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