@visulima/storage 1.0.0-alpha.27 → 1.0.0-alpha.28

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.
Files changed (47) hide show
  1. package/CHANGELOG.md +11 -0
  2. package/dist/adapter/nuxt/module.d.ts +4 -4
  3. package/dist/ai/ai-sdk/index.d.ts +3 -3
  4. package/dist/ai/claude/index.d.ts +2 -2
  5. package/dist/ai/openai/index.d.ts +3 -3
  6. package/dist/ai/tanstack/index.d.ts +2 -2
  7. package/dist/handler/http/fetch/index.d.ts +7 -7
  8. package/dist/handler/http/hono/index.d.ts +4 -4
  9. package/dist/handler/http/nextjs/index.d.ts +4 -4
  10. package/dist/handler/http/node/index.d.ts +7 -7
  11. package/dist/handler/http/solid-start/index.d.ts +4 -4
  12. package/dist/index.d.ts +5 -5
  13. package/dist/index.js +1 -1
  14. package/dist/packem_shared/{Files-B7hlJcB4.js → Files-BhvjnhTE.js} +1 -1
  15. package/dist/packem_shared/{GCSMetaStorage-CqP9ifYB.js → GCSMetaStorage-Cm_Pse62.js} +1 -1
  16. package/dist/packem_shared/{GCStorage-XSBKVx90.js → GCStorage-CNCPTaGF.js} +1 -1
  17. package/dist/packem_shared/{disk-storage-with-checksum.d-BQMXA4Wl.d.ts → disk-storage-with-checksum.d-8gCPEZZC.d.ts} +1 -1
  18. package/dist/packem_shared/{executors.d-UtkeCbk1.d.ts → executors.d-DgroC6pk.d.ts} +1 -1
  19. package/dist/packem_shared/{gcs-meta-storage-XB-UPJn6.js → gcs-meta-storage-DibQBpU8.js} +1 -1
  20. package/dist/packem_shared/{index.d-DotjipuX.d.ts → index.d-CKaAalRr.d.ts} +7 -2
  21. package/dist/packem_shared/{local-meta-storage.d-B5R1nswK.d.ts → local-meta-storage.d-KWaPZTSN.d.ts} +1 -1
  22. package/dist/packem_shared/{media-transformer.d-DK7NJncf.d.ts → media-transformer.d-Dt9W_its.d.ts} +2 -2
  23. package/dist/packem_shared/{s3-base-storage.d-BROGYJ4F.d.ts → s3-base-storage.d-DTxJKx3M.d.ts} +1 -1
  24. package/dist/packem_shared/{storage.d-Cr6f2lac.d.ts → storage.d-D9YA4MRs.d.ts} +1 -1
  25. package/dist/packem_shared/{tus-base.d-4-ZfDQwl.d.ts → tus-base.d-BeCT7hH6.d.ts} +3 -3
  26. package/dist/packem_shared/{types.d-BgCmSE94.d.ts → types.d-CBvMCJmv.d.ts} +2 -2
  27. package/dist/packem_shared/{types.d-C8eSxqX9.d.ts → types.d-P2Kxr4cB.d.ts} +2 -2
  28. package/dist/storage/aws/index.d.ts +2 -2
  29. package/dist/storage/aws-light/index.d.ts +2 -2
  30. package/dist/storage/azure/index.d.ts +1 -1
  31. package/dist/storage/box/index.d.ts +2 -2
  32. package/dist/storage/bunny/index.d.ts +3 -3
  33. package/dist/storage/dropbox/index.d.ts +3 -3
  34. package/dist/storage/gcs/index.d.ts +1 -1
  35. package/dist/storage/gcs/index.js +1 -1
  36. package/dist/storage/google-drive/index.d.ts +2 -2
  37. package/dist/storage/local/index.d.ts +3 -3
  38. package/dist/storage/netlify-blob/index.d.ts +2 -2
  39. package/dist/storage/onedrive/index.d.ts +2 -2
  40. package/dist/storage/supabase/index.d.ts +2 -2
  41. package/dist/storage/uploadthing/index.d.ts +3 -3
  42. package/dist/storage/vercel-blob/index.d.ts +2 -2
  43. package/dist/transformer/audio-transformer.d.ts +2 -2
  44. package/dist/transformer/image-transformer.d.ts +2 -2
  45. package/dist/transformer/index.d.ts +3 -3
  46. package/dist/transformer/video-transformer.d.ts +2 -2
  47. package/package.json +1 -1
package/CHANGELOG.md CHANGED
@@ -1,3 +1,14 @@
1
+ ## @visulima/storage [1.0.0-alpha.28](https://github.com/visulima/visulima/compare/@visulima/storage@1.0.0-alpha.27...@visulima/storage@1.0.0-alpha.28) (2026-05-16)
2
+
3
+ ### Features
4
+
5
+ * **storage:** add exists() to Files facade ([#633](https://github.com/visulima/visulima/issues/633)) ([86893da](https://github.com/visulima/visulima/commit/86893da4f462b652e6b5821a4eece997f9f9890d))
6
+
7
+
8
+ ### Dependencies
9
+
10
+ * **@visulima/fs:** upgraded to 5.0.0-alpha.23
11
+
1
12
  ## @visulima/storage [1.0.0-alpha.27](https://github.com/visulima/visulima/compare/@visulima/storage@1.0.0-alpha.26...@visulima/storage@1.0.0-alpha.27) (2026-05-14)
2
13
 
3
14
  ### Features
@@ -1,11 +1,11 @@
1
- import { U as UploadOptions } from "../../packem_shared/types.d-BgCmSE94.js";
2
- import { U as UploadFile, B as BaseStorage } from "../../packem_shared/storage.d-Cr6f2lac.js";
1
+ import { U as UploadOptions } from "../../packem_shared/types.d-CBvMCJmv.js";
2
+ import { U as UploadFile, B as BaseStorage } from "../../packem_shared/storage.d-D9YA4MRs.js";
3
3
  import 'node:stream';
4
4
  import 'node:events';
5
5
  import 'node:http';
6
6
  import '@visulima/pagination';
7
- import "../../packem_shared/media-transformer.d-DK7NJncf.js";
8
- import "../../packem_shared/types.d-C8eSxqX9.js";
7
+ import "../../packem_shared/media-transformer.d-Dt9W_its.js";
8
+ import "../../packem_shared/types.d-P2Kxr4cB.js";
9
9
  import 'node:crypto';
10
10
  import 'lru-cache';
11
11
  /**
@@ -1,9 +1,9 @@
1
- import { F as Files } from "../../packem_shared/index.d-DotjipuX.js";
1
+ import { F as Files } from "../../packem_shared/index.d-CKaAalRr.js";
2
2
  import { C as CopyFileInput, D as DeleteFileInput, a as DownloadFileInput, G as GetFileMetadataInput, b as GetFileUrlInput, L as ListFilesInput, S as SignUploadUrlInput, U as UploadFileInput, F as FileToolName, A as ApprovalConfig, c as FileReadToolName } from "../../packem_shared/approval.d-CMAYH9GF.js";
3
3
  export { type d as FileWriteToolName } from "../../packem_shared/approval.d-CMAYH9GF.js";
4
4
  import { Tool } from 'ai';
5
- import { e as executors } from "../../packem_shared/executors.d-UtkeCbk1.js";
6
- import "../../packem_shared/storage.d-Cr6f2lac.js";
5
+ import { e as executors } from "../../packem_shared/executors.d-DgroC6pk.js";
6
+ import "../../packem_shared/storage.d-D9YA4MRs.js";
7
7
  import 'node:stream';
8
8
  import 'node:crypto';
9
9
  import 'node:http';
@@ -1,8 +1,8 @@
1
1
  import { SdkMcpToolDefinition, CanUseTool, McpSdkServerConfigWithInstance } from '@anthropic-ai/claude-agent-sdk';
2
- import { F as Files } from "../../packem_shared/index.d-DotjipuX.js";
2
+ import { F as Files } from "../../packem_shared/index.d-CKaAalRr.js";
3
3
  import { T as TOOL_SCHEMAS, F as FileToolName, A as ApprovalConfig } from "../../packem_shared/approval.d-CMAYH9GF.js";
4
4
  export { type c as FileReadToolName, type d as FileWriteToolName } from "../../packem_shared/approval.d-CMAYH9GF.js";
5
- import "../../packem_shared/storage.d-Cr6f2lac.js";
5
+ import "../../packem_shared/storage.d-D9YA4MRs.js";
6
6
  import 'node:stream';
7
7
  import 'node:crypto';
8
8
  import 'node:http';
@@ -1,10 +1,10 @@
1
1
  import { T as TOOL_SCHEMAS, F as FileToolName, A as ApprovalConfig, c as FileReadToolName } from "../../packem_shared/approval.d-CMAYH9GF.js";
2
2
  export { type d as FileWriteToolName } from "../../packem_shared/approval.d-CMAYH9GF.js";
3
3
  import { UnknownContext, FunctionTool } from '@openai/agents';
4
- import { F as Files } from "../../packem_shared/index.d-DotjipuX.js";
5
- import { e as executors } from "../../packem_shared/executors.d-UtkeCbk1.js";
4
+ import { F as Files } from "../../packem_shared/index.d-CKaAalRr.js";
5
+ import { e as executors } from "../../packem_shared/executors.d-DgroC6pk.js";
6
6
  import 'zod';
7
- import "../../packem_shared/storage.d-Cr6f2lac.js";
7
+ import "../../packem_shared/storage.d-D9YA4MRs.js";
8
8
  import 'node:stream';
9
9
  import 'node:crypto';
10
10
  import 'node:http';
@@ -1,8 +1,8 @@
1
- import { F as Files } from "../../packem_shared/index.d-DotjipuX.js";
1
+ import { F as Files } from "../../packem_shared/index.d-CKaAalRr.js";
2
2
  import { T as TOOL_SCHEMAS, c as FileReadToolName, F as FileToolName, A as ApprovalConfig } from "../../packem_shared/approval.d-CMAYH9GF.js";
3
3
  export { type d as FileWriteToolName } from "../../packem_shared/approval.d-CMAYH9GF.js";
4
4
  import { ServerTool } from '@tanstack/ai';
5
- import "../../packem_shared/storage.d-Cr6f2lac.js";
5
+ import "../../packem_shared/storage.d-D9YA4MRs.js";
6
6
  import 'node:stream';
7
7
  import 'node:crypto';
8
8
  import 'node:http';
@@ -1,16 +1,16 @@
1
- import { U as UploadFile, K as UploadResponse } from "../../../packem_shared/storage.d-Cr6f2lac.js";
1
+ import { U as UploadFile, J as UploadResponse } from "../../../packem_shared/storage.d-D9YA4MRs.js";
2
2
  import 'node:stream';
3
- import { H as Handlers, R as ResponseFile, a as ResponseList, U as UploadOptions } from "../../../packem_shared/types.d-BgCmSE94.js";
4
- export { type A as AsyncHandler, type B as BaseHandler, type M as MethodHandler, type b as RequestEvent, type c as UploadErrorEvent, type d as UploadEvent } from "../../../packem_shared/types.d-BgCmSE94.js";
5
- import { B as BaseHandlerCore } from "../../../packem_shared/tus-base.d-4-ZfDQwl.js";
6
- export { T as TUS_RESUMABLE, a as TUS_VERSION } from "../../../packem_shared/tus-base.d-4-ZfDQwl.js";
3
+ import { H as Handlers, R as ResponseFile, a as ResponseList, U as UploadOptions } from "../../../packem_shared/types.d-CBvMCJmv.js";
4
+ export { type A as AsyncHandler, type B as BaseHandler, type M as MethodHandler, type b as RequestEvent, type c as UploadErrorEvent, type d as UploadEvent } from "../../../packem_shared/types.d-CBvMCJmv.js";
5
+ import { B as BaseHandlerCore } from "../../../packem_shared/tus-base.d-BeCT7hH6.js";
6
+ export { T as TUS_RESUMABLE, a as TUS_VERSION } from "../../../packem_shared/tus-base.d-BeCT7hH6.js";
7
7
  import 'node:crypto';
8
8
  import 'node:http';
9
9
  import 'lru-cache';
10
10
  import 'node:events';
11
11
  import '@visulima/pagination';
12
- import "../../../packem_shared/media-transformer.d-DK7NJncf.js";
13
- import "../../../packem_shared/types.d-C8eSxqX9.js";
12
+ import "../../../packem_shared/media-transformer.d-Dt9W_its.js";
13
+ import "../../../packem_shared/types.d-P2Kxr4cB.js";
14
14
  /**
15
15
  * Base handler for Web API Fetch platform (Request/Response).
16
16
  * Extends BaseHandlerCore with Fetch-specific request/response handling.
@@ -1,14 +1,14 @@
1
1
  import { Hono } from 'hono';
2
- import { U as UploadFile } from "../../../packem_shared/storage.d-Cr6f2lac.js";
2
+ import { U as UploadFile } from "../../../packem_shared/storage.d-D9YA4MRs.js";
3
3
  import 'node:stream';
4
- import { U as UploadOptions } from "../../../packem_shared/types.d-BgCmSE94.js";
4
+ import { U as UploadOptions } from "../../../packem_shared/types.d-CBvMCJmv.js";
5
5
  import 'node:crypto';
6
6
  import 'node:http';
7
7
  import 'lru-cache';
8
8
  import 'node:events';
9
9
  import '@visulima/pagination';
10
- import "../../../packem_shared/media-transformer.d-DK7NJncf.js";
11
- import "../../../packem_shared/types.d-C8eSxqX9.js";
10
+ import "../../../packem_shared/media-transformer.d-Dt9W_its.js";
11
+ import "../../../packem_shared/types.d-P2Kxr4cB.js";
12
12
  /**
13
13
  * Registers upload handler routes on a Hono app instance.
14
14
  * Automatically registers all required HTTP methods for the specified handler type.
@@ -1,14 +1,14 @@
1
1
  import { NextRequest, NextResponse } from 'next/server.js';
2
- import { U as UploadFile } from "../../../packem_shared/storage.d-Cr6f2lac.js";
2
+ import { U as UploadFile } from "../../../packem_shared/storage.d-D9YA4MRs.js";
3
3
  import 'node:stream';
4
- import { U as UploadOptions } from "../../../packem_shared/types.d-BgCmSE94.js";
4
+ import { U as UploadOptions } from "../../../packem_shared/types.d-CBvMCJmv.js";
5
5
  import 'node:crypto';
6
6
  import 'node:http';
7
7
  import 'lru-cache';
8
8
  import 'node:events';
9
9
  import '@visulima/pagination';
10
- import "../../../packem_shared/media-transformer.d-DK7NJncf.js";
11
- import "../../../packem_shared/types.d-C8eSxqX9.js";
10
+ import "../../../packem_shared/media-transformer.d-Dt9W_its.js";
11
+ import "../../../packem_shared/types.d-P2Kxr4cB.js";
12
12
  /**
13
13
  * Configuration for Next.js handler.
14
14
  */
@@ -1,16 +1,16 @@
1
1
  import { IncomingMessage, ServerResponse } from 'node:http';
2
- import { U as UploadFile, K as UploadResponse } from "../../../packem_shared/storage.d-Cr6f2lac.js";
2
+ import { U as UploadFile, J as UploadResponse } from "../../../packem_shared/storage.d-D9YA4MRs.js";
3
3
  import { Readable } from 'node:stream';
4
- import { H as Handlers, A as AsyncHandler, U as UploadOptions, R as ResponseFile, a as ResponseList, M as MethodHandler } from "../../../packem_shared/types.d-BgCmSE94.js";
5
- export { type B as BaseHandler, type b as RequestEvent, type c as UploadErrorEvent, type d as UploadEvent } from "../../../packem_shared/types.d-BgCmSE94.js";
6
- import { B as BaseHandlerCore } from "../../../packem_shared/tus-base.d-4-ZfDQwl.js";
7
- export { T as TUS_RESUMABLE, a as TUS_VERSION } from "../../../packem_shared/tus-base.d-4-ZfDQwl.js";
4
+ import { H as Handlers, A as AsyncHandler, U as UploadOptions, R as ResponseFile, a as ResponseList, M as MethodHandler } from "../../../packem_shared/types.d-CBvMCJmv.js";
5
+ export { type B as BaseHandler, type b as RequestEvent, type c as UploadErrorEvent, type d as UploadEvent } from "../../../packem_shared/types.d-CBvMCJmv.js";
6
+ import { B as BaseHandlerCore } from "../../../packem_shared/tus-base.d-BeCT7hH6.js";
7
+ export { T as TUS_RESUMABLE, a as TUS_VERSION } from "../../../packem_shared/tus-base.d-BeCT7hH6.js";
8
8
  import 'node:crypto';
9
9
  import 'lru-cache';
10
10
  import 'node:events';
11
11
  import '@visulima/pagination';
12
- import "../../../packem_shared/media-transformer.d-DK7NJncf.js";
13
- import "../../../packem_shared/types.d-C8eSxqX9.js";
12
+ import "../../../packem_shared/media-transformer.d-Dt9W_its.js";
13
+ import "../../../packem_shared/types.d-P2Kxr4cB.js";
14
14
  /**
15
15
  * Base handler for Node.js platform (IncomingMessage/ServerResponse).
16
16
  * Extends BaseHandlerCore with Node.js-specific request/response handling.
@@ -1,14 +1,14 @@
1
1
  import { APIEvent } from '@solidjs/start/server';
2
- import { U as UploadFile } from "../../../packem_shared/storage.d-Cr6f2lac.js";
2
+ import { U as UploadFile } from "../../../packem_shared/storage.d-D9YA4MRs.js";
3
3
  import 'node:stream';
4
- import { U as UploadOptions } from "../../../packem_shared/types.d-BgCmSE94.js";
4
+ import { U as UploadOptions } from "../../../packem_shared/types.d-CBvMCJmv.js";
5
5
  import 'node:crypto';
6
6
  import 'node:http';
7
7
  import 'lru-cache';
8
8
  import 'node:events';
9
9
  import '@visulima/pagination';
10
- import "../../../packem_shared/media-transformer.d-DK7NJncf.js";
11
- import "../../../packem_shared/types.d-C8eSxqX9.js";
10
+ import "../../../packem_shared/media-transformer.d-Dt9W_its.js";
11
+ import "../../../packem_shared/types.d-P2Kxr4cB.js";
12
12
  /**
13
13
  * Configuration for SolidStart handler.
14
14
  */
package/dist/index.d.ts CHANGED
@@ -1,9 +1,9 @@
1
- export { type D as DownloadResult, type a as FileBody, type b as FileObject, F as Files, type c as FilesOptions, type L as ListOptions, type S as SignedReadUrlOptions, type d as SignedUploadUrlOptions, type U as UploadOptions } from "./packem_shared/index.d-DotjipuX.js";
2
- import { k as Metrics } from "./packem_shared/storage.d-Cr6f2lac.js";
3
- export { B as AbstractBaseStorage, type l as BaseStorageOptions, type m as BatchOperationResponse, type n as BatchOperationResult, type D as DiskStorageOptions, type h as DiskStorageWithChecksumOptions, E as ERRORS, o as ErrorMap, type p as ExpirationOptions, F as File, type e as FileInit, type f as FilePart, type g as FileQuery, type q as Header, type r as Headers, type H as HttpError, type s as HttpErrorBody, type I as IncomingMessageWithBody, type L as LocalMetaStorageOptions, M as MetaStorage, type t as MetaStorageOptions, u as Metadata, type O as OnComplete, type v as OnCreate, type w as OnDelete, type x as OnError, type y as OnUpdate, type P as PurgeList, type z as RangeChecksum, type A as RangeHasher, type G as ResponseBody, type i as ResponseBodyType, type J as ResponseTuple, type R as RetryConfig, b as UploadError, type c as UploadEventType, type U as UploadFile, type K as UploadResponse, type V as Validation, type N as ValidationError, type Q as ValidatorConfig, d as createRetryWrapper, S as defaultCloudStorageFileNameValidation, T as defaultFilesystemFileNameValidation, W as extractHttpStatus, X as isRetryableError, Y as isUploadError, Z as mapStatusToErrorCode, _ as retry, $ as throwErrorCode, a0 as wrapStorageError } from "./packem_shared/storage.d-Cr6f2lac.js";
1
+ export { type D as DownloadResult, type a as FileBody, type b as FileObject, F as Files, type c as FilesOptions, type L as ListOptions, type S as SignedReadUrlOptions, type d as SignedUploadUrlOptions, type U as UploadOptions } from "./packem_shared/index.d-CKaAalRr.js";
2
+ import { k as Metrics } from "./packem_shared/storage.d-D9YA4MRs.js";
3
+ export { B as AbstractBaseStorage, type l as BaseStorageOptions, type m as BatchOperationResponse, type n as BatchOperationResult, type D as DiskStorageOptions, type h as DiskStorageWithChecksumOptions, E as ERRORS, o as ErrorMap, type p as ExpirationOptions, F as File, type e as FileInit, type f as FilePart, type g as FileQuery, type q as Header, type r as Headers, type H as HttpError, type s as HttpErrorBody, type I as IncomingMessageWithBody, type L as LocalMetaStorageOptions, M as MetaStorage, type t as MetaStorageOptions, u as Metadata, type O as OnComplete, type v as OnCreate, type w as OnDelete, type x as OnError, type y as OnUpdate, type P as PurgeList, type z as RangeChecksum, type A as RangeHasher, type C as ResponseBody, type i as ResponseBodyType, type G as ResponseTuple, type R as RetryConfig, b as UploadError, type c as UploadEventType, type U as UploadFile, type J as UploadResponse, type V as Validation, type K as ValidationError, type N as ValidatorConfig, d as createRetryWrapper, Q as defaultCloudStorageFileNameValidation, S as defaultFilesystemFileNameValidation, T as extractHttpStatus, W as isRetryableError, X as isUploadError, Y as mapStatusToErrorCode, Z as retry, _ as throwErrorCode, $ as wrapStorageError } from "./packem_shared/storage.d-D9YA4MRs.js";
4
4
  import { Meter } from '@opentelemetry/api';
5
- export { D as DiskStorage, a as DiskStorageWithChecksum } from "./packem_shared/disk-storage-with-checksum.d-BQMXA4Wl.js";
6
- export { L as LocalMetaStorage } from "./packem_shared/local-meta-storage.d-B5R1nswK.js";
5
+ export { D as DiskStorage, a as DiskStorageWithChecksum } from "./packem_shared/disk-storage-with-checksum.d-8gCPEZZC.js";
6
+ export { L as LocalMetaStorage } from "./packem_shared/local-meta-storage.d-KWaPZTSN.js";
7
7
  export { type AnyWebReadableByteStreamWithFileType, type AnyWebReadableStream, type Detector, type FileTypeOptions, type FileTypeParser, type FileTypeResult, type StreamOptions, type TokenizerPositionError, fileTypeFromBlob, fileTypeFromBuffer, fileTypeFromTokenizer, supportedExtensions, supportedMimeTypes } from 'file-type';
8
8
  import 'node:stream';
9
9
  import 'node:crypto';
package/dist/index.js CHANGED
@@ -1 +1 @@
1
- import{Files as o}from"./packem_shared/Files-B7hlJcB4.js";import{waitForStorage as a}from"./packem_shared/waitForStorage-ChSBLhLc.js";import{f as s}from"./packem_shared/disk-storage-CbSSPnOf.js";import{default as l}from"./packem_shared/DiskStorageWithChecksum-CbXWpSOr.js";import{v as i}from"./packem_shared/local-meta-storage-CT1audnK.js";import{default as x}from"./packem_shared/MetaStorage-Y4m1dWgd.js";import{B as S,d as y,a as E}from"./packem_shared/storage-CoyB2O-Y.js";import{ERRORS as g,ErrorMap as c,UploadError as M,extractHttpStatus as T,isUploadError as n,mapStatusToErrorCode as R,throwErrorCode as k,wrapStorageError as B}from"./packem_shared/ERRORS-CyOuSMLY.js";import{createRetryWrapper as b,isRetryableError as h,retry as w}from"./packem_shared/isRetryableError-B6ZS_-5I.js";import{fileTypeFromBlob as O,fileTypeFromBuffer as D,fileTypeFromTokenizer as U,supportedExtensions as V,supportedMimeTypes as W}from"file-type";import{default as z}from"./packem_shared/File-BhfUgJjs.js";import{default as H}from"./packem_shared/NoOpMetrics-Dky06sf1.js";import{default as j}from"./packem_shared/OpenTelemetryMetrics-9uxQMSlg.js";import{Metadata as G}from"./packem_shared/Metadata-B6Ir0KO7.js";export{S as AbstractBaseStorage,s as DiskStorage,l as DiskStorageWithChecksum,g as ERRORS,c as ErrorMap,z as File,o as Files,i as LocalMetaStorage,x as MetaStorage,G as Metadata,H as NoOpMetrics,j as OpenTelemetryMetrics,M as UploadError,b as createRetryWrapper,y as defaultCloudStorageFileNameValidation,E as defaultFilesystemFileNameValidation,T as extractHttpStatus,O as fileTypeFromBlob,D as fileTypeFromBuffer,U as fileTypeFromTokenizer,h as isRetryableError,n as isUploadError,R as mapStatusToErrorCode,w as retry,V as supportedExtensions,W as supportedMimeTypes,k as throwErrorCode,a as waitForStorage,B as wrapStorageError};
1
+ import{Files as o}from"./packem_shared/Files-BhvjnhTE.js";import{waitForStorage as a}from"./packem_shared/waitForStorage-ChSBLhLc.js";import{f as s}from"./packem_shared/disk-storage-CbSSPnOf.js";import{default as l}from"./packem_shared/DiskStorageWithChecksum-CbXWpSOr.js";import{v as i}from"./packem_shared/local-meta-storage-CT1audnK.js";import{default as x}from"./packem_shared/MetaStorage-Y4m1dWgd.js";import{B as S,d as y,a as E}from"./packem_shared/storage-CoyB2O-Y.js";import{ERRORS as g,ErrorMap as c,UploadError as M,extractHttpStatus as T,isUploadError as n,mapStatusToErrorCode as R,throwErrorCode as k,wrapStorageError as B}from"./packem_shared/ERRORS-CyOuSMLY.js";import{createRetryWrapper as b,isRetryableError as h,retry as w}from"./packem_shared/isRetryableError-B6ZS_-5I.js";import{fileTypeFromBlob as O,fileTypeFromBuffer as D,fileTypeFromTokenizer as U,supportedExtensions as V,supportedMimeTypes as W}from"file-type";import{default as z}from"./packem_shared/File-BhfUgJjs.js";import{default as H}from"./packem_shared/NoOpMetrics-Dky06sf1.js";import{default as j}from"./packem_shared/OpenTelemetryMetrics-9uxQMSlg.js";import{Metadata as G}from"./packem_shared/Metadata-B6Ir0KO7.js";export{S as AbstractBaseStorage,s as DiskStorage,l as DiskStorageWithChecksum,g as ERRORS,c as ErrorMap,z as File,o as Files,i as LocalMetaStorage,x as MetaStorage,G as Metadata,H as NoOpMetrics,j as OpenTelemetryMetrics,M as UploadError,b as createRetryWrapper,y as defaultCloudStorageFileNameValidation,E as defaultFilesystemFileNameValidation,T as extractHttpStatus,O as fileTypeFromBlob,D as fileTypeFromBuffer,U as fileTypeFromTokenizer,h as isRetryableError,n as isUploadError,R as mapStatusToErrorCode,w as retry,V as supportedExtensions,W as supportedMimeTypes,k as throwErrorCode,a as waitForStorage,B as wrapStorageError};
@@ -1 +1 @@
1
- var b=Object.defineProperty;var c=(e,t)=>b(e,"name",{value:t,configurable:!0});import{Readable as n}from"node:stream";import{B as i}from"./storage-CoyB2O-Y.js";var g=Object.defineProperty,o=c((e,t)=>g(e,"name",{value:t,configurable:!0}),"f");const h=o(e=>typeof e=="object"&&e!==null&&typeof e.getReader=="function","isWebReadableStream"),z=o(e=>typeof e=="object"&&e!==null&&typeof e.pipe=="function"&&typeof e.read=="function","isNodeReadable"),w=o(async(e,t)=>{if(typeof e=="string"){const a=Buffer.from(e);return{size:a.byteLength,stream:n.from(a)}}if(Buffer.isBuffer(e))return{size:e.byteLength,stream:n.from(e)};if(e instanceof Uint8Array){const a=Buffer.from(e.buffer,e.byteOffset,e.byteLength);return{size:a.byteLength,stream:n.from(a)}}if(e instanceof ArrayBuffer){const a=Buffer.from(e);return{size:a.byteLength,stream:n.from(a)}}if(ArrayBuffer.isView(e)){const a=e,r=Buffer.from(a.buffer,a.byteOffset,a.byteLength);return{size:r.byteLength,stream:n.from(r)}}if(typeof Blob<"u"&&e instanceof Blob)return{size:e.size,stream:n.fromWeb(e.stream())};if(h(e))return{size:t,stream:n.fromWeb(e)};if(z(e))return{size:t,stream:e};throw new TypeError(`Unsupported body type: ${Object.prototype.toString.call(e)}`)},"normalizeBody"),d=o((e,t)=>({contentType:e.contentType??"application/octet-stream",etag:e.ETag,key:e.name||e.id||t||"",lastModified:e.modifiedAt??e.createdAt,metadata:e.metadata,size:typeof e.size=="number"?e.size:void 0}),"toFileObject");class I{static{c(this,"Files")}static{o(this,"Files")}adapter;constructor(t){this.adapter=t.adapter}get raw(){return this.adapter.raw}async upload(t,a,r={}){i.assertSafeId(t);const{size:s,stream:p}=await w(a,r.size),f=r.size??s,y={...r.metadata??{},name:t,...r.contentType?{type:r.contentType}:{},...f===void 0?{}:{size:f}},m=await this.adapter.create({contentType:r.contentType,id:t,metadata:y,originalName:t,size:f,storageClass:r.storageClass}),u={body:p,contentLength:f,id:m.id,start:0},l=await this.adapter.write(u);return d(l,t)}async download(t){i.assertSafeId(t);const a=await this.adapter.get({id:t});return{body:a.content,contentType:a.contentType??"application/octet-stream",etag:a.ETag,key:t,lastModified:a.modifiedAt,metadata:a.metadata,size:typeof a.size=="number"?a.size:void 0}}async head(t){i.assertSafeId(t);const a=await this.adapter.getMeta(t);return d(a,t)}async delete(t){i.assertSafeId(t),await this.adapter.delete({id:t})}async copy(t,a,r){i.assertSafeId(t),i.assertSafeId(a);const s=await this.adapter.copy(t,a,r);return d(s,a)}async list(t={}){const a=(await this.adapter.list(t.limit??1e3)).map(r=>{const s=d(r);return s.key.startsWith("/")&&(s.key=s.key.slice(1)),s});return t.prefix?a.filter(r=>r.key.startsWith(t.prefix)):a}async url(t,a){return i.assertSafeId(t),this.adapter.getReadUrl(t,a)}async signedUploadUrl(t,a){return i.assertSafeId(t),this.adapter.getUploadUrl(t,a)}}export{I as Files,I as default};
1
+ var b=Object.defineProperty;var c=(e,t)=>b(e,"name",{value:t,configurable:!0});import{Readable as n}from"node:stream";import{B as s}from"./storage-CoyB2O-Y.js";var g=Object.defineProperty,o=c((e,t)=>g(e,"name",{value:t,configurable:!0}),"f");const h=o(e=>typeof e=="object"&&e!==null&&typeof e.getReader=="function","isWebReadableStream"),z=o(e=>typeof e=="object"&&e!==null&&typeof e.pipe=="function"&&typeof e.read=="function","isNodeReadable"),w=o(async(e,t)=>{if(typeof e=="string"){const a=Buffer.from(e);return{size:a.byteLength,stream:n.from(a)}}if(Buffer.isBuffer(e))return{size:e.byteLength,stream:n.from(e)};if(e instanceof Uint8Array){const a=Buffer.from(e.buffer,e.byteOffset,e.byteLength);return{size:a.byteLength,stream:n.from(a)}}if(e instanceof ArrayBuffer){const a=Buffer.from(e);return{size:a.byteLength,stream:n.from(a)}}if(ArrayBuffer.isView(e)){const a=e,r=Buffer.from(a.buffer,a.byteOffset,a.byteLength);return{size:r.byteLength,stream:n.from(r)}}if(typeof Blob<"u"&&e instanceof Blob)return{size:e.size,stream:n.fromWeb(e.stream())};if(h(e))return{size:t,stream:n.fromWeb(e)};if(z(e))return{size:t,stream:e};throw new TypeError(`Unsupported body type: ${Object.prototype.toString.call(e)}`)},"normalizeBody"),d=o((e,t)=>({contentType:e.contentType??"application/octet-stream",etag:e.ETag,key:e.name||e.id||t||"",lastModified:e.modifiedAt??e.createdAt,metadata:e.metadata,size:typeof e.size=="number"?e.size:void 0}),"toFileObject");class I{static{c(this,"Files")}static{o(this,"Files")}adapter;constructor(t){this.adapter=t.adapter}get raw(){return this.adapter.raw}async upload(t,a,r={}){s.assertSafeId(t);const{size:i,stream:p}=await w(a,r.size),f=r.size??i,y={...r.metadata??{},name:t,...r.contentType?{type:r.contentType}:{},...f===void 0?{}:{size:f}},m=await this.adapter.create({contentType:r.contentType,id:t,metadata:y,originalName:t,size:f,storageClass:r.storageClass}),u={body:p,contentLength:f,id:m.id,start:0},l=await this.adapter.write(u);return d(l,t)}async download(t){s.assertSafeId(t);const a=await this.adapter.get({id:t});return{body:a.content,contentType:a.contentType??"application/octet-stream",etag:a.ETag,key:t,lastModified:a.modifiedAt,metadata:a.metadata,size:typeof a.size=="number"?a.size:void 0}}async head(t){s.assertSafeId(t);const a=await this.adapter.getMeta(t);return d(a,t)}async exists(t){return s.assertSafeId(t),this.adapter.exists({id:t})}async delete(t){s.assertSafeId(t),await this.adapter.delete({id:t})}async copy(t,a,r){s.assertSafeId(t),s.assertSafeId(a);const i=await this.adapter.copy(t,a,r);return d(i,a)}async list(t={}){const a=(await this.adapter.list(t.limit??1e3)).map(r=>{const i=d(r);return i.key.startsWith("/")&&(i.key=i.key.slice(1)),i});return t.prefix?a.filter(r=>r.key.startsWith(t.prefix)):a}async url(t,a){return s.assertSafeId(t),this.adapter.getReadUrl(t,a)}async signedUploadUrl(t,a){return s.assertSafeId(t),this.adapter.getUploadUrl(t,a)}}export{I as Files,I as default};
@@ -1 +1 @@
1
- import"node:crypto";import"gaxios";import"google-auth-library";import{E as f}from"./gcs-meta-storage-XB-UPJn6.js";import"./MetaStorage-Y4m1dWgd.js";import"./Metadata-B6Ir0KO7.js";import"./GCSConfig-BQ0OpVhe.js";export{f as default};
1
+ import"node:crypto";import"gaxios";import"google-auth-library";import{E as f}from"./gcs-meta-storage-DibQBpU8.js";import"./MetaStorage-Y4m1dWgd.js";import"./Metadata-B6Ir0KO7.js";import"./GCSConfig-BQ0OpVhe.js";export{f as default};
@@ -1 +1 @@
1
- var g=Object.defineProperty;var l=(u,t)=>g(u,"name",{value:t,configurable:!0});import{randomUUID as f}from"node:crypto";import{request as y}from"gaxios";import{GoogleAuth as w}from"google-auth-library";import{r as C,E as R,b,g as E,d}from"./gcs-meta-storage-XB-UPJn6.js";import{d as U}from"./detect-file-type-5JhzC9RU.js";import{throwErrorCode as k,ERRORS as $}from"./ERRORS-CyOuSMLY.js";import{B as I,t as S}from"./storage-CoyB2O-Y.js";import{v as T}from"./local-meta-storage-CT1audnK.js";import m from"./GCSConfig-BQ0OpVhe.js";import v from"./GCSFile-CDQ6IWAz.js";import{r as O,o as A}from"./part-match-B5fLLmFw.js";import{o as B}from"./has-content-Bx2p8Okx.js";var j=Object.defineProperty,x=l((u,t)=>j(u,"name",{value:t,configurable:!0}),"e");class P extends Error{static{l(this,"o")}constructor(t,e,r){super(t),this.code=e,this.config=r}code;config;static{x(this,"FetchError")}name="FetchError"}var G=Object.defineProperty,p=l((u,t)=>G(u,"name",{value:t,configurable:!0}),"m");const q=p(u=>u>=200&&u<300||u===308||u===499,"validateStatus");class V extends I{static name="gcs";checksumTypes=["md5","crc32c"];get raw(){return this.authClient}meta;bucket;authClient;storageBaseURI;uploadBaseURI;isCustomEndpoint=!1;retryOptions={};useAuthWithCustomEndpoint;userProject;constructor(t){super(t);const e=t.bucket||process.env.GCS_BUCKET;if(!e)throw new Error("GCS bucket is not defined");if(!t.projectId)throw new Error("Sorry, we cannot connect to Cloud Services without a project ID.");this.bucket=e,this.storageBaseURI=`${t.storageAPI||m.storageAPI}/${this.bucket}/o`,this.uploadBaseURI=`${t.uploadAPI||m.uploadAPI}/${this.bucket}/o`,this.isCustomEndpoint=new URL(this.storageBaseURI).hostname!=="storage.googleapis.com";const{retryOptions:r,useAuthWithCustomEndpoint:s,userProject:i}=t;this.userProject=i,this.useAuthWithCustomEndpoint=s||!1,this.retryOptions={...C,...r},t.scopes||=m.authScopes,this.authClient=new w(t);const{bucket:o,metaStorage:n,metaStorageConfig:a,projectId:c}=t;if(n)this.meta=n;else{let h={...t,...a,logger:this.logger};"directory"in h?(this.logger?.debug("Using local meta storage"),this.meta=new T(h)):(o===h.bucket&&c===h.projectId&&(h={...h,authClient:this.authClient}),this.meta=new R(h))}this.isReady=!1,this.accessCheck().then(()=>{this.isReady=!0}).catch(h=>{this.logger?.error("Storage access check failed: %O",h)})}normalizeError(t){if(t.config){const e=+t.code||500;return{code:`GCS${e}`,message:t.message,name:t.name,retryable:e>=499,statusCode:e}}return{code:"GenericUploadError",message:`[${this.constructor.name}] ${t.message}`,name:t.name,statusCode:500}}async create(t){return this.instrumentOperation("create",async()=>{const e={...t};if(t.ttl){const a=typeof t.ttl=="string"?S(t.ttl):t.ttl;a!==void 0&&(e.expiredAt=Date.now()+a)}const r=new v(e);r.name=this.namingFunction(r),await this.validate(r);try{const a=await this.getMeta(r.id);return a.bytesWritten=await this.internalWrite(a),a}catch{}const s={"Content-Type":"application/json; charset=utf-8","X-Goog-Upload-Command":"start","X-Goog-Upload-Protocol":"resumable","X-Upload-Content-Length":r.size.toString(),"X-Upload-Content-Type":r.contentType},i={body:JSON.stringify({metadata:r.metadata}),headers:s,method:"POST",params:{name:r.name,size:r.size,uploadType:"resumable"},url:this.uploadBaseURI},o=await this.makeRequest(i);if(o.status!==200)throw new Error("Expected 200 response from GCS");const n=o.headers.get("X-Goog-Upload-Status")||o.headers.get("x-goog-upload-status");if(n!=="active")throw new Error(`X-Goog-Upload-Status response header expected 'active' got: ${n}`);return r.uri=o.headers.get("location"),this.config.clientDirectUpload?(r.GCSUploadURI=r.uri,this.logger?.debug("send uploadURI to client: %s",r.GCSUploadURI),r.status="created",r):(r.bytesWritten=0,await this.saveMeta(r),r.status="created",await this.onCreate(r),r)})}async write(t){return this.instrumentOperation("write",async()=>{let e;if("contentType"in t&&"metadata"in t&&!("body"in t)&&!("start"in t)?e=t:(e=await this.getMeta(t.id),await this.checkIfExpired(e)),e.status==="completed")return e;if(!O(t,e))return k($.FILE_CONFLICT);const r=await this.lock(t.id);try{if(B(t)&&(e.bytesWritten===0||Number.isNaN(e.bytesWritten))&&(!e.contentType||e.contentType==="application/octet-stream"))try{const{fileType:s,stream:i}=await U(t.body);s?.mime&&(e.contentType=s.mime),t.body=i}catch{}e.bytesWritten=await this.internalWrite({...e,...t}),e.status=A(e),e.status==="completed"&&(e.uri=`${this.storageBaseURI}/${e.name}`,await this.internalOnComplete(e))}finally{await this.unlock(t.id,r)}return e})}async delete({id:t}){return this.instrumentOperation("delete",async()=>{const e=await this.getMeta(t);if(!e.uri)throw new Error(`File ${t} does not have a valid URI`);e.status="deleted",await this.makeRequest({method:"DELETE",url:e.uri,validateStatus:q}),await this.deleteMeta(e.id);const r={...e};return await this.onDelete(r),r})}async copy(t,e){return this.instrumentOperation("copy",async()=>{const r=new URL(`/${this.bucket}/${t}`,"file://"),s=new URL(encodeURI(e),r).pathname,[,i,...o]=s.split("/"),n=o.join("/"),a=`${this.storageBaseURI}/${t}/rewriteTo/b/${i}/o/${n}`;let c={};const h={body:"",headers:{"Content-Type":"application/json"},method:"POST",url:a};do h.body=c.rewriteToken?JSON.stringify({rewriteToken:c.rewriteToken}):"",c=(await this.makeRequest(h)).data||{};while(c.rewriteToken);return await this.getMeta(e)})}async move(t,e){return this.instrumentOperation("move",async()=>{const r=await this.copy(t,e),s=`${this.storageBaseURI}/${t}`;return await this.makeRequest({method:"DELETE",url:s}),r})}async get({id:t}){return this.instrumentOperation("get",async()=>{const{data:e}=await this.makeRequest({params:{alt:"json"},url:`${this.storageBaseURI}/${t}`});if(await this.checkIfExpired({expiredAt:e.timeDeleted}),!e.uri)throw new Error("File URI not found");const r=(await this.makeRequest({params:{alt:"media"},url:e.uri})).data;let s;if(typeof r=="string")s=Buffer.from(r,"utf8");else if(r&&typeof r=="object"&&"data"in r){const i=r.data;s=Buffer.from(i)}else s=Buffer.from(r);return{...e,content:s}})}async exists({id:t}){return this.instrumentOperation("exists",async()=>{try{return await this.getMeta(t),await this.makeRequest({method:"HEAD",url:`${this.storageBaseURI}/${t}`}),!0}catch{return!1}})}async list(t=1e3){return this.instrumentOperation("list",async()=>{const e=[],r=Math.min(t,1e3);let s=!0,i={params:{maxResults:r},url:this.storageBaseURI};for(;s&&e.length<t;)try{const{data:o}=await this.makeRequest(i);for(const{name:n,timeCreated:a,updated:c}of o?.items||[]){if(e.length>=t)break;e.push({createdAt:a,id:n,modifiedAt:c})}s=o?.nextPageToken!==void 0,s&&e.length<t&&(i={...i,params:{...i.params,maxResults:Math.min(r,t-e.length),pageToken:o.nextPageToken}})}catch(o){const n=this.normalizeError(o instanceof Error?o:new Error(String(o)));throw await this.onError(n),o}return e},{limit:t})}async internalWrite(t){const{body:e,bytesWritten:r,size:s,uri:i=""}=t,o=b(t),n={method:"PUT"};if(e?.on){const a=new AbortController;e.on("aborted",()=>{a.abort()}),n.body=e,n.signal=a.signal}n.headers={Accept:"application/json","Content-Range":o,...s===r?{"X-Goog-Upload-Command":"upload, finalize"}:{}};try{const a=await this.makeRequest({url:i,...n});if(a.status===308){const c=a.headers.get("range");return c?E(c):0}if(a.status===200)return this.logger?.debug("uploaded %O",a.data),s;throw new P(String(a.data),`GCS${a.status}`,{uri:i})}catch(a){this.logger?.error(i,a);const c=this.normalizeError(a instanceof Error?a:new Error(String(a)));throw await this.onError(c),a}}internalOnComplete=p(t=>this.deleteMeta(t.id),"internalOnComplete");async makeRequest(t){return typeof t.url=="string"&&(t.url=t.url.replaceAll("/:",":")),t={...t,headers:{"User-Agent":`${d.name}/${d.version}`,"x-goog-api-client":`gl-node/${process.versions.node} gccl/${d.version} gccl-invocation-id/${f()}`,...t.headers},params:{...this.userProject===void 0?{}:{userProject:this.userProject},...t.params},retry:!0,retryConfig:this.retryOptions,timeout:6e4},this.isCustomEndpoint&&!this.useAuthWithCustomEndpoint?y(t):this.authClient.request(t)}async accessCheck(){return this.makeRequest({url:this.storageBaseURI.replace("/o","")})}}export{V as default};
1
+ var g=Object.defineProperty;var l=(u,t)=>g(u,"name",{value:t,configurable:!0});import{randomUUID as f}from"node:crypto";import{request as y}from"gaxios";import{GoogleAuth as w}from"google-auth-library";import{r as C,E as R,b,g as E,d}from"./gcs-meta-storage-DibQBpU8.js";import{d as U}from"./detect-file-type-5JhzC9RU.js";import{throwErrorCode as k,ERRORS as $}from"./ERRORS-CyOuSMLY.js";import{B as I,t as S}from"./storage-CoyB2O-Y.js";import{v as T}from"./local-meta-storage-CT1audnK.js";import m from"./GCSConfig-BQ0OpVhe.js";import v from"./GCSFile-CDQ6IWAz.js";import{r as O,o as A}from"./part-match-B5fLLmFw.js";import{o as B}from"./has-content-Bx2p8Okx.js";var j=Object.defineProperty,x=l((u,t)=>j(u,"name",{value:t,configurable:!0}),"e");class P extends Error{static{l(this,"o")}constructor(t,e,r){super(t),this.code=e,this.config=r}code;config;static{x(this,"FetchError")}name="FetchError"}var G=Object.defineProperty,p=l((u,t)=>G(u,"name",{value:t,configurable:!0}),"m");const q=p(u=>u>=200&&u<300||u===308||u===499,"validateStatus");class V extends I{static name="gcs";checksumTypes=["md5","crc32c"];get raw(){return this.authClient}meta;bucket;authClient;storageBaseURI;uploadBaseURI;isCustomEndpoint=!1;retryOptions={};useAuthWithCustomEndpoint;userProject;constructor(t){super(t);const e=t.bucket||process.env.GCS_BUCKET;if(!e)throw new Error("GCS bucket is not defined");if(!t.projectId)throw new Error("Sorry, we cannot connect to Cloud Services without a project ID.");this.bucket=e,this.storageBaseURI=`${t.storageAPI||m.storageAPI}/${this.bucket}/o`,this.uploadBaseURI=`${t.uploadAPI||m.uploadAPI}/${this.bucket}/o`,this.isCustomEndpoint=new URL(this.storageBaseURI).hostname!=="storage.googleapis.com";const{retryOptions:r,useAuthWithCustomEndpoint:s,userProject:i}=t;this.userProject=i,this.useAuthWithCustomEndpoint=s||!1,this.retryOptions={...C,...r},t.scopes||=m.authScopes,this.authClient=new w(t);const{bucket:o,metaStorage:n,metaStorageConfig:a,projectId:c}=t;if(n)this.meta=n;else{let h={...t,...a,logger:this.logger};"directory"in h?(this.logger?.debug("Using local meta storage"),this.meta=new T(h)):(o===h.bucket&&c===h.projectId&&(h={...h,authClient:this.authClient}),this.meta=new R(h))}this.isReady=!1,this.accessCheck().then(()=>{this.isReady=!0}).catch(h=>{this.logger?.error("Storage access check failed: %O",h)})}normalizeError(t){if(t.config){const e=+t.code||500;return{code:`GCS${e}`,message:t.message,name:t.name,retryable:e>=499,statusCode:e}}return{code:"GenericUploadError",message:`[${this.constructor.name}] ${t.message}`,name:t.name,statusCode:500}}async create(t){return this.instrumentOperation("create",async()=>{const e={...t};if(t.ttl){const a=typeof t.ttl=="string"?S(t.ttl):t.ttl;a!==void 0&&(e.expiredAt=Date.now()+a)}const r=new v(e);r.name=this.namingFunction(r),await this.validate(r);try{const a=await this.getMeta(r.id);return a.bytesWritten=await this.internalWrite(a),a}catch{}const s={"Content-Type":"application/json; charset=utf-8","X-Goog-Upload-Command":"start","X-Goog-Upload-Protocol":"resumable","X-Upload-Content-Length":r.size.toString(),"X-Upload-Content-Type":r.contentType},i={body:JSON.stringify({metadata:r.metadata}),headers:s,method:"POST",params:{name:r.name,size:r.size,uploadType:"resumable"},url:this.uploadBaseURI},o=await this.makeRequest(i);if(o.status!==200)throw new Error("Expected 200 response from GCS");const n=o.headers.get("X-Goog-Upload-Status")||o.headers.get("x-goog-upload-status");if(n!=="active")throw new Error(`X-Goog-Upload-Status response header expected 'active' got: ${n}`);return r.uri=o.headers.get("location"),this.config.clientDirectUpload?(r.GCSUploadURI=r.uri,this.logger?.debug("send uploadURI to client: %s",r.GCSUploadURI),r.status="created",r):(r.bytesWritten=0,await this.saveMeta(r),r.status="created",await this.onCreate(r),r)})}async write(t){return this.instrumentOperation("write",async()=>{let e;if("contentType"in t&&"metadata"in t&&!("body"in t)&&!("start"in t)?e=t:(e=await this.getMeta(t.id),await this.checkIfExpired(e)),e.status==="completed")return e;if(!O(t,e))return k($.FILE_CONFLICT);const r=await this.lock(t.id);try{if(B(t)&&(e.bytesWritten===0||Number.isNaN(e.bytesWritten))&&(!e.contentType||e.contentType==="application/octet-stream"))try{const{fileType:s,stream:i}=await U(t.body);s?.mime&&(e.contentType=s.mime),t.body=i}catch{}e.bytesWritten=await this.internalWrite({...e,...t}),e.status=A(e),e.status==="completed"&&(e.uri=`${this.storageBaseURI}/${e.name}`,await this.internalOnComplete(e))}finally{await this.unlock(t.id,r)}return e})}async delete({id:t}){return this.instrumentOperation("delete",async()=>{const e=await this.getMeta(t);if(!e.uri)throw new Error(`File ${t} does not have a valid URI`);e.status="deleted",await this.makeRequest({method:"DELETE",url:e.uri,validateStatus:q}),await this.deleteMeta(e.id);const r={...e};return await this.onDelete(r),r})}async copy(t,e){return this.instrumentOperation("copy",async()=>{const r=new URL(`/${this.bucket}/${t}`,"file://"),s=new URL(encodeURI(e),r).pathname,[,i,...o]=s.split("/"),n=o.join("/"),a=`${this.storageBaseURI}/${t}/rewriteTo/b/${i}/o/${n}`;let c={};const h={body:"",headers:{"Content-Type":"application/json"},method:"POST",url:a};do h.body=c.rewriteToken?JSON.stringify({rewriteToken:c.rewriteToken}):"",c=(await this.makeRequest(h)).data||{};while(c.rewriteToken);return await this.getMeta(e)})}async move(t,e){return this.instrumentOperation("move",async()=>{const r=await this.copy(t,e),s=`${this.storageBaseURI}/${t}`;return await this.makeRequest({method:"DELETE",url:s}),r})}async get({id:t}){return this.instrumentOperation("get",async()=>{const{data:e}=await this.makeRequest({params:{alt:"json"},url:`${this.storageBaseURI}/${t}`});if(await this.checkIfExpired({expiredAt:e.timeDeleted}),!e.uri)throw new Error("File URI not found");const r=(await this.makeRequest({params:{alt:"media"},url:e.uri})).data;let s;if(typeof r=="string")s=Buffer.from(r,"utf8");else if(r&&typeof r=="object"&&"data"in r){const i=r.data;s=Buffer.from(i)}else s=Buffer.from(r);return{...e,content:s}})}async exists({id:t}){return this.instrumentOperation("exists",async()=>{try{return await this.getMeta(t),await this.makeRequest({method:"HEAD",url:`${this.storageBaseURI}/${t}`}),!0}catch{return!1}})}async list(t=1e3){return this.instrumentOperation("list",async()=>{const e=[],r=Math.min(t,1e3);let s=!0,i={params:{maxResults:r},url:this.storageBaseURI};for(;s&&e.length<t;)try{const{data:o}=await this.makeRequest(i);for(const{name:n,timeCreated:a,updated:c}of o?.items||[]){if(e.length>=t)break;e.push({createdAt:a,id:n,modifiedAt:c})}s=o?.nextPageToken!==void 0,s&&e.length<t&&(i={...i,params:{...i.params,maxResults:Math.min(r,t-e.length),pageToken:o.nextPageToken}})}catch(o){const n=this.normalizeError(o instanceof Error?o:new Error(String(o)));throw await this.onError(n),o}return e},{limit:t})}async internalWrite(t){const{body:e,bytesWritten:r,size:s,uri:i=""}=t,o=b(t),n={method:"PUT"};if(e?.on){const a=new AbortController;e.on("aborted",()=>{a.abort()}),n.body=e,n.signal=a.signal}n.headers={Accept:"application/json","Content-Range":o,...s===r?{"X-Goog-Upload-Command":"upload, finalize"}:{}};try{const a=await this.makeRequest({url:i,...n});if(a.status===308){const c=a.headers.get("range");return c?E(c):0}if(a.status===200)return this.logger?.debug("uploaded %O",a.data),s;throw new P(String(a.data),`GCS${a.status}`,{uri:i})}catch(a){this.logger?.error(i,a);const c=this.normalizeError(a instanceof Error?a:new Error(String(a)));throw await this.onError(c),a}}internalOnComplete=p(t=>this.deleteMeta(t.id),"internalOnComplete");async makeRequest(t){return typeof t.url=="string"&&(t.url=t.url.replaceAll("/:",":")),t={...t,headers:{"User-Agent":`${d.name}/${d.version}`,"x-goog-api-client":`gl-node/${process.versions.node} gccl/${d.version} gccl-invocation-id/${f()}`,...t.headers},params:{...this.userProject===void 0?{}:{userProject:this.userProject},...t.params},retry:!0,retryConfig:this.retryOptions,timeout:6e4},this.isCustomEndpoint&&!this.useAuthWithCustomEndpoint?y(t):this.authClient.request(t)}async accessCheck(){return this.makeRequest({url:this.storageBaseURI.replace("/o","")})}}export{V as default};
@@ -1,4 +1,4 @@
1
- import { F as File, M as MetaStorage, D as DiskStorageOptions, H as HttpError, e as FileInit, f as FilePart, g as FileQuery, a as FileReturn, E as ERRORS, B as BaseStorage, h as DiskStorageWithChecksumOptions } from "./storage.d-Cr6f2lac.js";
1
+ import { F as File, M as MetaStorage, D as DiskStorageOptions, H as HttpError, e as FileInit, f as FilePart, g as FileQuery, a as FileReturn, E as ERRORS, B as BaseStorage, h as DiskStorageWithChecksumOptions } from "./storage.d-D9YA4MRs.js";
2
2
  import { Readable } from 'node:stream';
3
3
  /**
4
4
  * Local disk-based storage implementation.
@@ -1,4 +1,4 @@
1
- import { F as Files } from "./index.d-DotjipuX.js";
1
+ import { F as Files } from "./index.d-CKaAalRr.js";
2
2
  import { C as CopyFileInput, D as DeleteFileInput, a as DownloadFileInput, G as GetFileMetadataInput, b as GetFileUrlInput, L as ListFilesInput, S as SignUploadUrlInput, U as UploadFileInput } from "./approval.d-CMAYH9GF.js";
3
3
  interface CopyFileResult {
4
4
  copied: true;
@@ -1 +1 @@
1
- var g=Object.defineProperty;var o=(s,t)=>g(s,"name",{value:t,configurable:!0});import{randomUUID as y}from"node:crypto";import{request as f}from"gaxios";import{GoogleAuth as C}from"google-auth-library";import v from"./MetaStorage-Y4m1dWgd.js";import{stringifyMetadata as R,parseMetadata as E}from"./Metadata-B6Ir0KO7.js";import n from"./GCSConfig-BQ0OpVhe.js";import{o as $}from"./has-content-Bx2p8Okx.js";var I="@visulima/storage",P="1.0.0-alpha.26";const i={name:I,version:P};var A=Object.defineProperty,u=o((s,t)=>A(s,"name",{value:t,configurable:!0}),"n");const T=u(s=>{const t=s.match(/(\d+)-(\d+)/),e=t?.[2]?+t[2]:0;return e>0?e+1:0},"getRangeEnd"),G=u(s=>{if($(s)){const t=s.contentLength?s.start+s.contentLength-1:"*";return`bytes ${s.start}-${t}/${s.size??"*"}`}return`bytes */${s.size??"*"}`},"buildContentRange"),U=u(s=>{if(s.response!==void 0){const{response:t}=s;return t?.data?.error?.errors?.map(({reason:e=""})=>e==="rateLimitExceeded"||e==="userRateLimitExceeded"?!0:!!(e&&e.includes("EAI_AGAIN"))).includes(!0)}return!1},"shouldRetry"),w={retry:3,shouldRetry:U,statusCodesToRetry:[[408,429,500,502,503,504],[100,199],[429],[500,599]]};var b=Object.defineProperty,j=o((s,t)=>b(s,"name",{value:t,configurable:!0}),"p");class N extends v{static{o(this,"E")}constructor(t){super(t),this.config=t;const{authClient:e,...a}=t,r=a.bucket||process.env.GCS_BUCKET;if(e===void 0){if(!r)throw new Error("GCS bucket is not defined");if(!a.projectId)throw new Error("Sorry, we cannot connect to Cloud Services without a project ID.");a.scopes||=n.authScopes,this.authClient=new C(a)}else this.authClient=e;this.storageBaseURI=`${a.storageAPI||n.storageAPI}/${r}/o`,this.uploadBaseURI=`${a.uploadAPI||n.uploadAPI}/${r}/o`;const h=["storage.googleapis.com"],d=new URL(this.storageBaseURI).hostname;this.isCustomEndpoint=!h.includes(d);const{retryOptions:m,useAuthWithCustomEndpoint:p,userProject:l}=t;this.userProject=l,this.useAuthWithCustomEndpoint=p||!1,this.retryOptions={...w,...m},e===void 0&&this.accessCheck().catch(c=>{throw c.code==="404"?new Error(`Bucket ${r} does not exist`):c})}config;static{j(this,"GCSMetaStorage")}authClient;storageBaseURI;uploadBaseURI;isCustomEndpoint=!1;retryOptions={};useAuthWithCustomEndpoint;userProject;async save(t,e){const a={...e};return a.metadata&&(a.metadata=R(e.metadata)),await this.makeRequest({body:JSON.stringify(a),headers:{"Content-Type":"application/json; charset=utf-8"},method:"POST",params:{name:encodeURIComponent(this.getMetaName(t)),uploadType:"media"},url:this.uploadBaseURI}),e}async delete(t){const e=this.getMetaPath(t);await this.makeRequest({method:"DELETE",url:e})}async get(t){const e=this.getMetaPath(t),{data:a}=await this.makeRequest({params:{alt:"media"},url:e});return a.metadata&&typeof a.metadata=="string"&&(a.metadata=E(a.metadata)),a}async touch(t,e){return this.save(t,e)}async accessCheck(){return this.makeRequest({url:this.storageBaseURI.replace("/o","")})}getMetaPath(t){return`${this.storageBaseURI}/${this.getMetaName(t)}`}async makeRequest(t){return typeof t.url=="string"&&(t.url=t.url.replaceAll("/:",":")),t={...t,headers:{"User-Agent":`${i.name}/${i.version}`,"x-goog-api-client":`gl-node/${process.versions.node} gccl/${i.version} gccl-invocation-id/${y()}`},params:{...this.userProject===void 0?{}:{userProject:this.userProject}},retry:!0,retryConfig:this.retryOptions,timeout:6e4},this.isCustomEndpoint&&!this.useAuthWithCustomEndpoint?f(t):this.authClient.request(t)}}export{N as E,G as b,i as d,T as g,w as r};
1
+ var g=Object.defineProperty;var o=(s,t)=>g(s,"name",{value:t,configurable:!0});import{randomUUID as y}from"node:crypto";import{request as f}from"gaxios";import{GoogleAuth as C}from"google-auth-library";import v from"./MetaStorage-Y4m1dWgd.js";import{stringifyMetadata as R,parseMetadata as E}from"./Metadata-B6Ir0KO7.js";import n from"./GCSConfig-BQ0OpVhe.js";import{o as $}from"./has-content-Bx2p8Okx.js";var I="@visulima/storage",P="1.0.0-alpha.27";const i={name:I,version:P};var A=Object.defineProperty,u=o((s,t)=>A(s,"name",{value:t,configurable:!0}),"n");const T=u(s=>{const t=s.match(/(\d+)-(\d+)/),e=t?.[2]?+t[2]:0;return e>0?e+1:0},"getRangeEnd"),G=u(s=>{if($(s)){const t=s.contentLength?s.start+s.contentLength-1:"*";return`bytes ${s.start}-${t}/${s.size??"*"}`}return`bytes */${s.size??"*"}`},"buildContentRange"),U=u(s=>{if(s.response!==void 0){const{response:t}=s;return t?.data?.error?.errors?.map(({reason:e=""})=>e==="rateLimitExceeded"||e==="userRateLimitExceeded"?!0:!!(e&&e.includes("EAI_AGAIN"))).includes(!0)}return!1},"shouldRetry"),w={retry:3,shouldRetry:U,statusCodesToRetry:[[408,429,500,502,503,504],[100,199],[429],[500,599]]};var b=Object.defineProperty,j=o((s,t)=>b(s,"name",{value:t,configurable:!0}),"p");class N extends v{static{o(this,"E")}constructor(t){super(t),this.config=t;const{authClient:e,...a}=t,r=a.bucket||process.env.GCS_BUCKET;if(e===void 0){if(!r)throw new Error("GCS bucket is not defined");if(!a.projectId)throw new Error("Sorry, we cannot connect to Cloud Services without a project ID.");a.scopes||=n.authScopes,this.authClient=new C(a)}else this.authClient=e;this.storageBaseURI=`${a.storageAPI||n.storageAPI}/${r}/o`,this.uploadBaseURI=`${a.uploadAPI||n.uploadAPI}/${r}/o`;const h=["storage.googleapis.com"],d=new URL(this.storageBaseURI).hostname;this.isCustomEndpoint=!h.includes(d);const{retryOptions:m,useAuthWithCustomEndpoint:p,userProject:l}=t;this.userProject=l,this.useAuthWithCustomEndpoint=p||!1,this.retryOptions={...w,...m},e===void 0&&this.accessCheck().catch(c=>{throw c.code==="404"?new Error(`Bucket ${r} does not exist`):c})}config;static{j(this,"GCSMetaStorage")}authClient;storageBaseURI;uploadBaseURI;isCustomEndpoint=!1;retryOptions={};useAuthWithCustomEndpoint;userProject;async save(t,e){const a={...e};return a.metadata&&(a.metadata=R(e.metadata)),await this.makeRequest({body:JSON.stringify(a),headers:{"Content-Type":"application/json; charset=utf-8"},method:"POST",params:{name:encodeURIComponent(this.getMetaName(t)),uploadType:"media"},url:this.uploadBaseURI}),e}async delete(t){const e=this.getMetaPath(t);await this.makeRequest({method:"DELETE",url:e})}async get(t){const e=this.getMetaPath(t),{data:a}=await this.makeRequest({params:{alt:"media"},url:e});return a.metadata&&typeof a.metadata=="string"&&(a.metadata=E(a.metadata)),a}async touch(t,e){return this.save(t,e)}async accessCheck(){return this.makeRequest({url:this.storageBaseURI.replace("/o","")})}getMetaPath(t){return`${this.storageBaseURI}/${this.getMetaName(t)}`}async makeRequest(t){return typeof t.url=="string"&&(t.url=t.url.replaceAll("/:",":")),t={...t,headers:{"User-Agent":`${i.name}/${i.version}`,"x-goog-api-client":`gl-node/${process.versions.node} gccl/${i.version} gccl-invocation-id/${y()}`},params:{...this.userProject===void 0?{}:{userProject:this.userProject}},retry:!0,retryConfig:this.retryOptions,timeout:6e4},this.isCustomEndpoint&&!this.useAuthWithCustomEndpoint?f(t):this.authClient.request(t)}}export{N as E,G as b,i as d,T as g,w as r};
@@ -1,4 +1,4 @@
1
- import { B as BaseStorage } from "./storage.d-Cr6f2lac.js";
1
+ import { B as BaseStorage } from "./storage.d-D9YA4MRs.js";
2
2
  /**
3
3
  * Web-standard and Node-native body types accepted by {@link Files.upload}.
4
4
  */
@@ -47,7 +47,7 @@ interface FilesOptions<TStorage extends BaseStorage = BaseStorage> {
47
47
  /**
48
48
  * Files-SDK–style unified facade over a {@link BaseStorage} instance.
49
49
  *
50
- * Provides a small, consistent surface (`upload`, `download`, `head`, `delete`, `copy`,
50
+ * Provides a small, consistent surface (`upload`, `download`, `head`, `exists`, `delete`, `copy`,
51
51
  * `list`, `url`, `signedUploadUrl`) and a `raw` escape hatch to the adapter's native client.
52
52
  *
53
53
  * The facade uses the user-supplied `key` as both the storage path and the metadata id,
@@ -78,6 +78,11 @@ declare class Files<TStorage extends BaseStorage = BaseStorage> {
78
78
  upload(key: string, body: FileBody, options?: UploadOptions): Promise<FileObject>;
79
79
  download(key: string): Promise<DownloadResult>;
80
80
  head(key: string): Promise<FileObject>;
81
+ /**
82
+ * Resolves to `true` when an object exists at `key`, `false` otherwise. Never throws for a
83
+ * missing object.
84
+ */
85
+ exists(key: string): Promise<boolean>;
81
86
  delete(key: string): Promise<void>;
82
87
  copy(source: string, destination: string, options?: {
83
88
  storageClass?: string;
@@ -1,4 +1,4 @@
1
- import { F as File, L as LocalMetaStorageOptions, M as MetaStorage } from "./storage.d-Cr6f2lac.js";
1
+ import { F as File, L as LocalMetaStorageOptions, M as MetaStorage } from "./storage.d-D9YA4MRs.js";
2
2
  import 'node:stream';
3
3
  /**
4
4
  * Stores upload metafiles on local disk
@@ -1,5 +1,5 @@
1
- import { F as File, a as FileReturn, B as BaseStorage } from "./storage.d-Cr6f2lac.js";
2
- import { O as MediaTransformerConfig, Q as MediaTransformResult } from "./types.d-C8eSxqX9.js";
1
+ import { F as File, a as FileReturn, B as BaseStorage } from "./storage.d-D9YA4MRs.js";
2
+ import { O as MediaTransformerConfig, Q as MediaTransformResult } from "./types.d-P2Kxr4cB.js";
3
3
  /**
4
4
  * Unified media transformer that automatically detects media type and routes to appropriate transformer.
5
5
  * @template TFile The file type used by this transformer.
@@ -1,5 +1,5 @@
1
1
  import { Readable } from 'node:stream';
2
- import { F as File, M as MetaStorage, d as createRetryWrapper, e as FileInit, B as BaseStorage, R as RetryConfig, f as FilePart, g as FileQuery, a as FileReturn } from "./storage.d-Cr6f2lac.js";
2
+ import { F as File, M as MetaStorage, d as createRetryWrapper, e as FileInit, B as BaseStorage, R as RetryConfig, f as FilePart, g as FileQuery, a as FileReturn } from "./storage.d-D9YA4MRs.js";
3
3
  /**
4
4
  * Part interface for multipart uploads.
5
5
  */
@@ -1037,4 +1037,4 @@ declare abstract class BaseStorage<TFile extends File = File, TFileReturn extend
1037
1037
  */
1038
1038
  protected instrumentOperation<T>(operation: string, function_: () => Promise<T>, attributes?: Record<string, string | number>): Promise<T>;
1039
1039
  }
1040
- export { throwErrorCode as $, RangeHasher as A, BaseStorage as B, Cache as C, DiskStorageOptions as D, ERRORS as E, File as F, ResponseBody as G, HttpError as H, IncomingMessageWithBody as I, ResponseTuple as J, UploadResponse as K, LocalMetaStorageOptions as L, MetaStorage as M, ValidationError as N, OnComplete as O, PurgeList as P, ValidatorConfig as Q, RetryConfig as R, defaultCloudStorageFileNameValidation as S, defaultFilesystemFileNameValidation as T, UploadFile as U, Validation as V, extractHttpStatus as W, isRetryableError as X, isUploadError as Y, mapStatusToErrorCode as Z, retry as _, FileReturn as a, wrapStorageError as a0, UploadError as b, UploadEventType as c, createRetryWrapper as d, FileInit as e, FilePart as f, FileQuery as g, DiskStorageWithChecksumOptions as h, ResponseBodyType as i, ErrorResponses as j, Metrics as k, BaseStorageOptions as l, BatchOperationResponse as m, BatchOperationResult as n, ErrorMap as o, ExpirationOptions as p, Header as q, Headers as r, HttpErrorBody as s, MetaStorageOptions as t, Metadata as u, OnCreate as v, OnDelete as w, OnError as x, OnUpdate as y, RangeChecksum as z };
1040
+ export { wrapStorageError as $, RangeHasher as A, BaseStorage as B, ResponseBody as C, DiskStorageOptions as D, ERRORS as E, File as F, ResponseTuple as G, HttpError as H, IncomingMessageWithBody as I, UploadResponse as J, ValidationError as K, LocalMetaStorageOptions as L, MetaStorage as M, ValidatorConfig as N, OnComplete as O, PurgeList as P, defaultCloudStorageFileNameValidation as Q, RetryConfig as R, defaultFilesystemFileNameValidation as S, extractHttpStatus as T, UploadFile as U, Validation as V, isRetryableError as W, isUploadError as X, mapStatusToErrorCode as Y, retry as Z, throwErrorCode as _, FileReturn as a, Cache as a0, UploadError as b, UploadEventType as c, createRetryWrapper as d, FileInit as e, FilePart as f, FileQuery as g, DiskStorageWithChecksumOptions as h, ResponseBodyType as i, ErrorResponses as j, Metrics as k, BaseStorageOptions as l, BatchOperationResponse as m, BatchOperationResult as n, ErrorMap as o, ExpirationOptions as p, Header as q, Headers as r, HttpErrorBody as s, MetaStorageOptions as t, Metadata as u, OnCreate as v, OnDelete as w, OnError as x, OnUpdate as y, RangeChecksum as z };
@@ -1,8 +1,8 @@
1
1
  import { EventEmitter } from 'node:events';
2
- import { U as UploadFile, i as ResponseBodyType, B as BaseStorage, j as ErrorResponses } from "./storage.d-Cr6f2lac.js";
2
+ import { U as UploadFile, i as ResponseBodyType, B as BaseStorage, j as ErrorResponses } from "./storage.d-D9YA4MRs.js";
3
3
  import 'node:stream';
4
- import { M as MediaTransformer } from "./media-transformer.d-DK7NJncf.js";
5
- import { U as UploadOptions } from "./types.d-BgCmSE94.js";
4
+ import { M as MediaTransformer } from "./media-transformer.d-Dt9W_its.js";
5
+ import { U as UploadOptions } from "./types.d-CBvMCJmv.js";
6
6
  import 'node:crypto';
7
7
  import 'node:http';
8
8
  import 'lru-cache';
@@ -2,8 +2,8 @@ import { EventEmitter } from 'node:events';
2
2
  import { IncomingMessage } from 'node:http';
3
3
  import { Readable } from 'node:stream';
4
4
  import { PaginationResult } from '@visulima/pagination';
5
- import { U as UploadFile, B as BaseStorage, b as UploadError, c as UploadEventType } from "./storage.d-Cr6f2lac.js";
6
- import { M as MediaTransformer } from "./media-transformer.d-DK7NJncf.js";
5
+ import { U as UploadFile, B as BaseStorage, b as UploadError, c as UploadEventType } from "./storage.d-D9YA4MRs.js";
6
+ import { M as MediaTransformer } from "./media-transformer.d-Dt9W_its.js";
7
7
  type WebRequest = globalThis.Request;
8
8
  type WebResponse = globalThis.Response;
9
9
  interface BaseResponse {
@@ -1,4 +1,4 @@
1
- import { C as Cache, F as File, a as FileReturn, B as BaseStorage } from "./storage.d-Cr6f2lac.js";
1
+ import { a0 as Cache, F as File, a as FileReturn, B as BaseStorage } from "./storage.d-D9YA4MRs.js";
2
2
  import { Readable } from 'node:stream';
3
3
  /**
4
4
  * Base transformer configuration with common properties
@@ -717,4 +717,4 @@ interface AudioTransformerConfig extends BaseTransformerConfig {
717
717
  /** Maximum audio size to process (in bytes) */
718
718
  maxAudioSize?: number;
719
719
  }
720
- export { AudioTransformerConfig as A, BaseTransformer as B, CropOptions as C, DilateOptions as D, ExtractChannelOptions as E, ToColourspaceOptions as F, GreyscaleOptions as G, RemoveAlphaOptions as H, ImageTransformerConfig as I, JoinChannelOptions as J, EnsureAlphaOptions as K, LinearOptions as L, MedianOptions as M, TransformationStep as N, MediaTransformerConfig as O, PipelineColourspaceOptions as P, MediaTransformResult as Q, ResizeOptions as R, SharpenOptions as S, TransformResult as T, MediaTransformQuery as U, VideoTransformerConfig as V, MediaTransformationStep as W, VideoTransformResult as a, VideoResizeOptions as b, VideoCropOptions as c, VideoRotateOptions as d, VideoTransformOptions as e, VideoTransformationStep as f, AudioTransformResult as g, AudioResampleOptions as h, AudioChannelMixOptions as i, AudioTransformOptions as j, AudioTransformationStep as k, RotateOptions as l, ImageFormat as m, TransformOptions as n, BlurOptions as o, CLAHEOptions as p, ConvolveOptions as q, ThresholdOptions as r, BooleanOptions as s, RecombineOptions as t, ModulateOptions as u, TintOptions as v, ColourspaceOptions as w, BandboolOptions as x, AffineOptions as y, ErodeOptions as z };
720
+ export { AudioTransformerConfig as A, BaseTransformer as B, CropOptions as C, DilateOptions as D, ExtractChannelOptions as E, VideoCropOptions as F, GreyscaleOptions as G, VideoRotateOptions as H, ImageTransformerConfig as I, JoinChannelOptions as J, VideoTransformOptions as K, LinearOptions as L, MedianOptions as M, VideoTransformationStep as N, MediaTransformerConfig as O, PipelineColourspaceOptions as P, MediaTransformResult as Q, ResizeOptions as R, SharpenOptions as S, TransformResult as T, MediaTransformQuery as U, VideoTransformerConfig as V, MediaTransformationStep as W, AudioTransformResult as a, AudioResampleOptions as b, AudioChannelMixOptions as c, AudioTransformOptions as d, AudioTransformationStep as e, RotateOptions as f, ImageFormat as g, TransformOptions as h, BlurOptions as i, CLAHEOptions as j, ConvolveOptions as k, ThresholdOptions as l, BooleanOptions as m, RecombineOptions as n, ModulateOptions as o, TintOptions as p, ColourspaceOptions as q, BandboolOptions as r, AffineOptions as s, ErodeOptions as t, ToColourspaceOptions as u, RemoveAlphaOptions as v, EnsureAlphaOptions as w, TransformationStep as x, VideoTransformResult as y, VideoResizeOptions as z };
@@ -1,6 +1,6 @@
1
- import { F as File, t as MetaStorageOptions, l as BaseStorageOptions, L as LocalMetaStorageOptions, M as MetaStorage, H as HttpError, g as FileQuery, e as FileInit } from "../../packem_shared/storage.d-Cr6f2lac.js";
1
+ import { F as File, t as MetaStorageOptions, l as BaseStorageOptions, L as LocalMetaStorageOptions, M as MetaStorage, H as HttpError, g as FileQuery, e as FileInit } from "../../packem_shared/storage.d-D9YA4MRs.js";
2
2
  import { Readable } from 'node:stream';
3
- import { P as Part, S as S3ApiOperations, a as S3BaseStorage } from "../../packem_shared/s3-base-storage.d-BROGYJ4F.js";
3
+ import { P as Part, S as S3ApiOperations, a as S3BaseStorage } from "../../packem_shared/s3-base-storage.d-DTxJKx3M.js";
4
4
  import { S3ClientConfig, ObjectCannedACL, S3Client } from '@aws-sdk/client-s3';
5
5
  import { ResponseMetadata } from '@aws-sdk/types';
6
6
  import 'node:crypto';
@@ -1,5 +1,5 @@
1
- import { P as Part, S as S3ApiOperations, a as S3BaseStorage } from "../../packem_shared/s3-base-storage.d-BROGYJ4F.js";
2
- import { F as File, t as MetaStorageOptions, l as BaseStorageOptions, M as MetaStorage, H as HttpError, g as FileQuery, e as FileInit } from "../../packem_shared/storage.d-Cr6f2lac.js";
1
+ import { P as Part, S as S3ApiOperations, a as S3BaseStorage } from "../../packem_shared/s3-base-storage.d-DTxJKx3M.js";
2
+ import { F as File, t as MetaStorageOptions, l as BaseStorageOptions, M as MetaStorage, H as HttpError, g as FileQuery, e as FileInit } from "../../packem_shared/storage.d-D9YA4MRs.js";
3
3
  import { Readable } from 'node:stream';
4
4
  import { AwsClient } from 'aws4fetch';
5
5
  import 'node:crypto';
@@ -1,4 +1,4 @@
1
- import { F as File, t as MetaStorageOptions, L as LocalMetaStorageOptions, l as BaseStorageOptions, M as MetaStorage, e as FileInit, g as FileQuery, f as FilePart, a as FileReturn, B as BaseStorage } from "../../packem_shared/storage.d-Cr6f2lac.js";
1
+ import { F as File, t as MetaStorageOptions, L as LocalMetaStorageOptions, l as BaseStorageOptions, M as MetaStorage, e as FileInit, g as FileQuery, f as FilePart, a as FileReturn, B as BaseStorage } from "../../packem_shared/storage.d-D9YA4MRs.js";
2
2
  import 'node:stream';
3
3
  import { BlobServiceClient } from '@azure/storage-blob';
4
4
  import 'node:crypto';
@@ -1,6 +1,6 @@
1
- import { F as File, L as LocalMetaStorageOptions, l as BaseStorageOptions, M as MetaStorage, e as FileInit, f as FilePart, g as FileQuery, a as FileReturn, B as BaseStorage } from "../../packem_shared/storage.d-Cr6f2lac.js";
1
+ import { F as File, L as LocalMetaStorageOptions, l as BaseStorageOptions, M as MetaStorage, e as FileInit, f as FilePart, g as FileQuery, a as FileReturn, B as BaseStorage } from "../../packem_shared/storage.d-D9YA4MRs.js";
2
2
  import 'node:stream';
3
- import { L as LocalMetaStorage } from "../../packem_shared/local-meta-storage.d-B5R1nswK.js";
3
+ import { L as LocalMetaStorage } from "../../packem_shared/local-meta-storage.d-KWaPZTSN.js";
4
4
  import { BoxClient } from 'box-typescript-sdk-gen';
5
5
  import 'node:crypto';
6
6
  import 'node:http';
@@ -1,6 +1,6 @@
1
- import { F as File, L as LocalMetaStorageOptions, l as BaseStorageOptions, M as MetaStorage, e as FileInit, f as FilePart, g as FileQuery, a as FileReturn, B as BaseStorage } from "../../packem_shared/storage.d-Cr6f2lac.js";
1
+ import { F as File, L as LocalMetaStorageOptions, l as BaseStorageOptions, M as MetaStorage, e as FileInit, f as FilePart, g as FileQuery, a as FileReturn, B as BaseStorage } from "../../packem_shared/storage.d-D9YA4MRs.js";
2
2
  import 'node:stream';
3
- import { L as LocalMetaStorage } from "../../packem_shared/local-meta-storage.d-B5R1nswK.js";
3
+ import { L as LocalMetaStorage } from "../../packem_shared/local-meta-storage.d-KWaPZTSN.js";
4
4
  import * as BunnyStorageSDK from '@bunny.net/storage-sdk';
5
5
  import 'node:crypto';
6
6
  import 'node:http';
@@ -71,7 +71,7 @@ interface BunnyStorageOptions extends BaseStorageOptions {
71
71
  *
72
72
  * Uses `@bunny.net/storage-sdk`. Writes go through the Storage API with an `AccessKey` header; reads either go through `data()` (server-side fetch) or, when a public Pull Zone is configured, through `publicBaseUrl`.
73
73
  *
74
- * **Limitations** (mirroring files-sdk PR #21):
74
+ * **Limitations**:
75
75
  *
76
76
  * - No native server-side `copy` — implemented as download + re-upload.
77
77
  * - No `signedUploadUrl` / presigned PUT — Bunny has no such primitive.
@@ -1,6 +1,6 @@
1
- import { F as File, L as LocalMetaStorageOptions, l as BaseStorageOptions, M as MetaStorage, e as FileInit, f as FilePart, g as FileQuery, a as FileReturn, B as BaseStorage } from "../../packem_shared/storage.d-Cr6f2lac.js";
1
+ import { F as File, L as LocalMetaStorageOptions, l as BaseStorageOptions, M as MetaStorage, e as FileInit, f as FilePart, g as FileQuery, a as FileReturn, B as BaseStorage } from "../../packem_shared/storage.d-D9YA4MRs.js";
2
2
  import 'node:stream';
3
- import { L as LocalMetaStorage } from "../../packem_shared/local-meta-storage.d-B5R1nswK.js";
3
+ import { L as LocalMetaStorage } from "../../packem_shared/local-meta-storage.d-KWaPZTSN.js";
4
4
  import { Dropbox } from 'dropbox';
5
5
  import 'node:crypto';
6
6
  import 'node:http';
@@ -73,7 +73,7 @@ interface DropboxStorageOptions extends BaseStorageOptions {
73
73
  * the simple `filesUpload` endpoint up to 150 MB and switch to chunked
74
74
  * upload sessions above that threshold.
75
75
  *
76
- * **Auth precedence** (same model as files-sdk's Dropbox adapter):
76
+ * **Auth precedence**:
77
77
  * 1. `client` (pre-built `Dropbox`)
78
78
  * 2. `accessToken` (string or `() => string | Promise&lt;string>`)
79
79
  * 3. `refreshToken` + `appKey` (+ optional `appSecret`)
@@ -1,4 +1,4 @@
1
- import { F as File, t as MetaStorageOptions, L as LocalMetaStorageOptions, l as BaseStorageOptions, M as MetaStorage, H as HttpError, e as FileInit, f as FilePart, g as FileQuery, a as FileReturn, B as BaseStorage } from "../../packem_shared/storage.d-Cr6f2lac.js";
1
+ import { F as File, t as MetaStorageOptions, L as LocalMetaStorageOptions, l as BaseStorageOptions, M as MetaStorage, H as HttpError, e as FileInit, f as FilePart, g as FileQuery, a as FileReturn, B as BaseStorage } from "../../packem_shared/storage.d-D9YA4MRs.js";
2
2
  import 'node:stream';
3
3
  import { RetryConfig } from 'gaxios';
4
4
  import { GoogleAuthOptions, GoogleAuth } from 'google-auth-library';
@@ -1 +1 @@
1
- import{default as a}from"../../packem_shared/GCSConfig-BQ0OpVhe.js";import{default as t}from"../../packem_shared/GCSFile-CDQ6IWAz.js";import{E as C}from"../../packem_shared/gcs-meta-storage-XB-UPJn6.js";import{default as l}from"../../packem_shared/GCStorage-XSBKVx90.js";export{a as GCSConfig,t as GCSFile,C as GCSMetaStorage,l as GCStorage};
1
+ import{default as a}from"../../packem_shared/GCSConfig-BQ0OpVhe.js";import{default as t}from"../../packem_shared/GCSFile-CDQ6IWAz.js";import{E as C}from"../../packem_shared/gcs-meta-storage-DibQBpU8.js";import{default as l}from"../../packem_shared/GCStorage-CNCPTaGF.js";export{a as GCSConfig,t as GCSFile,C as GCSMetaStorage,l as GCStorage};
@@ -1,6 +1,6 @@
1
- import { F as File, L as LocalMetaStorageOptions, l as BaseStorageOptions, M as MetaStorage, e as FileInit, f as FilePart, g as FileQuery, a as FileReturn, B as BaseStorage } from "../../packem_shared/storage.d-Cr6f2lac.js";
1
+ import { F as File, L as LocalMetaStorageOptions, l as BaseStorageOptions, M as MetaStorage, e as FileInit, f as FilePart, g as FileQuery, a as FileReturn, B as BaseStorage } from "../../packem_shared/storage.d-D9YA4MRs.js";
2
2
  import 'node:stream';
3
- import { L as LocalMetaStorage } from "../../packem_shared/local-meta-storage.d-B5R1nswK.js";
3
+ import { L as LocalMetaStorage } from "../../packem_shared/local-meta-storage.d-KWaPZTSN.js";
4
4
  import { drive_v3 } from '@googleapis/drive';
5
5
  import 'node:crypto';
6
6
  import 'node:http';
@@ -1,6 +1,6 @@
1
- export { D as DiskStorage, a as DiskStorageWithChecksum } from "../../packem_shared/disk-storage-with-checksum.d-BQMXA4Wl.js";
2
- export { L as LocalMetaStorage } from "../../packem_shared/local-meta-storage.d-B5R1nswK.js";
3
- export { type L as LocalMetaStorageOptions } from "../../packem_shared/storage.d-Cr6f2lac.js";
1
+ export { D as DiskStorage, a as DiskStorageWithChecksum } from "../../packem_shared/disk-storage-with-checksum.d-8gCPEZZC.js";
2
+ export { L as LocalMetaStorage } from "../../packem_shared/local-meta-storage.d-KWaPZTSN.js";
3
+ export { type L as LocalMetaStorageOptions } from "../../packem_shared/storage.d-D9YA4MRs.js";
4
4
  import 'node:stream';
5
5
  import 'node:crypto';
6
6
  import 'node:http';
@@ -1,6 +1,6 @@
1
- import { F as File, L as LocalMetaStorageOptions, l as BaseStorageOptions, M as MetaStorage, e as FileInit, f as FilePart, g as FileQuery, a as FileReturn, B as BaseStorage } from "../../packem_shared/storage.d-Cr6f2lac.js";
1
+ import { F as File, L as LocalMetaStorageOptions, l as BaseStorageOptions, M as MetaStorage, e as FileInit, f as FilePart, g as FileQuery, a as FileReturn, B as BaseStorage } from "../../packem_shared/storage.d-D9YA4MRs.js";
2
2
  import 'node:stream';
3
- import { L as LocalMetaStorage } from "../../packem_shared/local-meta-storage.d-B5R1nswK.js";
3
+ import { L as LocalMetaStorage } from "../../packem_shared/local-meta-storage.d-KWaPZTSN.js";
4
4
  import { getStore } from '@netlify/blobs';
5
5
  import 'node:crypto';
6
6
  import 'node:http';
@@ -1,6 +1,6 @@
1
- import { F as File, L as LocalMetaStorageOptions, l as BaseStorageOptions, M as MetaStorage, e as FileInit, f as FilePart, g as FileQuery, a as FileReturn, B as BaseStorage } from "../../packem_shared/storage.d-Cr6f2lac.js";
1
+ import { F as File, L as LocalMetaStorageOptions, l as BaseStorageOptions, M as MetaStorage, e as FileInit, f as FilePart, g as FileQuery, a as FileReturn, B as BaseStorage } from "../../packem_shared/storage.d-D9YA4MRs.js";
2
2
  import 'node:stream';
3
- import { L as LocalMetaStorage } from "../../packem_shared/local-meta-storage.d-B5R1nswK.js";
3
+ import { L as LocalMetaStorage } from "../../packem_shared/local-meta-storage.d-KWaPZTSN.js";
4
4
  import { Client } from '@microsoft/microsoft-graph-client';
5
5
  import 'node:crypto';
6
6
  import 'node:http';
@@ -1,6 +1,6 @@
1
- import { F as File, L as LocalMetaStorageOptions, l as BaseStorageOptions, M as MetaStorage, e as FileInit, f as FilePart, g as FileQuery, a as FileReturn, B as BaseStorage } from "../../packem_shared/storage.d-Cr6f2lac.js";
1
+ import { F as File, L as LocalMetaStorageOptions, l as BaseStorageOptions, M as MetaStorage, e as FileInit, f as FilePart, g as FileQuery, a as FileReturn, B as BaseStorage } from "../../packem_shared/storage.d-D9YA4MRs.js";
2
2
  import 'node:stream';
3
- import { L as LocalMetaStorage } from "../../packem_shared/local-meta-storage.d-B5R1nswK.js";
3
+ import { L as LocalMetaStorage } from "../../packem_shared/local-meta-storage.d-KWaPZTSN.js";
4
4
  import { StorageClient } from '@supabase/storage-js';
5
5
  import 'node:crypto';
6
6
  import 'node:http';
@@ -1,7 +1,7 @@
1
1
  import { UTApi } from 'uploadthing/server';
2
- import { L as LocalMetaStorageOptions, l as BaseStorageOptions, F as File, M as MetaStorage, e as FileInit, f as FilePart, g as FileQuery, a as FileReturn, B as BaseStorage } from "../../packem_shared/storage.d-Cr6f2lac.js";
2
+ import { L as LocalMetaStorageOptions, l as BaseStorageOptions, F as File, M as MetaStorage, e as FileInit, f as FilePart, g as FileQuery, a as FileReturn, B as BaseStorage } from "../../packem_shared/storage.d-D9YA4MRs.js";
3
3
  import 'node:stream';
4
- import { L as LocalMetaStorage } from "../../packem_shared/local-meta-storage.d-B5R1nswK.js";
4
+ import { L as LocalMetaStorage } from "../../packem_shared/local-meta-storage.d-KWaPZTSN.js";
5
5
  import 'node:crypto';
6
6
  import 'node:http';
7
7
  import 'lru-cache';
@@ -48,7 +48,7 @@ declare class UploadThingMetaStorage extends LocalMetaStorage<UploadThingFile> {
48
48
  * keyed by user-supplied `customId` so subsequent operations (delete, signed
49
49
  * URL, list) round-trip on the user's key, not UploadThing's internal fileKey.
50
50
  *
51
- * **Limitations** (mirroring files-sdk):
51
+ * **Limitations**:
52
52
  * - No native server-side `copy` — implemented as download + re-upload.
53
53
  * - `list` has no server-side prefix filter; prefix filtering happens client-
54
54
  * side within a page.
@@ -1,6 +1,6 @@
1
- import { L as LocalMetaStorageOptions, l as BaseStorageOptions, F as File, M as MetaStorage, e as FileInit, f as FilePart, g as FileQuery, a as FileReturn, B as BaseStorage } from "../../packem_shared/storage.d-Cr6f2lac.js";
1
+ import { L as LocalMetaStorageOptions, l as BaseStorageOptions, F as File, M as MetaStorage, e as FileInit, f as FilePart, g as FileQuery, a as FileReturn, B as BaseStorage } from "../../packem_shared/storage.d-D9YA4MRs.js";
2
2
  import 'node:stream';
3
- import { L as LocalMetaStorage } from "../../packem_shared/local-meta-storage.d-B5R1nswK.js";
3
+ import { L as LocalMetaStorage } from "../../packem_shared/local-meta-storage.d-KWaPZTSN.js";
4
4
  import { copy, del, list, put } from '@vercel/blob';
5
5
  import 'node:crypto';
6
6
  import 'node:http';
@@ -1,5 +1,5 @@
1
- import { F as File, a as FileReturn, B as BaseStorage } from "../packem_shared/storage.d-Cr6f2lac.js";
2
- import { A as AudioTransformerConfig, g as AudioTransformResult, h as AudioResampleOptions, i as AudioChannelMixOptions, j as AudioTransformOptions, k as AudioTransformationStep, B as BaseTransformer } from "../packem_shared/types.d-C8eSxqX9.js";
1
+ import { F as File, a as FileReturn, B as BaseStorage } from "../packem_shared/storage.d-D9YA4MRs.js";
2
+ import { A as AudioTransformerConfig, a as AudioTransformResult, b as AudioResampleOptions, c as AudioChannelMixOptions, d as AudioTransformOptions, e as AudioTransformationStep, B as BaseTransformer } from "../packem_shared/types.d-P2Kxr4cB.js";
3
3
  import 'node:stream';
4
4
  import 'node:crypto';
5
5
  import 'node:http';
@@ -1,6 +1,6 @@
1
1
  import { Readable } from 'node:stream';
2
- import { F as File, a as FileReturn, B as BaseStorage } from "../packem_shared/storage.d-Cr6f2lac.js";
3
- import { I as ImageTransformerConfig, T as TransformResult, R as ResizeOptions, C as CropOptions, l as RotateOptions, m as ImageFormat, n as TransformOptions, S as SharpenOptions, o as BlurOptions, M as MedianOptions, p as CLAHEOptions, q as ConvolveOptions, r as ThresholdOptions, s as BooleanOptions, L as LinearOptions, t as RecombineOptions, u as ModulateOptions, v as TintOptions, G as GreyscaleOptions, w as ColourspaceOptions, E as ExtractChannelOptions, J as JoinChannelOptions, x as BandboolOptions, y as AffineOptions, D as DilateOptions, z as ErodeOptions, P as PipelineColourspaceOptions, F as ToColourspaceOptions, H as RemoveAlphaOptions, K as EnsureAlphaOptions, N as TransformationStep, B as BaseTransformer } from "../packem_shared/types.d-C8eSxqX9.js";
2
+ import { F as File, a as FileReturn, B as BaseStorage } from "../packem_shared/storage.d-D9YA4MRs.js";
3
+ import { I as ImageTransformerConfig, T as TransformResult, R as ResizeOptions, C as CropOptions, f as RotateOptions, g as ImageFormat, h as TransformOptions, S as SharpenOptions, i as BlurOptions, M as MedianOptions, j as CLAHEOptions, k as ConvolveOptions, l as ThresholdOptions, m as BooleanOptions, L as LinearOptions, n as RecombineOptions, o as ModulateOptions, p as TintOptions, G as GreyscaleOptions, q as ColourspaceOptions, E as ExtractChannelOptions, J as JoinChannelOptions, r as BandboolOptions, s as AffineOptions, D as DilateOptions, t as ErodeOptions, P as PipelineColourspaceOptions, u as ToColourspaceOptions, v as RemoveAlphaOptions, w as EnsureAlphaOptions, x as TransformationStep, B as BaseTransformer } from "../packem_shared/types.d-P2Kxr4cB.js";
4
4
  import 'node:crypto';
5
5
  import 'node:http';
6
6
  import 'lru-cache';
@@ -1,6 +1,6 @@
1
- export { type i as AudioChannelMixOptions, type h as AudioResampleOptions, type j as AudioTransformOptions, type g as AudioTransformResult, type k as AudioTransformationStep, type A as AudioTransformerConfig, B as BaseTransformer, type C as CropOptions, type m as ImageFormat, type I as ImageTransformerConfig, type U as MediaTransformQuery, type Q as MediaTransformResult, type W as MediaTransformationStep, type O as MediaTransformerConfig, type R as ResizeOptions, type l as RotateOptions, type n as TransformOptions, type T as TransformResult, type N as TransformationStep, type c as VideoCropOptions, type b as VideoResizeOptions, type d as VideoRotateOptions, type e as VideoTransformOptions, type a as VideoTransformResult, type f as VideoTransformationStep, type V as VideoTransformerConfig } from "../packem_shared/types.d-C8eSxqX9.js";
2
- export { M as MediaTransformer } from "../packem_shared/media-transformer.d-DK7NJncf.js";
3
- import { a as FileReturn } from "../packem_shared/storage.d-Cr6f2lac.js";
1
+ export { type c as AudioChannelMixOptions, type b as AudioResampleOptions, type d as AudioTransformOptions, type a as AudioTransformResult, type e as AudioTransformationStep, type A as AudioTransformerConfig, B as BaseTransformer, type C as CropOptions, type g as ImageFormat, type I as ImageTransformerConfig, type U as MediaTransformQuery, type Q as MediaTransformResult, type W as MediaTransformationStep, type O as MediaTransformerConfig, type R as ResizeOptions, type f as RotateOptions, type h as TransformOptions, type T as TransformResult, type x as TransformationStep, type F as VideoCropOptions, type z as VideoResizeOptions, type H as VideoRotateOptions, type K as VideoTransformOptions, type y as VideoTransformResult, type N as VideoTransformationStep, type V as VideoTransformerConfig } from "../packem_shared/types.d-P2Kxr4cB.js";
2
+ export { M as MediaTransformer } from "../packem_shared/media-transformer.d-Dt9W_its.js";
3
+ import { a as FileReturn } from "../packem_shared/storage.d-D9YA4MRs.js";
4
4
  import 'node:stream';
5
5
  import 'node:crypto';
6
6
  import 'node:http';
@@ -1,5 +1,5 @@
1
- import { F as File, a as FileReturn, B as BaseStorage } from "../packem_shared/storage.d-Cr6f2lac.js";
2
- import { V as VideoTransformerConfig, a as VideoTransformResult, b as VideoResizeOptions, c as VideoCropOptions, d as VideoRotateOptions, e as VideoTransformOptions, f as VideoTransformationStep, B as BaseTransformer } from "../packem_shared/types.d-C8eSxqX9.js";
1
+ import { F as File, a as FileReturn, B as BaseStorage } from "../packem_shared/storage.d-D9YA4MRs.js";
2
+ import { V as VideoTransformerConfig, y as VideoTransformResult, z as VideoResizeOptions, F as VideoCropOptions, H as VideoRotateOptions, K as VideoTransformOptions, N as VideoTransformationStep, B as BaseTransformer } from "../packem_shared/types.d-P2Kxr4cB.js";
3
3
  import 'node:stream';
4
4
  import 'node:crypto';
5
5
  import 'node:http';
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@visulima/storage",
3
- "version": "1.0.0-alpha.27",
3
+ "version": "1.0.0-alpha.28",
4
4
  "description": "Visulima upload - Store files in a web-accessible location via a simplified API. Can automatically scale and rotate images. Includes S3, Azure, GCS and local filesystem-based backends with the most convenient features of each.",
5
5
  "keywords": [
6
6
  "anolilab",