@bgord/bun 0.6.0 → 0.8.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/basic-auth.d.ts +14 -0
- package/dist/basic-auth.d.ts.map +1 -0
- package/dist/basic-auth.js +13 -0
- package/dist/basic-auth.js.map +1 -0
- package/dist/correlation-id.d.ts.map +1 -1
- package/dist/decorators.d.ts +4 -0
- package/dist/decorators.d.ts.map +1 -0
- package/dist/decorators.js +62 -0
- package/dist/decorators.js.map +1 -0
- package/dist/encryption.d.ts +8 -3
- package/dist/encryption.d.ts.map +1 -0
- package/dist/encryption.js +37 -0
- package/dist/encryption.js.map +1 -0
- package/dist/env-validator.d.ts +21 -0
- package/dist/env-validator.d.ts.map +1 -0
- package/dist/env-validator.js +28 -0
- package/dist/env-validator.js.map +1 -0
- package/dist/event-handler.d.ts +8 -0
- package/dist/event-handler.d.ts.map +1 -0
- package/dist/event-handler.js +21 -0
- package/dist/event-handler.js.map +1 -0
- package/dist/event-logger.d.ts +8 -0
- package/dist/event-logger.d.ts.map +1 -0
- package/dist/event-logger.js +19 -0
- package/dist/event-logger.js.map +1 -0
- package/dist/event.d.ts +7 -46
- package/dist/event.d.ts.map +1 -0
- package/dist/event.js +23 -0
- package/dist/event.js.map +1 -0
- package/dist/file-location.d.ts +10 -9
- package/dist/file-location.d.ts.map +1 -0
- package/dist/file-location.js +46 -0
- package/dist/file-location.js.map +1 -0
- package/dist/gzip.d.ts +1 -0
- package/dist/gzip.d.ts.map +1 -0
- package/dist/gzip.js +18 -0
- package/dist/gzip.js.map +1 -0
- package/dist/hcaptcha-shield.d.ts +12 -13
- package/dist/hcaptcha-shield.d.ts.map +1 -0
- package/dist/hcaptcha-shield.js +34 -0
- package/dist/hcaptcha-shield.js.map +1 -0
- package/dist/healthcheck.d.ts +5 -5
- package/dist/healthcheck.d.ts.map +1 -1
- package/dist/healthcheck.js +5 -5
- package/dist/healthcheck.js.map +1 -1
- package/dist/i18n.d.ts.map +1 -1
- package/dist/i18n.js.map +1 -1
- package/dist/image-compressor.d.ts +9 -4
- package/dist/image-compressor.d.ts.map +1 -0
- package/dist/image-compressor.js +13 -0
- package/dist/image-compressor.js.map +1 -0
- package/dist/image-exif.d.ts +10 -9
- package/dist/image-exif.d.ts.map +1 -0
- package/dist/image-exif.js +21 -0
- package/dist/image-exif.js.map +1 -0
- package/dist/index.d.ts +19 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +19 -0
- package/dist/index.js.map +1 -1
- package/dist/jobs.d.ts.map +1 -1
- package/dist/jobs.js.map +1 -1
- package/dist/logger.d.ts.map +1 -1
- package/dist/logger.js.map +1 -1
- package/dist/mailer.d.ts +13 -0
- package/dist/mailer.d.ts.map +1 -1
- package/dist/mailer.js +6 -0
- package/dist/mailer.js.map +1 -1
- package/dist/node-env.vo.d.ts.map +1 -1
- package/dist/node-env.vo.js.map +1 -1
- package/dist/open-graph.d.ts +31 -12
- package/dist/open-graph.d.ts.map +1 -0
- package/dist/open-graph.js +172 -0
- package/dist/open-graph.js.map +1 -0
- package/dist/passwords.d.ts.map +1 -1
- package/dist/passwords.js.map +1 -1
- package/dist/path.d.ts.map +1 -1
- package/dist/policy.service.d.ts +12 -0
- package/dist/policy.service.d.ts.map +1 -0
- package/dist/policy.service.js +14 -0
- package/dist/policy.service.js.map +1 -0
- package/dist/port.d.ts.map +1 -1
- package/dist/prerequisites/binary.d.ts +5 -5
- package/dist/prerequisites/binary.d.ts.map +1 -1
- package/dist/prerequisites/binary.js +4 -4
- package/dist/prerequisites/binary.js.map +1 -1
- package/dist/prerequisites/bun.d.ts +5 -5
- package/dist/prerequisites/bun.d.ts.map +1 -1
- package/dist/prerequisites/bun.js +5 -3
- package/dist/prerequisites/bun.js.map +1 -1
- package/dist/prerequisites/dependency-vulnerabilities.d.ts +13 -0
- package/dist/prerequisites/dependency-vulnerabilities.d.ts.map +1 -0
- package/dist/prerequisites/dependency-vulnerabilities.js +30 -0
- package/dist/prerequisites/dependency-vulnerabilities.js.map +1 -0
- package/dist/prerequisites/external-api.d.ts +14 -0
- package/dist/prerequisites/external-api.d.ts.map +1 -0
- package/dist/prerequisites/external-api.js +21 -0
- package/dist/prerequisites/external-api.js.map +1 -0
- package/dist/prerequisites/index.d.ts +2 -0
- package/dist/prerequisites/index.d.ts.map +1 -1
- package/dist/prerequisites/index.js +2 -0
- package/dist/prerequisites/index.js.map +1 -1
- package/dist/prerequisites/jobs.d.ts +5 -5
- package/dist/prerequisites/jobs.d.ts.map +1 -1
- package/dist/prerequisites/jobs.js +4 -4
- package/dist/prerequisites/jobs.js.map +1 -1
- package/dist/prerequisites/log-file.d.ts +5 -5
- 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 +5 -5
- 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/memory.d.ts +5 -5
- package/dist/prerequisites/memory.d.ts.map +1 -1
- package/dist/prerequisites/memory.js +4 -4
- package/dist/prerequisites/memory.js.map +1 -1
- package/dist/prerequisites/node.d.ts +5 -5
- package/dist/prerequisites/node.d.ts.map +1 -1
- package/dist/prerequisites/node.js +4 -4
- package/dist/prerequisites/node.js.map +1 -1
- package/dist/prerequisites/outside-connectivity.d.ts +5 -5
- package/dist/prerequisites/outside-connectivity.d.ts.map +1 -1
- package/dist/prerequisites/outside-connectivity.js +4 -4
- package/dist/prerequisites/outside-connectivity.js.map +1 -1
- package/dist/prerequisites/path.d.ts +5 -5
- package/dist/prerequisites/path.d.ts.map +1 -1
- package/dist/prerequisites/path.js +4 -4
- package/dist/prerequisites/path.js.map +1 -1
- package/dist/prerequisites/port.d.ts +5 -5
- package/dist/prerequisites/port.d.ts.map +1 -1
- package/dist/prerequisites/port.js +6 -6
- package/dist/prerequisites/port.js.map +1 -1
- package/dist/prerequisites/ram.d.ts +5 -5
- package/dist/prerequisites/ram.d.ts.map +1 -1
- package/dist/prerequisites/ram.js +4 -4
- package/dist/prerequisites/ram.js.map +1 -1
- package/dist/prerequisites/self.d.ts +5 -5
- package/dist/prerequisites/self.d.ts.map +1 -1
- package/dist/prerequisites/self.js +4 -4
- package/dist/prerequisites/self.js.map +1 -1
- package/dist/prerequisites/space.d.ts +5 -5
- package/dist/prerequisites/space.d.ts.map +1 -1
- package/dist/prerequisites/space.js +4 -4
- package/dist/prerequisites/space.js.map +1 -1
- package/dist/prerequisites/ssl-certificate-expiry.d.ts +5 -5
- package/dist/prerequisites/ssl-certificate-expiry.d.ts.map +1 -1
- package/dist/prerequisites/ssl-certificate-expiry.js +5 -5
- package/dist/prerequisites/ssl-certificate-expiry.js.map +1 -1
- package/dist/prerequisites/timezone-utc.d.ts +7 -5
- package/dist/prerequisites/timezone-utc.d.ts.map +1 -1
- package/dist/prerequisites/timezone-utc.js +6 -5
- package/dist/prerequisites/timezone-utc.js.map +1 -1
- package/dist/prerequisites/translations.d.ts +8 -8
- package/dist/prerequisites/translations.d.ts.map +1 -1
- package/dist/prerequisites/translations.js +8 -8
- package/dist/prerequisites/translations.js.map +1 -1
- package/dist/prerequisites.d.ts +2 -0
- package/dist/prerequisites.d.ts.map +1 -1
- package/dist/prerequisites.js +2 -0
- package/dist/prerequisites.js.map +1 -1
- package/dist/recaptcha-shield.d.ts +13 -5
- package/dist/recaptcha-shield.d.ts.map +1 -0
- package/dist/recaptcha-shield.js +50 -0
- package/dist/recaptcha-shield.js.map +1 -0
- package/dist/setup.js +1 -1
- package/dist/setup.js.map +1 -1
- package/dist/simulated-error.d.ts +2 -2
- package/dist/simulated-error.d.ts.map +1 -0
- package/dist/simulated-error.js +7 -0
- package/dist/simulated-error.js.map +1 -0
- package/dist/sitemap.d.ts +19 -27
- package/dist/sitemap.d.ts.map +1 -0
- package/dist/sitemap.js +57 -0
- package/dist/sitemap.js.map +1 -0
- package/dist/slower.d.ts +3 -6
- package/dist/slower.d.ts.map +1 -0
- package/dist/slower.js +8 -0
- package/dist/slower.js.map +1 -0
- package/dist/tsconfig.tsbuildinfo +1 -1
- package/dist/url-wo-trailing-slash.d.ts +4 -0
- package/dist/url-wo-trailing-slash.d.ts.map +1 -0
- package/dist/url-wo-trailing-slash.js +9 -0
- package/dist/url-wo-trailing-slash.js.map +1 -0
- package/dist/uuid.d.ts.map +1 -1
- package/package.json +5 -2
- package/src/basic-auth.ts +26 -0
- package/src/correlation-id.ts +1 -0
- package/src/decorators.ts +78 -0
- package/src/encryption.ts +60 -0
- package/src/env-validator.ts +43 -0
- package/src/event-handler.ts +20 -0
- package/src/event-logger.ts +24 -0
- package/src/event.ts +29 -0
- package/src/file-location.ts +70 -0
- package/src/gzip.ts +23 -0
- package/src/hcaptcha-shield.ts +57 -0
- package/src/healthcheck.ts +9 -14
- package/src/i18n.ts +4 -0
- package/src/image-compressor.ts +26 -0
- package/src/image-exif.ts +38 -0
- package/src/index.ts +19 -0
- package/src/jobs.ts +1 -0
- package/src/logger.ts +6 -0
- package/src/mailer.ts +25 -0
- package/src/node-env.vo.ts +1 -0
- package/src/open-graph.ts +259 -0
- package/src/passwords.ts +1 -0
- package/src/path.ts +1 -0
- package/src/policy.service.ts +25 -0
- package/src/port.ts +1 -0
- package/src/prerequisites/binary.ts +6 -10
- package/src/prerequisites/bun.ts +7 -10
- package/src/prerequisites/dependency-vulnerabilities.ts +54 -0
- package/src/prerequisites/external-api.ts +27 -0
- package/src/prerequisites/index.ts +2 -0
- package/src/prerequisites/jobs.ts +6 -12
- package/src/prerequisites/log-file.ts +6 -11
- package/src/prerequisites/mailer.ts +6 -11
- package/src/prerequisites/memory.ts +7 -12
- package/src/prerequisites/node.ts +6 -11
- package/src/prerequisites/outside-connectivity.ts +6 -11
- package/src/prerequisites/path.ts +6 -11
- package/src/prerequisites/port.ts +8 -14
- package/src/prerequisites/ram.ts +6 -11
- package/src/prerequisites/self.ts +6 -11
- package/src/prerequisites/space.ts +6 -11
- package/src/prerequisites/ssl-certificate-expiry.ts +7 -12
- package/src/prerequisites/timezone-utc.ts +9 -12
- package/src/prerequisites/translations.ts +14 -19
- package/src/prerequisites.ts +2 -0
- package/src/recaptcha-shield.ts +76 -0
- package/src/setup.ts +1 -1
- package/src/simulated-error.ts +8 -0
- package/src/sitemap.ts +98 -0
- package/src/slower.ts +10 -0
- package/src/url-wo-trailing-slash.ts +11 -0
- package/src/uuid.ts +1 -0
package/src/index.ts
CHANGED
|
@@ -1,35 +1,54 @@
|
|
|
1
1
|
export * from "./api-key-shield";
|
|
2
2
|
export * from "./api-version";
|
|
3
3
|
export * from "./auth-shield";
|
|
4
|
+
export * from "./basic-auth";
|
|
4
5
|
export * from "./build-info-repository";
|
|
5
6
|
export * from "./cache-resolver";
|
|
6
7
|
export * from "./cache-response";
|
|
7
8
|
export * from "./cache-static-files";
|
|
8
9
|
export * from "./context";
|
|
9
10
|
export * from "./correlation-id";
|
|
11
|
+
export * from "./decorators";
|
|
10
12
|
export * from "./download-file";
|
|
13
|
+
export * from "./encryption";
|
|
14
|
+
export * from "./env-validator";
|
|
11
15
|
export * from "./etag-extractor";
|
|
16
|
+
export * from "./event";
|
|
17
|
+
export * from "./event-handler";
|
|
18
|
+
export * from "./event-logger";
|
|
19
|
+
export * from "./file-location";
|
|
12
20
|
export * from "./file-uploader";
|
|
13
21
|
export * from "./graceful-shutdown";
|
|
22
|
+
export * from "./gzip";
|
|
23
|
+
export * from "./hcaptcha-shield";
|
|
14
24
|
export * from "./healthcheck";
|
|
15
25
|
export * from "./http-logger";
|
|
16
26
|
export * from "./i18n";
|
|
27
|
+
export * from "./image-compressor";
|
|
28
|
+
export * from "./image-exif";
|
|
17
29
|
export * from "./jobs";
|
|
18
30
|
export * from "./logger";
|
|
19
31
|
export * from "./mailer";
|
|
20
32
|
export * from "./memory-consumption";
|
|
21
33
|
export * from "./new-uuid";
|
|
22
34
|
export * from "./node-env.vo";
|
|
35
|
+
export * from "./open-graph";
|
|
23
36
|
export * from "./passwords";
|
|
24
37
|
export * from "./path";
|
|
38
|
+
export * from "./policy.service";
|
|
25
39
|
export * from "./port";
|
|
26
40
|
export * from "./prerequisites";
|
|
27
41
|
export * from "./prerequisites/index";
|
|
28
42
|
export * from "./rate-limit-shield";
|
|
43
|
+
export * from "./recaptcha-shield";
|
|
29
44
|
export * from "./session-id";
|
|
30
45
|
export * from "./setup";
|
|
46
|
+
export * from "./simulated-error";
|
|
47
|
+
export * from "./sitemap";
|
|
48
|
+
export * from "./slower";
|
|
31
49
|
export * from "./time-zone-offset";
|
|
32
50
|
export * from "./uptime";
|
|
51
|
+
export * from "./url-wo-trailing-slash";
|
|
33
52
|
export * from "./username";
|
|
34
53
|
export * from "./uuid";
|
|
35
54
|
export * from "./weak-etag-extractor";
|
package/src/jobs.ts
CHANGED
package/src/logger.ts
CHANGED
|
@@ -18,11 +18,17 @@ export enum LogLevelEnum {
|
|
|
18
18
|
export const LogLevel = z.enum(LogLevelEnum);
|
|
19
19
|
|
|
20
20
|
type LogTimestampType = number;
|
|
21
|
+
|
|
21
22
|
type LogAppType = string;
|
|
23
|
+
|
|
22
24
|
type LogEnvironmentType = NodeEnvironmentEnum;
|
|
25
|
+
|
|
23
26
|
type LogMessageType = string;
|
|
27
|
+
|
|
24
28
|
type LogOperationType = string;
|
|
29
|
+
|
|
25
30
|
type LogMetadataType = Record<string, any>;
|
|
31
|
+
|
|
26
32
|
type LogCorrelationIdType = CorrelationIdType;
|
|
27
33
|
|
|
28
34
|
const levels: Record<LogLevelEnum, number> = {
|
package/src/mailer.ts
CHANGED
|
@@ -1,18 +1,23 @@
|
|
|
1
1
|
import nodemailer, { SendMailOptions } from "nodemailer";
|
|
2
2
|
import { z } from "zod/v4";
|
|
3
3
|
|
|
4
|
+
import { Path } from "./path";
|
|
4
5
|
import { Port } from "./port";
|
|
5
6
|
|
|
6
7
|
export const SmtpHost = z.string().trim().min(1);
|
|
8
|
+
|
|
7
9
|
export type SmtpHostType = z.infer<typeof SmtpHost>;
|
|
8
10
|
|
|
9
11
|
export const SmtpPort = Port;
|
|
12
|
+
|
|
10
13
|
export type SmtpPortType = z.infer<typeof SmtpPort>;
|
|
11
14
|
|
|
12
15
|
export const SmtpUser = z.string().trim().min(1);
|
|
16
|
+
|
|
13
17
|
export type SmtpUserType = z.infer<typeof SmtpUser>;
|
|
14
18
|
|
|
15
19
|
export const SmtpPass = z.string().trim().min(1);
|
|
20
|
+
|
|
16
21
|
export type SmtpPassType = z.infer<typeof SmtpPass>;
|
|
17
22
|
|
|
18
23
|
type MailerConfigType = {
|
|
@@ -24,6 +29,26 @@ type MailerConfigType = {
|
|
|
24
29
|
|
|
25
30
|
type MailerSendOptionsType = SendMailOptions;
|
|
26
31
|
|
|
32
|
+
export const EmailSubject = z.string().min(1).max(128);
|
|
33
|
+
|
|
34
|
+
export type EmailSubjectType = z.infer<typeof EmailSubject>;
|
|
35
|
+
|
|
36
|
+
export const EmailContentHtml = z.string().min(1).max(10_000);
|
|
37
|
+
|
|
38
|
+
export type EmailContentHtmlType = z.infer<typeof EmailContentHtml>;
|
|
39
|
+
|
|
40
|
+
export const EmailFrom = z.email();
|
|
41
|
+
|
|
42
|
+
export type EmailFromType = z.infer<typeof EmailFrom>;
|
|
43
|
+
|
|
44
|
+
export const EmailTo = z.email();
|
|
45
|
+
|
|
46
|
+
export type EmailToType = z.infer<typeof EmailTo>;
|
|
47
|
+
|
|
48
|
+
export const EmailAttachment = z.object({ filename: Path, path: Path });
|
|
49
|
+
|
|
50
|
+
export type EmailAttachmentType = z.infer<typeof EmailAttachment>;
|
|
51
|
+
|
|
27
52
|
export class Mailer {
|
|
28
53
|
private readonly transport: nodemailer.Transporter;
|
|
29
54
|
|
package/src/node-env.vo.ts
CHANGED
|
@@ -0,0 +1,259 @@
|
|
|
1
|
+
import { z } from "zod/v4";
|
|
2
|
+
|
|
3
|
+
import { ImageEXIF } from "./image-exif";
|
|
4
|
+
import { Path, PathType } from "./path";
|
|
5
|
+
import { UrlWithoutTrailingSlashType } from "./url-wo-trailing-slash";
|
|
6
|
+
|
|
7
|
+
export const OpenGraphTitleValue = z.string().min(1);
|
|
8
|
+
|
|
9
|
+
export type OpenGraphTitleValueType = z.infer<typeof OpenGraphTitleValue>;
|
|
10
|
+
|
|
11
|
+
export const OpenGraphDescriptionValue = z.string().min(1);
|
|
12
|
+
|
|
13
|
+
export type OpenGraphDescriptionValueType = z.infer<typeof OpenGraphDescriptionValue>;
|
|
14
|
+
|
|
15
|
+
export const OpenGraphUrlValue = z.string().min(1);
|
|
16
|
+
|
|
17
|
+
export type OpenGraphUrlValueType = z.infer<typeof OpenGraphUrlValue>;
|
|
18
|
+
|
|
19
|
+
export const OpenGraphTypeValue = z.union([z.literal("website"), z.literal("article")]);
|
|
20
|
+
|
|
21
|
+
export type OpenGraphTypeValueType = z.infer<typeof OpenGraphTypeValue>;
|
|
22
|
+
|
|
23
|
+
export const OpenGraphImageUrlValue = z.url();
|
|
24
|
+
|
|
25
|
+
export type OpenGraphImageUrlValueType = z.infer<typeof OpenGraphImageUrlValue>;
|
|
26
|
+
|
|
27
|
+
export const OpenGraphImageTypeValue = z.string().min(1);
|
|
28
|
+
|
|
29
|
+
export type OpenGraphImageTypeValueType = z.infer<typeof OpenGraphImageTypeValue>;
|
|
30
|
+
|
|
31
|
+
export const OpenGraphImageWidthValue = z
|
|
32
|
+
.number()
|
|
33
|
+
.int()
|
|
34
|
+
.positive()
|
|
35
|
+
.refine((value) => value === 1200, {
|
|
36
|
+
message: "open.graph.image.width.invalid",
|
|
37
|
+
});
|
|
38
|
+
|
|
39
|
+
export type OpenGraphImageWidthValueType = z.infer<typeof OpenGraphImageWidthValue>;
|
|
40
|
+
|
|
41
|
+
export const OpenGraphImageHeightValue = z
|
|
42
|
+
.number()
|
|
43
|
+
.int()
|
|
44
|
+
.positive()
|
|
45
|
+
.refine((value) => value === 630, {
|
|
46
|
+
message: "open.graph.image.height.invalid",
|
|
47
|
+
});
|
|
48
|
+
|
|
49
|
+
export type OpenGraphImageHeightValueType = z.infer<typeof OpenGraphImageHeightValue>;
|
|
50
|
+
|
|
51
|
+
class OpenGraphTitle {
|
|
52
|
+
private readonly value: OpenGraphTitleValueType;
|
|
53
|
+
|
|
54
|
+
constructor(value: OpenGraphTitleValueType) {
|
|
55
|
+
this.value = OpenGraphTitleValue.parse(value);
|
|
56
|
+
}
|
|
57
|
+
|
|
58
|
+
toMetatag(): string {
|
|
59
|
+
return `<meta property="og:title" content="${this.value}" />`;
|
|
60
|
+
}
|
|
61
|
+
|
|
62
|
+
toMeta(): string {
|
|
63
|
+
return `${this.toMetatag()}\n\t`;
|
|
64
|
+
}
|
|
65
|
+
}
|
|
66
|
+
|
|
67
|
+
class OpenGraphDescription {
|
|
68
|
+
private readonly value: OpenGraphDescriptionValueType;
|
|
69
|
+
|
|
70
|
+
constructor(value: OpenGraphDescriptionValueType) {
|
|
71
|
+
this.value = OpenGraphDescriptionValue.parse(value);
|
|
72
|
+
}
|
|
73
|
+
|
|
74
|
+
toMetatag(): string {
|
|
75
|
+
return `<meta property="og:description" content="${this.value}" />`;
|
|
76
|
+
}
|
|
77
|
+
|
|
78
|
+
toMeta(): string {
|
|
79
|
+
return `${this.toMetatag()}\n\t`;
|
|
80
|
+
}
|
|
81
|
+
}
|
|
82
|
+
|
|
83
|
+
class OpenGraphUrl {
|
|
84
|
+
private readonly value: OpenGraphUrlValueType;
|
|
85
|
+
|
|
86
|
+
constructor(value: OpenGraphUrlValueType) {
|
|
87
|
+
this.value = OpenGraphUrlValue.parse(value);
|
|
88
|
+
}
|
|
89
|
+
|
|
90
|
+
toMetatag(): string {
|
|
91
|
+
return `<meta property="og:url" content="${this.value}" />`;
|
|
92
|
+
}
|
|
93
|
+
|
|
94
|
+
toMeta(): string {
|
|
95
|
+
return `${this.toMetatag()}\n\t`;
|
|
96
|
+
}
|
|
97
|
+
}
|
|
98
|
+
|
|
99
|
+
class OpenGraphType {
|
|
100
|
+
private readonly value: OpenGraphTypeValueType;
|
|
101
|
+
|
|
102
|
+
constructor(value: OpenGraphTypeValueType) {
|
|
103
|
+
this.value = OpenGraphTypeValue.parse(value);
|
|
104
|
+
}
|
|
105
|
+
|
|
106
|
+
toMetatag(): string {
|
|
107
|
+
return `<meta property="og:type" content="${this.value}" />`;
|
|
108
|
+
}
|
|
109
|
+
|
|
110
|
+
toMeta(): string {
|
|
111
|
+
return `${this.toMetatag()}\n\t`;
|
|
112
|
+
}
|
|
113
|
+
}
|
|
114
|
+
|
|
115
|
+
class OpenGraphImageUrl {
|
|
116
|
+
private readonly value: OpenGraphImageUrlValueType;
|
|
117
|
+
|
|
118
|
+
constructor(path: PathType) {
|
|
119
|
+
this.value = OpenGraphImageUrlValue.parse(path);
|
|
120
|
+
}
|
|
121
|
+
|
|
122
|
+
toMetatag(): string {
|
|
123
|
+
return `<meta property="og:image" content="${this.value}" />`;
|
|
124
|
+
}
|
|
125
|
+
|
|
126
|
+
toMeta(): string {
|
|
127
|
+
return `${this.toMetatag()}\n\t`;
|
|
128
|
+
}
|
|
129
|
+
}
|
|
130
|
+
|
|
131
|
+
class OpenGraphImageType {
|
|
132
|
+
private readonly value: OpenGraphImageTypeValueType;
|
|
133
|
+
|
|
134
|
+
constructor(value: OpenGraphImageTypeValueType) {
|
|
135
|
+
this.value = OpenGraphImageTypeValue.parse(value);
|
|
136
|
+
}
|
|
137
|
+
|
|
138
|
+
toMetatag(): string {
|
|
139
|
+
return `<meta property="og:image:type" content="${this.value}" />`;
|
|
140
|
+
}
|
|
141
|
+
|
|
142
|
+
toMeta(): string {
|
|
143
|
+
return `${this.toMetatag()}\n\t`;
|
|
144
|
+
}
|
|
145
|
+
}
|
|
146
|
+
|
|
147
|
+
class OpenGraphImageWidth {
|
|
148
|
+
private readonly value: OpenGraphImageWidthValueType;
|
|
149
|
+
|
|
150
|
+
constructor(value: OpenGraphImageWidthValueType) {
|
|
151
|
+
this.value = OpenGraphImageWidthValue.parse(value);
|
|
152
|
+
}
|
|
153
|
+
|
|
154
|
+
toMetatag(): string {
|
|
155
|
+
return `<meta property="og:image:width" content="${this.value}" />`;
|
|
156
|
+
}
|
|
157
|
+
|
|
158
|
+
toMeta(): string {
|
|
159
|
+
return `${this.toMetatag()}\n\t`;
|
|
160
|
+
}
|
|
161
|
+
}
|
|
162
|
+
|
|
163
|
+
class OpenGraphImageHeight {
|
|
164
|
+
private readonly value: OpenGraphImageHeightValueType;
|
|
165
|
+
|
|
166
|
+
constructor(value: OpenGraphImageHeightValueType) {
|
|
167
|
+
this.value = OpenGraphImageHeightValue.parse(value);
|
|
168
|
+
}
|
|
169
|
+
|
|
170
|
+
toMetatag(): string {
|
|
171
|
+
return `<meta property="og:image:height" content="${this.value}" />`;
|
|
172
|
+
}
|
|
173
|
+
|
|
174
|
+
toMeta(): string {
|
|
175
|
+
return `${this.toMetatag()}\n\t`;
|
|
176
|
+
}
|
|
177
|
+
}
|
|
178
|
+
|
|
179
|
+
export type OpenGraphImageConfigType = {
|
|
180
|
+
url: OpenGraphImageUrl;
|
|
181
|
+
width: OpenGraphImageWidth;
|
|
182
|
+
height: OpenGraphImageHeight;
|
|
183
|
+
type: OpenGraphImageType;
|
|
184
|
+
};
|
|
185
|
+
|
|
186
|
+
export class OpenGraphImage {
|
|
187
|
+
private readonly value: OpenGraphImageConfigType;
|
|
188
|
+
|
|
189
|
+
constructor(value: OpenGraphImageConfigType) {
|
|
190
|
+
this.value = value;
|
|
191
|
+
}
|
|
192
|
+
|
|
193
|
+
toString() {
|
|
194
|
+
let output = "";
|
|
195
|
+
|
|
196
|
+
output += this.value.url.toMeta();
|
|
197
|
+
output += this.value.width.toMeta();
|
|
198
|
+
output += this.value.height.toMeta();
|
|
199
|
+
output += this.value.type.toMeta();
|
|
200
|
+
|
|
201
|
+
return output;
|
|
202
|
+
}
|
|
203
|
+
}
|
|
204
|
+
|
|
205
|
+
class OpenGraphImageGenerator {
|
|
206
|
+
static async generate(config: {
|
|
207
|
+
path: PathType;
|
|
208
|
+
BASE_URL: UrlWithoutTrailingSlashType;
|
|
209
|
+
}) {
|
|
210
|
+
const exif = await ImageEXIF.read(config.path);
|
|
211
|
+
|
|
212
|
+
return new OpenGraphImage({
|
|
213
|
+
url: new OpenGraph.image.url(Path.parse(`${config.BASE_URL}/${exif.name}`)),
|
|
214
|
+
type: new OpenGraph.image.type(exif.mimeType),
|
|
215
|
+
width: new OpenGraph.image.width(exif.width),
|
|
216
|
+
height: new OpenGraph.image.height(exif.height),
|
|
217
|
+
});
|
|
218
|
+
}
|
|
219
|
+
}
|
|
220
|
+
|
|
221
|
+
type OpenGraphConfigType = {
|
|
222
|
+
title: OpenGraphTitle;
|
|
223
|
+
description: OpenGraphDescription;
|
|
224
|
+
url: OpenGraphUrl;
|
|
225
|
+
type: OpenGraphType;
|
|
226
|
+
image?: OpenGraphImage;
|
|
227
|
+
};
|
|
228
|
+
|
|
229
|
+
class OpenGraphGenerator {
|
|
230
|
+
static toString(config: OpenGraphConfigType) {
|
|
231
|
+
let output = "";
|
|
232
|
+
|
|
233
|
+
output += config.title.toMeta();
|
|
234
|
+
output += config.description.toMeta();
|
|
235
|
+
output += config.url.toMeta();
|
|
236
|
+
output += config.type.toMeta();
|
|
237
|
+
|
|
238
|
+
if (config.image) {
|
|
239
|
+
output += config.image.toString();
|
|
240
|
+
}
|
|
241
|
+
|
|
242
|
+
return output;
|
|
243
|
+
}
|
|
244
|
+
}
|
|
245
|
+
|
|
246
|
+
export const OpenGraph = {
|
|
247
|
+
generator: OpenGraphGenerator,
|
|
248
|
+
title: OpenGraphTitle,
|
|
249
|
+
description: OpenGraphDescription,
|
|
250
|
+
url: OpenGraphUrl,
|
|
251
|
+
type: OpenGraphType,
|
|
252
|
+
image: {
|
|
253
|
+
generator: OpenGraphImageGenerator,
|
|
254
|
+
url: OpenGraphImageUrl,
|
|
255
|
+
width: OpenGraphImageWidth,
|
|
256
|
+
height: OpenGraphImageHeight,
|
|
257
|
+
type: OpenGraphImageType,
|
|
258
|
+
},
|
|
259
|
+
};
|
package/src/passwords.ts
CHANGED
package/src/path.ts
CHANGED
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
import type { Constructor } from "@bgord/tools";
|
|
2
|
+
|
|
3
|
+
type BasePolicyConfig = Record<string, unknown>;
|
|
4
|
+
|
|
5
|
+
export abstract class Policy<T extends BasePolicyConfig> {
|
|
6
|
+
abstract fails(config: T): Promise<boolean> | boolean;
|
|
7
|
+
|
|
8
|
+
abstract error: Constructor<Error>;
|
|
9
|
+
|
|
10
|
+
abstract message: string;
|
|
11
|
+
|
|
12
|
+
throw() {
|
|
13
|
+
throw new this.error();
|
|
14
|
+
}
|
|
15
|
+
|
|
16
|
+
async perform(config: T) {
|
|
17
|
+
if (await this.fails(config)) {
|
|
18
|
+
this.throw();
|
|
19
|
+
}
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
async passes(config: T) {
|
|
23
|
+
return !(await this.fails(config));
|
|
24
|
+
}
|
|
25
|
+
}
|
package/src/port.ts
CHANGED
|
@@ -1,35 +1,31 @@
|
|
|
1
1
|
import bun from "bun";
|
|
2
2
|
import { z } from "zod/v4";
|
|
3
3
|
|
|
4
|
-
import
|
|
5
|
-
AbstractPrerequisite,
|
|
6
|
-
PrerequisiteLabelType,
|
|
7
|
-
PrerequisiteStatusEnum,
|
|
8
|
-
PrerequisiteStrategyEnum,
|
|
9
|
-
} from "../prerequisites";
|
|
4
|
+
import * as prereqs from "../prerequisites";
|
|
10
5
|
|
|
11
6
|
const PrerequisiteBinaryValue = z
|
|
12
7
|
.string()
|
|
13
8
|
.min(1)
|
|
14
9
|
.max(64)
|
|
15
10
|
.refine((value) => !value.includes(" "));
|
|
11
|
+
|
|
16
12
|
type PrerequisiteBinaryValueType = z.infer<typeof PrerequisiteBinaryValue>;
|
|
17
13
|
|
|
18
14
|
type PrerequisiteBinaryConfigType = {
|
|
19
15
|
binary: PrerequisiteBinaryValueType;
|
|
20
|
-
label: PrerequisiteLabelType;
|
|
16
|
+
label: prereqs.PrerequisiteLabelType;
|
|
21
17
|
enabled?: boolean;
|
|
22
18
|
};
|
|
23
19
|
|
|
24
|
-
export class PrerequisiteBinary extends AbstractPrerequisite<PrerequisiteBinaryConfigType> {
|
|
25
|
-
readonly strategy = PrerequisiteStrategyEnum.binary;
|
|
20
|
+
export class PrerequisiteBinary extends prereqs.AbstractPrerequisite<PrerequisiteBinaryConfigType> {
|
|
21
|
+
readonly strategy = prereqs.PrerequisiteStrategyEnum.binary;
|
|
26
22
|
|
|
27
23
|
constructor(readonly config: PrerequisiteBinaryConfigType) {
|
|
28
24
|
super(config);
|
|
29
25
|
}
|
|
30
26
|
|
|
31
27
|
async verify() {
|
|
32
|
-
if (!this.enabled) return PrerequisiteStatusEnum.undetermined;
|
|
28
|
+
if (!this.enabled) return prereqs.PrerequisiteStatusEnum.undetermined;
|
|
33
29
|
|
|
34
30
|
try {
|
|
35
31
|
const binary = PrerequisiteBinaryValue.parse(this.config.binary);
|
package/src/prerequisites/bun.ts
CHANGED
|
@@ -1,27 +1,24 @@
|
|
|
1
1
|
import * as tools from "@bgord/tools";
|
|
2
2
|
|
|
3
|
-
import
|
|
4
|
-
AbstractPrerequisite,
|
|
5
|
-
PrerequisiteLabelType,
|
|
6
|
-
PrerequisiteStatusEnum,
|
|
7
|
-
PrerequisiteStrategyEnum,
|
|
8
|
-
} from "../prerequisites";
|
|
3
|
+
import * as prereqs from "../prerequisites";
|
|
9
4
|
|
|
10
5
|
type PrerequisiteBunConfigType = {
|
|
11
6
|
version: tools.PackageVersion;
|
|
12
|
-
label: PrerequisiteLabelType;
|
|
7
|
+
label: prereqs.PrerequisiteLabelType;
|
|
13
8
|
enabled?: boolean;
|
|
14
9
|
current: string;
|
|
15
10
|
};
|
|
16
11
|
|
|
17
|
-
export class PrerequisiteBun extends AbstractPrerequisite<PrerequisiteBunConfigType> {
|
|
18
|
-
readonly strategy = PrerequisiteStrategyEnum.bun;
|
|
12
|
+
export class PrerequisiteBun extends prereqs.AbstractPrerequisite<PrerequisiteBunConfigType> {
|
|
13
|
+
readonly strategy = prereqs.PrerequisiteStrategyEnum.bun;
|
|
19
14
|
|
|
20
15
|
constructor(readonly config: PrerequisiteBunConfigType) {
|
|
21
16
|
super(config);
|
|
22
17
|
}
|
|
23
18
|
|
|
24
|
-
async verify(): Promise<PrerequisiteStatusEnum> {
|
|
19
|
+
async verify(): Promise<prereqs.PrerequisiteStatusEnum> {
|
|
20
|
+
if (!this.enabled) return prereqs.PrerequisiteStatusEnum.undetermined;
|
|
21
|
+
|
|
25
22
|
const current = tools.PackageVersion.fromString(this.config.current);
|
|
26
23
|
|
|
27
24
|
if (current.isGreaterThanOrEqual(this.config.version)) {
|
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
import bun from "bun";
|
|
2
|
+
|
|
3
|
+
import {
|
|
4
|
+
AbstractPrerequisite,
|
|
5
|
+
PrerequisiteLabelType,
|
|
6
|
+
PrerequisiteStatusEnum,
|
|
7
|
+
PrerequisiteStrategyEnum,
|
|
8
|
+
} from "../prerequisites";
|
|
9
|
+
|
|
10
|
+
type PrerequisiteDependencyVulnerabilityConfigType = {
|
|
11
|
+
label: PrerequisiteLabelType;
|
|
12
|
+
enabled?: boolean;
|
|
13
|
+
};
|
|
14
|
+
|
|
15
|
+
type BunAuditOutput = {
|
|
16
|
+
[packageName: string]: {
|
|
17
|
+
severity: "low" | "moderate" | "high" | "critical";
|
|
18
|
+
}[];
|
|
19
|
+
};
|
|
20
|
+
|
|
21
|
+
export class PrerequisiteDependencyVulnerabilities extends AbstractPrerequisite<PrerequisiteDependencyVulnerabilityConfigType> {
|
|
22
|
+
readonly strategy = PrerequisiteStrategyEnum.dependencyVulnerabilities;
|
|
23
|
+
|
|
24
|
+
constructor(readonly config: PrerequisiteDependencyVulnerabilityConfigType) {
|
|
25
|
+
super(config);
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
async verify(): Promise<PrerequisiteStatusEnum> {
|
|
29
|
+
if (!this.enabled) return PrerequisiteStatusEnum.undetermined;
|
|
30
|
+
|
|
31
|
+
try {
|
|
32
|
+
const result = await bun.$`bun audit --json`;
|
|
33
|
+
|
|
34
|
+
if (result.exitCode !== 0) return this.reject();
|
|
35
|
+
|
|
36
|
+
const audit = JSON.parse(result.stdout.toString()) as BunAuditOutput;
|
|
37
|
+
|
|
38
|
+
const criticalVulnerabilitiesCount = Object.values(audit).filter((name) =>
|
|
39
|
+
name.some((vulnerability) => vulnerability.severity === "critical"),
|
|
40
|
+
).length;
|
|
41
|
+
|
|
42
|
+
const highVulnerabilitiesCount = Object.values(audit).filter((name) =>
|
|
43
|
+
name.some((vulnerability) => vulnerability.severity === "high"),
|
|
44
|
+
).length;
|
|
45
|
+
|
|
46
|
+
if (criticalVulnerabilitiesCount > 0 || highVulnerabilitiesCount > 0) {
|
|
47
|
+
return this.reject();
|
|
48
|
+
}
|
|
49
|
+
return this.pass();
|
|
50
|
+
} catch (error) {
|
|
51
|
+
return this.reject();
|
|
52
|
+
}
|
|
53
|
+
}
|
|
54
|
+
}
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
import * as prereqs from "../prerequisites";
|
|
2
|
+
|
|
3
|
+
type PrerequisiteExternalApiConnectivityConfigType = {
|
|
4
|
+
label: prereqs.PrerequisiteLabelType;
|
|
5
|
+
enabled?: boolean;
|
|
6
|
+
request: () => Promise<Response>;
|
|
7
|
+
};
|
|
8
|
+
|
|
9
|
+
export class PrerequisiteExternalApi extends prereqs.AbstractPrerequisite<PrerequisiteExternalApiConnectivityConfigType> {
|
|
10
|
+
readonly strategy = prereqs.PrerequisiteStrategyEnum.externalApi;
|
|
11
|
+
|
|
12
|
+
constructor(readonly config: PrerequisiteExternalApiConnectivityConfigType) {
|
|
13
|
+
super(config);
|
|
14
|
+
}
|
|
15
|
+
|
|
16
|
+
async verify(): Promise<prereqs.PrerequisiteStatusEnum> {
|
|
17
|
+
if (!this.enabled) return prereqs.PrerequisiteStatusEnum.undetermined;
|
|
18
|
+
|
|
19
|
+
try {
|
|
20
|
+
const result = await this.config.request();
|
|
21
|
+
|
|
22
|
+
return result.ok ? this.pass() : this.reject();
|
|
23
|
+
} catch (error) {
|
|
24
|
+
return this.reject();
|
|
25
|
+
}
|
|
26
|
+
}
|
|
27
|
+
}
|
|
@@ -1,27 +1,21 @@
|
|
|
1
1
|
import { Jobs, MultipleJobsType } from "../jobs";
|
|
2
|
-
|
|
3
|
-
import {
|
|
4
|
-
AbstractPrerequisite,
|
|
5
|
-
PrerequisiteLabelType,
|
|
6
|
-
PrerequisiteStatusEnum,
|
|
7
|
-
PrerequisiteStrategyEnum,
|
|
8
|
-
} from "../prerequisites";
|
|
2
|
+
import * as prereqs from "../prerequisites";
|
|
9
3
|
|
|
10
4
|
type PrerequisiteJobsConfigType = {
|
|
11
5
|
jobs: MultipleJobsType;
|
|
12
|
-
label: PrerequisiteLabelType;
|
|
6
|
+
label: prereqs.PrerequisiteLabelType;
|
|
13
7
|
enabled?: boolean;
|
|
14
8
|
};
|
|
15
9
|
|
|
16
|
-
export class PrerequisiteJobs extends AbstractPrerequisite<PrerequisiteJobsConfigType> {
|
|
17
|
-
readonly strategy = PrerequisiteStrategyEnum.jobs;
|
|
10
|
+
export class PrerequisiteJobs extends prereqs.AbstractPrerequisite<PrerequisiteJobsConfigType> {
|
|
11
|
+
readonly strategy = prereqs.PrerequisiteStrategyEnum.jobs;
|
|
18
12
|
|
|
19
13
|
constructor(readonly config: PrerequisiteJobsConfigType) {
|
|
20
14
|
super(config);
|
|
21
15
|
}
|
|
22
16
|
|
|
23
|
-
async verify(): Promise<PrerequisiteStatusEnum> {
|
|
24
|
-
if (!this.enabled) return PrerequisiteStatusEnum.undetermined;
|
|
17
|
+
async verify(): Promise<prereqs.PrerequisiteStatusEnum> {
|
|
18
|
+
if (!this.enabled) return prereqs.PrerequisiteStatusEnum.undetermined;
|
|
25
19
|
|
|
26
20
|
return Jobs.areAllRunning(this.config.jobs) ? this.pass() : this.reject();
|
|
27
21
|
}
|
|
@@ -1,26 +1,21 @@
|
|
|
1
1
|
import { Logger } from "../logger";
|
|
2
|
-
import
|
|
3
|
-
AbstractPrerequisite,
|
|
4
|
-
PrerequisiteLabelType,
|
|
5
|
-
PrerequisiteStatusEnum,
|
|
6
|
-
PrerequisiteStrategyEnum,
|
|
7
|
-
} from "../prerequisites";
|
|
2
|
+
import * as prereqs from "../prerequisites";
|
|
8
3
|
|
|
9
4
|
type PrerequisiteLogFileConfigType = {
|
|
10
5
|
logger: Logger;
|
|
11
|
-
label: PrerequisiteLabelType;
|
|
6
|
+
label: prereqs.PrerequisiteLabelType;
|
|
12
7
|
enabled?: boolean;
|
|
13
8
|
};
|
|
14
9
|
|
|
15
|
-
export class PrerequisiteLogFile extends AbstractPrerequisite<PrerequisiteLogFileConfigType> {
|
|
16
|
-
readonly strategy = PrerequisiteStrategyEnum.logFile;
|
|
10
|
+
export class PrerequisiteLogFile extends prereqs.AbstractPrerequisite<PrerequisiteLogFileConfigType> {
|
|
11
|
+
readonly strategy = prereqs.PrerequisiteStrategyEnum.logFile;
|
|
17
12
|
|
|
18
13
|
constructor(readonly config: PrerequisiteLogFileConfigType) {
|
|
19
14
|
super(config);
|
|
20
15
|
}
|
|
21
16
|
|
|
22
|
-
async verify(): Promise<PrerequisiteStatusEnum> {
|
|
23
|
-
if (!this.enabled) return PrerequisiteStatusEnum.undetermined;
|
|
17
|
+
async verify(): Promise<prereqs.PrerequisiteStatusEnum> {
|
|
18
|
+
if (!this.enabled) return prereqs.PrerequisiteStatusEnum.undetermined;
|
|
24
19
|
|
|
25
20
|
try {
|
|
26
21
|
const path = this.config.logger.getProductionLogFilePath();
|