apeframework 0.0.0-dev.20 → 0.0.0-dev.21
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/LICENSE +1 -1
- package/cipher/Algorithm.js +2 -4
- package/cipher/Cipher.js +9 -15
- package/cipher/errors/DecryptError.js +3 -6
- package/cipher/errors/SecretLengthError.js +3 -6
- package/cipher/validateSecretLength.js +7 -10
- package/cli/Args.js +1 -2
- package/cli/Command.js +1 -2
- package/cli/getArgs.js +3 -6
- package/cli/parseArgs.js +3 -9
- package/cli/utils/exit.js +1 -4
- package/cli/utils/formatList.js +3 -6
- package/cli/utils/formatTable.js +3 -6
- package/cli/utils/formatText.js +3 -6
- package/cli/utils/print.js +1 -4
- package/cli/utils/printLn.js +3 -6
- package/config/Config.js +1 -2
- package/config/Properties.js +1 -2
- package/config/errors/FileReadError.js +3 -6
- package/config/errors/PropertyNameError.js +3 -6
- package/config/errors/PropertyParseError.js +3 -6
- package/config/getConfig.js +8 -11
- package/config/getPropertyEnvVar.js +1 -4
- package/config/parseProperty.js +3 -6
- package/config/readFile.js +8 -14
- package/config/validatePropertyName.js +3 -6
- package/env/Env.js +1 -2
- package/env/errors/FileReadError.js +3 -6
- package/env/getEnv.js +3 -6
- package/env/readFile.js +8 -14
- package/error/BaseError.js +1 -4
- package/jwt/Algorithm.js +2 -4
- package/jwt/Jwt.js +6 -9
- package/jwt/Payload.js +1 -2
- package/jwt/errors/SecretLengthError.js +3 -6
- package/jwt/validateSecretLength.js +7 -10
- package/logger/Level.js +2 -4
- package/logger/Logger.js +1 -4
- package/logger/Severity.js +2 -4
- package/logger/adapters/file/FileLogger.js +11 -17
- package/logger/adapters/file/errors/FileInitError.js +3 -6
- package/logger/adapters/file/initFile.js +6 -12
- package/logger/adapters/noop/NoopLogger.js +3 -6
- package/logger/adapters/stdio/StdioLogger.js +11 -17
- package/mailer/Address.js +1 -2
- package/mailer/Attachment.js +1 -2
- package/mailer/Event.js +1 -2
- package/mailer/List.js +1 -2
- package/mailer/Location.js +1 -2
- package/mailer/Mail.js +1 -2
- package/mailer/Mailer.js +16 -19
- package/mailer/Method.js +2 -4
- package/mailer/adapters/noop/NoopMailer.js +5 -8
- package/mailer/adapters/smtp/SmtpMailer.js +19 -25
- package/mailer/adapters/smtp/getAddress.js +1 -4
- package/mailer/adapters/smtp/getAddresses.js +3 -6
- package/mailer/adapters/smtp/getAttachments.js +1 -4
- package/mailer/errors/AddressEmailError.js +3 -6
- package/mailer/errors/EventAttachmentUrlError.js +3 -6
- package/mailer/errors/EventGeolocationError.js +3 -6
- package/mailer/errors/EventUrlError.js +3 -6
- package/mailer/errors/ListUrlError.js +3 -6
- package/mailer/getIcalendar.js +3 -6
- package/mailer/validateAddressEmail.js +5 -8
- package/mailer/validateEventAttachmentUrl.js +5 -8
- package/mailer/validateEventGeolocation.js +5 -8
- package/mailer/validateEventUrl.js +5 -8
- package/mailer/validateListUrl.js +5 -8
- package/package.json +2 -4
- package/parser/Parser.js +1 -2
- package/parser/errors/ParseError.js +3 -6
- package/parser/factories/enum/createEnumParser.js +3 -6
- package/parser/factories/unit/Unit.js +1 -2
- package/parser/factories/unit/createUnitParser.js +8 -11
- package/parser/parseBoolean.js +3 -6
- package/parser/parseBytes.js +3 -6
- package/parser/parseInteger.js +6 -9
- package/parser/parseMilliseconds.js +3 -6
- package/parser/parseNumber.js +4 -7
- package/parser/parseString.js +3 -6
- package/pwd/Pwd.js +6 -12
- package/pwd/errors/HashRoundsError.js +3 -6
- package/pwd/validateHashRounds.js +3 -6
- package/server/ErrorHandler.js +1 -2
- package/server/Format.js +1 -2
- package/server/Handler.js +1 -2
- package/server/Method.js +2 -4
- package/server/OpenApiFormat.js +2 -4
- package/server/Route.js +1 -2
- package/server/Schema.js +1 -2
- package/server/Server.js +15 -21
- package/server/getAjv.js +5 -11
- package/tls/Tls.js +1 -2
- package/tls/errors/FileReadError.js +3 -6
- package/tls/getTls.js +5 -8
- package/tls/readFile.js +7 -13
- package/utils/getRandomHexString.js +3 -6
- package/utils/getTimestamp.js +1 -4
- package/utils/isValidEmail.js +1 -4
- package/utils/isValidGeolocation.js +1 -4
- package/utils/isValidHexString.js +1 -4
- package/utils/isValidIsoDate.js +1 -4
- package/utils/isValidJwtToken.js +1 -4
- package/utils/isValidUrl.js +1 -4
- package/utils/isValidUuid.js +1 -4
- package/utils/wait.js +1 -4
- package/cipher/Algorithm.ts +0 -9
- package/cipher/Cipher.ts +0 -46
- package/cipher/errors/DecryptError.ts +0 -11
- package/cipher/errors/SecretLengthError.ts +0 -11
- package/cipher/validateSecretLength.ts +0 -18
- package/cli/Args.ts +0 -8
- package/cli/Command.ts +0 -7
- package/cli/getArgs.ts +0 -10
- package/cli/parseArgs.ts +0 -34
- package/cli/utils/exit.ts +0 -7
- package/cli/utils/formatList.ts +0 -11
- package/cli/utils/formatTable.ts +0 -25
- package/cli/utils/formatText.ts +0 -9
- package/cli/utils/print.ts +0 -7
- package/cli/utils/printLn.ts +0 -9
- package/config/Config.ts +0 -5
- package/config/Properties.ts +0 -12
- package/config/errors/FileReadError.ts +0 -11
- package/config/errors/PropertyNameError.ts +0 -11
- package/config/errors/PropertyParseError.ts +0 -11
- package/config/getConfig.ts +0 -47
- package/config/getPropertyEnvVar.ts +0 -15
- package/config/parseProperty.ts +0 -47
- package/config/readFile.ts +0 -34
- package/config/validatePropertyName.ts +0 -13
- package/env/Env.ts +0 -5
- package/env/errors/FileReadError.ts +0 -11
- package/env/getEnv.ts +0 -24
- package/env/readFile.ts +0 -24
- package/error/BaseError.ts +0 -12
- package/jwt/Algorithm.ts +0 -9
- package/jwt/Jwt.ts +0 -49
- package/jwt/Payload.ts +0 -14
- package/jwt/errors/SecretLengthError.ts +0 -11
- package/jwt/validateSecretLength.ts +0 -18
- package/logger/Level.ts +0 -13
- package/logger/Logger.ts +0 -19
- package/logger/Severity.ts +0 -12
- package/logger/adapters/file/FileLogger.ts +0 -87
- package/logger/adapters/file/errors/FileInitError.ts +0 -11
- package/logger/adapters/file/initFile.ts +0 -18
- package/logger/adapters/noop/NoopLogger.ts +0 -21
- package/logger/adapters/stdio/StdioLogger.ts +0 -89
- package/mailer/Address.ts +0 -8
- package/mailer/Attachment.ts +0 -11
- package/mailer/Event.ts +0 -20
- package/mailer/List.ts +0 -10
- package/mailer/Location.ts +0 -12
- package/mailer/Mail.ts +0 -23
- package/mailer/Mailer.ts +0 -69
- package/mailer/Method.ts +0 -8
- package/mailer/adapters/noop/NoopMailer.ts +0 -15
- package/mailer/adapters/smtp/SmtpMailer.ts +0 -74
- package/mailer/adapters/smtp/getAddress.ts +0 -15
- package/mailer/adapters/smtp/getAddresses.ts +0 -17
- package/mailer/adapters/smtp/getAttachments.ts +0 -20
- package/mailer/errors/AddressEmailError.ts +0 -11
- package/mailer/errors/EventAttachmentUrlError.ts +0 -11
- package/mailer/errors/EventGeolocationError.ts +0 -11
- package/mailer/errors/EventUrlError.ts +0 -11
- package/mailer/errors/ListUrlError.ts +0 -11
- package/mailer/getIcalendar.ts +0 -39
- package/mailer/validateAddressEmail.ts +0 -12
- package/mailer/validateEventAttachmentUrl.ts +0 -12
- package/mailer/validateEventGeolocation.ts +0 -15
- package/mailer/validateEventUrl.ts +0 -12
- package/mailer/validateListUrl.ts +0 -12
- package/parser/Parser.ts +0 -5
- package/parser/errors/ParseError.ts +0 -11
- package/parser/factories/enum/createEnumParser.ts +0 -21
- package/parser/factories/unit/Unit.ts +0 -8
- package/parser/factories/unit/createUnitParser.ts +0 -50
- package/parser/parseBoolean.ts +0 -33
- package/parser/parseBytes.ts +0 -55
- package/parser/parseInteger.ts +0 -23
- package/parser/parseMilliseconds.ts +0 -31
- package/parser/parseNumber.ts +0 -22
- package/parser/parseString.ts +0 -16
- package/pwd/Pwd.ts +0 -31
- package/pwd/errors/HashRoundsError.ts +0 -11
- package/pwd/validateHashRounds.ts +0 -11
- package/server/ErrorHandler.ts +0 -11
- package/server/Format.ts +0 -15
- package/server/Handler.ts +0 -10
- package/server/Method.ts +0 -11
- package/server/OpenApiFormat.ts +0 -8
- package/server/Route.ts +0 -16
- package/server/Schema.ts +0 -13
- package/server/Server.ts +0 -134
- package/server/getAjv.ts +0 -26
- package/tls/Tls.ts +0 -10
- package/tls/errors/FileReadError.ts +0 -11
- package/tls/getTls.ts +0 -24
- package/tls/readFile.ts +0 -18
- package/utils/getRandomHexString.ts +0 -9
- package/utils/getTimestamp.ts +0 -7
- package/utils/isValidEmail.ts +0 -9
- package/utils/isValidGeolocation.ts +0 -10
- package/utils/isValidHexString.ts +0 -9
- package/utils/isValidIsoDate.ts +0 -9
- package/utils/isValidJwtToken.ts +0 -9
- package/utils/isValidUrl.ts +0 -21
- package/utils/isValidUuid.ts +0 -10
- package/utils/wait.ts +0 -9
|
@@ -1,87 +0,0 @@
|
|
|
1
|
-
import pino from 'pino'
|
|
2
|
-
import { Level } from '../../Level'
|
|
3
|
-
import { Logger } from '../../Logger'
|
|
4
|
-
import { initFile } from './initFile'
|
|
5
|
-
import type { Logger as PinoLogger } from 'pino'
|
|
6
|
-
|
|
7
|
-
class FileLogger extends Logger {
|
|
8
|
-
private readonly logger: PinoLogger
|
|
9
|
-
|
|
10
|
-
private readonly context: object | undefined
|
|
11
|
-
|
|
12
|
-
public constructor(params: {
|
|
13
|
-
path: string,
|
|
14
|
-
level?: Level,
|
|
15
|
-
context?: object,
|
|
16
|
-
}) {
|
|
17
|
-
super()
|
|
18
|
-
|
|
19
|
-
initFile(params.path)
|
|
20
|
-
|
|
21
|
-
const stream = pino.destination(params.path)
|
|
22
|
-
|
|
23
|
-
this.logger = pino({
|
|
24
|
-
enabled: params.level !== Level.OFF,
|
|
25
|
-
level: params.level ?? Level.INFO,
|
|
26
|
-
messageKey: 'message',
|
|
27
|
-
formatters: {
|
|
28
|
-
level(label, number) {
|
|
29
|
-
return {
|
|
30
|
-
level: label,
|
|
31
|
-
severity: number,
|
|
32
|
-
}
|
|
33
|
-
},
|
|
34
|
-
bindings: () => { return {} },
|
|
35
|
-
},
|
|
36
|
-
}, stream)
|
|
37
|
-
|
|
38
|
-
this.context = params.context
|
|
39
|
-
}
|
|
40
|
-
|
|
41
|
-
public trace(message: string, data?: unknown): void {
|
|
42
|
-
this.logger.trace(this.getPayload(message, data))
|
|
43
|
-
}
|
|
44
|
-
|
|
45
|
-
public debug(message: string, data?: unknown): void {
|
|
46
|
-
this.logger.debug(this.getPayload(message, data))
|
|
47
|
-
}
|
|
48
|
-
|
|
49
|
-
public info(message: string, data?: unknown): void {
|
|
50
|
-
this.logger.info(this.getPayload(message, data))
|
|
51
|
-
}
|
|
52
|
-
|
|
53
|
-
public warn(message: string, data?: unknown): void {
|
|
54
|
-
this.logger.warn(this.getPayload(message, data))
|
|
55
|
-
}
|
|
56
|
-
|
|
57
|
-
public error(message: string, data?: unknown): void {
|
|
58
|
-
this.logger.error(this.getPayload(message, data))
|
|
59
|
-
}
|
|
60
|
-
|
|
61
|
-
public fatal(message: string, data?: unknown): void {
|
|
62
|
-
this.logger.fatal(this.getPayload(message, data))
|
|
63
|
-
}
|
|
64
|
-
|
|
65
|
-
public async close(): Promise<void> {
|
|
66
|
-
return new Promise((resolve, reject) => {
|
|
67
|
-
this.logger.flush((error) => {
|
|
68
|
-
if (error) {
|
|
69
|
-
reject(error)
|
|
70
|
-
}
|
|
71
|
-
resolve()
|
|
72
|
-
})
|
|
73
|
-
})
|
|
74
|
-
}
|
|
75
|
-
|
|
76
|
-
private getPayload(message: string, data?: unknown): object {
|
|
77
|
-
return {
|
|
78
|
-
...this.context,
|
|
79
|
-
message,
|
|
80
|
-
data,
|
|
81
|
-
}
|
|
82
|
-
}
|
|
83
|
-
}
|
|
84
|
-
|
|
85
|
-
export {
|
|
86
|
-
FileLogger,
|
|
87
|
-
}
|
|
@@ -1,18 +0,0 @@
|
|
|
1
|
-
import fs from 'fs-extra'
|
|
2
|
-
import { FileInitError } from './errors/FileInitError'
|
|
3
|
-
|
|
4
|
-
const initFile = (path: string): void => {
|
|
5
|
-
if (path === '') {
|
|
6
|
-
throw new FileInitError('', 'empty path')
|
|
7
|
-
}
|
|
8
|
-
|
|
9
|
-
try {
|
|
10
|
-
fs.ensureFileSync(path)
|
|
11
|
-
} catch (error) {
|
|
12
|
-
throw new FileInitError(path, (error as Error).message)
|
|
13
|
-
}
|
|
14
|
-
}
|
|
15
|
-
|
|
16
|
-
export {
|
|
17
|
-
initFile,
|
|
18
|
-
}
|
|
@@ -1,21 +0,0 @@
|
|
|
1
|
-
import { Logger } from '../../Logger'
|
|
2
|
-
|
|
3
|
-
class NoopLogger extends Logger {
|
|
4
|
-
public trace(): void { }
|
|
5
|
-
|
|
6
|
-
public debug(): void { }
|
|
7
|
-
|
|
8
|
-
public info(): void { }
|
|
9
|
-
|
|
10
|
-
public warn(): void { }
|
|
11
|
-
|
|
12
|
-
public error(): void { }
|
|
13
|
-
|
|
14
|
-
public fatal(): void { }
|
|
15
|
-
|
|
16
|
-
public async close(): Promise<void> { }
|
|
17
|
-
}
|
|
18
|
-
|
|
19
|
-
export {
|
|
20
|
-
NoopLogger,
|
|
21
|
-
}
|
|
@@ -1,89 +0,0 @@
|
|
|
1
|
-
import pino from 'pino'
|
|
2
|
-
import pretty from 'pino-pretty'
|
|
3
|
-
import { Level } from '../../Level'
|
|
4
|
-
import { Logger } from '../../Logger'
|
|
5
|
-
import type { Logger as PinoLogger } from 'pino'
|
|
6
|
-
|
|
7
|
-
class StdioLogger extends Logger {
|
|
8
|
-
private readonly logger: PinoLogger
|
|
9
|
-
|
|
10
|
-
private readonly context: object | undefined
|
|
11
|
-
|
|
12
|
-
public constructor(params?: {
|
|
13
|
-
pretty?: boolean,
|
|
14
|
-
level?: Level,
|
|
15
|
-
context?: object,
|
|
16
|
-
}) {
|
|
17
|
-
super()
|
|
18
|
-
|
|
19
|
-
const stream = params?.pretty
|
|
20
|
-
? pretty()
|
|
21
|
-
: pino.destination(process.stdout.fd)
|
|
22
|
-
|
|
23
|
-
this.logger = pino({
|
|
24
|
-
enabled: params?.level !== Level.OFF,
|
|
25
|
-
level: params?.level ?? Level.INFO,
|
|
26
|
-
messageKey: 'message',
|
|
27
|
-
formatters: {
|
|
28
|
-
level(label, number) {
|
|
29
|
-
return {
|
|
30
|
-
level: label,
|
|
31
|
-
...params?.pretty
|
|
32
|
-
? {}
|
|
33
|
-
: { severity: number },
|
|
34
|
-
}
|
|
35
|
-
},
|
|
36
|
-
bindings: () => { return {} },
|
|
37
|
-
},
|
|
38
|
-
}, stream)
|
|
39
|
-
|
|
40
|
-
this.context = params?.context
|
|
41
|
-
}
|
|
42
|
-
|
|
43
|
-
public trace(message: string, data?: unknown): void {
|
|
44
|
-
this.logger.trace(this.getPayload(message, data))
|
|
45
|
-
}
|
|
46
|
-
|
|
47
|
-
public debug(message: string, data?: unknown): void {
|
|
48
|
-
this.logger.debug(this.getPayload(message, data))
|
|
49
|
-
}
|
|
50
|
-
|
|
51
|
-
public info(message: string, data?: unknown): void {
|
|
52
|
-
this.logger.info(this.getPayload(message, data))
|
|
53
|
-
}
|
|
54
|
-
|
|
55
|
-
public warn(message: string, data?: unknown): void {
|
|
56
|
-
this.logger.warn(this.getPayload(message, data))
|
|
57
|
-
}
|
|
58
|
-
|
|
59
|
-
public error(message: string, data?: unknown): void {
|
|
60
|
-
this.logger.error(this.getPayload(message, data))
|
|
61
|
-
}
|
|
62
|
-
|
|
63
|
-
public fatal(message: string, data?: unknown): void {
|
|
64
|
-
this.logger.fatal(this.getPayload(message, data))
|
|
65
|
-
}
|
|
66
|
-
|
|
67
|
-
public async close(): Promise<void> {
|
|
68
|
-
return new Promise((resolve, reject) => {
|
|
69
|
-
this.logger.flush((error) => {
|
|
70
|
-
if (error) {
|
|
71
|
-
reject(error)
|
|
72
|
-
}
|
|
73
|
-
resolve()
|
|
74
|
-
})
|
|
75
|
-
})
|
|
76
|
-
}
|
|
77
|
-
|
|
78
|
-
private getPayload(message: string, data?: unknown): object {
|
|
79
|
-
return {
|
|
80
|
-
...this.context,
|
|
81
|
-
message,
|
|
82
|
-
data,
|
|
83
|
-
}
|
|
84
|
-
}
|
|
85
|
-
}
|
|
86
|
-
|
|
87
|
-
export {
|
|
88
|
-
StdioLogger,
|
|
89
|
-
}
|
package/mailer/Address.ts
DELETED
package/mailer/Attachment.ts
DELETED
package/mailer/Event.ts
DELETED
|
@@ -1,20 +0,0 @@
|
|
|
1
|
-
import type { Location } from './Location'
|
|
2
|
-
import type { Method } from './Method'
|
|
3
|
-
|
|
4
|
-
interface Event {
|
|
5
|
-
fileName?: string,
|
|
6
|
-
method: Method,
|
|
7
|
-
id?: string,
|
|
8
|
-
start: Date,
|
|
9
|
-
end: Date,
|
|
10
|
-
allDay?: boolean,
|
|
11
|
-
name: string,
|
|
12
|
-
description?: string,
|
|
13
|
-
url?: string,
|
|
14
|
-
location?: Location,
|
|
15
|
-
attachments?: string[],
|
|
16
|
-
}
|
|
17
|
-
|
|
18
|
-
export {
|
|
19
|
-
type Event,
|
|
20
|
-
}
|
package/mailer/List.ts
DELETED
package/mailer/Location.ts
DELETED
package/mailer/Mail.ts
DELETED
|
@@ -1,23 +0,0 @@
|
|
|
1
|
-
import type { Address } from './Address'
|
|
2
|
-
import type { Attachment } from './Attachment'
|
|
3
|
-
import type { Event } from './Event'
|
|
4
|
-
import type { List } from './List'
|
|
5
|
-
|
|
6
|
-
interface Mail {
|
|
7
|
-
from: Address,
|
|
8
|
-
sender?: Address,
|
|
9
|
-
replyTo?: Address,
|
|
10
|
-
to: Address[],
|
|
11
|
-
cc?: Address[],
|
|
12
|
-
bcc?: Address[],
|
|
13
|
-
subject: string,
|
|
14
|
-
text: string,
|
|
15
|
-
html?: string,
|
|
16
|
-
attachments?: Attachment[],
|
|
17
|
-
event?: Event,
|
|
18
|
-
list?: List,
|
|
19
|
-
}
|
|
20
|
-
|
|
21
|
-
export {
|
|
22
|
-
type Mail,
|
|
23
|
-
}
|
package/mailer/Mailer.ts
DELETED
|
@@ -1,69 +0,0 @@
|
|
|
1
|
-
import { validateAddressEmail } from './validateAddressEmail'
|
|
2
|
-
import { validateEventAttachmentUrl } from './validateEventAttachmentUrl'
|
|
3
|
-
import { validateEventGeolocation } from './validateEventGeolocation'
|
|
4
|
-
import { validateEventUrl } from './validateEventUrl'
|
|
5
|
-
import { validateListUrl } from './validateListUrl'
|
|
6
|
-
import type { Mail } from './Mail'
|
|
7
|
-
|
|
8
|
-
abstract class Mailer {
|
|
9
|
-
public async send(mail: Mail): Promise<string> {
|
|
10
|
-
validateAddressEmail(mail.from.email)
|
|
11
|
-
|
|
12
|
-
if (mail.sender) {
|
|
13
|
-
validateAddressEmail(mail.sender.email)
|
|
14
|
-
}
|
|
15
|
-
|
|
16
|
-
if (mail.replyTo) {
|
|
17
|
-
validateAddressEmail(mail.replyTo.email)
|
|
18
|
-
}
|
|
19
|
-
|
|
20
|
-
mail.to.forEach((address) => {
|
|
21
|
-
validateAddressEmail(address.email)
|
|
22
|
-
})
|
|
23
|
-
|
|
24
|
-
if (mail.cc) {
|
|
25
|
-
mail.cc.forEach((address) => {
|
|
26
|
-
validateAddressEmail(address.email)
|
|
27
|
-
})
|
|
28
|
-
}
|
|
29
|
-
|
|
30
|
-
if (mail.bcc) {
|
|
31
|
-
mail.bcc.forEach((address) => {
|
|
32
|
-
validateAddressEmail(address.email)
|
|
33
|
-
})
|
|
34
|
-
}
|
|
35
|
-
|
|
36
|
-
if (mail.event?.url) {
|
|
37
|
-
validateEventUrl(mail.event.url)
|
|
38
|
-
}
|
|
39
|
-
|
|
40
|
-
if (mail.event?.location?.geo) {
|
|
41
|
-
validateEventGeolocation(
|
|
42
|
-
mail.event.location.geo.latitude,
|
|
43
|
-
mail.event.location.geo.longitude,
|
|
44
|
-
)
|
|
45
|
-
}
|
|
46
|
-
|
|
47
|
-
if (mail.event?.attachments) {
|
|
48
|
-
mail.event.attachments.forEach((attachment) => {
|
|
49
|
-
validateEventAttachmentUrl(attachment)
|
|
50
|
-
})
|
|
51
|
-
}
|
|
52
|
-
|
|
53
|
-
if (mail.list) {
|
|
54
|
-
Object.entries(mail.list).forEach(([property, url]: [string, string]) => {
|
|
55
|
-
validateListUrl(property, url)
|
|
56
|
-
})
|
|
57
|
-
}
|
|
58
|
-
|
|
59
|
-
return this.sendMail(mail)
|
|
60
|
-
}
|
|
61
|
-
|
|
62
|
-
public abstract sendMail(mail: Mail): Promise<string>
|
|
63
|
-
|
|
64
|
-
public abstract close(): Promise<void>
|
|
65
|
-
}
|
|
66
|
-
|
|
67
|
-
export {
|
|
68
|
-
Mailer,
|
|
69
|
-
}
|
package/mailer/Method.ts
DELETED
|
@@ -1,15 +0,0 @@
|
|
|
1
|
-
import { randomUUID } from 'crypto'
|
|
2
|
-
import { Mailer } from '../../Mailer'
|
|
3
|
-
import type { Mail } from '../../Mail'
|
|
4
|
-
|
|
5
|
-
class NoopMailer extends Mailer {
|
|
6
|
-
public async sendMail(mail: Mail): Promise<string> {
|
|
7
|
-
return `${randomUUID()}@${mail.from.email.split('@')[1]}`
|
|
8
|
-
}
|
|
9
|
-
|
|
10
|
-
public async close(): Promise<void> { }
|
|
11
|
-
}
|
|
12
|
-
|
|
13
|
-
export {
|
|
14
|
-
NoopMailer,
|
|
15
|
-
}
|
|
@@ -1,74 +0,0 @@
|
|
|
1
|
-
import nodemailer from 'nodemailer'
|
|
2
|
-
import { getTls } from '../../../tls/getTls'
|
|
3
|
-
import { Mailer } from '../../Mailer'
|
|
4
|
-
import { getIcalendar } from '../../getIcalendar'
|
|
5
|
-
import { getAddress } from './getAddress'
|
|
6
|
-
import { getAddresses } from './getAddresses'
|
|
7
|
-
import { getAttachments } from './getAttachments'
|
|
8
|
-
import type { Tls } from '../../../tls/Tls'
|
|
9
|
-
import type { Mail } from '../../Mail'
|
|
10
|
-
import type { Transporter } from 'nodemailer'
|
|
11
|
-
|
|
12
|
-
class SmtpMailer extends Mailer {
|
|
13
|
-
private readonly transporter: Transporter
|
|
14
|
-
|
|
15
|
-
public constructor(params: {
|
|
16
|
-
host: string,
|
|
17
|
-
port: number,
|
|
18
|
-
secure?: boolean,
|
|
19
|
-
tls?: Tls,
|
|
20
|
-
user?: string,
|
|
21
|
-
password?: string,
|
|
22
|
-
maxConnections?: number,
|
|
23
|
-
}) {
|
|
24
|
-
super()
|
|
25
|
-
|
|
26
|
-
this.transporter = nodemailer.createTransport({
|
|
27
|
-
host: params.host,
|
|
28
|
-
port: params.port,
|
|
29
|
-
secure: params.secure ?? false,
|
|
30
|
-
tls: getTls(params.tls),
|
|
31
|
-
auth: params.user || params.password
|
|
32
|
-
? {
|
|
33
|
-
user: params.user,
|
|
34
|
-
pass: params.password,
|
|
35
|
-
}
|
|
36
|
-
: undefined,
|
|
37
|
-
pool: true,
|
|
38
|
-
maxConnections: params.maxConnections ?? 5,
|
|
39
|
-
})
|
|
40
|
-
}
|
|
41
|
-
|
|
42
|
-
public async sendMail(mail: Mail): Promise<string> {
|
|
43
|
-
const result = await this.transporter.sendMail({
|
|
44
|
-
from: getAddress(mail.from),
|
|
45
|
-
sender: getAddress(mail.sender),
|
|
46
|
-
replyTo: getAddress(mail.replyTo),
|
|
47
|
-
to: getAddresses(mail.to),
|
|
48
|
-
cc: getAddresses(mail.cc),
|
|
49
|
-
bcc: getAddresses(mail.bcc),
|
|
50
|
-
subject: mail.subject,
|
|
51
|
-
text: mail.text,
|
|
52
|
-
html: mail.html,
|
|
53
|
-
attachments: getAttachments(mail.attachments),
|
|
54
|
-
icalEvent: mail.event
|
|
55
|
-
? {
|
|
56
|
-
filename: mail.event.fileName ?? 'event.ics',
|
|
57
|
-
method: mail.event.method,
|
|
58
|
-
content: getIcalendar(mail.event),
|
|
59
|
-
}
|
|
60
|
-
: undefined,
|
|
61
|
-
list: { ...mail.list },
|
|
62
|
-
})
|
|
63
|
-
|
|
64
|
-
return result.messageId.slice(1, -1)
|
|
65
|
-
}
|
|
66
|
-
|
|
67
|
-
public async close(): Promise<void> {
|
|
68
|
-
this.transporter.close()
|
|
69
|
-
}
|
|
70
|
-
}
|
|
71
|
-
|
|
72
|
-
export {
|
|
73
|
-
SmtpMailer,
|
|
74
|
-
}
|
|
@@ -1,15 +0,0 @@
|
|
|
1
|
-
import type { Address } from '../../Address'
|
|
2
|
-
import type { Address as NodemailerAddress } from 'nodemailer/lib/mailer'
|
|
3
|
-
|
|
4
|
-
const getAddress = (address?: Address): NodemailerAddress | undefined => {
|
|
5
|
-
return address
|
|
6
|
-
? {
|
|
7
|
-
address: address.email,
|
|
8
|
-
name: address.name ?? '',
|
|
9
|
-
}
|
|
10
|
-
: undefined
|
|
11
|
-
}
|
|
12
|
-
|
|
13
|
-
export {
|
|
14
|
-
getAddress,
|
|
15
|
-
}
|
|
@@ -1,17 +0,0 @@
|
|
|
1
|
-
import { getAddress } from './getAddress'
|
|
2
|
-
import type { Address } from '../../Address'
|
|
3
|
-
import type { Address as NodemailerAddress } from 'nodemailer/lib/mailer'
|
|
4
|
-
|
|
5
|
-
const getAddresses = (addresses?: Address[]): NodemailerAddress[] => {
|
|
6
|
-
return addresses
|
|
7
|
-
? addresses
|
|
8
|
-
.map(getAddress)
|
|
9
|
-
.filter((address) => {
|
|
10
|
-
return address !== undefined
|
|
11
|
-
})
|
|
12
|
-
: []
|
|
13
|
-
}
|
|
14
|
-
|
|
15
|
-
export {
|
|
16
|
-
getAddresses,
|
|
17
|
-
}
|
|
@@ -1,20 +0,0 @@
|
|
|
1
|
-
import type { Attachment } from '../../Attachment'
|
|
2
|
-
import type { Attachment as NodemailerAttachment } from 'nodemailer/lib/mailer'
|
|
3
|
-
|
|
4
|
-
const getAttachments = (attachments?: Attachment[]): NodemailerAttachment[] => {
|
|
5
|
-
return attachments
|
|
6
|
-
? attachments
|
|
7
|
-
.map((attachment) => {
|
|
8
|
-
return {
|
|
9
|
-
filename: attachment.fileName,
|
|
10
|
-
cid: attachment.fileName,
|
|
11
|
-
contentType: attachment.contentType,
|
|
12
|
-
content: attachment.content,
|
|
13
|
-
}
|
|
14
|
-
})
|
|
15
|
-
: []
|
|
16
|
-
}
|
|
17
|
-
|
|
18
|
-
export {
|
|
19
|
-
getAttachments,
|
|
20
|
-
}
|
|
@@ -1,11 +0,0 @@
|
|
|
1
|
-
import { BaseError } from '../../error/BaseError'
|
|
2
|
-
|
|
3
|
-
class EventGeolocationError extends BaseError {
|
|
4
|
-
public constructor(latitude: number, longitude: number) {
|
|
5
|
-
super(`invalid event geolocation "${latitude}, ${longitude}"`)
|
|
6
|
-
}
|
|
7
|
-
}
|
|
8
|
-
|
|
9
|
-
export {
|
|
10
|
-
EventGeolocationError,
|
|
11
|
-
}
|
package/mailer/getIcalendar.ts
DELETED
|
@@ -1,39 +0,0 @@
|
|
|
1
|
-
import { ICalCalendar } from 'ical-generator'
|
|
2
|
-
import type { Event } from './Event'
|
|
3
|
-
import type { ICalCalendarMethod } from 'ical-generator'
|
|
4
|
-
|
|
5
|
-
const getIcalendar = (event: Event): string => {
|
|
6
|
-
const calendar = new ICalCalendar({
|
|
7
|
-
method: event.method as unknown as ICalCalendarMethod,
|
|
8
|
-
events: [
|
|
9
|
-
{
|
|
10
|
-
id: event.id,
|
|
11
|
-
start: event.start,
|
|
12
|
-
end: event.end,
|
|
13
|
-
allDay: event.allDay,
|
|
14
|
-
summary: event.name,
|
|
15
|
-
description: event.description,
|
|
16
|
-
url: event.url,
|
|
17
|
-
location: event.location
|
|
18
|
-
? {
|
|
19
|
-
title: event.location.name,
|
|
20
|
-
address: event.location.address,
|
|
21
|
-
geo: event.location.geo
|
|
22
|
-
? {
|
|
23
|
-
lat: event.location.geo.latitude,
|
|
24
|
-
lon: event.location.geo.longitude,
|
|
25
|
-
}
|
|
26
|
-
: undefined,
|
|
27
|
-
}
|
|
28
|
-
: undefined,
|
|
29
|
-
attachments: event.attachments,
|
|
30
|
-
},
|
|
31
|
-
],
|
|
32
|
-
})
|
|
33
|
-
|
|
34
|
-
return calendar.toString()
|
|
35
|
-
}
|
|
36
|
-
|
|
37
|
-
export {
|
|
38
|
-
getIcalendar,
|
|
39
|
-
}
|
|
@@ -1,12 +0,0 @@
|
|
|
1
|
-
import { isValidEmail } from 'utils/isValidEmail'
|
|
2
|
-
import { AddressEmailError } from './errors/AddressEmailError'
|
|
3
|
-
|
|
4
|
-
const validateAddressEmail = (email: string): void => {
|
|
5
|
-
if (!isValidEmail(email)) {
|
|
6
|
-
throw new AddressEmailError(email)
|
|
7
|
-
}
|
|
8
|
-
}
|
|
9
|
-
|
|
10
|
-
export {
|
|
11
|
-
validateAddressEmail,
|
|
12
|
-
}
|
|
@@ -1,12 +0,0 @@
|
|
|
1
|
-
import { isValidUrl } from 'utils/isValidUrl'
|
|
2
|
-
import { EventAttachmentUrlError } from './errors/EventAttachmentUrlError'
|
|
3
|
-
|
|
4
|
-
const validateEventAttachmentUrl = (url: string): void => {
|
|
5
|
-
if (!isValidUrl(url)) {
|
|
6
|
-
throw new EventAttachmentUrlError(url)
|
|
7
|
-
}
|
|
8
|
-
}
|
|
9
|
-
|
|
10
|
-
export {
|
|
11
|
-
validateEventAttachmentUrl,
|
|
12
|
-
}
|