{"_id":"@codeble/agniplus","name":"@codeble/agniplus","dist-tags":{"latest":"1.0.0"},"versions":{"1.0.0":{"name":"@codeble/agniplus","version":"1.0.0","description":"Complete authentication solution for Agni.JS - NextAuth alternative","main":"index.js","types":"index.d.ts","keywords":["agni","auth","authentication","oauth","jwt","session","nextauth"],"dependencies":{"jsonwebtoken":"^9.0.2","bcryptjs":"^2.4.3","otpauth":"^9.2.0","qrcode":"^1.5.3","nodemailer":"^6.9.7","crypto":"^1.0.1"},"peerDependencies":{"react":"^18.0.0","react-dom":"^18.0.0"},"gitHead":"74dcaba9c59304857d8e5492f8194cbef97798f6","_id":"@codeble/agniplus@1.0.0","_nodeVersion":"20.19.1","_npmVersion":"11.17.0","dist":{"integrity":"sha512-1M9gYj4ldQBusebzW5Cll1hJHqTPTmYr+pP3DtTmra5sQoSt+P8yQcFPdqmQpFzEg8MQySzmlprhAbkC8Ma8iw==","shasum":"8261c7541402b3903655b28777bf822a6dee609c","tarball":"https://registry.npmjs.org/@codeble/agniplus/-/agniplus-1.0.0.tgz","fileCount":19,"unpackedSize":150558,"signatures":[{"keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U","sig":"MEYCIQCONRXOl/z1JNy97J61zuz+AAsTO8rbyzjchFs//PzokgIhAPJCtP5r68MzzjHowZiCANqBlkbUWCgp4kO8lbqo14Wm"}]},"_npmUser":{"name":"codeble.dev","email":"theashis.world@gmail.com"},"directories":{},"maintainers":[{"name":"codeble.dev","email":"theashis.world@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages-npm-production","tmp":"tmp/agniplus_1.0.0_1782707482592_0.17529019458108164"},"_hasShrinkwrap":false}},"time":{"created":"2026-06-29T04:31:22.349Z","1.0.0":"2026-06-29T04:31:22.744Z","modified":"2026-06-29T04:31:23.051Z"},"maintainers":[{"name":"codeble.dev","email":"theashis.world@gmail.com"}],"description":"Complete authentication solution for Agni.JS - NextAuth alternative","keywords":["agni","auth","authentication","oauth","jwt","session","nextauth"],"readme":"# AgniPlus 🔐\n\nComplete authentication solution for Agni.JS - NextAuth.js alternative with extended features.\n\n## Features\n\n-   **Multiple OAuth Providers** - Google, GitHub, Twitter, Discord, Facebook, Apple, LinkedIn, Auth0\n-   **Email/Password Auth** - Traditional credentials with validation\n- ✉️ **Magic Link Auth** - Passwordless email authentication\n-   **JWT & Database Sessions** - Flexible session management\n-  ️ **Database Adapters** - Prisma, MongoDB, PostgreSQL, MySQL, SQLite, Supabase, Firebase\n-  ️ **Role-Based Access Control** - User roles and permissions\n-   **Two-Factor Authentication** - TOTP-based 2FA\n-   **Webhooks** - Auth event notifications\n-   **React Hooks & Components** - Pre-built UI components\n\n## Installation\n\n```bash\nnpm install @agni.js/agniplus\n```\n\n## Quick Start\n\n### 1. Configure AgniPlus\n\n```javascript\n// lib/agniplus.js\nimport { createAgniPlus } from '@agni.js/agniplus';\n\nexport const auth = createAgniPlus({\n  // Session configuration\n  session: {\n    strategy: 'jwt', // or 'database'\n    maxAge: 30 * 24 * 60 * 60, // 30 days\n  },\n\n  // JWT configuration\n  jwt: {\n    secret: process.env.AGNIPLUS_JWT_SECRET,\n  },\n\n  // Providers\n  providers: [\n    // Google OAuth\n    {\n      id: 'google',\n      type: 'oauth',\n      clientId: process.env.GOOGLE_CLIENT_ID,\n      clientSecret: process.env.GOOGLE_CLIENT_SECRET,\n    },\n\n    // GitHub OAuth\n    {\n      id: 'github',\n      type: 'oauth',\n      clientId: process.env.GITHUB_CLIENT_ID,\n      clientSecret: process.env.GITHUB_CLIENT_SECRET,\n    },\n\n    // Credentials (Email/Password)\n    {\n      type: 'credentials',\n      authorize: async (credentials) => {\n        // Your custom logic to verify credentials\n        const user = await db.user.findUnique({\n          where: { email: credentials.email },\n        });\n\n        if (user && verifyPassword(credentials.password, user.password)) {\n          return user;\n        }\n\n        return null;\n      },\n    },\n\n    // Magic Link\n    {\n      type: 'magic-link',\n    },\n  ],\n\n  // Database adapter (optional)\n  database: {\n    type: 'prisma',\n    prisma: prisma,\n  },\n\n  // Callbacks\n  callbacks: {\n    signIn: async ({ user, account }) => {\n      // Allow sign in\n      return true;\n    },\n\n    session: async ({ session, token }) => {\n      // Add custom data to session\n      session.user.id = token.sub;\n      return session;\n    },\n  },\n\n  // Events\n  events: {\n    signIn: async ({ user }) => {\n      console.log('User signed in:', user.email);\n    },\n  },\n});\n```\n\n### 2. Create API Route\n\n```javascript\n// pages/api/auth/[...agniplus].js\nimport { auth } from '@/lib/agniplus';\n\nexport default async function handler(req, res) {\n  return auth.handleRequest(req, res);\n}\n```\n\n### 3. Wrap Your App with Provider\n\n```javascript\n// pages/_app.js\nimport { AuthProvider } from '@agni.js/agniplus';\n\nexport default function App({ Component, pageProps }) {\n  return (\n    <AuthProvider session={pageProps.session}>\n      <Component {...pageProps} />\n    </AuthProvider>\n  );\n}\n```\n\n### 4. Use in Your Pages\n\n```javascript\n// pages/dashboard.js\nimport { useSession, useAuth, AuthGuard } from '@agni.js/agniplus';\n\nexport default function Dashboard() {\n  const { data: session, status } = useSession();\n  const { signOut } = useAuth();\n\n  if (status === 'loading') {\n    return <div>Loading...</div>;\n  }\n\n  return (\n    <AuthGuard>\n      <h1>Welcome, {session.user.name}!</h1>\n      <p>Email: {session.user.email}</p>\n      <button onClick={() => signOut()}>Sign Out</button>\n    </AuthGuard>\n  );\n}\n```\n\n## Providers\n\n### OAuth Providers\n\n```javascript\nimport {\n  createGoogleProvider,\n  createGitHubProvider,\n  createTwitterProvider,\n  createDiscordProvider,\n  createFacebookProvider,\n  createAppleProvider,\n  createLinkedInProvider,\n  createAuth0Provider,\n} from '@agni.js/agniplus';\n\n// Google\nconst google = createGoogleProvider({\n  clientId: process.env.GOOGLE_CLIENT_ID,\n  clientSecret: process.env.GOOGLE_CLIENT_SECRET,\n});\n\n// GitHub\nconst github = createGitHubProvider({\n  clientId: process.env.GITHUB_CLIENT_ID,\n  clientSecret: process.env.GITHUB_CLIENT_SECRET,\n});\n\n// Custom OAuth\nconst custom = createCustomOAuthProvider({\n  id: 'custom',\n  name: 'Custom Provider',\n  authorization: { url: 'https://example.com/auth' },\n  token: { url: 'https://example.com/token' },\n  userinfo: { url: 'https://example.com/userinfo' },\n  clientId: 'your-client-id',\n  clientSecret: 'your-client-secret',\n  profile: (profile) => ({\n    id: profile.id,\n    name: profile.name,\n    email: profile.email,\n  }),\n});\n```\n\n### Credentials Provider\n\n```javascript\nimport { createCredentialsProvider } from '@agni.js/agniplus';\n\nconst credentials = createCredentialsProvider({\n  authorize: async (credentials) => {\n    const user = await db.user.findUnique({\n      where: { email: credentials.email },\n    });\n\n    if (user && await verifyPassword(credentials.password, user.password)) {\n      return {\n        id: user.id,\n        email: user.email,\n        name: user.name,\n      };\n    }\n\n    return null;\n  },\n});\n```\n\n### Magic Link Provider\n\n```javascript\nimport { createMagicLinkProvider } from '@agni.js/agniplus';\n\nconst magicLink = createMagicLinkProvider({\n  // Optional: Custom SMTP config\n  smtp: {\n    host: 'smtp.gmail.com',\n    port: 587,\n    auth: { user: 'user@gmail.com', pass: 'password' },\n  },\n\n  // Optional: Custom email template\n  templates: {\n    magicLink: ({ url, email, expiresIn }) => ({\n      subject: 'Sign in to your account',\n      html: `<a href=\"${url}\">Click here to sign in</a>`,\n      text: `Sign in: ${url}`,\n    }),\n  },\n});\n```\n\n## Database Adapters\n\n### Prisma\n\n```javascript\nimport { createPrismaAdapter } from '@agni.js/agniplus';\nimport { PrismaClient } from '@prisma/client';\n\nconst prisma = new PrismaClient();\n\nconst adapter = createPrismaAdapter({\n  prisma,\n  // Optional: Custom model names\n  models: {\n    user: 'user',\n    account: 'account',\n    session: 'session',\n    verificationToken: 'verificationToken',\n  },\n});\n```\n\n### MongoDB\n\n```javascript\nimport { createMongoAdapter } from '@agni.js/agniplus';\nimport { MongoClient } from 'mongodb';\n\nconst client = new MongoClient(process.env.MONGODB_URI);\n\nconst adapter = createMongoAdapter({\n  client,\n  // Optional: Custom collection names\n  collections: {\n    users: 'agni_users',\n    accounts: 'agni_accounts',\n    sessions: 'agni_sessions',\n    verificationTokens: 'agni_verification_tokens',\n  },\n});\n```\n\n## React Hooks\n\n```javascript\nimport {\n  useSession,\n  useAuth,\n  useSignIn,\n  useSignOut,\n  useUser,\n  useCSRF,\n  useProviders,\n} from '@agni.js/agniplus';\n```\n\n### useSession\n\n```javascript\nconst { data: session, status, update } = useSession();\n```\n\n### useAuth\n\n```javascript\nconst {\n  user,\n  session,\n  loading,\n  error,\n  signIn,\n  signInWithCredentials,\n  signInWithMagicLink,\n  signOut,\n  fetchSession,\n  getCsrfToken,\n  getProviders,\n  sendPasswordReset,\n  resetPassword,\n  updateUser,\n} = useAuth();\n```\n\n## React Components\n\n```javascript\nimport {\n  SignIn,\n  SignUp,\n  SignOut,\n  UserButton,\n  AuthGuard,\n} from '@agni.js/agniplus';\n\n// Sign In page\n<SignIn providers={providers} callbackUrl=\"/dashboard\" />\n\n// Sign Up page\n<SignUp callbackUrl=\"/\" />\n\n// Sign Out page\n<SignOut callbackUrl=\"/\" />\n\n// User button with dropdown\n<UserButton />\n\n// Protected content\n<AuthGuard requiredRole=\"admin\">\n  <AdminPanel />\n</AuthGuard>\n```\n\n## TypeScript\n\nAgniPlus is fully typed. See `index.d.ts` for all type definitions.\n\n```typescript\nimport type { AgniPlusConfig, Session, User } from '@agni.js/agniplus';\n\nconst config: AgniPlusConfig = {\n  session: { strategy: 'jwt' },\n  providers: [\n    { id: 'google', type: 'oauth', clientId: '...', clientSecret: '...' },\n  ],\n};\n```\n\n## Environment Variables\n\n```env\n# JWT Secret (required)\nAGNIPLUS_JWT_SECRET=your-secret-key\n\n# Base URL\nAGNIPLUS_BASE_URL=http://localhost:3000\n\n# OAuth Providers\nGOOGLE_CLIENT_ID=\nGOOGLE_CLIENT_SECRET=\nGITHUB_CLIENT_ID=\nGITHUB_CLIENT_SECRET=\n\n# SMTP (for email/magic link)\nSMTP_HOST=smtp.gmail.com\nSMTP_PORT=587\nSMTP_USER=\nSMTP_PASS=\n```\n\n## License\n\nMIT\n","readmeFilename":"README.md","_rev":"1-aca1e74505c3e1608c5308990f4ba8a7"}