From f4a6232848aa9633492934bf92dc76a1ac6fbb4c Mon Sep 17 00:00:00 2001 From: fisker Cheung Date: Sat, 15 May 2021 20:09:52 +0800 Subject: [PATCH] Switch some scripts to ESM (#10867) --- .eslintrc.yml | 3 + package.json | 9 +-- scripts/{build-docs.js => build-docs.mjs} | 14 ++-- scripts/build/{build.js => build.mjs} | 33 +++++----- scripts/build/{bundler.js => bundler.mjs} | 64 ++++++++++--------- scripts/build/{cache.js => cache.mjs} | 18 +++--- scripts/build/{config.js => config.mjs} | 6 +- .../{evaluate.js => evaluate.mjs} | 8 ++- .../{executable.js => executable.mjs} | 10 ++- .../{externals.js => externals.mjs} | 8 +-- scripts/build/{util.js => utils.mjs} | 10 +-- scripts/{check-deps.js => check-deps.mjs} | 14 ++-- scripts/clean-changelog-unreleased.js | 17 ----- scripts/clean-changelog-unreleased.mjs | 17 +++++ scripts/{clean-cspell.js => clean-cspell.mjs} | 15 ++--- ...draft-blog-post.js => draft-blog-post.mjs} | 12 ++-- .../{lint-changelog.js => lint-changelog.mjs} | 10 +-- yarn.lock | 5 ++ 18 files changed, 139 insertions(+), 134 deletions(-) rename scripts/{build-docs.js => build-docs.mjs} (86%) rename scripts/build/{build.js => build.mjs} (87%) rename scripts/build/{bundler.js => bundler.mjs} (85%) rename scripts/build/{cache.js => cache.mjs} (92%) rename scripts/build/{config.js => config.mjs} (97%) rename scripts/build/rollup-plugins/{evaluate.js => evaluate.mjs} (81%) rename scripts/build/rollup-plugins/{executable.js => executable.mjs} (88%) rename scripts/build/rollup-plugins/{externals.js => externals.mjs} (77%) rename scripts/build/{util.js => utils.mjs} (75%) rename scripts/{check-deps.js => check-deps.mjs} (51%) delete mode 100644 scripts/clean-changelog-unreleased.js create mode 100644 scripts/clean-changelog-unreleased.mjs rename scripts/{clean-cspell.js => clean-cspell.mjs} (77%) rename scripts/{draft-blog-post.js => draft-blog-post.mjs} (95%) rename scripts/{lint-changelog.js => lint-changelog.mjs} (95%) diff --git a/.eslintrc.yml b/.eslintrc.yml index f914d545e..8b666517f 100644 --- a/.eslintrc.yml +++ b/.eslintrc.yml @@ -98,6 +98,9 @@ overrides: - "**/*.mjs" parserOptions: sourceType: module + rules: + unicorn/prefer-module: error + unicorn/prefer-node-protocol: error - files: - "tests/format/**/jsfmt.spec.js" - "tests/config/**/*.js" diff --git a/package.json b/package.json index 90a2ba3c4..e5bf3e130 100644 --- a/package.json +++ b/package.json @@ -115,6 +115,7 @@ "eslint-plugin-react": "7.23.2", "eslint-plugin-regexp": "0.10.0", "eslint-plugin-unicorn": "31.0.0", + "esm-utils": "1.0.1", "execa": "5.0.0", "jest": "26.6.3", "jest-snapshot-serializer-ansi": "1.0.0", @@ -148,15 +149,15 @@ "lint": "run-p lint:*", "lint:typecheck": "tsc", "lint:eslint": "cross-env EFF_NO_LINK_RULES=true eslint . --format friendly", - "lint:changelog": "node ./scripts/lint-changelog.js", + "lint:changelog": "node ./scripts/lint-changelog.mjs", "lint:prettier": "prettier . \"!test*\" --check", "lint:dist": "eslint --no-eslintrc --no-ignore --no-inline-config --env=es6,browser --parser-options=ecmaVersion:2019 \"dist/!(bin-prettier|index|third-party).js\"", "lint:spellcheck": "cspell \"**/*\" \".github/**/*\"", - "lint:deps": "node ./scripts/check-deps.js", + "lint:deps": "node ./scripts/check-deps.mjs", "fix": "run-s fix:eslint fix:prettier", "fix:eslint": "yarn lint:eslint --fix", "fix:prettier": "yarn lint:prettier --write", - "build": "node --max-old-space-size=3072 ./scripts/build/build.js", - "build-docs": "node ./scripts/build-docs.js" + "build": "node --max-old-space-size=3072 ./scripts/build/build.mjs", + "build-docs": "node ./scripts/build-docs.mjs" } } diff --git a/scripts/build-docs.js b/scripts/build-docs.mjs similarity index 86% rename from scripts/build-docs.js rename to scripts/build-docs.mjs index 555d1ab82..f272159c7 100644 --- a/scripts/build-docs.js +++ b/scripts/build-docs.mjs @@ -1,15 +1,15 @@ #!/usr/bin/env node -"use strict"; - -const path = require("path"); -const fs = require("fs"); -const shell = require("shelljs"); -const globby = require("globby"); -const prettier = require("prettier"); +import path from "node:path"; +import fs from "node:fs"; +import shell from "shelljs"; +import globby from "globby"; +import prettier from "prettier"; +import createEsmUtils from "esm-utils"; shell.config.fatal = true; +const { __dirname, require } = createEsmUtils(import.meta); const rootDir = path.join(__dirname, ".."); const docs = path.join(rootDir, "website/static/lib"); diff --git a/scripts/build/build.js b/scripts/build/build.mjs similarity index 87% rename from scripts/build/build.js rename to scripts/build/build.mjs index a44f39797..9d367e84c 100644 --- a/scripts/build/build.js +++ b/scripts/build/build.mjs @@ -1,16 +1,16 @@ -"use strict"; +#!/usr/bin/env node -const path = require("path"); -const fs = require("fs").promises; -const readline = require("readline"); -const chalk = require("chalk"); -const execa = require("execa"); -const minimist = require("minimist"); - -const bundler = require("./bundler"); -const bundleConfigs = require("./config"); -const util = require("./util"); -const Cache = require("./cache"); +import path from "node:path"; +import fs from "node:fs/promises"; +import readline from "node:readline"; +import chalk from "chalk"; +import execa from "execa"; +import minimist from "minimist"; +import prettyBytes from "pretty-bytes"; +import bundler from "./bundler.mjs"; +import bundleConfigs from "./config.mjs"; +import * as utils from "./utils.mjs"; +import Cache from "./cache.mjs"; // Errors in promises should be fatal. const loggedErrors = new Set(); @@ -84,7 +84,6 @@ async function createBundle(bundleConfig, cache, options) { readline.clearLine(process.stdout, 0); readline.cursorTo(process.stdout, 0, null); - const prettyBytes = require("pretty-bytes"); const getSizeText = async (file) => prettyBytes((await fs.stat(file)).size); const sizeTexts = [await getSizeText(file)]; @@ -133,7 +132,7 @@ async function cacheFiles(cache) { } async function preparePackage() { - const pkg = await util.readJson("package.json"); + const pkg = await utils.readJson("package.json"); pkg.bin = "./bin-prettier.js"; pkg.engines.node = ">=10.13.0"; delete pkg.dependencies; @@ -143,10 +142,10 @@ async function preparePackage() { "node -e \"assert.equal(require('.').version, require('..').version)\"", }; pkg.files = ["*.js", "esm/*.mjs"]; - await util.writeJson("dist/package.json", pkg); + await utils.writeJson("dist/package.json", pkg); - await util.copyFile("./README.md", "./dist/README.md"); - await util.copyFile("./LICENSE", "./dist/LICENSE"); + await utils.copyFile("./README.md", "./dist/README.md"); + await utils.copyFile("./LICENSE", "./dist/LICENSE"); } async function run(params) { diff --git a/scripts/build/bundler.js b/scripts/build/bundler.mjs similarity index 85% rename from scripts/build/bundler.js rename to scripts/build/bundler.mjs index 569fd7588..110b3b5b4 100644 --- a/scripts/build/bundler.js +++ b/scripts/build/bundler.mjs @@ -1,21 +1,22 @@ -"use strict"; - -const path = require("path"); -const fs = require("fs"); -const { rollup } = require("rollup"); -const webpack = require("webpack"); -const { nodeResolve } = require("@rollup/plugin-node-resolve"); -const rollupPluginAlias = require("@rollup/plugin-alias"); -const commonjs = require("@rollup/plugin-commonjs"); -const rollupPluginPolyfillNode = require("rollup-plugin-polyfill-node"); -const json = require("@rollup/plugin-json"); -const replace = require("@rollup/plugin-replace"); -const { terser } = require("rollup-plugin-terser"); -const { babel } = require("@rollup/plugin-babel"); -const executable = require("./rollup-plugins/executable"); -const evaluate = require("./rollup-plugins/evaluate"); -const externals = require("./rollup-plugins/externals"); +import path from "node:path"; +import fs from "node:fs"; +import { rollup } from "rollup"; +import webpack from "webpack"; +import { nodeResolve as rollupPluginNodeResolve } from "@rollup/plugin-node-resolve"; +import rollupPluginAlias from "@rollup/plugin-alias"; +import rollupPluginCommonjs from "@rollup/plugin-commonjs"; +import rollupPluginPolyfillNode from "rollup-plugin-polyfill-node"; +import rollupPluginJson from "@rollup/plugin-json"; +import rollupPluginReplace from "@rollup/plugin-replace"; +import { terser as rollupPluginTerser } from "rollup-plugin-terser"; +import { babel as rollupPluginBabel } from "@rollup/plugin-babel"; +import WebpackPluginTerser from "terser-webpack-plugin"; +import createEsmUtils from "esm-utils"; +import rollupPluginExecutable from "./rollup-plugins/executable.mjs"; +import rollupPluginEvaluate from "./rollup-plugins/evaluate.mjs"; +import rollupPluginExternals from "./rollup-plugins/externals.mjs"; +const { __dirname, require } = createEsmUtils(import.meta); const PROJECT_ROOT = path.join(__dirname, "../.."); const EXTERNALS = [ @@ -195,20 +196,20 @@ function getRollupConfig(bundle) { alias.entries = [...entries, ...(alias.entries || [])]; config.plugins = [ - replace({ + rollupPluginReplace({ values: replaceStrings, delimiters: ["", ""], preventAssignment: true, }), - executable(), - evaluate(), - json(), + rollupPluginExecutable(), + rollupPluginEvaluate(), + rollupPluginJson(), rollupPluginAlias(alias), - nodeResolve({ + rollupPluginNodeResolve({ extensions: [".js", ".json"], preferBuiltins: bundle.target === "node", }), - commonjs({ + rollupPluginCommonjs({ ignoreGlobal: bundle.target === "node", ...bundle.commonjs, ignore: @@ -217,12 +218,12 @@ function getRollupConfig(bundle) { : (id) => /\.\/parser-.*?/.test(id), requireReturnsDefault: "preferred", }), - externals(bundle.externals), + rollupPluginExternals(bundle.externals), bundle.target === "universal" && rollupPluginPolyfillNode(), - babel(babelConfig), + rollupPluginBabel(babelConfig), bundle.minify !== false && bundle.target === "universal" && - terser({ + rollupPluginTerser({ output: { ascii_only: true, }, @@ -311,8 +312,9 @@ function getWebpackConfig(bundle) { }; if (bundle.terserOptions) { - const TerserPlugin = require("terser-webpack-plugin"); - config.optimization.minimizer = [new TerserPlugin(bundle.terserOptions)]; + config.optimization.minimizer = [ + new WebpackPluginTerser(bundle.terserOptions), + ]; } // config.optimization.minimize = false; @@ -345,7 +347,7 @@ function runWebpack(config) { }); } -module.exports = async function createBundle(bundle, cache, options) { +async function createBundle(bundle, cache, options) { const inputOptions = getRollupConfig(bundle); const outputOptions = getRollupOutputOptions(bundle, options); @@ -374,4 +376,6 @@ module.exports = async function createBundle(bundle, cache, options) { } return { bundled: true }; -}; +} + +export default createBundle; diff --git a/scripts/build/cache.js b/scripts/build/cache.mjs similarity index 92% rename from scripts/build/cache.js rename to scripts/build/cache.mjs index ac37701ea..6da2afb74 100644 --- a/scripts/build/cache.js +++ b/scripts/build/cache.mjs @@ -1,12 +1,12 @@ -"use strict"; - -const assert = require("assert").strict; -const crypto = require("crypto"); -const fs = require("fs").promises; -const path = require("path"); -const execa = require("execa"); -const { rollup } = require("rollup"); +import { strict as assert } from "node:assert"; +import crypto from "node:crypto"; +import fs from "node:fs/promises"; +import path from "node:path"; +import execa from "execa"; +import { rollup } from "rollup"; +import createEsmUtils from "esm-utils"; +const { __dirname } = createEsmUtils(import.meta); const ROOT = path.join(__dirname, "..", ".."); class Cache { @@ -146,4 +146,4 @@ function getRollupConfig(rollupConfig) { }; } -module.exports = Cache; +export default Cache; diff --git a/scripts/build/config.js b/scripts/build/config.mjs similarity index 97% rename from scripts/build/config.js rename to scripts/build/config.mjs index 990734255..b7b07e579 100644 --- a/scripts/build/config.js +++ b/scripts/build/config.mjs @@ -1,6 +1,4 @@ -"use strict"; - -const path = require("path"); +import path from "node:path"; /** * @typedef {Object} Bundle @@ -171,7 +169,7 @@ function getFileOutput(bundle) { return bundle.output || path.basename(bundle.input); } -module.exports = [...coreBundles, ...parsers].map((bundle) => ({ +export default [...coreBundles, ...parsers].map((bundle) => ({ ...bundle, output: getFileOutput(bundle), })); diff --git a/scripts/build/rollup-plugins/evaluate.js b/scripts/build/rollup-plugins/evaluate.mjs similarity index 81% rename from scripts/build/rollup-plugins/evaluate.js rename to scripts/build/rollup-plugins/evaluate.mjs index 835422c5b..6efb42933 100644 --- a/scripts/build/rollup-plugins/evaluate.js +++ b/scripts/build/rollup-plugins/evaluate.mjs @@ -1,6 +1,8 @@ -"use strict"; +import createEsmUtils from "esm-utils"; -module.exports = function () { +const { require } = createEsmUtils(import.meta); + +export default function () { return { name: "evaluate", @@ -25,4 +27,4 @@ module.exports = function () { }; }, }; -}; +} diff --git a/scripts/build/rollup-plugins/executable.js b/scripts/build/rollup-plugins/executable.mjs similarity index 88% rename from scripts/build/rollup-plugins/executable.js rename to scripts/build/rollup-plugins/executable.mjs index 7505c8ee6..10f35df4b 100644 --- a/scripts/build/rollup-plugins/executable.js +++ b/scripts/build/rollup-plugins/executable.mjs @@ -1,9 +1,7 @@ -"use strict"; +import fs from "node:fs"; +import path from "node:path"; -const fs = require("fs"); -const path = require("path"); - -module.exports = function () { +export default function () { let banner; let entry; let file; @@ -46,4 +44,4 @@ module.exports = function () { } }, }; -}; +} diff --git a/scripts/build/rollup-plugins/externals.js b/scripts/build/rollup-plugins/externals.mjs similarity index 77% rename from scripts/build/rollup-plugins/externals.js rename to scripts/build/rollup-plugins/externals.mjs index a90cefc0f..3bb6e4e48 100644 --- a/scripts/build/rollup-plugins/externals.js +++ b/scripts/build/rollup-plugins/externals.mjs @@ -1,8 +1,6 @@ -"use strict"; +import path from "node:path"; -const path = require("path"); - -module.exports = function (modules = []) { +export default function (modules = []) { const requires = modules.reduce((obj, mod) => { obj[mod] = path.basename(mod).replace(/\.js$/, ""); return obj; @@ -17,4 +15,4 @@ module.exports = function (modules = []) { } }, }; -}; +} diff --git a/scripts/build/util.js b/scripts/build/utils.mjs similarity index 75% rename from scripts/build/util.js rename to scripts/build/utils.mjs index 07dfcf76a..b474be33f 100644 --- a/scripts/build/util.js +++ b/scripts/build/utils.mjs @@ -1,6 +1,4 @@ -"use strict"; - -const fs = require("fs").promises; +import fs from "node:fs/promises"; async function readJson(file) { const data = await fs.readFile(file); @@ -17,8 +15,4 @@ async function copyFile(from, to) { return fs.writeFile(to, data); } -module.exports = { - readJson, - writeJson, - copyFile, -}; +export { readJson, writeJson, copyFile }; diff --git a/scripts/check-deps.js b/scripts/check-deps.mjs similarity index 51% rename from scripts/check-deps.js rename to scripts/check-deps.mjs index d6b56650f..f845118f5 100644 --- a/scripts/check-deps.js +++ b/scripts/check-deps.mjs @@ -1,10 +1,14 @@ -"use strict"; +import fs from "node:fs/promises"; +import chalk from "chalk"; -const chalk = require("chalk"); -const pkg = require("../package.json"); +(async () => { + const packageJson = JSON.parse( + await fs.readFile(new URL("../package.json", import.meta)) + ); -validateDependencyObject(pkg.dependencies); -validateDependencyObject(pkg.devDependencies); + validateDependencyObject(packageJson.dependencies); + validateDependencyObject(packageJson.devDependencies); +})(); function validateDependencyObject(object) { for (const key of Object.keys(object)) { diff --git a/scripts/clean-changelog-unreleased.js b/scripts/clean-changelog-unreleased.js deleted file mode 100644 index 9a8b02c47..000000000 --- a/scripts/clean-changelog-unreleased.js +++ /dev/null @@ -1,17 +0,0 @@ -#!/usr/bin/env node - -"use strict"; - -const fs = require("fs"); -const path = require("path"); -const globby = require("globby"); - -const changelogUnreleasedDir = path.join(__dirname, "../changelog_unreleased"); - -const files = globby.sync(["blog-post-intro.md", "*/*.md"], { - cwd: changelogUnreleasedDir, - absolute: true, -}); -for (const file of files) { - fs.unlinkSync(file); -} diff --git a/scripts/clean-changelog-unreleased.mjs b/scripts/clean-changelog-unreleased.mjs new file mode 100644 index 000000000..600fcbfd6 --- /dev/null +++ b/scripts/clean-changelog-unreleased.mjs @@ -0,0 +1,17 @@ +#!/usr/bin/env node + +import fs from "node:fs"; +import { fileURLToPath } from "node:url"; +import globby from "globby"; + +const changelogUnreleasedDir = fileURLToPath( + new URL("../changelog_unreleased", import.meta.url) +); + +const files = globby.sync(["blog-post-intro.md", "*/*.md"], { + cwd: changelogUnreleasedDir, + absolute: true, +}); +for (const file of files) { + fs.unlinkSync(file); +} diff --git a/scripts/clean-cspell.js b/scripts/clean-cspell.mjs similarity index 77% rename from scripts/clean-cspell.js rename to scripts/clean-cspell.mjs index df3577649..39511389f 100644 --- a/scripts/clean-cspell.js +++ b/scripts/clean-cspell.mjs @@ -1,19 +1,16 @@ #!/usr/bin/env node -"use strict"; +import fs from "node:fs/promises"; +import execa from "execa"; -const fs = require("fs"); -const path = require("path"); -const execa = require("execa"); +const CSPELL_CONFIG_FILE = new URL("../cspell.json", import.meta.url); -const CSPELL_CONFIG_FILE = path.join(__dirname, "../cspell.json"); - -const updateConfig = (config) => - fs.writeFileSync(CSPELL_CONFIG_FILE, JSON.stringify(config, undefined, 4)); +const updateConfig = async (config) => + await fs.writeFile(CSPELL_CONFIG_FILE, JSON.stringify(config, undefined, 4)); (async () => { console.log("Empty words ..."); - const config = JSON.parse(fs.readFileSync(CSPELL_CONFIG_FILE, "utf8")); + const config = JSON.parse(await fs.readFile(CSPELL_CONFIG_FILE, "utf8")); updateConfig({ ...config, words: [] }); console.log("Running spellcheck with empty words ..."); diff --git a/scripts/draft-blog-post.js b/scripts/draft-blog-post.mjs similarity index 95% rename from scripts/draft-blog-post.js rename to scripts/draft-blog-post.mjs index 8b7fbea44..4e9b9d875 100644 --- a/scripts/draft-blog-post.js +++ b/scripts/draft-blog-post.mjs @@ -1,12 +1,12 @@ #!/usr/bin/env node -"use strict"; - -const fs = require("fs"); -const path = require("path"); -const rimraf = require("rimraf"); -const semver = require("semver"); +import fs from "node:fs"; +import path from "node:path"; +import rimraf from "rimraf"; +import semver from "semver"; +import createEsmUtils from "esm-utils"; +const { __dirname, require } = createEsmUtils(import.meta); const changelogUnreleasedDir = path.join(__dirname, "../changelog_unreleased"); const blogDir = path.join(__dirname, "../website/blog"); const introTemplateFile = path.join( diff --git a/scripts/lint-changelog.js b/scripts/lint-changelog.mjs similarity index 95% rename from scripts/lint-changelog.js rename to scripts/lint-changelog.mjs index d4003248e..10c7fd24b 100644 --- a/scripts/lint-changelog.js +++ b/scripts/lint-changelog.mjs @@ -1,9 +1,11 @@ #!/usr/bin/env node -"use strict"; -const fs = require("fs"); -const path = require("path"); -const { outdent } = require("outdent"); +import path from "node:path"; +import fs from "node:fs"; +import { outdent } from "outdent"; +import createEsmUtils from "esm-utils"; + +const { __dirname } = createEsmUtils(import.meta); const CHANGELOG_DIR = "changelog_unreleased"; const TEMPLATE_FILE = "TEMPLATE.md"; const BLOG_POST_INTRO_TEMPLATE_FILE = "BLOG_POST_INTRO_TEMPLATE.md"; diff --git a/yarn.lock b/yarn.lock index b58939c2b..d3a6d953c 100644 --- a/yarn.lock +++ b/yarn.lock @@ -3263,6 +3263,11 @@ eslint@7.26.0: text-table "^0.2.0" v8-compile-cache "^2.0.3" +esm-utils@1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/esm-utils/-/esm-utils-1.0.1.tgz#297085fbb352140c70789744c0b858fd43f0b391" + integrity sha512-flJFfIoZmKFiz2wqz++NVT4rUia3ht80fDKmixuhmvCdf4JZyAx9RO5SSzfZY5Rv7/vBhB1xYzzFUM5qt1MBBg== + espree@7.3.1, espree@^7.3.0, espree@^7.3.1: version "7.3.1" resolved "https://registry.yarnpkg.com/espree/-/espree-7.3.1.tgz#f2df330b752c6f55019f8bd89b7660039c1bbbb6"