create-nuxt-base 2.2.2 → 2.2.4
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/CHANGELOG.md +27 -22
- package/nuxt-base-template/app/components/Modal/ModalBackupCodes.vue +2 -2
- package/nuxt-base-template/app/pages/auth/register.vue +3 -3
- package/nuxt-base-template/app/pages/auth/reset-password.vue +2 -1
- package/nuxt-base-template/app/pages/auth/verify-email.vue +18 -2
- package/nuxt-base-template/package.json +4 -4
- package/nuxt-base-template/playwright.config.ts +2 -2
- package/nuxt-base-template/tests/e2e/auth-feature-order.spec.ts +21 -40
- package/nuxt-base-template/tests/e2e/auth-lifecycle.spec.ts +3 -5
- package/nuxt-base-template/tests/unit/auth/auth.spec.ts +1 -7
- package/nuxt-base-template/tests/unit/auth/error-translation.spec.ts +1 -4
- package/package.json +1 -1
package/CHANGELOG.md
CHANGED
|
@@ -2,76 +2,83 @@
|
|
|
2
2
|
|
|
3
3
|
All notable changes to this project will be documented in this file. See [standard-version](https://github.com/conventional-changelog/standard-version) for commit guidelines.
|
|
4
4
|
|
|
5
|
+
### [2.2.4](https://github.com/lenneTech/nuxt-base-starter/compare/v2.2.3...v2.2.4) (2026-02-05)
|
|
6
|
+
|
|
7
|
+
|
|
8
|
+
### Bug Fixes
|
|
9
|
+
|
|
10
|
+
* fix changelog markdown, clear npmrc overrides, and force single worker for Playwright tests ([d90fab4](https://github.com/lenneTech/nuxt-base-starter/commit/d90fab4af78dea6ec5192bad0ca4095f21bef9b8))
|
|
11
|
+
|
|
12
|
+
### [2.2.3](https://github.com/lenneTech/nuxt-base-starter/compare/v2.2.2...v2.2.3) (2026-02-05)
|
|
13
|
+
|
|
14
|
+
### Bug Fixes
|
|
15
|
+
|
|
16
|
+
- fixes TypeScript errors ([8375d69](https://github.com/lenneTech/nuxt-base-starter/commit/8375d69dcfda5c334185843d08f0ff43dd0c501a))
|
|
17
|
+
|
|
5
18
|
### [2.2.2](https://github.com/lenneTech/nuxt-base-starter/compare/v2.2.1...v2.2.2) (2026-02-04)
|
|
6
19
|
|
|
7
20
|
### [2.2.1](https://github.com/lenneTech/nuxt-base-starter/compare/v2.2.0...v2.2.1) (2026-02-04)
|
|
8
21
|
|
|
9
|
-
|
|
10
22
|
### Bug Fixes
|
|
11
23
|
|
|
12
|
-
|
|
24
|
+
- bundle lucide loader-circle icon to prevent runtime loading failure ([afc7ae7](https://github.com/lenneTech/nuxt-base-starter/commit/afc7ae79d70db283fe4b2042c624feaf6b6e65cc))
|
|
13
25
|
|
|
14
26
|
## [2.2.0](https://github.com/lenneTech/nuxt-base-starter/compare/v2.1.4...v2.2.0) (2026-02-04)
|
|
15
27
|
|
|
16
|
-
|
|
17
28
|
### Features
|
|
18
29
|
|
|
19
|
-
|
|
30
|
+
- improve registration and login with email verification, terms checkbox, and TS fixes ([dee6b95](https://github.com/lenneTech/nuxt-base-starter/commit/dee6b95b29890bdccf09570192f869397694b61f))
|
|
20
31
|
|
|
21
32
|
### [2.1.4](https://github.com/lenneTech/nuxt-base-starter/compare/v2.1.3...v2.1.4) (2026-01-26)
|
|
22
33
|
|
|
23
|
-
|
|
24
34
|
### Bug Fixes
|
|
25
35
|
|
|
26
|
-
|
|
36
|
+
- generate QR code locally as SVG for password manager compatibility ([f4256e9](https://github.com/lenneTech/nuxt-base-starter/commit/f4256e94baf839b800cd5420c49ad9ed14a50f01))
|
|
27
37
|
|
|
28
38
|
### [2.1.3](https://github.com/lenneTech/nuxt-base-starter/compare/v2.1.2...v2.1.3) (2026-01-26)
|
|
29
39
|
|
|
30
|
-
|
|
31
40
|
### Bug Fixes
|
|
32
41
|
|
|
33
|
-
|
|
42
|
+
- remove trust device feature from 2FA authentication flow ([c631c83](https://github.com/lenneTech/nuxt-base-starter/commit/c631c839a1ae8ee902a7ab3678e034d99840972a))
|
|
34
43
|
|
|
35
44
|
### [2.1.2](https://github.com/lenneTech/nuxt-base-starter/compare/v2.1.1...v2.1.2) (2026-01-24)
|
|
36
45
|
|
|
37
|
-
|
|
38
46
|
### Bug Fixes
|
|
39
47
|
|
|
40
|
-
|
|
48
|
+
- **forms:** restore UForm/UAuthForm with Valibot schema validation ([aa5e93c](https://github.com/lenneTech/nuxt-base-starter/commit/aa5e93cdd19193cc4dd1153fc4f629407b0273f0))
|
|
41
49
|
|
|
42
50
|
### [2.1.1](https://github.com/lenneTech/nuxt-base-starter/compare/v2.1.0...v2.1.1) (2026-01-24)
|
|
43
51
|
|
|
44
|
-
|
|
45
52
|
### Bug Fixes
|
|
46
53
|
|
|
47
|
-
|
|
54
|
+
- update packages ([c5c733a](https://github.com/lenneTech/nuxt-base-starter/commit/c5c733ad07b6d5cee248b2f78d65a69b3b4369d4))
|
|
48
55
|
|
|
49
56
|
## [2.1.0](https://github.com/lenneTech/nuxt-base-starter/compare/v2.0.0...v2.1.0) (2026-01-24)
|
|
50
57
|
|
|
51
|
-
|
|
52
58
|
### Features
|
|
53
59
|
|
|
54
|
-
|
|
60
|
+
- **tests, i18n:** add test infrastructure and error translation integration ([f8aff01](https://github.com/lenneTech/nuxt-base-starter/commit/f8aff01b5c763ea54cee270e10a1a29e2bece867))
|
|
55
61
|
|
|
56
62
|
## [2.0.0](https://github.com/lenneTech/nuxt-base-starter/compare/v1.2.0...v2.0.0) (2026-01-24)
|
|
57
63
|
|
|
58
|
-
|
|
59
64
|
### ⚠ BREAKING CHANGES
|
|
60
65
|
|
|
61
|
-
|
|
66
|
+
- Local auth, upload, and utility files replaced by package
|
|
62
67
|
|
|
63
68
|
Migration to @lenne.tech/nuxt-extensions v1.0.1:
|
|
69
|
+
|
|
64
70
|
- Remove local composables (use-better-auth, use-tus-upload, use-file, use-share, use-tw)
|
|
65
71
|
- Remove local lib files (auth-client, auth-state)
|
|
66
72
|
- Remove local plugins (auth-interceptor.client)
|
|
67
73
|
- Remove local utils (crypto)
|
|
68
74
|
- Remove local interfaces (upload.interface)
|
|
69
|
-
- Remove local Transition components (now provided by package as Lt
|
|
75
|
+
- Remove local Transition components (now provided by package as Lt\* prefix)
|
|
70
76
|
- Simplify user.interface.ts to re-export LtUser from package
|
|
71
77
|
- Update all imports to use auto-imported composables (useLtAuth, useLtTusUpload, etc.)
|
|
72
78
|
- Update package.json to use npm package instead of yalc
|
|
73
79
|
|
|
74
80
|
All authentication features now provided by the package:
|
|
81
|
+
|
|
75
82
|
- Cookie/JWT dual-mode authentication
|
|
76
83
|
- Passkey/WebAuthn support
|
|
77
84
|
- 2FA/TOTP support
|
|
@@ -81,17 +88,15 @@ Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
|
|
|
81
88
|
|
|
82
89
|
### Bug Fixes
|
|
83
90
|
|
|
84
|
-
|
|
91
|
+
- use exact version 1.0.1 for [@lenne](https://github.com/lenne).tech/nuxt-extensions ([fe8d4c2](https://github.com/lenneTech/nuxt-base-starter/commit/fe8d4c21575977bd093a304adc2e18c7edc61110))
|
|
85
92
|
|
|
86
|
-
|
|
87
|
-
* migrate to [@lenne](https://github.com/lenne).tech/nuxt-extensions package ([4c8b732](https://github.com/lenneTech/nuxt-base-starter/commit/4c8b732b9d017a0ff7fb21ef09136dcd7fff81f0))
|
|
93
|
+
- migrate to [@lenne](https://github.com/lenne).tech/nuxt-extensions package ([4c8b732](https://github.com/lenneTech/nuxt-base-starter/commit/4c8b732b9d017a0ff7fb21ef09136dcd7fff81f0))
|
|
88
94
|
|
|
89
95
|
## [1.2.0](https://github.com/lenneTech/nuxt-base-starter/compare/v1.1.2...v1.2.0) (2026-01-22)
|
|
90
96
|
|
|
91
|
-
|
|
92
97
|
### Features
|
|
93
98
|
|
|
94
|
-
|
|
99
|
+
- **auth:** add Cookie/JWT dual-mode authentication with automatic fallback ([8005425](https://github.com/lenneTech/nuxt-base-starter/commit/800542585dc22c1710f8bf587ee8371458454c79))
|
|
95
100
|
|
|
96
101
|
### [1.1.2](https://github.com/lenneTech/nuxt-base-starter/compare/v1.1.1...v1.1.2) (2026-01-22)
|
|
97
102
|
|
|
@@ -7,8 +7,8 @@ import type { InferOutput } from 'valibot';
|
|
|
7
7
|
|
|
8
8
|
import * as v from 'valibot';
|
|
9
9
|
|
|
10
|
-
// Auth client from @lenne.tech/nuxt-extensions
|
|
11
|
-
const authClient =
|
|
10
|
+
// Auth client from @lenne.tech/nuxt-extensions
|
|
11
|
+
const authClient = useLtAuthClient();
|
|
12
12
|
|
|
13
13
|
// ============================================================================
|
|
14
14
|
// Props & Emits
|
|
@@ -118,7 +118,7 @@ const termsSchema = v.pipe(
|
|
|
118
118
|
),
|
|
119
119
|
);
|
|
120
120
|
|
|
121
|
-
const schema = computed(() => requireTerms.value ? termsSchema : baseSchema);
|
|
121
|
+
const schema = computed(() => (requireTerms.value ? termsSchema : baseSchema));
|
|
122
122
|
|
|
123
123
|
type Schema = InferOutput<typeof baseSchema> | InferOutput<typeof termsSchema>;
|
|
124
124
|
|
|
@@ -243,8 +243,8 @@ async function skipPasskey(): Promise<void> {
|
|
|
243
243
|
}"
|
|
244
244
|
@submit="onSubmit"
|
|
245
245
|
>
|
|
246
|
-
<template v-if="requireTerms" #termsAccepted-field="
|
|
247
|
-
<UCheckbox v-model="
|
|
246
|
+
<template v-if="requireTerms" #termsAccepted-field="slotProps">
|
|
247
|
+
<UCheckbox v-model="(slotProps as any).state.termsAccepted">
|
|
248
248
|
<template #label>
|
|
249
249
|
<span class="text-sm">
|
|
250
250
|
Ich akzeptiere die
|
|
@@ -85,10 +85,11 @@ async function onSubmit(payload: FormSubmitEvent<Schema>): Promise<void> {
|
|
|
85
85
|
loading.value = true;
|
|
86
86
|
|
|
87
87
|
try {
|
|
88
|
-
const
|
|
88
|
+
const result = await authClient.resetPassword({
|
|
89
89
|
newPassword: payload.data.password,
|
|
90
90
|
token: token.value,
|
|
91
91
|
});
|
|
92
|
+
const error = 'error' in result ? result.error : null;
|
|
92
93
|
|
|
93
94
|
if (error) {
|
|
94
95
|
toast.add({
|
|
@@ -165,7 +165,15 @@ onUnmounted(() => {
|
|
|
165
165
|
</div>
|
|
166
166
|
|
|
167
167
|
<div class="flex w-full flex-col gap-3">
|
|
168
|
-
<UButton
|
|
168
|
+
<UButton
|
|
169
|
+
v-if="email"
|
|
170
|
+
block
|
|
171
|
+
:color="resendCooldown > 0 ? 'neutral' : 'primary'"
|
|
172
|
+
:disabled="resendCooldown > 0"
|
|
173
|
+
:loading="resending"
|
|
174
|
+
:variant="resendCooldown > 0 ? 'outline' : 'solid'"
|
|
175
|
+
@click="resendVerificationEmail"
|
|
176
|
+
>
|
|
169
177
|
{{ resendCooldown > 0 ? `Neue E-Mail senden (${resendCooldown}s)` : 'Neue E-Mail senden' }}
|
|
170
178
|
</UButton>
|
|
171
179
|
<UButton block variant="outline" color="neutral" to="/auth/login">Zurück zur Anmeldung</UButton>
|
|
@@ -198,7 +206,15 @@ onUnmounted(() => {
|
|
|
198
206
|
</UAlert>
|
|
199
207
|
|
|
200
208
|
<div class="flex w-full flex-col gap-3">
|
|
201
|
-
<UButton
|
|
209
|
+
<UButton
|
|
210
|
+
v-if="email"
|
|
211
|
+
block
|
|
212
|
+
:color="resendCooldown > 0 ? 'neutral' : 'primary'"
|
|
213
|
+
:disabled="resendCooldown > 0"
|
|
214
|
+
:loading="resending"
|
|
215
|
+
:variant="resendCooldown > 0 ? 'subtle' : 'outline'"
|
|
216
|
+
@click="resendVerificationEmail"
|
|
217
|
+
>
|
|
202
218
|
{{ resendCooldown > 0 ? `Bestätigungs-E-Mail erneut senden (${resendCooldown}s)` : 'Bestätigungs-E-Mail erneut senden' }}
|
|
203
219
|
</UButton>
|
|
204
220
|
<UButton block variant="outline" color="neutral" to="/auth/login">Zurück zur Anmeldung</UButton>
|
|
@@ -85,10 +85,6 @@
|
|
|
85
85
|
"typescript": "5.9.3",
|
|
86
86
|
"vitest": "3.2.4"
|
|
87
87
|
},
|
|
88
|
-
"engines": {
|
|
89
|
-
"node": ">=22",
|
|
90
|
-
"npm": ">=10"
|
|
91
|
-
},
|
|
92
88
|
"simple-git-hooks": {
|
|
93
89
|
"pre-commit": "npx lint-staged",
|
|
94
90
|
"pre-push": "npm run test:unit"
|
|
@@ -101,5 +97,9 @@
|
|
|
101
97
|
"tests/**/*.ts": [
|
|
102
98
|
"oxlint --fix"
|
|
103
99
|
]
|
|
100
|
+
},
|
|
101
|
+
"engines": {
|
|
102
|
+
"node": ">=22",
|
|
103
|
+
"npm": ">=10"
|
|
104
104
|
}
|
|
105
105
|
}
|
|
@@ -59,6 +59,6 @@ export default defineConfig<ConfigOptions>({
|
|
|
59
59
|
url: 'http://localhost:3001',
|
|
60
60
|
},
|
|
61
61
|
],
|
|
62
|
-
/*
|
|
63
|
-
workers:
|
|
62
|
+
/* Use single worker to prevent WebAuthn virtual authenticator conflicts across test files */
|
|
63
|
+
workers: 1,
|
|
64
64
|
});
|
|
@@ -1,14 +1,7 @@
|
|
|
1
1
|
import { expect, test } from '@nuxt/test-utils/playwright';
|
|
2
2
|
import type { Page } from '@playwright/test';
|
|
3
3
|
import * as fs from 'node:fs';
|
|
4
|
-
import {
|
|
5
|
-
extractTOTPSecret,
|
|
6
|
-
fillInput,
|
|
7
|
-
generateTestUser,
|
|
8
|
-
generateTOTP,
|
|
9
|
-
gotoAndWaitForHydration,
|
|
10
|
-
waitForURLAndHydration,
|
|
11
|
-
} from '@lenne.tech/nuxt-extensions/testing';
|
|
4
|
+
import { extractTOTPSecret, fillInput, generateTestUser, generateTOTP, gotoAndWaitForHydration, waitForURLAndHydration } from '@lenne.tech/nuxt-extensions/testing';
|
|
12
5
|
|
|
13
6
|
/**
|
|
14
7
|
* Authentication E2E Tests - Feature Ordering & Error Translations
|
|
@@ -75,11 +68,7 @@ function getVerificationTokenFromLog(email: string): string | null {
|
|
|
75
68
|
* Register a new user via UI.
|
|
76
69
|
* Adapts to current configuration (terms checkbox, email verification).
|
|
77
70
|
*/
|
|
78
|
-
async function registerUser(
|
|
79
|
-
page: Page,
|
|
80
|
-
user: { email: string; password: string; name: string },
|
|
81
|
-
features: Features,
|
|
82
|
-
): Promise<void> {
|
|
71
|
+
async function registerUser(page: Page, user: { email: string; password: string; name: string }, features: Features): Promise<void> {
|
|
83
72
|
await gotoAndWaitForHydration(page, '/auth/register');
|
|
84
73
|
await page.locator('input[name="name"]').waitFor({ state: 'visible', timeout: 10000 });
|
|
85
74
|
|
|
@@ -106,7 +95,7 @@ async function registerUser(
|
|
|
106
95
|
for (let i = 0; i < 10; i++) {
|
|
107
96
|
token = getVerificationTokenFromLog(user.email);
|
|
108
97
|
if (token) break;
|
|
109
|
-
await new Promise(resolve => setTimeout(resolve, 500));
|
|
98
|
+
await new Promise((resolve) => setTimeout(resolve, 500));
|
|
110
99
|
}
|
|
111
100
|
expect(token, 'Verification token not found in server logs').not.toBeNull();
|
|
112
101
|
|
|
@@ -153,9 +142,7 @@ async function enable2FA(page: Page, password: string): Promise<string> {
|
|
|
153
142
|
await page.keyboard.type(password, { delay: 5 });
|
|
154
143
|
|
|
155
144
|
// Intercept the 2FA enable response to extract TOTP URI
|
|
156
|
-
const responsePromise = page.waitForResponse(
|
|
157
|
-
resp => resp.url().includes('/two-factor/enable') && resp.status() === 200,
|
|
158
|
-
);
|
|
145
|
+
const responsePromise = page.waitForResponse((resp) => resp.url().includes('/two-factor/enable') && resp.status() === 200);
|
|
159
146
|
|
|
160
147
|
await enableButton.click();
|
|
161
148
|
|
|
@@ -235,7 +222,7 @@ test.beforeAll(async ({ request }) => {
|
|
|
235
222
|
// Detect backend configuration
|
|
236
223
|
try {
|
|
237
224
|
const featuresResponse = await request.get(`${API_BASE}/iam/features`);
|
|
238
|
-
features = await featuresResponse.json() as Features;
|
|
225
|
+
features = (await featuresResponse.json()) as Features;
|
|
239
226
|
} catch {
|
|
240
227
|
features = {
|
|
241
228
|
emailVerification: true,
|
|
@@ -268,18 +255,15 @@ test.describe.serial('Test 1: Register -> 2FA -> Passkey (no logout)', () => {
|
|
|
268
255
|
const cdpSession = await context.newCDPSession(page);
|
|
269
256
|
await cdpSession.send('WebAuthn.enable');
|
|
270
257
|
|
|
271
|
-
const { authenticatorId } = await cdpSession.send(
|
|
272
|
-
|
|
273
|
-
|
|
274
|
-
|
|
275
|
-
|
|
276
|
-
|
|
277
|
-
|
|
278
|
-
hasUserVerification: true,
|
|
279
|
-
isUserVerified: true,
|
|
280
|
-
},
|
|
258
|
+
const { authenticatorId } = await cdpSession.send('WebAuthn.addVirtualAuthenticator', {
|
|
259
|
+
options: {
|
|
260
|
+
protocol: 'ctap2',
|
|
261
|
+
transport: 'internal',
|
|
262
|
+
hasResidentKey: true,
|
|
263
|
+
hasUserVerification: true,
|
|
264
|
+
isUserVerified: true,
|
|
281
265
|
},
|
|
282
|
-
);
|
|
266
|
+
});
|
|
283
267
|
|
|
284
268
|
try {
|
|
285
269
|
await gotoAndWaitForHydration(page, '/app/settings/security');
|
|
@@ -312,18 +296,15 @@ test.describe.serial('Test 2: Register -> Passkey -> 2FA (no logout)', () => {
|
|
|
312
296
|
const cdpSession = await context.newCDPSession(page);
|
|
313
297
|
await cdpSession.send('WebAuthn.enable');
|
|
314
298
|
|
|
315
|
-
const { authenticatorId } = await cdpSession.send(
|
|
316
|
-
|
|
317
|
-
|
|
318
|
-
|
|
319
|
-
|
|
320
|
-
|
|
321
|
-
|
|
322
|
-
hasUserVerification: true,
|
|
323
|
-
isUserVerified: true,
|
|
324
|
-
},
|
|
299
|
+
const { authenticatorId } = await cdpSession.send('WebAuthn.addVirtualAuthenticator', {
|
|
300
|
+
options: {
|
|
301
|
+
protocol: 'ctap2',
|
|
302
|
+
transport: 'internal',
|
|
303
|
+
hasResidentKey: true,
|
|
304
|
+
hasUserVerification: true,
|
|
305
|
+
isUserVerified: true,
|
|
325
306
|
},
|
|
326
|
-
);
|
|
307
|
+
});
|
|
327
308
|
|
|
328
309
|
try {
|
|
329
310
|
await gotoAndWaitForHydration(page, '/app/settings/security');
|
|
@@ -219,7 +219,7 @@ async function getVerificationToken(email: string, maxRetries = 10): Promise<str
|
|
|
219
219
|
} catch {
|
|
220
220
|
// Log file may not exist yet
|
|
221
221
|
}
|
|
222
|
-
await new Promise(resolve => setTimeout(resolve, 500));
|
|
222
|
+
await new Promise((resolve) => setTimeout(resolve, 500));
|
|
223
223
|
}
|
|
224
224
|
return null;
|
|
225
225
|
}
|
|
@@ -333,7 +333,7 @@ test.beforeAll(async ({ request }) => {
|
|
|
333
333
|
// Fetch features to detect configuration
|
|
334
334
|
try {
|
|
335
335
|
const featuresResponse = await request.get(`${API_BASE}/iam/features`);
|
|
336
|
-
features = await featuresResponse.json() as Features;
|
|
336
|
+
features = (await featuresResponse.json()) as Features;
|
|
337
337
|
} catch {
|
|
338
338
|
console.error('Could not fetch /iam/features - assuming zero config (defaults)');
|
|
339
339
|
features = {
|
|
@@ -542,9 +542,7 @@ test.describe.serial('Comprehensive Better-Auth E2E Flow', () => {
|
|
|
542
542
|
await page.keyboard.type(testUser.password, { delay: 5 });
|
|
543
543
|
|
|
544
544
|
// Intercept the 2FA enable response to extract TOTP URI
|
|
545
|
-
const responsePromise = page.waitForResponse(
|
|
546
|
-
resp => resp.url().includes('/two-factor/enable') && resp.status() === 200,
|
|
547
|
-
);
|
|
545
|
+
const responsePromise = page.waitForResponse((resp) => resp.url().includes('/two-factor/enable') && resp.status() === 200);
|
|
548
546
|
|
|
549
547
|
// Click enable button
|
|
550
548
|
await enableButton.click();
|
|
@@ -14,13 +14,7 @@
|
|
|
14
14
|
*/
|
|
15
15
|
|
|
16
16
|
import { describe, it, expect, beforeEach, vi } from 'vitest';
|
|
17
|
-
import {
|
|
18
|
-
createMockAuthClient,
|
|
19
|
-
mockUser,
|
|
20
|
-
mockTotpData,
|
|
21
|
-
mockPasskey,
|
|
22
|
-
resetMockAuthClient,
|
|
23
|
-
} from '../mocks/auth-client.mock';
|
|
17
|
+
import { createMockAuthClient, mockUser, mockTotpData, mockPasskey, resetMockAuthClient } from '../mocks/auth-client.mock';
|
|
24
18
|
import { resetCookies } from '../setup';
|
|
25
19
|
|
|
26
20
|
// ============================================================================
|
|
@@ -259,10 +259,7 @@ describe('Error Toast Integration', () => {
|
|
|
259
259
|
color: string;
|
|
260
260
|
}
|
|
261
261
|
|
|
262
|
-
function createErrorToast(
|
|
263
|
-
error: string | { code?: string; message?: string },
|
|
264
|
-
customTitle?: string
|
|
265
|
-
): ToastOptions {
|
|
262
|
+
function createErrorToast(error: string | { code?: string; message?: string }, customTitle?: string): ToastOptions {
|
|
266
263
|
const translatedMessage = translateError(error);
|
|
267
264
|
return {
|
|
268
265
|
title: customTitle || 'Fehler',
|
package/package.json
CHANGED