12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364 |
- 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;
- }
|