{"_id":"@bernierllc/magic-link","_rev":"11-72c73e37f2a0ac0f92866855ac058ceb","name":"@bernierllc/magic-link","dist-tags":{"latest":"0.8.1"},"versions":{"0.3.0":{"name":"@bernierllc/magic-link","version":"0.3.0","keywords":["magic-link","token","authentication","security","crypto","bernierllc"],"author":{"name":"Bernier LLC"},"license":"ISC","_id":"@bernierllc/magic-link@0.3.0","maintainers":[{"name":"alikhan410","email":"mczeyo@gmail.com"},{"name":"mkbernier","email":"mkbernier@gmail.com"}],"homepage":"https://github.com/bernier-llc/tools#readme","bugs":{"url":"https://github.com/bernier-llc/tools/issues"},"dist":{"shasum":"d309b0b38bf62142b6c6a385f9367bfe81fd5531","tarball":"https://registry.npmjs.org/@bernierllc/magic-link/-/magic-link-0.3.0.tgz","fileCount":55,"integrity":"sha512-ze0AfV0+5hAe5buqq4kweBm3F13VGkhUOpQ6BSjaeP/8d+fpx6zSZ2lCjP8csAGa+JMEeqv6gZwOA6izm3WyDA==","signatures":[{"sig":"MEUCIQCMn1CSKCpE6S2vcNBKNF4T3PTPpGSuzfbOb83X8arYsAIgeyOwTf8PoKsJIKuxNQjyoDlzkNh0Ii6VEqtdIoVhdmc=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":345087},"main":"dist/index.js","types":"dist/index.d.ts","engines":{"node":">=18.0.0"},"gitHead":"53502efe09498085eb0e24053b98f77b399fdc06","private":false,"scripts":{"lint":"eslint src --ext .ts","test":"jest","build":"tsc","clean":"rm -rf dist","lint:fix":"eslint src --ext .ts --fix","prebuild":"npm run clean","test:watch":"jest --watch","test:coverage":"jest --coverage"},"_npmUser":{"name":"mkbernier","email":"mkbernier@gmail.com"},"repository":{"url":"git+https://github.com/bernier-llc/tools.git","type":"git"},"_npmVersion":"11.4.2","description":"Atomic magic link utilities for secure token generation and validation","directories":{},"packageType":"core","_nodeVersion":"24.4.1","_hasShrinkwrap":false,"devDependencies":{"jest":"^29.5.0","eslint":"^8.0.0","ts-jest":"^29.1.0","typescript":"^5.0.0","@types/jest":"^29.5.0","@types/node":"^20.0.0","@typescript-eslint/parser":"^6.0.0","@typescript-eslint/eslint-plugin":"^6.0.0"},"_npmOperationalInternal":{"tmp":"tmp/magic-link_0.3.0_1753751368871_0.10325018397505259","host":"s3://npm-registry-packages-npm-production"}},"0.3.1":{"name":"@bernierllc/magic-link","version":"0.3.1","keywords":["magic-link","token","authentication","security","crypto","bernierllc"],"author":{"name":"Bernier LLC"},"license":"ISC","_id":"@bernierllc/magic-link@0.3.1","maintainers":[{"name":"alikhan410","email":"mczeyo@gmail.com"},{"name":"mkbernier","email":"mkbernier@gmail.com"}],"homepage":"https://github.com/bernier-llc/tools#readme","bugs":{"url":"https://github.com/bernier-llc/tools/issues"},"dist":{"shasum":"e248e25567048a1cb75e41a247b5aae2a51b17e0","tarball":"https://registry.npmjs.org/@bernierllc/magic-link/-/magic-link-0.3.1.tgz","fileCount":55,"integrity":"sha512-o7vNd8YSiDfxYxBft0CkFo/0yPWsLvM+vL4TuUqdMY035JAsS3XVw/Br7SEIDB8J7glsOGQtS865VuKG1iUzwA==","signatures":[{"sig":"MEYCIQDux+lSPrFnFuHNm+2uuIsKhfOEaUJtSN+tUBDIJjJmiwIhAMJN2wjWgEgtjkNpzS3Pv6VJ//PCtg+x1+Y8fPGQ4iFR","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":345087},"main":"dist/index.js","types":"dist/index.d.ts","engines":{"node":">=18.0.0"},"gitHead":"993634073cdffd08c8aed969e7af7eba6453bc75","private":false,"scripts":{"lint":"eslint src --ext .ts","test":"jest","build":"tsc","clean":"rm -rf dist","lint:fix":"eslint src --ext .ts --fix","prebuild":"npm run clean","test:watch":"jest --watch","test:coverage":"jest --coverage"},"_npmUser":{"name":"mkbernier","email":"mkbernier@gmail.com"},"repository":{"url":"git+https://github.com/bernier-llc/tools.git","type":"git"},"_npmVersion":"11.4.2","description":"Atomic magic link utilities for secure token generation and validation","directories":{},"packageType":"core","_nodeVersion":"24.4.1","_hasShrinkwrap":false,"devDependencies":{"jest":"^29.5.0","eslint":"^8.0.0","ts-jest":"^29.1.0","typescript":"^5.0.0","@types/jest":"^29.5.0","@types/node":"^20.0.0","@typescript-eslint/parser":"^6.0.0","@typescript-eslint/eslint-plugin":"^6.0.0"},"_npmOperationalInternal":{"tmp":"tmp/magic-link_0.3.1_1753751407660_0.9673644349262231","host":"s3://npm-registry-packages-npm-production"}},"0.3.2":{"name":"@bernierllc/magic-link","version":"0.3.2","keywords":["magic-link","token","authentication","security","crypto","bernierllc"],"author":{"name":"Bernier LLC"},"license":"Bernier LLC","_id":"@bernierllc/magic-link@0.3.2","maintainers":[{"name":"alikhan410","email":"mczeyo@gmail.com"},{"name":"mkbernier","email":"mkbernier@gmail.com"}],"homepage":"https://github.com/bernier-llc/tools#readme","bugs":{"url":"https://github.com/bernier-llc/tools/issues"},"dist":{"shasum":"e7acd91e6b915c4f5261c7420f212b624c292876","tarball":"https://registry.npmjs.org/@bernierllc/magic-link/-/magic-link-0.3.2.tgz","fileCount":14,"integrity":"sha512-vJ5uF4PLVRYs8MkSi4nOzs+9EpEu5IP95Qa+CK0Z2lAyV1mpP1dUbH2ziquARqQVsaZPgb0HDFe2O/Xba8wazg==","signatures":[{"sig":"MEQCIAZssYv4vPXtH+aTIzhf9CmC207x0b67va6PNY4IfdUjAiB1JxJR6raa/MMIunEsZXyL3bW3/lnmIbfTg7rawCihXw==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":61305},"main":"dist/index.js","types":"dist/index.d.ts","engines":{"node":">=18.0.0"},"gitHead":"cba0553abb8aa13e77420b8b89f769688f7ede2d","private":false,"scripts":{"lint":"eslint src --ext .ts","test":"jest","build":"tsc","clean":"rm -rf dist","lint:fix":"eslint src --ext .ts --fix","prebuild":"npm run clean","test:watch":"jest --watch","test:coverage":"jest --coverage"},"_npmUser":{"name":"mkbernier","email":"mkbernier@gmail.com"},"deprecated":"This package is deprecated. Use @bernierllc/crypto-utils instead.","repository":{"url":"git+https://github.com/bernier-llc/tools.git","type":"git"},"_npmVersion":"11.4.2","description":"[DEPRECATED] Atomic magic link utilities for secure token generation and validation - Use @bernierllc/crypto-utils instead","directories":{},"packageType":"core","_nodeVersion":"24.4.1","_hasShrinkwrap":false,"devDependencies":{"jest":"^29.5.0","eslint":"^8.0.0","ts-jest":"^29.1.0","typescript":"^5.0.0","@types/jest":"^29.5.0","@types/node":"^20.0.0","@typescript-eslint/parser":"^6.0.0","@typescript-eslint/eslint-plugin":"^6.0.0"},"_npmOperationalInternal":{"tmp":"tmp/magic-link_0.3.2_1756497348201_0.20324245291419185","host":"s3://npm-registry-packages-npm-production"}},"0.5.0":{"name":"@bernierllc/magic-link","version":"0.5.0","keywords":["magic-link","token","authentication","security","crypto","bernierllc"],"author":{"name":"Bernier LLC"},"license":"Bernier LLC","_id":"@bernierllc/magic-link@0.5.0","maintainers":[{"name":"alikhan410","email":"mczeyo@gmail.com"},{"name":"mkbernier","email":"mkbernier@gmail.com"}],"homepage":"https://github.com/bernier-llc/tools#readme","bugs":{"url":"https://github.com/bernier-llc/tools/issues"},"dist":{"shasum":"c3eff37a9b8225587ab5ea4ce8d64f03a6f32bfb","tarball":"https://registry.npmjs.org/@bernierllc/magic-link/-/magic-link-0.5.0.tgz","fileCount":14,"integrity":"sha512-mQw/iYL0fewdm8kW0z5iOSfxNdZfAqFpy706zp315UCYol1gxEUERlUMo5Pj8ptPtQTtvTu25zXZ6+RTtQ8teA==","signatures":[{"sig":"MEQCIHEUG0ckdhguqq0OVXg8G/ABBVcaeFK5HlCjdQGZ4MYjAiBnRoG/c/iet04nMRQV/WQOWmDcKusKcgHDCVwzxeRytA==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":63725},"main":"dist/index.js","types":"dist/index.d.ts","engines":{"node":">=18.0.0"},"gitHead":"af7e74b3715d56d3a193e1bb6743b337c2b0df6d","private":false,"scripts":{"lint":"eslint src --ext .ts","test":"jest","build":"tsc","clean":"rm -rf dist","lint:fix":"eslint src --ext .ts --fix","prebuild":"npm run clean","test:watch":"jest --watch","test:coverage":"jest --coverage"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:71528f05-327e-4cc2-a57e-9e2c4b11675b"}},"deprecated":"This package is deprecated. Use @bernierllc/crypto-utils instead.","repository":{"url":"git+https://github.com/bernier-llc/tools.git","type":"git"},"_npmVersion":"lerna/9.0.3/node@v20.19.6+x64 (linux)","description":"[DEPRECATED] Atomic magic link utilities for secure token generation and validation - Use @bernierllc/crypto-utils instead","directories":{},"packageType":"core","_nodeVersion":"20.19.6","publishConfig":{"access":"public","registry":"https://registry.npmjs.org/"},"_hasShrinkwrap":false,"devDependencies":{"jest":"^29.5.0","eslint":"^8.0.0","ts-jest":"^29.1.0","typescript":"^5.0.0","@types/jest":"^29.5.0","@types/node":"^20.0.0","@typescript-eslint/parser":"^6.0.0","@typescript-eslint/eslint-plugin":"^6.0.0"},"_npmOperationalInternal":{"tmp":"tmp/magic-link_0.5.0_1767642312472_0.42010461750454997","host":"s3://npm-registry-packages-npm-production"}},"0.5.1":{"name":"@bernierllc/magic-link","version":"0.5.1","keywords":["magic-link","token","authentication","security","crypto","bernierllc"],"author":{"name":"Bernier LLC"},"license":"Bernier LLC","_id":"@bernierllc/magic-link@0.5.1","maintainers":[{"name":"alikhan410","email":"mczeyo@gmail.com"},{"name":"mkbernier","email":"mkbernier@gmail.com"}],"homepage":"https://github.com/bernier-llc/tools#readme","bugs":{"url":"https://github.com/bernier-llc/tools/issues"},"dist":{"shasum":"61e3646c58263e24b84495cc592b8ed506adfe8d","tarball":"https://registry.npmjs.org/@bernierllc/magic-link/-/magic-link-0.5.1.tgz","fileCount":14,"integrity":"sha512-ZbNiQ6jms+rRxyIuje6L8M7GP1PvMp0pXScMfOarY6qeCzZnjyU0ZKOFLJFAodS1wow+cENwDAF8NZozpa5V2Q==","signatures":[{"sig":"MEQCIDsyP0JZpKOdquX4sMEa26m2qOz3EnM8/n7Dlh+Ai8o4AiAsTAmhKHXBVMKx+TB04UtW0utuOPFddrCBgx41o91xHg==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":63866},"main":"dist/index.js","_from":"file:bernierllc-magic-link-0.5.1.tgz","types":"dist/index.d.ts","engines":{"node":">=18.0.0"},"private":false,"scripts":{"lint":"eslint src --ext .ts","test":"jest","build":"tsc","clean":"rm -rf dist","lint:fix":"eslint src --ext .ts --fix","prebuild":"npm run clean","test:watch":"jest --watch","test:coverage":"jest --coverage"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:71528f05-327e-4cc2-a57e-9e2c4b11675b"}},"_resolved":"/tmp/40af2471c8fd699947c9f403a2f02629/bernierllc-magic-link-0.5.1.tgz","_integrity":"sha512-ZbNiQ6jms+rRxyIuje6L8M7GP1PvMp0pXScMfOarY6qeCzZnjyU0ZKOFLJFAodS1wow+cENwDAF8NZozpa5V2Q==","deprecated":"This package is deprecated. Use @bernierllc/crypto-utils instead.","repository":{"url":"git+https://github.com/bernier-llc/tools.git","type":"git"},"_npmVersion":"11.11.0","description":"[DEPRECATED] Atomic magic link utilities for secure token generation and validation - Use @bernierllc/crypto-utils instead","directories":{},"packageType":"core","_nodeVersion":"20.20.0","publishConfig":{"access":"public","registry":"https://registry.npmjs.org/"},"_hasShrinkwrap":false,"devDependencies":{"jest":"^29.5.0","eslint":"^8.0.0","ts-jest":"^29.1.0","typescript":"^5.0.0","@types/jest":"^29.5.0","@types/node":"^20.0.0","@typescript-eslint/parser":"^6.0.0","@typescript-eslint/eslint-plugin":"^6.0.0"},"_npmOperationalInternal":{"tmp":"tmp/magic-link_0.5.1_1773078024791_0.934051325834165","host":"s3://npm-registry-packages-npm-production"}},"0.5.2":{"name":"@bernierllc/magic-link","version":"0.5.2","keywords":["magic-link","token","authentication","security","crypto","bernierllc"],"author":{"name":"Bernier LLC"},"license":"Bernier LLC","_id":"@bernierllc/magic-link@0.5.2","maintainers":[{"name":"alikhan410","email":"mczeyo@gmail.com"},{"name":"mkbernier","email":"mkbernier@gmail.com"}],"homepage":"https://github.com/bernier-llc/tools#readme","bugs":{"url":"https://github.com/bernier-llc/tools/issues"},"dist":{"shasum":"2928c5d7b934c313c4e0824f36f2481148af0049","tarball":"https://registry.npmjs.org/@bernierllc/magic-link/-/magic-link-0.5.2.tgz","fileCount":14,"integrity":"sha512-i6dSIgn8HOMckp2o3Yl+aSM3sETV2uQ7dQXkiYUhvVV0AxnzhXhp33L8TTvsQFyVH/It7fh8jotxNe7RP5A3jA==","signatures":[{"sig":"MEUCIEDbh3ZAEZA/vR0lNMTuyeRuMfayxgGC1zuSABhl6vxBAiEA5dY/jN03olwNTryC6l8FRK7iDO+hDx2g3Dy6DWJ6FWw=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":64065},"main":"dist/index.js","_from":"file:bernierllc-magic-link-0.5.2.tgz","types":"dist/index.d.ts","engines":{"node":">=18.0.0"},"private":false,"scripts":{"lint":"eslint src --ext .ts","test":"jest","build":"tsc","clean":"rm -rf dist","lint:fix":"eslint src --ext .ts --fix","prebuild":"npm run clean","test:watch":"jest --watch","test:coverage":"jest --coverage"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:71528f05-327e-4cc2-a57e-9e2c4b11675b"}},"_resolved":"/tmp/5586cddca57e3664b242e0d235c535f9/bernierllc-magic-link-0.5.2.tgz","_integrity":"sha512-i6dSIgn8HOMckp2o3Yl+aSM3sETV2uQ7dQXkiYUhvVV0AxnzhXhp33L8TTvsQFyVH/It7fh8jotxNe7RP5A3jA==","deprecated":"This package is deprecated. Use @bernierllc/crypto-utils instead.","repository":{"url":"git+https://github.com/bernier-llc/tools.git","type":"git"},"_npmVersion":"11.11.0","description":"[DEPRECATED] Atomic magic link utilities for secure token generation and validation - Use @bernierllc/crypto-utils instead","directories":{},"packageType":"core","_nodeVersion":"20.20.0","publishConfig":{"access":"public","registry":"https://registry.npmjs.org/"},"_hasShrinkwrap":false,"devDependencies":{"jest":"^29.5.0","eslint":"^8.0.0","ts-jest":"^29.1.0","typescript":"^5.0.0","@types/jest":"^29.5.0","@types/node":"^20.0.0","@typescript-eslint/parser":"^6.0.0","@typescript-eslint/eslint-plugin":"^6.0.0"},"_npmOperationalInternal":{"tmp":"tmp/magic-link_0.5.2_1773081208054_0.6559778366674323","host":"s3://npm-registry-packages-npm-production"}},"0.6.0":{"name":"@bernierllc/magic-link","version":"0.6.0","keywords":["magic-link","token","authentication","security","crypto","bernierllc"],"author":{"name":"Bernier LLC"},"license":"Bernier LLC","_id":"@bernierllc/magic-link@0.6.0","maintainers":[{"name":"alikhan410","email":"mczeyo@gmail.com"},{"name":"mkbernier","email":"mkbernier@gmail.com"}],"homepage":"https://github.com/bernier-llc/tools#readme","bugs":{"url":"https://github.com/bernier-llc/tools/issues"},"dist":{"shasum":"448680431bbb0ef0626c744d154a0ff7fecb6d2c","tarball":"https://registry.npmjs.org/@bernierllc/magic-link/-/magic-link-0.6.0.tgz","fileCount":14,"integrity":"sha512-BuJhomKk10nSfjm985sHRK/+nUiCRRJb69atET7vb/gHUDezhq70QFDU1BzS0sPsSIAGKXlyefPA57xjD+6h0g==","signatures":[{"sig":"MEUCIQDSUKqzRwTFL/TQGbeFbymzX3bqqqjyGmmC8h8aEKLBJwIgUtq7o6YM4Q3Znnuc25kxtsVF2xJ8x4sP+3YE50+j4dc=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":64264},"main":"dist/index.js","_from":"file:bernierllc-magic-link-0.6.0.tgz","types":"dist/index.d.ts","engines":{"node":">=18.0.0"},"private":false,"scripts":{"lint":"eslint src --ext .ts","test":"jest","build":"tsc","clean":"rm -rf dist","lint:fix":"eslint src --ext .ts --fix","prebuild":"npm run clean","test:watch":"jest --watch","test:coverage":"jest --coverage"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:71528f05-327e-4cc2-a57e-9e2c4b11675b"}},"_resolved":"/home/runner/work/tools/tools/packages/core/magic-link/bernierllc-magic-link-0.6.0.tgz","_integrity":"sha512-BuJhomKk10nSfjm985sHRK/+nUiCRRJb69atET7vb/gHUDezhq70QFDU1BzS0sPsSIAGKXlyefPA57xjD+6h0g==","deprecated":"This package is deprecated. Use @bernierllc/crypto-utils instead.","repository":{"url":"git+https://github.com/bernier-llc/tools.git","type":"git"},"_npmVersion":"11.14.1","description":"[DEPRECATED] Atomic magic link utilities for secure token generation and validation - Use @bernierllc/crypto-utils instead","directories":{},"packageType":"core","_nodeVersion":"20.20.2","publishConfig":{"access":"public","registry":"https://registry.npmjs.org/"},"_hasShrinkwrap":false,"devDependencies":{"jest":"^29.5.0","eslint":"^8.0.0","ts-jest":"^29.1.0","typescript":"^5.0.0","@types/jest":"^29.5.0","@types/node":"^20.0.0","@typescript-eslint/parser":"^6.0.0","@typescript-eslint/eslint-plugin":"^6.0.0"},"_npmOperationalInternal":{"tmp":"tmp/magic-link_0.6.0_1779241225460_0.6971277922495098","host":"s3://npm-registry-packages-npm-production"}},"0.7.0":{"name":"@bernierllc/magic-link","version":"0.7.0","keywords":["magic-link","token","authentication","security","crypto","bernierllc"],"author":{"name":"Bernier LLC"},"license":"Bernier LLC","_id":"@bernierllc/magic-link@0.7.0","maintainers":[{"name":"alikhan410","email":"mczeyo@gmail.com"},{"name":"mkbernier","email":"mkbernier@gmail.com"}],"homepage":"https://github.com/bernier-llc/tools#readme","bugs":{"url":"https://github.com/bernier-llc/tools/issues"},"dist":{"shasum":"89a88f779e415fcfa79cc7330ec217081154459c","tarball":"https://registry.npmjs.org/@bernierllc/magic-link/-/magic-link-0.7.0.tgz","fileCount":3,"integrity":"sha512-rbg/jnjbj4qe7p49r8nk9pNIpHs5Z7sAN2jXLZjlALCpECiABIJk/quNd87bSFwXPYEGEsAJKHhQwJxQEdF5rA==","signatures":[{"sig":"MEUCIQCozD2Ap4qjDSZe7LsR80xIUmQaAWJqQECHfwCuR60jSwIgO86YYfARaTtpiPGkt5aNS7bRyaV47YfB9oc91E81VC0=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":11822},"main":"dist/index.js","_from":"file:bernierllc-magic-link-0.7.0.tgz","types":"dist/index.d.ts","engines":{"node":">=18.0.0"},"private":false,"scripts":{"lint":"eslint src --ext .ts","test":"jest","build":"tsc","clean":"rm -rf dist","lint:fix":"eslint src --ext .ts --fix","prebuild":"npm run clean","test:watch":"jest --watch","test:coverage":"jest --coverage"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:71528f05-327e-4cc2-a57e-9e2c4b11675b"}},"_resolved":"/home/runner/work/tools/tools/packages/core/magic-link/bernierllc-magic-link-0.7.0.tgz","_integrity":"sha512-rbg/jnjbj4qe7p49r8nk9pNIpHs5Z7sAN2jXLZjlALCpECiABIJk/quNd87bSFwXPYEGEsAJKHhQwJxQEdF5rA==","deprecated":"This package is deprecated. Use @bernierllc/crypto-utils instead.","repository":{"url":"git+https://github.com/bernier-llc/tools.git","type":"git"},"_npmVersion":"11.14.1","description":"[DEPRECATED] Atomic magic link utilities for secure token generation and validation - Use @bernierllc/crypto-utils instead","directories":{},"packageType":"core","_nodeVersion":"20.20.2","publishConfig":{"access":"public","registry":"https://registry.npmjs.org/"},"_hasShrinkwrap":false,"devDependencies":{"jest":"^29.5.0","eslint":"^8.0.0","ts-jest":"^29.1.0","typescript":"^5.0.0","@types/jest":"^29.5.0","@types/node":"^20.0.0","@typescript-eslint/parser":"^6.0.0","@typescript-eslint/eslint-plugin":"^6.0.0"},"_npmOperationalInternal":{"tmp":"tmp/magic-link_0.7.0_1779243236814_0.8652148606056782","host":"s3://npm-registry-packages-npm-production"}},"0.8.0":{"name":"@bernierllc/magic-link","version":"0.8.0","keywords":["magic-link","token","authentication","security","crypto","bernierllc"],"author":{"name":"Bernier LLC"},"license":"Bernier LLC","_id":"@bernierllc/magic-link@0.8.0","maintainers":[{"name":"alikhan410","email":"mczeyo@gmail.com"},{"name":"mkbernier","email":"mkbernier@gmail.com"}],"homepage":"https://github.com/bernier-llc/tools#readme","bugs":{"url":"https://github.com/bernier-llc/tools/issues"},"dist":{"shasum":"5fd8709c27c39c8376d0c9bb07c2f91d6cadfea0","tarball":"https://registry.npmjs.org/@bernierllc/magic-link/-/magic-link-0.8.0.tgz","fileCount":3,"integrity":"sha512-IZPbljFzYL9ZP+VU5ISYI0Ua0mhWjMQMY/PeSTlm1B7gi55ZU0jeSYteHxs8i4s8m/VgPrBGMiLeM4OYo5nyrg==","signatures":[{"sig":"MEUCIFVD76RjmRG8CD6utNuuwfIFVocN+sBkGFVcV/jXg9qCAiEA25H6+w7tq1A8X9HDwNRyr2C+bTpBkgeccqIhnK2InzM=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":11822},"main":"dist/index.js","_from":"file:bernierllc-magic-link-0.8.0.tgz","types":"dist/index.d.ts","engines":{"node":">=18.0.0"},"private":false,"scripts":{"lint":"eslint src --ext .ts","test":"jest","build":"tsc","clean":"rm -rf dist","lint:fix":"eslint src --ext .ts --fix","prebuild":"npm run clean","test:watch":"jest --watch","test:coverage":"jest --coverage"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:71528f05-327e-4cc2-a57e-9e2c4b11675b"}},"_resolved":"/home/runner/work/tools/tools/packages/core/magic-link/bernierllc-magic-link-0.8.0.tgz","_integrity":"sha512-IZPbljFzYL9ZP+VU5ISYI0Ua0mhWjMQMY/PeSTlm1B7gi55ZU0jeSYteHxs8i4s8m/VgPrBGMiLeM4OYo5nyrg==","deprecated":"This package is deprecated. Use @bernierllc/crypto-utils instead.","repository":{"url":"git+https://github.com/bernier-llc/tools.git","type":"git"},"_npmVersion":"11.14.1","description":"[DEPRECATED] Atomic magic link utilities for secure token generation and validation - Use @bernierllc/crypto-utils instead","directories":{},"packageType":"core","_nodeVersion":"20.20.2","publishConfig":{"access":"public","registry":"https://registry.npmjs.org/"},"_hasShrinkwrap":false,"devDependencies":{"jest":"^29.5.0","eslint":"^8.0.0","ts-jest":"^29.1.0","typescript":"^5.0.0","@types/jest":"^29.5.0","@types/node":"^20.0.0","@typescript-eslint/parser":"^6.0.0","@typescript-eslint/eslint-plugin":"^6.0.0"},"_npmOperationalInternal":{"tmp":"tmp/magic-link_0.8.0_1779249971811_0.1979825263520183","host":"s3://npm-registry-packages-npm-production"}},"0.8.1":{"name":"@bernierllc/magic-link","version":"0.8.1","private":false,"deprecated":"This package is deprecated. Use @bernierllc/crypto-utils instead.","description":"[DEPRECATED] Atomic magic link utilities for secure token generation and validation - Use @bernierllc/crypto-utils instead","main":"dist/index.js","types":"dist/index.d.ts","keywords":["magic-link","token","authentication","security","crypto","bernierllc"],"author":{"name":"Bernier LLC"},"license":"Bernier LLC","repository":{"type":"git","url":"git+https://github.com/bernier-llc/tools.git"},"bugs":{"url":"https://github.com/bernier-llc/tools/issues"},"homepage":"https://github.com/bernier-llc/tools#readme","devDependencies":{"@types/jest":"^29.5.0","@types/node":"^20.0.0","@typescript-eslint/eslint-plugin":"^6.0.0","@typescript-eslint/parser":"^6.0.0","eslint":"^8.0.0","jest":"^29.5.0","ts-jest":"^29.1.0","typescript":"^5.0.0"},"engines":{"node":">=18.0.0"},"packageType":"core","publishConfig":{"access":"public","registry":"https://registry.npmjs.org/"},"scripts":{"build":"tsc","test":"jest","test:watch":"jest --watch","test:coverage":"jest --coverage","lint":"eslint src --ext .ts","lint:fix":"eslint src --ext .ts --fix","clean":"rm -rf dist","prebuild":"npm run clean"},"_id":"@bernierllc/magic-link@0.8.1","_integrity":"sha512-m54TnK/XgCbNpdCgC7PBtqd/vWfVDsz/y63HJ/XgQ08wfIy5x+KJHMNco98l73X8ELENAg7D9eFhqb5hcLxOxQ==","_resolved":"/home/runner/work/tools/tools/packages/core/magic-link/bernierllc-magic-link-0.8.1.tgz","_from":"file:bernierllc-magic-link-0.8.1.tgz","_nodeVersion":"24.19.0","_npmVersion":"12.0.2","dist":{"integrity":"sha512-m54TnK/XgCbNpdCgC7PBtqd/vWfVDsz/y63HJ/XgQ08wfIy5x+KJHMNco98l73X8ELENAg7D9eFhqb5hcLxOxQ==","shasum":"c18a9c899aa00a59ce312280d951a20947f90497","tarball":"https://registry.npmjs.org/@bernierllc/magic-link/-/magic-link-0.8.1.tgz","fileCount":23,"unpackedSize":55038,"signatures":[{"keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U","sig":"MEUCIQC5UCKLL27ez5N219d2+M3A4pd2itP/RhNlGWgYwBHa6QIgMH9BgNB+s83ElK+/cnFaOzhpqBxvLMFEX7mWgCfx9OI="}]},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:71528f05-327e-4cc2-a57e-9e2c4b11675b"}},"directories":{},"maintainers":[{"name":"alikhan410","email":"mczeyo@gmail.com"},{"name":"mkbernier","email":"mkbernier@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages-npm-production","tmp":"tmp/magic-link_0.8.1_1787246867673_0.7825908602229248"},"_hasShrinkwrap":false}},"time":{"created":"2025-07-29T01:09:28.478Z","modified":"2026-08-20T17:27:48.025Z","0.3.0":"2025-07-29T01:09:29.096Z","0.3.1":"2025-07-29T01:10:07.851Z","0.3.2":"2025-08-29T19:55:48.394Z","0.5.0":"2026-01-05T19:45:12.653Z","0.5.1":"2026-03-09T17:40:24.930Z","0.5.2":"2026-03-09T18:33:28.243Z","0.6.0":"2026-05-20T01:40:25.621Z","0.7.0":"2026-05-20T02:13:56.974Z","0.8.0":"2026-05-20T04:06:12.087Z","0.8.1":"2026-08-20T17:27:47.805Z"},"bugs":{"url":"https://github.com/bernier-llc/tools/issues"},"author":{"name":"Bernier LLC"},"license":"Bernier LLC","homepage":"https://github.com/bernier-llc/tools#readme","keywords":["magic-link","token","authentication","security","crypto","bernierllc"],"repository":{"type":"git","url":"git+https://github.com/bernier-llc/tools.git"},"description":"[DEPRECATED] Atomic magic link utilities for secure token generation and validation - Use @bernierllc/crypto-utils instead","maintainers":[{"name":"alikhan410","email":"mczeyo@gmail.com"},{"name":"mkbernier","email":"mkbernier@gmail.com"}],"readme":"# ⚠️ @bernierllc/magic-link [DEPRECATED]\n\n**This package is deprecated. Use `@bernierllc/crypto-utils` instead.**\n\n## 🚨 Migration Required\n\nThis package has been superseded by `@bernierllc/crypto-utils@1.0.2` which provides the same magic link functionality with improved security and performance.\n\n### Quick Migration\n\n```typescript\n// OLD: @bernierllc/magic-link\nimport { MagicLinkManager } from '@bernierllc/magic-link';\n\nconst manager = new MagicLinkManager({\n  defaultExpiryHours: 24,\n  encryptionKey: 'key'\n});\nconst result = manager.generateMagicLink('user@example.com', 'password_reset', {\n  payload: { userId: '12345' }\n});\n\n// NEW: @bernierllc/crypto-utils\nimport { generatePasswordResetLink, verifyMagicLink } from '@bernierllc/crypto-utils';\n\nconst result = generatePasswordResetLink('user123', 'user@example.com', 'secret', {\n  expirationMinutes: 60, // 1 hour instead of 24 hours\n  customData: { userId: '12345' }\n});\nconst verification = verifyMagicLink(result.token, 'secret');\n```\n\n### Install crypto-utils\n\n```bash\nnpm uninstall @bernierllc/magic-link\nnpm install @bernierllc/crypto-utils\n```\n\n### Key Differences\n\n| Old (magic-link) | New (crypto-utils) | Notes |\n|------------------|-------------------|-------|\n| `MagicLinkManager` | Direct functions | Simpler API, no class needed |\n| `generateMagicLink()` | `generateEmailMagicLink()` / `generatePasswordResetLink()` | Specialized functions |\n| `validateToken()` | `verifyMagicLink()` | Same functionality |\n| `useMagicLink()` | Manual tracking | App handles usage tracking |\n| Expiry in hours | Expiry in minutes | More granular control |\n\n---\n\n# ~~@bernierllc/magic-link~~ [DEPRECATED]\n\n~~Atomic magic link utilities for secure token generation and validation.~~\n\n## Features\n\n- **Secure Token Generation**: Cryptographically secure random tokens\n- **Payload Encryption**: Encrypt sensitive data in magic link payloads\n- **Flexible Configuration**: Customizable expiry times, token lengths, and policies\n- **Comprehensive Validation**: Email, token, and configuration validation\n- **Statistics & Analytics**: Track magic link usage and performance\n- **TypeScript Support**: Full type safety with comprehensive interfaces\n- **Zero Dependencies**: Uses only Node.js built-in modules\n\n## Installation\n\n```bash\nnpm install @bernierllc/magic-link\n```\n\n## Quick Start\n\n```typescript\nimport { MagicLinkManager } from '@bernierllc/magic-link';\n\n// Create a magic link manager\nconst manager = new MagicLinkManager({\n  defaultExpiryHours: 24,\n  encryptionKey: 'your-secure-encryption-key-32-chars-long'\n});\n\n// Generate a magic link\nconst result = manager.generateMagicLink('user@example.com', 'password_reset', {\n  payload: { userId: '12345' },\n  metadata: { source: 'web' }\n});\n\nif (result.success) {\n  console.log('Magic link token:', result.magicLink!.token);\n}\n\n// Validate a magic link\nconst validation = manager.validateToken(token);\nif (validation.isValid) {\n  console.log('Valid magic link for:', validation.magicLink!.email);\n}\n\n// Use a magic link\nconst useResult = manager.useMagicLink(token);\nif (useResult.success) {\n  console.log('Magic link used successfully');\n}\n```\n\n## API Reference\n\n### MagicLinkManager\n\nThe main class for managing magic links.\n\n#### Constructor\n\n```typescript\nnew MagicLinkManager(config?: Partial<MagicLinkConfig>)\n```\n\n**Configuration Options:**\n- `defaultExpiryHours`: Default expiry time in hours (default: 24)\n- `tokenLength`: Length of generated tokens (default: 32)\n- `allowReuse`: Whether to allow multiple active links per email/type (default: false)\n- `maxUses`: Maximum number of uses per token (default: 1)\n- `encryptionKey`: Key for encrypting payloads (auto-generated if not provided)\n\n#### Methods\n\n##### generateMagicLink(email, type, options?)\n\nGenerate a new magic link.\n\n```typescript\ngenerateMagicLink(\n  email: string,\n  type: string,\n  options?: MagicLinkOptions\n): MagicLinkResult\n```\n\n**Parameters:**\n- `email`: Email address associated with the magic link\n- `type`: Type/category of the magic link (e.g., 'password_reset', 'email_verification')\n- `options`: Optional configuration\n  - `expiresInHours`: Custom expiry time\n  - `payload`: Custom data to include\n  - `metadata`: Additional metadata\n  - `forceNew`: Force generation even if link exists\n\n**Returns:** `MagicLinkResult` with success status and magic link object\n\n##### validateToken(token)\n\nValidate a magic link token.\n\n```typescript\nvalidateToken(token: string): TokenValidationResult\n```\n\n**Returns:** `TokenValidationResult` with validation status and reason\n\n##### useMagicLink(token)\n\nUse a magic link (marks it as used).\n\n```typescript\nuseMagicLink(token: string): MagicLinkResult\n```\n\n**Returns:** `MagicLinkResult` with success status\n\n##### revokeMagicLink(token)\n\nRevoke a magic link (marks it as used).\n\n```typescript\nrevokeMagicLink(token: string): MagicLinkResult\n```\n\n**Returns:** `MagicLinkResult` with success status\n\n##### getMagicLink(token)\n\nGet magic link by token.\n\n```typescript\ngetMagicLink(token: string): MagicLink | undefined\n```\n\n##### getMagicLinksByEmail(email)\n\nGet all magic links for an email address.\n\n```typescript\ngetMagicLinksByEmail(email: string): MagicLink[]\n```\n\n##### getMagicLinksByType(type)\n\nGet all magic links of a specific type.\n\n```typescript\ngetMagicLinksByType(type: string): MagicLink[]\n```\n\n##### cleanupExpiredLinks()\n\nRemove expired magic links.\n\n```typescript\ncleanupExpiredLinks(): number\n```\n\n**Returns:** Number of removed links\n\n##### getStats()\n\nGet statistics about magic links.\n\n```typescript\ngetStats(): MagicLinkStats\n```\n\n**Returns:** Statistics object with counts and breakdowns\n\n##### getConfig()\n\nGet current configuration.\n\n```typescript\ngetConfig(): MagicLinkConfig\n```\n\n##### updateConfig(newConfig)\n\nUpdate configuration.\n\n```typescript\nupdateConfig(newConfig: Partial<MagicLinkConfig>): void\n```\n\n### Types\n\n#### MagicLink\n\n```typescript\ninterface MagicLink {\n  id: string;\n  token: string;\n  email: string;\n  type: string;\n  payload: Record<string, any>;\n  expiresAt: Date;\n  usedAt?: Date;\n  isUsed: boolean;\n  metadata: Record<string, any>;\n  createdAt: Date;\n}\n```\n\n#### MagicLinkConfig\n\n```typescript\ninterface MagicLinkConfig {\n  defaultExpiryHours: number;\n  tokenLength: number;\n  allowReuse: boolean;\n  maxUses: number;\n  cleanupExpiredLinks: boolean;\n  encryptionKey: string;\n}\n```\n\n#### MagicLinkOptions\n\n```typescript\ninterface MagicLinkOptions {\n  expiresInHours?: number;\n  payload?: MagicLinkPayload;\n  metadata?: Record<string, any>;\n  forceNew?: boolean;\n}\n```\n\n#### MagicLinkResult\n\n```typescript\ninterface MagicLinkResult {\n  success: boolean;\n  magicLink?: MagicLink;\n  error?: string;\n  data?: any;\n}\n```\n\n#### TokenValidationResult\n\n```typescript\ninterface TokenValidationResult {\n  isValid: boolean;\n  magicLink?: MagicLink;\n  reason?: 'expired' | 'used' | 'not_found' | 'invalid';\n  error?: string;\n}\n```\n\n### Validation Utilities\n\nThe package includes comprehensive validation utilities:\n\n```typescript\nimport {\n  validateEmail,\n  validateToken,\n  validateMagicLinkType,\n  validateExpiryTime,\n  validateEncryptionKey,\n  validatePayload,\n  validateMetadata,\n  validateMagicLinkGeneration,\n  validateMagicLinkConfig\n} from '@bernierllc/magic-link';\n```\n\n## Examples\n\n### Password Reset Flow\n\n```typescript\nimport { MagicLinkManager } from '@bernierllc/magic-link';\n\nconst manager = new MagicLinkManager({\n  defaultExpiryHours: 1, // 1 hour for password reset\n  encryptionKey: process.env.MAGIC_LINK_ENCRYPTION_KEY\n});\n\n// Generate password reset link\nconst result = manager.generateMagicLink('user@example.com', 'password_reset', {\n  payload: {\n    userId: '12345',\n    redirectUrl: '/reset-password'\n  }\n});\n\nif (result.success) {\n  // Send email with magic link\n  const resetUrl = `${process.env.APP_URL}/reset-password?token=${result.magicLink!.token}`;\n  await sendPasswordResetEmail('user@example.com', resetUrl);\n}\n```\n\n### Email Verification Flow\n\n```typescript\n// Generate email verification link\nconst result = manager.generateMagicLink('user@example.com', 'email_verification', {\n  expiresInHours: 72, // 3 days\n  payload: {\n    userId: '12345',\n    email: 'user@example.com'\n  }\n});\n\n// Handle verification\napp.get('/verify-email', (req, res) => {\n  const { token } = req.query;\n  const validation = manager.validateToken(token as string);\n  \n  if (validation.isValid) {\n    const useResult = manager.useMagicLink(token as string);\n    if (useResult.success) {\n      // Mark email as verified\n      await markEmailVerified(validation.magicLink!.email);\n      res.json({ success: true });\n    }\n  } else {\n    res.status(400).json({ error: validation.error });\n  }\n});\n```\n\n### Admin Access Flow\n\n```typescript\n// Generate admin access link\nconst result = manager.generateMagicLink('admin@example.com', 'admin_access', {\n  expiresInHours: 2, // 2 hours\n  payload: {\n    userId: 'admin123',\n    permissions: ['read', 'write', 'delete']\n  },\n  metadata: {\n    source: 'admin-panel',\n    ip: req.ip\n  }\n});\n```\n\n## Security Considerations\n\n1. **Encryption Key**: Use a strong, unique encryption key (at least 32 characters)\n2. **Token Length**: Use tokens of at least 32 characters for security\n3. **Expiry Times**: Set appropriate expiry times based on use case\n4. **HTTPS**: Always use HTTPS in production\n5. **Rate Limiting**: Implement rate limiting for magic link generation\n6. **Logging**: Log magic link usage for security monitoring\n\n## Best Practices\n\n1. **Unique Types**: Use descriptive, unique types for different use cases\n2. **Payload Size**: Keep payloads small and avoid sensitive data\n3. **Cleanup**: Regularly cleanup expired links\n4. **Monitoring**: Monitor magic link usage and failure rates\n5. **Testing**: Test magic link flows thoroughly\n\n## License\n\nISC License - see LICENSE file for details.\n\n## Contributing\n\nThis package is part of the @bernierllc tools suite. Please refer to the main repository for contribution guidelines. ","readmeFilename":"README.md"}