From dda35d57a28f66f96a0482b61aafeec4f90398aa Mon Sep 17 00:00:00 2001 From: Philippe Serhal Date: Sun, 15 Sep 2024 17:45:28 -0400 Subject: [PATCH 1/2] chore(deps): support @netlify/blobs v8 The peer dependency only specifies support for v6 and v7, but v8 works just fine. This adds v8 to the peer dependencies, bumps the dev dep to v8, updates the tests (there's a new requirement that's specific to unusual use cases like unstorage's tests, which are run outside of the Netlify platform and the Netlify CLI), and adjust the driver types to ensure compatibility with all supported versions. See https://github.com/netlify/blobs/pull/183. I believe @netlify/blobs@8 will error in local dev when using netlify-cli before 17.21.1. This doesn't seem like unstorage's problem though, so I didn't do anything about that here. --- package.json | 4 ++-- pnpm-lock.yaml | 10 +++++----- src/drivers/netlify-blobs.ts | 6 ++++++ test/drivers/netlify-blobs.test.ts | 2 ++ 4 files changed, 15 insertions(+), 7 deletions(-) diff --git a/package.json b/package.json index a545e261..0d20aab5 100644 --- a/package.json +++ b/package.json @@ -64,7 +64,7 @@ "@azure/storage-blob": "^12.24.0", "@capacitor/preferences": "^6.0.2", "@cloudflare/workers-types": "^4.20240903.0", - "@netlify/blobs": "^7.4.0", + "@netlify/blobs": "^8.0.1", "@planetscale/database": "^1.19.0", "@types/ioredis-mock": "^8.2.5", "@types/jsdom": "^21.1.7", @@ -105,7 +105,7 @@ "@azure/keyvault-secrets": "^4.8.0", "@azure/storage-blob": "^12.24.0", "@capacitor/preferences": "^6.0.2", - "@netlify/blobs": "^6.5.0 || ^7.0.0", + "@netlify/blobs": "^6.5.0 || ^7.0.0 || ^8.0.0", "@planetscale/database": "^1.19.0", "@upstash/redis": "^1.34.0", "@vercel/kv": "^1.0.1", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index cd0eacae..d50720ab 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -64,8 +64,8 @@ importers: specifier: ^4.20240903.0 version: 4.20240903.0 '@netlify/blobs': - specifier: ^7.4.0 - version: 7.4.0 + specifier: ^8.0.1 + version: 8.0.1 '@planetscale/database': specifier: ^1.19.0 version: 1.19.0 @@ -857,8 +857,8 @@ packages: resolution: {integrity: sha512-N8x7eSLGcmUFNWZRxT1vsHvypzIRgQYdG0rJey/rZCy6zT/30qDt8Joj7FxzGNLSwXbeZqJOMqDurp7ra4hgbw==} engines: {node: '>=14'} - '@netlify/blobs@7.4.0': - resolution: {integrity: sha512-7rdPzo8bggt3D2CVO+U1rmEtxxs8X7cLusDbHZRJaMlxqxBD05mXgThj5DUJMFOvmfVjhEH/S/3AyiLUbDQGDg==} + '@netlify/blobs@8.0.1': + resolution: {integrity: sha512-IrZHVqillU0x12eDbsap4Ba6poi+4IdVCYjZa+tA0eD95TaSbSqfw1zNkO27MiKw0pOjPB6+RXFK4pdfOs/qUQ==} engines: {node: ^14.16.0 || >=16.0.0} '@nodelib/fs.scandir@2.1.5': @@ -5110,7 +5110,7 @@ snapshots: transitivePeerDependencies: - supports-color - '@netlify/blobs@7.4.0': {} + '@netlify/blobs@8.0.1': {} '@nodelib/fs.scandir@2.1.5': dependencies: diff --git a/src/drivers/netlify-blobs.ts b/src/drivers/netlify-blobs.ts index 62d713ed..c1df8e6b 100644 --- a/src/drivers/netlify-blobs.ts +++ b/src/drivers/netlify-blobs.ts @@ -33,6 +33,11 @@ export interface NetlifyDeployStoreOptions extends NetlifyBaseStoreOptions { deployID?: string; } +export interface NetlifyDeployStoreV8Options extends NetlifyDeployStoreOptions { + // TODO(serhalp) Export this type from @netlify/blobs instead + region?: "us-east-1" | "us-east-2"; +} + export interface NetlifyNamedStoreOptions extends NetlifyBaseStoreOptions { name: string; deployScoped?: false; @@ -40,6 +45,7 @@ export interface NetlifyNamedStoreOptions extends NetlifyBaseStoreOptions { export type NetlifyStoreOptions = | NetlifyDeployStoreOptions + | NetlifyDeployStoreV8Options | NetlifyNamedStoreOptions; export default defineDriver((options: NetlifyStoreOptions) => { diff --git a/test/drivers/netlify-blobs.test.ts b/test/drivers/netlify-blobs.test.ts index 00a406ac..8688f9f5 100644 --- a/test/drivers/netlify-blobs.test.ts +++ b/test/drivers/netlify-blobs.test.ts @@ -39,6 +39,8 @@ describe("drivers: netlify-blobs", async () => { token, siteID, deployID: "test", + // Usually defaulted via the environment; only required in a test environment like this + region: "us-east-1", }), }); From a2fccb240118a814ae8375d5bc63ea4bdc247659 Mon Sep 17 00:00:00 2001 From: Philippe Serhal Date: Fri, 11 Oct 2024 12:02:08 -0400 Subject: [PATCH 2/2] chore(netlify): use @netlify/blobs types --- package.json | 4 ++-- pnpm-lock.yaml | 10 +++++----- src/drivers/netlify-blobs.ts | 32 ++++++++++++++------------------ 3 files changed, 21 insertions(+), 25 deletions(-) diff --git a/package.json b/package.json index 0d20aab5..c46320dc 100644 --- a/package.json +++ b/package.json @@ -64,7 +64,7 @@ "@azure/storage-blob": "^12.24.0", "@capacitor/preferences": "^6.0.2", "@cloudflare/workers-types": "^4.20240903.0", - "@netlify/blobs": "^8.0.1", + "@netlify/blobs": "^8.1.0", "@planetscale/database": "^1.19.0", "@types/ioredis-mock": "^8.2.5", "@types/jsdom": "^21.1.7", @@ -105,7 +105,7 @@ "@azure/keyvault-secrets": "^4.8.0", "@azure/storage-blob": "^12.24.0", "@capacitor/preferences": "^6.0.2", - "@netlify/blobs": "^6.5.0 || ^7.0.0 || ^8.0.0", + "@netlify/blobs": "^6.5.0 || ^7.0.0 || ^8.1.0", "@planetscale/database": "^1.19.0", "@upstash/redis": "^1.34.0", "@vercel/kv": "^1.0.1", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index d50720ab..ba879aad 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -64,8 +64,8 @@ importers: specifier: ^4.20240903.0 version: 4.20240903.0 '@netlify/blobs': - specifier: ^8.0.1 - version: 8.0.1 + specifier: ^8.1.0 + version: 8.1.0 '@planetscale/database': specifier: ^1.19.0 version: 1.19.0 @@ -857,8 +857,8 @@ packages: resolution: {integrity: sha512-N8x7eSLGcmUFNWZRxT1vsHvypzIRgQYdG0rJey/rZCy6zT/30qDt8Joj7FxzGNLSwXbeZqJOMqDurp7ra4hgbw==} engines: {node: '>=14'} - '@netlify/blobs@8.0.1': - resolution: {integrity: sha512-IrZHVqillU0x12eDbsap4Ba6poi+4IdVCYjZa+tA0eD95TaSbSqfw1zNkO27MiKw0pOjPB6+RXFK4pdfOs/qUQ==} + '@netlify/blobs@8.1.0': + resolution: {integrity: sha512-9hIbusvAZjSGBJ42OyFC2AxsEph1LuKQahMWFcPGEIsOqIYHhMRkYA7wSUMhH7naydjNmllpcp3pJLOK4RhFaQ==} engines: {node: ^14.16.0 || >=16.0.0} '@nodelib/fs.scandir@2.1.5': @@ -5110,7 +5110,7 @@ snapshots: transitivePeerDependencies: - supports-color - '@netlify/blobs@8.0.1': {} + '@netlify/blobs@8.1.0': {} '@nodelib/fs.scandir@2.1.5': dependencies: diff --git a/src/drivers/netlify-blobs.ts b/src/drivers/netlify-blobs.ts index c1df8e6b..22edc296 100644 --- a/src/drivers/netlify-blobs.ts +++ b/src/drivers/netlify-blobs.ts @@ -5,6 +5,8 @@ import type { BlobResponseType, SetOptions, ListOptions, + GetStoreOptions, + GetDeployStoreOptions, } from "@netlify/blobs"; import { fetch } from "ofetch"; @@ -12,40 +14,34 @@ const DRIVER_NAME = "netlify-blobs"; type GetOptions = { type?: BlobResponseType }; -export interface NetlifyBaseStoreOptions { - /** The name of the store to use. It is created if needed. This is required except for deploy-scoped stores. */ - name?: string; +export interface ExtraOptions { /** If set to `true`, the store is scoped to the deploy. This means that it is only available from that deploy, and will be deleted or rolled-back alongside it. */ deployScoped?: boolean; - /** Required during builds, where it is available as `constants.SITE_ID`. At runtime this is set automatically. */ - siteID?: string; - /** Required during builds, where it is available as `constants.NETLIFY_API_TOKEN`. At runtime this is set automatically. */ - token?: string; - /** Used for advanced use cases and unit tests */ - apiURL?: string; - /** Used for advanced use cases and unit tests */ - edgeURL?: string; } -export interface NetlifyDeployStoreOptions extends NetlifyBaseStoreOptions { +export interface NetlifyDeployStoreOptions + extends GetDeployStoreOptions, + ExtraOptions { name?: never; deployScoped: true; - deployID?: string; } -export interface NetlifyDeployStoreV8Options extends NetlifyDeployStoreOptions { - // TODO(serhalp) Export this type from @netlify/blobs instead - region?: "us-east-1" | "us-east-2"; +export interface NetlifyDeployStoreLegacyOptions + extends NetlifyDeployStoreOptions { + // Added in v8.0.0. This ensures TS compatibility for older versions. + region?: never; } -export interface NetlifyNamedStoreOptions extends NetlifyBaseStoreOptions { +export interface NetlifyNamedStoreOptions + extends GetStoreOptions, + ExtraOptions { name: string; deployScoped?: false; } export type NetlifyStoreOptions = + | NetlifyDeployStoreLegacyOptions | NetlifyDeployStoreOptions - | NetlifyDeployStoreV8Options | NetlifyNamedStoreOptions; export default defineDriver((options: NetlifyStoreOptions) => {