express-storage 2.0.2 → 3.0.0

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 (177) hide show
  1. package/README.md +366 -34
  2. package/dist/cjs/config/index.d.ts +10 -0
  3. package/dist/cjs/config/index.d.ts.map +1 -0
  4. package/dist/cjs/config/index.js +19 -0
  5. package/dist/cjs/config/index.js.map +1 -0
  6. package/dist/cjs/drivers/azure.driver.d.ts +73 -0
  7. package/dist/cjs/drivers/azure.driver.d.ts.map +1 -0
  8. package/dist/cjs/drivers/azure.driver.js +390 -0
  9. package/dist/cjs/drivers/azure.driver.js.map +1 -0
  10. package/dist/cjs/drivers/base.driver.d.ts +136 -0
  11. package/dist/cjs/drivers/base.driver.d.ts.map +1 -0
  12. package/dist/cjs/drivers/base.driver.js +357 -0
  13. package/dist/cjs/drivers/base.driver.js.map +1 -0
  14. package/dist/{drivers → cjs/drivers}/gcs.driver.d.ts +20 -38
  15. package/dist/cjs/drivers/gcs.driver.d.ts.map +1 -0
  16. package/dist/cjs/drivers/gcs.driver.js +343 -0
  17. package/dist/cjs/drivers/gcs.driver.js.map +1 -0
  18. package/dist/cjs/drivers/index.d.ts +15 -0
  19. package/dist/cjs/drivers/index.d.ts.map +1 -0
  20. package/dist/cjs/drivers/index.js +26 -0
  21. package/dist/cjs/drivers/index.js.map +1 -0
  22. package/dist/cjs/drivers/local.driver.d.ts +86 -0
  23. package/dist/cjs/drivers/local.driver.d.ts.map +1 -0
  24. package/dist/cjs/drivers/local.driver.js +556 -0
  25. package/dist/cjs/drivers/local.driver.js.map +1 -0
  26. package/dist/{drivers → cjs/drivers}/s3.driver.d.ts +19 -39
  27. package/dist/cjs/drivers/s3.driver.d.ts.map +1 -0
  28. package/dist/cjs/drivers/s3.driver.js +400 -0
  29. package/dist/cjs/drivers/s3.driver.js.map +1 -0
  30. package/dist/cjs/factory/driver.factory.d.ts +43 -0
  31. package/dist/cjs/factory/driver.factory.d.ts.map +1 -0
  32. package/dist/cjs/factory/driver.factory.js +101 -0
  33. package/dist/cjs/factory/driver.factory.js.map +1 -0
  34. package/dist/cjs/index.d.ts +26 -0
  35. package/dist/cjs/index.d.ts.map +1 -0
  36. package/dist/cjs/index.js +31 -0
  37. package/dist/cjs/index.js.map +1 -0
  38. package/dist/cjs/package.json +1 -0
  39. package/dist/cjs/storage-manager.d.ts +210 -0
  40. package/dist/cjs/storage-manager.d.ts.map +1 -0
  41. package/dist/cjs/storage-manager.js +649 -0
  42. package/dist/cjs/storage-manager.js.map +1 -0
  43. package/dist/cjs/types/storage.types.d.ts +438 -0
  44. package/dist/cjs/types/storage.types.d.ts.map +1 -0
  45. package/dist/cjs/types/storage.types.js +3 -0
  46. package/dist/cjs/types/storage.types.js.map +1 -0
  47. package/dist/cjs/utils/config.utils.d.ts.map +1 -0
  48. package/dist/cjs/utils/config.utils.js +213 -0
  49. package/dist/cjs/utils/config.utils.js.map +1 -0
  50. package/dist/{utils → cjs/utils}/file.utils.d.ts +62 -8
  51. package/dist/cjs/utils/file.utils.d.ts.map +1 -0
  52. package/dist/cjs/utils/file.utils.js +464 -0
  53. package/dist/cjs/utils/file.utils.js.map +1 -0
  54. package/dist/cjs/utils/index.d.ts +12 -0
  55. package/dist/cjs/utils/index.d.ts.map +1 -0
  56. package/dist/cjs/utils/index.js +36 -0
  57. package/dist/cjs/utils/index.js.map +1 -0
  58. package/dist/cjs/utils/rate-limiter.d.ts +40 -0
  59. package/dist/cjs/utils/rate-limiter.d.ts.map +1 -0
  60. package/dist/cjs/utils/rate-limiter.js +87 -0
  61. package/dist/cjs/utils/rate-limiter.js.map +1 -0
  62. package/dist/esm/config/index.d.ts +10 -0
  63. package/dist/esm/config/index.d.ts.map +1 -0
  64. package/dist/esm/config/index.js +10 -0
  65. package/dist/esm/config/index.js.map +1 -0
  66. package/dist/esm/drivers/azure.driver.d.ts +73 -0
  67. package/dist/esm/drivers/azure.driver.d.ts.map +1 -0
  68. package/dist/esm/drivers/azure.driver.js +353 -0
  69. package/dist/esm/drivers/azure.driver.js.map +1 -0
  70. package/dist/esm/drivers/base.driver.d.ts +136 -0
  71. package/dist/esm/drivers/base.driver.d.ts.map +1 -0
  72. package/dist/esm/drivers/base.driver.js +350 -0
  73. package/dist/esm/drivers/base.driver.js.map +1 -0
  74. package/dist/esm/drivers/gcs.driver.d.ts +68 -0
  75. package/dist/esm/drivers/gcs.driver.d.ts.map +1 -0
  76. package/dist/esm/drivers/gcs.driver.js +306 -0
  77. package/dist/esm/drivers/gcs.driver.js.map +1 -0
  78. package/dist/esm/drivers/index.d.ts +15 -0
  79. package/dist/esm/drivers/index.d.ts.map +1 -0
  80. package/dist/esm/drivers/index.js +15 -0
  81. package/dist/esm/drivers/index.js.map +1 -0
  82. package/dist/esm/drivers/local.driver.d.ts +86 -0
  83. package/dist/esm/drivers/local.driver.d.ts.map +1 -0
  84. package/dist/esm/drivers/local.driver.js +549 -0
  85. package/dist/esm/drivers/local.driver.js.map +1 -0
  86. package/dist/esm/drivers/s3.driver.d.ts +69 -0
  87. package/dist/esm/drivers/s3.driver.d.ts.map +1 -0
  88. package/dist/esm/drivers/s3.driver.js +363 -0
  89. package/dist/esm/drivers/s3.driver.js.map +1 -0
  90. package/dist/esm/factory/driver.factory.d.ts +43 -0
  91. package/dist/esm/factory/driver.factory.d.ts.map +1 -0
  92. package/dist/esm/factory/driver.factory.js +92 -0
  93. package/dist/esm/factory/driver.factory.js.map +1 -0
  94. package/dist/esm/index.d.ts +26 -0
  95. package/dist/esm/index.d.ts.map +1 -0
  96. package/dist/esm/index.js +26 -0
  97. package/dist/esm/index.js.map +1 -0
  98. package/dist/esm/package.json +1 -0
  99. package/dist/esm/storage-manager.d.ts +210 -0
  100. package/dist/esm/storage-manager.d.ts.map +1 -0
  101. package/dist/esm/storage-manager.js +645 -0
  102. package/dist/esm/storage-manager.js.map +1 -0
  103. package/dist/esm/types/storage.types.d.ts +438 -0
  104. package/dist/esm/types/storage.types.d.ts.map +1 -0
  105. package/dist/esm/types/storage.types.js.map +1 -0
  106. package/dist/esm/utils/config.utils.d.ts +45 -0
  107. package/dist/esm/utils/config.utils.d.ts.map +1 -0
  108. package/dist/esm/utils/config.utils.js.map +1 -0
  109. package/dist/esm/utils/file.utils.d.ts +196 -0
  110. package/dist/esm/utils/file.utils.d.ts.map +1 -0
  111. package/dist/esm/utils/file.utils.js +439 -0
  112. package/dist/esm/utils/file.utils.js.map +1 -0
  113. package/dist/esm/utils/index.d.ts +12 -0
  114. package/dist/esm/utils/index.d.ts.map +1 -0
  115. package/dist/esm/utils/index.js +11 -0
  116. package/dist/esm/utils/index.js.map +1 -0
  117. package/dist/esm/utils/rate-limiter.d.ts +40 -0
  118. package/dist/esm/utils/rate-limiter.d.ts.map +1 -0
  119. package/dist/esm/utils/rate-limiter.js +82 -0
  120. package/dist/esm/utils/rate-limiter.js.map +1 -0
  121. package/package.json +90 -52
  122. package/src/config/index.ts +17 -0
  123. package/src/drivers/azure.driver.ts +434 -0
  124. package/src/drivers/base.driver.ts +436 -0
  125. package/src/drivers/gcs.driver.ts +366 -0
  126. package/src/drivers/index.ts +15 -0
  127. package/src/drivers/local.driver.ts +626 -0
  128. package/src/drivers/s3.driver.ts +459 -0
  129. package/src/factory/driver.factory.ts +101 -0
  130. package/src/index.ts +72 -0
  131. package/src/storage-manager.ts +801 -0
  132. package/src/types/storage.types.ts +561 -0
  133. package/src/utils/config.utils.ts +229 -0
  134. package/src/utils/file.utils.ts +536 -0
  135. package/src/utils/index.ts +35 -0
  136. package/src/utils/rate-limiter.ts +94 -0
  137. package/dist/drivers/azure.driver.d.ts +0 -88
  138. package/dist/drivers/azure.driver.d.ts.map +0 -1
  139. package/dist/drivers/azure.driver.js +0 -391
  140. package/dist/drivers/azure.driver.js.map +0 -1
  141. package/dist/drivers/base.driver.d.ts +0 -170
  142. package/dist/drivers/base.driver.d.ts.map +0 -1
  143. package/dist/drivers/base.driver.js +0 -347
  144. package/dist/drivers/base.driver.js.map +0 -1
  145. package/dist/drivers/gcs.driver.d.ts.map +0 -1
  146. package/dist/drivers/gcs.driver.js +0 -354
  147. package/dist/drivers/gcs.driver.js.map +0 -1
  148. package/dist/drivers/local.driver.d.ts +0 -107
  149. package/dist/drivers/local.driver.d.ts.map +0 -1
  150. package/dist/drivers/local.driver.js +0 -621
  151. package/dist/drivers/local.driver.js.map +0 -1
  152. package/dist/drivers/s3.driver.d.ts.map +0 -1
  153. package/dist/drivers/s3.driver.js +0 -387
  154. package/dist/drivers/s3.driver.js.map +0 -1
  155. package/dist/factory/driver.factory.d.ts +0 -62
  156. package/dist/factory/driver.factory.d.ts.map +0 -1
  157. package/dist/factory/driver.factory.js +0 -177
  158. package/dist/factory/driver.factory.js.map +0 -1
  159. package/dist/index.d.ts +0 -30
  160. package/dist/index.d.ts.map +0 -1
  161. package/dist/index.js +0 -33
  162. package/dist/index.js.map +0 -1
  163. package/dist/storage-manager.d.ts +0 -228
  164. package/dist/storage-manager.d.ts.map +0 -1
  165. package/dist/storage-manager.js +0 -715
  166. package/dist/storage-manager.js.map +0 -1
  167. package/dist/types/storage.types.d.ts +0 -295
  168. package/dist/types/storage.types.d.ts.map +0 -1
  169. package/dist/types/storage.types.js.map +0 -1
  170. package/dist/utils/config.utils.d.ts.map +0 -1
  171. package/dist/utils/config.utils.js.map +0 -1
  172. package/dist/utils/file.utils.d.ts.map +0 -1
  173. package/dist/utils/file.utils.js +0 -278
  174. package/dist/utils/file.utils.js.map +0 -1
  175. /package/dist/{utils → cjs/utils}/config.utils.d.ts +0 -0
  176. /package/dist/{types → esm/types}/storage.types.js +0 -0
  177. /package/dist/{utils → esm/utils}/config.utils.js +0 -0
@@ -0,0 +1,11 @@
1
+ /**
2
+ * express-storage/utils
3
+ *
4
+ * Standalone utility functions for file handling, retries, and concurrency.
5
+ *
6
+ * @example
7
+ * import { withRetry, formatFileSize, withConcurrencyLimit } from 'express-storage/utils';
8
+ */
9
+ export { generateUniqueFileName, sanitizeFileName, validateFileName, hasPathTraversal, encodePathSegments, isValidMimeType, validateFolderPath, validateFileForUpload, createMonthBasedPath, ensureDirectoryExists, formatFileSize, validateFileSize, validateFileType, getFileExtension, isImageFile, isDocumentFile, detectMimeType, withRetry, sleep, withConcurrencyLimit, } from './file.utils.js';
10
+ export { InMemoryRateLimiter, isRateLimiterAdapter } from './rate-limiter.js';
11
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/utils/index.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,EACL,sBAAsB,EACtB,gBAAgB,EAChB,gBAAgB,EAChB,gBAAgB,EAChB,kBAAkB,EAClB,eAAe,EACf,kBAAkB,EAClB,qBAAqB,EACrB,oBAAoB,EACpB,qBAAqB,EACrB,cAAc,EACd,gBAAgB,EAChB,gBAAgB,EAChB,gBAAgB,EAChB,WAAW,EACX,cAAc,EACd,cAAc,EACd,SAAS,EACT,KAAK,EACL,oBAAoB,GACrB,MAAM,iBAAiB,CAAC;AAIzB,OAAO,EAAE,mBAAmB,EAAE,oBAAoB,EAAE,MAAM,mBAAmB,CAAC"}
@@ -0,0 +1,40 @@
1
+ import { RateLimiterAdapter, RateLimitOptions } from '../types/storage.types.js';
2
+ /**
3
+ * O(1) sliding window counter rate limiter for presigned URL generation.
4
+ *
5
+ * Uses a two-bucket sliding window algorithm: tracks request counts for the
6
+ * current and previous windows, then estimates the effective count with a
7
+ * time-weighted blend. This provides smooth rate limiting without storing
8
+ * individual timestamps.
9
+ *
10
+ * All operations are O(1) time and O(1) space regardless of request volume.
11
+ *
12
+ * Suitable for single-process applications. For clustered/multi-process
13
+ * deployments, implement `RateLimiterAdapter` backed by a shared store.
14
+ */
15
+ export declare class InMemoryRateLimiter implements RateLimiterAdapter {
16
+ private maxRequests;
17
+ private windowMs;
18
+ private currentCount;
19
+ private previousCount;
20
+ private windowStart;
21
+ constructor(options: RateLimitOptions);
22
+ /**
23
+ * Rotates the window buckets if the current window has elapsed.
24
+ */
25
+ private slide;
26
+ /**
27
+ * Returns the estimated request count across the sliding window,
28
+ * blending the previous window's count proportionally with elapsed time.
29
+ */
30
+ private getEstimatedCount;
31
+ tryAcquire(): boolean;
32
+ getRemainingRequests(): number;
33
+ getResetTime(): number;
34
+ }
35
+ /**
36
+ * Returns true if the value is a RateLimiterAdapter (has the required methods),
37
+ * as opposed to plain RateLimitOptions.
38
+ */
39
+ export declare function isRateLimiterAdapter(value: unknown): value is RateLimiterAdapter;
40
+ //# sourceMappingURL=rate-limiter.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"rate-limiter.d.ts","sourceRoot":"","sources":["../../../src/utils/rate-limiter.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,kBAAkB,EAAE,gBAAgB,EAAE,MAAM,2BAA2B,CAAC;AAEjF;;;;;;;;;;;;GAYG;AACH,qBAAa,mBAAoB,YAAW,kBAAkB;IAC5D,OAAO,CAAC,WAAW,CAAS;IAC5B,OAAO,CAAC,QAAQ,CAAS;IACzB,OAAO,CAAC,YAAY,CAAa;IACjC,OAAO,CAAC,aAAa,CAAa;IAClC,OAAO,CAAC,WAAW,CAAS;gBAEhB,OAAO,EAAE,gBAAgB;IAMrC;;OAEG;IACH,OAAO,CAAC,KAAK;IAeb;;;OAGG;IACH,OAAO,CAAC,iBAAiB;IAMzB,UAAU,IAAI,OAAO;IAWrB,oBAAoB,IAAI,MAAM;IAK9B,YAAY,IAAI,MAAM;CAQvB;AAED;;;GAGG;AACH,wBAAgB,oBAAoB,CAAC,KAAK,EAAE,OAAO,GAAG,KAAK,IAAI,kBAAkB,CAOhF"}
@@ -0,0 +1,82 @@
1
+ /**
2
+ * O(1) sliding window counter rate limiter for presigned URL generation.
3
+ *
4
+ * Uses a two-bucket sliding window algorithm: tracks request counts for the
5
+ * current and previous windows, then estimates the effective count with a
6
+ * time-weighted blend. This provides smooth rate limiting without storing
7
+ * individual timestamps.
8
+ *
9
+ * All operations are O(1) time and O(1) space regardless of request volume.
10
+ *
11
+ * Suitable for single-process applications. For clustered/multi-process
12
+ * deployments, implement `RateLimiterAdapter` backed by a shared store.
13
+ */
14
+ export class InMemoryRateLimiter {
15
+ maxRequests;
16
+ windowMs;
17
+ currentCount = 0;
18
+ previousCount = 0;
19
+ windowStart;
20
+ constructor(options) {
21
+ this.maxRequests = options.maxRequests;
22
+ this.windowMs = options.windowMs || 60000;
23
+ this.windowStart = Date.now();
24
+ }
25
+ /**
26
+ * Rotates the window buckets if the current window has elapsed.
27
+ */
28
+ slide() {
29
+ const now = Date.now();
30
+ const elapsed = now - this.windowStart;
31
+ if (elapsed >= this.windowMs * 2) {
32
+ this.previousCount = 0;
33
+ this.currentCount = 0;
34
+ this.windowStart = now;
35
+ }
36
+ else if (elapsed >= this.windowMs) {
37
+ this.previousCount = this.currentCount;
38
+ this.currentCount = 0;
39
+ this.windowStart += this.windowMs;
40
+ }
41
+ }
42
+ /**
43
+ * Returns the estimated request count across the sliding window,
44
+ * blending the previous window's count proportionally with elapsed time.
45
+ */
46
+ getEstimatedCount() {
47
+ const elapsed = Date.now() - this.windowStart;
48
+ const weight = Math.max(0, (this.windowMs - elapsed) / this.windowMs);
49
+ return this.previousCount * weight + this.currentCount;
50
+ }
51
+ tryAcquire() {
52
+ this.slide();
53
+ if (this.getEstimatedCount() >= this.maxRequests) {
54
+ return false;
55
+ }
56
+ this.currentCount++;
57
+ return true;
58
+ }
59
+ getRemainingRequests() {
60
+ this.slide();
61
+ return Math.max(0, Math.floor(this.maxRequests - this.getEstimatedCount()));
62
+ }
63
+ getResetTime() {
64
+ this.slide();
65
+ if (this.currentCount === 0 && this.previousCount === 0) {
66
+ return 0;
67
+ }
68
+ const elapsed = Date.now() - this.windowStart;
69
+ return Math.max(0, this.windowMs - elapsed);
70
+ }
71
+ }
72
+ /**
73
+ * Returns true if the value is a RateLimiterAdapter (has the required methods),
74
+ * as opposed to plain RateLimitOptions.
75
+ */
76
+ export function isRateLimiterAdapter(value) {
77
+ return (typeof value === 'object' &&
78
+ value !== null &&
79
+ 'tryAcquire' in value &&
80
+ typeof value.tryAcquire === 'function');
81
+ }
82
+ //# sourceMappingURL=rate-limiter.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"rate-limiter.js","sourceRoot":"","sources":["../../../src/utils/rate-limiter.ts"],"names":[],"mappings":"AAEA;;;;;;;;;;;;GAYG;AACH,MAAM,OAAO,mBAAmB;IACtB,WAAW,CAAS;IACpB,QAAQ,CAAS;IACjB,YAAY,GAAW,CAAC,CAAC;IACzB,aAAa,GAAW,CAAC,CAAC;IAC1B,WAAW,CAAS;IAE5B,YAAY,OAAyB;QACnC,IAAI,CAAC,WAAW,GAAG,OAAO,CAAC,WAAW,CAAC;QACvC,IAAI,CAAC,QAAQ,GAAG,OAAO,CAAC,QAAQ,IAAI,KAAK,CAAC;QAC1C,IAAI,CAAC,WAAW,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;IAChC,CAAC;IAED;;OAEG;IACK,KAAK;QACX,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;QACvB,MAAM,OAAO,GAAG,GAAG,GAAG,IAAI,CAAC,WAAW,CAAC;QAEvC,IAAI,OAAO,IAAI,IAAI,CAAC,QAAQ,GAAG,CAAC,EAAE,CAAC;YACjC,IAAI,CAAC,aAAa,GAAG,CAAC,CAAC;YACvB,IAAI,CAAC,YAAY,GAAG,CAAC,CAAC;YACtB,IAAI,CAAC,WAAW,GAAG,GAAG,CAAC;QACzB,CAAC;aAAM,IAAI,OAAO,IAAI,IAAI,CAAC,QAAQ,EAAE,CAAC;YACpC,IAAI,CAAC,aAAa,GAAG,IAAI,CAAC,YAAY,CAAC;YACvC,IAAI,CAAC,YAAY,GAAG,CAAC,CAAC;YACtB,IAAI,CAAC,WAAW,IAAI,IAAI,CAAC,QAAQ,CAAC;QACpC,CAAC;IACH,CAAC;IAED;;;OAGG;IACK,iBAAiB;QACvB,MAAM,OAAO,GAAG,IAAI,CAAC,GAAG,EAAE,GAAG,IAAI,CAAC,WAAW,CAAC;QAC9C,MAAM,MAAM,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC,IAAI,CAAC,QAAQ,GAAG,OAAO,CAAC,GAAG,IAAI,CAAC,QAAQ,CAAC,CAAC;QACtE,OAAO,IAAI,CAAC,aAAa,GAAG,MAAM,GAAG,IAAI,CAAC,YAAY,CAAC;IACzD,CAAC;IAED,UAAU;QACR,IAAI,CAAC,KAAK,EAAE,CAAC;QAEb,IAAI,IAAI,CAAC,iBAAiB,EAAE,IAAI,IAAI,CAAC,WAAW,EAAE,CAAC;YACjD,OAAO,KAAK,CAAC;QACf,CAAC;QAED,IAAI,CAAC,YAAY,EAAE,CAAC;QACpB,OAAO,IAAI,CAAC;IACd,CAAC;IAED,oBAAoB;QAClB,IAAI,CAAC,KAAK,EAAE,CAAC;QACb,OAAO,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,WAAW,GAAG,IAAI,CAAC,iBAAiB,EAAE,CAAC,CAAC,CAAC;IAC9E,CAAC;IAED,YAAY;QACV,IAAI,CAAC,KAAK,EAAE,CAAC;QACb,IAAI,IAAI,CAAC,YAAY,KAAK,CAAC,IAAI,IAAI,CAAC,aAAa,KAAK,CAAC,EAAE,CAAC;YACxD,OAAO,CAAC,CAAC;QACX,CAAC;QACD,MAAM,OAAO,GAAG,IAAI,CAAC,GAAG,EAAE,GAAG,IAAI,CAAC,WAAW,CAAC;QAC9C,OAAO,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,QAAQ,GAAG,OAAO,CAAC,CAAC;IAC9C,CAAC;CACF;AAED;;;GAGG;AACH,MAAM,UAAU,oBAAoB,CAAC,KAAc;IACjD,OAAO,CACL,OAAO,KAAK,KAAK,QAAQ;QACzB,KAAK,KAAK,IAAI;QACd,YAAY,IAAI,KAAK;QACrB,OAAQ,KAA4B,CAAC,UAAU,KAAK,UAAU,CAC/D,CAAC;AACJ,CAAC"}
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "express-storage",
3
- "version": "2.0.2",
4
- "description": "One API for all cloud storage: AWS S3, Google Cloud, Azure & local disk. Secure Express.js file uploads with presigned URLs, validation, and zero-config provider switching. Built-in path traversal prevention, file validation, and automatic filename sanitization.",
3
+ "version": "3.0.0",
4
+ "description": "Express.js file upload middleware for AWS S3, Google Cloud Storage, Azure Blob & local disk. Unified API with presigned URLs, file validation, streaming uploads, TypeScript support, and zero-config provider switching.",
5
5
  "homepage": "https://github.com/th3hero/express-storage#readme",
6
6
  "bugs": {
7
7
  "url": "https://github.com/th3hero/express-storage/issues"
@@ -12,79 +12,95 @@
12
12
  },
13
13
  "license": "MIT",
14
14
  "author": "Alok Kumar (th3hero)",
15
- "type": "module",
16
- "main": "dist/index.js",
17
- "types": "dist/index.d.ts",
15
+ "main": "./dist/cjs/index.js",
16
+ "module": "./dist/esm/index.js",
17
+ "types": "./dist/cjs/index.d.ts",
18
18
  "exports": {
19
19
  ".": {
20
- "types": "./dist/index.d.ts",
21
- "import": "./dist/index.js",
22
- "require": "./dist/index.js",
23
- "default": "./dist/index.js"
20
+ "import": {
21
+ "types": "./dist/esm/index.d.ts",
22
+ "default": "./dist/esm/index.js"
23
+ },
24
+ "require": {
25
+ "types": "./dist/cjs/index.d.ts",
26
+ "default": "./dist/cjs/index.js"
27
+ }
28
+ },
29
+ "./drivers": {
30
+ "import": {
31
+ "types": "./dist/esm/drivers/index.d.ts",
32
+ "default": "./dist/esm/drivers/index.js"
33
+ },
34
+ "require": {
35
+ "types": "./dist/cjs/drivers/index.d.ts",
36
+ "default": "./dist/cjs/drivers/index.js"
37
+ }
38
+ },
39
+ "./utils": {
40
+ "import": {
41
+ "types": "./dist/esm/utils/index.d.ts",
42
+ "default": "./dist/esm/utils/index.js"
43
+ },
44
+ "require": {
45
+ "types": "./dist/cjs/utils/index.d.ts",
46
+ "default": "./dist/cjs/utils/index.js"
47
+ }
48
+ },
49
+ "./config": {
50
+ "import": {
51
+ "types": "./dist/esm/config/index.d.ts",
52
+ "default": "./dist/esm/config/index.js"
53
+ },
54
+ "require": {
55
+ "types": "./dist/cjs/config/index.d.ts",
56
+ "default": "./dist/cjs/config/index.js"
57
+ }
24
58
  }
25
59
  },
60
+ "sideEffects": false,
26
61
  "files": [
27
62
  "dist",
63
+ "src",
28
64
  "README.md",
29
65
  "LICENSE"
30
66
  ],
31
67
  "keywords": [
32
68
  "express",
33
69
  "file-upload",
34
- "storage",
35
70
  "upload",
36
- "file-storage",
71
+ "storage",
37
72
  "cloud-storage",
38
73
  "s3",
39
74
  "aws-s3",
40
- "amazon-s3",
41
75
  "gcs",
42
76
  "google-cloud-storage",
43
77
  "azure",
44
- "azure-blob",
45
78
  "azure-blob-storage",
46
- "blob-storage",
79
+ "multer",
80
+ "multer-alternative",
47
81
  "presigned-url",
48
- "presigned-upload",
49
- "direct-upload",
50
- "secure-upload",
51
82
  "file-validation",
52
- "multer",
53
- "multer-storage",
54
83
  "typescript",
55
84
  "nodejs",
56
- "expressjs",
57
- "file-manager",
58
- "upload-manager",
59
- "storage-driver",
60
- "multi-cloud",
61
- "hybrid-cloud",
62
- "file-security",
63
- "upload-security",
64
85
  "multipart-upload",
86
+ "streaming-upload",
65
87
  "file-upload-middleware",
66
88
  "express-middleware",
67
- "multer-alternative",
68
- "unified-storage",
69
- "storage-abstraction",
70
- "file-streaming",
71
- "resumable-upload",
72
- "cloud-agnostic",
73
- "provider-agnostic",
74
- "s3-upload",
75
- "gcs-upload",
76
- "azure-upload",
77
- "bucket-storage",
78
- "multer-s3-alternative",
79
- "cloud-file-storage"
89
+ "object-storage",
90
+ "multi-cloud",
91
+ "secure-upload",
92
+ "s3-upload"
80
93
  ],
81
94
  "scripts": {
82
- "build": "tsc",
83
- "dev": "tsc --watch",
95
+ "build": "npm run build:esm && npm run build:cjs && npm run build:fixup",
96
+ "build:esm": "tsc -p tsconfig.esm.json",
97
+ "build:cjs": "tsc -p tsconfig.cjs.json",
98
+ "build:fixup": "echo '{\"type\":\"commonjs\"}' > dist/cjs/package.json && echo '{\"type\":\"module\"}' > dist/esm/package.json",
99
+ "dev": "tsc -p tsconfig.esm.json --watch",
84
100
  "clean": "rm -rf dist",
85
101
  "prepublishOnly": "npm run clean && npm run build",
86
- "lint": "eslint src --ext .ts",
87
- "lint:fix": "eslint src --ext .ts --fix",
102
+ "lint": "eslint src",
103
+ "lint:fix": "eslint src --fix",
88
104
  "format": "prettier --write src/**/*.ts",
89
105
  "type-check": "tsc --noEmit",
90
106
  "test": "vitest run",
@@ -92,34 +108,57 @@
92
108
  "test:coverage": "vitest run --coverage"
93
109
  },
94
110
  "engines": {
95
- "node": ">=18.0.0"
111
+ "node": ">=20.0.0"
96
112
  },
97
113
  "dependencies": {
114
+ "dotenv": "^16.3.0"
115
+ },
116
+ "peerDependencies": {
98
117
  "@aws-sdk/client-s3": "^3.600.0",
99
118
  "@aws-sdk/lib-storage": "^3.600.0",
100
119
  "@aws-sdk/s3-request-presigner": "^3.600.0",
101
120
  "@azure/identity": "^4.0.0",
102
121
  "@azure/storage-blob": "^12.17.0",
103
122
  "@google-cloud/storage": "^7.7.0",
104
- "dotenv": "^16.3.0",
105
- "tslib": "^2.6.0"
106
- },
107
- "peerDependencies": {
108
123
  "express": "^4.18.0 || ^5.0.0",
109
124
  "multer": "^1.4.5-lts.1 || ^2.0.0"
110
125
  },
111
126
  "peerDependenciesMeta": {
112
127
  "express": {
113
- "optional": false
128
+ "optional": true
114
129
  },
115
130
  "multer": {
116
131
  "optional": true
132
+ },
133
+ "@aws-sdk/client-s3": {
134
+ "optional": true
135
+ },
136
+ "@aws-sdk/lib-storage": {
137
+ "optional": true
138
+ },
139
+ "@aws-sdk/s3-request-presigner": {
140
+ "optional": true
141
+ },
142
+ "@azure/identity": {
143
+ "optional": true
144
+ },
145
+ "@azure/storage-blob": {
146
+ "optional": true
147
+ },
148
+ "@google-cloud/storage": {
149
+ "optional": true
117
150
  }
118
151
  },
119
152
  "overrides": {
120
- "fast-xml-parser": "^5.3.4"
153
+ "minimatch": ">=10.2.1"
121
154
  },
122
155
  "devDependencies": {
156
+ "@aws-sdk/client-s3": "^3.600.0",
157
+ "@aws-sdk/lib-storage": "^3.600.0",
158
+ "@aws-sdk/s3-request-presigner": "^3.600.0",
159
+ "@azure/identity": "^4.0.0",
160
+ "@azure/storage-blob": "^12.17.0",
161
+ "@google-cloud/storage": "^7.7.0",
123
162
  "@types/express": "^5.0.6",
124
163
  "@types/multer": "^2.0.0",
125
164
  "@types/node": "^25.2.0",
@@ -127,7 +166,6 @@
127
166
  "@typescript-eslint/parser": "^8.54.0",
128
167
  "@vitest/coverage-v8": "^4.0.18",
129
168
  "eslint": "^9.39.2",
130
- "memfs": "^4.56.10",
131
169
  "prettier": "^3.8.1",
132
170
  "typescript": "^5.9.3",
133
171
  "vitest": "^4.0.18"
@@ -0,0 +1,17 @@
1
+ /**
2
+ * express-storage/config
3
+ *
4
+ * Configuration loading, validation, and environment variable utilities.
5
+ *
6
+ * @example
7
+ * import { loadAndValidateConfig, validateStorageConfig } from 'express-storage/config';
8
+ */
9
+
10
+ export {
11
+ loadAndValidateConfig,
12
+ validateStorageConfig,
13
+ initializeDotenv,
14
+ resetDotenvInitialization,
15
+ loadEnvironmentConfig,
16
+ environmentToStorageConfig,
17
+ } from '../utils/config.utils.js';