{"_id":"@anorebel/licensing","_rev":"6-f4f77f2f1fc2429b4ce1fc07760c0da9","name":"@anorebel/licensing","dist-tags":{"next":"0.2.0-rc.1","latest":"1.0.0"},"versions":{"0.1.0-rc.0":{"name":"@anorebel/licensing","version":"0.1.0-rc.0","keywords":["licensing","license","license-key","license-manager","offline-licensing","software-licensing","activation","fingerprint","ed25519","rsa-pss","hmac","signed-tokens","canonical-json","lic1","jws","crypto","pkcs8","pbkdf2","aes-gcm","hono","express","fastify","postgres","sqlite","typescript","bun","deno","node"],"author":{"url":"https://github.com/AnoRebel","name":"Ano Rebel","email":"hacker4rebel@gmail.com"},"license":"Apache-2.0","_id":"@anorebel/licensing@0.1.0-rc.0","maintainers":[{"name":"anorebel","email":"hacker4rebel@gmail.com"}],"homepage":"https://github.com/AnoRebel/licensing#readme","bugs":{"url":"https://github.com/AnoRebel/licensing/issues"},"bin":{"licensing-keys":"bin/licensing-keys.js"},"dist":{"shasum":"6b355a33b234744afb09f9d9d727d3c160a7c4c6","tarball":"https://registry.npmjs.org/@anorebel/licensing/-/licensing-0.1.0-rc.0.tgz","fileCount":305,"integrity":"sha512-2okakkWaTR/02RzesVRasehxxLdUPfRdHsoUAAW8v8lWx+h4K46aYqWl2bc2MvPmrsh6NH0VAvDHLvtCV7R0Eg==","signatures":[{"sig":"MEQCIENyTo3S9PYwbqvuRwWEx2n4XpdZX1JLcC/7zotWkoK2AiASF2vUwR5m1EQPjvJWXmpFy+MWXaRblWvVPs2Vv+ObfA==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":2648625},"main":"./src/index.ts","type":"module","types":"./src/index.ts","module":"./src/index.ts","engines":{"bun":">=1.3.12","node":">=22"},"exports":{".":{"bun":"./src/index.ts","types":"./src/index.ts","import":"./dist/index.js","require":"./dist/index.cjs"},"./id":{"bun":"./src/id.ts","types":"./src/id.ts","import":"./dist/id.js","require":"./dist/id.cjs"},"./cli":{"bun":"./src/cli/index.ts","types":"./src/cli/index.ts","import":"./dist/cli/index.js","require":"./dist/cli/index.cjs"},"./http":{"bun":"./src/http/index.ts","types":"./src/http/index.ts","import":"./dist/http/index.js","require":"./dist/http/index.cjs"},"./lic1":{"bun":"./src/lic1.ts","types":"./src/lic1.ts","import":"./dist/lic1.js","require":"./dist/lic1.cjs"},"./client":{"bun":"./src/client/index.ts","types":"./src/client/index.ts","import":"./dist/client/index.js","require":"./dist/client/index.cjs"},"./crypto":{"bun":"./src/crypto/index.ts","types":"./src/crypto/index.ts","import":"./dist/crypto/index.js","require":"./dist/crypto/index.cjs"},"./errors":{"bun":"./src/errors.ts","types":"./src/errors.ts","import":"./dist/errors.js","require":"./dist/errors.cjs"},"./storage":{"bun":"./src/storage/index.ts","types":"./src/storage/index.ts","import":"./dist/storage/index.js","require":"./dist/storage/index.cjs"},"./base64url":{"bun":"./src/base64url.ts","types":"./src/base64url.ts","import":"./dist/base64url.js","require":"./dist/base64url.cjs"},"./crypto/rsa":{"bun":"./src/crypto/rsa.ts","types":"./src/crypto/rsa.ts","import":"./dist/crypto/rsa.js","require":"./dist/crypto/rsa.cjs"},"./crypto/hmac":{"bun":"./src/crypto/hmac.ts","types":"./src/crypto/hmac.ts","import":"./dist/crypto/hmac.js","require":"./dist/crypto/hmac.cjs"},"./key-hierarchy":{"bun":"./src/key-hierarchy.ts","types":"./src/key-hierarchy.ts","import":"./dist/key-hierarchy.js","require":"./dist/key-hierarchy.cjs"},"./canonical-json":{"bun":"./src/canonical-json.ts","types":"./src/canonical-json.ts","import":"./dist/canonical-json.js","require":"./dist/canonical-json.cjs"},"./crypto/ed25519":{"bun":"./src/crypto/ed25519.ts","types":"./src/crypto/ed25519.ts","import":"./dist/crypto/ed25519.js","require":"./dist/crypto/ed25519.cjs"},"./storage/memory":{"bun":"./src/storage/memory/index.ts","types":"./src/storage/memory/index.ts","import":"./dist/storage/memory/index.js","require":"./dist/storage/memory/index.cjs"},"./storage/sqlite":{"bun":"./src/storage/sqlite/index.ts","types":"./src/storage/sqlite/index.ts","import":"./dist/storage/sqlite/index.js","require":"./dist/storage/sqlite/index.cjs"},"./encrypted-pkcs8":{"bun":"./src/encrypted-pkcs8.ts","types":"./src/encrypted-pkcs8.ts","import":"./dist/encrypted-pkcs8.js","require":"./dist/encrypted-pkcs8.cjs"},"./storage/postgres":{"bun":"./src/storage/postgres/index.ts","types":"./src/storage/postgres/index.ts","import":"./dist/storage/postgres/index.js","require":"./dist/storage/postgres/index.cjs"},"./http/adapters/hono":{"bun":"./src/http/adapters/hono.ts","types":"./src/http/adapters/hono.ts","import":"./dist/http/adapters/hono.js","require":"./dist/http/adapters/hono.cjs"},"./http/adapters/node":{"bun":"./src/http/adapters/node.ts","types":"./src/http/adapters/node.ts","import":"./dist/http/adapters/node.js","require":"./dist/http/adapters/node.cjs"},"./http/adapters/express":{"bun":"./src/http/adapters/express.ts","types":"./src/http/adapters/express.ts","import":"./dist/http/adapters/express.js","require":"./dist/http/adapters/express.cjs"},"./http/adapters/fastify":{"bun":"./src/http/adapters/fastify.ts","types":"./src/http/adapters/fastify.ts","import":"./dist/http/adapters/fastify.js","require":"./dist/http/adapters/fastify.cjs"},"./storage/sqlite/migrations":{"bun":"./src/storage/sqlite/migrations.ts","types":"./src/storage/sqlite/migrations.ts","import":"./dist/storage/sqlite/migrations.js","require":"./dist/storage/sqlite/migrations.cjs"},"./storage/postgres/migrations":{"bun":"./src/storage/postgres/migrations.ts","types":"./src/storage/postgres/migrations.ts","import":"./dist/storage/postgres/migrations.js","require":"./dist/storage/postgres/migrations.cjs"}},"gitHead":"38bb8eefa27e34e48abb2f726483b339851215fd","scripts":{"test":"bun test","build":"tsdown","typecheck":"tsc --noEmit","test:contract":"bun test tests/http/openapi-contract.test.ts"},"_npmUser":{"name":"anorebel","email":"hacker4rebel@gmail.com"},"repository":{"url":"git+https://github.com/AnoRebel/licensing.git","type":"git","directory":"typescript"},"_npmVersion":"11.12.1","description":"Offline-capable licensing toolkit: canonical JSON, LIC1 signed tokens, key hierarchy, issuer lifecycle, HTTP handlers, client activation flow, and storage adapters — all in a single package mirroring the Go module layout.","directories":{},"_nodeVersion":"24.15.0","_hasShrinkwrap":false,"devDependencies":{"pg":"^8.13.1","@types/pg":"^8.11.10","@types/bun":"^1.3.12","@types/express":"^5.0.6"},"peerDependencies":{"pg":"^8.13.1","hono":">=4","express":">=5","fastify":">=5"},"peerDependenciesMeta":{"pg":{"optional":true},"hono":{"optional":true},"express":{"optional":true},"fastify":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/licensing_0.1.0-rc.0_1776815970272_0.8085344343334813","host":"s3://npm-registry-packages-npm-production"}},"0.2.0-rc.0":{"name":"@anorebel/licensing","version":"0.2.0-rc.0","keywords":["licensing","license","license-key","license-manager","offline-licensing","software-licensing","activation","fingerprint","ed25519","rsa-pss","hmac","signed-tokens","canonical-json","lic1","jws","crypto","pkcs8","pbkdf2","aes-gcm","hono","express","fastify","postgres","sqlite","typescript","bun","deno","node"],"author":{"url":"https://github.com/AnoRebel","name":"Ano Rebel","email":"hacker4rebel@gmail.com"},"license":"Apache-2.0","_id":"@anorebel/licensing@0.2.0-rc.0","maintainers":[{"name":"anorebel","email":"hacker4rebel@gmail.com"}],"homepage":"https://github.com/AnoRebel/licensing#readme","bugs":{"url":"https://github.com/AnoRebel/licensing/issues"},"bin":{"licensing-keys":"bin/licensing-keys.js"},"dist":{"shasum":"b1c83e014eb0ed1b50ef4c07d4242d93c55bb3b5","tarball":"https://registry.npmjs.org/@anorebel/licensing/-/licensing-0.2.0-rc.0.tgz","fileCount":333,"integrity":"sha512-H/UwEUQjoCy8e07YMqRo/Unhbe+/oiwheB5W35TKSGKzpXcWlXi9ET4Fo2oriS9VFWX1wfu7igU2Ogz79PvKxw==","signatures":[{"sig":"MEUCIBgqjbDunBhqAPmTXqKoVnmZJZCY0V/nRIRr2PwbAyoCAiEAqo8VBdLeVuPp1kn14D03YowVAoKQN7cKn1XGnr8hjWQ=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@anorebel%2flicensing@0.2.0-rc.0","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":3281802},"main":"./src/index.ts","type":"module","types":"./src/index.ts","module":"./src/index.ts","engines":{"bun":">=1.3.12","node":">=22"},"exports":{".":{"bun":"./src/index.ts","types":"./src/index.ts","import":"./dist/index.js","require":"./dist/index.cjs"},"./id":{"bun":"./src/id.ts","types":"./src/id.ts","import":"./dist/id.js","require":"./dist/id.cjs"},"./cli":{"bun":"./src/cli/index.ts","types":"./src/cli/index.ts","import":"./dist/cli/index.js","require":"./dist/cli/index.cjs"},"./http":{"bun":"./src/http/index.ts","types":"./src/http/index.ts","import":"./dist/http/index.js","require":"./dist/http/index.cjs"},"./lic1":{"bun":"./src/lic1.ts","types":"./src/lic1.ts","import":"./dist/lic1.js","require":"./dist/lic1.cjs"},"./client":{"bun":"./src/client/index.ts","types":"./src/client/index.ts","import":"./dist/client/index.js","require":"./dist/client/index.cjs"},"./crypto":{"bun":"./src/crypto/index.ts","types":"./src/crypto/index.ts","import":"./dist/crypto/index.js","require":"./dist/crypto/index.cjs"},"./errors":{"bun":"./src/errors.ts","types":"./src/errors.ts","import":"./dist/errors.js","require":"./dist/errors.cjs"},"./storage":{"bun":"./src/storage/index.ts","types":"./src/storage/index.ts","import":"./dist/storage/index.js","require":"./dist/storage/index.cjs"},"./base64url":{"bun":"./src/base64url.ts","types":"./src/base64url.ts","import":"./dist/base64url.js","require":"./dist/base64url.cjs"},"./crypto/rsa":{"bun":"./src/crypto/rsa.ts","types":"./src/crypto/rsa.ts","import":"./dist/crypto/rsa.js","require":"./dist/crypto/rsa.cjs"},"./crypto/hmac":{"bun":"./src/crypto/hmac.ts","types":"./src/crypto/hmac.ts","import":"./dist/crypto/hmac.js","require":"./dist/crypto/hmac.cjs"},"./key-hierarchy":{"bun":"./src/key-hierarchy.ts","types":"./src/key-hierarchy.ts","import":"./dist/key-hierarchy.js","require":"./dist/key-hierarchy.cjs"},"./canonical-json":{"bun":"./src/canonical-json.ts","types":"./src/canonical-json.ts","import":"./dist/canonical-json.js","require":"./dist/canonical-json.cjs"},"./crypto/ed25519":{"bun":"./src/crypto/ed25519.ts","types":"./src/crypto/ed25519.ts","import":"./dist/crypto/ed25519.js","require":"./dist/crypto/ed25519.cjs"},"./storage/memory":{"bun":"./src/storage/memory/index.ts","types":"./src/storage/memory/index.ts","import":"./dist/storage/memory/index.js","require":"./dist/storage/memory/index.cjs"},"./storage/sqlite":{"bun":"./src/storage/sqlite/index.ts","types":"./src/storage/sqlite/index.ts","import":"./dist/storage/sqlite/index.js","require":"./dist/storage/sqlite/index.cjs"},"./encrypted-pkcs8":{"bun":"./src/encrypted-pkcs8.ts","types":"./src/encrypted-pkcs8.ts","import":"./dist/encrypted-pkcs8.js","require":"./dist/encrypted-pkcs8.cjs"},"./middleware/hono":{"bun":"./src/middleware/hono.ts","types":"./src/middleware/hono.ts","import":"./dist/middleware/hono.js","require":"./dist/middleware/hono.cjs"},"./storage/postgres":{"bun":"./src/storage/postgres/index.ts","types":"./src/storage/postgres/index.ts","import":"./dist/storage/postgres/index.js","require":"./dist/storage/postgres/index.cjs"},"./http/adapters/hono":{"bun":"./src/http/adapters/hono.ts","types":"./src/http/adapters/hono.ts","import":"./dist/http/adapters/hono.js","require":"./dist/http/adapters/hono.cjs"},"./http/adapters/node":{"bun":"./src/http/adapters/node.ts","types":"./src/http/adapters/node.ts","import":"./dist/http/adapters/node.js","require":"./dist/http/adapters/node.cjs"},"./middleware/express":{"bun":"./src/middleware/express.ts","types":"./src/middleware/express.ts","import":"./dist/middleware/express.js","require":"./dist/middleware/express.cjs"},"./middleware/fastify":{"bun":"./src/middleware/fastify.ts","types":"./src/middleware/fastify.ts","import":"./dist/middleware/fastify.js","require":"./dist/middleware/fastify.cjs"},"./http/adapters/express":{"bun":"./src/http/adapters/express.ts","types":"./src/http/adapters/express.ts","import":"./dist/http/adapters/express.js","require":"./dist/http/adapters/express.cjs"},"./http/adapters/fastify":{"bun":"./src/http/adapters/fastify.ts","types":"./src/http/adapters/fastify.ts","import":"./dist/http/adapters/fastify.js","require":"./dist/http/adapters/fastify.cjs"},"./storage/sqlite/migrations":{"bun":"./src/storage/sqlite/migrations.ts","types":"./src/storage/sqlite/migrations.ts","import":"./dist/storage/sqlite/migrations.js","require":"./dist/storage/sqlite/migrations.cjs"},"./storage/postgres/migrations":{"bun":"./src/storage/postgres/migrations.ts","types":"./src/storage/postgres/migrations.ts","import":"./dist/storage/postgres/migrations.js","require":"./dist/storage/postgres/migrations.cjs"}},"gitHead":"99ff0b14bf907324c48f6e9b2d4e2a4e961166d5","scripts":{"test":"bun test","build":"tsdown","typecheck":"tsc --noEmit","test:contract":"bun test tests/http/openapi-contract.test.ts"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:ff070059-7473-4d5a-b965-5535927e8bde"}},"repository":{"url":"git+https://github.com/AnoRebel/licensing.git","type":"git","directory":"typescript"},"_npmVersion":"11.11.0","description":"Offline-capable licensing toolkit: canonical JSON, LIC1 signed tokens, key hierarchy, issuer lifecycle, HTTP handlers, client activation flow, and storage adapters — all in a single package mirroring the Go module layout.","directories":{},"_nodeVersion":"24.14.1","_hasShrinkwrap":false,"readmeFilename":"README.md","devDependencies":{"pg":"^8.13.1","hono":"^4.10.4","express":"^5.1.0","fastify":"^5.7.0","@types/pg":"^8.11.10","@types/bun":"^1.3.12","@types/express":"^5.0.6"},"peerDependencies":{"pg":"^8.13.1","hono":">=4","express":">=5","fastify":">=5"},"peerDependenciesMeta":{"pg":{"optional":true},"hono":{"optional":true},"express":{"optional":true},"fastify":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/licensing_0.2.0-rc.0_1778056986300_0.4127641762095422","host":"s3://npm-registry-packages-npm-production"}},"0.2.0-rc.1":{"name":"@anorebel/licensing","version":"0.2.0-rc.1","keywords":["licensing","license","license-key","license-manager","offline-licensing","software-licensing","activation","fingerprint","ed25519","rsa-pss","hmac","signed-tokens","canonical-json","lic1","jws","crypto","pkcs8","pbkdf2","aes-gcm","hono","express","fastify","postgres","sqlite","typescript","bun","deno","node"],"author":{"url":"https://github.com/AnoRebel","name":"Ano Rebel","email":"hacker4rebel@gmail.com"},"license":"Apache-2.0","_id":"@anorebel/licensing@0.2.0-rc.1","maintainers":[{"name":"anorebel","email":"hacker4rebel@gmail.com"}],"homepage":"https://github.com/AnoRebel/licensing#readme","bugs":{"url":"https://github.com/AnoRebel/licensing/issues"},"bin":{"licensing-keys":"bin/licensing-keys.js"},"dist":{"shasum":"3e159327bd0b1a7e6534b7da7bf075678a31aed8","tarball":"https://registry.npmjs.org/@anorebel/licensing/-/licensing-0.2.0-rc.1.tgz","fileCount":339,"integrity":"sha512-/NhJHTreEmzWmCq0rbX5WUN3snjuXKEnae3rBByqgrEZ9cL36KWTQzGI/HmLUR4Oi73FO7P5VEe320WLvovbuQ==","signatures":[{"sig":"MEUCIQDwbm8MKwJPkDr0wnHhaKTwK4YEL3I4HXDVUruSjdd5iQIgMsFCrZ+Zf1nRLGasZhHNyszsNBSrllH/YBMzCmQw7uM=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@anorebel%2flicensing@0.2.0-rc.1","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":3394804},"main":"./src/index.ts","type":"module","types":"./src/index.ts","module":"./src/index.ts","engines":{"bun":">=1.3.12","node":">=22"},"exports":{".":{"bun":"./src/index.ts","types":"./src/index.ts","import":"./dist/index.js","require":"./dist/index.cjs"},"./id":{"bun":"./src/id.ts","types":"./src/id.ts","import":"./dist/id.js","require":"./dist/id.cjs"},"./cli":{"bun":"./src/cli/index.ts","types":"./src/cli/index.ts","import":"./dist/cli/index.js","require":"./dist/cli/index.cjs"},"./http":{"bun":"./src/http/index.ts","types":"./src/http/index.ts","import":"./dist/http/index.js","require":"./dist/http/index.cjs"},"./lic1":{"bun":"./src/lic1.ts","types":"./src/lic1.ts","import":"./dist/lic1.js","require":"./dist/lic1.cjs"},"./client":{"bun":"./src/client/index.ts","types":"./src/client/index.ts","import":"./dist/client/index.js","require":"./dist/client/index.cjs"},"./crypto":{"bun":"./src/crypto/index.ts","types":"./src/crypto/index.ts","import":"./dist/crypto/index.js","require":"./dist/crypto/index.cjs"},"./errors":{"bun":"./src/errors.ts","types":"./src/errors.ts","import":"./dist/errors.js","require":"./dist/errors.cjs"},"./storage":{"bun":"./src/storage/index.ts","types":"./src/storage/index.ts","import":"./dist/storage/index.js","require":"./dist/storage/index.cjs"},"./base64url":{"bun":"./src/base64url.ts","types":"./src/base64url.ts","import":"./dist/base64url.js","require":"./dist/base64url.cjs"},"./crypto/rsa":{"bun":"./src/crypto/rsa.ts","types":"./src/crypto/rsa.ts","import":"./dist/crypto/rsa.js","require":"./dist/crypto/rsa.cjs"},"./crypto/hmac":{"bun":"./src/crypto/hmac.ts","types":"./src/crypto/hmac.ts","import":"./dist/crypto/hmac.js","require":"./dist/crypto/hmac.cjs"},"./key-hierarchy":{"bun":"./src/key-hierarchy.ts","types":"./src/key-hierarchy.ts","import":"./dist/key-hierarchy.js","require":"./dist/key-hierarchy.cjs"},"./canonical-json":{"bun":"./src/canonical-json.ts","types":"./src/canonical-json.ts","import":"./dist/canonical-json.js","require":"./dist/canonical-json.cjs"},"./crypto/ed25519":{"bun":"./src/crypto/ed25519.ts","types":"./src/crypto/ed25519.ts","import":"./dist/crypto/ed25519.js","require":"./dist/crypto/ed25519.cjs"},"./storage/memory":{"bun":"./src/storage/memory/index.ts","types":"./src/storage/memory/index.ts","import":"./dist/storage/memory/index.js","require":"./dist/storage/memory/index.cjs"},"./storage/sqlite":{"bun":"./src/storage/sqlite/index.ts","types":"./src/storage/sqlite/index.ts","import":"./dist/storage/sqlite/index.js","require":"./dist/storage/sqlite/index.cjs"},"./encrypted-pkcs8":{"bun":"./src/encrypted-pkcs8.ts","types":"./src/encrypted-pkcs8.ts","import":"./dist/encrypted-pkcs8.js","require":"./dist/encrypted-pkcs8.cjs"},"./middleware/hono":{"bun":"./src/middleware/hono.ts","types":"./src/middleware/hono.ts","import":"./dist/middleware/hono.js","require":"./dist/middleware/hono.cjs"},"./storage/postgres":{"bun":"./src/storage/postgres/index.ts","types":"./src/storage/postgres/index.ts","import":"./dist/storage/postgres/index.js","require":"./dist/storage/postgres/index.cjs"},"./http/adapters/hono":{"bun":"./src/http/adapters/hono.ts","types":"./src/http/adapters/hono.ts","import":"./dist/http/adapters/hono.js","require":"./dist/http/adapters/hono.cjs"},"./http/adapters/node":{"bun":"./src/http/adapters/node.ts","types":"./src/http/adapters/node.ts","import":"./dist/http/adapters/node.js","require":"./dist/http/adapters/node.cjs"},"./middleware/express":{"bun":"./src/middleware/express.ts","types":"./src/middleware/express.ts","import":"./dist/middleware/express.js","require":"./dist/middleware/express.cjs"},"./middleware/fastify":{"bun":"./src/middleware/fastify.ts","types":"./src/middleware/fastify.ts","import":"./dist/middleware/fastify.js","require":"./dist/middleware/fastify.cjs"},"./http/adapters/express":{"bun":"./src/http/adapters/express.ts","types":"./src/http/adapters/express.ts","import":"./dist/http/adapters/express.js","require":"./dist/http/adapters/express.cjs"},"./http/adapters/fastify":{"bun":"./src/http/adapters/fastify.ts","types":"./src/http/adapters/fastify.ts","import":"./dist/http/adapters/fastify.js","require":"./dist/http/adapters/fastify.cjs"},"./storage/sqlite/migrations":{"bun":"./src/storage/sqlite/migrations.ts","types":"./src/storage/sqlite/migrations.ts","import":"./dist/storage/sqlite/migrations.js","require":"./dist/storage/sqlite/migrations.cjs"},"./storage/postgres/migrations":{"bun":"./src/storage/postgres/migrations.ts","types":"./src/storage/postgres/migrations.ts","import":"./dist/storage/postgres/migrations.js","require":"./dist/storage/postgres/migrations.cjs"}},"gitHead":"876cfddfaa47e26a64a7ba5b680bddd74a7b0f9f","scripts":{"test":"bun test","build":"tsdown","typecheck":"tsc --noEmit","test:contract":"bun test tests/http/openapi-contract.test.ts"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:ff070059-7473-4d5a-b965-5535927e8bde"}},"repository":{"url":"git+https://github.com/AnoRebel/licensing.git","type":"git","directory":"typescript"},"_npmVersion":"11.17.0","description":"Offline-capable licensing toolkit: canonical JSON, LIC1 signed tokens, key hierarchy, issuer lifecycle, HTTP handlers, client activation flow, and storage adapters — all in a single package mirroring the Go module layout.","directories":{},"_nodeVersion":"24.19.0","_hasShrinkwrap":false,"readmeFilename":"README.md","devDependencies":{"pg":"^8.23.0","hono":"^4.13.1","express":"^5.2.1","fastify":"^5.11.3","@types/pg":"^8.21.0","@types/bun":"^1.3.14","@types/express":"^5.0.6"},"peerDependencies":{"pg":"^8.13.1","hono":">=4","express":">=5","fastify":">=5"},"peerDependenciesMeta":{"pg":{"optional":true},"hono":{"optional":true},"express":{"optional":true},"fastify":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/licensing_0.2.0-rc.1_1787049888070_0.6858988234206527","host":"s3://npm-registry-packages-npm-production"}},"0.2.0":{"name":"@anorebel/licensing","version":"0.2.0","keywords":["licensing","license","license-key","license-manager","offline-licensing","software-licensing","activation","fingerprint","ed25519","rsa-pss","hmac","signed-tokens","canonical-json","lic1","jws","crypto","pkcs8","pbkdf2","aes-gcm","hono","express","fastify","postgres","sqlite","typescript","bun","deno","node"],"author":{"url":"https://github.com/AnoRebel","name":"Ano Rebel","email":"hacker4rebel@gmail.com"},"license":"Apache-2.0","_id":"@anorebel/licensing@0.2.0","maintainers":[{"name":"anorebel","email":"hacker4rebel@gmail.com"}],"homepage":"https://github.com/AnoRebel/licensing#readme","bugs":{"url":"https://github.com/AnoRebel/licensing/issues"},"bin":{"licensing-keys":"bin/licensing-keys.js"},"dist":{"shasum":"fcb771389027d8df25efcb8d40b086fac41e9c90","tarball":"https://registry.npmjs.org/@anorebel/licensing/-/licensing-0.2.0.tgz","fileCount":339,"integrity":"sha512-HBbEtWQ4u6BJ3h5gm24OEm7eu7+Yij6iGVLLm1EC1eJMNUqJYPNYQbU/3lwxqIn03I77zNm3CbRYwb55xcqTEQ==","signatures":[{"sig":"MEYCIQCBr993k+AtsLdQGObFjlt1HBw63WtaZfGUAjcD6F4XJwIhAIYqq6P7TCsDRpzY9k3HUcZNzSCwtoKFlnHWlAulbq6T","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@anorebel%2flicensing@0.2.0","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":3396814},"main":"./src/index.ts","type":"module","types":"./src/index.ts","module":"./src/index.ts","engines":{"bun":">=1.3.12","node":">=22"},"exports":{".":{"bun":"./src/index.ts","types":"./src/index.ts","import":"./dist/index.js","require":"./dist/index.cjs"},"./id":{"bun":"./src/id.ts","types":"./src/id.ts","import":"./dist/id.js","require":"./dist/id.cjs"},"./cli":{"bun":"./src/cli/index.ts","types":"./src/cli/index.ts","import":"./dist/cli/index.js","require":"./dist/cli/index.cjs"},"./http":{"bun":"./src/http/index.ts","types":"./src/http/index.ts","import":"./dist/http/index.js","require":"./dist/http/index.cjs"},"./lic1":{"bun":"./src/lic1.ts","types":"./src/lic1.ts","import":"./dist/lic1.js","require":"./dist/lic1.cjs"},"./client":{"bun":"./src/client/index.ts","types":"./src/client/index.ts","import":"./dist/client/index.js","require":"./dist/client/index.cjs"},"./crypto":{"bun":"./src/crypto/index.ts","types":"./src/crypto/index.ts","import":"./dist/crypto/index.js","require":"./dist/crypto/index.cjs"},"./errors":{"bun":"./src/errors.ts","types":"./src/errors.ts","import":"./dist/errors.js","require":"./dist/errors.cjs"},"./storage":{"bun":"./src/storage/index.ts","types":"./src/storage/index.ts","import":"./dist/storage/index.js","require":"./dist/storage/index.cjs"},"./base64url":{"bun":"./src/base64url.ts","types":"./src/base64url.ts","import":"./dist/base64url.js","require":"./dist/base64url.cjs"},"./crypto/rsa":{"bun":"./src/crypto/rsa.ts","types":"./src/crypto/rsa.ts","import":"./dist/crypto/rsa.js","require":"./dist/crypto/rsa.cjs"},"./crypto/hmac":{"bun":"./src/crypto/hmac.ts","types":"./src/crypto/hmac.ts","import":"./dist/crypto/hmac.js","require":"./dist/crypto/hmac.cjs"},"./key-hierarchy":{"bun":"./src/key-hierarchy.ts","types":"./src/key-hierarchy.ts","import":"./dist/key-hierarchy.js","require":"./dist/key-hierarchy.cjs"},"./canonical-json":{"bun":"./src/canonical-json.ts","types":"./src/canonical-json.ts","import":"./dist/canonical-json.js","require":"./dist/canonical-json.cjs"},"./crypto/ed25519":{"bun":"./src/crypto/ed25519.ts","types":"./src/crypto/ed25519.ts","import":"./dist/crypto/ed25519.js","require":"./dist/crypto/ed25519.cjs"},"./storage/memory":{"bun":"./src/storage/memory/index.ts","types":"./src/storage/memory/index.ts","import":"./dist/storage/memory/index.js","require":"./dist/storage/memory/index.cjs"},"./storage/sqlite":{"bun":"./src/storage/sqlite/index.ts","types":"./src/storage/sqlite/index.ts","import":"./dist/storage/sqlite/index.js","require":"./dist/storage/sqlite/index.cjs"},"./encrypted-pkcs8":{"bun":"./src/encrypted-pkcs8.ts","types":"./src/encrypted-pkcs8.ts","import":"./dist/encrypted-pkcs8.js","require":"./dist/encrypted-pkcs8.cjs"},"./middleware/hono":{"bun":"./src/middleware/hono.ts","types":"./src/middleware/hono.ts","import":"./dist/middleware/hono.js","require":"./dist/middleware/hono.cjs"},"./storage/postgres":{"bun":"./src/storage/postgres/index.ts","types":"./src/storage/postgres/index.ts","import":"./dist/storage/postgres/index.js","require":"./dist/storage/postgres/index.cjs"},"./http/adapters/hono":{"bun":"./src/http/adapters/hono.ts","types":"./src/http/adapters/hono.ts","import":"./dist/http/adapters/hono.js","require":"./dist/http/adapters/hono.cjs"},"./http/adapters/node":{"bun":"./src/http/adapters/node.ts","types":"./src/http/adapters/node.ts","import":"./dist/http/adapters/node.js","require":"./dist/http/adapters/node.cjs"},"./middleware/express":{"bun":"./src/middleware/express.ts","types":"./src/middleware/express.ts","import":"./dist/middleware/express.js","require":"./dist/middleware/express.cjs"},"./middleware/fastify":{"bun":"./src/middleware/fastify.ts","types":"./src/middleware/fastify.ts","import":"./dist/middleware/fastify.js","require":"./dist/middleware/fastify.cjs"},"./http/adapters/express":{"bun":"./src/http/adapters/express.ts","types":"./src/http/adapters/express.ts","import":"./dist/http/adapters/express.js","require":"./dist/http/adapters/express.cjs"},"./http/adapters/fastify":{"bun":"./src/http/adapters/fastify.ts","types":"./src/http/adapters/fastify.ts","import":"./dist/http/adapters/fastify.js","require":"./dist/http/adapters/fastify.cjs"},"./storage/sqlite/migrations":{"bun":"./src/storage/sqlite/migrations.ts","types":"./src/storage/sqlite/migrations.ts","import":"./dist/storage/sqlite/migrations.js","require":"./dist/storage/sqlite/migrations.cjs"},"./storage/postgres/migrations":{"bun":"./src/storage/postgres/migrations.ts","types":"./src/storage/postgres/migrations.ts","import":"./dist/storage/postgres/migrations.js","require":"./dist/storage/postgres/migrations.cjs"}},"gitHead":"e11c46182d804c27f879918b86c5c61d9f4ef2c3","scripts":{"test":"bun test","build":"tsdown","typecheck":"tsc --noEmit","test:contract":"bun test tests/http/openapi-contract.test.ts"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:ff070059-7473-4d5a-b965-5535927e8bde"}},"repository":{"url":"git+https://github.com/AnoRebel/licensing.git","type":"git","directory":"typescript"},"_npmVersion":"11.17.0","description":"Offline-capable licensing toolkit: canonical JSON, LIC1 signed tokens, key hierarchy, issuer lifecycle, HTTP handlers, client activation flow, and storage adapters — all in a single package mirroring the Go module layout.","directories":{},"_nodeVersion":"24.19.0","_hasShrinkwrap":false,"devDependencies":{"pg":"^8.23.0","hono":"^4.13.1","express":"^5.2.1","fastify":"^5.11.3","@types/pg":"^8.21.0","@types/bun":"^1.3.14","@types/express":"^5.0.6"},"peerDependencies":{"pg":"^8.13.1","hono":">=4","express":">=5","fastify":">=5"},"peerDependenciesMeta":{"pg":{"optional":true},"hono":{"optional":true},"express":{"optional":true},"fastify":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/licensing_0.2.0_1787058714172_0.93194709807665","host":"s3://npm-registry-packages-npm-production"}},"1.0.0":{"name":"@anorebel/licensing","version":"1.0.0","description":"Offline-capable licensing toolkit: canonical JSON, LIC1 signed tokens, key hierarchy, issuer lifecycle, HTTP handlers, client activation flow, and storage adapters — all in a single package mirroring the Go module layout.","keywords":["licensing","license","license-key","license-manager","offline-licensing","software-licensing","activation","fingerprint","ed25519","rsa-pss","hmac","signed-tokens","canonical-json","lic1","jws","crypto","pkcs8","pbkdf2","aes-gcm","hono","express","fastify","postgres","sqlite","typescript","bun","deno","node"],"license":"Apache-2.0","author":{"name":"Ano Rebel","email":"hacker4rebel@gmail.com","url":"https://github.com/AnoRebel"},"homepage":"https://github.com/AnoRebel/licensing#readme","repository":{"type":"git","url":"git+https://github.com/AnoRebel/licensing.git","directory":"typescript"},"bugs":{"url":"https://github.com/AnoRebel/licensing/issues"},"type":"module","main":"./src/index.ts","module":"./src/index.ts","types":"./src/index.ts","exports":{".":{"types":"./src/index.ts","bun":"./src/index.ts","import":"./dist/index.js","require":"./dist/index.cjs"},"./canonical-json":{"types":"./src/canonical-json.ts","bun":"./src/canonical-json.ts","import":"./dist/canonical-json.js","require":"./dist/canonical-json.cjs"},"./base64url":{"types":"./src/base64url.ts","bun":"./src/base64url.ts","import":"./dist/base64url.js","require":"./dist/base64url.cjs"},"./lic1":{"types":"./src/lic1.ts","bun":"./src/lic1.ts","import":"./dist/lic1.js","require":"./dist/lic1.cjs"},"./lic2":{"types":"./src/lic2.ts","bun":"./src/lic2.ts","import":"./dist/lic2.js","require":"./dist/lic2.cjs"},"./errors":{"types":"./src/errors.ts","bun":"./src/errors.ts","import":"./dist/errors.js","require":"./dist/errors.cjs"},"./encrypted-pkcs8":{"types":"./src/encrypted-pkcs8.ts","bun":"./src/encrypted-pkcs8.ts","import":"./dist/encrypted-pkcs8.js","require":"./dist/encrypted-pkcs8.cjs"},"./id":{"types":"./src/id.ts","bun":"./src/id.ts","import":"./dist/id.js","require":"./dist/id.cjs"},"./key-hierarchy":{"types":"./src/key-hierarchy.ts","bun":"./src/key-hierarchy.ts","import":"./dist/key-hierarchy.js","require":"./dist/key-hierarchy.cjs"},"./crypto":{"types":"./src/crypto/index.ts","bun":"./src/crypto/index.ts","import":"./dist/crypto/index.js","require":"./dist/crypto/index.cjs"},"./crypto/ed25519":{"types":"./src/crypto/ed25519.ts","bun":"./src/crypto/ed25519.ts","import":"./dist/crypto/ed25519.js","require":"./dist/crypto/ed25519.cjs"},"./crypto/rsa":{"types":"./src/crypto/rsa.ts","bun":"./src/crypto/rsa.ts","import":"./dist/crypto/rsa.js","require":"./dist/crypto/rsa.cjs"},"./crypto/hmac":{"types":"./src/crypto/hmac.ts","bun":"./src/crypto/hmac.ts","import":"./dist/crypto/hmac.js","require":"./dist/crypto/hmac.cjs"},"./client":{"types":"./src/client/index.ts","bun":"./src/client/index.ts","import":"./dist/client/index.js","require":"./dist/client/index.cjs"},"./http":{"types":"./src/http/index.ts","bun":"./src/http/index.ts","import":"./dist/http/index.js","require":"./dist/http/index.cjs"},"./http/adapters/hono":{"types":"./src/http/adapters/hono.ts","bun":"./src/http/adapters/hono.ts","import":"./dist/http/adapters/hono.js","require":"./dist/http/adapters/hono.cjs"},"./http/adapters/express":{"types":"./src/http/adapters/express.ts","bun":"./src/http/adapters/express.ts","import":"./dist/http/adapters/express.js","require":"./dist/http/adapters/express.cjs"},"./http/adapters/fastify":{"types":"./src/http/adapters/fastify.ts","bun":"./src/http/adapters/fastify.ts","import":"./dist/http/adapters/fastify.js","require":"./dist/http/adapters/fastify.cjs"},"./http/adapters/node":{"types":"./src/http/adapters/node.ts","bun":"./src/http/adapters/node.ts","import":"./dist/http/adapters/node.js","require":"./dist/http/adapters/node.cjs"},"./middleware/express":{"types":"./src/middleware/express.ts","bun":"./src/middleware/express.ts","import":"./dist/middleware/express.js","require":"./dist/middleware/express.cjs"},"./middleware/hono":{"types":"./src/middleware/hono.ts","bun":"./src/middleware/hono.ts","import":"./dist/middleware/hono.js","require":"./dist/middleware/hono.cjs"},"./middleware/fastify":{"types":"./src/middleware/fastify.ts","bun":"./src/middleware/fastify.ts","import":"./dist/middleware/fastify.js","require":"./dist/middleware/fastify.cjs"},"./storage":{"types":"./src/storage/index.ts","bun":"./src/storage/index.ts","import":"./dist/storage/index.js","require":"./dist/storage/index.cjs"},"./storage/memory":{"types":"./src/storage/memory/index.ts","bun":"./src/storage/memory/index.ts","import":"./dist/storage/memory/index.js","require":"./dist/storage/memory/index.cjs"},"./storage/postgres":{"types":"./src/storage/postgres/index.ts","bun":"./src/storage/postgres/index.ts","import":"./dist/storage/postgres/index.js","require":"./dist/storage/postgres/index.cjs"},"./storage/postgres/migrations":{"types":"./src/storage/postgres/migrations.ts","bun":"./src/storage/postgres/migrations.ts","import":"./dist/storage/postgres/migrations.js","require":"./dist/storage/postgres/migrations.cjs"},"./storage/sqlite":{"types":"./src/storage/sqlite/index.ts","bun":"./src/storage/sqlite/index.ts","import":"./dist/storage/sqlite/index.js","require":"./dist/storage/sqlite/index.cjs"},"./storage/sqlite/migrations":{"types":"./src/storage/sqlite/migrations.ts","bun":"./src/storage/sqlite/migrations.ts","import":"./dist/storage/sqlite/migrations.js","require":"./dist/storage/sqlite/migrations.cjs"},"./cli":{"types":"./src/cli/index.ts","bun":"./src/cli/index.ts","import":"./dist/cli/index.js","require":"./dist/cli/index.cjs"}},"scripts":{"build":"tsdown","typecheck":"tsc --noEmit","test":"bun test","test:contract":"bun test tests/http/openapi-contract.test.ts"},"bin":{"licensing-keys":"bin/licensing-keys.js"},"engines":{"bun":">=1.3.12","node":">=22"},"peerDependencies":{"pg":"^8.13.1","hono":">=4","express":">=5","fastify":">=5"},"peerDependenciesMeta":{"pg":{"optional":true},"hono":{"optional":true},"express":{"optional":true},"fastify":{"optional":true}},"devDependencies":{"@types/bun":"^1.3.14","@types/express":"^5.0.6","@types/pg":"^8.23.1","express":"^5.2.1","fastify":"^5.12.0","hono":"^4.13.3","paseto-ts":"2.0.6","pg":"^8.23.0"},"gitHead":"12a206bfcd66b5905be41f532ec3123e4da5892e","_id":"@anorebel/licensing@1.0.0","_nodeVersion":"24.19.0","_npmVersion":"11.17.0","dist":{"integrity":"sha512-e1aX7M+nFJD/rlbesStGCj/iaTy9Z6CtMQjEz6C8+4WvAvZQI+jS3zFzvs1qr1fhEFZT4pnLSLYyT7TKdYSMfg==","shasum":"175a6d6e42ccdd5156ecb229547f8650f98f2559","tarball":"https://registry.npmjs.org/@anorebel/licensing/-/licensing-1.0.0.tgz","fileCount":357,"unpackedSize":3486041,"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@anorebel%2flicensing@1.0.0","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"signatures":[{"keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U","sig":"MEQCIAfSnBRuzPOBIsQMRekOOrRm4iiG8HUNgdtsd9rrddnRAiA/mYndUkMmdRBYdlKLhIc3Db4bo3a1Q6N4WSWA9G7+NA=="}]},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:ff070059-7473-4d5a-b965-5535927e8bde"}},"directories":{},"maintainers":[{"name":"anorebel","email":"hacker4rebel@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages-npm-production","tmp":"tmp/licensing_1.0.0_1787320156597_0.636618316161315"},"_hasShrinkwrap":false}},"time":{"created":"2026-04-21T23:59:30.161Z","modified":"2026-08-21T13:49:17.164Z","0.1.0-rc.0":"2026-04-21T23:59:30.480Z","0.2.0-rc.0":"2026-05-06T08:43:06.502Z","0.2.0-rc.1":"2026-08-18T10:44:48.260Z","0.2.0":"2026-08-18T13:11:54.384Z","1.0.0":"2026-08-21T13:49:16.845Z"},"bugs":{"url":"https://github.com/AnoRebel/licensing/issues"},"author":{"name":"Ano Rebel","email":"hacker4rebel@gmail.com","url":"https://github.com/AnoRebel"},"license":"Apache-2.0","homepage":"https://github.com/AnoRebel/licensing#readme","keywords":["licensing","license","license-key","license-manager","offline-licensing","software-licensing","activation","fingerprint","ed25519","rsa-pss","hmac","signed-tokens","canonical-json","lic1","jws","crypto","pkcs8","pbkdf2","aes-gcm","hono","express","fastify","postgres","sqlite","typescript","bun","deno","node"],"repository":{"type":"git","url":"git+https://github.com/AnoRebel/licensing.git","directory":"typescript"},"description":"Offline-capable licensing toolkit: canonical JSON, LIC1 signed tokens, key hierarchy, issuer lifecycle, HTTP handlers, client activation flow, and storage adapters — all in a single package mirroring the Go module layout.","maintainers":[{"name":"anorebel","email":"hacker4rebel@gmail.com"}],"readme":"# @anorebel/licensing\n\nOffline-capable software licensing for TypeScript runtimes. Issue signed\nlicense tokens, bind them to a device fingerprint, and verify them with no\nnetwork round-trip — using Ed25519, RSA-PSS, or HMAC under a single envelope\nformat (LIC1).\n\nShips as one package with subpath exports for every layer: low-level crypto\nprimitives, the issuer lifecycle (keys, scopes, templates, licenses, usages,\ntokens), framework-agnostic HTTP handlers with Hono/Express/Fastify adapters,\nan offline-first client, and pluggable storage (memory, Postgres, SQLite). A\ncompanion Go module at `github.com/AnoRebel/licensing` ships the same surface;\ntokens are byte-compatible across both ports at the same version.\n\n## Install\n\n```bash\nbun add @anorebel/licensing\n# or\nnpm install @anorebel/licensing\n# or\ndeno add jsr:@anorebel/licensing\n```\n\nOptional peers, installed only when you use the matching storage adapter:\n\n```bash\nbun add pg                  # for @anorebel/licensing/storage/postgres\n# (Bun's built-in bun:sqlite is used by the SQLite adapter — no install needed)\n```\n\n## Subpath exports\n\n| Import                                            | What you get                                                           |\n| ------------------------------------------------- | ---------------------------------------------------------------------- |\n| `@anorebel/licensing`                            | Issuer primitives: lifecycle, license/scope/template/token services.   |\n| `@anorebel/licensing/canonical-json`             | Deterministic stringify used by LIC1 and the interop fixtures.         |\n| `@anorebel/licensing/base64url`                  | RFC 4648 §5 encoder/decoder (unpadded).                                |\n| `@anorebel/licensing/lic1`                       | Low-level encode/decode of the `LIC1.<h>.<p>.<s>` envelope.            |\n| `@anorebel/licensing/crypto`                     | `AlgorithmRegistry`, `KeyAlgBindings`, `SignatureBackend` types.       |\n| `@anorebel/licensing/crypto/ed25519`             | Ed25519 backend.                                                       |\n| `@anorebel/licensing/crypto/rsa`                 | RSA-PSS (RS256/RS384/RS512) backend.                                   |\n| `@anorebel/licensing/crypto/hmac`                | HMAC-SHA-256 backend (symmetric — use carefully).                      |\n| `@anorebel/licensing/encrypted-pkcs8`            | PBES2 (PBKDF2-HMAC-SHA-256 + AES-256-GCM) wrap/unwrap.                 |\n| `@anorebel/licensing/errors`                     | Stable error codes shared with the HTTP surface.                       |\n| `@anorebel/licensing/client`                     | Offline-first consumer: activate / validate / heartbeat / refresh.     |\n| `@anorebel/licensing/http`                       | Framework-agnostic HTTP handlers; Hono / Express / Fastify adapters.   |\n| `@anorebel/licensing/http/adapters/hono`         | `toHonoHandler` factory.                                               |\n| `@anorebel/licensing/http/adapters/express`      | `toExpressHandler` factory.                                            |\n| `@anorebel/licensing/http/adapters/fastify`      | `toFastifyHandler` factory.                                            |\n| `@anorebel/licensing/storage`                    | `Storage` interface + schema descriptions.                             |\n| `@anorebel/licensing/storage/memory`             | In-memory adapter (tests + ephemeral runtimes).                        |\n| `@anorebel/licensing/storage/postgres`           | Postgres adapter using `pg`.                                           |\n| `@anorebel/licensing/storage/postgres/migrations`| `applyMigrations(pool)` — ships the Postgres schema migration runner.  |\n| `@anorebel/licensing/storage/sqlite`             | SQLite adapter using `bun:sqlite` (WAL + foreign keys enabled).        |\n| `@anorebel/licensing/storage/sqlite/migrations`  | `applyMigrations(db)` for SQLite.                                      |\n\n## Quickstart: issuer\n\n```ts\nimport {\n  createLicense, issueToken, registerUsage,\n  generateRootKey, issueInitialSigningKey,\n  NewAlgorithmRegistry, NewKeyAlgBindings,\n  systemClock,\n} from '@anorebel/licensing';\nimport { ed25519 } from '@anorebel/licensing/crypto/ed25519';\nimport { MemoryStorage } from '@anorebel/licensing/storage/memory';\n\nconst store = new MemoryStorage();\nconst clock = systemClock();\nconst registry = new NewAlgorithmRegistry();\nregistry.register(ed25519());\n\nconst root = await generateRootKey(store, clock, registry, {\n  alg: 'ed25519', passphrase: 'root-pw',\n});\nconst signing = await issueInitialSigningKey(store, clock, registry, {\n  alg: 'ed25519', rootKid: root.kid,\n  rootPassphrase: 'root-pw', signingPassphrase: 'sign-pw',\n});\n\nconst license = await createLicense(store, clock, {\n  licensableType: 'User', licensableId: 'user-42',\n  status: 'active', maxUsages: 3,\n});\nconst usage = await registerUsage(store, clock, {\n  licenseId: license.id, fingerprint: 'a'.repeat(64),\n});\nconst { token } = await issueToken(store, clock, registry, {\n  license, usage: usage.usage, ttlSeconds: 3600,\n  alg: 'ed25519', signingPassphrase: 'sign-pw',\n});\n```\n\nSee [`examples/ts/issue-and-verify.ts`](../../examples/ts/issue-and-verify.ts) for\nthe full end-to-end flow including public-key verification.\n\n## Quickstart: client\n\n```ts\nimport { activate, sendOneHeartbeat, deactivate, MemoryTokenStore }\n  from '@anorebel/licensing/client';\n\nconst store = new MemoryTokenStore();\nconst { license_id, usage_id } = await activate('LK-DEMO-0000-0000', {\n  baseUrl: 'https://issuer.example.com',\n  fingerprint: 'b'.repeat(64),\n  store,\n});\n```\n\nSee [`examples/ts/client-flow.ts`](../../examples/ts/client-flow.ts).\n\n## CLI\n\n```bash\nbunx licensing-keys generate --alg ed25519 --out keys/k1\nbunx licensing-keys encrypt --in keys/k1/private.pem --passphrase-env KEY_PASS\nbunx licensing-keys rotate --scope scp_01HX... --alg ed25519\n```\n\nRefuses empty passphrases. See [`docs/security.md`](../../docs/security.md) for\nthe full key hierarchy and rotation procedure.\n\n## Versioning\n\nEvery release of this package matches the Go module\n(`github.com/AnoRebel/licensing/licensing`) at the same tag. A LIC1 token\nissued by one language verifies in the other; the interop fixtures in\n`tools/interop/` are pinned per-version.\n\n## License\n\nApache-2.0. See [`LICENSE`](./LICENSE) and [`NOTICE`](./NOTICE).\n","readmeFilename":"README.md"}