@bgord/bun 1.4.18 → 1.4.20
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/hcaptcha-secret-key.vo.js +1 -1
- package/dist/prerequisites/clock-drift.d.ts +6 -3
- package/dist/prerequisites/clock-drift.d.ts.map +1 -1
- package/dist/prerequisites/clock-drift.js +5 -4
- package/dist/prerequisites/clock-drift.js.map +1 -1
- package/dist/prerequisites/log-file.d.ts +6 -4
- package/dist/prerequisites/log-file.d.ts.map +1 -1
- package/dist/prerequisites/log-file.js +4 -4
- package/dist/prerequisites/log-file.js.map +1 -1
- package/dist/prerequisites/mailer.d.ts +6 -3
- package/dist/prerequisites/mailer.d.ts.map +1 -1
- package/dist/prerequisites/mailer.js +4 -4
- package/dist/prerequisites/mailer.js.map +1 -1
- package/dist/prerequisites/space.d.ts +6 -3
- package/dist/prerequisites/space.d.ts.map +1 -1
- package/dist/prerequisites/space.js +5 -4
- package/dist/prerequisites/space.js.map +1 -1
- package/dist/prerequisites/ssl-certificate-expiry.d.ts +6 -3
- package/dist/prerequisites/ssl-certificate-expiry.d.ts.map +1 -1
- package/dist/prerequisites/ssl-certificate-expiry.js +4 -4
- package/dist/prerequisites/ssl-certificate-expiry.js.map +1 -1
- package/dist/prerequisites/translations.d.ts +7 -5
- package/dist/prerequisites/translations.d.ts.map +1 -1
- package/dist/prerequisites/translations.js +5 -6
- package/dist/prerequisites/translations.js.map +1 -1
- package/dist/remote-file-storage-noop.adapter.d.ts +2 -2
- package/dist/remote-file-storage-noop.adapter.d.ts.map +1 -1
- package/dist/remote-file-storage-noop.adapter.js +3 -3
- package/dist/remote-file-storage-noop.adapter.js.map +1 -1
- package/dist/tsconfig.tsbuildinfo +1 -1
- package/package.json +4 -4
- package/src/hcaptcha-secret-key.vo.ts +1 -1
- package/src/prerequisites/clock-drift.ts +7 -8
- package/src/prerequisites/log-file.ts +7 -6
- package/src/prerequisites/mailer.ts +7 -4
- package/src/prerequisites/space.ts +6 -4
- package/src/prerequisites/ssl-certificate-expiry.ts +5 -8
- package/src/prerequisites/translations.ts +6 -9
- package/src/remote-file-storage-noop.adapter.ts +1 -1
|
@@ -5,6 +5,6 @@ export const HCaptchaSecretKeyError = {
|
|
|
5
5
|
};
|
|
6
6
|
export const HCaptchaSecretKey = z
|
|
7
7
|
.string(HCaptchaSecretKeyError.Type)
|
|
8
|
-
.length(
|
|
8
|
+
.length(35, HCaptchaSecretKeyError.Length)
|
|
9
9
|
.brand("HCaptchaSecretKey");
|
|
10
10
|
//# sourceMappingURL=hcaptcha-secret-key.vo.js.map
|
|
@@ -2,18 +2,21 @@ import * as tools from "@bgord/tools";
|
|
|
2
2
|
import type { ClockPort } from "../clock.port";
|
|
3
3
|
import * as prereqs from "../prerequisites.service";
|
|
4
4
|
import type { TimekeeperPort } from "../timekeeper.port";
|
|
5
|
+
type Dependencies = {
|
|
6
|
+
Timekeeper?: TimekeeperPort;
|
|
7
|
+
};
|
|
5
8
|
export declare class PrerequisiteClockDrift implements prereqs.Prerequisite {
|
|
9
|
+
private readonly deps?;
|
|
6
10
|
readonly kind = "clock-drift";
|
|
7
11
|
readonly label: prereqs.PrerequisiteLabelType;
|
|
8
12
|
readonly enabled?: boolean;
|
|
9
13
|
readonly skew: tools.Duration;
|
|
10
|
-
readonly Timekeeper: TimekeeperPort;
|
|
11
14
|
readonly timeout: tools.Duration;
|
|
12
15
|
constructor(config: prereqs.PrerequisiteConfigType & {
|
|
13
16
|
skew: tools.Duration;
|
|
14
|
-
Timekeeper?: TimekeeperPort;
|
|
15
17
|
timeout?: tools.Duration;
|
|
16
|
-
});
|
|
18
|
+
}, deps?: Dependencies | undefined);
|
|
17
19
|
verify(clock: ClockPort): Promise<prereqs.VerifyOutcome>;
|
|
18
20
|
}
|
|
21
|
+
export {};
|
|
19
22
|
//# sourceMappingURL=clock-drift.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"clock-drift.d.ts","sourceRoot":"","sources":["../../src/prerequisites/clock-drift.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,KAAK,MAAM,cAAc,CAAC;AACtC,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,eAAe,CAAC;AAC/C,OAAO,KAAK,OAAO,MAAM,0BAA0B,CAAC;AACpD,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,oBAAoB,CAAC;AAIzD,qBAAa,sBAAuB,YAAW,OAAO,CAAC,YAAY;
|
|
1
|
+
{"version":3,"file":"clock-drift.d.ts","sourceRoot":"","sources":["../../src/prerequisites/clock-drift.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,KAAK,MAAM,cAAc,CAAC;AACtC,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,eAAe,CAAC;AAC/C,OAAO,KAAK,OAAO,MAAM,0BAA0B,CAAC;AACpD,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,oBAAoB,CAAC;AAIzD,KAAK,YAAY,GAAG;IAAE,UAAU,CAAC,EAAE,cAAc,CAAA;CAAE,CAAC;AAEpD,qBAAa,sBAAuB,YAAW,OAAO,CAAC,YAAY;IAU/D,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAC;IATxB,QAAQ,CAAC,IAAI,iBAAiB;IAC9B,QAAQ,CAAC,KAAK,EAAE,OAAO,CAAC,qBAAqB,CAAC;IAC9C,QAAQ,CAAC,OAAO,CAAC,EAAE,OAAO,CAAQ;IAElC,QAAQ,CAAC,IAAI,EAAE,KAAK,CAAC,QAAQ,CAAC;IAC9B,QAAQ,CAAC,OAAO,EAAE,KAAK,CAAC,QAAQ,CAAC;gBAG/B,MAAM,EAAE,OAAO,CAAC,sBAAsB,GAAG;QAAE,IAAI,EAAE,KAAK,CAAC,QAAQ,CAAC;QAAC,OAAO,CAAC,EAAE,KAAK,CAAC,QAAQ,CAAA;KAAE,EAC1E,IAAI,CAAC,EAAE,YAAY,YAAA;IAShC,MAAM,CAAC,KAAK,EAAE,SAAS,GAAG,OAAO,CAAC,OAAO,CAAC,aAAa,CAAC;CAsB/D"}
|
|
@@ -3,25 +3,26 @@ import * as prereqs from "../prerequisites.service";
|
|
|
3
3
|
import { TimekeeperGoogleAdapter } from "../timekeeper-google.adapter";
|
|
4
4
|
import { Timeout } from "../timeout.service";
|
|
5
5
|
export class PrerequisiteClockDrift {
|
|
6
|
+
deps;
|
|
6
7
|
kind = "clock-drift";
|
|
7
8
|
label;
|
|
8
9
|
enabled = true;
|
|
9
10
|
skew;
|
|
10
|
-
Timekeeper;
|
|
11
11
|
timeout;
|
|
12
|
-
constructor(config) {
|
|
12
|
+
constructor(config, deps) {
|
|
13
|
+
this.deps = deps;
|
|
13
14
|
this.label = config.label;
|
|
14
15
|
this.enabled = config.enabled === undefined ? true : config.enabled;
|
|
15
16
|
this.skew = config.skew;
|
|
16
|
-
this.Timekeeper = config.Timekeeper ?? new TimekeeperGoogleAdapter();
|
|
17
17
|
this.timeout = config.timeout ?? tools.Duration.Seconds(2);
|
|
18
18
|
}
|
|
19
19
|
async verify(clock) {
|
|
20
|
+
const Timekeeper = this.deps?.Timekeeper ?? new TimekeeperGoogleAdapter();
|
|
20
21
|
const stopwatch = new tools.Stopwatch(clock.now());
|
|
21
22
|
if (!this.enabled)
|
|
22
23
|
return prereqs.Verification.undetermined(stopwatch.stop());
|
|
23
24
|
try {
|
|
24
|
-
const timestamp = await Timeout.cancellable((signal) =>
|
|
25
|
+
const timestamp = await Timeout.cancellable((signal) => Timekeeper.get(signal), this.timeout);
|
|
25
26
|
if (!timestamp)
|
|
26
27
|
return prereqs.Verification.undetermined(stopwatch.stop());
|
|
27
28
|
const duration = clock.now().difference(timestamp).toAbsolute();
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"clock-drift.js","sourceRoot":"","sources":["../../src/prerequisites/clock-drift.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,KAAK,MAAM,cAAc,CAAC;AAEtC,OAAO,KAAK,OAAO,MAAM,0BAA0B,CAAC;AAEpD,OAAO,EAAE,uBAAuB,EAAE,MAAM,8BAA8B,CAAC;AACvE,OAAO,EAAE,OAAO,EAAE,MAAM,oBAAoB,CAAC;
|
|
1
|
+
{"version":3,"file":"clock-drift.js","sourceRoot":"","sources":["../../src/prerequisites/clock-drift.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,KAAK,MAAM,cAAc,CAAC;AAEtC,OAAO,KAAK,OAAO,MAAM,0BAA0B,CAAC;AAEpD,OAAO,EAAE,uBAAuB,EAAE,MAAM,8BAA8B,CAAC;AACvE,OAAO,EAAE,OAAO,EAAE,MAAM,oBAAoB,CAAC;AAI7C,MAAM,OAAO,sBAAsB;IAUd;IATV,IAAI,GAAG,aAAa,CAAC;IACrB,KAAK,CAAgC;IACrC,OAAO,GAAa,IAAI,CAAC;IAEzB,IAAI,CAAiB;IACrB,OAAO,CAAiB;IAEjC,YACE,MAA2F,EAC1E,IAAmB;QAAnB,SAAI,GAAJ,IAAI,CAAe;QAEpC,IAAI,CAAC,KAAK,GAAG,MAAM,CAAC,KAAK,CAAC;QAC1B,IAAI,CAAC,OAAO,GAAG,MAAM,CAAC,OAAO,KAAK,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC;QAEpE,IAAI,CAAC,IAAI,GAAG,MAAM,CAAC,IAAI,CAAC;QACxB,IAAI,CAAC,OAAO,GAAG,MAAM,CAAC,OAAO,IAAI,KAAK,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC;IAC7D,CAAC;IAED,KAAK,CAAC,MAAM,CAAC,KAAgB;QAC3B,MAAM,UAAU,GAAG,IAAI,CAAC,IAAI,EAAE,UAAU,IAAI,IAAI,uBAAuB,EAAE,CAAC;QAE1E,MAAM,SAAS,GAAG,IAAI,KAAK,CAAC,SAAS,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,CAAC;QAEnD,IAAI,CAAC,IAAI,CAAC,OAAO;YAAE,OAAO,OAAO,CAAC,YAAY,CAAC,YAAY,CAAC,SAAS,CAAC,IAAI,EAAE,CAAC,CAAC;QAE9E,IAAI,CAAC;YACH,MAAM,SAAS,GAAG,MAAM,OAAO,CAAC,WAAW,CACzC,CAAC,MAAmB,EAAE,EAAE,CAAC,UAAU,CAAC,GAAG,CAAC,MAAM,CAAC,EAC/C,IAAI,CAAC,OAAO,CACb,CAAC;YACF,IAAI,CAAC,SAAS;gBAAE,OAAO,OAAO,CAAC,YAAY,CAAC,YAAY,CAAC,SAAS,CAAC,IAAI,EAAE,CAAC,CAAC;YAE3E,MAAM,QAAQ,GAAG,KAAK,CAAC,GAAG,EAAE,CAAC,UAAU,CAAC,SAAS,CAAC,CAAC,UAAU,EAAE,CAAC;YAEhE,IAAI,QAAQ,CAAC,aAAa,CAAC,IAAI,CAAC,IAAI,CAAC;gBAAE,OAAO,OAAO,CAAC,YAAY,CAAC,OAAO,CAAC,SAAS,CAAC,IAAI,EAAE,CAAC,CAAC;YAC7F,OAAO,OAAO,CAAC,YAAY,CAAC,OAAO,CAAC,SAAS,CAAC,IAAI,EAAE,EAAE,EAAE,OAAO,EAAE,eAAe,QAAQ,CAAC,OAAO,GAAG,EAAE,CAAC,CAAC;QACzG,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,OAAO,OAAO,CAAC,YAAY,CAAC,YAAY,CAAC,SAAS,CAAC,IAAI,EAAE,CAAC,CAAC;QAC7D,CAAC;IACH,CAAC;CACF"}
|
|
@@ -1,14 +1,16 @@
|
|
|
1
1
|
import type { ClockPort } from "../clock.port";
|
|
2
2
|
import type { LoggerPort } from "../logger.port";
|
|
3
3
|
import * as prereqs from "../prerequisites.service";
|
|
4
|
+
type Dependencies = {
|
|
5
|
+
Logger: LoggerPort;
|
|
6
|
+
};
|
|
4
7
|
export declare class PrerequisiteLogFile implements prereqs.Prerequisite {
|
|
8
|
+
private readonly deps;
|
|
5
9
|
readonly kind = "log-file";
|
|
6
10
|
readonly label: prereqs.PrerequisiteLabelType;
|
|
7
11
|
readonly enabled?: boolean;
|
|
8
|
-
|
|
9
|
-
constructor(config: prereqs.PrerequisiteConfigType & {
|
|
10
|
-
Logger: LoggerPort;
|
|
11
|
-
});
|
|
12
|
+
constructor(config: prereqs.PrerequisiteConfigType, deps: Dependencies);
|
|
12
13
|
verify(clock: ClockPort): Promise<prereqs.VerifyOutcome>;
|
|
13
14
|
}
|
|
15
|
+
export {};
|
|
14
16
|
//# sourceMappingURL=log-file.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"log-file.d.ts","sourceRoot":"","sources":["../../src/prerequisites/log-file.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,eAAe,CAAC;AAC/C,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,gBAAgB,CAAC;AACjD,OAAO,KAAK,OAAO,MAAM,0BAA0B,CAAC;AAEpD,qBAAa,mBAAoB,YAAW,OAAO,CAAC,YAAY;
|
|
1
|
+
{"version":3,"file":"log-file.d.ts","sourceRoot":"","sources":["../../src/prerequisites/log-file.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,eAAe,CAAC;AAC/C,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,gBAAgB,CAAC;AACjD,OAAO,KAAK,OAAO,MAAM,0BAA0B,CAAC;AAEpD,KAAK,YAAY,GAAG;IAAE,MAAM,EAAE,UAAU,CAAA;CAAE,CAAC;AAE3C,qBAAa,mBAAoB,YAAW,OAAO,CAAC,YAAY;IAO5D,OAAO,CAAC,QAAQ,CAAC,IAAI;IANvB,QAAQ,CAAC,IAAI,cAAc;IAC3B,QAAQ,CAAC,KAAK,EAAE,OAAO,CAAC,qBAAqB,CAAC;IAC9C,QAAQ,CAAC,OAAO,CAAC,EAAE,OAAO,CAAQ;gBAGhC,MAAM,EAAE,OAAO,CAAC,sBAAsB,EACrB,IAAI,EAAE,YAAY;IAM/B,MAAM,CAAC,KAAK,EAAE,SAAS,GAAG,OAAO,CAAC,OAAO,CAAC,aAAa,CAAC;CAiB/D"}
|
|
@@ -1,21 +1,21 @@
|
|
|
1
1
|
import * as tools from "@bgord/tools";
|
|
2
2
|
import * as prereqs from "../prerequisites.service";
|
|
3
3
|
export class PrerequisiteLogFile {
|
|
4
|
+
deps;
|
|
4
5
|
kind = "log-file";
|
|
5
6
|
label;
|
|
6
7
|
enabled = true;
|
|
7
|
-
|
|
8
|
-
|
|
8
|
+
constructor(config, deps) {
|
|
9
|
+
this.deps = deps;
|
|
9
10
|
this.label = config.label;
|
|
10
11
|
this.enabled = config.enabled === undefined ? true : config.enabled;
|
|
11
|
-
this.Logger = config.Logger;
|
|
12
12
|
}
|
|
13
13
|
async verify(clock) {
|
|
14
14
|
const stopwatch = new tools.Stopwatch(clock.now());
|
|
15
15
|
if (!this.enabled)
|
|
16
16
|
return prereqs.Verification.undetermined(stopwatch.stop());
|
|
17
17
|
try {
|
|
18
|
-
const path = this.Logger.getFilePath();
|
|
18
|
+
const path = this.deps.Logger.getFilePath();
|
|
19
19
|
if (!path)
|
|
20
20
|
return prereqs.Verification.undetermined(stopwatch.stop());
|
|
21
21
|
const result = await Bun.file(path.get()).exists();
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"log-file.js","sourceRoot":"","sources":["../../src/prerequisites/log-file.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,KAAK,MAAM,cAAc,CAAC;AAGtC,OAAO,KAAK,OAAO,MAAM,0BAA0B,CAAC;
|
|
1
|
+
{"version":3,"file":"log-file.js","sourceRoot":"","sources":["../../src/prerequisites/log-file.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,KAAK,MAAM,cAAc,CAAC;AAGtC,OAAO,KAAK,OAAO,MAAM,0BAA0B,CAAC;AAIpD,MAAM,OAAO,mBAAmB;IAOX;IANV,IAAI,GAAG,UAAU,CAAC;IAClB,KAAK,CAAgC;IACrC,OAAO,GAAa,IAAI,CAAC;IAElC,YACE,MAAsC,EACrB,IAAkB;QAAlB,SAAI,GAAJ,IAAI,CAAc;QAEnC,IAAI,CAAC,KAAK,GAAG,MAAM,CAAC,KAAK,CAAC;QAC1B,IAAI,CAAC,OAAO,GAAG,MAAM,CAAC,OAAO,KAAK,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC;IACtE,CAAC;IAED,KAAK,CAAC,MAAM,CAAC,KAAgB;QAC3B,MAAM,SAAS,GAAG,IAAI,KAAK,CAAC,SAAS,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,CAAC;QAEnD,IAAI,CAAC,IAAI,CAAC,OAAO;YAAE,OAAO,OAAO,CAAC,YAAY,CAAC,YAAY,CAAC,SAAS,CAAC,IAAI,EAAE,CAAC,CAAC;QAE9E,IAAI,CAAC;YACH,MAAM,IAAI,GAAG,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,WAAW,EAAE,CAAC;YAC5C,IAAI,CAAC,IAAI;gBAAE,OAAO,OAAO,CAAC,YAAY,CAAC,YAAY,CAAC,SAAS,CAAC,IAAI,EAAE,CAAC,CAAC;YAEtE,MAAM,MAAM,GAAG,MAAM,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC;YAEnD,IAAI,MAAM;gBAAE,OAAO,OAAO,CAAC,YAAY,CAAC,OAAO,CAAC,SAAS,CAAC,IAAI,EAAE,CAAC,CAAC;YAClE,OAAO,OAAO,CAAC,YAAY,CAAC,OAAO,CAAC,SAAS,CAAC,IAAI,EAAE,EAAE,EAAE,OAAO,EAAE,iBAAiB,IAAI,CAAC,GAAG,EAAE,EAAE,EAAE,CAAC,CAAC;QACpG,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,OAAO,OAAO,CAAC,YAAY,CAAC,OAAO,CAAC,SAAS,CAAC,IAAI,EAAE,EAAE,KAAc,CAAC,CAAC;QACxE,CAAC;IACH,CAAC;CACF"}
|
|
@@ -2,16 +2,19 @@ import * as tools from "@bgord/tools";
|
|
|
2
2
|
import type { ClockPort } from "../clock.port";
|
|
3
3
|
import type { MailerPort } from "../mailer.port";
|
|
4
4
|
import * as prereqs from "../prerequisites.service";
|
|
5
|
+
type Dependencies = {
|
|
6
|
+
Mailer: MailerPort;
|
|
7
|
+
};
|
|
5
8
|
export declare class PrerequisiteMailer implements prereqs.Prerequisite {
|
|
9
|
+
private readonly deps;
|
|
6
10
|
readonly kind = "mailer";
|
|
7
11
|
readonly label: prereqs.PrerequisiteLabelType;
|
|
8
12
|
readonly enabled?: boolean;
|
|
9
|
-
private readonly Mailer;
|
|
10
13
|
readonly timeout: tools.Duration;
|
|
11
14
|
constructor(config: prereqs.PrerequisiteConfigType & {
|
|
12
|
-
Mailer: MailerPort;
|
|
13
15
|
timeout?: tools.Duration;
|
|
14
|
-
});
|
|
16
|
+
}, deps: Dependencies);
|
|
15
17
|
verify(clock: ClockPort): Promise<prereqs.VerifyOutcome>;
|
|
16
18
|
}
|
|
19
|
+
export {};
|
|
17
20
|
//# sourceMappingURL=mailer.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"mailer.d.ts","sourceRoot":"","sources":["../../src/prerequisites/mailer.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,KAAK,MAAM,cAAc,CAAC;AACtC,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,eAAe,CAAC;AAC/C,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,gBAAgB,CAAC;AACjD,OAAO,KAAK,OAAO,MAAM,0BAA0B,CAAC;AAGpD,qBAAa,kBAAmB,YAAW,OAAO,CAAC,YAAY;
|
|
1
|
+
{"version":3,"file":"mailer.d.ts","sourceRoot":"","sources":["../../src/prerequisites/mailer.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,KAAK,MAAM,cAAc,CAAC;AACtC,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,eAAe,CAAC;AAC/C,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,gBAAgB,CAAC;AACjD,OAAO,KAAK,OAAO,MAAM,0BAA0B,CAAC;AAGpD,KAAK,YAAY,GAAG;IAAE,MAAM,EAAE,UAAU,CAAA;CAAE,CAAC;AAE3C,qBAAa,kBAAmB,YAAW,OAAO,CAAC,YAAY;IAS3D,OAAO,CAAC,QAAQ,CAAC,IAAI;IARvB,QAAQ,CAAC,IAAI,YAAY;IACzB,QAAQ,CAAC,KAAK,EAAE,OAAO,CAAC,qBAAqB,CAAC;IAC9C,QAAQ,CAAC,OAAO,CAAC,EAAE,OAAO,CAAQ;IAElC,QAAQ,CAAC,OAAO,EAAE,KAAK,CAAC,QAAQ,CAAC;gBAG/B,MAAM,EAAE,OAAO,CAAC,sBAAsB,GAAG;QAAE,OAAO,CAAC,EAAE,KAAK,CAAC,QAAQ,CAAA;KAAE,EACpD,IAAI,EAAE,YAAY;IAQ/B,MAAM,CAAC,KAAK,EAAE,SAAS,GAAG,OAAO,CAAC,OAAO,CAAC,aAAa,CAAC;CAY/D"}
|
|
@@ -2,15 +2,15 @@ import * as tools from "@bgord/tools";
|
|
|
2
2
|
import * as prereqs from "../prerequisites.service";
|
|
3
3
|
import { Timeout } from "../timeout.service";
|
|
4
4
|
export class PrerequisiteMailer {
|
|
5
|
+
deps;
|
|
5
6
|
kind = "mailer";
|
|
6
7
|
label;
|
|
7
8
|
enabled = true;
|
|
8
|
-
Mailer;
|
|
9
9
|
timeout;
|
|
10
|
-
constructor(config) {
|
|
10
|
+
constructor(config, deps) {
|
|
11
|
+
this.deps = deps;
|
|
11
12
|
this.label = config.label;
|
|
12
13
|
this.enabled = config.enabled === undefined ? true : config.enabled;
|
|
13
|
-
this.Mailer = config.Mailer;
|
|
14
14
|
this.timeout = config.timeout ?? tools.Duration.Seconds(2);
|
|
15
15
|
}
|
|
16
16
|
async verify(clock) {
|
|
@@ -18,7 +18,7 @@ export class PrerequisiteMailer {
|
|
|
18
18
|
if (!this.enabled)
|
|
19
19
|
return prereqs.Verification.undetermined(stopwatch.stop());
|
|
20
20
|
try {
|
|
21
|
-
await Timeout.run(this.Mailer.verify(), this.timeout);
|
|
21
|
+
await Timeout.run(this.deps.Mailer.verify(), this.timeout);
|
|
22
22
|
return prereqs.Verification.success(stopwatch.stop());
|
|
23
23
|
}
|
|
24
24
|
catch (error) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"mailer.js","sourceRoot":"","sources":["../../src/prerequisites/mailer.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,KAAK,MAAM,cAAc,CAAC;AAGtC,OAAO,KAAK,OAAO,MAAM,0BAA0B,CAAC;AACpD,OAAO,EAAE,OAAO,EAAE,MAAM,oBAAoB,CAAC;
|
|
1
|
+
{"version":3,"file":"mailer.js","sourceRoot":"","sources":["../../src/prerequisites/mailer.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,KAAK,MAAM,cAAc,CAAC;AAGtC,OAAO,KAAK,OAAO,MAAM,0BAA0B,CAAC;AACpD,OAAO,EAAE,OAAO,EAAE,MAAM,oBAAoB,CAAC;AAI7C,MAAM,OAAO,kBAAkB;IASV;IARV,IAAI,GAAG,QAAQ,CAAC;IAChB,KAAK,CAAgC;IACrC,OAAO,GAAa,IAAI,CAAC;IAEzB,OAAO,CAAiB;IAEjC,YACE,MAAqE,EACpD,IAAkB;QAAlB,SAAI,GAAJ,IAAI,CAAc;QAEnC,IAAI,CAAC,KAAK,GAAG,MAAM,CAAC,KAAK,CAAC;QAC1B,IAAI,CAAC,OAAO,GAAG,MAAM,CAAC,OAAO,KAAK,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC;QAEpE,IAAI,CAAC,OAAO,GAAG,MAAM,CAAC,OAAO,IAAI,KAAK,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC;IAC7D,CAAC;IAED,KAAK,CAAC,MAAM,CAAC,KAAgB;QAC3B,MAAM,SAAS,GAAG,IAAI,KAAK,CAAC,SAAS,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,CAAC;QAEnD,IAAI,CAAC,IAAI,CAAC,OAAO;YAAE,OAAO,OAAO,CAAC,YAAY,CAAC,YAAY,CAAC,SAAS,CAAC,IAAI,EAAE,CAAC,CAAC;QAE9E,IAAI,CAAC;YACH,MAAM,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,MAAM,EAAE,EAAE,IAAI,CAAC,OAAO,CAAC,CAAC;YAC3D,OAAO,OAAO,CAAC,YAAY,CAAC,OAAO,CAAC,SAAS,CAAC,IAAI,EAAE,CAAC,CAAC;QACxD,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,OAAO,OAAO,CAAC,YAAY,CAAC,OAAO,CAAC,SAAS,CAAC,IAAI,EAAE,EAAE,KAAc,CAAC,CAAC;QACxE,CAAC;IACH,CAAC;CACF"}
|
|
@@ -2,16 +2,19 @@ import * as tools from "@bgord/tools";
|
|
|
2
2
|
import type { ClockPort } from "../clock.port";
|
|
3
3
|
import type { DiskSpaceCheckerPort } from "../disk-space-checker.port";
|
|
4
4
|
import * as prereqs from "../prerequisites.service";
|
|
5
|
+
type Dependencies = {
|
|
6
|
+
DiskSpaceChecker?: DiskSpaceCheckerPort;
|
|
7
|
+
};
|
|
5
8
|
export declare class PrerequisiteSpace implements prereqs.Prerequisite {
|
|
9
|
+
private readonly deps?;
|
|
6
10
|
readonly kind = "space";
|
|
7
11
|
readonly label: prereqs.PrerequisiteLabelType;
|
|
8
12
|
readonly enabled?: boolean;
|
|
9
13
|
private readonly minimum;
|
|
10
|
-
private readonly DiskSpaceChecker;
|
|
11
14
|
constructor(config: prereqs.PrerequisiteConfigType & {
|
|
12
15
|
minimum: tools.Size;
|
|
13
|
-
|
|
14
|
-
});
|
|
16
|
+
}, deps?: Dependencies | undefined);
|
|
15
17
|
verify(clock: ClockPort): Promise<prereqs.VerifyOutcome>;
|
|
16
18
|
}
|
|
19
|
+
export {};
|
|
17
20
|
//# sourceMappingURL=space.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"space.d.ts","sourceRoot":"","sources":["../../src/prerequisites/space.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,KAAK,MAAM,cAAc,CAAC;AACtC,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,eAAe,CAAC;AAC/C,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,4BAA4B,CAAC;AAEvE,OAAO,KAAK,OAAO,MAAM,0BAA0B,CAAC;AAEpD,qBAAa,iBAAkB,YAAW,OAAO,CAAC,YAAY;
|
|
1
|
+
{"version":3,"file":"space.d.ts","sourceRoot":"","sources":["../../src/prerequisites/space.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,KAAK,MAAM,cAAc,CAAC;AACtC,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,eAAe,CAAC;AAC/C,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,4BAA4B,CAAC;AAEvE,OAAO,KAAK,OAAO,MAAM,0BAA0B,CAAC;AAEpD,KAAK,YAAY,GAAG;IAAE,gBAAgB,CAAC,EAAE,oBAAoB,CAAA;CAAE,CAAC;AAEhE,qBAAa,iBAAkB,YAAW,OAAO,CAAC,YAAY;IAS1D,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAC;IARxB,QAAQ,CAAC,IAAI,WAAW;IACxB,QAAQ,CAAC,KAAK,EAAE,OAAO,CAAC,qBAAqB,CAAC;IAC9C,QAAQ,CAAC,OAAO,CAAC,EAAE,OAAO,CAAQ;IAElC,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAa;gBAGnC,MAAM,EAAE,OAAO,CAAC,sBAAsB,GAAG;QAAE,OAAO,EAAE,KAAK,CAAC,IAAI,CAAA;KAAE,EAC/C,IAAI,CAAC,EAAE,YAAY,YAAA;IAQhC,MAAM,CAAC,KAAK,EAAE,SAAS,GAAG,OAAO,CAAC,OAAO,CAAC,aAAa,CAAC;CAkB/D"}
|
|
@@ -3,24 +3,25 @@ import * as tools from "@bgord/tools";
|
|
|
3
3
|
import { DiskSpaceCheckerBunAdapter } from "../disk-space-checker-bun.adapter";
|
|
4
4
|
import * as prereqs from "../prerequisites.service";
|
|
5
5
|
export class PrerequisiteSpace {
|
|
6
|
+
deps;
|
|
6
7
|
kind = "space";
|
|
7
8
|
label;
|
|
8
9
|
enabled = true;
|
|
9
10
|
minimum;
|
|
10
|
-
|
|
11
|
-
|
|
11
|
+
constructor(config, deps) {
|
|
12
|
+
this.deps = deps;
|
|
12
13
|
this.label = config.label;
|
|
13
14
|
this.enabled = config.enabled === undefined ? true : config.enabled;
|
|
14
15
|
this.minimum = config.minimum;
|
|
15
|
-
this.DiskSpaceChecker = config.DiskSpaceChecker ?? new DiskSpaceCheckerBunAdapter();
|
|
16
16
|
}
|
|
17
17
|
async verify(clock) {
|
|
18
|
+
const DiskSpaceChecker = this.deps?.DiskSpaceChecker ?? new DiskSpaceCheckerBunAdapter();
|
|
18
19
|
const stopwatch = new tools.Stopwatch(clock.now());
|
|
19
20
|
if (!this.enabled)
|
|
20
21
|
return prereqs.Verification.undetermined(stopwatch.stop());
|
|
21
22
|
try {
|
|
22
23
|
const root = path.sep;
|
|
23
|
-
const freeDiskSpace = await
|
|
24
|
+
const freeDiskSpace = await DiskSpaceChecker.get(root);
|
|
24
25
|
if (freeDiskSpace.isGreaterThan(this.minimum))
|
|
25
26
|
return prereqs.Verification.success(stopwatch.stop());
|
|
26
27
|
return prereqs.Verification.failure(stopwatch.stop(), {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"space.js","sourceRoot":"","sources":["../../src/prerequisites/space.ts"],"names":[],"mappings":"AAAA,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,KAAK,KAAK,MAAM,cAAc,CAAC;AAGtC,OAAO,EAAE,0BAA0B,EAAE,MAAM,mCAAmC,CAAC;AAC/E,OAAO,KAAK,OAAO,MAAM,0BAA0B,CAAC;
|
|
1
|
+
{"version":3,"file":"space.js","sourceRoot":"","sources":["../../src/prerequisites/space.ts"],"names":[],"mappings":"AAAA,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,KAAK,KAAK,MAAM,cAAc,CAAC;AAGtC,OAAO,EAAE,0BAA0B,EAAE,MAAM,mCAAmC,CAAC;AAC/E,OAAO,KAAK,OAAO,MAAM,0BAA0B,CAAC;AAIpD,MAAM,OAAO,iBAAiB;IAST;IARV,IAAI,GAAG,OAAO,CAAC;IACf,KAAK,CAAgC;IACrC,OAAO,GAAa,IAAI,CAAC;IAEjB,OAAO,CAAa;IAErC,YACE,MAAgE,EAC/C,IAAmB;QAAnB,SAAI,GAAJ,IAAI,CAAe;QAEpC,IAAI,CAAC,KAAK,GAAG,MAAM,CAAC,KAAK,CAAC;QAC1B,IAAI,CAAC,OAAO,GAAG,MAAM,CAAC,OAAO,KAAK,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC;QAEpE,IAAI,CAAC,OAAO,GAAG,MAAM,CAAC,OAAO,CAAC;IAChC,CAAC;IAED,KAAK,CAAC,MAAM,CAAC,KAAgB;QAC3B,MAAM,gBAAgB,GAAG,IAAI,CAAC,IAAI,EAAE,gBAAgB,IAAI,IAAI,0BAA0B,EAAE,CAAC;QACzF,MAAM,SAAS,GAAG,IAAI,KAAK,CAAC,SAAS,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,CAAC;QAEnD,IAAI,CAAC,IAAI,CAAC,OAAO;YAAE,OAAO,OAAO,CAAC,YAAY,CAAC,YAAY,CAAC,SAAS,CAAC,IAAI,EAAE,CAAC,CAAC;QAE9E,IAAI,CAAC;YACH,MAAM,IAAI,GAAG,IAAI,CAAC,GAAG,CAAC;YACtB,MAAM,aAAa,GAAG,MAAM,gBAAgB,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;YAEvD,IAAI,aAAa,CAAC,aAAa,CAAC,IAAI,CAAC,OAAO,CAAC;gBAAE,OAAO,OAAO,CAAC,YAAY,CAAC,OAAO,CAAC,SAAS,CAAC,IAAI,EAAE,CAAC,CAAC;YACrG,OAAO,OAAO,CAAC,YAAY,CAAC,OAAO,CAAC,SAAS,CAAC,IAAI,EAAE,EAAE;gBACpD,OAAO,EAAE,oBAAoB,aAAa,CAAC,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,EAAE;aACxE,CAAC,CAAC;QACL,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,OAAO,OAAO,CAAC,YAAY,CAAC,OAAO,CAAC,SAAS,CAAC,IAAI,EAAE,EAAE,KAAc,CAAC,CAAC;QACxE,CAAC;IACH,CAAC;CACF"}
|
|
@@ -1,18 +1,21 @@
|
|
|
1
1
|
import type { CertificateInspectorPort } from "../certificate-inspector.port";
|
|
2
2
|
import type { ClockPort } from "../clock.port";
|
|
3
3
|
import * as prereqs from "../prerequisites.service";
|
|
4
|
+
type Dependencies = {
|
|
5
|
+
CertificateInspector: CertificateInspectorPort;
|
|
6
|
+
};
|
|
4
7
|
export declare class PrerequisiteSSLCertificateExpiry implements prereqs.Prerequisite {
|
|
8
|
+
private readonly deps;
|
|
5
9
|
readonly kind = "ssl-certificate-expiry";
|
|
6
10
|
readonly label: prereqs.PrerequisiteLabelType;
|
|
7
11
|
readonly enabled?: boolean;
|
|
8
12
|
private readonly hostname;
|
|
9
13
|
private readonly days;
|
|
10
|
-
private readonly CertificateInspector;
|
|
11
14
|
constructor(config: prereqs.PrerequisiteConfigType & {
|
|
12
15
|
hostname: string;
|
|
13
16
|
days: number;
|
|
14
|
-
|
|
15
|
-
});
|
|
17
|
+
}, deps: Dependencies);
|
|
16
18
|
verify(clock: ClockPort): Promise<prereqs.VerifyOutcome>;
|
|
17
19
|
}
|
|
20
|
+
export {};
|
|
18
21
|
//# sourceMappingURL=ssl-certificate-expiry.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ssl-certificate-expiry.d.ts","sourceRoot":"","sources":["../../src/prerequisites/ssl-certificate-expiry.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,wBAAwB,EAAE,MAAM,+BAA+B,CAAC;AAC9E,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,eAAe,CAAC;AAC/C,OAAO,KAAK,OAAO,MAAM,0BAA0B,CAAC;AAEpD,qBAAa,gCAAiC,YAAW,OAAO,CAAC,YAAY;
|
|
1
|
+
{"version":3,"file":"ssl-certificate-expiry.d.ts","sourceRoot":"","sources":["../../src/prerequisites/ssl-certificate-expiry.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,wBAAwB,EAAE,MAAM,+BAA+B,CAAC;AAC9E,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,eAAe,CAAC;AAC/C,OAAO,KAAK,OAAO,MAAM,0BAA0B,CAAC;AAEpD,KAAK,YAAY,GAAG;IAAE,oBAAoB,EAAE,wBAAwB,CAAA;CAAE,CAAC;AAEvE,qBAAa,gCAAiC,YAAW,OAAO,CAAC,YAAY;IAUzE,OAAO,CAAC,QAAQ,CAAC,IAAI;IATvB,QAAQ,CAAC,IAAI,4BAA4B;IACzC,QAAQ,CAAC,KAAK,EAAE,OAAO,CAAC,qBAAqB,CAAC;IAC9C,QAAQ,CAAC,OAAO,CAAC,EAAE,OAAO,CAAQ;IAElC,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAS;IAClC,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAS;gBAG5B,MAAM,EAAE,OAAO,CAAC,sBAAsB,GAAG;QAAE,QAAQ,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAA;KAAE,EAC1D,IAAI,EAAE,YAAY;IAS/B,MAAM,CAAC,KAAK,EAAE,SAAS,GAAG,OAAO,CAAC,OAAO,CAAC,aAAa,CAAC;CAgB/D"}
|
|
@@ -1,24 +1,24 @@
|
|
|
1
1
|
import * as tools from "@bgord/tools";
|
|
2
2
|
import * as prereqs from "../prerequisites.service";
|
|
3
3
|
export class PrerequisiteSSLCertificateExpiry {
|
|
4
|
+
deps;
|
|
4
5
|
kind = "ssl-certificate-expiry";
|
|
5
6
|
label;
|
|
6
7
|
enabled = true;
|
|
7
8
|
hostname;
|
|
8
9
|
days;
|
|
9
|
-
|
|
10
|
-
|
|
10
|
+
constructor(config, deps) {
|
|
11
|
+
this.deps = deps;
|
|
11
12
|
this.label = config.label;
|
|
12
13
|
this.enabled = config.enabled === undefined ? true : config.enabled;
|
|
13
14
|
this.hostname = config.hostname;
|
|
14
15
|
this.days = config.days;
|
|
15
|
-
this.CertificateInspector = config.CertificateInspector;
|
|
16
16
|
}
|
|
17
17
|
async verify(clock) {
|
|
18
18
|
const stopwatch = new tools.Stopwatch(clock.now());
|
|
19
19
|
if (!this.enabled)
|
|
20
20
|
return prereqs.Verification.undetermined(stopwatch.stop());
|
|
21
|
-
const result = await this.CertificateInspector.inspect(this.hostname);
|
|
21
|
+
const result = await this.deps.CertificateInspector.inspect(this.hostname);
|
|
22
22
|
if (!result.success)
|
|
23
23
|
return prereqs.Verification.failure(stopwatch.stop(), { message: "Certificate unavailable" });
|
|
24
24
|
if (result.daysRemaining <= this.days) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ssl-certificate-expiry.js","sourceRoot":"","sources":["../../src/prerequisites/ssl-certificate-expiry.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,KAAK,MAAM,cAAc,CAAC;AAGtC,OAAO,KAAK,OAAO,MAAM,0BAA0B,CAAC;
|
|
1
|
+
{"version":3,"file":"ssl-certificate-expiry.js","sourceRoot":"","sources":["../../src/prerequisites/ssl-certificate-expiry.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,KAAK,MAAM,cAAc,CAAC;AAGtC,OAAO,KAAK,OAAO,MAAM,0BAA0B,CAAC;AAIpD,MAAM,OAAO,gCAAgC;IAUxB;IATV,IAAI,GAAG,wBAAwB,CAAC;IAChC,KAAK,CAAgC;IACrC,OAAO,GAAa,IAAI,CAAC;IAEjB,QAAQ,CAAS;IACjB,IAAI,CAAS;IAE9B,YACE,MAA2E,EAC1D,IAAkB;QAAlB,SAAI,GAAJ,IAAI,CAAc;QAEnC,IAAI,CAAC,KAAK,GAAG,MAAM,CAAC,KAAK,CAAC;QAC1B,IAAI,CAAC,OAAO,GAAG,MAAM,CAAC,OAAO,KAAK,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC;QAEpE,IAAI,CAAC,QAAQ,GAAG,MAAM,CAAC,QAAQ,CAAC;QAChC,IAAI,CAAC,IAAI,GAAG,MAAM,CAAC,IAAI,CAAC;IAC1B,CAAC;IAED,KAAK,CAAC,MAAM,CAAC,KAAgB;QAC3B,MAAM,SAAS,GAAG,IAAI,KAAK,CAAC,SAAS,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,CAAC;QAEnD,IAAI,CAAC,IAAI,CAAC,OAAO;YAAE,OAAO,OAAO,CAAC,YAAY,CAAC,YAAY,CAAC,SAAS,CAAC,IAAI,EAAE,CAAC,CAAC;QAE9E,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,IAAI,CAAC,oBAAoB,CAAC,OAAO,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;QAE3E,IAAI,CAAC,MAAM,CAAC,OAAO;YACjB,OAAO,OAAO,CAAC,YAAY,CAAC,OAAO,CAAC,SAAS,CAAC,IAAI,EAAE,EAAE,EAAE,OAAO,EAAE,yBAAyB,EAAE,CAAC,CAAC;QAChG,IAAI,MAAM,CAAC,aAAa,IAAI,IAAI,CAAC,IAAI,EAAE,CAAC;YACtC,OAAO,OAAO,CAAC,YAAY,CAAC,OAAO,CAAC,SAAS,CAAC,IAAI,EAAE,EAAE;gBACpD,OAAO,EAAE,GAAG,MAAM,CAAC,aAAa,iBAAiB;aAClD,CAAC,CAAC;QACL,CAAC;QACD,OAAO,OAAO,CAAC,YAAY,CAAC,OAAO,CAAC,SAAS,CAAC,IAAI,EAAE,CAAC,CAAC;IACxD,CAAC;CACF"}
|
|
@@ -4,20 +4,22 @@ import { I18n } from "../i18n.service";
|
|
|
4
4
|
import type { JsonFileReaderPort } from "../json-file-reader.port";
|
|
5
5
|
import type { LoggerPort } from "../logger.port";
|
|
6
6
|
import * as prereqs from "../prerequisites.service";
|
|
7
|
+
type Dependencies = {
|
|
8
|
+
Logger: LoggerPort;
|
|
9
|
+
JsonFileReader?: JsonFileReaderPort;
|
|
10
|
+
};
|
|
7
11
|
export declare class PrerequisiteTranslations implements prereqs.Prerequisite {
|
|
12
|
+
private readonly deps;
|
|
8
13
|
readonly kind = "translations";
|
|
9
14
|
readonly label: prereqs.PrerequisiteLabelType;
|
|
10
15
|
readonly enabled?: boolean;
|
|
11
16
|
private readonly translationsPath?;
|
|
12
17
|
private readonly supportedLanguages;
|
|
13
|
-
private readonly Logger;
|
|
14
|
-
private readonly JsonFileReader;
|
|
15
18
|
constructor(config: prereqs.PrerequisiteConfigType & {
|
|
16
19
|
translationsPath?: typeof I18n.DEFAULT_TRANSLATIONS_PATH;
|
|
17
20
|
supportedLanguages: types.I18nConfigType["supportedLanguages"];
|
|
18
|
-
|
|
19
|
-
JsonFileReader?: JsonFileReaderPort;
|
|
20
|
-
});
|
|
21
|
+
}, deps: Dependencies);
|
|
21
22
|
verify(clock: ClockPort): Promise<prereqs.VerifyOutcome>;
|
|
22
23
|
}
|
|
24
|
+
export {};
|
|
23
25
|
//# sourceMappingURL=translations.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"translations.d.ts","sourceRoot":"","sources":["../../src/prerequisites/translations.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,eAAe,CAAC;AAC/C,OAAO,KAAK,KAAK,KAAK,MAAM,iBAAiB,CAAC;AAC9C,OAAO,EAAE,IAAI,EAAE,MAAM,iBAAiB,CAAC;AACvC,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,0BAA0B,CAAC;AAEnE,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,gBAAgB,CAAC;AACjD,OAAO,KAAK,OAAO,MAAM,0BAA0B,CAAC;AAQpD,qBAAa,wBAAyB,YAAW,OAAO,CAAC,YAAY;
|
|
1
|
+
{"version":3,"file":"translations.d.ts","sourceRoot":"","sources":["../../src/prerequisites/translations.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,eAAe,CAAC;AAC/C,OAAO,KAAK,KAAK,KAAK,MAAM,iBAAiB,CAAC;AAC9C,OAAO,EAAE,IAAI,EAAE,MAAM,iBAAiB,CAAC;AACvC,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,0BAA0B,CAAC;AAEnE,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,gBAAgB,CAAC;AACjD,OAAO,KAAK,OAAO,MAAM,0BAA0B,CAAC;AAQpD,KAAK,YAAY,GAAG;IAAE,MAAM,EAAE,UAAU,CAAC;IAAC,cAAc,CAAC,EAAE,kBAAkB,CAAA;CAAE,CAAC;AAEhF,qBAAa,wBAAyB,YAAW,OAAO,CAAC,YAAY;IAajE,OAAO,CAAC,QAAQ,CAAC,IAAI;IAZvB,QAAQ,CAAC,IAAI,kBAAkB;IAC/B,QAAQ,CAAC,KAAK,EAAE,OAAO,CAAC,qBAAqB,CAAC;IAC9C,QAAQ,CAAC,OAAO,CAAC,EAAE,OAAO,CAAQ;IAElC,OAAO,CAAC,QAAQ,CAAC,gBAAgB,CAAC,CAAwC;IAC1E,OAAO,CAAC,QAAQ,CAAC,kBAAkB,CAA6C;gBAG9E,MAAM,EAAE,OAAO,CAAC,sBAAsB,GAAG;QACvC,gBAAgB,CAAC,EAAE,OAAO,IAAI,CAAC,yBAAyB,CAAC;QACzD,kBAAkB,EAAE,KAAK,CAAC,cAAc,CAAC,oBAAoB,CAAC,CAAC;KAChE,EACgB,IAAI,EAAE,YAAY;IAS/B,MAAM,CAAC,KAAK,EAAE,SAAS,GAAG,OAAO,CAAC,OAAO,CAAC,aAAa,CAAC;CA6D/D"}
|
|
@@ -5,28 +5,27 @@ import { I18n } from "../i18n.service";
|
|
|
5
5
|
import { JsonFileReaderBunForgivingAdapter } from "../json-file-reader-bun-forgiving.adapter";
|
|
6
6
|
import * as prereqs from "../prerequisites.service";
|
|
7
7
|
export class PrerequisiteTranslations {
|
|
8
|
+
deps;
|
|
8
9
|
kind = "translations";
|
|
9
10
|
label;
|
|
10
11
|
enabled = true;
|
|
11
12
|
translationsPath;
|
|
12
13
|
supportedLanguages;
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
constructor(config) {
|
|
14
|
+
constructor(config, deps) {
|
|
15
|
+
this.deps = deps;
|
|
16
16
|
this.label = config.label;
|
|
17
17
|
this.enabled = config.enabled === undefined ? true : config.enabled;
|
|
18
18
|
this.translationsPath = config.translationsPath;
|
|
19
19
|
this.supportedLanguages = config.supportedLanguages;
|
|
20
|
-
this.Logger = config.Logger;
|
|
21
|
-
this.JsonFileReader = config.JsonFileReader ?? new JsonFileReaderBunForgivingAdapter();
|
|
22
20
|
}
|
|
23
21
|
async verify(clock) {
|
|
22
|
+
const JsonFileReader = this.deps.JsonFileReader ?? new JsonFileReaderBunForgivingAdapter();
|
|
24
23
|
const stopwatch = new tools.Stopwatch(clock.now());
|
|
25
24
|
if (!this.enabled)
|
|
26
25
|
return prereqs.Verification.undetermined(stopwatch.stop());
|
|
27
26
|
const translationsPath = this.translationsPath ?? I18n.DEFAULT_TRANSLATIONS_PATH;
|
|
28
27
|
const supportedLanguages = Object.keys(this.supportedLanguages);
|
|
29
|
-
const i18n = new I18n({ Logger: this.Logger, JsonFileReader:
|
|
28
|
+
const i18n = new I18n({ Logger: this.deps.Logger, JsonFileReader: JsonFileReader });
|
|
30
29
|
try {
|
|
31
30
|
await fsp.access(translationsPath, constants.R_OK);
|
|
32
31
|
for (const language of supportedLanguages) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"translations.js","sourceRoot":"","sources":["../../src/prerequisites/translations.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,SAAS,CAAC;AACpC,OAAO,GAAG,MAAM,kBAAkB,CAAC;AACnC,OAAO,KAAK,KAAK,MAAM,cAAc,CAAC;AAGtC,OAAO,EAAE,IAAI,EAAE,MAAM,iBAAiB,CAAC;AAEvC,OAAO,EAAE,iCAAiC,EAAE,MAAM,2CAA2C,CAAC;AAE9F,OAAO,KAAK,OAAO,MAAM,0BAA0B,CAAC;
|
|
1
|
+
{"version":3,"file":"translations.js","sourceRoot":"","sources":["../../src/prerequisites/translations.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,SAAS,CAAC;AACpC,OAAO,GAAG,MAAM,kBAAkB,CAAC;AACnC,OAAO,KAAK,KAAK,MAAM,cAAc,CAAC;AAGtC,OAAO,EAAE,IAAI,EAAE,MAAM,iBAAiB,CAAC;AAEvC,OAAO,EAAE,iCAAiC,EAAE,MAAM,2CAA2C,CAAC;AAE9F,OAAO,KAAK,OAAO,MAAM,0BAA0B,CAAC;AAUpD,MAAM,OAAO,wBAAwB;IAahB;IAZV,IAAI,GAAG,cAAc,CAAC;IACtB,KAAK,CAAgC;IACrC,OAAO,GAAa,IAAI,CAAC;IAEjB,gBAAgB,CAAyC;IACzD,kBAAkB,CAA6C;IAEhF,YACE,MAGC,EACgB,IAAkB;QAAlB,SAAI,GAAJ,IAAI,CAAc;QAEnC,IAAI,CAAC,KAAK,GAAG,MAAM,CAAC,KAAK,CAAC;QAC1B,IAAI,CAAC,OAAO,GAAG,MAAM,CAAC,OAAO,KAAK,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC;QAEpE,IAAI,CAAC,gBAAgB,GAAG,MAAM,CAAC,gBAAgB,CAAC;QAChD,IAAI,CAAC,kBAAkB,GAAG,MAAM,CAAC,kBAAkB,CAAC;IACtD,CAAC;IAED,KAAK,CAAC,MAAM,CAAC,KAAgB;QAC3B,MAAM,cAAc,GAAG,IAAI,CAAC,IAAI,CAAC,cAAc,IAAI,IAAI,iCAAiC,EAAE,CAAC;QAE3F,MAAM,SAAS,GAAG,IAAI,KAAK,CAAC,SAAS,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,CAAC;QAEnD,IAAI,CAAC,IAAI,CAAC,OAAO;YAAE,OAAO,OAAO,CAAC,YAAY,CAAC,YAAY,CAAC,SAAS,CAAC,IAAI,EAAE,CAAC,CAAC;QAE9E,MAAM,gBAAgB,GAAG,IAAI,CAAC,gBAAgB,IAAI,IAAI,CAAC,yBAAyB,CAAC;QAEjF,MAAM,kBAAkB,GAAG,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,kBAAkB,CAAC,CAAC;QAChE,MAAM,IAAI,GAAG,IAAI,IAAI,CAAC,EAAE,MAAM,EAAE,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,cAAc,EAAE,cAAc,EAAE,CAAC,CAAC;QAEpF,IAAI,CAAC;YACH,MAAM,GAAG,CAAC,MAAM,CAAC,gBAAgB,EAAE,SAAS,CAAC,IAAI,CAAC,CAAC;YAEnD,KAAK,MAAM,QAAQ,IAAI,kBAAkB,EAAE,CAAC;gBAC1C,MAAM,GAAG,CAAC,MAAM,CAAC,IAAI,CAAC,6BAA6B,CAAC,QAAQ,CAAC,CAAC,GAAG,EAAE,EAAE,SAAS,CAAC,IAAI,CAAC,CAAC;YACvF,CAAC;QACH,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,OAAO,OAAO,CAAC,YAAY,CAAC,OAAO,CAAC,SAAS,CAAC,IAAI,EAAE,EAAE,KAAc,CAAC,CAAC;QACxE,CAAC;QAED,IAAI,kBAAkB,CAAC,MAAM,KAAK,CAAC;YAAE,OAAO,OAAO,CAAC,YAAY,CAAC,OAAO,CAAC,SAAS,CAAC,IAAI,EAAE,CAAC,CAAC;QAE3F,MAAM,yBAAyB,GAA4D,EAAE,CAAC;QAE9F,MAAM,QAAQ,GAA0C,EAAE,CAAC;QAE3D,KAAK,MAAM,QAAQ,IAAI,kBAAkB,EAAE,CAAC;YAC1C,MAAM,YAAY,GAAG,MAAM,IAAI,CAAC,eAAe,CAAC,QAAQ,CAAC,CAAC;YAC1D,MAAM,eAAe,GAAG,MAAM,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC;YAElD,yBAAyB,CAAC,QAAQ,CAAC,GAAG,eAAe,CAAC;QACxD,CAAC;QAED,KAAK,MAAM,QAAQ,IAAI,yBAAyB,EAAE,CAAC;YACjD,MAAM,eAAe,GAAG,yBAAyB,CAAC,QAAQ,CAAC,IAAI,EAAE,CAAC;YAElE,KAAK,MAAM,cAAc,IAAI,eAAe,EAAE,CAAC;gBAC7C,KAAK,MAAM,iBAAiB,IAAI,kBAAkB,EAAE,CAAC;oBACnD,IAAI,iBAAiB,KAAK,QAAQ;wBAAE,SAAS;oBAE7C,MAAM,oBAAoB,GAAG,yBAAyB,CAAC,iBAAiB,CAAC,EAAE,IAAI,CAC7E,CAAC,GAAG,EAAE,EAAE,CAAC,cAAc,KAAK,GAAG,CAChC,CAAC;oBAEF,IAAI,CAAC,oBAAoB,EAAE,CAAC;wBAC1B,QAAQ,CAAC,IAAI,CAAC,EAAE,GAAG,EAAE,cAAc,EAAE,QAAQ,EAAE,QAAQ,EAAE,SAAS,EAAE,iBAAiB,EAAE,CAAC,CAAC;oBAC3F,CAAC;gBACH,CAAC;YACH,CAAC;QACH,CAAC;QAED,IAAI,QAAQ,CAAC,MAAM,KAAK,CAAC;YAAE,OAAO,OAAO,CAAC,YAAY,CAAC,OAAO,CAAC,SAAS,CAAC,IAAI,EAAE,CAAC,CAAC;QAEjF,MAAM,OAAO,GAAG,QAAQ;aACrB,GAAG,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,QAAQ,OAAO,CAAC,GAAG,eAAe,OAAO,CAAC,QAAQ,gBAAgB,OAAO,CAAC,SAAS,EAAE,CAAC;aACvG,IAAI,CAAC,IAAI,CAAC,CAAC;QAEd,OAAO,OAAO,CAAC,YAAY,CAAC,OAAO,CAAC,SAAS,CAAC,IAAI,EAAE,EAAE,EAAE,OAAO,EAAE,OAAO,EAAE,CAAC,CAAC;IAC9E,CAAC;CACF"}
|
|
@@ -11,10 +11,10 @@ type Dependencies = {
|
|
|
11
11
|
Clock: ClockPort;
|
|
12
12
|
};
|
|
13
13
|
export declare class RemoteFileStorageNoopAdapter implements RemoteFileStoragePort {
|
|
14
|
-
private readonly deps;
|
|
15
14
|
private readonly config;
|
|
15
|
+
private readonly deps;
|
|
16
16
|
private readonly base;
|
|
17
|
-
constructor(
|
|
17
|
+
constructor(config: RemoteFileStorageNoopConfig, deps: Dependencies);
|
|
18
18
|
publicUrl(key: tools.ObjectKeyType): string;
|
|
19
19
|
putFromPath(input: RemotePutFromPathInput): Promise<RemotePutFromPathResult>;
|
|
20
20
|
head(key: tools.ObjectKeyType): Promise<RemoteHeadResult>;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"remote-file-storage-noop.adapter.d.ts","sourceRoot":"","sources":["../src/remote-file-storage-noop.adapter.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,KAAK,MAAM,cAAc,CAAC;AACtC,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,cAAc,CAAC;AAC9C,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,eAAe,CAAC;AAChD,OAAO,KAAK,EACV,qBAAqB,EACrB,gBAAgB,EAChB,sBAAsB,EACtB,uBAAuB,EACxB,MAAM,4BAA4B,CAAC;AAEpC,KAAK,2BAA2B,GAAG;IAAE,IAAI,EAAE,KAAK,CAAC,yBAAyB,CAAC;IAAC,aAAa,CAAC,EAAE,MAAM,CAAA;CAAE,CAAC;AACrG,KAAK,YAAY,GAAG;IAAE,MAAM,EAAE,UAAU,CAAC;IAAC,KAAK,EAAE,SAAS,CAAA;CAAE,CAAC;AAE7D,qBAAa,4BAA6B,YAAW,qBAAqB;IAItE,OAAO,CAAC,QAAQ,CAAC,
|
|
1
|
+
{"version":3,"file":"remote-file-storage-noop.adapter.d.ts","sourceRoot":"","sources":["../src/remote-file-storage-noop.adapter.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,KAAK,MAAM,cAAc,CAAC;AACtC,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,cAAc,CAAC;AAC9C,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,eAAe,CAAC;AAChD,OAAO,KAAK,EACV,qBAAqB,EACrB,gBAAgB,EAChB,sBAAsB,EACtB,uBAAuB,EACxB,MAAM,4BAA4B,CAAC;AAEpC,KAAK,2BAA2B,GAAG;IAAE,IAAI,EAAE,KAAK,CAAC,yBAAyB,CAAC;IAAC,aAAa,CAAC,EAAE,MAAM,CAAA;CAAE,CAAC;AACrG,KAAK,YAAY,GAAG;IAAE,MAAM,EAAE,UAAU,CAAC;IAAC,KAAK,EAAE,SAAS,CAAA;CAAE,CAAC;AAE7D,qBAAa,4BAA6B,YAAW,qBAAqB;IAItE,OAAO,CAAC,QAAQ,CAAC,MAAM;IACvB,OAAO,CAAC,QAAQ,CAAC,IAAI;IAJvB,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAqE;gBAGvE,MAAM,EAAE,2BAA2B,EACnC,IAAI,EAAE,YAAY;IAGrC,SAAS,CAAC,GAAG,EAAE,KAAK,CAAC,aAAa,GAAG,MAAM;IAKrC,WAAW,CAAC,KAAK,EAAE,sBAAsB,GAAG,OAAO,CAAC,uBAAuB,CAAC;IAe5E,IAAI,CAAC,GAAG,EAAE,KAAK,CAAC,aAAa,GAAG,OAAO,CAAC,gBAAgB,CAAC;IAUzD,SAAS,CAAC,GAAG,EAAE,KAAK,CAAC,aAAa,GAAG,OAAO,CAAC,cAAc,GAAG,IAAI,CAAC;IAUnE,MAAM,CAAC,GAAG,EAAE,KAAK,CAAC,aAAa,GAAG,OAAO,CAAC,IAAI,CAAC;IAQrD,IAAI,IAAI,iEAEP;CACF"}
|
|
@@ -1,11 +1,11 @@
|
|
|
1
1
|
import * as tools from "@bgord/tools";
|
|
2
2
|
export class RemoteFileStorageNoopAdapter {
|
|
3
|
-
deps;
|
|
4
3
|
config;
|
|
4
|
+
deps;
|
|
5
5
|
base = { component: "infra", operation: "RemoteFileStorageNoopAdapter" };
|
|
6
|
-
constructor(
|
|
7
|
-
this.deps = deps;
|
|
6
|
+
constructor(config, deps) {
|
|
8
7
|
this.config = config;
|
|
8
|
+
this.deps = deps;
|
|
9
9
|
}
|
|
10
10
|
publicUrl(key) {
|
|
11
11
|
if (!this.config?.publicBaseUrl)
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"remote-file-storage-noop.adapter.js","sourceRoot":"","sources":["../src/remote-file-storage-noop.adapter.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,KAAK,MAAM,cAAc,CAAC;AAatC,MAAM,OAAO,4BAA4B;IAIpB;IACA;IAJF,IAAI,GAAG,EAAE,SAAS,EAAE,OAAO,EAAE,SAAS,EAAE,8BAA8B,EAAE,CAAC;IAE1F,YACmB,IAAkB,
|
|
1
|
+
{"version":3,"file":"remote-file-storage-noop.adapter.js","sourceRoot":"","sources":["../src/remote-file-storage-noop.adapter.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,KAAK,MAAM,cAAc,CAAC;AAatC,MAAM,OAAO,4BAA4B;IAIpB;IACA;IAJF,IAAI,GAAG,EAAE,SAAS,EAAE,OAAO,EAAE,SAAS,EAAE,8BAA8B,EAAE,CAAC;IAE1F,YACmB,MAAmC,EACnC,IAAkB;QADlB,WAAM,GAAN,MAAM,CAA6B;QACnC,SAAI,GAAJ,IAAI,CAAc;IAClC,CAAC;IAEJ,SAAS,CAAC,GAAwB;QAChC,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,aAAa;YAAE,OAAO,IAAI,GAAG,EAAE,CAAC;QAClD,OAAO,GAAG,IAAI,CAAC,MAAM,EAAE,aAAa,IAAI,GAAG,EAAE,CAAC;IAChD,CAAC;IAED,KAAK,CAAC,WAAW,CAAC,KAA6B;QAC7C,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC;YACpB,OAAO,EAAE,iDAAiD;YAC1D,QAAQ,EAAE,EAAE,KAAK,EAAE;YACnB,GAAG,IAAI,CAAC,IAAI;SACb,CAAC,CAAC;QAEH,OAAO;YACL,IAAI,EAAE,MAAM;YACZ,IAAI,EAAE,KAAK,CAAC,IAAI,CAAC,SAAS,CAAC,EAAE,CAAC;YAC9B,YAAY,EAAE,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,EAAE;YACnC,IAAI,EAAE,KAAK,CAAC,KAAK,CAAC,IAAI;SACvB,CAAC;IACJ,CAAC;IAED,KAAK,CAAC,IAAI,CAAC,GAAwB;QACjC,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC;YACpB,OAAO,EAAE,0CAA0C;YACnD,QAAQ,EAAE,EAAE,GAAG,EAAE;YACjB,GAAG,IAAI,CAAC,IAAI;SACb,CAAC,CAAC;QAEH,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,CAAC;IAC3B,CAAC;IAED,KAAK,CAAC,SAAS,CAAC,GAAwB;QACtC,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC;YACpB,OAAO,EAAE,+CAA+C;YACxD,QAAQ,EAAE,EAAE,GAAG,EAAE;YACjB,GAAG,IAAI,CAAC,IAAI;SACb,CAAC,CAAC;QAEH,OAAO,IAAI,CAAC;IACd,CAAC;IAED,KAAK,CAAC,MAAM,CAAC,GAAwB;QACnC,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC;YACpB,OAAO,EAAE,4CAA4C;YACrD,QAAQ,EAAE,EAAE,GAAG,EAAE;YACjB,GAAG,IAAI,CAAC,IAAI;SACb,CAAC,CAAC;IACL,CAAC;IAED,IAAI,IAAI;QACN,OAAO,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC;IAC1B,CAAC;CACF"}
|