{"_id":"@brainfish-ai/wayfinder-vite-plugin","_rev":"3-9820c63c62d9d185124c4b8b3dddb873","name":"@brainfish-ai/wayfinder-vite-plugin","dist-tags":{"latest":"0.1.2"},"versions":{"0.1.0":{"name":"@brainfish-ai/wayfinder-vite-plugin","version":"0.1.0","keywords":["wayfinder","vite-plugin","product-tour","onboarding"],"license":"MIT","_id":"@brainfish-ai/wayfinder-vite-plugin@0.1.0","maintainers":[{"name":"ajainvivek","email":"ajainvivek07@gmail.com"},{"name":"johnfumaster","email":"johnfumaster@gmail.com"},{"name":"charlie.shen.brainfi.sh","email":"charlie.shen@brainfi.sh"},{"name":"e.brainfish","email":"emmanuel@brainfi.sh"}],"dist":{"shasum":"e6dfcd3905c74219b8084570c8fbb3d4c2252df8","tarball":"https://registry.npmjs.org/@brainfish-ai/wayfinder-vite-plugin/-/wayfinder-vite-plugin-0.1.0.tgz","fileCount":11,"integrity":"sha512-TmbK2PxNmrIX0Lxae/iCKQZUF2D8RpHfQ/iYCuWHbmsYKwyBEulBG+vQDZE5tV5fpHCeHxTaGt2DWFE7jbP2Tw==","signatures":[{"sig":"MEQCIE9NhIZZ20gX8UdHxs/LviKuH05VtB/OvwsPFnjaeGylAiBktcWjhQNsh2lBIJYz/tq8efNW2mnjyqd59BXuGF85Xw==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":29028},"main":"./dist/wayfinder-vite-plugin.umd.cjs","type":"module","_from":"file:packages/vite-plugin/package.tgz","types":"./dist/index.d.ts","module":"./dist/wayfinder-vite-plugin.js","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/wayfinder-vite-plugin.js","require":"./dist/wayfinder-vite-plugin.umd.cjs"}},"scripts":{"dev":"node ../../node_modules/.bin/vite build --watch","build":"node ../../node_modules/.bin/vite build","typecheck":"node ../../node_modules/.bin/tsc --noEmit"},"_npmUser":{"name":"ajainvivek","email":"ajainvivek07@gmail.com"},"_resolved":"/home/runner/work/brainfish-wayfinder/brainfish-wayfinder/packages/vite-plugin/package.tgz","_integrity":"sha512-TmbK2PxNmrIX0Lxae/iCKQZUF2D8RpHfQ/iYCuWHbmsYKwyBEulBG+vQDZE5tV5fpHCeHxTaGt2DWFE7jbP2Tw==","_npmVersion":"10.9.4","description":"Vite plugin for @wayfinder/core — auto-injects data-tour attributes at build time so class obfuscation never breaks your tours","directories":{},"_nodeVersion":"22.22.1","_hasShrinkwrap":false,"peerDependencies":{"vite":">=4.0.0"},"_npmOperationalInternal":{"tmp":"tmp/wayfinder-vite-plugin_0.1.0_1773872853116_0.03316994013428798","host":"s3://npm-registry-packages-npm-production"}},"0.1.1":{"name":"@brainfish-ai/wayfinder-vite-plugin","version":"0.1.1","keywords":["wayfinder","vite-plugin","product-tour","onboarding"],"license":"MIT","_id":"@brainfish-ai/wayfinder-vite-plugin@0.1.1","maintainers":[{"name":"ajainvivek","email":"ajainvivek07@gmail.com"},{"name":"johnfumaster","email":"johnfumaster@gmail.com"},{"name":"charlie.shen.brainfi.sh","email":"charlie.shen@brainfi.sh"},{"name":"e.brainfish","email":"emmanuel@brainfi.sh"}],"dist":{"shasum":"a87b2fbdb6ae858780fc0d7f747463dd5e226ed9","tarball":"https://registry.npmjs.org/@brainfish-ai/wayfinder-vite-plugin/-/wayfinder-vite-plugin-0.1.1.tgz","fileCount":11,"integrity":"sha512-r8A81+jL4IZl6SQGwVns2mNEQi8VG2PDCzeTXnuKPbKLJ77uM7cGe6vLnsdVhxVHH68ZlHhzwWtMG5PFlMhTLA==","signatures":[{"sig":"MEUCIQD1p55KUv1lx+BD/5YyNcwxkzsSrdDJNKl/+uHVzOV5QQIgQ6gIpn1MAasnEsB2SgFSn0eyCkqBB327uSYKZGigCy4=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":29028},"main":"./dist/wayfinder-vite-plugin.umd.cjs","type":"module","_from":"file:packages/vite-plugin/package.tgz","types":"./dist/index.d.ts","module":"./dist/wayfinder-vite-plugin.js","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/wayfinder-vite-plugin.js","require":"./dist/wayfinder-vite-plugin.umd.cjs"}},"scripts":{"dev":"node ../../node_modules/.bin/vite build --watch","build":"node ../../node_modules/.bin/vite build","typecheck":"node ../../node_modules/.bin/tsc --noEmit"},"_npmUser":{"name":"ajainvivek","email":"ajainvivek07@gmail.com"},"_resolved":"/home/runner/work/brainfish-wayfinder/brainfish-wayfinder/packages/vite-plugin/package.tgz","_integrity":"sha512-r8A81+jL4IZl6SQGwVns2mNEQi8VG2PDCzeTXnuKPbKLJ77uM7cGe6vLnsdVhxVHH68ZlHhzwWtMG5PFlMhTLA==","_npmVersion":"10.9.4","description":"Vite plugin for @wayfinder/core — auto-injects data-tour attributes at build time so class obfuscation never breaks your tours","directories":{},"_nodeVersion":"22.22.1","_hasShrinkwrap":false,"peerDependencies":{"vite":">=4.0.0"},"_npmOperationalInternal":{"tmp":"tmp/wayfinder-vite-plugin_0.1.1_1773878395299_0.053226271030918815","host":"s3://npm-registry-packages-npm-production"}},"0.1.2":{"name":"@brainfish-ai/wayfinder-vite-plugin","version":"0.1.2","description":"Vite plugin for @wayfinder/core — auto-injects data-tour attributes at build time so class obfuscation never breaks your tours","keywords":["wayfinder","vite-plugin","product-tour","onboarding"],"license":"MIT","type":"module","main":"./dist/wayfinder-vite-plugin.umd.cjs","module":"./dist/wayfinder-vite-plugin.js","types":"./dist/index.d.ts","exports":{".":{"import":"./dist/wayfinder-vite-plugin.js","require":"./dist/wayfinder-vite-plugin.umd.cjs","types":"./dist/index.d.ts"}},"scripts":{"build":"node ../../node_modules/.bin/vite build","dev":"node ../../node_modules/.bin/vite build --watch","typecheck":"node ../../node_modules/.bin/tsc --noEmit"},"peerDependencies":{"vite":">=4.0.0"},"_id":"@brainfish-ai/wayfinder-vite-plugin@0.1.2","_integrity":"sha512-c5p0JZbGuAJxI0f3RdXoabd9JObEMQL8nTCD5IDMvlcjprYT+Yr1TCGT6mgBBwDNbYqek7TPAKoc/yWckzhfkw==","_resolved":"/home/runner/work/brainfish-wayfinder/brainfish-wayfinder/packages/vite-plugin/package.tgz","_from":"file:packages/vite-plugin/package.tgz","_nodeVersion":"22.22.1","_npmVersion":"10.9.4","dist":{"integrity":"sha512-c5p0JZbGuAJxI0f3RdXoabd9JObEMQL8nTCD5IDMvlcjprYT+Yr1TCGT6mgBBwDNbYqek7TPAKoc/yWckzhfkw==","shasum":"d3d1b409ccfd69303d232c208abaca144d6a621b","tarball":"https://registry.npmjs.org/@brainfish-ai/wayfinder-vite-plugin/-/wayfinder-vite-plugin-0.1.2.tgz","fileCount":11,"unpackedSize":29028,"signatures":[{"keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U","sig":"MEQCIEZBMzwrmofFtvn93H5AOyh5irCMiZp0cvA1s5R5ykPCAiBk6JxVQnXT982fTm4gt87TvCovLuESZBGEpcMyVeggkA=="}]},"_npmUser":{"name":"ajainvivek","email":"ajainvivek07@gmail.com"},"directories":{},"maintainers":[{"name":"ajainvivek","email":"ajainvivek07@gmail.com"},{"name":"johnfumaster","email":"johnfumaster@gmail.com"},{"name":"charlie.shen.brainfi.sh","email":"charlie.shen@brainfi.sh"},{"name":"e.brainfish","email":"emmanuel@brainfi.sh"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages-npm-production","tmp":"tmp/wayfinder-vite-plugin_0.1.2_1773954848658_0.7460762265300267"},"_hasShrinkwrap":false}},"time":{"created":"2026-03-18T22:27:33.053Z","modified":"2026-03-19T21:14:09.060Z","0.1.0":"2026-03-18T22:27:33.260Z","0.1.1":"2026-03-18T23:59:55.463Z","0.1.2":"2026-03-19T21:14:08.868Z"},"license":"MIT","keywords":["wayfinder","vite-plugin","product-tour","onboarding"],"description":"Vite plugin for @wayfinder/core — auto-injects data-tour attributes at build time so class obfuscation never breaks your tours","maintainers":[{"name":"ajainvivek","email":"ajainvivek07@gmail.com"},{"name":"johnfumaster","email":"johnfumaster@gmail.com"},{"name":"charlie.shen.brainfi.sh","email":"charlie.shen@brainfi.sh"},{"name":"e.brainfish","email":"emmanuel@brainfi.sh"}],"readme":"# @wayfinder/vite-plugin\n\nA Vite plugin for [`@wayfinder/core`](../core) that auto-injects `data-tour` attributes into your source files at build time — zero runtime cost, zero manual markup changes needed.\n\n## Installation\n\n```bash\nnpm install -D @wayfinder/vite-plugin\n```\n\n## The problem\n\nWhen class names are obfuscated at build time, you cannot target elements by class. The `@wayfinder/react` and `@wayfinder/vue` helpers solve this at the component level by requiring small code changes. This plugin solves it at the **build level** — no component changes required at all.\n\n## Setup\n\n```typescript\n// vite.config.ts\nimport { wayfinderPlugin } from '@wayfinder/vite-plugin';\n\nexport default {\n  plugins: [\n    wayfinderPlugin({\n      inject: {\n        // Add data-tour=\"create-btn\" to every <CreateButton …> JSX tag\n        'create-btn': { component: 'CreateButton' },\n\n        // Add data-tour=\"search-bar\" next to existing data-testid=\"search-input\"\n        'search-bar': { testId: 'search-input' },\n\n        // Add data-tour=\"nav-home\" to any element containing id=\"nav-home\"\n        'nav-home': { selector: 'id=\"nav-home\"' },\n      }\n    })\n  ]\n}\n```\n\nThen target elements in your Wayfinder config using `tourId()`:\n\n```typescript\nimport { Wayfinder, tourId } from '@wayfinder/core';\n\nconst tour = new Wayfinder({\n  steps: [\n    { id: 'create-btn', target: tourId('create-btn'), title: '...', description: '...' },\n    { id: 'search-bar', target: tourId('search-bar'), title: '...', description: '...' },\n  ],\n});\n```\n\n## Injection rules\n\nEach key in `inject` is a tour step ID. The value is an `InjectRule` with one of three match strategies:\n\n| Strategy | Matches | Example |\n|---|---|---|\n| `component` | JSX/TSX opening tag by display name | `{ component: 'CreateButton' }` |\n| `testId` | Elements with an existing `data-testid` value | `{ testId: 'search-input' }` |\n| `selector` | Any raw attribute string on an opening tag | `{ selector: 'id=\"nav-home\"' }` |\n\n## Options\n\n| Option | Type | Default | Description |\n|---|---|---|---|\n| `inject` | `Record<string, InjectRule>` | — | Required. Map of step IDs to injection rules |\n| `attribute` | `string` | `'data-tour'` | The attribute name to inject. Must match `tourAttribute` in `WayfinderConfig` |\n| `include` | `string[]` | `['.jsx','.tsx','.vue','.svelte']` | File extensions to transform |\n\n## Custom attribute\n\n```typescript\nwayfinderPlugin({\n  attribute: 'data-wf-target',\n  inject: { 'create-btn': { component: 'CreateButton' } }\n})\n\n// Pair with WayfinderConfig:\nnew Wayfinder({ tourAttribute: 'data-wf-target', steps: [...] })\n```\n\n## How it works\n\nThe plugin runs as a `pre` transform on matching source files. For each injection rule it applies a lightweight regex replacement — no full AST parsing. The plugin never double-injects: if the attribute already exists in the source, it is skipped.\n","readmeFilename":"README.md"}