{"_id":"@alikhalilll/nuxt-crypto","_rev":"8-5baf4f64814520eec00e7f4207e23098","name":"@alikhalilll/nuxt-crypto","dist-tags":{"latest":"1.3.0"},"versions":{"1.0.0":{"name":"@alikhalilll/nuxt-crypto","version":"1.0.0","keywords":["nuxt","nuxt-module","crypto","encryption","aes-gcm","web-crypto","pbkdf2"],"author":{"name":"alikhalilll"},"license":"MIT","_id":"@alikhalilll/nuxt-crypto@1.0.0","maintainers":[{"name":"alikhalilll","email":"alikhalilll.dev@gmail.com"}],"dist":{"shasum":"c06bb39b17bd15bbd74643a763bbe2b95c299fe9","tarball":"https://registry.npmjs.org/@alikhalilll/nuxt-crypto/-/nuxt-crypto-1.0.0.tgz","fileCount":18,"integrity":"sha512-VwBBQoTxJC8H+0UYYyadxSsZ1WvEEPvcMGcct05IGKNcG1aOUm5URbPnOYkazdekXbU+E5HnjOF+95lS2j2sSw==","signatures":[{"sig":"MEYCIQDCXQt3yeuW74A69qT+8cYd5tddy/lrdfswNL1roA4S4AIhALjgvFbO6Kv147onv0HMTuSPW+AExXpQgjMIVtQ1d/xp","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":47108},"type":"module","_from":"file:alikhalilll-nuxt-crypto-1.0.0.tgz","types":"./dist/module.d.ts","exports":{".":{"types":"./dist/module.d.ts","import":"./dist/module.mjs"},"./core":{"types":"./dist/core/index.d.ts","import":"./dist/core/index.mjs"},"./types":{"types":"./dist/types/index.d.ts","import":"./dist/types/index.mjs"},"./package.json":"./package.json"},"scripts":{"build":"pnpm clean && tsup","clean":"rimraf dist","typecheck":"tsc --noEmit -p tsconfig.json"},"_npmUser":{"name":"alikhalilll","email":"alikhalilll.dev@gmail.com"},"_resolved":"/private/var/folders/7v/1sk02ysd1xq6wmwprzz6h2cr0000gn/T/3edd97d40cfe4d5bb9575aa7aee537b4/alikhalilll-nuxt-crypto-1.0.0.tgz","_integrity":"sha512-VwBBQoTxJC8H+0UYYyadxSsZ1WvEEPvcMGcct05IGKNcG1aOUm5URbPnOYkazdekXbU+E5HnjOF+95lS2j2sSw==","_npmVersion":"10.9.3","description":"Symmetric Web Crypto service for Nuxt 3/4. AES-256-GCM + PBKDF2 with key caching and pluggable algorithms.","directories":{},"sideEffects":false,"_nodeVersion":"22.18.0","publishConfig":{"access":"public"},"typesVersions":{"*":{".":["./dist/module.d.ts"],"core":["./dist/core/index.d.ts"],"types":["./dist/types/index.d.ts"]}},"_hasShrinkwrap":false,"devDependencies":{"tsup":"^8.5.0","rimraf":"^6.0.1","@nuxt/kit":"^4.0.0","typescript":"^5.9.2","@types/node":"^22.13.0","@nuxt/schema":"^4.0.0"},"peerDependencies":{"@nuxt/kit":"^3.0.0 || ^4.0.0"},"peerDependenciesMeta":{"@nuxt/kit":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/nuxt-crypto_1.0.0_1776387522411_0.6393088576844494","host":"s3://npm-registry-packages-npm-production"}},"1.0.1":{"name":"@alikhalilll/nuxt-crypto","version":"1.0.1","keywords":["nuxt","nuxt-module","crypto","encryption","aes-gcm","web-crypto","pbkdf2"],"author":{"name":"alikhalilll"},"license":"MIT","_id":"@alikhalilll/nuxt-crypto@1.0.1","maintainers":[{"name":"alikhalilll","email":"alikhalilll.dev@gmail.com"}],"homepage":"https://github.com/alikhalilll/ali-nuxt-toolkit#readme","bugs":{"url":"https://github.com/alikhalilll/ali-nuxt-toolkit/issues"},"dist":{"shasum":"8cf47962d82803d5dd97e2c706a8969b2c401b25","tarball":"https://registry.npmjs.org/@alikhalilll/nuxt-crypto/-/nuxt-crypto-1.0.1.tgz","fileCount":19,"integrity":"sha512-mun39XMPeIAHHEtiQMYYD/e4wUtu9eOZmU3zpad6R/o57wAhZZiyVgUivJ8dNW+UzEsaxFW925b0WhGEij6fqw==","signatures":[{"sig":"MEUCIQCpYSabVtCFEDyw1IJ1hV8dcS8t1HeLgr3W5Dj+RyoDAAIgSI0eFxtXpUpjsBh+Jwqml5hj9GX5M5/q3PfoNxXxCic=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":48534},"type":"module","_from":"file:alikhalilll-nuxt-crypto-1.0.1.tgz","types":"./dist/module.d.ts","engines":{"node":">=18"},"exports":{".":{"types":"./dist/module.d.ts","import":"./dist/module.mjs"},"./core":{"types":"./dist/core/index.d.ts","import":"./dist/core/index.mjs"},"./types":{"types":"./dist/types/index.d.ts","import":"./dist/types/index.mjs"},"./package.json":"./package.json"},"scripts":{"build":"pnpm clean && tsup","clean":"rimraf dist","typecheck":"tsc --noEmit -p tsconfig.json"},"_npmUser":{"name":"alikhalilll","email":"alikhalilll.dev@gmail.com"},"_resolved":"/private/var/folders/7v/1sk02ysd1xq6wmwprzz6h2cr0000gn/T/7390fa927deb9c8f21a432d85462297d/alikhalilll-nuxt-crypto-1.0.1.tgz","_integrity":"sha512-mun39XMPeIAHHEtiQMYYD/e4wUtu9eOZmU3zpad6R/o57wAhZZiyVgUivJ8dNW+UzEsaxFW925b0WhGEij6fqw==","repository":{"url":"git+https://github.com/alikhalilll/ali-nuxt-toolkit.git","type":"git","directory":"packages/crypto"},"_npmVersion":"10.9.3","description":"Symmetric Web Crypto service for Nuxt 3/4. AES-256-GCM + PBKDF2 with key caching and pluggable algorithms.","directories":{},"sideEffects":false,"_nodeVersion":"22.18.0","publishConfig":{"access":"public"},"typesVersions":{"*":{".":["./dist/module.d.ts"],"core":["./dist/core/index.d.ts"],"types":["./dist/types/index.d.ts"]}},"_hasShrinkwrap":false,"devDependencies":{"tsup":"^8.5.0","rimraf":"^6.0.1","@nuxt/kit":"^4.0.0","typescript":"^5.9.2","@types/node":"^22.13.0","@nuxt/schema":"^4.0.0"},"peerDependencies":{"@nuxt/kit":"^3.0.0 || ^4.0.0"},"peerDependenciesMeta":{"@nuxt/kit":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/nuxt-crypto_1.0.1_1776389371683_0.0888310715971703","host":"s3://npm-registry-packages-npm-production"}},"1.0.2":{"name":"@alikhalilll/nuxt-crypto","version":"1.0.2","keywords":["nuxt","nuxt-module","crypto","encryption","aes-gcm","web-crypto","pbkdf2"],"author":{"name":"alikhalilll"},"license":"MIT","_id":"@alikhalilll/nuxt-crypto@1.0.2","maintainers":[{"name":"alikhalilll","email":"alikhalilll.dev@gmail.com"}],"homepage":"https://github.com/alikhalilll/ali-nuxt-toolkit#readme","bugs":{"url":"https://github.com/alikhalilll/ali-nuxt-toolkit/issues"},"dist":{"shasum":"6f0c770ebeeb6e7a3ec55df8c2887ff0cce41f9f","tarball":"https://registry.npmjs.org/@alikhalilll/nuxt-crypto/-/nuxt-crypto-1.0.2.tgz","fileCount":19,"integrity":"sha512-V1TDIULYdnNj/ne8w8t4olDLWzV4KZ2mhaW4ua2LqPzJEfNqfmm44lKufSWxUcH7zU6q/sfK+eLTDUxNykCJGA==","signatures":[{"sig":"MEQCICSXy6xR/GiGqIecfZEwNaUKJZzQNSweaubJH03tvRhuAiB3lbJPPiZUv/Pgy9Oo07qmB9IQ5gIvZbFCutgRojq6rg==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":48534},"type":"module","_from":"file:alikhalilll-nuxt-crypto-1.0.2.tgz","types":"./dist/module.d.ts","engines":{"node":">=18"},"exports":{".":{"types":"./dist/module.d.ts","import":"./dist/module.mjs"},"./core":{"types":"./dist/core/index.d.ts","import":"./dist/core/index.mjs"},"./types":{"types":"./dist/types/index.d.ts","import":"./dist/types/index.mjs"},"./package.json":"./package.json"},"scripts":{"build":"pnpm clean && tsup","clean":"rimraf dist","typecheck":"tsc --noEmit -p tsconfig.json"},"_npmUser":{"name":"alikhalilll","email":"alikhalilll.dev@gmail.com"},"_resolved":"/private/var/folders/7v/1sk02ysd1xq6wmwprzz6h2cr0000gn/T/eb925b7ed1d6181a68131fc98e8cf2b8/alikhalilll-nuxt-crypto-1.0.2.tgz","_integrity":"sha512-V1TDIULYdnNj/ne8w8t4olDLWzV4KZ2mhaW4ua2LqPzJEfNqfmm44lKufSWxUcH7zU6q/sfK+eLTDUxNykCJGA==","repository":{"url":"git+https://github.com/alikhalilll/ali-nuxt-toolkit.git","type":"git","directory":"packages/crypto"},"_npmVersion":"10.9.3","description":"Symmetric Web Crypto service for Nuxt 3/4. AES-256-GCM + PBKDF2 with key caching and pluggable algorithms.","directories":{},"sideEffects":false,"_nodeVersion":"22.18.0","publishConfig":{"access":"public"},"typesVersions":{"*":{".":["./dist/module.d.ts"],"core":["./dist/core/index.d.ts"],"types":["./dist/types/index.d.ts"]}},"_hasShrinkwrap":false,"devDependencies":{"tsup":"^8.5.0","rimraf":"^6.0.1","@nuxt/kit":"^4.0.0","typescript":"^5.9.2","@types/node":"^22.13.0","@nuxt/schema":"^4.0.0"},"peerDependencies":{"@nuxt/kit":"^3.0.0 || ^4.0.0"},"peerDependenciesMeta":{"@nuxt/kit":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/nuxt-crypto_1.0.2_1776389677267_0.22127027897838625","host":"s3://npm-registry-packages-npm-production"}},"1.0.3":{"name":"@alikhalilll/nuxt-crypto","version":"1.0.3","keywords":["nuxt","nuxt-module","crypto","encryption","aes-gcm","web-crypto","pbkdf2"],"author":{"name":"alikhalilll"},"license":"MIT","_id":"@alikhalilll/nuxt-crypto@1.0.3","maintainers":[{"name":"alikhalilll","email":"alikhalilll.dev@gmail.com"}],"homepage":"https://github.com/alikhalilll/ali-nuxt-toolkit#readme","bugs":{"url":"https://github.com/alikhalilll/ali-nuxt-toolkit/issues"},"dist":{"shasum":"6e65dbfc819c511cd66ac8f1f1390b922e6808f6","tarball":"https://registry.npmjs.org/@alikhalilll/nuxt-crypto/-/nuxt-crypto-1.0.3.tgz","fileCount":19,"integrity":"sha512-/FjtkY2P3/MzKgkBtlMQE5Ty+D80qu37m1d9QnEswa/sdWJI5guQGQujkXpyhdCCv71iUtzy6RrQccUky328SA==","signatures":[{"sig":"MEUCIDejYG/4v1HOqmefKw3i5mnEeyFDYp6jf0w+8HdkMjpLAiEA3aVYMDHHZWfbASmZyOablicNrs0wOhzfnxy4vSNuADk=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":48534},"type":"module","_from":"file:alikhalilll-nuxt-crypto-1.0.3.tgz","types":"./dist/module.d.ts","engines":{"node":">=18"},"exports":{".":{"types":"./dist/module.d.ts","import":"./dist/module.mjs"},"./core":{"types":"./dist/core/index.d.ts","import":"./dist/core/index.mjs"},"./types":{"types":"./dist/types/index.d.ts","import":"./dist/types/index.mjs"},"./package.json":"./package.json"},"scripts":{"build":"pnpm clean && tsup","clean":"rimraf dist","typecheck":"tsc --noEmit -p tsconfig.json"},"_npmUser":{"name":"alikhalilll","email":"alikhalilll.dev@gmail.com"},"_resolved":"/private/var/folders/7v/1sk02ysd1xq6wmwprzz6h2cr0000gn/T/201d20cfdadf59f8706e57fc39919ae8/alikhalilll-nuxt-crypto-1.0.3.tgz","_integrity":"sha512-/FjtkY2P3/MzKgkBtlMQE5Ty+D80qu37m1d9QnEswa/sdWJI5guQGQujkXpyhdCCv71iUtzy6RrQccUky328SA==","repository":{"url":"git+https://github.com/alikhalilll/ali-nuxt-toolkit.git","type":"git","directory":"packages/crypto"},"_npmVersion":"10.9.3","description":"Symmetric Web Crypto service for Nuxt 3/4. AES-256-GCM + PBKDF2 with key caching and pluggable algorithms.","directories":{},"sideEffects":false,"_nodeVersion":"22.18.0","publishConfig":{"access":"public"},"typesVersions":{"*":{".":["./dist/module.d.ts"],"core":["./dist/core/index.d.ts"],"types":["./dist/types/index.d.ts"]}},"_hasShrinkwrap":false,"devDependencies":{"tsup":"^8.5.0","rimraf":"^6.0.1","@nuxt/kit":"^4.0.0","typescript":"^5.9.2","@types/node":"^22.13.0","@nuxt/schema":"^4.0.0"},"peerDependencies":{"@nuxt/kit":"^3.0.0 || ^4.0.0"},"peerDependenciesMeta":{"@nuxt/kit":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/nuxt-crypto_1.0.3_1776390683087_0.5285204383698148","host":"s3://npm-registry-packages-npm-production"}},"1.2.0":{"name":"@alikhalilll/nuxt-crypto","version":"1.2.0","keywords":["nuxt","nuxt-module","crypto","encryption","aes-gcm","web-crypto","pbkdf2","fingerprint"],"author":{"name":"alikhalilll"},"license":"MIT","_id":"@alikhalilll/nuxt-crypto@1.2.0","maintainers":[{"name":"alikhalilll","email":"alikhalilll.dev@gmail.com"}],"homepage":"https://github.com/alikhalilll/ali-nuxt-toolkit#readme","bugs":{"url":"https://github.com/alikhalilll/ali-nuxt-toolkit/issues"},"dist":{"shasum":"a804ed9c4b5a54cd3bc4fdccda3b021ba746250a","tarball":"https://registry.npmjs.org/@alikhalilll/nuxt-crypto/-/nuxt-crypto-1.2.0.tgz","fileCount":24,"integrity":"sha512-6V5ZS7MGM8inSpdfWqgsEEyuGFXsirJ7Q+l45Qc2HOxsZFXtjE7fSHJ6AhIBlgjJ5y2au5KI/bT3+RcdkHJIyQ==","signatures":[{"sig":"MEUCIH1XogAmlKCUPbJZLqxxFVaEmK7TTYx6lmt7bu3q9Mb8AiEA6lNDAvos1GcqAV7jqn2Z+AYAW/wcS/m74IuT4Ic0HmA=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":65316},"type":"module","_from":"file:alikhalilll-nuxt-crypto-1.2.0.tgz","types":"./dist/module.d.ts","engines":{"node":">=18"},"exports":{".":{"types":"./dist/module.d.ts","import":"./dist/module.mjs"},"./core":{"types":"./dist/core/index.d.ts","import":"./dist/core/index.mjs"},"./types":{"types":"./dist/types/index.d.ts","import":"./dist/types/index.mjs"},"./server":{"types":"./dist/server/index.d.ts","import":"./dist/server/index.mjs"},"./package.json":"./package.json"},"scripts":{"build":"pnpm clean && tsup","clean":"rimraf dist","typecheck":"tsc --noEmit -p tsconfig.json"},"_npmUser":{"name":"alikhalilll","email":"alikhalilll.dev@gmail.com"},"_resolved":"/private/var/folders/7v/1sk02ysd1xq6wmwprzz6h2cr0000gn/T/484e602239758ff4e3ff8b1042030a25/alikhalilll-nuxt-crypto-1.2.0.tgz","_integrity":"sha512-6V5ZS7MGM8inSpdfWqgsEEyuGFXsirJ7Q+l45Qc2HOxsZFXtjE7fSHJ6AhIBlgjJ5y2au5KI/bT3+RcdkHJIyQ==","repository":{"url":"git+https://github.com/alikhalilll/ali-nuxt-toolkit.git","type":"git","directory":"packages/crypto"},"_npmVersion":"10.9.3","description":"Symmetric Web Crypto service for Nuxt 3/4. AES-256-GCM + PBKDF2 with key caching, pluggable algorithms, and optional device-fingerprint binding.","directories":{},"sideEffects":false,"_nodeVersion":"22.18.0","publishConfig":{"access":"public"},"typesVersions":{"*":{".":["./dist/module.d.ts"],"core":["./dist/core/index.d.ts"],"types":["./dist/types/index.d.ts"],"server":["./dist/server/index.d.ts"]}},"_hasShrinkwrap":false,"devDependencies":{"h3":"^1.13.0","tsup":"^8.5.0","rimraf":"^6.0.1","@nuxt/kit":"^4.0.0","typescript":"^5.9.2","@types/node":"^22.13.0","@nuxt/schema":"^4.0.0"},"peerDependencies":{"h3":"^1.0.0 || ^2.0.0","@nuxt/kit":"^3.0.0 || ^4.0.0"},"peerDependenciesMeta":{"h3":{"optional":true},"@nuxt/kit":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/nuxt-crypto_1.2.0_1776476901063_0.5162923451719874","host":"s3://npm-registry-packages-npm-production"}},"1.2.1":{"name":"@alikhalilll/nuxt-crypto","version":"1.2.1","keywords":["nuxt","nuxt-module","crypto","encryption","aes-gcm","web-crypto","pbkdf2","fingerprint"],"author":{"name":"alikhalilll"},"license":"MIT","_id":"@alikhalilll/nuxt-crypto@1.2.1","maintainers":[{"name":"alikhalilll","email":"alikhalilll.dev@gmail.com"}],"homepage":"https://alikhalilll.github.io/ali-nuxt-toolkit/crypto","bugs":{"url":"https://github.com/alikhalilll/ali-nuxt-toolkit/issues"},"dist":{"shasum":"5041ad7476c9f743c24e1e5b8837bcb7fba60fff","tarball":"https://registry.npmjs.org/@alikhalilll/nuxt-crypto/-/nuxt-crypto-1.2.1.tgz","fileCount":24,"integrity":"sha512-HsHQXnSnQU03TXpnLakLdXyuiWEfAzBg8TLuxEKSxiTa85AMkJOFdzoCA1/1XbtJzKOLmGUGNIJoxHZy5S3guw==","signatures":[{"sig":"MEYCIQDOJYOr1Ec41CBlP/6TxnOx8T5TLlOl3RT/RK35NDZZvwIhAI4MobIsOhsGBM/N2zPSCLMbXbJmRv3EHn/JLSwGNBnT","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":65315},"type":"module","_from":"file:alikhalilll-nuxt-crypto-1.2.1.tgz","types":"./dist/module.d.ts","engines":{"node":">=18"},"exports":{".":{"types":"./dist/module.d.ts","import":"./dist/module.mjs"},"./core":{"types":"./dist/core/index.d.ts","import":"./dist/core/index.mjs"},"./types":{"types":"./dist/types/index.d.ts","import":"./dist/types/index.mjs"},"./server":{"types":"./dist/server/index.d.ts","import":"./dist/server/index.mjs"},"./package.json":"./package.json"},"scripts":{"build":"pnpm clean && tsup","clean":"rimraf dist","typecheck":"tsc --noEmit -p tsconfig.json"},"_npmUser":{"name":"alikhalilll","email":"alikhalilll.dev@gmail.com"},"_resolved":"/private/var/folders/7v/1sk02ysd1xq6wmwprzz6h2cr0000gn/T/941f770919b1691b0ea31119a3071f09/alikhalilll-nuxt-crypto-1.2.1.tgz","_integrity":"sha512-HsHQXnSnQU03TXpnLakLdXyuiWEfAzBg8TLuxEKSxiTa85AMkJOFdzoCA1/1XbtJzKOLmGUGNIJoxHZy5S3guw==","repository":{"url":"git+https://github.com/alikhalilll/ali-nuxt-toolkit.git","type":"git","directory":"packages/crypto"},"_npmVersion":"10.9.3","description":"Symmetric Web Crypto service for Nuxt 3/4. AES-256-GCM + PBKDF2 with key caching, pluggable algorithms, and optional device-fingerprint binding.","directories":{},"sideEffects":false,"_nodeVersion":"22.18.0","publishConfig":{"access":"public"},"typesVersions":{"*":{".":["./dist/module.d.ts"],"core":["./dist/core/index.d.ts"],"types":["./dist/types/index.d.ts"],"server":["./dist/server/index.d.ts"]}},"_hasShrinkwrap":false,"devDependencies":{"h3":"^1.13.0","tsup":"^8.5.0","rimraf":"^6.0.1","@nuxt/kit":"^4.0.0","typescript":"^5.9.2","@types/node":"^22.13.0","@nuxt/schema":"^4.0.0"},"peerDependencies":{"h3":"^1.0.0 || ^2.0.0","@nuxt/kit":"^3.0.0 || ^4.0.0"},"peerDependenciesMeta":{"h3":{"optional":true},"@nuxt/kit":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/nuxt-crypto_1.2.1_1776531460273_0.9833511317102062","host":"s3://npm-registry-packages-npm-production"}},"1.3.0":{"name":"@alikhalilll/nuxt-crypto","version":"1.3.0","keywords":["nuxt","nuxt-module","crypto","encryption","aes-gcm","web-crypto","pbkdf2","fingerprint"],"author":{"name":"alikhalilll"},"license":"MIT","_id":"@alikhalilll/nuxt-crypto@1.3.0","maintainers":[{"name":"alikhalilll","email":"alikhalilll.dev@gmail.com"}],"homepage":"https://alikhalilll.github.io/ali-nuxt-toolkit/crypto","bugs":{"url":"https://github.com/alikhalilll/ali-nuxt-toolkit/issues"},"dist":{"shasum":"8f5f2478a9fac479db856c69d87efb5c0dc83451","tarball":"https://registry.npmjs.org/@alikhalilll/nuxt-crypto/-/nuxt-crypto-1.3.0.tgz","fileCount":22,"integrity":"sha512-WIPxFPif4a1j2z144bIzrJOFkkhPzMVveuw0SfY7SMKzxlJ9kg8EPJB553ODOpq47EaEDdTbpBIfU1T7f8olaw==","signatures":[{"sig":"MEYCIQCRY3w6MDav5lwfhuPwNU8Jo8d5z7FJs16hVlNGivp7dgIhAIITnYVFGtWzaDcHuOH8GycgMp6QRlr0Si3PPGQp3H7A","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":67744},"type":"module","_from":"file:alikhalilll-nuxt-crypto-1.3.0.tgz","types":"./dist/module.d.ts","engines":{"node":">=18"},"exports":{".":{"types":"./dist/module.d.ts","import":"./dist/module.mjs"},"./core":{"types":"./dist/core/index.d.ts","import":"./dist/core/index.mjs"},"./types":{"types":"./dist/types/index.d.ts","import":"./dist/types/index.mjs"},"./server":{"types":"./dist/server/index.d.ts","import":"./dist/server/index.mjs"},"./package.json":"./package.json"},"scripts":{"build":"tsdown","clean":"rimraf dist","validate":"pnpm build && pnpm validate-dist && pnpm validate-consumer","typecheck":"tsc --noEmit -p tsconfig.json","validate-dist":"tsx ../../scripts/validate/dist-validate.ts --pkg crypto","validate-consumer":"tsx ../../scripts/validate/consumer-validate.ts --pkg crypto"},"_npmUser":{"name":"alikhalilll","email":"alikhalilll.dev@gmail.com"},"_resolved":"/private/var/folders/4j/cgljlpzd0n550x2mkwwsrj6c0000gn/T/cc95792b08e4bb8984fea3c4a1b156c6/alikhalilll-nuxt-crypto-1.3.0.tgz","_integrity":"sha512-WIPxFPif4a1j2z144bIzrJOFkkhPzMVveuw0SfY7SMKzxlJ9kg8EPJB553ODOpq47EaEDdTbpBIfU1T7f8olaw==","repository":{"url":"git+https://github.com/alikhalilll/ali-nuxt-toolkit.git","type":"git","directory":"packages/crypto"},"_npmVersion":"11.12.1","description":"Symmetric Web Crypto service for Nuxt 3/4. AES-256-GCM + PBKDF2 with key caching, pluggable algorithms, and optional device-fingerprint binding.","directories":{},"sideEffects":false,"_nodeVersion":"26.0.0","publishConfig":{"access":"public"},"typesVersions":{"*":{".":["./dist/module.d.ts"],"core":["./dist/core/index.d.ts"],"types":["./dist/types/index.d.ts"],"server":["./dist/server/index.d.ts"]}},"_hasShrinkwrap":false,"devDependencies":{"h3":"^1.13.0","unrun":"0.3.0","rimraf":"^6.0.1","tsdown":"0.22.0","@nuxt/kit":"^4.0.0","typescript":"^5.9.2","@types/node":"^22.13.0","@nuxt/schema":"^4.0.0"},"peerDependencies":{"h3":"^1.0.0 || ^2.0.0","@nuxt/kit":"^3.0.0 || ^4.0.0"},"peerDependenciesMeta":{"h3":{"optional":true},"@nuxt/kit":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/nuxt-crypto_1.3.0_1779969397047_0.6587111279543958","host":"s3://npm-registry-packages-npm-production"}}},"time":{"created":"2026-04-17T00:58:42.342Z","modified":"2026-05-30T18:58:14.865Z","1.0.0":"2026-04-17T00:58:42.599Z","1.0.1":"2026-04-17T01:29:31.857Z","1.0.2":"2026-04-17T01:34:37.429Z","1.0.3":"2026-04-17T01:51:23.208Z","1.2.0":"2026-04-18T01:48:21.196Z","1.2.1":"2026-04-18T16:57:40.413Z","1.3.0":"2026-05-28T11:56:37.188Z"},"bugs":{"url":"https://github.com/alikhalilll/ali-nuxt-toolkit/issues"},"author":{"name":"alikhalilll"},"license":"MIT","homepage":"https://alikhalilll.github.io/ali-nuxt-toolkit/crypto","keywords":["nuxt","nuxt-module","crypto","encryption","aes-gcm","web-crypto","pbkdf2","fingerprint"],"repository":{"url":"git+https://github.com/alikhalilll/ali-nuxt-toolkit.git","type":"git","directory":"packages/crypto"},"description":"Symmetric Web Crypto service for Nuxt 3/4. AES-256-GCM + PBKDF2 with key caching, pluggable algorithms, and optional device-fingerprint binding.","maintainers":[{"email":"alikhalilll.dev@gmail.com","name":"alikhalilll_dev"}],"readme":"# @alikhalilll/nuxt-crypto\n\nSymmetric encryption for Nuxt 3 / 4, built on the native **Web Crypto API**. Defaults to **AES-256-GCM** with **PBKDF2-SHA256** key derivation.\n\n- **Framework-agnostic core** — `createCryptoService()` works anywhere `SubtleCrypto` exists (browser, Deno, Bun, Node 20+).\n- **Key caching** — derived keys are cached per salt, so bulk decrypt stays fast even at 100k+ PBKDF2 iterations.\n- **Pluggable algorithms** — swap the default AES-GCM implementation for your own `CryptoAlgorithm` without touching the payload envelope.\n- **Versioned payload format** — `v1.{salt}.{iv}.{cipher}` with clean forward compatibility.\n- **Server-only mode** — opt into registering the plugin only on the server so the passphrase never ships to the browser bundle.\n- **Device fingerprint** _(new)_ — bind a payload to the browser that created it via an HttpOnly cookie. Survives IP changes (Wi-Fi ↔ 4G, VPN rotation) while still blocking copy-paste to another browser or device.\n- **Strong types** — `CryptoService`, `CryptoServiceConfig`, and `CryptoAlgorithm` all exported.\n\n---\n\n## Table of contents\n\n1. [Install](#install)\n2. [Register the module](#register-the-module)\n3. [Usage](#usage)\n   - [Basic round-trip](#basic-round-trip)\n   - [Encrypt / decrypt a JSON object](#encrypt--decrypt-a-json-object)\n   - [Encrypt / decrypt an arbitrary value](#encrypt--decrypt-an-arbitrary-value)\n   - [Persist a ciphertext in a cookie](#persist-a-ciphertext-in-a-cookie)\n   - [Bulk encrypt / decrypt (key cache benefits)](#bulk-encrypt--decrypt-key-cache-benefits)\n   - [Clear the key cache](#clear-the-key-cache)\n   - [Error handling](#error-handling)\n4. [Server-only mode](#server-only-mode)\n5. [Nitro / API routes](#nitro--api-routes)\n6. [Device fingerprint](#device-fingerprint)\n7. [Framework-agnostic core](#framework-agnostic-core)\n8. [Custom algorithm](#custom-algorithm)\n9. [Rotating the passphrase (re-encryption)](#rotating-the-passphrase-re-encryption)\n10. [Payload format](#payload-format)\n11. [Module options reference](#module-options-reference)\n12. [Exported types](#exported-types)\n\n---\n\n## Install\n\n```bash\npnpm add @alikhalilll/nuxt-crypto\n```\n\n## Register the module\n\n```ts\n// nuxt.config.ts\nexport default defineNuxtConfig({\n  modules: ['@alikhalilll/nuxt-crypto'],\n  crypto: {\n    // Always wire this from an env var. Never commit the passphrase.\n    passphrase: process.env.NUXT_ENCRYPTION_PASSPHRASE ?? '',\n    provideName: '$crypto', // leading \"$\" optional\n    iterations: 100_000,\n    keyCacheSize: 64,\n    serverOnly: false,\n  },\n});\n```\n\n`.env` (not committed):\n\n```\nNUXT_ENCRYPTION_PASSPHRASE=replace-me-with-a-long-random-secret\n```\n\n## Usage\n\n### Basic round-trip\n\n```vue\n<script setup lang=\"ts\">\nconst { $crypto } = useNuxtApp();\n\nconst payload = await $crypto.encrypt('super-secret');\n// payload: \"v1.<saltB64>.<ivB64>.<cipherB64>\"\n\nconst plain = await $crypto.decrypt(payload);\n</script>\n```\n\n`$crypto` is typed as `CryptoService` via auto-generated module augmentation.\n\n### Encrypt / decrypt a JSON object\n\n`encrypt` takes a string, so stringify structured data first:\n\n```ts\nconst session = { userId: 42, roles: ['admin'], issuedAt: Date.now() };\n\nconst payload = await $crypto.encrypt(JSON.stringify(session));\n\nconst restored = JSON.parse(await $crypto.decrypt(payload)) as typeof session;\n```\n\nA tiny helper makes this ergonomic:\n\n```ts\n// composables/useEncrypted.ts\nexport function useEncrypted() {\n  const { $crypto } = useNuxtApp();\n  return {\n    encode: async <T>(value: T) => $crypto.encrypt(JSON.stringify(value)),\n    decode: async <T>(payload: string) => JSON.parse(await $crypto.decrypt(payload)) as T,\n  };\n}\n```\n\n### Encrypt / decrypt an arbitrary value\n\n```ts\nconst { encode, decode } = useEncrypted();\n\nconst token = await encode({ refresh: 'abc123', exp: Date.now() + 3_600_000 });\nconst { refresh, exp } = await decode<{ refresh: string; exp: number }>(token);\n```\n\n### Persist a ciphertext in a cookie\n\n```ts\nconst cookie = useCookie<string | null>('session');\n\n// Write\ncookie.value = await $crypto.encrypt(JSON.stringify({ userId: 42 }));\n\n// Read\nif (cookie.value) {\n  const { userId } = JSON.parse(await $crypto.decrypt(cookie.value));\n}\n```\n\n### Bulk encrypt / decrypt (key cache benefits)\n\nPBKDF2 is deliberately slow. The built-in key cache (default size 64) keys derived material by salt, so a second decrypt of any payload you've already touched is essentially free:\n\n```ts\nconst items = Array.from({ length: 100 }, (_, i) => `item-${i}`);\n\nconst payloads = await Promise.all(items.map((i) => $crypto.encrypt(i)));\n\n// Fast — each salt was just derived during encrypt, so decrypt hits the cache.\nconst plain = await Promise.all(payloads.map((p) => $crypto.decrypt(p)));\n```\n\n### Clear the key cache\n\n```ts\n$crypto.clearKeyCache();\n```\n\nUseful when:\n\n- You rotate the passphrase (the cache would still hold old keys).\n- You want to force re-derivation in a security-audit test.\n\n### Error handling\n\n```ts\ntry {\n  await $crypto.decrypt('not-a-real-payload');\n} catch (e) {\n  // '[nuxt-crypto] Invalid payload format — expected 4 dot-separated segments.'\n  console.error((e as Error).message);\n}\n```\n\nErrors you can see:\n\n| Scenario                               | Message                                                       |\n| -------------------------------------- | ------------------------------------------------------------- |\n| Payload isn't `a.b.c.d`                | `Invalid payload format — expected 4 dot-separated segments.` |\n| A segment is empty                     | `Invalid payload format — one or more segments were empty.`   |\n| Algorithm version mismatch             | `Unsupported payload version: v2 (algorithm expects v1).`     |\n| Wrong passphrase / tampered ciphertext | Native `OperationError` from Web Crypto.                      |\n| Passphrase not set in module config    | `[nuxt-crypto] passphrase is required.`                       |\n\n## Server-only mode\n\nSet `serverOnly: true` in module options to skip the client plugin entirely — the passphrase never ends up in the browser bundle.\n\n```ts\ncrypto: {\n  passphrase: process.env.NUXT_ENCRYPTION_PASSPHRASE ?? '',\n  serverOnly: true,\n}\n```\n\nWith this enabled, `$crypto` is `undefined` on the client. Use it only in:\n\n- Nitro server routes (`server/api/*.ts`)\n- Server-only plugins\n- `<script setup>` blocks guarded by `import.meta.server`\n\n## Nitro / API routes\n\nNitro event handlers run outside the Nuxt app context, so `useNuxtApp()` — and therefore `$crypto` — isn't available there. Use the framework-agnostic core directly. A tiny server utility keeps the service cached across requests:\n\n```ts\n// server/utils/crypto.ts\nimport { createCryptoService } from '@alikhalilll/nuxt-crypto/core';\n\nlet servicePromise: ReturnType<typeof createCryptoService> | null = null;\n\nexport function useServerCrypto() {\n  if (!servicePromise) {\n    servicePromise = createCryptoService({\n      passphrase: process.env.NUXT_ENCRYPTION_PASSPHRASE!,\n      iterations: 100_000,\n    });\n  }\n  return servicePromise;\n}\n```\n\nEncrypt data before sending it to the browser, decrypt it when it comes back:\n\n```ts\n// server/api/session/encode.post.ts\nexport default defineEventHandler(async (event) => {\n  const body = await readBody(event);\n  const crypto = await useServerCrypto();\n  return { token: await crypto.encrypt(JSON.stringify(body)) };\n});\n\n// server/api/session/decode.post.ts\nexport default defineEventHandler(async (event) => {\n  const { token } = await readBody(event);\n  const crypto = await useServerCrypto();\n  return JSON.parse(await crypto.decrypt(token));\n});\n```\n\n## Device fingerprint\n\nBind a payload to the browser that created it, so a copy of the ciphertext in another browser or on another device won't decrypt. Useful for short-lived CSRF tokens, magic links, and anti-replay nonces.\n\nThe fingerprint is built from an **HttpOnly device-ID cookie** — not the client IP — so it survives Wi-Fi → 4G switches, cell handoffs, VPN rotations, and residential IP rotation while still blocking copy-paste to another origin.\n\n### Setup\n\n```ts\n// nuxt.config.ts\nexport default defineNuxtConfig({\n  runtimeConfig: {\n    // Server-side pepper. Keep this secret; never expose to the client.\n    cryptoFingerprintSalt: process.env.NUXT_CRYPTO_FINGERPRINT_SALT ?? '',\n  },\n});\n```\n\n```\n# .env\nNUXT_CRYPTO_FINGERPRINT_SALT=<64 random hex chars>\n```\n\n### Encrypt / decrypt with a fingerprint\n\n```ts\n// server/api/session.post.ts\nimport { getClientFingerprint } from '@alikhalilll/nuxt-crypto/server';\n\nexport default defineEventHandler(async (event) => {\n  const body = await readBody(event);\n  const crypto = await useServerCrypto(); // see \"Nitro / API routes\" above\n\n  const fingerprint = await getClientFingerprint(event, {\n    salt: useRuntimeConfig().cryptoFingerprintSalt,\n  });\n\n  return {\n    token: await crypto.encrypt(JSON.stringify(body), { fingerprint }),\n  };\n});\n```\n\nThe first call sets an HttpOnly cookie (`__nuxt_crypto_device`) with a random 32-byte ID; subsequent calls reuse it. Pass the same `{ fingerprint }` to `crypto.decrypt` on the server to round-trip.\n\n### What this protects against\n\n| Scenario                                  | Decrypts?                            |\n| ----------------------------------------- | ------------------------------------ |\n| Wi-Fi → 4G on the same device             | ✅ yes — cookie travels with browser |\n| VPN exit node or ISP IP rotation          | ✅ yes                               |\n| Copy token to another browser on same box | ❌ no — no cookie in that browser    |\n| XSS-exfiltrated token to an attacker      | ❌ no — HttpOnly cookie unreachable  |\n| User clears cookies                       | ❌ no — permanently unrecoverable    |\n\n### `deriveFingerprint` — bring your own device ID\n\nIf you already manage per-device identity (session table, signed JWT, etc.), skip the cookie helper:\n\n```ts\nimport { deriveFingerprint } from '@alikhalilll/nuxt-crypto/server';\n\nconst fingerprint = await deriveFingerprint({\n  deviceId: session.id,\n  salt: useRuntimeConfig().cryptoFingerprintSalt,\n});\n```\n\n> **Warning** — a fingerprinted payload becomes undecryptable if the device cookie is cleared or the session rotates. Use only for tokens the user can afford to lose (short sessions, magic links, one-shot nonces), never for long-lived data.\n\n## Framework-agnostic core\n\nEverything the Nuxt plugin wraps is available as a plain factory:\n\n```ts\nimport { createCryptoService } from '@alikhalilll/nuxt-crypto/core';\n\nconst service = await createCryptoService({\n  passphrase: process.env.ENC_PASS!,\n  iterations: 100_000,\n  keyCacheSize: 64,\n});\n\nconst payload = await service.encrypt('hi');\nconst clear = await service.decrypt(payload);\nservice.clearKeyCache();\n```\n\nWorks in Node 20+, Bun, Deno, or any browser. Passing a custom `subtle: SubtleCrypto` is supported for testing.\n\n## Custom algorithm\n\nReplace AES-GCM with any cipher by implementing `CryptoAlgorithm`. The payload envelope (`{version}.{salt}.{iv}.{cipher}`) is preserved, and the version tag routes decrypt to the right algorithm.\n\n```ts\nimport { createCryptoService } from '@alikhalilll/nuxt-crypto/core';\nimport type { CryptoAlgorithm } from '@alikhalilll/nuxt-crypto/types';\n\nconst myAlgo: CryptoAlgorithm = {\n  version: 'v2',\n  async deriveKey({ subtle, passphrase, salt, iterations }) {\n    /* ... */\n  },\n  async encrypt({ subtle, key, plainText }) {\n    /* ... */\n  },\n  async decrypt({ subtle, key, cipher, iv }) {\n    /* ... */\n  },\n};\n\nconst service = await createCryptoService({\n  passphrase: 'p4ss',\n  algorithm: myAlgo,\n});\n```\n\nOld v1 payloads will cleanly fail decrypt under a v2 service (the version check throws). Build a version router yourself if you need mixed-version reads during a rotation.\n\n## Rotating the passphrase (re-encryption)\n\n```ts\nimport { createCryptoService } from '@alikhalilll/nuxt-crypto/core';\n\nconst oldService = await createCryptoService({ passphrase: OLD_PASS });\nconst newService = await createCryptoService({ passphrase: NEW_PASS });\n\nasync function rotate(payload: string): Promise<string> {\n  const plain = await oldService.decrypt(payload);\n  return newService.encrypt(plain);\n}\n```\n\nRun `rotate` over your stored ciphertexts during a background migration. Clear the key cache on whichever service goes out of use.\n\n## Payload format\n\n`v1.{saltB64}.{ivB64}.{cipherB64}` — four dot-separated segments, each standard base64:\n\n| Segment | Bytes | Notes                              |\n| ------- | ----- | ---------------------------------- |\n| `v1`    | —     | Algorithm / version tag.           |\n| salt    | 16    | Per-encryption PBKDF2 salt.        |\n| iv      | 12    | AES-GCM initialization vector.     |\n| cipher  | N     | Ciphertext + 16-byte GCM auth tag. |\n\n## Module options reference\n\n| Option         | Type      | Default     | Purpose                                                        |\n| -------------- | --------- | ----------- | -------------------------------------------------------------- |\n| `passphrase`   | `string`  | `''`        | Passphrase to derive the AES key from. Throws at use if empty. |\n| `provideName`  | `string`  | `'$crypto'` | Injected under `$<name>`. Leading `$` is stripped.             |\n| `iterations`   | `number`  | `100_000`   | PBKDF2 iteration count.                                        |\n| `keyCacheSize` | `number`  | `64`        | Max derived keys kept in memory. Set to 0 to disable caching.  |\n| `serverOnly`   | `boolean` | `false`     | When true, plugin runs only on the server.                     |\n\n## Exported types\n\n```ts\nimport type {\n  CryptoService,\n  CryptoServiceConfig,\n  CryptoOperationOptions,\n  CryptoAlgorithm,\n  CryptoModuleOptions,\n  Bytes,\n  ParsedPayload,\n} from '@alikhalilll/nuxt-crypto/types';\n\n// Server subpath (Nitro / H3 only)\nimport type { ClientFingerprintOptions, FingerprintParts } from '@alikhalilll/nuxt-crypto/server';\nimport { getClientFingerprint, deriveFingerprint } from '@alikhalilll/nuxt-crypto/server';\n```\n\n## License\n\nMIT\n","readmeFilename":"README.md"}