@fonderie/auth 7.12.0 → 7.14.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/brain/signatures.md +2 -2
- package/dist/index.cjs +376 -28
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +4 -66
- package/dist/index.d.ts +4 -66
- package/dist/index.js +377 -29
- package/dist/index.js.map +1 -1
- package/dist/middlewares/index.cjs +8 -8
- package/dist/middlewares/index.cjs.map +1 -1
- package/dist/middlewares/index.js +8 -8
- package/dist/middlewares/index.js.map +1 -1
- package/package.json +3 -3
package/dist/index.js
CHANGED
|
@@ -148,14 +148,16 @@ var email = z.string().trim().pipe(z.email());
|
|
|
148
148
|
var password = z.string().min(8, "password must be at least 8 characters").max(128);
|
|
149
149
|
var phone = z.string().refine((v) => /^\+?[1-9]\d{6,14}$/.test(v.replace(/[\s\-()]/g, "")), "Invalid phone number");
|
|
150
150
|
var sixDigitPin = z.string().trim().regex(/^\d{6}$/, "must be a 6-digit code");
|
|
151
|
+
var signupLocale = z.string().max(35).nullish();
|
|
151
152
|
var registerSchema = z.union([
|
|
152
153
|
z.object({
|
|
153
154
|
email,
|
|
154
155
|
password,
|
|
155
156
|
firstName: z.string().max(100).nullish(),
|
|
156
|
-
lastName: z.string().max(100).nullish()
|
|
157
|
+
lastName: z.string().max(100).nullish(),
|
|
158
|
+
locale: signupLocale
|
|
157
159
|
}),
|
|
158
|
-
z.object({ phone })
|
|
160
|
+
z.object({ phone, locale: signupLocale })
|
|
159
161
|
]);
|
|
160
162
|
var loginSchema = z.union([
|
|
161
163
|
z.object({ email, password: z.string().min(1).max(128) }),
|
|
@@ -597,25 +599,25 @@ var UserModel = class {
|
|
|
597
599
|
);
|
|
598
600
|
return row ?? null;
|
|
599
601
|
}
|
|
600
|
-
async findOrCreateByPhone(phone2, firstName = null, lastName = null) {
|
|
602
|
+
async findOrCreateByPhone(phone2, firstName = null, lastName = null, locale = null) {
|
|
601
603
|
const [row] = await this.store.query(
|
|
602
|
-
`INSERT INTO fonderie_users (phone, first_name, last_name)
|
|
603
|
-
VALUES ($1, $2, $3)
|
|
604
|
+
`INSERT INTO fonderie_users (phone, first_name, last_name, locale)
|
|
605
|
+
VALUES ($1, $2, $3, COALESCE($4, 'en-US'))
|
|
604
606
|
ON CONFLICT (phone) DO UPDATE
|
|
605
607
|
SET first_name = COALESCE(EXCLUDED.first_name, fonderie_users.first_name),
|
|
606
608
|
last_name = COALESCE(EXCLUDED.last_name, fonderie_users.last_name),
|
|
607
609
|
updated_at = now()
|
|
608
610
|
RETURNING id`,
|
|
609
|
-
[phone2, firstName, lastName]
|
|
611
|
+
[phone2, firstName, lastName, locale]
|
|
610
612
|
);
|
|
611
613
|
return row;
|
|
612
614
|
}
|
|
613
|
-
async create(email2, passwordHash, firstName, lastName) {
|
|
615
|
+
async create(email2, passwordHash, firstName, lastName, locale = null) {
|
|
614
616
|
const [row] = await this.store.query(
|
|
615
|
-
`INSERT INTO fonderie_users (email, password_hash, first_name, last_name)
|
|
616
|
-
VALUES ($1, $2, $3, $4)
|
|
617
|
+
`INSERT INTO fonderie_users (email, password_hash, first_name, last_name, locale)
|
|
618
|
+
VALUES ($1, $2, $3, $4, COALESCE($5, 'en-US'))
|
|
617
619
|
RETURNING id`,
|
|
618
|
-
[email2.toLowerCase().trim(), passwordHash, firstName, lastName]
|
|
620
|
+
[email2.toLowerCase().trim(), passwordHash, firstName, lastName, locale]
|
|
619
621
|
);
|
|
620
622
|
return row ?? null;
|
|
621
623
|
}
|
|
@@ -1374,7 +1376,7 @@ function mfaController(store, config, issuer, bus) {
|
|
|
1374
1376
|
// src/controllers/auth.controller.ts
|
|
1375
1377
|
import { randomBytes as randomBytes3, randomInt } from "crypto";
|
|
1376
1378
|
import { NOTIFICATION_EVENT as NOTIFICATION_EVENT2 } from "@fonderie/events";
|
|
1377
|
-
import { setApiResponse as setApiResponse3, HTTP as HTTP3, background as background3 } from "@fonderie/core";
|
|
1379
|
+
import { setApiResponse as setApiResponse3, HTTP as HTTP3, background as background3, canonicalLocale, defineLocales } from "@fonderie/core";
|
|
1378
1380
|
|
|
1379
1381
|
// src/services/cooldown.ts
|
|
1380
1382
|
function checkCooldown(lastSentAt, cooldownMs) {
|
|
@@ -1574,7 +1576,7 @@ function extractRefreshToken(ctx) {
|
|
|
1574
1576
|
const match = cookie.match(/(?:^|;\s*)refresh_token=([^;]+)/);
|
|
1575
1577
|
return match?.[1] ?? null;
|
|
1576
1578
|
}
|
|
1577
|
-
function authController(store, config, bus) {
|
|
1579
|
+
function authController(store, config, bus, locales = defineLocales()) {
|
|
1578
1580
|
const users = new UserModel(store);
|
|
1579
1581
|
const sessions = new SessionModel(store, config.location);
|
|
1580
1582
|
const loginEvents = new LoginEventModel(store, config.location);
|
|
@@ -1586,6 +1588,7 @@ function authController(store, config, bus) {
|
|
|
1586
1588
|
register: async (ctx) => {
|
|
1587
1589
|
const body = ctx.meta["body"];
|
|
1588
1590
|
const { email: email2, password: password2, phone: phone2, firstName = null, lastName = null } = body ?? {};
|
|
1591
|
+
const locale = canonicalLocale(body?.["locale"]) ?? locales.default;
|
|
1589
1592
|
if (typeof email2 === "string" && typeof password2 === "string") {
|
|
1590
1593
|
const normalizedEmail = normalizeEmailSafe(email2);
|
|
1591
1594
|
if (!normalizedEmail) {
|
|
@@ -1607,7 +1610,8 @@ function authController(store, config, bus) {
|
|
|
1607
1610
|
normalizedEmail,
|
|
1608
1611
|
passwordHash,
|
|
1609
1612
|
firstName,
|
|
1610
|
-
lastName
|
|
1613
|
+
lastName,
|
|
1614
|
+
locale
|
|
1611
1615
|
);
|
|
1612
1616
|
if (!row) {
|
|
1613
1617
|
return setApiResponse3(HTTP3.SERVER_ERROR, "SERVER_ERROR", "Registration failed");
|
|
@@ -1680,7 +1684,8 @@ function authController(store, config, bus) {
|
|
|
1680
1684
|
const { id } = await users.findOrCreateByPhone(
|
|
1681
1685
|
normalizePhone(phone2),
|
|
1682
1686
|
firstName ?? null,
|
|
1683
|
-
lastName ?? null
|
|
1687
|
+
lastName ?? null,
|
|
1688
|
+
locale
|
|
1684
1689
|
);
|
|
1685
1690
|
const otp = randomInt(1e5, 1e6).toString();
|
|
1686
1691
|
const expiresAt = new Date(Date.now() + OTP_TTL_MS);
|
|
@@ -3091,9 +3096,9 @@ function oauthController(store, config, bus) {
|
|
|
3091
3096
|
}
|
|
3092
3097
|
|
|
3093
3098
|
// src/routes.ts
|
|
3094
|
-
function buildAuthRoutes(store, config, bus) {
|
|
3099
|
+
function buildAuthRoutes(store, config, bus, locales) {
|
|
3095
3100
|
const user = userController(store, config, bus);
|
|
3096
|
-
const auth = authController(store, config, bus);
|
|
3101
|
+
const auth = authController(store, config, bus, locales);
|
|
3097
3102
|
const oauth = oauthController(store, config, bus);
|
|
3098
3103
|
const mfa = mfaController(store, config, config.appName ?? "Fonderie", bus);
|
|
3099
3104
|
const verifyGate = config.requireVerification ? requireVerified : (_ctx, next) => next();
|
|
@@ -3207,20 +3212,27 @@ function collectAuthConfigProblems(config) {
|
|
|
3207
3212
|
problems.push({
|
|
3208
3213
|
module: MODULE,
|
|
3209
3214
|
severity: "error",
|
|
3210
|
-
message: `jwtSecret must be at least ${MIN_SECRET_LENGTH} characters (got ${secret.length})
|
|
3215
|
+
message: `jwtSecret must be at least ${MIN_SECRET_LENGTH} characters (got ${secret.length})`,
|
|
3216
|
+
domain: "auth",
|
|
3217
|
+
reason: "JWT_SECRET_TOO_SHORT",
|
|
3218
|
+
metadata: { min: MIN_SECRET_LENGTH, got: secret.length }
|
|
3211
3219
|
});
|
|
3212
3220
|
} else if (secretProblem === "placeholder") {
|
|
3213
3221
|
problems.push({
|
|
3214
3222
|
module: MODULE,
|
|
3215
3223
|
severity: "error",
|
|
3216
|
-
message: "jwtSecret looks like a placeholder or dev-default value"
|
|
3224
|
+
message: "jwtSecret looks like a placeholder or dev-default value",
|
|
3225
|
+
domain: "auth",
|
|
3226
|
+
reason: "JWT_SECRET_PLACEHOLDER"
|
|
3217
3227
|
});
|
|
3218
3228
|
}
|
|
3219
3229
|
if (config.secureCookies === false) {
|
|
3220
3230
|
problems.push({
|
|
3221
3231
|
module: MODULE,
|
|
3222
3232
|
severity: process.env["NODE_ENV"] === "production" ? "error" : "warning",
|
|
3223
|
-
message: "secureCookies is false \u2014 auth cookies may be sent over non-HTTPS connections in production"
|
|
3233
|
+
message: "secureCookies is false \u2014 auth cookies may be sent over non-HTTPS connections in production",
|
|
3234
|
+
domain: "auth",
|
|
3235
|
+
reason: "INSECURE_COOKIES"
|
|
3224
3236
|
});
|
|
3225
3237
|
}
|
|
3226
3238
|
if (config.google) {
|
|
@@ -3229,13 +3241,17 @@ function collectAuthConfigProblems(config) {
|
|
|
3229
3241
|
problems.push({
|
|
3230
3242
|
module: MODULE,
|
|
3231
3243
|
severity: "error",
|
|
3232
|
-
message: "google OAuth is configured but clientId, clientSecret, or redirectUri is missing"
|
|
3244
|
+
message: "google OAuth is configured but clientId, clientSecret, or redirectUri is missing",
|
|
3245
|
+
domain: "auth",
|
|
3246
|
+
reason: "GOOGLE_INCOMPLETE"
|
|
3233
3247
|
});
|
|
3234
3248
|
} else if (PLACEHOLDER_SECRET.test(clientSecret)) {
|
|
3235
3249
|
problems.push({
|
|
3236
3250
|
module: MODULE,
|
|
3237
3251
|
severity: "error",
|
|
3238
|
-
message: "google.clientSecret looks like a placeholder or dev-default value"
|
|
3252
|
+
message: "google.clientSecret looks like a placeholder or dev-default value",
|
|
3253
|
+
domain: "auth",
|
|
3254
|
+
reason: "GOOGLE_SECRET_PLACEHOLDER"
|
|
3239
3255
|
});
|
|
3240
3256
|
}
|
|
3241
3257
|
}
|
|
@@ -3245,20 +3261,26 @@ function collectAuthConfigProblems(config) {
|
|
|
3245
3261
|
problems.push({
|
|
3246
3262
|
module: MODULE,
|
|
3247
3263
|
severity: "error",
|
|
3248
|
-
message: "apple OAuth is configured but clientId, teamId, keyId, privateKey, or redirectUri is missing"
|
|
3264
|
+
message: "apple OAuth is configured but clientId, teamId, keyId, privateKey, or redirectUri is missing",
|
|
3265
|
+
domain: "auth",
|
|
3266
|
+
reason: "APPLE_INCOMPLETE"
|
|
3249
3267
|
});
|
|
3250
3268
|
} else if (!/-----BEGIN [A-Z ]*PRIVATE KEY-----/.test(a.privateKey)) {
|
|
3251
3269
|
problems.push({
|
|
3252
3270
|
module: MODULE,
|
|
3253
3271
|
severity: "error",
|
|
3254
|
-
message: "apple.privateKey does not look like a PEM .p8 key (expected `-----BEGIN PRIVATE KEY-----`)"
|
|
3272
|
+
message: "apple.privateKey does not look like a PEM .p8 key (expected `-----BEGIN PRIVATE KEY-----`)",
|
|
3273
|
+
domain: "auth",
|
|
3274
|
+
reason: "APPLE_KEY_NOT_PEM"
|
|
3255
3275
|
});
|
|
3256
3276
|
}
|
|
3257
3277
|
if (a.nativeClientIds?.some((id) => !id || id.trim() === "" || id.includes("*"))) {
|
|
3258
3278
|
problems.push({
|
|
3259
3279
|
module: MODULE,
|
|
3260
3280
|
severity: "error",
|
|
3261
|
-
message: "apple.nativeClientIds must be exact bundle ids \u2014 empty or wildcard entries would accept identity tokens minted for other apps"
|
|
3281
|
+
message: "apple.nativeClientIds must be exact bundle ids \u2014 empty or wildcard entries would accept identity tokens minted for other apps",
|
|
3282
|
+
domain: "auth",
|
|
3283
|
+
reason: "APPLE_NATIVE_IDS_INVALID"
|
|
3262
3284
|
});
|
|
3263
3285
|
}
|
|
3264
3286
|
}
|
|
@@ -3266,14 +3288,18 @@ function collectAuthConfigProblems(config) {
|
|
|
3266
3288
|
problems.push({
|
|
3267
3289
|
module: MODULE,
|
|
3268
3290
|
severity: process.env["NODE_ENV"] === "production" ? "error" : "warning",
|
|
3269
|
-
message: "mfa is enabled without mfaSecretKey \u2014 TOTP secrets are stored plaintext at rest; set a 32-byte key (openssl rand -hex 32)"
|
|
3291
|
+
message: "mfa is enabled without mfaSecretKey \u2014 TOTP secrets are stored plaintext at rest; set a 32-byte key (openssl rand -hex 32)",
|
|
3292
|
+
domain: "auth",
|
|
3293
|
+
reason: "MFA_KEY_MISSING"
|
|
3270
3294
|
});
|
|
3271
3295
|
}
|
|
3272
3296
|
if (config.mfaSecretKey && !/^[0-9a-fA-F]{64}$/.test(config.mfaSecretKey)) {
|
|
3273
3297
|
problems.push({
|
|
3274
3298
|
module: MODULE,
|
|
3275
3299
|
severity: "error",
|
|
3276
|
-
message: "mfaSecretKey must be 64 hex characters (32 bytes, e.g. `openssl rand -hex 32`)"
|
|
3300
|
+
message: "mfaSecretKey must be 64 hex characters (32 bytes, e.g. `openssl rand -hex 32`)",
|
|
3301
|
+
domain: "auth",
|
|
3302
|
+
reason: "MFA_KEY_INVALID"
|
|
3277
3303
|
});
|
|
3278
3304
|
}
|
|
3279
3305
|
return problems;
|
|
@@ -3485,7 +3511,7 @@ var AuthModule = class {
|
|
|
3485
3511
|
name = "@fonderie/auth";
|
|
3486
3512
|
// Baked in at build time by tsup.base, so the operator's Modules page can
|
|
3487
3513
|
// say what is actually deployed rather than 'not reported'.
|
|
3488
|
-
version = "7.
|
|
3514
|
+
version = "7.14.0";
|
|
3489
3515
|
// Users, sessions, login history, suspend — only through @fonderie/admin.
|
|
3490
3516
|
describeAdmin() {
|
|
3491
3517
|
return { routes: describeAuthAdminRoutes(this.store) };
|
|
@@ -3496,7 +3522,7 @@ var AuthModule = class {
|
|
|
3496
3522
|
}
|
|
3497
3523
|
install(app) {
|
|
3498
3524
|
app.use(withSession(this.store, this.config));
|
|
3499
|
-
const routes = buildAuthRoutes(this.store, this.config, this.bus);
|
|
3525
|
+
const routes = buildAuthRoutes(this.store, this.config, this.bus, app.locales);
|
|
3500
3526
|
for (const [method, path, ...handlers] of routes) {
|
|
3501
3527
|
app.addRoute(method, path, ...handlers);
|
|
3502
3528
|
}
|
|
@@ -3504,7 +3530,328 @@ var AuthModule = class {
|
|
|
3504
3530
|
};
|
|
3505
3531
|
|
|
3506
3532
|
// src/templates.ts
|
|
3507
|
-
|
|
3533
|
+
import { withTranslations } from "@fonderie/core";
|
|
3534
|
+
|
|
3535
|
+
// src/templates.es.ts
|
|
3536
|
+
var ES_TEMPLATES = {
|
|
3537
|
+
[MESSAGE_KEYS.emailRegistration]: {
|
|
3538
|
+
subject: "Confirma tu cuenta",
|
|
3539
|
+
html: `<h1>Te damos la bienvenida</h1>
|
|
3540
|
+
<p>Hola {{firstName}}:</p>
|
|
3541
|
+
<p>Gracias por registrarte. Confirma tu cuenta con este c\xF3digo:</p>
|
|
3542
|
+
<p><span class="pin-code">{{pin}}</span></p>
|
|
3543
|
+
<p class="muted">Este c\xF3digo caduca en 24 horas. Si no creaste una cuenta, puedes ignorar este correo.</p>`,
|
|
3544
|
+
text: `Te damos la bienvenida
|
|
3545
|
+
|
|
3546
|
+
Hola {{firstName}}:
|
|
3547
|
+
|
|
3548
|
+
Gracias por registrarte. Confirma tu cuenta con este c\xF3digo: {{pin}}
|
|
3549
|
+
|
|
3550
|
+
Este c\xF3digo caduca en 24 horas. Si no creaste una cuenta, puedes ignorar este correo.`
|
|
3551
|
+
},
|
|
3552
|
+
[MESSAGE_KEYS.emailVerification]: {
|
|
3553
|
+
subject: "Tu c\xF3digo de verificaci\xF3n",
|
|
3554
|
+
html: `<h1>Verifica tu correo electr\xF3nico</h1>
|
|
3555
|
+
<p>Hola {{firstName}}:</p>
|
|
3556
|
+
<p>Usa este c\xF3digo para terminar de configurar tu cuenta:</p>
|
|
3557
|
+
<p><span class="pin-code">{{pin}}</span></p>
|
|
3558
|
+
<p class="muted">Este c\xF3digo caduca en 24 horas. Si no creaste una cuenta, puedes ignorar este correo.</p>`,
|
|
3559
|
+
text: `Verifica tu correo electr\xF3nico
|
|
3560
|
+
|
|
3561
|
+
Hola {{firstName}}:
|
|
3562
|
+
|
|
3563
|
+
Usa este c\xF3digo para terminar de configurar tu cuenta: {{pin}}
|
|
3564
|
+
|
|
3565
|
+
Este c\xF3digo caduca en 24 horas. Si no creaste una cuenta, puedes ignorar este correo.`
|
|
3566
|
+
},
|
|
3567
|
+
[MESSAGE_KEYS.passwordReset]: {
|
|
3568
|
+
subject: "Restablece tu contrase\xF1a",
|
|
3569
|
+
html: `<h1>Restablece tu contrase\xF1a</h1>
|
|
3570
|
+
<p>Recibimos una solicitud para restablecer tu contrase\xF1a. Usa este c\xF3digo para continuar:</p>
|
|
3571
|
+
<p><span class="pin-code">{{pin}}</span></p>
|
|
3572
|
+
<p class="muted">Este c\xF3digo caduca pronto. Si no lo solicitaste, no tienes que hacer nada — tu contrase\xF1a sigue siendo la misma.</p>`,
|
|
3573
|
+
text: `Restablece tu contrase\xF1a
|
|
3574
|
+
|
|
3575
|
+
Recibimos una solicitud para restablecer tu contrase\xF1a. Usa este c\xF3digo para continuar: {{pin}}
|
|
3576
|
+
|
|
3577
|
+
Este c\xF3digo caduca pronto. Si no lo solicitaste, no tienes que hacer nada \u2014 tu contrase\xF1a sigue siendo la misma.`
|
|
3578
|
+
},
|
|
3579
|
+
// SMS — text only.
|
|
3580
|
+
[MESSAGE_KEYS.phoneOtp]: {
|
|
3581
|
+
text: "{{otp}} es tu c\xF3digo de verificaci\xF3n. Caduca en 10 minutos."
|
|
3582
|
+
},
|
|
3583
|
+
[MESSAGE_KEYS.mfaEnabled]: {
|
|
3584
|
+
subject: "La verificaci\xF3n en dos pasos est\xE1 activada",
|
|
3585
|
+
html: `<h1>Verificaci\xF3n en dos pasos activada</h1>
|
|
3586
|
+
<p>Se acaba de activar la verificaci\xF3n en dos pasos en tu cuenta. A partir de ahora, introducir\xE1s un c\xF3digo de tu aplicaci\xF3n de autenticaci\xF3n al iniciar sesi\xF3n.</p>
|
|
3587
|
+
<p class="muted">Si no fuiste t\xFA, contacta con soporte de inmediato — alguien podr\xEDa tener acceso a tu cuenta.</p>`,
|
|
3588
|
+
text: `Verificaci\xF3n en dos pasos activada
|
|
3589
|
+
|
|
3590
|
+
Se acaba de activar la verificaci\xF3n en dos pasos en tu cuenta. A partir de ahora, introducir\xE1s un c\xF3digo de tu aplicaci\xF3n de autenticaci\xF3n al iniciar sesi\xF3n.
|
|
3591
|
+
|
|
3592
|
+
Si no fuiste t\xFA, contacta con soporte de inmediato \u2014 alguien podr\xEDa tener acceso a tu cuenta.`
|
|
3593
|
+
},
|
|
3594
|
+
[MESSAGE_KEYS.mfaDisabled]: {
|
|
3595
|
+
subject: "La verificaci\xF3n en dos pasos est\xE1 desactivada",
|
|
3596
|
+
html: `<h1>Verificaci\xF3n en dos pasos desactivada</h1>
|
|
3597
|
+
<p>Se acaba de desactivar la verificaci\xF3n en dos pasos en tu cuenta. Ahora tu cuenta est\xE1 protegida solo por tu contrase\xF1a.</p>
|
|
3598
|
+
<p class="muted">Si no fuiste t\xFA, contacta con soporte de inmediato y vuelve a activar la verificaci\xF3n en dos pasos — alguien podr\xEDa tener acceso a tu cuenta.</p>`,
|
|
3599
|
+
text: `Verificaci\xF3n en dos pasos desactivada
|
|
3600
|
+
|
|
3601
|
+
Se acaba de desactivar la verificaci\xF3n en dos pasos en tu cuenta. Ahora tu cuenta est\xE1 protegida solo por tu contrase\xF1a.
|
|
3602
|
+
|
|
3603
|
+
Si no fuiste t\xFA, contacta con soporte de inmediato y vuelve a activar la verificaci\xF3n en dos pasos \u2014 alguien podr\xEDa tener acceso a tu cuenta.`
|
|
3604
|
+
},
|
|
3605
|
+
[MESSAGE_KEYS.mfaBackupCodesRegenerated]: {
|
|
3606
|
+
subject: "Se regeneraron tus c\xF3digos de respaldo",
|
|
3607
|
+
html: `<h1>Nuevos c\xF3digos de respaldo generados</h1>
|
|
3608
|
+
<p>Se acaba de generar un nuevo conjunto de c\xF3digos de respaldo de verificaci\xF3n en dos pasos para tu cuenta. Tus c\xF3digos anteriores ya no funcionan.</p>
|
|
3609
|
+
<p class="muted">Si no fuiste t\xFA, contacta con soporte de inmediato — alguien podr\xEDa tener acceso a tu cuenta.</p>`,
|
|
3610
|
+
text: `Nuevos c\xF3digos de respaldo generados
|
|
3611
|
+
|
|
3612
|
+
Se acaba de generar un nuevo conjunto de c\xF3digos de respaldo de verificaci\xF3n en dos pasos para tu cuenta. Tus c\xF3digos anteriores ya no funcionan.
|
|
3613
|
+
|
|
3614
|
+
Si no fuiste t\xFA, contacta con soporte de inmediato \u2014 alguien podr\xEDa tener acceso a tu cuenta.`
|
|
3615
|
+
},
|
|
3616
|
+
[MESSAGE_KEYS.emailChanged]: {
|
|
3617
|
+
subject: "Se cambi\xF3 tu direcci\xF3n de correo electr\xF3nico",
|
|
3618
|
+
html: `<h1>Se cambi\xF3 tu correo electr\xF3nico</h1>
|
|
3619
|
+
<p>La direcci\xF3n de correo electr\xF3nico de tu cuenta se acaba de cambiar a <strong>{{newEmail}}</strong>.</p>
|
|
3620
|
+
<p class="muted">Si hiciste este cambio, todo est\xE1 en orden. Si no, contacta con soporte de inmediato — alguien podr\xEDa tener acceso a tu cuenta.</p>`,
|
|
3621
|
+
text: `Se cambi\xF3 tu correo electr\xF3nico
|
|
3622
|
+
|
|
3623
|
+
La direcci\xF3n de correo electr\xF3nico de tu cuenta se acaba de cambiar a {{newEmail}}.
|
|
3624
|
+
|
|
3625
|
+
Si hiciste este cambio, todo est\xE1 en orden. Si no, contacta con soporte de inmediato \u2014 alguien podr\xEDa tener acceso a tu cuenta.`
|
|
3626
|
+
},
|
|
3627
|
+
[MESSAGE_KEYS.phoneChanged]: {
|
|
3628
|
+
subject: "Se cambi\xF3 tu n\xFAmero de tel\xE9fono",
|
|
3629
|
+
html: `<h1>Se cambi\xF3 tu n\xFAmero de tel\xE9fono</h1>
|
|
3630
|
+
<p>El n\xFAmero de tel\xE9fono de tu cuenta se acaba de actualizar.</p>
|
|
3631
|
+
<p class="muted">Si hiciste este cambio, todo est\xE1 en orden. Si no, contacta con soporte de inmediato — alguien podr\xEDa tener acceso a tu cuenta.</p>`,
|
|
3632
|
+
text: `Se cambi\xF3 tu n\xFAmero de tel\xE9fono
|
|
3633
|
+
|
|
3634
|
+
El n\xFAmero de tel\xE9fono de tu cuenta se acaba de actualizar.
|
|
3635
|
+
|
|
3636
|
+
Si hiciste este cambio, todo est\xE1 en orden. Si no, contacta con soporte de inmediato \u2014 alguien podr\xEDa tener acceso a tu cuenta.`
|
|
3637
|
+
},
|
|
3638
|
+
[MESSAGE_KEYS.passwordRevoked]: {
|
|
3639
|
+
subject: "Se elimin\xF3 la contrase\xF1a de tu cuenta",
|
|
3640
|
+
html: `<h1>Se elimin\xF3 tu contrase\xF1a</h1>
|
|
3641
|
+
<p>Acabas de iniciar sesi\xF3n con <strong>{{provider}}</strong>. Esta cuenta ten\xEDa una contrase\xF1a, pero esta direcci\xF3n de correo nunca se hab\xEDa confirmado — as\xED que no pod\xEDamos saber qui\xE9n la estableci\xF3, y se ha eliminado.</p>
|
|
3642
|
+
<p>Iniciar sesi\xF3n con {{provider}} funciona como antes. Si tambi\xE9n quieres una contrase\xF1a, puedes crearla en la configuraci\xF3n de tu cuenta.</p>
|
|
3643
|
+
<p class="muted">Si nunca estableciste una contrase\xF1a aqu\xED, es posible que alguien intentara registrarse con tu direcci\xF3n. No tienes que hacer nada m\xE1s — la cuenta es tuya.</p>`,
|
|
3644
|
+
text: `Se elimin\xF3 tu contrase\xF1a
|
|
3645
|
+
|
|
3646
|
+
Acabas de iniciar sesi\xF3n con {{provider}}. Esta cuenta ten\xEDa una contrase\xF1a, pero
|
|
3647
|
+
esta direcci\xF3n de correo nunca se hab\xEDa confirmado \u2014 as\xED que no pod\xEDamos saber
|
|
3648
|
+
qui\xE9n la estableci\xF3, y se ha eliminado.
|
|
3649
|
+
|
|
3650
|
+
Iniciar sesi\xF3n con {{provider}} funciona como antes. Si tambi\xE9n quieres una
|
|
3651
|
+
contrase\xF1a, puedes crearla en la configuraci\xF3n de tu cuenta.
|
|
3652
|
+
|
|
3653
|
+
Si nunca estableciste una contrase\xF1a aqu\xED, es posible que alguien intentara
|
|
3654
|
+
registrarse con tu direcci\xF3n. No tienes que hacer nada m\xE1s \u2014 la cuenta es tuya.`
|
|
3655
|
+
},
|
|
3656
|
+
[MESSAGE_KEYS.oauthRegistration]: {
|
|
3657
|
+
subject: "Te damos la bienvenida a {{appName}}",
|
|
3658
|
+
html: `<h1>Te damos la bienvenida a {{appName}}</h1>
|
|
3659
|
+
<p>Tu cuenta se cre\xF3 con <strong>{{provider}}</strong>. Inicia sesi\xF3n cuando quieras con la misma cuenta de {{provider}} — no hay ninguna contrase\xF1a que recordar.</p>
|
|
3660
|
+
<p class="muted">Si no creaste esta cuenta, contacta con soporte.</p>`,
|
|
3661
|
+
text: `Te damos la bienvenida
|
|
3662
|
+
|
|
3663
|
+
Tu cuenta se cre\xF3 con {{provider}}. Inicia sesi\xF3n cuando quieras con la misma
|
|
3664
|
+
cuenta de {{provider}} \u2014 no hay ninguna contrase\xF1a que recordar.
|
|
3665
|
+
|
|
3666
|
+
Si no creaste esta cuenta, contacta con soporte.`
|
|
3667
|
+
},
|
|
3668
|
+
[MESSAGE_KEYS.oauthLinked]: {
|
|
3669
|
+
subject: "Se a\xF1adi\xF3 un nuevo m\xE9todo de inicio de sesi\xF3n a tu cuenta",
|
|
3670
|
+
html: `<h1>Se a\xF1adi\xF3 el inicio de sesi\xF3n con {{provider}}</h1>
|
|
3671
|
+
<p>Ahora tambi\xE9n puedes iniciar sesi\xF3n en tu cuenta con <strong>{{provider}}</strong>.</p>
|
|
3672
|
+
<p class="muted">Si fuiste t\xFA, no tienes que hacer nada m\xE1s. Si no, contacta con soporte de inmediato y cambia tu contrase\xF1a — otra persona podr\xEDa iniciar sesi\xF3n como t\xFA.</p>`,
|
|
3673
|
+
text: `Se a\xF1adi\xF3 el inicio de sesi\xF3n con {{provider}}
|
|
3674
|
+
|
|
3675
|
+
Ahora tambi\xE9n puedes iniciar sesi\xF3n en tu cuenta con {{provider}}.
|
|
3676
|
+
|
|
3677
|
+
Si fuiste t\xFA, no tienes que hacer nada m\xE1s. Si no, contacta con soporte de
|
|
3678
|
+
inmediato y cambia tu contrase\xF1a \u2014 otra persona podr\xEDa iniciar sesi\xF3n como t\xFA.`
|
|
3679
|
+
},
|
|
3680
|
+
[MESSAGE_KEYS.oauthUnlinked]: {
|
|
3681
|
+
subject: "Se elimin\xF3 un m\xE9todo de inicio de sesi\xF3n de tu cuenta",
|
|
3682
|
+
html: `<h1>Se elimin\xF3 el inicio de sesi\xF3n con {{provider}}</h1>
|
|
3683
|
+
<p><strong>{{provider}}</strong> ya no se puede usar para iniciar sesi\xF3n. Tu correo electr\xF3nico y tu contrase\xF1a siguen funcionando.</p>
|
|
3684
|
+
<p class="muted">Si fuiste t\xFA, todo est\xE1 en orden. Si no, contacta con soporte de inmediato.</p>`,
|
|
3685
|
+
text: `Se elimin\xF3 el inicio de sesi\xF3n con {{provider}}
|
|
3686
|
+
|
|
3687
|
+
{{provider}} ya no se puede usar para iniciar sesi\xF3n. Tu correo electr\xF3nico y tu contrase\xF1a siguen funcionando.
|
|
3688
|
+
|
|
3689
|
+
Si fuiste t\xFA, todo est\xE1 en orden. Si no, contacta con soporte de inmediato.`
|
|
3690
|
+
}
|
|
3691
|
+
};
|
|
3692
|
+
|
|
3693
|
+
// src/templates.fr.ts
|
|
3694
|
+
var FR_TEMPLATES = {
|
|
3695
|
+
[MESSAGE_KEYS.emailRegistration]: {
|
|
3696
|
+
subject: "Confirmez votre compte",
|
|
3697
|
+
html: `<h1>Bienvenue</h1>
|
|
3698
|
+
<p>Bonjour {{firstName}},</p>
|
|
3699
|
+
<p>Merci pour votre inscription. Confirmez votre compte avec ce code :</p>
|
|
3700
|
+
<p><span class="pin-code">{{pin}}</span></p>
|
|
3701
|
+
<p class="muted">Ce code expire dans 24 heures. Si vous n’avez pas cr\xE9\xE9 de compte, vous pouvez ignorer cet e-mail.</p>`,
|
|
3702
|
+
text: `Bienvenue
|
|
3703
|
+
|
|
3704
|
+
Bonjour {{firstName}},
|
|
3705
|
+
|
|
3706
|
+
Merci pour votre inscription. Confirmez votre compte avec ce code : {{pin}}
|
|
3707
|
+
|
|
3708
|
+
Ce code expire dans 24 heures. Si vous n'avez pas cr\xE9\xE9 de compte, vous pouvez ignorer cet e-mail.`
|
|
3709
|
+
},
|
|
3710
|
+
[MESSAGE_KEYS.emailVerification]: {
|
|
3711
|
+
subject: "Votre code de v\xE9rification",
|
|
3712
|
+
html: `<h1>V\xE9rifiez votre adresse e-mail</h1>
|
|
3713
|
+
<p>Bonjour {{firstName}},</p>
|
|
3714
|
+
<p>Utilisez ce code pour terminer la cr\xE9ation de votre compte :</p>
|
|
3715
|
+
<p><span class="pin-code">{{pin}}</span></p>
|
|
3716
|
+
<p class="muted">Ce code expire dans 24 heures. Si vous n’avez pas cr\xE9\xE9 de compte, vous pouvez ignorer cet e-mail.</p>`,
|
|
3717
|
+
text: `V\xE9rifiez votre adresse e-mail
|
|
3718
|
+
|
|
3719
|
+
Bonjour {{firstName}},
|
|
3720
|
+
|
|
3721
|
+
Utilisez ce code pour terminer la cr\xE9ation de votre compte : {{pin}}
|
|
3722
|
+
|
|
3723
|
+
Ce code expire dans 24 heures. Si vous n'avez pas cr\xE9\xE9 de compte, vous pouvez ignorer cet e-mail.`
|
|
3724
|
+
},
|
|
3725
|
+
[MESSAGE_KEYS.passwordReset]: {
|
|
3726
|
+
subject: "R\xE9initialisez votre mot de passe",
|
|
3727
|
+
html: `<h1>R\xE9initialisez votre mot de passe</h1>
|
|
3728
|
+
<p>Nous avons re\xE7u une demande de r\xE9initialisation de votre mot de passe. Utilisez ce code pour continuer :</p>
|
|
3729
|
+
<p><span class="pin-code">{{pin}}</span></p>
|
|
3730
|
+
<p class="muted">Ce code expire bient\xF4t. Si vous n’avez rien demand\xE9, aucune action n’est n\xE9cessaire — votre mot de passe reste inchang\xE9.</p>`,
|
|
3731
|
+
text: `R\xE9initialisez votre mot de passe
|
|
3732
|
+
|
|
3733
|
+
Nous avons re\xE7u une demande de r\xE9initialisation de votre mot de passe. Utilisez ce code pour continuer : {{pin}}
|
|
3734
|
+
|
|
3735
|
+
Ce code expire bient\xF4t. Si vous n'avez rien demand\xE9, aucune action n'est n\xE9cessaire \u2014 votre mot de passe reste inchang\xE9.`
|
|
3736
|
+
},
|
|
3737
|
+
// SMS — text only.
|
|
3738
|
+
[MESSAGE_KEYS.phoneOtp]: {
|
|
3739
|
+
text: "{{otp}} est votre code de v\xE9rification. Il expire dans 10 minutes."
|
|
3740
|
+
},
|
|
3741
|
+
[MESSAGE_KEYS.mfaEnabled]: {
|
|
3742
|
+
subject: "La double authentification est activ\xE9e",
|
|
3743
|
+
html: `<h1>Double authentification activ\xE9e</h1>
|
|
3744
|
+
<p>La double authentification vient d’\xEAtre activ\xE9e sur votre compte. D\xE9sormais, vous saisirez un code de votre application d’authentification \xE0 chaque connexion.</p>
|
|
3745
|
+
<p class="muted">Si ce n’est pas vous, contactez imm\xE9diatement le support — quelqu’un pourrait avoir acc\xE8s \xE0 votre compte.</p>`,
|
|
3746
|
+
text: `Double authentification activ\xE9e
|
|
3747
|
+
|
|
3748
|
+
La double authentification vient d'\xEAtre activ\xE9e sur votre compte. D\xE9sormais, vous saisirez un code de votre application d'authentification \xE0 chaque connexion.
|
|
3749
|
+
|
|
3750
|
+
Si ce n'est pas vous, contactez imm\xE9diatement le support \u2014 quelqu'un pourrait avoir acc\xE8s \xE0 votre compte.`
|
|
3751
|
+
},
|
|
3752
|
+
[MESSAGE_KEYS.mfaDisabled]: {
|
|
3753
|
+
subject: "La double authentification est d\xE9sactiv\xE9e",
|
|
3754
|
+
html: `<h1>Double authentification d\xE9sactiv\xE9e</h1>
|
|
3755
|
+
<p>La double authentification vient d’\xEAtre d\xE9sactiv\xE9e sur votre compte. Votre compte n’est d\xE9sormais prot\xE9g\xE9 que par votre mot de passe.</p>
|
|
3756
|
+
<p class="muted">Si ce n’est pas vous, contactez imm\xE9diatement le support et r\xE9activez la double authentification — quelqu’un pourrait avoir acc\xE8s \xE0 votre compte.</p>`,
|
|
3757
|
+
text: `Double authentification d\xE9sactiv\xE9e
|
|
3758
|
+
|
|
3759
|
+
La double authentification vient d'\xEAtre d\xE9sactiv\xE9e sur votre compte. Votre compte n'est d\xE9sormais prot\xE9g\xE9 que par votre mot de passe.
|
|
3760
|
+
|
|
3761
|
+
Si ce n'est pas vous, contactez imm\xE9diatement le support et r\xE9activez la double authentification \u2014 quelqu'un pourrait avoir acc\xE8s \xE0 votre compte.`
|
|
3762
|
+
},
|
|
3763
|
+
[MESSAGE_KEYS.mfaBackupCodesRegenerated]: {
|
|
3764
|
+
subject: "Vos codes de secours ont \xE9t\xE9 r\xE9g\xE9n\xE9r\xE9s",
|
|
3765
|
+
html: `<h1>Nouveaux codes de secours g\xE9n\xE9r\xE9s</h1>
|
|
3766
|
+
<p>Une nouvelle s\xE9rie de codes de secours pour la double authentification vient d’\xEAtre g\xE9n\xE9r\xE9e pour votre compte. Vos anciens codes ne fonctionnent plus.</p>
|
|
3767
|
+
<p class="muted">Si ce n’est pas vous, contactez imm\xE9diatement le support — quelqu’un pourrait avoir acc\xE8s \xE0 votre compte.</p>`,
|
|
3768
|
+
text: `Nouveaux codes de secours g\xE9n\xE9r\xE9s
|
|
3769
|
+
|
|
3770
|
+
Une nouvelle s\xE9rie de codes de secours pour la double authentification vient d'\xEAtre g\xE9n\xE9r\xE9e pour votre compte. Vos anciens codes ne fonctionnent plus.
|
|
3771
|
+
|
|
3772
|
+
Si ce n'est pas vous, contactez imm\xE9diatement le support \u2014 quelqu'un pourrait avoir acc\xE8s \xE0 votre compte.`
|
|
3773
|
+
},
|
|
3774
|
+
[MESSAGE_KEYS.emailChanged]: {
|
|
3775
|
+
subject: "Votre adresse e-mail a \xE9t\xE9 modifi\xE9e",
|
|
3776
|
+
html: `<h1>Votre adresse e-mail a \xE9t\xE9 modifi\xE9e</h1>
|
|
3777
|
+
<p>L’adresse e-mail de votre compte vient d’\xEAtre remplac\xE9e par <strong>{{newEmail}}</strong>.</p>
|
|
3778
|
+
<p class="muted">Si vous \xEAtes \xE0 l’origine de ce changement, tout est en ordre. Sinon, contactez imm\xE9diatement le support — quelqu’un pourrait avoir acc\xE8s \xE0 votre compte.</p>`,
|
|
3779
|
+
text: `Votre adresse e-mail a \xE9t\xE9 modifi\xE9e
|
|
3780
|
+
|
|
3781
|
+
L'adresse e-mail de votre compte vient d'\xEAtre remplac\xE9e par {{newEmail}}.
|
|
3782
|
+
|
|
3783
|
+
Si vous \xEAtes \xE0 l'origine de ce changement, tout est en ordre. Sinon, contactez imm\xE9diatement le support \u2014 quelqu'un pourrait avoir acc\xE8s \xE0 votre compte.`
|
|
3784
|
+
},
|
|
3785
|
+
[MESSAGE_KEYS.phoneChanged]: {
|
|
3786
|
+
subject: "Votre num\xE9ro de t\xE9l\xE9phone a \xE9t\xE9 modifi\xE9",
|
|
3787
|
+
html: `<h1>Votre num\xE9ro de t\xE9l\xE9phone a \xE9t\xE9 modifi\xE9</h1>
|
|
3788
|
+
<p>Le num\xE9ro de t\xE9l\xE9phone de votre compte vient d’\xEAtre mis \xE0 jour.</p>
|
|
3789
|
+
<p class="muted">Si vous \xEAtes \xE0 l’origine de ce changement, tout est en ordre. Sinon, contactez imm\xE9diatement le support — quelqu’un pourrait avoir acc\xE8s \xE0 votre compte.</p>`,
|
|
3790
|
+
text: `Votre num\xE9ro de t\xE9l\xE9phone a \xE9t\xE9 modifi\xE9
|
|
3791
|
+
|
|
3792
|
+
Le num\xE9ro de t\xE9l\xE9phone de votre compte vient d'\xEAtre mis \xE0 jour.
|
|
3793
|
+
|
|
3794
|
+
Si vous \xEAtes \xE0 l'origine de ce changement, tout est en ordre. Sinon, contactez imm\xE9diatement le support \u2014 quelqu'un pourrait avoir acc\xE8s \xE0 votre compte.`
|
|
3795
|
+
},
|
|
3796
|
+
[MESSAGE_KEYS.passwordRevoked]: {
|
|
3797
|
+
subject: "Le mot de passe de votre compte a \xE9t\xE9 supprim\xE9",
|
|
3798
|
+
html: `<h1>Votre mot de passe a \xE9t\xE9 supprim\xE9</h1>
|
|
3799
|
+
<p>Vous venez de vous connecter avec <strong>{{provider}}</strong>. Un mot de passe avait \xE9t\xE9 d\xE9fini sur ce compte, mais cette adresse e-mail n’avait jamais \xE9t\xE9 confirm\xE9e — nous ne pouvions donc pas savoir qui l’avait d\xE9fini, et il a \xE9t\xE9 supprim\xE9.</p>
|
|
3800
|
+
<p>La connexion avec {{provider}} fonctionne comme avant. Si vous souhaitez aussi un mot de passe, d\xE9finissez-en un dans les param\xE8tres de votre compte.</p>
|
|
3801
|
+
<p class="muted">Si vous n’avez jamais d\xE9fini de mot de passe ici, quelqu’un a peut-\xEAtre tent\xE9 de s’inscrire avec votre adresse. Vous n’avez rien d’autre \xE0 faire — le compte vous appartient.</p>`,
|
|
3802
|
+
text: `Votre mot de passe a \xE9t\xE9 supprim\xE9
|
|
3803
|
+
|
|
3804
|
+
Vous venez de vous connecter avec {{provider}}. Un mot de passe avait \xE9t\xE9 d\xE9fini
|
|
3805
|
+
sur ce compte, mais cette adresse e-mail n'avait jamais \xE9t\xE9 confirm\xE9e \u2014 nous ne
|
|
3806
|
+
pouvions donc pas savoir qui l'avait d\xE9fini, et il a \xE9t\xE9 supprim\xE9.
|
|
3807
|
+
|
|
3808
|
+
La connexion avec {{provider}} fonctionne comme avant. Si vous souhaitez aussi un
|
|
3809
|
+
mot de passe, d\xE9finissez-en un dans les param\xE8tres de votre compte.
|
|
3810
|
+
|
|
3811
|
+
Si vous n'avez jamais d\xE9fini de mot de passe ici, quelqu'un a peut-\xEAtre tent\xE9 de
|
|
3812
|
+
s'inscrire avec votre adresse. Vous n'avez rien d'autre \xE0 faire \u2014 le compte vous
|
|
3813
|
+
appartient.`
|
|
3814
|
+
},
|
|
3815
|
+
[MESSAGE_KEYS.oauthRegistration]: {
|
|
3816
|
+
subject: "Bienvenue sur {{appName}}",
|
|
3817
|
+
html: `<h1>Bienvenue sur {{appName}}</h1>
|
|
3818
|
+
<p>Votre compte a \xE9t\xE9 cr\xE9\xE9 avec <strong>{{provider}}</strong>. Connectez-vous \xE0 tout moment avec ce m\xEAme compte {{provider}} — aucun mot de passe \xE0 retenir.</p>
|
|
3819
|
+
<p class="muted">Si vous n’avez pas cr\xE9\xE9 ce compte, contactez le support.</p>`,
|
|
3820
|
+
text: `Bienvenue
|
|
3821
|
+
|
|
3822
|
+
Votre compte a \xE9t\xE9 cr\xE9\xE9 avec {{provider}}. Connectez-vous \xE0 tout moment avec ce
|
|
3823
|
+
m\xEAme compte {{provider}} \u2014 aucun mot de passe \xE0 retenir.
|
|
3824
|
+
|
|
3825
|
+
Si vous n'avez pas cr\xE9\xE9 ce compte, contactez le support.`
|
|
3826
|
+
},
|
|
3827
|
+
[MESSAGE_KEYS.oauthLinked]: {
|
|
3828
|
+
subject: "Une nouvelle m\xE9thode de connexion a \xE9t\xE9 ajout\xE9e \xE0 votre compte",
|
|
3829
|
+
html: `<h1>Connexion avec {{provider}} ajout\xE9e</h1>
|
|
3830
|
+
<p>Vous pouvez d\xE9sormais aussi vous connecter \xE0 votre compte avec <strong>{{provider}}</strong>.</p>
|
|
3831
|
+
<p class="muted">Si c’est bien vous, vous n’avez rien d’autre \xE0 faire. Sinon, contactez imm\xE9diatement le support et changez votre mot de passe — quelqu’un d’autre pourrait se connecter \xE0 votre place.</p>`,
|
|
3832
|
+
text: `Connexion avec {{provider}} ajout\xE9e
|
|
3833
|
+
|
|
3834
|
+
Vous pouvez d\xE9sormais aussi vous connecter \xE0 votre compte avec {{provider}}.
|
|
3835
|
+
|
|
3836
|
+
Si c'est bien vous, vous n'avez rien d'autre \xE0 faire. Sinon, contactez
|
|
3837
|
+
imm\xE9diatement le support et changez votre mot de passe \u2014 quelqu'un d'autre
|
|
3838
|
+
pourrait se connecter \xE0 votre place.`
|
|
3839
|
+
},
|
|
3840
|
+
[MESSAGE_KEYS.oauthUnlinked]: {
|
|
3841
|
+
subject: "Une m\xE9thode de connexion a \xE9t\xE9 retir\xE9e de votre compte",
|
|
3842
|
+
html: `<h1>Connexion avec {{provider}} retir\xE9e</h1>
|
|
3843
|
+
<p><strong>{{provider}}</strong> ne peut plus \xEAtre utilis\xE9 pour vous connecter. Votre adresse e-mail et votre mot de passe fonctionnent toujours.</p>
|
|
3844
|
+
<p class="muted">Si c’est bien vous, tout est en ordre. Sinon, contactez imm\xE9diatement le support.</p>`,
|
|
3845
|
+
text: `Connexion avec {{provider}} retir\xE9e
|
|
3846
|
+
|
|
3847
|
+
{{provider}} ne peut plus \xEAtre utilis\xE9 pour vous connecter. Votre adresse e-mail et votre mot de passe fonctionnent toujours.
|
|
3848
|
+
|
|
3849
|
+
Si c'est bien vous, tout est en ordre. Sinon, contactez imm\xE9diatement le support.`
|
|
3850
|
+
}
|
|
3851
|
+
};
|
|
3852
|
+
|
|
3853
|
+
// src/templates.ts
|
|
3854
|
+
var EN_TEMPLATES = {
|
|
3508
3855
|
[MESSAGE_KEYS.emailRegistration]: {
|
|
3509
3856
|
subject: "Confirm your account",
|
|
3510
3857
|
html: `<h1>Welcome aboard</h1>
|
|
@@ -3660,6 +4007,7 @@ change your password \u2014 someone else may be able to sign in as you.`
|
|
|
3660
4007
|
If you did this, you're all set. If not, contact support right away.`
|
|
3661
4008
|
}
|
|
3662
4009
|
};
|
|
4010
|
+
var DEFAULT_TEMPLATES = withTranslations(EN_TEMPLATES, { fr: FR_TEMPLATES, es: ES_TEMPLATES });
|
|
3663
4011
|
var SAMPLE_PAYLOADS = {
|
|
3664
4012
|
[MESSAGE_KEYS.passwordRevoked]: { provider: "Google" },
|
|
3665
4013
|
[MESSAGE_KEYS.oauthRegistration]: { provider: "Google", appName: "Fonderie" },
|