create-nuxt-base 2.2.4 → 2.2.6
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/.github/workflows/publish.yml +7 -2
- package/CHANGELOG.md +3 -2
- package/README.md +13 -13
- package/index.js +3 -3
- package/nuxt-base-template/.github/workflows/test.yml +26 -11
- package/nuxt-base-template/Dockerfile.dev +6 -3
- package/nuxt-base-template/app/pages/auth/login.vue +2 -2
- package/nuxt-base-template/app/pages/auth/register.vue +12 -0
- package/nuxt-base-template/app/pages/auth/setup.vue +133 -0
- package/nuxt-base-template/docker-entrypoint.sh +2 -2
- package/nuxt-base-template/nuxt.config.ts +5 -1
- package/nuxt-base-template/package.json +24 -10
- package/nuxt-base-template/pnpm-lock.yaml +12922 -0
- package/package.json +10 -4
- package/nuxt-base-template/package-lock.json +0 -18261
|
@@ -18,15 +18,20 @@ jobs:
|
|
|
18
18
|
steps:
|
|
19
19
|
- uses: actions/checkout@v4
|
|
20
20
|
|
|
21
|
+
- name: Install pnpm
|
|
22
|
+
uses: pnpm/action-setup@v4
|
|
23
|
+
with:
|
|
24
|
+
version: 9
|
|
25
|
+
|
|
21
26
|
- name: Use Node LTS ✨
|
|
22
27
|
uses: actions/setup-node@v4
|
|
23
28
|
with:
|
|
24
29
|
node-version: lts/*
|
|
25
30
|
registry-url: https://registry.npmjs.org
|
|
26
|
-
cache:
|
|
31
|
+
cache: pnpm
|
|
27
32
|
|
|
28
33
|
- name: Install dependencies 📦️
|
|
29
|
-
run:
|
|
34
|
+
run: pnpm install --frozen-lockfile
|
|
30
35
|
|
|
31
36
|
- name: Publish to npm 🚀
|
|
32
37
|
run: npm publish
|
package/CHANGELOG.md
CHANGED
|
@@ -2,12 +2,13 @@
|
|
|
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.
|
|
5
|
+
### [2.2.5](https://github.com/lenneTech/nuxt-base-starter/compare/v2.2.4...v2.2.5) (2026-02-10)
|
|
6
6
|
|
|
7
|
+
### [2.2.4](https://github.com/lenneTech/nuxt-base-starter/compare/v2.2.3...v2.2.4) (2026-02-05)
|
|
7
8
|
|
|
8
9
|
### Bug Fixes
|
|
9
10
|
|
|
10
|
-
|
|
11
|
+
- 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
|
|
|
12
13
|
### [2.2.3](https://github.com/lenneTech/nuxt-base-starter/compare/v2.2.2...v2.2.3) (2026-02-05)
|
|
13
14
|
|
package/README.md
CHANGED
|
@@ -7,7 +7,7 @@ A CLI tool to scaffold a production-ready **Nuxt 4** application with TypeScript
|
|
|
7
7
|
```bash
|
|
8
8
|
npx create-nuxt-base my-awesome-project
|
|
9
9
|
cd my-awesome-project
|
|
10
|
-
|
|
10
|
+
pnpm run dev
|
|
11
11
|
```
|
|
12
12
|
|
|
13
13
|
The development server starts at **http://localhost:3001**
|
|
@@ -103,17 +103,17 @@ my-project/
|
|
|
103
103
|
|
|
104
104
|
## Available Scripts
|
|
105
105
|
|
|
106
|
-
| Script
|
|
107
|
-
|
|
|
108
|
-
| `
|
|
109
|
-
| `
|
|
110
|
-
| `
|
|
111
|
-
| `
|
|
112
|
-
| `
|
|
113
|
-
| `
|
|
114
|
-
| `
|
|
115
|
-
| `
|
|
116
|
-
| `
|
|
106
|
+
| Script | Description |
|
|
107
|
+
| ------------------------- | -------------------------------------- |
|
|
108
|
+
| `pnpm run dev` | Start development server |
|
|
109
|
+
| `pnpm run build` | Build for production |
|
|
110
|
+
| `pnpm run preview` | Preview production build |
|
|
111
|
+
| `pnpm run generate-types` | Generate TypeScript types from OpenAPI |
|
|
112
|
+
| `pnpm run test` | Run Playwright E2E tests |
|
|
113
|
+
| `pnpm run lint` | Run OxLint |
|
|
114
|
+
| `pnpm run format` | Run OxFmt |
|
|
115
|
+
| `pnpm run check` | Run lint + format check |
|
|
116
|
+
| `pnpm run fix` | Auto-fix lint + format issues |
|
|
117
117
|
|
|
118
118
|
## Environment Variables
|
|
119
119
|
|
|
@@ -137,7 +137,7 @@ STORAGE_PREFIX=base-dev # Local storage prefix
|
|
|
137
137
|
## Requirements
|
|
138
138
|
|
|
139
139
|
- Node.js >= 22
|
|
140
|
-
-
|
|
140
|
+
- pnpm >= 9
|
|
141
141
|
|
|
142
142
|
## License
|
|
143
143
|
|
package/index.js
CHANGED
|
@@ -69,7 +69,7 @@ async function create() {
|
|
|
69
69
|
await waitForChildProcess(gitInit);
|
|
70
70
|
|
|
71
71
|
console.log('Installing dependencies ...');
|
|
72
|
-
const runInstall = spawn('
|
|
72
|
+
const runInstall = spawn('pnpm', ['install'], { stdio: 'inherit' });
|
|
73
73
|
await waitForSpawn(runInstall);
|
|
74
74
|
|
|
75
75
|
const removeGit = spawn('npx', ['rimraf', '.git'], { stdio: 'inherit' });
|
|
@@ -79,7 +79,7 @@ async function create() {
|
|
|
79
79
|
|
|
80
80
|
if (autoStart) {
|
|
81
81
|
console.log('Building Project ...');
|
|
82
|
-
const runBuild = spawn('
|
|
82
|
+
const runBuild = spawn('pnpm', ['run', 'build'], { stdio: 'inherit' });
|
|
83
83
|
await waitForSpawn(runBuild)
|
|
84
84
|
.then(() => console.log('✅ Project was successfully built'))
|
|
85
85
|
.catch(() => console.log('❌ Error while building the project'));
|
|
@@ -93,7 +93,7 @@ async function create() {
|
|
|
93
93
|
await waitForMS(1000);
|
|
94
94
|
console.log(`Launching ${projectName} ... 🚀`);
|
|
95
95
|
await waitForMS(1000);
|
|
96
|
-
const runDev = spawn('
|
|
96
|
+
const runDev = spawn('pnpm', ['run', 'start'], { stdio: 'inherit' });
|
|
97
97
|
await waitForSpawn(runDev);
|
|
98
98
|
}
|
|
99
99
|
}
|
|
@@ -15,20 +15,25 @@ jobs:
|
|
|
15
15
|
- name: Checkout repository
|
|
16
16
|
uses: actions/checkout@v4
|
|
17
17
|
|
|
18
|
+
- name: Install pnpm
|
|
19
|
+
uses: pnpm/action-setup@v4
|
|
20
|
+
with:
|
|
21
|
+
version: 9
|
|
22
|
+
|
|
18
23
|
- name: Setup Node.js
|
|
19
24
|
uses: actions/setup-node@v4
|
|
20
25
|
with:
|
|
21
26
|
node-version: '22'
|
|
22
|
-
cache: '
|
|
27
|
+
cache: 'pnpm'
|
|
23
28
|
|
|
24
29
|
- name: Install dependencies
|
|
25
|
-
run:
|
|
30
|
+
run: pnpm install --frozen-lockfile
|
|
26
31
|
|
|
27
32
|
- name: Run unit tests
|
|
28
|
-
run:
|
|
33
|
+
run: pnpm run test:unit
|
|
29
34
|
|
|
30
35
|
- name: Run unit tests with coverage
|
|
31
|
-
run:
|
|
36
|
+
run: pnpm run test:unit:coverage
|
|
32
37
|
|
|
33
38
|
- name: Upload coverage report
|
|
34
39
|
uses: actions/upload-artifact@v4
|
|
@@ -46,20 +51,25 @@ jobs:
|
|
|
46
51
|
- name: Checkout repository
|
|
47
52
|
uses: actions/checkout@v4
|
|
48
53
|
|
|
54
|
+
- name: Install pnpm
|
|
55
|
+
uses: pnpm/action-setup@v4
|
|
56
|
+
with:
|
|
57
|
+
version: 9
|
|
58
|
+
|
|
49
59
|
- name: Setup Node.js
|
|
50
60
|
uses: actions/setup-node@v4
|
|
51
61
|
with:
|
|
52
62
|
node-version: '22'
|
|
53
|
-
cache: '
|
|
63
|
+
cache: 'pnpm'
|
|
54
64
|
|
|
55
65
|
- name: Install dependencies
|
|
56
|
-
run:
|
|
66
|
+
run: pnpm install --frozen-lockfile
|
|
57
67
|
|
|
58
68
|
- name: Run linter
|
|
59
|
-
run:
|
|
69
|
+
run: pnpm run lint
|
|
60
70
|
|
|
61
71
|
- name: Check formatting
|
|
62
|
-
run:
|
|
72
|
+
run: pnpm run format:check
|
|
63
73
|
|
|
64
74
|
build:
|
|
65
75
|
name: Build
|
|
@@ -70,17 +80,22 @@ jobs:
|
|
|
70
80
|
- name: Checkout repository
|
|
71
81
|
uses: actions/checkout@v4
|
|
72
82
|
|
|
83
|
+
- name: Install pnpm
|
|
84
|
+
uses: pnpm/action-setup@v4
|
|
85
|
+
with:
|
|
86
|
+
version: 9
|
|
87
|
+
|
|
73
88
|
- name: Setup Node.js
|
|
74
89
|
uses: actions/setup-node@v4
|
|
75
90
|
with:
|
|
76
91
|
node-version: '22'
|
|
77
|
-
cache: '
|
|
92
|
+
cache: 'pnpm'
|
|
78
93
|
|
|
79
94
|
- name: Install dependencies
|
|
80
|
-
run:
|
|
95
|
+
run: pnpm install --frozen-lockfile
|
|
81
96
|
|
|
82
97
|
- name: Build application
|
|
83
|
-
run:
|
|
98
|
+
run: pnpm run build
|
|
84
99
|
|
|
85
100
|
- name: Upload build artifacts
|
|
86
101
|
uses: actions/upload-artifact@v4
|
|
@@ -5,12 +5,15 @@ WORKDIR /app
|
|
|
5
5
|
# Install dependencies for native modules
|
|
6
6
|
RUN apk add --no-cache python3 make g++
|
|
7
7
|
|
|
8
|
+
# Enable pnpm via corepack
|
|
9
|
+
RUN corepack enable && corepack prepare pnpm@latest --activate
|
|
10
|
+
|
|
8
11
|
# Copy package files first for better caching
|
|
9
|
-
COPY package
|
|
12
|
+
COPY package.json pnpm-lock.yaml ./
|
|
10
13
|
COPY .npmrc ./
|
|
11
14
|
|
|
12
15
|
# Install dependencies
|
|
13
|
-
RUN
|
|
16
|
+
RUN pnpm install --frozen-lockfile
|
|
14
17
|
|
|
15
18
|
# Copy entrypoint script
|
|
16
19
|
COPY docker-entrypoint.sh /docker-entrypoint.sh
|
|
@@ -20,4 +23,4 @@ RUN chmod +x /docker-entrypoint.sh
|
|
|
20
23
|
EXPOSE 3001
|
|
21
24
|
|
|
22
25
|
ENTRYPOINT ["/docker-entrypoint.sh"]
|
|
23
|
-
CMD ["
|
|
26
|
+
CMD ["pnpm", "run", "dev", "--", "--host", "0.0.0.0"]
|
|
@@ -30,7 +30,7 @@ interface SignInResponse {
|
|
|
30
30
|
// Composables
|
|
31
31
|
// ============================================================================
|
|
32
32
|
const toast = useToast();
|
|
33
|
-
const { signIn, setUser, validateSession, authenticateWithPasskey } = useLtAuth();
|
|
33
|
+
const { signIn, setUser, validateSession, authenticateWithPasskey, features } = useLtAuth();
|
|
34
34
|
const { translateError } = useLtErrorTranslation();
|
|
35
35
|
|
|
36
36
|
// ============================================================================
|
|
@@ -214,7 +214,7 @@ async function onSubmit(payload: FormSubmitEvent<Schema>): Promise<void> {
|
|
|
214
214
|
|
|
215
215
|
<UButton block color="neutral" variant="outline" icon="i-lucide-key" :loading="passkeyLoading" @click="onPasskeyLogin"> Mit Passkey anmelden </UButton>
|
|
216
216
|
|
|
217
|
-
<p class="text-center text-sm text-muted">
|
|
217
|
+
<p v-if="features.signUpEnabled !== false" class="text-center text-sm text-muted">
|
|
218
218
|
Noch kein Konto?
|
|
219
219
|
<ULink to="/auth/register" class="text-primary font-medium">Registrieren</ULink>
|
|
220
220
|
</p>
|
|
@@ -43,6 +43,18 @@ const loading = ref<boolean>(false);
|
|
|
43
43
|
const showPasskeyPrompt = ref<boolean>(false);
|
|
44
44
|
const passkeyLoading = ref<boolean>(false);
|
|
45
45
|
|
|
46
|
+
// Redirect if registration is disabled
|
|
47
|
+
watch(() => features.value.signUpEnabled, (val) => {
|
|
48
|
+
if (val === false) {
|
|
49
|
+
toast.add({
|
|
50
|
+
color: 'warning',
|
|
51
|
+
description: 'Die Registrierung ist derzeit deaktiviert.',
|
|
52
|
+
title: 'Registrierung nicht verfügbar',
|
|
53
|
+
});
|
|
54
|
+
navigateTo('/auth/login');
|
|
55
|
+
}
|
|
56
|
+
}, { immediate: true });
|
|
57
|
+
|
|
46
58
|
const requireTerms = computed(() => features.value.signUpChecks === true);
|
|
47
59
|
|
|
48
60
|
const baseFields: AuthFormField[] = [
|
|
@@ -0,0 +1,133 @@
|
|
|
1
|
+
<script setup lang="ts">
|
|
2
|
+
// ============================================================================
|
|
3
|
+
// Imports
|
|
4
|
+
// ============================================================================
|
|
5
|
+
import type { AuthFormField, FormSubmitEvent } from '@nuxt/ui';
|
|
6
|
+
import type { InferOutput } from 'valibot';
|
|
7
|
+
|
|
8
|
+
import * as v from 'valibot';
|
|
9
|
+
|
|
10
|
+
// ============================================================================
|
|
11
|
+
// Composables
|
|
12
|
+
// ============================================================================
|
|
13
|
+
const toast = useToast();
|
|
14
|
+
const { initSetup } = useSystemSetup();
|
|
15
|
+
const { translateError } = useLtErrorTranslation();
|
|
16
|
+
|
|
17
|
+
// ============================================================================
|
|
18
|
+
// Page Meta
|
|
19
|
+
// ============================================================================
|
|
20
|
+
definePageMeta({
|
|
21
|
+
layout: 'slim',
|
|
22
|
+
});
|
|
23
|
+
|
|
24
|
+
// ============================================================================
|
|
25
|
+
// Variables
|
|
26
|
+
// ============================================================================
|
|
27
|
+
const loading = ref<boolean>(false);
|
|
28
|
+
|
|
29
|
+
const fields: AuthFormField[] = [
|
|
30
|
+
{
|
|
31
|
+
label: 'Name',
|
|
32
|
+
name: 'name',
|
|
33
|
+
placeholder: 'Name eingeben',
|
|
34
|
+
required: true,
|
|
35
|
+
type: 'text',
|
|
36
|
+
},
|
|
37
|
+
{
|
|
38
|
+
label: 'E-Mail',
|
|
39
|
+
name: 'email',
|
|
40
|
+
placeholder: 'E-Mail eingeben',
|
|
41
|
+
required: true,
|
|
42
|
+
type: 'email',
|
|
43
|
+
},
|
|
44
|
+
{
|
|
45
|
+
label: 'Passwort',
|
|
46
|
+
name: 'password',
|
|
47
|
+
placeholder: 'Passwort eingeben',
|
|
48
|
+
required: true,
|
|
49
|
+
type: 'password',
|
|
50
|
+
},
|
|
51
|
+
{
|
|
52
|
+
label: 'Passwort bestätigen',
|
|
53
|
+
name: 'confirmPassword',
|
|
54
|
+
placeholder: 'Passwort wiederholen',
|
|
55
|
+
required: true,
|
|
56
|
+
type: 'password',
|
|
57
|
+
},
|
|
58
|
+
];
|
|
59
|
+
|
|
60
|
+
const schema = v.pipe(
|
|
61
|
+
v.object({
|
|
62
|
+
confirmPassword: v.pipe(v.string('Passwortbestätigung ist erforderlich'), v.minLength(8, 'Mindestens 8 Zeichen erforderlich')),
|
|
63
|
+
email: v.pipe(v.string('E-Mail ist erforderlich'), v.email('Bitte eine gültige E-Mail eingeben')),
|
|
64
|
+
name: v.pipe(v.string('Name ist erforderlich'), v.minLength(2, 'Mindestens 2 Zeichen erforderlich')),
|
|
65
|
+
password: v.pipe(v.string('Passwort ist erforderlich'), v.minLength(8, 'Mindestens 8 Zeichen erforderlich')),
|
|
66
|
+
}),
|
|
67
|
+
v.forward(
|
|
68
|
+
v.partialCheck([['password'], ['confirmPassword']], (input) => input.password === input.confirmPassword, 'Passwörter stimmen nicht überein'),
|
|
69
|
+
['confirmPassword'],
|
|
70
|
+
),
|
|
71
|
+
);
|
|
72
|
+
|
|
73
|
+
type Schema = InferOutput<typeof schema>;
|
|
74
|
+
|
|
75
|
+
// ============================================================================
|
|
76
|
+
// Functions
|
|
77
|
+
// ============================================================================
|
|
78
|
+
async function onSubmit(payload: FormSubmitEvent<Schema>): Promise<void> {
|
|
79
|
+
loading.value = true;
|
|
80
|
+
|
|
81
|
+
try {
|
|
82
|
+
await initSetup({
|
|
83
|
+
email: payload.data.email,
|
|
84
|
+
name: payload.data.name,
|
|
85
|
+
password: payload.data.password,
|
|
86
|
+
});
|
|
87
|
+
|
|
88
|
+
toast.add({
|
|
89
|
+
color: 'success',
|
|
90
|
+
description: 'Das System wurde erfolgreich eingerichtet.',
|
|
91
|
+
title: 'Administrator-Account erstellt',
|
|
92
|
+
});
|
|
93
|
+
|
|
94
|
+
await navigateTo('/auth/login');
|
|
95
|
+
} catch (err: unknown) {
|
|
96
|
+
toast.add({
|
|
97
|
+
color: 'error',
|
|
98
|
+
description: translateError(err instanceof Error ? err.message : 'Einrichtung fehlgeschlagen'),
|
|
99
|
+
title: 'Fehler',
|
|
100
|
+
});
|
|
101
|
+
} finally {
|
|
102
|
+
loading.value = false;
|
|
103
|
+
}
|
|
104
|
+
}
|
|
105
|
+
</script>
|
|
106
|
+
|
|
107
|
+
<template>
|
|
108
|
+
<UPageCard class="w-md" variant="naked">
|
|
109
|
+
<UAuthForm
|
|
110
|
+
:schema="schema"
|
|
111
|
+
title="System einrichten"
|
|
112
|
+
icon="i-lucide-shield-check"
|
|
113
|
+
:fields="fields"
|
|
114
|
+
:loading="loading"
|
|
115
|
+
:submit="{
|
|
116
|
+
label: 'System einrichten',
|
|
117
|
+
block: true,
|
|
118
|
+
}"
|
|
119
|
+
@submit="onSubmit"
|
|
120
|
+
>
|
|
121
|
+
<template #description>
|
|
122
|
+
<p class="text-sm text-muted">Erstelle den ersten Administrator-Account, um das System zu starten.</p>
|
|
123
|
+
</template>
|
|
124
|
+
|
|
125
|
+
<template #footer>
|
|
126
|
+
<p class="text-center text-sm text-muted">
|
|
127
|
+
Bereits eingerichtet?
|
|
128
|
+
<ULink to="/auth/login" class="text-primary font-medium">Anmelden</ULink>
|
|
129
|
+
</p>
|
|
130
|
+
</template>
|
|
131
|
+
</UAuthForm>
|
|
132
|
+
</UPageCard>
|
|
133
|
+
</template>
|
|
@@ -3,11 +3,11 @@ set -e
|
|
|
3
3
|
|
|
4
4
|
# Check if node_modules exists and if package.json has changed
|
|
5
5
|
PACKAGE_HASH_FILE="/app/.package-hash"
|
|
6
|
-
CURRENT_HASH=$(md5sum /app/package.json /app/
|
|
6
|
+
CURRENT_HASH=$(md5sum /app/package.json /app/pnpm-lock.yaml 2>/dev/null | md5sum | cut -d' ' -f1)
|
|
7
7
|
|
|
8
8
|
if [ ! -d "/app/node_modules" ] || [ ! -f "$PACKAGE_HASH_FILE" ] || [ "$(cat $PACKAGE_HASH_FILE 2>/dev/null)" != "$CURRENT_HASH" ]; then
|
|
9
9
|
echo "Installing dependencies..."
|
|
10
|
-
|
|
10
|
+
pnpm install --frozen-lockfile
|
|
11
11
|
echo "$CURRENT_HASH" > "$PACKAGE_HASH_FILE"
|
|
12
12
|
echo "Dependencies installed successfully."
|
|
13
13
|
else
|
|
@@ -94,9 +94,13 @@ export default defineNuxtConfig({
|
|
|
94
94
|
enableAdmin: true,
|
|
95
95
|
enableTwoFactor: true,
|
|
96
96
|
enablePasskey: true,
|
|
97
|
+
systemSetup: {
|
|
98
|
+
enabled: true,
|
|
99
|
+
setupPath: '/auth/setup',
|
|
100
|
+
},
|
|
97
101
|
interceptor: {
|
|
98
102
|
enabled: true,
|
|
99
|
-
publicPaths: ['/auth/login', '/auth/register', '/auth/forgot-password', '/auth/reset-password'],
|
|
103
|
+
publicPaths: ['/auth/login', '/auth/register', '/auth/forgot-password', '/auth/reset-password', '/auth/setup'],
|
|
100
104
|
},
|
|
101
105
|
},
|
|
102
106
|
tus: {
|
|
@@ -10,8 +10,14 @@
|
|
|
10
10
|
}
|
|
11
11
|
},
|
|
12
12
|
"scripts": {
|
|
13
|
-
"
|
|
14
|
-
"
|
|
13
|
+
"c": "pnpm run check",
|
|
14
|
+
"check": "pnpm audit && pnpm run format:check && pnpm run lint && pnpm test && pnpm run build && pnpm start",
|
|
15
|
+
"check:fix": "pnpm install && pnpm audit --fix && pnpm run format && pnpm run lint:fix && pnpm test && pnpm run build && pnpm start",
|
|
16
|
+
"check:naf": "pnpm install && pnpm run format && pnpm run lint:fix && pnpm test && pnpm run build && pnpm start",
|
|
17
|
+
"cf": "pnpm run check:fix",
|
|
18
|
+
"cnaf": "pnpm run check:naf",
|
|
19
|
+
"init": "pnpm install",
|
|
20
|
+
"reinit": "npx rimraf pnpm-lock.yaml && npx nuxt cleanup && npx rimraf node_modules && pnpm install",
|
|
15
21
|
"clean": "npx rimraf .nuxt .output",
|
|
16
22
|
"dev": "nuxt dev",
|
|
17
23
|
"build": "nuxt build",
|
|
@@ -29,24 +35,23 @@
|
|
|
29
35
|
"preview": "nuxt preview",
|
|
30
36
|
"postinstall": "nuxt prepare",
|
|
31
37
|
"prepare": "simple-git-hooks",
|
|
32
|
-
"test": "
|
|
38
|
+
"test": "pnpm run test:unit",
|
|
33
39
|
"test:unit": "vitest run",
|
|
34
40
|
"test:unit:watch": "vitest",
|
|
35
41
|
"test:unit:coverage": "vitest run --coverage",
|
|
36
42
|
"test:e2e": "playwright test",
|
|
37
|
-
"test:all": "
|
|
43
|
+
"test:all": "pnpm run test:unit && pnpm run test:e2e",
|
|
38
44
|
"lint": "oxlint app/",
|
|
39
|
-
"lint:fix": "oxlint --fix app/",
|
|
45
|
+
"lint:fix": "oxlint --fix --fix-suggestions app/",
|
|
40
46
|
"format": "oxfmt",
|
|
41
47
|
"format:check": "oxfmt --check",
|
|
42
|
-
"
|
|
43
|
-
"fix": "npm run lint:fix && npm run format"
|
|
48
|
+
"fix": "pnpm run lint:fix && pnpm run format"
|
|
44
49
|
},
|
|
45
50
|
"dependencies": {
|
|
46
51
|
"@better-auth/passkey": "1.4.10",
|
|
47
52
|
"@hey-api/client-fetch": "0.13.1",
|
|
48
53
|
"@lenne.tech/bug.lt": "latest",
|
|
49
|
-
"@lenne.tech/nuxt-extensions": "1.2.
|
|
54
|
+
"@lenne.tech/nuxt-extensions": "1.2.11",
|
|
50
55
|
"@nuxt/image": "2.0.0",
|
|
51
56
|
"@nuxt/ui": "4.3.0",
|
|
52
57
|
"@pinia/nuxt": "0.11.3",
|
|
@@ -87,7 +92,7 @@
|
|
|
87
92
|
},
|
|
88
93
|
"simple-git-hooks": {
|
|
89
94
|
"pre-commit": "npx lint-staged",
|
|
90
|
-
"pre-push": "
|
|
95
|
+
"pre-push": "pnpm run test:unit"
|
|
91
96
|
},
|
|
92
97
|
"lint-staged": {
|
|
93
98
|
"app/**/*.{ts,vue}": [
|
|
@@ -100,6 +105,15 @@
|
|
|
100
105
|
},
|
|
101
106
|
"engines": {
|
|
102
107
|
"node": ">=22",
|
|
103
|
-
"
|
|
108
|
+
"pnpm": ">=9"
|
|
109
|
+
},
|
|
110
|
+
"pnpm": {
|
|
111
|
+
"onlyBuiltDependencies": [
|
|
112
|
+
"@parcel/watcher",
|
|
113
|
+
"esbuild",
|
|
114
|
+
"sharp",
|
|
115
|
+
"simple-git-hooks",
|
|
116
|
+
"vue-demi"
|
|
117
|
+
]
|
|
104
118
|
}
|
|
105
119
|
}
|