UNPKG

nuxt-users

Version:

A comprehensive user management module for Nuxt 3 and Nuxt 4 applications with authentication, authorization, database support, and CLI tools

263 lines (253 loc) 9.2 kB
#!/usr/bin/env node import { defineCommand, runMain } from 'citty'; import { defaultOptions } from './module.mjs'; import { loadNuxt } from '@nuxt/kit'; import { defu } from 'defu'; import { runMigrations, createUser as createUser$1, createUsersTable as createUsersTable$1, createPersonalAccessTokensTable as createPersonalAccessTokensTable$1, createPasswordResetTokensTable as createPasswordResetTokensTable$1, createMigrationsTable as createMigrationsTable$1 } from '../dist/runtime/server/utils/index.js'; import { getPasswordValidationOptions, validatePassword } from './utils.mjs'; const getOptionsFromEnv = () => { const connectorName = process.env.DB_CONNECTOR || "sqlite"; let connectorOptions; switch (connectorName) { case "sqlite": connectorOptions = { path: process.env.DB_PATH || "./data/default.sqlite3" }; break; case "mysql": connectorOptions = { host: process.env.DB_HOST || "localhost", port: Number.parseInt(process.env.DB_PORT || "3306"), user: process.env.DB_USER || "root", password: process.env.DB_PASSWORD || "", database: process.env.DB_NAME || "nuxt_users" }; break; case "postgresql": connectorOptions = { host: process.env.DB_HOST || "localhost", port: Number.parseInt(process.env.DB_PORT || "5432"), user: process.env.DB_USER || "postgres", password: process.env.DB_PASSWORD || "", database: process.env.DB_NAME || "nuxt_users" }; break; default: throw new Error(`Unsupported database connector: ${connectorName}`); } return { ...defaultOptions, connector: { name: connectorName, options: connectorOptions } }; }; const loadOptions = async () => { try { console.log("[Nuxt Users] Loading Nuxt project..."); const nuxt = await loadNuxt({ cwd: process.cwd() }); const nuxtUsersConfig = nuxt.options.nuxtUsers; await nuxt.close(); if (nuxtUsersConfig) { console.log("[Nuxt Users] Using configuration from Nuxt project"); return defu(nuxtUsersConfig, defaultOptions); } else { console.log("[Nuxt Users] No nuxt-users configuration found, using environment variables"); return getOptionsFromEnv(); } } catch (error) { console.log("[Nuxt Users] Could not load Nuxt project, using environment variables"); console.error("[Nuxt Users] Error:", error); return getOptionsFromEnv(); } }; const migrate = defineCommand({ meta: { name: "migrate", description: "Run database migrations for the Nuxt Users module" }, async run() { console.log("[Nuxt Users] Starting migration system..."); const options = await loadOptions(); try { await runMigrations(options); console.log("[Nuxt Users] Migration completed successfully!"); process.exit(0); } catch (error) { console.error("[Nuxt Users] Migration failed:", error); process.exit(1); } } }); const createUser = defineCommand({ meta: { name: "create-user", description: "Create a new user in the database" }, args: { email: { alias: "e", type: "string", description: "User email address", required: true }, name: { alias: "n", type: "string", description: "User full name", required: true }, password: { alias: "p", type: "string", description: "User password", required: true }, role: { alias: "r", type: "string", description: 'User role (defaults to "user")', default: "user" } }, async run({ args }) { const { email, name, password, role } = args; const options = await loadOptions(); try { const passwordOptions = getPasswordValidationOptions(options); const passwordValidation = validatePassword(password, passwordOptions); if (!passwordValidation.isValid) { console.error("[Nuxt Users] Password validation failed:"); passwordValidation.errors.forEach((error) => console.error(` - ${error}`)); process.exit(1); } const user = await createUser$1({ email, name, password, role }, options); console.log(`[Nuxt Users] User created successfully: ${user.email} (role: ${user.role})`); process.exit(0); } catch (error) { console.error("[Nuxt Users] Error:", error); process.exit(1); } } }); const createUsersTable = defineCommand({ meta: { name: "create-users-table", description: "Create the users table in the database" }, async run() { console.log("[Nuxt Users] Creating users table..."); const options = await loadOptions(); try { await createUsersTable$1(options); console.log("[Nuxt Users] Users table created successfully!"); } catch (error) { console.error("[Nuxt Users] DB:Create Users Table Error:", error); process.exit(1); } } }); const createPersonalAccessTokensTable = defineCommand({ meta: { name: "create-personal-access-tokens-table", description: "Create the personal access tokens table in the database" }, async run() { console.log("[Nuxt Users] Creating personal access tokens table..."); const options = await loadOptions(); try { await createPersonalAccessTokensTable$1(options); console.log("[Nuxt Users] Personal access tokens table created successfully!"); } catch (error) { console.error("[Nuxt Users] DB:Create Personal Access Tokens Table Error:", error); process.exit(1); } } }); const createPasswordResetTokensTable = defineCommand({ meta: { name: "create-password-reset-tokens-table", description: "Create the password reset tokens table in the database" }, async run() { console.log("[Nuxt Users] Creating password reset tokens table..."); const options = await loadOptions(); try { await createPasswordResetTokensTable$1(options); console.log("[Nuxt Users] Password reset tokens table created successfully!"); } catch (error) { console.error("[Nuxt Users] DB:Create Password Reset Tokens Table Error:", error); process.exit(1); } } }); const createMigrationsTable = defineCommand({ meta: { name: "create-migrations-table", description: "Create the migrations table in the database" }, async run() { console.log("[Nuxt Users] Creating migrations table..."); const options = await loadOptions(); try { await createMigrationsTable$1(options); console.log("[Nuxt Users] Migrations table created successfully!"); } catch (error) { console.error("[Nuxt Users] DB:Create Migrations Table Error:", error); process.exit(1); } } }); const projectInfo = defineCommand({ meta: { name: "project-info", description: "Get information about the Nuxt project and module configuration" }, async run() { try { console.log("[Nuxt Users] Loading Nuxt project..."); const nuxt = await loadNuxt({ cwd: process.cwd() }); console.log("[Nuxt Users] \u2705 Nuxt project loaded successfully!"); console.log("[Nuxt Users] \u{1F4C1} Source directory:", nuxt.options.srcDir); console.log("[Nuxt Users] \u{1F310} Base URL:", nuxt.options.app?.baseURL || "/"); const nuxtUsersConfig = nuxt.options.runtimeConfig?.nuxtUsers; if (nuxtUsersConfig) { console.log("[Nuxt Users] \u{1F527} Nuxt Users module configuration:"); console.log("[Nuxt Users] Database connector:", nuxtUsersConfig.connector?.name); console.log("[Nuxt Users] Users table:", nuxtUsersConfig.tables?.users); console.log("[Nuxt Users] Personal access tokens table:", nuxtUsersConfig.tables?.personalAccessTokens); console.log("[Nuxt Users] Password reset tokens table:", nuxtUsersConfig.tables?.passwordResetTokens); } else { console.log("[Nuxt Users] \u26A0\uFE0F Nuxt Users module not configured in runtime config"); } const publicConfig = nuxt.options.runtimeConfig?.nuxtUsers; if (publicConfig) { console.log("[Nuxt Users] \u{1F30D} Public runtime config:"); console.log("[Nuxt Users] Users table exists:", publicConfig.tables?.users); console.log("[Nuxt Users] Personal access tokens table exists:", publicConfig.tables?.personalAccessTokens); console.log("[Nuxt Users] Password reset tokens table exists:", publicConfig.tables?.passwordResetTokens); } } catch (error) { console.error("[Nuxt Users] \u274C Could not load Nuxt project:", error); process.exit(1); } } }); const main = defineCommand({ meta: { name: "nuxt-users", description: "CLI for Nuxt Users Module - Manage users, migrations, and database operations", version: "1.12.0" }, subCommands: { migrate, "create-user": createUser, "create-users-table": createUsersTable, "create-personal-access-tokens-table": createPersonalAccessTokensTable, "create-password-reset-tokens-table": createPasswordResetTokensTable, "create-migrations-table": createMigrationsTable, "project-info": projectInfo } }); runMain(main);