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

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 (198) hide show
  1. package/CHANGELOG.md +320 -0
  2. package/README.md +975 -29
  3. package/SECURITY.md +128 -0
  4. package/dist/ai-sdk/ai-sdk-file-workflow-tools.d.ts +53 -0
  5. package/dist/ai-sdk/ai-sdk-file-workflow-tools.d.ts.map +1 -0
  6. package/dist/ai-sdk/ai-sdk-file-workflow-tools.js +370 -0
  7. package/dist/ai-sdk/ai-sdk-file-workflow-tools.js.map +1 -0
  8. package/dist/ai-sdk/ai-sdk-workspace-tools.d.ts +91 -0
  9. package/dist/ai-sdk/ai-sdk-workspace-tools.d.ts.map +1 -0
  10. package/dist/ai-sdk/ai-sdk-workspace-tools.js +497 -0
  11. package/dist/ai-sdk/ai-sdk-workspace-tools.js.map +1 -0
  12. package/dist/ai-sdk/index.d.ts +3 -0
  13. package/dist/ai-sdk/index.d.ts.map +1 -0
  14. package/dist/ai-sdk/index.js +3 -0
  15. package/dist/ai-sdk/index.js.map +1 -0
  16. package/dist/bytes/index.d.ts +30 -0
  17. package/dist/bytes/index.d.ts.map +1 -0
  18. package/dist/bytes/index.js +96 -0
  19. package/dist/bytes/index.js.map +1 -0
  20. package/dist/core/index.d.ts +5 -0
  21. package/dist/core/index.d.ts.map +1 -1
  22. package/dist/core/index.js +5 -0
  23. package/dist/core/index.js.map +1 -1
  24. package/dist/core/storage-staged-content.d.ts +39 -0
  25. package/dist/core/storage-staged-content.d.ts.map +1 -0
  26. package/dist/core/storage-staged-content.js +109 -0
  27. package/dist/core/storage-staged-content.js.map +1 -0
  28. package/dist/core/storage-streams.d.ts +19 -0
  29. package/dist/core/storage-streams.d.ts.map +1 -0
  30. package/dist/core/storage-streams.js +95 -0
  31. package/dist/core/storage-streams.js.map +1 -0
  32. package/dist/core/storage-text-edit.d.ts +38 -0
  33. package/dist/core/storage-text-edit.d.ts.map +1 -0
  34. package/dist/core/storage-text-edit.js +86 -0
  35. package/dist/core/storage-text-edit.js.map +1 -0
  36. package/dist/core/storage-text-stream-edit.d.ts +8 -0
  37. package/dist/core/storage-text-stream-edit.d.ts.map +1 -0
  38. package/dist/core/storage-text-stream-edit.js +114 -0
  39. package/dist/core/storage-text-stream-edit.js.map +1 -0
  40. package/dist/core/storage-text.d.ts +22 -0
  41. package/dist/core/storage-text.d.ts.map +1 -0
  42. package/dist/core/storage-text.js +69 -0
  43. package/dist/core/storage-text.js.map +1 -0
  44. package/dist/crypto/index.d.ts +2 -0
  45. package/dist/crypto/index.d.ts.map +1 -0
  46. package/dist/crypto/index.js +2 -0
  47. package/dist/crypto/index.js.map +1 -0
  48. package/dist/crypto/storage-encrypted-content.d.ts +49 -0
  49. package/dist/crypto/storage-encrypted-content.d.ts.map +1 -0
  50. package/dist/crypto/storage-encrypted-content.js +212 -0
  51. package/dist/crypto/storage-encrypted-content.js.map +1 -0
  52. package/dist/files-sdk/azure/azure-conditional.d.ts +5 -0
  53. package/dist/files-sdk/azure/azure-conditional.d.ts.map +1 -0
  54. package/dist/files-sdk/azure/azure-conditional.js +184 -0
  55. package/dist/files-sdk/azure/azure-conditional.js.map +1 -0
  56. package/dist/files-sdk/azure/index.d.ts +10 -0
  57. package/dist/files-sdk/azure/index.d.ts.map +1 -0
  58. package/dist/files-sdk/azure/index.js +34 -0
  59. package/dist/files-sdk/azure/index.js.map +1 -0
  60. package/dist/files-sdk/files-sdk.driver.d.ts +85 -3
  61. package/dist/files-sdk/files-sdk.driver.d.ts.map +1 -1
  62. package/dist/files-sdk/files-sdk.driver.js +1437 -37
  63. package/dist/files-sdk/files-sdk.driver.js.map +1 -1
  64. package/dist/files-sdk/fs/index.d.ts +42 -0
  65. package/dist/files-sdk/fs/index.d.ts.map +1 -0
  66. package/dist/files-sdk/fs/index.js +1117 -0
  67. package/dist/files-sdk/fs/index.js.map +1 -0
  68. package/dist/files-sdk/index.d.ts +1 -1
  69. package/dist/files-sdk/index.d.ts.map +1 -1
  70. package/dist/files-sdk/index.js.map +1 -1
  71. package/dist/files-sdk/memory.d.ts +7 -0
  72. package/dist/files-sdk/memory.d.ts.map +1 -0
  73. package/dist/files-sdk/memory.js +72 -0
  74. package/dist/files-sdk/memory.js.map +1 -0
  75. package/dist/files-sdk/provider/index.d.ts +58 -0
  76. package/dist/files-sdk/provider/index.d.ts.map +1 -0
  77. package/dist/files-sdk/provider/index.js +169 -0
  78. package/dist/files-sdk/provider/index.js.map +1 -0
  79. package/dist/files-sdk/s3/construction-metadata.d.ts +9 -0
  80. package/dist/files-sdk/s3/construction-metadata.d.ts.map +1 -0
  81. package/dist/files-sdk/s3/construction-metadata.js +24 -0
  82. package/dist/files-sdk/s3/construction-metadata.js.map +1 -0
  83. package/dist/files-sdk/s3/index.d.ts +54 -0
  84. package/dist/files-sdk/s3/index.d.ts.map +1 -0
  85. package/dist/files-sdk/s3/index.js +1505 -0
  86. package/dist/files-sdk/s3/index.js.map +1 -0
  87. package/dist/gateway/index.d.ts +1 -1
  88. package/dist/gateway/index.d.ts.map +1 -1
  89. package/dist/gateway/index.js.map +1 -1
  90. package/dist/gateway/storage-gateway-fastify-parser.d.ts.map +1 -1
  91. package/dist/gateway/storage-gateway-fastify-parser.js.map +1 -1
  92. package/dist/gateway/storage-gateway.controller.d.ts +12 -11
  93. package/dist/gateway/storage-gateway.controller.d.ts.map +1 -1
  94. package/dist/gateway/storage-gateway.controller.js +240 -70
  95. package/dist/gateway/storage-gateway.controller.js.map +1 -1
  96. package/dist/gateway/storage-gateway.guard.d.ts.map +1 -1
  97. package/dist/gateway/storage-gateway.guard.js.map +1 -1
  98. package/dist/gateway/storage-gateway.module.d.ts.map +1 -1
  99. package/dist/gateway/storage-gateway.module.js +60 -1
  100. package/dist/gateway/storage-gateway.module.js.map +1 -1
  101. package/dist/gateway/storage-gateway.tokens.d.ts +1 -0
  102. package/dist/gateway/storage-gateway.tokens.d.ts.map +1 -1
  103. package/dist/gateway/storage-gateway.tokens.js +1 -0
  104. package/dist/gateway/storage-gateway.tokens.js.map +1 -1
  105. package/dist/gateway/storage-gateway.types.d.ts +53 -10
  106. package/dist/gateway/storage-gateway.types.d.ts.map +1 -1
  107. package/dist/gateway/storage-gateway.types.js.map +1 -1
  108. package/dist/inject-storage.decorator.js.map +1 -1
  109. package/dist/storage-etag.d.ts +13 -0
  110. package/dist/storage-etag.d.ts.map +1 -0
  111. package/dist/storage-etag.js +31 -0
  112. package/dist/storage-etag.js.map +1 -0
  113. package/dist/storage-upload-control.d.ts.map +1 -1
  114. package/dist/storage.client.d.ts +14 -1
  115. package/dist/storage.client.d.ts.map +1 -1
  116. package/dist/storage.client.js +204 -2
  117. package/dist/storage.client.js.map +1 -1
  118. package/dist/storage.driver.d.ts +28 -1
  119. package/dist/storage.driver.d.ts.map +1 -1
  120. package/dist/storage.driver.js.map +1 -1
  121. package/dist/storage.error.d.ts +17 -10
  122. package/dist/storage.error.d.ts.map +1 -1
  123. package/dist/storage.error.js +47 -1
  124. package/dist/storage.error.js.map +1 -1
  125. package/dist/storage.module.d.ts.map +1 -1
  126. package/dist/storage.module.js.map +1 -1
  127. package/dist/storage.service.d.ts.map +1 -1
  128. package/dist/storage.service.js +28 -3
  129. package/dist/storage.service.js.map +1 -1
  130. package/dist/storage.tokens.js.map +1 -1
  131. package/dist/storage.types.d.ts +150 -1
  132. package/dist/storage.types.d.ts.map +1 -1
  133. package/dist/storage.types.js.map +1 -1
  134. package/dist/testing/index.d.ts +1 -0
  135. package/dist/testing/index.d.ts.map +1 -1
  136. package/dist/testing/index.js +3 -1
  137. package/dist/testing/index.js.map +1 -1
  138. package/dist/testing/provider-conformance.d.ts +65 -0
  139. package/dist/testing/provider-conformance.d.ts.map +1 -0
  140. package/dist/testing/provider-conformance.js +869 -0
  141. package/dist/testing/provider-conformance.js.map +1 -0
  142. package/dist/workspace/index.d.ts +12 -0
  143. package/dist/workspace/index.d.ts.map +1 -0
  144. package/dist/workspace/index.js +10 -0
  145. package/dist/workspace/index.js.map +1 -0
  146. package/dist/workspace/storage-catalog-checkout.d.ts +7 -0
  147. package/dist/workspace/storage-catalog-checkout.d.ts.map +1 -0
  148. package/dist/workspace/storage-catalog-checkout.js +13 -0
  149. package/dist/workspace/storage-catalog-checkout.js.map +1 -0
  150. package/dist/workspace/storage-draft-stream.d.ts +3 -0
  151. package/dist/workspace/storage-draft-stream.d.ts.map +1 -0
  152. package/dist/workspace/storage-draft-stream.js +57 -0
  153. package/dist/workspace/storage-draft-stream.js.map +1 -0
  154. package/dist/workspace/storage-file-catalog.types.d.ts +73 -0
  155. package/dist/workspace/storage-file-catalog.types.d.ts.map +1 -0
  156. package/dist/workspace/storage-file-catalog.types.js +2 -0
  157. package/dist/workspace/storage-file-catalog.types.js.map +1 -0
  158. package/dist/workspace/storage-file-workflow.d.ts +7 -0
  159. package/dist/workspace/storage-file-workflow.d.ts.map +1 -0
  160. package/dist/workspace/storage-file-workflow.js +657 -0
  161. package/dist/workspace/storage-file-workflow.js.map +1 -0
  162. package/dist/workspace/storage-file-workflow.protection.d.ts +31 -0
  163. package/dist/workspace/storage-file-workflow.protection.d.ts.map +1 -0
  164. package/dist/workspace/storage-file-workflow.protection.js +339 -0
  165. package/dist/workspace/storage-file-workflow.protection.js.map +1 -0
  166. package/dist/workspace/storage-file-workflow.types.d.ts +184 -0
  167. package/dist/workspace/storage-file-workflow.types.d.ts.map +1 -0
  168. package/dist/workspace/storage-file-workflow.types.js +10 -0
  169. package/dist/workspace/storage-file-workflow.types.js.map +1 -0
  170. package/dist/workspace/storage-text-draft.d.ts +21 -0
  171. package/dist/workspace/storage-text-draft.d.ts.map +1 -0
  172. package/dist/workspace/storage-text-draft.js +77 -0
  173. package/dist/workspace/storage-text-draft.js.map +1 -0
  174. package/dist/workspace/storage-working-files.d.ts +34 -0
  175. package/dist/workspace/storage-working-files.d.ts.map +1 -0
  176. package/dist/workspace/storage-working-files.js +326 -0
  177. package/dist/workspace/storage-working-files.js.map +1 -0
  178. package/dist/workspace/storage-workspace.cursor.d.ts +71 -0
  179. package/dist/workspace/storage-workspace.cursor.d.ts.map +1 -0
  180. package/dist/workspace/storage-workspace.cursor.js +408 -0
  181. package/dist/workspace/storage-workspace.cursor.js.map +1 -0
  182. package/dist/workspace/storage-workspace.d.ts +6 -0
  183. package/dist/workspace/storage-workspace.d.ts.map +1 -0
  184. package/dist/workspace/storage-workspace.error.d.ts +32 -0
  185. package/dist/workspace/storage-workspace.error.d.ts.map +1 -0
  186. package/dist/workspace/storage-workspace.error.js +75 -0
  187. package/dist/workspace/storage-workspace.error.js.map +1 -0
  188. package/dist/workspace/storage-workspace.js +849 -0
  189. package/dist/workspace/storage-workspace.js.map +1 -0
  190. package/dist/workspace/storage-workspace.path.d.ts +9 -0
  191. package/dist/workspace/storage-workspace.path.d.ts.map +1 -0
  192. package/dist/workspace/storage-workspace.path.js +68 -0
  193. package/dist/workspace/storage-workspace.path.js.map +1 -0
  194. package/dist/workspace/storage-workspace.types.d.ts +123 -0
  195. package/dist/workspace/storage-workspace.types.d.ts.map +1 -0
  196. package/dist/workspace/storage-workspace.types.js +22 -0
  197. package/dist/workspace/storage-workspace.types.js.map +1 -0
  198. package/package.json +99 -20
@@ -1,14 +1,41 @@
1
- import type { StorageBody, StorageCapabilities, StorageDownloadOptions, StorageListOptions, StorageListResult, StorageObject, StorageObjectMetadata, StorageOperationOptions, StorageSearchOptions, StorageSignedDownloadOptions, StorageSignedUpload, StorageSignedUploadOptions, StorageUploadOptions, StorageUploadResult } from './storage.types.js';
1
+ import type { StorageBody, StorageCapabilities, StorageConditionalDeleteOptions, StorageConditionalReadOptions, StorageConditionalUploadOptions, StorageDownloadOptions, StorageListOptions, StorageListResult, StorageObject, StorageObjectMetadata, StorageOperationOptions, StoragePromotionOptions, StorageSearchOptions, StorageSignedDownloadOptions, StorageSignedUpload, StorageSignedUploadOptions, StorageUploadOptions, StorageUploadResult } from './storage.types.js';
2
2
  export interface StorageDriver {
3
3
  readonly name: string;
4
4
  readonly capabilities: StorageCapabilities;
5
5
  upload(key: string, body: StorageBody, options?: StorageUploadOptions): Promise<StorageUploadResult>;
6
+ uploadConditional?(key: string, body: StorageBody, options: StorageConditionalUploadOptions): Promise<StorageUploadResult>;
6
7
  download(key: string, options?: StorageDownloadOptions): Promise<StorageObject>;
8
+ downloadConditional?(key: string, options: StorageConditionalReadOptions): Promise<StorageObject>;
7
9
  head(key: string, options?: StorageOperationOptions): Promise<StorageObjectMetadata>;
8
10
  exists(key: string, options?: StorageOperationOptions): Promise<boolean>;
9
11
  delete(key: string, options?: StorageOperationOptions): Promise<void>;
12
+ deleteConditional?(key: string, options: StorageConditionalDeleteOptions): Promise<void>;
10
13
  copy(sourceKey: string, destinationKey: string, options?: StorageOperationOptions): Promise<void>;
11
14
  move(sourceKey: string, destinationKey: string, options?: StorageOperationOptions): Promise<void>;
15
+ /**
16
+ * Conditionally copies a staged object to its final key. The source remains
17
+ * in place so applications can delete it only after their metadata commit.
18
+ */
19
+ promote?(sourceKey: string, destinationKey: string, options: StoragePromotionOptions): Promise<void>;
20
+ /**
21
+ * Lists one page and, when more entries remain, returns an opaque cursor for
22
+ * the next logical position. Cursors are bound to the request's `prefix` and
23
+ * `delimiter`; callers may choose a different supported `limit` when they
24
+ * resume.
25
+ *
26
+ * A cursor is non-consuming. Reusing it, including after following any
27
+ * descendant cursor, must resume from the same logical position while the
28
+ * provider namespace is unchanged. It must also work with an independently
29
+ * constructed compatible driver and client that address the same store with
30
+ * the same backend configuration while the provider token remains valid and
31
+ * available. Drivers must not make cursor state local to one process, client,
32
+ * or session.
33
+ *
34
+ * This contract does not provide snapshot isolation: concurrent namespace
35
+ * mutations may change subsequent pages. It does not guarantee provider
36
+ * token lifetime or backend availability, and provider invalidation remains
37
+ * an ordinary list-operation failure.
38
+ */
12
39
  list(options?: StorageListOptions): Promise<StorageListResult>;
13
40
  search(pattern: string | RegExp, options?: StorageSearchOptions): AsyncIterable<StorageObjectMetadata>;
14
41
  signDownload(key: string, options?: StorageSignedDownloadOptions): Promise<string>;
@@ -1 +1 @@
1
- {"version":3,"file":"storage.driver.d.ts","sourceRoot":"","sources":["../src/storage.driver.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,WAAW,EACX,mBAAmB,EACnB,sBAAsB,EACtB,kBAAkB,EAClB,iBAAiB,EACjB,aAAa,EACb,qBAAqB,EACrB,uBAAuB,EACvB,oBAAoB,EACpB,4BAA4B,EAC5B,mBAAmB,EACnB,0BAA0B,EAC1B,oBAAoB,EACpB,mBAAmB,EACpB,MAAM,oBAAoB,CAAC;AAE5B,MAAM,WAAW,aAAa;IAC5B,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,YAAY,EAAE,mBAAmB,CAAC;IAE3C,MAAM,CACJ,GAAG,EAAE,MAAM,EACX,IAAI,EAAE,WAAW,EACjB,OAAO,CAAC,EAAE,oBAAoB,GAC7B,OAAO,CAAC,mBAAmB,CAAC,CAAC;IAChC,QAAQ,CACN,GAAG,EAAE,MAAM,EACX,OAAO,CAAC,EAAE,sBAAsB,GAC/B,OAAO,CAAC,aAAa,CAAC,CAAC;IAC1B,IAAI,CACF,GAAG,EAAE,MAAM,EACX,OAAO,CAAC,EAAE,uBAAuB,GAChC,OAAO,CAAC,qBAAqB,CAAC,CAAC;IAClC,MAAM,CAAC,GAAG,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,uBAAuB,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;IACzE,MAAM,CAAC,GAAG,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,uBAAuB,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IACtE,IAAI,CACF,SAAS,EAAE,MAAM,EACjB,cAAc,EAAE,MAAM,EACtB,OAAO,CAAC,EAAE,uBAAuB,GAChC,OAAO,CAAC,IAAI,CAAC,CAAC;IACjB,IAAI,CACF,SAAS,EAAE,MAAM,EACjB,cAAc,EAAE,MAAM,EACtB,OAAO,CAAC,EAAE,uBAAuB,GAChC,OAAO,CAAC,IAAI,CAAC,CAAC;IACjB,IAAI,CAAC,OAAO,CAAC,EAAE,kBAAkB,GAAG,OAAO,CAAC,iBAAiB,CAAC,CAAC;IAC/D,MAAM,CACJ,OAAO,EAAE,MAAM,GAAG,MAAM,EACxB,OAAO,CAAC,EAAE,oBAAoB,GAC7B,aAAa,CAAC,qBAAqB,CAAC,CAAC;IACxC,YAAY,CACV,GAAG,EAAE,MAAM,EACX,OAAO,CAAC,EAAE,4BAA4B,GACrC,OAAO,CAAC,MAAM,CAAC,CAAC;IACnB,UAAU,CACR,GAAG,EAAE,MAAM,EACX,OAAO,EAAE,0BAA0B,GAClC,OAAO,CAAC,mBAAmB,CAAC,CAAC;IAChC,KAAK,CAAC,IAAI,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;CAChC"}
1
+ {"version":3,"file":"storage.driver.d.ts","sourceRoot":"","sources":["../src/storage.driver.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,WAAW,EACX,mBAAmB,EACnB,+BAA+B,EAC/B,6BAA6B,EAC7B,+BAA+B,EAC/B,sBAAsB,EACtB,kBAAkB,EAClB,iBAAiB,EACjB,aAAa,EACb,qBAAqB,EACrB,uBAAuB,EACvB,uBAAuB,EACvB,oBAAoB,EACpB,4BAA4B,EAC5B,mBAAmB,EACnB,0BAA0B,EAC1B,oBAAoB,EACpB,mBAAmB,EACpB,MAAM,oBAAoB,CAAC;AAE5B,MAAM,WAAW,aAAa;IAC5B,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,YAAY,EAAE,mBAAmB,CAAC;IAE3C,MAAM,CACJ,GAAG,EAAE,MAAM,EACX,IAAI,EAAE,WAAW,EACjB,OAAO,CAAC,EAAE,oBAAoB,GAC7B,OAAO,CAAC,mBAAmB,CAAC,CAAC;IAChC,iBAAiB,CAAC,CAChB,GAAG,EAAE,MAAM,EACX,IAAI,EAAE,WAAW,EACjB,OAAO,EAAE,+BAA+B,GACvC,OAAO,CAAC,mBAAmB,CAAC,CAAC;IAChC,QAAQ,CACN,GAAG,EAAE,MAAM,EACX,OAAO,CAAC,EAAE,sBAAsB,GAC/B,OAAO,CAAC,aAAa,CAAC,CAAC;IAC1B,mBAAmB,CAAC,CAClB,GAAG,EAAE,MAAM,EACX,OAAO,EAAE,6BAA6B,GACrC,OAAO,CAAC,aAAa,CAAC,CAAC;IAC1B,IAAI,CACF,GAAG,EAAE,MAAM,EACX,OAAO,CAAC,EAAE,uBAAuB,GAChC,OAAO,CAAC,qBAAqB,CAAC,CAAC;IAClC,MAAM,CAAC,GAAG,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,uBAAuB,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;IACzE,MAAM,CAAC,GAAG,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,uBAAuB,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IACtE,iBAAiB,CAAC,CAChB,GAAG,EAAE,MAAM,EACX,OAAO,EAAE,+BAA+B,GACvC,OAAO,CAAC,IAAI,CAAC,CAAC;IACjB,IAAI,CACF,SAAS,EAAE,MAAM,EACjB,cAAc,EAAE,MAAM,EACtB,OAAO,CAAC,EAAE,uBAAuB,GAChC,OAAO,CAAC,IAAI,CAAC,CAAC;IACjB,IAAI,CACF,SAAS,EAAE,MAAM,EACjB,cAAc,EAAE,MAAM,EACtB,OAAO,CAAC,EAAE,uBAAuB,GAChC,OAAO,CAAC,IAAI,CAAC,CAAC;IACjB;;;OAGG;IACH,OAAO,CAAC,CACN,SAAS,EAAE,MAAM,EACjB,cAAc,EAAE,MAAM,EACtB,OAAO,EAAE,uBAAuB,GAC/B,OAAO,CAAC,IAAI,CAAC,CAAC;IACjB;;;;;;;;;;;;;;;;;;OAkBG;IACH,IAAI,CAAC,OAAO,CAAC,EAAE,kBAAkB,GAAG,OAAO,CAAC,iBAAiB,CAAC,CAAC;IAC/D,MAAM,CACJ,OAAO,EAAE,MAAM,GAAG,MAAM,EACxB,OAAO,CAAC,EAAE,oBAAoB,GAC7B,aAAa,CAAC,qBAAqB,CAAC,CAAC;IACxC,YAAY,CACV,GAAG,EAAE,MAAM,EACX,OAAO,CAAC,EAAE,4BAA4B,GACrC,OAAO,CAAC,MAAM,CAAC,CAAC;IACnB,UAAU,CACR,GAAG,EAAE,MAAM,EACX,OAAO,EAAE,0BAA0B,GAClC,OAAO,CAAC,mBAAmB,CAAC,CAAC;IAChC,KAAK,CAAC,IAAI,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;CAChC"}
@@ -1 +1 @@
1
- {"version":3,"file":"storage.driver.js","sourceRoot":"","sources":["../src/storage.driver.ts"],"names":[],"mappings":"","sourcesContent":["import type {\n StorageBody,\n StorageCapabilities,\n StorageDownloadOptions,\n StorageListOptions,\n StorageListResult,\n StorageObject,\n StorageObjectMetadata,\n StorageOperationOptions,\n StorageSearchOptions,\n StorageSignedDownloadOptions,\n StorageSignedUpload,\n StorageSignedUploadOptions,\n StorageUploadOptions,\n StorageUploadResult,\n} from './storage.types.js';\n\nexport interface StorageDriver {\n readonly name: string;\n readonly capabilities: StorageCapabilities;\n\n upload(\n key: string,\n body: StorageBody,\n options?: StorageUploadOptions,\n ): Promise<StorageUploadResult>;\n download(\n key: string,\n options?: StorageDownloadOptions,\n ): Promise<StorageObject>;\n head(\n key: string,\n options?: StorageOperationOptions,\n ): Promise<StorageObjectMetadata>;\n exists(key: string, options?: StorageOperationOptions): Promise<boolean>;\n delete(key: string, options?: StorageOperationOptions): Promise<void>;\n copy(\n sourceKey: string,\n destinationKey: string,\n options?: StorageOperationOptions,\n ): Promise<void>;\n move(\n sourceKey: string,\n destinationKey: string,\n options?: StorageOperationOptions,\n ): Promise<void>;\n list(options?: StorageListOptions): Promise<StorageListResult>;\n search(\n pattern: string | RegExp,\n options?: StorageSearchOptions,\n ): AsyncIterable<StorageObjectMetadata>;\n signDownload(\n key: string,\n options?: StorageSignedDownloadOptions,\n ): Promise<string>;\n signUpload(\n key: string,\n options: StorageSignedUploadOptions,\n ): Promise<StorageSignedUpload>;\n close?(): void | Promise<void>;\n}\n"]}
1
+ {"version":3,"file":"storage.driver.js","sourceRoot":"","sources":["../src/storage.driver.ts"],"names":[],"mappings":"","sourcesContent":["import type {\n StorageBody,\n StorageCapabilities,\n StorageConditionalDeleteOptions,\n StorageConditionalReadOptions,\n StorageConditionalUploadOptions,\n StorageDownloadOptions,\n StorageListOptions,\n StorageListResult,\n StorageObject,\n StorageObjectMetadata,\n StorageOperationOptions,\n StoragePromotionOptions,\n StorageSearchOptions,\n StorageSignedDownloadOptions,\n StorageSignedUpload,\n StorageSignedUploadOptions,\n StorageUploadOptions,\n StorageUploadResult,\n} from './storage.types.js';\n\nexport interface StorageDriver {\n readonly name: string;\n readonly capabilities: StorageCapabilities;\n\n upload(\n key: string,\n body: StorageBody,\n options?: StorageUploadOptions,\n ): Promise<StorageUploadResult>;\n uploadConditional?(\n key: string,\n body: StorageBody,\n options: StorageConditionalUploadOptions,\n ): Promise<StorageUploadResult>;\n download(\n key: string,\n options?: StorageDownloadOptions,\n ): Promise<StorageObject>;\n downloadConditional?(\n key: string,\n options: StorageConditionalReadOptions,\n ): Promise<StorageObject>;\n head(\n key: string,\n options?: StorageOperationOptions,\n ): Promise<StorageObjectMetadata>;\n exists(key: string, options?: StorageOperationOptions): Promise<boolean>;\n delete(key: string, options?: StorageOperationOptions): Promise<void>;\n deleteConditional?(\n key: string,\n options: StorageConditionalDeleteOptions,\n ): Promise<void>;\n copy(\n sourceKey: string,\n destinationKey: string,\n options?: StorageOperationOptions,\n ): Promise<void>;\n move(\n sourceKey: string,\n destinationKey: string,\n options?: StorageOperationOptions,\n ): Promise<void>;\n /**\n * Conditionally copies a staged object to its final key. The source remains\n * in place so applications can delete it only after their metadata commit.\n */\n promote?(\n sourceKey: string,\n destinationKey: string,\n options: StoragePromotionOptions,\n ): Promise<void>;\n /**\n * Lists one page and, when more entries remain, returns an opaque cursor for\n * the next logical position. Cursors are bound to the request's `prefix` and\n * `delimiter`; callers may choose a different supported `limit` when they\n * resume.\n *\n * A cursor is non-consuming. Reusing it, including after following any\n * descendant cursor, must resume from the same logical position while the\n * provider namespace is unchanged. It must also work with an independently\n * constructed compatible driver and client that address the same store with\n * the same backend configuration while the provider token remains valid and\n * available. Drivers must not make cursor state local to one process, client,\n * or session.\n *\n * This contract does not provide snapshot isolation: concurrent namespace\n * mutations may change subsequent pages. It does not guarantee provider\n * token lifetime or backend availability, and provider invalidation remains\n * an ordinary list-operation failure.\n */\n list(options?: StorageListOptions): Promise<StorageListResult>;\n search(\n pattern: string | RegExp,\n options?: StorageSearchOptions,\n ): AsyncIterable<StorageObjectMetadata>;\n signDownload(\n key: string,\n options?: StorageSignedDownloadOptions,\n ): Promise<string>;\n signUpload(\n key: string,\n options: StorageSignedUploadOptions,\n ): Promise<StorageSignedUpload>;\n close?(): void | Promise<void>;\n}\n"]}
@@ -1,16 +1,17 @@
1
1
  export declare const StorageErrorCode: {
2
- readonly NOT_FOUND: "NOT_FOUND";
3
- readonly UNAUTHORIZED: "UNAUTHORIZED";
4
- readonly CONFLICT: "CONFLICT";
5
- readonly READ_ONLY: "READ_ONLY";
6
- readonly INVALID_ARGUMENT: "INVALID_ARGUMENT";
7
- readonly NOT_SUPPORTED: "NOT_SUPPORTED";
8
- readonly ABORTED: "ABORTED";
9
- readonly TIMEOUT: "TIMEOUT";
10
- readonly LIMIT_EXCEEDED: "LIMIT_EXCEEDED";
11
- readonly PROVIDER: "PROVIDER";
2
+ readonly NOT_FOUND: 'NOT_FOUND';
3
+ readonly UNAUTHORIZED: 'UNAUTHORIZED';
4
+ readonly CONFLICT: 'CONFLICT';
5
+ readonly READ_ONLY: 'READ_ONLY';
6
+ readonly INVALID_ARGUMENT: 'INVALID_ARGUMENT';
7
+ readonly NOT_SUPPORTED: 'NOT_SUPPORTED';
8
+ readonly ABORTED: 'ABORTED';
9
+ readonly TIMEOUT: 'TIMEOUT';
10
+ readonly LIMIT_EXCEEDED: 'LIMIT_EXCEEDED';
11
+ readonly PROVIDER: 'PROVIDER';
12
12
  };
13
13
  export type StorageErrorCode = (typeof StorageErrorCode)[keyof typeof StorageErrorCode];
14
+ declare const STORAGE_ERROR_BRAND: unique symbol;
14
15
  export interface StorageErrorOptions {
15
16
  code: StorageErrorCode;
16
17
  store?: string;
@@ -19,9 +20,12 @@ export interface StorageErrorOptions {
19
20
  aborted?: boolean;
20
21
  timedOut?: boolean;
21
22
  permanent?: boolean;
23
+ applied?: boolean;
24
+ appliedEtag?: string;
22
25
  cause?: unknown;
23
26
  }
24
27
  export declare class StorageError extends Error {
28
+ readonly [STORAGE_ERROR_BRAND]: true;
25
29
  readonly code: StorageErrorCode;
26
30
  readonly store: string | undefined;
27
31
  readonly operation: string | undefined;
@@ -29,6 +33,8 @@ export declare class StorageError extends Error {
29
33
  readonly aborted: boolean;
30
34
  readonly timedOut: boolean;
31
35
  readonly permanent: boolean;
36
+ readonly applied: boolean;
37
+ readonly appliedEtag?: string;
32
38
  readonly cause?: unknown;
33
39
  constructor(message: string, options: StorageErrorOptions);
34
40
  }
@@ -36,4 +42,5 @@ export declare function isStorageError(error: unknown): error is StorageError;
36
42
  export declare function normalizeStorageError(error: unknown, options?: Omit<StorageErrorOptions, 'code' | 'cause'> & {
37
43
  code?: StorageErrorCode;
38
44
  }): StorageError;
45
+ export {};
39
46
  //# sourceMappingURL=storage.error.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"storage.error.d.ts","sourceRoot":"","sources":["../src/storage.error.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,gBAAgB;;;;;;;;;;;CAWnB,CAAC;AAEX,MAAM,MAAM,gBAAgB,GAC1B,CAAC,OAAO,gBAAgB,CAAC,CAAC,MAAM,OAAO,gBAAgB,CAAC,CAAC;AAE3D,MAAM,WAAW,mBAAmB;IAClC,IAAI,EAAE,gBAAgB,CAAC;IACvB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,KAAK,CAAC,EAAE,OAAO,CAAC;CACjB;AAED,qBAAa,YAAa,SAAQ,KAAK;IACrC,QAAQ,CAAC,IAAI,EAAE,gBAAgB,CAAC;IAChC,QAAQ,CAAC,KAAK,EAAE,MAAM,GAAG,SAAS,CAAC;IACnC,QAAQ,CAAC,SAAS,EAAE,MAAM,GAAG,SAAS,CAAC;IACvC,QAAQ,CAAC,GAAG,EAAE,MAAM,GAAG,SAAS,CAAC;IACjC,QAAQ,CAAC,OAAO,EAAE,OAAO,CAAC;IAC1B,QAAQ,CAAC,QAAQ,EAAE,OAAO,CAAC;IAC3B,QAAQ,CAAC,SAAS,EAAE,OAAO,CAAC;IAC5B,SAAkB,KAAK,CAAC,EAAE,OAAO,CAAC;gBAEtB,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,mBAAmB;CAY1D;AAED,wBAAgB,cAAc,CAAC,KAAK,EAAE,OAAO,GAAG,KAAK,IAAI,YAAY,CAEpE;AAED,wBAAgB,qBAAqB,CACnC,KAAK,EAAE,OAAO,EACd,OAAO,GAAE,IAAI,CAAC,mBAAmB,EAAE,MAAM,GAAG,OAAO,CAAC,GAAG;IACrD,IAAI,CAAC,EAAE,gBAAgB,CAAC;CACpB,GACL,YAAY,CAYd"}
1
+ {"version":3,"file":"storage.error.d.ts","sourceRoot":"","sources":["../src/storage.error.ts"],"names":[],"mappings":"AAEA,eAAO,MAAM,gBAAgB;aAC3B,SAAS,EAAE,WAAW;aACtB,YAAY,EAAE,cAAc;aAC5B,QAAQ,EAAE,UAAU;aACpB,SAAS,EAAE,WAAW;aACtB,gBAAgB,EAAE,kBAAkB;aACpC,aAAa,EAAE,eAAe;aAC9B,OAAO,EAAE,SAAS;aAClB,OAAO,EAAE,SAAS;aAClB,cAAc,EAAE,gBAAgB;aAChC,QAAQ,EAAE,UAAU;CACZ,CAAC;AAEX,MAAM,MAAM,gBAAgB,GAC1B,CAAC,OAAO,gBAAgB,CAAC,CAAC,MAAM,OAAO,gBAAgB,CAAC,CAAC;AAE3D,QAAA,MAAM,mBAAmB,eAA4C,CAAC;AAMtE,MAAM,WAAW,mBAAmB;IAClC,IAAI,EAAE,gBAAgB,CAAC;IACvB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,KAAK,CAAC,EAAE,OAAO,CAAC;CACjB;AAED,qBAAa,YAAa,SAAQ,KAAK;IACrC,SAAiB,CAAC,mBAAmB,CAAC,EAAE,IAAI,CAAC;IAC7C,QAAQ,CAAC,IAAI,EAAE,gBAAgB,CAAC;IAChC,QAAQ,CAAC,KAAK,EAAE,MAAM,GAAG,SAAS,CAAC;IACnC,QAAQ,CAAC,SAAS,EAAE,MAAM,GAAG,SAAS,CAAC;IACvC,QAAQ,CAAC,GAAG,EAAE,MAAM,GAAG,SAAS,CAAC;IACjC,QAAQ,CAAC,OAAO,EAAE,OAAO,CAAC;IAC1B,QAAQ,CAAC,QAAQ,EAAE,OAAO,CAAC;IAC3B,QAAQ,CAAC,SAAS,EAAE,OAAO,CAAC;IAC5B,QAAQ,CAAC,OAAO,EAAE,OAAO,CAAC;IAC1B,QAAQ,CAAC,WAAW,CAAC,EAAE,MAAM,CAAC;IAC9B,SAAkB,KAAK,CAAC,EAAE,OAAO,CAAC;IAElC,YAAY,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,mBAAmB,EAyBxD;CACF;AAED,wBAAgB,cAAc,CAAC,KAAK,EAAE,OAAO,GAAG,KAAK,IAAI,YAAY,CA2CpE;AAED,wBAAgB,qBAAqB,CACnC,KAAK,EAAE,OAAO,EACd,OAAO,GAAE,IAAI,CAAC,mBAAmB,EAAE,MAAM,GAAG,OAAO,CAAC,GAAG;IACrD,IAAI,CAAC,EAAE,gBAAgB,CAAC;CACpB,GACL,YAAY,CAYd"}
@@ -1,3 +1,4 @@
1
+ import { isCanonicalStorageEtag } from './storage-etag.js';
1
2
  export const StorageErrorCode = {
2
3
  NOT_FOUND: 'NOT_FOUND',
3
4
  UNAUTHORIZED: 'UNAUTHORIZED',
@@ -10,6 +11,10 @@ export const StorageErrorCode = {
10
11
  LIMIT_EXCEEDED: 'LIMIT_EXCEEDED',
11
12
  PROVIDER: 'PROVIDER',
12
13
  };
14
+ const STORAGE_ERROR_BRAND = Symbol.for('@nestm/storage/StorageError');
15
+ function isStorageErrorCode(value) {
16
+ return Object.values(StorageErrorCode).includes(value);
17
+ }
13
18
  export class StorageError extends Error {
14
19
  code;
15
20
  store;
@@ -18,9 +23,17 @@ export class StorageError extends Error {
18
23
  aborted;
19
24
  timedOut;
20
25
  permanent;
26
+ applied;
27
+ appliedEtag;
21
28
  cause;
22
29
  constructor(message, options) {
23
30
  super(message, { cause: options.cause });
31
+ Object.defineProperty(this, STORAGE_ERROR_BRAND, {
32
+ configurable: false,
33
+ enumerable: false,
34
+ value: true,
35
+ writable: false,
36
+ });
24
37
  this.name = 'StorageError';
25
38
  this.code = options.code;
26
39
  this.store = options.store;
@@ -29,11 +42,44 @@ export class StorageError extends Error {
29
42
  this.aborted = options.aborted === true;
30
43
  this.timedOut = options.timedOut === true;
31
44
  this.permanent = options.permanent === true;
45
+ this.applied = options.applied === true;
46
+ if (this.applied &&
47
+ options.appliedEtag !== undefined &&
48
+ isCanonicalStorageEtag(options.appliedEtag)) {
49
+ this.appliedEtag = options.appliedEtag;
50
+ }
32
51
  this.cause = options.cause;
33
52
  }
34
53
  }
35
54
  export function isStorageError(error) {
36
- return error instanceof StorageError;
55
+ if (error instanceof StorageError) {
56
+ return true;
57
+ }
58
+ if (!(error instanceof Error) || error.name !== 'StorageError') {
59
+ return false;
60
+ }
61
+ try {
62
+ const candidate = error;
63
+ const hasCompatibleBrand = candidate[STORAGE_ERROR_BRAND] === true ||
64
+ candidate[STORAGE_ERROR_BRAND] === undefined;
65
+ return (hasCompatibleBrand &&
66
+ isStorageErrorCode(candidate.code) &&
67
+ typeof candidate.aborted === 'boolean' &&
68
+ typeof candidate.timedOut === 'boolean' &&
69
+ typeof candidate.permanent === 'boolean' &&
70
+ (candidate.applied === undefined ||
71
+ typeof candidate.applied === 'boolean') &&
72
+ (candidate.appliedEtag === undefined ||
73
+ (candidate.applied === true &&
74
+ isCanonicalStorageEtag(candidate.appliedEtag))) &&
75
+ (candidate.store === undefined || typeof candidate.store === 'string') &&
76
+ (candidate.operation === undefined ||
77
+ typeof candidate.operation === 'string') &&
78
+ (candidate.key === undefined || typeof candidate.key === 'string'));
79
+ }
80
+ catch {
81
+ return false;
82
+ }
37
83
  }
38
84
  export function normalizeStorageError(error, options = {}) {
39
85
  if (isStorageError(error)) {
@@ -1 +1 @@
1
- {"version":3,"file":"storage.error.js","sourceRoot":"","sources":["../src/storage.error.ts"],"names":[],"mappings":"AAAA,MAAM,CAAC,MAAM,gBAAgB,GAAG;IAC9B,SAAS,EAAE,WAAW;IACtB,YAAY,EAAE,cAAc;IAC5B,QAAQ,EAAE,UAAU;IACpB,SAAS,EAAE,WAAW;IACtB,gBAAgB,EAAE,kBAAkB;IACpC,aAAa,EAAE,eAAe;IAC9B,OAAO,EAAE,SAAS;IAClB,OAAO,EAAE,SAAS;IAClB,cAAc,EAAE,gBAAgB;IAChC,QAAQ,EAAE,UAAU;CACZ,CAAC;AAgBX,MAAM,OAAO,YAAa,SAAQ,KAAK;IAC5B,IAAI,CAAmB;IACvB,KAAK,CAAqB;IAC1B,SAAS,CAAqB;IAC9B,GAAG,CAAqB;IACxB,OAAO,CAAU;IACjB,QAAQ,CAAU;IAClB,SAAS,CAAU;IACV,KAAK,CAAW;IAElC,YAAY,OAAe,EAAE,OAA4B;QACvD,KAAK,CAAC,OAAO,EAAE,EAAE,KAAK,EAAE,OAAO,CAAC,KAAK,EAAE,CAAC,CAAC;QACzC,IAAI,CAAC,IAAI,GAAG,cAAc,CAAC;QAC3B,IAAI,CAAC,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC;QACzB,IAAI,CAAC,KAAK,GAAG,OAAO,CAAC,KAAK,CAAC;QAC3B,IAAI,CAAC,SAAS,GAAG,OAAO,CAAC,SAAS,CAAC;QACnC,IAAI,CAAC,GAAG,GAAG,OAAO,CAAC,GAAG,CAAC;QACvB,IAAI,CAAC,OAAO,GAAG,OAAO,CAAC,OAAO,KAAK,IAAI,CAAC;QACxC,IAAI,CAAC,QAAQ,GAAG,OAAO,CAAC,QAAQ,KAAK,IAAI,CAAC;QAC1C,IAAI,CAAC,SAAS,GAAG,OAAO,CAAC,SAAS,KAAK,IAAI,CAAC;QAC5C,IAAI,CAAC,KAAK,GAAG,OAAO,CAAC,KAAK,CAAC;IAC7B,CAAC;CACF;AAED,MAAM,UAAU,cAAc,CAAC,KAAc;IAC3C,OAAO,KAAK,YAAY,YAAY,CAAC;AACvC,CAAC;AAED,MAAM,UAAU,qBAAqB,CACnC,KAAc,EACd,UAEI,EAAE;IAEN,IAAI,cAAc,CAAC,KAAK,CAAC,EAAE,CAAC;QAC1B,OAAO,KAAK,CAAC;IACf,CAAC;IAED,MAAM,OAAO,GAAG,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;IAEvE,OAAO,IAAI,YAAY,CAAC,OAAO,EAAE;QAC/B,GAAG,OAAO;QACV,KAAK,EAAE,KAAK;QACZ,IAAI,EAAE,OAAO,CAAC,IAAI,IAAI,gBAAgB,CAAC,QAAQ;KAChD,CAAC,CAAC;AACL,CAAC","sourcesContent":["export const StorageErrorCode = {\n NOT_FOUND: 'NOT_FOUND',\n UNAUTHORIZED: 'UNAUTHORIZED',\n CONFLICT: 'CONFLICT',\n READ_ONLY: 'READ_ONLY',\n INVALID_ARGUMENT: 'INVALID_ARGUMENT',\n NOT_SUPPORTED: 'NOT_SUPPORTED',\n ABORTED: 'ABORTED',\n TIMEOUT: 'TIMEOUT',\n LIMIT_EXCEEDED: 'LIMIT_EXCEEDED',\n PROVIDER: 'PROVIDER',\n} as const;\n\nexport type StorageErrorCode =\n (typeof StorageErrorCode)[keyof typeof StorageErrorCode];\n\nexport interface StorageErrorOptions {\n code: StorageErrorCode;\n store?: string;\n operation?: string;\n key?: string;\n aborted?: boolean;\n timedOut?: boolean;\n permanent?: boolean;\n cause?: unknown;\n}\n\nexport class StorageError extends Error {\n readonly code: StorageErrorCode;\n readonly store: string | undefined;\n readonly operation: string | undefined;\n readonly key: string | undefined;\n readonly aborted: boolean;\n readonly timedOut: boolean;\n readonly permanent: boolean;\n override readonly cause?: unknown;\n\n constructor(message: string, options: StorageErrorOptions) {\n super(message, { cause: options.cause });\n this.name = 'StorageError';\n this.code = options.code;\n this.store = options.store;\n this.operation = options.operation;\n this.key = options.key;\n this.aborted = options.aborted === true;\n this.timedOut = options.timedOut === true;\n this.permanent = options.permanent === true;\n this.cause = options.cause;\n }\n}\n\nexport function isStorageError(error: unknown): error is StorageError {\n return error instanceof StorageError;\n}\n\nexport function normalizeStorageError(\n error: unknown,\n options: Omit<StorageErrorOptions, 'code' | 'cause'> & {\n code?: StorageErrorCode;\n } = {},\n): StorageError {\n if (isStorageError(error)) {\n return error;\n }\n\n const message = error instanceof Error ? error.message : String(error);\n\n return new StorageError(message, {\n ...options,\n cause: error,\n code: options.code ?? StorageErrorCode.PROVIDER,\n });\n}\n"]}
1
+ {"version":3,"file":"storage.error.js","sourceRoot":"","sources":["../src/storage.error.ts"],"names":[],"mappings":"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","sourcesContent":["import { isCanonicalStorageEtag } from './storage-etag.js';\n\nexport const StorageErrorCode = {\n NOT_FOUND: 'NOT_FOUND',\n UNAUTHORIZED: 'UNAUTHORIZED',\n CONFLICT: 'CONFLICT',\n READ_ONLY: 'READ_ONLY',\n INVALID_ARGUMENT: 'INVALID_ARGUMENT',\n NOT_SUPPORTED: 'NOT_SUPPORTED',\n ABORTED: 'ABORTED',\n TIMEOUT: 'TIMEOUT',\n LIMIT_EXCEEDED: 'LIMIT_EXCEEDED',\n PROVIDER: 'PROVIDER',\n} as const;\n\nexport type StorageErrorCode =\n (typeof StorageErrorCode)[keyof typeof StorageErrorCode];\n\nconst STORAGE_ERROR_BRAND = Symbol.for('@nestm/storage/StorageError');\n\nfunction isStorageErrorCode(value: unknown): value is StorageErrorCode {\n return Object.values(StorageErrorCode).includes(value as StorageErrorCode);\n}\n\nexport interface StorageErrorOptions {\n code: StorageErrorCode;\n store?: string;\n operation?: string;\n key?: string;\n aborted?: boolean;\n timedOut?: boolean;\n permanent?: boolean;\n applied?: boolean;\n appliedEtag?: string;\n cause?: unknown;\n}\n\nexport class StorageError extends Error {\n declare readonly [STORAGE_ERROR_BRAND]: true;\n readonly code: StorageErrorCode;\n readonly store: string | undefined;\n readonly operation: string | undefined;\n readonly key: string | undefined;\n readonly aborted: boolean;\n readonly timedOut: boolean;\n readonly permanent: boolean;\n readonly applied: boolean;\n readonly appliedEtag?: string;\n override readonly cause?: unknown;\n\n constructor(message: string, options: StorageErrorOptions) {\n super(message, { cause: options.cause });\n Object.defineProperty(this, STORAGE_ERROR_BRAND, {\n configurable: false,\n enumerable: false,\n value: true,\n writable: false,\n });\n this.name = 'StorageError';\n this.code = options.code;\n this.store = options.store;\n this.operation = options.operation;\n this.key = options.key;\n this.aborted = options.aborted === true;\n this.timedOut = options.timedOut === true;\n this.permanent = options.permanent === true;\n this.applied = options.applied === true;\n if (\n this.applied &&\n options.appliedEtag !== undefined &&\n isCanonicalStorageEtag(options.appliedEtag)\n ) {\n this.appliedEtag = options.appliedEtag;\n }\n this.cause = options.cause;\n }\n}\n\nexport function isStorageError(error: unknown): error is StorageError {\n if (error instanceof StorageError) {\n return true;\n }\n if (!(error instanceof Error) || error.name !== 'StorageError') {\n return false;\n }\n\n try {\n const candidate = error as Error & {\n readonly [STORAGE_ERROR_BRAND]?: unknown;\n readonly aborted?: unknown;\n readonly applied?: unknown;\n readonly appliedEtag?: unknown;\n readonly code?: unknown;\n readonly key?: unknown;\n readonly operation?: unknown;\n readonly permanent?: unknown;\n readonly store?: unknown;\n readonly timedOut?: unknown;\n };\n const hasCompatibleBrand =\n candidate[STORAGE_ERROR_BRAND] === true ||\n candidate[STORAGE_ERROR_BRAND] === undefined;\n return (\n hasCompatibleBrand &&\n isStorageErrorCode(candidate.code) &&\n typeof candidate.aborted === 'boolean' &&\n typeof candidate.timedOut === 'boolean' &&\n typeof candidate.permanent === 'boolean' &&\n (candidate.applied === undefined ||\n typeof candidate.applied === 'boolean') &&\n (candidate.appliedEtag === undefined ||\n (candidate.applied === true &&\n isCanonicalStorageEtag(candidate.appliedEtag))) &&\n (candidate.store === undefined || typeof candidate.store === 'string') &&\n (candidate.operation === undefined ||\n typeof candidate.operation === 'string') &&\n (candidate.key === undefined || typeof candidate.key === 'string')\n );\n } catch {\n return false;\n }\n}\n\nexport function normalizeStorageError(\n error: unknown,\n options: Omit<StorageErrorOptions, 'code' | 'cause'> & {\n code?: StorageErrorCode;\n } = {},\n): StorageError {\n if (isStorageError(error)) {\n return error;\n }\n\n const message = error instanceof Error ? error.message : String(error);\n\n return new StorageError(message, {\n ...options,\n cause: error,\n code: options.code ?? StorageErrorCode.PROVIDER,\n });\n}\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"storage.module.d.ts","sourceRoot":"","sources":["../src/storage.module.ts"],"names":[],"mappings":"AAAA,OAAO,EAEL,KAAK,aAAa,EAInB,MAAM,gBAAgB,CAAC;AAIxB,OAAO,KAAK,EAEV,0BAA0B,EAC1B,qBAAqB,EACrB,yBAAyB,EACzB,oBAAoB,EAErB,MAAM,6BAA6B,CAAC;AAsBrC,qBACa,oBAAoB;CAAG;AAmNpC,qBACa,aAAa;IACxB,MAAM,CAAC,OAAO,CAAC,OAAO,EAAE,oBAAoB,GAAG,aAAa;IAc5D,MAAM,CAAC,YAAY,CAAC,OAAO,EAAE,yBAAyB,GAAG,aAAa;IAetE,MAAM,CAAC,UAAU,CAAC,OAAO,EAAE,qBAAqB,GAAG,aAAa;IAYhE,MAAM,CAAC,eAAe,CAAC,OAAO,EAAE,0BAA0B,GAAG,aAAa;CAW3E"}
1
+ {"version":3,"file":"storage.module.d.ts","sourceRoot":"","sources":["../src/storage.module.ts"],"names":[],"mappings":"AAAA,OAAO,EAEL,KAAK,aAAa,EAInB,MAAM,gBAAgB,CAAC;AAIxB,OAAO,KAAK,EAEV,0BAA0B,EAC1B,qBAAqB,EACrB,yBAAyB,EACzB,oBAAoB,EAErB,MAAM,6BAA6B,CAAC;AAsBrC,qBACa,oBAAoB;CAAG;AAmNpC,qBACa,aAAa;IACxB,MAAM,CAAC,OAAO,CAAC,OAAO,EAAE,oBAAoB,GAAG,aAAa,CAY3D;IAED,MAAM,CAAC,YAAY,CAAC,OAAO,EAAE,yBAAyB,GAAG,aAAa,CAarE;IAED,MAAM,CAAC,UAAU,CAAC,OAAO,EAAE,qBAAqB,GAAG,aAAa,CAU/D;IAED,MAAM,CAAC,eAAe,CAAC,OAAO,EAAE,0BAA0B,GAAG,aAAa,CAUzE;CACF"}
@@ -1 +1 @@
1
- {"version":3,"file":"storage.module.js","sourceRoot":"","sources":["../src/storage.module.ts"],"names":[],"mappings":"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","sourcesContent":["import {\n Module,\n type DynamicModule,\n type FactoryProvider,\n type ModuleMetadata,\n type Provider,\n} from '@nestjs/common';\n\nimport { StorageClient } from './storage.client.js';\nimport type { StorageDriver } from './storage.driver.js';\nimport type {\n StorageAsyncStoreDefinition,\n StorageFeatureAsyncOptions,\n StorageFeatureOptions,\n StorageModuleAsyncOptions,\n StorageModuleOptions,\n StorageStoreDefinition,\n} from './storage-module.options.js';\nimport { StorageService } from './storage.service.js';\nimport {\n DEFAULT_STORAGE_NAME,\n STORAGE_DEFAULT_NAME,\n getStorageToken,\n normalizeStorageName,\n} from './storage.tokens.js';\nimport type { StoragePlugin } from './storage.types.js';\n\ninterface PreparedStore {\n name: string;\n driver: StorageDriver;\n plugins: readonly StoragePlugin[];\n}\n\ninterface PreparedAsyncStore {\n name: string;\n definition: StorageAsyncStoreDefinition;\n plugins: readonly StoragePlugin[];\n}\n\n@Module({})\nexport class StorageFeatureModule {}\n\nfunction assertStores(names: readonly string[]): void {\n if (names.length === 0) {\n throw new TypeError('At least one storage store must be configured.');\n }\n const duplicates = names.filter(\n (name, index) => names.indexOf(name) !== index,\n );\n if (duplicates.length > 0) {\n throw new TypeError(\n `Duplicate storage store names: ${[...new Set(duplicates)].join(', ')}.`,\n );\n }\n}\n\nfunction resolveDefaultName(\n names: readonly string[],\n requested?: string,\n): string | null {\n if (requested !== undefined) {\n const normalized = normalizeStorageName(requested);\n if (!names.includes(normalized)) {\n throw new TypeError(\n `Default storage store \"${normalized}\" is not present in this registration.`,\n );\n }\n return normalized;\n }\n if (names.length === 1) {\n return names[0] ?? null;\n }\n return names.includes(DEFAULT_STORAGE_NAME) ? DEFAULT_STORAGE_NAME : null;\n}\n\nfunction prepareStores(\n stores: readonly StorageStoreDefinition[],\n plugins: readonly StoragePlugin[] = [],\n): PreparedStore[] {\n const prepared = stores.map((store) => ({\n driver: store.driver,\n name: normalizeStorageName(store.name),\n plugins: [...plugins, ...(store.plugins ?? [])],\n }));\n assertStores(prepared.map((store) => store.name));\n return prepared;\n}\n\nfunction prepareAsyncStores(\n stores: readonly StorageAsyncStoreDefinition[],\n plugins: readonly StoragePlugin[] = [],\n): PreparedAsyncStore[] {\n const prepared = stores.map((definition) => ({\n definition,\n name: normalizeStorageName(definition.name),\n plugins: [...plugins, ...(definition.plugins ?? [])],\n }));\n assertStores(prepared.map((store) => store.name));\n return prepared;\n}\n\nfunction uniqueImports(\n root: ModuleMetadata['imports'] = [],\n stores: readonly PreparedAsyncStore[] = [],\n): NonNullable<ModuleMetadata['imports']> {\n return [\n ...new Set([\n ...root,\n ...stores.flatMap((store) => store.definition.imports ?? []),\n ]),\n ];\n}\n\nfunction serviceProvider(\n defaultName: string | null,\n names: readonly string[],\n): Provider[] {\n const storeTokens = names.map((name) => getStorageToken(name));\n return [\n { provide: STORAGE_DEFAULT_NAME, useValue: defaultName },\n {\n provide: StorageService,\n inject: [STORAGE_DEFAULT_NAME, ...storeTokens],\n useFactory: (\n configuredDefault: string | null,\n ...clients: StorageClient[]\n ): StorageService => {\n return new StorageService(\n new Map(names.map((name, index) => [name, clients[index]!])),\n configuredDefault,\n );\n },\n },\n ];\n}\n\nfunction syncDynamicModule(\n module: typeof StorageModule | typeof StorageFeatureModule,\n stores: readonly PreparedStore[],\n defaultName: string | null,\n global: boolean,\n includeService: boolean,\n imports: ModuleMetadata['imports'] = [],\n): DynamicModule {\n const clientProviders: Provider[] = stores.map((store) => ({\n provide: getStorageToken(store.name),\n useFactory: () =>\n new StorageClient(store.name, store.driver, store.plugins),\n }));\n const storeTokens = stores.map((store) => getStorageToken(store.name));\n const names = stores.map((store) => store.name);\n\n return {\n module,\n global,\n imports: uniqueImports(imports),\n providers: [\n ...clientProviders,\n ...(includeService ? serviceProvider(defaultName, names) : []),\n ],\n exports: [...storeTokens, ...(includeService ? [StorageService] : [])],\n };\n}\n\nfunction asyncClientProvider(store: PreparedAsyncStore): {\n client: FactoryProvider;\n extra?: Provider;\n} {\n const token = getStorageToken(store.name);\n const definition = store.definition;\n\n if (definition.useFactory !== undefined) {\n const factory = definition.useFactory as unknown as (\n ...dependencies: unknown[]\n ) => StorageDriver | Promise<StorageDriver>;\n return {\n client: {\n provide: token,\n inject: definition.inject ?? [],\n useFactory: async (...dependencies: unknown[]) =>\n new StorageClient(\n store.name,\n await factory(...dependencies),\n store.plugins,\n ),\n },\n };\n }\n\n if (definition.useClass !== undefined) {\n return {\n client: {\n provide: token,\n inject: [definition.useClass],\n useFactory: async (factory) =>\n new StorageClient(\n store.name,\n await factory.createStorageDriver(store.name),\n store.plugins,\n ),\n },\n extra: definition.useClass,\n };\n }\n\n return {\n client: {\n provide: token,\n inject: [definition.useExisting],\n useFactory: async (factory) =>\n new StorageClient(\n store.name,\n await factory.createStorageDriver(store.name),\n store.plugins,\n ),\n },\n };\n}\n\nfunction asyncDynamicModule(\n module: typeof StorageModule | typeof StorageFeatureModule,\n stores: readonly PreparedAsyncStore[],\n defaultName: string | null,\n global: boolean,\n includeService: boolean,\n imports: ModuleMetadata['imports'] = [],\n): DynamicModule {\n const clients = stores.map(asyncClientProvider);\n const extras = clients\n .map(({ extra }) => extra)\n .filter((provider): provider is Provider => provider !== undefined);\n const storeTokens = stores.map((store) => getStorageToken(store.name));\n\n return {\n module,\n global,\n imports: uniqueImports(imports, stores),\n providers: [\n ...new Set(extras),\n ...clients.map(({ client }) => client),\n ...(includeService\n ? serviceProvider(\n defaultName,\n stores.map((store) => store.name),\n )\n : []),\n ],\n exports: [...storeTokens, ...(includeService ? [StorageService] : [])],\n };\n}\n\n@Module({})\nexport class StorageModule {\n static forRoot(options: StorageModuleOptions): DynamicModule {\n const stores = prepareStores(options.stores, options.plugins);\n return syncDynamicModule(\n StorageModule,\n stores,\n resolveDefaultName(\n stores.map((store) => store.name),\n options.default,\n ),\n options.isGlobal === true,\n true,\n );\n }\n\n static forRootAsync(options: StorageModuleAsyncOptions): DynamicModule {\n const stores = prepareAsyncStores(options.stores, options.plugins);\n return asyncDynamicModule(\n StorageModule,\n stores,\n resolveDefaultName(\n stores.map((store) => store.name),\n options.default,\n ),\n options.isGlobal === true,\n true,\n options.imports,\n );\n }\n\n static forFeature(options: StorageFeatureOptions): DynamicModule {\n const stores = prepareStores(options.stores, options.plugins);\n return syncDynamicModule(\n StorageFeatureModule,\n stores,\n null,\n false,\n false,\n options.imports,\n );\n }\n\n static forFeatureAsync(options: StorageFeatureAsyncOptions): DynamicModule {\n const stores = prepareAsyncStores(options.stores, options.plugins);\n return asyncDynamicModule(\n StorageFeatureModule,\n stores,\n null,\n false,\n false,\n options.imports,\n );\n }\n}\n"]}
1
+ {"version":3,"file":"storage.module.js","sourceRoot":"","sources":["../src/storage.module.ts"],"names":[],"mappings":"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","sourcesContent":["import {\n Module,\n type DynamicModule,\n type FactoryProvider,\n type ModuleMetadata,\n type Provider,\n} from '@nestjs/common';\n\nimport { StorageClient } from './storage.client.js';\nimport type { StorageDriver } from './storage.driver.js';\nimport type {\n StorageAsyncStoreDefinition,\n StorageFeatureAsyncOptions,\n StorageFeatureOptions,\n StorageModuleAsyncOptions,\n StorageModuleOptions,\n StorageStoreDefinition,\n} from './storage-module.options.js';\nimport { StorageService } from './storage.service.js';\nimport {\n DEFAULT_STORAGE_NAME,\n STORAGE_DEFAULT_NAME,\n getStorageToken,\n normalizeStorageName,\n} from './storage.tokens.js';\nimport type { StoragePlugin } from './storage.types.js';\n\ninterface PreparedStore {\n name: string;\n driver: StorageDriver;\n plugins: readonly StoragePlugin[];\n}\n\ninterface PreparedAsyncStore {\n name: string;\n definition: StorageAsyncStoreDefinition;\n plugins: readonly StoragePlugin[];\n}\n\n@Module({})\nexport class StorageFeatureModule {}\n\nfunction assertStores(names: readonly string[]): void {\n if (names.length === 0) {\n throw new TypeError('At least one storage store must be configured.');\n }\n const duplicates = names.filter(\n (name, index) => names.indexOf(name) !== index,\n );\n if (duplicates.length > 0) {\n throw new TypeError(\n `Duplicate storage store names: ${[...new Set(duplicates)].join(', ')}.`,\n );\n }\n}\n\nfunction resolveDefaultName(\n names: readonly string[],\n requested?: string,\n): string | null {\n if (requested !== undefined) {\n const normalized = normalizeStorageName(requested);\n if (!names.includes(normalized)) {\n throw new TypeError(\n `Default storage store \"${normalized}\" is not present in this registration.`,\n );\n }\n return normalized;\n }\n if (names.length === 1) {\n return names[0] ?? null;\n }\n return names.includes(DEFAULT_STORAGE_NAME) ? DEFAULT_STORAGE_NAME : null;\n}\n\nfunction prepareStores(\n stores: readonly StorageStoreDefinition[],\n plugins: readonly StoragePlugin[] = [],\n): PreparedStore[] {\n const prepared = stores.map((store) => ({\n driver: store.driver,\n name: normalizeStorageName(store.name),\n plugins: [...plugins, ...(store.plugins ?? [])],\n }));\n assertStores(prepared.map((store) => store.name));\n return prepared;\n}\n\nfunction prepareAsyncStores(\n stores: readonly StorageAsyncStoreDefinition[],\n plugins: readonly StoragePlugin[] = [],\n): PreparedAsyncStore[] {\n const prepared = stores.map((definition) => ({\n definition,\n name: normalizeStorageName(definition.name),\n plugins: [...plugins, ...(definition.plugins ?? [])],\n }));\n assertStores(prepared.map((store) => store.name));\n return prepared;\n}\n\nfunction uniqueImports(\n root: ModuleMetadata['imports'] = [],\n stores: readonly PreparedAsyncStore[] = [],\n): NonNullable<ModuleMetadata['imports']> {\n return [\n ...new Set([\n ...root,\n ...stores.flatMap((store) => store.definition.imports ?? []),\n ]),\n ];\n}\n\nfunction serviceProvider(\n defaultName: string | null,\n names: readonly string[],\n): Provider[] {\n const storeTokens = names.map((name) => getStorageToken(name));\n return [\n { provide: STORAGE_DEFAULT_NAME, useValue: defaultName },\n {\n provide: StorageService,\n inject: [STORAGE_DEFAULT_NAME, ...storeTokens],\n useFactory: (\n configuredDefault: string | null,\n ...clients: StorageClient[]\n ): StorageService => {\n return new StorageService(\n new Map(names.map((name, index) => [name, clients[index]!])),\n configuredDefault,\n );\n },\n },\n ];\n}\n\nfunction syncDynamicModule(\n module: typeof StorageModule | typeof StorageFeatureModule,\n stores: readonly PreparedStore[],\n defaultName: string | null,\n global: boolean,\n includeService: boolean,\n imports: ModuleMetadata['imports'] = [],\n): DynamicModule {\n const clientProviders: Provider[] = stores.map((store) => ({\n provide: getStorageToken(store.name),\n useFactory: () =>\n new StorageClient(store.name, store.driver, store.plugins),\n }));\n const storeTokens = stores.map((store) => getStorageToken(store.name));\n const names = stores.map((store) => store.name);\n\n return {\n module,\n global,\n imports: uniqueImports(imports),\n providers: [\n ...clientProviders,\n ...(includeService ? serviceProvider(defaultName, names) : []),\n ],\n exports: [...storeTokens, ...(includeService ? [StorageService] : [])],\n };\n}\n\nfunction asyncClientProvider(store: PreparedAsyncStore): {\n client: FactoryProvider;\n extra?: Provider;\n} {\n const token = getStorageToken(store.name);\n const definition = store.definition;\n\n if (definition.useFactory !== undefined) {\n const factory = definition.useFactory as unknown as (\n ...dependencies: unknown[]\n ) => StorageDriver | Promise<StorageDriver>;\n return {\n client: {\n provide: token,\n inject: definition.inject ?? [],\n useFactory: async (...dependencies: unknown[]) =>\n new StorageClient(\n store.name,\n await factory(...dependencies),\n store.plugins,\n ),\n },\n };\n }\n\n if (definition.useClass !== undefined) {\n return {\n client: {\n provide: token,\n inject: [definition.useClass],\n useFactory: async (factory) =>\n new StorageClient(\n store.name,\n await factory.createStorageDriver(store.name),\n store.plugins,\n ),\n },\n extra: definition.useClass,\n };\n }\n\n return {\n client: {\n provide: token,\n inject: [definition.useExisting],\n useFactory: async (factory) =>\n new StorageClient(\n store.name,\n await factory.createStorageDriver(store.name),\n store.plugins,\n ),\n },\n };\n}\n\nfunction asyncDynamicModule(\n module: typeof StorageModule | typeof StorageFeatureModule,\n stores: readonly PreparedAsyncStore[],\n defaultName: string | null,\n global: boolean,\n includeService: boolean,\n imports: ModuleMetadata['imports'] = [],\n): DynamicModule {\n const clients = stores.map(asyncClientProvider);\n const extras = clients\n .map(({ extra }) => extra)\n .filter((provider): provider is Provider => provider !== undefined);\n const storeTokens = stores.map((store) => getStorageToken(store.name));\n\n return {\n module,\n global,\n imports: uniqueImports(imports, stores),\n providers: [\n ...new Set(extras),\n ...clients.map(({ client }) => client),\n ...(includeService\n ? serviceProvider(\n defaultName,\n stores.map((store) => store.name),\n )\n : []),\n ],\n exports: [...storeTokens, ...(includeService ? [StorageService] : [])],\n };\n}\n\n@Module({})\nexport class StorageModule {\n static forRoot(options: StorageModuleOptions): DynamicModule {\n const stores = prepareStores(options.stores, options.plugins);\n return syncDynamicModule(\n StorageModule,\n stores,\n resolveDefaultName(\n stores.map((store) => store.name),\n options.default,\n ),\n options.isGlobal === true,\n true,\n );\n }\n\n static forRootAsync(options: StorageModuleAsyncOptions): DynamicModule {\n const stores = prepareAsyncStores(options.stores, options.plugins);\n return asyncDynamicModule(\n StorageModule,\n stores,\n resolveDefaultName(\n stores.map((store) => store.name),\n options.default,\n ),\n options.isGlobal === true,\n true,\n options.imports,\n );\n }\n\n static forFeature(options: StorageFeatureOptions): DynamicModule {\n const stores = prepareStores(options.stores, options.plugins);\n return syncDynamicModule(\n StorageFeatureModule,\n stores,\n null,\n false,\n false,\n options.imports,\n );\n }\n\n static forFeatureAsync(options: StorageFeatureAsyncOptions): DynamicModule {\n const stores = prepareAsyncStores(options.stores, options.plugins);\n return asyncDynamicModule(\n StorageFeatureModule,\n stores,\n null,\n false,\n false,\n options.imports,\n );\n }\n}\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"storage.service.d.ts","sourceRoot":"","sources":["../src/storage.service.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AAGpD,OAAO,KAAK,EAIV,kBAAkB,EAElB,iBAAiB,EACjB,sBAAsB,EAEtB,qBAAqB,EACtB,MAAM,oBAAoB,CAAC;AAuD5B,qBAAa,cAAc;;IAKvB,OAAO,CAAC,QAAQ,CAAC,WAAW;gBAD5B,OAAO,EAAE,WAAW,CAAC,MAAM,EAAE,aAAa,CAAC,EAC1B,WAAW,EAAE,MAAM,GAAG,IAAI;IAK7C,IAAI,KAAK,IAAI,SAAS,MAAM,EAAE,CAE7B;IAED,GAAG,CAAC,IAAI,CAAC,EAAE,MAAM,GAAG,aAAa;IA+B3B,QAAQ,CACZ,OAAO,EAAE,sBAAsB,GAC9B,OAAO,CAAC,qBAAqB,CAAC;IA+E3B,IAAI,CAAC,OAAO,EAAE,kBAAkB,GAAG,OAAO,CAAC,iBAAiB,CAAC;CAsIpE"}
1
+ {"version":3,"file":"storage.service.d.ts","sourceRoot":"","sources":["../src/storage.service.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AAGpD,OAAO,KAAK,EAIV,kBAAkB,EAElB,iBAAiB,EACjB,sBAAsB,EAEtB,qBAAqB,EACtB,MAAM,oBAAoB,CAAC;AAwF5B,qBAAa,cAAc;;IAKvB,OAAO,CAAC,QAAQ,CAAC,WAAW;IAF9B,YACE,OAAO,EAAE,WAAW,CAAC,MAAM,EAAE,aAAa,CAAC,EAC1B,WAAW,EAAE,MAAM,GAAG,IAAI,EAG5C;IAED,IAAI,KAAK,IAAI,SAAS,MAAM,EAAE,CAE7B;IAED,GAAG,CAAC,IAAI,CAAC,EAAE,MAAM,GAAG,aAAa,CA6BhC;IAEK,QAAQ,CACZ,OAAO,EAAE,sBAAsB,GAC9B,OAAO,CAAC,qBAAqB,CAAC,CA6EhC;IAEK,IAAI,CAAC,OAAO,EAAE,kBAAkB,GAAG,OAAO,CAAC,iBAAiB,CAAC,CAuIlE;CACF"}
@@ -3,6 +3,30 @@ import { StorageClient } from './storage.client.js';
3
3
  import { StorageError, StorageErrorCode } from './storage.error.js';
4
4
  import { normalizeStorageName } from './storage.tokens.js';
5
5
  const identity = (key) => key;
6
+ function joinStorageKey(prefix, key) {
7
+ if (prefix === undefined || prefix.length === 0) {
8
+ return key;
9
+ }
10
+ const normalizedPrefix = prefix.replace(/\/+$/u, '');
11
+ for (const [label, value] of [
12
+ ['destinationPrefix', normalizedPrefix],
13
+ ['transformed destination key', key],
14
+ ]) {
15
+ if (value.length === 0 ||
16
+ value.startsWith('/') ||
17
+ value.includes('\\') ||
18
+ value.includes('\0') ||
19
+ value
20
+ .split('/')
21
+ .some((segment) => segment.length === 0 || segment === '.' || segment === '..')) {
22
+ throw new StorageError(`${label} must be a canonical relative POSIX storage key.`, {
23
+ code: StorageErrorCode.INVALID_ARGUMENT,
24
+ permanent: true,
25
+ });
26
+ }
27
+ }
28
+ return `${normalizedPrefix}/${key}`;
29
+ }
6
30
  function assertDifferentStores(from, to) {
7
31
  if (from === to) {
8
32
  throw new StorageError('Cross-store transfer and sync require different source and destination stores.', {
@@ -137,6 +161,7 @@ export class StorageService {
137
161
  const source = this.use(fromName);
138
162
  const destination = this.use(toName);
139
163
  const transformKey = options.transformKey ?? identity;
164
+ const destinationKeyOf = (key) => joinStorageKey(options.destinationPrefix, transformKey(key));
140
165
  const compare = options.compare ?? 'etag';
141
166
  const sourceObjects = await walk(source, options);
142
167
  const destinationObjects = await walk(destination, {
@@ -149,7 +174,7 @@ export class StorageService {
149
174
  ...(options.signal !== undefined && { signal: options.signal }),
150
175
  });
151
176
  const destinationIndex = new Map(destinationObjects.map((object) => [object.key, object]));
152
- const desiredDestinationKeys = new Set(sourceObjects.map((object) => transformKey(object.key)));
177
+ const desiredDestinationKeys = new Set(sourceObjects.map((object) => destinationKeyOf(object.key)));
153
178
  const deleteKeys = (options.prune ?? false)
154
179
  ? destinationObjects
155
180
  .map((object) => object.key)
@@ -158,7 +183,7 @@ export class StorageService {
158
183
  const plannedUploads = [];
159
184
  const plannedSkips = [];
160
185
  for (const object of sourceObjects) {
161
- const existing = destinationIndex.get(transformKey(object.key));
186
+ const existing = destinationIndex.get(destinationKeyOf(object.key));
162
187
  (existing && unchanged(object, existing, compare)
163
188
  ? plannedSkips
164
189
  : plannedUploads).push(object.key);
@@ -178,7 +203,7 @@ export class StorageService {
178
203
  };
179
204
  const skipped = new Set();
180
205
  const settled = await settleMany(sourceObjects, (object) => object.key, async (object) => {
181
- const destinationKey = transformKey(object.key);
206
+ const destinationKey = destinationKeyOf(object.key);
182
207
  const existing = destinationIndex.get(destinationKey);
183
208
  if (existing && unchanged(object, existing, compare)) {
184
209
  skipped.add(object.key);
@@ -1 +1 @@
1
- {"version":3,"file":"storage.service.js","sourceRoot":"","sources":["../src/storage.service.ts"],"names":[],"mappings":"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","sourcesContent":["import { settleMany } from './internal/settle-many.js';\nimport { StorageClient } from './storage.client.js';\nimport { StorageError, StorageErrorCode } from './storage.error.js';\nimport { normalizeStorageName } from './storage.tokens.js';\nimport type {\n StorageBulkError,\n StorageObjectMetadata,\n StorageSyncCompare,\n StorageSyncOptions,\n StorageSyncProgress,\n StorageSyncResult,\n StorageTransferOptions,\n StorageTransferProgress,\n StorageTransferResult,\n} from './storage.types.js';\n\nconst identity = (key: string): string => key;\n\nfunction assertDifferentStores(from: string, to: string): void {\n if (from === to) {\n throw new StorageError(\n 'Cross-store transfer and sync require different source and destination stores.',\n {\n code: StorageErrorCode.INVALID_ARGUMENT,\n permanent: true,\n store: from,\n },\n );\n }\n}\n\nfunction unchanged(\n source: StorageObjectMetadata,\n destination: StorageObjectMetadata,\n compare: StorageSyncCompare,\n): boolean {\n if (typeof compare === 'function') {\n return compare(source, destination);\n }\n if (compare === 'size') {\n return source.size === destination.size;\n }\n return (\n source.size === destination.size &&\n source.etag !== undefined &&\n destination.etag !== undefined &&\n source.etag === destination.etag\n );\n}\n\nasync function walk(\n client: StorageClient,\n options: {\n prefix?: string;\n limit?: number;\n signal?: AbortSignal;\n },\n): Promise<StorageObjectMetadata[]> {\n const objects: StorageObjectMetadata[] = [];\n for await (const object of client.listAll({\n ...(options.limit !== undefined && { limit: options.limit }),\n ...(options.prefix !== undefined && { prefix: options.prefix }),\n ...(options.signal !== undefined && { signal: options.signal }),\n })) {\n objects.push(object);\n }\n return objects;\n}\n\nexport class StorageService {\n readonly #clients: ReadonlyMap<string, StorageClient>;\n\n constructor(\n clients: ReadonlyMap<string, StorageClient>,\n private readonly defaultName: string | null,\n ) {\n this.#clients = new Map(clients);\n }\n\n get names(): readonly string[] {\n return [...this.#clients.keys()].sort();\n }\n\n use(name?: string): StorageClient {\n const resolved =\n name === undefined ? this.defaultName : normalizeStorageName(name);\n\n if (resolved === null) {\n throw new StorageError(\n 'No default storage store is configured; call storage.use(name).',\n {\n code: StorageErrorCode.INVALID_ARGUMENT,\n permanent: true,\n },\n );\n }\n\n const client = this.#clients.get(resolved);\n if (client === undefined) {\n const available = this.names;\n throw new StorageError(\n available.length === 0\n ? `Storage store \"${resolved}\" is not registered.`\n : `Storage store \"${resolved}\" is not registered. Available stores: ${available.join(', ')}.`,\n {\n code: StorageErrorCode.INVALID_ARGUMENT,\n permanent: true,\n store: resolved,\n },\n );\n }\n return client;\n }\n\n async transfer(\n options: StorageTransferOptions,\n ): Promise<StorageTransferResult> {\n const fromName = normalizeStorageName(options.from);\n const toName = normalizeStorageName(options.to);\n assertDifferentStores(fromName, toName);\n const source = this.use(fromName);\n const destination = this.use(toName);\n const transformKey = options.transformKey ?? identity;\n const overwrite = options.overwrite ?? true;\n const objects = await walk(source, options);\n const total = objects.length;\n let done = 0;\n const skipped = new Set<string>();\n\n const report = (\n key: string,\n status: StorageTransferProgress['status'],\n ): void => {\n done += 1;\n options.onProgress?.({ done, key, status, total });\n };\n\n const settled = await settleMany(\n objects,\n (object) => object.key,\n async (object) => {\n const destinationKey = transformKey(object.key);\n if (\n !overwrite &&\n (await destination.exists(destinationKey, {\n ...(options.signal !== undefined && {\n signal: options.signal,\n }),\n }))\n ) {\n skipped.add(object.key);\n report(object.key, 'skipped');\n return object.key;\n }\n\n const downloaded = await source.downloadStream(object.key, {\n ...(options.signal !== undefined && {\n signal: options.signal,\n }),\n });\n try {\n await destination.upload(destinationKey, downloaded.body, {\n contentType: downloaded.contentType,\n ...(downloaded.metadata !== undefined && {\n metadata: downloaded.metadata,\n }),\n ...(options.signal !== undefined && {\n signal: options.signal,\n }),\n });\n } catch (error) {\n if (!downloaded.body.locked) {\n await downloaded.body.cancel().catch(() => undefined);\n }\n throw error;\n }\n report(object.key, 'transferred');\n return object.key;\n },\n options,\n );\n\n const transferred: string[] = [];\n const skippedKeys: string[] = [];\n for (const key of settled.results) {\n (skipped.has(key) ? skippedKeys : transferred).push(key);\n }\n\n return {\n transferred,\n ...(skippedKeys.length > 0 && { skipped: skippedKeys }),\n ...(settled.errors.length > 0 && { errors: settled.errors }),\n };\n }\n\n async sync(options: StorageSyncOptions): Promise<StorageSyncResult> {\n const fromName = normalizeStorageName(options.from);\n const toName = normalizeStorageName(options.to);\n assertDifferentStores(fromName, toName);\n const source = this.use(fromName);\n const destination = this.use(toName);\n const transformKey = options.transformKey ?? identity;\n const compare = options.compare ?? 'etag';\n const sourceObjects = await walk(source, options);\n const destinationObjects = await walk(destination, {\n ...(options.destinationPrefix !== undefined\n ? { prefix: options.destinationPrefix }\n : options.prefix !== undefined\n ? { prefix: options.prefix }\n : {}),\n ...(options.limit !== undefined && { limit: options.limit }),\n ...(options.signal !== undefined && { signal: options.signal }),\n });\n const destinationIndex = new Map(\n destinationObjects.map((object) => [object.key, object]),\n );\n const desiredDestinationKeys = new Set(\n sourceObjects.map((object) => transformKey(object.key)),\n );\n const deleteKeys =\n (options.prune ?? false)\n ? destinationObjects\n .map((object) => object.key)\n .filter((key) => !desiredDestinationKeys.has(key))\n : [];\n\n const plannedUploads: string[] = [];\n const plannedSkips: string[] = [];\n for (const object of sourceObjects) {\n const existing = destinationIndex.get(transformKey(object.key));\n (existing && unchanged(object, existing, compare)\n ? plannedSkips\n : plannedUploads\n ).push(object.key);\n }\n\n if (options.dryRun) {\n return {\n uploaded: plannedUploads,\n skipped: plannedSkips,\n ...(options.prune && { deleted: deleteKeys }),\n };\n }\n\n const total =\n sourceObjects.length + (options.prune ? deleteKeys.length : 0);\n let done = 0;\n const report = (\n key: string,\n status: StorageSyncProgress['status'],\n ): void => {\n done += 1;\n options.onProgress?.({ done, key, status, total });\n };\n const skipped = new Set<string>();\n\n const settled = await settleMany(\n sourceObjects,\n (object) => object.key,\n async (object) => {\n const destinationKey = transformKey(object.key);\n const existing = destinationIndex.get(destinationKey);\n if (existing && unchanged(object, existing, compare)) {\n skipped.add(object.key);\n report(object.key, 'skipped');\n return object.key;\n }\n const downloaded = await source.downloadStream(object.key, {\n ...(options.signal !== undefined && {\n signal: options.signal,\n }),\n });\n try {\n await destination.upload(destinationKey, downloaded.body, {\n contentType: downloaded.contentType,\n ...(downloaded.metadata !== undefined && {\n metadata: downloaded.metadata,\n }),\n ...(options.signal !== undefined && {\n signal: options.signal,\n }),\n });\n } catch (error) {\n if (!downloaded.body.locked) {\n await downloaded.body.cancel().catch(() => undefined);\n }\n throw error;\n }\n report(object.key, 'uploaded');\n return object.key;\n },\n options,\n );\n\n const uploaded: string[] = [];\n const skippedKeys: string[] = [];\n for (const key of settled.results) {\n (skipped.has(key) ? skippedKeys : uploaded).push(key);\n }\n\n let deleted: string[] | undefined;\n let deleteErrors: StorageBulkError[] = [];\n const canPrune =\n options.prune && !(options.stopOnError && settled.errors.length > 0);\n if (canPrune) {\n const deleteResult = await destination.deleteMany(deleteKeys, {\n ...(options.concurrency !== undefined && {\n concurrency: options.concurrency,\n }),\n ...(options.signal !== undefined && { signal: options.signal }),\n ...(options.stopOnError !== undefined && {\n stopOnError: options.stopOnError,\n }),\n });\n deleted = deleteResult.deleted;\n deleteErrors = deleteResult.errors ?? [];\n for (const key of deleted) {\n report(key, 'deleted');\n }\n }\n\n const errors = [...settled.errors, ...deleteErrors];\n return {\n uploaded,\n skipped: skippedKeys,\n ...(options.prune && { deleted: deleted ?? [] }),\n ...(errors.length > 0 && { errors }),\n };\n }\n}\n"]}
1
+ {"version":3,"file":"storage.service.js","sourceRoot":"","sources":["../src/storage.service.ts"],"names":[],"mappings":"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","sourcesContent":["import { settleMany } from './internal/settle-many.js';\nimport { StorageClient } from './storage.client.js';\nimport { StorageError, StorageErrorCode } from './storage.error.js';\nimport { normalizeStorageName } from './storage.tokens.js';\nimport type {\n StorageBulkError,\n StorageObjectMetadata,\n StorageSyncCompare,\n StorageSyncOptions,\n StorageSyncProgress,\n StorageSyncResult,\n StorageTransferOptions,\n StorageTransferProgress,\n StorageTransferResult,\n} from './storage.types.js';\n\nconst identity = (key: string): string => key;\n\nfunction joinStorageKey(prefix: string | undefined, key: string): string {\n if (prefix === undefined || prefix.length === 0) {\n return key;\n }\n const normalizedPrefix = prefix.replace(/\\/+$/u, '');\n for (const [label, value] of [\n ['destinationPrefix', normalizedPrefix],\n ['transformed destination key', key],\n ] as const) {\n if (\n value.length === 0 ||\n value.startsWith('/') ||\n value.includes('\\\\') ||\n value.includes('\\0') ||\n value\n .split('/')\n .some(\n (segment) =>\n segment.length === 0 || segment === '.' || segment === '..',\n )\n ) {\n throw new StorageError(\n `${label} must be a canonical relative POSIX storage key.`,\n {\n code: StorageErrorCode.INVALID_ARGUMENT,\n permanent: true,\n },\n );\n }\n }\n return `${normalizedPrefix}/${key}`;\n}\n\nfunction assertDifferentStores(from: string, to: string): void {\n if (from === to) {\n throw new StorageError(\n 'Cross-store transfer and sync require different source and destination stores.',\n {\n code: StorageErrorCode.INVALID_ARGUMENT,\n permanent: true,\n store: from,\n },\n );\n }\n}\n\nfunction unchanged(\n source: StorageObjectMetadata,\n destination: StorageObjectMetadata,\n compare: StorageSyncCompare,\n): boolean {\n if (typeof compare === 'function') {\n return compare(source, destination);\n }\n if (compare === 'size') {\n return source.size === destination.size;\n }\n return (\n source.size === destination.size &&\n source.etag !== undefined &&\n destination.etag !== undefined &&\n source.etag === destination.etag\n );\n}\n\nasync function walk(\n client: StorageClient,\n options: {\n prefix?: string;\n limit?: number;\n signal?: AbortSignal;\n },\n): Promise<StorageObjectMetadata[]> {\n const objects: StorageObjectMetadata[] = [];\n for await (const object of client.listAll({\n ...(options.limit !== undefined && { limit: options.limit }),\n ...(options.prefix !== undefined && { prefix: options.prefix }),\n ...(options.signal !== undefined && { signal: options.signal }),\n })) {\n objects.push(object);\n }\n return objects;\n}\n\nexport class StorageService {\n readonly #clients: ReadonlyMap<string, StorageClient>;\n\n constructor(\n clients: ReadonlyMap<string, StorageClient>,\n private readonly defaultName: string | null,\n ) {\n this.#clients = new Map(clients);\n }\n\n get names(): readonly string[] {\n return [...this.#clients.keys()].sort();\n }\n\n use(name?: string): StorageClient {\n const resolved =\n name === undefined ? this.defaultName : normalizeStorageName(name);\n\n if (resolved === null) {\n throw new StorageError(\n 'No default storage store is configured; call storage.use(name).',\n {\n code: StorageErrorCode.INVALID_ARGUMENT,\n permanent: true,\n },\n );\n }\n\n const client = this.#clients.get(resolved);\n if (client === undefined) {\n const available = this.names;\n throw new StorageError(\n available.length === 0\n ? `Storage store \"${resolved}\" is not registered.`\n : `Storage store \"${resolved}\" is not registered. Available stores: ${available.join(', ')}.`,\n {\n code: StorageErrorCode.INVALID_ARGUMENT,\n permanent: true,\n store: resolved,\n },\n );\n }\n return client;\n }\n\n async transfer(\n options: StorageTransferOptions,\n ): Promise<StorageTransferResult> {\n const fromName = normalizeStorageName(options.from);\n const toName = normalizeStorageName(options.to);\n assertDifferentStores(fromName, toName);\n const source = this.use(fromName);\n const destination = this.use(toName);\n const transformKey = options.transformKey ?? identity;\n const overwrite = options.overwrite ?? true;\n const objects = await walk(source, options);\n const total = objects.length;\n let done = 0;\n const skipped = new Set<string>();\n\n const report = (\n key: string,\n status: StorageTransferProgress['status'],\n ): void => {\n done += 1;\n options.onProgress?.({ done, key, status, total });\n };\n\n const settled = await settleMany(\n objects,\n (object) => object.key,\n async (object) => {\n const destinationKey = transformKey(object.key);\n if (\n !overwrite &&\n (await destination.exists(destinationKey, {\n ...(options.signal !== undefined && {\n signal: options.signal,\n }),\n }))\n ) {\n skipped.add(object.key);\n report(object.key, 'skipped');\n return object.key;\n }\n\n const downloaded = await source.downloadStream(object.key, {\n ...(options.signal !== undefined && {\n signal: options.signal,\n }),\n });\n try {\n await destination.upload(destinationKey, downloaded.body, {\n contentType: downloaded.contentType,\n ...(downloaded.metadata !== undefined && {\n metadata: downloaded.metadata,\n }),\n ...(options.signal !== undefined && {\n signal: options.signal,\n }),\n });\n } catch (error) {\n if (!downloaded.body.locked) {\n await downloaded.body.cancel().catch(() => undefined);\n }\n throw error;\n }\n report(object.key, 'transferred');\n return object.key;\n },\n options,\n );\n\n const transferred: string[] = [];\n const skippedKeys: string[] = [];\n for (const key of settled.results) {\n (skipped.has(key) ? skippedKeys : transferred).push(key);\n }\n\n return {\n transferred,\n ...(skippedKeys.length > 0 && { skipped: skippedKeys }),\n ...(settled.errors.length > 0 && { errors: settled.errors }),\n };\n }\n\n async sync(options: StorageSyncOptions): Promise<StorageSyncResult> {\n const fromName = normalizeStorageName(options.from);\n const toName = normalizeStorageName(options.to);\n assertDifferentStores(fromName, toName);\n const source = this.use(fromName);\n const destination = this.use(toName);\n const transformKey = options.transformKey ?? identity;\n const destinationKeyOf = (key: string): string =>\n joinStorageKey(options.destinationPrefix, transformKey(key));\n const compare = options.compare ?? 'etag';\n const sourceObjects = await walk(source, options);\n const destinationObjects = await walk(destination, {\n ...(options.destinationPrefix !== undefined\n ? { prefix: options.destinationPrefix }\n : options.prefix !== undefined\n ? { prefix: options.prefix }\n : {}),\n ...(options.limit !== undefined && { limit: options.limit }),\n ...(options.signal !== undefined && { signal: options.signal }),\n });\n const destinationIndex = new Map(\n destinationObjects.map((object) => [object.key, object]),\n );\n const desiredDestinationKeys = new Set(\n sourceObjects.map((object) => destinationKeyOf(object.key)),\n );\n const deleteKeys =\n (options.prune ?? false)\n ? destinationObjects\n .map((object) => object.key)\n .filter((key) => !desiredDestinationKeys.has(key))\n : [];\n\n const plannedUploads: string[] = [];\n const plannedSkips: string[] = [];\n for (const object of sourceObjects) {\n const existing = destinationIndex.get(destinationKeyOf(object.key));\n (existing && unchanged(object, existing, compare)\n ? plannedSkips\n : plannedUploads\n ).push(object.key);\n }\n\n if (options.dryRun) {\n return {\n uploaded: plannedUploads,\n skipped: plannedSkips,\n ...(options.prune && { deleted: deleteKeys }),\n };\n }\n\n const total =\n sourceObjects.length + (options.prune ? deleteKeys.length : 0);\n let done = 0;\n const report = (\n key: string,\n status: StorageSyncProgress['status'],\n ): void => {\n done += 1;\n options.onProgress?.({ done, key, status, total });\n };\n const skipped = new Set<string>();\n\n const settled = await settleMany(\n sourceObjects,\n (object) => object.key,\n async (object) => {\n const destinationKey = destinationKeyOf(object.key);\n const existing = destinationIndex.get(destinationKey);\n if (existing && unchanged(object, existing, compare)) {\n skipped.add(object.key);\n report(object.key, 'skipped');\n return object.key;\n }\n const downloaded = await source.downloadStream(object.key, {\n ...(options.signal !== undefined && {\n signal: options.signal,\n }),\n });\n try {\n await destination.upload(destinationKey, downloaded.body, {\n contentType: downloaded.contentType,\n ...(downloaded.metadata !== undefined && {\n metadata: downloaded.metadata,\n }),\n ...(options.signal !== undefined && {\n signal: options.signal,\n }),\n });\n } catch (error) {\n if (!downloaded.body.locked) {\n await downloaded.body.cancel().catch(() => undefined);\n }\n throw error;\n }\n report(object.key, 'uploaded');\n return object.key;\n },\n options,\n );\n\n const uploaded: string[] = [];\n const skippedKeys: string[] = [];\n for (const key of settled.results) {\n (skipped.has(key) ? skippedKeys : uploaded).push(key);\n }\n\n let deleted: string[] | undefined;\n let deleteErrors: StorageBulkError[] = [];\n const canPrune =\n options.prune && !(options.stopOnError && settled.errors.length > 0);\n if (canPrune) {\n const deleteResult = await destination.deleteMany(deleteKeys, {\n ...(options.concurrency !== undefined && {\n concurrency: options.concurrency,\n }),\n ...(options.signal !== undefined && { signal: options.signal }),\n ...(options.stopOnError !== undefined && {\n stopOnError: options.stopOnError,\n }),\n });\n deleted = deleteResult.deleted;\n deleteErrors = deleteResult.errors ?? [];\n for (const key of deleted) {\n report(key, 'deleted');\n }\n }\n\n const errors = [...settled.errors, ...deleteErrors];\n return {\n uploaded,\n skipped: skippedKeys,\n ...(options.prune && { deleted: deleted ?? [] }),\n ...(errors.length > 0 && { errors }),\n };\n }\n}\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"storage.tokens.js","sourceRoot":"","sources":["../src/storage.tokens.ts"],"names":[],"mappings":"AAAA,MAAM,CAAC,MAAM,oBAAoB,GAAG,SAAS,CAAC;AAE9C,MAAM,CAAC,MAAM,oBAAoB,GAAG,MAAM,CAAC,GAAG,CAAC,6BAA6B,CAAC,CAAC;AAE9E,MAAM,UAAU,oBAAoB,CAClC,OAAe,oBAAoB;IAEnC,IAAI,OAAO,IAAI,KAAK,QAAQ,IAAI,IAAI,CAAC,MAAM,KAAK,CAAC,IAAI,IAAI,CAAC,IAAI,EAAE,KAAK,IAAI,EAAE,CAAC;QAC1E,MAAM,IAAI,SAAS,CACjB,uFAAuF,CACxF,CAAC;IACJ,CAAC;IACD,OAAO,IAAI,CAAC;AACd,CAAC;AAED,MAAM,UAAU,eAAe,CAAC,OAAe,oBAAoB;IACjE,OAAO,MAAM,CAAC,GAAG,CAAC,wBAAwB,oBAAoB,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;AAC1E,CAAC;AAED,MAAM,CAAC,MAAM,OAAO,GAAG,eAAe,EAAE,CAAC","sourcesContent":["export const DEFAULT_STORAGE_NAME = 'default';\n\nexport const STORAGE_DEFAULT_NAME = Symbol.for('@nestm/storage/default-name');\n\nexport function normalizeStorageName(\n name: string = DEFAULT_STORAGE_NAME,\n): string {\n if (typeof name !== 'string' || name.length === 0 || name.trim() !== name) {\n throw new TypeError(\n 'Storage store names must be non-empty strings without leading or trailing whitespace.',\n );\n }\n return name;\n}\n\nexport function getStorageToken(name: string = DEFAULT_STORAGE_NAME): symbol {\n return Symbol.for(`@nestm/storage/store/${normalizeStorageName(name)}`);\n}\n\nexport const STORAGE = getStorageToken();\n"]}
1
+ {"version":3,"file":"storage.tokens.js","sourceRoot":"","sources":["../src/storage.tokens.ts"],"names":[],"mappings":"AAAA,MAAM,CAAC,MAAM,oBAAoB,GAAG,SAAS,CAAC;AAE9C,MAAM,CAAC,MAAM,oBAAoB,GAAG,MAAM,CAAC,GAAG,CAAC,6BAA6B,CAAC,CAAC;AAE9E,MAAM,UAAU,oBAAoB,CAClC,IAAI,GAAW,oBAAoB;IAEnC,IAAI,OAAO,IAAI,KAAK,QAAQ,IAAI,IAAI,CAAC,MAAM,KAAK,CAAC,IAAI,IAAI,CAAC,IAAI,EAAE,KAAK,IAAI,EAAE,CAAC;QAC1E,MAAM,IAAI,SAAS,CACjB,uFAAuF,CACxF,CAAC;IACJ,CAAC;IACD,OAAO,IAAI,CAAC;AACd,CAAC;AAED,MAAM,UAAU,eAAe,CAAC,IAAI,GAAW,oBAAoB;IACjE,OAAO,MAAM,CAAC,GAAG,CAAC,wBAAwB,oBAAoB,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;AAC1E,CAAC;AAED,MAAM,CAAC,MAAM,OAAO,GAAG,eAAe,EAAE,CAAC","sourcesContent":["export const DEFAULT_STORAGE_NAME = 'default';\n\nexport const STORAGE_DEFAULT_NAME = Symbol.for('@nestm/storage/default-name');\n\nexport function normalizeStorageName(\n name: string = DEFAULT_STORAGE_NAME,\n): string {\n if (typeof name !== 'string' || name.length === 0 || name.trim() !== name) {\n throw new TypeError(\n 'Storage store names must be non-empty strings without leading or trailing whitespace.',\n );\n }\n return name;\n}\n\nexport function getStorageToken(name: string = DEFAULT_STORAGE_NAME): symbol {\n return Symbol.for(`@nestm/storage/store/${normalizeStorageName(name)}`);\n}\n\nexport const STORAGE = getStorageToken();\n"]}