nuxt-users 1.6.4 → 1.6.5

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
@@ -1,6 +1,25 @@
1
1
  # Changelog
2
2
 
3
3
 
4
+ ## v1.6.5
5
+
6
+ [compare changes](https://github.com/rrd108/nuxt-users/compare/v1.6.4...v1.6.5)
7
+
8
+ ### 🩹 Fixes
9
+
10
+ - Authentication middleware ([c7de8a4](https://github.com/rrd108/nuxt-users/commit/c7de8a4))
11
+ - Lint and type errors ([dd6ee40](https://github.com/rrd108/nuxt-users/commit/dd6ee40))
12
+ - Type errors ([65c81fb](https://github.com/rrd108/nuxt-users/commit/65c81fb))
13
+
14
+ ### 🏡 Chore
15
+
16
+ - Fix formatting ([fdec442](https://github.com/rrd108/nuxt-users/commit/fdec442))
17
+ - **release:** V1.6.4 ([c395d20](https://github.com/rrd108/nuxt-users/commit/c395d20))
18
+
19
+ ### ❤️ Contributors
20
+
21
+ - Rrd108 ([@rrd108](https://github.com/rrd108))
22
+
4
23
  ## v1.6.4
5
24
 
6
25
  [compare changes](https://github.com/rrd108/nuxt-users/compare/v1.6.3...v1.6.4)
package/dist/module.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "nuxt-users",
3
3
  "configKey": "nuxtUsers",
4
- "version": "1.6.4",
4
+ "version": "1.6.5",
5
5
  "builder": {
6
6
  "@nuxt/module-builder": "1.0.1",
7
7
  "unbuild": "3.6.0"
package/dist/module.mjs CHANGED
@@ -1,4 +1,4 @@
1
- import { defineNuxtModule, createResolver, addPlugin, addImportsDir, addServerHandler, addComponent } from '@nuxt/kit';
1
+ import { defineNuxtModule, createResolver, addPlugin, addImportsDir, addServerHandler, addRouteMiddleware, addComponent } from '@nuxt/kit';
2
2
  import { defu } from 'defu';
3
3
 
4
4
  const defaultOptions = {
@@ -83,6 +83,15 @@ const module = defineNuxtModule({
83
83
  mode: "server"
84
84
  });
85
85
  addImportsDir(resolver.resolve("./runtime/composables"));
86
+ addServerHandler({
87
+ middleware: true,
88
+ handler: resolver.resolve("./runtime/server/middleware/auth.server")
89
+ });
90
+ addRouteMiddleware({
91
+ name: "auth.client",
92
+ path: resolver.resolve("./runtime/middleware/auth.client"),
93
+ global: true
94
+ });
86
95
  addServerHandler({
87
96
  route: "/api/login",
88
97
  method: "post",
@@ -0,0 +1,2 @@
1
+ declare const _default: import("#app").RouteMiddleware;
2
+ export default _default;
@@ -0,0 +1,20 @@
1
+ import { defineNuxtRouteMiddleware, navigateTo, useRuntimeConfig } from "#app";
2
+ import { useAuth } from "../composables/useAuth.js";
3
+ export default defineNuxtRouteMiddleware((to) => {
4
+ const { public: { nuxtUsers: publicNuxtUsers } } = useRuntimeConfig();
5
+ const publicOptions = publicNuxtUsers;
6
+ if (to.path === "/login") {
7
+ console.log("[Nuxt Users] client.middleware.auth.global: /login");
8
+ return;
9
+ }
10
+ if (publicOptions.auth.whitelist.includes(to.path)) {
11
+ console.log(`[Nuxt Users] client.middleware.auth.global: Whitelisted: ${to.path}`);
12
+ return;
13
+ }
14
+ const { user } = useAuth();
15
+ if (!user.value?.id) {
16
+ console.log("[Nuxt Users] client.middleware.auth.global: Unauthenticated, redirecting to /login");
17
+ return navigateTo("/login");
18
+ }
19
+ console.log("[Nuxt Users] client.middleware.auth.global", { user: user.value?.id, to: to.path });
20
+ });
@@ -1,55 +1,10 @@
1
- import { addRouteMiddleware, defineNuxtPlugin, useRuntimeConfig, navigateTo } from "#app";
1
+ import { defineNuxtPlugin, useRuntimeConfig } from "#app";
2
2
  import { checkTableExists } from "./server/utils/index.js";
3
- import { useAuth } from "./composables/useAuth.js";
4
3
  export default defineNuxtPlugin(async (_nuxtApp) => {
5
4
  const { nuxtUsers } = useRuntimeConfig();
6
- const { public: { nuxtUsers: publicNuxtUsers } } = useRuntimeConfig();
7
5
  const options = nuxtUsers;
8
- const publicOptions = publicNuxtUsers;
9
6
  const hasMigrationsTable = await checkTableExists(options, options.tables.migrations);
10
7
  if (!hasMigrationsTable) {
11
8
  console.warn("[Nuxt Users] \u26A0\uFE0F Migrations table does not exist, you should run the migration script to create it by running: npx nuxt-users migrate");
12
9
  }
13
- const { initializeUser } = useAuth();
14
- if (import.meta.client) {
15
- await initializeUser();
16
- }
17
- addRouteMiddleware(
18
- "auth.global",
19
- (to, from) => {
20
- if (to.path === "/login") {
21
- return;
22
- }
23
- if (import.meta.server) {
24
- console.log("[Nuxt Users] \u{1F510} Auth middleware: SSR - allowing request to proceed");
25
- return;
26
- }
27
- const { user } = useAuth();
28
- if (user.value || publicOptions.auth?.whitelist?.includes(to.path)) {
29
- console.log("[Nuxt Users] \u{1F510} Auth middleware: Access allowed");
30
- return;
31
- }
32
- console.log(`[Nuxt Users] \u{1F510} Auth middleware: Redirecting from ${from.path} to login - no user and not whitelisted`);
33
- return navigateTo("/login");
34
- },
35
- { global: true }
36
- );
37
- if (import.meta.client) {
38
- addRouteMiddleware(
39
- "auth.client",
40
- (to, from) => {
41
- if (to.path === "/login") {
42
- return;
43
- }
44
- const { user } = useAuth();
45
- if (user.value || publicOptions.auth?.whitelist?.includes(to.path)) {
46
- console.log("[Nuxt Users] \u{1F510} Client auth middleware: Access allowed");
47
- return;
48
- }
49
- console.log(`[Nuxt Users] \u{1F510} Client auth middleware: Redirecting from ${from.path} to login - no user and not whitelisted`);
50
- return navigateTo("/login");
51
- },
52
- { global: true }
53
- );
54
- }
55
10
  });
@@ -5,9 +5,6 @@ import { validatePassword, getPasswordValidationOptions } from "../../../../util
5
5
  export default defineEventHandler(async (event) => {
6
6
  const body = await readBody(event);
7
7
  const { token, email, password, password_confirmation } = body;
8
- if (!token || typeof token !== "string") {
9
- throw createError({ statusCode: 400, statusMessage: "Token is required." });
10
- }
11
8
  if (!email || typeof email !== "string") {
12
9
  throw createError({ statusCode: 400, statusMessage: "Email is required." });
13
10
  }
@@ -1,11 +1,2 @@
1
- declare const _default: import("h3").EventHandler<import("h3").EventHandlerRequest, Promise<{
2
- user: {
3
- id: number;
4
- email: string;
5
- name: string;
6
- role: string;
7
- created_at: string;
8
- updated_at: string;
9
- };
10
- }>>;
1
+ declare const _default: import("h3").EventHandler<import("h3").EventHandlerRequest, Promise<import("../../../types.js").UserWithoutPassword>>;
11
2
  export default _default;
@@ -18,6 +18,5 @@ export default defineEventHandler(async (event) => {
18
18
  statusMessage: "Unauthorized - Invalid authentication token"
19
19
  });
20
20
  }
21
- const { password: _, ...userWithoutPassword } = user;
22
- return { user: userWithoutPassword };
21
+ return user;
23
22
  });
@@ -13,7 +13,7 @@ export default defineEventHandler(async (event) => {
13
13
  statusMessage: "Unauthorized - No authentication token found"
14
14
  });
15
15
  }
16
- const user = await getCurrentUserFromToken(token, options);
16
+ const user = await getCurrentUserFromToken(token, options, true);
17
17
  if (!user) {
18
18
  throw createError({
19
19
  statusCode: 401,
@@ -0,0 +1,2 @@
1
+ declare const _default: import("h3").EventHandler<import("h3").EventHandlerRequest, Promise<void>>;
2
+ export default _default;
@@ -0,0 +1,31 @@
1
+ import { defineEventHandler, getCookie, sendRedirect } from "h3";
2
+ import { useRuntimeConfig } from "#imports";
3
+ import { getCurrentUserFromToken } from "../utils/index.js";
4
+ export default defineEventHandler(async (event) => {
5
+ const { nuxtUsers } = useRuntimeConfig();
6
+ const options = nuxtUsers;
7
+ const isPageOrApiRoute = !event.path.includes(".") && (event.path === "/" || event.path.startsWith("/api/") || !event.path.startsWith("/_"));
8
+ if (!isPageOrApiRoute) {
9
+ return;
10
+ }
11
+ if (event.path === "/login" || event.path === "/api/login") {
12
+ console.log("[Nuxt Users] server.middleware.auth.global: /login");
13
+ return;
14
+ }
15
+ if (options.auth.whitelist.includes(event.path)) {
16
+ console.log(`[Nuxt Users] server.middleware.auth.global: whitelisted: ${event.path}`);
17
+ return;
18
+ }
19
+ const token = getCookie(event, "auth_token");
20
+ if (!token) {
21
+ console.log(`[Nuxt Users] server.middleware.auth.global: ${event.path} No token found redirecting to login`);
22
+ return sendRedirect(event, "/login");
23
+ }
24
+ const user = await getCurrentUserFromToken(token, options);
25
+ if (!user) {
26
+ console.log(`[Nuxt Users] server.middleware.auth.global: ${event.path} No user found redirecting to login`);
27
+ return sendRedirect(event, "/login");
28
+ }
29
+ console.log(`[Nuxt Users] server.middleware.auth.global: Authenticated request for ${user.id}`);
30
+ return;
31
+ });
@@ -1,4 +1,4 @@
1
- import type { ModuleOptions, User } from '../../../types.js';
1
+ import type { ModuleOptions, User, UserWithoutPassword } from '../../../types.js';
2
2
  interface CreateUserParams {
3
3
  email: string;
4
4
  name: string;
@@ -23,5 +23,5 @@ export declare const hasAnyUsers: (options: ModuleOptions) => Promise<boolean>;
23
23
  /**
24
24
  * Gets the current user from an authentication token.
25
25
  */
26
- export declare const getCurrentUserFromToken: (token: string, options: ModuleOptions) => Promise<User | null>;
26
+ export declare const getCurrentUserFromToken: <T extends boolean = false>(token: string, options: ModuleOptions, withPass?: T) => Promise<T extends true ? User | null : UserWithoutPassword | null>;
27
27
  export {};
@@ -71,7 +71,7 @@ export const hasAnyUsers = async (options) => {
71
71
  return false;
72
72
  }
73
73
  };
74
- export const getCurrentUserFromToken = async (token, options) => {
74
+ export const getCurrentUserFromToken = async (token, options, withPass = false) => {
75
75
  const db = await useDb(options);
76
76
  const personalAccessTokensTable = options.tables.personalAccessTokens;
77
77
  const usersTable = options.tables.users;
@@ -90,5 +90,10 @@ export const getCurrentUserFromToken = async (token, options) => {
90
90
  if (userResult.rows.length === 0) {
91
91
  return null;
92
92
  }
93
- return userResult.rows[0];
93
+ const user = userResult.rows[0];
94
+ if (withPass === true) {
95
+ return user;
96
+ }
97
+ const { password: _, ...userWithoutPassword } = user;
98
+ return userWithoutPassword;
94
99
  };
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "nuxt-users",
3
- "version": "1.6.4",
3
+ "version": "1.6.5",
4
4
  "description": "A comprehensive user management module for Nuxt 3 applications with authentication, database support, and CLI tools",
5
5
  "keywords": [
6
6
  "nuxt",