@lenne.tech/nuxt-extensions 1.15.1 → 1.17.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/CLAUDE.md +90 -3
- package/README.md +49 -2
- package/dist/module.d.mts +1 -1
- package/dist/module.json +1 -1
- package/dist/module.mjs +1 -1
- package/dist/runtime/composables/auth/use-lt-auth.js +15 -3
- package/dist/runtime/composables/use-lt-error-translation.js +4 -0
- package/dist/runtime/lib/auth-client.d.ts +157 -574
- package/dist/runtime/lib/auth-client.js +76 -23
- package/dist/runtime/plugins/auth-interceptor.client.js +0 -1
- package/dist/runtime/types/auth.d.ts +93 -6
- package/dist/runtime/types/error.d.ts +26 -1
- package/package.json +4 -4
|
@@ -79,33 +79,95 @@ export function createLtAuthClient(config = {}) {
|
|
|
79
79
|
plugins
|
|
80
80
|
});
|
|
81
81
|
return {
|
|
82
|
-
// Spread all base client properties and methods
|
|
83
|
-
...baseClient,
|
|
84
|
-
// Explicitly pass through methods not captured by spread operator
|
|
85
82
|
useSession: baseClient.useSession,
|
|
86
|
-
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
87
83
|
passkey: baseClient.passkey,
|
|
88
|
-
|
|
84
|
+
/**
|
|
85
|
+
* Better-Auth admin plugin, passed through UNWRAPPED — and therefore UNHASHED.
|
|
86
|
+
*
|
|
87
|
+
* `admin.createUser` (`password`) and `admin.setUserPassword` (`newPassword`) carry
|
|
88
|
+
* credentials that every other method in this file hashes. These two do not.
|
|
89
|
+
*
|
|
90
|
+
* Why that is deliberate rather than an oversight: `@lenne.tech/nest-server` does not
|
|
91
|
+
* register better-auth's `admin()` plugin and offers no option to — the two routes do
|
|
92
|
+
* not exist server-side, so a call 404s today. Hashing here would build a client
|
|
93
|
+
* expectation the server does not answer, and if the plugin were later enabled without
|
|
94
|
+
* normalising those routes, this wrapper would CREATE the credential-store desync it
|
|
95
|
+
* was meant to prevent.
|
|
96
|
+
*
|
|
97
|
+
* What that costs, stated plainly: `auth.enableAdmin` defaults to `true`, so the admin
|
|
98
|
+
* CLIENT plugin is registered in every consuming project. The trap is armed and waiting
|
|
99
|
+
* for a server that answers. Enabling `admin()` server-side is therefore a LOCKSTEP
|
|
100
|
+
* change — the routes join nest-server's password-normalisation table and these two
|
|
101
|
+
* methods get `ltSha256` wrappers here, in one release. Half of it produces accounts
|
|
102
|
+
* whose password nobody can log in with, and nothing warns.
|
|
103
|
+
*/
|
|
89
104
|
admin: baseClient.admin,
|
|
90
105
|
$Infer: baseClient.$Infer,
|
|
91
106
|
$fetch: baseClient.$fetch,
|
|
92
107
|
$store: baseClient.$store,
|
|
108
|
+
/**
|
|
109
|
+
* Read the current session (`GET /get-session`).
|
|
110
|
+
*
|
|
111
|
+
* Carries no credential, so it is a bare passthrough.
|
|
112
|
+
*/
|
|
113
|
+
getSession: baseClient.getSession,
|
|
114
|
+
/**
|
|
115
|
+
* Send (or re-send) an email-verification mail (`POST /send-verification-email`).
|
|
116
|
+
*
|
|
117
|
+
* A BARE passthrough, and it must stay one. `callbackURL` is the value Better Auth
|
|
118
|
+
* puts into the mail, and it MUST reach the server exactly as the caller wrote it:
|
|
119
|
+
* Better Auth resolves a relative value against the API origin, so `/auth/verify-email`
|
|
120
|
+
* lands on `api.<host>/auth/verify-email`, where the route does not exist. The mail
|
|
121
|
+
* still goes out, and the user follows a link to a 404 — the same silent failure
|
|
122
|
+
* `redirectTo` produces on the reset path.
|
|
123
|
+
*
|
|
124
|
+
* So do not normalise it here, do not supply a default, and do not resolve it against
|
|
125
|
+
* the client's `baseURL`. A library that quietly repairs the value hides the mistake
|
|
126
|
+
* until the next caller makes it somewhere we cannot see. Fixing it belongs to the
|
|
127
|
+
* caller (the lt starters use `appUrl()`, which throws rather than return something
|
|
128
|
+
* relative).
|
|
129
|
+
*/
|
|
130
|
+
sendVerificationEmail: baseClient.sendVerificationEmail,
|
|
131
|
+
/**
|
|
132
|
+
* Verify an email address from a token (`POST /verify-email`).
|
|
133
|
+
*
|
|
134
|
+
* Carries no credential, so it is a bare passthrough. Note what the endpoint does with
|
|
135
|
+
* the query, because it decides the shape of the answer: WITH a `callbackURL` it
|
|
136
|
+
* answers `302` to that URL (carrying neither token nor status), WITHOUT one it answers
|
|
137
|
+
* `{ status: true }` as JSON. Callers that want the result rather than a redirect must
|
|
138
|
+
* therefore omit `callbackURL` here — which is not the same parameter as the one
|
|
139
|
+
* `sendVerificationEmail` puts into the mail, and confusing the two is easy.
|
|
140
|
+
*/
|
|
141
|
+
verifyEmail: baseClient.verifyEmail,
|
|
142
|
+
// Deliberately a bare passthrough: it takes an email address, never a password, so
|
|
143
|
+
// there is nothing to hash — and passing it through untouched is what keeps
|
|
144
|
+
// `redirectTo` intact (see the note above `resetPassword`).
|
|
93
145
|
requestPasswordReset: baseClient.requestPasswordReset,
|
|
94
146
|
/**
|
|
95
|
-
* Change password for an authenticated user (both passwords are hashed)
|
|
147
|
+
* Change password for an authenticated user (both passwords are hashed).
|
|
148
|
+
*
|
|
149
|
+
* `revokeOtherSessions` is the option that made the whitelist bug matter — see the
|
|
150
|
+
* file header.
|
|
96
151
|
*/
|
|
97
|
-
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
98
152
|
changePassword: async (params, options) => {
|
|
99
153
|
const [hashedCurrent, hashedNew] = await Promise.all([ltSha256(params.currentPassword), ltSha256(params.newPassword)]);
|
|
100
|
-
|
|
154
|
+
if (!baseClient.changePassword) {
|
|
155
|
+
throw new Error("[lt-auth] changePassword is unavailable on the Better-Auth client \u2014 the password was NOT changed.");
|
|
156
|
+
}
|
|
157
|
+
return baseClient.changePassword({ ...params, currentPassword: hashedCurrent, newPassword: hashedNew }, options);
|
|
101
158
|
},
|
|
102
159
|
/**
|
|
103
|
-
* Reset password with token (new password is hashed before sending)
|
|
160
|
+
* Reset password with token (new password is hashed before sending).
|
|
161
|
+
*
|
|
162
|
+
* Spread first, then overwrite the one field this wrapper exists for — see the file
|
|
163
|
+
* header for why the order is not a style question.
|
|
104
164
|
*/
|
|
105
|
-
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
106
165
|
resetPassword: async (params, options) => {
|
|
107
166
|
const hashedPassword = await ltSha256(params.newPassword);
|
|
108
|
-
|
|
167
|
+
if (!baseClient.resetPassword) {
|
|
168
|
+
throw new Error("[lt-auth] resetPassword is unavailable on the Better-Auth client \u2014 the password was NOT changed.");
|
|
169
|
+
}
|
|
170
|
+
return baseClient.resetPassword({ ...params, newPassword: hashedPassword }, options);
|
|
109
171
|
},
|
|
110
172
|
// Override signIn to hash password (keep passkey method from plugin)
|
|
111
173
|
signIn: {
|
|
@@ -113,7 +175,6 @@ export function createLtAuthClient(config = {}) {
|
|
|
113
175
|
/**
|
|
114
176
|
* Sign in with email and password (password is hashed before sending)
|
|
115
177
|
*/
|
|
116
|
-
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
117
178
|
email: async (params, options) => {
|
|
118
179
|
const hashedPassword = await ltSha256(params.password);
|
|
119
180
|
return baseClient.signIn.email({ ...params, password: hashedPassword }, options);
|
|
@@ -122,7 +183,6 @@ export function createLtAuthClient(config = {}) {
|
|
|
122
183
|
* Sign in with passkey (pass through to base client - provided by passkeyClient plugin)
|
|
123
184
|
* @see https://www.better-auth.com/docs/plugins/passkey
|
|
124
185
|
*/
|
|
125
|
-
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
126
186
|
passkey: baseClient.signIn.passkey
|
|
127
187
|
},
|
|
128
188
|
// Explicitly pass through signOut (not captured by spread operator)
|
|
@@ -133,7 +193,6 @@ export function createLtAuthClient(config = {}) {
|
|
|
133
193
|
/**
|
|
134
194
|
* Sign up with email and password (password is hashed before sending)
|
|
135
195
|
*/
|
|
136
|
-
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
137
196
|
email: async (params, options) => {
|
|
138
197
|
const hashedPassword = await ltSha256(params.password);
|
|
139
198
|
return baseClient.signUp.email({ ...params, password: hashedPassword }, options);
|
|
@@ -141,41 +200,35 @@ export function createLtAuthClient(config = {}) {
|
|
|
141
200
|
},
|
|
142
201
|
// Override twoFactor to hash passwords (provided by twoFactorClient plugin)
|
|
143
202
|
twoFactor: {
|
|
144
|
-
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
145
203
|
...baseClient.twoFactor,
|
|
146
204
|
/**
|
|
147
205
|
* Disable 2FA (password is hashed before sending)
|
|
148
206
|
*/
|
|
149
|
-
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
150
207
|
disable: async (params, options) => {
|
|
151
208
|
const hashedPassword = await ltSha256(params.password);
|
|
152
|
-
return baseClient.twoFactor.disable({ password: hashedPassword }, options);
|
|
209
|
+
return baseClient.twoFactor.disable({ ...params, password: hashedPassword }, options);
|
|
153
210
|
},
|
|
154
211
|
/**
|
|
155
212
|
* Enable 2FA (password is hashed before sending)
|
|
156
213
|
*/
|
|
157
|
-
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
158
214
|
enable: async (params, options) => {
|
|
159
215
|
const hashedPassword = await ltSha256(params.password);
|
|
160
|
-
return baseClient.twoFactor.enable({ password: hashedPassword }, options);
|
|
216
|
+
return baseClient.twoFactor.enable({ ...params, password: hashedPassword }, options);
|
|
161
217
|
},
|
|
162
218
|
/**
|
|
163
219
|
* Generate backup codes (password is hashed before sending)
|
|
164
220
|
*/
|
|
165
|
-
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
166
221
|
generateBackupCodes: async (params, options) => {
|
|
167
222
|
const hashedPassword = await ltSha256(params.password);
|
|
168
|
-
return baseClient.twoFactor.generateBackupCodes({ password: hashedPassword }, options);
|
|
223
|
+
return baseClient.twoFactor.generateBackupCodes({ ...params, password: hashedPassword }, options);
|
|
169
224
|
},
|
|
170
225
|
/**
|
|
171
226
|
* Verify TOTP code (pass through to base client)
|
|
172
227
|
*/
|
|
173
|
-
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
174
228
|
verifyTotp: baseClient.twoFactor.verifyTotp,
|
|
175
229
|
/**
|
|
176
230
|
* Verify backup code (pass through to base client)
|
|
177
231
|
*/
|
|
178
|
-
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
179
232
|
verifyBackupCode: baseClient.twoFactor.verifyBackupCode
|
|
180
233
|
}
|
|
181
234
|
};
|
|
@@ -133,7 +133,6 @@ export default (nuxtApp) => {
|
|
|
133
133
|
globalThis.$fetch = ((url, options) => {
|
|
134
134
|
return originalFetch(url, {
|
|
135
135
|
...options,
|
|
136
|
-
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
137
136
|
onResponseError: (context) => {
|
|
138
137
|
if (options?.onResponseError) {
|
|
139
138
|
options.onResponseError(context);
|
|
@@ -102,6 +102,31 @@ export interface LtPasskeyRegisterResult {
|
|
|
102
102
|
/**
|
|
103
103
|
* Return type for useLtAuth composable
|
|
104
104
|
*/
|
|
105
|
+
/**
|
|
106
|
+
* Accepts any caller-supplied shape while refusing a stray plaintext credential field.
|
|
107
|
+
*
|
|
108
|
+
* WHY A GENERIC AND NOT `& Record<string, unknown>`
|
|
109
|
+
*
|
|
110
|
+
* TypeScript gives a `type` alias an implicit index signature and an `interface` deliberately none
|
|
111
|
+
* (declaration merging could add anything later). So an intersection with `Record<string, unknown>`
|
|
112
|
+
* REJECTS an interface-typed variable — and `app/interfaces/*.interface.ts` plus `Ref<Form>.value`
|
|
113
|
+
* are the dominant shapes in this stack. That is how 1.15.0 broke consuming projects; the same
|
|
114
|
+
* mistake in a different costume is not worth repeating.
|
|
115
|
+
*
|
|
116
|
+
* A generic parameter carries every shape and keeps the excess-property check, which matters:
|
|
117
|
+
* widening these signatures to forward caller options also removed the compiler's objection to
|
|
118
|
+
* `changePassword({ …, password: plaintext })` — a plaintext credential that would land in the
|
|
119
|
+
* request body and from there in proxy logs, APM body capture and error reporters. Naming the
|
|
120
|
+
* foreign credential keys `never` puts that objection back without closing the passthrough.
|
|
121
|
+
*
|
|
122
|
+
* @typeParam T - whatever the caller actually passes
|
|
123
|
+
* @typeParam Own - the credential keys this method legitimately carries
|
|
124
|
+
*/
|
|
125
|
+
type NoStrayCredential<T, Own extends string> = Omit<{
|
|
126
|
+
currentPassword?: never;
|
|
127
|
+
newPassword?: never;
|
|
128
|
+
password?: never;
|
|
129
|
+
}, Own> & T;
|
|
105
130
|
export interface UseLtAuthReturn {
|
|
106
131
|
authMode: ComputedRef<LtAuthMode>;
|
|
107
132
|
isAuthenticated: ComputedRef<boolean>;
|
|
@@ -157,33 +182,95 @@ export interface UseLtAuthReturn {
|
|
|
157
182
|
features: ComputedRef<Record<string, boolean | number | string[]>>;
|
|
158
183
|
fetchFeatures: () => Promise<Record<string, boolean | number | string[]>>;
|
|
159
184
|
authenticateWithPasskey: () => Promise<LtPasskeyAuthResult>;
|
|
160
|
-
|
|
185
|
+
/**
|
|
186
|
+
* Change the password of the signed-in user. Both passwords are hashed client-side.
|
|
187
|
+
*
|
|
188
|
+
* Pass `revokeOtherSessions: true` after a suspected compromise — Better Auth reads it on the
|
|
189
|
+
* `update-user` route and ends every other session. Until 1.16.0 the wrapper silently dropped
|
|
190
|
+
* it, so a caller believed foreign sessions were ended when they were not.
|
|
191
|
+
*/
|
|
192
|
+
changePassword: <T extends {
|
|
161
193
|
currentPassword: string;
|
|
162
194
|
newPassword: string;
|
|
163
|
-
}, options?: unknown) => Promise<unknown>;
|
|
195
|
+
}>(params: NoStrayCredential<T, 'currentPassword' | 'newPassword'>, options?: unknown) => Promise<unknown>;
|
|
164
196
|
clearUser: () => void;
|
|
165
197
|
fetchWithAuth: (url: string, options?: RequestInit) => Promise<Response>;
|
|
166
198
|
refreshJwtToken: () => Promise<boolean>;
|
|
167
199
|
registerPasskey: (name?: string) => Promise<LtPasskeyRegisterResult>;
|
|
200
|
+
/**
|
|
201
|
+
* Ask for a password-reset mail.
|
|
202
|
+
*
|
|
203
|
+
* `redirectTo` MUST be an absolute app URL — Better Auth resolves it against the API
|
|
204
|
+
* origin, so a relative value lands on the API host, the route does not exist, and the
|
|
205
|
+
* answer is a 403 with no mail sent. In an lt starter project `appUrl()` builds one; elsewhere
|
|
206
|
+
* construct it yourself, e.g. `new URL('/auth/reset-password', config.public.siteUrl).toString()`.
|
|
207
|
+
*
|
|
208
|
+
* **SECURITY: never build `redirectTo` from `route.query`, a referrer, or a form field.** The
|
|
209
|
+
* reset redirect carries a live single-use token, so an attacker-controlled value is account
|
|
210
|
+
* takeover rather than phishing. What holds it back is `trustedOrigins` rejecting foreign
|
|
211
|
+
* origins — a project that widens that removes the last barrier.
|
|
212
|
+
*
|
|
213
|
+
* From `@lenne.tech/nest-server` 11.38.0 the reset mail links straight to the app, so
|
|
214
|
+
* `redirectTo` is no longer consulted on the default path. It stays load-bearing where a project
|
|
215
|
+
* sets `betterAuth.emailVerification.passwordResetLink: false` to keep Better Auth's own link.
|
|
216
|
+
*
|
|
217
|
+
* Generic rather than a closed shape: this is a passthrough, and a closed shape would push
|
|
218
|
+
* callers back to the raw client for any option the library has not enumerated yet — which is
|
|
219
|
+
* how hand-rolled reset flows start.
|
|
220
|
+
*
|
|
221
|
+
* @example
|
|
222
|
+
* const { requestPasswordReset } = useLtAuth();
|
|
223
|
+
* await requestPasswordReset({
|
|
224
|
+
* email,
|
|
225
|
+
* redirectTo: new URL('/auth/reset-password', config.public.siteUrl).toString(),
|
|
226
|
+
* });
|
|
227
|
+
* @see {@link UseLtAuthReturn.resetPassword} — step two, with the token from the query string.
|
|
228
|
+
*/
|
|
229
|
+
requestPasswordReset: <T extends {
|
|
230
|
+
email: string;
|
|
231
|
+
}>(params: NoStrayCredential<T, never>, options?: unknown) => Promise<unknown>;
|
|
232
|
+
/**
|
|
233
|
+
* Set a new password from a reset token. The password is hashed client-side.
|
|
234
|
+
*
|
|
235
|
+
* **The minimum-length rule has to live in your form.** Better Auth checks `minPasswordLength`
|
|
236
|
+
* against the value it RECEIVES, and this client hashes first — so the server sees 64 characters
|
|
237
|
+
* whatever the user typed, on every version. That is a consequence of client-side hashing, not
|
|
238
|
+
* of any particular server release. The lt starter's `reset-password.vue`, `register.vue` and
|
|
239
|
+
* `setup.vue` declare `v.minLength(8)`; a project using this package without those forms has to
|
|
240
|
+
* add it.
|
|
241
|
+
*
|
|
242
|
+
* Takes `{ newPassword, token }` and nothing else — better-auth's `/reset-password` body schema
|
|
243
|
+
* carries no `redirectTo`, so the absolute-URL trap applies one step earlier, on
|
|
244
|
+
* {@link UseLtAuthReturn.requestPasswordReset}.
|
|
245
|
+
*
|
|
246
|
+
* @example
|
|
247
|
+
* const { resetPassword } = useLtAuth();
|
|
248
|
+
* await resetPassword({ newPassword, token: route.query.token as string });
|
|
249
|
+
*/
|
|
250
|
+
resetPassword: <T extends {
|
|
251
|
+
newPassword: string;
|
|
252
|
+
token: string;
|
|
253
|
+
}>(params: NoStrayCredential<T, 'newPassword'>, options?: unknown) => Promise<unknown>;
|
|
168
254
|
setUser: (userData: LtUser | null, mode?: LtAuthMode) => void;
|
|
169
255
|
signIn: {
|
|
170
|
-
email:
|
|
256
|
+
email: <T extends {
|
|
171
257
|
email: string;
|
|
172
258
|
password: string;
|
|
173
259
|
rememberMe?: boolean;
|
|
174
|
-
}, options?: unknown) => Promise<unknown>;
|
|
260
|
+
}>(params: NoStrayCredential<T, 'password'>, options?: unknown) => Promise<unknown>;
|
|
175
261
|
passkey?: (options?: unknown) => Promise<unknown>;
|
|
176
262
|
};
|
|
177
263
|
signOut: (options?: unknown) => Promise<unknown>;
|
|
178
264
|
signUp: {
|
|
179
|
-
email:
|
|
265
|
+
email: <T extends {
|
|
180
266
|
email: string;
|
|
181
267
|
name: string;
|
|
182
268
|
password: string;
|
|
183
|
-
}
|
|
269
|
+
}>(params: NoStrayCredential<T, 'password'>, options?: unknown) => Promise<unknown>;
|
|
184
270
|
};
|
|
185
271
|
switchToJwtMode: () => Promise<boolean>;
|
|
186
272
|
validateSession: () => Promise<boolean>;
|
|
187
273
|
passkey?: unknown;
|
|
188
274
|
twoFactor?: unknown;
|
|
189
275
|
}
|
|
276
|
+
export {};
|
|
@@ -31,7 +31,32 @@ export interface LtErrorTranslationModuleOptions {
|
|
|
31
31
|
* Return type for useLtErrorTranslation composable
|
|
32
32
|
*/
|
|
33
33
|
export interface UseLtErrorTranslationReturn {
|
|
34
|
-
/**
|
|
34
|
+
/**
|
|
35
|
+
* Translate an error message or code to a user-friendly message.
|
|
36
|
+
*
|
|
37
|
+
* ALWAYS returns a usable string, which has two consequences worth knowing before you
|
|
38
|
+
* write the call.
|
|
39
|
+
*
|
|
40
|
+
* **`translateError(x) || 'Fallback'` never reaches the fallback.** When the message
|
|
41
|
+
* carries no `#CODE:` marker, the original message is returned unchanged — non-empty,
|
|
42
|
+
* therefore truthy. Only an error with no message at all can produce `''`. The `||`
|
|
43
|
+
* reads like a safety net, catches nothing, and hides that the untranslated English text
|
|
44
|
+
* is what the user actually sees. Six pages in one starter had it before anyone noticed.
|
|
45
|
+
* If you want a fallback, decide on {@link LtParsedError.code} being `null`.
|
|
46
|
+
*
|
|
47
|
+
* **Branch on the code, not on the message.** Backends give one message per situation
|
|
48
|
+
* but not one situation per status: Better Auth answers `POST /reset-password` with five
|
|
49
|
+
* different errors under the same `400`. Only the code separates them, and only codes
|
|
50
|
+
* the backend has mapped arrive with a `#LTNS_` marker at all — anything unmapped falls
|
|
51
|
+
* through as raw English, by design rather than by omission.
|
|
52
|
+
*
|
|
53
|
+
* **A raw `$fetch` error can be passed straight in.** ofetch's `FetchError` keeps the
|
|
54
|
+
* transport line in `message` (`[POST] "/iam/reset-password": 400 Bad Request`) and the
|
|
55
|
+
* parsed response body in `data`; extraction reads `data.message` first, so the
|
|
56
|
+
* backend's own message is what gets translated. Unwrapping it at the call site
|
|
57
|
+
* (`err.data?.message ?? err`) is therefore no longer necessary — it stays harmless, but
|
|
58
|
+
* a helper built for it can go.
|
|
59
|
+
*/
|
|
35
60
|
translateError: (errorOrMessage: unknown) => string;
|
|
36
61
|
/** Parse a backend error to extract code and messages */
|
|
37
62
|
parseError: (errorOrMessage: unknown) => LtParsedError;
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@lenne.tech/nuxt-extensions",
|
|
3
|
-
"version": "1.
|
|
3
|
+
"version": "1.17.0",
|
|
4
4
|
"description": "Reusable Nuxt 4 composables, components, and Better-Auth integration for lenne.tech projects",
|
|
5
5
|
"repository": {
|
|
6
6
|
"type": "git",
|
|
@@ -51,9 +51,9 @@
|
|
|
51
51
|
"prepack": "node scripts/sync-module-version.mjs && nuxt-module-build build",
|
|
52
52
|
"c": "pnpm run check",
|
|
53
53
|
"check": "node scripts/check.mjs",
|
|
54
|
-
"check:raw": "pnpm install --frozen-lockfile && pnpm audit && pnpm run format:check && pnpm run lint && pnpm run version:check && pnpm run dev:prepare && pnpm test:types && pnpm test && pnpm run build && pnpm run check:manifest",
|
|
55
|
-
"check:fix": "pnpm install && pnpm audit --fix && pnpm run format && pnpm run lint:fix && pnpm run version:sync && pnpm test:types && pnpm test && pnpm run build && pnpm run check:manifest",
|
|
56
|
-
"check:naf": "pnpm install && pnpm run format && pnpm run lint:fix && pnpm run version:sync && pnpm test:types && pnpm test && pnpm run build && pnpm run check:manifest",
|
|
54
|
+
"check:raw": "pnpm install --frozen-lockfile && pnpm audit && pnpm peers check && pnpm run format:check && pnpm run lint && pnpm run version:check && pnpm run dev:prepare && pnpm test:types && pnpm test && pnpm run build && pnpm run check:manifest",
|
|
55
|
+
"check:fix": "pnpm install && pnpm audit --fix && pnpm peers check && pnpm run format && pnpm run lint:fix && pnpm run version:sync && pnpm test:types && pnpm test && pnpm run build && pnpm run check:manifest",
|
|
56
|
+
"check:naf": "pnpm install && pnpm peers check && pnpm run format && pnpm run lint:fix && pnpm run version:sync && pnpm test:types && pnpm test && pnpm run build && pnpm run check:manifest",
|
|
57
57
|
"cf": "pnpm run check:fix",
|
|
58
58
|
"cnaf": "pnpm run check:naf",
|
|
59
59
|
"dev": "pnpm dev:prepare && nuxt dev playground",
|