@nestm/storage 0.1.0-alpha.2 → 0.1.0-alpha.4

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 (66) hide show
  1. package/CHANGELOG.md +44 -0
  2. package/README.md +196 -15
  3. package/SECURITY.md +23 -0
  4. package/dist/files-sdk/files-sdk.driver.d.ts +31 -2
  5. package/dist/files-sdk/files-sdk.driver.d.ts.map +1 -1
  6. package/dist/files-sdk/files-sdk.driver.js +141 -20
  7. package/dist/files-sdk/files-sdk.driver.js.map +1 -1
  8. package/dist/files-sdk/fs/index.d.ts +21 -0
  9. package/dist/files-sdk/fs/index.d.ts.map +1 -0
  10. package/dist/files-sdk/fs/index.js +20 -0
  11. package/dist/files-sdk/fs/index.js.map +1 -0
  12. package/dist/files-sdk/index.d.ts +1 -1
  13. package/dist/files-sdk/index.d.ts.map +1 -1
  14. package/dist/files-sdk/index.js.map +1 -1
  15. package/dist/files-sdk/provider/index.d.ts +54 -0
  16. package/dist/files-sdk/provider/index.d.ts.map +1 -0
  17. package/dist/files-sdk/provider/index.js +80 -0
  18. package/dist/files-sdk/provider/index.js.map +1 -0
  19. package/dist/files-sdk/s3/index.d.ts +25 -0
  20. package/dist/files-sdk/s3/index.d.ts.map +1 -0
  21. package/dist/files-sdk/s3/index.js +119 -0
  22. package/dist/files-sdk/s3/index.js.map +1 -0
  23. package/dist/gateway/index.d.ts +1 -1
  24. package/dist/gateway/index.d.ts.map +1 -1
  25. package/dist/gateway/index.js.map +1 -1
  26. package/dist/gateway/storage-gateway-fastify-parser.d.ts.map +1 -1
  27. package/dist/gateway/storage-gateway-fastify-parser.js.map +1 -1
  28. package/dist/gateway/storage-gateway.controller.d.ts +12 -11
  29. package/dist/gateway/storage-gateway.controller.d.ts.map +1 -1
  30. package/dist/gateway/storage-gateway.controller.js +209 -65
  31. package/dist/gateway/storage-gateway.controller.js.map +1 -1
  32. package/dist/gateway/storage-gateway.guard.d.ts.map +1 -1
  33. package/dist/gateway/storage-gateway.guard.js.map +1 -1
  34. package/dist/gateway/storage-gateway.module.d.ts.map +1 -1
  35. package/dist/gateway/storage-gateway.module.js +60 -1
  36. package/dist/gateway/storage-gateway.module.js.map +1 -1
  37. package/dist/gateway/storage-gateway.tokens.d.ts +1 -0
  38. package/dist/gateway/storage-gateway.tokens.d.ts.map +1 -1
  39. package/dist/gateway/storage-gateway.tokens.js +1 -0
  40. package/dist/gateway/storage-gateway.tokens.js.map +1 -1
  41. package/dist/gateway/storage-gateway.types.d.ts +53 -10
  42. package/dist/gateway/storage-gateway.types.d.ts.map +1 -1
  43. package/dist/gateway/storage-gateway.types.js.map +1 -1
  44. package/dist/inject-storage.decorator.js.map +1 -1
  45. package/dist/storage-upload-control.d.ts.map +1 -1
  46. package/dist/storage.client.d.ts +8 -1
  47. package/dist/storage.client.d.ts.map +1 -1
  48. package/dist/storage.client.js +40 -0
  49. package/dist/storage.client.js.map +1 -1
  50. package/dist/storage.driver.d.ts +6 -1
  51. package/dist/storage.driver.d.ts.map +1 -1
  52. package/dist/storage.driver.js.map +1 -1
  53. package/dist/storage.error.d.ts +13 -10
  54. package/dist/storage.error.d.ts.map +1 -1
  55. package/dist/storage.error.js +33 -1
  56. package/dist/storage.error.js.map +1 -1
  57. package/dist/storage.module.d.ts.map +1 -1
  58. package/dist/storage.module.js.map +1 -1
  59. package/dist/storage.service.d.ts.map +1 -1
  60. package/dist/storage.service.js.map +1 -1
  61. package/dist/storage.tokens.js.map +1 -1
  62. package/dist/storage.types.d.ts +39 -1
  63. package/dist/storage.types.d.ts.map +1 -1
  64. package/dist/storage.types.js.map +1 -1
  65. package/dist/testing/index.js.map +1 -1
  66. package/package.json +38 -6
@@ -1,29 +1,121 @@
1
1
  import { Readable } from 'node:stream';
2
2
  import { Files, FilesError, } from 'files-sdk';
3
- import { StorageError, StorageErrorCode } from '../storage.error.js';
3
+ import { StorageError, StorageErrorCode, isStorageError, } from '../storage.error.js';
4
4
  import { getFilesSdkUploadControl } from '../storage-upload-control.js';
5
- function mapFilesError(error) {
6
- if (error instanceof StorageError) {
5
+ function conditionalCopyAdapterOf(adapter) {
6
+ if (typeof adapter !== 'object' ||
7
+ adapter === null ||
8
+ !('conditionalCopy' in adapter) ||
9
+ !('promote' in adapter)) {
10
+ return undefined;
11
+ }
12
+ const candidate = adapter;
13
+ const capability = candidate.conditionalCopy;
14
+ if (capability === undefined ||
15
+ typeof capability.supported !== 'boolean' ||
16
+ typeof capability.etag !== 'boolean' ||
17
+ typeof capability.version !== 'boolean' ||
18
+ typeof candidate.promote !== 'function') {
19
+ return undefined;
20
+ }
21
+ return candidate;
22
+ }
23
+ function signedUploadPolicyAdapterOf(adapter) {
24
+ if (typeof adapter !== 'object' ||
25
+ adapter === null ||
26
+ !('signedUploadPolicy' in adapter)) {
27
+ return undefined;
28
+ }
29
+ const candidate = adapter;
30
+ const capability = candidate.signedUploadPolicy;
31
+ if (capability === undefined ||
32
+ typeof capability.contentType !== 'boolean' ||
33
+ typeof capability.sizeRange !== 'boolean') {
34
+ return undefined;
35
+ }
36
+ return candidate;
37
+ }
38
+ function signedDownloadPolicyAdapterOf(adapter) {
39
+ if (typeof adapter !== 'object' ||
40
+ adapter === null ||
41
+ !('signedDownloadPolicy' in adapter)) {
42
+ return undefined;
43
+ }
44
+ const candidate = adapter;
45
+ const capability = candidate.signedDownloadPolicy;
46
+ if (capability === undefined || typeof capability.expiresIn !== 'boolean') {
47
+ return undefined;
48
+ }
49
+ return candidate;
50
+ }
51
+ function isFilesErrorCode(value) {
52
+ return (value === 'NotFound' ||
53
+ value === 'Unauthorized' ||
54
+ value === 'Conflict' ||
55
+ value === 'ReadOnly' ||
56
+ value === 'Provider');
57
+ }
58
+ function isFilesErrorLike(error) {
59
+ if (error instanceof FilesError) {
60
+ return true;
61
+ }
62
+ if (!(error instanceof Error)) {
63
+ return false;
64
+ }
65
+ try {
66
+ return (error.name === 'FilesError' &&
67
+ typeof error.message === 'string' &&
68
+ 'code' in error &&
69
+ isFilesErrorCode(error.code) &&
70
+ 'aborted' in error &&
71
+ typeof error.aborted === 'boolean' &&
72
+ 'timedOut' in error &&
73
+ typeof error.timedOut === 'boolean' &&
74
+ 'permanent' in error &&
75
+ typeof error.permanent === 'boolean');
76
+ }
77
+ catch {
78
+ return false;
79
+ }
80
+ }
81
+ function unwrapFilesError(error) {
82
+ const seen = new Set();
83
+ let current = error;
84
+ while (current.code === 'Provider' &&
85
+ !current.aborted &&
86
+ !current.timedOut &&
87
+ !current.permanent &&
88
+ isFilesErrorLike(current.cause) &&
89
+ current.message === current.cause.message &&
90
+ !seen.has(current.cause)) {
91
+ seen.add(current);
92
+ current = current.cause;
93
+ }
94
+ return current;
95
+ }
96
+ export function mapFilesSdkError(error) {
97
+ if (isStorageError(error)) {
7
98
  return error;
8
99
  }
9
- if (!(error instanceof FilesError)) {
100
+ if (!isFilesErrorLike(error)) {
10
101
  return new StorageError(error instanceof Error ? error.message : String(error), {
11
102
  cause: error,
12
103
  code: StorageErrorCode.PROVIDER,
13
104
  });
14
105
  }
15
- if (error.cause instanceof StorageError) {
16
- return error.cause;
106
+ const filesError = unwrapFilesError(error);
107
+ if (isStorageError(filesError.cause)) {
108
+ return filesError.cause;
17
109
  }
18
110
  let code;
19
- if (error.timedOut) {
111
+ if (filesError.timedOut) {
20
112
  code = StorageErrorCode.TIMEOUT;
21
113
  }
22
- else if (error.aborted) {
114
+ else if (filesError.aborted) {
23
115
  code = StorageErrorCode.ABORTED;
24
116
  }
25
117
  else {
26
- switch (error.code) {
118
+ switch (filesError.code) {
27
119
  case 'NotFound':
28
120
  code = StorageErrorCode.NOT_FOUND;
29
121
  break;
@@ -37,18 +129,18 @@ function mapFilesError(error) {
37
129
  code = StorageErrorCode.READ_ONLY;
38
130
  break;
39
131
  case 'Provider':
40
- code = /(?:not supported|does not support|unsupported)/iu.test(error.message)
132
+ code = /(?:not supported|does not support|unsupported)/iu.test(filesError.message)
41
133
  ? StorageErrorCode.NOT_SUPPORTED
42
134
  : StorageErrorCode.PROVIDER;
43
135
  break;
44
136
  }
45
137
  }
46
- return new StorageError(error.message, {
47
- aborted: error.aborted,
48
- cause: error.cause ?? error,
138
+ return new StorageError(filesError.message, {
139
+ aborted: filesError.aborted,
140
+ cause: filesError.cause ?? error,
49
141
  code,
50
- permanent: error.permanent,
51
- timedOut: error.timedOut,
142
+ permanent: filesError.permanent,
143
+ timedOut: filesError.timedOut,
52
144
  });
53
145
  }
54
146
  function mapRetryOptions(retries) {
@@ -60,7 +152,7 @@ function mapRetryOptions(retries) {
60
152
  ...(retries.backoff !== undefined && {
61
153
  backoff: ({ attempt, error }) => retries.backoff?.({
62
154
  attempt,
63
- error: mapFilesError(error),
155
+ error: mapFilesSdkError(error),
64
156
  }) ?? 0,
65
157
  }),
66
158
  };
@@ -114,7 +206,7 @@ function normalizeDownloadStream(source) {
114
206
  await activeReader.cancel(reason);
115
207
  }
116
208
  catch (error) {
117
- throw mapFilesError(error);
209
+ throw mapFilesSdkError(error);
118
210
  }
119
211
  finally {
120
212
  release();
@@ -137,7 +229,7 @@ function normalizeDownloadStream(source) {
137
229
  }
138
230
  catch (error) {
139
231
  release();
140
- controller.error(mapFilesError(error));
232
+ controller.error(mapFilesSdkError(error));
141
233
  }
142
234
  },
143
235
  });
@@ -256,9 +348,15 @@ function uploadResultOf(result) {
256
348
  export class FilesSdkStorageDriver {
257
349
  #files;
258
350
  #name;
351
+ #conditionalCopy;
352
+ #signedUploadPolicy;
353
+ #signedDownloadPolicy;
259
354
  constructor(options) {
260
355
  this.#files = new Files(options);
261
356
  this.#name = options.adapter.name;
357
+ this.#conditionalCopy = conditionalCopyAdapterOf(options.adapter);
358
+ this.#signedUploadPolicy = signedUploadPolicyAdapterOf(options.adapter);
359
+ this.#signedDownloadPolicy = signedDownloadPolicyAdapterOf(options.adapter);
262
360
  }
263
361
  get name() {
264
362
  return this.#name;
@@ -272,8 +370,19 @@ export class FilesSdkStorageDriver {
272
370
  rangeRead: capabilities.rangeRead,
273
371
  resumableUpload: capabilities.multipart,
274
372
  serverSideCopy: capabilities.serverSideCopy,
373
+ ...(this.#conditionalCopy !== undefined && {
374
+ conditionalCopy: { ...this.#conditionalCopy.conditionalCopy },
375
+ }),
275
376
  signedDownload: { ...capabilities.signedUrl },
377
+ ...(this.#signedDownloadPolicy !== undefined && {
378
+ signedDownloadPolicy: {
379
+ ...this.#signedDownloadPolicy.signedDownloadPolicy,
380
+ },
381
+ }),
276
382
  signedUpload: 'runtime',
383
+ ...(this.#signedUploadPolicy !== undefined && {
384
+ signedUploadPolicy: { ...this.#signedUploadPolicy.signedUploadPolicy },
385
+ }),
277
386
  nativeUploadProgress: capabilities.uploadProgress,
278
387
  };
279
388
  }
@@ -306,6 +415,18 @@ export class FilesSdkStorageDriver {
306
415
  move(sourceKey, destinationKey, options) {
307
416
  return this.#call(() => this.#files.move(sourceKey, destinationKey, operationOptions(options)));
308
417
  }
418
+ promote(sourceKey, destinationKey, options) {
419
+ const adapter = this.#conditionalCopy;
420
+ if (adapter === undefined || !adapter.conditionalCopy.supported) {
421
+ return Promise.reject(new StorageError(`Storage adapter "${this.#name}" does not support conditional promotion.`, {
422
+ code: StorageErrorCode.NOT_SUPPORTED,
423
+ key: sourceKey,
424
+ operation: 'promote',
425
+ permanent: true,
426
+ }));
427
+ }
428
+ return this.#call(() => adapter.promote(sourceKey, destinationKey, options));
429
+ }
309
430
  async list(options) {
310
431
  return this.#call(async () => {
311
432
  const result = await this.#files.list(listOptions(options));
@@ -328,7 +449,7 @@ export class FilesSdkStorageDriver {
328
449
  }
329
450
  }
330
451
  catch (error) {
331
- throw mapFilesError(error);
452
+ throw mapFilesSdkError(error);
332
453
  }
333
454
  }
334
455
  signDownload(key, options) {
@@ -342,7 +463,7 @@ export class FilesSdkStorageDriver {
342
463
  return await operation();
343
464
  }
344
465
  catch (error) {
345
- throw mapFilesError(error);
466
+ throw mapFilesSdkError(error);
346
467
  }
347
468
  }
348
469
  }
@@ -1 +1 @@
1
- {"version":3,"file":"files-sdk.driver.js","sourceRoot":"","sources":["../../src/files-sdk/files-sdk.driver.ts"],"names":[],"mappings":"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","sourcesContent":["import { Readable } from 'node:stream';\n\nimport {\n Files,\n FilesError,\n type Adapter,\n type Body,\n type DownloadOptions,\n type FilesOptions,\n type ListOptions,\n type OperationOptions,\n type RetryOptions,\n type SearchOptions,\n type SignUploadOptions,\n type StoredFile,\n type UploadOptions,\n type UploadResult,\n type UrlOptions,\n} from 'files-sdk';\n\nimport { StorageError, StorageErrorCode } from '../storage.error.js';\nimport type { StorageDriver } from '../storage.driver.js';\nimport type {\n StorageBody,\n StorageDownloadOptions,\n StorageListOptions,\n StorageListResult,\n StorageObject,\n StorageObjectMetadata,\n StorageOperationOptions,\n StorageRetryOptions,\n StorageSearchOptions,\n StorageSignedDownloadOptions,\n StorageSignedUpload,\n StorageSignedUploadOptions,\n StorageUploadOptions,\n StorageUploadResult,\n} from '../storage.types.js';\nimport { getFilesSdkUploadControl } from '../storage-upload-control.js';\n\nexport type FilesSdkDriverOptions<AdapterType extends Adapter> =\n FilesOptions<AdapterType>;\n\nfunction mapFilesError(error: unknown): StorageError {\n if (error instanceof StorageError) {\n return error;\n }\n if (!(error instanceof FilesError)) {\n return new StorageError(\n error instanceof Error ? error.message : String(error),\n {\n cause: error,\n code: StorageErrorCode.PROVIDER,\n },\n );\n }\n\n if (error.cause instanceof StorageError) {\n return error.cause;\n }\n\n let code: StorageErrorCode;\n if (error.timedOut) {\n code = StorageErrorCode.TIMEOUT;\n } else if (error.aborted) {\n code = StorageErrorCode.ABORTED;\n } else {\n switch (error.code) {\n case 'NotFound':\n code = StorageErrorCode.NOT_FOUND;\n break;\n case 'Unauthorized':\n code = StorageErrorCode.UNAUTHORIZED;\n break;\n case 'Conflict':\n code = StorageErrorCode.CONFLICT;\n break;\n case 'ReadOnly':\n code = StorageErrorCode.READ_ONLY;\n break;\n case 'Provider':\n code = /(?:not supported|does not support|unsupported)/iu.test(\n error.message,\n )\n ? StorageErrorCode.NOT_SUPPORTED\n : StorageErrorCode.PROVIDER;\n break;\n }\n }\n\n return new StorageError(error.message, {\n aborted: error.aborted,\n cause: error.cause ?? error,\n code,\n permanent: error.permanent,\n timedOut: error.timedOut,\n });\n}\n\nfunction mapRetryOptions(\n retries: StorageRetryOptions | undefined,\n): RetryOptions | undefined {\n if (retries === undefined || typeof retries === 'number') {\n return retries;\n }\n\n return {\n max: retries.max,\n ...(retries.backoff !== undefined && {\n backoff: ({ attempt, error }) =>\n retries.backoff?.({\n attempt,\n error: mapFilesError(error),\n }) ?? 0,\n }),\n };\n}\n\nfunction operationOptions(\n options?: StorageOperationOptions,\n): OperationOptions | undefined {\n if (options === undefined) {\n return undefined;\n }\n\n const retries = mapRetryOptions(options.retries);\n return {\n ...(retries !== undefined && { retries }),\n ...(options.signal !== undefined && { signal: options.signal }),\n ...(options.timeout !== undefined && { timeout: options.timeout }),\n };\n}\n\nasync function* normalizeNodeChunks(\n source: Readable,\n): AsyncGenerator<Uint8Array> {\n for await (const chunk of source) {\n if (typeof chunk === 'string') {\n yield new TextEncoder().encode(chunk);\n continue;\n }\n if (chunk instanceof Uint8Array) {\n yield chunk;\n continue;\n }\n throw new StorageError(\n 'Node upload streams must yield strings or Uint8Array chunks.',\n {\n code: StorageErrorCode.INVALID_ARGUMENT,\n permanent: true,\n },\n );\n }\n}\n\nfunction mapBody(body: StorageBody): Body {\n if (body instanceof Readable) {\n return Readable.toWeb(\n Readable.from(normalizeNodeChunks(body)),\n ) as ReadableStream<Uint8Array>;\n }\n return body;\n}\n\nfunction normalizeDownloadStream(\n source: ReadableStream<Uint8Array>,\n): ReadableStream<Uint8Array> {\n let reader: ReadableStreamDefaultReader<Uint8Array> | undefined =\n source.getReader();\n\n const release = (): void => {\n reader?.releaseLock();\n reader = undefined;\n };\n\n return new ReadableStream<Uint8Array>({\n async cancel(reason) {\n const activeReader = reader;\n if (activeReader === undefined) {\n return;\n }\n try {\n await activeReader.cancel(reason);\n } catch (error) {\n throw mapFilesError(error);\n } finally {\n release();\n }\n },\n async pull(controller) {\n const activeReader = reader;\n if (activeReader === undefined) {\n controller.close();\n return;\n }\n try {\n const result = await activeReader.read();\n if (result.done) {\n release();\n controller.close();\n return;\n }\n controller.enqueue(result.value);\n } catch (error) {\n release();\n controller.error(mapFilesError(error));\n }\n },\n });\n}\n\nfunction uploadOptions(\n options?: StorageUploadOptions,\n): UploadOptions | undefined {\n if (options === undefined) {\n return undefined;\n }\n return {\n ...operationOptions(options),\n ...(options.cacheControl !== undefined && {\n cacheControl: options.cacheControl,\n }),\n ...(options.contentType !== undefined && {\n contentType: options.contentType,\n }),\n ...(options.control !== undefined && {\n control: getFilesSdkUploadControl(options.control),\n }),\n ...(options.metadata !== undefined && { metadata: options.metadata }),\n ...(options.multipart !== undefined && {\n multipart: options.multipart,\n }),\n ...(options.onProgress !== undefined && {\n onProgress: options.onProgress,\n }),\n };\n}\n\nfunction downloadOptions(options?: StorageDownloadOptions): DownloadOptions {\n return {\n ...operationOptions(options),\n as: 'stream',\n ...(options?.range !== undefined && { range: options.range }),\n };\n}\n\nfunction listOptions(options?: StorageListOptions): ListOptions | undefined {\n if (options === undefined) {\n return undefined;\n }\n return {\n ...operationOptions(options),\n ...(options.cursor !== undefined && { cursor: options.cursor }),\n ...(options.delimiter !== undefined && { delimiter: options.delimiter }),\n ...(options.limit !== undefined && { limit: options.limit }),\n ...(options.prefix !== undefined && { prefix: options.prefix }),\n };\n}\n\nfunction searchOptions(\n options?: StorageSearchOptions,\n): SearchOptions | undefined {\n if (options === undefined) {\n return undefined;\n }\n return {\n ...operationOptions(options),\n ...(options.caseInsensitive !== undefined && {\n caseInsensitive: options.caseInsensitive,\n }),\n ...(options.limit !== undefined && { limit: options.limit }),\n ...(options.match !== undefined && { match: options.match }),\n ...(options.maxResults !== undefined && {\n maxResults: options.maxResults,\n }),\n ...(options.prefix !== undefined && { prefix: options.prefix }),\n };\n}\n\nfunction signedDownloadOptions(\n options?: StorageSignedDownloadOptions,\n): UrlOptions | undefined {\n if (options === undefined) {\n return undefined;\n }\n return {\n ...operationOptions(options),\n ...(options.expiresIn !== undefined && {\n expiresIn: options.expiresIn,\n }),\n ...(options.responseContentDisposition !== undefined && {\n responseContentDisposition: options.responseContentDisposition,\n }),\n };\n}\n\nfunction signedUploadOptions(\n options: StorageSignedUploadOptions,\n): SignUploadOptions {\n return {\n ...operationOptions(options),\n expiresIn: options.expiresIn,\n ...(options.contentType !== undefined && {\n contentType: options.contentType,\n }),\n ...(options.maxSize !== undefined && { maxSize: options.maxSize }),\n ...(options.minSize !== undefined && { minSize: options.minSize }),\n };\n}\n\nfunction metadataOf(file: StoredFile): StorageObjectMetadata {\n return {\n contentType: file.type,\n ...(file.etag !== undefined && { etag: file.etag }),\n key: file.key,\n ...(file.lastModified !== undefined && {\n lastModified: new Date(file.lastModified),\n }),\n ...(file.metadata !== undefined && {\n metadata: { ...file.metadata },\n }),\n name: file.name,\n size: file.size,\n };\n}\n\nfunction uploadResultOf(result: UploadResult): StorageUploadResult {\n return {\n contentType: result.contentType,\n ...(result.etag !== undefined && { etag: result.etag }),\n key: result.key,\n ...(result.lastModified !== undefined && {\n lastModified: new Date(result.lastModified),\n }),\n size: result.size,\n };\n}\n\nexport class FilesSdkStorageDriver<\n AdapterType extends Adapter = Adapter,\n> implements StorageDriver {\n readonly #files: Files<AdapterType>;\n readonly #name: string;\n\n constructor(options: FilesSdkDriverOptions<AdapterType>) {\n this.#files = new Files(options);\n this.#name = options.adapter.name;\n }\n\n get name(): string {\n return this.#name;\n }\n\n get capabilities() {\n const capabilities = this.#files.capabilities;\n return {\n cacheControl: capabilities.cacheControl,\n delimiter: capabilities.delimiter,\n metadata: capabilities.metadata,\n rangeRead: capabilities.rangeRead,\n resumableUpload: capabilities.multipart,\n serverSideCopy: capabilities.serverSideCopy,\n signedDownload: { ...capabilities.signedUrl },\n signedUpload: 'runtime' as const,\n nativeUploadProgress: capabilities.uploadProgress,\n };\n }\n\n async upload(\n key: string,\n body: StorageBody,\n options?: StorageUploadOptions,\n ): Promise<StorageUploadResult> {\n return this.#call(async () =>\n uploadResultOf(\n await this.#files.upload(key, mapBody(body), uploadOptions(options)),\n ),\n );\n }\n\n async download(\n key: string,\n options?: StorageDownloadOptions,\n ): Promise<StorageObject> {\n return this.#call(async () => {\n const file = await this.#files.download(key, downloadOptions(options));\n return {\n ...metadataOf(file),\n body: normalizeDownloadStream(file.stream()),\n };\n });\n }\n\n async head(\n key: string,\n options?: StorageOperationOptions,\n ): Promise<StorageObjectMetadata> {\n return this.#call(async () =>\n metadataOf(await this.#files.head(key, operationOptions(options))),\n );\n }\n\n exists(key: string, options?: StorageOperationOptions): Promise<boolean> {\n return this.#call(() => this.#files.exists(key, operationOptions(options)));\n }\n\n delete(key: string, options?: StorageOperationOptions): Promise<void> {\n return this.#call(async () => {\n await this.#files.delete(key, operationOptions(options));\n });\n }\n\n copy(\n sourceKey: string,\n destinationKey: string,\n options?: StorageOperationOptions,\n ): Promise<void> {\n return this.#call(() =>\n this.#files.copy(sourceKey, destinationKey, operationOptions(options)),\n );\n }\n\n move(\n sourceKey: string,\n destinationKey: string,\n options?: StorageOperationOptions,\n ): Promise<void> {\n return this.#call(() =>\n this.#files.move(sourceKey, destinationKey, operationOptions(options)),\n );\n }\n\n async list(options?: StorageListOptions): Promise<StorageListResult> {\n return this.#call(async () => {\n const result = await this.#files.list(listOptions(options));\n return {\n items: result.items.map(metadataOf),\n ...(result.cursor !== undefined && { cursor: result.cursor }),\n ...(result.prefixes !== undefined && {\n prefixes: [...result.prefixes],\n }),\n };\n });\n }\n\n search(\n pattern: string | RegExp,\n options?: StorageSearchOptions,\n ): AsyncIterable<StorageObjectMetadata> {\n return this.#search(pattern, options);\n }\n\n async *#search(\n pattern: string | RegExp,\n options?: StorageSearchOptions,\n ): AsyncGenerator<StorageObjectMetadata, void> {\n try {\n for await (const file of this.#files.search(\n pattern,\n searchOptions(options),\n )) {\n yield metadataOf(file);\n }\n } catch (error) {\n throw mapFilesError(error);\n }\n }\n\n signDownload(\n key: string,\n options?: StorageSignedDownloadOptions,\n ): Promise<string> {\n return this.#call(() =>\n this.#files.url(key, signedDownloadOptions(options)),\n );\n }\n\n signUpload(\n key: string,\n options: StorageSignedUploadOptions,\n ): Promise<StorageSignedUpload> {\n return this.#call(() =>\n this.#files.signedUploadUrl(key, signedUploadOptions(options)),\n );\n }\n\n async #call<Result>(operation: () => Promise<Result>): Promise<Result> {\n try {\n return await operation();\n } catch (error) {\n throw mapFilesError(error);\n }\n }\n}\n\nexport function createFilesSdkDriver<AdapterType extends Adapter>(\n options: FilesSdkDriverOptions<AdapterType>,\n): FilesSdkStorageDriver<AdapterType> {\n return new FilesSdkStorageDriver(options);\n}\n"]}
1
+ {"version":3,"file":"files-sdk.driver.js","sourceRoot":"","sources":["../../src/files-sdk/files-sdk.driver.ts"],"names":[],"mappings":"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","sourcesContent":["import { Readable } from 'node:stream';\n\nimport {\n Files,\n FilesError,\n type Adapter,\n type Body,\n type DownloadOptions,\n type FilesOptions,\n type ListOptions,\n type OperationOptions,\n type RetryOptions,\n type SearchOptions,\n type SignUploadOptions,\n type StoredFile,\n type UploadOptions,\n type UploadResult,\n type UrlOptions,\n} from 'files-sdk';\n\nimport {\n StorageError,\n StorageErrorCode,\n isStorageError,\n} from '../storage.error.js';\nimport type { StorageDriver } from '../storage.driver.js';\nimport type {\n StorageBody,\n StorageDownloadOptions,\n StorageListOptions,\n StorageListResult,\n StorageObject,\n StorageObjectMetadata,\n StorageOperationOptions,\n StorageConditionalCopyCapability,\n StoragePromotionOptions,\n StorageRetryOptions,\n StorageSearchOptions,\n StorageSignedUploadPolicyCapability,\n StorageSignedDownloadPolicyCapability,\n StorageSignedDownloadOptions,\n StorageSignedUpload,\n StorageSignedUploadOptions,\n StorageUploadOptions,\n StorageUploadResult,\n} from '../storage.types.js';\nimport { getFilesSdkUploadControl } from '../storage-upload-control.js';\n\nexport type FilesSdkDriverOptions<AdapterType extends Adapter> =\n FilesOptions<AdapterType>;\n\n/**\n * Optional adapter extension for providers that can conditionally copy an\n * immutable source identity. Plain files-sdk adapters remain fully supported.\n */\nexport interface FilesSdkConditionalCopyAdapter {\n readonly conditionalCopy: StorageConditionalCopyCapability;\n promote(\n sourceKey: string,\n destinationKey: string,\n options: StoragePromotionOptions,\n ): Promise<void>;\n}\n\nexport interface FilesSdkSignedUploadPolicyAdapter {\n readonly signedUploadPolicy: StorageSignedUploadPolicyCapability;\n}\n\nexport interface FilesSdkSignedDownloadPolicyAdapter {\n readonly signedDownloadPolicy: StorageSignedDownloadPolicyCapability;\n}\n\nfunction conditionalCopyAdapterOf(\n adapter: Adapter,\n): FilesSdkConditionalCopyAdapter | undefined {\n if (\n typeof adapter !== 'object' ||\n adapter === null ||\n !('conditionalCopy' in adapter) ||\n !('promote' in adapter)\n ) {\n return undefined;\n }\n const candidate = adapter as Adapter &\n Partial<FilesSdkConditionalCopyAdapter>;\n const capability = candidate.conditionalCopy;\n if (\n capability === undefined ||\n typeof capability.supported !== 'boolean' ||\n typeof capability.etag !== 'boolean' ||\n typeof capability.version !== 'boolean' ||\n typeof candidate.promote !== 'function'\n ) {\n return undefined;\n }\n return candidate as Adapter & FilesSdkConditionalCopyAdapter;\n}\n\nfunction signedUploadPolicyAdapterOf(\n adapter: Adapter,\n): FilesSdkSignedUploadPolicyAdapter | undefined {\n if (\n typeof adapter !== 'object' ||\n adapter === null ||\n !('signedUploadPolicy' in adapter)\n ) {\n return undefined;\n }\n const candidate = adapter as Adapter &\n Partial<FilesSdkSignedUploadPolicyAdapter>;\n const capability = candidate.signedUploadPolicy;\n if (\n capability === undefined ||\n typeof capability.contentType !== 'boolean' ||\n typeof capability.sizeRange !== 'boolean'\n ) {\n return undefined;\n }\n return candidate as Adapter & FilesSdkSignedUploadPolicyAdapter;\n}\n\nfunction signedDownloadPolicyAdapterOf(\n adapter: Adapter,\n): FilesSdkSignedDownloadPolicyAdapter | undefined {\n if (\n typeof adapter !== 'object' ||\n adapter === null ||\n !('signedDownloadPolicy' in adapter)\n ) {\n return undefined;\n }\n const candidate = adapter as Adapter &\n Partial<FilesSdkSignedDownloadPolicyAdapter>;\n const capability = candidate.signedDownloadPolicy;\n if (capability === undefined || typeof capability.expiresIn !== 'boolean') {\n return undefined;\n }\n return candidate as Adapter & FilesSdkSignedDownloadPolicyAdapter;\n}\n\ninterface FilesErrorLike {\n readonly name: string;\n readonly message: string;\n readonly code: FilesError['code'];\n readonly aborted: boolean;\n readonly timedOut: boolean;\n readonly permanent: boolean;\n readonly cause?: unknown;\n}\n\nfunction isFilesErrorCode(value: unknown): value is FilesError['code'] {\n return (\n value === 'NotFound' ||\n value === 'Unauthorized' ||\n value === 'Conflict' ||\n value === 'ReadOnly' ||\n value === 'Provider'\n );\n}\n\nfunction isFilesErrorLike(error: unknown): error is FilesErrorLike {\n if (error instanceof FilesError) {\n return true;\n }\n if (!(error instanceof Error)) {\n return false;\n }\n\n try {\n return (\n error.name === 'FilesError' &&\n typeof error.message === 'string' &&\n 'code' in error &&\n isFilesErrorCode(error.code) &&\n 'aborted' in error &&\n typeof error.aborted === 'boolean' &&\n 'timedOut' in error &&\n typeof error.timedOut === 'boolean' &&\n 'permanent' in error &&\n typeof error.permanent === 'boolean'\n );\n } catch {\n return false;\n }\n}\n\nfunction unwrapFilesError(error: FilesErrorLike): FilesErrorLike {\n const seen = new Set<FilesErrorLike>();\n let current = error;\n\n while (\n current.code === 'Provider' &&\n !current.aborted &&\n !current.timedOut &&\n !current.permanent &&\n isFilesErrorLike(current.cause) &&\n current.message === current.cause.message &&\n !seen.has(current.cause)\n ) {\n seen.add(current);\n current = current.cause;\n }\n\n return current;\n}\n\nexport function mapFilesSdkError(error: unknown): StorageError {\n if (isStorageError(error)) {\n return error;\n }\n if (!isFilesErrorLike(error)) {\n return new StorageError(\n error instanceof Error ? error.message : String(error),\n {\n cause: error,\n code: StorageErrorCode.PROVIDER,\n },\n );\n }\n\n const filesError = unwrapFilesError(error);\n\n if (isStorageError(filesError.cause)) {\n return filesError.cause;\n }\n\n let code: StorageErrorCode;\n if (filesError.timedOut) {\n code = StorageErrorCode.TIMEOUT;\n } else if (filesError.aborted) {\n code = StorageErrorCode.ABORTED;\n } else {\n switch (filesError.code) {\n case 'NotFound':\n code = StorageErrorCode.NOT_FOUND;\n break;\n case 'Unauthorized':\n code = StorageErrorCode.UNAUTHORIZED;\n break;\n case 'Conflict':\n code = StorageErrorCode.CONFLICT;\n break;\n case 'ReadOnly':\n code = StorageErrorCode.READ_ONLY;\n break;\n case 'Provider':\n code = /(?:not supported|does not support|unsupported)/iu.test(\n filesError.message,\n )\n ? StorageErrorCode.NOT_SUPPORTED\n : StorageErrorCode.PROVIDER;\n break;\n }\n }\n\n return new StorageError(filesError.message, {\n aborted: filesError.aborted,\n cause: filesError.cause ?? error,\n code,\n permanent: filesError.permanent,\n timedOut: filesError.timedOut,\n });\n}\n\nfunction mapRetryOptions(\n retries: StorageRetryOptions | undefined,\n): RetryOptions | undefined {\n if (retries === undefined || typeof retries === 'number') {\n return retries;\n }\n\n return {\n max: retries.max,\n ...(retries.backoff !== undefined && {\n backoff: ({ attempt, error }) =>\n retries.backoff?.({\n attempt,\n error: mapFilesSdkError(error),\n }) ?? 0,\n }),\n };\n}\n\nfunction operationOptions(\n options?: StorageOperationOptions,\n): OperationOptions | undefined {\n if (options === undefined) {\n return undefined;\n }\n\n const retries = mapRetryOptions(options.retries);\n return {\n ...(retries !== undefined && { retries }),\n ...(options.signal !== undefined && { signal: options.signal }),\n ...(options.timeout !== undefined && { timeout: options.timeout }),\n };\n}\n\nasync function* normalizeNodeChunks(\n source: Readable,\n): AsyncGenerator<Uint8Array> {\n for await (const chunk of source) {\n if (typeof chunk === 'string') {\n yield new TextEncoder().encode(chunk);\n continue;\n }\n if (chunk instanceof Uint8Array) {\n yield chunk;\n continue;\n }\n throw new StorageError(\n 'Node upload streams must yield strings or Uint8Array chunks.',\n {\n code: StorageErrorCode.INVALID_ARGUMENT,\n permanent: true,\n },\n );\n }\n}\n\nfunction mapBody(body: StorageBody): Body {\n if (body instanceof Readable) {\n return Readable.toWeb(\n Readable.from(normalizeNodeChunks(body)),\n ) as ReadableStream<Uint8Array>;\n }\n return body;\n}\n\nfunction normalizeDownloadStream(\n source: ReadableStream<Uint8Array>,\n): ReadableStream<Uint8Array> {\n let reader: ReadableStreamDefaultReader<Uint8Array> | undefined =\n source.getReader();\n\n const release = (): void => {\n reader?.releaseLock();\n reader = undefined;\n };\n\n return new ReadableStream<Uint8Array>({\n async cancel(reason) {\n const activeReader = reader;\n if (activeReader === undefined) {\n return;\n }\n try {\n await activeReader.cancel(reason);\n } catch (error) {\n throw mapFilesSdkError(error);\n } finally {\n release();\n }\n },\n async pull(controller) {\n const activeReader = reader;\n if (activeReader === undefined) {\n controller.close();\n return;\n }\n try {\n const result = await activeReader.read();\n if (result.done) {\n release();\n controller.close();\n return;\n }\n controller.enqueue(result.value);\n } catch (error) {\n release();\n controller.error(mapFilesSdkError(error));\n }\n },\n });\n}\n\nfunction uploadOptions(\n options?: StorageUploadOptions,\n): UploadOptions | undefined {\n if (options === undefined) {\n return undefined;\n }\n return {\n ...operationOptions(options),\n ...(options.cacheControl !== undefined && {\n cacheControl: options.cacheControl,\n }),\n ...(options.contentType !== undefined && {\n contentType: options.contentType,\n }),\n ...(options.control !== undefined && {\n control: getFilesSdkUploadControl(options.control),\n }),\n ...(options.metadata !== undefined && { metadata: options.metadata }),\n ...(options.multipart !== undefined && {\n multipart: options.multipart,\n }),\n ...(options.onProgress !== undefined && {\n onProgress: options.onProgress,\n }),\n };\n}\n\nfunction downloadOptions(options?: StorageDownloadOptions): DownloadOptions {\n return {\n ...operationOptions(options),\n as: 'stream',\n ...(options?.range !== undefined && { range: options.range }),\n };\n}\n\nfunction listOptions(options?: StorageListOptions): ListOptions | undefined {\n if (options === undefined) {\n return undefined;\n }\n return {\n ...operationOptions(options),\n ...(options.cursor !== undefined && { cursor: options.cursor }),\n ...(options.delimiter !== undefined && { delimiter: options.delimiter }),\n ...(options.limit !== undefined && { limit: options.limit }),\n ...(options.prefix !== undefined && { prefix: options.prefix }),\n };\n}\n\nfunction searchOptions(\n options?: StorageSearchOptions,\n): SearchOptions | undefined {\n if (options === undefined) {\n return undefined;\n }\n return {\n ...operationOptions(options),\n ...(options.caseInsensitive !== undefined && {\n caseInsensitive: options.caseInsensitive,\n }),\n ...(options.limit !== undefined && { limit: options.limit }),\n ...(options.match !== undefined && { match: options.match }),\n ...(options.maxResults !== undefined && {\n maxResults: options.maxResults,\n }),\n ...(options.prefix !== undefined && { prefix: options.prefix }),\n };\n}\n\nfunction signedDownloadOptions(\n options?: StorageSignedDownloadOptions,\n): UrlOptions | undefined {\n if (options === undefined) {\n return undefined;\n }\n return {\n ...operationOptions(options),\n ...(options.expiresIn !== undefined && {\n expiresIn: options.expiresIn,\n }),\n ...(options.responseContentDisposition !== undefined && {\n responseContentDisposition: options.responseContentDisposition,\n }),\n };\n}\n\nfunction signedUploadOptions(\n options: StorageSignedUploadOptions,\n): SignUploadOptions {\n return {\n ...operationOptions(options),\n expiresIn: options.expiresIn,\n ...(options.contentType !== undefined && {\n contentType: options.contentType,\n }),\n ...(options.maxSize !== undefined && { maxSize: options.maxSize }),\n ...(options.minSize !== undefined && { minSize: options.minSize }),\n };\n}\n\nfunction metadataOf(file: StoredFile): StorageObjectMetadata {\n return {\n contentType: file.type,\n ...(file.etag !== undefined && { etag: file.etag }),\n key: file.key,\n ...(file.lastModified !== undefined && {\n lastModified: new Date(file.lastModified),\n }),\n ...(file.metadata !== undefined && {\n metadata: { ...file.metadata },\n }),\n name: file.name,\n size: file.size,\n };\n}\n\nfunction uploadResultOf(result: UploadResult): StorageUploadResult {\n return {\n contentType: result.contentType,\n ...(result.etag !== undefined && { etag: result.etag }),\n key: result.key,\n ...(result.lastModified !== undefined && {\n lastModified: new Date(result.lastModified),\n }),\n size: result.size,\n };\n}\n\nexport class FilesSdkStorageDriver<\n AdapterType extends Adapter = Adapter,\n> implements StorageDriver {\n readonly #files: Files<AdapterType>;\n readonly #name: string;\n readonly #conditionalCopy: FilesSdkConditionalCopyAdapter | undefined;\n readonly #signedUploadPolicy: FilesSdkSignedUploadPolicyAdapter | undefined;\n readonly #signedDownloadPolicy:\n FilesSdkSignedDownloadPolicyAdapter | undefined;\n\n constructor(options: FilesSdkDriverOptions<AdapterType>) {\n this.#files = new Files(options);\n this.#name = options.adapter.name;\n this.#conditionalCopy = conditionalCopyAdapterOf(options.adapter);\n this.#signedUploadPolicy = signedUploadPolicyAdapterOf(options.adapter);\n this.#signedDownloadPolicy = signedDownloadPolicyAdapterOf(options.adapter);\n }\n\n get name(): string {\n return this.#name;\n }\n\n get capabilities() {\n const capabilities = this.#files.capabilities;\n return {\n cacheControl: capabilities.cacheControl,\n delimiter: capabilities.delimiter,\n metadata: capabilities.metadata,\n rangeRead: capabilities.rangeRead,\n resumableUpload: capabilities.multipart,\n serverSideCopy: capabilities.serverSideCopy,\n ...(this.#conditionalCopy !== undefined && {\n conditionalCopy: { ...this.#conditionalCopy.conditionalCopy },\n }),\n signedDownload: { ...capabilities.signedUrl },\n ...(this.#signedDownloadPolicy !== undefined && {\n signedDownloadPolicy: {\n ...this.#signedDownloadPolicy.signedDownloadPolicy,\n },\n }),\n signedUpload: 'runtime' as const,\n ...(this.#signedUploadPolicy !== undefined && {\n signedUploadPolicy: { ...this.#signedUploadPolicy.signedUploadPolicy },\n }),\n nativeUploadProgress: capabilities.uploadProgress,\n };\n }\n\n async upload(\n key: string,\n body: StorageBody,\n options?: StorageUploadOptions,\n ): Promise<StorageUploadResult> {\n return this.#call(async () =>\n uploadResultOf(\n await this.#files.upload(key, mapBody(body), uploadOptions(options)),\n ),\n );\n }\n\n async download(\n key: string,\n options?: StorageDownloadOptions,\n ): Promise<StorageObject> {\n return this.#call(async () => {\n const file = await this.#files.download(key, downloadOptions(options));\n return {\n ...metadataOf(file),\n body: normalizeDownloadStream(file.stream()),\n };\n });\n }\n\n async head(\n key: string,\n options?: StorageOperationOptions,\n ): Promise<StorageObjectMetadata> {\n return this.#call(async () =>\n metadataOf(await this.#files.head(key, operationOptions(options))),\n );\n }\n\n exists(key: string, options?: StorageOperationOptions): Promise<boolean> {\n return this.#call(() => this.#files.exists(key, operationOptions(options)));\n }\n\n delete(key: string, options?: StorageOperationOptions): Promise<void> {\n return this.#call(async () => {\n await this.#files.delete(key, operationOptions(options));\n });\n }\n\n copy(\n sourceKey: string,\n destinationKey: string,\n options?: StorageOperationOptions,\n ): Promise<void> {\n return this.#call(() =>\n this.#files.copy(sourceKey, destinationKey, operationOptions(options)),\n );\n }\n\n move(\n sourceKey: string,\n destinationKey: string,\n options?: StorageOperationOptions,\n ): Promise<void> {\n return this.#call(() =>\n this.#files.move(sourceKey, destinationKey, operationOptions(options)),\n );\n }\n\n promote(\n sourceKey: string,\n destinationKey: string,\n options: StoragePromotionOptions,\n ): Promise<void> {\n const adapter = this.#conditionalCopy;\n if (adapter === undefined || !adapter.conditionalCopy.supported) {\n return Promise.reject(\n new StorageError(\n `Storage adapter \"${this.#name}\" does not support conditional promotion.`,\n {\n code: StorageErrorCode.NOT_SUPPORTED,\n key: sourceKey,\n operation: 'promote',\n permanent: true,\n },\n ),\n );\n }\n return this.#call(() =>\n adapter.promote(sourceKey, destinationKey, options),\n );\n }\n\n async list(options?: StorageListOptions): Promise<StorageListResult> {\n return this.#call(async () => {\n const result = await this.#files.list(listOptions(options));\n return {\n items: result.items.map(metadataOf),\n ...(result.cursor !== undefined && { cursor: result.cursor }),\n ...(result.prefixes !== undefined && {\n prefixes: [...result.prefixes],\n }),\n };\n });\n }\n\n search(\n pattern: string | RegExp,\n options?: StorageSearchOptions,\n ): AsyncIterable<StorageObjectMetadata> {\n return this.#search(pattern, options);\n }\n\n async *#search(\n pattern: string | RegExp,\n options?: StorageSearchOptions,\n ): AsyncGenerator<StorageObjectMetadata, void> {\n try {\n for await (const file of this.#files.search(\n pattern,\n searchOptions(options),\n )) {\n yield metadataOf(file);\n }\n } catch (error) {\n throw mapFilesSdkError(error);\n }\n }\n\n signDownload(\n key: string,\n options?: StorageSignedDownloadOptions,\n ): Promise<string> {\n return this.#call(() =>\n this.#files.url(key, signedDownloadOptions(options)),\n );\n }\n\n signUpload(\n key: string,\n options: StorageSignedUploadOptions,\n ): Promise<StorageSignedUpload> {\n return this.#call(() =>\n this.#files.signedUploadUrl(key, signedUploadOptions(options)),\n );\n }\n\n async #call<Result>(operation: () => Promise<Result>): Promise<Result> {\n try {\n return await operation();\n } catch (error) {\n throw mapFilesSdkError(error);\n }\n }\n}\n\nexport function createFilesSdkDriver<AdapterType extends Adapter>(\n options: FilesSdkDriverOptions<AdapterType>,\n): FilesSdkStorageDriver<AdapterType> {\n return new FilesSdkStorageDriver(options);\n}\n"]}
@@ -0,0 +1,21 @@
1
+ import { type FsAdapter, type FsAdapterOptions } from 'files-sdk/fs';
2
+ import { type FilesSdkDriverOptions, type FilesSdkStorageDriver } from '../files-sdk.driver.js';
3
+ export interface FsStorageDriverOptions extends Omit<FilesSdkDriverOptions<FsAdapter>, 'adapter'> {
4
+ adapter: FsAdapterOptions;
5
+ }
6
+ /**
7
+ * Creates the files-sdk filesystem driver from the storage package's own
8
+ * dependency context. The adapter reaches only `node:fs`, so this entry point
9
+ * adds no native SDK to the install — unlike every object-store provider, it is
10
+ * always available.
11
+ *
12
+ * The adapter keeps a `<key>.meta.json` sidecar beside each body to carry the
13
+ * content type, ETag, and custom metadata that a filesystem has nowhere else to
14
+ * put. Sidecars never surface as keys: `list` and `search` skip them, and
15
+ * uploading a key that ends in `.meta.json` fails closed rather than colliding
16
+ * with one.
17
+ */
18
+ export declare function createFsStorageDriver(options: FsStorageDriverOptions): FilesSdkStorageDriver<FsAdapter>;
19
+ export { fs, mapFsError } from 'files-sdk/fs';
20
+ export type { FsAdapter, FsAdapterOptions } from 'files-sdk/fs';
21
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/files-sdk/fs/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAM,KAAK,SAAS,EAAE,KAAK,gBAAgB,EAAE,MAAM,cAAc,CAAC;AAEzE,OAAO,EAEL,KAAK,qBAAqB,EAC1B,KAAK,qBAAqB,EAC3B,MAAM,wBAAwB,CAAC;AAEhC,MAAM,WAAW,sBAAuB,SAAQ,IAAI,CAClD,qBAAqB,CAAC,SAAS,CAAC,EAChC,SAAS,CACV;IACC,OAAO,EAAE,gBAAgB,CAAC;CAC3B;AAED;;;;;;;;;;;GAWG;AACH,wBAAgB,qBAAqB,CACnC,OAAO,EAAE,sBAAsB,GAC9B,qBAAqB,CAAC,SAAS,CAAC,CAGlC;AAED,OAAO,EAAE,EAAE,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;AAC9C,YAAY,EAAE,SAAS,EAAE,gBAAgB,EAAE,MAAM,cAAc,CAAC"}
@@ -0,0 +1,20 @@
1
+ import { fs } from 'files-sdk/fs';
2
+ import { createFilesSdkDriver, } from '../files-sdk.driver.js';
3
+ /**
4
+ * Creates the files-sdk filesystem driver from the storage package's own
5
+ * dependency context. The adapter reaches only `node:fs`, so this entry point
6
+ * adds no native SDK to the install — unlike every object-store provider, it is
7
+ * always available.
8
+ *
9
+ * The adapter keeps a `<key>.meta.json` sidecar beside each body to carry the
10
+ * content type, ETag, and custom metadata that a filesystem has nowhere else to
11
+ * put. Sidecars never surface as keys: `list` and `search` skip them, and
12
+ * uploading a key that ends in `.meta.json` fails closed rather than colliding
13
+ * with one.
14
+ */
15
+ export function createFsStorageDriver(options) {
16
+ const { adapter: adapterOptions, ...filesOptions } = options;
17
+ return createFilesSdkDriver({ ...filesOptions, adapter: fs(adapterOptions) });
18
+ }
19
+ export { fs, mapFsError } from 'files-sdk/fs';
20
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/files-sdk/fs/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,EAAE,EAAyC,MAAM,cAAc,CAAC;AAEzE,OAAO,EACL,oBAAoB,GAGrB,MAAM,wBAAwB,CAAC;AAShC;;;;;;;;;;;GAWG;AACH,MAAM,UAAU,qBAAqB,CACnC,OAA+B;IAE/B,MAAM,EAAE,OAAO,EAAE,cAAc,EAAE,GAAG,YAAY,EAAE,GAAG,OAAO,CAAC;IAC7D,OAAO,oBAAoB,CAAC,EAAE,GAAG,YAAY,EAAE,OAAO,EAAE,EAAE,CAAC,cAAc,CAAC,EAAE,CAAC,CAAC;AAChF,CAAC;AAED,OAAO,EAAE,EAAE,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC","sourcesContent":["import { fs, type FsAdapter, type FsAdapterOptions } from 'files-sdk/fs';\n\nimport {\n createFilesSdkDriver,\n type FilesSdkDriverOptions,\n type FilesSdkStorageDriver,\n} from '../files-sdk.driver.js';\n\nexport interface FsStorageDriverOptions extends Omit<\n FilesSdkDriverOptions<FsAdapter>,\n 'adapter'\n> {\n adapter: FsAdapterOptions;\n}\n\n/**\n * Creates the files-sdk filesystem driver from the storage package's own\n * dependency context. The adapter reaches only `node:fs`, so this entry point\n * adds no native SDK to the install — unlike every object-store provider, it is\n * always available.\n *\n * The adapter keeps a `<key>.meta.json` sidecar beside each body to carry the\n * content type, ETag, and custom metadata that a filesystem has nowhere else to\n * put. Sidecars never surface as keys: `list` and `search` skip them, and\n * uploading a key that ends in `.meta.json` fails closed rather than colliding\n * with one.\n */\nexport function createFsStorageDriver(\n options: FsStorageDriverOptions,\n): FilesSdkStorageDriver<FsAdapter> {\n const { adapter: adapterOptions, ...filesOptions } = options;\n return createFilesSdkDriver({ ...filesOptions, adapter: fs(adapterOptions) });\n}\n\nexport { fs, mapFsError } from 'files-sdk/fs';\nexport type { FsAdapter, FsAdapterOptions } from 'files-sdk/fs';\n"]}
@@ -1,3 +1,3 @@
1
- export { FilesSdkStorageDriver, createFilesSdkDriver, type FilesSdkDriverOptions, } from './files-sdk.driver.js';
1
+ export { FilesSdkStorageDriver, createFilesSdkDriver, type FilesSdkConditionalCopyAdapter, type FilesSdkSignedUploadPolicyAdapter, type FilesSdkSignedDownloadPolicyAdapter, type FilesSdkDriverOptions, } from './files-sdk.driver.js';
2
2
  export type { Adapter as FilesSdkAdapter, FilesHooks as FilesSdkHooks, FilesPlugin as FilesSdkPlugin, } from 'files-sdk';
3
3
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/files-sdk/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,qBAAqB,EACrB,oBAAoB,EACpB,KAAK,qBAAqB,GAC3B,MAAM,uBAAuB,CAAC;AAE/B,YAAY,EACV,OAAO,IAAI,eAAe,EAC1B,UAAU,IAAI,aAAa,EAC3B,WAAW,IAAI,cAAc,GAC9B,MAAM,WAAW,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/files-sdk/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,qBAAqB,EACrB,oBAAoB,EACpB,KAAK,8BAA8B,EACnC,KAAK,iCAAiC,EACtC,KAAK,mCAAmC,EACxC,KAAK,qBAAqB,GAC3B,MAAM,uBAAuB,CAAC;AAE/B,YAAY,EACV,OAAO,IAAI,eAAe,EAC1B,UAAU,IAAI,aAAa,EAC3B,WAAW,IAAI,cAAc,GAC9B,MAAM,WAAW,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/files-sdk/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,qBAAqB,EACrB,oBAAoB,GAErB,MAAM,uBAAuB,CAAC","sourcesContent":["export {\n FilesSdkStorageDriver,\n createFilesSdkDriver,\n type FilesSdkDriverOptions,\n} from './files-sdk.driver.js';\n\nexport type {\n Adapter as FilesSdkAdapter,\n FilesHooks as FilesSdkHooks,\n FilesPlugin as FilesSdkPlugin,\n} from 'files-sdk';\n"]}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/files-sdk/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,qBAAqB,EACrB,oBAAoB,GAKrB,MAAM,uBAAuB,CAAC","sourcesContent":["export {\n FilesSdkStorageDriver,\n createFilesSdkDriver,\n type FilesSdkConditionalCopyAdapter,\n type FilesSdkSignedUploadPolicyAdapter,\n type FilesSdkSignedDownloadPolicyAdapter,\n type FilesSdkDriverOptions,\n} from './files-sdk.driver.js';\n\nexport type {\n Adapter as FilesSdkAdapter,\n FilesHooks as FilesSdkHooks,\n FilesPlugin as FilesSdkPlugin,\n} from 'files-sdk';\n"]}
@@ -0,0 +1,54 @@
1
+ import type { Adapter } from 'files-sdk';
2
+ import { type LoadFilesOptions } from 'files-sdk/loader';
3
+ import { type EnvVar, type Provider, type ProviderSlug } from 'files-sdk/providers';
4
+ import { type FilesSdkDriverOptions, type FilesSdkStorageDriver } from '../files-sdk.driver.js';
5
+ /** Slug of a storage provider this package can build a driver for. */
6
+ export type StorageProviderName = ProviderSlug;
7
+ /**
8
+ * Flat, provider-specific settings — `bucket` and `region` for an object store,
9
+ * `root` for the filesystem, `accountName` and `container` for Azure, and so
10
+ * on. Every provider reads what it needs and ignores the rest, so one config
11
+ * shape serves a deployment that switches providers by name.
12
+ *
13
+ * Credentials may be omitted for any provider whose SDK resolves its own chain
14
+ * (an IAM role, Application Default Credentials, a shared profile).
15
+ */
16
+ export type StorageProviderConfig = Omit<LoadFilesOptions, 'provider'>;
17
+ export interface ProviderStorageDriverOptions extends Omit<FilesSdkDriverOptions<Adapter>, 'adapter'> {
18
+ /** Which provider to build. Validate untrusted input with {@link isStorageProvider}. */
19
+ provider: StorageProviderName;
20
+ config?: StorageProviderConfig;
21
+ }
22
+ /**
23
+ * Builds a {@link FilesSdkStorageDriver} for a provider named at runtime,
24
+ * importing that provider's adapter — and only that one — on demand. A
25
+ * deployment selects its store with a string (`'s3'`, `'gcs'`, `'azure'`,
26
+ * `'r2'`, `'fs'`, …) and installs one native SDK, instead of the application
27
+ * hard-coding a driver per backend.
28
+ *
29
+ * The `s3` slug additionally gets the conditional-promotion and signed-policy
30
+ * capabilities {@link createS3StorageDriver} attaches; every other provider
31
+ * exposes exactly what its adapter declares. Import
32
+ * `@nestm/storage/files-sdk/s3` directly when the provider is known at build
33
+ * time and the extra indirection buys nothing.
34
+ *
35
+ * @throws StorageError `INVALID_ARGUMENT` for an unknown slug, and whatever the
36
+ * adapter reports (mapped) when required config or credentials are missing.
37
+ */
38
+ export declare function createProviderStorageDriver(options: ProviderStorageDriverOptions): Promise<FilesSdkStorageDriver>;
39
+ /** Narrows an untrusted string — an env var, a config file — to a known slug. */
40
+ export declare function isStorageProvider(value: string): value is StorageProviderName;
41
+ /** Every provider that can be named, sorted by slug. */
42
+ export declare function listStorageProviders(): readonly Provider[];
43
+ /** One provider's display name, description, native SDKs, and env contract. */
44
+ export declare function getStorageProvider(slug: string): Provider | undefined;
45
+ /**
46
+ * Every environment variable a provider reads, flattened across required, all
47
+ * credential modes, and optional. Useful for validating a deployment's config
48
+ * before the first upload rather than at it.
49
+ */
50
+ export declare function listStorageProviderEnvVars(slug: string): EnvVar[];
51
+ /** The subset of {@link listStorageProviderEnvVars} that carries secrets. */
52
+ export declare function listStorageProviderSecretEnvVars(slug: string): EnvVar[];
53
+ export type { EnvVar as StorageProviderEnvVar, Provider as StorageProviderInfo, } from 'files-sdk/providers';
54
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/files-sdk/provider/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACzC,OAAO,EAAa,KAAK,gBAAgB,EAAE,MAAM,kBAAkB,CAAC;AACpE,OAAO,EAKL,KAAK,MAAM,EACX,KAAK,QAAQ,EACb,KAAK,YAAY,EAClB,MAAM,qBAAqB,CAAC;AAG7B,OAAO,EAGL,KAAK,qBAAqB,EAC1B,KAAK,qBAAqB,EAC3B,MAAM,wBAAwB,CAAC;AAEhC,sEAAsE;AACtE,MAAM,MAAM,mBAAmB,GAAG,YAAY,CAAC;AAE/C;;;;;;;;GAQG;AACH,MAAM,MAAM,qBAAqB,GAAG,IAAI,CAAC,gBAAgB,EAAE,UAAU,CAAC,CAAC;AAEvE,MAAM,WAAW,4BAA6B,SAAQ,IAAI,CACxD,qBAAqB,CAAC,OAAO,CAAC,EAC9B,SAAS,CACV;IACC,wFAAwF;IACxF,QAAQ,EAAE,mBAAmB,CAAC;IAC9B,MAAM,CAAC,EAAE,qBAAqB,CAAC;CAChC;AAED;;;;;;;;;;;;;;;GAeG;AACH,wBAAsB,2BAA2B,CAC/C,OAAO,EAAE,4BAA4B,GACpC,OAAO,CAAC,qBAAqB,CAAC,CAWhC;AAoCD,iFAAiF;AACjF,wBAAgB,iBAAiB,CAAC,KAAK,EAAE,MAAM,GAAG,KAAK,IAAI,mBAAmB,CAE7E;AAED,wDAAwD;AACxD,wBAAgB,oBAAoB,IAAI,SAAS,QAAQ,EAAE,CAE1D;AAED,+EAA+E;AAC/E,wBAAgB,kBAAkB,CAAC,IAAI,EAAE,MAAM,GAAG,QAAQ,GAAG,SAAS,CAErE;AAED;;;;GAIG;AACH,wBAAgB,0BAA0B,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,EAAE,CAEjE;AAED,6EAA6E;AAC7E,wBAAgB,gCAAgC,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,EAAE,CAEvE;AAED,YAAY,EACV,MAAM,IAAI,qBAAqB,EAC/B,QAAQ,IAAI,mBAAmB,GAChC,MAAM,qBAAqB,CAAC"}
@@ -0,0 +1,80 @@
1
+ import { loadFiles } from 'files-sdk/loader';
2
+ import { PROVIDER_NAMES, getProvider, getSecretEnvVars, listEnvVars, } from 'files-sdk/providers';
3
+ import { StorageError, StorageErrorCode } from '../../storage.error.js';
4
+ import { createFilesSdkDriver, mapFilesSdkError, } from '../files-sdk.driver.js';
5
+ /**
6
+ * Builds a {@link FilesSdkStorageDriver} for a provider named at runtime,
7
+ * importing that provider's adapter — and only that one — on demand. A
8
+ * deployment selects its store with a string (`'s3'`, `'gcs'`, `'azure'`,
9
+ * `'r2'`, `'fs'`, …) and installs one native SDK, instead of the application
10
+ * hard-coding a driver per backend.
11
+ *
12
+ * The `s3` slug additionally gets the conditional-promotion and signed-policy
13
+ * capabilities {@link createS3StorageDriver} attaches; every other provider
14
+ * exposes exactly what its adapter declares. Import
15
+ * `@nestm/storage/files-sdk/s3` directly when the provider is known at build
16
+ * time and the extra indirection buys nothing.
17
+ *
18
+ * @throws StorageError `INVALID_ARGUMENT` for an unknown slug, and whatever the
19
+ * adapter reports (mapped) when required config or credentials are missing.
20
+ */
21
+ export async function createProviderStorageDriver(options) {
22
+ const { provider, config, ...filesOptions } = options;
23
+ if (!isStorageProvider(provider)) {
24
+ throw unknownProvider(provider);
25
+ }
26
+ // `loadFiles` owns the slug → adapter mapping and keeps the import lazy; the
27
+ // client it returns is discarded so the caller's own driver options (prefix,
28
+ // hooks, plugins, readonly, retries) apply to the instance the bridge builds.
29
+ const adapter = await resolveAdapter(provider, config);
30
+ return createFilesSdkDriver({ ...filesOptions, adapter });
31
+ }
32
+ async function resolveAdapter(provider, config) {
33
+ let resolved;
34
+ try {
35
+ resolved = await loadFiles({ ...config, provider });
36
+ }
37
+ catch (error) {
38
+ throw mapFilesSdkError(error);
39
+ }
40
+ const { adapter } = resolved.files;
41
+ if (provider !== 's3') {
42
+ return adapter;
43
+ }
44
+ // Built by `s3(...)`, so its `raw` is an S3Client and the promotion path
45
+ // holds. The S3-compatible wrappers keep only what they declare themselves.
46
+ const { withS3Capabilities } = await import('../s3/index.js');
47
+ return withS3Capabilities(adapter, {
48
+ ...(config?.publicBaseUrl !== undefined && {
49
+ publicBaseUrl: config.publicBaseUrl,
50
+ }),
51
+ });
52
+ }
53
+ function unknownProvider(provider) {
54
+ return new StorageError(`Unknown storage provider: ${JSON.stringify(provider)}. Known providers: ${PROVIDER_NAMES.join(', ')}.`, { code: StorageErrorCode.INVALID_ARGUMENT, permanent: true });
55
+ }
56
+ /** Narrows an untrusted string — an env var, a config file — to a known slug. */
57
+ export function isStorageProvider(value) {
58
+ return getProvider(value) !== undefined;
59
+ }
60
+ /** Every provider that can be named, sorted by slug. */
61
+ export function listStorageProviders() {
62
+ return PROVIDER_NAMES.flatMap((slug) => getProvider(slug) ?? []);
63
+ }
64
+ /** One provider's display name, description, native SDKs, and env contract. */
65
+ export function getStorageProvider(slug) {
66
+ return getProvider(slug);
67
+ }
68
+ /**
69
+ * Every environment variable a provider reads, flattened across required, all
70
+ * credential modes, and optional. Useful for validating a deployment's config
71
+ * before the first upload rather than at it.
72
+ */
73
+ export function listStorageProviderEnvVars(slug) {
74
+ return listEnvVars(slug);
75
+ }
76
+ /** The subset of {@link listStorageProviderEnvVars} that carries secrets. */
77
+ export function listStorageProviderSecretEnvVars(slug) {
78
+ return getSecretEnvVars(slug);
79
+ }
80
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/files-sdk/provider/index.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,SAAS,EAAyB,MAAM,kBAAkB,CAAC;AACpE,OAAO,EACL,cAAc,EACd,WAAW,EACX,gBAAgB,EAChB,WAAW,GAIZ,MAAM,qBAAqB,CAAC;AAE7B,OAAO,EAAE,YAAY,EAAE,gBAAgB,EAAE,MAAM,wBAAwB,CAAC;AACxE,OAAO,EACL,oBAAoB,EACpB,gBAAgB,GAGjB,MAAM,wBAAwB,CAAC;AAyBhC;;;;;;;;;;;;;;;GAeG;AACH,MAAM,CAAC,KAAK,UAAU,2BAA2B,CAC/C,OAAqC;IAErC,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,GAAG,YAAY,EAAE,GAAG,OAAO,CAAC;IACtD,IAAI,CAAC,iBAAiB,CAAC,QAAQ,CAAC,EAAE,CAAC;QACjC,MAAM,eAAe,CAAC,QAAQ,CAAC,CAAC;IAClC,CAAC;IAED,6EAA6E;IAC7E,6EAA6E;IAC7E,8EAA8E;IAC9E,MAAM,OAAO,GAAG,MAAM,cAAc,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAC;IACvD,OAAO,oBAAoB,CAAC,EAAE,GAAG,YAAY,EAAE,OAAO,EAAE,CAAC,CAAC;AAC5D,CAAC;AAED,KAAK,UAAU,cAAc,CAC3B,QAA6B,EAC7B,MAAyC;IAEzC,IAAI,QAAQ,CAAC;IACb,IAAI,CAAC;QACH,QAAQ,GAAG,MAAM,SAAS,CAAC,EAAE,GAAG,MAAM,EAAE,QAAQ,EAAE,CAAC,CAAC;IACtD,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,MAAM,gBAAgB,CAAC,KAAK,CAAC,CAAC;IAChC,CAAC;IACD,MAAM,EAAE,OAAO,EAAE,GAAG,QAAQ,CAAC,KAAK,CAAC;IACnC,IAAI,QAAQ,KAAK,IAAI,EAAE,CAAC;QACtB,OAAO,OAAO,CAAC;IACjB,CAAC;IACD,yEAAyE;IACzE,4EAA4E;IAC5E,MAAM,EAAE,kBAAkB,EAAE,GAAG,MAAM,MAAM,CAAC,gBAAgB,CAAC,CAAC;IAC9D,OAAO,kBAAkB,CACvB,OAAmD,EACnD;QACE,GAAG,CAAC,MAAM,EAAE,aAAa,KAAK,SAAS,IAAI;YACzC,aAAa,EAAE,MAAM,CAAC,aAAa;SACpC,CAAC;KACH,CACF,CAAC;AACJ,CAAC;AAED,SAAS,eAAe,CAAC,QAAgB;IACvC,OAAO,IAAI,YAAY,CACrB,6BAA6B,IAAI,CAAC,SAAS,CAAC,QAAQ,CAAC,sBAAsB,cAAc,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,EACvG,EAAE,IAAI,EAAE,gBAAgB,CAAC,gBAAgB,EAAE,SAAS,EAAE,IAAI,EAAE,CAC7D,CAAC;AACJ,CAAC;AAED,iFAAiF;AACjF,MAAM,UAAU,iBAAiB,CAAC,KAAa;IAC7C,OAAO,WAAW,CAAC,KAAK,CAAC,KAAK,SAAS,CAAC;AAC1C,CAAC;AAED,wDAAwD;AACxD,MAAM,UAAU,oBAAoB;IAClC,OAAO,cAAc,CAAC,OAAO,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,WAAW,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC,CAAC;AACnE,CAAC;AAED,+EAA+E;AAC/E,MAAM,UAAU,kBAAkB,CAAC,IAAY;IAC7C,OAAO,WAAW,CAAC,IAAI,CAAC,CAAC;AAC3B,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,0BAA0B,CAAC,IAAY;IACrD,OAAO,WAAW,CAAC,IAAI,CAAC,CAAC;AAC3B,CAAC;AAED,6EAA6E;AAC7E,MAAM,UAAU,gCAAgC,CAAC,IAAY;IAC3D,OAAO,gBAAgB,CAAC,IAAI,CAAC,CAAC;AAChC,CAAC","sourcesContent":["import type { Adapter } from 'files-sdk';\nimport { loadFiles, type LoadFilesOptions } from 'files-sdk/loader';\nimport {\n PROVIDER_NAMES,\n getProvider,\n getSecretEnvVars,\n listEnvVars,\n type EnvVar,\n type Provider,\n type ProviderSlug,\n} from 'files-sdk/providers';\n\nimport { StorageError, StorageErrorCode } from '../../storage.error.js';\nimport {\n createFilesSdkDriver,\n mapFilesSdkError,\n type FilesSdkDriverOptions,\n type FilesSdkStorageDriver,\n} from '../files-sdk.driver.js';\n\n/** Slug of a storage provider this package can build a driver for. */\nexport type StorageProviderName = ProviderSlug;\n\n/**\n * Flat, provider-specific settings — `bucket` and `region` for an object store,\n * `root` for the filesystem, `accountName` and `container` for Azure, and so\n * on. Every provider reads what it needs and ignores the rest, so one config\n * shape serves a deployment that switches providers by name.\n *\n * Credentials may be omitted for any provider whose SDK resolves its own chain\n * (an IAM role, Application Default Credentials, a shared profile).\n */\nexport type StorageProviderConfig = Omit<LoadFilesOptions, 'provider'>;\n\nexport interface ProviderStorageDriverOptions extends Omit<\n FilesSdkDriverOptions<Adapter>,\n 'adapter'\n> {\n /** Which provider to build. Validate untrusted input with {@link isStorageProvider}. */\n provider: StorageProviderName;\n config?: StorageProviderConfig;\n}\n\n/**\n * Builds a {@link FilesSdkStorageDriver} for a provider named at runtime,\n * importing that provider's adapter — and only that one — on demand. A\n * deployment selects its store with a string (`'s3'`, `'gcs'`, `'azure'`,\n * `'r2'`, `'fs'`, …) and installs one native SDK, instead of the application\n * hard-coding a driver per backend.\n *\n * The `s3` slug additionally gets the conditional-promotion and signed-policy\n * capabilities {@link createS3StorageDriver} attaches; every other provider\n * exposes exactly what its adapter declares. Import\n * `@nestm/storage/files-sdk/s3` directly when the provider is known at build\n * time and the extra indirection buys nothing.\n *\n * @throws StorageError `INVALID_ARGUMENT` for an unknown slug, and whatever the\n * adapter reports (mapped) when required config or credentials are missing.\n */\nexport async function createProviderStorageDriver(\n options: ProviderStorageDriverOptions,\n): Promise<FilesSdkStorageDriver> {\n const { provider, config, ...filesOptions } = options;\n if (!isStorageProvider(provider)) {\n throw unknownProvider(provider);\n }\n\n // `loadFiles` owns the slug → adapter mapping and keeps the import lazy; the\n // client it returns is discarded so the caller's own driver options (prefix,\n // hooks, plugins, readonly, retries) apply to the instance the bridge builds.\n const adapter = await resolveAdapter(provider, config);\n return createFilesSdkDriver({ ...filesOptions, adapter });\n}\n\nasync function resolveAdapter(\n provider: StorageProviderName,\n config: StorageProviderConfig | undefined,\n): Promise<Adapter> {\n let resolved;\n try {\n resolved = await loadFiles({ ...config, provider });\n } catch (error) {\n throw mapFilesSdkError(error);\n }\n const { adapter } = resolved.files;\n if (provider !== 's3') {\n return adapter;\n }\n // Built by `s3(...)`, so its `raw` is an S3Client and the promotion path\n // holds. The S3-compatible wrappers keep only what they declare themselves.\n const { withS3Capabilities } = await import('../s3/index.js');\n return withS3Capabilities(\n adapter as Parameters<typeof withS3Capabilities>[0],\n {\n ...(config?.publicBaseUrl !== undefined && {\n publicBaseUrl: config.publicBaseUrl,\n }),\n },\n );\n}\n\nfunction unknownProvider(provider: string): StorageError {\n return new StorageError(\n `Unknown storage provider: ${JSON.stringify(provider)}. Known providers: ${PROVIDER_NAMES.join(', ')}.`,\n { code: StorageErrorCode.INVALID_ARGUMENT, permanent: true },\n );\n}\n\n/** Narrows an untrusted string — an env var, a config file — to a known slug. */\nexport function isStorageProvider(value: string): value is StorageProviderName {\n return getProvider(value) !== undefined;\n}\n\n/** Every provider that can be named, sorted by slug. */\nexport function listStorageProviders(): readonly Provider[] {\n return PROVIDER_NAMES.flatMap((slug) => getProvider(slug) ?? []);\n}\n\n/** One provider's display name, description, native SDKs, and env contract. */\nexport function getStorageProvider(slug: string): Provider | undefined {\n return getProvider(slug);\n}\n\n/**\n * Every environment variable a provider reads, flattened across required, all\n * credential modes, and optional. Useful for validating a deployment's config\n * before the first upload rather than at it.\n */\nexport function listStorageProviderEnvVars(slug: string): EnvVar[] {\n return listEnvVars(slug);\n}\n\n/** The subset of {@link listStorageProviderEnvVars} that carries secrets. */\nexport function listStorageProviderSecretEnvVars(slug: string): EnvVar[] {\n return getSecretEnvVars(slug);\n}\n\nexport type {\n EnvVar as StorageProviderEnvVar,\n Provider as StorageProviderInfo,\n} from 'files-sdk/providers';\n"]}