ras-stack 0.44.0 → 0.45.0
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/dist/auth/index.d.ts +3 -3
- package/dist/auth/index.js +1 -1
- package/dist/auth/index.js.map +1 -1
- package/dist/auth/providers.d.ts +7 -3
- package/dist/auth/providers.js +18 -14
- package/dist/auth/providers.js.map +1 -1
- package/dist/auth/settings.d.ts +15 -1
- package/dist/auth/settings.js +13 -2
- package/dist/auth/settings.js.map +1 -1
- package/examples/full-stack/src/server/auth.ts +2 -1
- package/package.json +1 -1
package/dist/auth/index.d.ts
CHANGED
|
@@ -1,9 +1,9 @@
|
|
|
1
1
|
export { acceptedOrigins, forwardedOrigin, parseOrigin, requireSameOrigin, trustedOrigins, validSameOriginRequest } from './origins.js';
|
|
2
2
|
export type { OriginOptions } from './origins.js';
|
|
3
3
|
export { configuredProviderOptions, configuredProviders, providerCredentials } from './providers.js';
|
|
4
|
-
export type { ProviderCredentials } from './providers.js';
|
|
4
|
+
export type { ProviderCredentials, ProviderEnvironmentOptions } from './providers.js';
|
|
5
5
|
export { randomId, randomToken } from './random.js';
|
|
6
6
|
export { persistedSecret } from './secret.js';
|
|
7
7
|
export type { PersistedSecretOptions } from './secret.js';
|
|
8
|
-
export { standardRateLimitOptions, standardSessionOptions } from './settings.js';
|
|
9
|
-
export type { RateLimitRule } from './settings.js';
|
|
8
|
+
export { standardAccountOptions, standardRateLimitOptions, standardSessionOptions } from './settings.js';
|
|
9
|
+
export type { RateLimitRule, SessionOptions, StandardAccountOptions } from './settings.js';
|
package/dist/auth/index.js
CHANGED
|
@@ -2,5 +2,5 @@ export { acceptedOrigins, forwardedOrigin, parseOrigin, requireSameOrigin, trust
|
|
|
2
2
|
export { configuredProviderOptions, configuredProviders, providerCredentials } from './providers.js';
|
|
3
3
|
export { randomId, randomToken } from './random.js';
|
|
4
4
|
export { persistedSecret } from './secret.js';
|
|
5
|
-
export { standardRateLimitOptions, standardSessionOptions } from './settings.js';
|
|
5
|
+
export { standardAccountOptions, standardRateLimitOptions, standardSessionOptions } from './settings.js';
|
|
6
6
|
//# sourceMappingURL=index.js.map
|
package/dist/auth/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/auth/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,eAAe,EAAE,WAAW,EAAE,iBAAiB,EAAE,cAAc,EAAE,sBAAsB,EAAE,MAAM,cAAc,CAAA;AAEvI,OAAO,EAAE,yBAAyB,EAAE,mBAAmB,EAAE,mBAAmB,EAAE,MAAM,gBAAgB,CAAA;AAEpG,OAAO,EAAE,QAAQ,EAAE,WAAW,EAAE,MAAM,aAAa,CAAA;AACnD,OAAO,EAAE,eAAe,EAAE,MAAM,aAAa,CAAA;AAE7C,OAAO,EAAE,wBAAwB,EAAE,sBAAsB,EAAE,MAAM,eAAe,CAAA","sourcesContent":["export { acceptedOrigins, forwardedOrigin, parseOrigin, requireSameOrigin, trustedOrigins, validSameOriginRequest } from './origins.js'\nexport type { OriginOptions } from './origins.js'\nexport { configuredProviderOptions, configuredProviders, providerCredentials } from './providers.js'\nexport type { ProviderCredentials } from './providers.js'\nexport { randomId, randomToken } from './random.js'\nexport { persistedSecret } from './secret.js'\nexport type { PersistedSecretOptions } from './secret.js'\nexport { standardRateLimitOptions, standardSessionOptions } from './settings.js'\nexport type { RateLimitRule } from './settings.js'\n"]}
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/auth/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,eAAe,EAAE,WAAW,EAAE,iBAAiB,EAAE,cAAc,EAAE,sBAAsB,EAAE,MAAM,cAAc,CAAA;AAEvI,OAAO,EAAE,yBAAyB,EAAE,mBAAmB,EAAE,mBAAmB,EAAE,MAAM,gBAAgB,CAAA;AAEpG,OAAO,EAAE,QAAQ,EAAE,WAAW,EAAE,MAAM,aAAa,CAAA;AACnD,OAAO,EAAE,eAAe,EAAE,MAAM,aAAa,CAAA;AAE7C,OAAO,EAAE,sBAAsB,EAAE,wBAAwB,EAAE,sBAAsB,EAAE,MAAM,eAAe,CAAA","sourcesContent":["export { acceptedOrigins, forwardedOrigin, parseOrigin, requireSameOrigin, trustedOrigins, validSameOriginRequest } from './origins.js'\nexport type { OriginOptions } from './origins.js'\nexport { configuredProviderOptions, configuredProviders, providerCredentials } from './providers.js'\nexport type { ProviderCredentials, ProviderEnvironmentOptions } from './providers.js'\nexport { randomId, randomToken } from './random.js'\nexport { persistedSecret } from './secret.js'\nexport type { PersistedSecretOptions } from './secret.js'\nexport { standardAccountOptions, standardRateLimitOptions, standardSessionOptions } from './settings.js'\nexport type { RateLimitRule, SessionOptions, StandardAccountOptions } from './settings.js'\n"]}
|
package/dist/auth/providers.d.ts
CHANGED
|
@@ -2,6 +2,10 @@ export type ProviderCredentials = {
|
|
|
2
2
|
clientId: string;
|
|
3
3
|
clientSecret: string;
|
|
4
4
|
};
|
|
5
|
-
export
|
|
6
|
-
|
|
7
|
-
|
|
5
|
+
export type ProviderEnvironmentOptions = {
|
|
6
|
+
prefix?: string;
|
|
7
|
+
rejectPartial?: boolean;
|
|
8
|
+
};
|
|
9
|
+
export declare function configuredProviders<const Provider extends string>(providers: readonly Provider[], environment?: NodeJS.ProcessEnv, options?: ProviderEnvironmentOptions): Provider[];
|
|
10
|
+
export declare function providerCredentials(provider: string, environment?: NodeJS.ProcessEnv, options?: ProviderEnvironmentOptions): ProviderCredentials | undefined;
|
|
11
|
+
export declare function configuredProviderOptions<const Provider extends string>(providers: readonly Provider[], environment?: NodeJS.ProcessEnv, environmentOptions?: ProviderEnvironmentOptions): Partial<Record<Provider, ProviderCredentials>>;
|
package/dist/auth/providers.js
CHANGED
|
@@ -1,22 +1,26 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
return Boolean(environment[`${prefix}_CLIENT_ID`]?.trim() && environment[`${prefix}_CLIENT_SECRET`]?.trim());
|
|
5
|
-
});
|
|
1
|
+
function providerEnvironmentKeys(provider, prefix = '') {
|
|
2
|
+
const name = provider.toUpperCase().replaceAll('-', '_');
|
|
3
|
+
return { clientId: `${prefix}${name}_CLIENT_ID`, clientSecret: `${prefix}${name}_CLIENT_SECRET` };
|
|
6
4
|
}
|
|
7
|
-
export function
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
5
|
+
export function configuredProviders(providers, environment = process.env, options = {}) {
|
|
6
|
+
return providers.filter((provider) => Boolean(providerCredentials(provider, environment, options)));
|
|
7
|
+
}
|
|
8
|
+
export function providerCredentials(provider, environment = process.env, options = {}) {
|
|
9
|
+
const keys = providerEnvironmentKeys(provider, options.prefix);
|
|
10
|
+
const clientId = environment[keys.clientId]?.trim();
|
|
11
|
+
const clientSecret = environment[keys.clientSecret]?.trim();
|
|
12
|
+
if (options.rejectPartial && Boolean(clientId) !== Boolean(clientSecret)) {
|
|
13
|
+
throw new Error(`${keys.clientId} and ${keys.clientSecret} must be configured together`);
|
|
14
|
+
}
|
|
11
15
|
return clientId && clientSecret ? { clientId, clientSecret } : undefined;
|
|
12
16
|
}
|
|
13
|
-
export function configuredProviderOptions(providers, environment = process.env) {
|
|
14
|
-
const
|
|
17
|
+
export function configuredProviderOptions(providers, environment = process.env, environmentOptions = {}) {
|
|
18
|
+
const providerOptions = {};
|
|
15
19
|
for (const provider of providers) {
|
|
16
|
-
const credentials = providerCredentials(provider, environment);
|
|
20
|
+
const credentials = providerCredentials(provider, environment, environmentOptions);
|
|
17
21
|
if (credentials)
|
|
18
|
-
|
|
22
|
+
providerOptions[provider] = credentials;
|
|
19
23
|
}
|
|
20
|
-
return
|
|
24
|
+
return providerOptions;
|
|
21
25
|
}
|
|
22
26
|
//# sourceMappingURL=providers.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"providers.js","sourceRoot":"","sources":["../../src/auth/providers.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"providers.js","sourceRoot":"","sources":["../../src/auth/providers.ts"],"names":[],"mappings":"AAGA,SAAS,uBAAuB,CAAC,QAAgB,EAAE,MAAM,GAAG,EAAE;IAC5D,MAAM,IAAI,GAAG,QAAQ,CAAC,WAAW,EAAE,CAAC,UAAU,CAAC,GAAG,EAAE,GAAG,CAAC,CAAA;IACxD,OAAO,EAAE,QAAQ,EAAE,GAAG,MAAM,GAAG,IAAI,YAAY,EAAE,YAAY,EAAE,GAAG,MAAM,GAAG,IAAI,gBAAgB,EAAE,CAAA;AACnG,CAAC;AAED,MAAM,UAAU,mBAAmB,CACjC,SAA8B,EAC9B,WAAW,GAAsB,OAAO,CAAC,GAAG,EAC5C,OAAO,GAA+B,EAAE;IAExC,OAAO,SAAS,CAAC,MAAM,CAAC,CAAC,QAAQ,EAAE,EAAE,CAAC,OAAO,CAAC,mBAAmB,CAAC,QAAQ,EAAE,WAAW,EAAE,OAAO,CAAC,CAAC,CAAC,CAAA;AACrG,CAAC;AAED,MAAM,UAAU,mBAAmB,CACjC,QAAgB,EAChB,WAAW,GAAsB,OAAO,CAAC,GAAG,EAC5C,OAAO,GAA+B,EAAE;IAExC,MAAM,IAAI,GAAG,uBAAuB,CAAC,QAAQ,EAAE,OAAO,CAAC,MAAM,CAAC,CAAA;IAC9D,MAAM,QAAQ,GAAG,WAAW,CAAC,IAAI,CAAC,QAAQ,CAAC,EAAE,IAAI,EAAE,CAAA;IACnD,MAAM,YAAY,GAAG,WAAW,CAAC,IAAI,CAAC,YAAY,CAAC,EAAE,IAAI,EAAE,CAAA;IAC3D,IAAI,OAAO,CAAC,aAAa,IAAI,OAAO,CAAC,QAAQ,CAAC,KAAK,OAAO,CAAC,YAAY,CAAC,EAAE,CAAC;QACzE,MAAM,IAAI,KAAK,CAAC,GAAG,IAAI,CAAC,QAAQ,QAAQ,IAAI,CAAC,YAAY,8BAA8B,CAAC,CAAA;IAC1F,CAAC;IACD,OAAO,QAAQ,IAAI,YAAY,CAAC,CAAC,CAAC,EAAE,QAAQ,EAAE,YAAY,EAAE,CAAC,CAAC,CAAC,SAAS,CAAA;AAC1E,CAAC;AAED,MAAM,UAAU,yBAAyB,CACvC,SAA8B,EAC9B,WAAW,GAAsB,OAAO,CAAC,GAAG,EAC5C,kBAAkB,GAA+B,EAAE;IAEnD,MAAM,eAAe,GAAmD,EAAE,CAAA;IAC1E,KAAK,MAAM,QAAQ,IAAI,SAAS,EAAE,CAAC;QACjC,MAAM,WAAW,GAAG,mBAAmB,CAAC,QAAQ,EAAE,WAAW,EAAE,kBAAkB,CAAC,CAAA;QAClF,IAAI,WAAW;YAAE,eAAe,CAAC,QAAQ,CAAC,GAAG,WAAW,CAAA;IAC1D,CAAC;IACD,OAAO,eAAe,CAAA;AACxB,CAAC","sourcesContent":["export type ProviderCredentials = { clientId: string; clientSecret: string }\nexport type ProviderEnvironmentOptions = { prefix?: string; rejectPartial?: boolean }\n\nfunction providerEnvironmentKeys(provider: string, prefix = '') {\n const name = provider.toUpperCase().replaceAll('-', '_')\n return { clientId: `${prefix}${name}_CLIENT_ID`, clientSecret: `${prefix}${name}_CLIENT_SECRET` }\n}\n\nexport function configuredProviders<const Provider extends string>(\n providers: readonly Provider[],\n environment: NodeJS.ProcessEnv = process.env,\n options: ProviderEnvironmentOptions = {},\n) {\n return providers.filter((provider) => Boolean(providerCredentials(provider, environment, options)))\n}\n\nexport function providerCredentials(\n provider: string,\n environment: NodeJS.ProcessEnv = process.env,\n options: ProviderEnvironmentOptions = {},\n): ProviderCredentials | undefined {\n const keys = providerEnvironmentKeys(provider, options.prefix)\n const clientId = environment[keys.clientId]?.trim()\n const clientSecret = environment[keys.clientSecret]?.trim()\n if (options.rejectPartial && Boolean(clientId) !== Boolean(clientSecret)) {\n throw new Error(`${keys.clientId} and ${keys.clientSecret} must be configured together`)\n }\n return clientId && clientSecret ? { clientId, clientSecret } : undefined\n}\n\nexport function configuredProviderOptions<const Provider extends string>(\n providers: readonly Provider[],\n environment: NodeJS.ProcessEnv = process.env,\n environmentOptions: ProviderEnvironmentOptions = {},\n): Partial<Record<Provider, ProviderCredentials>> {\n const providerOptions: Partial<Record<Provider, ProviderCredentials>> = {}\n for (const provider of providers) {\n const credentials = providerCredentials(provider, environment, environmentOptions)\n if (credentials) providerOptions[provider] = credentials\n }\n return providerOptions\n}\n"]}
|
package/dist/auth/settings.d.ts
CHANGED
|
@@ -2,10 +2,20 @@ export type RateLimitRule = {
|
|
|
2
2
|
window: number;
|
|
3
3
|
max: number;
|
|
4
4
|
};
|
|
5
|
-
export
|
|
5
|
+
export type SessionOptions = {
|
|
6
|
+
expiresIn?: number | undefined;
|
|
7
|
+
updateAge?: number | undefined;
|
|
8
|
+
};
|
|
9
|
+
export type StandardAccountOptions = {
|
|
10
|
+
encryptOAuthTokens?: boolean;
|
|
11
|
+
};
|
|
12
|
+
export declare function standardSessionOptions<const Options extends object>(overrides?: Options & SessionOptions): Options & {
|
|
6
13
|
expiresIn: number;
|
|
7
14
|
updateAge: number;
|
|
8
15
|
};
|
|
16
|
+
export declare function standardAccountOptions<const Options extends object>(overrides?: Options & StandardAccountOptions): Options & {
|
|
17
|
+
encryptOAuthTokens: boolean;
|
|
18
|
+
};
|
|
9
19
|
export declare function standardRateLimitOptions(customRules?: Record<string, RateLimitRule>): {
|
|
10
20
|
enabled: boolean;
|
|
11
21
|
storage: 'database';
|
|
@@ -24,5 +34,9 @@ export declare function standardRateLimitOptions(customRules?: Record<string, Ra
|
|
|
24
34
|
window: number;
|
|
25
35
|
max: number;
|
|
26
36
|
};
|
|
37
|
+
'/admin/set-user-password': {
|
|
38
|
+
window: number;
|
|
39
|
+
max: number;
|
|
40
|
+
};
|
|
27
41
|
};
|
|
28
42
|
};
|
package/dist/auth/settings.js
CHANGED
|
@@ -1,5 +1,15 @@
|
|
|
1
|
-
export function standardSessionOptions() {
|
|
2
|
-
return {
|
|
1
|
+
export function standardSessionOptions(overrides = {}) {
|
|
2
|
+
return {
|
|
3
|
+
...overrides,
|
|
4
|
+
expiresIn: overrides.expiresIn ?? 60 * 60 * 24 * 90,
|
|
5
|
+
updateAge: overrides.updateAge ?? 60 * 60 * 24,
|
|
6
|
+
};
|
|
7
|
+
}
|
|
8
|
+
export function standardAccountOptions(overrides = {}) {
|
|
9
|
+
return {
|
|
10
|
+
...overrides,
|
|
11
|
+
encryptOAuthTokens: overrides.encryptOAuthTokens ?? true,
|
|
12
|
+
};
|
|
3
13
|
}
|
|
4
14
|
export function standardRateLimitOptions(customRules = {}) {
|
|
5
15
|
return {
|
|
@@ -11,6 +21,7 @@ export function standardRateLimitOptions(customRules = {}) {
|
|
|
11
21
|
'/sign-in/email': { window: 60, max: 20 },
|
|
12
22
|
'/sign-up/email': { window: 60, max: 15 },
|
|
13
23
|
'/request-password-reset': { window: 60, max: 5 },
|
|
24
|
+
'/admin/set-user-password': { window: 60, max: 10 },
|
|
14
25
|
...customRules,
|
|
15
26
|
},
|
|
16
27
|
};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"settings.js","sourceRoot":"","sources":["../../src/auth/settings.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"settings.js","sourceRoot":"","sources":["../../src/auth/settings.ts"],"names":[],"mappings":"AAKA,MAAM,UAAU,sBAAsB,CAA+B,SAAS,GAA6B,EAA8B;IACvI,OAAO;QACL,GAAG,SAAS;QACZ,SAAS,EAAE,SAAS,CAAC,SAAS,IAAI,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE;QACnD,SAAS,EAAE,SAAS,CAAC,SAAS,IAAI,EAAE,GAAG,EAAE,GAAG,EAAE;KAC/C,CAAA;AACH,CAAC;AAED,MAAM,UAAU,sBAAsB,CACpC,SAAS,GAAqC,EAAsC;IAEpF,OAAO;QACL,GAAG,SAAS;QACZ,kBAAkB,EAAE,SAAS,CAAC,kBAAkB,IAAI,IAAI;KACzD,CAAA;AACH,CAAC;AAED,MAAM,UAAU,wBAAwB,CAAC,WAAW,GAAkC,EAAE;IACtF,OAAO;QACL,OAAO,EAAE,IAAI;QACb,OAAO,EAAE,UAAmB;QAC5B,MAAM,EAAE,EAAE;QACV,GAAG,EAAE,GAAG;QACR,WAAW,EAAE;YACX,gBAAgB,EAAE,EAAE,MAAM,EAAE,EAAE,EAAE,GAAG,EAAE,EAAE,EAAE;YACzC,gBAAgB,EAAE,EAAE,MAAM,EAAE,EAAE,EAAE,GAAG,EAAE,EAAE,EAAE;YACzC,yBAAyB,EAAE,EAAE,MAAM,EAAE,EAAE,EAAE,GAAG,EAAE,CAAC,EAAE;YACjD,0BAA0B,EAAE,EAAE,MAAM,EAAE,EAAE,EAAE,GAAG,EAAE,EAAE,EAAE;YACnD,GAAG,WAAW;SACf;KACF,CAAA;AACH,CAAC","sourcesContent":["export type RateLimitRule = { window: number; max: number }\n\nexport type SessionOptions = { expiresIn?: number | undefined; updateAge?: number | undefined }\nexport type StandardAccountOptions = { encryptOAuthTokens?: boolean }\n\nexport function standardSessionOptions<const Options extends object>(overrides: Options & SessionOptions = {} as Options & SessionOptions) {\n return {\n ...overrides,\n expiresIn: overrides.expiresIn ?? 60 * 60 * 24 * 90,\n updateAge: overrides.updateAge ?? 60 * 60 * 24,\n }\n}\n\nexport function standardAccountOptions<const Options extends object>(\n overrides: Options & StandardAccountOptions = {} as Options & StandardAccountOptions,\n) {\n return {\n ...overrides,\n encryptOAuthTokens: overrides.encryptOAuthTokens ?? true,\n }\n}\n\nexport function standardRateLimitOptions(customRules: Record<string, RateLimitRule> = {}) {\n return {\n enabled: true,\n storage: 'database' as const,\n window: 60,\n max: 120,\n customRules: {\n '/sign-in/email': { window: 60, max: 20 },\n '/sign-up/email': { window: 60, max: 15 },\n '/request-password-reset': { window: 60, max: 5 },\n '/admin/set-user-password': { window: 60, max: 10 },\n ...customRules,\n },\n }\n}\n"]}
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { drizzleAdapter } from '@better-auth/drizzle-adapter'
|
|
2
2
|
import { betterAuth } from 'better-auth'
|
|
3
3
|
import { tanstackStartCookies } from 'better-auth/tanstack-start'
|
|
4
|
-
import { standardRateLimitOptions, standardSessionOptions } from 'ras-stack/auth'
|
|
4
|
+
import { standardAccountOptions, standardRateLimitOptions, standardSessionOptions } from 'ras-stack/auth'
|
|
5
5
|
import type { EmailDelivery } from 'ras-stack/email'
|
|
6
6
|
import type { AppEnvironment } from './environment'
|
|
7
7
|
import * as schema from './schema'
|
|
@@ -31,6 +31,7 @@ export function createAuth(options: { database: Database; email?: EmailDelivery;
|
|
|
31
31
|
secret: options.secret,
|
|
32
32
|
trustedOrigins: [options.environment.appUrl],
|
|
33
33
|
database: drizzleAdapter(options.database, { provider: 'sqlite', schema }),
|
|
34
|
+
account: standardAccountOptions(),
|
|
34
35
|
emailAndPassword: {
|
|
35
36
|
enabled: true,
|
|
36
37
|
requireEmailVerification: Boolean(email) && options.environment.requireEmailVerification,
|