{"_id":"oxc-unshadowed-visitor","_rev":"3-1e152c1e780e7679dfb0d879cffd935f","name":"oxc-unshadowed-visitor","dist-tags":{"latest":"0.1.0"},"versions":{"0.0.0":{"name":"oxc-unshadowed-visitor","version":"0.0.0","keywords":["ast","oxc","rolldown","scope","visitor"],"license":"MIT","_id":"oxc-unshadowed-visitor@0.0.0","maintainers":[{"name":"sapphi-red","email":"green@sapphi.red"}],"homepage":"https://github.com/rolldown/plugins/tree/main/packages/oxc-unshadowed-visitor#readme","bugs":{"url":"https://github.com/rolldown/plugins/issues"},"dist":{"shasum":"2e3a9a353573506c815e629d7cd03d3368c3af66","tarball":"https://registry.npmjs.org/oxc-unshadowed-visitor/-/oxc-unshadowed-visitor-0.0.0.tgz","fileCount":5,"integrity":"sha512-+RoyeZTdSaPGGGWvomBJcP0R15O3jqSvCIbJMcrlpjkR58w9aoZ0o8OwfkAZbjo2v9ZGOHJG2rt7LGuFjkwV8w==","signatures":[{"sig":"MEUCIH4FREwir0cKGjwE9+oeKn30Rf5O81jxgICVopuh64/hAiEAw+B3h1lIieClTEDNnKEkq2r/W5kCzxlWTXm/WvArijs=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":13824},"type":"module","_from":"file:oxc-unshadowed-visitor-0.0.0.tgz","engines":{"node":">=22.12.0 || ^24.0.0"},"exports":"./dist/index.mjs","scripts":{"dev":"tsdown --watch","test":"vitest --project oxc-unshadowed-visitor","bench":"vitest bench --project oxc-unshadowed-visitor","build":"tsdown"},"_npmUser":{"name":"sapphi-red","email":"green@sapphi.red"},"_resolved":"/private/var/folders/h4/87kkgtdd0tv13zpqnn2n3l340000gn/T/84ac130ea9b2bcfbceee77ae5ce78d41/oxc-unshadowed-visitor-0.0.0.tgz","_integrity":"sha512-+RoyeZTdSaPGGGWvomBJcP0R15O3jqSvCIbJMcrlpjkR58w9aoZ0o8OwfkAZbjo2v9ZGOHJG2rt7LGuFjkwV8w==","repository":{"url":"git+https://github.com/rolldown/plugins.git","type":"git","directory":"packages/oxc-unshadowed-visitor"},"_npmVersion":"11.6.2","description":"Scope-aware AST visitor that filters out references shadowed by local bindings","directories":{},"_nodeVersion":"24.11.1","_hasShrinkwrap":false,"devDependencies":{"rolldown":"^1.0.0-rc.12","oxc-parser":"^0.121.0","oxc-walker":"^0.7.0","@oxc-project/types":"^0.122.0"},"peerDependencies":{"rolldown":"^1.0.0-rc.12","oxc-parser":"^0.121.0"},"peerDependenciesMeta":{"rolldown":{"optional":true},"oxc-parser":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/oxc-unshadowed-visitor_0.0.0_1774770309290_0.9907160916078546","host":"s3://npm-registry-packages-npm-production"}},"0.0.1":{"name":"oxc-unshadowed-visitor","version":"0.0.1","keywords":["ast","oxc","rolldown","scope","visitor"],"license":"MIT","_id":"oxc-unshadowed-visitor@0.0.1","maintainers":[{"name":"sapphi-red","email":"green@sapphi.red"}],"homepage":"https://github.com/rolldown/plugins/tree/main/packages/oxc-unshadowed-visitor#readme","bugs":{"url":"https://github.com/rolldown/plugins/issues"},"dist":{"shasum":"7d13614497f87e2f7b616a414c1097abd908f382","tarball":"https://registry.npmjs.org/oxc-unshadowed-visitor/-/oxc-unshadowed-visitor-0.0.1.tgz","fileCount":5,"integrity":"sha512-IVQnhKE/MwXJHgydUYuutUwOG1kCmAOYARqpcOvATWJQZvkyDbJ+kGMAufwFosYluPp0otDb/yilsoVvF1Ar3g==","signatures":[{"sig":"MEUCICsfXK+4H5ssO+/YOBalVwufq2aHhlNG0xXGygXqBd24AiEAmzJJJ4cc6SIUSvmacKNVYfII40Kj+mP8K/n8kYM+kEQ=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/oxc-unshadowed-visitor@0.0.1","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":13824},"type":"module","_from":"file:oxc-unshadowed-visitor-0.0.1.tgz","engines":{"node":">=22.12.0 || ^24.0.0"},"exports":"./dist/index.mjs","scripts":{"dev":"tsdown --watch","test":"vitest --project oxc-unshadowed-visitor","bench":"vitest bench --project oxc-unshadowed-visitor","build":"tsdown"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:5bc03718-8676-4c90-b577-e8816bcb7b75"}},"_resolved":"/tmp/b3666865cf736688d20a57a3e014a51b/oxc-unshadowed-visitor-0.0.1.tgz","_integrity":"sha512-IVQnhKE/MwXJHgydUYuutUwOG1kCmAOYARqpcOvATWJQZvkyDbJ+kGMAufwFosYluPp0otDb/yilsoVvF1Ar3g==","repository":{"url":"git+https://github.com/rolldown/plugins.git","type":"git","directory":"packages/oxc-unshadowed-visitor"},"_npmVersion":"11.12.1","description":"Scope-aware AST visitor that filters out references shadowed by local bindings","directories":{},"_nodeVersion":"24.14.0","_hasShrinkwrap":false,"devDependencies":{"rolldown":"^1.0.0-rc.12","oxc-parser":"^0.121.0","oxc-walker":"^0.7.0","@oxc-project/types":"^0.122.0"},"peerDependencies":{"rolldown":"^1.0.0-rc.12","oxc-parser":"^0.121.0"},"peerDependenciesMeta":{"rolldown":{"optional":true},"oxc-parser":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/oxc-unshadowed-visitor_0.0.1_1774770808380_0.8878125393854261","host":"s3://npm-registry-packages-npm-production"}},"0.1.0":{"name":"oxc-unshadowed-visitor","version":"0.1.0","description":"Scope-aware AST visitor that filters out references shadowed by local bindings","keywords":["ast","oxc","rolldown","scope","visitor"],"homepage":"https://github.com/rolldown/plugins/tree/main/packages/oxc-unshadowed-visitor#readme","bugs":{"url":"https://github.com/rolldown/plugins/issues"},"license":"MIT","repository":{"type":"git","url":"git+https://github.com/rolldown/plugins.git","directory":"packages/oxc-unshadowed-visitor"},"type":"module","exports":"./dist/index.mjs","devDependencies":{"@oxc-project/types":"^0.129.0","oxc-parser":"^0.129.0","oxc-walker":"^1.0.0","rolldown":"^1.0.0"},"peerDependencies":{"oxc-parser":"^0.121.0","rolldown":"^1.0.0-rc.12"},"peerDependenciesMeta":{"oxc-parser":{"optional":true},"rolldown":{"optional":true}},"engines":{"node":">=22.12.0 || ^24.0.0"},"scripts":{"dev":"tsdown --watch","build":"tsdown","bench":"vitest bench --project oxc-unshadowed-visitor","test":"vitest --project oxc-unshadowed-visitor"},"_id":"oxc-unshadowed-visitor@0.1.0","_integrity":"sha512-WC5yVscFTCOS7mKp95CySilgntq8Xz7gHc+NyOU4XMMMsmug1lXeykJcV92rpW6QuSFdjPOI8nKRfzlEmZ8MlQ==","_resolved":"/tmp/f55d45f4e9648394c4f580240bd49fe2/oxc-unshadowed-visitor-0.1.0.tgz","_from":"file:oxc-unshadowed-visitor-0.1.0.tgz","_nodeVersion":"24.14.1","_npmVersion":"11.14.1","dist":{"integrity":"sha512-WC5yVscFTCOS7mKp95CySilgntq8Xz7gHc+NyOU4XMMMsmug1lXeykJcV92rpW6QuSFdjPOI8nKRfzlEmZ8MlQ==","shasum":"2554cfa81aa8888acda0cd8f1f76087c4a3ff0db","tarball":"https://registry.npmjs.org/oxc-unshadowed-visitor/-/oxc-unshadowed-visitor-0.1.0.tgz","fileCount":5,"unpackedSize":13797,"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/oxc-unshadowed-visitor@0.1.0","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"signatures":[{"keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U","sig":"MEUCIQDxom+phm1hR3O9ewmWxsnfZOKKXcqyzY2va+qS9D9PHwIgN7Cmwu9dKOQ2t5Zv7nLrQjjbsH1asq/5MrGn2HULeJw="}]},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:5bc03718-8676-4c90-b577-e8816bcb7b75"}},"directories":{},"maintainers":[{"name":"sapphi-red","email":"green@sapphi.red"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages-npm-production","tmp":"tmp/oxc-unshadowed-visitor_0.1.0_1778488611066_0.1047884777836181"},"_hasShrinkwrap":false}},"time":{"created":"2026-03-29T07:45:09.289Z","modified":"2026-05-11T08:36:51.496Z","0.0.0":"2026-03-29T07:45:09.433Z","0.0.1":"2026-03-29T07:53:28.508Z","0.1.0":"2026-05-11T08:36:51.204Z"},"bugs":{"url":"https://github.com/rolldown/plugins/issues"},"license":"MIT","homepage":"https://github.com/rolldown/plugins/tree/main/packages/oxc-unshadowed-visitor#readme","keywords":["ast","oxc","rolldown","scope","visitor"],"repository":{"type":"git","url":"git+https://github.com/rolldown/plugins.git","directory":"packages/oxc-unshadowed-visitor"},"description":"Scope-aware AST visitor that filters out references shadowed by local bindings","maintainers":[{"name":"sapphi-red","email":"green@sapphi.red"}],"readme":"# oxc-unshadowed-visitor [![npm](https://img.shields.io/npm/v/oxc-unshadowed-visitor.svg)](https://npmx.dev/package/oxc-unshadowed-visitor)\n\nScope-aware AST visitor that tracks references to specified names, filtering out those shadowed by local bindings. Performs single-pass analysis using Oxc's AST visitor.\n\nWorks with both `rolldown` and `oxc-parser`. At least one must be installed as a peer dependency.\n\n## Install\n\n```bash\npnpm add -D oxc-unshadowed-visitor\n```\n\nAlso install at least one of:\n\n```bash\npnpm add -D rolldown\n# or\npnpm add -D oxc-parser\n```\n\n## Usage\n\n```ts\nimport { parseSync, Visitor } from 'oxc-parser' // or from 'rolldown/utils'\nimport { ScopedVisitor } from 'oxc-unshadowed-visitor'\nimport type { WalkFn } from 'oxc-unshadowed-visitor'\n\nconst walk: WalkFn = (program, visitor) => new Visitor(visitor).visit(program)\nconst program = parseSync('app.tsx', code).program\n\nconst sv = new ScopedVisitor<string>({\n  trackedNames: ['React'],\n  walk,\n  visitor: {\n    Identifier(node, ctx) {\n      if (node.name === 'React') {\n        ctx.record({ name: node.name, node, data: 'jsx-ref' })\n      }\n    },\n  },\n})\n\nconst records = sv.walk(program)\n// records contains only references where `React` is NOT shadowed\n```\n\n## API\n\n### `ScopedVisitor<T>`\n\nMain class that walks the AST once and maintains a scope stack internally. When your visitor calls `ctx.record()`, the record is kept only if the tracked name is not shadowed at that point. If a later `var` declaration hoists into scope, previously recorded references are retroactively invalidated.\n\n#### `new ScopedVisitor(options)`\n\n- **`options.trackedNames`**: `string[]`. Names to track for shadowing.\n- **`options.visitor`**: `ScopedVisitorObject<T>`. Visitor object with handlers that receive the AST node and a `VisitorContext<T>`.\n- **`options.walk`**: `WalkFn`. Walk function that traverses the AST. Must call visitor handlers by node type (e.g. `Identifier`, `FunctionDeclaration:exit`).\n\n#### `sv.walk(program): TransformRecord<T>[]`\n\nWalks the given program AST and returns an array of records that were not shadowed.\n\n### `WalkFn`\n\n```ts\ntype WalkFn = (program: Program, visitor: SimpleVisitorObject) => void\n```\n\nA function that walks the AST and calls visitor handlers. Both `oxc-parser` and `rolldown/utils` export a `Visitor` class that can be used to create one:\n\n```ts\nconst walk: WalkFn = (program, visitor) => new Visitor(visitor).visit(program)\n```\n\n### `VisitorContext<T>`\n\n- **`record(opts: { name: string; node: object; data: T })`**: Records a reference. The record is automatically filtered out if the name is shadowed at the call site.\n\n### `TransformRecord<T>`\n\n```ts\ninterface TransformRecord<T> {\n  name: string\n  node: object\n  data: T\n}\n```\n\n## License\n\nMIT\n","readmeFilename":"README.md"}