Skip to content

Conversation

macieklamberski
Copy link
Contributor

Description

Fixes ERR_IMPORT_ATTRIBUTE_MISSING error when extending JSON configuration files in Node.js ESM environments. This issue prevents users from using JSON-based commitlint configurations that extend other configs.

I had this problem recently, also found an existing issue #3970 reporting the same problem.

Modified the dynamicImport function in @commitlint/resolve-extends to detect JSON files and add the appropriate import attribute syntax based on the Node.js version:

  • Node.js < 22: Uses { assert: { type: "json" } } (import assertion syntax)
  • Node.js >= 22: Uses { with: { type: "json" } } (import attribute syntax)

This ensures backward compatibility across all supported Node.js versions while using the correct syntax for each version. The distinction is important because:

  • Import assertions (assert) were the initial implementation available in Node.js 16.15+
  • Import attributes (with) became the standard and replaced assertions in Node.js 22+
  • Node.js 22 removed support for the old assert syntax entirely

Source: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Statements/import

Motivation and Context

When trying to extend a JSON configuration file, Node.js throws ERR_IMPORT_ATTRIBUTE_MISSING because JSON imports in ESM require import attributes to specify the module type. This affects commitlint v19+ when working with JSON config files.

Closes #3970

How Has This Been Tested?

Before Fix (Error Case)

  1. Clone reproduction repository: https://github.com/macieklamberski/commitlint-json
  2. Install commitlint with npm install
  3. Run echo "feat: add something" | npx commitlint
  4. Observe ERR_IMPORT_ATTRIBUTE_MISSING error ❌

After Fix (Working Case)

  1. Clone the fix from: https://github.com/macieklamberski/commitlint

  2. Build the packages: npm install && npm run build

  3. Link the updated packages:

    cd commitlint/@commitlint/resolve-extends && npm link
    cd ../load && npm link
  4. In the cloned example project (https://github.com/macieklamberski/commitlint-json):

    npm link @commitlint/resolve-extends
    npm link @commitlint/load
  5. Run commitlint with JSON config - no error occurs ✅

Types of changes

  • Bug fix (non-breaking change which fixes an issue)
  • New feature (non-breaking change which adds functionality)
  • Breaking change (fix or feature that would cause existing functionality to change)

Checklist:

  • My change requires a change to the documentation.
  • I have updated the documentation accordingly.
  • I have added tests to cover my changes.
  • All new and existing tests passed.

Copy link

codesandbox-ci bot commented Sep 25, 2025

This pull request is automatically built and testable in CodeSandbox.

To see build info of the built libraries, click here or the icon next to each commit SHA.

@escapedcat escapedcat requested a review from JounQin September 26, 2025 08:27
Copy link
Collaborator

@JounQin JounQin left a comment

Choose a reason for hiding this comment

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

The changes seem reasonable while I'd prefer using require() for json files personally instead of checking Node versions.

@macieklamberski
Copy link
Contributor Author

@JounQin I have replaced previous solution with require().

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Development

Successfully merging this pull request may close these issues.

ERR_IMPORT_ASSERTION_TYPE_MISSING with json config package
3 participants