{"_id":"@absmartly/sdk-plugins","_rev":"11-9ec6c7fca37989d8eb412b9d9435d616","name":"@absmartly/sdk-plugins","dist-tags":{"latest":"1.3.7"},"versions":{"1.0.1":{"name":"@absmartly/sdk-plugins","version":"1.0.1","keywords":["absmartly","ab-testing","experimentation","dom-manipulation","visual-editor"],"author":{"name":"ABsmartly"},"license":"MIT","_id":"@absmartly/sdk-plugins@1.0.1","maintainers":[{"name":"marcioapm","email":"marcioapm@gmail.com"},{"name":"joalves","email":"jonas@absmartly.com"},{"name":"caltheabtester","email":"cal@absmartly.com"},{"name":"marcioabs","email":"marcio@absmartly.com"}],"homepage":"https://github.com/absmartly/dom-changes-plugin#readme","bugs":{"url":"https://github.com/absmartly/dom-changes-plugin/issues"},"dist":{"shasum":"f8136cfce388ddc34ca766289bc89489e341c86e","tarball":"https://registry.npmjs.org/@absmartly/sdk-plugins/-/sdk-plugins-1.0.1.tgz","fileCount":177,"integrity":"sha512-aA62gm+3awBqIfuLWHIai/dKw9dpKZ0f35a1a/Z6xZn2UJOVHzhoKmrYYmQOEeOSu2a+OvkUuLE9wSCDIZAmSQ==","signatures":[{"sig":"MEQCIEidzInRn2+fzawdjGPp1Q7XUaMDZTiueyINNY6k+4yrAiBjN9llZrvnSv9DZxIpVwIAWOwYU3Jxd57gNcrG5MzWWQ==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":1325883},"main":"lib/index.js","types":"types/index.d.ts","module":"es/index.js","browser":"dist/absmartly-sdk-plugins.min.js","gitHead":"3a2ff603b35ddf72399dae98554a74c2b9bce378","scripts":{"dev":"tsc --watch","lint":"eslint src --ext .ts,.tsx","test":"jest","build":"npm run clean && npm run format && npm run lint && npm run compile && npm run bundle","clean":"rm -rf lib es dist types","watch":"webpack --mode development --watch --env BUILD_TYPE=all --devtool source-map","bundle":"webpack --mode production --env BUILD_TYPE=all","deploy":"npm run build && npm test && npm publish --access public","format":"prettier --write \"src/**/*.{js,ts,tsx}\"","compile":"npm run compile:cjs && npm run compile:es && npm run compile:types","dev:all":"npm run compile:cjs -- --watch & npm run compile:es -- --watch & npm run compile:types -- --watch","build:all":"npm run build && npm run bundle:dev && npm run rename:dev","build:dev":"npm run clean && npm run format && npm run lint && npm run compile && npm run bundle:dev","bundle:dev":"webpack --mode development --env BUILD_TYPE=all --devtool source-map","bundle:dom":"webpack --mode production --env BUILD_TYPE=dom-only","compile:es":"tsc -p tsconfig.es.json","postbundle":"cp dist/*.min.js ../absmartly.com/static/ 2>/dev/null || true","rename:dev":"cd dist && for file in *.js; do if [[ ! \"$file\" == *.min.js ]] && [[ ! \"$file\" == *.dev.js ]]; then mv \"$file\" \"${file%.js}.dev.js\"; fi; done; exit 0","test:watch":"jest --watch","bundle:full":"webpack --mode production --env BUILD_TYPE=dom-full","bundle:lite":"webpack --mode production --env BUILD_TYPE=dom-lite","compile:cjs":"tsc -p tsconfig.cjs.json","bundle:cookie":"webpack --mode production --env BUILD_TYPE=cookie-only","bundle:vitals":"webpack --mode production --env BUILD_TYPE=vitals-only","compile:types":"tsc -p tsconfig.types.json","test:coverage":"jest --coverage","version:major":"npm version major","version:minor":"npm version minor","version:patch":"npm version patch","bundle:dev:all":"npm run bundle:dev:dom && npm run bundle:dev:lite && npm run bundle:dev:full && npm run bundle:dev:cookie && npm run bundle:dev:vitals && npm run bundle:dev:overrides","bundle:dev:dom":"webpack --mode development --env BUILD_TYPE=dom-only --devtool source-map","deploy:dry-run":"npm run build && npm test && npm publish --dry-run --access public","prepublishOnly":"npm run build && npm test","bundle:dev:full":"webpack --mode development --env BUILD_TYPE=dom-full --devtool source-map","bundle:dev:lite":"webpack --mode development --env BUILD_TYPE=dom-lite --devtool source-map","bundle:dev:cookie":"webpack --mode development --env BUILD_TYPE=cookie-only --devtool source-map","bundle:dev:vitals":"webpack --mode development --env BUILD_TYPE=vitals-only --devtool source-map","bundle:dev:overrides":"webpack --mode development --env BUILD_TYPE=overrides-lite --devtool source-map && webpack --mode development --env BUILD_TYPE=overrides-full --devtool source-map"},"_npmUser":{"name":"joalves","email":"jonas@absmartly.com"},"repository":{"url":"git+https://github.com/absmartly/sdk-plugins.git","type":"git"},"_npmVersion":"11.3.0","description":"Collection of plugins for ABsmartly JavaScript SDK","directories":{},"_nodeVersion":"22.15.0","_hasShrinkwrap":false,"devDependencies":{"jest":"^29.7.0","jsdom":"^26.1.0","eslint":"^8.50.0","ts-jest":"^29.4.1","webpack":"^5.88.2","prettier":"^3.0.3","ts-loader":"^9.4.4","typescript":"^5.2.2","@types/jest":"^29.5.14","@types/node":"^20.8.0","webpack-cli":"^5.1.4","eslint-config-prettier":"^9.0.0","eslint-plugin-prettier":"^5.0.0","jest-environment-jsdom":"^29.7.0","@testing-library/jest-dom":"^6.8.0","@typescript-eslint/parser":"^6.7.4","@typescript-eslint/eslint-plugin":"^6.7.4"},"peerDependencies":{"@absmartly/javascript-sdk":"^1.0.0"},"_npmOperationalInternal":{"tmp":"tmp/sdk-plugins_1.0.1_1760181065564_0.7588791052687283","host":"s3://npm-registry-packages-npm-production"}},"1.1.0":{"name":"@absmartly/sdk-plugins","version":"1.1.0","keywords":["absmartly","ab-testing","experimentation","dom-manipulation","visual-editor"],"author":{"name":"ABsmartly"},"license":"MIT","_id":"@absmartly/sdk-plugins@1.1.0","maintainers":[{"name":"marcioapm","email":"marcioapm@gmail.com"},{"name":"joalves","email":"jonas@absmartly.com"},{"name":"caltheabtester","email":"cal@absmartly.com"},{"name":"marcioabs","email":"marcio@absmartly.com"}],"homepage":"https://github.com/absmartly/dom-changes-plugin#readme","bugs":{"url":"https://github.com/absmartly/dom-changes-plugin/issues"},"dist":{"shasum":"9a14acb40a74cee3c73a13002017649ce700e771","tarball":"https://registry.npmjs.org/@absmartly/sdk-plugins/-/sdk-plugins-1.1.0.tgz","fileCount":189,"integrity":"sha512-whzc9+bDzB7xCtvVLE0OkiBQt4fmyuzm531aXC72fQvqFuVRz4loJqTmHNB5KzB5Q/oGnQrNCEkX0w1TyE+3tA==","signatures":[{"sig":"MEYCIQCB0TBFIBVawOo1vpOkhsqeCgloMMfTwxjlq4pxNMEDHAIhALR/dyMuM1obC6V+KEdrlAD/4NdwaELisybnsocmu68D","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":1447179},"main":"lib/index.js","types":"types/index.d.ts","module":"es/index.js","browser":"dist/absmartly-sdk-plugins.min.js","gitHead":"16223d8b78fdf6373be2d30fbdf65767e53805e5","scripts":{"dev":"tsc --watch","lint":"eslint src --ext .ts,.tsx","test":"jest","build":"npm run clean && npm run format && npm run lint && npm run compile && npm run bundle","clean":"rm -rf lib es dist types","watch":"webpack --mode development --watch --env BUILD_TYPE=all --devtool source-map","bundle":"webpack --mode production --env BUILD_TYPE=all","deploy":"npm run build && npm test && npm publish --access public","format":"prettier --write \"src/**/*.{js,ts,tsx}\"","compile":"npm run compile:cjs && npm run compile:es && npm run compile:types","dev:all":"npm run compile:cjs -- --watch & npm run compile:es -- --watch & npm run compile:types -- --watch","build:all":"npm run build && npm run bundle:dev && npm run rename:dev","build:dev":"npm run clean && npm run format && npm run lint && npm run compile && npm run bundle:dev","bundle:dev":"webpack --mode development --env BUILD_TYPE=all --devtool source-map","bundle:dom":"webpack --mode production --env BUILD_TYPE=dom-only","compile:es":"tsc -p tsconfig.es.json","postbundle":"cp dist/*.min.js ../absmartly.com/static/ 2>/dev/null || true","rename:dev":"cd dist && for file in *.js; do if [[ ! \"$file\" == *.min.js ]] && [[ ! \"$file\" == *.dev.js ]]; then mv \"$file\" \"${file%.js}.dev.js\"; fi; done; exit 0","test:watch":"jest --watch","bundle:full":"webpack --mode production --env BUILD_TYPE=dom-full","bundle:lite":"webpack --mode production --env BUILD_TYPE=dom-lite","compile:cjs":"tsc -p tsconfig.cjs.json","bundle:cookie":"webpack --mode production --env BUILD_TYPE=cookie-only","bundle:vitals":"webpack --mode production --env BUILD_TYPE=vitals-only","compile:types":"tsc -p tsconfig.types.json","test:coverage":"jest --coverage","version:major":"npm version major","version:minor":"npm version minor","version:patch":"npm version patch","bundle:dev:all":"npm run bundle:dev:dom && npm run bundle:dev:lite && npm run bundle:dev:full && npm run bundle:dev:cookie && npm run bundle:dev:vitals && npm run bundle:dev:overrides","bundle:dev:dom":"webpack --mode development --env BUILD_TYPE=dom-only --devtool source-map","deploy:dry-run":"npm run build && npm test && npm publish --dry-run --access public","prepublishOnly":"npm run build && npm test","bundle:dev:full":"webpack --mode development --env BUILD_TYPE=dom-full --devtool source-map","bundle:dev:lite":"webpack --mode development --env BUILD_TYPE=dom-lite --devtool source-map","bundle:dev:cookie":"webpack --mode development --env BUILD_TYPE=cookie-only --devtool source-map","bundle:dev:vitals":"webpack --mode development --env BUILD_TYPE=vitals-only --devtool source-map","bundle:dev:overrides":"webpack --mode development --env BUILD_TYPE=overrides-lite --devtool source-map && webpack --mode development --env BUILD_TYPE=overrides-full --devtool source-map"},"_npmUser":{"name":"joalves","email":"jonas@absmartly.com"},"repository":{"url":"git+https://github.com/absmartly/sdk-plugins.git","type":"git"},"_npmVersion":"11.3.0","description":"Collection of plugins for ABsmartly JavaScript SDK","directories":{},"_nodeVersion":"22.15.0","dependencies":{"web-vitals":"^5.1.0"},"_hasShrinkwrap":false,"devDependencies":{"jest":"^29.7.0","jsdom":"^26.1.0","eslint":"^8.50.0","ts-jest":"^29.4.1","webpack":"^5.88.2","prettier":"^3.0.3","ts-loader":"^9.4.4","typescript":"^5.2.2","@types/jest":"^29.5.14","@types/node":"^20.8.0","webpack-cli":"^5.1.4","eslint-config-prettier":"^9.0.0","eslint-plugin-prettier":"^5.0.0","jest-environment-jsdom":"^29.7.0","@testing-library/jest-dom":"^6.8.0","@typescript-eslint/parser":"^6.7.4","@typescript-eslint/eslint-plugin":"^6.7.4"},"peerDependencies":{"@absmartly/javascript-sdk":"^1.0.0"},"_npmOperationalInternal":{"tmp":"tmp/sdk-plugins_1.1.0_1760541315028_0.26857048045859644","host":"s3://npm-registry-packages-npm-production"}},"1.1.1":{"name":"@absmartly/sdk-plugins","version":"1.1.1","keywords":["absmartly","ab-testing","experimentation","dom-manipulation","visual-editor"],"author":{"name":"ABsmartly"},"license":"MIT","_id":"@absmartly/sdk-plugins@1.1.1","maintainers":[{"name":"marcioapm","email":"marcioapm@gmail.com"},{"name":"joalves","email":"jonas@absmartly.com"},{"name":"caltheabtester","email":"cal@absmartly.com"},{"name":"marcioabs","email":"marcio@absmartly.com"}],"homepage":"https://github.com/absmartly/dom-changes-plugin#readme","bugs":{"url":"https://github.com/absmartly/dom-changes-plugin/issues"},"dist":{"shasum":"ec98b27c9659302c077d5943dd403ce15920639a","tarball":"https://registry.npmjs.org/@absmartly/sdk-plugins/-/sdk-plugins-1.1.1.tgz","fileCount":189,"integrity":"sha512-bgykJAUB6AAjX5nG9k1TwDhsviMzdQs+E3L/LotHdZsBzZDELA95YbNytFBHLqTKPQq9XWD+w0rSSHPvri7KDA==","signatures":[{"sig":"MEYCIQCPShmrmHpxeFaTlHkw3O2X/e10w0V3Z2gxHLWI2WfEcgIhAPD//Jrs+BjrjFCCtgcUzKocbcZn6tgdNU/d9yzROxOR","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":1455117},"main":"lib/index.js","types":"types/index.d.ts","module":"es/index.js","browser":"dist/absmartly-sdk-plugins.min.js","gitHead":"9879b0235a161ca57350d9885f5a49e685c1a0ea","scripts":{"dev":"tsc --watch","lint":"eslint src --ext .ts,.tsx","test":"jest","build":"npm run clean && npm run format && npm run lint && npm run compile && npm run bundle","clean":"rm -rf lib es dist types","watch":"webpack --mode development --watch --env BUILD_TYPE=all --devtool source-map","bundle":"webpack --mode production --env BUILD_TYPE=all","deploy":"npm run build && npm test && npm publish --access public","format":"prettier --write \"src/**/*.{js,ts,tsx}\"","compile":"npm run compile:cjs && npm run compile:es && npm run compile:types","dev:all":"npm run compile:cjs -- --watch & npm run compile:es -- --watch & npm run compile:types -- --watch","build:all":"npm run build && npm run bundle:dev && npm run rename:dev","build:dev":"npm run clean && npm run format && npm run lint && npm run compile && npm run bundle:dev","bundle:dev":"webpack --mode development --env BUILD_TYPE=all --devtool source-map","bundle:dom":"webpack --mode production --env BUILD_TYPE=dom-only","compile:es":"tsc -p tsconfig.es.json","postbundle":"cp dist/*.min.js ../absmartly.com/static/ 2>/dev/null || true","rename:dev":"cd dist && for file in *.js; do if [[ ! \"$file\" == *.min.js ]] && [[ ! \"$file\" == *.dev.js ]]; then mv \"$file\" \"${file%.js}.dev.js\"; fi; done; exit 0","test:watch":"jest --watch","bundle:full":"webpack --mode production --env BUILD_TYPE=dom-full","bundle:lite":"webpack --mode production --env BUILD_TYPE=dom-lite","compile:cjs":"tsc -p tsconfig.cjs.json","bundle:cookie":"webpack --mode production --env BUILD_TYPE=cookie-only","bundle:vitals":"webpack --mode production --env BUILD_TYPE=vitals-only","compile:types":"tsc -p tsconfig.types.json","test:coverage":"jest --coverage","version:major":"npm version major","version:minor":"npm version minor","version:patch":"npm version patch","bundle:dev:all":"npm run bundle:dev:dom && npm run bundle:dev:lite && npm run bundle:dev:full && npm run bundle:dev:cookie && npm run bundle:dev:vitals && npm run bundle:dev:overrides","bundle:dev:dom":"webpack --mode development --env BUILD_TYPE=dom-only --devtool source-map","deploy:dry-run":"npm run build && npm test && npm publish --dry-run --access public","prepublishOnly":"npm run build && npm test","bundle:dev:full":"webpack --mode development --env BUILD_TYPE=dom-full --devtool source-map","bundle:dev:lite":"webpack --mode development --env BUILD_TYPE=dom-lite --devtool source-map","bundle:dev:cookie":"webpack --mode development --env BUILD_TYPE=cookie-only --devtool source-map","bundle:dev:vitals":"webpack --mode development --env BUILD_TYPE=vitals-only --devtool source-map","bundle:dev:overrides":"webpack --mode development --env BUILD_TYPE=overrides-lite --devtool source-map && webpack --mode development --env BUILD_TYPE=overrides-full --devtool source-map"},"_npmUser":{"name":"joalves","email":"jonas@absmartly.com"},"repository":{"url":"git+https://github.com/absmartly/sdk-plugins.git","type":"git"},"_npmVersion":"11.3.0","description":"Collection of plugins for ABsmartly JavaScript SDK","directories":{},"_nodeVersion":"22.15.0","dependencies":{"web-vitals":"^5.1.0"},"_hasShrinkwrap":false,"devDependencies":{"jest":"^29.7.0","jsdom":"^26.1.0","eslint":"^8.50.0","ts-jest":"^29.4.1","webpack":"^5.88.2","prettier":"^3.0.3","ts-loader":"^9.4.4","typescript":"^5.2.2","@types/jest":"^29.5.14","@types/node":"^20.8.0","webpack-cli":"^5.1.4","eslint-config-prettier":"^9.0.0","eslint-plugin-prettier":"^5.0.0","jest-environment-jsdom":"^29.7.0","@testing-library/jest-dom":"^6.8.0","@typescript-eslint/parser":"^6.7.4","@typescript-eslint/eslint-plugin":"^6.7.4"},"peerDependencies":{"@absmartly/javascript-sdk":"^1.0.0"},"_npmOperationalInternal":{"tmp":"tmp/sdk-plugins_1.1.1_1761217465556_0.655637676832441","host":"s3://npm-registry-packages-npm-production"}},"1.1.2":{"name":"@absmartly/sdk-plugins","version":"1.1.2","keywords":["absmartly","ab-testing","experimentation","dom-manipulation","visual-editor"],"author":{"name":"ABsmartly"},"license":"MIT","_id":"@absmartly/sdk-plugins@1.1.2","maintainers":[{"name":"marcioapm","email":"marcioapm@gmail.com"},{"name":"joalves","email":"jonas@absmartly.com"},{"name":"caltheabtester","email":"cal@absmartly.com"},{"name":"marcioabs","email":"marcio@absmartly.com"}],"homepage":"https://github.com/absmartly/dom-changes-plugin#readme","bugs":{"url":"https://github.com/absmartly/dom-changes-plugin/issues"},"dist":{"shasum":"3756c420028aea924409d554857facd9dfec0932","tarball":"https://registry.npmjs.org/@absmartly/sdk-plugins/-/sdk-plugins-1.1.2.tgz","fileCount":189,"integrity":"sha512-cLQ+Bsj6WGqVmA0c/GVs/Fi2bVR2mj7sFT30DrTasiTC/S7ln2Lr6PMl152O1AMu+VHFGkJKI2OPM3yNq2zn8Q==","signatures":[{"sig":"MEUCIEIKnCj/JIOcnR1WaZpR75e647H4iFtmNl2sjgY49GYvAiEA7//+msL071UiMb1fQS2XXyF6+3adptwAWI2JDVUCmjw=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":1458162},"main":"lib/index.js","types":"types/index.d.ts","module":"es/index.js","browser":"dist/absmartly-sdk-plugins.min.js","gitHead":"ef9178e815d1f5465ce22e7d09d47a934183e9b8","scripts":{"dev":"tsc --watch","lint":"eslint src --ext .ts,.tsx","test":"jest","build":"npm run clean && npm run format && npm run lint && npm run compile && npm run bundle","clean":"rm -rf lib es dist types","watch":"webpack --mode development --watch --env BUILD_TYPE=all --devtool source-map","bundle":"webpack --mode production --env BUILD_TYPE=all","deploy":"npm run build && npm test && npm publish --access public","format":"prettier --write \"src/**/*.{js,ts,tsx}\"","compile":"npm run compile:cjs && npm run compile:es && npm run compile:types","dev:all":"npm run compile:cjs -- --watch & npm run compile:es -- --watch & npm run compile:types -- --watch","build:all":"npm run build && npm run bundle:dev && npm run rename:dev","build:dev":"npm run clean && npm run format && npm run lint && npm run compile && npm run bundle:dev","bundle:dev":"webpack --mode development --env BUILD_TYPE=all --devtool source-map","bundle:dom":"webpack --mode production --env BUILD_TYPE=dom-only","compile:es":"tsc -p tsconfig.es.json","postbundle":"cp dist/*.min.js ../absmartly.com/static/ 2>/dev/null || true","rename:dev":"cd dist && for file in *.js; do if [[ ! \"$file\" == *.min.js ]] && [[ ! \"$file\" == *.dev.js ]]; then mv \"$file\" \"${file%.js}.dev.js\"; fi; done; exit 0","test:watch":"jest --watch","bundle:full":"webpack --mode production --env BUILD_TYPE=dom-full","bundle:lite":"webpack --mode production --env BUILD_TYPE=dom-lite","compile:cjs":"tsc -p tsconfig.cjs.json","bundle:cookie":"webpack --mode production --env BUILD_TYPE=cookie-only","bundle:vitals":"webpack --mode production --env BUILD_TYPE=vitals-only","compile:types":"tsc -p tsconfig.types.json","test:coverage":"jest --coverage","version:major":"npm version major","version:minor":"npm version minor","version:patch":"npm version patch","bundle:dev:all":"npm run bundle:dev:dom && npm run bundle:dev:lite && npm run bundle:dev:full && npm run bundle:dev:cookie && npm run bundle:dev:vitals && npm run bundle:dev:overrides","bundle:dev:dom":"webpack --mode development --env BUILD_TYPE=dom-only --devtool source-map","deploy:dry-run":"npm run build && npm test && npm publish --dry-run --access public","prepublishOnly":"npm run build && npm test","bundle:dev:full":"webpack --mode development --env BUILD_TYPE=dom-full --devtool source-map","bundle:dev:lite":"webpack --mode development --env BUILD_TYPE=dom-lite --devtool source-map","bundle:dev:cookie":"webpack --mode development --env BUILD_TYPE=cookie-only --devtool source-map","bundle:dev:vitals":"webpack --mode development --env BUILD_TYPE=vitals-only --devtool source-map","bundle:dev:overrides":"webpack --mode development --env BUILD_TYPE=overrides-lite --devtool source-map && webpack --mode development --env BUILD_TYPE=overrides-full --devtool source-map"},"_npmUser":{"name":"joalves","email":"jonas@absmartly.com"},"repository":{"url":"git+https://github.com/absmartly/sdk-plugins.git","type":"git"},"_npmVersion":"11.3.0","description":"Collection of plugins for ABsmartly JavaScript SDK","directories":{},"_nodeVersion":"22.15.0","dependencies":{"web-vitals":"^5.1.0"},"_hasShrinkwrap":false,"devDependencies":{"jest":"^29.7.0","jsdom":"^26.1.0","eslint":"^8.50.0","ts-jest":"^29.4.1","webpack":"^5.88.2","prettier":"^3.0.3","ts-loader":"^9.4.4","typescript":"^5.2.2","@types/jest":"^29.5.14","@types/node":"^20.8.0","webpack-cli":"^5.1.4","eslint-config-prettier":"^9.0.0","eslint-plugin-prettier":"^5.0.0","jest-environment-jsdom":"^29.7.0","@testing-library/jest-dom":"^6.8.0","@typescript-eslint/parser":"^6.7.4","@typescript-eslint/eslint-plugin":"^6.7.4"},"peerDependencies":{"@absmartly/javascript-sdk":"^1.0.0"},"_npmOperationalInternal":{"tmp":"tmp/sdk-plugins_1.1.2_1762275650262_0.21664616461984987","host":"s3://npm-registry-packages-npm-production"}},"1.2.1":{"name":"@absmartly/sdk-plugins","version":"1.2.1","keywords":["absmartly","ab-testing","experimentation","dom-manipulation","visual-editor"],"author":{"name":"ABsmartly"},"license":"MIT","_id":"@absmartly/sdk-plugins@1.2.1","maintainers":[{"name":"marcioapm","email":"marcioapm@gmail.com"},{"name":"joalves","email":"jonas@absmartly.com"},{"name":"caltheabtester","email":"cal@absmartly.com"},{"name":"marcioabs","email":"marcio@absmartly.com"}],"homepage":"https://github.com/absmartly/dom-changes-plugin#readme","bugs":{"url":"https://github.com/absmartly/dom-changes-plugin/issues"},"dist":{"shasum":"0f502331658c0be7318adbae41faf9fbb5bdb1ae","tarball":"https://registry.npmjs.org/@absmartly/sdk-plugins/-/sdk-plugins-1.2.1.tgz","fileCount":231,"integrity":"sha512-NWkUxINXk4+kD5nkgbMuZW98xJvJZkb7oxJwdfwlJk42G5jpZxCsFUSB5f3HFPOCdIDvKO9Bn/BvH+UH7DgCKQ==","signatures":[{"sig":"MEYCIQDpVyTYdETegP5Sfi4ZpQuL2ULZCgGS7/7lwTfQDSqRNgIhAMASMiTMCfiChK7UcAvS1sFQOC5mR6bS1Gn+dLY//7s6","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":1690676},"main":"lib/index.js","types":"types/index.d.ts","module":"es/index.js","browser":"dist/absmartly-sdk-plugins.min.js","exports":{".":{"types":"./types/index.d.ts","import":"./es/index.js","source":"./src/index.ts","require":"./lib/index.js"},"./cookie":{"types":"./types/cookies/CookiePlugin.d.ts","import":"./es/cookies/CookiePlugin.js","source":"./src/cookies/CookiePlugin.ts","require":"./lib/cookies/CookiePlugin.js"},"./overrides":{"types":"./types/overrides/overridesUtils.d.ts","import":"./es/overrides/overridesUtils.js","source":"./src/overrides/overridesUtils.ts","require":"./lib/overrides/overridesUtils.js"},"./web-vitals":{"types":"./types/vitals/WebVitalsPlugin.d.ts","import":"./es/vitals/WebVitalsPlugin.js","source":"./src/vitals/WebVitalsPlugin.ts","require":"./lib/vitals/WebVitalsPlugin.js"},"./dom-changes":{"types":"./types/core/DOMChangesPluginLite.d.ts","import":"./es/core/DOMChangesPluginLite.js","source":"./src/core/DOMChangesPluginLite.ts","require":"./lib/core/DOMChangesPluginLite.js"},"./url-redirect":{"types":"./types/url-redirect/URLRedirectPlugin.d.ts","import":"./es/url-redirect/URLRedirectPlugin.js","source":"./src/url-redirect/URLRedirectPlugin.ts","require":"./lib/url-redirect/URLRedirectPlugin.js"},"./core/dom-manipulator":{"types":"./types/core/DOMManipulatorLite.d.ts","import":"./es/core/DOMManipulatorLite.js","source":"./src/core/DOMManipulatorLite.ts","require":"./lib/core/DOMManipulatorLite.js"},"./core/style-sheet-manager":{"types":"./types/core/StyleSheetManager.d.ts","import":"./es/core/StyleSheetManager.js","source":"./src/core/StyleSheetManager.ts","require":"./lib/core/StyleSheetManager.js"},"./core/pending-change-manager":{"types":"./types/core/PendingChangeManager.d.ts","import":"./es/core/PendingChangeManager.js","source":"./src/core/PendingChangeManager.ts","require":"./lib/core/PendingChangeManager.js"}},"gitHead":"80ab406787149d26b12625fe4efe900caf499bd5","scripts":{"dev":"tsc --watch","lint":"eslint src --ext .ts,.tsx","test":"jest","build":"npm run clean && npm run format && npm run lint && npm run compile && npm run bundle","clean":"rm -rf lib es dist types","watch":"webpack --mode development --watch --env BUILD_TYPE=all --devtool source-map","bundle":"webpack --mode production --env BUILD_TYPE=all","format":"prettier --write \"src/**/*.{js,ts,tsx}\"","compile":"npm run compile:cjs && npm run compile:es && npm run compile:types","dev:all":"npm run compile:cjs -- --watch & npm run compile:es -- --watch & npm run compile:types -- --watch","publish":"npm run build && npm publish --access public","build:all":"npm run build && npm run bundle:dev && npm run rename:dev","build:dev":"npm run clean && npm run format && npm run lint && npm run compile && npm run bundle:dev","bundle:dev":"webpack --mode development --env BUILD_TYPE=all --devtool source-map","bundle:dom":"webpack --mode production --env BUILD_TYPE=dom-only","compile:es":"tsc -p tsconfig.es.json","postbundle":"cp dist/*.min.js ../absmartly.com/static/ 2>/dev/null || true","rename:dev":"cd dist && for file in *.js; do if [[ ! \"$file\" == *.min.js ]] && [[ ! \"$file\" == *.dev.js ]]; then mv \"$file\" \"${file%.js}.dev.js\"; fi; done; exit 0","test:watch":"jest --watch","bundle:full":"webpack --mode production --env BUILD_TYPE=dom-full","bundle:lite":"webpack --mode production --env BUILD_TYPE=dom-lite","compile:cjs":"tsc -p tsconfig.cjs.json","bundle:cookie":"webpack --mode production --env BUILD_TYPE=cookie-only","bundle:vitals":"webpack --mode production --env BUILD_TYPE=vitals-only","compile:types":"tsc -p tsconfig.types.json","test:coverage":"jest --coverage","version:major":"npm version major","version:minor":"npm version minor","version:patch":"npm version patch","bundle:dev:all":"npm run bundle:dev:dom && npm run bundle:dev:lite && npm run bundle:dev:full && npm run bundle:dev:cookie && npm run bundle:dev:vitals && npm run bundle:dev:overrides","bundle:dev:dom":"webpack --mode development --env BUILD_TYPE=dom-only --devtool source-map","prepublishOnly":"npm run build && npm test","bundle:dev:full":"webpack --mode development --env BUILD_TYPE=dom-full --devtool source-map","bundle:dev:lite":"webpack --mode development --env BUILD_TYPE=dom-lite --devtool source-map","publish:dry-run":"npm run build && npm publish --dry-run --access public","bundle:dev:cookie":"webpack --mode development --env BUILD_TYPE=cookie-only --devtool source-map","bundle:dev:vitals":"webpack --mode development --env BUILD_TYPE=vitals-only --devtool source-map","bundle:dev:overrides":"webpack --mode development --env BUILD_TYPE=overrides-lite --devtool source-map && webpack --mode development --env BUILD_TYPE=overrides-full --devtool source-map"},"_npmUser":{"name":"joalves","email":"jonas@absmartly.com"},"repository":{"url":"git+https://github.com/absmartly/sdk-plugins.git","type":"git"},"_npmVersion":"11.3.0","description":"Collection of plugins for ABsmartly JavaScript SDK","directories":{},"_nodeVersion":"22.15.0","dependencies":{"web-vitals":"^5.1.0"},"_hasShrinkwrap":false,"devDependencies":{"jest":"^29.7.0","jsdom":"^26.1.0","eslint":"^8.50.0","ts-jest":"^29.4.1","webpack":"^5.88.2","prettier":"^3.0.3","ts-loader":"^9.4.4","typescript":"^5.2.2","@types/jest":"^29.5.14","@types/node":"^20.8.0","webpack-cli":"^5.1.4","eslint-config-prettier":"^9.0.0","eslint-plugin-prettier":"^5.0.0","jest-environment-jsdom":"^29.7.0","@testing-library/jest-dom":"^6.8.0","@typescript-eslint/parser":"^6.7.4","@typescript-eslint/eslint-plugin":"^6.7.4"},"peerDependencies":{"@absmartly/javascript-sdk":"^1.0.0"},"_npmOperationalInternal":{"tmp":"tmp/sdk-plugins_1.2.1_1770042963763_0.5144800525340858","host":"s3://npm-registry-packages-npm-production"}},"1.2.2":{"name":"@absmartly/sdk-plugins","version":"1.2.2","keywords":["absmartly","ab-testing","experimentation","dom-manipulation","visual-editor"],"author":{"name":"ABsmartly"},"license":"MIT","_id":"@absmartly/sdk-plugins@1.2.2","maintainers":[{"name":"marcioapm","email":"marcioapm@gmail.com"},{"name":"joalves","email":"jonas@absmartly.com"},{"name":"caltheabtester","email":"cal@absmartly.com"},{"name":"marcioabs","email":"marcio@absmartly.com"}],"homepage":"https://github.com/absmartly/dom-changes-plugin#readme","bugs":{"url":"https://github.com/absmartly/dom-changes-plugin/issues"},"dist":{"shasum":"eb30ce56b84251425d0024b3e2fd0b8714958fee","tarball":"https://registry.npmjs.org/@absmartly/sdk-plugins/-/sdk-plugins-1.2.2.tgz","fileCount":237,"integrity":"sha512-DbI/Wh+IW8eD4L60S3dZZxylVKYbYmwTiZMfxR+iQN8KWpmTV79dhY04ysOJDzyYUYK2E7/YPFO6WCTr380ekg==","signatures":[{"sig":"MEUCIA5ccNEZRcJ32TPVJn1YFNNUjS8OfUYd2w3Bbs2U8SRpAiEAiBDqvOESh63/QmB60NyEt5Jd5qAhUsn3QyQPu/8VmaE=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":1696946},"main":"lib/index.js","types":"types/index.d.ts","module":"es/index.js","browser":"dist/absmartly-sdk-plugins.min.js","exports":{".":{"types":"./types/index.d.ts","import":"./es/index.js","source":"./src/index.ts","require":"./lib/index.js"},"./cookie":{"types":"./types/cookies/CookiePlugin.d.ts","import":"./es/cookies/CookiePlugin.js","source":"./src/cookies/CookiePlugin.ts","require":"./lib/cookies/CookiePlugin.js"},"./overrides":{"types":"./types/overrides/overridesUtils.d.ts","import":"./es/overrides/overridesUtils.js","source":"./src/overrides/overridesUtils.ts","require":"./lib/overrides/overridesUtils.js"},"./web-vitals":{"types":"./types/vitals/WebVitalsPlugin.d.ts","import":"./es/vitals/WebVitalsPlugin.js","source":"./src/vitals/WebVitalsPlugin.ts","require":"./lib/vitals/WebVitalsPlugin.js"},"./dom-changes":{"types":"./types/core/DOMChangesPluginLite.d.ts","import":"./es/core/DOMChangesPluginLite.js","source":"./src/core/DOMChangesPluginLite.ts","require":"./lib/core/DOMChangesPluginLite.js"},"./url-redirect":{"types":"./types/url-redirect/URLRedirectPlugin.d.ts","import":"./es/url-redirect/URLRedirectPlugin.js","source":"./src/url-redirect/URLRedirectPlugin.ts","require":"./lib/url-redirect/URLRedirectPlugin.js"},"./core/dom-manipulator":{"types":"./types/core/DOMManipulatorLite.d.ts","import":"./es/core/DOMManipulatorLite.js","source":"./src/core/DOMManipulatorLite.ts","require":"./lib/core/DOMManipulatorLite.js"},"./core/style-sheet-manager":{"types":"./types/core/StyleSheetManager.d.ts","import":"./es/core/StyleSheetManager.js","source":"./src/core/StyleSheetManager.ts","require":"./lib/core/StyleSheetManager.js"},"./core/pending-change-manager":{"types":"./types/core/PendingChangeManager.d.ts","import":"./es/core/PendingChangeManager.js","source":"./src/core/PendingChangeManager.ts","require":"./lib/core/PendingChangeManager.js"}},"gitHead":"7ad2c87d770609de71848e67a7d37cd46319c34d","scripts":{"dev":"tsc --watch","lint":"eslint src --ext .ts,.tsx","test":"jest","build":"npm run clean && npm run format && npm run lint && npm run compile && npm run bundle","clean":"rm -rf lib es dist types","watch":"webpack --mode development --watch --env BUILD_TYPE=all --devtool source-map","bundle":"npm run generate:build-info && webpack --mode production --env BUILD_TYPE=all","format":"prettier --write \"src/**/*.{js,ts,tsx}\"","compile":"npm run generate:build-info && npm run compile:cjs && npm run compile:es && npm run compile:types","dev:all":"npm run compile:cjs -- --watch & npm run compile:es -- --watch & npm run compile:types -- --watch","publish":"npm run build && npm publish --access public","build:all":"npm run build && npm run bundle:dev && npm run rename:dev","build:dev":"npm run clean && npm run format && npm run lint && npm run compile && npm run bundle:dev","bundle:dev":"npm run generate:build-info:debug && webpack --mode development --env BUILD_TYPE=all --devtool source-map","bundle:dom":"webpack --mode production --env BUILD_TYPE=dom-only","compile:es":"tsc -p tsconfig.es.json","postbundle":"cp dist/*.min.js ../absmartly.com/static/ 2>/dev/null || true","rename:dev":"cd dist && for file in *.js; do if [[ ! \"$file\" == *.min.js ]] && [[ ! \"$file\" == *.dev.js ]]; then mv \"$file\" \"${file%.js}.dev.js\"; fi; done; exit 0","test:watch":"jest --watch","bundle:full":"webpack --mode production --env BUILD_TYPE=dom-full","bundle:lite":"webpack --mode production --env BUILD_TYPE=dom-lite","compile:cjs":"tsc -p tsconfig.cjs.json","bundle:cookie":"webpack --mode production --env BUILD_TYPE=cookie-only","bundle:vitals":"webpack --mode production --env BUILD_TYPE=vitals-only","compile:types":"tsc -p tsconfig.types.json","test:coverage":"jest --coverage","version:major":"npm version major","version:minor":"npm version minor","version:patch":"npm version patch","bundle:dev:all":"npm run bundle:dev:dom && npm run bundle:dev:lite && npm run bundle:dev:full && npm run bundle:dev:cookie && npm run bundle:dev:vitals && npm run bundle:dev:overrides","bundle:dev:dom":"webpack --mode development --env BUILD_TYPE=dom-only --devtool source-map","prepublishOnly":"npm run build && npm test","bundle:dev:full":"webpack --mode development --env BUILD_TYPE=dom-full --devtool source-map","bundle:dev:lite":"webpack --mode development --env BUILD_TYPE=dom-lite --devtool source-map","publish:dry-run":"npm run build && npm publish --dry-run --access public","bundle:dev:cookie":"webpack --mode development --env BUILD_TYPE=cookie-only --devtool source-map","bundle:dev:vitals":"webpack --mode development --env BUILD_TYPE=vitals-only --devtool source-map","generate:build-info":"node scripts/generate-build-info.js","bundle:dev:overrides":"webpack --mode development --env BUILD_TYPE=overrides-lite --devtool source-map && webpack --mode development --env BUILD_TYPE=overrides-full --devtool source-map","generate:build-info:debug":"node scripts/generate-build-info.js --debug"},"_npmUser":{"name":"joalves","email":"jonas@absmartly.com"},"repository":{"url":"git+https://github.com/absmartly/sdk-plugins.git","type":"git"},"_npmVersion":"11.3.0","description":"Collection of plugins for ABsmartly JavaScript SDK","directories":{},"_nodeVersion":"22.15.0","dependencies":{"web-vitals":"^5.1.0"},"_hasShrinkwrap":false,"devDependencies":{"jest":"^29.7.0","jsdom":"^26.1.0","eslint":"^8.50.0","ts-jest":"^29.4.1","webpack":"^5.88.2","prettier":"^3.0.3","ts-loader":"^9.4.4","typescript":"^5.2.2","@types/jest":"^29.5.14","@types/node":"^20.8.0","webpack-cli":"^5.1.4","eslint-config-prettier":"^9.0.0","eslint-plugin-prettier":"^5.0.0","jest-environment-jsdom":"^29.7.0","@testing-library/jest-dom":"^6.8.0","@typescript-eslint/parser":"^6.7.4","@typescript-eslint/eslint-plugin":"^6.7.4"},"peerDependencies":{"@absmartly/javascript-sdk":"^1.0.0"},"_npmOperationalInternal":{"tmp":"tmp/sdk-plugins_1.2.2_1770913467583_0.9652287070760657","host":"s3://npm-registry-packages-npm-production"}},"1.3.0":{"name":"@absmartly/sdk-plugins","version":"1.3.0","keywords":["absmartly","ab-testing","experimentation","dom-manipulation","visual-editor"],"author":{"name":"ABsmartly"},"license":"MIT","_id":"@absmartly/sdk-plugins@1.3.0","maintainers":[{"name":"marcioapm","email":"marcioapm@gmail.com"},{"name":"joalves","email":"jonas@absmartly.com"},{"name":"caltheabtester","email":"cal@absmartly.com"},{"name":"marcioabs","email":"marcio@absmartly.com"}],"homepage":"https://github.com/absmartly/dom-changes-plugin#readme","bugs":{"url":"https://github.com/absmartly/dom-changes-plugin/issues"},"dist":{"shasum":"14d90d609b98220178c8cb5dee382b2f12aec6f1","tarball":"https://registry.npmjs.org/@absmartly/sdk-plugins/-/sdk-plugins-1.3.0.tgz","fileCount":255,"integrity":"sha512-Q9fRgbB4AvD5lNu8YtJzN8TFjhdy+dIJvhu2tlyglgxvqOTHmKbt2HwWOAvBOZqb5HNL0mKG23TcnEj3SIEUGQ==","signatures":[{"sig":"MEUCID+ZRQfBZMlyRU1Aq5eZMyK4enU9ytsp8jlIRotIbJR8AiEAsFNllDIJU9+jwLP4dGtcO6F01FwbOkPujgKqBTYDhxU=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":1808658},"main":"lib/index.js","types":"types/index.d.ts","module":"es/index.js","browser":"dist/absmartly-sdk-plugins.min.js","exports":{".":{"types":"./types/index.d.ts","import":"./es/index.js","source":"./src/index.ts","require":"./lib/index.js"},"./cookie":{"types":"./types/cookies/CookiePlugin.d.ts","import":"./es/cookies/CookiePlugin.js","source":"./src/cookies/CookiePlugin.ts","require":"./lib/cookies/CookiePlugin.js"},"./overrides":{"types":"./types/overrides/overridesUtils.d.ts","import":"./es/overrides/overridesUtils.js","source":"./src/overrides/overridesUtils.ts","require":"./lib/overrides/overridesUtils.js"},"./web-vitals":{"types":"./types/vitals/WebVitalsPlugin.d.ts","import":"./es/vitals/WebVitalsPlugin.js","source":"./src/vitals/WebVitalsPlugin.ts","require":"./lib/vitals/WebVitalsPlugin.js"},"./dom-changes":{"types":"./types/core/DOMChangesPluginLite.d.ts","import":"./es/core/DOMChangesPluginLite.js","source":"./src/core/DOMChangesPluginLite.ts","require":"./lib/core/DOMChangesPluginLite.js"},"./url-redirect":{"types":"./types/url-redirect/URLRedirectPlugin.d.ts","import":"./es/url-redirect/URLRedirectPlugin.js","source":"./src/url-redirect/URLRedirectPlugin.ts","require":"./lib/url-redirect/URLRedirectPlugin.js"},"./utils/persistence":{"types":"./types/utils/persistence.d.ts","import":"./es/utils/persistence.js","source":"./src/utils/persistence.ts","require":"./lib/utils/persistence.js"},"./core/dom-manipulator":{"types":"./types/core/DOMManipulatorLite.d.ts","import":"./es/core/DOMManipulatorLite.js","source":"./src/core/DOMManipulatorLite.ts","require":"./lib/core/DOMManipulatorLite.js"},"./core/style-sheet-manager":{"types":"./types/core/StyleSheetManager.d.ts","import":"./es/core/StyleSheetManager.js","source":"./src/core/StyleSheetManager.ts","require":"./lib/core/StyleSheetManager.js"},"./core/pending-change-manager":{"types":"./types/core/PendingChangeManager.d.ts","import":"./es/core/PendingChangeManager.js","source":"./src/core/PendingChangeManager.ts","require":"./lib/core/PendingChangeManager.js"}},"gitHead":"736a4117cd5dc92e502f04d0eaf4f777463fdc64","scripts":{"dev":"tsc --watch","lint":"eslint src --ext .ts,.tsx","test":"jest","build":"npm run clean && npm run format && npm run lint && npm run compile && npm run bundle","clean":"rm -rf lib es dist types","watch":"webpack --mode development --watch --env BUILD_TYPE=all --devtool source-map","bundle":"npm run generate:build-info && webpack --mode production --env BUILD_TYPE=all","format":"prettier --write \"src/**/*.{js,ts,tsx}\"","compile":"npm run generate:build-info && npm run compile:cjs && npm run compile:es && npm run compile:types","dev:all":"npm run compile:cjs -- --watch & npm run compile:es -- --watch & npm run compile:types -- --watch","release":"npm run build && npm publish --access public","build:all":"npm run build && npm run bundle:dev && npm run rename:dev","build:dev":"npm run clean && npm run format && npm run lint && npm run compile && npm run bundle:dev","bundle:dev":"npm run generate:build-info:debug && webpack --mode development --env BUILD_TYPE=all --devtool source-map","bundle:dom":"webpack --mode production --env BUILD_TYPE=dom-only","compile:es":"tsc -p tsconfig.es.json","postbundle":"cp dist/*.min.js ../absmartly.com/static/ 2>/dev/null || true","rename:dev":"cd dist && for file in *.js; do if [[ ! \"$file\" == *.min.js ]] && [[ ! \"$file\" == *.dev.js ]]; then mv \"$file\" \"${file%.js}.dev.js\"; fi; done; exit 0","test:watch":"jest --watch","bundle:full":"webpack --mode production --env BUILD_TYPE=dom-full","bundle:lite":"webpack --mode production --env BUILD_TYPE=dom-lite","compile:cjs":"tsc -p tsconfig.cjs.json","bundle:cookie":"webpack --mode production --env BUILD_TYPE=cookie-only","bundle:vitals":"webpack --mode production --env BUILD_TYPE=vitals-only","compile:types":"tsc -p tsconfig.types.json","test:coverage":"jest --coverage","version:major":"npm version major","version:minor":"npm version minor","version:patch":"npm version patch","bundle:dev:all":"npm run bundle:dev:dom && npm run bundle:dev:lite && npm run bundle:dev:full && npm run bundle:dev:cookie && npm run bundle:dev:vitals && npm run bundle:dev:overrides","bundle:dev:dom":"webpack --mode development --env BUILD_TYPE=dom-only --devtool source-map","prepublishOnly":"npm run build && npm test","bundle:dev:full":"webpack --mode development --env BUILD_TYPE=dom-full --devtool source-map","bundle:dev:lite":"webpack --mode development --env BUILD_TYPE=dom-lite --devtool source-map","release:dry-run":"npm run build && npm publish --dry-run --access public","bundle:dev:cookie":"webpack --mode development --env BUILD_TYPE=cookie-only --devtool source-map","bundle:dev:vitals":"webpack --mode development --env BUILD_TYPE=vitals-only --devtool source-map","generate:build-info":"node scripts/generate-build-info.js","bundle:dev:overrides":"webpack --mode development --env BUILD_TYPE=overrides-lite --devtool source-map && webpack --mode development --env BUILD_TYPE=overrides-full --devtool source-map","generate:build-info:debug":"node scripts/generate-build-info.js --debug"},"_npmUser":{"name":"joalves","email":"jonas@absmartly.com"},"repository":{"url":"git+https://github.com/absmartly/sdk-plugins.git","type":"git"},"_npmVersion":"11.3.0","description":"Collection of plugins for ABsmartly JavaScript SDK","directories":{},"_nodeVersion":"22.15.0","dependencies":{"web-vitals":"^5.1.0"},"_hasShrinkwrap":false,"devDependencies":{"jest":"^29.7.0","jsdom":"^26.1.0","eslint":"^8.50.0","ts-jest":"^29.4.1","webpack":"^5.88.2","prettier":"^3.0.3","ts-loader":"^9.4.4","typescript":"^5.2.2","@types/jest":"^29.5.14","@types/node":"^20.8.0","webpack-cli":"^5.1.4","eslint-config-prettier":"^9.0.0","eslint-plugin-prettier":"^5.0.0","jest-environment-jsdom":"^29.7.0","@testing-library/jest-dom":"^6.8.0","@typescript-eslint/parser":"^6.7.4","@typescript-eslint/eslint-plugin":"^6.7.4"},"peerDependencies":{"@absmartly/javascript-sdk":"^1.0.0"},"_npmOperationalInternal":{"tmp":"tmp/sdk-plugins_1.3.0_1775675539195_0.6588616803194112","host":"s3://npm-registry-packages-npm-production"}},"1.3.2":{"name":"@absmartly/sdk-plugins","version":"1.3.2","keywords":["absmartly","ab-testing","experimentation","dom-manipulation","visual-editor"],"author":{"name":"ABsmartly"},"license":"MIT","_id":"@absmartly/sdk-plugins@1.3.2","maintainers":[{"name":"marcioapm","email":"marcioapm@gmail.com"},{"name":"joalves","email":"jonas@absmartly.com"},{"name":"caltheabtester","email":"cal@absmartly.com"},{"name":"marcioabs","email":"marcio@absmartly.com"}],"homepage":"https://github.com/absmartly/dom-changes-plugin#readme","bugs":{"url":"https://github.com/absmartly/dom-changes-plugin/issues"},"dist":{"shasum":"4751cc2356443b5e7e59746f7255316349a1b679","tarball":"https://registry.npmjs.org/@absmartly/sdk-plugins/-/sdk-plugins-1.3.2.tgz","fileCount":255,"integrity":"sha512-PkgyEApU836bsFwpTLr/5sUBlRUsg6LEZ1Zi06M5f4hVZ2zQ6bnJTs/EOR+SfnVDhwXLjkXnYFvfWnRTggU4IQ==","signatures":[{"sig":"MEUCIGPQQ8TeVF4F+J/CfIhnBh1deew39sMA5qnOxTrpi+LTAiEAnmEDH2iyjIHuv47XAUSIe5QqTUdTvtWtLqIwXAPBwnA=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":1825587},"main":"lib/index.js","types":"types/index.d.ts","module":"es/index.js","browser":"dist/absmartly-sdk-plugins.min.js","exports":{".":{"types":"./types/index.d.ts","import":"./es/index.js","source":"./src/index.ts","require":"./lib/index.js"},"./cookie":{"types":"./types/cookies/CookiePlugin.d.ts","import":"./es/cookies/CookiePlugin.js","source":"./src/cookies/CookiePlugin.ts","require":"./lib/cookies/CookiePlugin.js"},"./overrides":{"types":"./types/overrides/overridesUtils.d.ts","import":"./es/overrides/overridesUtils.js","source":"./src/overrides/overridesUtils.ts","require":"./lib/overrides/overridesUtils.js"},"./web-vitals":{"types":"./types/vitals/WebVitalsPlugin.d.ts","import":"./es/vitals/WebVitalsPlugin.js","source":"./src/vitals/WebVitalsPlugin.ts","require":"./lib/vitals/WebVitalsPlugin.js"},"./dom-changes":{"types":"./types/core/DOMChangesPluginLite.d.ts","import":"./es/core/DOMChangesPluginLite.js","source":"./src/core/DOMChangesPluginLite.ts","require":"./lib/core/DOMChangesPluginLite.js"},"./url-redirect":{"types":"./types/url-redirect/URLRedirectPlugin.d.ts","import":"./es/url-redirect/URLRedirectPlugin.js","source":"./src/url-redirect/URLRedirectPlugin.ts","require":"./lib/url-redirect/URLRedirectPlugin.js"},"./utils/persistence":{"types":"./types/utils/persistence.d.ts","import":"./es/utils/persistence.js","source":"./src/utils/persistence.ts","require":"./lib/utils/persistence.js"},"./core/dom-manipulator":{"types":"./types/core/DOMManipulatorLite.d.ts","import":"./es/core/DOMManipulatorLite.js","source":"./src/core/DOMManipulatorLite.ts","require":"./lib/core/DOMManipulatorLite.js"},"./core/style-sheet-manager":{"types":"./types/core/StyleSheetManager.d.ts","import":"./es/core/StyleSheetManager.js","source":"./src/core/StyleSheetManager.ts","require":"./lib/core/StyleSheetManager.js"},"./core/pending-change-manager":{"types":"./types/core/PendingChangeManager.d.ts","import":"./es/core/PendingChangeManager.js","source":"./src/core/PendingChangeManager.ts","require":"./lib/core/PendingChangeManager.js"}},"gitHead":"17519dbc718a763f8b49c4400c9ca7b527e310f4","scripts":{"dev":"tsc --watch","lint":"eslint src --ext .ts,.tsx","test":"jest","build":"npm run clean && npm run format && npm run lint && npm run compile && npm run bundle","clean":"rm -rf lib es dist types","watch":"webpack --mode development --watch --env BUILD_TYPE=all --devtool source-map","bundle":"npm run generate:build-info && webpack --mode production --env BUILD_TYPE=all","format":"prettier --write \"src/**/*.{js,ts,tsx}\"","compile":"npm run generate:build-info && npm run compile:cjs && npm run compile:es && npm run compile:types","dev:all":"npm run compile:cjs -- --watch & npm run compile:es -- --watch & npm run compile:types -- --watch","release":"npm run build && npm publish --access public","build:all":"npm run build && npm run bundle:dev && npm run rename:dev","build:dev":"npm run clean && npm run format && npm run lint && npm run compile && npm run bundle:dev","bundle:dev":"npm run generate:build-info:debug && webpack --mode development --env BUILD_TYPE=all --devtool source-map","bundle:dom":"webpack --mode production --env BUILD_TYPE=dom-only","compile:es":"tsc -p tsconfig.es.json","postbundle":"cp dist/*.min.js ../absmartly.com/static/ 2>/dev/null || true","rename:dev":"cd dist && for file in *.js; do if [[ ! \"$file\" == *.min.js ]] && [[ ! \"$file\" == *.dev.js ]]; then mv \"$file\" \"${file%.js}.dev.js\"; fi; done; exit 0","test:watch":"jest --watch","bundle:full":"webpack --mode production --env BUILD_TYPE=dom-full","bundle:lite":"webpack --mode production --env BUILD_TYPE=dom-lite","compile:cjs":"tsc -p tsconfig.cjs.json","bundle:cookie":"webpack --mode production --env BUILD_TYPE=cookie-only","bundle:vitals":"webpack --mode production --env BUILD_TYPE=vitals-only","compile:types":"tsc -p tsconfig.types.json","test:coverage":"jest --coverage","version:major":"npm version major","version:minor":"npm version minor","version:patch":"npm version patch","bundle:dev:all":"npm run bundle:dev:dom && npm run bundle:dev:lite && npm run bundle:dev:full && npm run bundle:dev:cookie && npm run bundle:dev:vitals && npm run bundle:dev:overrides","bundle:dev:dom":"webpack --mode development --env BUILD_TYPE=dom-only --devtool source-map","prepublishOnly":"npm run build && npm test","bundle:dev:full":"webpack --mode development --env BUILD_TYPE=dom-full --devtool source-map","bundle:dev:lite":"webpack --mode development --env BUILD_TYPE=dom-lite --devtool source-map","release:dry-run":"npm run build && npm publish --dry-run --access public","bundle:dev:cookie":"webpack --mode development --env BUILD_TYPE=cookie-only --devtool source-map","bundle:dev:vitals":"webpack --mode development --env BUILD_TYPE=vitals-only --devtool source-map","generate:build-info":"node scripts/generate-build-info.js","bundle:dev:overrides":"webpack --mode development --env BUILD_TYPE=overrides-lite --devtool source-map && webpack --mode development --env BUILD_TYPE=overrides-full --devtool source-map","generate:build-info:debug":"node scripts/generate-build-info.js --debug"},"_npmUser":{"name":"joalves","email":"jonas@absmartly.com"},"repository":{"url":"git+https://github.com/absmartly/sdk-plugins.git","type":"git"},"_npmVersion":"11.3.0","description":"Collection of plugins for ABsmartly JavaScript SDK","directories":{},"_nodeVersion":"22.15.0","dependencies":{"web-vitals":"^5.1.0","@absmartly/dom-tracker":"^0.4.0"},"publishConfig":{"provenance":true},"_hasShrinkwrap":false,"devDependencies":{"jest":"^29.7.0","jsdom":"^26.1.0","eslint":"^8.50.0","ts-jest":"^29.4.1","webpack":"^5.88.2","prettier":"^3.0.3","ts-loader":"^9.4.4","typescript":"^5.2.2","@types/jest":"^29.5.14","@types/node":"^20.8.0","webpack-cli":"^5.1.4","eslint-config-prettier":"^9.0.0","eslint-plugin-prettier":"^5.0.0","jest-environment-jsdom":"^29.7.0","@testing-library/jest-dom":"^6.8.0","@typescript-eslint/parser":"^6.7.4","@typescript-eslint/eslint-plugin":"^6.7.4"},"peerDependencies":{"@absmartly/javascript-sdk":"^1.0.0"},"_npmOperationalInternal":{"tmp":"tmp/sdk-plugins_1.3.2_1776939260430_0.24327650863304973","host":"s3://npm-registry-packages-npm-production"}},"1.3.4":{"name":"@absmartly/sdk-plugins","version":"1.3.4","keywords":["absmartly","ab-testing","experimentation","dom-manipulation","visual-editor"],"author":{"name":"ABsmartly"},"license":"MIT","_id":"@absmartly/sdk-plugins@1.3.4","maintainers":[{"name":"marcioapm","email":"marcioapm@gmail.com"},{"name":"joalves","email":"jonas@absmartly.com"},{"name":"caltheabtester","email":"cal@absmartly.com"},{"name":"marcioabs","email":"marcio@absmartly.com"}],"homepage":"https://github.com/absmartly/dom-changes-plugin#readme","bugs":{"url":"https://github.com/absmartly/dom-changes-plugin/issues"},"dist":{"shasum":"af0b4765915b0c788b2841e4c2d07b13c974dc9c","tarball":"https://registry.npmjs.org/@absmartly/sdk-plugins/-/sdk-plugins-1.3.4.tgz","fileCount":255,"integrity":"sha512-J/OpPxSGe8PvcBILFfiQkU2MAVk8vqyu86BvHaJxuJ2Lpm7zrAZzR5XN39XlmLNZ4IXPFmdXFFCwVwYcyF1ehA==","signatures":[{"sig":"MEUCIFaPvSIOcYIwindXBCI5+hSBHHG5UDRmj4bESSvb77zqAiEAoz9d5Dp/K6Dxl6R/b1cfjPfQWhnhI7ZTwZopURrFmHQ=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@absmartly%2fsdk-plugins@1.3.4","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":1825587},"main":"lib/index.js","types":"types/index.d.ts","module":"es/index.js","browser":"dist/absmartly-sdk-plugins.min.js","exports":{".":{"types":"./types/index.d.ts","import":"./es/index.js","source":"./src/index.ts","require":"./lib/index.js"},"./cookie":{"types":"./types/cookies/CookiePlugin.d.ts","import":"./es/cookies/CookiePlugin.js","source":"./src/cookies/CookiePlugin.ts","require":"./lib/cookies/CookiePlugin.js"},"./overrides":{"types":"./types/overrides/overridesUtils.d.ts","import":"./es/overrides/overridesUtils.js","source":"./src/overrides/overridesUtils.ts","require":"./lib/overrides/overridesUtils.js"},"./web-vitals":{"types":"./types/vitals/WebVitalsPlugin.d.ts","import":"./es/vitals/WebVitalsPlugin.js","source":"./src/vitals/WebVitalsPlugin.ts","require":"./lib/vitals/WebVitalsPlugin.js"},"./dom-changes":{"types":"./types/core/DOMChangesPluginLite.d.ts","import":"./es/core/DOMChangesPluginLite.js","source":"./src/core/DOMChangesPluginLite.ts","require":"./lib/core/DOMChangesPluginLite.js"},"./url-redirect":{"types":"./types/url-redirect/URLRedirectPlugin.d.ts","import":"./es/url-redirect/URLRedirectPlugin.js","source":"./src/url-redirect/URLRedirectPlugin.ts","require":"./lib/url-redirect/URLRedirectPlugin.js"},"./utils/persistence":{"types":"./types/utils/persistence.d.ts","import":"./es/utils/persistence.js","source":"./src/utils/persistence.ts","require":"./lib/utils/persistence.js"},"./core/dom-manipulator":{"types":"./types/core/DOMManipulatorLite.d.ts","import":"./es/core/DOMManipulatorLite.js","source":"./src/core/DOMManipulatorLite.ts","require":"./lib/core/DOMManipulatorLite.js"},"./core/style-sheet-manager":{"types":"./types/core/StyleSheetManager.d.ts","import":"./es/core/StyleSheetManager.js","source":"./src/core/StyleSheetManager.ts","require":"./lib/core/StyleSheetManager.js"},"./core/pending-change-manager":{"types":"./types/core/PendingChangeManager.d.ts","import":"./es/core/PendingChangeManager.js","source":"./src/core/PendingChangeManager.ts","require":"./lib/core/PendingChangeManager.js"}},"gitHead":"743a4db099c50d956537a6afe8d151265d524214","scripts":{"dev":"tsc --watch","lint":"eslint src --ext .ts,.tsx","test":"jest","build":"npm run clean && npm run format && npm run lint && npm run compile && npm run bundle","clean":"rm -rf lib es dist types","watch":"webpack --mode development --watch --env BUILD_TYPE=all --devtool source-map","bundle":"npm run generate:build-info && webpack --mode production --env BUILD_TYPE=all","format":"prettier --write \"src/**/*.{js,ts,tsx}\"","compile":"npm run generate:build-info && npm run compile:cjs && npm run compile:es && npm run compile:types","dev:all":"npm run compile:cjs -- --watch & npm run compile:es -- --watch & npm run compile:types -- --watch","release":"npm run build && npm publish --access public","build:all":"npm run build && npm run bundle:dev && npm run rename:dev","build:dev":"npm run clean && npm run format && npm run lint && npm run compile && npm run bundle:dev","bundle:dev":"npm run generate:build-info:debug && webpack --mode development --env BUILD_TYPE=all --devtool source-map","bundle:dom":"webpack --mode production --env BUILD_TYPE=dom-only","compile:es":"tsc -p tsconfig.es.json","postbundle":"cp dist/*.min.js ../absmartly.com/static/ 2>/dev/null || true","rename:dev":"cd dist && for file in *.js; do if [[ ! \"$file\" == *.min.js ]] && [[ ! \"$file\" == *.dev.js ]]; then mv \"$file\" \"${file%.js}.dev.js\"; fi; done; exit 0","test:watch":"jest --watch","bundle:full":"webpack --mode production --env BUILD_TYPE=dom-full","bundle:lite":"webpack --mode production --env BUILD_TYPE=dom-lite","compile:cjs":"tsc -p tsconfig.cjs.json","bundle:cookie":"webpack --mode production --env BUILD_TYPE=cookie-only","bundle:vitals":"webpack --mode production --env BUILD_TYPE=vitals-only","compile:types":"tsc -p tsconfig.types.json","test:coverage":"jest --coverage","version:major":"npm version major","version:minor":"npm version minor","version:patch":"npm version patch","bundle:dev:all":"npm run bundle:dev:dom && npm run bundle:dev:lite && npm run bundle:dev:full && npm run bundle:dev:cookie && npm run bundle:dev:vitals && npm run bundle:dev:overrides","bundle:dev:dom":"webpack --mode development --env BUILD_TYPE=dom-only --devtool source-map","prepublishOnly":"npm run build && npm test","bundle:dev:full":"webpack --mode development --env BUILD_TYPE=dom-full --devtool source-map","bundle:dev:lite":"webpack --mode development --env BUILD_TYPE=dom-lite --devtool source-map","release:dry-run":"npm run build && npm publish --dry-run --access public","bundle:dev:cookie":"webpack --mode development --env BUILD_TYPE=cookie-only --devtool source-map","bundle:dev:vitals":"webpack --mode development --env BUILD_TYPE=vitals-only --devtool source-map","generate:build-info":"node scripts/generate-build-info.js","bundle:dev:overrides":"webpack --mode development --env BUILD_TYPE=overrides-lite --devtool source-map && webpack --mode development --env BUILD_TYPE=overrides-full --devtool source-map","generate:build-info:debug":"node scripts/generate-build-info.js --debug"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:1758a0da-6437-45f1-ad1d-95a57144128d"}},"repository":{"url":"git+https://github.com/absmartly/sdk-plugins.git","type":"git"},"_npmVersion":"11.11.0","description":"Collection of plugins for ABsmartly JavaScript SDK","directories":{},"_nodeVersion":"24.14.1","dependencies":{"web-vitals":"^5.1.0","@absmartly/dom-tracker":"^0.4.0"},"publishConfig":{"provenance":true},"_hasShrinkwrap":false,"devDependencies":{"jest":"^29.7.0","jsdom":"^26.1.0","eslint":"^8.50.0","ts-jest":"^29.4.1","webpack":"^5.88.2","prettier":"^3.0.3","ts-loader":"^9.4.4","typescript":"^5.2.2","@types/jest":"^29.5.14","@types/node":"^20.8.0","webpack-cli":"^5.1.4","eslint-config-prettier":"^9.0.0","eslint-plugin-prettier":"^5.0.0","jest-environment-jsdom":"^29.7.0","@testing-library/jest-dom":"^6.8.0","@typescript-eslint/parser":"^6.7.4","@typescript-eslint/eslint-plugin":"^6.7.4"},"peerDependencies":{"@absmartly/javascript-sdk":"^1.0.0"},"_npmOperationalInternal":{"tmp":"tmp/sdk-plugins_1.3.4_1776942066939_0.2123201725243673","host":"s3://npm-registry-packages-npm-production"}},"1.3.6":{"name":"@absmartly/sdk-plugins","version":"1.3.6","keywords":["absmartly","ab-testing","experimentation","dom-manipulation","visual-editor"],"author":{"name":"ABsmartly"},"license":"MIT","_id":"@absmartly/sdk-plugins@1.3.6","maintainers":[{"name":"marcioapm","email":"marcioapm@gmail.com"},{"name":"joalves","email":"jonas@absmartly.com"},{"name":"caltheabtester","email":"cal@absmartly.com"},{"name":"marcioabs","email":"marcio@absmartly.com"}],"homepage":"https://github.com/absmartly/dom-changes-plugin#readme","bugs":{"url":"https://github.com/absmartly/dom-changes-plugin/issues"},"dist":{"shasum":"6785880939278be67a99256da682cf1b6ed28af9","tarball":"https://registry.npmjs.org/@absmartly/sdk-plugins/-/sdk-plugins-1.3.6.tgz","fileCount":255,"integrity":"sha512-82yOgorPSiQLuQ0Hy6bDwXXG4g8dRSE/Waf3BhhEks5q5rRWh+OI0HxvVRrZNV4tg9TUq9rgsl1E1rqBlhZXoQ==","signatures":[{"sig":"MEUCIEGRKhSBw3YtmH85WDkqQUsesuWutnf964iHM5B10jFEAiEAsJOWZpLEKcfZiSQzhQUqHcJx5g+nLuvLygdddxxiTto=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@absmartly%2fsdk-plugins@1.3.6","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":1832394},"main":"lib/index.js","types":"types/index.d.ts","module":"es/index.js","browser":"dist/absmartly-sdk-plugins.min.js","exports":{".":{"types":"./types/index.d.ts","import":"./es/index.js","source":"./src/index.ts","require":"./lib/index.js"},"./cookie":{"types":"./types/cookies/CookiePlugin.d.ts","import":"./es/cookies/CookiePlugin.js","source":"./src/cookies/CookiePlugin.ts","require":"./lib/cookies/CookiePlugin.js"},"./overrides":{"types":"./types/overrides/overridesUtils.d.ts","import":"./es/overrides/overridesUtils.js","source":"./src/overrides/overridesUtils.ts","require":"./lib/overrides/overridesUtils.js"},"./web-vitals":{"types":"./types/vitals/WebVitalsPlugin.d.ts","import":"./es/vitals/WebVitalsPlugin.js","source":"./src/vitals/WebVitalsPlugin.ts","require":"./lib/vitals/WebVitalsPlugin.js"},"./dom-changes":{"types":"./types/core/DOMChangesPluginLite.d.ts","import":"./es/core/DOMChangesPluginLite.js","source":"./src/core/DOMChangesPluginLite.ts","require":"./lib/core/DOMChangesPluginLite.js"},"./url-redirect":{"types":"./types/url-redirect/URLRedirectPlugin.d.ts","import":"./es/url-redirect/URLRedirectPlugin.js","source":"./src/url-redirect/URLRedirectPlugin.ts","require":"./lib/url-redirect/URLRedirectPlugin.js"},"./utils/persistence":{"types":"./types/utils/persistence.d.ts","import":"./es/utils/persistence.js","source":"./src/utils/persistence.ts","require":"./lib/utils/persistence.js"},"./core/dom-manipulator":{"types":"./types/core/DOMManipulatorLite.d.ts","import":"./es/core/DOMManipulatorLite.js","source":"./src/core/DOMManipulatorLite.ts","require":"./lib/core/DOMManipulatorLite.js"},"./core/style-sheet-manager":{"types":"./types/core/StyleSheetManager.d.ts","import":"./es/core/StyleSheetManager.js","source":"./src/core/StyleSheetManager.ts","require":"./lib/core/StyleSheetManager.js"},"./core/pending-change-manager":{"types":"./types/core/PendingChangeManager.d.ts","import":"./es/core/PendingChangeManager.js","source":"./src/core/PendingChangeManager.ts","require":"./lib/core/PendingChangeManager.js"}},"gitHead":"cea244b6bcdcb7742c6c33f9ba7196e961dedb48","scripts":{"dev":"tsc --watch","lint":"eslint src --ext .ts,.tsx","test":"jest","build":"npm run clean && npm run format && npm run lint && npm run compile && npm run bundle","clean":"rm -rf lib es dist types","watch":"webpack --mode development --watch --env BUILD_TYPE=all --devtool source-map","bundle":"npm run generate:build-info && webpack --mode production --env BUILD_TYPE=all","format":"prettier --write \"src/**/*.{js,ts,tsx}\"","compile":"npm run generate:build-info && npm run compile:cjs && npm run compile:es && npm run compile:types","dev:all":"npm run compile:cjs -- --watch & npm run compile:es -- --watch & npm run compile:types -- --watch","release":"npm run build && npm publish --access public","build:all":"npm run build && npm run bundle:dev && npm run rename:dev","build:dev":"npm run clean && npm run format && npm run lint && npm run compile && npm run bundle:dev","bundle:dev":"npm run generate:build-info:debug && webpack --mode development --env BUILD_TYPE=all --devtool source-map","bundle:dom":"webpack --mode production --env BUILD_TYPE=dom-only","compile:es":"tsc -p tsconfig.es.json","postbundle":"cp dist/*.min.js ../absmartly.com/static/ 2>/dev/null || true","rename:dev":"cd dist && for file in *.js; do if [[ ! \"$file\" == *.min.js ]] && [[ ! \"$file\" == *.dev.js ]]; then mv \"$file\" \"${file%.js}.dev.js\"; fi; done; exit 0","test:watch":"jest --watch","bundle:full":"webpack --mode production --env BUILD_TYPE=dom-full","bundle:lite":"webpack --mode production --env BUILD_TYPE=dom-lite","compile:cjs":"tsc -p tsconfig.cjs.json","postinstall":"node scripts/setup-git-hooks.js","bundle:cookie":"webpack --mode production --env BUILD_TYPE=cookie-only","bundle:vitals":"webpack --mode production --env BUILD_TYPE=vitals-only","compile:types":"tsc -p tsconfig.types.json","test:coverage":"jest --coverage","version:major":"npm version major","version:minor":"npm version minor","version:patch":"npm version patch","bundle:dev:all":"npm run bundle:dev:dom && npm run bundle:dev:lite && npm run bundle:dev:full && npm run bundle:dev:cookie && npm run bundle:dev:vitals && npm run bundle:dev:overrides","bundle:dev:dom":"webpack --mode development --env BUILD_TYPE=dom-only --devtool source-map","prepublishOnly":"npm run build && npm test","bundle:dev:full":"webpack --mode development --env BUILD_TYPE=dom-full --devtool source-map","bundle:dev:lite":"webpack --mode development --env BUILD_TYPE=dom-lite --devtool source-map","release:dry-run":"npm run build && npm publish --dry-run --access public","bundle:dev:cookie":"webpack --mode development --env BUILD_TYPE=cookie-only --devtool source-map","bundle:dev:vitals":"webpack --mode development --env BUILD_TYPE=vitals-only --devtool source-map","generate:build-info":"node scripts/generate-build-info.js","bundle:dev:overrides":"webpack --mode development --env BUILD_TYPE=overrides-lite --devtool source-map && webpack --mode development --env BUILD_TYPE=overrides-full --devtool source-map","generate:build-info:debug":"node scripts/generate-build-info.js --debug"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:1758a0da-6437-45f1-ad1d-95a57144128d"}},"repository":{"url":"git+https://github.com/absmartly/sdk-plugins.git","type":"git"},"_npmVersion":"11.11.0","description":"Collection of plugins for ABsmartly JavaScript SDK","directories":{},"_nodeVersion":"24.14.1","dependencies":{"web-vitals":"^5.1.0","@absmartly/dom-tracker":"^0.4.0"},"publishConfig":{"provenance":true},"_hasShrinkwrap":false,"devDependencies":{"jest":"^29.7.0","jsdom":"^26.1.0","eslint":"^8.50.0","ts-jest":"^29.4.1","webpack":"^5.88.2","prettier":"^3.0.3","ts-loader":"^9.4.4","typescript":"^5.2.2","@types/jest":"^29.5.14","@types/node":"^20.8.0","webpack-cli":"^5.1.4","eslint-config-prettier":"^9.0.0","eslint-plugin-prettier":"^5.0.0","jest-environment-jsdom":"^29.7.0","@testing-library/jest-dom":"^6.8.0","@typescript-eslint/parser":"^6.7.4","@typescript-eslint/eslint-plugin":"^6.7.4"},"peerDependencies":{"@absmartly/javascript-sdk":"^1.0.0"},"_npmOperationalInternal":{"tmp":"tmp/sdk-plugins_1.3.6_1777049676821_0.3239874497139503","host":"s3://npm-registry-packages-npm-production"}},"1.3.7":{"name":"@absmartly/sdk-plugins","version":"1.3.7","description":"Collection of plugins for ABsmartly JavaScript SDK","main":"lib/index.js","module":"es/index.js","browser":"dist/absmartly-sdk-plugins.min.js","types":"types/index.d.ts","exports":{".":{"source":"./src/index.ts","types":"./types/index.d.ts","import":"./es/index.js","require":"./lib/index.js"},"./dom-changes":{"source":"./src/core/DOMChangesPluginLite.ts","types":"./types/core/DOMChangesPluginLite.d.ts","import":"./es/core/DOMChangesPluginLite.js","require":"./lib/core/DOMChangesPluginLite.js"},"./cookie":{"source":"./src/cookies/CookiePlugin.ts","types":"./types/cookies/CookiePlugin.d.ts","import":"./es/cookies/CookiePlugin.js","require":"./lib/cookies/CookiePlugin.js"},"./web-vitals":{"source":"./src/vitals/WebVitalsPlugin.ts","types":"./types/vitals/WebVitalsPlugin.d.ts","import":"./es/vitals/WebVitalsPlugin.js","require":"./lib/vitals/WebVitalsPlugin.js"},"./overrides":{"source":"./src/overrides/overridesUtils.ts","types":"./types/overrides/overridesUtils.d.ts","import":"./es/overrides/overridesUtils.js","require":"./lib/overrides/overridesUtils.js"},"./url-redirect":{"source":"./src/url-redirect/URLRedirectPlugin.ts","types":"./types/url-redirect/URLRedirectPlugin.d.ts","import":"./es/url-redirect/URLRedirectPlugin.js","require":"./lib/url-redirect/URLRedirectPlugin.js"},"./core/dom-manipulator":{"source":"./src/core/DOMManipulatorLite.ts","types":"./types/core/DOMManipulatorLite.d.ts","import":"./es/core/DOMManipulatorLite.js","require":"./lib/core/DOMManipulatorLite.js"},"./core/style-sheet-manager":{"source":"./src/core/StyleSheetManager.ts","types":"./types/core/StyleSheetManager.d.ts","import":"./es/core/StyleSheetManager.js","require":"./lib/core/StyleSheetManager.js"},"./core/pending-change-manager":{"source":"./src/core/PendingChangeManager.ts","types":"./types/core/PendingChangeManager.d.ts","import":"./es/core/PendingChangeManager.js","require":"./lib/core/PendingChangeManager.js"},"./utils/persistence":{"source":"./src/utils/persistence.ts","types":"./types/utils/persistence.d.ts","import":"./es/utils/persistence.js","require":"./lib/utils/persistence.js"}},"scripts":{"clean":"rm -rf lib es dist types","format":"prettier --write \"src/**/*.{js,ts,tsx}\"","postinstall":"node scripts/setup-git-hooks.js","lint":"eslint src --ext .ts,.tsx","compile:cjs":"tsc -p tsconfig.cjs.json","compile:es":"tsc -p tsconfig.es.json","compile:types":"tsc -p tsconfig.types.json","generate:build-info":"node scripts/generate-build-info.js","generate:build-info:debug":"node scripts/generate-build-info.js --debug","compile":"npm run generate:build-info && npm run compile:cjs && npm run compile:es && npm run compile:types","bundle":"npm run generate:build-info && webpack --mode production --env BUILD_TYPE=all","bundle:dom":"webpack --mode production --env BUILD_TYPE=dom-only","bundle:lite":"webpack --mode production --env BUILD_TYPE=dom-lite","bundle:full":"webpack --mode production --env BUILD_TYPE=dom-full","bundle:cookie":"webpack --mode production --env BUILD_TYPE=cookie-only","bundle:vitals":"webpack --mode production --env BUILD_TYPE=vitals-only","postbundle":"cp dist/*.min.js ../absmartly.com/static/ 2>/dev/null || true","bundle:dev":"npm run generate:build-info:debug && webpack --mode development --env BUILD_TYPE=all --devtool source-map","bundle:dev:all":"npm run bundle:dev:dom && npm run bundle:dev:lite && npm run bundle:dev:full && npm run bundle:dev:cookie && npm run bundle:dev:vitals && npm run bundle:dev:overrides","bundle:dev:dom":"webpack --mode development --env BUILD_TYPE=dom-only --devtool source-map","bundle:dev:lite":"webpack --mode development --env BUILD_TYPE=dom-lite --devtool source-map","bundle:dev:full":"webpack --mode development --env BUILD_TYPE=dom-full --devtool source-map","bundle:dev:cookie":"webpack --mode development --env BUILD_TYPE=cookie-only --devtool source-map","bundle:dev:vitals":"webpack --mode development --env BUILD_TYPE=vitals-only --devtool source-map","bundle:dev:overrides":"webpack --mode development --env BUILD_TYPE=overrides-lite --devtool source-map && webpack --mode development --env BUILD_TYPE=overrides-full --devtool source-map","build":"npm run clean && npm run format && npm run lint && npm run compile && npm run bundle","build:dev":"npm run clean && npm run format && npm run lint && npm run compile && npm run bundle:dev","build:all":"npm run build && npm run bundle:dev && npm run rename:dev","rename:dev":"cd dist && for file in *.js; do if [[ ! \"$file\" == *.min.js ]] && [[ ! \"$file\" == *.dev.js ]]; then mv \"$file\" \"${file%.js}.dev.js\"; fi; done; exit 0","test":"jest","test:watch":"jest --watch","test:coverage":"jest --coverage","dev":"tsc --watch","dev:all":"npm run compile:cjs -- --watch & npm run compile:es -- --watch & npm run compile:types -- --watch","watch":"webpack --mode development --watch --env BUILD_TYPE=all --devtool source-map","prepublishOnly":"npm run build && npm test","release":"npm run build && npm publish --access public","release:dry-run":"npm run build && npm publish --dry-run --access public","version:patch":"npm version patch","version:minor":"npm version minor","version:major":"npm version major"},"repository":{"type":"git","url":"git+https://github.com/absmartly/sdk-plugins.git"},"publishConfig":{"provenance":true},"keywords":["absmartly","ab-testing","experimentation","dom-manipulation","visual-editor"],"author":{"name":"ABsmartly"},"license":"MIT","bugs":{"url":"https://github.com/absmartly/dom-changes-plugin/issues"},"homepage":"https://github.com/absmartly/dom-changes-plugin#readme","peerDependencies":{"@absmartly/javascript-sdk":"^1.0.0"},"devDependencies":{"@testing-library/jest-dom":"^6.8.0","@types/jest":"^29.5.14","@types/node":"^20.8.0","@typescript-eslint/eslint-plugin":"^6.7.4","@typescript-eslint/parser":"^6.7.4","eslint":"^8.50.0","eslint-config-prettier":"^9.0.0","eslint-plugin-prettier":"^5.0.0","jest":"^29.7.0","jest-environment-jsdom":"^29.7.0","jsdom":"^26.1.0","prettier":"^3.0.3","ts-jest":"^29.4.1","ts-loader":"^9.4.4","typescript":"^5.2.2","webpack":"^5.88.2","webpack-cli":"^5.1.4"},"dependencies":{"@absmartly/dom-tracker":"^0.4.0","web-vitals":"^5.1.0"},"gitHead":"968fcd0582b21c76e89abcde37cd2c76a30c44f1","_id":"@absmartly/sdk-plugins@1.3.7","_nodeVersion":"24.14.1","_npmVersion":"11.11.0","dist":{"integrity":"sha512-NVbG/iAQHenKbqGwX7UxciEo43+wSBJdqI7P2Jqo7NzioqWUzjhRHAzctBxO+m8zza6+cLGIJUa9hudxWyDC8g==","shasum":"b1d13981968c294396a760322109194993bebf54","tarball":"https://registry.npmjs.org/@absmartly/sdk-plugins/-/sdk-plugins-1.3.7.tgz","fileCount":255,"unpackedSize":1846632,"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@absmartly%2fsdk-plugins@1.3.7","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"signatures":[{"keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U","sig":"MEUCIQCRRsTr8Ht+rD6droBAIJaixwyL9CipT8cw+83N2dALqAIgGHspPVjZXaT0vGMEKpBgBRa7xxdmboBKezKXOXdPr/Q="}]},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:1758a0da-6437-45f1-ad1d-95a57144128d"}},"directories":{},"maintainers":[{"name":"marcioapm","email":"marcioapm@gmail.com"},{"name":"joalves","email":"jonas@absmartly.com"},{"name":"caltheabtester","email":"cal@absmartly.com"},{"name":"marcioabs","email":"marcio@absmartly.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages-npm-production","tmp":"tmp/sdk-plugins_1.3.7_1777500049387_0.715647996683574"},"_hasShrinkwrap":false}},"time":{"created":"2025-10-11T11:11:05.458Z","modified":"2026-04-29T22:00:50.007Z","1.0.1":"2025-10-11T11:11:05.797Z","1.1.0":"2025-10-15T15:15:15.251Z","1.1.1":"2025-10-23T11:04:25.779Z","1.1.2":"2025-11-04T17:00:50.502Z","1.2.1":"2026-02-02T14:36:03.988Z","1.2.2":"2026-02-12T16:24:27.767Z","1.3.0":"2026-04-08T19:12:19.434Z","1.3.2":"2026-04-23T10:14:20.674Z","1.3.4":"2026-04-23T11:01:07.128Z","1.3.6":"2026-04-24T16:54:36.995Z","1.3.7":"2026-04-29T22:00:49.652Z"},"bugs":{"url":"https://github.com/absmartly/dom-changes-plugin/issues"},"author":{"name":"ABsmartly"},"license":"MIT","homepage":"https://github.com/absmartly/dom-changes-plugin#readme","keywords":["absmartly","ab-testing","experimentation","dom-manipulation","visual-editor"],"repository":{"type":"git","url":"git+https://github.com/absmartly/sdk-plugins.git"},"description":"Collection of plugins for ABsmartly JavaScript SDK","maintainers":[{"name":"marcioapm","email":"marcioapm@gmail.com"},{"name":"joalves","email":"jonas@absmartly.com"},{"name":"caltheabtester","email":"cal@absmartly.com"},{"name":"marcioabs","email":"marcio@absmartly.com"}],"readme":"# ABsmartly SDK Plugins\n\nA comprehensive collection of plugins for the ABsmartly JavaScript SDK including DOM manipulation, experiment overrides, cookie management, and web vitals tracking.\n\n## Available Plugins\n\n### 1. DOMChangesPlugin\n- **Complete DOM Manipulation**: All change types including styleRules with pseudo-states\n- **Smart Exposure Tracking**: Cross-variant tracking prevents sample ratio mismatch\n- **Dynamic Content Support**: Pending changes with `waitForElement` for SPAs\n- **React/Vue Compatibility**: StyleRules survive re-renders\n- **Anti-Flicker Support**: Hide content until experiments load to prevent visual flash\n\n### 2. OverridesPlugin\n- **Query String Overrides**: Force experiments via URL parameters\n- **Cookie Persistence**: Server-compatible experiment overrides\n- **API Integration**: Fetch non-running experiments (Full version)\n- **Development Support**: Test experiments in any environment\n\n### 3. CookiePlugin\n- **Unit ID Management**: Generate and persist user identifiers\n- **UTM Tracking**: Capture and store UTM parameters\n- **Landing Page Tracking**: Track first visits and referrers\n- **Storage Fallbacks**: Cookie → localStorage → memory\n\n### 4. WebVitalsPlugin\n- **Core Web Vitals**: Track CLS, LCP, FCP, INP, TTFB\n- **Page Metrics**: Network timing, DOM processing, resource counts\n- **Performance Ratings**: Automatic good/needs-improvement/poor classification\n- **Compression Metrics**: Track page size and compression ratios\n\n## Installation\n\n```bash\nnpm install @absmartly/sdk-plugins\n```\n\n## Quick Start\n\n### Basic Usage\n\n```javascript\nimport { DOMChangesPlugin, CookiePlugin, WebVitalsPlugin } from '@absmartly/sdk-plugins';\nimport absmartly from '@absmartly/javascript-sdk';\n\n// Initialize ABsmartly SDK\nconst sdk = new absmartly.SDK({\n  endpoint: 'https://your-endpoint.absmartly.io/v1',\n  apiKey: 'YOUR_API_KEY',\n  environment: 'production',\n  application: 'your-app'\n});\n\n// Create context\nconst context = sdk.createContext(request);\n\n// Initialize plugins\nconst domPlugin = new DOMChangesPlugin({\n  context: context,\n  autoApply: true,              // Automatically apply changes on init\n  spa: true,                     // Enable SPA support\n  visibilityTracking: true,     // Track when changes become visible\n  variableName: '__dom_changes', // Variable name for DOM changes\n  debug: true                    // Enable debug logging\n});\n\n// Initialize without blocking\ndomPlugin.ready().then(() => {\n  console.log('DOMChangesPlugin ready');\n});\n\n// Initialize cookie management\nconst cookiePlugin = new CookiePlugin({\n  context: context,\n  cookieDomain: '.yourdomain.com',\n  autoUpdateExpiry: true\n});\ncookiePlugin.ready().then(() => {\n  console.log('CookiePlugin ready');\n});\n\n// Initialize web vitals tracking\nconst vitalsPlugin = new WebVitalsPlugin({\n  context: context,\n  trackWebVitals: true,\n  trackPageMetrics: true\n});\nvitalsPlugin.ready().then(() => {\n  console.log('WebVitalsPlugin ready');\n});\n```\n\n### With Experiment Overrides\n\nThe OverridesPlugin enables experiment overrides for internal testing and development. Simply load it before SDK initialization and it will automatically check for and apply any overrides:\n\n```javascript\nimport {\n  DOMChangesPlugin,\n  OverridesPlugin\n} from '@absmartly/dom-changes-plugin';\nimport absmartly from '@absmartly/javascript-sdk';\n\n// Initialize SDK and create context\nconst sdk = new absmartly.SDK({ /* ... */ });\nconst context = sdk.createContext({ /* ... */ });\n\n// Initialize OverridesPlugin - it will automatically check for overrides\nconst overridesPlugin = new OverridesPlugin({\n  context: context,\n  cookieName: 'absmartly_overrides',\n  useQueryString: true,\n  queryPrefix: '_exp_',\n  envParam: 'env',\n  persistQueryToCookie: true,  // Save query overrides to cookie\n  sdkEndpoint: 'https://your-endpoint.absmartly.io',\n  debug: true\n});\n\noverridesPlugin.ready().then(() => {\n  console.log('OverridesPlugin ready - overrides applied if present');\n});\n\n// Initialize DOMChangesPlugin for all experiments\nconst domPlugin = new DOMChangesPlugin({\n  context: context,\n  autoApply: true,\n  variableName: '__dom_changes',\n  debug: true\n});\n\ndomPlugin.ready().then(() => {\n  console.log('DOMChangesPlugin ready');\n});\n```\n\n#### Override Configuration Options\n\n```javascript\nconst overridesPlugin = new OverridesPlugin({\n  context: context,                    // Required: ABsmartly context\n\n  // Cookie configuration\n  cookieName: 'absmartly_overrides',   // Cookie name (omit to disable cookies)\n  cookieOptions: {\n    path: '/',\n    secure: true,\n    sameSite: 'Lax'\n  },\n\n  // Query string configuration\n  useQueryString: true,                // Enable query string parsing (default: true on client)\n  queryPrefix: '_exp_',                 // Prefix for experiment params (default: '_exp_')\n  envParam: 'env',                     // Environment parameter name (default: 'env')\n  persistQueryToCookie: false,         // Save query overrides to cookie (default: false)\n\n  // Endpoints\n  sdkEndpoint: 'https://...',          // SDK endpoint (required if not in context)\n  absmartlyEndpoint: 'https://...',    // API endpoint for fetching experiments\n\n  // Server-side configuration\n  url: req.url,                        // URL for server-side (Node.js)\n  cookieAdapter: customAdapter,        // Custom cookie adapter for server-side\n\n  debug: true                          // Enable debug logging\n});\n```\n\n#### Query String Format (New)\n\nUse individual query parameters with configurable prefix:\n```\n# Single experiment\nhttps://example.com?_exp_button_color=1\n\n# Multiple experiments\nhttps://example.com?_exp_hero_title=0&_exp_nav_style=2\n\n# With environment\nhttps://example.com?env=staging&_exp_dev_feature=1,1\n\n# With experiment ID\nhttps://example.com?_exp_archived_test=1,2,12345\n```\n\n#### Cookie Format\n\nCookies use comma as separator (no encoding needed):\n```javascript\n// Simple overrides (comma-separated experiments)\ndocument.cookie = 'absmartly_overrides=exp1:1,exp2:0';\n\n// With environment flags (dot-separated values)\ndocument.cookie = 'absmartly_overrides=exp1:1.0,exp2:0.1';\n\n// With experiment ID\ndocument.cookie = 'absmartly_overrides=exp1:1.2.12345';\n\n// With dev environment\ndocument.cookie = 'absmartly_overrides=devEnv=staging|exp1:1.1,exp2:0.1';\n```\n\n**Format**: `name:variant[.env][.id]` where:\n- Experiments are separated by `,` (comma)\n- Values within an experiment are separated by `.` (dot)\n- Environment prefix uses `|` (pipe) separator\n\n#### How Overrides Work\n\n1. **Query String Priority**: Query parameters take precedence over cookies\n2. **Environment Support**: Use `env` parameter for dev/staging experiments\n3. **API Fetching**: Non-running experiments are fetched from ABsmartly API\n4. **Context Injection**: Experiments are transparently injected into context.data()\n5. **DOM Application**: DOMChangesPlugin applies changes from all experiments\n\n## DOM Change Types\n\nThe plugin supports comprehensive DOM manipulation with advanced features:\n\n### Core Change Types\n\n### Text Change\n```javascript\n{\n  selector: '.headline',\n  type: 'text',\n  value: 'New Headline Text'\n}\n```\n\n### HTML Change\n```javascript\n{\n  selector: '.content',\n  type: 'html',\n  value: '<p>New <strong>HTML</strong> content</p>'\n}\n```\n\n### Style Change (Inline)\n```javascript\n{\n  selector: '.button',\n  type: 'style',\n  value: {\n    backgroundColor: 'red',    // Use camelCase for CSS properties\n    color: '#ffffff',\n    fontSize: '18px'\n  },\n  trigger_on_view: false  // Control exposure timing\n}\n```\n\n### Style Rules (With Pseudo-States)\n```javascript\n{\n  selector: '.button',\n  type: 'styleRules',\n  states: {\n    normal: {\n      backgroundColor: '#007bff',\n      color: 'white',\n      padding: '10px 20px',\n      borderRadius: '4px',\n      transition: 'all 0.2s ease'\n    },\n    hover: {\n      backgroundColor: '#0056b3',\n      transform: 'translateY(-2px)',\n      boxShadow: '0 4px 8px rgba(0,0,0,0.2)'\n    },\n    active: {\n      backgroundColor: '#004085',\n      transform: 'translateY(0)'\n    },\n    focus: {\n      outline: '2px solid #007bff',\n      outlineOffset: '2px'\n    }\n  },\n  important: true,  // default is true\n  trigger_on_view: true\n}\n```\n\n**Benefits of styleRules:**\n- Handles CSS pseudo-states properly (hover, active, focus)\n- Survives React re-renders through stylesheet injection\n- More performant than inline styles for complex interactions\n\n### Class Change\n```javascript\n{\n  selector: '.card',\n  type: 'class',\n  add: ['highlighted', 'featured'],\n  remove: ['default']\n}\n```\n\n### Attribute Change\n```javascript\n{\n  selector: 'input[name=\"email\"]',\n  type: 'attribute',\n  value: {\n    'placeholder': 'Enter your email',\n    'required': 'true'\n  }\n}\n```\n\n### JavaScript Execution\n```javascript\n{\n  selector: '.dynamic-element',\n  type: 'javascript',\n  value: 'element.addEventListener(\"click\", () => console.log(\"Clicked!\"))'\n}\n```\n\n### Element Move\n```javascript\n{\n  selector: '.sidebar',\n  type: 'move',\n  targetSelector: '.main-content',\n  position: 'before' // 'before', 'after', 'firstChild', 'lastChild'\n}\n```\n\n### Element Creation\n```javascript\n{\n  selector: '.new-banner', // For identification\n  type: 'create',\n  element: '<div class=\"banner\">Special Offer!</div>',\n  targetSelector: 'body',\n  position: 'firstChild',\n  trigger_on_view: false\n}\n```\n\n### Pending Changes (Elements Not Yet in DOM)\n```javascript\n{\n  selector: '.lazy-loaded-button',\n  type: 'style',\n  value: {\n    backgroundColor: 'red',\n    color: 'white'\n  },\n  waitForElement: true,  // Wait for element to appear\n  observerRoot: '.main-content',  // Optional: specific container to watch\n  trigger_on_view: true\n}\n```\n\n**Perfect for:**\n- Lazy-loaded content\n- React components that mount/unmount\n- Modal dialogs\n- API-loaded content\n- Infinite scroll items\n\n## Key Features\n\n### Exposure Tracking with trigger_on_view\n\nThe `trigger_on_view` property prevents sample ratio mismatch by controlling when A/B test exposures are recorded:\n\n```javascript\n{\n  selector: '.below-fold-element',\n  type: 'style',\n  value: { backgroundColor: 'blue' },\n  trigger_on_view: true  // Only trigger when element becomes visible\n}\n```\n\n- **`false` (default)**: Exposure triggers immediately\n- **`true`**: Exposure triggers when element enters viewport\n- **Cross-variant tracking**: Tracks elements from ALL variants for unbiased exposure\n\n### Core API Methods\n\n```javascript\n// Apply changes from ABsmartly context\nawait plugin.applyChanges('experiment-name');\n\n// Apply individual change\nconst success = plugin.applyChange(change, 'experiment-name');\n\n// Remove changes\nplugin.removeChanges('experiment-name');\n\n// Get applied changes\nconst changes = plugin.getAppliedChanges('experiment-name');\n\n// Clean up resources\nplugin.destroy();\n```\n\n## Documentation\n\nFor detailed documentation:\n\n- **[Optimized Loading Guide](docs/OPTIMIZED_LOADING.md)** - Best practices for loading the SDK and plugins with minimal performance impact\n- **[Exposure Tracking Guide](docs/EXPOSURE_TRACKING_GUIDE.md)** - Understanding trigger_on_view and preventing sample ratio mismatch\n\n## Anti-Flicker Support\n\nPrevent content flash before experiments load with two modes:\n\n### Quick Start\n\n**Hide entire page with smooth fade-in:**\n```javascript\nconst domPlugin = new DOMChangesPlugin({\n  context: context,\n  hideUntilReady: 'body',\n  hideTransition: '0.3s ease-in'  // Smooth fade-in\n});\n```\n\n**Hide only experiment elements (recommended):**\n```html\n<!-- Mark elements that need anti-flicker -->\n<div data-absmartly-hide>\n  Hero section with experiment\n</div>\n\n<div data-absmartly-hide>\n  CTA button being tested\n</div>\n```\n\n```javascript\nconst domPlugin = new DOMChangesPlugin({\n  context: context,\n  hideUntilReady: '[data-absmartly-hide]',  // CSS selector for elements to hide\n  hideTransition: '0.4s ease-out'\n});\n```\n\n**Hide multiple types of elements:**\n```javascript\nconst domPlugin = new DOMChangesPlugin({\n  context: context,\n  hideUntilReady: '[data-absmartly-hide], [data-custom-hide], .test-element',\n  hideTransition: '0.3s ease-in'\n});\n```\n\n### How It Works\n\n1. **During Load (Before Experiments Applied):**\n   ```css\n   /* No transition: */\n   body { visibility: hidden !important; }\n\n   /* With transition: */\n   body {\n     visibility: hidden !important;\n     opacity: 0 !important;\n   }\n   ```\n\n2. **After Experiments Applied:**\n   - **No transition**: Instant reveal (removes `visibility:hidden`)\n   - **With transition**: Smooth 4-step fade-in:\n     1. Remove `visibility:hidden`\n     2. Add CSS transition\n     3. Animate opacity 0 → 1\n     4. Clean up after transition completes\n\n### Configuration Options\n\n```javascript\nnew DOMChangesPlugin({\n  // Anti-flicker configuration\n  hideUntilReady: 'body',              // CSS selector for elements to hide\n                                       // Examples:\n                                       //   'body' - hide entire page\n                                       //   '[data-absmartly-hide]' - hide only marked elements\n                                       //   '[data-absmartly-hide], .test' - hide multiple selectors\n                                       // false: disabled (default)\n\n  hideTimeout: 3000,                   // Max wait time in ms (default: 3000)\n                                       // Content auto-shows after timeout\n                                       // even if experiments fail to load\n\n  hideTransition: '0.3s ease-in',      // CSS transition for fade-in\n                                       // Examples: '0.3s ease-in', '0.5s linear'\n                                       // false: instant reveal (default)\n})\n```\n\n### Why This Matters\n\n**Without anti-flicker:**\n```\nUser sees: Original → FLASH → Experiment Version\n           ^^^^^^^^   ^^^^^   ^^^^^^^^^^^^^^^^^^\n           (bad UX)   (jarring)\n```\n\n**With anti-flicker:**\n```\nUser sees: [Hidden] → Experiment Version (smooth fade-in)\n           ^^^^^^^^   ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n           (no flash)  (professional)\n```\n\n### Best Practices\n\n**✅ Use `hideUntilReady: '[data-absmartly-hide]'` (Recommended)**\n- Mark only elements being tested\n- Faster perceived load time\n- Better user experience\n- No CLS (Cumulative Layout Shift)\n\n```html\n<nav>Normal navigation</nav>\n<div data-absmartly-hide>\n  <!-- Only this hero is hidden -->\n  <h1>Hero headline being tested</h1>\n</div>\n<main>Rest of content visible immediately</main>\n```\n\n```javascript\nconst domPlugin = new DOMChangesPlugin({\n  context: context,\n  hideUntilReady: '[data-absmartly-hide]',\n  hideTransition: '0.3s ease-in'\n});\n```\n\n**✅ Use `hideUntilReady: 'body'` (For whole-page experiments)**\n- Complete redesigns\n- Multiple changes across page\n- Ensures zero flicker\n\n**✅ Set appropriate timeout**\n```javascript\n{\n  hideTimeout: 2000  // Faster for good connections\n  hideTimeout: 3000  // Balanced (default)\n  hideTimeout: 5000  // Safer for slow connections\n}\n```\n\n**⚠️ Avoid long transitions**\n```javascript\nhideTransition: '0.2s ease-in'  // ✅ Subtle, professional\nhideTransition: '0.3s ease-out' // ✅ Smooth\nhideTransition: '1s linear'     // ❌ Too slow, feels broken\n```\n\n### Industry Standard Comparison\n\n| Tool | Method | Our Implementation |\n|------|--------|-------------------|\n| Google Optimize | `opacity: 0` | ✅ `visibility:hidden` (better) |\n| Optimizely | `opacity: 0` | ✅ `visibility:hidden` (better) |\n| VWO | `opacity: 0` on body | ✅ Both modes supported |\n| **ABsmartly** | - | ✅ `visibility:hidden` + optional smooth fade |\n\n**Why `visibility:hidden` is better:**\n- ✅ Hides from screen readers\n- ✅ Prevents interaction\n- ✅ No CLS (Cumulative Layout Shift)\n- ✅ Can add smooth opacity transition\n\n## Style Persistence\n\nAutomatically reapply experiment styles when frameworks (React/Vue/Angular) overwrite them:\n\n### The Problem\n\n```javascript\n// Experiment changes button to red\n{ selector: '.button', type: 'style', value: { backgroundColor: 'red' } }\n\n// User hovers → React's hover handler changes it back to blue\n// Experiment style is lost! ❌\n```\n\n### The Solution\n\n```javascript\n{\n  selector: '.button',\n  type: 'style',\n  value: { backgroundColor: 'red' },\n  persistStyle: true  // ✅ Reapply when React overwrites it\n}\n```\n\n### How It Works\n\n1. **MutationObserver** watches for style attribute changes\n2. **Detects** when framework overwrites experiment styles\n3. **Automatically reapplies** experiment styles\n4. **Throttled logging** (max once per 5 seconds to avoid spam)\n\n### When It's Enabled\n\n**Automatically in SPA mode:**\n```javascript\nnew DOMChangesPlugin({\n  context: context,\n  spa: true  // ✅ Style persistence auto-enabled for all style changes\n})\n```\n\n**Opt-in per change:**\n```javascript\n{\n  selector: '.button',\n  type: 'style',\n  value: { backgroundColor: 'red' },\n  persistStyle: true  // ✅ Explicit opt-in (works even if spa: false)\n}\n```\n\n### Use Cases\n\n**✅ React components with hover states:**\n```javascript\n// Button has React onClick that changes style\n{\n  selector: '.cta-button',\n  type: 'style',\n  value: { backgroundColor: '#ff6b6b' },\n  persistStyle: true  // Survives React re-renders\n}\n```\n\n**✅ Vue reactive styles:**\n```javascript\n{\n  selector: '.dynamic-price',\n  type: 'style',\n  value: { color: 'green', fontWeight: 'bold' },\n  persistStyle: true  // Persists through Vue updates\n}\n```\n\n**✅ Angular material components:**\n```javascript\n{\n  selector: 'mat-button',\n  type: 'style',\n  value: { backgroundColor: '#1976d2' },\n  persistStyle: true  // Works with Angular's style binding\n}\n```\n\n**❌ Static HTML (persistence not needed):**\n```javascript\n{\n  selector: '.static-banner',\n  type: 'style',\n  value: { display: 'none' },\n  persistStyle: false  // Not needed, saves performance\n}\n```\n\n## URL Filtering\n\nTarget experiments to specific pages or URL patterns using the `urlFilter` property. This enables precise control over where experiments run without code changes.\n\n### Basic URL Filtering\n\nWrap your DOM changes in a configuration object with `urlFilter`:\n\n```javascript\n{\n  urlFilter: '/products',  // Simple path match\n  changes: [\n    {\n      selector: '.product-title',\n      type: 'style',\n      value: { color: 'red' }\n    }\n  ]\n}\n```\n\n### URL Filter Configuration\n\n```javascript\n{\n  urlFilter: {\n    include: ['/checkout', '/cart'],     // Run on these URLs\n    exclude: ['/checkout/success'],      // But NOT on these\n    mode: 'simple',                      // 'simple' or 'regex'\n    matchType: 'path'                    // 'full-url', 'path', 'domain', 'query', 'hash'\n  },\n  changes: [ /* ... */ ]\n}\n```\n\n### Match Types\n\n**`path` (default)** - Match against pathname + hash:\n```javascript\n// URL: https://example.com/products/shoes#new\n// Matches: \"/products/shoes#new\"\n{\n  urlFilter: { include: ['/products/*'], matchType: 'path' },\n  changes: [ /* ... */ ]\n}\n```\n\n**`full-url`** - Match complete URL including protocol and domain:\n```javascript\n// URL: https://example.com/products\n// Matches: \"https://example.com/products\"\n{\n  urlFilter: { include: ['https://example.com/products'], matchType: 'full-url' },\n  changes: [ /* ... */ ]\n}\n```\n\n**`domain`** - Match only the hostname:\n```javascript\n// URL: https://shop.example.com/products\n// Matches: \"shop.example.com\"\n{\n  urlFilter: { include: ['shop.example.com'], matchType: 'domain' },\n  changes: [ /* ... */ ]\n}\n```\n\n**`query`** - Match only query parameters:\n```javascript\n// URL: https://example.com/products?category=shoes\n// Matches: \"?category=shoes\"\n{\n  urlFilter: { include: ['*category=shoes*'], matchType: 'query' },\n  changes: [ /* ... */ ]\n}\n```\n\n**`hash`** - Match only hash fragment:\n```javascript\n// URL: https://example.com/page#section-1\n// Matches: \"#section-1\"\n{\n  urlFilter: { include: ['#section-*'], matchType: 'hash' },\n  changes: [ /* ... */ ]\n}\n```\n\n### Pattern Matching Modes\n\n**Simple Mode (default)** - Glob-style wildcards:\n```javascript\n{\n  urlFilter: {\n    include: [\n      '/products/*',           // All product pages\n      '/checkout*',            // Checkout and checkout/*\n      '/about',                // Exact match\n      '*/special-offer'        // Any path ending with /special-offer\n    ],\n    mode: 'simple'\n  },\n  changes: [ /* ... */ ]\n}\n```\n\n**Simple Mode Wildcards:**\n- `*` = Match any characters (0 or more)\n- `?` = Match single character\n- No wildcards = Exact match\n\n**Regex Mode** - Full regex power:\n```javascript\n{\n  urlFilter: {\n    include: [\n      '^/products/(shoes|bags)',     // Products in specific categories\n      '/checkout/(step-[1-3])',      // Checkout steps 1-3 only\n      '\\\\?utm_source=email'          // URLs with email traffic\n    ],\n    mode: 'regex'\n  },\n  changes: [ /* ... */ ]\n}\n```\n\n### Include and Exclude Logic\n\n**Include only:**\n```javascript\n{\n  urlFilter: { include: ['/products/*'] },\n  changes: [ /* ... */ ]\n}\n// ✅ Runs on: /products/shoes, /products/bags\n// ❌ Skips:  /about, /checkout\n```\n\n**Include with exclusions:**\n```javascript\n{\n  urlFilter: {\n    include: ['/products/*'],\n    exclude: ['/products/admin', '/products/*/edit']\n  },\n  changes: [ /* ... */ ]\n}\n// ✅ Runs on: /products/shoes, /products/bags\n// ❌ Skips:  /products/admin, /products/shoes/edit\n```\n\n**Exclude only (match all except):**\n```javascript\n{\n  urlFilter: { exclude: ['/admin/*', '/api/*'] },\n  changes: [ /* ... */ ]\n}\n// ✅ Runs on: /products, /checkout, /about\n// ❌ Skips:  /admin/users, /api/data\n```\n\n**No filter (match all):**\n```javascript\n{\n  urlFilter: {},  // or omit urlFilter entirely\n  changes: [ /* ... */ ]\n}\n// ✅ Runs on all pages\n```\n\n**Match nothing (disable experiment):**\n```javascript\n{\n  urlFilter: { include: [] },  // Empty array = explicit \"match nothing\"\n  changes: [ /* ... */ ]\n}\n// ❌ Never runs (useful for temporary disabling)\n```\n\n### SRM Prevention with URL Filters\n\n**Critical:** When using `urlFilter`, the plugin implements **Sample Ratio Mismatch (SRM) prevention** by tracking ALL variants, not just the current variant:\n\n```javascript\n// Variant 0 (Control): No URL filter\n{\n  changes: [\n    { selector: '.hero', type: 'text', value: 'Welcome' }\n  ]\n}\n\n// Variant 1: Only runs on /products\n{\n  urlFilter: '/products',\n  changes: [\n    { selector: '.hero', type: 'text', value: 'Shop Now' }\n  ]\n}\n```\n\n**Without SRM prevention:**\n- Users on `/products` → Tracked in both variants ✅\n- Users on `/about` → Only tracked in variant 0 ❌\n- **Result:** Biased sample sizes!\n\n**With SRM prevention (automatic):**\n- Users on `/products` → Tracked in both variants ✅\n- Users on `/about` → Tracked in both variants ✅\n- **Result:** Unbiased sample sizes! ✅\n\nThe plugin checks if **ANY variant** matches the current URL. If ANY variant matches, ALL variants are tracked for that user, ensuring fair sample distribution.\n\n### URL Change Detection (SPA Mode)\n\nIn SPA mode (`spa: true`), the plugin automatically detects URL changes and re-evaluates experiments:\n\n```javascript\nnew DOMChangesPlugin({\n  context: context,\n  spa: true,  // Enable URL change detection\n  autoApply: true\n});\n```\n\n**What it tracks:**\n- ✅ `history.pushState()` - Client-side navigation\n- ✅ `history.replaceState()` - URL updates\n- ✅ `popstate` events - Browser back/forward buttons\n\n**What happens on URL change:**\n1. Remove all currently applied DOM changes\n2. Re-evaluate URL filters with the new URL\n3. Apply changes for experiments matching the new URL\n4. Re-track exposure for newly applied experiments\n\n**Example flow:**\n```\nUser lands on:     /products        → Apply product page experiments\nUser navigates to: /checkout        → Remove product experiments, apply checkout experiments\nUser goes back:    /products        → Remove checkout experiments, re-apply product experiments\n```\n\n**Without SPA mode:**\n- URL changes are NOT detected\n- Experiments applied on initial page load remain active\n- New experiments on the new URL are NOT applied\n- Use `spa: false` only for static sites without client-side routing\n\n### Complete Examples\n\n**E-commerce experiment on specific pages:**\n```javascript\n{\n  urlFilter: {\n    include: ['/products/*', '/collections/*'],\n    exclude: ['/products/admin', '*/edit'],\n    matchType: 'path',\n    mode: 'simple'\n  },\n  changes: [\n    {\n      selector: '.add-to-cart-button',\n      type: 'style',\n      value: { backgroundColor: '#ff6b6b', color: 'white' },\n      trigger_on_view: true\n    }\n  ]\n}\n```\n\n**Blog post experiment with regex:**\n```javascript\n{\n  urlFilter: {\n    include: ['^/blog/20(24|25)'],  // Only 2024-2025 blog posts\n    mode: 'regex',\n    matchType: 'path'\n  },\n  changes: [\n    {\n      selector: '.blog-cta',\n      type: 'text',\n      value: 'Subscribe to our newsletter!'\n    }\n  ]\n}\n```\n\n**Landing page experiment with UTM parameters:**\n```javascript\n{\n  urlFilter: {\n    include: ['*utm_campaign=summer*'],\n    matchType: 'query'\n  },\n  changes: [\n    {\n      selector: '.hero-banner',\n      type: 'html',\n      value: '<h1>Summer Sale - 50% Off!</h1>'\n    }\n  ]\n}\n```\n\n**Homepage only (exact match):**\n```javascript\n{\n  urlFilter: '/',  // Shorthand for { include: ['/'] }\n  changes: [\n    {\n      selector: '.hero-title',\n      type: 'text',\n      value: 'Limited Time Offer!'\n    }\n  ]\n}\n```\n\n**Multiple pages (array shorthand):**\n```javascript\n{\n  urlFilter: ['/pricing', '/features'],  // Shorthand for { include: [...] }\n  changes: [ /* ... */ ]\n}\n```\n\n## SPA Mode (React/Vue/Angular Support)\n\nEnable `spa: true` for Single Page Applications. This automatically activates three critical features:\n\n### 1. URL Change Detection\n\nAutomatically detects client-side navigation and re-evaluates experiments:\n\n- Intercepts `history.pushState()` and `history.replaceState()`\n- Listens to `popstate` events (browser back/forward)\n- Re-applies appropriate experiments when URL changes\n\nSee [URL Change Detection](#url-change-detection-spa-mode) above for details.\n\n### 2. Wait for Element (Lazy-Loaded Content)\n\nAutomatically waits for elements that don't exist yet in the DOM:\n\n```javascript\n{\n  selector: '.lazy-loaded-button',\n  type: 'style',\n  value: { backgroundColor: 'red' }\n  // No waitForElement needed - SPA mode handles it automatically!\n}\n```\n\n**Without SPA mode:** Change skipped if element doesn't exist\n**With SPA mode:** Observes DOM and applies when element appears\n\n### 3. Style Persistence (Framework Conflicts)\n\nAutomatically re-applies styles when frameworks overwrite them:\n\n```javascript\n{\n  selector: '.button',\n  type: 'style',\n  value: { backgroundColor: 'red' }\n  // No persistStyle needed - SPA mode handles it automatically!\n}\n```\n\n**Without SPA mode:** React hover states can overwrite experiment styles\n**With SPA mode:** Detects and re-applies styles automatically\n\n### When to Use SPA Mode\n\n**✅ Enable `spa: true` for:**\n- React applications\n- Vue.js applications\n- Angular applications\n- Any app with client-side routing\n- Apps with lazy-loaded components\n- Apps with dynamic DOM updates\n\n**❌ Keep `spa: false` for:**\n- Static HTML sites\n- Server-rendered pages without client-side routing\n- Sites where performance is critical and you don't need dynamic features\n\n### Manual Override\n\nYou can still use flags explicitly if you need granular control:\n\n```javascript\n{\n  selector: '.button',\n  type: 'style',\n  value: { backgroundColor: 'red' },\n  persistStyle: true,    // Force enable (even if spa: false)\n  waitForElement: true   // Force enable (even if spa: false)\n}\n```\n\n## Configuration Options\n\n```javascript\nnew DOMChangesPlugin({\n  // Required\n  context: absmartlyContext,     // ABsmartly context\n\n  // Core options\n  autoApply: true,               // Auto-apply changes from SDK\n  spa: true,                     // Enable SPA support\n                                 // ✅ Auto-enables: waitForElement + persistStyle\n  visibilityTracking: true,      // Track viewport visibility\n  variableName: '__dom_changes', // Variable name for DOM changes\n  debug: false,                  // Enable debug logging\n\n  // Anti-flicker options\n  hideUntilReady: false,         // CSS selector (e.g., 'body', '[data-absmartly-hide]') or false\n  hideTimeout: 3000,             // Max wait time (ms)\n  hideTransition: false,         // CSS transition (e.g., '0.3s ease-in') or false\n})\n```\n\n## Browser Compatibility\n\n- Modern browsers (Chrome, Firefox, Safari, Edge)\n- Internet Explorer 11+ (with polyfills)\n- Mobile browsers (iOS Safari, Chrome Mobile)\n\n## License\n\nMIT","readmeFilename":"README.md"}