{"_id":"@azphalt/registry-store-vercel","_rev":"5-9e662798d13b132e8c3a038ab45aed3d","name":"@azphalt/registry-store-vercel","dist-tags":{"staging":"0.1.0","latest":"2.0.2"},"versions":{"0.1.0":{"name":"@azphalt/registry-store-vercel","version":"0.1.0","author":{"url":"https://hereliesaz.com","name":"Az"},"license":"MIT","_id":"@azphalt/registry-store-vercel@0.1.0","maintainers":[{"name":"azcamehere","email":"hereliesaz@gmail.com"},{"name":"hahapewpew","email":"az@hahapewpew.com"}],"dist":{"shasum":"f4adac9a0e536c57204f9601994a62466d24d7dc","tarball":"https://registry.npmjs.org/@azphalt/registry-store-vercel/-/registry-store-vercel-0.1.0.tgz","fileCount":17,"integrity":"sha512-7erQ4NE0L16JutfEnHLNE1VB7t+BluQ2COsHErBpCG6kuClnShVBJh3dUr20ezYQCFMsi756k9p4Adge66p6Ww==","signatures":[{"sig":"MEUCIQC0qbwYF0k2sp6TQypAjuNQTVXGp0EjEckS84Rv7TTVzgIgWdb0/wQUOhtT9kcYYoEQlxa7mb0VnCNLLj4nn4NOOj4=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":35181},"main":"./dist/index.js","type":"module","_from":"file:azphalt-registry-store-vercel-0.1.0.tgz","types":"./dist/index.d.ts","exports":{".":{"types":"./dist/index.d.ts","default":"./dist/index.js"}},"scripts":{"test":"vitest run","build":"tsc -p tsconfig.json","clean":"rm -rf dist","typecheck":"tsc -p tsconfig.json --noEmit"},"_npmUser":{"name":"azcamehere","email":"hereliesaz@gmail.com"},"_resolved":"/tmp/dbc35a0e7b517d2494cd654c771e4981/azphalt-registry-store-vercel-0.1.0.tgz","_integrity":"sha512-7erQ4NE0L16JutfEnHLNE1VB7t+BluQ2COsHErBpCG6kuClnShVBJh3dUr20ezYQCFMsi756k9p4Adge66p6Ww==","_npmVersion":"10.9.8","description":"A durable RegistryStore for @azphalt/registry backed by Neon Postgres + Vercel Blob.","directories":{},"sideEffects":false,"_nodeVersion":"22.23.1","dependencies":{"@vercel/blob":"^2.6.1","@neondatabase/serverless":"^1.1.0"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"vitest":"^3.2.7","typescript":"^5.9.3","@types/node":"^22.20.1","@azphalt/registry":"0.1.1"},"peerDependencies":{"@azphalt/registry":"0.1.1"},"_npmOperationalInternal":{"tmp":"tmp/registry-store-vercel_0.1.0_1784607576838_0.56973199176907","host":"s3://npm-registry-packages-npm-production"}},"1.0.0":{"name":"@azphalt/registry-store-vercel","version":"1.0.0","author":{"url":"https://hereliesaz.com","name":"Az"},"license":"MIT","_id":"@azphalt/registry-store-vercel@1.0.0","maintainers":[{"name":"azcamehere","email":"hereliesaz@gmail.com"},{"name":"hahapewpew","email":"az@hahapewpew.com"}],"dist":{"shasum":"fab5f9d5e988b4ee035d586e40eda1adf235fa5e","tarball":"https://registry.npmjs.org/@azphalt/registry-store-vercel/-/registry-store-vercel-1.0.0.tgz","fileCount":17,"integrity":"sha512-Hz61TYqxXhpkc9kRUea1oFiEGgSMHgEhAtUdRZWoteJyiN6gF8PDeZ9KFEkZEMVBkbSOaRe9Ohe5E/BXeYj0Xg==","signatures":[{"sig":"MEUCIQCj9c6WrjhCkl+k3/L1cEKNQsHhBa0hady5RbE5NWzQdQIgMRp9LFHITqzESTWJWDGbks2D0jDyJOKZJMK8V5+WLIg=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":35181},"main":"./dist/index.js","type":"module","_from":"file:azphalt-registry-store-vercel-1.0.0.tgz","types":"./dist/index.d.ts","exports":{".":{"types":"./dist/index.d.ts","default":"./dist/index.js"}},"scripts":{"test":"vitest run","build":"tsc -p tsconfig.json","clean":"rm -rf dist","typecheck":"tsc -p tsconfig.json --noEmit"},"_npmUser":{"name":"azcamehere","email":"hereliesaz@gmail.com"},"_resolved":"/tmp/c467ddf2c7bc648d54a594338c5da4b7/azphalt-registry-store-vercel-1.0.0.tgz","_integrity":"sha512-Hz61TYqxXhpkc9kRUea1oFiEGgSMHgEhAtUdRZWoteJyiN6gF8PDeZ9KFEkZEMVBkbSOaRe9Ohe5E/BXeYj0Xg==","_npmVersion":"10.9.8","description":"A durable RegistryStore for @azphalt/registry backed by Neon Postgres + Vercel Blob.","directories":{},"sideEffects":false,"_nodeVersion":"22.23.1","dependencies":{"@vercel/blob":"^2.6.1","@neondatabase/serverless":"^1.1.0"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"vitest":"^3.2.7","typescript":"^5.9.3","@types/node":"^22.20.1","@azphalt/registry":"0.2.0"},"peerDependencies":{"@azphalt/registry":"0.2.0"},"_npmOperationalInternal":{"tmp":"tmp/registry-store-vercel_1.0.0_1784628657454_0.20757161200386665","host":"s3://npm-registry-packages-npm-production"}},"2.0.0":{"name":"@azphalt/registry-store-vercel","version":"2.0.0","author":{"url":"https://hereliesaz.com","name":"Az"},"license":"MIT","_id":"@azphalt/registry-store-vercel@2.0.0","maintainers":[{"name":"azcamehere","email":"hereliesaz@gmail.com"},{"name":"hahapewpew","email":"az@hahapewpew.com"}],"dist":{"shasum":"25125be32ee2579ff6b0b0e15ab71b532fb1b215","tarball":"https://registry.npmjs.org/@azphalt/registry-store-vercel/-/registry-store-vercel-2.0.0.tgz","fileCount":17,"integrity":"sha512-0HyTK0sh/LlLsHoLGuzFwbdwdWJbtfiaNjiq+VxaM6IZHPaeUHgbLQEv2ygTxhB2ldIdZDQAt4BBzuy6Cc/WPw==","signatures":[{"sig":"MEYCIQCdIky81mDuB/tplLdHoeKDqlmGAGOQba2n/9950AE3/QIhAIVY5vHDPvZcPTEt4UFV/fVsQdA7GQaMx5wlBwp6V7Mt","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":35773},"main":"./dist/index.js","type":"module","_from":"file:azphalt-registry-store-vercel-2.0.0.tgz","types":"./dist/index.d.ts","exports":{".":{"types":"./dist/index.d.ts","default":"./dist/index.js"}},"scripts":{"test":"vitest run","build":"tsc -p tsconfig.json","clean":"rm -rf dist","typecheck":"tsc -p tsconfig.json --noEmit"},"_npmUser":{"name":"azcamehere","email":"hereliesaz@gmail.com"},"_resolved":"/tmp/0febce9159ca34c073a4aafbc2fe320a/azphalt-registry-store-vercel-2.0.0.tgz","_integrity":"sha512-0HyTK0sh/LlLsHoLGuzFwbdwdWJbtfiaNjiq+VxaM6IZHPaeUHgbLQEv2ygTxhB2ldIdZDQAt4BBzuy6Cc/WPw==","_npmVersion":"10.9.9","description":"A durable RegistryStore for @azphalt/registry backed by Neon Postgres + Vercel Blob.","directories":{},"sideEffects":false,"_nodeVersion":"22.23.1","dependencies":{"@vercel/blob":"^2.6.1","@neondatabase/serverless":"^1.1.0"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"vitest":"^3.2.7","typescript":"^5.9.3","@types/node":"^22.20.1","@azphalt/registry":"0.3.0"},"peerDependencies":{"@azphalt/registry":"0.3.0"},"_npmOperationalInternal":{"tmp":"tmp/registry-store-vercel_2.0.0_1785554805858_0.6835016913325465","host":"s3://npm-registry-packages-npm-production"}},"2.0.1":{"name":"@azphalt/registry-store-vercel","version":"2.0.1","author":{"url":"https://hereliesaz.com","name":"Az"},"license":"MIT","_id":"@azphalt/registry-store-vercel@2.0.1","maintainers":[{"name":"azcamehere","email":"hereliesaz@gmail.com"},{"name":"hahapewpew","email":"az@hahapewpew.com"}],"dist":{"shasum":"719f2f3abae741f49c2063fe3a2a2213e463c3f2","tarball":"https://registry.npmjs.org/@azphalt/registry-store-vercel/-/registry-store-vercel-2.0.1.tgz","fileCount":17,"integrity":"sha512-3NOsJzyO1fEwUARcgwjTi8wsfiiPo8ojZmOLMRLQsGvJyZepoetA9ogp2ysh6XtAmTF9K7eS99kKbH2oXwAvtw==","signatures":[{"sig":"MEUCIELoWLrLGBznEpDJ83zUJHcJG8hD/886ksuEyPEd5EGxAiEAjZ3Pfz0FkBBrZ3YWiLsTyiRfxVH3ET2mPpJ6Jm5kyP8=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":35773},"main":"./dist/index.js","type":"module","_from":"file:azphalt-registry-store-vercel-2.0.1.tgz","types":"./dist/index.d.ts","exports":{".":{"types":"./dist/index.d.ts","default":"./dist/index.js"}},"scripts":{"test":"vitest run","build":"tsc -p tsconfig.json","clean":"rm -rf dist","typecheck":"tsc -p tsconfig.json --noEmit"},"_npmUser":{"name":"azcamehere","email":"hereliesaz@gmail.com"},"_resolved":"/tmp/929b0bca24d0ec77738b44113a773aea/azphalt-registry-store-vercel-2.0.1.tgz","_integrity":"sha512-3NOsJzyO1fEwUARcgwjTi8wsfiiPo8ojZmOLMRLQsGvJyZepoetA9ogp2ysh6XtAmTF9K7eS99kKbH2oXwAvtw==","_npmVersion":"10.9.9","description":"A durable RegistryStore for @azphalt/registry backed by Neon Postgres + Vercel Blob.","directories":{},"sideEffects":false,"_nodeVersion":"22.23.1","dependencies":{"@vercel/blob":"^2.6.1","@neondatabase/serverless":"^1.1.0"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"vitest":"^3.2.7","typescript":"^5.9.3","@types/node":"^22.20.1","@azphalt/registry":"0.3.1"},"peerDependencies":{"@azphalt/registry":"0.3.1"},"_npmOperationalInternal":{"tmp":"tmp/registry-store-vercel_2.0.1_1786266689496_0.7495818318328327","host":"s3://npm-registry-packages-npm-production"}},"2.0.2":{"name":"@azphalt/registry-store-vercel","version":"2.0.2","publishConfig":{"access":"public"},"description":"A durable RegistryStore for @azphalt/registry backed by Neon Postgres + Vercel Blob.","license":"MIT","author":{"name":"Az","url":"https://hereliesaz.com"},"type":"module","main":"./dist/index.js","types":"./dist/index.d.ts","exports":{".":{"types":"./dist/index.d.ts","default":"./dist/index.js"}},"peerDependencies":{"@azphalt/registry":"0.3.2"},"dependencies":{"@neondatabase/serverless":"^1.1.0","@vercel/blob":"^2.6.1"},"devDependencies":{"@types/node":"^22.20.1","typescript":"^5.9.3","vitest":"^3.2.7","@azphalt/registry":"0.3.2"},"sideEffects":false,"scripts":{"build":"tsc -p tsconfig.json","test":"vitest run","typecheck":"tsc -p tsconfig.json --noEmit","clean":"rm -rf dist"},"_id":"@azphalt/registry-store-vercel@2.0.2","_integrity":"sha512-puVrt5OFheG4oDv0bxDzieXSTL2zHjquv7KPSUsvfUMDvJsBgIAUCsCzs38uM8370QSt9bGSuc1/zjmW6SbhtA==","_resolved":"/tmp/d8582d1050bfda36cf22a340e9d25d2d/azphalt-registry-store-vercel-2.0.2.tgz","_from":"file:azphalt-registry-store-vercel-2.0.2.tgz","_nodeVersion":"22.23.1","_npmVersion":"10.9.9","dist":{"integrity":"sha512-puVrt5OFheG4oDv0bxDzieXSTL2zHjquv7KPSUsvfUMDvJsBgIAUCsCzs38uM8370QSt9bGSuc1/zjmW6SbhtA==","shasum":"572ad7a67e732fa54a45a7c287dece105a9b236b","tarball":"https://registry.npmjs.org/@azphalt/registry-store-vercel/-/registry-store-vercel-2.0.2.tgz","fileCount":17,"unpackedSize":35773,"signatures":[{"keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U","sig":"MEUCIQDaes+5hk7Yi/eT76IJ7FNUkGVTkU2hBo2uUT/SIhNScwIgVkXGOHkZXNE6H8sl5jzLUTTvSLYe7H5TJ2f4J08LBQE="}]},"_npmUser":{"name":"azcamehere","email":"hereliesaz@gmail.com"},"directories":{},"maintainers":[{"name":"azcamehere","email":"hereliesaz@gmail.com"},{"name":"hahapewpew","email":"az@hahapewpew.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages-npm-production","tmp":"tmp/registry-store-vercel_2.0.2_1786700457191_0.9580046431159444"},"_hasShrinkwrap":false}},"time":{"created":"2026-07-21T04:19:36.693Z","modified":"2026-08-14T09:40:57.463Z","0.1.0":"2026-07-21T04:19:36.967Z","1.0.0":"2026-07-21T10:10:57.586Z","2.0.0":"2026-08-01T03:26:46.000Z","2.0.1":"2026-08-09T09:11:29.621Z","2.0.2":"2026-08-14T09:40:57.319Z"},"author":{"name":"Az","url":"https://hereliesaz.com"},"license":"MIT","description":"A durable RegistryStore for @azphalt/registry backed by Neon Postgres + Vercel Blob.","maintainers":[{"name":"azcamehere","email":"hereliesaz@gmail.com"},{"name":"hahapewpew","email":"az@hahapewpew.com"}],"readme":"# @azphalt/registry-store-vercel\n\nA durable backend for [`@azphalt/registry`](../registry) over **Neon Postgres** (metadata, listings,\ncheckout sessions, issued entitlements) and **Vercel Blob** (`.azp` bytes). Drop it in wherever a\ndeployment needs state to survive restarts and serverless fan-out — the `Registry`/`Marketplace`\nlogic never changes, only where state lives. The cloud dependencies live only here, behind an\n`@azphalt/registry` peer, so the core package everything else builds on stays dependency-light.\n\n```ts\nimport { createVercelStores } from \"@azphalt/registry-store-vercel\";\nimport { Registry, Marketplace, StubPaymentProvider } from \"@azphalt/registry\";\n\nconst { store, sessions, entitlements, migrate } = createVercelStores({\n  connectionString: process.env.DATABASE_URL!,\n  blobToken: process.env.BLOB_READ_WRITE_TOKEN!,\n});\nawait migrate(); // idempotent; safe to re-run\n\nconst registry = new Registry(store);\nconst market = new Marketplace(registry, store, {\n  payments: new StubPaymentProvider({ sessions }),\n});\n```\n\n## What it provides\n\n| Export | Implements | Backing |\n| --- | --- | --- |\n| `VercelRegistryStore` | `RegistryStore` | Neon + private Blob |\n| `PostgresSessionStore` | `PaymentSessionStore` | Neon |\n| `PostgresEntitlementStore` | `EntitlementStore` | Neon |\n| `migrate(sql)` / `createVercelStores(...).migrate()` | — | Neon (idempotent DDL) |\n\n## Bytes go to **private** Blob\n\n`.azp` bytes are written at a deterministic key `azp/{id}/{version}.azp` with `addRandomSuffix: false`\nand `allowOverwrite: true`. Access is **private** by default and must stay so where the paid-download\ngate is in force: a public blob URL is one guessable request away from the bytes, which would make the\n`401`/`402` on the download route decorative. `getBytes` fetches server-side with the store's token.\n\nDeterministic keys make `putVersion` safe without a distributed transaction: it writes the blob, then\nthe row. A blob failure writes nothing; a row failure leaves an orphaned (garbage-collectable) blob\nbut **never a row pointing at missing bytes**; a re-publish overwrites the same key.\n\n## Credentials are config, not ambient\n\nEvery constructor takes its connection string / token as an argument — the store never reads\n`process.env`. The app owns env wiring, and the store stays testable.\n\n## Non-goals\n\n- **The Vercel/Neon deploy itself** — this package is the code; provisioning needs an account.\n- **Blob orphan GC** for the rare torn write — harmless residue; a cleanup job is separate work.\n","readmeFilename":"readme.md"}