diff --git a/.eslintrc.js b/.eslintrc.js index 13ffe5fd8..a7e1a3768 100644 --- a/.eslintrc.js +++ b/.eslintrc.js @@ -4,9 +4,12 @@ const { isCI } = require("ci-info"); module.exports = { root: true, env: { - es2021: true, + es2022: true, node: true, }, + parserOptions: { + ecmaVersion: "latest", + }, reportUnusedDisableDirectives: true, extends: ["eslint:recommended", "prettier"], plugins: [ @@ -167,6 +170,12 @@ module.exports = { "no-console": "off", }, }, + { + files: ["scripts/**/*.mjs"], + rules: { + "unicorn/prefer-top-level-await": "error", + }, + }, { files: [ "**/*.mjs", diff --git a/.github/workflows/dev-package-test.yml b/.github/workflows/dev-package-test.yml index 3da079dd4..b3941fe37 100644 --- a/.github/workflows/dev-package-test.yml +++ b/.github/workflows/dev-package-test.yml @@ -21,7 +21,7 @@ jobs: - "ubuntu-latest" node: # Run tests on minimal version we support - - "12" + - "14" NPM_CLIENT: - "yarn" - "npm" diff --git a/.github/workflows/dev-test.yml b/.github/workflows/dev-test.yml index ebb91356b..c0a25e69e 100644 --- a/.github/workflows/dev-test.yml +++ b/.github/workflows/dev-test.yml @@ -18,21 +18,20 @@ jobs: - "macos-latest" - "windows-latest" node: - - "16.10.0" + - "16" - "14" - - "12" include: # only enable coverage on the fastest job - os: "ubuntu-latest" - node: "16.10.0" + node: "16" ENABLE_CODE_COVERAGE: true FULL_TEST: true CHECK_TEST_PARSERS: true - exclude: - - os: "macos-latest" - node: "14" - - os: "windows-latest" - node: "14" + # exclude: + # - os: "macos-latest" + # node: "14" + # - os: "windows-latest" + # node: "14" env: ENABLE_CODE_COVERAGE: ${{ matrix.ENABLE_CODE_COVERAGE }} FULL_TEST: ${{ matrix.FULL_TEST }} @@ -42,9 +41,6 @@ jobs: steps: - name: Checkout uses: actions/checkout@v3 - # `codecov/codecov-action` require depth to be at least `2`, see #10219 - with: - fetch-depth: 2 - name: Setup Node.js uses: actions/setup-node@v3 diff --git a/.github/workflows/prod-test.yml b/.github/workflows/prod-test.yml index affdbcb3d..44c35d406 100644 --- a/.github/workflows/prod-test.yml +++ b/.github/workflows/prod-test.yml @@ -77,13 +77,13 @@ jobs: - "macos-latest" - "windows-latest" node: - - "16.10.0" + - "16" - "14" - "12" - "10" include: - os: "ubuntu-latest" - node: "16.10.0" + node: "16" FULL_TEST: true exclude: - os: "macos-latest" @@ -109,8 +109,8 @@ jobs: node-version: ${{ matrix.node }} cache: "yarn" - - name: Config `ignore-engines=true` (Node.js 10) - if: ${{ matrix.node == '10' }} + - name: Config `ignore-engines=true` (Node.js < 14) + if: ${{ matrix.node == '10' || matrix.node == '12' }} run: yarn config set ignore-engines true - name: Install Dependencies diff --git a/.github/workflows/release-script-test.yml b/.github/workflows/release-script-test.yml index 232979f74..b4a4a8255 100644 --- a/.github/workflows/release-script-test.yml +++ b/.github/workflows/release-script-test.yml @@ -25,7 +25,6 @@ jobs: - name: Setup Node.js uses: actions/setup-node@v3 with: - node-version: "14" cache: "yarn" - name: Install Dependencies diff --git a/.github/workflows/validate-vendors.yml b/.github/workflows/validate-vendors.yml index ec990e8a0..3b88b080f 100644 --- a/.github/workflows/validate-vendors.yml +++ b/.github/workflows/validate-vendors.yml @@ -22,7 +22,6 @@ jobs: - name: Setup Node.js uses: actions/setup-node@v3 with: - node-version: "14" cache: "yarn" - name: Install Dependencies diff --git a/package.json b/package.json index c62dc2b19..c1e226504 100644 --- a/package.json +++ b/package.json @@ -12,7 +12,7 @@ "browser": "./standalone.js", "unpkg": "./standalone.js", "engines": { - "node": ">=12.17.0" + "node": ">=14" }, "files": [ "index.js", diff --git a/scripts/build-website.mjs b/scripts/build-website.mjs index 6b2d363dd..870011998 100644 --- a/scripts/build-website.mjs +++ b/scripts/build-website.mjs @@ -86,19 +86,17 @@ async function buildPlaygroundFiles() { ); } -(async () => { - if (IS_PULL_REQUEST) { - console.log("Building prettier..."); - await buildPrettier(); - } +if (IS_PULL_REQUEST) { + console.log("Building prettier..."); + await buildPrettier(); +} - console.log("Preparing files for playground..."); - await buildPlaygroundFiles(); +console.log("Preparing files for playground..."); +await buildPlaygroundFiles(); - // --- Site --- - console.log("Installing website dependencies..."); - await runYarn("install", [], { cwd: WEBSITE_DIR }); +// --- Site --- +console.log("Installing website dependencies..."); +await runYarn("install", [], { cwd: WEBSITE_DIR }); - console.log("Building website..."); - await runYarn("build", [], { cwd: WEBSITE_DIR }); -})(); +console.log("Building website..."); +await runYarn("build", [], { cwd: WEBSITE_DIR }); diff --git a/scripts/build/build.mjs b/scripts/build/build.mjs index 48500511d..d9cb514ee 100644 --- a/scripts/build/build.mjs +++ b/scripts/build/build.mjs @@ -20,16 +20,6 @@ import saveLicenses from "./save-licenses.mjs"; const { require } = createEsmUtils(import.meta); -// Errors in promises should be fatal. -const loggedErrors = new Set(); -process.on("unhandledRejection", (err) => { - // No need to print it twice. - if (!loggedErrors.has(err)) { - console.error(err); - } - process.exit(1); -}); - const statusConfig = [ { color: "bgGreen", text: "DONE" }, { color: "bgRed", text: "FAIL" }, @@ -135,16 +125,11 @@ async function createBundle(bundleConfig, options) { } } catch (error) { console.log(status.FAIL + "\n"); - handleError(error); + console.error(error); + throw error; } } -function handleError(error) { - loggedErrors.add(error); - console.error(error); - throw error; -} - async function preparePackage() { const packageJson = await readJson(path.join(PROJECT_ROOT, "package.json")); packageJson.bin = "./bin-prettier.js"; @@ -258,7 +243,7 @@ async function run(params) { } } -run( +await run( minimist(process.argv.slice(2), { boolean: [ "playground", diff --git a/scripts/check-deps.mjs b/scripts/check-deps.mjs index 60e8d1f2d..61e7b9fdb 100644 --- a/scripts/check-deps.mjs +++ b/scripts/check-deps.mjs @@ -1,17 +1,12 @@ import fs from "node:fs/promises"; import chalk from "chalk"; -(async () => { - const packageJson = JSON.parse( - await fs.readFile(new URL("../package.json", import.meta.url)) - ); +const packageJson = JSON.parse( + await fs.readFile(new URL("../package.json", import.meta.url)) +); - validateDependencyObject(packageJson.dependencies); - validateDependencyObject(packageJson.devDependencies); -})().catch((error) => { - console.error(error); - process.exit(1); -}); +validateDependencyObject(packageJson.dependencies); +validateDependencyObject(packageJson.devDependencies); function validateDependencyObject(object) { for (const key of Object.keys(object)) { diff --git a/scripts/clean-cspell.mjs b/scripts/clean-cspell.mjs index df9ec5015..4c70ca14a 100644 --- a/scripts/clean-cspell.mjs +++ b/scripts/clean-cspell.mjs @@ -15,55 +15,50 @@ const runSpellcheck = (options) => { return execa("yarn", [...yarnArgs, "lint:spellcheck", ...args], execaOptions); }; -(async () => { - console.log("Empty words ..."); - const config = JSON.parse(await fs.readFile(CSPELL_CONFIG_FILE)); - const original = config.words; - await updateConfig({ ...config, words: [] }); +console.log("Empty words ..."); +const config = JSON.parse(await fs.readFile(CSPELL_CONFIG_FILE)); +const original = config.words; +await updateConfig({ ...config, words: [] }); - console.log("Running spellcheck with empty words ..."); - const { stdout } = await runSpellcheck({ - yarnArgs: ["--silent"], - args: ["--words-only", "--unique"], - execaOptions: { reject: false }, - }); - - const words = stdout - .split("\n") - // Remove upper case word, if lower case one already exists - .filter((word, _, words) => { - const lowerCased = word.toLowerCase(); - return lowerCased === word || !words.includes(lowerCased); - }) - // Compare function from https://github.com/streetsidesoftware/vscode-spell-checker/blob/2fde3bc5c658ee51da5a56580aa1370bf8174070/packages/client/src/settings/CSpellSettings.ts#L78 - .sort((a, b) => a.toLowerCase().localeCompare(b.toLowerCase())); - config.words = words; - - const removed = original.filter((word) => !words.includes(word)); - if (removed.length > 0) { - console.log( - `${removed.length} words removed: \n${removed - .map((word) => ` - ${word}`) - .join("\n")}` - ); - } - const added = words.filter((word) => !original.includes(word)); - if (added.length > 0) { - console.log( - `${added.length} words added: \n${added - .map((word) => ` - ${word}`) - .join("\n")}` - ); - } - - console.log("Updating words ..."); - await updateConfig(config); - - console.log("Running spellcheck with new words ..."); - await runSpellcheck({ execaOptions: { stdout: "inherit" } }); - - console.log("CSpell config file updated."); -})().catch((error) => { - console.error(error); - process.exit(1); +console.log("Running spellcheck with empty words ..."); +const { stdout } = await runSpellcheck({ + yarnArgs: ["--silent"], + args: ["--words-only", "--unique"], + execaOptions: { reject: false }, }); + +const words = stdout + .split("\n") + // Remove upper case word, if lower case one already exists + .filter((word, _, words) => { + const lowerCased = word.toLowerCase(); + return lowerCased === word || !words.includes(lowerCased); + }) + // Compare function from https://github.com/streetsidesoftware/vscode-spell-checker/blob/2fde3bc5c658ee51da5a56580aa1370bf8174070/packages/client/src/settings/CSpellSettings.ts#L78 + .sort((a, b) => a.toLowerCase().localeCompare(b.toLowerCase())); +config.words = words; + +const removed = original.filter((word) => !words.includes(word)); +if (removed.length > 0) { + console.log( + `${removed.length} words removed: \n${removed + .map((word) => ` - ${word}`) + .join("\n")}` + ); +} +const added = words.filter((word) => !original.includes(word)); +if (added.length > 0) { + console.log( + `${added.length} words added: \n${added + .map((word) => ` - ${word}`) + .join("\n")}` + ); +} + +console.log("Updating words ..."); +await updateConfig(config); + +console.log("Running spellcheck with new words ..."); +await runSpellcheck({ execaOptions: { stdout: "inherit" } }); + +console.log("CSpell config file updated."); diff --git a/scripts/generate-changelog.mjs b/scripts/generate-changelog.mjs index 09d6d075c..8578dfd6d 100644 --- a/scripts/generate-changelog.mjs +++ b/scripts/generate-changelog.mjs @@ -18,34 +18,32 @@ import { CHANGELOG_CATEGORIES } from "./utils/changelog-categories.mjs"; const { __dirname } = createEsmUtils(import.meta); -(async () => { - const prNumberPrompt = new enquirer.NumberPrompt({ - message: "Input your Pull Request number:", - }); - const prNumber = await prNumberPrompt.run(); +const prNumberPrompt = new enquirer.NumberPrompt({ + message: "Input your Pull Request number:", +}); +const prNumber = await prNumberPrompt.run(); - const categoryPrompt = new enquirer.AutoComplete({ - message: "Input category of your Pull Request:", - limit: CHANGELOG_CATEGORIES.length, - // The array passed to `choices` will be broken, so copy it. - choices: [...CHANGELOG_CATEGORIES], - }); - const category = (await categoryPrompt.run()).trim(); +const categoryPrompt = new enquirer.AutoComplete({ + message: "Input category of your Pull Request:", + limit: CHANGELOG_CATEGORIES.length, + // The array passed to `choices` will be broken, so copy it. + choices: [...CHANGELOG_CATEGORIES], +}); +const category = (await categoryPrompt.run()).trim(); - if (!prNumber || !category) { - throw new Error("Two args are required."); - } - assertCategory(category); +if (!prNumber || !category) { + throw new Error("Two args are required."); +} +assertCategory(category); - const { title, user } = await getPr(prNumber); +const { title, user } = await getPr(prNumber); - const newChangelog = await createChangelog(title, user, prNumber, category); +const newChangelog = await createChangelog(title, user, prNumber, category); - const changelogPath = await addNewChangelog(prNumber, category, newChangelog); +const changelogPath = await addNewChangelog(prNumber, category, newChangelog); - const relativePath = path.relative(path.join(__dirname, ".."), changelogPath); - console.log("Generated changelog file: " + relativePath); -})(); +const relativePath = path.relative(path.join(__dirname, ".."), changelogPath); +console.log("Generated changelog file: " + relativePath); /** * @param {number} prNumber diff --git a/scripts/vendors/bundle-vendors.mjs b/scripts/vendors/bundle-vendors.mjs index 042c670f3..50d1c6872 100644 --- a/scripts/vendors/bundle-vendors.mjs +++ b/scripts/vendors/bundle-vendors.mjs @@ -124,4 +124,4 @@ async function main() { console.log("`README.md` file saved"); } -main(); +await main();