{"_id":"@azaria-ts/nexas","_rev":"3-6dfa48eb4bea1f9fbba6091da4fba90c","name":"@azaria-ts/nexas","dist-tags":{"latest":"1.0.2"},"versions":{"1.0.0":{"name":"@azaria-ts/nexas","version":"1.0.0","keywords":["oauth2","authentication","oauth","social-auth","google","github","linkedin","apple","discord","twitter","x","node.js","typescript"],"author":"","license":"ISC","_id":"@azaria-ts/nexas@1.0.0","maintainers":[{"name":"azaria-ts","email":"mbpavel21@gmail.com"}],"dist":{"shasum":"cbbfd92aad9200b4396c4da2a8e6d1f732fa4e9d","tarball":"https://registry.npmjs.org/@azaria-ts/nexas/-/nexas-1.0.0.tgz","fileCount":92,"integrity":"sha512-2qUm/9rNA+5oUOs0kyrDblB884nm6PvnySYaBNLvGxKdTiJpntv/LeMVINmxRZtY1M2LeL4gBjUQXa7o2IKjkw==","signatures":[{"sig":"MEQCIDP06mQcxQ6rKrqNWMEDmMUcJjg0S29GpCvnxoc5PXKNAiBHoq2uA2SNJpr0rZlYa5fI7n2OKTypE787Fy1h7sWYdw==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":134494},"main":"./dist/cjs/index.js","type":"module","types":"./dist/types/index.d.ts","module":"./dist/esm/index.js","engines":{"node":">=18.0.0"},"exports":{".":{"types":"./dist/types/index.d.ts","import":"./dist/esm/index.js","require":"./dist/cjs/index.js"}},"gitHead":"f7a193ef093b461b79e9b9b7946e48d3b10a8c12","scripts":{"test":"pnpm run build && node --test \"test/**/*.test.js\"","build":"pnpm clean && tsc -p tsconfig.json && tsc -p tsconfig.esm.json && node scripts/add-extensions.cjs","clean":"rm -rf dist","prepublishonly":"pnpm run clean && pnpm run build && pnpm run test"},"_npmUser":{"name":"azaria-ts","email":"mbpavel21@gmail.com"},"_npmVersion":"10.9.3","description":"Unified OAuth 2.0 authentication library for Node.js with support for Apple, Google, GitHub, LinkedIn, X, Discord, and more.","directories":{},"_nodeVersion":"22.20.0","_hasShrinkwrap":false,"packageManager":"pnpm@10.18.3","devDependencies":{"typescript":"^6.0.3","@types/node":"^25.6.0"},"_npmOperationalInternal":{"tmp":"tmp/nexas_1.0.0_1777064152528_0.7748558558353644","host":"s3://npm-registry-packages-npm-production"}},"1.0.1":{"name":"@azaria-ts/nexas","version":"1.0.1","keywords":["oauth2","authentication","oauth","social-auth","google","github","linkedin","apple","discord","twitter","x","node.js","typescript"],"author":"","license":"ISC","_id":"@azaria-ts/nexas@1.0.1","maintainers":[{"name":"azaria-ts","email":"mbpavel21@gmail.com"}],"dist":{"shasum":"d4fb04ab2d76496ef26af1a8f02fc26f2c2ec39c","tarball":"https://registry.npmjs.org/@azaria-ts/nexas/-/nexas-1.0.1.tgz","fileCount":8,"integrity":"sha512-urc4sm0gOKB+eqNS+EMvotiRDMaI4c7Kys6v3wzEqb3gmWHQ3DlDNEPRmuAlcINLhhFhpFlXufZc3xgpKY8tuw==","signatures":[{"sig":"MEQCIBkfIGUu/87d8VGhiB0Euz0bWp/rKI/RPgwWWjmtdnBjAiBCjduK4CL/t0FQ4bMRvFSQA64rvo7Q9lMtADJH7lf/Zw==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":213220},"main":"./dist/index.cjs","type":"module","types":"./dist/index.d.ts","module":"./dist/index.js","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js","require":"./dist/index.cjs"}},"gitHead":"f7a193ef093b461b79e9b9b7946e48d3b10a8c12","scripts":{"test":"pnpm run build && node --test \"test/**/*.test.js\"","build":"pnpm clean && tsup","clean":"rm -rf dist","prepublishonly":"pnpm run clean && pnpm run build && pnpm run test"},"_npmUser":{"name":"azaria-ts","email":"mbpavel21@gmail.com"},"_npmVersion":"10.9.3","description":"Unified OAuth 2.0 authentication library for Node.js with support for Apple, Google, GitHub, LinkedIn, X, Discord, and more.","directories":{},"_nodeVersion":"22.20.0","dependencies":{"tsup":"^8.5.1"},"_hasShrinkwrap":false,"devDependencies":{"typescript":"^6.0.3","@types/node":"^25.6.0"},"_npmOperationalInternal":{"tmp":"tmp/nexas_1.0.1_1778744747115_0.24309800798191894","host":"s3://npm-registry-packages-npm-production"}},"1.0.2":{"name":"@azaria-ts/nexas","version":"1.0.2","description":"Unified OAuth 2.0 authentication library for Node.js with support for Apple, Google, GitHub, LinkedIn, X, Discord, and more.","type":"module","types":"./dist/index.d.ts","main":"./dist/index.cjs","module":"./dist/index.js","sideEffects":false,"scripts":{"build":"pnpm run clean && pnpm run lint && pnpm run typecheck && tsup","clean":"rm -rf dist","lint":"eslint \"src/**/*.ts\"","test":"pnpm run build && node --test \"test/**/*.test.js\"","typecheck":"tsc -p tsconfig.json --noEmit","prepublishonly":"pnpm run clean && pnpm run build && pnpm run test"},"keywords":["oauth2","authentication","oauth","social-auth","google","github","linkedin","apple","discord","twitter","x","node.js","typescript"],"author":"","license":"ISC","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js","require":"./dist/index.cjs","default":"./dist/index.js"},"./package.json":"./package.json"},"devDependencies":{"@types/node":"^25.6.0","@typescript-eslint/eslint-plugin":"^8.44.0","@typescript-eslint/parser":"^8.44.0","eslint":"^9.36.0","typescript":"^6.0.3"},"dependencies":{"tsup":"^8.5.1"},"_id":"@azaria-ts/nexas@1.0.2","gitHead":"3f9b762ed60a64824c609bba89152159aa87032c","_nodeVersion":"22.20.0","_npmVersion":"10.9.3","dist":{"integrity":"sha512-ZcsKeQYuJthh5h6yvwsSKXN/twa6Taot/tgB+1PMufA3Hq27BcLH1VRye6iWnkN4j0kXmE/kkb/VhDS4hYtfDQ==","shasum":"29c9504882f0c88ca3429b02c4ea7289f417c578","tarball":"https://registry.npmjs.org/@azaria-ts/nexas/-/nexas-1.0.2.tgz","fileCount":8,"unpackedSize":199104,"signatures":[{"keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U","sig":"MEUCIAFqphhDlakYhtz/DrI2PBw1dBc302cDK8t6WhH3/XyvAiEAnpHnbzM3PllxuvYL/82SnyswWY8nDfJZ/gXRml4XS4Q="}]},"_npmUser":{"name":"azaria-ts","email":"mbpavel21@gmail.com"},"directories":{},"maintainers":[{"name":"azaria-ts","email":"mbpavel21@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages-npm-production","tmp":"tmp/nexas_1.0.2_1778746231813_0.5330101404187289"},"_hasShrinkwrap":false}},"time":{"created":"2026-04-24T20:55:52.404Z","modified":"2026-05-14T08:10:32.070Z","1.0.0":"2026-04-24T20:55:52.668Z","1.0.1":"2026-05-14T07:45:47.371Z","1.0.2":"2026-05-14T08:10:31.955Z"},"license":"ISC","keywords":["oauth2","authentication","oauth","social-auth","google","github","linkedin","apple","discord","twitter","x","node.js","typescript"],"description":"Unified OAuth 2.0 authentication library for Node.js with support for Apple, Google, GitHub, LinkedIn, X, Discord, and more.","maintainers":[{"name":"azaria-ts","email":"mbpavel21@gmail.com"}],"readme":"# nexas\n\nUnified OAuth 2.0 authentication library for Node.js with a single typed API.\n\n## Features\n\n- 11 built-in providers: Apple, Discord, Facebook, GitHub, GitLab, Google, Instagram, LinkedIn, Microsoft, Telegram V2, X\n- Typed config from available providers only\n- No manual provider instantiation in app config\n- Typed provider access with `nexas.use('...')`\n- Framework-agnostic (Express, Fastify, NestJS, Hono, etc.)\n\n## Installation\n\n```bash\npnpm add @azaria-ts/nexas\n# or\nnpm install @azaria-ts/nexas\n# or\nyarn add @azaria-ts/nexas\n```\n\n## Quick Start\n\n```ts\nimport { NexasClient } from 'nexas';\n\nconst nexas = new NexasClient({\n  defaultProvider: 'github',\n  defaultProviders: ['github', 'google'],\n  fallback: 'google',\n  requestTimeout: 10_000,\n  providers: {\n    github: {\n      clientId: process.env.GITHUB_CLIENT_ID!,\n      clientSecret: process.env.GITHUB_CLIENT_SECRET!,\n      callbackUrl: 'https://example.com/auth/github/callback'\n    },\n    google: {\n      clientId: process.env.GOOGLE_CLIENT_ID!,\n      clientSecret: process.env.GOOGLE_CLIENT_SECRET!,\n      callbackUrl: 'https://example.com/auth/google/callback'\n    },\n    discord: {\n      clientId: process.env.DISCORD_CLIENT_ID!,\n      clientSecret: process.env.DISCORD_CLIENT_SECRET!,\n      callbackUrl: 'https://example.com/auth/discord/callback'\n    }\n  }\n});\n```\n\n### Redirect\n\n```ts\napp.get('/auth/:provider?', (req, res) => {\n  const provider = req.params.provider as 'github' | 'google' | 'discord' | undefined;\n  res.redirect(nexas.getRedirectUrl(provider));\n});\n```\n\n### Callback\n\n```ts\napp.get('/auth/:provider/callback', async (req, res) => {\n  const code = req.query.code as string;\n  const provider = req.params.provider as 'github' | 'google' | 'discord';\n\n  const user = await nexas.getUser(code, provider);\n  res.json(user);\n});\n```\n\n## Typed Provider Matching\n\n`providers` accepts only provider keys that exist in this project:\n\n- `apple`\n- `discord`\n- `facebook`\n- `github`\n- `gitlab`\n- `google`\n- `instagram`\n- `linkedin`\n- `microsoft`\n- `telegramV2`\n- `x`\n\nEach key automaticNexas infers the expected config type:\n\n- `google` -> `GoogleOptions`\n- `microsoft` -> `MicrosoftAzureAdOptions` (includes optional `tenant`)\n- etc.\n\nNo need to write:\n\n```ts\nproviders: {\n  google: new GoogleProvider({ ... })\n}\n```\n\nUse:\n\n```ts\nproviders: {\n  google: { clientId, clientSecret, callbackUrl }\n}\n```\n\n## Provider Access in Controllers\n\nWhen `nexas` is created with a typed literal config, these methods are restricted to configured keys only:\n\n- `nexas.use('...')`\n- `nexas.driver('...')`\n- `nexas.getRedirectUrl('...')`\n- `nexas.getUser(code, '...')`\n\nExample:\n\n```ts\nconst googleDriver = nexas.use('google');\nconst url = googleDriver.getRedirectUrl();\n```\n\n## API\n\n### `new NexasClient(config)`\n\n`config` fields:\n\n- `providers` (required): typed providers configuration object\n- `defaultProvider` (optional): default provider key (must exist in `providers`)\n- `defaultProviders` (optional): ordered defaults list (must exist in `providers`)\n- `fallback` (optional): fallback provider key (must exist in `providers`)\n- `requestTimeout` (optional): timeout value available via `getRequestTimeout()`\n\n### Methods\n\n- `use(name)` -> provider instance (typed to configured providers)\n- `driver(name)` -> provider instance (typed to configured providers)\n- `getRedirectUrl(name?)` -> authorization URL\n- `getUser(code, name?)` -> normalized user\n- `getConfiguredProviders()` -> configured provider names\n- `getDefaultProvider()` / `setDefaultProvider(name)`\n- `getDefaultProviders()`\n- `getRequestTimeout()`\n\n## Unified User Object\n\n```ts\ninterface NexasUser {\n  id: string;\n  email: string;\n  name: string;\n  nickName?: string;\n  avatarUrl?: string;\n  token: {\n    accessToken: string;\n    refreshToken?: string;\n    expiresIn?: number;\n  };\n  original: any;\n}\n```\n\n## Custom Scopes\n\nSet `scope` inside a provider config:\n\n```ts\nconst nexas = new NexasClient({\n  providers: {\n    google: {\n      clientId: '...',\n      clientSecret: '...',\n      callbackUrl: '...',\n      scope: ['openid', 'email', 'profile', 'https://www.googleapis.com/auth/drive']\n    }\n  }\n});\n```\n\nSee [SCOPES.md](./SCOPES.md) for full scope reference.\n\n## Exports\n\n### Core\n\n- `NexasClient`\n- `NexasManager`\n- `BaseProvider`\n\n### Providers\n\n- `GoogleProvider`\n- `GitHubProvider`\n- `GitLabProvider`\n- `FacebookProvider`\n- `MicrosoftAzureAdProvider`\n- `AppleProvider`\n- `LinkedInProvider`\n- `XProvider`\n- `DiscordProvider`\n- `InstagramProvider`\n- `TelegramV2Provider`\n\n### Types\n\n- `NexasUser`\n- `ProviderOptions`\n- `OAuthTokenResponse`\n\n### Errors\n\n- `NexasError`\n- `NexasOAuthError`\n- `NexasDriverNotFoundError`\n","readmeFilename":"README.md"}