@0x0501/mystack 0.0.0-stage → 0.1.0-bootstrap.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/LICENSE +21 -0
- package/README.md +68 -2
- package/assets/auth.sqlite.schema.ts +479 -0
- package/assets/bun-sqlite.test.ts +46 -0
- package/assets/d1.test.ts +41 -0
- package/assets/drizzle.config.ts +2 -0
- package/assets/generate-auth-schema.mjs +25 -0
- package/assets/platform.sqlite.schema.ts +46 -0
- package/assets/polar-checkout.ts +10 -0
- package/assets/polar-route.ts +19 -0
- package/assets/polar.test.ts +30 -0
- package/assets/polar.ts +12 -0
- package/assets/purchase.bun-sqlite.ts +38 -0
- package/assets/purchase.sqlite.ts +39 -0
- package/assets/sqlite-migrations/0000_thin_phalanx.sql +295 -0
- package/assets/sqlite-migrations/meta/0000_snapshot.json +2058 -0
- package/assets/sqlite-migrations/meta/_journal.json +13 -0
- package/assets/turso.test.ts +40 -0
- package/package.json +44 -5
- package/src/adapters/database.mjs +448 -0
- package/src/adapters/deployment.mjs +101 -0
- package/src/adapters/email.mjs +75 -0
- package/src/adapters/payments.mjs +270 -0
- package/src/catalog.mjs +128 -0
- package/src/cli.mjs +294 -0
- package/src/generate.mjs +183 -0
- package/src/template.mjs +93 -0
- package/template/.env.docker +16 -0
- package/template/.env.example +67 -0
- package/template/DESIGN.md +58 -0
- package/template/LICENSE +21 -0
- package/template/biome.json +46 -0
- package/template/docker-compose.yml +47 -0
- package/template/docs/project-guide.md +61 -0
- package/template/drizzle/0000_create-app-role.sql +54 -0
- package/template/drizzle/0001_add-rls-context.sql +21 -0
- package/template/drizzle/0002_platform_tables.sql +320 -0
- package/template/drizzle/meta/0002_snapshot.json +2125 -0
- package/template/drizzle/meta/_journal.json +27 -0
- package/template/drizzle.config.ts +25 -0
- package/template/e2e/authenticated-ui.spec.ts +40 -0
- package/template/e2e/headless-design.spec.ts +66 -0
- package/template/e2e/navigation-loading.spec.ts +70 -0
- package/template/e2e/theme-responsive.spec.ts +260 -0
- package/template/gitignore +24 -0
- package/template/messages/de.json +212 -0
- package/template/messages/en.json +212 -0
- package/template/package.json +101 -0
- package/template/paraglide.config.ts +49 -0
- package/template/playwright.config.ts +58 -0
- package/template/project.inlang/settings.json +12 -0
- package/template/public/drizzle.svg +1 -0
- package/template/public/favicon.ico +0 -0
- package/template/public/logo192.png +0 -0
- package/template/public/logo512.png +0 -0
- package/template/public/manifest.json +25 -0
- package/template/public/robots.txt +3 -0
- package/template/scripts/check-client-bundle.ts +150 -0
- package/template/scripts/check-server-fns.ts +290 -0
- package/template/scripts/check-sql-raw.ts +50 -0
- package/template/scripts/compile-paraglide.ts +12 -0
- package/template/scripts/postgres/README.md +76 -0
- package/template/scripts/postgres/create-app-role.sh +60 -0
- package/template/scripts/seed-local.ts +331 -0
- package/template/scripts/validate-prod-env.ts +53 -0
- package/template/src/__tests__/README.md +9 -0
- package/template/src/__tests__/account-security.test.ts +664 -0
- package/template/src/__tests__/admin-http-surface.test.ts +311 -0
- package/template/src/__tests__/admin-peer-protection.test.ts +178 -0
- package/template/src/__tests__/auth-harness.ts +104 -0
- package/template/src/__tests__/auth-rate-limit.test.ts +43 -0
- package/template/src/__tests__/auth-redirect.test.ts +120 -0
- package/template/src/__tests__/body-limit.test.ts +47 -0
- package/template/src/__tests__/creem.test.ts +62 -0
- package/template/src/__tests__/demo-checkout.test.ts +141 -0
- package/template/src/__tests__/email-locale.test.ts +110 -0
- package/template/src/__tests__/global-setup.ts +80 -0
- package/template/src/__tests__/input-rules.test.ts +0 -0
- package/template/src/__tests__/message-parity.test.ts +38 -0
- package/template/src/__tests__/navigation-loading.test.tsx +252 -0
- package/template/src/__tests__/nowpayments.test.ts +106 -0
- package/template/src/__tests__/paraglide-url-contract.test.ts +87 -0
- package/template/src/__tests__/purchase-fulfillment.test.ts +204 -0
- package/template/src/__tests__/query-unauthorized-redirect.test.ts +95 -0
- package/template/src/__tests__/rls-policy.test.ts +120 -0
- package/template/src/__tests__/same-page-locale-href.test.ts +47 -0
- package/template/src/__tests__/search-params-oauth.test.ts +57 -0
- package/template/src/__tests__/security-headers.test.ts +12 -0
- package/template/src/__tests__/server-fn-error-contract.test.ts +173 -0
- package/template/src/__tests__/stripe.test.ts +84 -0
- package/template/src/__tests__/test-db.ts +32 -0
- package/template/src/__tests__/test-rls-db.ts +23 -0
- package/template/src/__tests__/user-update-guard.test.ts +109 -0
- package/template/src/components/LocaleSwitcher.tsx +79 -0
- package/template/src/components/ThemeToggle.tsx +47 -0
- package/template/src/components/auth/social.tsx +90 -0
- package/template/src/components/auth/turnstile.tsx +67 -0
- package/template/src/components/root/navigation-progress.tsx +32 -0
- package/template/src/components/root/not-found.tsx +20 -0
- package/template/src/components/root/pending.tsx +9 -0
- package/template/src/components/root/root-document.tsx +37 -0
- package/template/src/components/root/root-error.tsx +34 -0
- package/template/src/components/shells.tsx +201 -0
- package/template/src/components/ui/styles.ts +9 -0
- package/template/src/db/auth.schema.ts +455 -0
- package/template/src/db/helper.ts +38 -0
- package/template/src/db/index.ts +15 -0
- package/template/src/db/platform.schema.ts +122 -0
- package/template/src/db/schema.ts +2 -0
- package/template/src/env.ts +65 -0
- package/template/src/hooks/use-theme.ts +32 -0
- package/template/src/integrations/better-auth/header-user.tsx +36 -0
- package/template/src/integrations/better-auth/session-query.ts +11 -0
- package/template/src/integrations/react-email/PasswordOtpEmail.tsx +62 -0
- package/template/src/integrations/react-email/ResetPasswordEmail.tsx +64 -0
- package/template/src/integrations/react-email/VerifyEmail.tsx +72 -0
- package/template/src/integrations/react-email/theme.ts +75 -0
- package/template/src/integrations/tanstack-query/devtools.tsx +6 -0
- package/template/src/integrations/tanstack-query/root-provider.tsx +60 -0
- package/template/src/lib/auth-client.ts +27 -0
- package/template/src/lib/auth-paths.ts +94 -0
- package/template/src/lib/auth-plugins/existing-email-signup.ts +86 -0
- package/template/src/lib/auth-plugins/field-rules.ts +84 -0
- package/template/src/lib/auth-plugins/social-two-factor.ts +194 -0
- package/template/src/lib/auth-timing.ts +9 -0
- package/template/src/lib/auth.ts +279 -0
- package/template/src/lib/captcha.ts +11 -0
- package/template/src/lib/email.tsx +162 -0
- package/template/src/lib/github.ts +18 -0
- package/template/src/lib/locale-cookie.ts +12 -0
- package/template/src/lib/localized-pages.ts +25 -0
- package/template/src/lib/oauth-metadata.ts +19 -0
- package/template/src/lib/permissions.ts +29 -0
- package/template/src/lib/security-headers.ts +20 -0
- package/template/src/lib/site.ts +59 -0
- package/template/src/lib/theme.ts +42 -0
- package/template/src/lib/user-update-guard.ts +35 -0
- package/template/src/middlewares/admin.ts +46 -0
- package/template/src/middlewares/auth-rate-limit.ts +37 -0
- package/template/src/middlewares/better-auth.ts +15 -0
- package/template/src/middlewares/body-limit.ts +62 -0
- package/template/src/middlewares/database.ts +13 -0
- package/template/src/middlewares/protected.ts +45 -0
- package/template/src/routeTree.gen.ts +536 -0
- package/template/src/router.tsx +53 -0
- package/template/src/routes/[.]well-known/oauth-authorization-server/api/auth.ts +18 -0
- package/template/src/routes/[.]well-known/oauth-protected-resource/index.ts +32 -0
- package/template/src/routes/__root.tsx +175 -0
- package/template/src/routes/admin/audit.tsx +74 -0
- package/template/src/routes/admin/index.tsx +7 -0
- package/template/src/routes/admin/oauth-apps.tsx +164 -0
- package/template/src/routes/admin/route.tsx +27 -0
- package/template/src/routes/admin/users.tsx +215 -0
- package/template/src/routes/api/auth/$.ts +14 -0
- package/template/src/routes/api/auth/[.]well-known/openid-configuration.ts +15 -0
- package/template/src/routes/api/webhooks/creem.ts +69 -0
- package/template/src/routes/api/webhooks/nowpayments.ts +62 -0
- package/template/src/routes/api/webhooks/stripe.ts +74 -0
- package/template/src/routes/dashboard/account.tsx +430 -0
- package/template/src/routes/dashboard/index.tsx +128 -0
- package/template/src/routes/dashboard/route.tsx +17 -0
- package/template/src/routes/forgot-password.tsx +65 -0
- package/template/src/routes/index.tsx +85 -0
- package/template/src/routes/oauth/consent.tsx +77 -0
- package/template/src/routes/reset-password.tsx +78 -0
- package/template/src/routes/sign-in.tsx +174 -0
- package/template/src/routes/sign-up.tsx +135 -0
- package/template/src/routes/two-factor.tsx +74 -0
- package/template/src/server/README.md +3 -0
- package/template/src/server/account-security.ts +163 -0
- package/template/src/server/admin-audit.ts +37 -0
- package/template/src/server/admin-users.ts +112 -0
- package/template/src/server/auth.ts +44 -0
- package/template/src/server/demo-checkout.ts +67 -0
- package/template/src/server/oauth-clients.ts +83 -0
- package/template/src/server/payment-toggles.ts +39 -0
- package/template/src/server.ts +20 -0
- package/template/src/services/README.md +3 -0
- package/template/src/services/account-security.ts +893 -0
- package/template/src/services/admin-security.ts +164 -0
- package/template/src/services/admin-users.ts +181 -0
- package/template/src/services/auth-rate-limit.ts +32 -0
- package/template/src/services/creem.ts +83 -0
- package/template/src/services/demo-checkout.ts +100 -0
- package/template/src/services/nowpayments.ts +154 -0
- package/template/src/services/oauth-client.ts +85 -0
- package/template/src/services/oauth-clients.ts +15 -0
- package/template/src/services/payment-providers.ts +157 -0
- package/template/src/services/payment-toggles.ts +48 -0
- package/template/src/services/purchase.ts +233 -0
- package/template/src/services/stripe.ts +106 -0
- package/template/src/start.ts +35 -0
- package/template/src/styles/layout.css +93 -0
- package/template/src/styles/theme.css +84 -0
- package/template/src/styles/ui.css +233 -0
- package/template/src/styles.css +90 -0
- package/template/src/utils/api-error.ts +129 -0
- package/template/src/utils/auth-errors.ts +157 -0
- package/template/src/utils/auth-redirect.ts +61 -0
- package/template/src/utils/body-limit.ts +84 -0
- package/template/src/utils/cn.ts +6 -0
- package/template/src/utils/input-rules.ts +172 -0
- package/template/src/utils/locale-paths.ts +18 -0
- package/template/src/utils/same-page-locale-href.ts +20 -0
- package/template/src/utils/search-params.ts +71 -0
- package/template/tsconfig.json +30 -0
- package/template/tsr.config.json +6 -0
- package/template/vite.config.ts +24 -0
- package/template/vitest.config.ts +26 -0
- package/template/worker-configuration.d.ts +14660 -0
- package/template/wrangler.jsonc +39 -0
|
@@ -0,0 +1,212 @@
|
|
|
1
|
+
{
|
|
2
|
+
"$schema": "https://inlang.com/schema/inlang-message-format",
|
|
3
|
+
"account_2fa_disabled": "Zwei-Faktor-Authentifizierung deaktiviert.",
|
|
4
|
+
"account_2fa_enroll_hint": "Scanne die URI oder sichere deine Backup-Codes und bestätige anschließend mit deinem Authenticator.",
|
|
5
|
+
"account_2fa_label": "Zwei-Faktor",
|
|
6
|
+
"account_begin_2fa": "Zwei-Faktor-Einrichtung starten",
|
|
7
|
+
"account_change_password_title": "Passwort ändern (Code per E-Mail)",
|
|
8
|
+
"account_disable_2fa": "Zwei-Faktor deaktivieren",
|
|
9
|
+
"account_email_enrollment_code": "Registrierungscode per E-Mail senden",
|
|
10
|
+
"account_email_label": "E-Mail",
|
|
11
|
+
"account_err_already_enabled": "Die Zwei-Faktor-Authentifizierung ist bereits aktiviert.",
|
|
12
|
+
"account_err_cooldown": "Bitte warte, bevor du einen neuen Code anforderst.",
|
|
13
|
+
"account_err_email_not_found": "Zu dieser E-Mail-Adresse gibt es kein Konto.",
|
|
14
|
+
"account_err_github_email_unverified": "Deine GitHub-E-Mail-Adresse ist bei GitHub nicht bestätigt.",
|
|
15
|
+
"account_err_invalid_code": "Dieser Code ist ungültig.",
|
|
16
|
+
"account_err_not_enabled": "Die Zwei-Faktor-Authentifizierung ist nicht aktiviert.",
|
|
17
|
+
"account_err_not_fresh": "Bitte melde dich erneut an und versuche es dann noch einmal.",
|
|
18
|
+
"account_err_too_many_attempts": "Zu viele Versuche. Bitte später erneut versuchen.",
|
|
19
|
+
"account_err_totp_required": "Gib deinen Authenticator-Code ein, um fortzufahren.",
|
|
20
|
+
"account_err_unauthorized": "Du bist nicht angemeldet.",
|
|
21
|
+
"account_field_enrollment_otp": "Registrierungscode",
|
|
22
|
+
"account_field_new_password": "Neues Passwort",
|
|
23
|
+
"account_field_otp": "Code",
|
|
24
|
+
"account_field_totp_disable": "Authenticator-Code zum Deaktivieren der Zwei-Faktor-Authentifizierung",
|
|
25
|
+
"account_github_label": "GitHub",
|
|
26
|
+
"account_github_linked": "verknüpft",
|
|
27
|
+
"account_github_not_linked": "nicht verknüpft",
|
|
28
|
+
"account_no_passkeys": "Keine Passkeys registriert.",
|
|
29
|
+
"account_off": "aus",
|
|
30
|
+
"account_on": "an",
|
|
31
|
+
"account_otp_sent": "Code gesendet. Ein neuer Code ist in {seconds}s möglich.",
|
|
32
|
+
"account_passkey_hint": "Füge einen Passkey aus einer frischen Sitzung über die Passkey-Abfrage deines Browsers hinzu.",
|
|
33
|
+
"account_passkey_removed": "Passkey entfernt.",
|
|
34
|
+
"account_passkeys_label": "Passkeys",
|
|
35
|
+
"account_password_label": "Passwort",
|
|
36
|
+
"account_password_none": "keins",
|
|
37
|
+
"account_password_set": "gesetzt",
|
|
38
|
+
"account_password_updated": "Passwort aktualisiert; andere Sitzungen wurden abgemeldet.",
|
|
39
|
+
"account_profile_saved": "Profil gespeichert.",
|
|
40
|
+
"account_reauth_emailed": "Code zur erneuten Anmeldung an deine E-Mail-Adresse gesendet.",
|
|
41
|
+
"account_remove": "Entfernen",
|
|
42
|
+
"account_revoke_other_sessions": "Andere Sitzungen widerrufen",
|
|
43
|
+
"account_save_profile": "Profil speichern",
|
|
44
|
+
"account_section_passkeys": "Passkeys",
|
|
45
|
+
"account_section_two_factor": "Zwei-Faktor",
|
|
46
|
+
"account_send_otp": "Code an meine E-Mail-Adresse senden",
|
|
47
|
+
"account_session_current": "aktuell",
|
|
48
|
+
"account_sessions_revoked": "Andere Sitzungen widerrufen.",
|
|
49
|
+
"account_tab_profile": "Profil",
|
|
50
|
+
"account_tab_security": "Sicherheit",
|
|
51
|
+
"account_tab_sessions": "Sitzungen",
|
|
52
|
+
"account_title": "Konto",
|
|
53
|
+
"account_unverified": "nicht bestätigt",
|
|
54
|
+
"account_update_failed": "Aktualisierung fehlgeschlagen.",
|
|
55
|
+
"account_update_password": "Passwort aktualisieren",
|
|
56
|
+
"account_verified": "bestätigt",
|
|
57
|
+
"action_continue": "Weiter",
|
|
58
|
+
"action_save": "Speichern",
|
|
59
|
+
"action_sign_out": "Abmelden",
|
|
60
|
+
"admin_audit_empty": "Noch keine Audit-Ereignisse.",
|
|
61
|
+
"admin_audit_title": "Audit-Log",
|
|
62
|
+
"admin_col_action": "Aktion",
|
|
63
|
+
"admin_col_actions": "Aktionen",
|
|
64
|
+
"admin_col_actor": "Akteur",
|
|
65
|
+
"admin_col_detail": "Detail",
|
|
66
|
+
"admin_col_email": "E-Mail",
|
|
67
|
+
"admin_col_name": "Name",
|
|
68
|
+
"admin_col_role": "Rolle",
|
|
69
|
+
"admin_col_status": "Status",
|
|
70
|
+
"admin_col_target": "Ziel",
|
|
71
|
+
"admin_col_when": "Zeitpunkt",
|
|
72
|
+
"admin_oauth_create_client": "Client erstellen",
|
|
73
|
+
"admin_oauth_empty": "Noch keine OAuth-Clients.",
|
|
74
|
+
"admin_oauth_field_name": "Name",
|
|
75
|
+
"admin_oauth_field_redirect_uris": "Redirect-URIs (eine pro Zeile)",
|
|
76
|
+
"admin_oauth_registered_clients": "Registrierte Clients",
|
|
77
|
+
"admin_oauth_title": "OAuth-Apps",
|
|
78
|
+
"admin_payment_toggles": "Zahlungsmethoden",
|
|
79
|
+
"admin_payment_toggles_hint": "Deaktivierte Wege werden serverseitig abgelehnt (nicht nur in der UI).",
|
|
80
|
+
"admin_title": "Admin-Konsole",
|
|
81
|
+
"admin_users_search_placeholder": "E-Mail oder Name suchen",
|
|
82
|
+
"admin_users_title": "Benutzer",
|
|
83
|
+
"app_name": "TanStack Starter",
|
|
84
|
+
"auth_back_to_dashboard": "Zurück zum Dashboard",
|
|
85
|
+
"auth_back_to_sign_in": "Zurück zur Anmeldung",
|
|
86
|
+
"auth_captcha_required": "Bitte Captcha abschließen.",
|
|
87
|
+
"auth_check_email": "Prüfen Sie Ihre E-Mail, um das Konto zu bestätigen.",
|
|
88
|
+
"auth_consent_approve": "Genehmigen",
|
|
89
|
+
"auth_consent_blurb": "Eine Anwendung möchte auf Ihr Konto zugreifen. Nur genehmigen, wenn Sie ihr vertrauen.",
|
|
90
|
+
"auth_consent_deny": "Ablehnen",
|
|
91
|
+
"auth_consent_failed": "Zustimmung fehlgeschlagen.",
|
|
92
|
+
"auth_consent_title": "Anwendung autorisieren",
|
|
93
|
+
"auth_continue_github": "Mit GitHub fortfahren",
|
|
94
|
+
"auth_creating": "Erstellen…",
|
|
95
|
+
"auth_error_generic": "Etwas ist schiefgelaufen. Bitte erneut versuchen.",
|
|
96
|
+
"auth_error_network": "Netzwerkfehler. Bitte Verbindung prüfen und erneut versuchen.",
|
|
97
|
+
"auth_forgot_title": "Passwort vergessen",
|
|
98
|
+
"auth_github_failed": "GitHub-Anmeldung fehlgeschlagen.",
|
|
99
|
+
"auth_have_account": "Bereits ein Konto?",
|
|
100
|
+
"auth_invalid_code": "Ungültiger Code.",
|
|
101
|
+
"auth_missing_reset_token": "Reset-Token fehlt.",
|
|
102
|
+
"auth_no_account": "Noch kein Konto?",
|
|
103
|
+
"auth_oauth_account_not_linked": "Es existiert bereits ein Konto mit dieser E-Mail-Adresse. Melde dich mit deinem Passwort an und verknüpfe GitHub anschließend auf deiner Kontoseite.",
|
|
104
|
+
"auth_oauth_email_unverified": "Deine GitHub-E-Mail-Adresse ist bei GitHub nicht bestätigt. Bestätige sie dort und versuche es erneut, oder registriere dich mit deiner E-Mail-Adresse und verknüpfe GitHub später.",
|
|
105
|
+
"auth_oauth_generic": "Die GitHub-Anmeldung wurde nicht abgeschlossen. Bitte erneut versuchen.",
|
|
106
|
+
"auth_oauth_no_email": "GitHub hat keine E-Mail-Adresse für dein Konto übermittelt. Registriere dich zuerst mit deiner E-Mail-Adresse und verknüpfe GitHub anschließend auf deiner Kontoseite.",
|
|
107
|
+
"auth_or": "oder",
|
|
108
|
+
"auth_passkey_failed": "Passkey-Anmeldung abgebrochen oder kein Passkey eingerichtet.",
|
|
109
|
+
"auth_password_hint": "8–32 Zeichen, mit Buchstabe, Ziffer und Symbol.",
|
|
110
|
+
"auth_redirecting": "Weiterleitung…",
|
|
111
|
+
"auth_reset_failed": "Zurücksetzen fehlgeschlagen.",
|
|
112
|
+
"auth_reset_link_sent": "Wenn diese Adresse ein Konto hat, ist ein Reset-Link unterwegs.",
|
|
113
|
+
"auth_reset_title": "Neues Passwort setzen",
|
|
114
|
+
"auth_saving": "Speichern…",
|
|
115
|
+
"auth_send_reset_link": "Reset-Link senden",
|
|
116
|
+
"auth_sending": "Senden…",
|
|
117
|
+
"auth_sign_in_failed": "Anmeldung fehlgeschlagen.",
|
|
118
|
+
"auth_sign_in_title": "Anmelden",
|
|
119
|
+
"auth_sign_up_failed": "Registrierung fehlgeschlagen.",
|
|
120
|
+
"auth_sign_up_title": "Konto erstellen",
|
|
121
|
+
"auth_signing_in": "Anmeldung…",
|
|
122
|
+
"auth_signup_github": "Mit GitHub registrieren",
|
|
123
|
+
"auth_two_factor_blurb": "Code aus der Authenticator-App oder Backup-Code eingeben.",
|
|
124
|
+
"auth_two_factor_title": "Zwei-Faktor-Authentifizierung",
|
|
125
|
+
"auth_update_password": "Passwort aktualisieren",
|
|
126
|
+
"auth_use_passkey": "Passkey verwenden",
|
|
127
|
+
"auth_verify": "Bestätigen",
|
|
128
|
+
"auth_verify_generic": "Die E-Mail-Bestätigung wurde nicht abgeschlossen. Bitte erneut versuchen.",
|
|
129
|
+
"auth_verify_token_expired": "Dieser Bestätigungslink ist abgelaufen. Bitte einen neuen anfordern.",
|
|
130
|
+
"auth_verify_token_invalid": "Dieser Bestätigungslink ist ungültig. Bitte einen neuen anfordern.",
|
|
131
|
+
"auth_verify_user_not_found": "Zu diesem Bestätigungslink gibt es kein Konto.",
|
|
132
|
+
"auth_verifying": "Prüfen…",
|
|
133
|
+
"common_error": "Fehler",
|
|
134
|
+
"common_loading": "Wird geladen…",
|
|
135
|
+
"common_not_found": "Diese Seite wurde nicht gefunden",
|
|
136
|
+
"common_something_wrong": "Etwas ist schiefgelaufen",
|
|
137
|
+
"current_locale": "Aktuelle Sprache: {locale}",
|
|
138
|
+
"dashboard_demo_amount": "Demo-Betrag: 5,00 $",
|
|
139
|
+
"dashboard_demo_checkout": "Demo-Kauf",
|
|
140
|
+
"dashboard_demo_checkout_blurb": "Optionale Zahlungswege: legt einen ausstehenden Kauf an und leitet zum Anbieter weiter. Webhooks markieren ihn als bezahlt.",
|
|
141
|
+
"dashboard_email_unverified": "nein — Posteingang prüfen",
|
|
142
|
+
"dashboard_email_verified": "E-Mail verifiziert",
|
|
143
|
+
"dashboard_manage_account": "Profil, Sicherheit, Sitzungen und verknüpfte Konten unter",
|
|
144
|
+
"dashboard_no_rails": "Keine Zahlungswege konfiguriert und aktiviert.",
|
|
145
|
+
"dashboard_open_admin": "Admin-Konsole öffnen",
|
|
146
|
+
"dashboard_overview_title": "Übersicht",
|
|
147
|
+
"dashboard_pay_with": "Zahlen mit {provider}",
|
|
148
|
+
"dashboard_role": "Rolle",
|
|
149
|
+
"dashboard_signed_in_as": "Angemeldet als",
|
|
150
|
+
"dashboard_title": "Benutzer-Dashboard",
|
|
151
|
+
"dashboard_two_factor": "Zwei-Faktor",
|
|
152
|
+
"email_link_fallback": "Falls die Schaltfläche nicht funktioniert, füge diesen Link in deinen Browser ein:",
|
|
153
|
+
"email_otp_body": "Verwende diesen Einmalcode. Er läuft in Kürze ab. Gib ihn nicht weiter.",
|
|
154
|
+
"email_otp_footer": "Du erhältst diese E-Mail, weil jemand diese Adresse bei {brand} verwendet hat. Falls du das nicht warst, kannst du diese E-Mail ignorieren.",
|
|
155
|
+
"email_otp_heading_reset": "Code zum Zurücksetzen des Passworts",
|
|
156
|
+
"email_otp_heading_signin": "Anmeldecode",
|
|
157
|
+
"email_otp_preview_reset": "Dein {brand}-Code zum Zurücksetzen des Passworts",
|
|
158
|
+
"email_otp_preview_signin": "Dein {brand}-Anmeldecode",
|
|
159
|
+
"email_otp_subject_reset": "Dein Code zum Zurücksetzen des Passworts",
|
|
160
|
+
"email_otp_subject_signin": "Dein Anmeldecode",
|
|
161
|
+
"email_reset_body": "Hallo. Wir haben eine Anfrage erhalten, dein {brand}-Passwort zurückzusetzen. Wähle unten ein neues. Dieser Link läuft in einer Stunde ab.",
|
|
162
|
+
"email_reset_body_named": "Hallo {name}. Wir haben eine Anfrage erhalten, dein {brand}-Passwort zurückzusetzen. Wähle unten ein neues. Dieser Link läuft in einer Stunde ab.",
|
|
163
|
+
"email_reset_cta": "Passwort zurücksetzen",
|
|
164
|
+
"email_reset_footer": "Falls du kein Zurücksetzen angefordert hast, kannst du diese E-Mail ignorieren; dein Passwort bleibt unverändert.",
|
|
165
|
+
"email_reset_heading": "Passwort zurücksetzen",
|
|
166
|
+
"email_reset_preview": "Setze dein {brand}-Passwort zurück",
|
|
167
|
+
"email_reset_subject": "Passwort zurücksetzen",
|
|
168
|
+
"email_verify_body": "Willkommen. Bestätige diese Adresse, um die Einrichtung deines Kontos abzuschließen.",
|
|
169
|
+
"email_verify_body_named": "Willkommen, {name}. Bestätige diese Adresse, um die Einrichtung deines Kontos abzuschließen.",
|
|
170
|
+
"email_verify_cta": "E-Mail-Adresse bestätigen",
|
|
171
|
+
"email_verify_footer": "Du erhältst diese E-Mail, weil sich jemand mit dieser Adresse bei {brand} registriert hat. Falls du das nicht warst, kannst du diese E-Mail ignorieren.",
|
|
172
|
+
"email_verify_heading": "Bestätige deine E-Mail-Adresse",
|
|
173
|
+
"email_verify_preview": "Bestätige deine E-Mail-Adresse für {brand}",
|
|
174
|
+
"email_verify_subject": "Bestätige deine E-Mail-Adresse",
|
|
175
|
+
"enabled": "aktiv",
|
|
176
|
+
"field_code": "Code",
|
|
177
|
+
"field_display_name": "Anzeigename",
|
|
178
|
+
"field_email": "E-Mail",
|
|
179
|
+
"field_locale": "Sprache",
|
|
180
|
+
"field_new_password": "Neues Passwort",
|
|
181
|
+
"field_password": "Passwort",
|
|
182
|
+
"home_blurb": "Auth, Rollen, Hyperdrive Postgres, E-Mail, Turnstile, optionale Zahlungen, Benutzer-Dashboard und Admin-Konsole — keine Produktdomain. Klonen und branden.",
|
|
183
|
+
"home_cap_admin": "Admin-Konsole",
|
|
184
|
+
"home_cap_admin_blurb": "Benutzer, Audit-Log und OAuth-Apps.",
|
|
185
|
+
"home_cap_auth": "Härtete Auth",
|
|
186
|
+
"home_cap_auth_blurb": "Passkeys, 2FA und Session-Widerruf inklusive.",
|
|
187
|
+
"home_cap_edge": "Edge-bereit",
|
|
188
|
+
"home_cap_edge_blurb": "Workers, Hyperdrive und E-Mail auf Cloudflare.",
|
|
189
|
+
"home_platform_kicker": "Plattform-Starter",
|
|
190
|
+
"home_tagline": "Generische SaaS-Plattform-Hülle",
|
|
191
|
+
"language_label": "Sprache",
|
|
192
|
+
"locale_de": "Deutsch",
|
|
193
|
+
"locale_en": "English",
|
|
194
|
+
"nav_account": "Konto",
|
|
195
|
+
"nav_admin": "Admin",
|
|
196
|
+
"nav_audit": "Audit-Log",
|
|
197
|
+
"nav_dashboard": "Dashboard",
|
|
198
|
+
"nav_home": "Start",
|
|
199
|
+
"nav_oauth_apps": "OAuth-Apps",
|
|
200
|
+
"nav_overview": "Übersicht",
|
|
201
|
+
"nav_primary": "Hauptnavigation",
|
|
202
|
+
"nav_sign_in": "Anmelden",
|
|
203
|
+
"nav_sign_up": "Registrieren",
|
|
204
|
+
"nav_users": "Benutzer",
|
|
205
|
+
"no": "nein",
|
|
206
|
+
"off": "aus",
|
|
207
|
+
"theme_dark": "Dunkel",
|
|
208
|
+
"theme_label": "Farbschema",
|
|
209
|
+
"theme_light": "Hell",
|
|
210
|
+
"theme_system": "System",
|
|
211
|
+
"yes": "ja"
|
|
212
|
+
}
|
|
@@ -0,0 +1,212 @@
|
|
|
1
|
+
{
|
|
2
|
+
"$schema": "https://inlang.com/schema/inlang-message-format",
|
|
3
|
+
"account_2fa_disabled": "Two-factor disabled.",
|
|
4
|
+
"account_2fa_enroll_hint": "Scan the URI or save your backup codes, then verify with your authenticator.",
|
|
5
|
+
"account_2fa_label": "Two-factor",
|
|
6
|
+
"account_begin_2fa": "Begin two-factor setup",
|
|
7
|
+
"account_change_password_title": "Change password (email code)",
|
|
8
|
+
"account_disable_2fa": "Disable two-factor",
|
|
9
|
+
"account_email_enrollment_code": "Email me an enrollment code",
|
|
10
|
+
"account_email_label": "Email",
|
|
11
|
+
"account_err_already_enabled": "Two-factor authentication is already enabled.",
|
|
12
|
+
"account_err_cooldown": "Please wait before requesting another code.",
|
|
13
|
+
"account_err_email_not_found": "No account matches that email address.",
|
|
14
|
+
"account_err_github_email_unverified": "Your GitHub email is not verified on GitHub.",
|
|
15
|
+
"account_err_invalid_code": "That code is not valid.",
|
|
16
|
+
"account_err_not_enabled": "Two-factor authentication is not enabled.",
|
|
17
|
+
"account_err_not_fresh": "Please re-authenticate, then retry.",
|
|
18
|
+
"account_err_too_many_attempts": "Too many attempts. Please try again later.",
|
|
19
|
+
"account_err_totp_required": "Enter your authenticator code to continue.",
|
|
20
|
+
"account_err_unauthorized": "You are not signed in.",
|
|
21
|
+
"account_field_enrollment_otp": "Enrollment code",
|
|
22
|
+
"account_field_new_password": "New password",
|
|
23
|
+
"account_field_otp": "Code",
|
|
24
|
+
"account_field_totp_disable": "Authenticator code to disable two-factor",
|
|
25
|
+
"account_github_label": "GitHub",
|
|
26
|
+
"account_github_linked": "linked",
|
|
27
|
+
"account_github_not_linked": "not linked",
|
|
28
|
+
"account_no_passkeys": "No passkeys registered.",
|
|
29
|
+
"account_off": "off",
|
|
30
|
+
"account_on": "on",
|
|
31
|
+
"account_otp_sent": "Code sent. You can request another in {seconds}s.",
|
|
32
|
+
"account_passkey_hint": "Add a passkey from a fresh session using your browser's passkey prompt.",
|
|
33
|
+
"account_passkey_removed": "Passkey removed.",
|
|
34
|
+
"account_passkeys_label": "Passkeys",
|
|
35
|
+
"account_password_label": "Password",
|
|
36
|
+
"account_password_none": "none",
|
|
37
|
+
"account_password_set": "set",
|
|
38
|
+
"account_password_updated": "Password updated; other sessions signed out.",
|
|
39
|
+
"account_profile_saved": "Profile saved.",
|
|
40
|
+
"account_reauth_emailed": "Re-authentication code sent to your email.",
|
|
41
|
+
"account_remove": "Remove",
|
|
42
|
+
"account_revoke_other_sessions": "Revoke other sessions",
|
|
43
|
+
"account_save_profile": "Save profile",
|
|
44
|
+
"account_section_passkeys": "Passkeys",
|
|
45
|
+
"account_section_two_factor": "Two-factor",
|
|
46
|
+
"account_send_otp": "Send a code to my email",
|
|
47
|
+
"account_session_current": "current",
|
|
48
|
+
"account_sessions_revoked": "Other sessions revoked.",
|
|
49
|
+
"account_tab_profile": "Profile",
|
|
50
|
+
"account_tab_security": "Security",
|
|
51
|
+
"account_tab_sessions": "Sessions",
|
|
52
|
+
"account_title": "Account",
|
|
53
|
+
"account_unverified": "unverified",
|
|
54
|
+
"account_update_failed": "Update failed.",
|
|
55
|
+
"account_update_password": "Update password",
|
|
56
|
+
"account_verified": "verified",
|
|
57
|
+
"action_continue": "Continue",
|
|
58
|
+
"action_save": "Save",
|
|
59
|
+
"action_sign_out": "Sign out",
|
|
60
|
+
"admin_audit_empty": "No audit events yet.",
|
|
61
|
+
"admin_audit_title": "Audit Log",
|
|
62
|
+
"admin_col_action": "Action",
|
|
63
|
+
"admin_col_actions": "Actions",
|
|
64
|
+
"admin_col_actor": "Actor",
|
|
65
|
+
"admin_col_detail": "Detail",
|
|
66
|
+
"admin_col_email": "Email",
|
|
67
|
+
"admin_col_name": "Name",
|
|
68
|
+
"admin_col_role": "Role",
|
|
69
|
+
"admin_col_status": "Status",
|
|
70
|
+
"admin_col_target": "Target",
|
|
71
|
+
"admin_col_when": "When",
|
|
72
|
+
"admin_oauth_create_client": "Create client",
|
|
73
|
+
"admin_oauth_empty": "No OAuth clients yet.",
|
|
74
|
+
"admin_oauth_field_name": "Name",
|
|
75
|
+
"admin_oauth_field_redirect_uris": "Redirect URIs (one per line)",
|
|
76
|
+
"admin_oauth_registered_clients": "Registered clients",
|
|
77
|
+
"admin_oauth_title": "OAuth Apps",
|
|
78
|
+
"admin_payment_toggles": "Payment method toggles",
|
|
79
|
+
"admin_payment_toggles_hint": "Disabled rails are refused server-side (not UI-only).",
|
|
80
|
+
"admin_title": "Admin console",
|
|
81
|
+
"admin_users_search_placeholder": "Search email or name",
|
|
82
|
+
"admin_users_title": "Users",
|
|
83
|
+
"app_name": "TanStack Starter",
|
|
84
|
+
"auth_back_to_dashboard": "Back to dashboard",
|
|
85
|
+
"auth_back_to_sign_in": "Back to sign in",
|
|
86
|
+
"auth_captcha_required": "Please complete the captcha.",
|
|
87
|
+
"auth_check_email": "Check your email to verify your account.",
|
|
88
|
+
"auth_consent_approve": "Approve",
|
|
89
|
+
"auth_consent_blurb": "An application is requesting access to your account. Approve only if you trust it.",
|
|
90
|
+
"auth_consent_deny": "Deny",
|
|
91
|
+
"auth_consent_failed": "Consent failed.",
|
|
92
|
+
"auth_consent_title": "Authorize application",
|
|
93
|
+
"auth_continue_github": "Continue with GitHub",
|
|
94
|
+
"auth_creating": "Creating…",
|
|
95
|
+
"auth_error_generic": "Something went wrong. Please try again.",
|
|
96
|
+
"auth_error_network": "Network error. Check your connection and try again.",
|
|
97
|
+
"auth_forgot_title": "Forgot password",
|
|
98
|
+
"auth_github_failed": "GitHub sign-in failed.",
|
|
99
|
+
"auth_have_account": "Already have an account?",
|
|
100
|
+
"auth_invalid_code": "Invalid code.",
|
|
101
|
+
"auth_missing_reset_token": "Missing reset token.",
|
|
102
|
+
"auth_no_account": "No account?",
|
|
103
|
+
"auth_oauth_account_not_linked": "An account with this email already exists. Sign in with your password, then link GitHub from your account page.",
|
|
104
|
+
"auth_oauth_email_unverified": "Your GitHub email is not verified on GitHub. Verify it there and retry, or sign up with your email and link GitHub later.",
|
|
105
|
+
"auth_oauth_generic": "GitHub sign-in did not complete. Please try again.",
|
|
106
|
+
"auth_oauth_no_email": "GitHub did not provide an email for your account. Sign up with your email first, then link GitHub from your account page.",
|
|
107
|
+
"auth_or": "or",
|
|
108
|
+
"auth_passkey_failed": "Passkey sign-in was cancelled or no passkey is set up here.",
|
|
109
|
+
"auth_password_hint": "8–32 characters, with a letter, digit, and symbol.",
|
|
110
|
+
"auth_redirecting": "Redirecting…",
|
|
111
|
+
"auth_reset_failed": "Reset failed.",
|
|
112
|
+
"auth_reset_link_sent": "If that address has an account, a reset link is on its way.",
|
|
113
|
+
"auth_reset_title": "Set a new password",
|
|
114
|
+
"auth_saving": "Saving…",
|
|
115
|
+
"auth_send_reset_link": "Send reset link",
|
|
116
|
+
"auth_sending": "Sending…",
|
|
117
|
+
"auth_sign_in_failed": "Sign-in failed.",
|
|
118
|
+
"auth_sign_in_title": "Sign in",
|
|
119
|
+
"auth_sign_up_failed": "Sign-up failed.",
|
|
120
|
+
"auth_sign_up_title": "Create account",
|
|
121
|
+
"auth_signing_in": "Signing in…",
|
|
122
|
+
"auth_signup_github": "Sign up with GitHub",
|
|
123
|
+
"auth_two_factor_blurb": "Enter a code from your authenticator app or a backup code.",
|
|
124
|
+
"auth_two_factor_title": "Two-factor authentication",
|
|
125
|
+
"auth_update_password": "Update password",
|
|
126
|
+
"auth_use_passkey": "Use a passkey",
|
|
127
|
+
"auth_verify": "Verify",
|
|
128
|
+
"auth_verify_generic": "Email verification did not complete. Please try again.",
|
|
129
|
+
"auth_verify_token_expired": "That verification link has expired. Request a new one.",
|
|
130
|
+
"auth_verify_token_invalid": "That verification link is not valid. Request a new one.",
|
|
131
|
+
"auth_verify_user_not_found": "No account matches that verification link.",
|
|
132
|
+
"auth_verifying": "Verifying…",
|
|
133
|
+
"common_error": "Error",
|
|
134
|
+
"common_loading": "Loading…",
|
|
135
|
+
"common_not_found": "This page was not found",
|
|
136
|
+
"common_something_wrong": "Something went wrong",
|
|
137
|
+
"current_locale": "Current locale: {locale}",
|
|
138
|
+
"dashboard_demo_amount": "Demo amount: $5.00",
|
|
139
|
+
"dashboard_demo_checkout": "Demo purchase",
|
|
140
|
+
"dashboard_demo_checkout_blurb": "Optional rails: creates a pending Purchase then redirects to the provider. Webhooks mark it paid.",
|
|
141
|
+
"dashboard_email_unverified": "no — check your inbox",
|
|
142
|
+
"dashboard_email_verified": "Email verified",
|
|
143
|
+
"dashboard_manage_account": "Manage profile, security, sessions, and linked accounts on",
|
|
144
|
+
"dashboard_no_rails": "No payment rails configured and enabled.",
|
|
145
|
+
"dashboard_open_admin": "Open admin console",
|
|
146
|
+
"dashboard_overview_title": "Overview",
|
|
147
|
+
"dashboard_pay_with": "Pay with {provider}",
|
|
148
|
+
"dashboard_role": "Role",
|
|
149
|
+
"dashboard_signed_in_as": "Signed in as",
|
|
150
|
+
"dashboard_title": "User dashboard",
|
|
151
|
+
"dashboard_two_factor": "Two-factor",
|
|
152
|
+
"email_link_fallback": "If the button does not work, paste this link into your browser:",
|
|
153
|
+
"email_otp_body": "Use this one-time code. It expires shortly. Do not share it.",
|
|
154
|
+
"email_otp_footer": "You received this because someone used this address with {brand}. If that was not you, you can ignore this email.",
|
|
155
|
+
"email_otp_heading_reset": "Password reset code",
|
|
156
|
+
"email_otp_heading_signin": "Sign-in code",
|
|
157
|
+
"email_otp_preview_reset": "Your {brand} password reset code",
|
|
158
|
+
"email_otp_preview_signin": "Your {brand} sign-in code",
|
|
159
|
+
"email_otp_subject_reset": "Your password reset code",
|
|
160
|
+
"email_otp_subject_signin": "Your sign-in code",
|
|
161
|
+
"email_reset_body": "Hello. We received a request to reset your {brand} password. Choose a new one with the button below. This link expires in one hour.",
|
|
162
|
+
"email_reset_body_named": "Hello, {name}. We received a request to reset your {brand} password. Choose a new one with the button below. This link expires in one hour.",
|
|
163
|
+
"email_reset_cta": "Reset password",
|
|
164
|
+
"email_reset_footer": "If you did not request a password reset, you can safely ignore this email; your password will not change.",
|
|
165
|
+
"email_reset_heading": "Reset your password",
|
|
166
|
+
"email_reset_preview": "Reset your {brand} password",
|
|
167
|
+
"email_reset_subject": "Reset your password",
|
|
168
|
+
"email_verify_body": "Welcome. Confirm this address to finish setting up your account.",
|
|
169
|
+
"email_verify_body_named": "Welcome, {name}. Confirm this address to finish setting up your account.",
|
|
170
|
+
"email_verify_cta": "Verify email",
|
|
171
|
+
"email_verify_footer": "You received this because someone signed up for {brand} with this address. If that was not you, you can safely ignore this email.",
|
|
172
|
+
"email_verify_heading": "Confirm your email",
|
|
173
|
+
"email_verify_preview": "Confirm your email for {brand}",
|
|
174
|
+
"email_verify_subject": "Confirm your email",
|
|
175
|
+
"enabled": "enabled",
|
|
176
|
+
"field_code": "Code",
|
|
177
|
+
"field_display_name": "Display name",
|
|
178
|
+
"field_email": "Email",
|
|
179
|
+
"field_locale": "Locale",
|
|
180
|
+
"field_new_password": "New password",
|
|
181
|
+
"field_password": "Password",
|
|
182
|
+
"home_blurb": "Auth, roles, Hyperdrive Postgres, email, Turnstile, optional payments, user dashboard, and admin console — no product domain. Clone and brand it.",
|
|
183
|
+
"home_cap_admin": "Admin console",
|
|
184
|
+
"home_cap_admin_blurb": "Users, audit log, and OAuth apps.",
|
|
185
|
+
"home_cap_auth": "Hardened auth",
|
|
186
|
+
"home_cap_auth_blurb": "Passkeys, 2FA, and session eviction built in.",
|
|
187
|
+
"home_cap_edge": "Edge-ready",
|
|
188
|
+
"home_cap_edge_blurb": "Workers, Hyperdrive, and email on Cloudflare.",
|
|
189
|
+
"home_platform_kicker": "Platform starter",
|
|
190
|
+
"home_tagline": "Generic SaaS platform shell",
|
|
191
|
+
"language_label": "Language",
|
|
192
|
+
"locale_de": "Deutsch",
|
|
193
|
+
"locale_en": "English",
|
|
194
|
+
"nav_account": "Account",
|
|
195
|
+
"nav_admin": "Admin",
|
|
196
|
+
"nav_audit": "Audit Log",
|
|
197
|
+
"nav_dashboard": "Dashboard",
|
|
198
|
+
"nav_home": "Home",
|
|
199
|
+
"nav_oauth_apps": "OAuth Apps",
|
|
200
|
+
"nav_overview": "Overview",
|
|
201
|
+
"nav_primary": "Primary",
|
|
202
|
+
"nav_sign_in": "Sign in",
|
|
203
|
+
"nav_sign_up": "Sign up",
|
|
204
|
+
"nav_users": "Users",
|
|
205
|
+
"no": "no",
|
|
206
|
+
"off": "off",
|
|
207
|
+
"theme_dark": "Dark",
|
|
208
|
+
"theme_label": "Color theme",
|
|
209
|
+
"theme_light": "Light",
|
|
210
|
+
"theme_system": "System",
|
|
211
|
+
"yes": "yes"
|
|
212
|
+
}
|
|
@@ -0,0 +1,101 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "tanstack-starter",
|
|
3
|
+
"private": true,
|
|
4
|
+
"type": "module",
|
|
5
|
+
"imports": {
|
|
6
|
+
"#/*": "./src/*"
|
|
7
|
+
},
|
|
8
|
+
"scripts": {
|
|
9
|
+
"dev": "vite dev --port 3000",
|
|
10
|
+
"mystack": "node packages/mystack/src/cli.mjs",
|
|
11
|
+
"cli:prepare": "node packages/mystack/scripts/prepare-template.mjs",
|
|
12
|
+
"test:cli": "SKIP_TESTCONTAINERS=1 vitest run src/__tests__/mystack.test.ts",
|
|
13
|
+
"generate-routes": "tsr generate",
|
|
14
|
+
"build": "vite build",
|
|
15
|
+
"preview": "vite preview",
|
|
16
|
+
"paraglide:compile": "bun run scripts/compile-paraglide.ts",
|
|
17
|
+
"test": "bun run paraglide:compile && vitest run",
|
|
18
|
+
"test:unit": "SKIP_TESTCONTAINERS=1 bun run paraglide:compile && SKIP_TESTCONTAINERS=1 vitest run",
|
|
19
|
+
"test:e2e": "playwright test",
|
|
20
|
+
"format": "biome format",
|
|
21
|
+
"lint": "biome lint",
|
|
22
|
+
"typecheck": "bun run paraglide:compile && tsc --noEmit",
|
|
23
|
+
"check": "biome check && bun run check:sql-raw && bun run check:server-fns",
|
|
24
|
+
"check:sql-raw": "bun run scripts/check-sql-raw.ts",
|
|
25
|
+
"check:server-fns": "bun run scripts/check-server-fns.ts",
|
|
26
|
+
"check:client-bundle": "bun scripts/check-client-bundle.ts",
|
|
27
|
+
"validate-prod-env": "bun run scripts/validate-prod-env.ts",
|
|
28
|
+
"deploy": "bun run validate-prod-env && vite build --mode prod && bun run check:client-bundle && wrangler deploy --secrets-file .env.prod",
|
|
29
|
+
"auth:generate": "bun x auth@latest generate --config ./src/lib/auth.ts --output ./src/db/auth.schema.ts --yes",
|
|
30
|
+
"db:up": "docker compose --env-file .env.docker up -d",
|
|
31
|
+
"db:down": "docker compose down",
|
|
32
|
+
"db:reset": "docker compose --env-file .env.docker down -v && docker compose --env-file .env.docker up -d",
|
|
33
|
+
"db:generate": "drizzle-kit generate",
|
|
34
|
+
"db:migrate": "drizzle-kit migrate",
|
|
35
|
+
"db:push": "drizzle-kit push",
|
|
36
|
+
"db:pull": "drizzle-kit pull",
|
|
37
|
+
"db:studio": "drizzle-kit studio",
|
|
38
|
+
"db:seed": "bun scripts/seed-local.ts",
|
|
39
|
+
"seed:local": "bun scripts/seed-local.ts"
|
|
40
|
+
},
|
|
41
|
+
"dependencies": {
|
|
42
|
+
"@base-ui/react": "^1.8.0",
|
|
43
|
+
"@better-auth/drizzle-adapter": "1.7.3",
|
|
44
|
+
"@better-auth/oauth-provider": "1.7.3",
|
|
45
|
+
"@better-auth/passkey": "1.7.3",
|
|
46
|
+
"@cloudflare/vite-plugin": "^1.62.5",
|
|
47
|
+
"@marsidev/react-turnstile": "^1.6.1",
|
|
48
|
+
"@react-email/components": "^1.0.12",
|
|
49
|
+
"@t3-oss/env-core": "^0.13.10",
|
|
50
|
+
"@tailwindcss/vite": "^4.3.3",
|
|
51
|
+
"@tanstack/react-devtools": "0.10.13",
|
|
52
|
+
"@tanstack/react-query": "5.104.0",
|
|
53
|
+
"@tanstack/react-query-devtools": "5.104.0",
|
|
54
|
+
"@tanstack/react-router": "1.170.39",
|
|
55
|
+
"@tanstack/react-router-devtools": "1.167.2",
|
|
56
|
+
"@tanstack/react-router-ssr-query": "1.167.3",
|
|
57
|
+
"@tanstack/react-start": "1.168.58",
|
|
58
|
+
"@tanstack/router-plugin": "1.168.40",
|
|
59
|
+
"better-auth": "1.7.3",
|
|
60
|
+
"drizzle-kit": "^0.31.11",
|
|
61
|
+
"drizzle-orm": "^0.45.3",
|
|
62
|
+
"pg": "^8.23.1",
|
|
63
|
+
"react": "19.3.0",
|
|
64
|
+
"react-dom": "19.3.0",
|
|
65
|
+
"react-email": "6.11.0",
|
|
66
|
+
"tailwindcss": "^4.3.3",
|
|
67
|
+
"zod": "^4.6.5"
|
|
68
|
+
},
|
|
69
|
+
"devDependencies": {
|
|
70
|
+
"@biomejs/biome": "2.5.15",
|
|
71
|
+
"@inlang/paraglide-js": "^2.25.4",
|
|
72
|
+
"@playwright/test": "^1.63.0",
|
|
73
|
+
"@react-email/ui": "6.11.0",
|
|
74
|
+
"@rolldown/plugin-babel": "^0.2.4",
|
|
75
|
+
"@tailwindcss/typography": "^0.5.16",
|
|
76
|
+
"@tanstack/devtools-vite": "0.8.5",
|
|
77
|
+
"@tanstack/router-cli": "1.167.38",
|
|
78
|
+
"@testcontainers/postgresql": "^12.2.0",
|
|
79
|
+
"@testing-library/dom": "^10.4.2",
|
|
80
|
+
"@testing-library/react": "^16.3.3",
|
|
81
|
+
"@types/node": "^26.6.4",
|
|
82
|
+
"@types/pg": "^8.23.1",
|
|
83
|
+
"@types/react": "^19.3.0",
|
|
84
|
+
"@types/react-dom": "^19.3.0",
|
|
85
|
+
"@vitejs/plugin-react": "^6.1.1",
|
|
86
|
+
"babel-plugin-react-compiler": "^1.0.0",
|
|
87
|
+
"dotenv": "^17.3.1",
|
|
88
|
+
"jsdom": "^30.1.1",
|
|
89
|
+
"tsx": "^4.23.15",
|
|
90
|
+
"typescript": "^7.0.2",
|
|
91
|
+
"vite": "^8.3.2",
|
|
92
|
+
"vitest": "^4.1.11",
|
|
93
|
+
"wrangler": "^4.147.0"
|
|
94
|
+
},
|
|
95
|
+
"pnpm": {
|
|
96
|
+
"onlyBuiltDependencies": [
|
|
97
|
+
"esbuild",
|
|
98
|
+
"lightningcss"
|
|
99
|
+
]
|
|
100
|
+
}
|
|
101
|
+
}
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
import { LOCALIZED_PAGES } from "./src/lib/localized-pages";
|
|
2
|
+
import { localizedLocalePaths } from "./src/utils/locale-paths";
|
|
3
|
+
|
|
4
|
+
// Shared Paraglide compiler options (ADR 0005 / 0010). Imported by the Vite
|
|
5
|
+
// plugin (dev/build) AND scripts/compile-paraglide.ts so Vitest compiles an
|
|
6
|
+
// identical runtime — `urlPatterns` can only be passed through the JS compile
|
|
7
|
+
// API, never the CLI, so it must live in one place both entry points read.
|
|
8
|
+
|
|
9
|
+
type UrlPattern = { pattern: string; localized: Array<[string, string]> };
|
|
10
|
+
|
|
11
|
+
// Allowlist localization: every user-facing HTML tree gets a locale form.
|
|
12
|
+
// English stays on its bare path; German gets a path prefix. The trailing
|
|
13
|
+
// identity catch-all keeps machine paths (/api, /.well-known, webhooks, …)
|
|
14
|
+
// locale-neutral — never default “localize every path”.
|
|
15
|
+
//
|
|
16
|
+
// Non-home pages also register a trailing-slash twin so `/de/sign-in/` does
|
|
17
|
+
// not fall through the identity catch-all. Home stays `/` and `/de/` only.
|
|
18
|
+
const localizedPagePatterns: UrlPattern[] = LOCALIZED_PAGES.flatMap((page) => {
|
|
19
|
+
const localized = localizedLocalePaths(page).map(
|
|
20
|
+
([locale, path]) => [locale, path] as [string, string],
|
|
21
|
+
);
|
|
22
|
+
const patterns: UrlPattern[] = [{ pattern: page, localized }];
|
|
23
|
+
if (page !== "/") {
|
|
24
|
+
const withSlash = `${page}/`;
|
|
25
|
+
patterns.push({
|
|
26
|
+
pattern: withSlash,
|
|
27
|
+
localized: localized.map(([locale, path]) => [
|
|
28
|
+
locale,
|
|
29
|
+
path.endsWith("/") ? path : `${path}/`,
|
|
30
|
+
]),
|
|
31
|
+
});
|
|
32
|
+
}
|
|
33
|
+
return patterns;
|
|
34
|
+
});
|
|
35
|
+
|
|
36
|
+
const identityCatchAll: UrlPattern = {
|
|
37
|
+
pattern: "/:path(.*)?",
|
|
38
|
+
localized: [
|
|
39
|
+
["en", "/:path(.*)?"],
|
|
40
|
+
["de", "/:path(.*)?"],
|
|
41
|
+
],
|
|
42
|
+
};
|
|
43
|
+
|
|
44
|
+
export const paraglideOptions = {
|
|
45
|
+
project: "./project.inlang",
|
|
46
|
+
outdir: "./src/paraglide",
|
|
47
|
+
strategy: ["url", "baseLocale"] as ("url" | "baseLocale")[],
|
|
48
|
+
urlPatterns: [...localizedPagePatterns, identityCatchAll],
|
|
49
|
+
};
|
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
import { defineConfig, devices } from "@playwright/test";
|
|
2
|
+
|
|
3
|
+
const PORT = Number(process.env.E2E_PORT ?? 4173);
|
|
4
|
+
const BASE_URL = process.env.E2E_BASE_URL ?? `http://127.0.0.1:${PORT}`;
|
|
5
|
+
|
|
6
|
+
/**
|
|
7
|
+
* UI e2e — theme, contrast, mobile + 4K layout.
|
|
8
|
+
* Starts a Vite preview of the production build when no E2E_BASE_URL is set.
|
|
9
|
+
*/
|
|
10
|
+
export default defineConfig({
|
|
11
|
+
testDir: "./e2e",
|
|
12
|
+
fullyParallel: true,
|
|
13
|
+
forbidOnly: !!process.env.CI,
|
|
14
|
+
retries: process.env.CI ? 1 : 0,
|
|
15
|
+
workers: process.env.CI ? 1 : undefined,
|
|
16
|
+
reporter: [["list"]],
|
|
17
|
+
timeout: 60_000,
|
|
18
|
+
expect: { timeout: 10_000 },
|
|
19
|
+
use: {
|
|
20
|
+
baseURL: BASE_URL,
|
|
21
|
+
trace: "on-first-retry",
|
|
22
|
+
screenshot: "only-on-failure",
|
|
23
|
+
},
|
|
24
|
+
projects: [
|
|
25
|
+
{
|
|
26
|
+
name: "mobile",
|
|
27
|
+
use: {
|
|
28
|
+
// Chromium with a phone viewport — avoid WebKit binary requirement.
|
|
29
|
+
browserName: "chromium",
|
|
30
|
+
...devices["Pixel 7"],
|
|
31
|
+
viewport: { width: 390, height: 844 },
|
|
32
|
+
},
|
|
33
|
+
},
|
|
34
|
+
{
|
|
35
|
+
name: "desktop",
|
|
36
|
+
use: {
|
|
37
|
+
browserName: "chromium",
|
|
38
|
+
viewport: { width: 1440, height: 900 },
|
|
39
|
+
},
|
|
40
|
+
},
|
|
41
|
+
{
|
|
42
|
+
name: "4k",
|
|
43
|
+
use: {
|
|
44
|
+
browserName: "chromium",
|
|
45
|
+
viewport: { width: 3840, height: 2160 },
|
|
46
|
+
deviceScaleFactor: 1,
|
|
47
|
+
},
|
|
48
|
+
},
|
|
49
|
+
],
|
|
50
|
+
webServer: process.env.E2E_BASE_URL
|
|
51
|
+
? undefined
|
|
52
|
+
: {
|
|
53
|
+
command: `bun run build && bunx vite preview --host 127.0.0.1 --port ${PORT}`,
|
|
54
|
+
url: BASE_URL,
|
|
55
|
+
reuseExistingServer: !process.env.CI,
|
|
56
|
+
timeout: 300_000,
|
|
57
|
+
},
|
|
58
|
+
});
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
{
|
|
2
|
+
"$schema": "https://inlang.com/schema/project-settings",
|
|
3
|
+
"baseLocale": "en",
|
|
4
|
+
"locales": ["en", "de"],
|
|
5
|
+
"modules": [
|
|
6
|
+
"https://cdn.jsdelivr.net/npm/@inlang/plugin-message-format@4/dist/index.js",
|
|
7
|
+
"https://cdn.jsdelivr.net/npm/@inlang/plugin-m-function-matcher@2/dist/index.js"
|
|
8
|
+
],
|
|
9
|
+
"plugin.inlang.messageFormat": {
|
|
10
|
+
"pathPattern": "./messages/{locale}.json"
|
|
11
|
+
}
|
|
12
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
<svg xmlns="http://www.w3.org/2000/svg" width="160" height="160" fill="none" viewBox="0 0 160 160"><rect width="9.631" height="40.852" fill="#C5F74F" rx="4.816" transform="matrix(.87303 .48767 -.49721 .86763 43.48 67.304)"/><rect width="9.631" height="40.852" fill="#C5F74F" rx="4.816" transform="matrix(.87303 .48767 -.49721 .86763 76.94 46.534)"/><rect width="9.631" height="40.852" fill="#C5F74F" rx="4.816" transform="matrix(.87303 .48767 -.49721 .86763 128.424 46.535)"/><rect width="9.631" height="40.852" fill="#C5F74F" rx="4.816" transform="matrix(.87303 .48767 -.49721 .86763 94.957 67.304)"/></svg>
|