@amerged/ohmyhost-auth 0.1.23 → 0.1.25
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/README.md +1 -1
- package/dist/runtime.d.ts +1 -1
- package/dist/runtime.d.ts.map +1 -1
- package/dist/runtime.js +27 -2
- package/dist/runtime.js.map +1 -1
- package/package.json +1 -1
- package/src/packages/customer-auth-better-auth/package.json +45 -0
- package/src/packages/customer-auth-better-auth/{runtime.ts → src/runtime.ts} +29 -3
- /package/src/packages/customer-auth-better-auth/{index.ts → src/index.ts} +0 -0
- /package/src/packages/customer-auth-better-auth/{installation-contract.ts → src/installation-contract.ts} +0 -0
- /package/src/packages/customer-auth-better-auth/{mail-gateway.ts → src/mail-gateway.ts} +0 -0
- /package/src/packages/customer-auth-better-auth/{next.ts → src/next.ts} +0 -0
- /package/src/packages/customer-auth-better-auth/{schema.ts → src/schema.ts} +0 -0
- /package/src/packages/customer-auth-better-auth/{tanstack.ts → src/tanstack.ts} +0 -0
- /package/src/packages/customer-auth-better-auth/{vite-companion.ts → src/vite-companion.ts} +0 -0
- /package/src/packages/customer-auth-better-auth/{web-handler.ts → src/web-handler.ts} +0 -0
package/README.md
CHANGED
package/dist/runtime.d.ts
CHANGED
|
@@ -17,7 +17,7 @@ export interface CustomerAuthRuntimeInput {
|
|
|
17
17
|
readonly publicOrigin: string;
|
|
18
18
|
readonly database: Pool;
|
|
19
19
|
readonly secret: string;
|
|
20
|
-
readonly email
|
|
20
|
+
readonly email?: CustomerAuthEmailSender;
|
|
21
21
|
}
|
|
22
22
|
export declare function createCustomerAuthOptions(input: CustomerAuthRuntimeInput): BetterAuthOptions;
|
|
23
23
|
export declare function createCustomerAuth(input: CustomerAuthRuntimeInput): import("better-auth").Auth<BetterAuthOptions>;
|
package/dist/runtime.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"runtime.d.ts","sourceRoot":"","sources":["../src/runtime.ts"],"names":[],"mappings":";AACA,OAAO,EAAc,KAAK,iBAAiB,EAAE,MAAM,aAAa,CAAC;
|
|
1
|
+
{"version":3,"file":"runtime.d.ts","sourceRoot":"","sources":["../src/runtime.ts"],"names":[],"mappings":";AACA,OAAO,EAAc,KAAK,iBAAiB,EAAE,MAAM,aAAa,CAAC;AAEjE,OAAO,EAAE,IAAI,EAAE,MAAM,IAAI,CAAC;AAa1B,OAAO,QAAQ,qBAAqB,CAAC;IACnC,KAAK,KAAK,GAAG,UAAU,CAAC,OAAO,UAAU,CAAC,UAAU,CAAC,CAAC;CACvD;AAED,MAAM,WAAW,iBAAiB;IAChC,QAAQ,CAAC,IAAI,EAAE,kBAAkB,GAAG,gBAAgB,GAAG,cAAc,CAAC;IACtE,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAC;IACpB,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC;CACtB;AAED,MAAM,WAAW,uBAAuB;IACtC,IAAI,CAAC,OAAO,EAAE,iBAAiB,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;CACjD;AAED,MAAM,WAAW,wBAAwB;IACvC,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,YAAY,EAAE,MAAM,CAAC;IAC9B,QAAQ,CAAC,QAAQ,EAAE,IAAI,CAAC;IACxB,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,KAAK,CAAC,EAAE,uBAAuB,CAAC;CAC1C;AAED,wBAAgB,yBAAyB,CAAC,KAAK,EAAE,wBAAwB,GAAG,iBAAiB,CA2F5F;AAED,wBAAgB,kBAAkB,CAAC,KAAK,EAAE,wBAAwB,iDAEjE;AAED,wBAAgB,8BAA8B,CAAC,gBAAgB,EAAE,MAAM,GAAG,IAAI,CAG7E;AAyBD,MAAM,MAAM,YAAY,GAAG,UAAU,CAAC,OAAO,kBAAkB,CAAC,CAAC"}
|
package/dist/runtime.js
CHANGED
|
@@ -1,7 +1,14 @@
|
|
|
1
1
|
/// <reference types="bun-types/sqlite.d.ts" preserve="true" />
|
|
2
2
|
import { betterAuth } from "better-auth";
|
|
3
|
+
import { APIError, createAuthMiddleware } from "better-auth/api";
|
|
3
4
|
import { Pool } from "pg";
|
|
4
5
|
import { CUSTOMER_AUTH_INSTALLATION_CONTRACT } from "./installation-contract.js";
|
|
6
|
+
const MAIL_OPERATION_PATHS = new Set([
|
|
7
|
+
"/sign-up/email",
|
|
8
|
+
"/send-verification-email",
|
|
9
|
+
"/request-password-reset",
|
|
10
|
+
"/reset-password",
|
|
11
|
+
]);
|
|
5
12
|
export function createCustomerAuthOptions(input) {
|
|
6
13
|
const publicOrigin = parsePublicOrigin(input.publicOrigin);
|
|
7
14
|
const authBasePath = CUSTOMER_AUTH_INSTALLATION_CONTRACT.http.routePath;
|
|
@@ -13,10 +20,16 @@ export function createCustomerAuthOptions(input) {
|
|
|
13
20
|
typeof input.secret !== "string" ||
|
|
14
21
|
input.secret.length < 32 ||
|
|
15
22
|
input.secret.length > 512 ||
|
|
16
|
-
typeof input.email?.send !== "function") {
|
|
23
|
+
(input.email !== undefined && typeof input.email?.send !== "function")) {
|
|
17
24
|
throw new TypeError("Customer auth runtime input is invalid");
|
|
18
25
|
}
|
|
19
26
|
const send = async (kind, email, url) => {
|
|
27
|
+
if (input.email === undefined) {
|
|
28
|
+
throw APIError.from("SERVICE_UNAVAILABLE", {
|
|
29
|
+
code: "AUTH_EMAIL_SENDER_NOT_CONFIGURED",
|
|
30
|
+
message: "Configure an email sender for this authentication operation",
|
|
31
|
+
});
|
|
32
|
+
}
|
|
20
33
|
await input.email.send({
|
|
21
34
|
kind,
|
|
22
35
|
to: email,
|
|
@@ -32,6 +45,16 @@ export function createCustomerAuthOptions(input) {
|
|
|
32
45
|
trustedOrigins: [publicOrigin],
|
|
33
46
|
secret: input.secret,
|
|
34
47
|
database: input.database,
|
|
48
|
+
hooks: {
|
|
49
|
+
before: createAuthMiddleware(async (context) => {
|
|
50
|
+
if (input.email === undefined && MAIL_OPERATION_PATHS.has(context.path)) {
|
|
51
|
+
throw APIError.from("SERVICE_UNAVAILABLE", {
|
|
52
|
+
code: "AUTH_EMAIL_SENDER_NOT_CONFIGURED",
|
|
53
|
+
message: "Configure an email sender for this authentication operation",
|
|
54
|
+
});
|
|
55
|
+
}
|
|
56
|
+
}),
|
|
57
|
+
},
|
|
35
58
|
emailAndPassword: {
|
|
36
59
|
enabled: true,
|
|
37
60
|
requireEmailVerification: true,
|
|
@@ -45,7 +68,7 @@ export function createCustomerAuthOptions(input) {
|
|
|
45
68
|
},
|
|
46
69
|
emailVerification: {
|
|
47
70
|
sendOnSignUp: true,
|
|
48
|
-
sendOnSignIn:
|
|
71
|
+
sendOnSignIn: input.email !== undefined,
|
|
49
72
|
autoSignInAfterVerification: false,
|
|
50
73
|
expiresIn: 3_600,
|
|
51
74
|
sendVerificationEmail: ({ user, url }) => send("verification", user.email, url),
|
|
@@ -63,6 +86,8 @@ export function createCustomerAuthOptions(input) {
|
|
|
63
86
|
},
|
|
64
87
|
},
|
|
65
88
|
advanced: {
|
|
89
|
+
disableCSRFCheck: false,
|
|
90
|
+
disableOriginCheck: false,
|
|
66
91
|
useSecureCookies: true,
|
|
67
92
|
database: {
|
|
68
93
|
generateId: CUSTOMER_AUTH_INSTALLATION_CONTRACT.database.idGeneration,
|
package/dist/runtime.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"runtime.js","sourceRoot":"","sources":["../src/runtime.ts"],"names":[],"mappings":"AAAA,+DAA+D;AAC/D,OAAO,EAAE,UAAU,EAA0B,MAAM,aAAa,CAAC;AACjE,OAAO,EAAE,IAAI,EAAE,MAAM,IAAI,CAAC;AAE1B,OAAO,EAAE,mCAAmC,EAAE,MAAM,4BAA4B,CAAC;
|
|
1
|
+
{"version":3,"file":"runtime.js","sourceRoot":"","sources":["../src/runtime.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@ohmyhost/customer-auth-better-auth",
|
|
3
|
+
"version": "0.1.25",
|
|
4
|
+
"private": true,
|
|
5
|
+
"type": "module",
|
|
6
|
+
"exports": {
|
|
7
|
+
".": {
|
|
8
|
+
"source": "./src/index.ts",
|
|
9
|
+
"types": "./dist/index.d.ts",
|
|
10
|
+
"import": "./dist/index.js"
|
|
11
|
+
},
|
|
12
|
+
"./next": {
|
|
13
|
+
"source": "./src/next.ts",
|
|
14
|
+
"types": "./dist/next.d.ts",
|
|
15
|
+
"import": "./dist/next.js"
|
|
16
|
+
},
|
|
17
|
+
"./tanstack": {
|
|
18
|
+
"source": "./src/tanstack.ts",
|
|
19
|
+
"types": "./dist/tanstack.d.ts",
|
|
20
|
+
"import": "./dist/tanstack.js"
|
|
21
|
+
},
|
|
22
|
+
"./vite-companion": {
|
|
23
|
+
"source": "./src/vite-companion.ts",
|
|
24
|
+
"types": "./dist/vite-companion.d.ts",
|
|
25
|
+
"import": "./dist/vite-companion.js"
|
|
26
|
+
}
|
|
27
|
+
},
|
|
28
|
+
"scripts": {
|
|
29
|
+
"build": "tsc --project tsconfig.build.json",
|
|
30
|
+
"test": "vitest run --root ../.. packages/customer-auth-better-auth/src",
|
|
31
|
+
"typecheck": "tsc --project tsconfig.json --noEmit"
|
|
32
|
+
},
|
|
33
|
+
"dependencies": {
|
|
34
|
+
"@better-fetch/fetch": "1.3.1",
|
|
35
|
+
"@cloudflare/workers-types": "5.20260906.1",
|
|
36
|
+
"@types/pg": "8.15.5",
|
|
37
|
+
"better-auth": "1.7.1",
|
|
38
|
+
"bun-types": "1.4.1",
|
|
39
|
+
"pg": "8.22.0"
|
|
40
|
+
},
|
|
41
|
+
"devDependencies": {
|
|
42
|
+
"@ohmyhost/platform": "workspace:*"
|
|
43
|
+
},
|
|
44
|
+
"license": "Apache-2.0"
|
|
45
|
+
}
|
|
@@ -1,9 +1,17 @@
|
|
|
1
1
|
/// <reference types="bun-types/sqlite.d.ts" preserve="true" />
|
|
2
2
|
import { betterAuth, type BetterAuthOptions } from "better-auth";
|
|
3
|
+
import { APIError, createAuthMiddleware } from "better-auth/api";
|
|
3
4
|
import { Pool } from "pg";
|
|
4
5
|
|
|
5
6
|
import { CUSTOMER_AUTH_INSTALLATION_CONTRACT } from "./installation-contract.js";
|
|
6
7
|
|
|
8
|
+
const MAIL_OPERATION_PATHS = new Set([
|
|
9
|
+
"/sign-up/email",
|
|
10
|
+
"/send-verification-email",
|
|
11
|
+
"/request-password-reset",
|
|
12
|
+
"/reset-password",
|
|
13
|
+
]);
|
|
14
|
+
|
|
7
15
|
// Better Fetch 1.3.1 exposes an unbound Timer name; keep its type local to that module.
|
|
8
16
|
// Referencing only Bun's SQLite declarations above avoids changing Node's global APIs.
|
|
9
17
|
declare module "@better-fetch/fetch" {
|
|
@@ -25,7 +33,7 @@ export interface CustomerAuthRuntimeInput {
|
|
|
25
33
|
readonly publicOrigin: string;
|
|
26
34
|
readonly database: Pool;
|
|
27
35
|
readonly secret: string;
|
|
28
|
-
readonly email
|
|
36
|
+
readonly email?: CustomerAuthEmailSender;
|
|
29
37
|
}
|
|
30
38
|
|
|
31
39
|
export function createCustomerAuthOptions(input: CustomerAuthRuntimeInput): BetterAuthOptions {
|
|
@@ -40,11 +48,17 @@ export function createCustomerAuthOptions(input: CustomerAuthRuntimeInput): Bett
|
|
|
40
48
|
typeof input.secret !== "string" ||
|
|
41
49
|
input.secret.length < 32 ||
|
|
42
50
|
input.secret.length > 512 ||
|
|
43
|
-
typeof input.email?.send !== "function"
|
|
51
|
+
(input.email !== undefined && typeof input.email?.send !== "function")
|
|
44
52
|
) {
|
|
45
53
|
throw new TypeError("Customer auth runtime input is invalid");
|
|
46
54
|
}
|
|
47
55
|
const send = async (kind: CustomerAuthEmail["kind"], email: string, url: string) => {
|
|
56
|
+
if (input.email === undefined) {
|
|
57
|
+
throw APIError.from("SERVICE_UNAVAILABLE", {
|
|
58
|
+
code: "AUTH_EMAIL_SENDER_NOT_CONFIGURED",
|
|
59
|
+
message: "Configure an email sender for this authentication operation",
|
|
60
|
+
});
|
|
61
|
+
}
|
|
48
62
|
await input.email.send({
|
|
49
63
|
kind,
|
|
50
64
|
to: email,
|
|
@@ -61,6 +75,16 @@ export function createCustomerAuthOptions(input: CustomerAuthRuntimeInput): Bett
|
|
|
61
75
|
trustedOrigins: [publicOrigin],
|
|
62
76
|
secret: input.secret,
|
|
63
77
|
database: input.database,
|
|
78
|
+
hooks: {
|
|
79
|
+
before: createAuthMiddleware(async (context) => {
|
|
80
|
+
if (input.email === undefined && MAIL_OPERATION_PATHS.has(context.path)) {
|
|
81
|
+
throw APIError.from("SERVICE_UNAVAILABLE", {
|
|
82
|
+
code: "AUTH_EMAIL_SENDER_NOT_CONFIGURED",
|
|
83
|
+
message: "Configure an email sender for this authentication operation",
|
|
84
|
+
});
|
|
85
|
+
}
|
|
86
|
+
}),
|
|
87
|
+
},
|
|
64
88
|
emailAndPassword: {
|
|
65
89
|
enabled: true,
|
|
66
90
|
requireEmailVerification: true,
|
|
@@ -74,7 +98,7 @@ export function createCustomerAuthOptions(input: CustomerAuthRuntimeInput): Bett
|
|
|
74
98
|
},
|
|
75
99
|
emailVerification: {
|
|
76
100
|
sendOnSignUp: true,
|
|
77
|
-
sendOnSignIn:
|
|
101
|
+
sendOnSignIn: input.email !== undefined,
|
|
78
102
|
autoSignInAfterVerification: false,
|
|
79
103
|
expiresIn: 3_600,
|
|
80
104
|
sendVerificationEmail: ({ user, url }) => send("verification", user.email, url),
|
|
@@ -92,6 +116,8 @@ export function createCustomerAuthOptions(input: CustomerAuthRuntimeInput): Bett
|
|
|
92
116
|
},
|
|
93
117
|
},
|
|
94
118
|
advanced: {
|
|
119
|
+
disableCSRFCheck: false,
|
|
120
|
+
disableOriginCheck: false,
|
|
95
121
|
useSecureCookies: true,
|
|
96
122
|
database: {
|
|
97
123
|
generateId: CUSTOMER_AUTH_INSTALLATION_CONTRACT.database.idGeneration,
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|