Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

feat: drop support for jiti v1.21 #18996

Merged
merged 2 commits into from
Oct 12, 2024
Merged

feat: drop support for jiti v1.21 #18996

merged 2 commits into from
Oct 12, 2024

Conversation

fasttime
Copy link
Member

@fasttime fasttime commented Oct 7, 2024

Prerequisites checklist

What is the purpose of this pull request? (put an "X" next to an item)

[ ] Documentation update
[ ] Bug fix (template)
[ ] New rule (template)
[ ] Changes an existing rule (template)
[ ] Add autofix to a rule
[ ] Add a CLI option
[ ] Add something to the core
[X] Other, please explain:

  • Drop support for jiti versions prior to v2
  • Improve the error message in a special case
  • Add unit tests for when jiti is outdated or not found

What changes did you make? (Give an overview)

Support for jiti v2 was added in PR #18954, but jiti v1.21 is still supported. This can lead to a confusing error message when a project with jiti v1.21 tries to use a TypeScript ESLint config with top-level await:

Oops! Something went wrong! :(

ESLint: 9.12.0

.../project/eslint.config.ts:1
(function (exports, require, module, __filename, __dirname) { "use strict";Object.defineProperty(exports, "__esModule", { value: true });exports.default = void 0;const { default: pkg } = await Promise.resolve().then(() => require('./package.json'));var _default = exports.default =
                                                                                                                                                                                           ^^^^^

SyntaxError: await is only valid in async functions and the top level bodies of modules
    at new Script (node:vm:117:7)
    at createScript (node:vm:269:10)
    at Object.runInThisContext (node:vm:317:10)
    at evalModule (.../project/node_modules/jiti/dist/jiti.js:1:247124)
    at jiti (.../project/node_modules/jiti/dist/jiti.js:1:245241)
    at .../project/node_modules/jiti/dist/jiti.js:1:248272
    at Generator.next (<anonymous>)
    at .../project/node_modules/jiti/dist/jiti.js:1:238153
    at new Promise (<anonymous>)
    at __awaiter (.../project/node_modules/jiti/dist/jiti.js:1:237714)
    at jiti.import (.../project/node_modules/jiti/dist/jiti.js:1:248217)
    at loadConfigFile (.../project/node_modules/eslint/lib/config/config-loader.js:191:41)
    at async calculateConfigArray (.../project/node_modules/eslint/lib/config/config-loader.js:235:28)
    at async #calculateConfigArray (.../project/node_modules/eslint/lib/config/config-loader.js:622:25)
    at async entryFilter (.../project/node_modules/eslint/lib/eslint/eslint-helpers.js:285:33)
    at async NodeHfs.<anonymous> (file://.../project/node_modules/@humanfs/core/src/hfs.js:560:24)
    at async NodeHfs.walk (file://.../project/node_modules/@humanfs/core/src/hfs.js:600:3)
    at async globSearch (.../project/node_modules/eslint/lib/eslint/eslint-helpers.js:327:26)
    at async Promise.allSettled (index 0)
    at async globMultiSearch (.../project/node_modules/eslint/lib/eslint/eslint-helpers.js:412:21)
    at async findFiles (.../project/node_modules/eslint/lib/eslint/eslint-helpers.js:591:27)
    at async ESLint.lintFiles (.../project/node_modules/eslint/lib/eslint/eslint.js:729:27)
    at async Object.execute (.../project/node_modules/eslint/lib/cli.js:497:23)
    at async main (.../project/node_modules/eslint/bin/eslint.js:153:22)

The correct message should state:

You are using an outdated version of the 'jiti' library. Please update to the latest version of 'jiti' to ensure compatibility and access to the latest features.

StackBlitz Repro

This is not a regression in #18954. We were getting the same error message previously with jiti v1 where TLA is not supported. Now that jiti v2 is available it seems no longer necessary to maintain compatibility with jiti v1. TypeScript config files are still an experimental feature, so this change will not be a breaking one.

I've also added unit tests to check the error behavior when an outdated jiti versions is installed, or when jiti is not installed.

Is there anything you'd like reviewers to focus on?

@eslint-github-bot eslint-github-bot bot added the feature This change adds a new feature to ESLint label Oct 7, 2024
@github-actions github-actions bot added the core Relates to ESLint's core APIs and features label Oct 7, 2024
Copy link

netlify bot commented Oct 7, 2024

Deploy Preview for docs-eslint canceled.

Name Link
🔨 Latest commit e5d3a9b
🔍 Latest deploy log https://app.netlify.com/sites/docs-eslint/deploys/670988399ef8e000087dd566

Comment on lines +520 to +528
/**
* Used to import the jiti dependency. This method is exposed internally for testing purposes.
* @returns {Promise<Record<string, unknown>>} A promise that fulfills with a module object
* or rejects with an error if jiti is not found.
*/
static loadJiti() {
return import("jiti");
}

Copy link
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Any better way to make this function mockable?

@fasttime fasttime marked this pull request as ready for review October 7, 2024 20:19
@fasttime fasttime requested a review from a team as a code owner October 7, 2024 20:19
@mdjermanovic
Copy link
Member

Now that jiti v2 is available it seems no longer necessary to maintain compatibility with jiti v1. TypeScript config files are still an experimental feature, so this change will not be a breaking one.

👍 It sounds reasonable to me that we don't maintain compatibility with the previous major line, especially since this is still an experimental feature.

snitin315
snitin315 previously approved these changes Oct 11, 2024
Copy link
Contributor

@snitin315 snitin315 left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

LGTM. Awaiting 2nd review.

@snitin315 snitin315 added the accepted There is consensus among the team that this change meets the criteria for inclusion label Oct 11, 2024
Comment on lines 195 to 196
return config?.default ?? config;
return config.default ?? config;
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Without the ?, a config like this would result in TypeError: Cannot read properties of undefined (reading 'default'):

// eslint.config.cts
module.exports = undefined;

Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

is that a valid config/usecase?

Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Not really, but currently it's caught by validations rather than crashing so the error message is more descriptive:

Oops! Something went wrong! :(

ESLint: 9.12.0

TypeError: Config (unnamed): Unexpected undefined config at user-defined index 0.

Copy link
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Thanks! I reverted the change and added unit tests for this case in e5d3a9b.

Copy link
Member

@mdjermanovic mdjermanovic left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

LGTM, thanks!

@mdjermanovic mdjermanovic merged commit 1def4cd into main Oct 12, 2024
26 checks passed
@mdjermanovic mdjermanovic deleted the drop-jiti-v1 branch October 12, 2024 06:38
Vylpes pushed a commit to Vylpes/random-bunny that referenced this pull request Oct 21, 2024
This PR contains the following updates:

| Package | Type | Update | Change |
|---|---|---|---|
| [@eslint/js](https://eslint.org) ([source](https://github.com/eslint/eslint/tree/HEAD/packages/js)) | devDependencies | minor | [`9.10.0` -> `9.13.0`](https://renovatebot.com/diffs/npm/@eslint%2fjs/9.10.0/9.13.0) |

---

### Release Notes

<details>
<summary>eslint/eslint (@&#8203;eslint/js)</summary>

### [`v9.13.0`](https://github.com/eslint/eslint/releases/tag/v9.13.0)

[Compare Source](eslint/eslint@v9.12.0...v9.13.0)

#### Features

-   [`381c32b`](eslint/eslint@381c32b) feat: Allow languages to provide `defaultLanguageOptions` ([#&#8203;19003](eslint/eslint#19003)) (Milos Djermanovic)
-   [`bf723bd`](eslint/eslint@bf723bd) feat: Improve eslintrc warning message ([#&#8203;19023](eslint/eslint#19023)) (Milos Djermanovic)
-   [`1def4cd`](eslint/eslint@1def4cd) feat: drop support for jiti v1.21 ([#&#8203;18996](eslint/eslint#18996)) (Francesco Trotta)
-   [`f879be2`](eslint/eslint@f879be2) feat: export `ESLint.defaultConfig` ([#&#8203;18983](eslint/eslint#18983)) (Nitin Kumar)

#### Bug Fixes

-   [`78836d4`](eslint/eslint@78836d4) fix: update the `complexity` rule type ([#&#8203;19027](eslint/eslint#19027)) (Nitin Kumar)
-   [`064c8b6`](eslint/eslint@064c8b6) fix: update rule types ([#&#8203;18925](eslint/eslint#18925)) (Nitin Kumar)

#### Documentation

-   [`abdbfa8`](eslint/eslint@abdbfa8) docs: mark `LintMessage#nodeType` as deprecated ([#&#8203;19019](eslint/eslint#19019)) (Nitin Kumar)
-   [`19e68d3`](eslint/eslint@19e68d3) docs: update deprecated rules type definitions ([#&#8203;19018](eslint/eslint#19018)) (Nitin Kumar)
-   [`7dd402d`](eslint/eslint@7dd402d) docs: Update examples of passing multiple values to a CLI option ([#&#8203;19006](eslint/eslint#19006)) (Milos Djermanovic)
-   [`5dcbc51`](eslint/eslint@5dcbc51) docs: Add example with side-effect imports to no-restricted-imports ([#&#8203;18997](eslint/eslint#18997)) (Milos Djermanovic)
-   [`1ee87ca`](eslint/eslint@1ee87ca) docs: Update README (GitHub Actions Bot)
-   [`2c3dbdc`](eslint/eslint@2c3dbdc) docs: Use prerendered sponsors for README ([#&#8203;18988](eslint/eslint#18988)) (Milos Djermanovic)

#### Chores

-   [`68d2d9d`](eslint/eslint@68d2d9d) chore: upgrade to `@eslint/js@9.13.0` and `@eslint/core@^0.7.0` ([#&#8203;19034](eslint/eslint#19034)) (Francesco Trotta)
-   [`2211f0a`](eslint/eslint@2211f0a) chore: package.json update for [@&#8203;eslint/js](https://github.com/eslint/js) release (Jenkins)
-   [`c7abaef`](eslint/eslint@c7abaef) perf: using Node.js compile cache ([#&#8203;19012](eslint/eslint#19012)) (唯然)
-   [`1d7c077`](eslint/eslint@1d7c077) chore: add pkg.type "commonjs" ([#&#8203;19011](eslint/eslint#19011)) (唯然)
-   [`468e3bd`](eslint/eslint@468e3bd) test: fix `ESLint` tests ([#&#8203;19021](eslint/eslint#19021)) (Francesco Trotta)
-   [`ed4635f`](eslint/eslint@ed4635f) ci: upgrade knip@5.32.0 ([#&#8203;18992](eslint/eslint#18992)) (Milos Djermanovic)
-   [`efad767`](eslint/eslint@efad767) chore: remove unused ignore dependency ([#&#8203;18993](eslint/eslint#18993)) (Amaresh  S M)

### [`v9.12.0`](https://github.com/eslint/eslint/releases/tag/v9.12.0)

[Compare Source](eslint/eslint@v9.11.1...v9.12.0)

#### Features

-   [`5a6a053`](eslint/eslint@5a6a053) feat: update to `jiti` v2 ([#&#8203;18954](eslint/eslint#18954)) (Arya Emami)
-   [`17a07fb`](eslint/eslint@17a07fb) feat: Hooks for test cases (RuleTester) ([#&#8203;18771](eslint/eslint#18771)) (Anna Bocharova)
-   [`2ff0e51`](eslint/eslint@2ff0e51) feat: Implement alternate config lookup ([#&#8203;18742](eslint/eslint#18742)) (Nicholas C. Zakas)
-   [`2d17453`](eslint/eslint@2d17453) feat: Implement modified cyclomatic complexity ([#&#8203;18896](eslint/eslint#18896)) (Dmitry Pashkevich)

#### Bug Fixes

-   [`ea380ca`](eslint/eslint@ea380ca) fix: Upgrade retry to avoid EMFILE errors ([#&#8203;18986](eslint/eslint#18986)) (Nicholas C. Zakas)
-   [`fdd6319`](eslint/eslint@fdd6319) fix: Issues with type definitions ([#&#8203;18940](eslint/eslint#18940)) (Arya Emami)

#### Documentation

-   [`ecbd522`](eslint/eslint@ecbd522) docs: Mention code explorer ([#&#8203;18978](eslint/eslint#18978)) (Nicholas C. Zakas)
-   [`7ea4ecc`](eslint/eslint@7ea4ecc) docs: Clarifying the Use of Meta Objects ([#&#8203;18697](eslint/eslint#18697)) (Amaresh  S M)
-   [`d3e4b2e`](eslint/eslint@d3e4b2e) docs: Clarify how to exclude `.js` files ([#&#8203;18976](eslint/eslint#18976)) (Milos Djermanovic)
-   [`57232ff`](eslint/eslint@57232ff) docs: Mention plugin-kit in language docs ([#&#8203;18973](eslint/eslint#18973)) (Nicholas C. Zakas)
-   [`b80ed00`](eslint/eslint@b80ed00) docs: Update README (GitHub Actions Bot)
-   [`cb69ab3`](eslint/eslint@cb69ab3) docs: Update README (GitHub Actions Bot)
-   [`7fb0d95`](eslint/eslint@7fb0d95) docs: Update README (GitHub Actions Bot)
-   [`493348a`](eslint/eslint@493348a) docs: Update README (GitHub Actions Bot)
-   [`87a582c`](eslint/eslint@87a582c) docs: fix typo in `id-match` rule ([#&#8203;18944](eslint/eslint#18944)) (Jay)

#### Chores

-   [`555aafd`](eslint/eslint@555aafd) chore: upgrade to `@eslint/js@9.12.0` ([#&#8203;18987](eslint/eslint#18987)) (Francesco Trotta)
-   [`873ae60`](eslint/eslint@873ae60) chore: package.json update for [@&#8203;eslint/js](https://github.com/eslint/js) release (Jenkins)
-   [`d0a5414`](eslint/eslint@d0a5414) refactor: replace strip-ansi with native module ([#&#8203;18982](eslint/eslint#18982)) (Cristopher)
-   [`b827029`](eslint/eslint@b827029) chore: Enable JSON5 linting ([#&#8203;18979](eslint/eslint#18979)) (Milos Djermanovic)
-   [`8f55ca2`](eslint/eslint@8f55ca2) chore: Upgrade espree, eslint-visitor-keys, eslint-scope ([#&#8203;18962](eslint/eslint#18962)) (Nicholas C. Zakas)
-   [`c1a2725`](eslint/eslint@c1a2725) chore: update dependency mocha to ^10.7.3 ([#&#8203;18945](eslint/eslint#18945)) (Milos Djermanovic)

### [`v9.11.1`](https://github.com/eslint/eslint/releases/tag/v9.11.1)

[Compare Source](eslint/eslint@v9.11.0...v9.11.1)

#### Bug Fixes

-   [`20fd916`](eslint/eslint@20fd916) fix: add `@eslint/core`, `@types/estree`, & `@types/json-schema` deps ([#&#8203;18938](eslint/eslint#18938)) (Nitin Kumar)
-   [`2738322`](eslint/eslint@2738322) fix: add missing types for `require-atomic-updates` rule ([#&#8203;18937](eslint/eslint#18937)) (Kristóf Poduszló)
-   [`d71ff30`](eslint/eslint@d71ff30) fix: add missing types for `object-shorthand` rule ([#&#8203;18935](eslint/eslint#18935)) (Kristóf Poduszló)
-   [`561cadc`](eslint/eslint@561cadc) fix: add missing types for `no-unsafe-negation` rule ([#&#8203;18932](eslint/eslint#18932)) (Kristóf Poduszló)
-   [`8843656`](eslint/eslint@8843656) fix: add missing types for `no-underscore-dangle` rule ([#&#8203;18931](eslint/eslint#18931)) (Kristóf Poduszló)
-   [`92cde5c`](eslint/eslint@92cde5c) fix: add missing types for `no-shadow` rule ([#&#8203;18930](eslint/eslint#18930)) (Kristóf Poduszló)
-   [`b3cbe11`](eslint/eslint@b3cbe11) fix: add missing types for `no-sequences` rule ([#&#8203;18929](eslint/eslint#18929)) (Kristóf Poduszló)
-   [`976f77f`](eslint/eslint@976f77f) fix: add missing types for `no-unused-expressions` rule ([#&#8203;18933](eslint/eslint#18933)) (Kristóf Poduszló)

#### Documentation

-   [`3eff709`](eslint/eslint@3eff709) docs: replace deprecated `Linter.FlatConfig` type with `Linter.Config` ([#&#8203;18941](eslint/eslint#18941)) (Carlos Meira)

#### Chores

-   [`df4a859`](eslint/eslint@df4a859) chore: upgrade [@&#8203;eslint/js](https://github.com/eslint/js)[@&#8203;9](https://github.com/9).11.1 ([#&#8203;18943](eslint/eslint#18943)) (Milos Djermanovic)
-   [`36d8095`](eslint/eslint@36d8095) chore: package.json update for [@&#8203;eslint/js](https://github.com/eslint/js) release (Jenkins)

### [`v9.11.0`](https://github.com/eslint/eslint/releases/tag/v9.11.0)

[Compare Source](eslint/eslint@v9.10.0...v9.11.0)

#### Features

-   [`ec30c73`](eslint/eslint@ec30c73) feat: add "eslint/universal" to export `Linter` ([#&#8203;18883](eslint/eslint#18883)) (唯然)
-   [`c591da6`](eslint/eslint@c591da6) feat: Add language to types ([#&#8203;18917](eslint/eslint#18917)) (Nicholas C. Zakas)
-   [`492eb8f`](eslint/eslint@492eb8f) feat: limit the name given to `ImportSpecifier` in `id-length` ([#&#8203;18861](eslint/eslint#18861)) (Tanuj Kanti)
-   [`19c6856`](eslint/eslint@19c6856) feat: Add `no-useless-constructor` suggestion ([#&#8203;18799](eslint/eslint#18799)) (Jordan Thomson)
-   [`a48f8c2`](eslint/eslint@a48f8c2) feat: add type `FormatterFunction`, update `LoadedFormatter` ([#&#8203;18872](eslint/eslint#18872)) (Francesco Trotta)

#### Bug Fixes

-   [`5e5f39b`](eslint/eslint@5e5f39b) fix: add missing types for `no-restricted-exports` rule ([#&#8203;18914](eslint/eslint#18914)) (Kristóf Poduszló)
-   [`8f630eb`](eslint/eslint@8f630eb) fix: add missing types for `no-param-reassign` options ([#&#8203;18906](eslint/eslint#18906)) (Kristóf Poduszló)
-   [`d715781`](eslint/eslint@d715781) fix: add missing types for `no-extra-boolean-cast` options ([#&#8203;18902](eslint/eslint#18902)) (Kristóf Poduszló)
-   [`2de5742`](eslint/eslint@2de5742) fix: add missing types for `no-misleading-character-class` options ([#&#8203;18905](eslint/eslint#18905)) (Kristóf Poduszló)
-   [`c153084`](eslint/eslint@c153084) fix: add missing types for `no-implicit-coercion` options ([#&#8203;18903](eslint/eslint#18903)) (Kristóf Poduszló)
-   [`fa11b2e`](eslint/eslint@fa11b2e) fix: add missing types for `no-empty-function` options ([#&#8203;18901](eslint/eslint#18901)) (Kristóf Poduszló)
-   [`a0deed1`](eslint/eslint@a0deed1) fix: add missing types for `camelcase` options ([#&#8203;18897](eslint/eslint#18897)) (Kristóf Poduszló)

#### Documentation

-   [`e4e5709`](eslint/eslint@e4e5709) docs: correct `prefer-object-has-own` type definition comment ([#&#8203;18924](eslint/eslint#18924)) (Nitin Kumar)
-   [`91cbd18`](eslint/eslint@91cbd18) docs: add unicode abbreviations in no-irregular-whitespace rule ([#&#8203;18894](eslint/eslint#18894)) (Alix Royere)
-   [`59cfc0f`](eslint/eslint@59cfc0f) docs: clarify `resultsMeta` in `LoadedFormatter` type ([#&#8203;18881](eslint/eslint#18881)) (Milos Djermanovic)
-   [`adcc50d`](eslint/eslint@adcc50d) docs: Update README (GitHub Actions Bot)
-   [`4edac1a`](eslint/eslint@4edac1a) docs: Update README (GitHub Actions Bot)

#### Build Related

-   [`959d360`](eslint/eslint@959d360) build: Support updates to previous major versions ([#&#8203;18871](eslint/eslint#18871)) (Milos Djermanovic)

#### Chores

-   [`ca21a64`](eslint/eslint@ca21a64) chore: upgrade [@&#8203;eslint/js](https://github.com/eslint/js)[@&#8203;9](https://github.com/9).11.0 ([#&#8203;18927](eslint/eslint#18927)) (Milos Djermanovic)
-   [`a10f90a`](eslint/eslint@a10f90a) chore: package.json update for [@&#8203;eslint/js](https://github.com/eslint/js) release (Jenkins)
-   [`e4e02cc`](eslint/eslint@e4e02cc) refactor: Extract processor logic into ProcessorService ([#&#8203;18818](eslint/eslint#18818)) (Nicholas C. Zakas)
-   [`6d4484d`](eslint/eslint@6d4484d) chore: updates for v8.57.1 release (Jenkins)
-   [`71f37c5`](eslint/eslint@71f37c5) refactor: use optional chaining when validating config rules ([#&#8203;18893](eslint/eslint#18893)) (lucasrmendonca)
-   [`2c2805f`](eslint/eslint@2c2805f) chore: Add PR note to all templates ([#&#8203;18892](eslint/eslint#18892)) (Nicholas C. Zakas)
-   [`7b852ce`](eslint/eslint@7b852ce) refactor: use `Directive` class from `@eslint/plugin-kit` ([#&#8203;18884](eslint/eslint#18884)) (Milos Djermanovic)
-   [`d594ddd`](eslint/eslint@d594ddd) chore: update dependency [@&#8203;eslint/core](https://github.com/eslint/core) to ^0.6.0 ([#&#8203;18863](eslint/eslint#18863)) (renovate\[bot])
-   [`78b2421`](eslint/eslint@78b2421) chore: Update change.yml ([#&#8203;18882](eslint/eslint#18882)) (Nicholas C. Zakas)
-   [`a416f0a`](eslint/eslint@a416f0a) chore: enable `$ExpectType` comments in .ts files ([#&#8203;18869](eslint/eslint#18869)) (Francesco Trotta)

</details>

---

### Configuration

📅 **Schedule**: Branch creation - At any time (no schedule defined), Automerge - At any time (no schedule defined).

🚦 **Automerge**: Disabled by config. Please merge this manually once you are satisfied.

♻ **Rebasing**: Whenever PR becomes conflicted, or you tick the rebase/retry checkbox.

🔕 **Ignore**: Close this PR and you won't be reminded about this update again.

---

 - [ ] <!-- rebase-check -->If you want to rebase/retry this PR, check this box

---

This PR has been generated by [Renovate Bot](https://github.com/renovatebot/renovate).
<!--renovate-debug:eyJjcmVhdGVkSW5WZXIiOiIzOC44MC4wIiwidXBkYXRlZEluVmVyIjoiMzguODAuMCIsInRhcmdldEJyYW5jaCI6ImRldmVsb3AiLCJsYWJlbHMiOlsidHlwZS9kZXBlbmRlbmNpZXMiXX0=-->

Reviewed-on: https://git.vylpes.xyz/RabbitLabs/random-bunny/pulls/231
Reviewed-by: Vylpes <ethan@vylpes.com>
Co-authored-by: Renovate Bot <renovate@vylpes.com>
Co-committed-by: Renovate Bot <renovate@vylpes.com>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
accepted There is consensus among the team that this change meets the criteria for inclusion core Relates to ESLint's core APIs and features feature This change adds a new feature to ESLint
Projects
Status: Complete
Development

Successfully merging this pull request may close these issues.

3 participants