You can not select more than 25 topics
			Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
		
		
		
		
		
			
		
			
				
					65 lines
				
				1.8 KiB
			
		
		
			
		
	
	
					65 lines
				
				1.8 KiB
			| 
											3 years ago
										 | import fs from "fs"; | ||
|  | import { join } from "path"; | ||
|  | import { URL, fileURLToPath } from "url"; | ||
|  | import { minify } from "terser"; // eslint-disable-line import/no-extraneous-dependencies
 | ||
|  | 
 | ||
|  | const HELPERS_FOLDER = new URL("../src/helpers", import.meta.url); | ||
|  | const IGNORED_FILES = new Set(["package.json"]); | ||
|  | 
 | ||
|  | export default async function generateHelpers() { | ||
|  |   let output = `/*
 | ||
|  |  * This file is auto-generated! Do not modify it directly. | ||
|  |  * To re-generate run 'yarn gulp generate-runtime-helpers' | ||
|  |  */ | ||
|  | 
 | ||
|  | import template from "@babel/template"; | ||
|  | 
 | ||
|  | function helper(minVersion: string, source: string) { | ||
|  |   return Object.freeze({ | ||
|  |     minVersion, | ||
|  |     ast: () => template.program.ast(source, { preserveComments: true }), | ||
|  |   }) | ||
|  | } | ||
|  | 
 | ||
|  | export default Object.freeze({ | ||
|  | `;
 | ||
|  | 
 | ||
|  |   for (const file of (await fs.promises.readdir(HELPERS_FOLDER)).sort()) { | ||
|  |     if (IGNORED_FILES.has(file)) continue; | ||
|  |     if (file.startsWith(".")) continue; // ignore e.g. vim swap files
 | ||
|  | 
 | ||
|  |     const [helperName] = file.split("."); | ||
|  | 
 | ||
|  |     const filePath = join(fileURLToPath(HELPERS_FOLDER), file); | ||
|  |     if (!file.endsWith(".js")) { | ||
|  |       console.error("ignoring", filePath); | ||
|  |       continue; | ||
|  |     } | ||
|  | 
 | ||
|  |     const fileContents = await fs.promises.readFile(filePath, "utf8"); | ||
|  |     const minVersionMatch = fileContents.match( | ||
|  |       /^\s*\/\*\s*@minVersion\s+(?<minVersion>\S+)\s*\*\/\s*$/m | ||
|  |     ); | ||
|  |     if (!minVersionMatch) { | ||
|  |       throw new Error(`@minVersion number missing in ${filePath}`); | ||
|  |     } | ||
|  |     const { minVersion } = minVersionMatch.groups; | ||
|  | 
 | ||
|  |     const source = await minify(fileContents, { | ||
|  |       mangle: false, | ||
|  |       // The _typeof helper has a custom directive that we must keep
 | ||
|  |       compress: { directives: false }, | ||
|  |     }); | ||
|  | 
 | ||
|  |     output += `\
 | ||
|  |   ${JSON.stringify(helperName)}: helper( | ||
|  |     ${JSON.stringify(minVersion)}, | ||
|  |     ${JSON.stringify(source.code)}, | ||
|  |   ), | ||
|  | `;
 | ||
|  |   } | ||
|  | 
 | ||
|  |   output += "});"; | ||
|  |   return output; | ||
|  | } |