From 7f69c9899fee388776ca0763c26966dc7cbe748d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=94=AF=E7=84=B6?= Date: Tue, 16 Nov 2021 14:14:37 +0800 Subject: [PATCH] --wip-- [skip ci] --- packages/create-config/bin/create-config.js | 4 +- .../lib/init/config-initializer.js | 16 +-- packages/create-config/package.json | 13 +- .../config-initializer/lib/doubleQuotes.js | 1 + .../config-initializer/lib/no-semi.js | 1 + .../new-es-features/new-es-features.js | 3 + .../parse-error/parse-error.js | 1 + .../config-initializer/singleQuotes.js | 1 + .../config-initializer/tests/console-log.js | 1 + .../config-initializer/tests/doubleQuotes.js | 1 + .../tests/init/config-initializer.js | 128 +++++++++++------- 11 files changed, 111 insertions(+), 59 deletions(-) create mode 100644 packages/create-config/tests/fixtures/config-initializer/lib/doubleQuotes.js create mode 100644 packages/create-config/tests/fixtures/config-initializer/lib/no-semi.js create mode 100644 packages/create-config/tests/fixtures/config-initializer/new-es-features/new-es-features.js create mode 100644 packages/create-config/tests/fixtures/config-initializer/parse-error/parse-error.js create mode 100644 packages/create-config/tests/fixtures/config-initializer/singleQuotes.js create mode 100644 packages/create-config/tests/fixtures/config-initializer/tests/console-log.js create mode 100644 packages/create-config/tests/fixtures/config-initializer/tests/doubleQuotes.js diff --git a/packages/create-config/bin/create-config.js b/packages/create-config/bin/create-config.js index 640a1edec6b0..66ff533b5150 100644 --- a/packages/create-config/bin/create-config.js +++ b/packages/create-config/bin/create-config.js @@ -6,5 +6,5 @@ */ /* eslint no-console:off -- CLI */ -import init from "../lib/init/config-initializer.js"; -init.initializeConfig(); +import { initializeConfig } from "../lib/init/config-initializer.js"; +initializeConfig(); diff --git a/packages/create-config/lib/init/config-initializer.js b/packages/create-config/lib/init/config-initializer.js index fb007018d9e0..5323ed3f854a 100644 --- a/packages/create-config/lib/init/config-initializer.js +++ b/packages/create-config/lib/init/config-initializer.js @@ -14,11 +14,10 @@ import enquirer from "enquirer"; import semver from "semver"; import { Legacy } from "@eslint/eslintrc"; import { info } from "../shared/logging.js"; -import ModuleResolver from "../shared/relative-module-resolver.js"; import * as ConfigFile from "./config-file.js"; import * as npmUtils from "./npm-utils.js"; -const { ConfigOps, naming } = Legacy; +const { ConfigOps, naming, ModuleResolver } = Legacy; //------------------------------------------------------------------------------ // Private @@ -563,19 +562,20 @@ function promptUser() { }); } +/* istanbul ignore next */ +function initializeConfig(){ + return promptUser(); +} + //------------------------------------------------------------------------------ // Public Interface //------------------------------------------------------------------------------ -const init = { +export { getModulesList, hasESLintVersionConflict, installModules, processAnswers, writeFile, - /* istanbul ignore next */initializeConfig() { - return promptUser(); - } + initializeConfig, }; - -export default init; diff --git a/packages/create-config/package.json b/packages/create-config/package.json index cd1f58372a14..ed9d9b2a414d 100644 --- a/packages/create-config/package.json +++ b/packages/create-config/package.json @@ -45,12 +45,17 @@ }, "devDependencies": { "chai": "^4.3.4", - "eslint": "^8.1.0", + "eslint": "^8.2.0", + "eslint-config-airbnb": "^19.0.0", "eslint-config-eslint": "^7.0.0", + "eslint-config-google": "^0.14.0", "eslint-config-xo": "^0.39.0", + "eslint-plugin-import": "^2.25.3", "eslint-plugin-jsdoc": "^37.0.3", + "eslint-plugin-jsx-a11y": "^6.5.1", "eslint-plugin-node": "^11.1.0", - "eslint-plugin-react": "^7.26.1", + "eslint-plugin-react": "^7.27.0", + "eslint-plugin-react-hooks": "^4.3.0", "eslint-release": "^3.2.0", "espree": "^9.0.0", "fs-teardown": "^0.2.0", @@ -72,7 +77,9 @@ "extends": [ "eslint" ], - "parserOptions": {"ecmaVersion": "latest"}, + "parserOptions": { + "ecmaVersion": "latest" + }, "rules": { "node/no-unpublished-require": [ "error", diff --git a/packages/create-config/tests/fixtures/config-initializer/lib/doubleQuotes.js b/packages/create-config/tests/fixtures/config-initializer/lib/doubleQuotes.js new file mode 100644 index 000000000000..1cd4a2abbe20 --- /dev/null +++ b/packages/create-config/tests/fixtures/config-initializer/lib/doubleQuotes.js @@ -0,0 +1 @@ +var foo = "doubleQuotes"; diff --git a/packages/create-config/tests/fixtures/config-initializer/lib/no-semi.js b/packages/create-config/tests/fixtures/config-initializer/lib/no-semi.js new file mode 100644 index 000000000000..bf10b1cfd192 --- /dev/null +++ b/packages/create-config/tests/fixtures/config-initializer/lib/no-semi.js @@ -0,0 +1 @@ +var name = "ESLint" diff --git a/packages/create-config/tests/fixtures/config-initializer/new-es-features/new-es-features.js b/packages/create-config/tests/fixtures/config-initializer/new-es-features/new-es-features.js new file mode 100644 index 000000000000..c3e03fc32ca3 --- /dev/null +++ b/packages/create-config/tests/fixtures/config-initializer/new-es-features/new-es-features.js @@ -0,0 +1,3 @@ +async function fn() { + await Promise.resolve(); +} diff --git a/packages/create-config/tests/fixtures/config-initializer/parse-error/parse-error.js b/packages/create-config/tests/fixtures/config-initializer/parse-error/parse-error.js new file mode 100644 index 000000000000..90bd920ceff5 --- /dev/null +++ b/packages/create-config/tests/fixtures/config-initializer/parse-error/parse-error.js @@ -0,0 +1 @@ ++; diff --git a/packages/create-config/tests/fixtures/config-initializer/singleQuotes.js b/packages/create-config/tests/fixtures/config-initializer/singleQuotes.js new file mode 100644 index 000000000000..db1e01feda6b --- /dev/null +++ b/packages/create-config/tests/fixtures/config-initializer/singleQuotes.js @@ -0,0 +1 @@ +var foo = 'singleQuotes'; diff --git a/packages/create-config/tests/fixtures/config-initializer/tests/console-log.js b/packages/create-config/tests/fixtures/config-initializer/tests/console-log.js new file mode 100644 index 000000000000..929e82a146d2 --- /dev/null +++ b/packages/create-config/tests/fixtures/config-initializer/tests/console-log.js @@ -0,0 +1 @@ +console.log("I'm a log"); diff --git a/packages/create-config/tests/fixtures/config-initializer/tests/doubleQuotes.js b/packages/create-config/tests/fixtures/config-initializer/tests/doubleQuotes.js new file mode 100644 index 000000000000..1cd4a2abbe20 --- /dev/null +++ b/packages/create-config/tests/fixtures/config-initializer/tests/doubleQuotes.js @@ -0,0 +1 @@ +var foo = "doubleQuotes"; diff --git a/packages/create-config/tests/init/config-initializer.js b/packages/create-config/tests/init/config-initializer.js index f0b6a328ca12..2f376f8e3c20 100644 --- a/packages/create-config/tests/init/config-initializer.js +++ b/packages/create-config/tests/init/config-initializer.js @@ -15,7 +15,9 @@ import os from "os"; import sinon from "sinon"; import sh from "shelljs"; import * as npmUtils from "../../lib/init/npm-utils.js"; +import * as log from "../../lib/shared/logging.js"; import proxyquireMod from "proxyquire"; +import { Legacy, FlatCompat } from "@eslint/eslintrc"; const originalDir = process.cwd(); const { assert } = chai; @@ -29,8 +31,7 @@ let answers = {}; let pkgJSONContents = {}; let pkgJSONPath = ""; -// TODO: make the tests passing -describe.skip("configInitializer", () => { +describe("configInitializer", () => { let fixtureDir; let npmCheckStub; @@ -39,25 +40,6 @@ describe.skip("configInitializer", () => { let init; let localESLintVersion = null; - const log = { - info: sinon.spy(), - error: sinon.spy() - }; - const requireStubs = { - "../shared/logging": log, - "../shared/relative-module-resolver": { - resolve() { - if (localESLintVersion) { - return `local-eslint-${localESLintVersion}`; - } - throw new Error("Cannot find module"); - } - }, - "local-eslint-3.18.0": { linter: { version: "3.18.0" }, "@noCallThru": true }, - "local-eslint-3.19.0": { linter: { version: "3.19.0" }, "@noCallThru": true }, - "local-eslint-4.0.0": { linter: { version: "4.0.0" }, "@noCallThru": true } - }; - // copy into clean area so as not to get "infected" by this project's .eslintrc files before(() => { fixtureDir = path.join(os.tmpdir(), "eslint/fixtures/config-initializer"); @@ -66,31 +48,84 @@ describe.skip("configInitializer", () => { fixtureDir = fs.realpathSync(fixtureDir); }); - beforeEach(() => { - npmInstallStub = sinon.stub(npmUtils, "installSyncSaveDev"); - npmCheckStub = sinon.stub(npmUtils, "checkDevDeps").callsFake(packages => packages.reduce((status, pkg) => { - status[pkg] = false; - return status; - }, {})); - npmFetchPeerDependenciesStub = sinon - .stub(npmUtils, "fetchPeerDependencies") - .returns({ + beforeEach(async () => { + td.replaceEsm("../../lib/init/npm-utils.js", { + ...npmUtils, + checkDevDeps: packages => packages.reduce((status, pkg) => { + status[pkg] = false; + return status; + }, {}), + fetchPeerDependencies: () => ({ eslint: "^3.19.0", "eslint-plugin-jsx-a11y": "^5.0.1", "eslint-plugin-import": "^2.2.0", "eslint-plugin-react": "^7.0.1" - }); - init = proxyquire("../../lib/init/config-initializer", requireStubs); - }); + }) + }); - afterEach(() => { - log.info.resetHistory(); - log.error.resetHistory(); - npmInstallStub.restore(); - npmCheckStub.restore(); - npmFetchPeerDependenciesStub.restore(); + td.replaceEsm("@eslint/eslintrc", { + FlatCompat, + Legacy: { + ...Legacy, + ModuleResolver: { + resolve: () => { + if (localESLintVersion) { + return `local-eslint-${localESLintVersion}`; + } + throw new Error("Cannot find module"); + } + } + } + }) + // td.replace(npmUtils, "checkDevDeps", + // packages => packages.reduce((status, pkg) => { + // status[pkg] = false; + // return status; + // }, {}) + // ); + // td.when(npmUtils.fetchPeerDependencies(td.matchers.anything())).thenReturn({ + // eslint: "^3.19.0", + // "eslint-plugin-jsx-a11y": "^5.0.1", + // "eslint-plugin-import": "^2.2.0", + // "eslint-plugin-react": "^7.0.1" + // }); + // td.replace(Legacy, "ModuleResolver", { + // resolve: function () { + // if (localESLintVersion) { + // return `local-eslint-${localESLintVersion}`; + // } + // throw new Error("Cannot find module"); + // } + // }); + td.replace("local-eslint-3.18.0", {linter: { version: "3.18.0" }, "@noCallThru": true }); + td.replace("local-eslint-3.19.0", {linter: { version: "3.19.0" }, "@noCallThru": true }); + td.replace("local-eslint-4.0.0", {linter: { version: "4.0.0" }, "@noCallThru": true }); + init = await import("../../lib/init/npm-utils.js"); + // td.when(Legacy.ModuleResolver.resolve("local-eslint-3.18.0")).thenReturn({ linter: { version: "3.18.0" }, "@noCallThru": true }); + // td.when(Legacy.ModuleResolver.resolve("local-eslint-3.19.0")).thenReturn({ linter: { version: "3.19.0" }, "@noCallThru": true }); + // td.when(Legacy.ModuleResolver.resolve("local-eslint-4.0.0")).thenReturn({ linter: { version: "4.0.0" }, "@noCallThru": true }); + // npmInstallStub = sinon.stub(npmUtils, "installSyncSaveDev"); + // npmCheckStub = sinon.stub(npmUtils, "checkDevDeps").callsFake(packages => packages.reduce((status, pkg) => { + // status[pkg] = false; + // return status; + // }, {})); + // npmFetchPeerDependenciesStub = sinon + // .stub(npmUtils, "fetchPeerDependencies") + // .returns({ + // eslint: "^3.19.0", + // "eslint-plugin-jsx-a11y": "^5.0.1", + // "eslint-plugin-import": "^2.2.0", + // "eslint-plugin-react": "^7.0.1" + // }); + init = await import ("../../lib/init/config-initializer.js"); }); + // afterEach(() => { + // npmInstallStub.restore(); + // npmCheckStub.restore(); + // npmFetchPeerDependenciesStub.restore(); + // }); + after(() => { sh.rm("-r", fixtureDir); }); @@ -193,7 +228,8 @@ describe.skip("configInitializer", () => { }); }); - describe("guide", () => { + + describe.skip("guide", () => { it("should support the google style guide", () => { const config = { extends: "google" }; const modules = init.getModulesList(config); @@ -387,13 +423,13 @@ describe.skip("configInitializer", () => { process.chdir(originalDir); }); - it("should create .eslintrc.json", () => { + it("should create .eslintrc.json", async () => { const config = init.processAnswers(answers); const filePath = path.resolve(fixtureDir, ".eslintrc.json"); fs.writeFileSync(pkgJSONPath, JSON.stringify(pkgJSONContents)); - init.writeFile(config, answers.format); + await init.writeFile(config, answers.format); assert.isTrue(fs.existsSync(filePath)); @@ -417,7 +453,7 @@ describe.skip("configInitializer", () => { fs.unlinkSync(pkgJSONPath); }); - it("should create .eslintrc.yml", () => { + it("should create .eslintrc.yml", async () => { answers.format = "YAML"; const config = init.processAnswers(answers); @@ -425,7 +461,7 @@ describe.skip("configInitializer", () => { fs.writeFileSync(pkgJSONPath, JSON.stringify(pkgJSONContents)); - init.writeFile(config, answers.format); + await init.writeFile(config, answers.format); assert.isTrue(fs.existsSync(filePath)); @@ -453,7 +489,7 @@ describe.skip("configInitializer", () => { fs.unlinkSync(pkgJSONPath); }); - it("should create .eslintrc.json even with type: 'module'", () => { + it("should create .eslintrc.json even with type: 'module'", async () => { answers.format = "JSON"; // create package.json with "type": "module" @@ -464,7 +500,7 @@ describe.skip("configInitializer", () => { const config = init.processAnswers(answers); const filePath = path.resolve(fixtureDir, ".eslintrc.json"); - init.writeFile(config, answers.format); + await init.writeFile(config, answers.format); assert.isTrue(fs.existsSync(filePath));