build-raptor 0.131.0 → 0.133.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/deps/brand/brand.d.ts +5 -0
- package/dist/deps/brand/brand.js +3 -0
- package/dist/deps/brand/index.d.ts +1 -0
- package/dist/deps/brand/index.js +18 -0
- package/dist/deps/build-failed-error/build-failed-error.d.ts +14 -0
- package/dist/deps/build-failed-error/build-failed-error.js +13 -0
- package/dist/deps/build-failed-error/index.d.ts +1 -0
- package/dist/deps/build-failed-error/index.js +18 -0
- package/dist/deps/build-raptor-api/build-raptor-api.d.ts +351 -0
- package/dist/deps/build-raptor-api/build-raptor-api.js +132 -0
- package/dist/deps/build-raptor-api/index.d.ts +2 -0
- package/dist/deps/build-raptor-api/index.js +19 -0
- package/dist/deps/build-raptor-api/step-by-step-processor.d.ts +35 -0
- package/dist/deps/build-raptor-api/step-by-step-processor.js +3 -0
- package/dist/deps/build-raptor-core/breakdown.d.ts +18 -0
- package/dist/deps/build-raptor-core/breakdown.js +99 -0
- package/dist/deps/build-raptor-core/build-raptor-config.d.ts +21 -0
- package/dist/deps/build-raptor-core/build-raptor-config.js +25 -0
- package/dist/deps/build-raptor-core/default-asset-publisher.d.ts +10 -0
- package/dist/deps/build-raptor-core/default-asset-publisher.js +16 -0
- package/dist/deps/build-raptor-core/engine-bootstrapper.d.ts +50 -0
- package/dist/deps/build-raptor-core/engine-bootstrapper.js +200 -0
- package/dist/deps/build-raptor-core/engine-event-scheme.d.ts +20 -0
- package/dist/deps/build-raptor-core/engine-event-scheme.js +3 -0
- package/dist/deps/build-raptor-core/engine.d.ts +66 -0
- package/dist/deps/build-raptor-core/engine.js +285 -0
- package/dist/deps/build-raptor-core/examplify-zod.d.ts +93 -0
- package/dist/deps/build-raptor-core/examplify-zod.js +257 -0
- package/dist/deps/build-raptor-core/execution-plan.d.ts +20 -0
- package/dist/deps/build-raptor-core/execution-plan.js +66 -0
- package/dist/deps/build-raptor-core/execution-record.d.ts +17 -0
- package/dist/deps/build-raptor-core/execution-record.js +3 -0
- package/dist/deps/build-raptor-core/execution-type.d.ts +2 -0
- package/dist/deps/build-raptor-core/execution-type.js +3 -0
- package/dist/deps/build-raptor-core/find-repo-dir.d.ts +1 -0
- package/dist/deps/build-raptor-core/find-repo-dir.js +27 -0
- package/dist/deps/build-raptor-core/fingerprint-ledger.d.ts +33 -0
- package/dist/deps/build-raptor-core/fingerprint-ledger.js +164 -0
- package/dist/deps/build-raptor-core/fingerprint.d.ts +3 -0
- package/dist/deps/build-raptor-core/fingerprint.js +13 -0
- package/dist/deps/build-raptor-core/fingerprinter.d.ts +15 -0
- package/dist/deps/build-raptor-core/fingerprinter.js +122 -0
- package/dist/deps/build-raptor-core/hasher.d.ts +21 -0
- package/dist/deps/build-raptor-core/hasher.js +93 -0
- package/dist/deps/build-raptor-core/index.d.ts +9 -0
- package/dist/deps/build-raptor-core/index.js +26 -0
- package/dist/deps/build-raptor-core/model.d.ts +17 -0
- package/dist/deps/build-raptor-core/model.js +40 -0
- package/dist/deps/build-raptor-core/nop-asset-publisher.d.ts +6 -0
- package/dist/deps/build-raptor-core/nop-asset-publisher.js +12 -0
- package/dist/deps/build-raptor-core/performance-report.d.ts +5 -0
- package/dist/deps/build-raptor-core/performance-report.js +3 -0
- package/dist/deps/build-raptor-core/phase.d.ts +1 -0
- package/dist/deps/build-raptor-core/phase.js +3 -0
- package/dist/deps/build-raptor-core/planner.d.ts +12 -0
- package/dist/deps/build-raptor-core/planner.js +43 -0
- package/dist/deps/build-raptor-core/purger.d.ts +11 -0
- package/dist/deps/build-raptor-core/purger.js +65 -0
- package/dist/deps/build-raptor-core/slot-index.d.ts +6 -0
- package/dist/deps/build-raptor-core/slot-index.js +17 -0
- package/dist/deps/build-raptor-core/step-by-step-transmitter.d.ts +15 -0
- package/dist/deps/build-raptor-core/step-by-step-transmitter.js +94 -0
- package/dist/deps/build-raptor-core/tar-stream.d.ts +20 -0
- package/dist/deps/build-raptor-core/tar-stream.js +194 -0
- package/dist/deps/build-raptor-core/task-executor.d.ts +32 -0
- package/dist/deps/build-raptor-core/task-executor.js +321 -0
- package/dist/deps/build-raptor-core/task-store-cli.d.ts +1 -0
- package/dist/deps/build-raptor-core/task-store-cli.js +61 -0
- package/dist/deps/build-raptor-core/task-store-event.d.ts +17 -0
- package/dist/deps/build-raptor-core/task-store-event.js +3 -0
- package/dist/deps/build-raptor-core/task-store.d.ts +41 -0
- package/dist/deps/build-raptor-core/task-store.js +302 -0
- package/dist/deps/build-raptor-core/task-summary.d.ts +12 -0
- package/dist/deps/build-raptor-core/task-summary.js +3 -0
- package/dist/deps/build-raptor-core/task-tracker.d.ts +23 -0
- package/dist/deps/build-raptor-core/task-tracker.js +97 -0
- package/dist/deps/build-raptor-core/task.d.ts +30 -0
- package/dist/deps/build-raptor-core/task.js +90 -0
- package/dist/deps/build-raptor-core/updatable-task-output-registry.d.ts +13 -0
- package/dist/deps/build-raptor-core/updatable-task-output-registry.js +75 -0
- package/dist/deps/build-raptor-core/validate-task-infos.d.ts +3 -0
- package/dist/deps/build-raptor-core/validate-task-infos.js +53 -0
- package/dist/deps/build-raptor-core-testkit/build-raptor-core-testkit.d.ts +1 -0
- package/dist/deps/build-raptor-core-testkit/build-raptor-core-testkit.js +18 -0
- package/dist/deps/build-raptor-core-testkit/driver.d.ts +119 -0
- package/dist/deps/build-raptor-core-testkit/driver.js +305 -0
- package/dist/deps/build-raptor-core-testkit/index.d.ts +3 -0
- package/dist/deps/build-raptor-core-testkit/index.js +20 -0
- package/dist/deps/build-raptor-core-testkit/repo-protocol-testkit.d.ts +35 -0
- package/dist/deps/build-raptor-core-testkit/repo-protocol-testkit.js +226 -0
- package/dist/deps/build-raptor-core-testkit/simple-node-repo-protocol.d.ts +27 -0
- package/dist/deps/build-raptor-core-testkit/simple-node-repo-protocol.js +140 -0
- package/dist/deps/build-run-id/build-run-id.d.ts +3 -0
- package/dist/deps/build-run-id/build-run-id.js +13 -0
- package/dist/deps/build-run-id/index.d.ts +1 -0
- package/dist/deps/build-run-id/index.js +18 -0
- package/dist/deps/core-types/core-types.d.ts +29 -0
- package/dist/deps/core-types/core-types.js +81 -0
- package/dist/deps/core-types/index.d.ts +1 -0
- package/dist/deps/core-types/index.js +18 -0
- package/dist/deps/logger/index.d.ts +1 -0
- package/dist/deps/logger/index.js +18 -0
- package/dist/deps/logger/logger.d.ts +26 -0
- package/dist/deps/logger/logger.js +152 -0
- package/dist/deps/misc/arrays.d.ts +7 -0
- package/dist/deps/misc/arrays.js +67 -0
- package/dist/deps/misc/camelize-record.d.ts +6 -0
- package/dist/deps/misc/camelize-record.js +16 -0
- package/dist/deps/misc/clean-directory.d.ts +4 -0
- package/dist/deps/misc/clean-directory.js +80 -0
- package/dist/deps/misc/constructs.d.ts +106 -0
- package/dist/deps/misc/constructs.js +131 -0
- package/dist/deps/misc/directory-scanner.d.ts +49 -0
- package/dist/deps/misc/directory-scanner.js +165 -0
- package/dist/deps/misc/executor.d.ts +39 -0
- package/dist/deps/misc/executor.js +59 -0
- package/dist/deps/misc/file-system-storage-client.d.ts +23 -0
- package/dist/deps/misc/file-system-storage-client.js +93 -0
- package/dist/deps/misc/folderify.d.ts +8 -0
- package/dist/deps/misc/folderify.js +86 -0
- package/dist/deps/misc/graph.d.ts +29 -0
- package/dist/deps/misc/graph.js +200 -0
- package/dist/deps/misc/in-memory-storage-client.d.ts +21 -0
- package/dist/deps/misc/in-memory-storage-client.js +75 -0
- package/dist/deps/misc/index.d.ts +20 -0
- package/dist/deps/misc/index.js +37 -0
- package/dist/deps/misc/int.d.ts +10 -0
- package/dist/deps/misc/int.js +29 -0
- package/dist/deps/misc/internal/graph-executor.d.ts +15 -0
- package/dist/deps/misc/internal/graph-executor.js +93 -0
- package/dist/deps/misc/maps.d.ts +29 -0
- package/dist/deps/misc/maps.js +47 -0
- package/dist/deps/misc/misc.d.ts +23 -0
- package/dist/deps/misc/misc.js +94 -0
- package/dist/deps/misc/object-map.d.ts +10 -0
- package/dist/deps/misc/object-map.js +26 -0
- package/dist/deps/misc/promises.d.ts +39 -0
- package/dist/deps/misc/promises.js +78 -0
- package/dist/deps/misc/records.d.ts +11 -0
- package/dist/deps/misc/records.js +40 -0
- package/dist/deps/misc/slurp-dir.d.ts +1 -0
- package/dist/deps/misc/slurp-dir.js +14 -0
- package/dist/deps/misc/storage-client.d.ts +12 -0
- package/dist/deps/misc/storage-client.js +3 -0
- package/dist/deps/misc/stream-to-buffer.d.ts +2 -0
- package/dist/deps/misc/stream-to-buffer.js +26 -0
- package/dist/deps/misc/strings.d.ts +12 -0
- package/dist/deps/misc/strings.js +68 -0
- package/dist/deps/misc/typed-publisher.d.ts +17 -0
- package/dist/deps/misc/typed-publisher.js +65 -0
- package/dist/deps/repo-protocol/index.d.ts +3 -0
- package/dist/deps/repo-protocol/index.js +20 -0
- package/dist/deps/repo-protocol/repo-protocol.d.ts +49 -0
- package/dist/deps/repo-protocol/repo-protocol.js +3 -0
- package/dist/deps/repo-protocol/task-info.d.ts +18 -0
- package/dist/deps/repo-protocol/task-info.js +3 -0
- package/dist/deps/repo-protocol/test-run-summary.d.ts +54 -0
- package/dist/deps/repo-protocol/test-run-summary.js +32 -0
- package/dist/deps/repo-protocol-toolbox/generate-task-infos.d.ts +5 -0
- package/dist/deps/repo-protocol-toolbox/generate-task-infos.js +26 -0
- package/dist/deps/repo-protocol-toolbox/index.d.ts +3 -0
- package/dist/deps/repo-protocol-toolbox/index.js +20 -0
- package/dist/deps/repo-protocol-toolbox/repo-protocol-toolbox.d.ts +10 -0
- package/dist/deps/repo-protocol-toolbox/repo-protocol-toolbox.js +90 -0
- package/dist/deps/repo-protocol-toolbox/task-definition.d.ts +14 -0
- package/dist/deps/repo-protocol-toolbox/task-definition.js +3 -0
- package/dist/deps/reporter-output/index.d.ts +1 -0
- package/dist/deps/reporter-output/index.js +18 -0
- package/dist/deps/reporter-output/reporter-output.d.ts +49 -0
- package/dist/deps/reporter-output/reporter-output.js +25 -0
- package/dist/deps/s3-storage-client/creds.d.ts +4 -0
- package/dist/deps/s3-storage-client/creds.js +3 -0
- package/dist/deps/s3-storage-client/get-s3-storage-client-factory.d.ts +3 -0
- package/dist/deps/s3-storage-client/get-s3-storage-client-factory.js +45 -0
- package/dist/deps/s3-storage-client/index.d.ts +2 -0
- package/dist/deps/s3-storage-client/index.js +19 -0
- package/dist/deps/s3-storage-client/main.d.ts +1 -0
- package/dist/deps/s3-storage-client/main.js +20 -0
- package/dist/deps/s3-storage-client/s3-storage-client.d.ts +25 -0
- package/dist/deps/s3-storage-client/s3-storage-client.js +134 -0
- package/dist/deps/task-name/index.d.ts +1 -0
- package/dist/deps/task-name/index.js +18 -0
- package/dist/deps/task-name/task-name.d.ts +17 -0
- package/dist/deps/task-name/task-name.js +44 -0
- package/dist/deps/unit-metadata/index.d.ts +1 -0
- package/dist/deps/unit-metadata/index.js +18 -0
- package/dist/deps/unit-metadata/unit-metadata.d.ts +14 -0
- package/dist/deps/unit-metadata/unit-metadata.js +32 -0
- package/dist/deps/yarn-repo-protocol/build-task-record.d.ts +61 -0
- package/dist/deps/yarn-repo-protocol/build-task-record.js +29 -0
- package/dist/deps/yarn-repo-protocol/generate-test-run-summary.d.ts +4 -0
- package/dist/deps/yarn-repo-protocol/generate-test-run-summary.js +26 -0
- package/dist/deps/yarn-repo-protocol/index.d.ts +2 -0
- package/dist/deps/yarn-repo-protocol/index.js +19 -0
- package/dist/deps/yarn-repo-protocol/rerun-list.d.ts +12 -0
- package/dist/deps/yarn-repo-protocol/rerun-list.js +6 -0
- package/dist/deps/yarn-repo-protocol/yarn-repo-protocol-config.d.ts +24 -0
- package/dist/deps/yarn-repo-protocol/yarn-repo-protocol-config.js +34 -0
- package/dist/deps/yarn-repo-protocol/yarn-repo-protocol.d.ts +82 -0
- package/dist/deps/yarn-repo-protocol/yarn-repo-protocol.js +1036 -0
- package/dist/src/build-raptor-cli.d.ts +60 -0
- package/dist/src/build-raptor-cli.js +514 -0
- package/dist/src/index.d.ts +1 -0
- package/dist/src/index.js +20 -0
- package/dist/src/main.d.ts +2 -0
- package/dist/src/main.js +23 -0
- package/dist/src/register-asset-request.d.ts +18 -0
- package/dist/src/register-asset-request.js +11 -0
- package/dist/src/task-execution-visualizer.d.ts +17 -0
- package/dist/src/task-execution-visualizer.js +116 -0
- package/package.json +17 -14
- package/build-raptor.js +0 -7259
- package/index.d.ts +0 -22
- package/index.js +0 -7231
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
export type Criticality = 'high' | 'moderate' | 'low';
|
|
2
|
+
export interface Logger {
|
|
3
|
+
print(message: string, criticality?: Criticality): void;
|
|
4
|
+
info(message: string, ...rest: unknown[]): void;
|
|
5
|
+
debug(message: string, ...rest: unknown[]): void;
|
|
6
|
+
error(message: string, err: unknown, ...rest: unknown[]): void;
|
|
7
|
+
}
|
|
8
|
+
declare class NopLogger implements Logger {
|
|
9
|
+
print(_message: string): void;
|
|
10
|
+
info(_message: string, ..._rest: unknown[]): void;
|
|
11
|
+
debug(_message: string, ..._rest: unknown[]): void;
|
|
12
|
+
error(_message: string, _err: unknown, ..._rest: unknown[]): void;
|
|
13
|
+
}
|
|
14
|
+
export declare function createNopLogger(): NopLogger;
|
|
15
|
+
export declare function createDefaultLogger(logFile: string, pickiness: Criticality, logLevel?: Level, uiStream?: NodeJS.WritableStream): FileLogger;
|
|
16
|
+
declare class FileLogger implements Logger {
|
|
17
|
+
private readonly logger;
|
|
18
|
+
private readonly pickiness;
|
|
19
|
+
constructor(logFile: string, pickinessLevel: Criticality, logLevel?: Level, uiStream?: NodeJS.WritableStream);
|
|
20
|
+
print(message: string, messageCriticality?: Criticality): void;
|
|
21
|
+
info(message: string, ...rest: unknown[]): void;
|
|
22
|
+
debug(message: string, ...rest: unknown[]): void;
|
|
23
|
+
error(message: string, err: unknown, ...rest: unknown[]): void;
|
|
24
|
+
}
|
|
25
|
+
type Level = 'error' | 'info' | 'debug';
|
|
26
|
+
export {};
|
|
@@ -0,0 +1,152 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
+
if (k2 === undefined) k2 = k;
|
|
4
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
+
}
|
|
8
|
+
Object.defineProperty(o, k2, desc);
|
|
9
|
+
}) : (function(o, m, k, k2) {
|
|
10
|
+
if (k2 === undefined) k2 = k;
|
|
11
|
+
o[k2] = m[k];
|
|
12
|
+
}));
|
|
13
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
14
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
15
|
+
}) : function(o, v) {
|
|
16
|
+
o["default"] = v;
|
|
17
|
+
});
|
|
18
|
+
var __importStar = (this && this.__importStar) || (function () {
|
|
19
|
+
var ownKeys = function(o) {
|
|
20
|
+
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
21
|
+
var ar = [];
|
|
22
|
+
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
23
|
+
return ar;
|
|
24
|
+
};
|
|
25
|
+
return ownKeys(o);
|
|
26
|
+
};
|
|
27
|
+
return function (mod) {
|
|
28
|
+
if (mod && mod.__esModule) return mod;
|
|
29
|
+
var result = {};
|
|
30
|
+
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
31
|
+
__setModuleDefault(result, mod);
|
|
32
|
+
return result;
|
|
33
|
+
};
|
|
34
|
+
})();
|
|
35
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
36
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
37
|
+
};
|
|
38
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
39
|
+
exports.createNopLogger = createNopLogger;
|
|
40
|
+
exports.createDefaultLogger = createDefaultLogger;
|
|
41
|
+
const fs = __importStar(require("fs"));
|
|
42
|
+
const logform_1 = require("logform");
|
|
43
|
+
const path = __importStar(require("path"));
|
|
44
|
+
const safe_stable_stringify_1 = __importDefault(require("safe-stable-stringify"));
|
|
45
|
+
const winston = __importStar(require("winston"));
|
|
46
|
+
const criticalityLegend = {
|
|
47
|
+
high: 0,
|
|
48
|
+
moderate: 100,
|
|
49
|
+
low: 200,
|
|
50
|
+
};
|
|
51
|
+
class NopLogger {
|
|
52
|
+
print(_message) {
|
|
53
|
+
// noop
|
|
54
|
+
}
|
|
55
|
+
info(_message, ..._rest) {
|
|
56
|
+
// noop
|
|
57
|
+
}
|
|
58
|
+
debug(_message, ..._rest) {
|
|
59
|
+
// noop
|
|
60
|
+
}
|
|
61
|
+
error(_message, _err, ..._rest) {
|
|
62
|
+
// noop
|
|
63
|
+
}
|
|
64
|
+
}
|
|
65
|
+
function createNopLogger() {
|
|
66
|
+
return new NopLogger();
|
|
67
|
+
}
|
|
68
|
+
function createDefaultLogger(logFile, pickiness, logLevel, uiStream) {
|
|
69
|
+
const stat = fs.statSync(logFile, { throwIfNoEntry: false });
|
|
70
|
+
if (stat && stat.size > 0) {
|
|
71
|
+
fs.rmSync(logFile, { force: true });
|
|
72
|
+
}
|
|
73
|
+
return new FileLogger(logFile, pickiness, logLevel, uiStream);
|
|
74
|
+
}
|
|
75
|
+
class FileLogger {
|
|
76
|
+
constructor(logFile, pickinessLevel, logLevel = 'info', uiStream = process.stdout) {
|
|
77
|
+
if (!path.isAbsolute(logFile)) {
|
|
78
|
+
throw new Error(`logDir must be absolute: ${logFile}`);
|
|
79
|
+
}
|
|
80
|
+
this.logger = newLogger(logFile, logLevel, uiStream);
|
|
81
|
+
this.pickiness = criticalityLegend[pickinessLevel];
|
|
82
|
+
}
|
|
83
|
+
print(message, messageCriticality = 'moderate') {
|
|
84
|
+
const messageLevel = criticalityLegend[messageCriticality];
|
|
85
|
+
const doPrint = messageLevel <= this.pickiness;
|
|
86
|
+
if (doPrint) {
|
|
87
|
+
this.logger.info(message, { ui: true });
|
|
88
|
+
}
|
|
89
|
+
}
|
|
90
|
+
info(message, ...rest) {
|
|
91
|
+
this.logger.info(message, ...rest);
|
|
92
|
+
}
|
|
93
|
+
debug(message, ...rest) {
|
|
94
|
+
this.logger.debug(message, ...rest);
|
|
95
|
+
}
|
|
96
|
+
error(message, err, ...rest) {
|
|
97
|
+
this.logger.error(message, err, ...rest, { ui: true });
|
|
98
|
+
}
|
|
99
|
+
}
|
|
100
|
+
const joinTokens = (...tokens) => tokens
|
|
101
|
+
.map(t => t?.trim())
|
|
102
|
+
.filter(Boolean)
|
|
103
|
+
.join(' ');
|
|
104
|
+
const finalFormat = logform_1.format.printf(info => {
|
|
105
|
+
let stringifiedRest = (0, safe_stable_stringify_1.default)(Object.assign({}, info, {
|
|
106
|
+
level: undefined,
|
|
107
|
+
message: undefined,
|
|
108
|
+
timestamp: undefined,
|
|
109
|
+
stack: undefined,
|
|
110
|
+
ui: undefined,
|
|
111
|
+
}));
|
|
112
|
+
if (stringifiedRest === '{}') {
|
|
113
|
+
stringifiedRest = '';
|
|
114
|
+
}
|
|
115
|
+
return joinTokens(info.timestamp, `[${info.level}]`, info.message, stringifiedRest, info.stack);
|
|
116
|
+
});
|
|
117
|
+
const filterUi = (0, logform_1.format)(info => {
|
|
118
|
+
if (!info.ui) {
|
|
119
|
+
return false;
|
|
120
|
+
}
|
|
121
|
+
return info;
|
|
122
|
+
});
|
|
123
|
+
const formatUi = logform_1.format.printf(info => {
|
|
124
|
+
return joinTokens(info.message, info.stack);
|
|
125
|
+
});
|
|
126
|
+
const levels = {
|
|
127
|
+
error: 0,
|
|
128
|
+
info: 1,
|
|
129
|
+
debug: 2,
|
|
130
|
+
};
|
|
131
|
+
function newLogger(logFile, level, uiStream) {
|
|
132
|
+
return winston.createLogger({
|
|
133
|
+
level: 'debug',
|
|
134
|
+
levels,
|
|
135
|
+
defaultMeta: undefined,
|
|
136
|
+
transports: [
|
|
137
|
+
// Writes all log entries with level `info` and below to logFile.
|
|
138
|
+
new winston.transports.File({
|
|
139
|
+
filename: logFile,
|
|
140
|
+
level,
|
|
141
|
+
format: logform_1.format.combine(logform_1.format.timestamp(), logform_1.format.errors({ stack: true }), finalFormat),
|
|
142
|
+
}),
|
|
143
|
+
// Writes all logs entries marked as "UI" to the the UI stream (typically, stdout).
|
|
144
|
+
new winston.transports.Stream({
|
|
145
|
+
stream: uiStream,
|
|
146
|
+
level: 'info',
|
|
147
|
+
format: logform_1.format.combine(logform_1.format.errors({ stack: true }), filterUi(), formatUi),
|
|
148
|
+
}),
|
|
149
|
+
],
|
|
150
|
+
});
|
|
151
|
+
}
|
|
152
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibG9nZ2VyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL2xvZ2dlci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQXVDQSwwQ0FFQztBQUVELGtEQVdDO0FBdERELHVDQUF3QjtBQUN4QixxQ0FBZ0M7QUFDaEMsMkNBQTRCO0FBQzVCLGtGQUFpRDtBQUNqRCxpREFBa0M7QUFFbEMsTUFBTSxpQkFBaUIsR0FBZ0M7SUFDckQsSUFBSSxFQUFFLENBQUM7SUFDUCxRQUFRLEVBQUUsR0FBRztJQUNiLEdBQUcsRUFBRSxHQUFHO0NBQ1QsQ0FBQTtBQVdELE1BQU0sU0FBUztJQUNiLEtBQUssQ0FBQyxRQUFnQjtRQUNwQixPQUFPO0lBQ1QsQ0FBQztJQUVELElBQUksQ0FBQyxRQUFnQixFQUFFLEdBQUcsS0FBZ0I7UUFDeEMsT0FBTztJQUNULENBQUM7SUFFRCxLQUFLLENBQUMsUUFBZ0IsRUFBRSxHQUFHLEtBQWdCO1FBQ3pDLE9BQU87SUFDVCxDQUFDO0lBRUQsS0FBSyxDQUFDLFFBQWdCLEVBQUUsSUFBYSxFQUFFLEdBQUcsS0FBZ0I7UUFDeEQsT0FBTztJQUNULENBQUM7Q0FDRjtBQUVELFNBQWdCLGVBQWU7SUFDN0IsT0FBTyxJQUFJLFNBQVMsRUFBRSxDQUFBO0FBQ3hCLENBQUM7QUFFRCxTQUFnQixtQkFBbUIsQ0FDakMsT0FBZSxFQUNmLFNBQXNCLEVBQ3RCLFFBQWdCLEVBQ2hCLFFBQWdDO0lBRWhDLE1BQU0sSUFBSSxHQUFHLEVBQUUsQ0FBQyxRQUFRLENBQUMsT0FBTyxFQUFFLEVBQUUsY0FBYyxFQUFFLEtBQUssRUFBRSxDQUFDLENBQUE7SUFDNUQsSUFBSSxJQUFJLElBQUksSUFBSSxDQUFDLElBQUksR0FBRyxDQUFDLEVBQUUsQ0FBQztRQUMxQixFQUFFLENBQUMsTUFBTSxDQUFDLE9BQU8sRUFBRSxFQUFFLEtBQUssRUFBRSxJQUFJLEVBQUUsQ0FB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
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
export declare function sortBy<T>(input: readonly T[], key: (item: T) => number): T[];
|
|
2
|
+
export declare function sortBy<T>(input: readonly T[], key: (item: T) => string): T[];
|
|
3
|
+
export declare function sortBy<T>(input: IterableIterator<T>, key: (item: T) => number): T[];
|
|
4
|
+
export declare function sortBy<T>(input: IterableIterator<T>, key: (item: T) => string): T[];
|
|
5
|
+
export declare function findDups<T, K extends number | symbol | string>(input: ArrayLike<T> | Iterable<T>, key: (item: T) => K): T[];
|
|
6
|
+
export declare function uniqueBy<T, K>(input: ArrayLike<T> | Iterable<T>, key: (item: T) => K): T[];
|
|
7
|
+
export declare function groupBy<T, K extends number | symbol | string>(input: ArrayLike<T> | Iterable<T>, key: (item: T) => K): Record<K, T[]>;
|
|
@@ -0,0 +1,67 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.sortBy = sortBy;
|
|
4
|
+
exports.findDups = findDups;
|
|
5
|
+
exports.uniqueBy = uniqueBy;
|
|
6
|
+
exports.groupBy = groupBy;
|
|
7
|
+
const maps_1 = require("./maps");
|
|
8
|
+
function sortBy(input, key) {
|
|
9
|
+
return [...input].sort((a, b) => comp(a, b, key));
|
|
10
|
+
}
|
|
11
|
+
function comp(a, b, key) {
|
|
12
|
+
const ak = key(a);
|
|
13
|
+
const bk = key(b);
|
|
14
|
+
if (typeof ak === 'string' && typeof bk === 'string') {
|
|
15
|
+
return ak.localeCompare(bk);
|
|
16
|
+
}
|
|
17
|
+
if (typeof ak === 'number' && typeof bk === 'number') {
|
|
18
|
+
return ak - bk;
|
|
19
|
+
}
|
|
20
|
+
throw new Error(`Cannot compare ${ak} and ${bk}`);
|
|
21
|
+
}
|
|
22
|
+
function findDups(input, key) {
|
|
23
|
+
const counts = new Map();
|
|
24
|
+
const collidingKeys = new Set();
|
|
25
|
+
const pairs = [];
|
|
26
|
+
for (const item of Array.from(input)) {
|
|
27
|
+
const k = key(item);
|
|
28
|
+
pairs.push([item, k]);
|
|
29
|
+
const n = (0, maps_1.mapIncrement)(counts, k, 1);
|
|
30
|
+
if (n > 1) {
|
|
31
|
+
collidingKeys.add(k);
|
|
32
|
+
}
|
|
33
|
+
}
|
|
34
|
+
const ret = [];
|
|
35
|
+
for (const [item, k] of pairs) {
|
|
36
|
+
if (collidingKeys.has(k)) {
|
|
37
|
+
ret.push(item);
|
|
38
|
+
}
|
|
39
|
+
}
|
|
40
|
+
return ret;
|
|
41
|
+
}
|
|
42
|
+
function uniqueBy(input, key) {
|
|
43
|
+
const seen = new Set();
|
|
44
|
+
return Array.from(input).filter(item => {
|
|
45
|
+
const k = key(item);
|
|
46
|
+
if (seen.has(k)) {
|
|
47
|
+
return false;
|
|
48
|
+
}
|
|
49
|
+
seen.add(k);
|
|
50
|
+
return true;
|
|
51
|
+
});
|
|
52
|
+
}
|
|
53
|
+
function groupBy(input, key) {
|
|
54
|
+
// eslint-disable-next-line @typescript-eslint/consistent-type-assertions
|
|
55
|
+
const ret = {};
|
|
56
|
+
for (const item of Array.from(input)) {
|
|
57
|
+
const k = key(item);
|
|
58
|
+
let arr = ret[k];
|
|
59
|
+
if (!arr) {
|
|
60
|
+
arr = new Array();
|
|
61
|
+
ret[k] = arr;
|
|
62
|
+
}
|
|
63
|
+
arr.push(item);
|
|
64
|
+
}
|
|
65
|
+
return ret;
|
|
66
|
+
}
|
|
67
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXJyYXlzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL2FycmF5cy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOztBQU1BLHdCQUVDO0FBaUJELDRCQXdCQztBQUVELDRCQVVDO0FBRUQsMEJBbUJDO0FBbEZELGlDQUFxQztBQU1yQyxTQUFnQixNQUFNLENBQUksS0FBeUMsRUFBRSxHQUFpQztJQUNwRyxPQUFPLENBQUMsR0FBRyxLQUFLLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxJQUFJLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFBO0FBQ25ELENBQUM7QUFFRCxTQUFTLElBQUksQ0FBK0IsQ0FBSSxFQUFFLENBQUksRUFBRSxHQUFtQjtJQUN6RSxNQUFNLEVBQUUsR0FBRyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUE7SUFDakIsTUFBTSxFQUFFLEdBQUcsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFBO0lBRWpCLElBQUksT0FBTyxFQUFFLEtBQUssUUFBUSxJQUFJLE9BQU8sRUFBRSxLQUFLLFFBQVEsRUFBRSxDQUFDO1FBQ3JELE9BQU8sRUFBRSxDQUFDLGFBQWEsQ0FBQyxFQUFFLENBQUMsQ0FBQTtJQUM3QixDQUFDO0lBRUQsSUFBSSxPQUFPLEVBQUUsS0FBSyxRQUFRLElBQUksT0FBTyxFQUFFLEtBQUssUUFBUSxFQUFFLENBQUM7UUFDckQsT0FBTyxFQUFFLEdBQUcsRUFBRSxDQUFBO0lBQ2hCLENBQUM7SUFFRCxNQUFNLElBQUksS0FBSyxDQUFDLGtCQUFrQixFQUFFLFFBQVEsRUFBRSxFQUFFLENBQUMsQ0FBQTtBQUNuRCxDQUFDO0FBRUQsU0FBZ0IsUUFBUSxDQUN0QixLQUFpQyxFQUNqQyxHQUFtQjtJQUVuQixNQUFNLE1BQU0sR0FBRyxJQUFJLEdBQUcsRUFBYSxDQUFBO0lBQ25DLE1BQU0sYUFBYSxHQUFHLElBQUksR0FBRyxFQUFLLENBQUE7SUFDbEMsTUFBTSxLQUFLLEdBQWEsRUFBRSxDQUFBO0lBQzFCLEtBQUssTUFBTSxJQUFJLElBQUksS0FBSyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsRUFBRSxDQUFDO1FBQ3JDLE1BQU0sQ0FBQyxHQUFHLEdBQUcsQ0FBQyxJQUFJLENBQUMsQ0FBQTtRQUNuQixLQUFLLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUE7UUFDckIsTUFBTSxDQUFDLEdBQUcsSUFBQSxtQkFBWSxFQUFDLE1BQU0sRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUE7UUFDcEMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUM7WUFDVixhQUFhLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFBO1FBQ3RCLENBQUM7SUFDSCxDQUFDO0lBRUQsTUFBTSxHQUFHLEdBQVEsRUFBRSxDQUFBO0lBQ25CLEtBQUssTUFBTSxDQUFDLElBQUksRUFBRSxDQUFDLENBQUMsSUFBSSxLQUFLLEVBQUUsQ0FBQztRQUM5QixJQUFJLGFBQWEsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQztZQUN6QixHQUFHLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFBO1FBQ2hCLENBQUM7SUFDSCxDQUFDO0lBRUQsT0FBTyxHQUFHLENBQUE7QUFDWixDQUFDO0FBRUQsU0FBZ0IsUUFBUSxDQUFPLEtBQWlDLEVBQUUsR0FBbUI7SUFDbkYsTUFBTSxJQUFJLEdBQUcsSUFBSSxHQUFHLEVBQUssQ0FBQTtJQUN6QixPQUFPLEtBQUssQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxFQUFFO1FBQ3JDLE1BQU0sQ0FBQyxHQUFHLEdBQUcsQ0FBQyxJQUFJLENBQUMsQ0FBQTtRQUNuQixJQUFJLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQztZQUNoQixPQUFPLEtBQUssQ0FBQTtRQUNkLENBQUM7UUFDRCxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFBO1FBQ1gsT0FBTyxJQUFJLENBQUE7SUFDYixDQUFDLENBQUMsQ0FBQTtBQUNKLENBQUM7QUFFRCxTQUFnQixPQUFPLENBQ3JCLEtBQWlDLEVBQ2pDLEdBQW1CO0lBRW5CLHlFQUF5RTtJQUN6RSxNQUFNLEdBQUcsR0FBbUIsRUFBb0IsQ0FBQTtJQUVoRCxLQUFLLE1BQU0sSUFBSSxJQUFJLEtBQUssQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLEVBQUUsQ0FBQztRQUNyQyxNQUFNLENBQUMsR0FBRyxHQUFHLENBQUMsSUFBSSxDQUFDLENBQUE7UUFDbkIsSUFBSSxHQUFHLEdBQUcsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFBO1FBQ2hCLElBQUksQ0FBQyxHQUFHLEVBQUUsQ0FBQztZQUNULEdBQUcsR0FBRyxJQUFJLEtBQUssRUFBSyxDQUFBO1lBQ3BCLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxHQUFHLENBQUE7UUFDZCxDQUFDO1FBRUQsR0FBRyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQTtJQUNoQixDQUFDO0lBRUQsT0FBTyxHQUFHLENBQUE7QUFDWixDQUFDIn0=
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
type CamelizeString<T extends PropertyKey, C extends string = ''> = T extends string ? string extends T ? string : T extends `${infer F}-${infer R}` ? CamelizeString<Capitalize<R>, `${C}${F}`> : `${C}${T}` : T;
|
|
2
|
+
export type CamelizeRecord<T> = {
|
|
3
|
+
[K in keyof T as CamelizeString<K>]: T[K];
|
|
4
|
+
};
|
|
5
|
+
export declare function camelizeRecord<T extends Record<string, boolean | string | number | unknown>>(rec: T): CamelizeRecord<T>;
|
|
6
|
+
export {};
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.camelizeRecord = camelizeRecord;
|
|
4
|
+
function camelizeRecord(rec) {
|
|
5
|
+
const ret = {};
|
|
6
|
+
for (const k of Object.keys(rec)) {
|
|
7
|
+
const parts = k.split('-');
|
|
8
|
+
if (parts.length === 1) {
|
|
9
|
+
ret[k] = rec[k];
|
|
10
|
+
continue;
|
|
11
|
+
}
|
|
12
|
+
ret[parts.map((p, i) => (i === 0 ? p : p[0].toUpperCase() + p.slice(1))).join('')] = rec[k];
|
|
13
|
+
}
|
|
14
|
+
return ret; // eslint-disable-line @typescript-eslint/consistent-type-assertions
|
|
15
|
+
}
|
|
16
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2FtZWxpemUtcmVjb3JkLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL2NhbWVsaXplLXJlY29yZC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOztBQVVBLHdDQWdCQztBQWhCRCxTQUFnQixjQUFjLENBQzVCLEdBQU07SUFFTixNQUFNLEdBQUcsR0FBNEIsRUFBRSxDQUFBO0lBRXZDLEtBQUssTUFBTSxDQUFDLElBQUksTUFBTSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDO1FBQ2pDLE1BQU0sS0FBSyxHQUFHLENBQUMsQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLENBQUE7UUFDMUIsSUFBSSxLQUFLLENBQUMsTUFBTSxLQUFLLENBQUMsRUFBRSxDQUFDO1lBQ3ZCLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUE7WUFDZixTQUFRO1FBQ1YsQ0FBQztRQUVELEdBQUcsQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxXQUFXLEVBQUUsR0FBRyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLENBQUMsR0FBRyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUE7SUFDN0YsQ0FBQztJQUVELE9BQU8sR0FBd0IsQ0FBQSxDQUFDLG9FQUFvRTtBQUN0RyxDQUFDIn0=
|
|
@@ -0,0 +1,80 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
+
if (k2 === undefined) k2 = k;
|
|
4
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
+
}
|
|
8
|
+
Object.defineProperty(o, k2, desc);
|
|
9
|
+
}) : (function(o, m, k, k2) {
|
|
10
|
+
if (k2 === undefined) k2 = k;
|
|
11
|
+
o[k2] = m[k];
|
|
12
|
+
}));
|
|
13
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
14
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
15
|
+
}) : function(o, v) {
|
|
16
|
+
o["default"] = v;
|
|
17
|
+
});
|
|
18
|
+
var __importStar = (this && this.__importStar) || (function () {
|
|
19
|
+
var ownKeys = function(o) {
|
|
20
|
+
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
21
|
+
var ar = [];
|
|
22
|
+
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
23
|
+
return ar;
|
|
24
|
+
};
|
|
25
|
+
return ownKeys(o);
|
|
26
|
+
};
|
|
27
|
+
return function (mod) {
|
|
28
|
+
if (mod && mod.__esModule) return mod;
|
|
29
|
+
var result = {};
|
|
30
|
+
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
31
|
+
__setModuleDefault(result, mod);
|
|
32
|
+
return result;
|
|
33
|
+
};
|
|
34
|
+
})();
|
|
35
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
36
|
+
exports.cleanDirectory = cleanDirectory;
|
|
37
|
+
const fs = __importStar(require("fs"));
|
|
38
|
+
const path = __importStar(require("path"));
|
|
39
|
+
const arrays_1 = require("./arrays");
|
|
40
|
+
function cleanDirectory(directoryPath, deletionFactor, triggerCleanupIfByteSizeExceeds) {
|
|
41
|
+
const size = calculateDirectorySize(directoryPath);
|
|
42
|
+
if (triggerCleanupIfByteSizeExceeds !== 'ALWAYS' && size <= triggerCleanupIfByteSizeExceeds) {
|
|
43
|
+
return { size, deleted: 0 };
|
|
44
|
+
}
|
|
45
|
+
const filesDeleted = deleteFiles(directoryPath, deletionFactor);
|
|
46
|
+
return { size, deleted: filesDeleted.length };
|
|
47
|
+
}
|
|
48
|
+
function calculateDirectorySize(directoryPath) {
|
|
49
|
+
let ret = 0;
|
|
50
|
+
for (const f of fs.readdirSync(directoryPath)) {
|
|
51
|
+
const resolved = path.join(directoryPath, f);
|
|
52
|
+
const stats = fs.statSync(resolved);
|
|
53
|
+
ret += stats.size;
|
|
54
|
+
}
|
|
55
|
+
return ret;
|
|
56
|
+
}
|
|
57
|
+
function deleteFiles(directoryPath, deletionFactor) {
|
|
58
|
+
let files;
|
|
59
|
+
try {
|
|
60
|
+
files = fs.readdirSync(directoryPath);
|
|
61
|
+
}
|
|
62
|
+
catch (e) {
|
|
63
|
+
throw new Error(`failed when reading ${directoryPath}: ${e}`);
|
|
64
|
+
}
|
|
65
|
+
const mapped = files.map(f => ({ f, atime: fs.statSync(path.join(directoryPath, f)).atime.toISOString() }));
|
|
66
|
+
const sorted = (0, arrays_1.sortBy)(mapped, at => at.atime);
|
|
67
|
+
const numFilesToDelete = Math.min(sorted.length, Math.floor(sorted.length * deletionFactor));
|
|
68
|
+
const ret = sorted.slice(0, numFilesToDelete).map(at => at.f);
|
|
69
|
+
for (const f of ret) {
|
|
70
|
+
const filePath = path.join(directoryPath, f);
|
|
71
|
+
try {
|
|
72
|
+
fs.unlinkSync(filePath);
|
|
73
|
+
}
|
|
74
|
+
catch (e) {
|
|
75
|
+
throw new Error(`cleanup of ${filePath} failed: ${e}`);
|
|
76
|
+
}
|
|
77
|
+
}
|
|
78
|
+
return ret;
|
|
79
|
+
}
|
|
80
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2xlYW4tZGlyZWN0b3J5LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL2NsZWFuLWRpcmVjdG9yeS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQUtBLHdDQVlDO0FBakJELHVDQUF3QjtBQUN4QiwyQ0FBNEI7QUFFNUIscUNBQWlDO0FBRWpDLFNBQWdCLGNBQWMsQ0FDNUIsYUFBcUIsRUFDckIsY0FBc0IsRUFDdEIsK0JBQWtEO0lBRWxELE1BQU0sSUFBSSxHQUFHLHNCQUFzQixDQUFDLGFBQWEsQ0FBQyxDQUFBO0lBQ2xELElBQUksK0JBQStCLEtBQUssUUFBUSxJQUFJLElBQUksSUFBSSwrQkFBK0IsRUFBRSxDQUFDO1FBQzVGLE9BQU8sRUFBRSxJQUFJLEVBQUUsT0FBTyxFQUFFLENBQUMsRUFBRSxDQUFBO0lBQzdCLENBQUM7SUFFRCxNQUFNLFlBQVksR0FBRyxXQUFXLENBQUMsYUFBYSxFQUFFLGNBQWMsQ0FBQyxDQUFBO0lBQy9ELE9BQU8sRUFBRSxJQUFJLEVBQUUsT0FBTyxFQUFFLFlBQVksQ0FBQyxNQUFNLEVBQUUsQ0FBQTtBQUMvQyxDQUFDO0FBRUQsU0FBUyxzQkFBc0IsQ0FBQyxhQUFxQjtJQUNuRCxJQUFJLEdBQUcsR0FBRyxDQUFDLENBQUE7SUFFWCxLQUFLLE1BQU0sQ0FBQyxJQUFJLEVBQUUsQ0FBQyxXQUFXLENBQUMsYUFBYSxDQUFDLEVBQUUsQ0FBQztRQUM5QyxNQUFNLFFBQVEsR0FBRyxJQUFJLENBQUMsSUFBSSxDQUFDLGFBQWEsRUFBRSxDQUFDLENBQUMsQ0FBQTtRQUM1QyxNQUFNLEtBQUssR0FBRyxFQUFFLENBQUMsUUFBUSxDQUFDLFFBQVEsQ0FBQyxDQUFBO1FBQ25DLEdBQUcsSUFBSSxLQUFLLENBQUMsSUFBSSxDQUFBO0lBQ25CLENBQUM7SUFFRCxPQUFPLEdBQUcsQ0FBQTtBQUNaLENBQUM7QUFFRCxTQUFTLFdBQVcsQ0FBQyxhQUFxQixFQUFFLGNBQXNCO0lBQ2hFLElBQUksS0FBSyxDQUFBO0lBRVQsSUFBSSxDQUFDO1FBQ0gsS0FBSyxHQUFHLEVBQUUsQ0FBQyxXQUFXLENBQUMsYUFBYSxDQUFDLENBQUE7SUFDdkMsQ0FBQztJQUFDLE9BQU8sQ0FBQyxFQUFFLENBQUM7UUFDWCxNQUFNLElBQUksS0FBSyxDQUFDLHVCQUF1QixhQUFhLEtBQUssQ0FBQyxFQUFFLENBQUMsQ0FBQTtJQUMvRCxDQUFDO0lBRUQsTUFBTSxNQUFNLEdBQUcsS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsS0FBSyxFQUFFLEVBQUUsQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxhQUFhLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsV0FBVyxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUE7SUFDM0csTUFBTSxNQUFNLEdBQUcsSUFBQSxlQUFNLEVBQUMsTUFBTSxFQUFFLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEtBQUssQ0FBQyxDQUFBO0lBRTdDLE1BQU0sZ0JBQWdCLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxNQUFNLENBQUMsTUFBTSxFQUFFLElBQUksQ0FBQyxLQUFLLENBQUMsTUFBTSxDQUFDLE1BQU0sR0FBRyxjQUFjLENBQUMsQ0FBQyxDQUFBO0lBQzVGLE1BQU0sR0FBRyxHQUFHLE1BQU0sQ0FBQyxLQUFLLENBQUMsQ0FBQyxFQUFFLGdCQUFnQixDQUFDLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFBO0lBRTdELEtBQUssTUFBTSxDQUFDLElBQUksR0FBRyxFQUFFLENBQUM7UUFDcEIsTUFBTSxRQUFRLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQyxhQUFhLEVBQUUsQ0FBQyxDQUFDLENBQUE7UUFFNUMsSUFBSSxDQUFDO1lBQ0gsRUFBRSxDQUFDLFVBQVUsQ0FBQyxRQUFRLENBQUMsQ0FBQTtRQUN6QixDQUFDO1FBQUMsT0FBTyxDQUFDLEVBQUUsQ0FBQztZQUNYLE1BQU0sSUFBSSxLQUFLLENBQUMsY0FBYyxRQUFRLFlBQVksQ0FBQyxFQUFFLENBQUMsQ0FBQTtRQUN4RCxDQUFDO0lBQ0gsQ0FBQztJQUVELE9BQU8sR0FBRyxDQUFBO0FBQ1osQ0FBQyJ9
|
|
@@ -0,0 +1,106 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Checks, at compile time, that a certain situation cannot happen (and fail the build if it can). This is useful for
|
|
3
|
+
* checking that all possible cases of a union type are handled.
|
|
4
|
+
*
|
|
5
|
+
* Typical usage pattern:
|
|
6
|
+
*
|
|
7
|
+
* type X = 'A' | 'B'
|
|
8
|
+
*
|
|
9
|
+
* function f(x: X) {
|
|
10
|
+
* if (x === 'a') {
|
|
11
|
+
* // do something ...
|
|
12
|
+
* return
|
|
13
|
+
* }
|
|
14
|
+
* if (x === 'b') {
|
|
15
|
+
* // do something ...
|
|
16
|
+
* return
|
|
17
|
+
* }
|
|
18
|
+
* shouldNeverHappen(x)
|
|
19
|
+
* }
|
|
20
|
+
*
|
|
21
|
+
*
|
|
22
|
+
* If we ever change X such that it has a third case (as in `type X = 'A' | 'B' | 'C') we will get a compile error
|
|
23
|
+
* unless we add logic to this function (`f()`) to handle it.
|
|
24
|
+
*
|
|
25
|
+
* @param n a value of type `never`
|
|
26
|
+
*/
|
|
27
|
+
export declare function shouldNeverHappen(n: never): never;
|
|
28
|
+
/**
|
|
29
|
+
* An always-failing function. If it ever gets called, it will throw an error. It is useful in conditional expressions
|
|
30
|
+
* in which one of the branches of the expression is the happy path, and the other branch is a sad path in which no
|
|
31
|
+
* value can be computed. Sepcifically, it usually appears as the right-hand-side operand of `??` or `||` expressions.
|
|
32
|
+
*
|
|
33
|
+
* Typical usage pattern:
|
|
34
|
+
*
|
|
35
|
+
* const dir: string = process.env['WORKING_DIR'] || failMe('missing env variable "a"')
|
|
36
|
+
*
|
|
37
|
+
* Essentially, this is a concise alternative to:
|
|
38
|
+
*
|
|
39
|
+
* const dir = process.env['a']
|
|
40
|
+
* if (!dir) {
|
|
41
|
+
* throw new Error('missing env variable "a"')
|
|
42
|
+
* }
|
|
43
|
+
*
|
|
44
|
+
* @param hint an optional human-readable string to be placed in the message of the thrown error
|
|
45
|
+
*/
|
|
46
|
+
export declare function failMe(hint?: string): never;
|
|
47
|
+
/**
|
|
48
|
+
* Evaluates just one of several functions (the `cases` parameter) based on the `selector` value passed in.
|
|
49
|
+
* `cases` is a record of zero-argument functions. The function at `cases[selector]` will be evaluated and its return
|
|
50
|
+
* value is returned back to the caller.
|
|
51
|
+
*
|
|
52
|
+
* A compile time error is produced if not all possible values of `selector` are covered by `cases`.
|
|
53
|
+
*
|
|
54
|
+
* Example:
|
|
55
|
+
* function f(op: '+' | '-' | '*', n1: number, n2: number) {
|
|
56
|
+
* return switchOn(op, {
|
|
57
|
+
* '+': () => n1 + n2,
|
|
58
|
+
* '-': () => n1 - n2,
|
|
59
|
+
* '*': () => n1 * n2,
|
|
60
|
+
* })
|
|
61
|
+
* }
|
|
62
|
+
*
|
|
63
|
+
*
|
|
64
|
+
* The following snippet yields a compile-time error:
|
|
65
|
+
*
|
|
66
|
+
* function f(op: '+' | '-' | '*', n1: number, n2: number) {
|
|
67
|
+
* return switchOn(op, {
|
|
68
|
+
* '+': () => n1 + n2,
|
|
69
|
+
* '-': () => n1 - n2,
|
|
70
|
+
* }) // <-- Compiler error here due to missing case ('*')
|
|
71
|
+
* }
|
|
72
|
+
*
|
|
73
|
+
* And so does this:
|
|
74
|
+
*
|
|
75
|
+
* function f(op: '+' | '-' | '*', n1: number, n2: number) {
|
|
76
|
+
* return switchOn(op, {
|
|
77
|
+
* '+': () => n1 + n2,
|
|
78
|
+
* '-': () => n1 - n2,
|
|
79
|
+
* '*': () => n1 - n2,
|
|
80
|
+
* '/': () => n1 / n2,
|
|
81
|
+
* }) // <-- Compiler error here due to extraneous case ('/')
|
|
82
|
+
* }
|
|
83
|
+
*
|
|
84
|
+
* @param selector
|
|
85
|
+
* @param cases
|
|
86
|
+
* @returns
|
|
87
|
+
*/
|
|
88
|
+
export declare function switchOn<G, K extends string>(selector: K, cases: Record<K, () => G>): G;
|
|
89
|
+
/**
|
|
90
|
+
* Safely converts an input of type `unknown` into an Error like object. The return value will contain `message`
|
|
91
|
+
* and `stack` properties which will be strings (if a corresponding propertiy of type string exists on the input) or
|
|
92
|
+
* undefined (otherwise)
|
|
93
|
+
*
|
|
94
|
+
* @param err an input of type `unknown`
|
|
95
|
+
* @returns an Error like object
|
|
96
|
+
*/
|
|
97
|
+
export declare function errorLike(err: unknown): {
|
|
98
|
+
message: string | undefined;
|
|
99
|
+
stack: string | undefined;
|
|
100
|
+
};
|
|
101
|
+
/**
|
|
102
|
+
* Generates a two-tuple from the arguments passed in. Useful in situations where the compiler fails to infer that
|
|
103
|
+
* `[foo, bar]` is a tuple and treats it like an array. Using `pair(foo, bar)` will make the compiler correctly infer
|
|
104
|
+
* the tuple type.
|
|
105
|
+
*/
|
|
106
|
+
export declare function pair<A, B>(a: A, b: B): [A, B];
|
|
@@ -0,0 +1,131 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.shouldNeverHappen = shouldNeverHappen;
|
|
4
|
+
exports.failMe = failMe;
|
|
5
|
+
exports.switchOn = switchOn;
|
|
6
|
+
exports.errorLike = errorLike;
|
|
7
|
+
exports.pair = pair;
|
|
8
|
+
/**
|
|
9
|
+
* Checks, at compile time, that a certain situation cannot happen (and fail the build if it can). This is useful for
|
|
10
|
+
* checking that all possible cases of a union type are handled.
|
|
11
|
+
*
|
|
12
|
+
* Typical usage pattern:
|
|
13
|
+
*
|
|
14
|
+
* type X = 'A' | 'B'
|
|
15
|
+
*
|
|
16
|
+
* function f(x: X) {
|
|
17
|
+
* if (x === 'a') {
|
|
18
|
+
* // do something ...
|
|
19
|
+
* return
|
|
20
|
+
* }
|
|
21
|
+
* if (x === 'b') {
|
|
22
|
+
* // do something ...
|
|
23
|
+
* return
|
|
24
|
+
* }
|
|
25
|
+
* shouldNeverHappen(x)
|
|
26
|
+
* }
|
|
27
|
+
*
|
|
28
|
+
*
|
|
29
|
+
* If we ever change X such that it has a third case (as in `type X = 'A' | 'B' | 'C') we will get a compile error
|
|
30
|
+
* unless we add logic to this function (`f()`) to handle it.
|
|
31
|
+
*
|
|
32
|
+
* @param n a value of type `never`
|
|
33
|
+
*/
|
|
34
|
+
function shouldNeverHappen(n) {
|
|
35
|
+
// This following line never gets executed. It is here just to make the compiler happy.
|
|
36
|
+
throw new Error(`This should never happen ${n}`);
|
|
37
|
+
}
|
|
38
|
+
/**
|
|
39
|
+
* An always-failing function. If it ever gets called, it will throw an error. It is useful in conditional expressions
|
|
40
|
+
* in which one of the branches of the expression is the happy path, and the other branch is a sad path in which no
|
|
41
|
+
* value can be computed. Sepcifically, it usually appears as the right-hand-side operand of `??` or `||` expressions.
|
|
42
|
+
*
|
|
43
|
+
* Typical usage pattern:
|
|
44
|
+
*
|
|
45
|
+
* const dir: string = process.env['WORKING_DIR'] || failMe('missing env variable "a"')
|
|
46
|
+
*
|
|
47
|
+
* Essentially, this is a concise alternative to:
|
|
48
|
+
*
|
|
49
|
+
* const dir = process.env['a']
|
|
50
|
+
* if (!dir) {
|
|
51
|
+
* throw new Error('missing env variable "a"')
|
|
52
|
+
* }
|
|
53
|
+
*
|
|
54
|
+
* @param hint an optional human-readable string to be placed in the message of the thrown error
|
|
55
|
+
*/
|
|
56
|
+
function failMe(hint) {
|
|
57
|
+
if (!hint) {
|
|
58
|
+
throw new Error(`This expression must never be evaluated`);
|
|
59
|
+
}
|
|
60
|
+
throw new Error(`Bad value: ${hint}`);
|
|
61
|
+
}
|
|
62
|
+
/**
|
|
63
|
+
* Evaluates just one of several functions (the `cases` parameter) based on the `selector` value passed in.
|
|
64
|
+
* `cases` is a record of zero-argument functions. The function at `cases[selector]` will be evaluated and its return
|
|
65
|
+
* value is returned back to the caller.
|
|
66
|
+
*
|
|
67
|
+
* A compile time error is produced if not all possible values of `selector` are covered by `cases`.
|
|
68
|
+
*
|
|
69
|
+
* Example:
|
|
70
|
+
* function f(op: '+' | '-' | '*', n1: number, n2: number) {
|
|
71
|
+
* return switchOn(op, {
|
|
72
|
+
* '+': () => n1 + n2,
|
|
73
|
+
* '-': () => n1 - n2,
|
|
74
|
+
* '*': () => n1 * n2,
|
|
75
|
+
* })
|
|
76
|
+
* }
|
|
77
|
+
*
|
|
78
|
+
*
|
|
79
|
+
* The following snippet yields a compile-time error:
|
|
80
|
+
*
|
|
81
|
+
* function f(op: '+' | '-' | '*', n1: number, n2: number) {
|
|
82
|
+
* return switchOn(op, {
|
|
83
|
+
* '+': () => n1 + n2,
|
|
84
|
+
* '-': () => n1 - n2,
|
|
85
|
+
* }) // <-- Compiler error here due to missing case ('*')
|
|
86
|
+
* }
|
|
87
|
+
*
|
|
88
|
+
* And so does this:
|
|
89
|
+
*
|
|
90
|
+
* function f(op: '+' | '-' | '*', n1: number, n2: number) {
|
|
91
|
+
* return switchOn(op, {
|
|
92
|
+
* '+': () => n1 + n2,
|
|
93
|
+
* '-': () => n1 - n2,
|
|
94
|
+
* '*': () => n1 - n2,
|
|
95
|
+
* '/': () => n1 / n2,
|
|
96
|
+
* }) // <-- Compiler error here due to extraneous case ('/')
|
|
97
|
+
* }
|
|
98
|
+
*
|
|
99
|
+
* @param selector
|
|
100
|
+
* @param cases
|
|
101
|
+
* @returns
|
|
102
|
+
*/
|
|
103
|
+
function switchOn(selector, cases) {
|
|
104
|
+
const f = cases[selector];
|
|
105
|
+
return f();
|
|
106
|
+
}
|
|
107
|
+
/**
|
|
108
|
+
* Safely converts an input of type `unknown` into an Error like object. The return value will contain `message`
|
|
109
|
+
* and `stack` properties which will be strings (if a corresponding propertiy of type string exists on the input) or
|
|
110
|
+
* undefined (otherwise)
|
|
111
|
+
*
|
|
112
|
+
* @param err an input of type `unknown`
|
|
113
|
+
* @returns an Error like object
|
|
114
|
+
*/
|
|
115
|
+
function errorLike(err) {
|
|
116
|
+
// eslint-disable-next-line @typescript-eslint/consistent-type-assertions
|
|
117
|
+
const { message, stack } = err;
|
|
118
|
+
return {
|
|
119
|
+
message: typeof message === 'string' ? message : undefined,
|
|
120
|
+
stack: typeof stack === 'string' ? stack : undefined,
|
|
121
|
+
};
|
|
122
|
+
}
|
|
123
|
+
/**
|
|
124
|
+
* Generates a two-tuple from the arguments passed in. Useful in situations where the compiler fails to infer that
|
|
125
|
+
* `[foo, bar]` is a tuple and treats it like an array. Using `pair(foo, bar)` will make the compiler correctly infer
|
|
126
|
+
* the tuple type.
|
|
127
|
+
*/
|
|
128
|
+
function pair(a, b) {
|
|
129
|
+
return [a, b];
|
|
130
|
+
}
|
|
131
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29uc3RydWN0cy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9jb25zdHJ1Y3RzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7O0FBMEJBLDhDQUdDO0FBb0JELHdCQU1DO0FBMkNELDRCQUdDO0FBVUQsOEJBT0M7QUFPRCxvQkFFQztBQS9IRDs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztHQXlCRztBQUNILFNBQWdCLGlCQUFpQixDQUFDLENBQVE7SUFDeEMsdUZBQXVGO0lBQ3ZGLE1BQU0sSUFBSSxLQUFLLENBQUMsNEJBQTRCLENBQUMsRUFBRSxDQUFDLENBQUE7QUFDbEQsQ0FBQztBQUVEOzs7Ozs7Ozs7Ozs7Ozs7OztHQWlCRztBQUNILFNBQWdCLE1BQU0sQ0FBQyxJQUFhO0lBQ2xDLElBQUksQ0FBQyxJQUFJLEVBQUUsQ0FBQztRQUNWLE1BQU0sSUFBSSxLQUFLLENBQUMseUNBQXlDLENBQUMsQ0FBQTtJQUM1RCxDQUFDO0lBRUQsTUFBTSxJQUFJLEtBQUssQ0FBQyxjQUFjLElBQUksRUFBRSxDQUFDLENBQUE7QUFDdkMsQ0FBQztBQUVEOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBd0NHO0FBQ0gsU0FBZ0IsUUFBUSxDQUFzQixRQUFXLEVBQUUsS0FBeUI7SUFDbEYsTUFBTSxDQUFDLEdBQUcsS0FBSyxDQUFDLFFBQVEsQ0FBQyxDQUFBO0lBQ3pCLE9BQU8sQ0FBQyxFQUFFLENBQUE7QUFDWixDQUFDO0FBRUQ7Ozs7Ozs7R0FPRztBQUNILFNBQWdCLFNBQVMsQ0FBQyxHQUFZO0lBQ3BDLHlFQUF5RTtJQUN6RSxNQUFNLEVBQUUsT0FBTyxFQUFFLEtBQUssRUFBRSxHQUFHLEdBQTZDLENBQUE7SUFDeEUsT0FBTztRQUNMLE9BQU8sRUFBRSxPQUFPLE9BQU8sS0FBSyxRQUFRLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsU0FBUztRQUMxRCxLQUFLLEVBQUUsT0FBTyxLQUFLLEtBQUssUUFBUSxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLFNBQVM7S0FDckQsQ0FBQTtBQUNILENBQUM7QUFFRDs7OztHQUlHO0FBQ0gsU0FBZ0IsSUFBSSxDQUFPLENBQUksRUFBRSxDQUFJO0lBQ25DLE9BQU8sQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUE7QUFDZixDQUFDIn0=
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
import * as fs from 'fs';
|
|
2
|
+
type Predicate = (relativePath: string, stat: fs.Stats) => boolean;
|
|
3
|
+
interface Options {
|
|
4
|
+
predicate?: Predicate;
|
|
5
|
+
startingPointMustExist?: boolean;
|
|
6
|
+
}
|
|
7
|
+
interface ListPathsOptions {
|
|
8
|
+
startingPointMustExist?: boolean;
|
|
9
|
+
}
|
|
10
|
+
interface ConstructorOptions {
|
|
11
|
+
predicate?: Predicate;
|
|
12
|
+
}
|
|
13
|
+
type ScanTreeCallback = (relativePath: string, content: Buffer, stat: fs.Stats) => void;
|
|
14
|
+
type RelativePath = string;
|
|
15
|
+
export declare class DirectoryScanner {
|
|
16
|
+
readonly rootDir: string;
|
|
17
|
+
private readonly options;
|
|
18
|
+
constructor(rootDir: string, options?: ConstructorOptions);
|
|
19
|
+
isValid(relativePath: string, stat: fs.Stats): boolean;
|
|
20
|
+
/**
|
|
21
|
+
* Iterates over all the files located under `startingPoint` and calls `cb` for each file.
|
|
22
|
+
* @param startingPoint a relative path to start scanning files at. It is resolved to an absolute path by joining it
|
|
23
|
+
* to the root-dir value passed to the constructor. Trailing path separators are omitted (i.e. `'a/b///'` is
|
|
24
|
+
* equivalent to `'a/b'`).
|
|
25
|
+
* @param cb
|
|
26
|
+
*/
|
|
27
|
+
scanTree(startingPoint: RelativePath, cb: ScanTreeCallback): Promise<void>;
|
|
28
|
+
scanTree(startingPoint: RelativePath, options: Options, cb: ScanTreeCallback): Promise<void>;
|
|
29
|
+
/**
|
|
30
|
+
* Recursively scans a file tree, returning relative paths to all files.
|
|
31
|
+
* @param startingPoint a relative path to start scanning files at. It is resolved to an absolute path by joining it
|
|
32
|
+
* to the root-dir value passed to the constructor. Trailing path separators are omitted (i.e. `'a/b///'` is
|
|
33
|
+
* equivalent to `'a/b'`).
|
|
34
|
+
* @returns an array of relative paths (relative from the `root` path passed to the constructor)
|
|
35
|
+
*/
|
|
36
|
+
listPaths(startingPoint: RelativePath, options?: ListPathsOptions): Promise<string[]>;
|
|
37
|
+
/**
|
|
38
|
+
* Returns relative paths to all files at the file tree rooted at the given directory.
|
|
39
|
+
* @param dir directory to scan files under
|
|
40
|
+
* @returns an array of relative paths (relative to `dir`)
|
|
41
|
+
*/
|
|
42
|
+
static listPaths(dir: string, options?: ListPathsOptions): Promise<string[]>;
|
|
43
|
+
private scanTreeImpl;
|
|
44
|
+
private scanFileTree;
|
|
45
|
+
private readContent;
|
|
46
|
+
private readDirSorted;
|
|
47
|
+
private getStat;
|
|
48
|
+
}
|
|
49
|
+
export {};
|