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 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
- * bundle lucide loader-circle icon to prevent runtime loading failure ([afc7ae7](https://github.com/lenneTech/nuxt-base-starter/commit/afc7ae79d70db283fe4b2042c624feaf6b6e65cc))
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
- * improve registration and login with email verification, terms checkbox, and TS fixes ([dee6b95](https://github.com/lenneTech/nuxt-base-starter/commit/dee6b95b29890bdccf09570192f869397694b61f))
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
- * generate QR code locally as SVG for password manager compatibility ([f4256e9](https://github.com/lenneTech/nuxt-base-starter/commit/f4256e94baf839b800cd5420c49ad9ed14a50f01))
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
- * remove trust device feature from 2FA authentication flow ([c631c83](https://github.com/lenneTech/nuxt-base-starter/commit/c631c839a1ae8ee902a7ab3678e034d99840972a))
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
- * **forms:** restore UForm/UAuthForm with Valibot schema validation ([aa5e93c](https://github.com/lenneTech/nuxt-base-starter/commit/aa5e93cdd19193cc4dd1153fc4f629407b0273f0))
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
- * update packages ([c5c733a](https://github.com/lenneTech/nuxt-base-starter/commit/c5c733ad07b6d5cee248b2f78d65a69b3b4369d4))
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
- * **tests, i18n:** add test infrastructure and error translation integration ([f8aff01](https://github.com/lenneTech/nuxt-base-starter/commit/f8aff01b5c763ea54cee270e10a1a29e2bece867))
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
- * Local auth, upload, and utility files replaced by package
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* prefix)
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
- * 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))
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
- * **auth:** add Cookie/JWT dual-mode authentication with automatic fallback ([8005425](https://github.com/lenneTech/nuxt-base-starter/commit/800542585dc22c1710f8bf587ee8371458454c79))
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 (auto-imported as ltAuthClient)
11
- const authClient = ltAuthClient;
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="{ state: formState }">
247
- <UCheckbox v-model="formState.termsAccepted">
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 { error } = await authClient.resetPassword({
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 v-if="email" block :color="resendCooldown > 0 ? 'neutral' : 'primary'" :disabled="resendCooldown > 0" :loading="resending" :variant="resendCooldown > 0 ? 'outline' : 'solid'" @click="resendVerificationEmail">
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 v-if="email" block :color="resendCooldown > 0 ? 'neutral' : 'primary'" :disabled="resendCooldown > 0" :loading="resending" :variant="resendCooldown > 0 ? 'subtle' : 'outline'" @click="resendVerificationEmail">
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
- /* Opt out of parallel tests on CI. */
63
- workers: isCI ? 1 : undefined,
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
- 'WebAuthn.addVirtualAuthenticator',
273
- {
274
- options: {
275
- protocol: 'ctap2',
276
- transport: 'internal',
277
- hasResidentKey: true,
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
- 'WebAuthn.addVirtualAuthenticator',
317
- {
318
- options: {
319
- protocol: 'ctap2',
320
- transport: 'internal',
321
- hasResidentKey: true,
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
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "create-nuxt-base",
3
- "version": "2.2.2",
3
+ "version": "2.2.4",
4
4
  "description": "Starter to generate a configured environment with VueJS, Nuxt, Tailwind, Eslint, Unit Tests, Playwright etc.",
5
5
  "license": "MIT",
6
6
  "author": "lenne.Tech GmbH",