-
-
Notifications
You must be signed in to change notification settings - Fork 42
Expand file tree
/
Copy pathconfigure.ts
More file actions
132 lines (119 loc) · 3.57 KB
/
configure.ts
File metadata and controls
132 lines (119 loc) · 3.57 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
/*
* @adonisjs/mail
*
* (c) AdonisJS
*
* For the full copyright and license information, please view the LICENSE
* file that was distributed with this source code.
*/
import string from '@adonisjs/core/helpers/string'
import type Configure from '@adonisjs/core/commands/configure'
import { stubsRoot } from './stubs/main.js'
/**
* List of env variables used by different transports
*/
const ENV_VARIABLES: Record<string, Record<string, string | number>> = {
smtp: { SMTP_HOST: 'localhost', SMTP_PORT: 1025 },
ses: {
AWS_ACCESS_KEY_ID: 'your-access-key-id',
AWS_SECRET_ACCESS_KEY: 'your-secret-key',
AWS_REGION: 'us-east-1',
},
mailgun: { MAILGUN_API_KEY: 'your-mailgun-api-key', MAILGUN_DOMAIN: 'mg.example.com' },
sparkpost: { SPARKPOST_API_KEY: 'your-sparkpost-api-key' },
resend: { RESEND_API_KEY: 'your-resend-api-key' },
brevo: { BREVO_API_KEY: 'your-brevo-api-key' },
}
/**
* List of supported transports
*/
const KNOWN_TRANSPORTS = Object.keys(ENV_VARIABLES)
/**
* Configures the package
*/
export async function configure(command: Configure) {
/**
* Read transports from the "--transports" CLI flag
*/
let selectedTransports: string | string[] | undefined = command.parsedFlags.transports
/**
* Display prompts when transports have been selected
* via the CLI flag
*/
if (!selectedTransports) {
selectedTransports = await command.prompt.multiple(
'Select the mail services you want to use',
KNOWN_TRANSPORTS,
{
validate(values) {
return !values || !values.length ? 'Please select one or more transports' : true
},
}
)
}
/**
* Normalized list of transports
*/
const transports =
typeof selectedTransports === 'string' ? [selectedTransports] : selectedTransports!
const unknownTransport = transports.find((transport) => !KNOWN_TRANSPORTS.includes(transport))
if (unknownTransport) {
command.exitCode = 1
command.logger.logError(
`Invalid transport "${unknownTransport}". Supported transports are: ${string.sentence(
KNOWN_TRANSPORTS
)}`
)
return
}
const codemods = await command.createCodemods()
/**
* Publish config file
*/
await codemods.makeUsingStub(stubsRoot, 'config/mail.stub', {
transports: transports,
})
/**
* Publish provider and command
*/
await codemods.updateRcFile((rcFile) => {
rcFile.addProvider('@adonisjs/mail/mail_provider')
rcFile.addCommand('@adonisjs/mail/commands')
})
/**
* Define env variables for the selected transports
*/
await codemods.defineEnvVariables(
transports.reduce<Record<string, string>>(
(result, transport) => {
Object.assign(result, ENV_VARIABLES[transport])
return result
},
{
MAIL_MAILER: transports[0],
MAIL_FROM_NAME: 'Your name',
MAIL_FROM_ADDRESS: 'app@yourdomain.com',
}
)
)
/**
* Define env variables validation for the selected transports
*/
await codemods.defineEnvValidations({
leadingComment: 'Variables for configuring the mail package',
variables: transports.reduce<Record<string, string>>(
(result, transport) => {
for (const envVariable of Object.keys(ENV_VARIABLES[transport])) {
result[envVariable] =
`Env.schema.${envVariable === 'SMTP_PORT' ? 'number()' : 'string()'}`
}
return result
},
{
MAIL_MAILER: `Env.schema.enum(['${transports.join("','")}'] as const)`,
MAIL_FROM_NAME: 'Env.schema.string()',
MAIL_FROM_ADDRESS: 'Env.schema.string()',
}
),
})
}