{"_id":"@accesslint/codemod","_rev":"3-90afc970bdca62f356aa31c03ba94559","name":"@accesslint/codemod","dist-tags":{"latest":"0.1.2"},"versions":{"0.1.0":{"name":"@accesslint/codemod","version":"0.1.0","keywords":["accesslint","codemod","jscodeshift","jest-axe","migration","accessibility","a11y","jest"],"license":"MIT","_id":"@accesslint/codemod@0.1.0","maintainers":[{"name":"ckundo","email":"cameron@accesslint.com"}],"homepage":"https://github.com/AccessLint/accesslint#readme","bugs":{"url":"https://github.com/AccessLint/accesslint/issues"},"bin":{"codemod":"dist/cli.js","accesslint-codemod":"dist/cli.js"},"dist":{"shasum":"004e041ad70a3337d85f27627b89a58cffbfdd4c","tarball":"https://registry.npmjs.org/@accesslint/codemod/-/codemod-0.1.0.tgz","fileCount":7,"integrity":"sha512-Wi+pGbCMuPy+8K1r8IXbCurm6so+4BRhrCuQ4Ryi9/gbHdm2eZQnyHHIfYd6vJ5IjP0EzWHh+zYhbetcT/9HKg==","signatures":[{"sig":"MEUCIQDixnxLo6bLb1d0rRtgZUyW+XIUtvptYMcFq2Q2v1LPNgIgfhQbLZg5gZIKOURz99KFALlABZfFPccJfUwTItLYEOo=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":34641},"type":"module","exports":{"./transforms":"./dist/transforms/index.js","./transforms/matcher-plugin":"./dist/transforms/matcher-plugin.js"},"gitHead":"f0f4dca70079c4468a9d28f2d34af3775fd13117","scripts":{"dev":"bun src/cli.ts","test":"vitest run","build":"tsdown","typecheck":"tsc --noEmit","prepublishOnly":"bun run build"},"_npmUser":{"name":"ckundo","email":"cameron@accesslint.com"},"repository":{"url":"git+https://github.com/AccessLint/accesslint.git","type":"git","directory":"codemod"},"_npmVersion":"11.9.0","description":"Codemod that migrates jest-axe projects to @accesslint/jest","directories":{},"_nodeVersion":"24.14.0","dependencies":{"citty":"^0.1.6","jscodeshift":"^17.1.2"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"tsdown":"^0.21.9","vitest":"^4.1.4","typescript":"^5.7.0","@types/node":"^25.3.0","@types/jscodeshift":"^17.0.3"},"_npmOperationalInternal":{"tmp":"tmp/codemod_0.1.0_1776524366952_0.5621832392797637","host":"s3://npm-registry-packages-npm-production"}},"0.1.1":{"name":"@accesslint/codemod","version":"0.1.1","keywords":["accesslint","codemod","jscodeshift","jest-axe","migration","accessibility","a11y","jest"],"license":"MIT","_id":"@accesslint/codemod@0.1.1","maintainers":[{"name":"ckundo","email":"cameron@accesslint.com"}],"homepage":"https://github.com/AccessLint/accesslint#readme","bugs":{"url":"https://github.com/AccessLint/accesslint/issues"},"bin":{"codemod":"dist/cli.js","accesslint-codemod":"dist/cli.js"},"dist":{"shasum":"b31af7eadf2ab502bc841e2afad63114b89750fc","tarball":"https://registry.npmjs.org/@accesslint/codemod/-/codemod-0.1.1.tgz","fileCount":7,"integrity":"sha512-jmvHeYPTXQlcKTMqoLSU+xvO7MBAQ/zrUtcqqfcZ9R0IxA909g/zOJlIUQR62TtStYZZ/DBmjN205eqm8P5oBQ==","signatures":[{"sig":"MEQCIGWQBh56XfH7aIonXBVfMN0VBmJoDmBtI5x1lL0EcD0EAiB2+o27d296n/ktkWBrFH9z8upiFnlZD6O59RxBU0FyVQ==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@accesslint%2fcodemod@0.1.1","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":34641},"type":"module","exports":{"./transforms":"./dist/transforms/index.js","./transforms/matcher-plugin":"./dist/transforms/matcher-plugin.js"},"gitHead":"29f7c7be6a0048e989759ea3bddd24719325fbff","scripts":{"dev":"bun src/cli.ts","test":"vitest run","build":"tsdown","typecheck":"tsc --noEmit","prepublishOnly":"bun run build"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:8f254f61-8823-41fb-901e-fe050655dd1f"}},"repository":{"url":"git+https://github.com/AccessLint/accesslint.git","type":"git","directory":"codemod"},"_npmVersion":"11.11.0","description":"Codemod that migrates jest-axe projects to @accesslint/jest","directories":{},"_nodeVersion":"24.14.1","dependencies":{"citty":"^0.1.6","jscodeshift":"^17.1.2"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"tsdown":"^0.21.9","vitest":"^4.1.4","typescript":"^5.7.0","@types/node":"^25.3.0","@types/jscodeshift":"^17.0.3"},"_npmOperationalInternal":{"tmp":"tmp/codemod_0.1.1_1776524560466_0.6847102249734489","host":"s3://npm-registry-packages-npm-production"}},"0.1.2":{"name":"@accesslint/codemod","version":"0.1.2","description":"Codemod that migrates jest-axe projects to @accesslint/jest","license":"MIT","publishConfig":{"access":"public"},"repository":{"type":"git","url":"git+https://github.com/AccessLint/accesslint.git","directory":"codemod"},"bugs":{"url":"https://github.com/AccessLint/accesslint/issues"},"type":"module","bin":{"codemod":"dist/cli.js","accesslint-codemod":"dist/cli.js"},"exports":{"./transforms/matcher-plugin":"./dist/transforms/matcher-plugin.js","./transforms":"./dist/transforms/index.js"},"scripts":{"build":"tsdown","typecheck":"tsc --noEmit","dev":"bun src/cli.ts","test":"vitest run","prepublishOnly":"bun run build"},"dependencies":{"citty":"^0.1.6","jscodeshift":"^17.1.2"},"devDependencies":{"@types/jscodeshift":"^17.0.3","@types/node":"^25.3.0","tsdown":"^0.21.9","typescript":"^5.7.0","vitest":"^4.1.4"},"keywords":["accesslint","codemod","jscodeshift","jest-axe","migration","accessibility","a11y","jest"],"gitHead":"8e913856b624dadac5c57f5663e6b896812ec7a2","_id":"@accesslint/codemod@0.1.2","homepage":"https://github.com/AccessLint/accesslint#readme","_nodeVersion":"24.14.1","_npmVersion":"11.11.0","dist":{"integrity":"sha512-L7ZYf0RciS9m1RzHgiH93S5/k0Efdf7NkI4VbDGa2hXz7VGYOzsLZb7dRIDpeN7nNmsY+1Afijahs7TYcJuO1g==","shasum":"f38783e4057986ccab505f63fab9c0810f57e636","tarball":"https://registry.npmjs.org/@accesslint/codemod/-/codemod-0.1.2.tgz","fileCount":7,"unpackedSize":34749,"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@accesslint%2fcodemod@0.1.2","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"signatures":[{"keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U","sig":"MEUCIFOR9icf+3yysu+6RxCXSvrsK2QkBBiiYqlPSV7PwRBIAiEA2WKtDjYpr9aCHv/ETOjD/hxT4TJS25CcUhLcjrNgz78="}]},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:8f254f61-8823-41fb-901e-fe050655dd1f"}},"directories":{},"maintainers":[{"name":"ckundo","email":"cameron@accesslint.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages-npm-production","tmp":"tmp/codemod_0.1.2_1776525575695_0.46385676607755966"},"_hasShrinkwrap":false}},"time":{"created":"2026-04-18T14:59:26.877Z","modified":"2026-04-18T15:19:36.156Z","0.1.0":"2026-04-18T14:59:27.084Z","0.1.1":"2026-04-18T15:02:40.616Z","0.1.2":"2026-04-18T15:19:35.834Z"},"bugs":{"url":"https://github.com/AccessLint/accesslint/issues"},"license":"MIT","homepage":"https://github.com/AccessLint/accesslint#readme","keywords":["accesslint","codemod","jscodeshift","jest-axe","migration","accessibility","a11y","jest"],"repository":{"type":"git","url":"git+https://github.com/AccessLint/accesslint.git","directory":"codemod"},"description":"Codemod that migrates jest-axe projects to @accesslint/jest","maintainers":[{"name":"ckundo","email":"cameron@accesslint.com"}],"readme":"# @accesslint/codemod\n\nAutomated migration from [`jest-axe`](https://github.com/nickcolley/jest-axe), [`vitest-axe`](https://github.com/chaance/vitest-axe), and [`jasmine-axe`](https://github.com/fcrozatier/jasmine-axe) to their AccessLint equivalents.\n\n## Quick start\n\n```sh\n# Migrate a jest-axe project\nnpx @accesslint/codemod jest-axe 'src/**/*.{test,spec}.{ts,tsx}'\n\n# Migrate a vitest-axe project\nnpx @accesslint/codemod vitest-axe 'src/**/*.{test,spec}.{ts,tsx}'\n\n# Auto-detect from package.json and run all applicable migrations\nnpx @accesslint/codemod auto 'src/**/*.{test,spec}.{ts,tsx}'\n```\n\nRecommended flow: run with `--dry --print` first to inspect the diff, then rerun without `--dry`.\n\n```sh\nnpx @accesslint/codemod jest-axe --dry --print 'src/**/*.test.tsx'\n```\n\n## Subcommands\n\n| Subcommand    | Source              | Target                 |\n| ------------- | ------------------- | ---------------------- |\n| `jest-axe`    | `jest-axe`          | `@accesslint/jest`     |\n| `vitest-axe`  | `vitest-axe`        | `@accesslint/vitest`   |\n| `jasmine-axe` | `jasmine-axe`       | `@accesslint/jest`     |\n| `auto`        | _detected from package.json_ | _per-plugin_  |\n\n## What's transformed\n\n1. **Imports** are rewritten to a side-effect import of the target package:\n   ```diff\n   - import { axe, toHaveNoViolations } from \"jest-axe\";\n   + import \"@accesslint/jest\";\n   ```\n   Named, aliased, namespace, and CJS `require()` forms are all recognized.\n\n2. **`expect.extend(toHaveNoViolations)`** is removed — the side-effect import auto-registers the `toBeAccessible()` matcher. Identifier, object (`{ toHaveNoViolations }`), and spread (`{ ...toHaveNoViolations }`) forms are all handled.\n\n3. **Two-statement pattern** is collapsed:\n   ```diff\n   - const results = await axe(container);\n   - expect(results).toHaveNoViolations();\n   + expect(container).toBeAccessible();\n   ```\n\n4. **Inline pattern** is collapsed:\n   ```diff\n   - expect(await axe(container)).toHaveNoViolations();\n   + expect(container).toBeAccessible();\n   ```\n\n## What's _not_ transformed\n\n- **`configureAxe(...)` globals** — there is no per-project global in AccessLint; options are per-call. When `configureAxe` is imported, the codemod keeps the source import (for `configureAxe` only), adds the target side-effect import, and prepends a TODO comment reminding you to reapply those options via `toBeAccessible({ disabledRules, failOn, ... })`.\n\n- **axe rule IDs → AccessLint rule IDs** — `axe(container, { rules: { \"color-contrast\": { enabled: false } } })` is collapsed to `expect(container).toBeAccessible()` with a TODO comment. AccessLint uses namespaced rule IDs (`distinguishable/color-contrast`); see the [rule-ID mapping table](../jest/README.md#migrating-from-jest-axe) in `@accesslint/jest`'s README and reapply as `toBeAccessible({ disabledRules: [\"distinguishable/color-contrast\"] })`.\n\n- **Builder-shaped axe plugins** — `@axe-core/playwright`, `@axe-core/webdriverjs`, `@axe-core/puppeteer`, and `cypress-axe` use a different API (`new AxeBuilder({ page }).analyze()` / `cy.checkA11y(...)`) and target `@accesslint/playwright`. These aren't supported in v0.1.\n\n## Flags\n\n| Flag                     | Default             | Meaning |\n| ------------------------ | ------------------- | ------- |\n| `--dry`                  | `false`             | Don't write files; report what would change |\n| `--print`                | `false`             | Print transformed source to stdout (use with `--dry`) |\n| `--parser=<name>`        | `tsx`               | jscodeshift parser: `babel`, `babylon`, `flow`, `ts`, `tsx` |\n| `--extensions=<csv>`     | `js,jsx,ts,tsx`     | Comma-separated list of file extensions to process |\n| `--verbose=<0\\|1\\|2>`    | `0`                 | Verbosity level |\n\n## After running\n\n1. Review any `TODO(accesslint-codemod):` comments — those are the spots that need a human decision (typically `configureAxe` options or per-call axe rule filters).\n2. Install the target package (the codemod doesn't touch your `package.json`):\n   ```sh\n   npm install --save-dev @accesslint/jest    # or @accesslint/vitest\n   npm uninstall jest-axe                     # or vitest-axe / jasmine-axe\n   ```\n3. Run your test script and confirm nothing regressed. Some assertions may produce different violation counts because AccessLint and axe are independent rule implementations — see [`@accesslint/jest`'s \"What's different\" notes](../jest/README.md#whats-different).\n\n## License\n\nMIT\n","readmeFilename":"README.md"}