@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.
- package/lib/cjs/cli/cat.d.ts +11 -0
- package/lib/cjs/cli/cat.d.ts.map +1 -0
- package/lib/cjs/cli/cat.js +40 -0
- package/lib/cjs/cli/cat.js.map +1 -0
- package/lib/cjs/cli/cp.d.ts +11 -0
- package/lib/cjs/cli/cp.d.ts.map +1 -0
- package/lib/cjs/cli/cp.js +41 -0
- package/lib/cjs/cli/cp.js.map +1 -0
- package/lib/cjs/cli/download.d.ts +7 -0
- package/lib/cjs/cli/download.d.ts.map +1 -0
- package/lib/cjs/cli/download.js +39 -0
- package/lib/cjs/cli/download.js.map +1 -0
- package/lib/cjs/cli/exists.d.ts +7 -0
- package/lib/cjs/cli/exists.d.ts.map +1 -0
- package/lib/cjs/cli/exists.js +39 -0
- package/lib/cjs/cli/exists.js.map +1 -0
- package/lib/cjs/cli/fs.d.ts +11 -0
- package/lib/cjs/cli/fs.d.ts.map +1 -1
- package/lib/cjs/cli/fs.js +47 -21
- package/lib/cjs/cli/fs.js.map +1 -1
- package/lib/cjs/cli/hash.d.ts +11 -0
- package/lib/cjs/cli/hash.d.ts.map +1 -0
- package/lib/cjs/cli/hash.js +40 -0
- package/lib/cjs/cli/hash.js.map +1 -0
- package/lib/cjs/cli/info.d.ts +7 -0
- package/lib/cjs/cli/info.d.ts.map +1 -0
- package/lib/cjs/cli/info.js +45 -0
- package/lib/cjs/cli/info.js.map +1 -0
- package/lib/cjs/cli/ls.d.ts +7 -0
- package/lib/cjs/cli/ls.d.ts.map +1 -0
- package/lib/cjs/cli/ls.js +40 -0
- package/lib/cjs/cli/ls.js.map +1 -0
- package/lib/cjs/cli/mkdir.d.ts +7 -0
- package/lib/cjs/cli/mkdir.d.ts.map +1 -0
- package/lib/cjs/cli/mkdir.js +39 -0
- package/lib/cjs/cli/mkdir.js.map +1 -0
- package/lib/cjs/cli/mv.d.ts +11 -0
- package/lib/cjs/cli/mv.d.ts.map +1 -0
- package/lib/cjs/cli/mv.js +41 -0
- package/lib/cjs/cli/mv.js.map +1 -0
- package/lib/cjs/cli/rm.d.ts +1 -6
- package/lib/cjs/cli/rm.d.ts.map +1 -1
- package/lib/cjs/cli/rm.js +14 -4
- package/lib/cjs/cli/rm.js.map +1 -1
- package/lib/cjs/cli/stat.d.ts +1 -5
- package/lib/cjs/cli/stat.d.ts.map +1 -1
- package/lib/cjs/cli/stat.js +20 -3
- package/lib/cjs/cli/stat.js.map +1 -1
- package/lib/cjs/cli/unzip.d.ts +11 -0
- package/lib/cjs/cli/unzip.d.ts.map +1 -0
- package/lib/cjs/cli/unzip.js +47 -0
- package/lib/cjs/cli/unzip.js.map +1 -0
- package/lib/cjs/cli/upload.d.ts +7 -0
- package/lib/cjs/cli/upload.d.ts.map +1 -0
- package/lib/cjs/cli/upload.js +40 -0
- package/lib/cjs/cli/upload.js.map +1 -0
- package/lib/cjs/cli/write.d.ts +13 -0
- package/lib/cjs/cli/write.d.ts.map +1 -0
- package/lib/cjs/cli/write.js +54 -0
- package/lib/cjs/cli/write.js.map +1 -0
- package/lib/cjs/cli/zip.d.ts +12 -0
- package/lib/cjs/cli/zip.d.ts.map +1 -0
- package/lib/cjs/cli/zip.js +51 -0
- package/lib/cjs/cli/zip.js.map +1 -0
- package/lib/cjs/config/fs.d.ts +9 -0
- package/lib/cjs/config/fs.d.ts.map +1 -0
- package/lib/cjs/config/fs.js +22 -0
- package/lib/cjs/config/fs.js.map +1 -0
- package/lib/cjs/file-hasher.d.ts +85 -5
- package/lib/cjs/file-hasher.d.ts.map +1 -1
- package/lib/cjs/file-hasher.js +106 -14
- package/lib/cjs/file-hasher.js.map +1 -1
- package/lib/cjs/file-info.d.ts +94 -5
- package/lib/cjs/file-info.d.ts.map +1 -1
- package/lib/cjs/file-info.js +267 -73
- package/lib/cjs/file-info.js.map +1 -1
- package/lib/cjs/fp.d.ts +80 -2
- package/lib/cjs/fp.d.ts.map +1 -1
- package/lib/cjs/fp.js +149 -3
- package/lib/cjs/fp.js.map +1 -1
- package/lib/cjs/index.d.ts +2 -1
- package/lib/cjs/index.d.ts.map +1 -1
- package/lib/cjs/index.js +7 -2
- package/lib/cjs/index.js.map +1 -1
- package/lib/cjs/interfaces.d.ts +89 -12
- package/lib/cjs/interfaces.d.ts.map +1 -1
- package/lib/cjs/interfaces.js +13 -13
- package/lib/cjs/interfaces.js.map +1 -1
- package/lib/cjs/local-provider.d.ts +51 -6
- package/lib/cjs/local-provider.d.ts.map +1 -1
- package/lib/cjs/local-provider.js +254 -76
- package/lib/cjs/local-provider.js.map +1 -1
- package/lib/cjs/temp-cleanup-strategy.d.ts +70 -0
- package/lib/cjs/temp-cleanup-strategy.d.ts.map +1 -0
- package/lib/cjs/temp-cleanup-strategy.js +157 -0
- package/lib/cjs/temp-cleanup-strategy.js.map +1 -0
- package/lib/cjs/temp-provider.d.ts +59 -0
- package/lib/cjs/temp-provider.d.ts.map +1 -0
- package/lib/cjs/temp-provider.js +150 -0
- package/lib/cjs/temp-provider.js.map +1 -0
- package/lib/mjs/cli/cat.d.ts +11 -0
- package/lib/mjs/cli/cat.d.ts.map +1 -0
- package/lib/mjs/cli/cat.js +37 -0
- package/lib/mjs/cli/cat.js.map +1 -0
- package/lib/mjs/cli/cp.d.ts +11 -0
- package/lib/mjs/cli/cp.d.ts.map +1 -0
- package/lib/mjs/cli/cp.js +38 -0
- package/lib/mjs/cli/cp.js.map +1 -0
- package/lib/mjs/cli/download.d.ts +7 -0
- package/lib/mjs/cli/download.d.ts.map +1 -0
- package/lib/mjs/cli/download.js +36 -0
- package/lib/mjs/cli/download.js.map +1 -0
- package/lib/mjs/cli/exists.d.ts +7 -0
- package/lib/mjs/cli/exists.d.ts.map +1 -0
- package/lib/mjs/cli/exists.js +36 -0
- package/lib/mjs/cli/exists.js.map +1 -0
- package/lib/mjs/cli/fs.d.ts +11 -1
- package/lib/mjs/cli/fs.d.ts.map +1 -1
- package/lib/mjs/cli/fs.js +43 -22
- package/lib/mjs/cli/fs.js.map +1 -1
- package/lib/mjs/cli/hash.d.ts +11 -0
- package/lib/mjs/cli/hash.d.ts.map +1 -0
- package/lib/mjs/cli/hash.js +37 -0
- package/lib/mjs/cli/hash.js.map +1 -0
- package/lib/mjs/cli/info.d.ts +7 -0
- package/lib/mjs/cli/info.d.ts.map +1 -0
- package/lib/mjs/cli/info.js +42 -0
- package/lib/mjs/cli/info.js.map +1 -0
- package/lib/mjs/cli/ls.d.ts +7 -0
- package/lib/mjs/cli/ls.d.ts.map +1 -0
- package/lib/mjs/cli/ls.js +37 -0
- package/lib/mjs/cli/ls.js.map +1 -0
- package/lib/mjs/cli/mkdir.d.ts +7 -0
- package/lib/mjs/cli/mkdir.d.ts.map +1 -0
- package/lib/mjs/cli/mkdir.js +36 -0
- package/lib/mjs/cli/mkdir.js.map +1 -0
- package/lib/mjs/cli/mv.d.ts +11 -0
- package/lib/mjs/cli/mv.d.ts.map +1 -0
- package/lib/mjs/cli/mv.js +38 -0
- package/lib/mjs/cli/mv.js.map +1 -0
- package/lib/mjs/cli/rm.d.ts +1 -6
- package/lib/mjs/cli/rm.d.ts.map +1 -1
- package/lib/mjs/cli/rm.js +15 -5
- package/lib/mjs/cli/rm.js.map +1 -1
- package/lib/mjs/cli/stat.d.ts +1 -5
- package/lib/mjs/cli/stat.d.ts.map +1 -1
- package/lib/mjs/cli/stat.js +21 -4
- package/lib/mjs/cli/stat.js.map +1 -1
- package/lib/mjs/cli/unzip.d.ts +11 -0
- package/lib/mjs/cli/unzip.d.ts.map +1 -0
- package/lib/mjs/cli/unzip.js +44 -0
- package/lib/mjs/cli/unzip.js.map +1 -0
- package/lib/mjs/cli/upload.d.ts +7 -0
- package/lib/mjs/cli/upload.d.ts.map +1 -0
- package/lib/mjs/cli/upload.js +37 -0
- package/lib/mjs/cli/upload.js.map +1 -0
- package/lib/mjs/cli/write.d.ts +13 -0
- package/lib/mjs/cli/write.d.ts.map +1 -0
- package/lib/mjs/cli/write.js +51 -0
- package/lib/mjs/cli/write.js.map +1 -0
- package/lib/mjs/cli/zip.d.ts +12 -0
- package/lib/mjs/cli/zip.d.ts.map +1 -0
- package/lib/mjs/cli/zip.js +48 -0
- package/lib/mjs/cli/zip.js.map +1 -0
- package/lib/mjs/config/fs.d.ts +9 -0
- package/lib/mjs/config/fs.d.ts.map +1 -0
- package/lib/mjs/config/fs.js +20 -0
- package/lib/mjs/config/fs.js.map +1 -0
- package/lib/mjs/file-hasher.d.ts +85 -5
- package/lib/mjs/file-hasher.d.ts.map +1 -1
- package/lib/mjs/file-hasher.js +106 -14
- package/lib/mjs/file-hasher.js.map +1 -1
- package/lib/mjs/file-info.d.ts +94 -5
- package/lib/mjs/file-info.d.ts.map +1 -1
- package/lib/mjs/file-info.js +233 -73
- package/lib/mjs/file-info.js.map +1 -1
- package/lib/mjs/fp.d.ts +80 -2
- package/lib/mjs/fp.d.ts.map +1 -1
- package/lib/mjs/fp.js +135 -4
- package/lib/mjs/fp.js.map +1 -1
- package/lib/mjs/index.d.ts +2 -1
- package/lib/mjs/index.d.ts.map +1 -1
- package/lib/mjs/index.js +8 -3
- package/lib/mjs/index.js.map +1 -1
- package/lib/mjs/interfaces.d.ts +89 -12
- package/lib/mjs/interfaces.d.ts.map +1 -1
- package/lib/mjs/interfaces.js +13 -13
- package/lib/mjs/interfaces.js.map +1 -1
- package/lib/mjs/local-provider.d.ts +51 -6
- package/lib/mjs/local-provider.d.ts.map +1 -1
- package/lib/mjs/local-provider.js +257 -79
- package/lib/mjs/local-provider.js.map +1 -1
- package/lib/mjs/temp-cleanup-strategy.d.ts +70 -0
- package/lib/mjs/temp-cleanup-strategy.d.ts.map +1 -0
- package/lib/mjs/temp-cleanup-strategy.js +153 -0
- package/lib/mjs/temp-cleanup-strategy.js.map +1 -0
- package/lib/mjs/temp-provider.d.ts +59 -0
- package/lib/mjs/temp-provider.d.ts.map +1 -0
- package/lib/mjs/temp-provider.js +147 -0
- package/lib/mjs/temp-provider.js.map +1 -0
- package/lib/tsconfig.cjs.tsbuildinfo +1 -1
- package/lib/tsconfig.mjs.tsbuildinfo +1 -1
- package/package.json +12 -6
- package/lib/cjs/local-temp-provider.d.ts +0 -18
- package/lib/cjs/local-temp-provider.d.ts.map +0 -1
- package/lib/cjs/local-temp-provider.js +0 -63
- package/lib/cjs/local-temp-provider.js.map +0 -1
- package/lib/mjs/local-temp-provider.d.ts +0 -18
- package/lib/mjs/local-temp-provider.d.ts.map +0 -1
- package/lib/mjs/local-temp-provider.js +0 -60
- 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"}
|