CodeSampleX

Beispiel

@rollup/plugin-commonjs 28.0.2: extensions

Verifiziertes Beispiel für npm @rollup/plugin-commonjs 28.0.2: extensions. Der Vertrag lief auf node 22 · linux debian/x64 · docker und bestand.

sha256:b9f478f9520acb15ea73458b3b7e2544f824fcee8feedec8b53b36c7776bae37

Dieses Netzwerk bietet eine Sache: ein Sample, das baut. Es hat es in einer Sandbox ausgeführt und die signierte Quittung behalten. Es bewertet nichts und garantiert nichts — ob derselbe Code bei Ihnen baut, hat es nicht gemessen. Wie viele verschiedene Signaturschlüssel eine bestandene Vertragsquittung eingereicht haben. Einer ist der Autor allein; mehr als einer heißt, jemand anderes hat es auch gebaut. Ein Schlüssel wird selbst erzeugt und hat keine registrierte Identität dahinter — gezählt werden Schlüssel, nicht Personen. MIT-0

Ausführungsbelege

Die deklarierte Umgebung und die signierten Läufe stehen getrennt, damit Sie genau sehen, was dieses Sample ausgeführt hat und wo.

Beleggrundlage
Signierter Vertrag bestanden
Verifizierungsbelege
1
Signaturschlüssel, die es gebaut haben
1
Deklarierte Umgebung node 22.23 linux 24 · ubuntu · glibc 2.39 x64 node 22.23 javascript npm 10

Umgebungen der Verifizierungsläufe

Umgebung Contract Stufen Lauf
node 22 · linux debian/x64 · docker ed25519:c1973797be207ac4 PASS compile:SKIPPED · contract:PASS · load:PASS · resolve:PASS
CONTAINER_RUN · node-typescript@1node:22@sha256:8a34c4ab3ea2…
2026-09-03

Fall

HOW
Ziel
verify extensions in pkg:npm/@rollup/plugin-commonjs@28.0.2
Pakete
Symbole
  • extensions
Umgebung
node 22.23.2
Erstellt
2026-09-03T14:25:40Z

Contract

  1. By default, @rollup/plugin-commonjs resolves extensionless relative imports using the default extension ['.js'], failing to resolve extensionless imports to custom extensions.
  2. Configuring extensions with custom extensions allows extensionless relative require calls to resolve to matching files with those extensions.
  3. The order of extensions specifies resolution precedence when multiple candidate files with identical basenames exist among custom extensions.
  4. The extensions configuration applies to directory index file resolution when requiring a directory path.
  5. Files with extensions listed in the extensions option are recognized as candidate CommonJS modules and transpiled to ES module syntax.
  6. Files with the .cjs extension are recognized as candidate CommonJS modules regardless of whether .cjs is listed in extensions, but resolving extensionless .cjs imports requires .cjs to be explicitly listed in extensions.

Dateien

  • NOTES.md
  • PROMPT.md
  • csx.json
  • package-lock.json
  • package.json
  • spec.json
  • test/contract.mjs

Quellartefakt herunterladen (tar.gz)

Quelltext

NOTES.md
# Notes: Rollup CommonJS Plugin File Extension Resolution with extensions

## Search Result
`search_known_solution` returned `NO_SAFE_MATCH` for `extensions` in `@rollup/plugin-commonjs@28.0.2`. Public samples for version 28.0.2 only covered other symbols such as `ignoreTryCatch`, `dynamicRequireTargets`, `strictRequires`, and `output.interop`. This sample verifies extensionless relative require resolution, directory index resolution, candidate CJS transform eligibility, and resolution precedence via `extensions` in `@rollup/plugin-commonjs@28.0.2`.

## Naive Model Assumption
Developers and models often assume that `@rollup/plugin-commonjs` resolves arbitrary file extensions automatically for extensionless imports, or that custom extension resolution is solely handled by external resolvers without needing plugin configuration. Furthermore, models often assume that non-JavaScript files containing CommonJS exports will still undergo CommonJS parsing and conversion if loaded into Rollup, regardless of whether their extension is registered in `@rollup/plugin-commonjs`.

## Failure Mode
By default, `@rollup/plugin-commonjs` configures `extensions: ['.js']`. Extensionless relative require statements (such as `require('./dep')`) targeting files with custom extensions (e.g., `.custom`, `.ts`, `.coffee`) fail to resolve during bundling with `Could not resolve './dep'`. Even when a module with a custom extension is directly imported, the plugin's `isPossibleCjsId` check verifies whether `extensions.includes(extName)` (or if the extension is `.cjs`). If the custom extension is omitted from `extensions`, the plugin skips the CommonJS transform entirely, leaving CommonJS exports unparsed and causing Rollup to fail with named export missing errors. Configuring `extensions: ['.custom', '.js']` enables both extensionless resolution (including directory index files like `./dir/index.custom`) and CommonJS transformation for the specified extensions. Custom extension order determines precedence when multiple matching candidate files exist.
PROMPT.md
Clean-room public code sample — generation instructions

Write a brand-new, minimal, self-contained code sample in this clean-room directory.
Do not copy, paraphrase, or reference any existing project source. Work only from this spec.

A csx.json manifest scaffold already exists. Do not recreate it from memory. Preserve its case.goal, packages and symbols; fill its empty case.contract with exact assertions and correct its environment, commands and verifierAdapter for the files you generate.

Goal: verify extensions in pkg:npm/@rollup/plugin-commonjs@28.0.2
Kind: HOW

Use EXACTLY these public packages and versions:
  - pkg:npm/%40rollup/plugin-commonjs@28.0.2
Demonstrate these symbols/APIs:
  - extensions

Rules:
  - One focused purpose; the smallest project that proves the goal.
  - Include a contract test (test/contract.*) that runs OFFLINE and exits 0 exactly when the goal behavior works.
  - Pin every dependency with a lockfile so resolution is reproducible.
  - No secrets, credentials, or tokens. No real URLs (only example.com or localhost). No absolute paths.
  - No personal names, emails, company names, or project identifiers of any kind.
  - No binaries and no generated output (node_modules, dist, target, venv, .git, .env).
  - Keep it under 200 files and 256KB packed.
csx.json
{"case":{"caseId":"case:sha256:dd5fdce731a184e1aefe5ed024658347d1207e42f6f1b04b6111bb6caa53ca93","contract":["By default, @rollup/plugin-commonjs resolves extensionless relative imports using the default extension ['.js'], failing to resolve extensionless imports to custom extensions.","Configuring extensions with custom extensions allows extensionless relative require calls to resolve to matching files with those extensions.","The order of extensions specifies resolution precedence when multiple candidate files with identical basenames exist among custom extensions.","The extensions configuration applies to directory index file resolution when requiring a directory path.","Files with extensions listed in the extensions option are recognized as candidate CommonJS modules and transpiled to ES module syntax.","Files with the .cjs extension are recognized as candidate CommonJS modules regardless of whether .cjs is listed in extensions, but resolving extensionless .cjs imports requires .cjs to be explicitly listed in extensions."],"goal":"verify extensions in pkg:npm/@rollup/plugin-commonjs@28.0.2","kind":"HOW","packages":["pkg:npm/%40rollup/plugin-commonjs@28.0.2"],"schemaVersion":1,"symbols":["extensions"]},"contractCommand":["node","test/contract.mjs"],"environment":{"arch":"x64","distro":"ubuntu","ecosystem":"npm","executionContext":"node","language":"javascript","libc":"glibc","libcVersion":"2.39","moduleSystem":"cjs","os":"linux","osVersionBucket":"24","packageManager":"npm","packageManagerVersion":"10.9.8","runtime":"node","runtimeVersion":"22.23.2","schemaVersion":1},"license":"MIT-0","packages":["pkg:npm/%40rollup/plugin-commonjs@28.0.2"],"schemaVersion":1,"subject":"pkg:npm/%40rollup/plugin-commonjs@28.0.2","symbols":["extensions"],"verifierAdapter":"node-typescript@1"}
package-lock.json
{
  "name": "sample-rollup-plugin-commonjs-extensions",
  "version": "1.0.0",
  "lockfileVersion": 3,
  "requires": true,
  "packages": {
    "": {
      "name": "sample-rollup-plugin-commonjs-extensions",
      "version": "1.0.0",
      "dependencies": {
        "@rollup/plugin-commonjs": "28.0.2",
        "rollup": "4.62.4"
      }
    },
    "node_modules/@jridgewell/sourcemap-codec": {
      "version": "1.6.0",
      "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.6.0.tgz",
      "integrity": "sha512-T7jf+5zgsZHwNJ4lvQ7/aezbyk0nNX+zJVWpmHA7VYsEx7a7qr5Rg5IbtJFqkgze5Y2sruq1RUY8Q837Od7iFw==",
      "license": "MIT"
    },
    "node_modules/@napi-rs/lzma-linux-x64-gnu": {
      "version": "1.5.1",
      "resolved": "https://registry.npmjs.org/@napi-rs/lzma-linux-x64-gnu/-/lzma-linux-x64-gnu-1.5.1.tgz",
      "integrity": "sha512-oTXEIha4SsuXdTA4Iyskj0kpdx2yVXdhd75c2v3xGrHFfVMsbhTPZU/nMPL4sWKo4pBHm3aucLaqGlF696dTyQ==",
      "cpu": [
        "x64"
      ],
      "license": "MIT",
      "optional": true,
      "os": [
        "linux"
      ],
      "engines": {
        "node": "^22.20 || ^24.12 || >=25"
      }
    },
    "node_modules/@rollup/plugin-commonjs": {
      "version": "28.0.2",
      "resolved": "https://registry.npmjs.org/@rollup/plugin-commonjs/-/plugin-commonjs-28.0.2.tgz",
      "integrity": "sha512-BEFI2EDqzl+vA1rl97IDRZ61AIwGH093d9nz8+dThxJNH8oSoB7MjWvPCX3dkaK1/RCJ/1v/R1XB15FuSs0fQw==",
      "license": "MIT",
      "dependencies": {
        "@rollup/pluginutils": "^5.0.1",
        "commondir": "^1.0.1",
        "estree-walker": "^2.0.2",
        "fdir": "^6.2.0",
        "is-reference": "1.2.1",
        "magic-string": "^0.30.3",
        "picomatch": "^4.0.2"
      },
      "engines": {
        "node": ">=16.0.0 || 14 >= 14.17"
      },
      "peerDependencies": {
        "rollup": "^2.68.0||^3.0.0||^4.0.0"
      },
      "peerDependenciesMeta": {
        "rollup": {
          "optional": true
        }
      }
    },
    "node_modules/@rollup/pluginutils": {
      "version": "5.4.0",
      "resolved": "https://registry.npmjs.org/@rollup/pluginutils/-/pluginutils-5.4.0.tgz",
      "integrity": "sha512-MfPp06CjRLfXQ3wY0R8vJDYBy/MvVcc9OulEfR0B8Iv9ko+GCNaRZ+EpJYFl27LhKsZK0o420sYCRHCjfCgeUg==",
      "license": "MIT",
      "dependencies": {
        "@types/estree": "^1.0.0",
        "estree-walker": "^2.0.2",
        "picomatch": "^4.0.2"
      },
      "engines": {
        "node": ">=14.0.0"
      },
      "peerDependencies": {
        "rollup": "^1.20.0||^2.0.0||^3.0.0||^4.0.0"
      },
      "peerDependenciesMeta": {
        "rollup": {
          "optional": true
        }
      }
    },
    "node_modules/@rollup/rollup-android-arm-eabi": {
      "version": "4.62.4",
      "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.62.4.tgz",
      "integrity": "sha512-RrPokAb7dmbxFoeO3TloqHyOjgye8RkBhSqmp4aJMIex4c9r46ZstPnleDQOq1t46VOVjwIuwNogIqbodV1Vvg==",
      "cpu": [
        "arm"
      ],
      "license": "MIT",
      "optional": true,
      "os": [
        "android"
      ]
    },
    "node_modules/@rollup/rollup-android-arm64": {
      "version": "4.62.4",
      "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.62.4.tgz",
      "integrity": "sha512-JKuJc+pnpks2pjy7L/N3v/cAkZxYlnmuZoD840ldbMI5KDbC4iO9NKwPKYdjYFCMAIIlBzYSFHxIJVYzRo2/8A==",
      "cpu": [
        "arm64"
      ],
      "license": "MIT",
      "optional": true,
      "os": [
        "android"
      ]
    },
    "node_modules/@rollup/rollup-darwin-arm64": {
      "version": "4.62.4",
      "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.62.4.tgz",
      "integrity": "sha512-krw5uS2STmvJ02x0uTXHbqQNuz+9eZ1iw+qXk9dmW2gvV4jV7O2hEoOnuhFrpOPiel1mBFtqbxYZZtC46hXLOw==",
      "cpu": [
        "arm64"
      ],
      "license": "MIT",
      "optional": true,
      "os": [
        "darwin"
      ]
    },
    "node_modules/@rollup/rollup-darwin-x64": {
      "version": "4.62.4",
      "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.62.4.tgz",
      "integrity": "sha512-wsTxtgApb4PrOsNJIm0FZ1h3WvCC+k9uxLJ4ad75hgoS4NiRes2SoJFlDAyMwiUY8IssDqGcHbXuN0sx1tfF1A==",
      "cpu": [
        "x64"
      ],
      "license": "MIT",
      "optional": true,
      "os": [
        "darwin"
      ]
    },
    "node_modules/@rollup/rollup-freebsd-arm64": {
      "version": "4.62.4",
      "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-arm64/-/rollup-freebsd-arm64-4.62.4.tgz",
      "integrity": "sha512-GUOnQlyZe3yAXhWOtOMsn5Qkrv5E5mZXa0thbARWi5Ei2szlVXJFQhddZ4HbAzh8q92w5twp+CQvs/eFanz9YQ==",
      "cpu": [
        "arm64"
      ],
      "license": "MIT",
      "optional": true,
      "os": [
        "freebsd"
      ]
    },
    "node_modules/@rollup/rollup-freebsd-x64": {
      "version": "4.62.4",
      "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-x64/-/rollup-freebsd-x64-4.62.4.tgz",
      "integrity": "sha512-/Y7f3QuxjzPKsjA/rfEDa3+0vXqyjmJ50Ln8dPpCmWkKTrUoWHG1cWhTqaAMLob2m2nESWuC7yGrREz019Ztqg==",
      "cpu": [
        "x64"
      ],
      "license": "MIT",
      "optional": true,
      "os": [
        "freebsd"
      ]
    },
    "node_modules/@rollup/rollup-linux-arm-gnueabihf": {
      "version": "4.62.4",
      "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.62.4.tgz",
      "integrity": "sha512-81wiiX3v7aqy+T+bT61TJ78yJjRquqFFTTbAPt08imfQQzkPIW8t6aJbkTagtCCrXMNc9D66+geqlK7ydLPNqA==",
      "cpu": [
        "arm"
      ],
      "license": "MIT",
      "optional": true,
      "os": [
        "linux"
      ]
    },
    "node_modules/@rollup/rollup-linux-arm-musleabihf": {
      "version": "4.62.4",
      "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.62.4.tgz",
      "integrity": "sha512-9kmDIvNZqdoHOBZgNtpTBeLWYO/LVipM3H/j62P8848/l/VPEQL6N3uxU9pvP1oZAsXyC2MEnFP3ovRjo7WYNQ==",
      "cpu": [
        "arm"
      ],
      "license": "MIT",
      "optional": true,
      "os": [
        "linux"
      ]
    },
    "node_modules/@rollup/rollup-linux-arm64-gnu": {
      "version": "4.62.4",
      "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.62.4.tgz",
      "integrity": "sha512-CcnXHWnXg69g+DX5VWL3FHts3qMRN2uVEHX+BZvGLdd07/gXkn3ePjYtO1LDJvxkGKVHMclKBRa1QUTH+6toYQ==",
      "cpu": [
        "arm64"
      ],
      "license": "MIT",
      "optional": true,
      "os": [
        "linux"
      ]
    },
    "node_modules/@rollup/rollup-linux-arm64-musl": {
      "version": "4.62.4",
      "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.62.4.tgz",
      "integrity": "sha512-iFOibiHnTRuhrWLlRsOQFdZJJIa7S8OwkneJr4ocALP16u5yk6lWLINFwhHaEqBFMsKDUZofLkGos7+CPzGB3g==",
      "cpu": [
        "arm64"
      ],
      "license": "MIT",
      "optional": true,
      "os": [
        "linux"
      ]
    },
    "node_modules/@rollup/rollup-linux-loong64-gnu": {
      "version": "4.62.4",
      "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-loong64-gnu/-/rollup-linux-loong64-gnu-4.62.4.tgz",
      "integrity": "sha512-XnWYMI7euHlb5a871xPja+Gm7DRCFU+FGRrtS2sMq9N8FvqtpagUy6gD4YOemC5MRk9xbh8+jYMEJbigFQwsgA==",
      "cpu": [
        "loong64"
      ],
      "license": "MIT",
      "optional": true,
      "os": [
        "linux"
      ]
    },
    "node_modules/@rollup/rollup-linux-loong64-musl": {
      "version": "4.62.4",
      "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-loong64-musl/-/rollup-linux-loong64-musl-4.62.4.tgz",
      "integrity": "sha512-qGDAlO0U8xedCcsdRm9oaoQY8DAx/QT7uIxJWhCdx0ceIWX783UC9QSYkdpzAe29wNiVfp24+bZdQmn49o45SQ==",
      "cpu": [
        "loong64"
      ],
      "license": "MIT",
      "optional": true,
      "os": [
        "linux"
      ]
    },
    "node_modules/@rollup/rollup-linux-ppc64-gnu": {
      "version": "4.62.4",
      "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-ppc64-gnu/-/rollup-linux-ppc64-gnu-4.62.4.tgz",
      "integrity": "sha512-ru4H6ezD7ysA5EiEK6qkkaEb4modH8CTej6kUy/gQi20u3kB3G7Zn8snXXkeJSCOFKG/rbPPtM/+9Wgas1961w==",
      "cpu": [
        "ppc64"
      ],
      "license": "MIT",
      "optional": true,
      "os": [
        "linux"
      ]
    },
    "node_modules/@rollup/rollup-linux-ppc64-musl": {
      "version": "4.62.4",
      "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-ppc64-musl/-/rollup-linux-ppc64-musl-4.62.4.tgz",
      "integrity": "sha512-2W4MO5WQVJnbJaZdvDb9rhBDuFU1nKIepPFpJUBsTh2k1YY2g+ODViaWuyOAjQ5cOP7NvrvLzt3wvHOoiAvc7w==",
      "cpu": [
        "ppc64"
      ],
      "license": "MIT",
      "optional": true,
      "os": [
        "linux"
      ]
    },
    "node_modules/@rollup/rollup-linux-riscv64-gnu": {
      "version": "4.62.4",
      "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.62.4.tgz",
      "integrity": "sha512-+fxjfuoAmVMCYV5QyjoIpu0cp5DOiOTeqYFk1AVaxGr+/ravWLX89XfQmptsoWcaVy/TGf2hexzbUOrCQIL1CQ==",
      "cpu": [
        "riscv64"
      ],
      "license": "MIT",
      "optional": true,
      "os": [
        "linux"
      ]
    },
    "node_modules/@rollup/rollup-linux-riscv64-musl": {
      "version": "4.62.4",
      "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-musl/-/rollup-linux-riscv64-musl-4.62.4.tgz",
      "integrity": "sha512-jTn8JfHGL4djjFxPuM06LmNUJDsst2jeVlsd9OmIH6zc5sC9K6rIuO4YajXatLUpBmBKl6b35ro1QZocLi+tcA==",
      "cpu": [
        "riscv64"
      ],
      "license": "MIT",
      "optional": true,
      "os": [
        "linux"
      ]
    },
    "node_modules/@rollup/rollup-linux-s390x-gnu": {
      "version": "4.62.4",
      "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.62.4.tgz",
      "integrity": "sha512-oCJCJL4pXsoDcP2QZ+JVlPTIRc6266zsIaeJJsWImmF7HO0W8nb6HuSgZlMWxJwaPf8ehbSw8yo0EUw925hKsA==",
      "cpu": [
        "s390x"
      ],
      "license": "MIT",
      "optional": true,
      "os": [
        "linux"
      ]
    },
    "node_modules/@rollup/rollup-linux-x64-gnu": {
      "version": "4.62.4",
      "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.62.4.tgz",
      "integrity": "sha512-W69hukhZ3KKNRCaMIEzKvcFye42hh0FE1+YoYaf5+Ikacuftoco6yO/xouz0hc5d5W/s3yBro5jRiuEE/Q5vUw==",
      "cpu": [
        "x64"
      ],
      "license": "MIT",
      "optional": true,
      "os": [
        "linux"
      ]
    },
    "node_modules/@rollup/rollup-linux-x64-musl": {
      "version": "4.62.4",
      "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.62.4.tgz",
      "integrity": "sha512-qiXbGG2jkjXhzXpsFZSR2Xpb8DN/UaxYsbb/STbuR/6fpaDgRmmaq1B/LmtF2wQFOFOSsK2jdE0RZ3a0zHn4QA==",
      "cpu": [
        "x64"
      ],
      "license": "MIT",
      "optional": true,
      "os": [
        "linux"
      ]
    },
    "node_modules/@rollup/rollup-openbsd-x64": {
      "version": "4.62.4",
      "resolved": "https://registry.npmjs.org/@rollup/rollup-openbsd-x64/-/rollup-openbsd-x64-4.62.4.tgz",
      "integrity": "sha512-nWeM//hxv8mIo6jD7Hu4o48DVmV9pbV6gsKaWU+4NFyqHoPKwrkRiZGLKUhOBk8qNmDmpwFtPKg80Bo/Tn4xiQ==",
      "cpu": [
        "x64"
      ],
      "license": "MIT",
      "optional": true,
      "os": [
        "openbsd"
      ]
    },
    "node_modules/@rollup/rollup-openharmony-arm64": {
      "version": "4.62.4",
      "resolved": "https://registry.npmjs.org/@rollup/rollup-openharmony-arm64/-/rollup-openharmony-arm64-4.62.4.tgz",
      "integrity": "sha512-s62SQ/vgsRSvMwDkOEfTqfgASF0f26ZNaQuTA6Aok5lrikf89yI2W0gFHvZb2Jpgc6N8JnOKZgCK2iciO3CsxQ==",
      "cpu": [
        "arm64"
      ],
      "license": "MIT",
      "optional": true,
      "os": [
        "openharmony"
      ]
    },
    "node_modules/@rollup/rollup-win32-arm64-msvc": {
      "version": "4.62.4",
      "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.62.4.tgz",
      "integrity": "sha512-J6wGf8TVGbXJq+HH+ttTvrcfNKPbuZecV6KT1B8I18BC5IURUh5kl4Yl5OEP5eFIUoI5BWxCsyYMhFsDx8kekw==",
      "cpu": [
        "arm64"
      ],
      "license": "MIT",
      "optional": true,
      "os": [
        "win32"
      ]
    },
    "node_modules/@rollup/rollup-win32-ia32-msvc": {
      "version": "4.62.4",
      "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.62.4.tgz",
      "integrity": "sha512-zmfrQd/0wu6oJs8Vq8KwY/YtsKSsLtKe/HwAP4Wqy8LhWjeT55fHRAkOhYQ12wI3ayS4Tt12d5CDRD7N96SAYQ==",
      "cpu": [
        "ia32"
      ],
      "license": "MIT",
      "optional": true,
      "os": [
        "win32"
      ]
    },
    "node_modules/@rollup/rollup-win32-x64-gnu": {
      "version": "4.62.4",
      "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-gnu/-/rollup-win32-x64-gnu-4.62.4.tgz",
      "integrity": "sha512-qPzHqdj9rfUD+w79dtE07zi/kFwKyCJqplp5K5ygeLTp7jLpAoc16OAH39HSmRC9UpozaecsleI8uAdEj6v2yw==",
      "cpu": [
        "x64"
      ],
      "license": "MIT",
      "optional": true,
      "os": [
        "win32"
      ]
    },
    "node_modules/@rollup/rollup-win32-x64-msvc": {
      "version": "4.62.4",
      "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.62.4.tgz",
      "integrity": "sha512-zD6NdeWEByGE9QF9vCrlJ5YQB4oq9q91kPZS37Jwj5hOkvR1lTBSpsKhKDw4IJtbQ35LsTS1HD9DZYGKIshU1Q==",
      "cpu": [
        "x64"
      ],
      "license": "MIT",
      "optional": true,
      "os": [
        "win32"
      ]
    },
    "node_modules/@types/estree": {
      "version": "1.0.9",
      "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.9.tgz",
      "integrity": "sha512-GhdPgy1el4/ImP05X05Uw4cw2/M93BCUmnEvWZNStlCzEKME4Fkk+YpoA5OiHNQmoS7Cafb8Xa3Pya8m1Qrzeg==",
      "license": "MIT"
    },
    "node_modules/commondir": {
      "version": "1.0.1",
      "resolved": "https://registry.npmjs.org/commondir/-/commondir-1.0.1.tgz",
      "integrity": "sha512-W9pAhw0ja1Edb5GVdIF1mjZw/ASI0AlShXM83UUGe2DVr5TdAPEA1OA8m/g8zWp9x6On7gqufY+FatDbC3MDQg==",
      "license": "MIT"
    },
    "node_modules/estree-walker": {
      "version": "2.0.2",
      "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-2.0.2.tgz",
      "integrity": "sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==",
      "license": "MIT"
    },
    "node_modules/fdir": {
      "version": "6.5.0",
      "resolved": "https://registry.npmjs.org/fdir/-/fdir-6.5.0.tgz",
      "integrity": "sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg==",
      "license": "MIT",
      "engines": {
        "node": ">=12.0.0"
      },
      "peerDependencies": {
        "picomatch": "^3 || ^4"
      },
      "peerDependenciesMeta": {
        "picomatch": {
          "optional": true
        }
      }
    },
    "node_modules/fsevents": {
      "version": "2.3.3",
      "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz",
      "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==",
      "hasInstallScript": true,
      "license": "MIT",
      "optional": true,
      "os": [
        "darwin"
      ],
      "engines": {
        "node": "^8.16.0 || ^10.6.0 || >=11.0.0"
      }
    },
    "node_modules/is-reference": {
      "version": "1.2.1",
      "resolved": "https://registry.npmjs.org/is-reference/-/is-reference-1.2.1.tgz",
      "integrity": "sha512-U82MsXXiFIrjCK4otLT+o2NA2Cd2g5MLoOVXUZjIOhLurrRxpEXzI8O0KZHr3IjLvlAH1kTPYSuqer5T9ZVBKQ==",
      "license": "MIT",
      "dependencies": {
        "@types/estree": "*"
      }
    },
    "node_modules/magic-string": {
      "version": "0.30.21",
      "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.21.tgz",
      "integrity": "sha512-vd2F4YUyEXKGcLHoq+TEyCjxueSeHnFxyyjNp80yg0XV4vUhnDer/lvvlqM/arB5bXQN5K2/3oinyCRyx8T2CQ==",
      "license": "MIT",
      "dependencies": {
        "@jridgewell/sourcemap-codec": "^1.5.5"
      }
    },
    "node_modules/picomatch": {
      "version": "4.0.7",
      "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.7.tgz",
      "integrity": "sha512-qcJu88Q2IWqJsDD529JKMdwGm/dvInW4HvQnRwiH9JtihJvzGOscDtHE3x1pBKeUOTysQ8kVmLnJ2kJu7yhcGA==",
      "license": "MIT",
      "engines": {
        "node": ">=12"
      },
      "funding": {
        "url": "https://github.com/sponsors/jonschlinkert"
      }
    },
    "node_modules/rollup": {
      "version": "4.62.4",
      "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.62.4.tgz",
      "integrity": "sha512-RXOqwaPsBGjMNMa4sQjDjHieHEZDFoj/Rdr46l2MU5DfEs16wHJPC2RPTPHWhNl+M3aI472LLqFkFKut4SblOg==",
      "license": "MIT",
      "dependencies": {
        "@types/estree": "1.0.9"
      },
      "bin": {
        "rollup": "dist/bin/rollup"
      },
      "engines": {
        "node": ">=18.0.0",
        "npm": ">=8.0.0"
      },
      "optionalDependencies": {
        "@napi-rs/lzma-linux-x64-gnu": "1.5.1",
        "@rollup/rollup-android-arm-eabi": "4.62.4",
        "@rollup/rollup-android-arm64": "4.62.4",
        "@rollup/rollup-darwin-arm64": "4.62.4",
        "@rollup/rollup-darwin-x64": "4.62.4",
        "@rollup/rollup-freebsd-arm64": "4.62.4",
        "@rollup/rollup-freebsd-x64": "4.62.4",
        "@rollup/rollup-linux-arm-gnueabihf": "4.62.4",
        "@rollup/rollup-linux-arm-musleabihf": "4.62.4",
        "@rollup/rollup-linux-arm64-gnu": "4.62.4",
        "@rollup/rollup-linux-arm64-musl": "4.62.4",
        "@rollup/rollup-linux-loong64-gnu": "4.62.4",
        "@rollup/rollup-linux-loong64-musl": "4.62.4",
        "@rollup/rollup-linux-ppc64-gnu": "4.62.4",
        "@rollup/rollup-linux-ppc64-musl": "4.62.4",
        "@rollup/rollup-linux-riscv64-gnu": "4.62.4",
        "@rollup/rollup-linux-riscv64-musl": "4.62.4",
        "@rollup/rollup-linux-s390x-gnu": "4.62.4",
        "@rollup/rollup-linux-x64-gnu": "4.62.4",
        "@rollup/rollup-linux-x64-musl": "4.62.4",
        "@rollup/rollup-openbsd-x64": "4.62.4",
        "@rollup/rollup-openharmony-arm64": "4.62.4",
        "@rollup/rollup-win32-arm64-msvc": "4.62.4",
        "@rollup/rollup-win32-ia32-msvc": "4.62.4",
        "@rollup/rollup-win32-x64-gnu": "4.62.4",
        "@rollup/rollup-win32-x64-msvc": "4.62.4",
        "fsevents": "~2.3.2"
      }
    }
  }
}
package.json
{
  "name": "sample-rollup-plugin-commonjs-extensions",
  "version": "1.0.0",
  "type": "commonjs",
  "description": "Minimal sample verifying extensions option in @rollup/plugin-commonjs",
  "dependencies": {
    "@rollup/plugin-commonjs": "28.0.2",
    "rollup": "4.62.4"
  }
}
spec.json
{
  "schemaVersion": 1,
  "goal": "verify extensions in pkg:npm/@rollup/plugin-commonjs@28.0.2",
  "kind": "HOW",
  "packages": [
    "pkg:npm/%40rollup/plugin-commonjs@28.0.2"
  ],
  "symbols": [
    "extensions"
  ]
}
test/contract.mjs
import assert from 'node:assert/strict';
import path from 'node:path';
import os from 'node:os';
import fs from 'node:fs';
import { rollup } from 'rollup';
import commonjs from '@rollup/plugin-commonjs';

async function runContract() {
  const tmpDir = fs.mkdtempSync(path.join(os.tmpdir(), 'csx-rollup-extensions-'));

  try {
    // ---------------------------------------------------------------------------
    // Contract 1:
    // By default, @rollup/plugin-commonjs resolves extensionless imports using default
    // extension ['.js'], resolving './dep' to './dep.js' and failing for custom extensions.
    // ---------------------------------------------------------------------------
    {
      const entryPath = path.join(tmpDir, 'entry1.js');
      const depJsPath = path.join(tmpDir, 'dep1.js');
      const depCustomPath = path.join(tmpDir, 'dep-custom1.custom');

      fs.writeFileSync(entryPath, "const dep = require('./dep1'); module.exports = dep;");
      fs.writeFileSync(depJsPath, "module.exports = 'from-js';");
      fs.writeFileSync(depCustomPath, "module.exports = 'from-custom';");

      const bundle = await rollup({
        input: entryPath,
        plugins: [commonjs()]
      });
      const { output } = await bundle.generate({ format: 'cjs' });
      assert.match(output[0].code, /from-js/);

      const failEntryPath = path.join(tmpDir, 'entry1-fail.js');
      fs.writeFileSync(failEntryPath, "const dep = require('./dep-custom1'); module.exports = dep;");

      let failed = false;
      try {
        await rollup({
          input: failEntryPath,
          onwarn: () => {},
          plugins: [commonjs()]
        });
      } catch (err) {
        failed = true;
        assert.match(err.message, /Could not resolve/);
      }
      assert.strictEqual(failed, true, 'Default extensions should fail to resolve extensionless .custom import');
    }

    // ---------------------------------------------------------------------------
    // Contract 2:
    // Configuring extensions with custom extensions (e.g. ['.custom', '.js']) allows
    // extensionless relative require calls to resolve to matching files with custom extensions.
    // ---------------------------------------------------------------------------
    {
      const entryPath = path.join(tmpDir, 'entry2.js');
      const depCustomPath = path.join(tmpDir, 'dep2.custom');

      fs.writeFileSync(entryPath, "const dep = require('./dep2'); module.exports = dep;");
      fs.writeFileSync(depCustomPath, "module.exports = 'resolved-custom';");

      const bundle = await rollup({
        input: entryPath,
        plugins: [
          commonjs({
            extensions: ['.custom', '.js']
          })
        ]
      });
      const { output } = await bundle.generate({ format: 'cjs' });
      assert.match(output[0].code, /resolved-custom/);
    }

    // ---------------------------------------------------------------------------
    // Contract 3:
    // The order of extensions specifies resolution precedence when multiple candidate files
    // with identical basenames exist among custom extensions.
    // ---------------------------------------------------------------------------
    {
      const entryPathA = path.join(tmpDir, 'entry3a.js');
      const entryPathB = path.join(tmpDir, 'entry3b.js');
      const subDirA = path.join(tmpDir, 'sub3a');
      const subDirB = path.join(tmpDir, 'sub3b');
      fs.mkdirSync(subDirA, { recursive: true });
      fs.mkdirSync(subDirB, { recursive: true });

      fs.writeFileSync(path.join(subDirA, 'multi.extA'), "module.exports = 'first-is-extA';");
      fs.writeFileSync(path.join(subDirA, 'multi.extB'), "module.exports = 'first-is-extB';");
      fs.writeFileSync(entryPathA, "const m = require('./sub3a/multi'); module.exports = m;");

      const bundleA = await rollup({
        input: entryPathA,
        plugins: [
          commonjs({
            extensions: ['.extA', '.extB', '.js']
          })
        ]
      });
      const { output: outputA } = await bundleA.generate({ format: 'cjs' });
      assert.match(outputA[0].code, /first-is-extA/);

      fs.writeFileSync(path.join(subDirB, 'multi.extA'), "module.exports = 'second-is-extA';");
      fs.writeFileSync(path.join(subDirB, 'multi.extB'), "module.exports = 'second-is-extB';");
      fs.writeFileSync(entryPathB, "const m = require('./sub3b/multi'); module.exports = m;");

      const bundleB = await rollup({
        input: entryPathB,
        plugins: [
          commonjs({
            extensions: ['.extB', '.extA', '.js']
          })
        ]
      });
      const { output: outputB } = await bundleB.generate({ format: 'cjs' });
      assert.match(outputB[0].code, /second-is-extB/);
    }

    // ---------------------------------------------------------------------------
    // Contract 4:
    // The extensions configuration applies to directory index file resolution
    // (e.g. resolving index.custom when requiring a directory path).
    // ---------------------------------------------------------------------------
    {
      const entryPath = path.join(tmpDir, 'entry4.js');
      const dirPath = path.join(tmpDir, 'pkg-dir4');
      fs.mkdirSync(dirPath, { recursive: true });
      fs.writeFileSync(path.join(dirPath, 'index.custom'), "module.exports = 'resolved-index-custom';");
      fs.writeFileSync(entryPath, "const d = require('./pkg-dir4'); module.exports = d;");

      const bundle = await rollup({
        input: entryPath,
        plugins: [
          commonjs({
            extensions: ['.custom', '.js']
          })
        ]
      });
      const { output } = await bundle.generate({ format: 'cjs' });
      assert.match(output[0].code, /resolved-index-custom/);
    }

    // ---------------------------------------------------------------------------
    // Contract 5:
    // Files with extensions listed in the extensions option are recognized as candidate
    // CommonJS modules and transpiled to ES module syntax.
    // ---------------------------------------------------------------------------
    {
      const customModulePath = path.join(tmpDir, 'mod5.custom');
      fs.writeFileSync(customModulePath, "exports.val = 42; exports.str = 'hello';");

      const entryPath = path.join(tmpDir, 'entry5.js');
      fs.writeFileSync(entryPath, "import { val, str } from './mod5.custom'; export { val, str };");

      const bundle = await rollup({
        input: entryPath,
        plugins: [
          commonjs({
            extensions: ['.custom', '.js']
          })
        ]
      });
      const { output } = await bundle.generate({ format: 'es' });
      const code = output[0].code;
      assert.match(code, /42/);
      assert.match(code, /hello/);

      let unparsedFailed = false;
      try {
        await rollup({
          input: entryPath,
          onwarn: () => {},
          plugins: [
            commonjs({
              extensions: ['.js']
            })
          ]
        });
      } catch (err) {
        unparsedFailed = true;
        assert.match(err.message, /is not exported/);
      }
      assert.strictEqual(unparsedFailed, true, 'Module with extension not in extensions is not transformed as CJS');
    }

    // ---------------------------------------------------------------------------
    // Contract 6:
    // Files with the .cjs extension are recognized as candidate CommonJS modules regardless
    // of whether .cjs is listed in extensions, but resolving extensionless .cjs imports
    // requires .cjs to be explicitly listed in extensions.
    // ---------------------------------------------------------------------------
    {
      const cjsPath = path.join(tmpDir, 'mod6.cjs');
      fs.writeFileSync(cjsPath, "exports.meaning = 100;");
      const entryExplicitCjs = path.join(tmpDir, 'entry6a.js');
      fs.writeFileSync(entryExplicitCjs, "import { meaning } from './mod6.cjs'; export { meaning };");

      const bundleExplicit = await rollup({
        input: entryExplicitCjs,
        plugins: [
          commonjs({
            extensions: ['.js']
          })
        ]
      });
      const { output: outputExplicit } = await bundleExplicit.generate({ format: 'es' });
      assert.match(outputExplicit[0].code, /100/);

      const entryExtensionless = path.join(tmpDir, 'entry6b.js');
      fs.writeFileSync(entryExtensionless, "const m = require('./mod6'); module.exports = m;");

      let resolveFailed = false;
      try {
        await rollup({
          input: entryExtensionless,
          onwarn: () => {},
          plugins: [
            commonjs({
              extensions: ['.js']
            })
          ]
        });
      } catch (err) {
        resolveFailed = true;
        assert.match(err.message, /Could not resolve/);
      }
      assert.strictEqual(resolveFailed, true, 'Extensionless .cjs import fails when .cjs not in extensions');

      const bundleWithCjsExt = await rollup({
        input: entryExtensionless,
        plugins: [
          commonjs({
            extensions: ['.js', '.cjs']
          })
        ]
      });
      const { output: outputWithCjsExt } = await bundleWithCjsExt.generate({ format: 'cjs' });
      assert.match(outputWithCjsExt[0].code, /100/);
    }

    console.log('All extensions contract assertions passed successfully.');
  } finally {
    fs.rmSync(tmpDir, { recursive: true, force: true });
  }
}

runContract().catch((err) => {
  console.error('Contract failed:', err);
  process.exit(1);
});

Ursprungs-Seeder

anonym