{"_id":"@ab-test-sdk/codemod","_rev":"2-539710f3db2b7ef3ec9a4ef80088a496","name":"@ab-test-sdk/codemod","dist-tags":{"latest":"0.1.1"},"versions":{"0.1.0":{"name":"@ab-test-sdk/codemod","version":"0.1.0","_id":"@ab-test-sdk/codemod@0.1.0","maintainers":[{"name":"hogan_kai","email":"ooss87968863@gmail.com"}],"bin":{"ab-codemod":"dist/index.js"},"dist":{"shasum":"f9b06a5da4d572e2497e365d37df288380638fca","tarball":"https://registry.npmjs.org/@ab-test-sdk/codemod/-/codemod-0.1.0.tgz","fileCount":5,"integrity":"sha512-+U64uBH1UGZbTX4gzhbPhH7I02I6JThCzlsHF5m7cIeSx9svpSjpkdmhMtVXGhvb8qRVx3aJdq7f17SzmrS8fg==","signatures":[{"sig":"MEYCIQDKEJ9jxERok1VR1OL3NpgnJJRkoqHrz0XyPEYrkqwDpwIhANLWrsH8I7aIuWelgzZxTZ0fqaz/tIVox8oEC0QIcru9","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":18380},"main":"./dist/index.js","types":"./dist/index.d.ts","gitHead":"216ad5b202b280836226554157f08bf1ca5c970a","scripts":{"dev":"tsup --watch","build":"tsup"},"_npmUser":{"name":"hogan_kai","email":"ooss87968863@gmail.com"},"_npmVersion":"11.9.0","description":"A/B Test SDK codemod CLI — inject data-ab ids into Vue 3 source","directories":{},"_nodeVersion":"24.14.0","dependencies":{"glob":"^11.0.2","magic-string":"^0.30.17","@vue/compiler-dom":"^3.5.13","@vue/compiler-sfc":"^3.5.13"},"_hasShrinkwrap":false,"devDependencies":{"tsup":"^8.4.0","typescript":"^5.8.3","@types/node":"^25.9.1"},"_npmOperationalInternal":{"tmp":"tmp/codemod_0.1.0_1780579449033_0.5632616151976844","host":"s3://npm-registry-packages-npm-production"}},"0.1.1":{"name":"@ab-test-sdk/codemod","version":"0.1.1","description":"A/B Test SDK codemod CLI — inject data-ab ids into Vue 3 source","main":"./dist/index.js","types":"./dist/index.d.ts","bin":{"ab-codemod":"dist/index.js"},"scripts":{"build":"tsup","dev":"tsup --watch"},"dependencies":{"@vue/compiler-dom":"^3.5.13","@vue/compiler-sfc":"^3.5.13","glob":"^11.0.2","magic-string":"^0.30.17"},"devDependencies":{"@types/node":"^25.9.1","tsup":"^8.4.0","typescript":"^5.8.3"},"gitHead":"a56d0e510905d86ac2dc387e4cb6c459089d7805","_id":"@ab-test-sdk/codemod@0.1.1","_nodeVersion":"24.14.0","_npmVersion":"11.9.0","dist":{"integrity":"sha512-4wyMHgnbn+NT9qihjN2/mATC4LvEH31328j1a0GhVZyCUV0YZLS2sgP5FiDQ5hJph87F11wgj0CcRHxCvrr7fQ==","shasum":"9734b8b5da137036f841ebcce6ba14f901ac9cb9","tarball":"https://registry.npmjs.org/@ab-test-sdk/codemod/-/codemod-0.1.1.tgz","fileCount":5,"unpackedSize":19223,"signatures":[{"keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U","sig":"MEQCICJPfuAfxXZ+RiuYfz4GHSR7ku3wsnj5MUYBWRQCRiBTAiAHl/0UieJWPWTx+OqTWzfkuVsBR9chdaXZfG8iVY/9gQ=="}]},"_npmUser":{"name":"hogan_kai","email":"ooss87968863@gmail.com"},"directories":{},"maintainers":[{"name":"hogan_kai","email":"ooss87968863@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages-npm-production","tmp":"tmp/codemod_0.1.1_1781090531463_0.24246084566978743"},"_hasShrinkwrap":false}},"time":{"created":"2026-06-04T13:24:08.842Z","modified":"2026-06-10T11:22:11.759Z","0.1.0":"2026-06-04T13:24:09.180Z","0.1.1":"2026-06-10T11:22:11.615Z"},"description":"A/B Test SDK codemod CLI — inject data-ab ids into Vue 3 source","maintainers":[{"name":"hogan_kai","email":"ooss87968863@gmail.com"}],"readme":"# @ab-test-sdk/codemod\n\n[`@ab-test-sdk/sdk`](https://www.npmjs.com/package/@ab-test-sdk/sdk) 的伴隨 CLI —— 掃描 Vue 3 `.vue`，為可定位的元素自動注入穩定的 `data-ab` id。\n\nid 一次性寫進 source code、跨 build 不變，是整套穩定身份系統的基礎，讓實驗定位不因網站改版而失效。\n\n> 完整架構與設計說明見 [專案 README](https://github.com/Hogan-K/A-B-Test)。\n\n## 安裝\n\n```bash\npnpm add -D @ab-test-sdk/codemod\n```\n\n## 使用\n\n```bash\npnpm exec ab-codemod inject src\n```\n\n- 參數為要掃描的資料夾（省略則為當前目錄）；建議指向 `src`，避免掃進 `node_modules`。\n- 已有 `data-ab` 的元素會跳過，可安全重複執行（只補新元素）。\n\n## 效果\n\n注入前後（只新增屬性，保留你原始的程式碼格式）：\n\n```diff\n- <button class=\"hero__cta\">Shop now</button>\n+ <button class=\"hero__cta\" data-ab=\"beba2d0c\">Shop now</button>\n```\n\n這個 `data-ab` 寫進原始碼後就固定下來，之後 SDK 便以它定位元素來套用實驗與追蹤。\n\n## 服務範圍\n\n只對這些**白名單標籤**注入 `data-ab`：\n`button`、`a`、`input`、`select`、`textarea`、`form`、`h1`–`h6`、`img`、`video`、`audio`、`p`、`span`、`li`\n\n## 限制\n\n- **跳過**：自訂元件（大寫開頭 / 含 `-`）、Vue 結構標籤（`template`、`slot`…）、含 `v-html` 的元素。\n- 含動態文字（`{{ }}` / `v-text`）的元素：照樣注入 id，但加註 `data-ab-text-locked`，提示 SDK 不可改其文字。\n- `v-for` 整批共用同一個 id（不支援個別 instance 單獨實驗）。\n- id 為隨機產生：**請跑一次、commit，之後勿重跑**（重跑會為新元素產新 id；已注入的會跳過、保持不變）。\n\n## 運作 / 技術\n\n- 以 `@vue/compiler-sfc` / `@vue/compiler-dom` 解析 SFC 與 template AST，精準判斷可注入的元素。\n- 用 `magic-string` 修改 source：**只插入屬性、不重排你的程式碼**，保留原始格式。\n- 用 `glob` 掃描 `.vue` 檔。\n\n## 相關\n\n- Runtime SDK：[`@ab-test-sdk/sdk`](https://www.npmjs.com/package/@ab-test-sdk/sdk)\n- 原始碼 / 架構：[github.com/Hogan-K/A-B-Test](https://github.com/Hogan-K/A-B-Test)\n","readmeFilename":"README.md"}