@luckystack/login 0.7.6 → 0.8.1
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 +6 -0
- package/dist/register.js +2 -2
- package/dist/register.js.map +1 -1
- package/package.json +3 -3
package/CHANGELOG.md
CHANGED
|
@@ -7,6 +7,12 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
|
|
|
7
7
|
|
|
8
8
|
## [Unreleased]
|
|
9
9
|
|
|
10
|
+
## [0.8.1] - 2026-07-27
|
|
11
|
+
|
|
12
|
+
### Fixed
|
|
13
|
+
|
|
14
|
+
- OAuth provider configuration selects production credentials from `NODE_ENV`, independent of named deploy-topology environments.
|
|
15
|
+
|
|
10
16
|
## [0.7.4] - 2026-07-22
|
|
11
17
|
|
|
12
18
|
### Fixed
|
package/dist/register.js
CHANGED
|
@@ -12,12 +12,12 @@ import {
|
|
|
12
12
|
} from "./chunk-CLYMWF3A.js";
|
|
13
13
|
|
|
14
14
|
// src/register.ts
|
|
15
|
-
import { getProjectConfig,
|
|
15
|
+
import { getProjectConfig, isProductionRuntime } from "@luckystack/core";
|
|
16
16
|
if (!isUserAdapterRegistered()) {
|
|
17
17
|
registerUserAdapter(defaultPrismaUserAdapter());
|
|
18
18
|
}
|
|
19
19
|
var buildProviders = () => {
|
|
20
|
-
const dev =
|
|
20
|
+
const dev = !isProductionRuntime();
|
|
21
21
|
const env = (key) => (dev ? process.env[`DEV_${key}`] : process.env[key]) ?? "";
|
|
22
22
|
const projectConfig = getProjectConfig();
|
|
23
23
|
const configuredCallbackBase = projectConfig.oauthCallbackBase ?? "";
|
package/dist/register.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/register.ts"],"sourcesContent":["//? Side-effect `./register` entry for @luckystack/login. Auto-imported at boot by\n//? @luckystack/server's `bootstrapLuckyStack` when this package is installed, so\n//? OAuth providers + the default user adapter wire themselves from env with NO\n//? consumer code edit — adding an OAuth provider is just env vars + restart.\n//?\n//? (Session-provider registration lives in this package's index module load —\n//? `bootstrapLuckyStack` force-loads it via `getLogin()`. This register entry\n//? covers the parts that USED to live in the consumer\n//? `luckystack/login/{oauthProviders,userAdapter}.ts` overlay.)\n//?\n//? A provider becomes active (its button shows on the login form via\n//? `GET /auth/providers` AND its `/auth/api/<name>` route works) as soon as BOTH\n//? its *_CLIENT_ID and *_CLIENT_SECRET are set for the current environment:\n//? `DEV_<KEY>` in dev, the unprefixed `<KEY>` in prod. The callback origin comes\n//? from `getProjectConfig().oauthCallbackBase` (set in the consumer's config.ts)\n//? — the redirect URI to register with each provider is\n//? `<oauthCallbackBase>/auth/callback/<provider>`.\n//?\n//? A consumer overlay (`luckystack/login/*.ts`) runs AFTER this import, so a\n//? hand-written `registerOAuthProviders(...)` / `registerUserAdapter(...)` still\n//? wins (last writer).\n\nimport { getProjectConfig,
|
|
1
|
+
{"version":3,"sources":["../src/register.ts"],"sourcesContent":["//? Side-effect `./register` entry for @luckystack/login. Auto-imported at boot by\n//? @luckystack/server's `bootstrapLuckyStack` when this package is installed, so\n//? OAuth providers + the default user adapter wire themselves from env with NO\n//? consumer code edit — adding an OAuth provider is just env vars + restart.\n//?\n//? (Session-provider registration lives in this package's index module load —\n//? `bootstrapLuckyStack` force-loads it via `getLogin()`. This register entry\n//? covers the parts that USED to live in the consumer\n//? `luckystack/login/{oauthProviders,userAdapter}.ts` overlay.)\n//?\n//? A provider becomes active (its button shows on the login form via\n//? `GET /auth/providers` AND its `/auth/api/<name>` route works) as soon as BOTH\n//? its *_CLIENT_ID and *_CLIENT_SECRET are set for the current environment:\n//? `DEV_<KEY>` in dev, the unprefixed `<KEY>` in prod. The callback origin comes\n//? from `getProjectConfig().oauthCallbackBase` (set in the consumer's config.ts)\n//? — the redirect URI to register with each provider is\n//? `<oauthCallbackBase>/auth/callback/<provider>`.\n//?\n//? A consumer overlay (`luckystack/login/*.ts`) runs AFTER this import, so a\n//? hand-written `registerOAuthProviders(...)` / `registerUserAdapter(...)` still\n//? wins (last writer).\n\nimport { getProjectConfig, isProductionRuntime } from '@luckystack/core';\nimport {\n registerOAuthProviderFactory,\n credentialsProvider,\n googleProvider,\n githubProvider,\n discordProvider,\n facebookProvider,\n microsoftProvider,\n type OAuthProvider,\n} from './oauthProviders';\nimport {\n registerUserAdapter,\n isUserAdapterRegistered,\n defaultPrismaUserAdapter,\n} from './userAdapter';\n\n//? Default Prisma-backed user store — guard so a consumer overlay that\n//? registered a custom adapter before this runs is never clobbered.\nif (!isUserAdapterRegistered()) {\n registerUserAdapter(defaultPrismaUserAdapter());\n}\n\n//? LOGIN-01: all config/env reads are deferred into a factory function that\n//? executes at first-request time, not at module-load time. This prevents\n//? stale-config footguns when `getProjectConfig()` is overridden after import\n//? (e.g. in tests or multi-step boot sequences). Module-load side effects\n//? in the block below are now limited to adapter registration (which is safe\n//? because the adapter registry itself does not depend on project config).\nconst buildProviders = (): OAuthProvider[] => {\n const dev = !isProductionRuntime();\n\n //? Reads `DEV_<key>` in dev, the unprefixed `<key>` in prod. Empty when unset.\n const env = (key: string): string => (dev ? process.env[`DEV_${key}`] : process.env[key]) ?? '';\n\n //? Backend origin for the OAuth redirect URI. Prefer the explicit\n //? `oauthCallbackBase` slot; fall back to `app.publicUrl` so a consumer that\n //? only set `publicUrl` still gets a usable callback.\n const projectConfig = getProjectConfig();\n //? Empty-string slot (the default) must fall through to publicUrl. Use an\n //? explicit length check so `??` (which would keep the empty string) is wrong here.\n const configuredCallbackBase = projectConfig.oauthCallbackBase ?? '';\n const callbackBase = configuredCallbackBase.length > 0 ? configuredCallbackBase : projectConfig.app.publicUrl;\n const callback = (name: string): string => `${callbackBase}/auth/callback/${name}`;\n\n //? Credentials (email+password) is a registry entry too, gated by a single\n //? config flag so the registry — exposed via GET /auth/providers — is the ONE\n //? source the login form reads (no duplicate static `config.providers` list).\n const providers: OAuthProvider[] = [];\n if (projectConfig.auth.credentials) {\n providers.push(credentialsProvider());\n }\n\n if (env('GOOGLE_CLIENT_ID') && env('GOOGLE_CLIENT_SECRET')) {\n providers.push(googleProvider({\n clientId: env('GOOGLE_CLIENT_ID'),\n clientSecret: env('GOOGLE_CLIENT_SECRET'),\n callbackUrl: callback('google'),\n }));\n }\n\n if (env('GITHUB_CLIENT_ID') && env('GITHUB_CLIENT_SECRET')) {\n providers.push(githubProvider({\n clientId: env('GITHUB_CLIENT_ID'),\n clientSecret: env('GITHUB_CLIENT_SECRET'),\n callbackUrl: callback('github'),\n }));\n }\n\n if (env('DISCORD_CLIENT_ID') && env('DISCORD_CLIENT_SECRET')) {\n providers.push(discordProvider({\n clientId: env('DISCORD_CLIENT_ID'),\n clientSecret: env('DISCORD_CLIENT_SECRET'),\n callbackUrl: callback('discord'),\n }));\n }\n\n if (env('FACEBOOK_CLIENT_ID') && env('FACEBOOK_CLIENT_SECRET')) {\n providers.push(facebookProvider({\n clientId: env('FACEBOOK_CLIENT_ID'),\n clientSecret: env('FACEBOOK_CLIENT_SECRET'),\n callbackUrl: callback('facebook'),\n }));\n }\n\n if (env('MICROSOFT_CLIENT_ID') && env('MICROSOFT_CLIENT_SECRET')) {\n providers.push(microsoftProvider({\n clientId: env('MICROSOFT_CLIENT_ID'),\n clientSecret: env('MICROSOFT_CLIENT_SECRET'),\n callbackUrl: callback('microsoft'),\n tenant: env('MICROSOFT_TENANT_ID') || undefined,\n }));\n }\n\n return providers;\n};\n\nregisterOAuthProviderFactory(buildProviders);\n"],"mappings":";;;;;;;;;;;;;;AAsBA,SAAS,kBAAkB,2BAA2B;AAmBtD,IAAI,CAAC,wBAAwB,GAAG;AAC9B,sBAAoB,yBAAyB,CAAC;AAChD;AAQA,IAAM,iBAAiB,MAAuB;AAC5C,QAAM,MAAM,CAAC,oBAAoB;AAGjC,QAAM,MAAM,CAAC,SAAyB,MAAM,QAAQ,IAAI,OAAO,GAAG,EAAE,IAAI,QAAQ,IAAI,GAAG,MAAM;AAK7F,QAAM,gBAAgB,iBAAiB;AAGvC,QAAM,yBAAyB,cAAc,qBAAqB;AAClE,QAAM,eAAe,uBAAuB,SAAS,IAAI,yBAAyB,cAAc,IAAI;AACpG,QAAM,WAAW,CAAC,SAAyB,GAAG,YAAY,kBAAkB,IAAI;AAKhF,QAAM,YAA6B,CAAC;AACpC,MAAI,cAAc,KAAK,aAAa;AAClC,cAAU,KAAK,oBAAoB,CAAC;AAAA,EACtC;AAEA,MAAI,IAAI,kBAAkB,KAAK,IAAI,sBAAsB,GAAG;AAC1D,cAAU,KAAK,eAAe;AAAA,MAC5B,UAAU,IAAI,kBAAkB;AAAA,MAChC,cAAc,IAAI,sBAAsB;AAAA,MACxC,aAAa,SAAS,QAAQ;AAAA,IAChC,CAAC,CAAC;AAAA,EACJ;AAEA,MAAI,IAAI,kBAAkB,KAAK,IAAI,sBAAsB,GAAG;AAC1D,cAAU,KAAK,eAAe;AAAA,MAC5B,UAAU,IAAI,kBAAkB;AAAA,MAChC,cAAc,IAAI,sBAAsB;AAAA,MACxC,aAAa,SAAS,QAAQ;AAAA,IAChC,CAAC,CAAC;AAAA,EACJ;AAEA,MAAI,IAAI,mBAAmB,KAAK,IAAI,uBAAuB,GAAG;AAC5D,cAAU,KAAK,gBAAgB;AAAA,MAC7B,UAAU,IAAI,mBAAmB;AAAA,MACjC,cAAc,IAAI,uBAAuB;AAAA,MACzC,aAAa,SAAS,SAAS;AAAA,IACjC,CAAC,CAAC;AAAA,EACJ;AAEA,MAAI,IAAI,oBAAoB,KAAK,IAAI,wBAAwB,GAAG;AAC9D,cAAU,KAAK,iBAAiB;AAAA,MAC9B,UAAU,IAAI,oBAAoB;AAAA,MAClC,cAAc,IAAI,wBAAwB;AAAA,MAC1C,aAAa,SAAS,UAAU;AAAA,IAClC,CAAC,CAAC;AAAA,EACJ;AAEA,MAAI,IAAI,qBAAqB,KAAK,IAAI,yBAAyB,GAAG;AAChE,cAAU,KAAK,kBAAkB;AAAA,MAC/B,UAAU,IAAI,qBAAqB;AAAA,MACnC,cAAc,IAAI,yBAAyB;AAAA,MAC3C,aAAa,SAAS,WAAW;AAAA,MACjC,QAAQ,IAAI,qBAAqB,KAAK;AAAA,IACxC,CAAC,CAAC;AAAA,EACJ;AAEA,SAAO;AACT;AAEA,6BAA6B,cAAc;","names":[]}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@luckystack/login",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.8.1",
|
|
4
4
|
"private": false,
|
|
5
5
|
"publishConfig": {
|
|
6
6
|
"access": "public",
|
|
@@ -59,7 +59,7 @@
|
|
|
59
59
|
"test": "vitest run"
|
|
60
60
|
},
|
|
61
61
|
"dependencies": {
|
|
62
|
-
"@luckystack/core": "^0.
|
|
62
|
+
"@luckystack/core": "^0.8.1",
|
|
63
63
|
"bcryptjs": "^3.0.0",
|
|
64
64
|
"dotenv": "^17.0.0",
|
|
65
65
|
"validator": "^13.15.35"
|
|
@@ -67,7 +67,7 @@
|
|
|
67
67
|
"peerDependencies": {
|
|
68
68
|
"@prisma/client": "^6.19.0",
|
|
69
69
|
"socket.io": "^4.8.0",
|
|
70
|
-
"@luckystack/email": "^0.
|
|
70
|
+
"@luckystack/email": "^0.8.1"
|
|
71
71
|
},
|
|
72
72
|
"peerDependenciesMeta": {
|
|
73
73
|
"@prisma/client": {
|