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
JavaScript
#!/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);