diff --git a/.changeset/ten-pets-pay.md b/.changeset/ten-pets-pay.md new file mode 100644 index 00000000..75830a88 --- /dev/null +++ b/.changeset/ten-pets-pay.md @@ -0,0 +1,14 @@ +--- +'@cloudfour/eslint-plugin': major +--- + +Sort imports + +**Newly Enabled Rules** + +- [`@cloudfour/import/order`](https://github.com/import-js/eslint-plugin-import/blob/v2.25.4/docs/rules/order.md) +- [`sort-imports`](https://eslint.org/docs/rules/sort-imports) + +These rules sort imports into separate categories, with empty lines between the categories, and with the imports within a category sorted alphabetically. The variable bindings within an import statement are also sorted alphabetically. + +These rules are auto-fixable, however in some cases manual sorting may be needed. Occasionally, the auto-fix will detach comments from the import statements they refer to. diff --git a/build.js b/build.js index 46cafdb5..9be7e917 100644 --- a/build.js +++ b/build.js @@ -1,7 +1,8 @@ -const prettier = require('prettier'); const { writeFileSync } = require('fs'); const { join, sep } = require('path'); +const prettier = require('prettier'); + const { configs, environments } = require('./src/config'); const resolveStart = '__REQUIRE_RESOLVE__'; diff --git a/fixtures/babel/packages/babel-helper-create-class-features-plugin/src/decorators.js b/fixtures/babel/packages/babel-helper-create-class-features-plugin/src/decorators.js index 8cbddd8f..007f9769 100644 --- a/fixtures/babel/packages/babel-helper-create-class-features-plugin/src/decorators.js +++ b/fixtures/babel/packages/babel-helper-create-class-features-plugin/src/decorators.js @@ -1,6 +1,6 @@ import { types as t, template } from '@babel/core'; -import ReplaceSupers from '@babel/helper-replace-supers'; import nameFunction from '@babel/helper-function-name'; +import ReplaceSupers from '@babel/helper-replace-supers'; export function hasOwnDecorators(node) { return Boolean(node.decorators && node.decorators.length > 0); diff --git a/fixtures/babel/packages/babel-helper-create-class-features-plugin/src/fields.js b/fixtures/babel/packages/babel-helper-create-class-features-plugin/src/fields.js index b1faa4be..e5008ec5 100644 --- a/fixtures/babel/packages/babel-helper-create-class-features-plugin/src/fields.js +++ b/fixtures/babel/packages/babel-helper-create-class-features-plugin/src/fields.js @@ -1,10 +1,10 @@ /* eslint-disable max-params */ -import { template, traverse, types as t } from '@babel/core'; +import { types as t, template, traverse } from '@babel/core'; +import memberExpressionToFunctions from '@babel/helper-member-expression-to-functions'; +import optimiseCall from '@babel/helper-optimise-call-expression'; import ReplaceSupers, { environmentVisitor, } from '@babel/helper-replace-supers'; -import memberExpressionToFunctions from '@babel/helper-member-expression-to-functions'; -import optimiseCall from '@babel/helper-optimise-call-expression'; import * as ts from './typescript'; diff --git a/fixtures/babel/packages/babel-plugin-transform-for-of/src/index.js b/fixtures/babel/packages/babel-plugin-transform-for-of/src/index.js index b8d38c46..73de81b9 100644 --- a/fixtures/babel/packages/babel-plugin-transform-for-of/src/index.js +++ b/fixtures/babel/packages/babel-plugin-transform-for-of/src/index.js @@ -1,5 +1,5 @@ +import { types as t, template } from '@babel/core'; import { declare } from '@babel/helper-plugin-utils'; -import { template, types as t } from '@babel/core'; import transformWithoutHelper from './no-helper-implementation'; diff --git a/fixtures/babel/packages/babel-plugin-transform-modules-amd/src/index.js b/fixtures/babel/packages/babel-plugin-transform-modules-amd/src/index.js index 62ac17e3..b72af387 100644 --- a/fixtures/babel/packages/babel-plugin-transform-modules-amd/src/index.js +++ b/fixtures/babel/packages/babel-plugin-transform-modules-amd/src/index.js @@ -1,15 +1,15 @@ -import { declare } from '@babel/helper-plugin-utils'; +import { types as t, template } from '@babel/core'; import { - isModule, - rewriteModuleStatementsAndPrepareHeader, - hasExports, - isSideEffectImport, buildNamespaceInitStatements, ensureStatementsHoisted, - wrapInterop, getModuleName, + hasExports, + isModule, + isSideEffectImport, + rewriteModuleStatementsAndPrepareHeader, + wrapInterop, } from '@babel/helper-module-transforms'; -import { template, types as t } from '@babel/core'; +import { declare } from '@babel/helper-plugin-utils'; import { getImportSource } from 'babel-plugin-dynamic-import-node/utils'; const buildWrapper = template(` diff --git a/fixtures/babel/packages/babel-plugin-transform-modules-commonjs/src/index.js b/fixtures/babel/packages/babel-plugin-transform-modules-commonjs/src/index.js index 53d18f24..db2bb9fb 100644 --- a/fixtures/babel/packages/babel-plugin-transform-modules-commonjs/src/index.js +++ b/fixtures/babel/packages/babel-plugin-transform-modules-commonjs/src/index.js @@ -1,16 +1,15 @@ -import { declare } from '@babel/helper-plugin-utils'; +import { types as t, template } from '@babel/core'; import { - isModule, - rewriteModuleStatementsAndPrepareHeader, - isSideEffectImport, buildNamespaceInitStatements, ensureStatementsHoisted, - wrapInterop, getModuleName, + isModule, + isSideEffectImport, + rewriteModuleStatementsAndPrepareHeader, + wrapInterop, } from '@babel/helper-module-transforms'; +import { declare } from '@babel/helper-plugin-utils'; import simplifyAccess from '@babel/helper-simple-access'; -import { template, types as t } from '@babel/core'; - import { createDynamicImportTransform } from 'babel-plugin-dynamic-import-node/utils'; export default declare((api, options) => { diff --git a/fixtures/babel/packages/babel-plugin-transform-parameters/src/params.js b/fixtures/babel/packages/babel-plugin-transform-parameters/src/params.js index e890920e..bed11db8 100644 --- a/fixtures/babel/packages/babel-plugin-transform-parameters/src/params.js +++ b/fixtures/babel/packages/babel-plugin-transform-parameters/src/params.js @@ -1,4 +1,4 @@ -import { template, types as t } from '@babel/core'; +import { types as t, template } from '@babel/core'; const buildDefaultParam = template(` let VARIABLE_NAME = diff --git a/fixtures/babel/packages/babel-plugin-transform-runtime/scripts/build-dist.js b/fixtures/babel/packages/babel-plugin-transform-runtime/scripts/build-dist.js index 0b3d2473..72f22cfa 100644 --- a/fixtures/babel/packages/babel-plugin-transform-runtime/scripts/build-dist.js +++ b/fixtures/babel/packages/babel-plugin-transform-runtime/scripts/build-dist.js @@ -1,15 +1,15 @@ 'use strict'; const path = require('path'); -const outputFile = require('output-file-sync'); -const helpers = require('@babel/helpers'); + const babel = require('@babel/core'); +const helpers = require('@babel/helpers'); +const runtimeVersion = require('@babel/runtime/package.json').version; const template = require('@babel/template'); const t = require('@babel/types'); +const outputFile = require('output-file-sync'); const transformRuntime = require('..'); - -const runtimeVersion = require('@babel/runtime/package.json').version; const corejs2Definitions = require('../lib/runtime-corejs2-definitions').default(); const corejs3Definitions = diff --git a/fixtures/cloudfour.com-patterns/gulpfile.js/tasks/svg-to-twig.js b/fixtures/cloudfour.com-patterns/gulpfile.js/tasks/svg-to-twig.js index f1d05972..e89ec6f4 100644 --- a/fixtures/cloudfour.com-patterns/gulpfile.js/tasks/svg-to-twig.js +++ b/fixtures/cloudfour.com-patterns/gulpfile.js/tasks/svg-to-twig.js @@ -1,11 +1,12 @@ +const { readFileSync } = require('fs'); +const path = require('path'); + const { src, dest } = require('gulp'); -const svgmin = require('gulp-svgmin'); const rename = require('gulp-rename'); -const { obj } = require('through2'); -const ltx = require('ltx'); +const svgmin = require('gulp-svgmin'); const yaml = require('js-yaml'); -const path = require('path'); -const { readFileSync } = require('fs'); +const ltx = require('ltx'); +const { obj } = require('through2'); // Load SVGO preferences from config file to keep things DRY const svgoPath = path.join(__dirname, '../../.svgo.yml'); diff --git a/fixtures/cloudfour.com-patterns/gulpfile.js/theo-formats/stories.mdx.js b/fixtures/cloudfour.com-patterns/gulpfile.js/theo-formats/stories.mdx.js index 57ffa35c..394dbbd4 100644 --- a/fixtures/cloudfour.com-patterns/gulpfile.js/theo-formats/stories.mdx.js +++ b/fixtures/cloudfour.com-patterns/gulpfile.js/theo-formats/stories.mdx.js @@ -1,7 +1,8 @@ +const { basename, extname } = require('path'); + const groupBy = require('lodash/groupBy'); const kebabCase = require('lodash/kebabCase'); const startCase = require('lodash/startCase'); -const { basename, extname } = require('path'); /** * Return a string containing Storybook Docs MDX markup for a color. diff --git a/fixtures/dom-testing-library/src/queries/role.js b/fixtures/dom-testing-library/src/queries/role.js index 231f4143..3fbbb072 100644 --- a/fixtures/dom-testing-library/src/queries/role.js +++ b/fixtures/dom-testing-library/src/queries/role.js @@ -1,10 +1,12 @@ import { computeAccessibleName } from 'dom-accessibility-api'; + import { getImplicitAriaRoles, - prettyRoles, isInaccessible, isSubtreeInaccessible, + prettyRoles, } from '../role-helpers'; + import { buildQueries, fuzzyMatches, diff --git a/fixtures/dom-testing-library/src/queries/text.js b/fixtures/dom-testing-library/src/queries/text.js index cf166e0a..df7e075e 100644 --- a/fixtures/dom-testing-library/src/queries/text.js +++ b/fixtures/dom-testing-library/src/queries/text.js @@ -1,9 +1,9 @@ import { + buildQueries, fuzzyMatches, - matches, - makeNormalizer, getNodeText, - buildQueries, + makeNormalizer, + matches, } from './all-utils'; function queryAllByText( diff --git a/fixtures/dom-testing-library/src/query-helpers.js b/fixtures/dom-testing-library/src/query-helpers.js index 6f9e3a55..a96d1bb5 100644 --- a/fixtures/dom-testing-library/src/query-helpers.js +++ b/fixtures/dom-testing-library/src/query-helpers.js @@ -1,6 +1,6 @@ -import { fuzzyMatches, matches, makeNormalizer } from './matches'; -import { waitFor } from './wait-for'; import { getConfig } from './config'; +import { fuzzyMatches, makeNormalizer, matches } from './matches'; +import { waitFor } from './wait-for'; function getMultipleElementsFoundError(message, container) { return getConfig().getElementError( diff --git a/fixtures/dom-testing-library/src/wait-for-dom-change.js b/fixtures/dom-testing-library/src/wait-for-dom-change.js index 781dbd4a..cb80a8ea 100644 --- a/fixtures/dom-testing-library/src/wait-for-dom-change.js +++ b/fixtures/dom-testing-library/src/wait-for-dom-change.js @@ -1,12 +1,12 @@ +import { getConfig } from './config'; import { - getWindowFromNode, + clearTimeout, getDocument, + getWindowFromNode, + runWithRealTimers, setImmediate, setTimeout, - clearTimeout, - runWithRealTimers, } from './helpers'; -import { getConfig } from './config'; let hasWarned = false; diff --git a/fixtures/downshift/src/hooks/useCombobox/reducer.js b/fixtures/downshift/src/hooks/useCombobox/reducer.js index cfc267f3..4559dbe8 100644 --- a/fixtures/downshift/src/hooks/useCombobox/reducer.js +++ b/fixtures/downshift/src/hooks/useCombobox/reducer.js @@ -1,5 +1,6 @@ -import { getHighlightedIndexOnOpen, getDefaultValue } from '../utils.js'; -import { getNextWrappingIndex, getNextNonDisabledIndex } from '../../utils'; +import { getNextNonDisabledIndex, getNextWrappingIndex } from '../../utils'; +import { getDefaultValue, getHighlightedIndexOnOpen } from '../utils.js'; + import * as stateChangeTypes from './stateChangeTypes'; /* eslint-disable complexity */ diff --git a/fixtures/downshift/src/hooks/useCombobox/utils.js b/fixtures/downshift/src/hooks/useCombobox/utils.js index 32ea4e79..a9dd040a 100644 --- a/fixtures/downshift/src/hooks/useCombobox/utils.js +++ b/fixtures/downshift/src/hooks/useCombobox/utils.js @@ -1,8 +1,9 @@ import PropTypes from 'prop-types'; + import { generateId, getA11yStatusMessage } from '../../utils'; import { - getElementIds as getElementIdsCommon, defaultProps as defaultPropsCommon, + getElementIds as getElementIdsCommon, getInitialState as getInitialStateCommon, } from '../utils.js'; diff --git a/fixtures/downshift/src/hooks/useSelect/reducer.js b/fixtures/downshift/src/hooks/useSelect/reducer.js index 35054833..845162ab 100644 --- a/fixtures/downshift/src/hooks/useSelect/reducer.js +++ b/fixtures/downshift/src/hooks/useSelect/reducer.js @@ -1,7 +1,8 @@ -import { getNextWrappingIndex, getNextNonDisabledIndex } from '../../utils'; -import { getHighlightedIndexOnOpen, getDefaultValue } from '../utils.js'; -import { getItemIndexByCharacterKey } from './utils.js'; +import { getNextNonDisabledIndex, getNextWrappingIndex } from '../../utils'; +import { getDefaultValue, getHighlightedIndexOnOpen } from '../utils.js'; + import * as stateChangeTypes from './stateChangeTypes'; +import { getItemIndexByCharacterKey } from './utils.js'; /* eslint-disable complexity */ export default function downshiftSelectReducer(state, action) { diff --git a/fixtures/downshift/src/hooks/useSelect/utils.js b/fixtures/downshift/src/hooks/useSelect/utils.js index 39c50127..83fa632a 100644 --- a/fixtures/downshift/src/hooks/useSelect/utils.js +++ b/fixtures/downshift/src/hooks/useSelect/utils.js @@ -1,4 +1,5 @@ import PropTypes from 'prop-types'; + import { defaultProps as commonDefaultProps } from '../utils.js'; // eslint-disable-next-line max-params diff --git a/fixtures/downshift/src/hooks/utils.js b/fixtures/downshift/src/hooks/utils.js index 5962d0fb..1b182a07 100644 --- a/fixtures/downshift/src/hooks/utils.js +++ b/fixtures/downshift/src/hooks/utils.js @@ -1,10 +1,11 @@ import PropTypes from 'prop-types'; import { useCallback, useReducer } from 'react'; + import { - scrollIntoView, + generateId, getNextWrappingIndex, getState, - generateId, + scrollIntoView, } from '../utils'; const defaultStateValues = { diff --git a/fixtures/eslint/lib/cli-engine/cascading-config-array-factory.js b/fixtures/eslint/lib/cli-engine/cascading-config-array-factory.js index 9b49dece..5beb3e08 100644 --- a/fixtures/eslint/lib/cli-engine/cascading-config-array-factory.js +++ b/fixtures/eslint/lib/cli-engine/cascading-config-array-factory.js @@ -24,16 +24,19 @@ const os = require('os'); const path = require('path'); + +const debug = require('debug')('eslint:cascading-config-array-factory'); + const { validateConfigArray } = require('../shared/config-validator'); const { emitDeprecationWarning } = require('../shared/deprecation-warnings'); -const { ConfigArrayFactory } = require('./config-array-factory'); + const { ConfigArray, ConfigDependency, IgnorePattern, } = require('./config-array'); +const { ConfigArrayFactory } = require('./config-array-factory'); const loadRules = require('./load-rules'); -const debug = require('debug')('eslint:cascading-config-array-factory'); // ------------------------------------------------------------------------------ // Helpers diff --git a/fixtures/eslint/lib/cli-engine/config-array-factory.js b/fixtures/eslint/lib/cli-engine/config-array-factory.js index 0d8049e3..8403e700 100644 --- a/fixtures/eslint/lib/cli-engine/config-array-factory.js +++ b/fixtures/eslint/lib/cli-engine/config-array-factory.js @@ -40,18 +40,21 @@ const fs = require('fs'); const path = require('path'); + +const debug = require('debug')('eslint:config-array-factory'); const importFresh = require('import-fresh'); const stripComments = require('strip-json-comments'); + const { validateConfigSchema } = require('../shared/config-validator'); const naming = require('../shared/naming'); const ModuleResolver = require('../shared/relative-module-resolver'); + const { ConfigArray, ConfigDependency, IgnorePattern, OverrideTester, } = require('./config-array'); -const debug = require('debug')('eslint:config-array-factory'); // ------------------------------------------------------------------------------ // Helpers diff --git a/fixtures/eslint/lib/cli-engine/config-array/ignore-pattern.js b/fixtures/eslint/lib/cli-engine/config-array/ignore-pattern.js index 838beff7..2b39ddf0 100644 --- a/fixtures/eslint/lib/cli-engine/config-array/ignore-pattern.js +++ b/fixtures/eslint/lib/cli-engine/config-array/ignore-pattern.js @@ -34,8 +34,9 @@ const assert = require('assert'); const path = require('path'); -const ignore = require('ignore'); + const debug = require('debug')('eslint:ignore-pattern'); +const ignore = require('ignore'); /** @typedef {ReturnType} Ignore */ diff --git a/fixtures/eslint/lib/cli-engine/file-enumerator.js b/fixtures/eslint/lib/cli-engine/file-enumerator.js index 35630b28..925c2834 100644 --- a/fixtures/eslint/lib/cli-engine/file-enumerator.js +++ b/fixtures/eslint/lib/cli-engine/file-enumerator.js @@ -34,15 +34,17 @@ const fs = require('fs'); const path = require('path'); + +const debug = require('debug')('eslint:file-enumerator'); const getGlobParent = require('glob-parent'); const isGlob = require('is-glob'); const { escapeRegExp } = require('lodash'); const { Minimatch } = require('minimatch'); -const { IgnorePattern } = require('./config-array'); + const { CascadingConfigArrayFactory, } = require('./cascading-config-array-factory'); -const debug = require('debug')('eslint:file-enumerator'); +const { IgnorePattern } = require('./config-array'); // ------------------------------------------------------------------------------ // Helpers diff --git a/fixtures/eslint/lib/init/config-initializer.js b/fixtures/eslint/lib/init/config-initializer.js index 3ad02d4f..d227dc8e 100644 --- a/fixtures/eslint/lib/init/config-initializer.js +++ b/fixtures/eslint/lib/init/config-initializer.js @@ -9,23 +9,25 @@ // Requirements // ------------------------------------------------------------------------------ -const util = require('util'); const path = require('path'); +const util = require('util'); + +const debug = require('debug')('eslint:config-initializer'); const inquirer = require('inquirer'); const ProgressBar = require('progress'); const semver = require('semver'); + const recConfig = require('../../conf/eslint-recommended'); const ConfigOps = require('../shared/config-ops'); const log = require('../shared/logging'); const naming = require('../shared/naming'); const ModuleResolver = require('../shared/relative-module-resolver'); + const autoconfig = require('./autoconfig.js'); const ConfigFile = require('./config-file'); const npmUtils = require('./npm-utils'); const { getSourceCodeOfFiles } = require('./source-code-utils'); -const debug = require('debug')('eslint:config-initializer'); - // ------------------------------------------------------------------------------ // Private // ------------------------------------------------------------------------------ diff --git a/fixtures/eslint/lib/linter/linter.js b/fixtures/eslint/lib/linter/linter.js index 70761031..3ccd9000 100644 --- a/fixtures/eslint/lib/linter/linter.js +++ b/fixtures/eslint/lib/linter/linter.js @@ -11,19 +11,24 @@ // ------------------------------------------------------------------------------ const path = require('path'); + +const debug = require('debug')('eslint:linter'); const eslintScope = require('eslint-scope'); const evk = require('eslint-visitor-keys'); const espree = require('espree'); const lodash = require('lodash'); + const BuiltInEnvironments = require('../../conf/environments'); +const ruleReplacements = require('../../conf/replacements.json'); const pkg = require('../../package.json'); const astUtils = require('../shared/ast-utils'); const ConfigOps = require('../shared/config-ops'); const validator = require('../shared/config-validator'); const Traverser = require('../shared/traverser'); const { SourceCode } = require('../source-code'); -const CodePathAnalyzer = require('./code-path-analysis/code-path-analyzer'); + const applyDisableDirectives = require('./apply-disable-directives'); +const CodePathAnalyzer = require('./code-path-analysis/code-path-analyzer'); const ConfigCommentParser = require('./config-comment-parser'); const NodeEventGenerator = require('./node-event-generator'); const createReportTranslator = require('./report-translator'); @@ -31,9 +36,7 @@ const Rules = require('./rules'); const createEmitter = require('./safe-emitter'); const SourceCodeFixer = require('./source-code-fixer'); const timing = require('./timing'); -const ruleReplacements = require('../../conf/replacements.json'); -const debug = require('debug')('eslint:linter'); const MAX_AUTOFIX_PASSES = 10; const DEFAULT_PARSER_NAME = 'espree'; const commentParser = new ConfigCommentParser(); diff --git a/fixtures/eslint/lib/rules/utils/ast-utils.js b/fixtures/eslint/lib/rules/utils/ast-utils.js index 583272ee..2b5d66da 100644 --- a/fixtures/eslint/lib/rules/utils/ast-utils.js +++ b/fixtures/eslint/lib/rules/utils/ast-utils.js @@ -9,9 +9,10 @@ // Requirements // ------------------------------------------------------------------------------ -const esutils = require('esutils'); const espree = require('espree'); +const esutils = require('esutils'); const lodash = require('lodash'); + const { breakableTypePattern, createGlobalLinebreakMatcher, diff --git a/fixtures/eslint/lib/source-code/source-code.js b/fixtures/eslint/lib/source-code/source-code.js index 89686830..f27e70aa 100644 --- a/fixtures/eslint/lib/source-code/source-code.js +++ b/fixtures/eslint/lib/source-code/source-code.js @@ -9,10 +9,12 @@ // ------------------------------------------------------------------------------ const { isCommentToken } = require('eslint-utils'); -const TokenStore = require('./token-store'); +const lodash = require('lodash'); + const astUtils = require('../shared/ast-utils'); const Traverser = require('../shared/traverser'); -const lodash = require('lodash'); + +const TokenStore = require('./token-store'); // ------------------------------------------------------------------------------ // Private diff --git a/fixtures/eslint/tools/code-sample-minimizer.js b/fixtures/eslint/tools/code-sample-minimizer.js index d8cb30ea..fda9b27a 100644 --- a/fixtures/eslint/tools/code-sample-minimizer.js +++ b/fixtures/eslint/tools/code-sample-minimizer.js @@ -1,9 +1,10 @@ 'use strict'; +const assert = require('assert'); + const evk = require('eslint-visitor-keys'); -const recast = require('recast'); const espree = require('espree'); -const assert = require('assert'); +const recast = require('recast'); /** * Determines whether an AST node could be an expression, based on the type diff --git a/fixtures/load-repo.js b/fixtures/load-repo.js index 14df7d8c..b26d7df9 100755 --- a/fixtures/load-repo.js +++ b/fixtures/load-repo.js @@ -1,16 +1,18 @@ #!/usr/bin/env node -const kleur = require('kleur'); -const path = require('path'); + const { spawn } = require('child_process'); -const mkdir = require('mkdirplz'); -const rm = require('eliminate'); -const walk = require('powerwalker'); -const { promisify } = require('util'); const { readFile, writeFile, existsSync } = require('fs'); +const path = require('path'); +const { promisify } = require('util'); + const readFileAsync = promisify(readFile); const writeFileAsync = promisify(writeFile); const babel = require('@babel/core'); +const rm = require('eliminate'); const CLIEngine = require('eslint').CLIEngine; +const kleur = require('kleur'); +const mkdir = require('mkdirplz'); +const walk = require('powerwalker'); const prettier = require('prettier'); const prompts = require('prompts'); diff --git a/fixtures/mocha/karma.conf.js b/fixtures/mocha/karma.conf.js index a6afb862..b317099d 100644 --- a/fixtures/mocha/karma.conf.js +++ b/fixtures/mocha/karma.conf.js @@ -1,8 +1,8 @@ 'use strict'; const fs = require('fs'); -const path = require('path'); const os = require('os'); +const path = require('path'); const baseBundleDirpath = path.join(__dirname, '.karma'); const hostname = os.hostname(); diff --git a/fixtures/mocha/lib/cli/one-and-dones.js b/fixtures/mocha/lib/cli/one-and-dones.js index 06412dff..7e3f8ddb 100644 --- a/fixtures/mocha/lib/cli/one-and-dones.js +++ b/fixtures/mocha/lib/cli/one-and-dones.js @@ -9,6 +9,7 @@ */ const align = require('wide-align'); + const Mocha = require('../mocha'); /** diff --git a/fixtures/mocha/lib/cli/options.js b/fixtures/mocha/lib/cli/options.js index cdf0251f..97f78c76 100644 --- a/fixtures/mocha/lib/cli/options.js +++ b/fixtures/mocha/lib/cli/options.js @@ -7,16 +7,19 @@ */ const fs = require('fs'); + const ansi = require('ansi-colors'); +const debug = require('debug')('mocha:cli:options'); +const findUp = require('find-up'); const yargsParser = require('yargs-parser'); -const { types, aliases } = require('./run-option-metadata'); -const { ONE_AND_DONE_ARGS } = require('./one-and-dones'); + const mocharc = require('../mocharc.json'); -const { list } = require('./run-helpers'); + const { loadConfig, findConfig } = require('./config'); -const findUp = require('find-up'); -const debug = require('debug')('mocha:cli:options'); const { isNodeFlag } = require('./node-flags'); +const { ONE_AND_DONE_ARGS } = require('./one-and-dones'); +const { list } = require('./run-helpers'); +const { types, aliases } = require('./run-option-metadata'); /** * The `yargs-parser` namespace diff --git a/fixtures/mocha/lib/growl.js b/fixtures/mocha/lib/growl.js index 918723dd..26089707 100644 --- a/fixtures/mocha/lib/growl.js +++ b/fixtures/mocha/lib/growl.js @@ -7,7 +7,9 @@ const os = require('os'); const path = require('path'); + const { sync: which } = require('which'); + const { EVENT_RUN_END } = require('./runner').constants; /** diff --git a/fixtures/mocha/lib/interfaces/common.js b/fixtures/mocha/lib/interfaces/common.js index 96e471d9..b2b04ccf 100644 --- a/fixtures/mocha/lib/interfaces/common.js +++ b/fixtures/mocha/lib/interfaces/common.js @@ -1,7 +1,7 @@ 'use strict'; -const Suite = require('../suite'); const errors = require('../errors'); +const Suite = require('../suite'); const createMissingArgumentError = errors.createMissingArgumentError; /** diff --git a/fixtures/mocha/scripts/markdown-magic.config.js b/fixtures/mocha/scripts/markdown-magic.config.js index 6c20d14a..0f5fae30 100644 --- a/fixtures/mocha/scripts/markdown-magic.config.js +++ b/fixtures/mocha/scripts/markdown-magic.config.js @@ -10,6 +10,7 @@ const { execSync } = require('child_process'); const fs = require('fs'); const path = require('path'); + const markdownToc = require('markdown-toc'); const stripAnsi = require('strip-ansi'); diff --git a/fixtures/rollup/build-plugins/generate-license-file.js b/fixtures/rollup/build-plugins/generate-license-file.js index 05762415..46c35df7 100644 --- a/fixtures/rollup/build-plugins/generate-license-file.js +++ b/fixtures/rollup/build-plugins/generate-license-file.js @@ -1,4 +1,5 @@ import fs from 'node:fs'; + import license from 'rollup-plugin-license'; function generateLicenseFile(dependencies) { diff --git a/fixtures/rollup/rollup.config.js b/fixtures/rollup/rollup.config.js index 5363863b..24d7a3e7 100644 --- a/fixtures/rollup/rollup.config.js +++ b/fixtures/rollup/rollup.config.js @@ -1,12 +1,14 @@ +import fs from 'node:fs'; +import path from 'node:path'; + import alias from '@rollup/plugin-alias'; import commonjs from '@rollup/plugin-commonjs'; import json from '@rollup/plugin-json'; import resolve from '@rollup/plugin-node-resolve'; -import fs from 'node:fs'; -import path from 'node:path'; import { string } from 'rollup-plugin-string'; import { terser } from 'rollup-plugin-terser'; import typescript from 'rollup-plugin-typescript'; + import addCliEntry from './build-plugins/add-cli-entry.js'; import conditionalFsEventsImport from './build-plugins/conditional-fsevents-import'; import emitModulePackageFile from './build-plugins/emit-module-package-file.js'; diff --git a/generate-changeset.mjs b/generate-changeset.mjs index 9f9a464a..fdd34b22 100644 --- a/generate-changeset.mjs +++ b/generate-changeset.mjs @@ -3,10 +3,11 @@ import { spawn } from 'node:child_process'; import { promises as fs } from 'node:fs'; import { join } from 'node:path'; -import kleur from 'kleur'; + import _writeChangeset from '@changesets/write'; -import prompts from 'prompts'; +import kleur from 'kleur'; import prettier from 'prettier'; +import prompts from 'prompts'; // @ts-expect-error const writeChangeset = _writeChangeset.default; diff --git a/src/config.js b/src/config.js index 1ddbe99e..168323c5 100644 --- a/src/config.js +++ b/src/config.js @@ -1,13 +1,12 @@ // ESLint configs -const xo = require('eslint-config-xo'); -const standard = require('eslint-config-standard'); -const prettier = require('eslint-config-prettier'); const typescript = require('@typescript-eslint/eslint-plugin'); - +const prettier = require('eslint-config-prettier'); +const standard = require('eslint-config-standard'); +const xo = require('eslint-config-xo'); // ESLint plugins +const jsdoc = require('eslint-plugin-jsdoc').configs.recommended; const node = require('eslint-plugin-n').configs.recommended; const unicorn = require('eslint-plugin-unicorn').configs.recommended; -const jsdoc = require('eslint-plugin-jsdoc').configs.recommended; /** @typedef {0 | 1 | 2 | 'off' | 'warn' | 'error'} ESLintRuleVal */ /** @typedef {ESLintRuleVal | [ESLintRuleVal, ...unknown[]]} ESLintRuleConfig */ @@ -144,6 +143,24 @@ module.exports.configs = { 'n/no-unpublished-require': 'off', // Does not account for "build" scripts 'n/shebang': 'off', // Tons of false positives 'n/file-extension-in-import': ['error', 'always'], // Don't allow extension-less relative imports (e.g. use ./foo.js instead of ./foo) + // Used for sorting/grouping import statements + 'import/order': [ + 'error', + { + groups: [ + 'builtin', + 'external', + 'internal', + 'parent', + 'sibling', + 'index', + ], + 'newlines-between': 'always', + alphabetize: { order: 'asc', caseInsensitive: true }, + }, + ], + // Used for sorting members within an import statement alphabetically + 'sort-imports': ['error', { ignoreDeclarationSort: true }], 'unicorn/import-style': 'off', // It doesn't seem useful to force people to use named, default, or namespace imports 'unicorn/prevent-abbreviations': 'off', // Causes more issues than it's worth diff --git a/src/rules.js b/src/rules.js index fc92a752..08604f51 100644 --- a/src/rules.js +++ b/src/rules.js @@ -1,9 +1,10 @@ -const node = require('eslint-plugin-n').rules; +const typescript = require('@typescript-eslint/eslint-plugin').rules; const eslintImport = require('eslint-plugin-import').rules; +const jsdoc = require('eslint-plugin-jsdoc').rules; +const node = require('eslint-plugin-n').rules; const promise = require('eslint-plugin-promise').rules; const unicorn = require('eslint-plugin-unicorn').rules; -const jsdoc = require('eslint-plugin-jsdoc').rules; -const typescript = require('@typescript-eslint/eslint-plugin').rules; + const preferEarlyReturn = require('./rules/prefer-early-return'); /**