From e5b2680756a037c7ebd1922706cda23b25490966 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Hu=C3=A1ng=20J=C3=B9nli=C3=A0ng?= Date: Thu, 10 Dec 2020 12:25:16 -0500 Subject: [PATCH] Move some build steps to gulp (#12127) * chore: move generate-standalone to gulp tasks * move build-flow-typings to gulp tasks * chore: move build-typescript-typings to gulp tasks * move generate-type-helpers to gulp tasks * chore: include build-typings and generate-type-helpers in gulp build * update generate-standalone comments * address review comments * chore: revert build-typings refactor * fix: run build-typings in build-no-bundle --- Gulpfile.js | 124 +++++++++++++++++- Makefile | 12 +- packages/babel-standalone/package.json | 4 +- packages/babel-standalone/scripts/generate.js | 37 ------ .../babel-standalone/src/generated/plugins.js | 2 +- packages/babel-types/package.json | 3 +- .../scripts/generateTypeHelpers.js | 29 ---- .../{generateAsserts.js => asserts.js} | 0 .../{generateBuilders.js => builders.js} | 0 .../{generateConstants.js => constants.js} | 0 .../{generateValidators.js => validators.js} | 0 .../src/asserts/generated/index.js | 0 .../src/builders/generated/index.js | 0 .../src/constants/generated/index.js | 0 .../src/validators/generated/index.js | 0 scripts/utils/writeFileAndMkDir.js | 14 -- yarn.lock | 5 +- 17 files changed, 128 insertions(+), 102 deletions(-) delete mode 100644 packages/babel-standalone/scripts/generate.js delete mode 100644 packages/babel-types/scripts/generateTypeHelpers.js rename packages/babel-types/scripts/generators/{generateAsserts.js => asserts.js} (100%) rename packages/babel-types/scripts/generators/{generateBuilders.js => builders.js} (100%) rename packages/babel-types/scripts/generators/{generateConstants.js => constants.js} (100%) rename packages/babel-types/scripts/generators/{generateValidators.js => validators.js} (100%) mode change 100644 => 100755 packages/babel-types/src/asserts/generated/index.js mode change 100644 => 100755 packages/babel-types/src/builders/generated/index.js mode change 100644 => 100755 packages/babel-types/src/constants/generated/index.js mode change 100644 => 100755 packages/babel-types/src/validators/generated/index.js delete mode 100644 scripts/utils/writeFileAndMkDir.js diff --git a/Gulpfile.js b/Gulpfile.js index 28f016f6c9..c0f764e607 100644 --- a/Gulpfile.js +++ b/Gulpfile.js @@ -5,6 +5,7 @@ const through = require("through2"); const chalk = require("chalk"); const newer = require("gulp-newer"); const babel = require("gulp-babel"); +const camelCase = require("lodash/camelCase"); const fancyLog = require("fancy-log"); const filter = require("gulp-filter"); const gulp = require("gulp"); @@ -21,6 +22,12 @@ const rollupReplace = require("@rollup/plugin-replace"); const { terser: rollupTerser } = require("rollup-plugin-terser"); const defaultSourcesGlob = "./@(codemods|packages|eslint)/*/src/**/*.{js,ts}"; +const babelStandalonePluginConfigGlob = + "./packages/babel-standalone/scripts/pluginConfig.json"; +const buildTypingsWatchGlob = [ + "./packages/babel-types/lib/definitions/**/*.js", + "./packages/babel-types/scripts/generators/*.js", +]; /** * map source code path to the generated artifacts path @@ -70,6 +77,68 @@ function rename(fn) { }); } +/** + * + * @typedef {("asserts" | "builders" | "constants" | "validators")} HelperKind + * @param {HelperKind} helperKind + */ +function generateTypeHelpers(helperKind) { + const dest = `./packages/babel-types/src/${helperKind}/generated/`; + const formatCode = require("./scripts/utils/formatCode"); + return gulp + .src(".", { base: __dirname }) + .pipe(errorsLogger()) + .pipe( + through.obj(function (file, enc, callback) { + file.path = "index.js"; + file.contents = Buffer.from( + formatCode( + require(`./packages/babel-types/scripts/generators/${helperKind}`)(), + dest + file.path + ) + ); + fancyLog(`${chalk.green("✔")} Generated ${helperKind}`); + callback(null, file); + }) + ) + .pipe(gulp.dest(dest)); +} + +function generateStandalone() { + const dest = "./packages/babel-standalone/src/generated/"; + const formatCode = require("./scripts/utils/formatCode"); + return gulp + .src(babelStandalonePluginConfigGlob, { base: __dirname }) + .pipe( + through.obj((file, enc, callback) => { + fancyLog("Generating @babel/standalone files"); + const pluginConfig = JSON.parse(file.contents); + let imports = ""; + let list = ""; + let allList = ""; + + for (const plugin of pluginConfig) { + const camelPlugin = camelCase(plugin); + imports += `import ${camelPlugin} from "@babel/plugin-${plugin}";`; + list += `${camelPlugin},`; + allList += `"${plugin}": ${camelPlugin},`; + } + + const fileContents = `/* + * This file is auto-generated! Do not modify it directly. + * To re-generate run 'yarn gulp generate-standalone' + */ +${imports} +export {${list}}; +export const all = {${allList}};`; + file.path = "plugins.js"; + file.contents = Buffer.from(formatCode(fileContents, dest)); + callback(null, file); + }) + ) + .pipe(gulp.dest(dest)); +} + function buildBabel(exclude, sourcesGlob = defaultSourcesGlob) { const base = __dirname; @@ -235,19 +304,68 @@ const standaloneBundle = [ }, ]; +gulp.task("generate-type-helpers", () => { + fancyLog("Generating @babel/types dynamic functions"); + return Promise.all( + ["asserts", "builders", "constants", "validators"].map(helperKind => + generateTypeHelpers(helperKind) + ) + ); +}); + +gulp.task("generate-standalone", () => generateStandalone()); + gulp.task("build-rollup", () => buildRollup(libBundles)); -gulp.task("build-babel-standalone", () => buildRollup(standaloneBundle, true)); +gulp.task("rollup-babel-standalone", () => buildRollup(standaloneBundle, true)); +gulp.task( + "build-babel-standalone", + gulp.series("generate-standalone", "rollup-babel-standalone") +); gulp.task("build-babel", () => buildBabel(/* exclude */ libBundles)); -gulp.task("build", gulp.parallel("build-rollup", "build-babel")); + +gulp.task( + "build", + gulp.series( + gulp.parallel("build-rollup", "build-babel"), + gulp.parallel( + "generate-standalone", + gulp.series( + "generate-type-helpers", + // rebuild @babel/types since type-helpers may be changed + "build-babel" + ) + ) + ) +); gulp.task("default", gulp.series("build")); gulp.task("build-no-bundle", () => buildBabel()); +gulp.task( + "build-dev", + gulp.series( + "build-no-bundle", + gulp.parallel( + "generate-standalone", + gulp.series( + "generate-type-helpers", + // rebuild @babel/types since type-helpers may be changed + "build-no-bundle" + ) + ) + ) +); + gulp.task( "watch", - gulp.series("build-no-bundle", function watch() { + gulp.series("build-dev", function watch() { gulp.watch(defaultSourcesGlob, gulp.task("build-no-bundle")); + gulp.watch( + babelStandalonePluginConfigGlob, + gulp.task("generate-standalone") + ); + gulp.watch(buildTypingsWatchGlob, gulp.task("generate-type-helpers")); }) ); diff --git a/Makefile b/Makefile index 6f495f7481..18f8d450a4 100644 --- a/Makefile +++ b/Makefile @@ -26,9 +26,6 @@ ifneq ("$(BABEL_COVERAGE)", "true") endif build-bundle: clean clean-lib - $(YARN) gulp build - $(MAKE) generate-standalone generate-type-helpers - # call build again as the generated files might need to be compiled again. $(YARN) gulp build $(MAKE) build-typings $(MAKE) build-dist @@ -39,11 +36,8 @@ build-bundle-ci: bootstrap-only generate-tsconfig: $(NODE) scripts/generators/tsconfig.js -generate-standalone: - $(NODE) packages/babel-standalone/scripts/generate.js - generate-type-helpers: - $(NODE) packages/babel-types/scripts/generateTypeHelpers.js + $(YARN) gulp generate-type-helpers build-typings: build-flow-typings build-typescript-typings @@ -76,11 +70,11 @@ build-plugin-transform-runtime-dist: $(NODE) scripts/build-dist.js build-no-bundle: clean clean-lib - BABEL_ENV=development $(YARN) gulp build-no-bundle + BABEL_ENV=development $(YARN) gulp build-dev # Ensure that build artifacts for types are created during local # development too. # Babel-transform-fixture-test-runner requires minified polyfill for performance - $(MAKE) generate-type-helpers build-typings build-polyfill-dist + $(MAKE) build-typings build-polyfill-dist watch: build-no-bundle BABEL_ENV=development $(YARN) gulp watch diff --git a/packages/babel-standalone/package.json b/packages/babel-standalone/package.json index 4f3a437aa5..b1ee777f70 100644 --- a/packages/babel-standalone/package.json +++ b/packages/babel-standalone/package.json @@ -105,9 +105,7 @@ "@babel/preset-env": "workspace:*", "@babel/preset-flow": "workspace:*", "@babel/preset-react": "workspace:*", - "@babel/preset-typescript": "workspace:*", - "chalk": "^4.0.0", - "lodash": "^4.17.20" + "@babel/preset-typescript": "workspace:*" }, "keywords": [ "babel", diff --git a/packages/babel-standalone/scripts/generate.js b/packages/babel-standalone/scripts/generate.js deleted file mode 100644 index 77f80fac27..0000000000 --- a/packages/babel-standalone/scripts/generate.js +++ /dev/null @@ -1,37 +0,0 @@ -// @flow -const pluginConfig = require("./pluginConfig.json"); -const path = require("path"); -const chalk = require("chalk"); -const camelCase = require("lodash/camelCase"); -const format = require("../../../scripts/utils/formatCode"); -const writeFile = require("../../../scripts/utils/writeFileAndMkDir"); - -const outputFile = path.join(__dirname, "../src/generated/plugins.js"); - -console.log("Generating @babel/standalone files"); - -let imports = ""; -let list = ""; -let allList = ""; - -for (const plugin of pluginConfig) { - const camelPlugin = camelCase(plugin); - imports += `import ${camelPlugin} from "@babel/plugin-${plugin}";`; - list += `${camelPlugin},`; - allList += `"${plugin}": ${camelPlugin},`; -} - -const fileContent = ` -/* - * This file is auto-generated! Do not modify it directly. - * To re-generate run 'make build' - */ -${imports} - -export {${list}}; - -export const all = {${allList}}; -`; - -writeFile(outputFile, format(fileContent, outputFile)); -console.log(` ${chalk.green("✔")} Generated plugin list`); diff --git a/packages/babel-standalone/src/generated/plugins.js b/packages/babel-standalone/src/generated/plugins.js index 220c1f5dc0..1876de4a84 100644 --- a/packages/babel-standalone/src/generated/plugins.js +++ b/packages/babel-standalone/src/generated/plugins.js @@ -1,6 +1,6 @@ /* * This file is auto-generated! Do not modify it directly. - * To re-generate run 'make build' + * To re-generate run 'yarn gulp generate-standalone' */ import externalHelpers from "@babel/plugin-external-helpers"; import syntaxAsyncGenerators from "@babel/plugin-syntax-async-generators"; diff --git a/packages/babel-types/package.json b/packages/babel-types/package.json index f353642fdf..0401aaa95e 100644 --- a/packages/babel-types/package.json +++ b/packages/babel-types/package.json @@ -29,7 +29,6 @@ }, "devDependencies": { "@babel/generator": "workspace:*", - "@babel/parser": "workspace:*", - "chalk": "^4.1.0" + "@babel/parser": "workspace:*" } } diff --git a/packages/babel-types/scripts/generateTypeHelpers.js b/packages/babel-types/scripts/generateTypeHelpers.js deleted file mode 100644 index bf0b036c18..0000000000 --- a/packages/babel-types/scripts/generateTypeHelpers.js +++ /dev/null @@ -1,29 +0,0 @@ -"use strict"; -const path = require("path"); -const chalk = require("chalk"); -const generateBuilders = require("./generators/generateBuilders"); -const generateValidators = require("./generators/generateValidators"); -const generateAsserts = require("./generators/generateAsserts"); -const generateConstants = require("./generators/generateConstants"); -const format = require("../../../scripts/utils/formatCode"); -const writeFile = require("../../../scripts/utils/writeFileAndMkDir"); - -const baseDir = path.join(__dirname, "../src"); - -console.log("Generating @babel/types dynamic functions"); - -const buildersFile = path.join(baseDir, "builders/generated/index.js"); -writeFile(buildersFile, format(generateBuilders(), buildersFile)); -console.log(` ${chalk.green("✔")} Generated builders`); - -const validatorsFile = path.join(baseDir, "validators/generated/index.js"); -writeFile(validatorsFile, format(generateValidators(), validatorsFile)); -console.log(` ${chalk.green("✔")} Generated validators`); - -const assertsFile = path.join(baseDir, "asserts/generated/index.js"); -writeFile(assertsFile, format(generateAsserts(), assertsFile)); -console.log(` ${chalk.green("✔")} Generated asserts`); - -const constantsFile = path.join(baseDir, "constants/generated/index.js"); -writeFile(constantsFile, format(generateConstants(), constantsFile)); -console.log(` ${chalk.green("✔")} Generated constants`); diff --git a/packages/babel-types/scripts/generators/generateAsserts.js b/packages/babel-types/scripts/generators/asserts.js similarity index 100% rename from packages/babel-types/scripts/generators/generateAsserts.js rename to packages/babel-types/scripts/generators/asserts.js diff --git a/packages/babel-types/scripts/generators/generateBuilders.js b/packages/babel-types/scripts/generators/builders.js similarity index 100% rename from packages/babel-types/scripts/generators/generateBuilders.js rename to packages/babel-types/scripts/generators/builders.js diff --git a/packages/babel-types/scripts/generators/generateConstants.js b/packages/babel-types/scripts/generators/constants.js similarity index 100% rename from packages/babel-types/scripts/generators/generateConstants.js rename to packages/babel-types/scripts/generators/constants.js diff --git a/packages/babel-types/scripts/generators/generateValidators.js b/packages/babel-types/scripts/generators/validators.js similarity index 100% rename from packages/babel-types/scripts/generators/generateValidators.js rename to packages/babel-types/scripts/generators/validators.js diff --git a/packages/babel-types/src/asserts/generated/index.js b/packages/babel-types/src/asserts/generated/index.js old mode 100644 new mode 100755 diff --git a/packages/babel-types/src/builders/generated/index.js b/packages/babel-types/src/builders/generated/index.js old mode 100644 new mode 100755 diff --git a/packages/babel-types/src/constants/generated/index.js b/packages/babel-types/src/constants/generated/index.js old mode 100644 new mode 100755 diff --git a/packages/babel-types/src/validators/generated/index.js b/packages/babel-types/src/validators/generated/index.js old mode 100644 new mode 100755 diff --git a/scripts/utils/writeFileAndMkDir.js b/scripts/utils/writeFileAndMkDir.js deleted file mode 100644 index 01da612fe5..0000000000 --- a/scripts/utils/writeFileAndMkDir.js +++ /dev/null @@ -1,14 +0,0 @@ -const fs = require("fs"); -const path = require("path"); - -module.exports = function writeFileAndMkDir(file, content) { - try { - fs.mkdirSync(path.dirname(file)); - } catch (error) { - if (error.code !== "EEXIST") { - throw error; - } - } - - fs.writeFileSync(file, content); -}; diff --git a/yarn.lock b/yarn.lock index 5b9d4f153e..458b468d2c 100644 --- a/yarn.lock +++ b/yarn.lock @@ -3295,8 +3295,6 @@ __metadata: "@babel/preset-flow": "workspace:*" "@babel/preset-react": "workspace:*" "@babel/preset-typescript": "workspace:*" - chalk: ^4.0.0 - lodash: ^4.17.20 languageName: unknown linkType: soft @@ -3383,7 +3381,6 @@ __metadata: "@babel/generator": "workspace:*" "@babel/helper-validator-identifier": "workspace:^7.10.4" "@babel/parser": "workspace:*" - chalk: ^4.1.0 lodash: ^4.17.19 to-fast-properties: ^2.0.0 languageName: unknown @@ -9676,7 +9673,7 @@ fsevents@^1.2.7: languageName: node linkType: hard -"lodash@npm:^4.17.14, lodash@npm:^4.17.15, lodash@npm:^4.17.19, lodash@npm:^4.17.20": +"lodash@npm:^4.17.14, lodash@npm:^4.17.15, lodash@npm:^4.17.19": version: 4.17.20 resolution: "lodash@npm:4.17.20" checksum: c62101d2500c383b5f174a7e9e6fe8098149ddd6e9ccfa85f36d4789446195f5c4afd3cfba433026bcaf3da271256566b04a2bf2618e5a39f6e67f8c12030cb6