@od-oneapp/storage 2026.2.1501-canary.1 → 2026.2.1701

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.
package/client-next.d.mts CHANGED
@@ -1,7 +1,8 @@
1
1
  import { KeyGenerationOptions, KeyPattern, generateMultipleKeys, generateStorageKey, isKeyPattern, normalizeStorageKey, parseStorageKey, sanitizeStorageKey, validateStorageKey } from "./keys.mjs";
2
2
  import { ValidationOptions, formatFileSize, parseFileSize, validateFileSize, validateMimeType } from "./validation.mjs";
3
3
  import { BlobListResponse, ClientUploadOptions, CloudflareImagesBatchToken, CloudflareImagesListOptions, CloudflareImagesTransformOptions, CloudflareImagesVariant, DirectUploadResponse, ListOptions, PresignedUploadUrl, StorageObject, UploadOptions, UploadProgress, VercelBlobOptions } from "./types.mjs";
4
- import { ClientMultipartUpload, ClientPresignedUploadUrl, ClientUploadProgress, downloadFromUrl, generateClientTokenFromReadWriteToken, handleUpload, splitFileIntoChunks, upload, uploadDirectToUrl, uploadFile, uploadWithPresignedUrl } from "./client.mjs";
4
+ import { a as splitFileIntoChunks, i as downloadFromUrl, n as ClientPresignedUploadUrl, o as uploadDirectToUrl, r as ClientUploadProgress, s as uploadWithPresignedUrl, t as ClientMultipartUpload } from "./client-utils-Dx6W25iz.mjs";
5
+ import { generateClientTokenFromReadWriteToken, handleUpload, upload, uploadFile } from "./client.mjs";
5
6
 
6
7
  //#region src/client-next.d.ts
7
8
  declare function uploadFileWithProgress(pathname: string, file: File | Blob, options?: {
@@ -1 +1 @@
1
- {"version":3,"file":"client-next.d.mts","names":[],"sources":["../src/client-next.ts"],"mappings":";;;;;;iBAwBsB,sBAAA,CACpB,QAAA,UACA,IAAA,EAAM,IAAA,GAAO,IAAA,EACb,OAAA;EACE,MAAA;EACA,eAAA;EACA,cAAA;EACA,kBAAA;EACA,aAAA;EACA,WAAA;EACA,SAAA;EACA,gBAAA,IAAoB,KAAA;IAAS,MAAA;IAAgB,KAAA;IAAgB,UAAA;EAAA;EAC7D,eAAA;AAAA,IAED,OAAA;EAAU,GAAA;EAAa,QAAA;AAAA;AAAA,iBA0BJ,mBAAA,CACpB,KAAA,EAAO,IAAA,IACP,WAAA,GAAc,IAAA,EAAM,IAAA,EAAM,KAAA,qBAC1B,OAAA;EACE,MAAA;EACA,eAAA;EACA,cAAA;EACA,kBAAA;EACA,aAAA;EACA,WAAA;EACA,SAAA;EACA,gBAAA,IAAoB,KAAA;IAAS,MAAA;IAAgB,KAAA;IAAgB,UAAA;EAAA;EAC7D,eAAA;EACA,cAAA,IACE,SAAA,UACA,QAAA;IAAY,MAAA;IAAgB,KAAA;IAAgB,UAAA;EAAA;AAAA,IAG/C,OAAA,CAAQ,KAAA;EAAQ,GAAA;EAAa,QAAA;EAAkB,OAAA;EAAkB,KAAA;AAAA;AAAA,iBAqD9C,qBAAA,CACpB,IAAA,EAAM,IAAA,EACN,OAAA;EACE,WAAA;EACA,gBAAA;EACA,iBAAA;AAAA,IAED,OAAA;EAAU,KAAA;EAAgB,MAAA;AAAA"}
1
+ {"version":3,"file":"client-next.d.mts","names":[],"sources":["../src/client-next.ts"],"mappings":";;;;;;;iBAwBsB,sBAAA,CACpB,QAAA,UACA,IAAA,EAAM,IAAA,GAAO,IAAA,EACb,OAAA;EACE,MAAA;EACA,eAAA;EACA,cAAA;EACA,kBAAA;EACA,aAAA;EACA,WAAA;EACA,SAAA;EACA,gBAAA,IAAoB,KAAA;IAAS,MAAA;IAAgB,KAAA;IAAgB,UAAA;EAAA;EAC7D,eAAA;AAAA,IAED,OAAA;EAAU,GAAA;EAAa,QAAA;AAAA;AAAA,iBA0BJ,mBAAA,CACpB,KAAA,EAAO,IAAA,IACP,WAAA,GAAc,IAAA,EAAM,IAAA,EAAM,KAAA,qBAC1B,OAAA;EACE,MAAA;EACA,eAAA;EACA,cAAA;EACA,kBAAA;EACA,aAAA;EACA,WAAA;EACA,SAAA;EACA,gBAAA,IAAoB,KAAA;IAAS,MAAA;IAAgB,KAAA;IAAgB,UAAA;EAAA;EAC7D,eAAA;EACA,cAAA,IACE,SAAA,UACA,QAAA;IAAY,MAAA;IAAgB,KAAA;IAAgB,UAAA;EAAA;AAAA,IAG/C,OAAA,CAAQ,KAAA;EAAQ,GAAA;EAAa,QAAA;EAAkB,OAAA;EAAkB,KAAA;AAAA;AAAA,iBAqD9C,qBAAA,CACpB,IAAA,EAAM,IAAA,EACN,OAAA;EACE,WAAA;EACA,gBAAA;EACA,iBAAA;AAAA,IAED,OAAA;EAAU,KAAA;EAAgB,MAAA;AAAA"}
@@ -0,0 +1,43 @@
1
+ import { PresignedUploadUrl } from "./types.mjs";
2
+
3
+ //#region src/client-utils.d.ts
4
+ interface ClientPresignedUploadUrl extends PresignedUploadUrl {
5
+ key: string;
6
+ }
7
+ interface ClientUploadProgress {
8
+ loaded: number;
9
+ total: number;
10
+ percentage: number;
11
+ }
12
+ declare function uploadWithPresignedUrl(presignedData: ClientPresignedUploadUrl, file: File | Blob, options?: {
13
+ onProgress?: (progress: ClientUploadProgress) => void;
14
+ }): Promise<void>;
15
+ declare function uploadDirectToUrl(url: string, file: File | Blob, options?: {
16
+ headers?: Record<string, string>;
17
+ onProgress?: (progress: ClientUploadProgress) => void;
18
+ }): Promise<void>;
19
+ declare class ClientMultipartUpload {
20
+ private uploadId;
21
+ private key;
22
+ private parts;
23
+ constructor(uploadId: string, key: string);
24
+ uploadPart(partNumber: number, presignedUrl: string, data: Blob, _onProgress?: (progress: ClientUploadProgress) => void): Promise<void>;
25
+ getParts(): {
26
+ PartNumber: number;
27
+ ETag: string;
28
+ }[];
29
+ getUploadId(): string;
30
+ getKey(): string;
31
+ }
32
+ declare function splitFileIntoChunks(file: File | Blob, chunkSize?: number): AsyncGenerator<{
33
+ chunk: Blob;
34
+ partNumber: number;
35
+ start: number;
36
+ end: number;
37
+ }>;
38
+ declare function downloadFromUrl(url: string, options?: {
39
+ onProgress?: (progress: ClientUploadProgress) => void;
40
+ }): Promise<Blob>;
41
+ //#endregion
42
+ export { splitFileIntoChunks as a, downloadFromUrl as i, ClientPresignedUploadUrl as n, uploadDirectToUrl as o, ClientUploadProgress as r, uploadWithPresignedUrl as s, ClientMultipartUpload as t };
43
+ //# sourceMappingURL=client-utils-Dx6W25iz.d.mts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"client-utils-Dx6W25iz.d.mts","names":[],"sources":["../src/client-utils.ts"],"mappings":";;;UAoBiB,wBAAA,SAAiC,kBAAA;EAChD,GAAA;AAAA;AAAA,UAOe,oBAAA;EACf,MAAA;EACA,KAAA;EACA,UAAA;AAAA;AAAA,iBAMoB,sBAAA,CACpB,aAAA,EAAe,wBAAA,EACf,IAAA,EAAM,IAAA,GAAO,IAAA,EACb,OAAA;EACE,UAAA,IAAc,QAAA,EAAU,oBAAA;AAAA,IAEzB,OAAA;AAAA,iBA2DmB,iBAAA,CACpB,GAAA,UACA,IAAA,EAAM,IAAA,GAAO,IAAA,EACb,OAAA;EACE,OAAA,GAAU,MAAA;EACV,UAAA,IAAc,QAAA,EAAU,oBAAA;AAAA,IAEzB,OAAA;AAAA,cAyDU,qBAAA;EAAA,QACH,QAAA;EAAA,QACA,GAAA;EAAA,QACA,KAAA;cAEI,QAAA,UAAkB,GAAA;EAKxB,UAAA,CACJ,UAAA,UACA,YAAA,UACA,IAAA,EAAM,IAAA,EACN,WAAA,IAAe,QAAA,EAAU,oBAAA,YACxB,OAAA;EAgBH,QAAA,CAAA;;;;EAIA,WAAA,CAAA;EAIA,MAAA,CAAA;AAAA;AAAA,iBAQqB,mBAAA,CACrB,IAAA,EAAM,IAAA,GAAO,IAAA,EACb,SAAA,YACC,cAAA;EAAiB,KAAA,EAAO,IAAA;EAAM,UAAA;EAAoB,KAAA;EAAe,GAAA;AAAA;AAAA,iBAsB9C,eAAA,CACpB,GAAA,UACA,OAAA;EACE,UAAA,IAAc,QAAA,EAAU,oBAAA;AAAA,IAEzB,OAAA,CAAQ,IAAA"}
package/client.d.mts CHANGED
@@ -1,47 +1,9 @@
1
1
  import { KeyGenerationOptions, KeyPattern, generateMultipleKeys, generateStorageKey, isKeyPattern, normalizeStorageKey, parseStorageKey, sanitizeStorageKey, validateStorageKey } from "./keys.mjs";
2
2
  import { ValidationOptions, formatFileSize, parseFileSize, validateFileSize, validateMimeType } from "./validation.mjs";
3
3
  import { BlobListResponse, ClientUploadOptions, CloudflareImagesBatchToken, CloudflareImagesListOptions, CloudflareImagesTransformOptions, CloudflareImagesVariant, DirectUploadResponse, ListOptions, PresignedUploadUrl, StorageObject, UploadOptions, UploadProgress, VercelBlobOptions } from "./types.mjs";
4
+ import { a as splitFileIntoChunks, i as downloadFromUrl, n as ClientPresignedUploadUrl, o as uploadDirectToUrl, r as ClientUploadProgress, s as uploadWithPresignedUrl, t as ClientMultipartUpload } from "./client-utils-Dx6W25iz.mjs";
4
5
  import { generateClientTokenFromReadWriteToken, handleUpload, upload } from "@vercel/blob/client";
5
6
 
6
- //#region src/client-utils.d.ts
7
- interface ClientPresignedUploadUrl extends PresignedUploadUrl {
8
- key: string;
9
- }
10
- interface ClientUploadProgress {
11
- loaded: number;
12
- total: number;
13
- percentage: number;
14
- }
15
- declare function uploadWithPresignedUrl(presignedData: ClientPresignedUploadUrl, file: File | Blob, options?: {
16
- onProgress?: (progress: ClientUploadProgress) => void;
17
- }): Promise<void>;
18
- declare function uploadDirectToUrl(url: string, file: File | Blob, options?: {
19
- headers?: Record<string, string>;
20
- onProgress?: (progress: ClientUploadProgress) => void;
21
- }): Promise<void>;
22
- declare class ClientMultipartUpload {
23
- private uploadId;
24
- private key;
25
- private parts;
26
- constructor(uploadId: string, key: string);
27
- uploadPart(partNumber: number, presignedUrl: string, data: Blob, _onProgress?: (progress: ClientUploadProgress) => void): Promise<void>;
28
- getParts(): {
29
- PartNumber: number;
30
- ETag: string;
31
- }[];
32
- getUploadId(): string;
33
- getKey(): string;
34
- }
35
- declare function splitFileIntoChunks(file: File | Blob, chunkSize?: number): AsyncGenerator<{
36
- chunk: Blob;
37
- partNumber: number;
38
- start: number;
39
- end: number;
40
- }>;
41
- declare function downloadFromUrl(url: string, options?: {
42
- onProgress?: (progress: ClientUploadProgress) => void;
43
- }): Promise<Blob>;
44
- //#endregion
45
7
  //#region src/client.d.ts
46
8
  declare function uploadFile(pathname: string, file: File | Blob, options?: {
47
9
  access?: 'public' | 'private';
package/client.d.mts.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"client.d.mts","names":[],"sources":["../src/client-utils.ts","../src/client.ts"],"mappings":";;;;;;UAoBiB,wBAAA,SAAiC,kBAAA;EAChD,GAAA;AAAA;AAAA,UAOe,oBAAA;EACf,MAAA;EACA,KAAA;EACA,UAAA;AAAA;AAAA,iBAMoB,sBAAA,CACpB,aAAA,EAAe,wBAAA,EACf,IAAA,EAAM,IAAA,GAAO,IAAA,EACb,OAAA;EACE,UAAA,IAAc,QAAA,EAAU,oBAAA;AAAA,IAEzB,OAAA;AAAA,iBA2DmB,iBAAA,CACpB,GAAA,UACA,IAAA,EAAM,IAAA,GAAO,IAAA,EACb,OAAA;EACE,OAAA,GAAU,MAAA;EACV,UAAA,IAAc,QAAA,EAAU,oBAAA;AAAA,IAEzB,OAAA;AAAA,cAyDU,qBAAA;EAAA,QACH,QAAA;EAAA,QACA,GAAA;EAAA,QACA,KAAA;cAEI,QAAA,UAAkB,GAAA;EAKxB,UAAA,CACJ,UAAA,UACA,YAAA,UACA,IAAA,EAAM,IAAA,EACN,WAAA,IAAe,QAAA,EAAU,oBAAA,YACxB,OAAA;EAgBH,QAAA,CAAA;;;;EAIA,WAAA,CAAA;EAIA,MAAA,CAAA;AAAA;AAAA,iBAQqB,mBAAA,CACrB,IAAA,EAAM,IAAA,GAAO,IAAA,EACb,SAAA,YACC,cAAA;EAAiB,KAAA,EAAO,IAAA;EAAM,UAAA;EAAoB,KAAA;EAAe,GAAA;AAAA;AAAA,iBAsB9C,eAAA,CACpB,GAAA,UACA,OAAA;EACE,UAAA,IAAc,QAAA,EAAU,oBAAA;AAAA,IAEzB,OAAA,CAAQ,IAAA;;;iBC/LW,UAAA,CACpB,QAAA,UACA,IAAA,EAAM,IAAA,GAAO,IAAA,EACb,OAAA;EACE,MAAA;EACA,eAAA;EACA,cAAA;EACA,kBAAA;EACA,aAAA;EACA,WAAA;EACA,SAAA;EACA,gBAAA,IAAoB,KAAA;IAAS,MAAA;IAAgB,KAAA;IAAgB,UAAA;EAAA;EAC7D,eAAA;AAAA,IAED,OAAA;EAAU,GAAA;EAAa,QAAA;AAAA"}
1
+ {"version":3,"file":"client.d.mts","names":[],"sources":["../src/client.ts"],"mappings":";;;;;;;iBAoDsB,UAAA,CACpB,QAAA,UACA,IAAA,EAAM,IAAA,GAAO,IAAA,EACb,OAAA;EACE,MAAA;EACA,eAAA;EACA,cAAA;EACA,kBAAA;EACA,aAAA;EACA,WAAA;EACA,SAAA;EACA,gBAAA,IAAoB,KAAA;IAAS,MAAA;IAAgB,KAAA;IAAgB,UAAA;EAAA;EAC7D,eAAA;AAAA,IAED,OAAA;EAAU,GAAA;EAAa,QAAA;AAAA"}
@@ -125,4 +125,4 @@ function getEnvWithDefaults() {
125
125
 
126
126
  //#endregion
127
127
  export { getEnvWithDefaults as n, safeEnv as r, env as t };
128
- //# sourceMappingURL=env-BVHLmQdh.mjs.map
128
+ //# sourceMappingURL=env-DQI-n3Mw.mjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"env-BVHLmQdh.mjs","names":[],"sources":["../env.ts"],"sourcesContent":["/**\n * @fileoverview env.ts\n */\n\nimport { logWarn } from '@repo/shared/logger';\nimport { createEnv } from '@t3-oss/env-core';\nimport { z } from 'zod/v4';\n\n/**\n * Helper to parse and validate integer environment variables\n */\nconst parsePositiveInteger = (val: string, fieldName: string): number => {\n const parsed = Number.parseInt(val, 10);\n if (!Number.isFinite(parsed) || !Number.isInteger(parsed) || parsed < 0) {\n throw new Error(`${fieldName} must be a valid positive integer, got: ${val}`);\n }\n return parsed;\n};\n\nexport const env = createEnv({\n server: {\n // Vercel Blob\n VERCEL_BLOB_READ_WRITE_TOKEN: z.string().min(1).optional(),\n // Cloudflare Images\n CLOUDFLARE_IMAGES_ACCOUNT_ID: z.string().min(1).optional(),\n CLOUDFLARE_IMAGES_API_TOKEN: z.string().min(1).optional(),\n CLOUDFLARE_IMAGES_DELIVERY_URL: z.string().url().optional(),\n CLOUDFLARE_IMAGES_SIGNING_KEY: z.string().min(1).optional(),\n // Cloudflare R2 - Legacy single config\n R2_ACCESS_KEY_ID: z.string().min(1).optional(),\n R2_ACCOUNT_ID: z.string().min(1).optional(),\n R2_BUCKET: z.string().min(1).optional(),\n R2_SECRET_ACCESS_KEY: z.string().min(1).optional(),\n // Multi-R2 config as JSON\n R2_CREDENTIALS: z\n .string()\n .transform(val => {\n if (!val) return undefined;\n try {\n return JSON.parse(val);\n } catch {\n return undefined;\n }\n })\n .pipe(\n z\n .array(\n z.object({\n name: z.string().optional(),\n bucket: z.string(),\n accountId: z.string(),\n accessKeyId: z.string(),\n secretAccessKey: z.string(),\n }),\n )\n .optional(),\n )\n .optional(),\n // Full storage config as JSON\n STORAGE_CONFIG: z\n .string()\n .transform(val => {\n if (!val) return undefined;\n try {\n return JSON.parse(val);\n } catch {\n return undefined;\n }\n })\n .optional(),\n STORAGE_LOG_LEVEL: z.enum(['info', 'warn', 'error']).default('error'),\n STORAGE_LOG_PERFORMANCE: z\n .string()\n .default('false')\n .transform((val: string) => val === 'true'),\n STORAGE_LOG_PROVIDER: z.enum(['console', 'sentry', 'pino']).default('console'),\n STORAGE_PROVIDER: z\n .enum(['vercel-blob', 'cloudflare-r2', 'cloudflare-images', 'multi'])\n .optional(),\n // File size limits (bytes)\n STORAGE_MAX_FILE_SIZE: z\n .string()\n .default('104857600') // 100MB default\n .transform((val: string) => parsePositiveInteger(val, 'STORAGE_MAX_FILE_SIZE')),\n STORAGE_MAX_FILES_PER_UPLOAD: z\n .string()\n .default('10')\n .transform((val: string) => parsePositiveInteger(val, 'STORAGE_MAX_FILES_PER_UPLOAD')),\n // Rate limiting\n STORAGE_RATE_LIMIT_REQUESTS: z\n .string()\n .default('100')\n .transform((val: string) => parsePositiveInteger(val, 'STORAGE_RATE_LIMIT_REQUESTS')),\n STORAGE_RATE_LIMIT_WINDOW_MS: z\n .string()\n .default('60000') // 1 minute\n .transform((val: string) => parsePositiveInteger(val, 'STORAGE_RATE_LIMIT_WINDOW_MS')),\n // Security feature flags (secure-by-default for production)\n STORAGE_ENFORCE_AUTH: z\n .string()\n .default('true')\n .transform((val: string) => val === 'true'),\n STORAGE_ENABLE_RATE_LIMIT: z\n .string()\n .default('true')\n .transform((val: string) => val === 'true'),\n STORAGE_ENFORCE_CSRF: z\n .string()\n .default('true')\n .transform((val: string) => val === 'true'),\n },\n runtimeEnv: process.env,\n emptyStringAsUndefined: true,\n onValidationError: error => {\n const message = Array.isArray(error) ? error.map(e => e.message).join(', ') : String(error);\n logWarn('Storage environment validation failed:', { message });\n // Don't throw in packages - use fallbacks for resilience\n return undefined as never;\n },\n});\n\n/**\n * Provide a storage environment configuration with safe defaults.\n *\n * Returns the validated `env` from createEnv. The fallback code below exists\n * for edge cases where env validation might fail silently, but in practice\n * createEnv always returns a truthy object (even with undefined values).\n *\n * @returns The validated environment configuration\n */\nexport function safeEnv(): typeof env {\n // env from createEnv is always truthy, this is the primary return path\n return env;\n}\n\n/**\n * Get environment with fallback defaults for resilience.\n * Use this when you need guaranteed values even if env validation failed.\n *\n * @returns Environment configuration with fallback defaults applied\n */\nexport function getEnvWithDefaults() {\n return {\n VERCEL_BLOB_READ_WRITE_TOKEN: process.env.VERCEL_BLOB_READ_WRITE_TOKEN ?? '',\n CLOUDFLARE_IMAGES_ACCOUNT_ID: process.env.CLOUDFLARE_IMAGES_ACCOUNT_ID ?? '',\n CLOUDFLARE_IMAGES_API_TOKEN: process.env.CLOUDFLARE_IMAGES_API_TOKEN ?? '',\n CLOUDFLARE_IMAGES_DELIVERY_URL: process.env.CLOUDFLARE_IMAGES_DELIVERY_URL ?? '',\n CLOUDFLARE_IMAGES_SIGNING_KEY: process.env.CLOUDFLARE_IMAGES_SIGNING_KEY ?? '',\n R2_ACCESS_KEY_ID: process.env.R2_ACCESS_KEY_ID ?? '',\n R2_ACCOUNT_ID: process.env.R2_ACCOUNT_ID ?? '',\n R2_BUCKET: process.env.R2_BUCKET ?? '',\n R2_SECRET_ACCESS_KEY: process.env.R2_SECRET_ACCESS_KEY ?? '',\n R2_CREDENTIALS: process.env.R2_CREDENTIALS ?? '',\n STORAGE_CONFIG: process.env.STORAGE_CONFIG ?? '',\n STORAGE_LOG_LEVEL: process.env.STORAGE_LOG_LEVEL ?? 'error',\n STORAGE_LOG_PERFORMANCE: process.env.STORAGE_LOG_PERFORMANCE === 'true',\n STORAGE_LOG_PROVIDER: process.env.STORAGE_LOG_PROVIDER ?? 'console',\n STORAGE_PROVIDER: process.env.STORAGE_PROVIDER ?? '',\n STORAGE_MAX_FILE_SIZE: parsePositiveInteger(\n process.env.STORAGE_MAX_FILE_SIZE ?? '104857600',\n 'STORAGE_MAX_FILE_SIZE',\n ),\n STORAGE_MAX_FILES_PER_UPLOAD: parsePositiveInteger(\n process.env.STORAGE_MAX_FILES_PER_UPLOAD ?? '10',\n 'STORAGE_MAX_FILES_PER_UPLOAD',\n ),\n STORAGE_RATE_LIMIT_REQUESTS: parsePositiveInteger(\n process.env.STORAGE_RATE_LIMIT_REQUESTS ?? '100',\n 'STORAGE_RATE_LIMIT_REQUESTS',\n ),\n STORAGE_RATE_LIMIT_WINDOW_MS: parsePositiveInteger(\n process.env.STORAGE_RATE_LIMIT_WINDOW_MS ?? '60000',\n 'STORAGE_RATE_LIMIT_WINDOW_MS',\n ),\n STORAGE_ENFORCE_AUTH: process.env.STORAGE_ENFORCE_AUTH !== 'false',\n STORAGE_ENABLE_RATE_LIMIT: process.env.STORAGE_ENABLE_RATE_LIMIT !== 'false',\n STORAGE_ENFORCE_CSRF: process.env.STORAGE_ENFORCE_CSRF !== 'false',\n };\n}\n\n// Export type for better DX\nexport type Env = typeof env;\n"],"mappings":"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"}
1
+ {"version":3,"file":"env-DQI-n3Mw.mjs","names":[],"sources":["../env.ts"],"sourcesContent":["/**\n * @fileoverview env.ts\n */\n\nimport { logWarn } from '@repo/shared/logger';\nimport { createEnv } from '@t3-oss/env-core';\nimport { z } from 'zod/v4';\n\n/**\n * Helper to parse and validate integer environment variables\n */\nconst parsePositiveInteger = (val: string, fieldName: string): number => {\n const parsed = Number.parseInt(val, 10);\n if (!Number.isFinite(parsed) || !Number.isInteger(parsed) || parsed < 0) {\n throw new Error(`${fieldName} must be a valid positive integer, got: ${val}`);\n }\n return parsed;\n};\n\nexport const env = createEnv({\n server: {\n // Vercel Blob\n VERCEL_BLOB_READ_WRITE_TOKEN: z.string().min(1).optional(),\n // Cloudflare Images\n CLOUDFLARE_IMAGES_ACCOUNT_ID: z.string().min(1).optional(),\n CLOUDFLARE_IMAGES_API_TOKEN: z.string().min(1).optional(),\n CLOUDFLARE_IMAGES_DELIVERY_URL: z.string().url().optional(),\n CLOUDFLARE_IMAGES_SIGNING_KEY: z.string().min(1).optional(),\n // Cloudflare R2 - Legacy single config\n R2_ACCESS_KEY_ID: z.string().min(1).optional(),\n R2_ACCOUNT_ID: z.string().min(1).optional(),\n R2_BUCKET: z.string().min(1).optional(),\n R2_SECRET_ACCESS_KEY: z.string().min(1).optional(),\n // Multi-R2 config as JSON\n R2_CREDENTIALS: z\n .string()\n .transform(val => {\n if (!val) return undefined;\n try {\n return JSON.parse(val);\n } catch {\n return undefined;\n }\n })\n .pipe(\n z\n .array(\n z.object({\n name: z.string().optional(),\n bucket: z.string(),\n accountId: z.string(),\n accessKeyId: z.string(),\n secretAccessKey: z.string(),\n }),\n )\n .optional(),\n )\n .optional(),\n // Full storage config as JSON\n STORAGE_CONFIG: z\n .string()\n .transform(val => {\n if (!val) return undefined;\n try {\n return JSON.parse(val);\n } catch {\n return undefined;\n }\n })\n .optional(),\n STORAGE_LOG_LEVEL: z.enum(['info', 'warn', 'error']).default('error'),\n STORAGE_LOG_PERFORMANCE: z\n .string()\n .default('false')\n .transform((val: string) => val === 'true'),\n STORAGE_LOG_PROVIDER: z.enum(['console', 'sentry', 'pino']).default('console'),\n STORAGE_PROVIDER: z\n .enum(['vercel-blob', 'cloudflare-r2', 'cloudflare-images', 'multi'])\n .optional(),\n // File size limits (bytes)\n STORAGE_MAX_FILE_SIZE: z\n .string()\n .default('104857600') // 100MB default\n .transform((val: string) => parsePositiveInteger(val, 'STORAGE_MAX_FILE_SIZE')),\n STORAGE_MAX_FILES_PER_UPLOAD: z\n .string()\n .default('10')\n .transform((val: string) => parsePositiveInteger(val, 'STORAGE_MAX_FILES_PER_UPLOAD')),\n // Rate limiting\n STORAGE_RATE_LIMIT_REQUESTS: z\n .string()\n .default('100')\n .transform((val: string) => parsePositiveInteger(val, 'STORAGE_RATE_LIMIT_REQUESTS')),\n STORAGE_RATE_LIMIT_WINDOW_MS: z\n .string()\n .default('60000') // 1 minute\n .transform((val: string) => parsePositiveInteger(val, 'STORAGE_RATE_LIMIT_WINDOW_MS')),\n // Security feature flags (secure-by-default for production)\n STORAGE_ENFORCE_AUTH: z\n .string()\n .default('true')\n .transform((val: string) => val === 'true'),\n STORAGE_ENABLE_RATE_LIMIT: z\n .string()\n .default('true')\n .transform((val: string) => val === 'true'),\n STORAGE_ENFORCE_CSRF: z\n .string()\n .default('true')\n .transform((val: string) => val === 'true'),\n },\n runtimeEnv: process.env,\n emptyStringAsUndefined: true,\n onValidationError: error => {\n const message = Array.isArray(error) ? error.map(e => e.message).join(', ') : String(error);\n logWarn('Storage environment validation failed:', { message });\n // Don't throw in packages - use fallbacks for resilience\n return undefined as never;\n },\n});\n\n/**\n * Provide a storage environment configuration with safe defaults.\n *\n * Returns the validated `env` from createEnv. The fallback code below exists\n * for edge cases where env validation might fail silently, but in practice\n * createEnv always returns a truthy object (even with undefined values).\n *\n * @returns The validated environment configuration\n */\nexport function safeEnv(): typeof env {\n // env from createEnv is always truthy, this is the primary return path\n return env;\n}\n\n/**\n * Get environment with fallback defaults for resilience.\n * Use this when you need guaranteed values even if env validation failed.\n *\n * @returns Environment configuration with fallback defaults applied\n */\nexport function getEnvWithDefaults() {\n return {\n VERCEL_BLOB_READ_WRITE_TOKEN: process.env.VERCEL_BLOB_READ_WRITE_TOKEN ?? '',\n CLOUDFLARE_IMAGES_ACCOUNT_ID: process.env.CLOUDFLARE_IMAGES_ACCOUNT_ID ?? '',\n CLOUDFLARE_IMAGES_API_TOKEN: process.env.CLOUDFLARE_IMAGES_API_TOKEN ?? '',\n CLOUDFLARE_IMAGES_DELIVERY_URL: process.env.CLOUDFLARE_IMAGES_DELIVERY_URL ?? '',\n CLOUDFLARE_IMAGES_SIGNING_KEY: process.env.CLOUDFLARE_IMAGES_SIGNING_KEY ?? '',\n R2_ACCESS_KEY_ID: process.env.R2_ACCESS_KEY_ID ?? '',\n R2_ACCOUNT_ID: process.env.R2_ACCOUNT_ID ?? '',\n R2_BUCKET: process.env.R2_BUCKET ?? '',\n R2_SECRET_ACCESS_KEY: process.env.R2_SECRET_ACCESS_KEY ?? '',\n R2_CREDENTIALS: process.env.R2_CREDENTIALS ?? '',\n STORAGE_CONFIG: process.env.STORAGE_CONFIG ?? '',\n STORAGE_LOG_LEVEL: process.env.STORAGE_LOG_LEVEL ?? 'error',\n STORAGE_LOG_PERFORMANCE: process.env.STORAGE_LOG_PERFORMANCE === 'true',\n STORAGE_LOG_PROVIDER: process.env.STORAGE_LOG_PROVIDER ?? 'console',\n STORAGE_PROVIDER: process.env.STORAGE_PROVIDER ?? '',\n STORAGE_MAX_FILE_SIZE: parsePositiveInteger(\n process.env.STORAGE_MAX_FILE_SIZE ?? '104857600',\n 'STORAGE_MAX_FILE_SIZE',\n ),\n STORAGE_MAX_FILES_PER_UPLOAD: parsePositiveInteger(\n process.env.STORAGE_MAX_FILES_PER_UPLOAD ?? '10',\n 'STORAGE_MAX_FILES_PER_UPLOAD',\n ),\n STORAGE_RATE_LIMIT_REQUESTS: parsePositiveInteger(\n process.env.STORAGE_RATE_LIMIT_REQUESTS ?? '100',\n 'STORAGE_RATE_LIMIT_REQUESTS',\n ),\n STORAGE_RATE_LIMIT_WINDOW_MS: parsePositiveInteger(\n process.env.STORAGE_RATE_LIMIT_WINDOW_MS ?? '60000',\n 'STORAGE_RATE_LIMIT_WINDOW_MS',\n ),\n STORAGE_ENFORCE_AUTH: process.env.STORAGE_ENFORCE_AUTH !== 'false',\n STORAGE_ENABLE_RATE_LIMIT: process.env.STORAGE_ENABLE_RATE_LIMIT !== 'false',\n STORAGE_ENFORCE_CSRF: process.env.STORAGE_ENFORCE_CSRF !== 'false',\n };\n}\n\n// Export type for better DX\nexport type Env = typeof env;\n"],"mappings":"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"}
package/env.mjs CHANGED
@@ -1,3 +1,3 @@
1
- import { n as getEnvWithDefaults, r as safeEnv, t as env } from "./env-BVHLmQdh.mjs";
1
+ import { n as getEnvWithDefaults, r as safeEnv, t as env } from "./env-DQI-n3Mw.mjs";
2
2
 
3
3
  export { env, getEnvWithDefaults, safeEnv };