@alepha/bucket-vercel 0.13.5 → 0.13.7
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { del, head, put } from "@vercel/blob";
|
|
2
|
-
import * as
|
|
2
|
+
import * as typebox3 from "typebox";
|
|
3
3
|
import { Static, StaticDecode as Static$1, StaticEncode, TAny, TArray, TArray as TArray$1, TBoolean, TInteger, TNumber, TObject, TObject as TObject$1, TOptional, TOptionalAdd, TRecord, TSchema, TSchema as TSchema$1, TString, TUnsafe } from "typebox";
|
|
4
4
|
import { Readable } from "node:stream";
|
|
5
5
|
import { ReadableStream as ReadableStream$1 } from "node:stream/web";
|
|
@@ -7,6 +7,7 @@ import { AsyncLocalStorage } from "node:async_hooks";
|
|
|
7
7
|
import { Validator } from "typebox/compile";
|
|
8
8
|
import dayjsDuration from "dayjs/plugin/duration.js";
|
|
9
9
|
import DayjsApi, { Dayjs, ManipulateType, PluginFunc } from "dayjs";
|
|
10
|
+
import "node:fs";
|
|
10
11
|
|
|
11
12
|
//#region ../alepha/src/core/constants/KIND.d.ts
|
|
12
13
|
/**
|
|
@@ -317,7 +318,7 @@ declare class JsonSchemaCodec extends SchemaCodec {
|
|
|
317
318
|
//#endregion
|
|
318
319
|
//#region ../alepha/src/core/providers/SchemaValidator.d.ts
|
|
319
320
|
declare class SchemaValidator {
|
|
320
|
-
protected cache: Map<TSchema, Validator<
|
|
321
|
+
protected cache: Map<TSchema, Validator<typebox3.TProperties, TSchema, unknown, unknown>>;
|
|
321
322
|
/**
|
|
322
323
|
* Validate the value against the provided schema.
|
|
323
324
|
*
|
|
@@ -421,7 +422,7 @@ declare class CodecManager {
|
|
|
421
422
|
//#endregion
|
|
422
423
|
//#region ../alepha/src/core/providers/EventManager.d.ts
|
|
423
424
|
declare class EventManager {
|
|
424
|
-
|
|
425
|
+
logFn?: () => LoggerInterface | undefined;
|
|
425
426
|
/**
|
|
426
427
|
* List of events that can be triggered. Powered by $hook().
|
|
427
428
|
*/
|
|
@@ -467,7 +468,7 @@ declare class StateManager<State$1 extends object = State> {
|
|
|
467
468
|
protected readonly als: AlsProvider;
|
|
468
469
|
protected readonly events: EventManager;
|
|
469
470
|
protected readonly codec: JsonSchemaCodec;
|
|
470
|
-
protected readonly atoms: Map<keyof State$1, Atom<TObject<
|
|
471
|
+
protected readonly atoms: Map<keyof State$1, Atom<TObject<typebox3.TProperties>, string>>;
|
|
471
472
|
protected store: Partial<State$1>;
|
|
472
473
|
constructor(store?: Partial<State$1>);
|
|
473
474
|
getAtoms(context?: boolean): Array<AtomWithValue>;
|
|
@@ -480,8 +481,8 @@ declare class StateManager<State$1 extends object = State> {
|
|
|
480
481
|
/**
|
|
481
482
|
* Set a value in the state
|
|
482
483
|
*/
|
|
483
|
-
set<T extends TAtomObject>(target: Atom<T>, value: AtomStatic<T
|
|
484
|
-
set<Key extends keyof State$1>(target: Key, value: State$1[Key] | undefined): this;
|
|
484
|
+
set<T extends TAtomObject>(target: Atom<T>, value: AtomStatic<T>, options?: SetStateOptions): this;
|
|
485
|
+
set<Key extends keyof State$1>(target: Key, value: State$1[Key] | undefined, options?: SetStateOptions): this;
|
|
485
486
|
/**
|
|
486
487
|
* Mutate a value in the state.
|
|
487
488
|
*/
|
|
@@ -498,7 +499,7 @@ declare class StateManager<State$1 extends object = State> {
|
|
|
498
499
|
/**
|
|
499
500
|
* Push a value to an array in the state
|
|
500
501
|
*/
|
|
501
|
-
push<Key extends keyof OnlyArray<State$1>>(key: Key, value: NonNullable<State$1[Key]> extends Array<infer U> ? U : never): this;
|
|
502
|
+
push<Key extends keyof OnlyArray<State$1>>(key: Key, ...value: Array<NonNullable<State$1[Key]> extends Array<infer U> ? U : never>): this;
|
|
502
503
|
/**
|
|
503
504
|
* Clear all state
|
|
504
505
|
*/
|
|
@@ -509,6 +510,10 @@ declare class StateManager<State$1 extends object = State> {
|
|
|
509
510
|
keys(): (keyof State$1)[];
|
|
510
511
|
}
|
|
511
512
|
type OnlyArray<T extends object> = { [K in keyof T]: NonNullable<T[K]> extends Array<any> ? K : never };
|
|
513
|
+
interface SetStateOptions {
|
|
514
|
+
skipContext?: boolean;
|
|
515
|
+
skipEvents?: boolean;
|
|
516
|
+
}
|
|
512
517
|
//#endregion
|
|
513
518
|
//#region ../alepha/src/core/Alepha.d.ts
|
|
514
519
|
/**
|
|
@@ -665,12 +670,6 @@ declare class Alepha {
|
|
|
665
670
|
* A promise that resolves when the App has started.
|
|
666
671
|
*/
|
|
667
672
|
protected starting?: PromiseWithResolvers<this>;
|
|
668
|
-
/**
|
|
669
|
-
* Initial state of the container.
|
|
670
|
-
*
|
|
671
|
-
* > Used to initialize the StateManager.
|
|
672
|
-
*/
|
|
673
|
-
protected init: Partial<State>;
|
|
674
673
|
/**
|
|
675
674
|
* During the instantiation process, we keep a list of pending instantiations.
|
|
676
675
|
* > It allows us to detect circular dependencies.
|
|
@@ -710,21 +709,21 @@ declare class Alepha {
|
|
|
710
709
|
*
|
|
711
710
|
* Mocked for browser environments.
|
|
712
711
|
*/
|
|
713
|
-
|
|
712
|
+
context: AlsProvider;
|
|
714
713
|
/**
|
|
715
714
|
* Event manager to handle lifecycle events and custom events.
|
|
716
715
|
*/
|
|
717
|
-
|
|
716
|
+
events: EventManager;
|
|
718
717
|
/**
|
|
719
718
|
* State manager to store arbitrary values.
|
|
720
719
|
*/
|
|
721
|
-
|
|
720
|
+
store: StateManager<State>;
|
|
722
721
|
/**
|
|
723
722
|
* Codec manager for encoding and decoding data with different formats.
|
|
724
723
|
*
|
|
725
724
|
* Supports multiple codec formats (JSON, Protobuf, etc.) with a unified interface.
|
|
726
725
|
*/
|
|
727
|
-
|
|
726
|
+
codec: CodecManager;
|
|
728
727
|
/**
|
|
729
728
|
* Get logger instance.
|
|
730
729
|
*/
|
|
@@ -733,7 +732,7 @@ declare class Alepha {
|
|
|
733
732
|
* The environment variables for the App.
|
|
734
733
|
*/
|
|
735
734
|
get env(): Readonly<Env>;
|
|
736
|
-
constructor(
|
|
735
|
+
constructor(state?: Partial<State>);
|
|
737
736
|
set<T extends TAtomObject>(target: Atom<T>, value: AtomStatic<T>): this;
|
|
738
737
|
set<Key extends keyof State>(target: Key, value: State[Key] | undefined): this;
|
|
739
738
|
/**
|
|
@@ -886,6 +885,15 @@ declare class Alepha {
|
|
|
886
885
|
* @return The schema object with environment variables applied.
|
|
887
886
|
*/
|
|
888
887
|
parseEnv<T extends TObject>(schema: T): Static<T>;
|
|
888
|
+
/**
|
|
889
|
+
* Get all environment variable schemas and their parsed values.
|
|
890
|
+
*
|
|
891
|
+
* This is useful for DevTools to display all expected environment variables.
|
|
892
|
+
*/
|
|
893
|
+
getEnvSchemas(): Array<{
|
|
894
|
+
schema: TSchema$1;
|
|
895
|
+
values: Record<string, any>;
|
|
896
|
+
}>;
|
|
889
897
|
/**
|
|
890
898
|
* Dump the current dependency graph of the App.
|
|
891
899
|
*
|
|
@@ -1269,7 +1277,7 @@ declare const envSchema$1: TObject$1<{
|
|
|
1269
1277
|
/**
|
|
1270
1278
|
* Built-in log formats.
|
|
1271
1279
|
* - "json" - JSON format, useful for structured logging and log aggregation. {@link JsonFormatterProvider}
|
|
1272
|
-
* - "pretty" - Simple text format, human-readable, with colors. {@link
|
|
1280
|
+
* - "pretty" - Simple text format, human-readable, with colors. {@link PrettyFormatterProvider}
|
|
1273
1281
|
* - "raw" - Raw format, no formatting, just the message. {@link RawFormatterProvider}
|
|
1274
1282
|
*/
|
|
1275
1283
|
LOG_FORMAT: TOptional<TUnsafe<"json" | "pretty" | "raw">>;
|
|
@@ -2000,4 +2008,5 @@ declare class VercelFileStorageProvider implements FileStorageProvider {
|
|
|
2000
2008
|
*/
|
|
2001
2009
|
declare const AlephaBucketVercel: Service<Module>;
|
|
2002
2010
|
//#endregion
|
|
2003
|
-
export { AlephaBucketVercel, VercelFileStorageProvider };
|
|
2011
|
+
export { AlephaBucketVercel, VercelFileStorageProvider };
|
|
2012
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","names":[],"sources":["../src/providers/VercelBlobProvider.ts","../src/providers/VercelFileStorageProvider.ts","../src/index.ts"],"sourcesContent":["import { del, head, put } from \"@vercel/blob\";\n\nexport class VercelBlobApi {\n put: typeof put = put;\n head: typeof head = head;\n del: typeof del = del;\n}\n","import type { Readable } from \"node:stream\";\nimport {\n $env,\n $hook,\n $inject,\n Alepha,\n AlephaError,\n type FileLike,\n type Static,\n t,\n} from \"alepha\";\nimport {\n $bucket,\n FileNotFoundError,\n type FileStorageProvider,\n} from \"alepha/bucket\";\nimport { DateTimeProvider } from \"alepha/datetime\";\nimport { FileDetector, FileSystemProvider } from \"alepha/file\";\nimport { $logger } from \"alepha/logger\";\nimport { VercelBlobApi } from \"./VercelBlobProvider.ts\";\n\nconst envSchema = t.object({\n BLOB_READ_WRITE_TOKEN: t.text({\n size: \"long\",\n }),\n});\n\ndeclare module \"alepha\" {\n interface Env extends Partial<Static<typeof envSchema>> {}\n}\n\n/**\n * Vercel Blob Storage implementation of File Storage Provider.\n */\nexport class VercelFileStorageProvider implements FileStorageProvider {\n protected readonly log = $logger();\n protected readonly env = $env(envSchema);\n protected readonly alepha = $inject(Alepha);\n protected readonly time = $inject(DateTimeProvider);\n protected readonly fileSystem = $inject(FileSystemProvider);\n protected readonly fileDetector = $inject(FileDetector);\n protected readonly stores: Set<string> = new Set();\n protected readonly vercelBlobApi = $inject(VercelBlobApi);\n\n protected readonly onStart = $hook({\n on: \"start\",\n handler: async () => {\n for (const bucket of this.alepha.primitives($bucket)) {\n if (bucket.provider !== this) {\n continue;\n }\n\n const storeName = this.convertName(bucket.name);\n\n this.log.debug(`Prepare store '${storeName}' ...`);\n\n // Vercel Blob doesn't require explicit store/container creation\n // We just track the store names for reference\n this.stores.add(storeName);\n\n this.log.info(`Blob storage '${bucket.name}' OK`);\n }\n },\n });\n\n public convertName(name: string): string {\n // Convert to a valid path-like name for Vercel Blob\n return name.replaceAll(\"/\", \"-\").toLowerCase();\n }\n\n protected createId(mimeType: string): string {\n const ext = this.fileDetector.getExtensionFromMimeType(mimeType);\n return `${crypto.randomUUID()}.${ext}`;\n }\n\n public async upload(\n bucketName: string,\n file: FileLike,\n fileId?: string,\n ): Promise<string> {\n fileId ??= this.createId(file.type);\n\n this.log.trace(\n `Uploading file '${file.name}' to bucket '${bucketName}' with id '${fileId}'...`,\n );\n\n const storeName = this.convertName(bucketName);\n const pathname = `${storeName}/${fileId}`;\n\n try {\n const contentBuffer = Buffer.from(await file.arrayBuffer());\n\n const result = await this.vercelBlobApi.put(\n pathname,\n contentBuffer as unknown as Readable,\n {\n access: \"public\",\n contentType: file.type || \"application/octet-stream\",\n token: this.env.BLOB_READ_WRITE_TOKEN,\n allowOverwrite: true,\n },\n );\n\n this.log.trace(`File uploaded successfully: ${result.url}`);\n return fileId;\n } catch (error) {\n this.log.error(`Failed to upload file: ${error}`);\n if (error instanceof Error) {\n throw new AlephaError(`Upload failed: ${error.message}`, {\n cause: error,\n });\n }\n\n throw error;\n }\n }\n\n public async download(bucketName: string, fileId: string): Promise<FileLike> {\n this.log.trace(\n `Downloading file '${fileId}' from bucket '${bucketName}'...`,\n );\n\n const storeName = this.convertName(bucketName);\n const pathname = `${storeName}/${fileId}`;\n\n try {\n const headResult = await this.vercelBlobApi.head(pathname, {\n token: this.env.BLOB_READ_WRITE_TOKEN,\n });\n\n if (!headResult) {\n throw new FileNotFoundError(\n `File '${fileId}' not found in bucket '${bucketName}'`,\n );\n }\n\n const response = await fetch(headResult.url);\n\n if (!response.ok) {\n throw new FileNotFoundError(\n `Failed to fetch file: ${response.statusText}`,\n );\n }\n\n const arrayBuffer = await response.arrayBuffer();\n if (!arrayBuffer) {\n throw new FileNotFoundError(\"File not found - empty response body\");\n }\n\n const mimeType = this.fileDetector.getContentType(fileId);\n\n return this.fileSystem.createFile({\n buffer: Buffer.from(arrayBuffer),\n name: fileId,\n type: mimeType,\n });\n } catch (error) {\n if (error instanceof FileNotFoundError) {\n throw error;\n }\n\n this.log.error(`Failed to download file: ${error}`);\n if (error instanceof Error) {\n throw new FileNotFoundError(\"Error downloading file\", { cause: error });\n }\n\n throw error;\n }\n }\n\n public async exists(bucketName: string, fileId: string): Promise<boolean> {\n this.log.trace(\n `Checking existence of file '${fileId}' in bucket '${bucketName}'...`,\n );\n\n const storeName = this.convertName(bucketName);\n const pathname = `${storeName}/${fileId}`;\n\n try {\n const result = await this.vercelBlobApi.head(pathname, {\n token: this.env.BLOB_READ_WRITE_TOKEN,\n });\n return result !== null;\n } catch (error) {\n // Vercel Blob head() throws for non-existent files\n return false;\n }\n }\n\n public async delete(bucketName: string, fileId: string): Promise<void> {\n this.log.trace(`Deleting file '${fileId}' from bucket '${bucketName}'...`);\n\n const storeName = this.convertName(bucketName);\n const pathname = `${storeName}/${fileId}`;\n\n try {\n await this.vercelBlobApi.del(pathname, {\n token: this.env.BLOB_READ_WRITE_TOKEN,\n });\n } catch (error) {\n this.log.error(`Failed to delete file: ${error}`);\n if (error instanceof Error) {\n throw new FileNotFoundError(\"Error deleting file\", { cause: error });\n }\n throw error;\n }\n }\n}\n","import { $module } from \"alepha\";\nimport { AlephaBucket, FileStorageProvider } from \"alepha/bucket\";\nimport { VercelFileStorageProvider } from \"./providers/VercelFileStorageProvider.ts\";\n\n// ---------------------------------------------------------------------------------------------------------------------\n\nexport * from \"./providers/VercelFileStorageProvider.ts\";\n\n// ---------------------------------------------------------------------------------------------------------------------\n\n/**\n * Plugin for Alepha Bucket that provides Vercel Blob Storage capabilities.\n *\n * @see {@link VercelFileStorageProvider}\n * @module alepha.bucket.vercel\n */\nexport const AlephaBucketVercel = $module({\n name: \"alepha.bucket.vercel\",\n services: [VercelFileStorageProvider],\n register: (alepha) =>\n alepha\n .with({\n optional: true,\n provide: FileStorageProvider,\n use: VercelFileStorageProvider,\n })\n .with(AlephaBucket),\n});\n"],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -10,7 +10,7 @@
|
|
|
10
10
|
"blob"
|
|
11
11
|
],
|
|
12
12
|
"author": "Nicolas Foures",
|
|
13
|
-
"version": "0.13.
|
|
13
|
+
"version": "0.13.7",
|
|
14
14
|
"type": "module",
|
|
15
15
|
"engines": {
|
|
16
16
|
"node": ">=22.0.0"
|
|
@@ -26,13 +26,13 @@
|
|
|
26
26
|
"@vercel/blob": "^2.0.0"
|
|
27
27
|
},
|
|
28
28
|
"devDependencies": {
|
|
29
|
-
"@types/node": "^
|
|
30
|
-
"alepha": "0.13.
|
|
31
|
-
"tsdown": "^0.17.
|
|
29
|
+
"@types/node": "^25.0.0",
|
|
30
|
+
"alepha": "0.13.7",
|
|
31
|
+
"tsdown": "^0.17.2",
|
|
32
32
|
"vitest": "^4.0.15"
|
|
33
33
|
},
|
|
34
34
|
"peerDependencies": {
|
|
35
|
-
"alepha": "0.13.
|
|
35
|
+
"alepha": "0.13.7"
|
|
36
36
|
},
|
|
37
37
|
"scripts": {
|
|
38
38
|
"lint": "alepha lint",
|