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.
		
		
		
		
			
				
					64 lines
				
				1.8 KiB
			
		
		
			
		
	
	
					64 lines
				
				1.8 KiB
			| 
								 
											4 years ago
										 
									 | 
							
								import fs from "fs";
							 | 
						||
| 
								 | 
							
								import { join } from "path";
							 | 
						||
| 
								 | 
							
								import { URL, fileURLToPath } from "url";
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								const HELPERS_FOLDER = new URL("../src/helpers", import.meta.url);
							 | 
						||
| 
								 | 
							
								const IGNORED_FILES = new Set(["package.json"]);
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								export default async function generateAsserts() {
							 | 
						||
| 
								 | 
							
								  let output = `/*
							 | 
						||
| 
								 | 
							
								 * This file is auto-generated! Do not modify it directly.
							 | 
						||
| 
								 | 
							
								 * To re-generate run 'make build'
							 | 
						||
| 
								 | 
							
								 */
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								import template from "@babel/template";
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								`;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  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 isValidId = isValidBindingIdentifier(helperName);
							 | 
						||
| 
								 | 
							
								    const varName = isValidId ? helperName : `_${helperName}`;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    const filePath = join(fileURLToPath(HELPERS_FOLDER), file);
							 | 
						||
| 
								 | 
							
								    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;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    // TODO: We can minify the helpers in production
							 | 
						||
| 
								 | 
							
								    const source = fileContents
							 | 
						||
| 
								 | 
							
								      // Remove comments
							 | 
						||
| 
								 | 
							
								      .replace(/\/\*[^]*?\*\/|\/\/.*/g, "")
							 | 
						||
| 
								 | 
							
								      // Remove multiple newlines
							 | 
						||
| 
								 | 
							
								      .replace(/\n{2,}/g, "\n");
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    const intro = isValidId
							 | 
						||
| 
								 | 
							
								      ? "export "
							 | 
						||
| 
								 | 
							
								      : `export { ${varName} as ${helperName} }\n`;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    output += `\n${intro}const ${varName} = {
							 | 
						||
| 
								 | 
							
								  minVersion: ${JSON.stringify(minVersion)},
							 | 
						||
| 
								 | 
							
								  ast: () => template.program.ast(${JSON.stringify(source)})
							 | 
						||
| 
								 | 
							
								};\n`;
							 | 
						||
| 
								 | 
							
								  }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  return output;
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								function isValidBindingIdentifier(name) {
							 | 
						||
| 
								 | 
							
								  try {
							 | 
						||
| 
								 | 
							
								    Function(`var ${name}`);
							 | 
						||
| 
								 | 
							
								    return true;
							 | 
						||
| 
								 | 
							
								  } catch {
							 | 
						||
| 
								 | 
							
								    return false;
							 | 
						||
| 
								 | 
							
								  }
							 | 
						||
| 
								 | 
							
								}
							 |