@spinajs/fs 2.0.481 → 2.0.484

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 (211) hide show
  1. package/lib/cjs/cli/cat.d.ts +11 -0
  2. package/lib/cjs/cli/cat.d.ts.map +1 -0
  3. package/lib/cjs/cli/cat.js +40 -0
  4. package/lib/cjs/cli/cat.js.map +1 -0
  5. package/lib/cjs/cli/cp.d.ts +11 -0
  6. package/lib/cjs/cli/cp.d.ts.map +1 -0
  7. package/lib/cjs/cli/cp.js +41 -0
  8. package/lib/cjs/cli/cp.js.map +1 -0
  9. package/lib/cjs/cli/download.d.ts +7 -0
  10. package/lib/cjs/cli/download.d.ts.map +1 -0
  11. package/lib/cjs/cli/download.js +39 -0
  12. package/lib/cjs/cli/download.js.map +1 -0
  13. package/lib/cjs/cli/exists.d.ts +7 -0
  14. package/lib/cjs/cli/exists.d.ts.map +1 -0
  15. package/lib/cjs/cli/exists.js +39 -0
  16. package/lib/cjs/cli/exists.js.map +1 -0
  17. package/lib/cjs/cli/fs.d.ts +11 -0
  18. package/lib/cjs/cli/fs.d.ts.map +1 -1
  19. package/lib/cjs/cli/fs.js +47 -21
  20. package/lib/cjs/cli/fs.js.map +1 -1
  21. package/lib/cjs/cli/hash.d.ts +11 -0
  22. package/lib/cjs/cli/hash.d.ts.map +1 -0
  23. package/lib/cjs/cli/hash.js +40 -0
  24. package/lib/cjs/cli/hash.js.map +1 -0
  25. package/lib/cjs/cli/info.d.ts +7 -0
  26. package/lib/cjs/cli/info.d.ts.map +1 -0
  27. package/lib/cjs/cli/info.js +45 -0
  28. package/lib/cjs/cli/info.js.map +1 -0
  29. package/lib/cjs/cli/ls.d.ts +7 -0
  30. package/lib/cjs/cli/ls.d.ts.map +1 -0
  31. package/lib/cjs/cli/ls.js +40 -0
  32. package/lib/cjs/cli/ls.js.map +1 -0
  33. package/lib/cjs/cli/mkdir.d.ts +7 -0
  34. package/lib/cjs/cli/mkdir.d.ts.map +1 -0
  35. package/lib/cjs/cli/mkdir.js +39 -0
  36. package/lib/cjs/cli/mkdir.js.map +1 -0
  37. package/lib/cjs/cli/mv.d.ts +11 -0
  38. package/lib/cjs/cli/mv.d.ts.map +1 -0
  39. package/lib/cjs/cli/mv.js +41 -0
  40. package/lib/cjs/cli/mv.js.map +1 -0
  41. package/lib/cjs/cli/rm.d.ts +1 -6
  42. package/lib/cjs/cli/rm.d.ts.map +1 -1
  43. package/lib/cjs/cli/rm.js +14 -4
  44. package/lib/cjs/cli/rm.js.map +1 -1
  45. package/lib/cjs/cli/stat.d.ts +1 -5
  46. package/lib/cjs/cli/stat.d.ts.map +1 -1
  47. package/lib/cjs/cli/stat.js +20 -3
  48. package/lib/cjs/cli/stat.js.map +1 -1
  49. package/lib/cjs/cli/unzip.d.ts +11 -0
  50. package/lib/cjs/cli/unzip.d.ts.map +1 -0
  51. package/lib/cjs/cli/unzip.js +47 -0
  52. package/lib/cjs/cli/unzip.js.map +1 -0
  53. package/lib/cjs/cli/upload.d.ts +7 -0
  54. package/lib/cjs/cli/upload.d.ts.map +1 -0
  55. package/lib/cjs/cli/upload.js +40 -0
  56. package/lib/cjs/cli/upload.js.map +1 -0
  57. package/lib/cjs/cli/write.d.ts +13 -0
  58. package/lib/cjs/cli/write.d.ts.map +1 -0
  59. package/lib/cjs/cli/write.js +54 -0
  60. package/lib/cjs/cli/write.js.map +1 -0
  61. package/lib/cjs/cli/zip.d.ts +12 -0
  62. package/lib/cjs/cli/zip.d.ts.map +1 -0
  63. package/lib/cjs/cli/zip.js +51 -0
  64. package/lib/cjs/cli/zip.js.map +1 -0
  65. package/lib/cjs/config/fs.d.ts +9 -0
  66. package/lib/cjs/config/fs.d.ts.map +1 -0
  67. package/lib/cjs/config/fs.js +22 -0
  68. package/lib/cjs/config/fs.js.map +1 -0
  69. package/lib/cjs/file-hasher.d.ts +85 -5
  70. package/lib/cjs/file-hasher.d.ts.map +1 -1
  71. package/lib/cjs/file-hasher.js +106 -14
  72. package/lib/cjs/file-hasher.js.map +1 -1
  73. package/lib/cjs/file-info.d.ts +94 -5
  74. package/lib/cjs/file-info.d.ts.map +1 -1
  75. package/lib/cjs/file-info.js +267 -73
  76. package/lib/cjs/file-info.js.map +1 -1
  77. package/lib/cjs/fp.d.ts +80 -2
  78. package/lib/cjs/fp.d.ts.map +1 -1
  79. package/lib/cjs/fp.js +149 -3
  80. package/lib/cjs/fp.js.map +1 -1
  81. package/lib/cjs/index.d.ts +2 -1
  82. package/lib/cjs/index.d.ts.map +1 -1
  83. package/lib/cjs/index.js +7 -2
  84. package/lib/cjs/index.js.map +1 -1
  85. package/lib/cjs/interfaces.d.ts +89 -12
  86. package/lib/cjs/interfaces.d.ts.map +1 -1
  87. package/lib/cjs/interfaces.js +13 -13
  88. package/lib/cjs/interfaces.js.map +1 -1
  89. package/lib/cjs/local-provider.d.ts +51 -6
  90. package/lib/cjs/local-provider.d.ts.map +1 -1
  91. package/lib/cjs/local-provider.js +254 -76
  92. package/lib/cjs/local-provider.js.map +1 -1
  93. package/lib/cjs/temp-cleanup-strategy.d.ts +70 -0
  94. package/lib/cjs/temp-cleanup-strategy.d.ts.map +1 -0
  95. package/lib/cjs/temp-cleanup-strategy.js +157 -0
  96. package/lib/cjs/temp-cleanup-strategy.js.map +1 -0
  97. package/lib/cjs/temp-provider.d.ts +59 -0
  98. package/lib/cjs/temp-provider.d.ts.map +1 -0
  99. package/lib/cjs/temp-provider.js +150 -0
  100. package/lib/cjs/temp-provider.js.map +1 -0
  101. package/lib/mjs/cli/cat.d.ts +11 -0
  102. package/lib/mjs/cli/cat.d.ts.map +1 -0
  103. package/lib/mjs/cli/cat.js +37 -0
  104. package/lib/mjs/cli/cat.js.map +1 -0
  105. package/lib/mjs/cli/cp.d.ts +11 -0
  106. package/lib/mjs/cli/cp.d.ts.map +1 -0
  107. package/lib/mjs/cli/cp.js +38 -0
  108. package/lib/mjs/cli/cp.js.map +1 -0
  109. package/lib/mjs/cli/download.d.ts +7 -0
  110. package/lib/mjs/cli/download.d.ts.map +1 -0
  111. package/lib/mjs/cli/download.js +36 -0
  112. package/lib/mjs/cli/download.js.map +1 -0
  113. package/lib/mjs/cli/exists.d.ts +7 -0
  114. package/lib/mjs/cli/exists.d.ts.map +1 -0
  115. package/lib/mjs/cli/exists.js +36 -0
  116. package/lib/mjs/cli/exists.js.map +1 -0
  117. package/lib/mjs/cli/fs.d.ts +11 -1
  118. package/lib/mjs/cli/fs.d.ts.map +1 -1
  119. package/lib/mjs/cli/fs.js +43 -22
  120. package/lib/mjs/cli/fs.js.map +1 -1
  121. package/lib/mjs/cli/hash.d.ts +11 -0
  122. package/lib/mjs/cli/hash.d.ts.map +1 -0
  123. package/lib/mjs/cli/hash.js +37 -0
  124. package/lib/mjs/cli/hash.js.map +1 -0
  125. package/lib/mjs/cli/info.d.ts +7 -0
  126. package/lib/mjs/cli/info.d.ts.map +1 -0
  127. package/lib/mjs/cli/info.js +42 -0
  128. package/lib/mjs/cli/info.js.map +1 -0
  129. package/lib/mjs/cli/ls.d.ts +7 -0
  130. package/lib/mjs/cli/ls.d.ts.map +1 -0
  131. package/lib/mjs/cli/ls.js +37 -0
  132. package/lib/mjs/cli/ls.js.map +1 -0
  133. package/lib/mjs/cli/mkdir.d.ts +7 -0
  134. package/lib/mjs/cli/mkdir.d.ts.map +1 -0
  135. package/lib/mjs/cli/mkdir.js +36 -0
  136. package/lib/mjs/cli/mkdir.js.map +1 -0
  137. package/lib/mjs/cli/mv.d.ts +11 -0
  138. package/lib/mjs/cli/mv.d.ts.map +1 -0
  139. package/lib/mjs/cli/mv.js +38 -0
  140. package/lib/mjs/cli/mv.js.map +1 -0
  141. package/lib/mjs/cli/rm.d.ts +1 -6
  142. package/lib/mjs/cli/rm.d.ts.map +1 -1
  143. package/lib/mjs/cli/rm.js +15 -5
  144. package/lib/mjs/cli/rm.js.map +1 -1
  145. package/lib/mjs/cli/stat.d.ts +1 -5
  146. package/lib/mjs/cli/stat.d.ts.map +1 -1
  147. package/lib/mjs/cli/stat.js +21 -4
  148. package/lib/mjs/cli/stat.js.map +1 -1
  149. package/lib/mjs/cli/unzip.d.ts +11 -0
  150. package/lib/mjs/cli/unzip.d.ts.map +1 -0
  151. package/lib/mjs/cli/unzip.js +44 -0
  152. package/lib/mjs/cli/unzip.js.map +1 -0
  153. package/lib/mjs/cli/upload.d.ts +7 -0
  154. package/lib/mjs/cli/upload.d.ts.map +1 -0
  155. package/lib/mjs/cli/upload.js +37 -0
  156. package/lib/mjs/cli/upload.js.map +1 -0
  157. package/lib/mjs/cli/write.d.ts +13 -0
  158. package/lib/mjs/cli/write.d.ts.map +1 -0
  159. package/lib/mjs/cli/write.js +51 -0
  160. package/lib/mjs/cli/write.js.map +1 -0
  161. package/lib/mjs/cli/zip.d.ts +12 -0
  162. package/lib/mjs/cli/zip.d.ts.map +1 -0
  163. package/lib/mjs/cli/zip.js +48 -0
  164. package/lib/mjs/cli/zip.js.map +1 -0
  165. package/lib/mjs/config/fs.d.ts +9 -0
  166. package/lib/mjs/config/fs.d.ts.map +1 -0
  167. package/lib/mjs/config/fs.js +20 -0
  168. package/lib/mjs/config/fs.js.map +1 -0
  169. package/lib/mjs/file-hasher.d.ts +85 -5
  170. package/lib/mjs/file-hasher.d.ts.map +1 -1
  171. package/lib/mjs/file-hasher.js +106 -14
  172. package/lib/mjs/file-hasher.js.map +1 -1
  173. package/lib/mjs/file-info.d.ts +94 -5
  174. package/lib/mjs/file-info.d.ts.map +1 -1
  175. package/lib/mjs/file-info.js +233 -73
  176. package/lib/mjs/file-info.js.map +1 -1
  177. package/lib/mjs/fp.d.ts +80 -2
  178. package/lib/mjs/fp.d.ts.map +1 -1
  179. package/lib/mjs/fp.js +135 -4
  180. package/lib/mjs/fp.js.map +1 -1
  181. package/lib/mjs/index.d.ts +2 -1
  182. package/lib/mjs/index.d.ts.map +1 -1
  183. package/lib/mjs/index.js +8 -3
  184. package/lib/mjs/index.js.map +1 -1
  185. package/lib/mjs/interfaces.d.ts +89 -12
  186. package/lib/mjs/interfaces.d.ts.map +1 -1
  187. package/lib/mjs/interfaces.js +13 -13
  188. package/lib/mjs/interfaces.js.map +1 -1
  189. package/lib/mjs/local-provider.d.ts +51 -6
  190. package/lib/mjs/local-provider.d.ts.map +1 -1
  191. package/lib/mjs/local-provider.js +257 -79
  192. package/lib/mjs/local-provider.js.map +1 -1
  193. package/lib/mjs/temp-cleanup-strategy.d.ts +70 -0
  194. package/lib/mjs/temp-cleanup-strategy.d.ts.map +1 -0
  195. package/lib/mjs/temp-cleanup-strategy.js +153 -0
  196. package/lib/mjs/temp-cleanup-strategy.js.map +1 -0
  197. package/lib/mjs/temp-provider.d.ts +59 -0
  198. package/lib/mjs/temp-provider.d.ts.map +1 -0
  199. package/lib/mjs/temp-provider.js +147 -0
  200. package/lib/mjs/temp-provider.js.map +1 -0
  201. package/lib/tsconfig.cjs.tsbuildinfo +1 -1
  202. package/lib/tsconfig.mjs.tsbuildinfo +1 -1
  203. package/package.json +12 -6
  204. package/lib/cjs/local-temp-provider.d.ts +0 -18
  205. package/lib/cjs/local-temp-provider.d.ts.map +0 -1
  206. package/lib/cjs/local-temp-provider.js +0 -63
  207. package/lib/cjs/local-temp-provider.js.map +0 -1
  208. package/lib/mjs/local-temp-provider.d.ts +0 -18
  209. package/lib/mjs/local-temp-provider.d.ts.map +0 -1
  210. package/lib/mjs/local-temp-provider.js +0 -60
  211. package/lib/mjs/local-temp-provider.js.map +0 -1
@@ -0,0 +1,70 @@
1
+ import { Log } from '@spinajs/log-common';
2
+ import { CronJob } from 'cron';
3
+ import { fs, IFsTempOptions } from './interfaces.js';
4
+ /**
5
+ * Cleanup policy for temporary filesystems. Implement and register
6
+ * to customize which files are considered stale and how they are removed,
7
+ * then select it via `cleanupStrategy` option of fsTemp provider.
8
+ *
9
+ * Strategy also owns its schedule - scheduling mechanism ( interval, cron, ... )
10
+ * is strategy specific and implemented in `start` / `stop`.
11
+ *
12
+ * Strategies hold scheduling state per temp filesystem, so implementations
13
+ * must be registered with `@NewInstance()` - otherwise a single instance
14
+ * would be shared between all temp filesystems.
15
+ */
16
+ export declare abstract class TempCleanupStrategy {
17
+ protected Logger: Log;
18
+ /**
19
+ * Performs single cleanup sweep on given filesystem.
20
+ *
21
+ * @param fs backend filesystem holding temp files
22
+ * @param options temp fs configuration ( maxFileAge etc. )
23
+ */
24
+ abstract cleanup(fs: fs, options: IFsTempOptions): Promise<void>;
25
+ /**
26
+ * Starts scheduled cleanup - how sweeps are scheduled is up to the strategy.
27
+ *
28
+ * @param fs backend filesystem holding temp files
29
+ * @param options temp fs configuration
30
+ */
31
+ abstract start(fs: fs, options: IFsTempOptions): void;
32
+ /**
33
+ * Stops scheduled cleanup. Safe to call multiple times.
34
+ */
35
+ abstract stop(): void;
36
+ /**
37
+ * Single sweep guarded against errors - remote backends can fail
38
+ * ( network etc. ), scheduler tick must never crash.
39
+ */
40
+ protected safeCleanup(fs: fs, options: IFsTempOptions): Promise<void>;
41
+ }
42
+ /**
43
+ * Default cleanup - deletes first level files older than `maxFileAge` seconds,
44
+ * checked every `cleanupInterval` milliseconds.
45
+ *
46
+ * File age is taken from CreationTime when valid, otherwise from ModifiedTime -
47
+ * remote backends often lack creation time ( s3 reports epoch, ftp reports none ).
48
+ * Files with no usable timestamp are skipped. It does not check files recursively
49
+ * in subdirectories.
50
+ */
51
+ export declare class MaxAgeTempCleanupStrategy extends TempCleanupStrategy {
52
+ /**
53
+ * timer instance used by interval-based scheduling
54
+ */
55
+ protected cleanupTimer: NodeJS.Timeout | null;
56
+ start(fs: fs, options: IFsTempOptions): void;
57
+ stop(): void;
58
+ cleanup(fs: fs, options: IFsTempOptions): Promise<void>;
59
+ }
60
+ /**
61
+ * Same sweep as MaxAgeTempCleanupStrategy ( `maxFileAge` still applies ),
62
+ * but scheduled by cron expression from `cleanupCronExpression` option
63
+ * instead of fixed interval. Expression is required - creation fails without it.
64
+ */
65
+ export declare class CronTempCleanupStrategy extends MaxAgeTempCleanupStrategy {
66
+ protected cronJob: CronJob | null;
67
+ start(fs: fs, options: IFsTempOptions): void;
68
+ stop(): void;
69
+ }
70
+ //# sourceMappingURL=temp-cleanup-strategy.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"temp-cleanup-strategy.d.ts","sourceRoot":"","sources":["../../src/temp-cleanup-strategy.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,GAAG,EAAU,MAAM,qBAAqB,CAAC;AAClD,OAAO,EAAE,OAAO,EAAE,MAAM,MAAM,CAAC;AAE/B,OAAO,EAAE,EAAE,EAAE,cAAc,EAAE,MAAM,iBAAiB,CAAC;AAYrD;;;;;;;;;;;GAWG;AACH,8BAAsB,mBAAmB;IAEvC,SAAS,CAAC,MAAM,EAAE,GAAG,CAAC;IAEtB;;;;;OAKG;aACa,OAAO,CAAC,EAAE,EAAE,EAAE,EAAE,OAAO,EAAE,cAAc,GAAG,OAAO,CAAC,IAAI,CAAC;IAEvE;;;;;OAKG;aACa,KAAK,CAAC,EAAE,EAAE,EAAE,EAAE,OAAO,EAAE,cAAc,GAAG,IAAI;IAE5D;;OAEG;aACa,IAAI,IAAI,IAAI;IAE5B;;;OAGG;cACa,WAAW,CAAC,EAAE,EAAE,EAAE,EAAE,OAAO,EAAE,cAAc,GAAG,OAAO,CAAC,IAAI,CAAC;CAO5E;AAED;;;;;;;;GAQG;AACH,qBAEa,yBAA0B,SAAQ,mBAAmB;IAChE;;OAEG;IACH,SAAS,CAAC,YAAY,EAAE,MAAM,CAAC,OAAO,GAAG,IAAI,CAAQ;IAE9C,KAAK,CAAC,EAAE,EAAE,EAAE,EAAE,OAAO,EAAE,cAAc,GAAG,IAAI;IAS5C,IAAI,IAAI,IAAI;IAON,OAAO,CAAC,EAAE,EAAE,EAAE,EAAE,OAAO,EAAE,cAAc,GAAG,OAAO,CAAC,IAAI,CAAC;CAgCrE;AAED;;;;GAIG;AACH,qBAEa,uBAAwB,SAAQ,yBAAyB;IACpE,SAAS,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CAAQ;IAElC,KAAK,CAAC,EAAE,EAAE,EAAE,EAAE,OAAO,EAAE,cAAc,GAAG,IAAI;IAkC5C,IAAI,IAAI,IAAI;CAMpB"}
@@ -0,0 +1,157 @@
1
+ "use strict";
2
+ var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
3
+ var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
4
+ if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
5
+ else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
6
+ return c > 3 && r && Object.defineProperty(target, key, r), r;
7
+ };
8
+ var __metadata = (this && this.__metadata) || function (k, v) {
9
+ if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
10
+ };
11
+ Object.defineProperty(exports, "__esModule", { value: true });
12
+ exports.CronTempCleanupStrategy = exports.MaxAgeTempCleanupStrategy = exports.TempCleanupStrategy = void 0;
13
+ const di_1 = require("@spinajs/di");
14
+ const exceptions_1 = require("@spinajs/exceptions");
15
+ const log_common_1 = require("@spinajs/log-common");
16
+ const cron_1 = require("cron");
17
+ const luxon_1 = require("luxon");
18
+ /**
19
+ * Default file age for temp files in seconds
20
+ */
21
+ const DEFAULT_FILE_AGE = 60 * 60;
22
+ /**
23
+ * Default cleanup interval in milliseconds
24
+ */
25
+ const DEFAULT_CLEANUP_INTERVAL = 10 * 60 * 1000;
26
+ /**
27
+ * Cleanup policy for temporary filesystems. Implement and register
28
+ * to customize which files are considered stale and how they are removed,
29
+ * then select it via `cleanupStrategy` option of fsTemp provider.
30
+ *
31
+ * Strategy also owns its schedule - scheduling mechanism ( interval, cron, ... )
32
+ * is strategy specific and implemented in `start` / `stop`.
33
+ *
34
+ * Strategies hold scheduling state per temp filesystem, so implementations
35
+ * must be registered with `@NewInstance()` - otherwise a single instance
36
+ * would be shared between all temp filesystems.
37
+ */
38
+ class TempCleanupStrategy {
39
+ /**
40
+ * Single sweep guarded against errors - remote backends can fail
41
+ * ( network etc. ), scheduler tick must never crash.
42
+ */
43
+ async safeCleanup(fs, options) {
44
+ try {
45
+ await this.cleanup(fs, options);
46
+ }
47
+ catch (err) {
48
+ this.Logger.warn(`Cleanup of temporary files system ${options.name} failed: ${err.message}`);
49
+ }
50
+ }
51
+ }
52
+ exports.TempCleanupStrategy = TempCleanupStrategy;
53
+ __decorate([
54
+ (0, log_common_1.Logger)('fs'),
55
+ __metadata("design:type", log_common_1.Log)
56
+ ], TempCleanupStrategy.prototype, "Logger", void 0);
57
+ /**
58
+ * Default cleanup - deletes first level files older than `maxFileAge` seconds,
59
+ * checked every `cleanupInterval` milliseconds.
60
+ *
61
+ * File age is taken from CreationTime when valid, otherwise from ModifiedTime -
62
+ * remote backends often lack creation time ( s3 reports epoch, ftp reports none ).
63
+ * Files with no usable timestamp are skipped. It does not check files recursively
64
+ * in subdirectories.
65
+ */
66
+ let MaxAgeTempCleanupStrategy = class MaxAgeTempCleanupStrategy extends TempCleanupStrategy {
67
+ constructor() {
68
+ super(...arguments);
69
+ /**
70
+ * timer instance used by interval-based scheduling
71
+ */
72
+ this.cleanupTimer = null;
73
+ }
74
+ start(fs, options) {
75
+ // never leak a previous timer on repeated start
76
+ this.stop();
77
+ this.cleanupTimer = setInterval(() => {
78
+ void this.safeCleanup(fs, options);
79
+ }, options.cleanupInterval ?? DEFAULT_CLEANUP_INTERVAL);
80
+ }
81
+ stop() {
82
+ if (this.cleanupTimer) {
83
+ clearInterval(this.cleanupTimer);
84
+ this.cleanupTimer = null;
85
+ }
86
+ }
87
+ async cleanup(fs, options) {
88
+ const files = await fs.list('/');
89
+ const now = luxon_1.DateTime.now();
90
+ const maxFileAge = options.maxFileAge ?? DEFAULT_FILE_AGE;
91
+ // s3 fills missing times with DateTime.min() - treat epoch-or-older as "no data"
92
+ const valid = (t) => !!t && t.isValid && t.toMillis() > 0;
93
+ for (const f of files) {
94
+ // per-file guard - one failing stat/rm must not abort whole sweep
95
+ try {
96
+ const stat = await fs.stat(f);
97
+ const ts = valid(stat.CreationTime) ? stat.CreationTime : stat.ModifiedTime;
98
+ if (!valid(ts)) {
99
+ continue;
100
+ }
101
+ if (now.diff(ts, 'seconds').seconds > maxFileAge) {
102
+ this.Logger.trace(`Temp file at path ${f} is older than ${maxFileAge} seconds, ( CreatedAt: ${ts.toFormat('dd/MM/yyyy HH:mm:ss')} ), deleting...`);
103
+ await fs.rm(f);
104
+ }
105
+ }
106
+ catch (err) {
107
+ this.Logger.warn(`Cleanup of temp file ${f} on fs ${fs.Name} failed: ${err.message}`);
108
+ }
109
+ }
110
+ }
111
+ };
112
+ exports.MaxAgeTempCleanupStrategy = MaxAgeTempCleanupStrategy;
113
+ exports.MaxAgeTempCleanupStrategy = MaxAgeTempCleanupStrategy = __decorate([
114
+ (0, di_1.Injectable)(TempCleanupStrategy),
115
+ (0, di_1.NewInstance)()
116
+ ], MaxAgeTempCleanupStrategy);
117
+ /**
118
+ * Same sweep as MaxAgeTempCleanupStrategy ( `maxFileAge` still applies ),
119
+ * but scheduled by cron expression from `cleanupCronExpression` option
120
+ * instead of fixed interval. Expression is required - creation fails without it.
121
+ */
122
+ let CronTempCleanupStrategy = class CronTempCleanupStrategy extends MaxAgeTempCleanupStrategy {
123
+ constructor() {
124
+ super(...arguments);
125
+ this.cronJob = null;
126
+ }
127
+ start(fs, options) {
128
+ if (!options.cleanupCronExpression) {
129
+ throw new exceptions_1.InvalidOption(`Temp filesystem ${options.name} uses CronTempCleanupStrategy but 'cleanupCronExpression' option is not set`);
130
+ }
131
+ if (options.cleanupInterval) {
132
+ this.Logger.warn(`Temp filesystem ${options.name} sets 'cleanupInterval' but CronTempCleanupStrategy ignores it, schedule is driven by 'cleanupCronExpression'`);
133
+ }
134
+ this.stop();
135
+ // CronJob ctor throws on invalid expression - wrap for a clearer error
136
+ try {
137
+ this.cronJob = new cron_1.CronJob(options.cleanupCronExpression, () => {
138
+ void this.safeCleanup(fs, options);
139
+ }, null, true);
140
+ }
141
+ catch (err) {
142
+ throw new exceptions_1.InvalidOption(`Temp filesystem ${options.name} has invalid cron expression '${options.cleanupCronExpression}': ${err.message}`);
143
+ }
144
+ }
145
+ stop() {
146
+ if (this.cronJob) {
147
+ this.cronJob.stop();
148
+ this.cronJob = null;
149
+ }
150
+ }
151
+ };
152
+ exports.CronTempCleanupStrategy = CronTempCleanupStrategy;
153
+ exports.CronTempCleanupStrategy = CronTempCleanupStrategy = __decorate([
154
+ (0, di_1.Injectable)(TempCleanupStrategy),
155
+ (0, di_1.NewInstance)()
156
+ ], CronTempCleanupStrategy);
157
+ //# sourceMappingURL=temp-cleanup-strategy.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"temp-cleanup-strategy.js","sourceRoot":"","sources":["../../src/temp-cleanup-strategy.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,59 @@
1
+ import { Log } from '@spinajs/log-common';
2
+ import { WriteStream } from 'fs';
3
+ import { PassThrough } from 'stream';
4
+ import { fs, IFsTempOptions, IStat, IZipResult } from './interfaces.js';
5
+ import { TempCleanupStrategy } from './temp-cleanup-strategy.js';
6
+ /**
7
+ * Temp filesystem. Use it for creating and storing temporary files and dirs.
8
+ *
9
+ * It is a wrapper over any other registered fs provider - all file operations are
10
+ * delegated to backend fs selected by `provider` option, so temp files can live
11
+ * on local disk, s3, ftp etc. Backend must be a registered fs provider - creation
12
+ * fails otherwise.
13
+ *
14
+ * Old files are automatically deleted by configured TempCleanupStrategy
15
+ * ( default: first level files older than `maxFileAge` seconds ).
16
+ */
17
+ export declare class fsTemp extends fs {
18
+ Options: IFsTempOptions;
19
+ protected Logger: Log;
20
+ /**
21
+ * Backend filesystem holding temp files. Registered and disposed
22
+ * independently - this wrapper does not own it.
23
+ */
24
+ protected Provider: fs;
25
+ /**
26
+ * Cleanup policy, selectable via `cleanupStrategy` option.
27
+ * Owns its own schedule ( interval, cron, ... ) via start / stop.
28
+ */
29
+ protected CleanupStrategy: TempCleanupStrategy;
30
+ get Name(): string;
31
+ constructor(Options: IFsTempOptions);
32
+ resolve(): Promise<void>;
33
+ dispose(): Promise<void>;
34
+ download(path: string): Promise<string>;
35
+ upload(srcPath: string, destPath?: string): Promise<void>;
36
+ hash(path: string, algo?: string): Promise<string>;
37
+ metadata(path: string): Promise<import("./interfaces.js").IFileInfo>;
38
+ resolvePath(path: string): string;
39
+ read(path: string, encoding?: BufferEncoding): Promise<string | Buffer>;
40
+ readStream(path: string, encoding?: BufferEncoding): Promise<NodeJS.ReadableStream>;
41
+ write(path: string, data: string | Uint8Array, encoding?: BufferEncoding): Promise<void>;
42
+ writeStream(path: string, encoding?: BufferEncoding): Promise<WriteStream | PassThrough>;
43
+ writeStream(path: string, readStream: NodeJS.ReadableStream | BufferEncoding, encoding?: BufferEncoding): Promise<WriteStream | PassThrough>;
44
+ exists(path: string): Promise<boolean>;
45
+ dirExists(path: string): Promise<boolean>;
46
+ copy(path: string, dest: string, dstFs?: fs): Promise<void>;
47
+ move(oldPath: string, newPath: string, dstFs?: fs): Promise<void>;
48
+ rename(oldPath: string, newPath: string): Promise<void>;
49
+ rm(path: string): Promise<void>;
50
+ mkdir(path: string): Promise<void>;
51
+ stat(path: string): Promise<IStat>;
52
+ list(path: string): Promise<string[]>;
53
+ tmppath(): string;
54
+ append(path: string, data: string | Uint8Array, encoding?: BufferEncoding): Promise<void>;
55
+ zip(path: string | (string | string[])[], dstFs?: fs, dstFile?: string): Promise<IZipResult>;
56
+ unzip(srcPath: string, destPath?: string, dstFs?: fs): Promise<string>;
57
+ isDir(path: string): Promise<boolean>;
58
+ }
59
+ //# sourceMappingURL=temp-provider.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"temp-provider.d.ts","sourceRoot":"","sources":["../../src/temp-provider.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,150 @@
1
+ "use strict";
2
+ var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
3
+ var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
4
+ if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
5
+ else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
6
+ return c > 3 && r && Object.defineProperty(target, key, r), r;
7
+ };
8
+ var __metadata = (this && this.__metadata) || function (k, v) {
9
+ if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
10
+ };
11
+ Object.defineProperty(exports, "__esModule", { value: true });
12
+ exports.fsTemp = void 0;
13
+ const exceptions_1 = require("@spinajs/exceptions");
14
+ const di_1 = require("@spinajs/di");
15
+ const log_common_1 = require("@spinajs/log-common");
16
+ const interfaces_js_1 = require("./interfaces.js");
17
+ const temp_cleanup_strategy_js_1 = require("./temp-cleanup-strategy.js");
18
+ /**
19
+ * Temp filesystem. Use it for creating and storing temporary files and dirs.
20
+ *
21
+ * It is a wrapper over any other registered fs provider - all file operations are
22
+ * delegated to backend fs selected by `provider` option, so temp files can live
23
+ * on local disk, s3, ftp etc. Backend must be a registered fs provider - creation
24
+ * fails otherwise.
25
+ *
26
+ * Old files are automatically deleted by configured TempCleanupStrategy
27
+ * ( default: first level files older than `maxFileAge` seconds ).
28
+ */
29
+ let fsTemp = class fsTemp extends interfaces_js_1.fs {
30
+ get Name() {
31
+ return this.Options.name;
32
+ }
33
+ constructor(Options) {
34
+ super();
35
+ this.Options = Options;
36
+ if (!this.Options) {
37
+ throw new exceptions_1.IOFail('Options for fs provider not provided, cannot create fs provider instance');
38
+ }
39
+ }
40
+ async resolve() {
41
+ await super.resolve();
42
+ if (!this.Options.provider) {
43
+ throw new di_1.ResolveException(`Temp filesystem ${this.Options.name} has no backend fs configured, set 'provider' option to name of registered fs provider`);
44
+ }
45
+ if (this.Options.provider === this.Options.name) {
46
+ throw new di_1.ResolveException(`Temp filesystem ${this.Options.name} cannot use itself as backend fs`);
47
+ }
48
+ // throws ResolveException when backend fs is not registered
49
+ this.Provider = di_1.DI.resolve('__file_provider__', [this.Options.provider]);
50
+ const strategies = di_1.DI.RootContainer.Registry.getTypes(temp_cleanup_strategy_js_1.TempCleanupStrategy);
51
+ const strategyName = this.Options.cleanupStrategy ?? temp_cleanup_strategy_js_1.MaxAgeTempCleanupStrategy.name;
52
+ const strategyType = strategies.find((x) => x.name === strategyName);
53
+ if (!strategyType) {
54
+ throw new di_1.ResolveException(`Temp cleanup strategy ${strategyName} not registered, make sure it is imported and registered in DI container`);
55
+ }
56
+ this.CleanupStrategy = await di_1.DI.resolve(strategyType);
57
+ if (!this.Options.cleanup) {
58
+ this.Logger.info(`Cleanup for temporary files system ${this.Options.name} set to false. Check configuration file if you want to automatically clenaup temporary files.`);
59
+ return;
60
+ }
61
+ this.Logger.info(`Starting cleanup for temporary files system ${this.Options.name}, backend: ${this.Options.provider}, strategy: ${strategyName}, interval: ${this.Options.cleanupInterval}, cron: ${this.Options.cleanupCronExpression}, max file age: ${this.Options.maxFileAge}`);
62
+ this.CleanupStrategy.start(this.Provider, this.Options);
63
+ }
64
+ async dispose() {
65
+ // backend fs is a separately registered provider - do not dispose it here
66
+ this.CleanupStrategy?.stop();
67
+ }
68
+ download(path) {
69
+ return this.Provider.download(path);
70
+ }
71
+ upload(srcPath, destPath) {
72
+ return this.Provider.upload(srcPath, destPath);
73
+ }
74
+ async hash(path, algo) {
75
+ return this.Provider.hash(path, algo);
76
+ }
77
+ async metadata(path) {
78
+ return this.Provider.metadata(path);
79
+ }
80
+ resolvePath(path) {
81
+ return this.Provider.resolvePath(path);
82
+ }
83
+ read(path, encoding) {
84
+ return this.Provider.read(path, encoding);
85
+ }
86
+ readStream(path, encoding) {
87
+ return this.Provider.readStream(path, encoding);
88
+ }
89
+ write(path, data, encoding) {
90
+ return this.Provider.write(path, data, encoding);
91
+ }
92
+ writeStream(path, rStream, encoding) {
93
+ return this.Provider.writeStream(path, rStream, encoding);
94
+ }
95
+ exists(path) {
96
+ return this.Provider.exists(path);
97
+ }
98
+ dirExists(path) {
99
+ return this.Provider.dirExists(path);
100
+ }
101
+ copy(path, dest, dstFs) {
102
+ return this.Provider.copy(path, dest, dstFs);
103
+ }
104
+ move(oldPath, newPath, dstFs) {
105
+ return this.Provider.move(oldPath, newPath, dstFs);
106
+ }
107
+ rename(oldPath, newPath) {
108
+ return this.Provider.rename(oldPath, newPath);
109
+ }
110
+ rm(path) {
111
+ return this.Provider.rm(path);
112
+ }
113
+ mkdir(path) {
114
+ return this.Provider.mkdir(path);
115
+ }
116
+ stat(path) {
117
+ return this.Provider.stat(path);
118
+ }
119
+ list(path) {
120
+ return this.Provider.list(path);
121
+ }
122
+ tmppath() {
123
+ return this.Provider.tmppath();
124
+ }
125
+ append(path, data, encoding) {
126
+ return this.Provider.append(path, data, encoding);
127
+ }
128
+ zip(path, dstFs, dstFile) {
129
+ // default archive destination to this temp fs, not the backend - keeps
130
+ // IZipResult.fs pointing at temp fs name and avoids hardcoded 'fs-temp' fallback
131
+ return this.Provider.zip(path, dstFs ?? this, dstFile);
132
+ }
133
+ unzip(srcPath, destPath, dstFs) {
134
+ return this.Provider.unzip(srcPath, destPath, dstFs ?? this);
135
+ }
136
+ isDir(path) {
137
+ return this.Provider.isDir(path);
138
+ }
139
+ };
140
+ exports.fsTemp = fsTemp;
141
+ __decorate([
142
+ (0, log_common_1.Logger)('fs'),
143
+ __metadata("design:type", log_common_1.Log)
144
+ ], fsTemp.prototype, "Logger", void 0);
145
+ exports.fsTemp = fsTemp = __decorate([
146
+ (0, di_1.Injectable)('fs'),
147
+ (0, di_1.PerInstanceCheck)(),
148
+ __metadata("design:paramtypes", [Object])
149
+ ], fsTemp);
150
+ //# sourceMappingURL=temp-provider.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"temp-provider.js","sourceRoot":"","sources":["../../src/temp-provider.ts"],"names":[],"mappings":";;;;;;;;;;;;AAAA,oDAA6C;AAC7C,oCAAiF;AACjF,oDAAkD;AAGlD,mDAAwE;AACxE,yEAA4F;AAE5F;;;;;;;;;;GAUG;AAGI,IAAM,MAAM,GAAZ,MAAM,MAAO,SAAQ,kBAAE;IAgB5B,IAAW,IAAI;QACb,OAAO,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC;IAC3B,CAAC;IAED,YAAmB,OAAuB;QACxC,KAAK,EAAE,CAAC;QADS,YAAO,GAAP,OAAO,CAAgB;QAGxC,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,CAAC;YAClB,MAAM,IAAI,mBAAM,CAAC,0EAA0E,CAAC,CAAC;QAC/F,CAAC;IACH,CAAC;IAEM,KAAK,CAAC,OAAO;QAClB,MAAM,KAAK,CAAC,OAAO,EAAE,CAAC;QAEtB,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,QAAQ,EAAE,CAAC;YAC3B,MAAM,IAAI,qBAAgB,CACxB,mBAAmB,IAAI,CAAC,OAAO,CAAC,IAAI,wFAAwF,CAC7H,CAAC;QACJ,CAAC;QAED,IAAI,IAAI,CAAC,OAAO,CAAC,QAAQ,KAAK,IAAI,CAAC,OAAO,CAAC,IAAI,EAAE,CAAC;YAChD,MAAM,IAAI,qBAAgB,CAAC,mBAAmB,IAAI,CAAC,OAAO,CAAC,IAAI,kCAAkC,CAAC,CAAC;QACrG,CAAC;QAED,4DAA4D;QAC5D,IAAI,CAAC,QAAQ,GAAG,OAAE,CAAC,OAAO,CAAK,mBAAmB,EAAE,CAAC,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC,CAAC;QAE7E,MAAM,UAAU,GAAG,OAAE,CAAC,aAAa,CAAC,QAAQ,CAAC,QAAQ,CAAC,8CAAmB,CAAC,CAAC;QAC3E,MAAM,YAAY,GAAG,IAAI,CAAC,OAAO,CAAC,eAAe,IAAI,oDAAyB,CAAC,IAAI,CAAC;QACpF,MAAM,YAAY,GAAG,UAAU,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,YAAY,CAAC,CAAC;QAErE,IAAI,CAAC,YAAY,EAAE,CAAC;YAClB,MAAM,IAAI,qBAAgB,CACxB,yBAAyB,YAAY,0EAA0E,CAChH,CAAC;QACJ,CAAC;QAED,IAAI,CAAC,eAAe,GAAG,MAAM,OAAE,CAAC,OAAO,CAAsB,YAAY,CAAC,CAAC;QAE3E,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,OAAO,EAAE,CAAC;YAC1B,IAAI,CAAC,MAAM,CAAC,IAAI,CACd,sCAAsC,IAAI,CAAC,OAAO,CAAC,IAAI,+FAA+F,CACvJ,CAAC;YACF,OAAO;QACT,CAAC;QAED,IAAI,CAAC,MAAM,CAAC,IAAI,CACd,+CAA+C,IAAI,CAAC,OAAO,CAAC,IAAI,cAAc,IAAI,CAAC,OAAO,CAAC,QAAQ,eAAe,YAAY,eAAe,IAAI,CAAC,OAAO,CAAC,eAAe,WAAW,IAAI,CAAC,OAAO,CAAC,qBAAqB,mBAAmB,IAAI,CAAC,OAAO,CAAC,UAAU,EAAE,CACnQ,CAAC;QAEF,IAAI,CAAC,eAAe,CAAC,KAAK,CAAC,IAAI,CAAC,QAAQ,EAAE,IAAI,CAAC,OAAO,CAAC,CAAC;IAC1D,CAAC;IAEM,KAAK,CAAC,OAAO;QAClB,0EAA0E;QAC1E,IAAI,CAAC,eAAe,EAAE,IAAI,EAAE,CAAC;IAC/B,CAAC;IAEM,QAAQ,CAAC,IAAY;QAC1B,OAAO,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC;IACtC,CAAC;IAEM,MAAM,CAAC,OAAe,EAAE,QAAiB;QAC9C,OAAO,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,OAAO,EAAE,QAAQ,CAAC,CAAC;IACjD,CAAC;IAEM,KAAK,CAAC,IAAI,CAAC,IAAY,EAAE,IAAa;QAC3C,OAAO,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC;IACxC,CAAC;IAEM,KAAK,CAAC,QAAQ,CAAC,IAAY;QAChC,OAAO,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC;IACtC,CAAC;IAEM,WAAW,CAAC,IAAY;QAC7B,OAAO,IAAI,CAAC,QAAQ,CAAC,WAAW,CAAC,IAAI,CAAC,CAAC;IACzC,CAAC;IAEM,IAAI,CAAC,IAAY,EAAE,QAAyB;QACjD,OAAO,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,IAAI,EAAE,QAAQ,CAAC,CAAC;IAC5C,CAAC;IAEM,UAAU,CAAC,IAAY,EAAE,QAAyB;QACvD,OAAO,IAAI,CAAC,QAAQ,CAAC,UAAU,CAAC,IAAI,EAAE,QAAQ,CAAC,CAAC;IAClD,CAAC;IAEM,KAAK,CAAC,IAAY,EAAE,IAAyB,EAAE,QAAyB;QAC7E,OAAO,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC,IAAI,EAAE,IAAI,EAAE,QAAQ,CAAC,CAAC;IACnD,CAAC;IAQM,WAAW,CAChB,IAAY,EACZ,OAAgD,EAChD,QAAyB;QAEzB,OAAO,IAAI,CAAC,QAAQ,CAAC,WAAW,CAAC,IAAI,EAAE,OAAiD,EAAE,QAAQ,CAAC,CAAC;IACtG,CAAC;IAEM,MAAM,CAAC,IAAY;QACxB,OAAO,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;IACpC,CAAC;IAEM,SAAS,CAAC,IAAY;QAC3B,OAAO,IAAI,CAAC,QAAQ,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC;IACvC,CAAC;IAEM,IAAI,CAAC,IAAY,EAAE,IAAY,EAAE,KAAU;QAChD,OAAO,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,IAAI,EAAE,IAAI,EAAE,KAAK,CAAC,CAAC;IAC/C,CAAC;IAEM,IAAI,CAAC,OAAe,EAAE,OAAe,EAAE,KAAU;QACtD,OAAO,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,OAAO,EAAE,OAAO,EAAE,KAAK,CAAC,CAAC;IACrD,CAAC;IAEM,MAAM,CAAC,OAAe,EAAE,OAAe;QAC5C,OAAO,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;IAChD,CAAC;IAEM,EAAE,CAAC,IAAY;QACpB,OAAO,IAAI,CAAC,QAAQ,CAAC,EAAE,CAAC,IAAI,CAAC,CAAC;IAChC,CAAC;IAEM,KAAK,CAAC,IAAY;QACvB,OAAO,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;IACnC,CAAC;IAEM,IAAI,CAAC,IAAY;QACtB,OAAO,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAClC,CAAC;IAEM,IAAI,CAAC,IAAY;QACtB,OAAO,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAClC,CAAC;IAEM,OAAO;QACZ,OAAO,IAAI,CAAC,QAAQ,CAAC,OAAO,EAAE,CAAC;IACjC,CAAC;IAEM,MAAM,CAAC,IAAY,EAAE,IAAyB,EAAE,QAAyB;QAC9E,OAAO,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,IAAI,EAAE,IAAI,EAAE,QAAQ,CAAC,CAAC;IACpD,CAAC;IAEM,GAAG,CAAC,IAAoC,EAAE,KAAU,EAAE,OAAgB;QAC3E,uEAAuE;QACvE,iFAAiF;QACjF,OAAO,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,IAAI,EAAE,KAAK,IAAI,IAAI,EAAE,OAAO,CAAC,CAAC;IACzD,CAAC;IAEM,KAAK,CAAC,OAAe,EAAE,QAAiB,EAAE,KAAU;QACzD,OAAO,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC,OAAO,EAAE,QAAQ,EAAE,KAAK,IAAI,IAAI,CAAC,CAAC;IAC/D,CAAC;IAEM,KAAK,CAAC,IAAY;QACvB,OAAO,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;IACnC,CAAC;CACF,CAAA;AAlLY,wBAAM;AAEP;IADT,IAAA,mBAAM,EAAC,IAAI,CAAC;8BACK,gBAAG;sCAAC;iBAFX,MAAM;IAFlB,IAAA,eAAU,EAAC,IAAI,CAAC;IAChB,IAAA,qBAAgB,GAAE;;GACN,MAAM,CAkLlB"}
@@ -0,0 +1,11 @@
1
+ import { CliCommand } from '@spinajs/cli';
2
+ import { Log } from '@spinajs/log-common';
3
+ interface CatOptions {
4
+ encoding: BufferEncoding;
5
+ }
6
+ export declare class FsCatCommand extends CliCommand {
7
+ protected Log: Log;
8
+ execute(fsName: string, path: string, options: CatOptions): Promise<void>;
9
+ }
10
+ export {};
11
+ //# sourceMappingURL=cat.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cat.d.ts","sourceRoot":"","sources":["../../../src/cli/cat.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAA6B,MAAM,cAAc,CAAC;AACrE,OAAO,EAAU,GAAG,EAAE,MAAM,qBAAqB,CAAC;AAIlD,UAAU,UAAU;IAClB,QAAQ,EAAE,cAAc,CAAC;CAC1B;AAED,qBAIa,YAAa,SAAQ,UAAU;IAE1C,SAAS,CAAC,GAAG,EAAE,GAAG,CAAC;IAEN,OAAO,CAAC,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,UAAU,GAAG,OAAO,CAAC,IAAI,CAAC;CAUvF"}
@@ -0,0 +1,37 @@
1
+ var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
2
+ var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
3
+ if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
4
+ else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
5
+ return c > 3 && r && Object.defineProperty(target, key, r), r;
6
+ };
7
+ var __metadata = (this && this.__metadata) || function (k, v) {
8
+ if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
9
+ };
10
+ import { CliCommand, Command, Argument, Option } from '@spinajs/cli';
11
+ import { Logger, Log } from '@spinajs/log-common';
12
+ import { _read } from '../fp.js';
13
+ import { ensureProviders } from './fs.js';
14
+ let FsCatCommand = class FsCatCommand extends CliCommand {
15
+ async execute(fsName, path, options) {
16
+ await ensureProviders();
17
+ try {
18
+ const content = await _read(path, options.encoding, fsName);
19
+ this.Log.info(content.toString());
20
+ }
21
+ catch (err) {
22
+ this.Log.error(`Cannot read ${path} on ${fsName}: ${err.message}`);
23
+ }
24
+ }
25
+ };
26
+ __decorate([
27
+ Logger('fs'),
28
+ __metadata("design:type", Log)
29
+ ], FsCatCommand.prototype, "Log", void 0);
30
+ FsCatCommand = __decorate([
31
+ Command('fs-cat', 'Prints content of a file to the console'),
32
+ Argument('fs', true, 'Name of filesystem to use'),
33
+ Argument('path', true, 'Path to file ( relative to selected fs base dir )'),
34
+ Option('-e, --encoding <encoding>', false, 'Encoding used to read the file', 'utf-8')
35
+ ], FsCatCommand);
36
+ export { FsCatCommand };
37
+ //# sourceMappingURL=cat.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cat.js","sourceRoot":"","sources":["../../../src/cli/cat.ts"],"names":[],"mappings":";;;;;;;;;AAAA,OAAO,EAAE,UAAU,EAAE,OAAO,EAAE,QAAQ,EAAE,MAAM,EAAE,MAAM,cAAc,CAAC;AACrE,OAAO,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,qBAAqB,CAAC;AAClD,OAAO,EAAE,KAAK,EAAE,MAAM,UAAU,CAAC;AACjC,OAAO,EAAE,eAAe,EAAE,MAAM,SAAS,CAAC;AAUnC,IAAM,YAAY,GAAlB,MAAM,YAAa,SAAQ,UAAU;IAInC,KAAK,CAAC,OAAO,CAAC,MAAc,EAAE,IAAY,EAAE,OAAmB;QACpE,MAAM,eAAe,EAAE,CAAC;QAExB,IAAI,CAAC;YACH,MAAM,OAAO,GAAG,MAAM,KAAK,CAAC,IAAI,EAAE,OAAO,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAC;YAC5D,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,OAAO,CAAC,QAAQ,EAAE,CAAC,CAAC;QACpC,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,eAAe,IAAI,OAAO,MAAM,KAAK,GAAG,CAAC,OAAO,EAAE,CAAC,CAAC;QACrE,CAAC;IACH,CAAC;CACF,CAAA;AAZW;IADT,MAAM,CAAC,IAAI,CAAC;8BACE,GAAG;yCAAC;AAFR,YAAY;IAJxB,OAAO,CAAC,QAAQ,EAAE,yCAAyC,CAAC;IAC5D,QAAQ,CAAC,IAAI,EAAE,IAAI,EAAE,2BAA2B,CAAC;IACjD,QAAQ,CAAC,MAAM,EAAE,IAAI,EAAE,mDAAmD,CAAC;IAC3E,MAAM,CAAC,2BAA2B,EAAE,KAAK,EAAE,gCAAgC,EAAE,OAAO,CAAC;GACzE,YAAY,CAcxB"}
@@ -0,0 +1,11 @@
1
+ import { CliCommand } from '@spinajs/cli';
2
+ import { Log } from '@spinajs/log-common';
3
+ interface CpOptions {
4
+ dstFs?: string;
5
+ }
6
+ export declare class FsCpCommand extends CliCommand {
7
+ protected Log: Log;
8
+ execute(fsName: string, src: string, dst: string, options: CpOptions): Promise<void>;
9
+ }
10
+ export {};
11
+ //# sourceMappingURL=cp.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cp.d.ts","sourceRoot":"","sources":["../../../src/cli/cp.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAA6B,MAAM,cAAc,CAAC;AACrE,OAAO,EAAU,GAAG,EAAE,MAAM,qBAAqB,CAAC;AAIlD,UAAU,SAAS;IACjB,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED,qBAKa,WAAY,SAAQ,UAAU;IAEzC,SAAS,CAAC,GAAG,EAAE,GAAG,CAAC;IAEN,OAAO,CAAC,MAAM,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,EAAE,OAAO,EAAE,SAAS,GAAG,OAAO,CAAC,IAAI,CAAC;CAUlG"}
@@ -0,0 +1,38 @@
1
+ var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
2
+ var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
3
+ if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
4
+ else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
5
+ return c > 3 && r && Object.defineProperty(target, key, r), r;
6
+ };
7
+ var __metadata = (this && this.__metadata) || function (k, v) {
8
+ if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
9
+ };
10
+ import { CliCommand, Command, Argument, Option } from '@spinajs/cli';
11
+ import { Logger, Log } from '@spinajs/log-common';
12
+ import { _copy } from '../fp.js';
13
+ import { ensureProviders } from './fs.js';
14
+ let FsCpCommand = class FsCpCommand extends CliCommand {
15
+ async execute(fsName, src, dst, options) {
16
+ await ensureProviders();
17
+ try {
18
+ await _copy(src, dst, fsName, options.dstFs);
19
+ this.Log.success(`Copied ${src} ( ${fsName} ) -> ${dst} ( ${options.dstFs ?? fsName} )`);
20
+ }
21
+ catch (err) {
22
+ this.Log.error(`Cannot copy ${src}: ${err.message}`);
23
+ }
24
+ }
25
+ };
26
+ __decorate([
27
+ Logger('fs'),
28
+ __metadata("design:type", Log)
29
+ ], FsCpCommand.prototype, "Log", void 0);
30
+ FsCpCommand = __decorate([
31
+ Command('fs-cp', 'Copies a file or directory, optionally between filesystems'),
32
+ Argument('fs', true, 'Source filesystem name'),
33
+ Argument('src', true, 'Source path ( relative to source fs )'),
34
+ Argument('dst', true, 'Destination path'),
35
+ Option('-d, --dst-fs <dstFs>', false, 'Destination filesystem name ( defaults to source fs )')
36
+ ], FsCpCommand);
37
+ export { FsCpCommand };
38
+ //# sourceMappingURL=cp.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cp.js","sourceRoot":"","sources":["../../../src/cli/cp.ts"],"names":[],"mappings":";;;;;;;;;AAAA,OAAO,EAAE,UAAU,EAAE,OAAO,EAAE,QAAQ,EAAE,MAAM,EAAE,MAAM,cAAc,CAAC;AACrE,OAAO,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,qBAAqB,CAAC;AAClD,OAAO,EAAE,KAAK,EAAE,MAAM,UAAU,CAAC;AACjC,OAAO,EAAE,eAAe,EAAE,MAAM,SAAS,CAAC;AAWnC,IAAM,WAAW,GAAjB,MAAM,WAAY,SAAQ,UAAU;IAIlC,KAAK,CAAC,OAAO,CAAC,MAAc,EAAE,GAAW,EAAE,GAAW,EAAE,OAAkB;QAC/E,MAAM,eAAe,EAAE,CAAC;QAExB,IAAI,CAAC;YACH,MAAM,KAAK,CAAC,GAAG,EAAE,GAAG,EAAE,MAAM,EAAE,OAAO,CAAC,KAAK,CAAC,CAAC;YAC7C,IAAI,CAAC,GAAG,CAAC,OAAO,CAAC,UAAU,GAAG,MAAM,MAAM,SAAS,GAAG,MAAM,OAAO,CAAC,KAAK,IAAI,MAAM,IAAI,CAAC,CAAC;QAC3F,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,eAAe,GAAG,KAAK,GAAG,CAAC,OAAO,EAAE,CAAC,CAAC;QACvD,CAAC;IACH,CAAC;CACF,CAAA;AAZW;IADT,MAAM,CAAC,IAAI,CAAC;8BACE,GAAG;wCAAC;AAFR,WAAW;IALvB,OAAO,CAAC,OAAO,EAAE,4DAA4D,CAAC;IAC9E,QAAQ,CAAC,IAAI,EAAE,IAAI,EAAE,wBAAwB,CAAC;IAC9C,QAAQ,CAAC,KAAK,EAAE,IAAI,EAAE,uCAAuC,CAAC;IAC9D,QAAQ,CAAC,KAAK,EAAE,IAAI,EAAE,kBAAkB,CAAC;IACzC,MAAM,CAAC,sBAAsB,EAAE,KAAK,EAAE,uDAAuD,CAAC;GAClF,WAAW,CAcvB"}
@@ -0,0 +1,7 @@
1
+ import { CliCommand } from '@spinajs/cli';
2
+ import { Log } from '@spinajs/log-common';
3
+ export declare class FsDownloadCommand extends CliCommand {
4
+ protected Log: Log;
5
+ execute(fsName: string, path: string): Promise<void>;
6
+ }
7
+ //# sourceMappingURL=download.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"download.d.ts","sourceRoot":"","sources":["../../../src/cli/download.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAqB,MAAM,cAAc,CAAC;AAC7D,OAAO,EAAU,GAAG,EAAE,MAAM,qBAAqB,CAAC;AAIlD,qBAGa,iBAAkB,SAAQ,UAAU;IAE/C,SAAS,CAAC,GAAG,EAAE,GAAG,CAAC;IAEN,OAAO,CAAC,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;CAUlE"}
@@ -0,0 +1,36 @@
1
+ var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
2
+ var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
3
+ if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
4
+ else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
5
+ return c > 3 && r && Object.defineProperty(target, key, r), r;
6
+ };
7
+ var __metadata = (this && this.__metadata) || function (k, v) {
8
+ if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
9
+ };
10
+ import { CliCommand, Command, Argument } from '@spinajs/cli';
11
+ import { Logger, Log } from '@spinajs/log-common';
12
+ import { _download } from '../fp.js';
13
+ import { ensureProviders } from './fs.js';
14
+ let FsDownloadCommand = class FsDownloadCommand extends CliCommand {
15
+ async execute(fsName, path) {
16
+ await ensureProviders();
17
+ try {
18
+ const local = await _download(path, fsName);
19
+ this.Log.success(`Downloaded ${path} ( fs: ${fsName} ) -> ${local}`);
20
+ }
21
+ catch (err) {
22
+ this.Log.error(`Cannot download ${path} from ${fsName}: ${err.message}`);
23
+ }
24
+ }
25
+ };
26
+ __decorate([
27
+ Logger('fs'),
28
+ __metadata("design:type", Log)
29
+ ], FsDownloadCommand.prototype, "Log", void 0);
30
+ FsDownloadCommand = __decorate([
31
+ Command('fs-download', 'Downloads a file to local storage and prints the local path'),
32
+ Argument('fs', true, 'Name of filesystem to use'),
33
+ Argument('path', true, 'Path to file ( relative to selected fs base dir )')
34
+ ], FsDownloadCommand);
35
+ export { FsDownloadCommand };
36
+ //# sourceMappingURL=download.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"download.js","sourceRoot":"","sources":["../../../src/cli/download.ts"],"names":[],"mappings":";;;;;;;;;AAAA,OAAO,EAAE,UAAU,EAAE,OAAO,EAAE,QAAQ,EAAE,MAAM,cAAc,CAAC;AAC7D,OAAO,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,qBAAqB,CAAC;AAClD,OAAO,EAAE,SAAS,EAAE,MAAM,UAAU,CAAC;AACrC,OAAO,EAAE,eAAe,EAAE,MAAM,SAAS,CAAC;AAKnC,IAAM,iBAAiB,GAAvB,MAAM,iBAAkB,SAAQ,UAAU;IAIxC,KAAK,CAAC,OAAO,CAAC,MAAc,EAAE,IAAY;QAC/C,MAAM,eAAe,EAAE,CAAC;QAExB,IAAI,CAAC;YACH,MAAM,KAAK,GAAG,MAAM,SAAS,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC;YAC5C,IAAI,CAAC,GAAG,CAAC,OAAO,CAAC,cAAc,IAAI,UAAU,MAAM,SAAS,KAAK,EAAE,CAAC,CAAC;QACvE,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,mBAAmB,IAAI,SAAS,MAAM,KAAK,GAAG,CAAC,OAAO,EAAE,CAAC,CAAC;QAC3E,CAAC;IACH,CAAC;CACF,CAAA;AAZW;IADT,MAAM,CAAC,IAAI,CAAC;8BACE,GAAG;8CAAC;AAFR,iBAAiB;IAH7B,OAAO,CAAC,aAAa,EAAE,6DAA6D,CAAC;IACrF,QAAQ,CAAC,IAAI,EAAE,IAAI,EAAE,2BAA2B,CAAC;IACjD,QAAQ,CAAC,MAAM,EAAE,IAAI,EAAE,mDAAmD,CAAC;GAC/D,iBAAiB,CAc7B"}