@strapi/email 0.0.0-experimental.6340da17068c3bed7fb006e7bcc554c71129e282 → 0.0.0-experimental.63624e21eb5b0713345a0cf2f68f1c40eab427bc
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/admin/index.js +1 -1
- package/dist/admin/translations/ko.json.js +29 -2
- package/dist/admin/translations/ko.json.js.map +1 -1
- package/dist/admin/translations/ko.json.mjs +26 -2
- package/dist/admin/translations/ko.json.mjs.map +1 -1
- package/dist/admin/utils/getYupInnerErrors.js +9 -2
- package/dist/admin/utils/getYupInnerErrors.js.map +1 -1
- package/dist/admin/utils/getYupInnerErrors.mjs +9 -2
- package/dist/admin/utils/getYupInnerErrors.mjs.map +1 -1
- package/dist/server/bootstrap.js +3 -3
- package/dist/server/bootstrap.js.map +1 -1
- package/dist/server/bootstrap.mjs +3 -3
- package/dist/server/bootstrap.mjs.map +1 -1
- package/dist/server/controllers/email.js +3 -3
- package/dist/server/controllers/email.js.map +1 -1
- package/dist/server/controllers/email.mjs +3 -3
- package/dist/server/controllers/email.mjs.map +1 -1
- package/dist/server/controllers/index.js.map +1 -1
- package/dist/server/controllers/index.mjs.map +1 -1
- package/dist/server/index.js.map +1 -1
- package/dist/server/index.mjs.map +1 -1
- package/dist/server/middlewares/rateLimit.js +7 -9
- package/dist/server/middlewares/rateLimit.js.map +1 -1
- package/dist/server/middlewares/rateLimit.mjs +7 -5
- package/dist/server/middlewares/rateLimit.mjs.map +1 -1
- package/dist/server/routes/admin.js +3 -2
- package/dist/server/routes/admin.js.map +1 -1
- package/dist/server/routes/admin.mjs +3 -2
- package/dist/server/routes/admin.mjs.map +1 -1
- package/dist/server/routes/content-api.js +1 -0
- package/dist/server/routes/content-api.js.map +1 -1
- package/dist/server/routes/content-api.mjs +1 -0
- package/dist/server/routes/content-api.mjs.map +1 -1
- package/dist/server/routes/index.mjs +2 -2
- package/dist/server/routes/index.mjs.map +1 -1
- package/dist/server/services/email.js +2 -0
- package/dist/server/services/email.js.map +1 -1
- package/dist/server/services/email.mjs +2 -0
- package/dist/server/services/email.mjs.map +1 -1
- package/dist/server/services/index.js.map +1 -1
- package/dist/server/services/index.mjs.map +1 -1
- package/dist/server/src/controllers/email.d.ts.map +1 -1
- package/dist/server/src/controllers/index.d.ts.map +1 -1
- package/dist/server/src/index.d.ts +6 -3
- package/dist/server/src/index.d.ts.map +1 -1
- package/dist/server/src/middlewares/index.d.ts +1 -1
- package/dist/server/src/middlewares/index.d.ts.map +1 -1
- package/dist/server/src/middlewares/rateLimit.d.ts.map +1 -1
- package/dist/server/src/registries.d.ts +2 -0
- package/dist/server/src/registries.d.ts.map +1 -0
- package/dist/server/src/routes/admin.d.ts +2 -2
- package/dist/server/src/routes/admin.d.ts.map +1 -1
- package/dist/server/src/routes/content-api.d.ts.map +1 -1
- package/dist/server/src/routes/index.d.ts +1 -1
- package/dist/server/src/services/email.d.ts.map +1 -1
- package/dist/server/src/services/index.d.ts +3 -3
- package/dist/server/src/services/index.d.ts.map +1 -1
- package/dist/server/src/types/controllers.d.ts +23 -0
- package/dist/server/src/types/controllers.d.ts.map +1 -0
- package/dist/server/src/types/rate-limit.d.ts +43 -0
- package/dist/server/src/types/rate-limit.d.ts.map +1 -0
- package/dist/server/src/types/services.d.ts +75 -0
- package/dist/server/src/types/services.d.ts.map +1 -0
- package/package.json +33 -16
package/dist/admin/index.js
CHANGED
|
@@ -17,7 +17,7 @@ function __variableDynamicImportRuntime1__(path) {
|
|
|
17
17
|
case './translations/id.json': return Promise.resolve().then(function () { return /*#__PURE__*/_interopNamespaceDefaultOnly(require('./translations/id.json.js')); });
|
|
18
18
|
case './translations/it.json': return Promise.resolve().then(function () { return /*#__PURE__*/_interopNamespaceDefaultOnly(require('./translations/it.json.js')); });
|
|
19
19
|
case './translations/ja.json': return Promise.resolve().then(function () { return require('./translations/ja.json.js'); });
|
|
20
|
-
case './translations/ko.json': return Promise.resolve().then(function () { return
|
|
20
|
+
case './translations/ko.json': return Promise.resolve().then(function () { return require('./translations/ko.json.js'); });
|
|
21
21
|
case './translations/ms.json': return Promise.resolve().then(function () { return /*#__PURE__*/_interopNamespaceDefaultOnly(require('./translations/ms.json.js')); });
|
|
22
22
|
case './translations/nl.json': return Promise.resolve().then(function () { return require('./translations/nl.json.js'); });
|
|
23
23
|
case './translations/pl.json': return Promise.resolve().then(function () { return require('./translations/pl.json.js'); });
|
|
@@ -1,5 +1,8 @@
|
|
|
1
1
|
'use strict';
|
|
2
2
|
|
|
3
|
+
Object.defineProperty(exports, '__esModule', { value: true });
|
|
4
|
+
|
|
5
|
+
var link = "링크";
|
|
3
6
|
var ko = {
|
|
4
7
|
"Settings.email.plugin.button.test-email": "테스트 발송",
|
|
5
8
|
"Settings.email.plugin.label.defaultFrom": "기본 발송자 이메일",
|
|
@@ -20,8 +23,32 @@ var ko = {
|
|
|
20
23
|
"Settings.email.plugin.title.test": "테스트 이메일 발송",
|
|
21
24
|
"SettingsNav.link.settings": "설정",
|
|
22
25
|
"SettingsNav.section-label": "이메일 플러그인",
|
|
23
|
-
"components.Input.error.validation.email": "유효하지 않은 이메일입니다."
|
|
26
|
+
"components.Input.error.validation.email": "유효하지 않은 이메일입니다.",
|
|
27
|
+
link: link,
|
|
28
|
+
"Settings.email.plugin.button.verify": "연결 테스트",
|
|
29
|
+
"Settings.email.plugin.label.replyToName": "기본 회신 이름",
|
|
30
|
+
"Settings.email.plugin.label.senderName": "기본 발송자 이름",
|
|
31
|
+
"Settings.email.plugin.label.verifyConnection": "연결 상태",
|
|
32
|
+
"Settings.email.plugin.notification.verify.error": "연결 확인에 실패했습니다.",
|
|
33
|
+
"Settings.email.plugin.notification.verify.success": "연결이 확인되었습니다.",
|
|
34
|
+
"Settings.email.plugin.status.connected": "연결됨",
|
|
35
|
+
"Settings.email.plugin.status.error": "오류",
|
|
36
|
+
"Settings.capabilities.title": "서비스 제공자 기능",
|
|
37
|
+
"Settings.capabilities.subtitle": "현재 SMTP 설정 및 활성화된 기능",
|
|
38
|
+
"Settings.capabilities.label.smtpServer": "SMTP 서버",
|
|
39
|
+
"Settings.capabilities.label.encryption": "암호화",
|
|
40
|
+
"Settings.capabilities.label.authType": "인증",
|
|
41
|
+
"Settings.capabilities.label.poolStatus": "풀 상태",
|
|
42
|
+
"Settings.capabilities.label.features": "활성화된 기능",
|
|
43
|
+
"Settings.capabilities.poolStatus.idle": "대기 중",
|
|
44
|
+
"Settings.capabilities.poolStatus.active": "활성",
|
|
45
|
+
"Settings.capabilities.feature.dkim": "DKIM",
|
|
46
|
+
"Settings.capabilities.feature.pool": "연결 풀",
|
|
47
|
+
"Settings.capabilities.feature.rateLimiting": "속도 제한",
|
|
48
|
+
"Settings.capabilities.feature.oauth2": "OAuth2",
|
|
49
|
+
"Settings.capabilities.feature.requireTLS": "TLS 필수"
|
|
24
50
|
};
|
|
25
51
|
|
|
26
|
-
|
|
52
|
+
exports.default = ko;
|
|
53
|
+
exports.link = link;
|
|
27
54
|
//# sourceMappingURL=ko.json.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ko.json.js","sources":[],"sourcesContent":[],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"ko.json.js","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;"}
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
var link = "링크";
|
|
1
2
|
var ko = {
|
|
2
3
|
"Settings.email.plugin.button.test-email": "테스트 발송",
|
|
3
4
|
"Settings.email.plugin.label.defaultFrom": "기본 발송자 이메일",
|
|
@@ -18,8 +19,31 @@ var ko = {
|
|
|
18
19
|
"Settings.email.plugin.title.test": "테스트 이메일 발송",
|
|
19
20
|
"SettingsNav.link.settings": "설정",
|
|
20
21
|
"SettingsNav.section-label": "이메일 플러그인",
|
|
21
|
-
"components.Input.error.validation.email": "유효하지 않은 이메일입니다."
|
|
22
|
+
"components.Input.error.validation.email": "유효하지 않은 이메일입니다.",
|
|
23
|
+
link: link,
|
|
24
|
+
"Settings.email.plugin.button.verify": "연결 테스트",
|
|
25
|
+
"Settings.email.plugin.label.replyToName": "기본 회신 이름",
|
|
26
|
+
"Settings.email.plugin.label.senderName": "기본 발송자 이름",
|
|
27
|
+
"Settings.email.plugin.label.verifyConnection": "연결 상태",
|
|
28
|
+
"Settings.email.plugin.notification.verify.error": "연결 확인에 실패했습니다.",
|
|
29
|
+
"Settings.email.plugin.notification.verify.success": "연결이 확인되었습니다.",
|
|
30
|
+
"Settings.email.plugin.status.connected": "연결됨",
|
|
31
|
+
"Settings.email.plugin.status.error": "오류",
|
|
32
|
+
"Settings.capabilities.title": "서비스 제공자 기능",
|
|
33
|
+
"Settings.capabilities.subtitle": "현재 SMTP 설정 및 활성화된 기능",
|
|
34
|
+
"Settings.capabilities.label.smtpServer": "SMTP 서버",
|
|
35
|
+
"Settings.capabilities.label.encryption": "암호화",
|
|
36
|
+
"Settings.capabilities.label.authType": "인증",
|
|
37
|
+
"Settings.capabilities.label.poolStatus": "풀 상태",
|
|
38
|
+
"Settings.capabilities.label.features": "활성화된 기능",
|
|
39
|
+
"Settings.capabilities.poolStatus.idle": "대기 중",
|
|
40
|
+
"Settings.capabilities.poolStatus.active": "활성",
|
|
41
|
+
"Settings.capabilities.feature.dkim": "DKIM",
|
|
42
|
+
"Settings.capabilities.feature.pool": "연결 풀",
|
|
43
|
+
"Settings.capabilities.feature.rateLimiting": "속도 제한",
|
|
44
|
+
"Settings.capabilities.feature.oauth2": "OAuth2",
|
|
45
|
+
"Settings.capabilities.feature.requireTLS": "TLS 필수"
|
|
22
46
|
};
|
|
23
47
|
|
|
24
|
-
export { ko as default };
|
|
48
|
+
export { ko as default, link };
|
|
25
49
|
//# sourceMappingURL=ko.json.mjs.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ko.json.mjs","sources":[],"sourcesContent":[],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"ko.json.mjs","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;"}
|
|
@@ -1,11 +1,18 @@
|
|
|
1
1
|
'use strict';
|
|
2
2
|
|
|
3
|
+
const isPrimitiveType = (value)=>{
|
|
4
|
+
return typeof value === 'string' || typeof value === 'number' || typeof value === 'boolean' || value === null || value === undefined;
|
|
5
|
+
};
|
|
3
6
|
const extractValuesFromYupError = (errorType, errorParams)=>{
|
|
4
|
-
if (
|
|
7
|
+
if (errorType === undefined || errorParams === undefined) {
|
|
8
|
+
return {};
|
|
9
|
+
}
|
|
10
|
+
const value = errorParams[errorType];
|
|
11
|
+
if (isPrimitiveType(value) === false) {
|
|
5
12
|
return {};
|
|
6
13
|
}
|
|
7
14
|
return {
|
|
8
|
-
[errorType]:
|
|
15
|
+
[errorType]: value
|
|
9
16
|
};
|
|
10
17
|
};
|
|
11
18
|
const getYupInnerErrors = (error)=>(error?.inner || []).reduce((acc, currentError)=>{
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"getYupInnerErrors.js","sources":["../../../admin/src/utils/getYupInnerErrors.ts"],"sourcesContent":["import type { MessageDescriptor, PrimitiveType } from 'react-intl';\nimport type { ValidationError } from 'yup';\n\ninterface TranslationMessage extends MessageDescriptor {\n values?: Record<string, PrimitiveType>;\n}\n\nconst extractValuesFromYupError = (\n errorType?: string | undefined,\n errorParams?: Record<string,
|
|
1
|
+
{"version":3,"file":"getYupInnerErrors.js","sources":["../../../admin/src/utils/getYupInnerErrors.ts"],"sourcesContent":["import type { MessageDescriptor, PrimitiveType } from 'react-intl';\nimport type { ValidationError } from 'yup';\n\ninterface TranslationMessage extends MessageDescriptor {\n values?: Record<string, PrimitiveType>;\n}\n\nconst isPrimitiveType = (value: unknown): value is PrimitiveType => {\n return (\n typeof value === 'string' ||\n typeof value === 'number' ||\n typeof value === 'boolean' ||\n value === null ||\n value === undefined\n );\n};\n\nconst extractValuesFromYupError = (\n errorType?: string | undefined,\n errorParams?: Record<string, unknown> | undefined\n) => {\n if (errorType === undefined || errorParams === undefined) {\n return {};\n }\n\n const value = errorParams[errorType];\n\n if (isPrimitiveType(value) === false) {\n return {};\n }\n\n return {\n [errorType]: value,\n };\n};\n\nconst getYupInnerErrors = (error: ValidationError) =>\n (error?.inner || []).reduce<Record<string, TranslationMessage>>((acc, currentError) => {\n if (currentError.path) {\n acc[currentError.path.split('[').join('.').split(']').join('')] = {\n id: currentError.message,\n defaultMessage: currentError.message,\n values: extractValuesFromYupError(currentError?.type, currentError?.params),\n };\n }\n\n return acc;\n }, {});\n\nexport { getYupInnerErrors };\n"],"names":["isPrimitiveType","value","undefined","extractValuesFromYupError","errorType","errorParams","getYupInnerErrors","error","inner","reduce","acc","currentError","path","split","join","id","message","defaultMessage","values","type","params"],"mappings":";;AAOA,MAAMA,kBAAkB,CAACC,KAAAA,GAAAA;IACvB,OACE,OAAOA,KAAAA,KAAU,QAAA,IACjB,OAAOA,KAAAA,KAAU,QAAA,IACjB,OAAOA,KAAAA,KAAU,SAAA,IACjBA,KAAAA,KAAU,IAAA,IACVA,KAAAA,KAAUC,SAAAA;AAEd,CAAA;AAEA,MAAMC,yBAAAA,GAA4B,CAChCC,SAAAA,EACAC,WAAAA,GAAAA;IAEA,IAAID,SAAAA,KAAcF,SAAAA,IAAaG,WAAAA,KAAgBH,SAAAA,EAAW;AACxD,QAAA,OAAO,EAAC;AACV,IAAA;IAEA,MAAMD,KAAAA,GAAQI,WAAW,CAACD,SAAAA,CAAU;IAEpC,IAAIJ,eAAAA,CAAgBC,WAAW,KAAA,EAAO;AACpC,QAAA,OAAO,EAAC;AACV,IAAA;IAEA,OAAO;AACL,QAAA,CAACG,YAAYH;AACf,KAAA;AACF,CAAA;AAEA,MAAMK,iBAAAA,GAAoB,CAACC,KAAAA,GACxBA,CAAAA,KAAAA,EAAOC,KAAAA,IAAS,EAAE,EAAEC,MAAM,CAAqC,CAACC,GAAAA,EAAKC,YAAAA,GAAAA;QACpE,IAAIA,YAAAA,CAAaC,IAAI,EAAE;AACrBF,YAAAA,GAAG,CAACC,YAAAA,CAAaC,IAAI,CAACC,KAAK,CAAC,GAAA,CAAA,CAAKC,IAAI,CAAC,GAAA,CAAA,CAAKD,KAAK,CAAC,GAAA,CAAA,CAAKC,IAAI,CAAC,IAAI,GAAG;AAChEC,gBAAAA,EAAAA,EAAIJ,aAAaK,OAAO;AACxBC,gBAAAA,cAAAA,EAAgBN,aAAaK,OAAO;gBACpCE,MAAAA,EAAQf,yBAAAA,CAA0BQ,YAAAA,EAAcQ,IAAAA,EAAMR,YAAAA,EAAcS,MAAAA;AACtE,aAAA;AACF,QAAA;QAEA,OAAOV,GAAAA;AACT,IAAA,CAAA,EAAG,EAAC;;;;"}
|
|
@@ -1,9 +1,16 @@
|
|
|
1
|
+
const isPrimitiveType = (value)=>{
|
|
2
|
+
return typeof value === 'string' || typeof value === 'number' || typeof value === 'boolean' || value === null || value === undefined;
|
|
3
|
+
};
|
|
1
4
|
const extractValuesFromYupError = (errorType, errorParams)=>{
|
|
2
|
-
if (
|
|
5
|
+
if (errorType === undefined || errorParams === undefined) {
|
|
6
|
+
return {};
|
|
7
|
+
}
|
|
8
|
+
const value = errorParams[errorType];
|
|
9
|
+
if (isPrimitiveType(value) === false) {
|
|
3
10
|
return {};
|
|
4
11
|
}
|
|
5
12
|
return {
|
|
6
|
-
[errorType]:
|
|
13
|
+
[errorType]: value
|
|
7
14
|
};
|
|
8
15
|
};
|
|
9
16
|
const getYupInnerErrors = (error)=>(error?.inner || []).reduce((acc, currentError)=>{
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"getYupInnerErrors.mjs","sources":["../../../admin/src/utils/getYupInnerErrors.ts"],"sourcesContent":["import type { MessageDescriptor, PrimitiveType } from 'react-intl';\nimport type { ValidationError } from 'yup';\n\ninterface TranslationMessage extends MessageDescriptor {\n values?: Record<string, PrimitiveType>;\n}\n\nconst extractValuesFromYupError = (\n errorType?: string | undefined,\n errorParams?: Record<string,
|
|
1
|
+
{"version":3,"file":"getYupInnerErrors.mjs","sources":["../../../admin/src/utils/getYupInnerErrors.ts"],"sourcesContent":["import type { MessageDescriptor, PrimitiveType } from 'react-intl';\nimport type { ValidationError } from 'yup';\n\ninterface TranslationMessage extends MessageDescriptor {\n values?: Record<string, PrimitiveType>;\n}\n\nconst isPrimitiveType = (value: unknown): value is PrimitiveType => {\n return (\n typeof value === 'string' ||\n typeof value === 'number' ||\n typeof value === 'boolean' ||\n value === null ||\n value === undefined\n );\n};\n\nconst extractValuesFromYupError = (\n errorType?: string | undefined,\n errorParams?: Record<string, unknown> | undefined\n) => {\n if (errorType === undefined || errorParams === undefined) {\n return {};\n }\n\n const value = errorParams[errorType];\n\n if (isPrimitiveType(value) === false) {\n return {};\n }\n\n return {\n [errorType]: value,\n };\n};\n\nconst getYupInnerErrors = (error: ValidationError) =>\n (error?.inner || []).reduce<Record<string, TranslationMessage>>((acc, currentError) => {\n if (currentError.path) {\n acc[currentError.path.split('[').join('.').split(']').join('')] = {\n id: currentError.message,\n defaultMessage: currentError.message,\n values: extractValuesFromYupError(currentError?.type, currentError?.params),\n };\n }\n\n return acc;\n }, {});\n\nexport { getYupInnerErrors };\n"],"names":["isPrimitiveType","value","undefined","extractValuesFromYupError","errorType","errorParams","getYupInnerErrors","error","inner","reduce","acc","currentError","path","split","join","id","message","defaultMessage","values","type","params"],"mappings":"AAOA,MAAMA,kBAAkB,CAACC,KAAAA,GAAAA;IACvB,OACE,OAAOA,KAAAA,KAAU,QAAA,IACjB,OAAOA,KAAAA,KAAU,QAAA,IACjB,OAAOA,KAAAA,KAAU,SAAA,IACjBA,KAAAA,KAAU,IAAA,IACVA,KAAAA,KAAUC,SAAAA;AAEd,CAAA;AAEA,MAAMC,yBAAAA,GAA4B,CAChCC,SAAAA,EACAC,WAAAA,GAAAA;IAEA,IAAID,SAAAA,KAAcF,SAAAA,IAAaG,WAAAA,KAAgBH,SAAAA,EAAW;AACxD,QAAA,OAAO,EAAC;AACV,IAAA;IAEA,MAAMD,KAAAA,GAAQI,WAAW,CAACD,SAAAA,CAAU;IAEpC,IAAIJ,eAAAA,CAAgBC,WAAW,KAAA,EAAO;AACpC,QAAA,OAAO,EAAC;AACV,IAAA;IAEA,OAAO;AACL,QAAA,CAACG,YAAYH;AACf,KAAA;AACF,CAAA;AAEA,MAAMK,iBAAAA,GAAoB,CAACC,KAAAA,GACxBA,CAAAA,KAAAA,EAAOC,KAAAA,IAAS,EAAE,EAAEC,MAAM,CAAqC,CAACC,GAAAA,EAAKC,YAAAA,GAAAA;QACpE,IAAIA,YAAAA,CAAaC,IAAI,EAAE;AACrBF,YAAAA,GAAG,CAACC,YAAAA,CAAaC,IAAI,CAACC,KAAK,CAAC,GAAA,CAAA,CAAKC,IAAI,CAAC,GAAA,CAAA,CAAKD,KAAK,CAAC,GAAA,CAAA,CAAKC,IAAI,CAAC,IAAI,GAAG;AAChEC,gBAAAA,EAAAA,EAAIJ,aAAaK,OAAO;AACxBC,gBAAAA,cAAAA,EAAgBN,aAAaK,OAAO;gBACpCE,MAAAA,EAAQf,yBAAAA,CAA0BQ,YAAAA,EAAcQ,IAAAA,EAAMR,YAAAA,EAAcS,MAAAA;AACtE,aAAA;AACF,QAAA;QAEA,OAAOV,GAAAA;AACT,IAAA,CAAA,EAAG,EAAC;;;;"}
|
package/dist/server/bootstrap.js
CHANGED
|
@@ -27,9 +27,9 @@ const createProvider = (emailConfig)=>{
|
|
|
27
27
|
const bootstrap = async ({ strapi })=>{
|
|
28
28
|
const emailConfig = strapi.config.get('plugin::email');
|
|
29
29
|
const providerName = emailConfig.provider.toLowerCase();
|
|
30
|
-
const
|
|
31
|
-
if (providerName === 'sendmail' &&
|
|
32
|
-
strapi.log.warn('[email]: The "sendmail" email provider is still supported, but for most production setups that use a dedicated SMTP relay, consider switching to @strapi/provider-email-nodemailer (set `provider` to `"nodemailer"` in your email plugin config). This message is only shown in
|
|
30
|
+
const isDevelopment = process.env.NODE_ENV === 'development';
|
|
31
|
+
if (providerName === 'sendmail' && isDevelopment) {
|
|
32
|
+
strapi.log.warn('[email]: The "sendmail" email provider is still supported, but for most production setups that use a dedicated SMTP relay, consider switching to @strapi/provider-email-nodemailer (set `provider` to `"nodemailer"` in your email plugin config). This message is only shown in development.');
|
|
33
33
|
}
|
|
34
34
|
strapi.plugin('email').provider = createProvider(emailConfig);
|
|
35
35
|
// Add permissions
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"bootstrap.js","sources":["../../server/src/bootstrap.ts"],"sourcesContent":["import type { Core } from '@strapi/types';\nimport type { ProviderCapabilities } from '../../shared/types';\nimport type { EmailConfig, SendOptions } from './types';\n\ninterface EmailProvider {\n send: (options: SendOptions) => Promise<any>;\n verify?: () => Promise<boolean>;\n isIdle?: () => boolean;\n close?: () => void;\n getCapabilities?: () => ProviderCapabilities;\n}\n\ninterface EmailProviderModule {\n init: (\n options: EmailConfig['providerOptions'],\n settings: EmailConfig['settings']\n ) => EmailProvider;\n name?: string;\n provider?: string;\n}\n\nconst createProvider = (emailConfig: EmailConfig) => {\n const providerName = emailConfig.provider.toLowerCase();\n let provider: EmailProviderModule;\n\n let modulePath: string;\n try {\n modulePath = require.resolve(`@strapi/provider-email-${providerName}`);\n } catch (error) {\n if (\n error !== null &&\n typeof error === 'object' &&\n 'code' in error &&\n error.code === 'MODULE_NOT_FOUND'\n ) {\n modulePath = providerName;\n } else {\n throw error;\n }\n }\n\n try {\n provider = require(modulePath);\n } catch (err) {\n const newError = new Error(`Could not load email provider \"${providerName}\".`);\n if (err instanceof Error) {\n newError.stack = err.stack;\n }\n throw newError;\n }\n\n return provider.init(emailConfig.providerOptions, emailConfig.settings);\n};\n\nexport const bootstrap = async ({ strapi }: { strapi: Core.Strapi }) => {\n const emailConfig: EmailConfig = strapi.config.get('plugin::email');\n\n const providerName = emailConfig.provider.toLowerCase();\n const
|
|
1
|
+
{"version":3,"file":"bootstrap.js","sources":["../../server/src/bootstrap.ts"],"sourcesContent":["import type { Core } from '@strapi/types';\nimport type { ProviderCapabilities } from '../../shared/types';\nimport type { EmailConfig, SendOptions } from './types';\n\ninterface EmailProvider {\n send: (options: SendOptions) => Promise<any>;\n verify?: () => Promise<boolean>;\n isIdle?: () => boolean;\n close?: () => void;\n getCapabilities?: () => ProviderCapabilities;\n}\n\ninterface EmailProviderModule {\n init: (\n options: EmailConfig['providerOptions'],\n settings: EmailConfig['settings']\n ) => EmailProvider;\n name?: string;\n provider?: string;\n}\n\nconst createProvider = (emailConfig: EmailConfig) => {\n const providerName = emailConfig.provider.toLowerCase();\n let provider: EmailProviderModule;\n\n let modulePath: string;\n try {\n modulePath = require.resolve(`@strapi/provider-email-${providerName}`);\n } catch (error) {\n if (\n error !== null &&\n typeof error === 'object' &&\n 'code' in error &&\n error.code === 'MODULE_NOT_FOUND'\n ) {\n modulePath = providerName;\n } else {\n throw error;\n }\n }\n\n try {\n provider = require(modulePath);\n } catch (err) {\n const newError = new Error(`Could not load email provider \"${providerName}\".`);\n if (err instanceof Error) {\n newError.stack = err.stack;\n }\n throw newError;\n }\n\n return provider.init(emailConfig.providerOptions, emailConfig.settings);\n};\n\nexport const bootstrap = async ({ strapi }: { strapi: Core.Strapi }) => {\n const emailConfig: EmailConfig = strapi.config.get('plugin::email');\n\n const providerName = emailConfig.provider.toLowerCase();\n const isDevelopment = process.env.NODE_ENV === 'development';\n if (providerName === 'sendmail' && isDevelopment) {\n strapi.log.warn(\n '[email]: The \"sendmail\" email provider is still supported, but for most production setups that use a dedicated SMTP relay, consider switching to @strapi/provider-email-nodemailer (set `provider` to `\"nodemailer\"` in your email plugin config). This message is only shown in development.'\n );\n }\n\n strapi.plugin('email').provider = createProvider(emailConfig);\n\n // Add permissions\n const actions = [\n {\n section: 'settings',\n category: 'email',\n displayName: 'Access the Email Settings page',\n uid: 'settings.read',\n pluginName: 'email',\n },\n ];\n\n await strapi.service('admin::permission').actionProvider.registerMany(actions);\n};\n"],"names":["createProvider","emailConfig","providerName","provider","toLowerCase","modulePath","require","resolve","error","code","err","newError","Error","stack","init","providerOptions","settings","bootstrap","strapi","config","get","isDevelopment","process","env","NODE_ENV","log","warn","plugin","actions","section","category","displayName","uid","pluginName","service","actionProvider","registerMany"],"mappings":";;AAqBA,MAAMA,iBAAiB,CAACC,WAAAA,GAAAA;AACtB,IAAA,MAAMC,YAAAA,GAAeD,WAAAA,CAAYE,QAAQ,CAACC,WAAW,EAAA;IACrD,IAAID,QAAAA;IAEJ,IAAIE,UAAAA;IACJ,IAAI;AACFA,QAAAA,UAAAA,GAAaC,QAAQC,OAAO,CAAC,CAAC,uBAAuB,EAAEL,YAAAA,CAAAA,CAAc,CAAA;AACvE,IAAA,CAAA,CAAE,OAAOM,KAAAA,EAAO;QACd,IACEA,KAAAA,KAAU,IAAA,IACV,OAAOA,KAAAA,KAAU,QAAA,IACjB,UAAUA,KAAAA,IACVA,KAAAA,CAAMC,IAAI,KAAK,kBAAA,EACf;YACAJ,UAAAA,GAAaH,YAAAA;QACf,CAAA,MAAO;YACL,MAAMM,KAAAA;AACR,QAAA;AACF,IAAA;IAEA,IAAI;AACFL,QAAAA,QAAAA,GAAWG,OAAAA,CAAQD,UAAAA,CAAAA;AACrB,IAAA,CAAA,CAAE,OAAOK,GAAAA,EAAK;QACZ,MAAMC,QAAAA,GAAW,IAAIC,KAAAA,CAAM,CAAC,+BAA+B,EAAEV,YAAAA,CAAa,EAAE,CAAC,CAAA;AAC7E,QAAA,IAAIQ,eAAeE,KAAAA,EAAO;YACxBD,QAAAA,CAASE,KAAK,GAAGH,GAAAA,CAAIG,KAAK;AAC5B,QAAA;QACA,MAAMF,QAAAA;AACR,IAAA;AAEA,IAAA,OAAOR,SAASW,IAAI,CAACb,YAAYc,eAAe,EAAEd,YAAYe,QAAQ,CAAA;AACxE,CAAA;AAEO,MAAMC,SAAAA,GAAY,OAAO,EAAEC,MAAM,EAA2B,GAAA;AACjE,IAAA,MAAMjB,WAAAA,GAA2BiB,MAAAA,CAAOC,MAAM,CAACC,GAAG,CAAC,eAAA,CAAA;AAEnD,IAAA,MAAMlB,YAAAA,GAAeD,WAAAA,CAAYE,QAAQ,CAACC,WAAW,EAAA;AACrD,IAAA,MAAMiB,aAAAA,GAAgBC,OAAAA,CAAQC,GAAG,CAACC,QAAQ,KAAK,aAAA;IAC/C,IAAItB,YAAAA,KAAiB,cAAcmB,aAAAA,EAAe;QAChDH,MAAAA,CAAOO,GAAG,CAACC,IAAI,CACb,+RAAA,CAAA;AAEJ,IAAA;AAEAR,IAAAA,MAAAA,CAAOS,MAAM,CAAC,OAAA,CAAA,CAASxB,QAAQ,GAAGH,cAAAA,CAAeC,WAAAA,CAAAA;;AAGjD,IAAA,MAAM2B,OAAAA,GAAU;AACd,QAAA;YACEC,OAAAA,EAAS,UAAA;YACTC,QAAAA,EAAU,OAAA;YACVC,WAAAA,EAAa,gCAAA;YACbC,GAAAA,EAAK,eAAA;YACLC,UAAAA,EAAY;AACd;AACD,KAAA;AAED,IAAA,MAAMf,OAAOgB,OAAO,CAAC,qBAAqBC,cAAc,CAACC,YAAY,CAACR,OAAAA,CAAAA;AACxE;;;;"}
|
|
@@ -25,9 +25,9 @@ const createProvider = (emailConfig)=>{
|
|
|
25
25
|
const bootstrap = async ({ strapi })=>{
|
|
26
26
|
const emailConfig = strapi.config.get('plugin::email');
|
|
27
27
|
const providerName = emailConfig.provider.toLowerCase();
|
|
28
|
-
const
|
|
29
|
-
if (providerName === 'sendmail' &&
|
|
30
|
-
strapi.log.warn('[email]: The "sendmail" email provider is still supported, but for most production setups that use a dedicated SMTP relay, consider switching to @strapi/provider-email-nodemailer (set `provider` to `"nodemailer"` in your email plugin config). This message is only shown in
|
|
28
|
+
const isDevelopment = process.env.NODE_ENV === 'development';
|
|
29
|
+
if (providerName === 'sendmail' && isDevelopment) {
|
|
30
|
+
strapi.log.warn('[email]: The "sendmail" email provider is still supported, but for most production setups that use a dedicated SMTP relay, consider switching to @strapi/provider-email-nodemailer (set `provider` to `"nodemailer"` in your email plugin config). This message is only shown in development.');
|
|
31
31
|
}
|
|
32
32
|
strapi.plugin('email').provider = createProvider(emailConfig);
|
|
33
33
|
// Add permissions
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"bootstrap.mjs","sources":["../../server/src/bootstrap.ts"],"sourcesContent":["import type { Core } from '@strapi/types';\nimport type { ProviderCapabilities } from '../../shared/types';\nimport type { EmailConfig, SendOptions } from './types';\n\ninterface EmailProvider {\n send: (options: SendOptions) => Promise<any>;\n verify?: () => Promise<boolean>;\n isIdle?: () => boolean;\n close?: () => void;\n getCapabilities?: () => ProviderCapabilities;\n}\n\ninterface EmailProviderModule {\n init: (\n options: EmailConfig['providerOptions'],\n settings: EmailConfig['settings']\n ) => EmailProvider;\n name?: string;\n provider?: string;\n}\n\nconst createProvider = (emailConfig: EmailConfig) => {\n const providerName = emailConfig.provider.toLowerCase();\n let provider: EmailProviderModule;\n\n let modulePath: string;\n try {\n modulePath = require.resolve(`@strapi/provider-email-${providerName}`);\n } catch (error) {\n if (\n error !== null &&\n typeof error === 'object' &&\n 'code' in error &&\n error.code === 'MODULE_NOT_FOUND'\n ) {\n modulePath = providerName;\n } else {\n throw error;\n }\n }\n\n try {\n provider = require(modulePath);\n } catch (err) {\n const newError = new Error(`Could not load email provider \"${providerName}\".`);\n if (err instanceof Error) {\n newError.stack = err.stack;\n }\n throw newError;\n }\n\n return provider.init(emailConfig.providerOptions, emailConfig.settings);\n};\n\nexport const bootstrap = async ({ strapi }: { strapi: Core.Strapi }) => {\n const emailConfig: EmailConfig = strapi.config.get('plugin::email');\n\n const providerName = emailConfig.provider.toLowerCase();\n const
|
|
1
|
+
{"version":3,"file":"bootstrap.mjs","sources":["../../server/src/bootstrap.ts"],"sourcesContent":["import type { Core } from '@strapi/types';\nimport type { ProviderCapabilities } from '../../shared/types';\nimport type { EmailConfig, SendOptions } from './types';\n\ninterface EmailProvider {\n send: (options: SendOptions) => Promise<any>;\n verify?: () => Promise<boolean>;\n isIdle?: () => boolean;\n close?: () => void;\n getCapabilities?: () => ProviderCapabilities;\n}\n\ninterface EmailProviderModule {\n init: (\n options: EmailConfig['providerOptions'],\n settings: EmailConfig['settings']\n ) => EmailProvider;\n name?: string;\n provider?: string;\n}\n\nconst createProvider = (emailConfig: EmailConfig) => {\n const providerName = emailConfig.provider.toLowerCase();\n let provider: EmailProviderModule;\n\n let modulePath: string;\n try {\n modulePath = require.resolve(`@strapi/provider-email-${providerName}`);\n } catch (error) {\n if (\n error !== null &&\n typeof error === 'object' &&\n 'code' in error &&\n error.code === 'MODULE_NOT_FOUND'\n ) {\n modulePath = providerName;\n } else {\n throw error;\n }\n }\n\n try {\n provider = require(modulePath);\n } catch (err) {\n const newError = new Error(`Could not load email provider \"${providerName}\".`);\n if (err instanceof Error) {\n newError.stack = err.stack;\n }\n throw newError;\n }\n\n return provider.init(emailConfig.providerOptions, emailConfig.settings);\n};\n\nexport const bootstrap = async ({ strapi }: { strapi: Core.Strapi }) => {\n const emailConfig: EmailConfig = strapi.config.get('plugin::email');\n\n const providerName = emailConfig.provider.toLowerCase();\n const isDevelopment = process.env.NODE_ENV === 'development';\n if (providerName === 'sendmail' && isDevelopment) {\n strapi.log.warn(\n '[email]: The \"sendmail\" email provider is still supported, but for most production setups that use a dedicated SMTP relay, consider switching to @strapi/provider-email-nodemailer (set `provider` to `\"nodemailer\"` in your email plugin config). This message is only shown in development.'\n );\n }\n\n strapi.plugin('email').provider = createProvider(emailConfig);\n\n // Add permissions\n const actions = [\n {\n section: 'settings',\n category: 'email',\n displayName: 'Access the Email Settings page',\n uid: 'settings.read',\n pluginName: 'email',\n },\n ];\n\n await strapi.service('admin::permission').actionProvider.registerMany(actions);\n};\n"],"names":["createProvider","emailConfig","providerName","provider","toLowerCase","modulePath","require","resolve","error","code","err","newError","Error","stack","init","providerOptions","settings","bootstrap","strapi","config","get","isDevelopment","process","env","NODE_ENV","log","warn","plugin","actions","section","category","displayName","uid","pluginName","service","actionProvider","registerMany"],"mappings":"AAqBA,MAAMA,iBAAiB,CAACC,WAAAA,GAAAA;AACtB,IAAA,MAAMC,YAAAA,GAAeD,WAAAA,CAAYE,QAAQ,CAACC,WAAW,EAAA;IACrD,IAAID,QAAAA;IAEJ,IAAIE,UAAAA;IACJ,IAAI;AACFA,QAAAA,UAAAA,GAAaC,QAAQC,OAAO,CAAC,CAAC,uBAAuB,EAAEL,YAAAA,CAAAA,CAAc,CAAA;AACvE,IAAA,CAAA,CAAE,OAAOM,KAAAA,EAAO;QACd,IACEA,KAAAA,KAAU,IAAA,IACV,OAAOA,KAAAA,KAAU,QAAA,IACjB,UAAUA,KAAAA,IACVA,KAAAA,CAAMC,IAAI,KAAK,kBAAA,EACf;YACAJ,UAAAA,GAAaH,YAAAA;QACf,CAAA,MAAO;YACL,MAAMM,KAAAA;AACR,QAAA;AACF,IAAA;IAEA,IAAI;AACFL,QAAAA,QAAAA,GAAWG,OAAAA,CAAQD,UAAAA,CAAAA;AACrB,IAAA,CAAA,CAAE,OAAOK,GAAAA,EAAK;QACZ,MAAMC,QAAAA,GAAW,IAAIC,KAAAA,CAAM,CAAC,+BAA+B,EAAEV,YAAAA,CAAa,EAAE,CAAC,CAAA;AAC7E,QAAA,IAAIQ,eAAeE,KAAAA,EAAO;YACxBD,QAAAA,CAASE,KAAK,GAAGH,GAAAA,CAAIG,KAAK;AAC5B,QAAA;QACA,MAAMF,QAAAA;AACR,IAAA;AAEA,IAAA,OAAOR,SAASW,IAAI,CAACb,YAAYc,eAAe,EAAEd,YAAYe,QAAQ,CAAA;AACxE,CAAA;AAEO,MAAMC,SAAAA,GAAY,OAAO,EAAEC,MAAM,EAA2B,GAAA;AACjE,IAAA,MAAMjB,WAAAA,GAA2BiB,MAAAA,CAAOC,MAAM,CAACC,GAAG,CAAC,eAAA,CAAA;AAEnD,IAAA,MAAMlB,YAAAA,GAAeD,WAAAA,CAAYE,QAAQ,CAACC,WAAW,EAAA;AACrD,IAAA,MAAMiB,aAAAA,GAAgBC,OAAAA,CAAQC,GAAG,CAACC,QAAQ,KAAK,aAAA;IAC/C,IAAItB,YAAAA,KAAiB,cAAcmB,aAAAA,EAAe;QAChDH,MAAAA,CAAOO,GAAG,CAACC,IAAI,CACb,+RAAA,CAAA;AAEJ,IAAA;AAEAR,IAAAA,MAAAA,CAAOS,MAAM,CAAC,OAAA,CAAA,CAASxB,QAAQ,GAAGH,cAAAA,CAAeC,WAAAA,CAAAA;;AAGjD,IAAA,MAAM2B,OAAAA,GAAU;AACd,QAAA;YACEC,OAAAA,EAAS,UAAA;YACTC,QAAAA,EAAU,OAAA;YACVC,WAAAA,EAAa,gCAAA;YACbC,GAAAA,EAAK,eAAA;YACLC,UAAAA,EAAY;AACd;AACD,KAAA;AAED,IAAA,MAAMf,OAAOgB,OAAO,CAAC,qBAAqBC,cAAc,CAACC,YAAY,CAACR,OAAAA,CAAAA;AACxE;;;;"}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
'use strict';
|
|
2
2
|
|
|
3
|
-
var
|
|
3
|
+
var _ = require('lodash');
|
|
4
4
|
var utils = require('@strapi/utils');
|
|
5
5
|
|
|
6
6
|
const { ApplicationError } = utils.errors;
|
|
@@ -59,12 +59,12 @@ const { ApplicationError } = utils.errors;
|
|
|
59
59
|
// Get pool idle status if provider supports it
|
|
60
60
|
const isIdle = typeof provider?.isIdle === 'function' ? provider.isIdle() : undefined;
|
|
61
61
|
ctx.send({
|
|
62
|
-
config:
|
|
62
|
+
config: _.pick(config, [
|
|
63
63
|
'provider',
|
|
64
64
|
'settings.defaultFrom',
|
|
65
65
|
'settings.defaultReplyTo',
|
|
66
66
|
'settings.testAddress'
|
|
67
|
-
]
|
|
67
|
+
]),
|
|
68
68
|
supportsVerify,
|
|
69
69
|
...capabilities ? {
|
|
70
70
|
capabilities
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"email.js","sources":["../../../server/src/controllers/email.ts"],"sourcesContent":["import { pick } from 'lodash
|
|
1
|
+
{"version":3,"file":"email.js","sources":["../../../server/src/controllers/email.ts"],"sourcesContent":["import { pick } from 'lodash';\nimport { errors } from '@strapi/utils';\n\nimport type Koa from 'koa';\nimport type {} from 'koa-body';\nimport type { EmailConfig, SendOptions } from '../types';\n\nconst { ApplicationError } = errors;\n\n/**\n * Email.js controller\n *\n * @description: A set of functions called \"actions\" of the `email` plugin.\n */\nconst emailController = {\n async send(ctx: Koa.Context) {\n const options = ctx.request.body as SendOptions;\n\n try {\n await strapi.plugin('email').service('email').send(options);\n } catch (error) {\n if (error instanceof Error) {\n if ('statusCode' in error && error.statusCode === 400) {\n throw new ApplicationError(error.message);\n } else {\n throw new Error(`Couldn't send email: ${error.message}.`);\n }\n }\n }\n\n // Send 200 `ok`\n ctx.send({});\n },\n\n async test(ctx: Koa.Context) {\n const { to } = ctx.request.body as Pick<SendOptions, 'to'>;\n\n if (!to) {\n throw new ApplicationError('No recipient(s) are given');\n }\n\n const email: SendOptions = {\n to,\n subject: `Strapi test mail to: ${to}`,\n text: `Great! You have correctly configured the Strapi email plugin with the ${strapi.config.get(\n 'plugin::email.provider'\n )} provider. \\r\\nFor documentation on how to use the email plugin checkout: https://docs.strapi.io/developer-docs/latest/plugins/email.html`,\n };\n\n try {\n await strapi.plugin('email').service('email').send(email);\n } catch (error) {\n if (error instanceof Error) {\n if ('statusCode' in error && error.statusCode === 400) {\n throw new ApplicationError(error.message);\n } else {\n throw new Error(`Couldn't send test email: ${error.message}.`);\n }\n }\n }\n\n // Send 200 `ok`\n ctx.send({});\n },\n\n async getSettings(ctx: Koa.Context) {\n const config: EmailConfig = strapi.plugin('email').service('email').getProviderSettings();\n const provider = strapi.plugin('email').provider;\n\n // Check if provider supports verify method\n const supportsVerify = typeof provider?.verify === 'function';\n\n // Get capabilities from provider (e.g. SMTP host, auth type, features)\n const capabilities =\n typeof provider?.getCapabilities === 'function' ? provider.getCapabilities() : undefined;\n\n // Get pool idle status if provider supports it\n const isIdle = typeof provider?.isIdle === 'function' ? provider.isIdle() : undefined;\n\n ctx.send({\n config: pick(config, [\n 'provider',\n 'settings.defaultFrom',\n 'settings.defaultReplyTo',\n 'settings.testAddress',\n ]),\n supportsVerify,\n ...(capabilities ? { capabilities } : {}),\n ...(isIdle !== undefined ? { isIdle } : {}),\n });\n },\n\n async verify(ctx: Koa.Context) {\n const provider = strapi.plugin('email').provider;\n\n if (!provider?.verify || typeof provider.verify !== 'function') {\n throw new ApplicationError('This email provider does not support connection verification');\n }\n\n try {\n await provider.verify();\n ctx.send({ success: true, message: 'SMTP connection verified successfully' });\n } catch (error) {\n if (error instanceof Error) {\n throw new ApplicationError(`Connection verification failed: ${error.message}`);\n }\n throw new ApplicationError('Connection verification failed');\n }\n },\n};\n\nexport default emailController;\n"],"names":["ApplicationError","errors","emailController","send","ctx","options","request","body","strapi","plugin","service","error","Error","statusCode","message","test","to","email","subject","text","config","get","getSettings","getProviderSettings","provider","supportsVerify","verify","capabilities","getCapabilities","undefined","isIdle","pick","success"],"mappings":";;;;;AAOA,MAAM,EAAEA,gBAAgB,EAAE,GAAGC,YAAAA;AAE7B;;;;AAIC,UACKC,eAAAA,GAAkB;AACtB,IAAA,MAAMC,MAAKC,GAAgB,EAAA;AACzB,QAAA,MAAMC,OAAAA,GAAUD,GAAAA,CAAIE,OAAO,CAACC,IAAI;QAEhC,IAAI;YACF,MAAMC,MAAAA,CAAOC,MAAM,CAAC,OAAA,CAAA,CAASC,OAAO,CAAC,OAAA,CAAA,CAASP,IAAI,CAACE,OAAAA,CAAAA;AACrD,QAAA,CAAA,CAAE,OAAOM,KAAAA,EAAO;AACd,YAAA,IAAIA,iBAAiBC,KAAAA,EAAO;AAC1B,gBAAA,IAAI,YAAA,IAAgBD,KAAAA,IAASA,KAAAA,CAAME,UAAU,KAAK,GAAA,EAAK;oBACrD,MAAM,IAAIb,gBAAAA,CAAiBW,KAAAA,CAAMG,OAAO,CAAA;gBAC1C,CAAA,MAAO;oBACL,MAAM,IAAIF,MAAM,CAAC,qBAAqB,EAAED,KAAAA,CAAMG,OAAO,CAAC,CAAC,CAAC,CAAA;AAC1D,gBAAA;AACF,YAAA;AACF,QAAA;;QAGAV,GAAAA,CAAID,IAAI,CAAC,EAAC,CAAA;AACZ,IAAA,CAAA;AAEA,IAAA,MAAMY,MAAKX,GAAgB,EAAA;AACzB,QAAA,MAAM,EAAEY,EAAE,EAAE,GAAGZ,GAAAA,CAAIE,OAAO,CAACC,IAAI;AAE/B,QAAA,IAAI,CAACS,EAAAA,EAAI;AACP,YAAA,MAAM,IAAIhB,gBAAAA,CAAiB,2BAAA,CAAA;AAC7B,QAAA;AAEA,QAAA,MAAMiB,KAAAA,GAAqB;AACzBD,YAAAA,EAAAA;YACAE,OAAAA,EAAS,CAAC,qBAAqB,EAAEF,EAAAA,CAAAA,CAAI;YACrCG,IAAAA,EAAM,CAAC,sEAAsE,EAAEX,MAAAA,CAAOY,MAAM,CAACC,GAAG,CAC9F,wBAAA,CAAA,CACA,yIAAyI;AAC7I,SAAA;QAEA,IAAI;YACF,MAAMb,MAAAA,CAAOC,MAAM,CAAC,OAAA,CAAA,CAASC,OAAO,CAAC,OAAA,CAAA,CAASP,IAAI,CAACc,KAAAA,CAAAA;AACrD,QAAA,CAAA,CAAE,OAAON,KAAAA,EAAO;AACd,YAAA,IAAIA,iBAAiBC,KAAAA,EAAO;AAC1B,gBAAA,IAAI,YAAA,IAAgBD,KAAAA,IAASA,KAAAA,CAAME,UAAU,KAAK,GAAA,EAAK;oBACrD,MAAM,IAAIb,gBAAAA,CAAiBW,KAAAA,CAAMG,OAAO,CAAA;gBAC1C,CAAA,MAAO;oBACL,MAAM,IAAIF,MAAM,CAAC,0BAA0B,EAAED,KAAAA,CAAMG,OAAO,CAAC,CAAC,CAAC,CAAA;AAC/D,gBAAA;AACF,YAAA;AACF,QAAA;;QAGAV,GAAAA,CAAID,IAAI,CAAC,EAAC,CAAA;AACZ,IAAA,CAAA;AAEA,IAAA,MAAMmB,aAAYlB,GAAgB,EAAA;QAChC,MAAMgB,MAAAA,GAAsBZ,OAAOC,MAAM,CAAC,SAASC,OAAO,CAAC,SAASa,mBAAmB,EAAA;AACvF,QAAA,MAAMC,QAAAA,GAAWhB,MAAAA,CAAOC,MAAM,CAAC,SAASe,QAAQ;;QAGhD,MAAMC,cAAAA,GAAiB,OAAOD,QAAAA,EAAUE,MAAAA,KAAW,UAAA;;AAGnD,QAAA,MAAMC,eACJ,OAAOH,QAAAA,EAAUI,oBAAoB,UAAA,GAAaJ,QAAAA,CAASI,eAAe,EAAA,GAAKC,SAAAA;;AAGjF,QAAA,MAAMC,SAAS,OAAON,QAAAA,EAAUM,WAAW,UAAA,GAAaN,QAAAA,CAASM,MAAM,EAAA,GAAKD,SAAAA;AAE5EzB,QAAAA,GAAAA,CAAID,IAAI,CAAC;AACPiB,YAAAA,MAAAA,EAAQW,OAAKX,MAAAA,EAAQ;AACnB,gBAAA,UAAA;AACA,gBAAA,sBAAA;AACA,gBAAA,yBAAA;AACA,gBAAA;AACD,aAAA,CAAA;AACDK,YAAAA,cAAAA;AACA,YAAA,GAAIE,YAAAA,GAAe;AAAEA,gBAAAA;AAAa,aAAA,GAAI,EAAE;AACxC,YAAA,GAAIG,WAAWD,SAAAA,GAAY;AAAEC,gBAAAA;AAAO,aAAA,GAAI;AAC1C,SAAA,CAAA;AACF,IAAA,CAAA;AAEA,IAAA,MAAMJ,QAAOtB,GAAgB,EAAA;AAC3B,QAAA,MAAMoB,QAAAA,GAAWhB,MAAAA,CAAOC,MAAM,CAAC,SAASe,QAAQ;AAEhD,QAAA,IAAI,CAACA,QAAAA,EAAUE,MAAAA,IAAU,OAAOF,QAAAA,CAASE,MAAM,KAAK,UAAA,EAAY;AAC9D,YAAA,MAAM,IAAI1B,gBAAAA,CAAiB,8DAAA,CAAA;AAC7B,QAAA;QAEA,IAAI;AACF,YAAA,MAAMwB,SAASE,MAAM,EAAA;AACrBtB,YAAAA,GAAAA,CAAID,IAAI,CAAC;gBAAE6B,OAAAA,EAAS,IAAA;gBAAMlB,OAAAA,EAAS;AAAwC,aAAA,CAAA;AAC7E,QAAA,CAAA,CAAE,OAAOH,KAAAA,EAAO;AACd,YAAA,IAAIA,iBAAiBC,KAAAA,EAAO;AAC1B,gBAAA,MAAM,IAAIZ,gBAAAA,CAAiB,CAAC,gCAAgC,EAAEW,KAAAA,CAAMG,OAAO,CAAA,CAAE,CAAA;AAC/E,YAAA;AACA,YAAA,MAAM,IAAId,gBAAAA,CAAiB,gCAAA,CAAA;AAC7B,QAAA;AACF,IAAA;AACF;;;;"}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { pick } from 'lodash
|
|
1
|
+
import { pick } from 'lodash';
|
|
2
2
|
import { errors } from '@strapi/utils';
|
|
3
3
|
|
|
4
4
|
const { ApplicationError } = errors;
|
|
@@ -57,12 +57,12 @@ const { ApplicationError } = errors;
|
|
|
57
57
|
// Get pool idle status if provider supports it
|
|
58
58
|
const isIdle = typeof provider?.isIdle === 'function' ? provider.isIdle() : undefined;
|
|
59
59
|
ctx.send({
|
|
60
|
-
config: pick([
|
|
60
|
+
config: pick(config, [
|
|
61
61
|
'provider',
|
|
62
62
|
'settings.defaultFrom',
|
|
63
63
|
'settings.defaultReplyTo',
|
|
64
64
|
'settings.testAddress'
|
|
65
|
-
]
|
|
65
|
+
]),
|
|
66
66
|
supportsVerify,
|
|
67
67
|
...capabilities ? {
|
|
68
68
|
capabilities
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"email.mjs","sources":["../../../server/src/controllers/email.ts"],"sourcesContent":["import { pick } from 'lodash
|
|
1
|
+
{"version":3,"file":"email.mjs","sources":["../../../server/src/controllers/email.ts"],"sourcesContent":["import { pick } from 'lodash';\nimport { errors } from '@strapi/utils';\n\nimport type Koa from 'koa';\nimport type {} from 'koa-body';\nimport type { EmailConfig, SendOptions } from '../types';\n\nconst { ApplicationError } = errors;\n\n/**\n * Email.js controller\n *\n * @description: A set of functions called \"actions\" of the `email` plugin.\n */\nconst emailController = {\n async send(ctx: Koa.Context) {\n const options = ctx.request.body as SendOptions;\n\n try {\n await strapi.plugin('email').service('email').send(options);\n } catch (error) {\n if (error instanceof Error) {\n if ('statusCode' in error && error.statusCode === 400) {\n throw new ApplicationError(error.message);\n } else {\n throw new Error(`Couldn't send email: ${error.message}.`);\n }\n }\n }\n\n // Send 200 `ok`\n ctx.send({});\n },\n\n async test(ctx: Koa.Context) {\n const { to } = ctx.request.body as Pick<SendOptions, 'to'>;\n\n if (!to) {\n throw new ApplicationError('No recipient(s) are given');\n }\n\n const email: SendOptions = {\n to,\n subject: `Strapi test mail to: ${to}`,\n text: `Great! You have correctly configured the Strapi email plugin with the ${strapi.config.get(\n 'plugin::email.provider'\n )} provider. \\r\\nFor documentation on how to use the email plugin checkout: https://docs.strapi.io/developer-docs/latest/plugins/email.html`,\n };\n\n try {\n await strapi.plugin('email').service('email').send(email);\n } catch (error) {\n if (error instanceof Error) {\n if ('statusCode' in error && error.statusCode === 400) {\n throw new ApplicationError(error.message);\n } else {\n throw new Error(`Couldn't send test email: ${error.message}.`);\n }\n }\n }\n\n // Send 200 `ok`\n ctx.send({});\n },\n\n async getSettings(ctx: Koa.Context) {\n const config: EmailConfig = strapi.plugin('email').service('email').getProviderSettings();\n const provider = strapi.plugin('email').provider;\n\n // Check if provider supports verify method\n const supportsVerify = typeof provider?.verify === 'function';\n\n // Get capabilities from provider (e.g. SMTP host, auth type, features)\n const capabilities =\n typeof provider?.getCapabilities === 'function' ? provider.getCapabilities() : undefined;\n\n // Get pool idle status if provider supports it\n const isIdle = typeof provider?.isIdle === 'function' ? provider.isIdle() : undefined;\n\n ctx.send({\n config: pick(config, [\n 'provider',\n 'settings.defaultFrom',\n 'settings.defaultReplyTo',\n 'settings.testAddress',\n ]),\n supportsVerify,\n ...(capabilities ? { capabilities } : {}),\n ...(isIdle !== undefined ? { isIdle } : {}),\n });\n },\n\n async verify(ctx: Koa.Context) {\n const provider = strapi.plugin('email').provider;\n\n if (!provider?.verify || typeof provider.verify !== 'function') {\n throw new ApplicationError('This email provider does not support connection verification');\n }\n\n try {\n await provider.verify();\n ctx.send({ success: true, message: 'SMTP connection verified successfully' });\n } catch (error) {\n if (error instanceof Error) {\n throw new ApplicationError(`Connection verification failed: ${error.message}`);\n }\n throw new ApplicationError('Connection verification failed');\n }\n },\n};\n\nexport default emailController;\n"],"names":["ApplicationError","errors","emailController","send","ctx","options","request","body","strapi","plugin","service","error","Error","statusCode","message","test","to","email","subject","text","config","get","getSettings","getProviderSettings","provider","supportsVerify","verify","capabilities","getCapabilities","undefined","isIdle","pick","success"],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sources":["../../../server/src/controllers/index.ts"],"sourcesContent":["import email from './email';\n\nexport const controllers = { email };\n"],"names":["controllers","email"],"mappings":";;;;
|
|
1
|
+
{"version":3,"file":"index.js","sources":["../../../server/src/controllers/index.ts"],"sourcesContent":["import type { Controllers } from '../types/controllers';\n\nimport email from './email';\n\nexport const controllers = { email } satisfies Controllers;\n"],"names":["controllers","email"],"mappings":";;;;MAIaA,WAAAA,GAAc;AAAEC,IAAAA;AAAM;;;;"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.mjs","sources":["../../../server/src/controllers/index.ts"],"sourcesContent":["import email from './email';\n\nexport const controllers = { email };\n"],"names":["controllers","email"],"mappings":";;
|
|
1
|
+
{"version":3,"file":"index.mjs","sources":["../../../server/src/controllers/index.ts"],"sourcesContent":["import type { Controllers } from '../types/controllers';\n\nimport email from './email';\n\nexport const controllers = { email } satisfies Controllers;\n"],"names":["controllers","email"],"mappings":";;MAIaA,WAAAA,GAAc;AAAEC,WAAAA;AAAM;;;;"}
|
package/dist/server/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sources":["../../server/src/index.ts"],"sourcesContent":["import { bootstrap } from './bootstrap';\nimport { services } from './services';\nimport { routes } from './routes';\nimport { controllers } from './controllers';\nimport { config } from './config';\nimport middlewares from './middlewares';\n\nexport default {\n bootstrap,\n services,\n routes,\n controllers,\n config,\n middlewares,\n};\n"],"names":["bootstrap","services","routes","controllers","config","middlewares"],"mappings":";;;;;;;;;
|
|
1
|
+
{"version":3,"file":"index.js","sources":["../../server/src/index.ts"],"sourcesContent":["import { bootstrap } from './bootstrap';\nimport { services } from './services';\nimport { routes } from './routes';\nimport { controllers } from './controllers';\nimport { config } from './config';\nimport middlewares from './middlewares';\n\nexport type * from './types';\nexport type * from './types/services';\nexport type * from './types/controllers';\n\nexport default {\n bootstrap,\n services,\n routes,\n controllers,\n config,\n middlewares,\n};\n"],"names":["bootstrap","services","routes","controllers","config","middlewares"],"mappings":";;;;;;;;;AAWA,YAAe;AACbA,eAAAA,mBAAAA;AACAC,cAAAA,gBAAAA;AACAC,YAAAA,cAAAA;AACAC,iBAAAA,mBAAAA;AACAC,YAAAA,aAAAA;AACAC,iBAAAA;AACF,CAAA;;;;"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.mjs","sources":["../../server/src/index.ts"],"sourcesContent":["import { bootstrap } from './bootstrap';\nimport { services } from './services';\nimport { routes } from './routes';\nimport { controllers } from './controllers';\nimport { config } from './config';\nimport middlewares from './middlewares';\n\nexport default {\n bootstrap,\n services,\n routes,\n controllers,\n config,\n middlewares,\n};\n"],"names":["bootstrap","services","routes","controllers","config","middlewares"],"mappings":";;;;;;;
|
|
1
|
+
{"version":3,"file":"index.mjs","sources":["../../server/src/index.ts"],"sourcesContent":["import { bootstrap } from './bootstrap';\nimport { services } from './services';\nimport { routes } from './routes';\nimport { controllers } from './controllers';\nimport { config } from './config';\nimport middlewares from './middlewares';\n\nexport type * from './types';\nexport type * from './types/services';\nexport type * from './types/controllers';\n\nexport default {\n bootstrap,\n services,\n routes,\n controllers,\n config,\n middlewares,\n};\n"],"names":["bootstrap","services","routes","controllers","config","middlewares"],"mappings":";;;;;;;AAWA,YAAe;AACbA,IAAAA,SAAAA;AACAC,IAAAA,QAAAA;AACAC,IAAAA,MAAAA;AACAC,IAAAA,WAAAA;AACAC,IAAAA,MAAAA;AACAC,IAAAA;AACF,CAAA;;;;"}
|
|
@@ -1,25 +1,23 @@
|
|
|
1
1
|
'use strict';
|
|
2
2
|
|
|
3
3
|
var utils = require('@strapi/utils');
|
|
4
|
-
var
|
|
4
|
+
var _ = require('lodash');
|
|
5
5
|
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
const { RateLimitError } = utils__default.default.errors;
|
|
6
|
+
const { RateLimitError } = utils.errors;
|
|
7
|
+
// `config` stays `any` in the published type, as on develop; the registered
|
|
8
|
+
// `plugin::email.rateLimit` middleware contract types it as `RateLimitOptions | undefined`.
|
|
11
9
|
var rateLimit = ((config, { strapi })=>async (ctx, next)=>{
|
|
12
10
|
const pluginConfig = strapi.config.get('plugin::email');
|
|
13
11
|
const rateLimitConfig = {
|
|
14
12
|
enabled: true,
|
|
15
|
-
...pluginConfig.ratelimit
|
|
13
|
+
...pluginConfig.ratelimit
|
|
16
14
|
};
|
|
17
15
|
if (rateLimitConfig.enabled === true) {
|
|
18
16
|
// TODO: TS - Do the dynamic import
|
|
19
17
|
// eslint-disable-next-line @typescript-eslint/no-var-requires
|
|
20
18
|
const rateLimit = require('koa2-ratelimit').RateLimit;
|
|
21
|
-
const requestEmail =
|
|
22
|
-
const userEmail =
|
|
19
|
+
const requestEmail = _.get(ctx, 'request.body.email');
|
|
20
|
+
const userEmail = _.isString(requestEmail) ? requestEmail.toLowerCase() : 'unknownEmail';
|
|
23
21
|
const loadConfig = {
|
|
24
22
|
interval: {
|
|
25
23
|
min: 5
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"rateLimit.js","sources":["../../../server/src/middlewares/rateLimit.ts"],"sourcesContent":["import type { Context, Next } from 'koa';\nimport
|
|
1
|
+
{"version":3,"file":"rateLimit.js","sources":["../../../server/src/middlewares/rateLimit.ts"],"sourcesContent":["import type { Context, Next } from 'koa';\nimport { errors } from '@strapi/utils';\nimport { get, isString } from 'lodash';\nimport type { Core } from '@strapi/types';\n\nconst { RateLimitError } = errors;\n\n// `config` stays `any` in the published type, as on develop; the registered\n// `plugin::email.rateLimit` middleware contract types it as `RateLimitOptions | undefined`.\nexport default (config: any, { strapi }: { strapi: Core.Strapi }) =>\n async (ctx: Context, next: Next) => {\n const pluginConfig = strapi.config.get('plugin::email') as any;\n const rateLimitConfig = {\n enabled: true,\n ...pluginConfig.ratelimit,\n };\n\n if (rateLimitConfig.enabled === true) {\n // TODO: TS - Do the dynamic import\n // eslint-disable-next-line @typescript-eslint/no-var-requires\n const rateLimit = require('koa2-ratelimit').RateLimit;\n\n const requestEmail = get(ctx, 'request.body.email');\n const userEmail = isString(requestEmail) ? requestEmail.toLowerCase() : 'unknownEmail';\n\n const loadConfig = {\n interval: { min: 5 },\n max: 5,\n prefixKey: `${userEmail}`,\n handler() {\n throw new RateLimitError();\n },\n ...rateLimitConfig,\n ...config,\n };\n\n return rateLimit.middleware(loadConfig)(ctx, next);\n }\n\n return next();\n };\n"],"names":["RateLimitError","errors","config","strapi","ctx","next","pluginConfig","get","rateLimitConfig","enabled","ratelimit","rateLimit","require","RateLimit","requestEmail","userEmail","isString","toLowerCase","loadConfig","interval","min","max","prefixKey","handler","middleware"],"mappings":";;;;;AAKA,MAAM,EAAEA,cAAc,EAAE,GAAGC,YAAAA;AAE3B;AACA;AACA,gBAAe,CAAA,CAACC,MAAAA,EAAa,EAAEC,MAAM,EAA2B,GAC9D,OAAOC,GAAAA,EAAcC,IAAAA,GAAAA;AACnB,QAAA,MAAMC,YAAAA,GAAeH,MAAAA,CAAOD,MAAM,CAACK,GAAG,CAAC,eAAA,CAAA;AACvC,QAAA,MAAMC,eAAAA,GAAkB;YACtBC,OAAAA,EAAS,IAAA;AACT,YAAA,GAAGH,aAAaI;AAClB,SAAA;QAEA,IAAIF,eAAAA,CAAgBC,OAAO,KAAK,IAAA,EAAM;;;YAGpC,MAAME,SAAAA,GAAYC,OAAAA,CAAQ,gBAAA,CAAA,CAAkBC,SAAS;YAErD,MAAMC,YAAAA,GAAeP,MAAIH,GAAAA,EAAK,oBAAA,CAAA;AAC9B,YAAA,MAAMW,SAAAA,GAAYC,UAAAA,CAASF,YAAAA,CAAAA,GAAgBA,YAAAA,CAAaG,WAAW,EAAA,GAAK,cAAA;AAExE,YAAA,MAAMC,UAAAA,GAAa;gBACjBC,QAAAA,EAAU;oBAAEC,GAAAA,EAAK;AAAE,iBAAA;gBACnBC,GAAAA,EAAK,CAAA;AACLC,gBAAAA,SAAAA,EAAW,GAAGP,SAAAA,CAAAA,CAAW;AACzBQ,gBAAAA,OAAAA,CAAAA,GAAAA;AACE,oBAAA,MAAM,IAAIvB,cAAAA,EAAAA;AACZ,gBAAA,CAAA;AACA,gBAAA,GAAGQ,eAAe;AAClB,gBAAA,GAAGN;AACL,aAAA;AAEA,YAAA,OAAOS,SAAAA,CAAUa,UAAU,CAACN,UAAAA,CAAAA,CAAYd,GAAAA,EAAKC,IAAAA,CAAAA;AAC/C,QAAA;QAEA,OAAOA,IAAAA,EAAAA;AACT,IAAA,CAAA;;;;"}
|
|
@@ -1,18 +1,20 @@
|
|
|
1
|
-
import
|
|
2
|
-
import { get, isString } from 'lodash
|
|
1
|
+
import { errors } from '@strapi/utils';
|
|
2
|
+
import { get, isString } from 'lodash';
|
|
3
3
|
|
|
4
|
-
const { RateLimitError } =
|
|
4
|
+
const { RateLimitError } = errors;
|
|
5
|
+
// `config` stays `any` in the published type, as on develop; the registered
|
|
6
|
+
// `plugin::email.rateLimit` middleware contract types it as `RateLimitOptions | undefined`.
|
|
5
7
|
var rateLimit = ((config, { strapi })=>async (ctx, next)=>{
|
|
6
8
|
const pluginConfig = strapi.config.get('plugin::email');
|
|
7
9
|
const rateLimitConfig = {
|
|
8
10
|
enabled: true,
|
|
9
|
-
...pluginConfig.ratelimit
|
|
11
|
+
...pluginConfig.ratelimit
|
|
10
12
|
};
|
|
11
13
|
if (rateLimitConfig.enabled === true) {
|
|
12
14
|
// TODO: TS - Do the dynamic import
|
|
13
15
|
// eslint-disable-next-line @typescript-eslint/no-var-requires
|
|
14
16
|
const rateLimit = require('koa2-ratelimit').RateLimit;
|
|
15
|
-
const requestEmail = get('request.body.email')
|
|
17
|
+
const requestEmail = get(ctx, 'request.body.email');
|
|
16
18
|
const userEmail = isString(requestEmail) ? requestEmail.toLowerCase() : 'unknownEmail';
|
|
17
19
|
const loadConfig = {
|
|
18
20
|
interval: {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"rateLimit.mjs","sources":["../../../server/src/middlewares/rateLimit.ts"],"sourcesContent":["import type { Context, Next } from 'koa';\nimport
|
|
1
|
+
{"version":3,"file":"rateLimit.mjs","sources":["../../../server/src/middlewares/rateLimit.ts"],"sourcesContent":["import type { Context, Next } from 'koa';\nimport { errors } from '@strapi/utils';\nimport { get, isString } from 'lodash';\nimport type { Core } from '@strapi/types';\n\nconst { RateLimitError } = errors;\n\n// `config` stays `any` in the published type, as on develop; the registered\n// `plugin::email.rateLimit` middleware contract types it as `RateLimitOptions | undefined`.\nexport default (config: any, { strapi }: { strapi: Core.Strapi }) =>\n async (ctx: Context, next: Next) => {\n const pluginConfig = strapi.config.get('plugin::email') as any;\n const rateLimitConfig = {\n enabled: true,\n ...pluginConfig.ratelimit,\n };\n\n if (rateLimitConfig.enabled === true) {\n // TODO: TS - Do the dynamic import\n // eslint-disable-next-line @typescript-eslint/no-var-requires\n const rateLimit = require('koa2-ratelimit').RateLimit;\n\n const requestEmail = get(ctx, 'request.body.email');\n const userEmail = isString(requestEmail) ? requestEmail.toLowerCase() : 'unknownEmail';\n\n const loadConfig = {\n interval: { min: 5 },\n max: 5,\n prefixKey: `${userEmail}`,\n handler() {\n throw new RateLimitError();\n },\n ...rateLimitConfig,\n ...config,\n };\n\n return rateLimit.middleware(loadConfig)(ctx, next);\n }\n\n return next();\n };\n"],"names":["RateLimitError","errors","config","strapi","ctx","next","pluginConfig","get","rateLimitConfig","enabled","ratelimit","rateLimit","require","RateLimit","requestEmail","userEmail","isString","toLowerCase","loadConfig","interval","min","max","prefixKey","handler","middleware"],"mappings":";;;AAKA,MAAM,EAAEA,cAAc,EAAE,GAAGC,MAAAA;AAE3B;AACA;AACA,gBAAe,CAAA,CAACC,MAAAA,EAAa,EAAEC,MAAM,EAA2B,GAC9D,OAAOC,GAAAA,EAAcC,IAAAA,GAAAA;AACnB,QAAA,MAAMC,YAAAA,GAAeH,MAAAA,CAAOD,MAAM,CAACK,GAAG,CAAC,eAAA,CAAA;AACvC,QAAA,MAAMC,eAAAA,GAAkB;YACtBC,OAAAA,EAAS,IAAA;AACT,YAAA,GAAGH,aAAaI;AAClB,SAAA;QAEA,IAAIF,eAAAA,CAAgBC,OAAO,KAAK,IAAA,EAAM;;;YAGpC,MAAME,SAAAA,GAAYC,OAAAA,CAAQ,gBAAA,CAAA,CAAkBC,SAAS;YAErD,MAAMC,YAAAA,GAAeP,IAAIH,GAAAA,EAAK,oBAAA,CAAA;AAC9B,YAAA,MAAMW,SAAAA,GAAYC,QAAAA,CAASF,YAAAA,CAAAA,GAAgBA,YAAAA,CAAaG,WAAW,EAAA,GAAK,cAAA;AAExE,YAAA,MAAMC,UAAAA,GAAa;gBACjBC,QAAAA,EAAU;oBAAEC,GAAAA,EAAK;AAAE,iBAAA;gBACnBC,GAAAA,EAAK,CAAA;AACLC,gBAAAA,SAAAA,EAAW,GAAGP,SAAAA,CAAAA,CAAW;AACzBQ,gBAAAA,OAAAA,CAAAA,GAAAA;AACE,oBAAA,MAAM,IAAIvB,cAAAA,EAAAA;AACZ,gBAAA,CAAA;AACA,gBAAA,GAAGQ,eAAe;AAClB,gBAAA,GAAGN;AACL,aAAA;AAEA,YAAA,OAAOS,SAAAA,CAAUa,UAAU,CAACN,UAAAA,CAAAA,CAAYd,GAAAA,EAAKC,IAAAA,CAAAA;AAC/C,QAAA;QAEA,OAAOA,IAAAA,EAAAA;AACT,IAAA,CAAA;;;;"}
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
'use strict';
|
|
2
2
|
|
|
3
|
-
|
|
3
|
+
// The published type stays the widened one develop infers; `satisfies` checks the literals.
|
|
4
|
+
const routes = {
|
|
4
5
|
type: 'admin',
|
|
5
6
|
routes: [
|
|
6
7
|
{
|
|
@@ -70,5 +71,5 @@ var admin = {
|
|
|
70
71
|
]
|
|
71
72
|
};
|
|
72
73
|
|
|
73
|
-
module.exports =
|
|
74
|
+
module.exports = routes;
|
|
74
75
|
//# sourceMappingURL=admin.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"admin.js","sources":["../../../server/src/routes/admin.ts"],"sourcesContent":["
|
|
1
|
+
{"version":3,"file":"admin.js","sources":["../../../server/src/routes/admin.ts"],"sourcesContent":["import type { Core } from '@strapi/types';\nimport type { Controllers } from '../types/controllers';\n\n// The published type stays the widened one develop infers; `satisfies` checks the literals.\nconst routes: {\n type: string;\n routes: {\n method: string;\n path: string;\n handler: string;\n config: {\n policies: (string | { name: string; config: { actions: string[] } })[];\n };\n }[];\n} = {\n type: 'admin',\n routes: [\n {\n method: 'POST',\n path: '/',\n handler: 'email.send',\n config: {\n policies: ['admin::isAuthenticatedAdmin'],\n },\n },\n {\n method: 'POST',\n path: '/test',\n handler: 'email.test',\n config: {\n policies: [\n 'admin::isAuthenticatedAdmin',\n { name: 'admin::hasPermissions', config: { actions: ['plugin::email.settings.read'] } },\n ],\n },\n },\n {\n method: 'GET',\n path: '/settings',\n handler: 'email.getSettings',\n config: {\n policies: [\n 'admin::isAuthenticatedAdmin',\n { name: 'admin::hasPermissions', config: { actions: ['plugin::email.settings.read'] } },\n ],\n },\n },\n {\n method: 'POST',\n path: '/verify',\n handler: 'email.verify',\n config: {\n policies: [\n 'admin::isAuthenticatedAdmin',\n { name: 'admin::hasPermissions', config: { actions: ['plugin::email.settings.read'] } },\n ],\n },\n },\n ],\n} satisfies Core.RouterInputFor<Controllers, 'plugin::email'>;\n\nexport default routes;\n"],"names":["routes","type","method","path","handler","config","policies","name","actions"],"mappings":";;AAGA;AACA,MAAMA,MAAAA,GAUF;IACFC,IAAAA,EAAM,OAAA;IACND,MAAAA,EAAQ;AACN,QAAA;YACEE,MAAAA,EAAQ,MAAA;YACRC,IAAAA,EAAM,GAAA;YACNC,OAAAA,EAAS,YAAA;YACTC,MAAAA,EAAQ;gBACNC,QAAAA,EAAU;AAAC,oBAAA;AAA8B;AAC3C;AACF,SAAA;AACA,QAAA;YACEJ,MAAAA,EAAQ,MAAA;YACRC,IAAAA,EAAM,OAAA;YACNC,OAAAA,EAAS,YAAA;YACTC,MAAAA,EAAQ;gBACNC,QAAAA,EAAU;AACR,oBAAA,6BAAA;AACA,oBAAA;wBAAEC,IAAAA,EAAM,uBAAA;wBAAyBF,MAAAA,EAAQ;4BAAEG,OAAAA,EAAS;AAAC,gCAAA;AAA8B;AAAC;AAAE;AACvF;AACH;AACF,SAAA;AACA,QAAA;YACEN,MAAAA,EAAQ,KAAA;YACRC,IAAAA,EAAM,WAAA;YACNC,OAAAA,EAAS,mBAAA;YACTC,MAAAA,EAAQ;gBACNC,QAAAA,EAAU;AACR,oBAAA,6BAAA;AACA,oBAAA;wBAAEC,IAAAA,EAAM,uBAAA;wBAAyBF,MAAAA,EAAQ;4BAAEG,OAAAA,EAAS;AAAC,gCAAA;AAA8B;AAAC;AAAE;AACvF;AACH;AACF,SAAA;AACA,QAAA;YACEN,MAAAA,EAAQ,MAAA;YACRC,IAAAA,EAAM,SAAA;YACNC,OAAAA,EAAS,cAAA;YACTC,MAAAA,EAAQ;gBACNC,QAAAA,EAAU;AACR,oBAAA,6BAAA;AACA,oBAAA;wBAAEC,IAAAA,EAAM,uBAAA;wBAAyBF,MAAAA,EAAQ;4BAAEG,OAAAA,EAAS;AAAC,gCAAA;AAA8B;AAAC;AAAE;AACvF;AACH;AACF;AACD;AACH;;;;"}
|
|
@@ -1,4 +1,5 @@
|
|
|
1
|
-
|
|
1
|
+
// The published type stays the widened one develop infers; `satisfies` checks the literals.
|
|
2
|
+
const routes = {
|
|
2
3
|
type: 'admin',
|
|
3
4
|
routes: [
|
|
4
5
|
{
|
|
@@ -68,5 +69,5 @@ var admin = {
|
|
|
68
69
|
]
|
|
69
70
|
};
|
|
70
71
|
|
|
71
|
-
export {
|
|
72
|
+
export { routes as default };
|
|
72
73
|
//# sourceMappingURL=admin.mjs.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"admin.mjs","sources":["../../../server/src/routes/admin.ts"],"sourcesContent":["
|
|
1
|
+
{"version":3,"file":"admin.mjs","sources":["../../../server/src/routes/admin.ts"],"sourcesContent":["import type { Core } from '@strapi/types';\nimport type { Controllers } from '../types/controllers';\n\n// The published type stays the widened one develop infers; `satisfies` checks the literals.\nconst routes: {\n type: string;\n routes: {\n method: string;\n path: string;\n handler: string;\n config: {\n policies: (string | { name: string; config: { actions: string[] } })[];\n };\n }[];\n} = {\n type: 'admin',\n routes: [\n {\n method: 'POST',\n path: '/',\n handler: 'email.send',\n config: {\n policies: ['admin::isAuthenticatedAdmin'],\n },\n },\n {\n method: 'POST',\n path: '/test',\n handler: 'email.test',\n config: {\n policies: [\n 'admin::isAuthenticatedAdmin',\n { name: 'admin::hasPermissions', config: { actions: ['plugin::email.settings.read'] } },\n ],\n },\n },\n {\n method: 'GET',\n path: '/settings',\n handler: 'email.getSettings',\n config: {\n policies: [\n 'admin::isAuthenticatedAdmin',\n { name: 'admin::hasPermissions', config: { actions: ['plugin::email.settings.read'] } },\n ],\n },\n },\n {\n method: 'POST',\n path: '/verify',\n handler: 'email.verify',\n config: {\n policies: [\n 'admin::isAuthenticatedAdmin',\n { name: 'admin::hasPermissions', config: { actions: ['plugin::email.settings.read'] } },\n ],\n },\n },\n ],\n} satisfies Core.RouterInputFor<Controllers, 'plugin::email'>;\n\nexport default routes;\n"],"names":["routes","type","method","path","handler","config","policies","name","actions"],"mappings":"AAGA;AACA,MAAMA,MAAAA,GAUF;IACFC,IAAAA,EAAM,OAAA;IACND,MAAAA,EAAQ;AACN,QAAA;YACEE,MAAAA,EAAQ,MAAA;YACRC,IAAAA,EAAM,GAAA;YACNC,OAAAA,EAAS,YAAA;YACTC,MAAAA,EAAQ;gBACNC,QAAAA,EAAU;AAAC,oBAAA;AAA8B;AAC3C;AACF,SAAA;AACA,QAAA;YACEJ,MAAAA,EAAQ,MAAA;YACRC,IAAAA,EAAM,OAAA;YACNC,OAAAA,EAAS,YAAA;YACTC,MAAAA,EAAQ;gBACNC,QAAAA,EAAU;AACR,oBAAA,6BAAA;AACA,oBAAA;wBAAEC,IAAAA,EAAM,uBAAA;wBAAyBF,MAAAA,EAAQ;4BAAEG,OAAAA,EAAS;AAAC,gCAAA;AAA8B;AAAC;AAAE;AACvF;AACH;AACF,SAAA;AACA,QAAA;YACEN,MAAAA,EAAQ,KAAA;YACRC,IAAAA,EAAM,WAAA;YACNC,OAAAA,EAAS,mBAAA;YACTC,MAAAA,EAAQ;gBACNC,QAAAA,EAAU;AACR,oBAAA,6BAAA;AACA,oBAAA;wBAAEC,IAAAA,EAAM,uBAAA;wBAAyBF,MAAAA,EAAQ;4BAAEG,OAAAA,EAAS;AAAC,gCAAA;AAA8B;AAAC;AAAE;AACvF;AACH;AACF,SAAA;AACA,QAAA;YACEN,MAAAA,EAAQ,MAAA;YACRC,IAAAA,EAAM,SAAA;YACNC,OAAAA,EAAS,cAAA;YACTC,MAAAA,EAAQ;gBACNC,QAAAA,EAAU;AACR,oBAAA,6BAAA;AACA,oBAAA;wBAAEC,IAAAA,EAAM,uBAAA;wBAAyBF,MAAAA,EAAQ;4BAAEG,OAAAA,EAAS;AAAC,gCAAA;AAA8B;AAAC;AAAE;AACvF;AACH;AACF;AACD;AACH;;;;"}
|
|
@@ -3,6 +3,7 @@
|
|
|
3
3
|
var utils = require('@strapi/utils');
|
|
4
4
|
var email = require('./validation/email.js');
|
|
5
5
|
|
|
6
|
+
// The published type stays develop's `Core.RouterInput['routes']`; `satisfies` checks the literals.
|
|
6
7
|
const createRoutes = utils.createContentApiRoutesFactory(()=>{
|
|
7
8
|
const validator = new email.EmailRouteValidator(strapi);
|
|
8
9
|
return [
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"content-api.js","sources":["../../../server/src/routes/content-api.ts"],"sourcesContent":["import type { Core } from '@strapi/types';\nimport { createContentApiRoutesFactory } from '@strapi/utils';\nimport { EmailRouteValidator } from './validation';\n\nconst createRoutes = createContentApiRoutesFactory((): Core.RouterInput['routes'] => {\n const validator = new EmailRouteValidator(strapi);\n\n return [\n {\n method: 'POST',\n path: '/',\n handler: 'email.send',\n request: {\n body: { 'application/json': validator.sendEmailInput },\n },\n response: validator.emailResponse,\n },\n ];\n});\n\nexport default createRoutes;\n"],"names":["createRoutes","createContentApiRoutesFactory","validator","EmailRouteValidator","strapi","method","path","handler","request","body","sendEmailInput","response","emailResponse"],"mappings":";;;;;
|
|
1
|
+
{"version":3,"file":"content-api.js","sources":["../../../server/src/routes/content-api.ts"],"sourcesContent":["import type { Core } from '@strapi/types';\nimport { createContentApiRoutesFactory } from '@strapi/utils';\nimport type { Controllers } from '../types/controllers';\nimport { EmailRouteValidator } from './validation';\n\n// The published type stays develop's `Core.RouterInput['routes']`; `satisfies` checks the literals.\nconst createRoutes = createContentApiRoutesFactory((): Core.RouterInput['routes'] => {\n const validator = new EmailRouteValidator(strapi);\n\n return [\n {\n method: 'POST',\n path: '/',\n handler: 'email.send',\n request: {\n body: { 'application/json': validator.sendEmailInput },\n },\n response: validator.emailResponse,\n },\n ] satisfies Core.RouterInputFor<Controllers, 'plugin::email'>['routes'];\n});\n\nexport default createRoutes;\n"],"names":["createRoutes","createContentApiRoutesFactory","validator","EmailRouteValidator","strapi","method","path","handler","request","body","sendEmailInput","response","emailResponse"],"mappings":";;;;;AAKA;AACA,MAAMA,eAAeC,mCAAAA,CAA8B,IAAA;IACjD,MAAMC,SAAAA,GAAY,IAAIC,yBAAAA,CAAoBC,MAAAA,CAAAA;IAE1C,OAAO;AACL,QAAA;YACEC,MAAAA,EAAQ,MAAA;YACRC,IAAAA,EAAM,GAAA;YACNC,OAAAA,EAAS,YAAA;YACTC,OAAAA,EAAS;gBACPC,IAAAA,EAAM;AAAE,oBAAA,kBAAA,EAAoBP,UAAUQ;AAAe;AACvD,aAAA;AACAC,YAAAA,QAAAA,EAAUT,UAAUU;AACtB;AACD,KAAA;AACH,CAAA;;;;"}
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
import { createContentApiRoutesFactory } from '@strapi/utils';
|
|
2
2
|
import { EmailRouteValidator } from './validation/email.mjs';
|
|
3
3
|
|
|
4
|
+
// The published type stays develop's `Core.RouterInput['routes']`; `satisfies` checks the literals.
|
|
4
5
|
const createRoutes = createContentApiRoutesFactory(()=>{
|
|
5
6
|
const validator = new EmailRouteValidator(strapi);
|
|
6
7
|
return [
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"content-api.mjs","sources":["../../../server/src/routes/content-api.ts"],"sourcesContent":["import type { Core } from '@strapi/types';\nimport { createContentApiRoutesFactory } from '@strapi/utils';\nimport { EmailRouteValidator } from './validation';\n\nconst createRoutes = createContentApiRoutesFactory((): Core.RouterInput['routes'] => {\n const validator = new EmailRouteValidator(strapi);\n\n return [\n {\n method: 'POST',\n path: '/',\n handler: 'email.send',\n request: {\n body: { 'application/json': validator.sendEmailInput },\n },\n response: validator.emailResponse,\n },\n ];\n});\n\nexport default createRoutes;\n"],"names":["createRoutes","createContentApiRoutesFactory","validator","EmailRouteValidator","strapi","method","path","handler","request","body","sendEmailInput","response","emailResponse"],"mappings":";;;
|
|
1
|
+
{"version":3,"file":"content-api.mjs","sources":["../../../server/src/routes/content-api.ts"],"sourcesContent":["import type { Core } from '@strapi/types';\nimport { createContentApiRoutesFactory } from '@strapi/utils';\nimport type { Controllers } from '../types/controllers';\nimport { EmailRouteValidator } from './validation';\n\n// The published type stays develop's `Core.RouterInput['routes']`; `satisfies` checks the literals.\nconst createRoutes = createContentApiRoutesFactory((): Core.RouterInput['routes'] => {\n const validator = new EmailRouteValidator(strapi);\n\n return [\n {\n method: 'POST',\n path: '/',\n handler: 'email.send',\n request: {\n body: { 'application/json': validator.sendEmailInput },\n },\n response: validator.emailResponse,\n },\n ] satisfies Core.RouterInputFor<Controllers, 'plugin::email'>['routes'];\n});\n\nexport default createRoutes;\n"],"names":["createRoutes","createContentApiRoutesFactory","validator","EmailRouteValidator","strapi","method","path","handler","request","body","sendEmailInput","response","emailResponse"],"mappings":";;;AAKA;AACA,MAAMA,eAAeC,6BAAAA,CAA8B,IAAA;IACjD,MAAMC,SAAAA,GAAY,IAAIC,mBAAAA,CAAoBC,MAAAA,CAAAA;IAE1C,OAAO;AACL,QAAA;YACEC,MAAAA,EAAQ,MAAA;YACRC,IAAAA,EAAM,GAAA;YACNC,OAAAA,EAAS,YAAA;YACTC,OAAAA,EAAS;gBACPC,IAAAA,EAAM;AAAE,oBAAA,kBAAA,EAAoBP,UAAUQ;AAAe;AACvD,aAAA;AACAC,YAAAA,QAAAA,EAAUT,UAAUU;AACtB;AACD,KAAA;AACH,CAAA;;;;"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.mjs","sources":["../../../server/src/routes/index.ts"],"sourcesContent":["import admin from './admin';\nimport contentApi from './content-api';\n\nexport const routes = {\n admin,\n 'content-api': contentApi,\n};\n"],"names":["routes","admin","contentApi"],"mappings":";;;MAGaA,MAAAA,GAAS;AACpBC,
|
|
1
|
+
{"version":3,"file":"index.mjs","sources":["../../../server/src/routes/index.ts"],"sourcesContent":["import admin from './admin';\nimport contentApi from './content-api';\n\nexport const routes = {\n admin,\n 'content-api': contentApi,\n};\n"],"names":["routes","admin","contentApi"],"mappings":";;;MAGaA,MAAAA,GAAS;AACpBC,WAAAA,QAAAA;IACA,aAAA,EAAeC;AACjB;;;;"}
|
|
@@ -33,6 +33,8 @@ const send = async (options)=>strapi.plugin('email').provider.send(options);
|
|
|
33
33
|
* @param {object} data - data used to fill the template
|
|
34
34
|
* @returns {{ subject, text, subject }}
|
|
35
35
|
*/ const sendTemplatedEmail = (emailOptions, emailTemplate, data)=>{
|
|
36
|
+
// TODO @Nico `EmailTemplate` declares `html` optional, but a template without an `html` key
|
|
37
|
+
// throws here.
|
|
36
38
|
const attributes = [
|
|
37
39
|
'subject',
|
|
38
40
|
'text',
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"email.js","sources":["../../../server/src/services/email.ts"],"sourcesContent":["import * as _ from 'lodash';\nimport { objects, template } from '@strapi/utils';\n\nimport type {\n EmailConfig,\n EmailOptions,\n EmailTemplate,\n EmailTemplateData,\n SendOptions,\n} from '../types';\n\nconst { createStrictInterpolationRegExp } = template;\n\nconst getProviderSettings = (): EmailConfig => strapi.config.get('plugin::email');\n\nconst send = async (options: SendOptions) => strapi.plugin('email').provider.send(options);\n\n/**\n * fill subject, text and html using lodash template\n * @param {object} emailOptions - to, from and replyto...\n * @param {object} emailTemplate - object containing attributes to fill\n * @param {object} data - data used to fill the template\n * @returns {{ subject, text, subject }}\n */\nconst sendTemplatedEmail = (\n emailOptions: EmailOptions,\n emailTemplate: EmailTemplate,\n data: EmailTemplateData\n) => {\n const attributes = ['subject', 'text', 'html'];\n const missingAttributes = _.difference(attributes, Object.keys(emailTemplate));\n\n if (missingAttributes.length > 0) {\n throw new Error(\n `Following attributes are missing from your email template : ${missingAttributes.join(', ')}`\n );\n }\n\n const allowedInterpolationVariables = objects.keysDeep(data);\n const interpolate = createStrictInterpolationRegExp(allowedInterpolationVariables, 'g');\n\n const templatedAttributes = attributes.reduce(\n (compiled, attribute) =>\n emailTemplate[attribute]\n ? Object.assign(compiled, {\n [attribute]: _.template(emailTemplate[attribute], {\n interpolate,\n })(data),\n })\n : compiled,\n {}\n );\n\n return strapi.plugin('email').provider.send({ ...emailOptions, ...templatedAttributes });\n};\n\nconst emailService = () => ({\n getProviderSettings,\n send,\n sendTemplatedEmail,\n})
|
|
1
|
+
{"version":3,"file":"email.js","sources":["../../../server/src/services/email.ts"],"sourcesContent":["import * as _ from 'lodash';\nimport { objects, template } from '@strapi/utils';\nimport type { Core } from '@strapi/types';\n\nimport type {\n EmailConfig,\n EmailOptions,\n EmailTemplate,\n EmailTemplateData,\n SendOptions,\n} from '../types';\n\nconst { createStrictInterpolationRegExp } = template;\n\nconst getProviderSettings = (): EmailConfig => strapi.config.get('plugin::email');\n\nconst send = async (options: SendOptions) => strapi.plugin('email').provider.send(options);\n\n/**\n * fill subject, text and html using lodash template\n * @param {object} emailOptions - to, from and replyto...\n * @param {object} emailTemplate - object containing attributes to fill\n * @param {object} data - data used to fill the template\n * @returns {{ subject, text, subject }}\n */\nconst sendTemplatedEmail = (\n emailOptions: EmailOptions,\n emailTemplate: EmailTemplate,\n data: EmailTemplateData\n) => {\n // TODO @Nico `EmailTemplate` declares `html` optional, but a template without an `html` key\n // throws here.\n const attributes = ['subject', 'text', 'html'];\n const missingAttributes = _.difference(attributes, Object.keys(emailTemplate));\n\n if (missingAttributes.length > 0) {\n throw new Error(\n `Following attributes are missing from your email template : ${missingAttributes.join(', ')}`\n );\n }\n\n const allowedInterpolationVariables = objects.keysDeep(data);\n const interpolate = createStrictInterpolationRegExp(allowedInterpolationVariables, 'g');\n\n const templatedAttributes = attributes.reduce(\n (compiled, attribute) =>\n emailTemplate[attribute]\n ? Object.assign(compiled, {\n [attribute]: _.template(emailTemplate[attribute], {\n interpolate,\n })(data),\n })\n : compiled,\n {}\n );\n\n return strapi.plugin('email').provider.send({ ...emailOptions, ...templatedAttributes });\n};\n\nconst emailService = (() => ({\n getProviderSettings,\n send,\n sendTemplatedEmail,\n})) satisfies Core.ServiceFactory<'plugin::email.email'>;\n\nexport default emailService;\n"],"names":["createStrictInterpolationRegExp","template","getProviderSettings","strapi","config","get","send","options","plugin","provider","sendTemplatedEmail","emailOptions","emailTemplate","data","attributes","missingAttributes","_","difference","Object","keys","length","Error","join","allowedInterpolationVariables","objects","keysDeep","interpolate","templatedAttributes","reduce","compiled","attribute","assign","emailService"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;AAYA,MAAM,EAAEA,+BAA+B,EAAE,GAAGC,cAAAA;AAE5C,MAAMC,sBAAsB,IAAmBC,MAAAA,CAAOC,MAAM,CAACC,GAAG,CAAC,eAAA,CAAA;AAEjE,MAAMC,IAAAA,GAAO,OAAOC,OAAAA,GAAyBJ,MAAAA,CAAOK,MAAM,CAAC,OAAA,CAAA,CAASC,QAAQ,CAACH,IAAI,CAACC,OAAAA,CAAAA;AAElF;;;;;;AAMC,IACD,MAAMG,kBAAAA,GAAqB,CACzBC,YAAAA,EACAC,aAAAA,EACAC,IAAAA,GAAAA;;;AAIA,IAAA,MAAMC,UAAAA,GAAa;AAAC,QAAA,SAAA;AAAW,QAAA,MAAA;AAAQ,QAAA;AAAO,KAAA;AAC9C,IAAA,MAAMC,oBAAoBC,YAAAA,CAAEC,UAAU,CAACH,UAAAA,EAAYI,MAAAA,CAAOC,IAAI,CAACP,aAAAA,CAAAA,CAAAA;IAE/D,IAAIG,iBAAAA,CAAkBK,MAAM,GAAG,CAAA,EAAG;QAChC,MAAM,IAAIC,MACR,CAAC,4DAA4D,EAAEN,iBAAAA,CAAkBO,IAAI,CAAC,IAAA,CAAA,CAAA,CAAO,CAAA;AAEjG,IAAA;IAEA,MAAMC,6BAAAA,GAAgCC,aAAAA,CAAQC,QAAQ,CAACZ,IAAAA,CAAAA;IACvD,MAAMa,WAAAA,GAAc1B,gCAAgCuB,6BAAAA,EAA+B,GAAA,CAAA;AAEnF,IAAA,MAAMI,mBAAAA,GAAsBb,UAAAA,CAAWc,MAAM,CAC3C,CAACC,QAAAA,EAAUC,SAAAA,GACTlB,aAAa,CAACkB,SAAAA,CAAU,GACpBZ,MAAAA,CAAOa,MAAM,CAACF,QAAAA,EAAU;YACtB,CAACC,SAAAA,GAAYd,YAAAA,CAAEf,QAAQ,CAACW,aAAa,CAACkB,UAAU,EAAE;AAChDJ,gBAAAA;aACF,CAAA,CAAGb,IAAAA;AACL,SAAA,CAAA,GACAgB,UACN,EAAC,CAAA;AAGH,IAAA,OAAO1B,OAAOK,MAAM,CAAC,SAASC,QAAQ,CAACH,IAAI,CAAC;AAAE,QAAA,GAAGK,YAAY;AAAE,QAAA,GAAGgB;AAAoB,KAAA,CAAA;AACxF,CAAA;AAEA,MAAMK,YAAAA,GAAgB,KAAO;AAC3B9B,QAAAA,mBAAAA;AACAI,QAAAA,IAAAA;AACAI,QAAAA;KACF;;;;"}
|
|
@@ -11,6 +11,8 @@ const send = async (options)=>strapi.plugin('email').provider.send(options);
|
|
|
11
11
|
* @param {object} data - data used to fill the template
|
|
12
12
|
* @returns {{ subject, text, subject }}
|
|
13
13
|
*/ const sendTemplatedEmail = (emailOptions, emailTemplate, data)=>{
|
|
14
|
+
// TODO @Nico `EmailTemplate` declares `html` optional, but a template without an `html` key
|
|
15
|
+
// throws here.
|
|
14
16
|
const attributes = [
|
|
15
17
|
'subject',
|
|
16
18
|
'text',
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"email.mjs","sources":["../../../server/src/services/email.ts"],"sourcesContent":["import * as _ from 'lodash';\nimport { objects, template } from '@strapi/utils';\n\nimport type {\n EmailConfig,\n EmailOptions,\n EmailTemplate,\n EmailTemplateData,\n SendOptions,\n} from '../types';\n\nconst { createStrictInterpolationRegExp } = template;\n\nconst getProviderSettings = (): EmailConfig => strapi.config.get('plugin::email');\n\nconst send = async (options: SendOptions) => strapi.plugin('email').provider.send(options);\n\n/**\n * fill subject, text and html using lodash template\n * @param {object} emailOptions - to, from and replyto...\n * @param {object} emailTemplate - object containing attributes to fill\n * @param {object} data - data used to fill the template\n * @returns {{ subject, text, subject }}\n */\nconst sendTemplatedEmail = (\n emailOptions: EmailOptions,\n emailTemplate: EmailTemplate,\n data: EmailTemplateData\n) => {\n const attributes = ['subject', 'text', 'html'];\n const missingAttributes = _.difference(attributes, Object.keys(emailTemplate));\n\n if (missingAttributes.length > 0) {\n throw new Error(\n `Following attributes are missing from your email template : ${missingAttributes.join(', ')}`\n );\n }\n\n const allowedInterpolationVariables = objects.keysDeep(data);\n const interpolate = createStrictInterpolationRegExp(allowedInterpolationVariables, 'g');\n\n const templatedAttributes = attributes.reduce(\n (compiled, attribute) =>\n emailTemplate[attribute]\n ? Object.assign(compiled, {\n [attribute]: _.template(emailTemplate[attribute], {\n interpolate,\n })(data),\n })\n : compiled,\n {}\n );\n\n return strapi.plugin('email').provider.send({ ...emailOptions, ...templatedAttributes });\n};\n\nconst emailService = () => ({\n getProviderSettings,\n send,\n sendTemplatedEmail,\n})
|
|
1
|
+
{"version":3,"file":"email.mjs","sources":["../../../server/src/services/email.ts"],"sourcesContent":["import * as _ from 'lodash';\nimport { objects, template } from '@strapi/utils';\nimport type { Core } from '@strapi/types';\n\nimport type {\n EmailConfig,\n EmailOptions,\n EmailTemplate,\n EmailTemplateData,\n SendOptions,\n} from '../types';\n\nconst { createStrictInterpolationRegExp } = template;\n\nconst getProviderSettings = (): EmailConfig => strapi.config.get('plugin::email');\n\nconst send = async (options: SendOptions) => strapi.plugin('email').provider.send(options);\n\n/**\n * fill subject, text and html using lodash template\n * @param {object} emailOptions - to, from and replyto...\n * @param {object} emailTemplate - object containing attributes to fill\n * @param {object} data - data used to fill the template\n * @returns {{ subject, text, subject }}\n */\nconst sendTemplatedEmail = (\n emailOptions: EmailOptions,\n emailTemplate: EmailTemplate,\n data: EmailTemplateData\n) => {\n // TODO @Nico `EmailTemplate` declares `html` optional, but a template without an `html` key\n // throws here.\n const attributes = ['subject', 'text', 'html'];\n const missingAttributes = _.difference(attributes, Object.keys(emailTemplate));\n\n if (missingAttributes.length > 0) {\n throw new Error(\n `Following attributes are missing from your email template : ${missingAttributes.join(', ')}`\n );\n }\n\n const allowedInterpolationVariables = objects.keysDeep(data);\n const interpolate = createStrictInterpolationRegExp(allowedInterpolationVariables, 'g');\n\n const templatedAttributes = attributes.reduce(\n (compiled, attribute) =>\n emailTemplate[attribute]\n ? Object.assign(compiled, {\n [attribute]: _.template(emailTemplate[attribute], {\n interpolate,\n })(data),\n })\n : compiled,\n {}\n );\n\n return strapi.plugin('email').provider.send({ ...emailOptions, ...templatedAttributes });\n};\n\nconst emailService = (() => ({\n getProviderSettings,\n send,\n sendTemplatedEmail,\n})) satisfies Core.ServiceFactory<'plugin::email.email'>;\n\nexport default emailService;\n"],"names":["createStrictInterpolationRegExp","template","getProviderSettings","strapi","config","get","send","options","plugin","provider","sendTemplatedEmail","emailOptions","emailTemplate","data","attributes","missingAttributes","_","difference","Object","keys","length","Error","join","allowedInterpolationVariables","objects","keysDeep","interpolate","templatedAttributes","reduce","compiled","attribute","assign","emailService"],"mappings":";;;AAYA,MAAM,EAAEA,+BAA+B,EAAE,GAAGC,QAAAA;AAE5C,MAAMC,sBAAsB,IAAmBC,MAAAA,CAAOC,MAAM,CAACC,GAAG,CAAC,eAAA,CAAA;AAEjE,MAAMC,IAAAA,GAAO,OAAOC,OAAAA,GAAyBJ,MAAAA,CAAOK,MAAM,CAAC,OAAA,CAAA,CAASC,QAAQ,CAACH,IAAI,CAACC,OAAAA,CAAAA;AAElF;;;;;;AAMC,IACD,MAAMG,kBAAAA,GAAqB,CACzBC,YAAAA,EACAC,aAAAA,EACAC,IAAAA,GAAAA;;;AAIA,IAAA,MAAMC,UAAAA,GAAa;AAAC,QAAA,SAAA;AAAW,QAAA,MAAA;AAAQ,QAAA;AAAO,KAAA;AAC9C,IAAA,MAAMC,oBAAoBC,CAAAA,CAAEC,UAAU,CAACH,UAAAA,EAAYI,MAAAA,CAAOC,IAAI,CAACP,aAAAA,CAAAA,CAAAA;IAE/D,IAAIG,iBAAAA,CAAkBK,MAAM,GAAG,CAAA,EAAG;QAChC,MAAM,IAAIC,MACR,CAAC,4DAA4D,EAAEN,iBAAAA,CAAkBO,IAAI,CAAC,IAAA,CAAA,CAAA,CAAO,CAAA;AAEjG,IAAA;IAEA,MAAMC,6BAAAA,GAAgCC,OAAAA,CAAQC,QAAQ,CAACZ,IAAAA,CAAAA;IACvD,MAAMa,WAAAA,GAAc1B,gCAAgCuB,6BAAAA,EAA+B,GAAA,CAAA;AAEnF,IAAA,MAAMI,mBAAAA,GAAsBb,UAAAA,CAAWc,MAAM,CAC3C,CAACC,QAAAA,EAAUC,SAAAA,GACTlB,aAAa,CAACkB,SAAAA,CAAU,GACpBZ,MAAAA,CAAOa,MAAM,CAACF,QAAAA,EAAU;YACtB,CAACC,SAAAA,GAAYd,CAAAA,CAAEf,QAAQ,CAACW,aAAa,CAACkB,UAAU,EAAE;AAChDJ,gBAAAA;aACF,CAAA,CAAGb,IAAAA;AACL,SAAA,CAAA,GACAgB,UACN,EAAC,CAAA;AAGH,IAAA,OAAO1B,OAAOK,MAAM,CAAC,SAASC,QAAQ,CAACH,IAAI,CAAC;AAAE,QAAA,GAAGK,YAAY;AAAE,QAAA,GAAGgB;AAAoB,KAAA,CAAA;AACxF,CAAA;AAEA,MAAMK,YAAAA,GAAgB,KAAO;AAC3B9B,QAAAA,mBAAAA;AACAI,QAAAA,IAAAA;AACAI,QAAAA;KACF;;;;"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sources":["../../../server/src/services/index.ts"],"sourcesContent":["import email from './email';\n\nexport const services = { email }
|
|
1
|
+
{"version":3,"file":"index.js","sources":["../../../server/src/services/index.ts"],"sourcesContent":["import type { Core } from '@strapi/types';\nimport type {} from '../types';\n\nimport email from './email';\n\n/** Names of the registered Email services. */\ntype RegisteredNames = keyof Core.RegisteredFor<Strapi.Registries.PackageServices, 'plugin::email'>;\n\nexport const services = { email } satisfies Record<RegisteredNames, unknown>;\n"],"names":["services","email"],"mappings":";;;;MAQaA,QAAAA,GAAW;AAAEC,IAAAA;AAAM;;;;"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.mjs","sources":["../../../server/src/services/index.ts"],"sourcesContent":["import email from './email';\n\nexport const services = { email }
|
|
1
|
+
{"version":3,"file":"index.mjs","sources":["../../../server/src/services/index.ts"],"sourcesContent":["import type { Core } from '@strapi/types';\nimport type {} from '../types';\n\nimport email from './email';\n\n/** Names of the registered Email services. */\ntype RegisteredNames = keyof Core.RegisteredFor<Strapi.Registries.PackageServices, 'plugin::email'>;\n\nexport const services = { email } satisfies Record<RegisteredNames, unknown>;\n"],"names":["services","email"],"mappings":";;MAQaA,QAAAA,GAAW;AAAEC,WAAAA;AAAM;;;;"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"email.d.ts","sourceRoot":"","sources":["../../../../server/src/controllers/email.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,GAAG,MAAM,KAAK,CAAC;AAM3B;;;;GAIG;AACH,QAAA,MAAM,eAAe;cACH,GAAG,CAAC,OAAO;cAmBX,GAAG,CAAC,OAAO;qBA+BJ,GAAG,CAAC,OAAO;
|
|
1
|
+
{"version":3,"file":"email.d.ts","sourceRoot":"","sources":["../../../../server/src/controllers/email.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,GAAG,MAAM,KAAK,CAAC;AAM3B;;;;GAIG;AACH,QAAA,MAAM,eAAe;cACH,GAAG,CAAC,OAAO;cAmBX,GAAG,CAAC,OAAO;qBA+BJ,GAAG,CAAC,OAAO;gBA2BhB,GAAG,CAAC,OAAO;CAiB9B,CAAC;AAEF,eAAe,eAAe,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../server/src/controllers/index.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../server/src/controllers/index.ts"],"names":[],"mappings":"AAIA,eAAO,MAAM,WAAW;;;;;;;CAAkC,CAAC"}
|
|
@@ -1,6 +1,9 @@
|
|
|
1
|
+
export type * from './types';
|
|
2
|
+
export type * from './types/services';
|
|
3
|
+
export type * from './types/controllers';
|
|
1
4
|
declare const _default: {
|
|
2
5
|
bootstrap: ({ strapi }: {
|
|
3
|
-
strapi: import("@strapi/types/dist/core").Strapi;
|
|
6
|
+
strapi: import("@strapi/types/dist/core/strapi.js").Strapi;
|
|
4
7
|
}) => Promise<void>;
|
|
5
8
|
services: {
|
|
6
9
|
email: () => {
|
|
@@ -28,7 +31,7 @@ declare const _default: {
|
|
|
28
31
|
};
|
|
29
32
|
'content-api': () => {
|
|
30
33
|
type: "content-api";
|
|
31
|
-
routes: import("@strapi/types/dist/core").RouteInput[];
|
|
34
|
+
routes: import("@strapi/types/dist/core/route.js").RouteInput[];
|
|
32
35
|
};
|
|
33
36
|
};
|
|
34
37
|
controllers: {
|
|
@@ -42,7 +45,7 @@ declare const _default: {
|
|
|
42
45
|
config: import("./types").StrapiConfig;
|
|
43
46
|
middlewares: {
|
|
44
47
|
rateLimit: (config: any, { strapi }: {
|
|
45
|
-
strapi: import("@strapi/types/dist/core").Strapi;
|
|
48
|
+
strapi: import("@strapi/types/dist/core/strapi.js").Strapi;
|
|
46
49
|
}) => (ctx: import("koa").Context, next: import("koa").Next) => Promise<any>;
|
|
47
50
|
};
|
|
48
51
|
};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../server/src/index.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../server/src/index.ts"],"names":[],"mappings":"AAOA,mBAAmB,SAAS,CAAC;AAC7B,mBAAmB,kBAAkB,CAAC;AACtC,mBAAmB,qBAAqB,CAAC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;eAUnC,0BAAY,EAAC,wBAAW;;;AAR9B,wBAOE"}
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
export { default as rateLimit } from './rateLimit';
|
|
2
2
|
declare const _default: {
|
|
3
3
|
rateLimit: (config: any, { strapi }: {
|
|
4
|
-
strapi: import("@strapi/types/dist/core").Strapi;
|
|
4
|
+
strapi: import("@strapi/types/dist/core/strapi.js").Strapi;
|
|
5
5
|
}) => (ctx: import("koa").Context, next: import("koa").Next) => Promise<any>;
|
|
6
6
|
};
|
|
7
7
|
export default _default;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../server/src/middlewares/index.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,OAAO,IAAI,SAAS,EAAE,MAAM,aAAa,CAAC;;;;
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../server/src/middlewares/index.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,OAAO,IAAI,SAAS,EAAE,MAAM,aAAa,CAAC;;;;WAKmR,0BAAY,EAAC,wBAAW;;AAH9V,wBAEE"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"rateLimit.d.ts","sourceRoot":"","sources":["../../../../server/src/middlewares/rateLimit.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,KAAK,CAAC;AAGzC,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,eAAe,CAAC;
|
|
1
|
+
{"version":3,"file":"rateLimit.d.ts","sourceRoot":"","sources":["../../../../server/src/middlewares/rateLimit.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,KAAK,CAAC;AAGzC,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,eAAe,CAAC;yBAM1B,QAAQ,GAAG,EAAE,YAAY;IAAE,MAAM,EAAE,IAAI,CAAC,MAAM,CAAA;CAAE,MACvD,KAAK,OAAO,EAAE,MAAM,IAAI;AADjC,wBA+BI"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"registries.d.ts","sourceRoot":"","sources":["../../../server/src/registries.ts"],"names":[],"mappings":""}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"admin.d.ts","sourceRoot":"","sources":["../../../../server/src/routes/admin.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"admin.d.ts","sourceRoot":"","sources":["../../../../server/src/routes/admin.ts"],"names":[],"mappings":"AAIA,QAAA,MAAM,MAAM,EAAE;IACZ,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE;QACN,MAAM,EAAE,MAAM,CAAC;QACf,IAAI,EAAE,MAAM,CAAC;QACb,OAAO,EAAE,MAAM,CAAC;QAChB,MAAM,EAAE;YACN,QAAQ,EAAE,CAAC,MAAM,GAAG;gBAAE,IAAI,EAAE,MAAM,CAAC;gBAAC,MAAM,EAAE;oBAAE,OAAO,EAAE,MAAM,EAAE,CAAA;iBAAE,CAAA;aAAE,CAAC,EAAE,CAAC;SACxE,CAAC;KACH,EAAE,CAAC;CA8CuD,CAAC;AAE9D,eAAe,MAAM,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"content-api.d.ts","sourceRoot":"","sources":["../../../../server/src/routes/content-api.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,eAAe,CAAC;
|
|
1
|
+
{"version":3,"file":"content-api.d.ts","sourceRoot":"","sources":["../../../../server/src/routes/content-api.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,eAAe,CAAC;AAM1C,QAAA,MAAM,YAAY;;;CAchB,CAAC;AAEH,eAAe,YAAY,CAAC"}
|
|
@@ -17,7 +17,7 @@ export declare const routes: {
|
|
|
17
17
|
};
|
|
18
18
|
'content-api': () => {
|
|
19
19
|
type: "content-api";
|
|
20
|
-
routes: import("@strapi/types/dist/core").RouteInput[];
|
|
20
|
+
routes: import("@strapi/types/dist/core/route.js").RouteInput[];
|
|
21
21
|
};
|
|
22
22
|
};
|
|
23
23
|
//# sourceMappingURL=index.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"email.d.ts","sourceRoot":"","sources":["../../../../server/src/services/email.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"email.d.ts","sourceRoot":"","sources":["../../../../server/src/services/email.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EACV,WAAW,EACX,YAAY,EACZ,aAAa,EACb,iBAAiB,EACjB,WAAW,EACZ,MAAM,UAAU,CAAC;AAiDlB,QAAA,MAAM,YAAY;+BA7Cc,WAAW;oBAEd,WAAW;uCAUxB,YAAY,iBACX,aAAa,QACtB,iBAAiB;CAmC+B,CAAC;AAEzD,eAAe,YAAY,CAAC"}
|
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
export declare const services: {
|
|
2
2
|
email: () => {
|
|
3
|
-
getProviderSettings: () => import("
|
|
4
|
-
send: (options: import("
|
|
5
|
-
sendTemplatedEmail: (emailOptions: import("
|
|
3
|
+
getProviderSettings: () => import("..").EmailConfig;
|
|
4
|
+
send: (options: import("..").SendOptions) => Promise<any>;
|
|
5
|
+
sendTemplatedEmail: (emailOptions: import("..").EmailOptions, emailTemplate: import("..").EmailTemplate, data: import("..").EmailTemplateData) => any;
|
|
6
6
|
};
|
|
7
7
|
};
|
|
8
8
|
//# sourceMappingURL=index.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../server/src/services/index.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../server/src/services/index.ts"],"names":[],"mappings":"AAQA,eAAO,MAAM,QAAQ;;;;;;CAAuD,CAAC"}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
import type { Core } from '@strapi/types';
|
|
2
|
+
/** Admin and Content API actions sending emails, and admin actions on the email settings. */
|
|
3
|
+
export type EmailController = {
|
|
4
|
+
send: Core.ControllerHandler;
|
|
5
|
+
test: Core.ControllerHandler;
|
|
6
|
+
getSettings: Core.ControllerHandler;
|
|
7
|
+
verify: Core.ControllerHandler;
|
|
8
|
+
};
|
|
9
|
+
/** The controller contracts by name, as in the plugin's controllers map. Used to check the routes. */
|
|
10
|
+
export type Controllers = {
|
|
11
|
+
email: EmailController;
|
|
12
|
+
};
|
|
13
|
+
/** Default controller contracts loaded with the Email server types. */
|
|
14
|
+
declare global {
|
|
15
|
+
namespace Strapi {
|
|
16
|
+
namespace Registries {
|
|
17
|
+
interface PackageControllers {
|
|
18
|
+
'plugin::email.email': Controllers['email'];
|
|
19
|
+
}
|
|
20
|
+
}
|
|
21
|
+
}
|
|
22
|
+
}
|
|
23
|
+
//# sourceMappingURL=controllers.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"controllers.d.ts","sourceRoot":"","sources":["../../../../server/src/types/controllers.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,eAAe,CAAC;AAE1C,6FAA6F;AAC7F,MAAM,MAAM,eAAe,GAAG;IAC5B,IAAI,EAAE,IAAI,CAAC,iBAAiB,CAAC;IAC7B,IAAI,EAAE,IAAI,CAAC,iBAAiB,CAAC;IAC7B,WAAW,EAAE,IAAI,CAAC,iBAAiB,CAAC;IACpC,MAAM,EAAE,IAAI,CAAC,iBAAiB,CAAC;CAChC,CAAC;AAEF,sGAAsG;AACtG,MAAM,MAAM,WAAW,GAAG;IACxB,KAAK,EAAE,eAAe,CAAC;CACxB,CAAC;AAEF,uEAAuE;AACvE,OAAO,CAAC,MAAM,CAAC;IAEb,UAAU,MAAM,CAAC;QAEf,UAAU,UAAU,CAAC;YACnB,UAAU,kBAAkB;gBAC1B,qBAAqB,EAAE,WAAW,CAAC,OAAO,CAAC,CAAC;aAC7C;SACF;KACF;CACF"}
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The koa context the callbacks receive. `koa` is a peer dependency, which published contracts
|
|
3
|
+
* cannot reference: `never` accepts a callback typed with any context.
|
|
4
|
+
*/
|
|
5
|
+
type Context = never;
|
|
6
|
+
/** A duration in milliseconds, or in units such as `{ min: 5 }`. */
|
|
7
|
+
type Duration = number | Partial<Record<'ms' | 'sec' | 'min' | 'hour' | 'day' | 'week' | 'month' | 'year', number>>;
|
|
8
|
+
/**
|
|
9
|
+
* Options of koa2-ratelimit's `RateLimit.middleware`, which ships no types. The
|
|
10
|
+
* `plugin::email.rateLimit` middleware spreads its config over them. Same type as `@strapi/admin`'s,
|
|
11
|
+
* which published contracts cannot reference: `@strapi/admin` is a peer dependency.
|
|
12
|
+
*/
|
|
13
|
+
export type RateLimitOptions = {
|
|
14
|
+
/** How long to keep records of requests. */
|
|
15
|
+
interval?: Duration;
|
|
16
|
+
/** Requests allowed before responses are delayed. */
|
|
17
|
+
delayAfter?: number;
|
|
18
|
+
/** Base delay of a delayed response, multiplied by the number of recent hits. */
|
|
19
|
+
timeWait?: Duration;
|
|
20
|
+
/** Requests allowed per `interval` before responding with `statusCode`. */
|
|
21
|
+
max?: number;
|
|
22
|
+
message?: unknown;
|
|
23
|
+
messageKey?: string;
|
|
24
|
+
statusCode?: number;
|
|
25
|
+
/** Whether to send the rate limit headers. */
|
|
26
|
+
headers?: boolean;
|
|
27
|
+
/** Whether failed requests (status >= 400) are not counted. */
|
|
28
|
+
skipFailedRequests?: boolean;
|
|
29
|
+
prefixKey?: string;
|
|
30
|
+
prefixKeySeparator?: string;
|
|
31
|
+
/** User ids that are never limited. */
|
|
32
|
+
whitelist?: string[];
|
|
33
|
+
store?: unknown;
|
|
34
|
+
keyGenerator?: (ctx: Context) => string | Promise<string>;
|
|
35
|
+
getUserIdFromKey?: (key: string) => string;
|
|
36
|
+
skip?: (ctx: Context) => boolean | Promise<boolean>;
|
|
37
|
+
getUserId?: (ctx: Context) => string | Promise<string>;
|
|
38
|
+
handler?: (ctx: Context) => unknown;
|
|
39
|
+
onLimitReached?: (ctx: Context) => unknown;
|
|
40
|
+
weight?: (ctx: Context) => number | Promise<number>;
|
|
41
|
+
};
|
|
42
|
+
export {};
|
|
43
|
+
//# sourceMappingURL=rate-limit.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"rate-limit.d.ts","sourceRoot":"","sources":["../../../../server/src/types/rate-limit.ts"],"names":[],"mappings":"AAAA;;;GAGG;AACH,KAAK,OAAO,GAAG,KAAK,CAAC;AAErB,oEAAoE;AACpE,KAAK,QAAQ,GACT,MAAM,GACN,OAAO,CAAC,MAAM,CAAC,IAAI,GAAG,KAAK,GAAG,KAAK,GAAG,MAAM,GAAG,KAAK,GAAG,MAAM,GAAG,OAAO,GAAG,MAAM,EAAE,MAAM,CAAC,CAAC,CAAC;AAE/F;;;;GAIG;AACH,MAAM,MAAM,gBAAgB,GAAG;IAC7B,4CAA4C;IAC5C,QAAQ,CAAC,EAAE,QAAQ,CAAC;IACpB,qDAAqD;IACrD,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,iFAAiF;IACjF,QAAQ,CAAC,EAAE,QAAQ,CAAC;IACpB,2EAA2E;IAC3E,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,8CAA8C;IAC9C,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,+DAA+D;IAC/D,kBAAkB,CAAC,EAAE,OAAO,CAAC;IAC7B,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,kBAAkB,CAAC,EAAE,MAAM,CAAC;IAC5B,uCAAuC;IACvC,SAAS,CAAC,EAAE,MAAM,EAAE,CAAC;IACrB,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,YAAY,CAAC,EAAE,CAAC,GAAG,EAAE,OAAO,KAAK,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC;IAC1D,gBAAgB,CAAC,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,MAAM,CAAC;IAC3C,IAAI,CAAC,EAAE,CAAC,GAAG,EAAE,OAAO,KAAK,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;IACpD,SAAS,CAAC,EAAE,CAAC,GAAG,EAAE,OAAO,KAAK,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC;IACvD,OAAO,CAAC,EAAE,CAAC,GAAG,EAAE,OAAO,KAAK,OAAO,CAAC;IACpC,cAAc,CAAC,EAAE,CAAC,GAAG,EAAE,OAAO,KAAK,OAAO,CAAC;IAC3C,MAAM,CAAC,EAAE,CAAC,GAAG,EAAE,OAAO,KAAK,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC;CACrD,CAAC"}
|
|
@@ -0,0 +1,75 @@
|
|
|
1
|
+
import type { RateLimitOptions } from './rate-limit';
|
|
2
|
+
import type { EmailConfig, EmailTemplate } from '../types';
|
|
3
|
+
export type { RateLimitOptions } from './rate-limit';
|
|
4
|
+
/**
|
|
5
|
+
* `strapi.config.get('plugin::email')`: the plugin config merged with its defaults, and the
|
|
6
|
+
* `ratelimit` options the `rateLimit` middleware merges with `{ enabled: true }`.
|
|
7
|
+
*/
|
|
8
|
+
export type EmailPluginConfig = EmailConfig & {
|
|
9
|
+
ratelimit?: RateLimitOptions & {
|
|
10
|
+
enabled?: boolean;
|
|
11
|
+
};
|
|
12
|
+
};
|
|
13
|
+
/**
|
|
14
|
+
* The addresses of an email, as `EmailOptions` declares them, except that the optional ones also
|
|
15
|
+
* accept `undefined`: callers pass unset settings as they read them, such as the admin's
|
|
16
|
+
* `admin.forgotPassword.from` and `replyTo`.
|
|
17
|
+
*/
|
|
18
|
+
export type EmailOptionsInput = {
|
|
19
|
+
from?: string | undefined;
|
|
20
|
+
to: string;
|
|
21
|
+
cc?: string | undefined;
|
|
22
|
+
bcc?: string | undefined;
|
|
23
|
+
replyTo?: string | undefined;
|
|
24
|
+
[key: string]: string | undefined;
|
|
25
|
+
};
|
|
26
|
+
/** An email to send: its addresses and its content. */
|
|
27
|
+
export type SendOptionsInput = EmailOptionsInput & EmailTemplate;
|
|
28
|
+
/** The `email` service: sends emails through the configured provider. */
|
|
29
|
+
export type EmailService = {
|
|
30
|
+
/**
|
|
31
|
+
* Returns the plugin config, as `strapi.config.get('plugin::email')` does.
|
|
32
|
+
*
|
|
33
|
+
* @internal
|
|
34
|
+
*/
|
|
35
|
+
getProviderSettings(): EmailConfig;
|
|
36
|
+
/**
|
|
37
|
+
* Sends an email through the configured provider.
|
|
38
|
+
*
|
|
39
|
+
* @returns The provider's result, which depends on the provider: `undefined` for sendmail, the
|
|
40
|
+
* message info of the transport for nodemailer. Rejects with the provider's error.
|
|
41
|
+
*/
|
|
42
|
+
send(options: SendOptionsInput): Promise<unknown>;
|
|
43
|
+
/**
|
|
44
|
+
* Fills `subject`, `text` and `html` of the template with `data`, then sends the email through
|
|
45
|
+
* the configured provider.
|
|
46
|
+
*
|
|
47
|
+
* Throws synchronously, rather than returning a rejected promise, when the template has no
|
|
48
|
+
* `subject`, `text` or `html` key, or when a template does not compile.
|
|
49
|
+
*
|
|
50
|
+
* @param data - The values the templates interpolate with `<%= key %>`; nested keys are dot paths.
|
|
51
|
+
* @returns The provider's result, as `send` returns it.
|
|
52
|
+
*/
|
|
53
|
+
sendTemplatedEmail(emailOptions: EmailOptionsInput, emailTemplate: EmailTemplate, data: object): Promise<unknown>;
|
|
54
|
+
};
|
|
55
|
+
/** Email services by name, as registered by the plugin. */
|
|
56
|
+
export type Services = {
|
|
57
|
+
email: EmailService;
|
|
58
|
+
};
|
|
59
|
+
/** Default contracts loaded with the Email server types. */
|
|
60
|
+
declare global {
|
|
61
|
+
namespace Strapi {
|
|
62
|
+
namespace Registries {
|
|
63
|
+
interface PackageServices {
|
|
64
|
+
'plugin::email.email': Services['email'];
|
|
65
|
+
}
|
|
66
|
+
interface PackageConfigs {
|
|
67
|
+
'plugin::email': EmailPluginConfig;
|
|
68
|
+
}
|
|
69
|
+
interface PackageMiddlewares {
|
|
70
|
+
'plugin::email.rateLimit': RateLimitOptions | undefined;
|
|
71
|
+
}
|
|
72
|
+
}
|
|
73
|
+
}
|
|
74
|
+
}
|
|
75
|
+
//# sourceMappingURL=services.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"services.d.ts","sourceRoot":"","sources":["../../../../server/src/types/services.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,cAAc,CAAC;AACrD,OAAO,KAAK,EAAE,WAAW,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AAE3D,YAAY,EAAE,gBAAgB,EAAE,MAAM,cAAc,CAAC;AAErD;;;GAGG;AACH,MAAM,MAAM,iBAAiB,GAAG,WAAW,GAAG;IAC5C,SAAS,CAAC,EAAE,gBAAgB,GAAG;QAAE,OAAO,CAAC,EAAE,OAAO,CAAA;KAAE,CAAC;CACtD,CAAC;AAEF;;;;GAIG;AACH,MAAM,MAAM,iBAAiB,GAAG;IAC9B,IAAI,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IAC1B,EAAE,EAAE,MAAM,CAAC;IACX,EAAE,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IACxB,GAAG,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IACzB,OAAO,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IAC7B,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS,CAAC;CACnC,CAAC;AAEF,uDAAuD;AACvD,MAAM,MAAM,gBAAgB,GAAG,iBAAiB,GAAG,aAAa,CAAC;AAEjE,yEAAyE;AACzE,MAAM,MAAM,YAAY,GAAG;IACzB;;;;OAIG;IACH,mBAAmB,IAAI,WAAW,CAAC;IACnC;;;;;OAKG;IACH,IAAI,CAAC,OAAO,EAAE,gBAAgB,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;IAClD;;;;;;;;;OASG;IACH,kBAAkB,CAChB,YAAY,EAAE,iBAAiB,EAC/B,aAAa,EAAE,aAAa,EAC5B,IAAI,EAAE,MAAM,GACX,OAAO,CAAC,OAAO,CAAC,CAAC;CACrB,CAAC;AAEF,2DAA2D;AAC3D,MAAM,MAAM,QAAQ,GAAG;IACrB,KAAK,EAAE,YAAY,CAAC;CACrB,CAAC;AAEF,4DAA4D;AAC5D,OAAO,CAAC,MAAM,CAAC;IAEb,UAAU,MAAM,CAAC;QAEf,UAAU,UAAU,CAAC;YACnB,UAAU,eAAe;gBACvB,qBAAqB,EAAE,QAAQ,CAAC,OAAO,CAAC,CAAC;aAC1C;YAED,UAAU,cAAc;gBACtB,eAAe,EAAE,iBAAiB,CAAC;aACpC;YAED,UAAU,kBAAkB;gBAE1B,yBAAyB,EAAE,gBAAgB,GAAG,SAAS,CAAC;aACzD;SACF;KACF;CACF"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@strapi/email",
|
|
3
|
-
"version": "0.0.0-experimental.
|
|
3
|
+
"version": "0.0.0-experimental.63624e21eb5b0713345a0cf2f68f1c40eab427bc",
|
|
4
4
|
"description": "Easily configure your Strapi application to send emails.",
|
|
5
5
|
"homepage": "https://strapi.io",
|
|
6
6
|
"bugs": {
|
|
@@ -52,49 +52,59 @@
|
|
|
52
52
|
"build:types:server": "run -T tsc -p server/tsconfig.build.json --emitDeclarationOnly",
|
|
53
53
|
"build:types:admin": "run -T tsc -p admin/tsconfig.build.json --emitDeclarationOnly",
|
|
54
54
|
"clean": "run -T rimraf ./dist",
|
|
55
|
-
"lint": "run -T eslint .",
|
|
55
|
+
"lint": "run -T eslint . --max-warnings=0",
|
|
56
56
|
"test:front": "run -T cross-env IS_EE=true jest --config ./jest.config.front.js",
|
|
57
57
|
"test:front:ce": "run -T cross-env IS_EE=false jest --config ./jest.config.front.js",
|
|
58
58
|
"test:front:watch": "run -T cross-env IS_EE=true jest --config ./jest.config.front.js --watchAll",
|
|
59
59
|
"test:front:watch:ce": "run -T cross-env IS_EE=false jest --config ./jest.config.front.js --watchAll",
|
|
60
|
+
"test:ts:back": "run -T tsc -p server/tsconfig.json",
|
|
60
61
|
"test:ts:front": "run -T tsc -p admin/tsconfig.json",
|
|
61
|
-
"watch": "run -T rollup -c -w"
|
|
62
|
+
"watch": "run -T rollup -c -w",
|
|
63
|
+
"test:unit:vitest": "vitest run",
|
|
64
|
+
"test:unit:vitest:watch": "vitest --watch"
|
|
62
65
|
},
|
|
63
66
|
"dependencies": {
|
|
64
|
-
"@strapi/design-system": "2.2.
|
|
65
|
-
"@strapi/icons": "2.2.
|
|
66
|
-
"@strapi/provider-email-sendmail": "0.0.0-experimental.
|
|
67
|
-
"@strapi/
|
|
67
|
+
"@strapi/design-system": "2.2.4",
|
|
68
|
+
"@strapi/icons": "2.2.4",
|
|
69
|
+
"@strapi/provider-email-sendmail": "0.0.0-experimental.63624e21eb5b0713345a0cf2f68f1c40eab427bc",
|
|
70
|
+
"@strapi/types": "0.0.0-experimental.63624e21eb5b0713345a0cf2f68f1c40eab427bc",
|
|
71
|
+
"@strapi/utils": "0.0.0-experimental.63624e21eb5b0713345a0cf2f68f1c40eab427bc",
|
|
68
72
|
"koa2-ratelimit": "^1.1.3",
|
|
69
73
|
"lodash": "4.18.1",
|
|
70
74
|
"react-intl": "6.6.2",
|
|
71
75
|
"react-query": "3.39.3",
|
|
72
76
|
"yup": "0.32.9",
|
|
73
|
-
"zod": "
|
|
77
|
+
"zod": "4.4.3"
|
|
74
78
|
},
|
|
75
79
|
"devDependencies": {
|
|
76
|
-
"@strapi/admin": "0.0.0-experimental.
|
|
77
|
-
"@
|
|
80
|
+
"@strapi/admin": "0.0.0-experimental.63624e21eb5b0713345a0cf2f68f1c40eab427bc",
|
|
81
|
+
"@testing-library/dom": "10.4.1",
|
|
82
|
+
"@testing-library/jest-dom": "6.9.1",
|
|
78
83
|
"@testing-library/react": "16.3.2",
|
|
84
|
+
"@types/jest": "29.5.2",
|
|
79
85
|
"@types/koa": "2.15.2",
|
|
80
86
|
"@types/lodash": "^4.14.191",
|
|
87
|
+
"@types/node": "20.19.41",
|
|
88
|
+
"jest": "29.6.0",
|
|
81
89
|
"koa": "2.16.4",
|
|
82
90
|
"koa-body": "6.0.1",
|
|
83
91
|
"react": "18.3.1",
|
|
84
92
|
"react-dom": "18.3.1",
|
|
85
|
-
"react-router-dom": "6.30.
|
|
86
|
-
"styled-components": "6.4.1"
|
|
93
|
+
"react-router-dom": "6.30.6",
|
|
94
|
+
"styled-components": "6.4.1",
|
|
95
|
+
"vitest": "catalog:",
|
|
96
|
+
"vitest-config": "0.0.0-experimental.63624e21eb5b0713345a0cf2f68f1c40eab427bc"
|
|
87
97
|
},
|
|
88
98
|
"peerDependencies": {
|
|
89
|
-
"@strapi/admin": "0.0.0-experimental.
|
|
99
|
+
"@strapi/admin": "0.0.0-experimental.63624e21eb5b0713345a0cf2f68f1c40eab427bc",
|
|
90
100
|
"koa": "^2.15.2",
|
|
91
|
-
"react": "^
|
|
92
|
-
"react-dom": "^
|
|
101
|
+
"react": "^18.0.0",
|
|
102
|
+
"react-dom": "^18.0.0",
|
|
93
103
|
"react-router-dom": "^6.30.3",
|
|
94
104
|
"styled-components": "^6.0.0"
|
|
95
105
|
},
|
|
96
106
|
"engines": {
|
|
97
|
-
"node": ">=20.
|
|
107
|
+
"node": ">=20.0.0 <=26.x.x",
|
|
98
108
|
"npm": ">=6.0.0"
|
|
99
109
|
},
|
|
100
110
|
"strapi": {
|
|
@@ -103,5 +113,12 @@
|
|
|
103
113
|
"description": "Configure your application to send emails.",
|
|
104
114
|
"required": true,
|
|
105
115
|
"kind": "plugin"
|
|
116
|
+
},
|
|
117
|
+
"typesVersions": {
|
|
118
|
+
"*": {
|
|
119
|
+
"strapi-server": [
|
|
120
|
+
"dist/server/src/index.d.ts"
|
|
121
|
+
]
|
|
122
|
+
}
|
|
106
123
|
}
|
|
107
124
|
}
|