@gasboost/auth 0.2.1 → 0.4.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/README.md +0 -54
- package/dist/AppsScriptAuth.d.ts +3 -16
- package/dist/AppsScriptAuth.js +4 -24
- package/dist/index.d.ts +2 -1
- package/dist/index.js +1 -1
- package/dist/schema/AuthSchema.d.ts +2 -10
- package/dist/schema/AuthSchema.js +27 -31
- package/dist/schema/createAuthTables.d.ts +33 -0
- package/dist/schema/createAuthTables.js +53 -0
- package/package.json +5 -2
package/README.md
CHANGED
|
@@ -526,60 +526,6 @@ const pepper =
|
|
|
526
526
|
PropertiesService.getScriptProperties().getProperty("AUTH_PEPPER");
|
|
527
527
|
```
|
|
528
528
|
|
|
529
|
-
## `@gasboost/app` との連携
|
|
530
|
-
|
|
531
|
-
`AppsScriptAuth` は、RPC 登録用の handler collection を `auth.handlers` として公開します。
|
|
532
|
-
|
|
533
|
-
`@gasboost/app` の `.calls()` にそのまま渡すことで、認証用 RPC を一括登録できます。
|
|
534
|
-
|
|
535
|
-
```ts
|
|
536
|
-
import { AppsScript } from "@gasboost/app";
|
|
537
|
-
import { AppsScriptAuth } from "@gasboost/auth";
|
|
538
|
-
|
|
539
|
-
const auth = new AppsScriptAuth({
|
|
540
|
-
repository,
|
|
541
|
-
runtime,
|
|
542
|
-
session: {
|
|
543
|
-
storageType: "cache",
|
|
544
|
-
},
|
|
545
|
-
emailPassword: {
|
|
546
|
-
enabled: true,
|
|
547
|
-
pepper: "your-secret-pepper",
|
|
548
|
-
},
|
|
549
|
-
appsScript: {
|
|
550
|
-
enabled: true,
|
|
551
|
-
},
|
|
552
|
-
});
|
|
553
|
-
|
|
554
|
-
const app = new AppsScript().calls(auth.handlers);
|
|
555
|
-
|
|
556
|
-
export default app;
|
|
557
|
-
```
|
|
558
|
-
|
|
559
|
-
以下の RPC が登録されます。
|
|
560
|
-
|
|
561
|
-
- `signInEmail`
|
|
562
|
-
- `signInAppsScript`
|
|
563
|
-
- `signUpEmail`
|
|
564
|
-
- `signUpAppsScript`
|
|
565
|
-
- `getSession`
|
|
566
|
-
- `signOut`
|
|
567
|
-
|
|
568
|
-
`InferAppsScript` を利用するクライアントでは、これらの RPC がそのまま型推論されます。
|
|
569
|
-
|
|
570
|
-
```ts
|
|
571
|
-
client.signInEmail({
|
|
572
|
-
email: "user@example.com",
|
|
573
|
-
password: "password",
|
|
574
|
-
});
|
|
575
|
-
|
|
576
|
-
client.getSession("session-id");
|
|
577
|
-
|
|
578
|
-
client.signOut("session-id");
|
|
579
|
-
```
|
|
580
|
-
|
|
581
|
-
RPC endpoint 名は `@gasboost/auth` 側で管理されるため、利用側で個別に `.call()` を記述したり、endpoint 名を重複定義したりする必要はありません。
|
|
582
|
-
|
|
583
529
|
## Testing
|
|
584
530
|
|
|
585
531
|
GAS API を利用するテストでは `gasboost/fake` を使用できます。
|
package/dist/AppsScriptAuth.d.ts
CHANGED
|
@@ -26,28 +26,15 @@ type AppsScriptAuthConfig<TEmailPassword extends EmailPasswordAuthOptions | unde
|
|
|
26
26
|
appsScript?: AppsScriptAuthenticationOptions;
|
|
27
27
|
hooks?: AuthHooks<THookResult>;
|
|
28
28
|
};
|
|
29
|
-
type
|
|
30
|
-
signInEmail: AppsScriptAuthSignIn<THookResult>["email"];
|
|
31
|
-
signInAppsScript: AppsScriptAuthSignIn<THookResult>["appsScript"];
|
|
32
|
-
signUpEmail: AppsScriptAuthSignUp["email"];
|
|
33
|
-
signUpAppsScript: AppsScriptAuthSignUp["appsScript"];
|
|
34
|
-
getSession: AppsScriptAuthSession["get"];
|
|
35
|
-
signOut: AppsScriptAuthSignOut["execute"];
|
|
36
|
-
};
|
|
37
|
-
type PasswordHandlers = {
|
|
38
|
-
forgotPassword: AppsScriptAuthPassword["forgot"];
|
|
39
|
-
resetPassword: AppsScriptAuthPassword["reset"];
|
|
40
|
-
};
|
|
41
|
-
type AppsScriptAuthHandlers<TEmailPassword, THookResult> = TEmailPassword extends {
|
|
29
|
+
type AppsScriptAuthPasswordApi<TEmailPassword> = TEmailPassword extends {
|
|
42
30
|
passwordReset: unknown;
|
|
43
|
-
} ?
|
|
31
|
+
} ? AppsScriptAuthPassword : undefined;
|
|
44
32
|
export declare class AppsScriptAuth<TEmailPassword extends EmailPasswordAuthOptions | undefined = undefined, THookResult = undefined> {
|
|
45
33
|
readonly signIn: AppsScriptAuthSignIn<THookResult>;
|
|
46
34
|
readonly signUp: AppsScriptAuthSignUp;
|
|
47
35
|
readonly session: AppsScriptAuthSession;
|
|
48
36
|
readonly signOut: AppsScriptAuthSignOut;
|
|
49
|
-
readonly password:
|
|
37
|
+
readonly password: AppsScriptAuthPasswordApi<TEmailPassword>;
|
|
50
38
|
constructor({ repository, session, runtime, emailPassword, appsScript, hooks, }: AppsScriptAuthConfig<TEmailPassword, THookResult>);
|
|
51
|
-
get handlers(): AppsScriptAuthHandlers<TEmailPassword, THookResult>;
|
|
52
39
|
}
|
|
53
40
|
export {};
|
package/dist/AppsScriptAuth.js
CHANGED
|
@@ -51,32 +51,12 @@ export class AppsScriptAuth {
|
|
|
51
51
|
sessionStorage,
|
|
52
52
|
});
|
|
53
53
|
this.signOut = new AppsScriptAuthSignOut(sessionStorage);
|
|
54
|
-
|
|
55
|
-
|
|
54
|
+
this.password = (emailPasswordConfig?.passwordReset
|
|
55
|
+
? new AppsScriptAuthPassword({
|
|
56
56
|
repository,
|
|
57
57
|
utilities: runtime.utilities,
|
|
58
58
|
emailPassword: emailPasswordConfig,
|
|
59
|
-
})
|
|
60
|
-
|
|
61
|
-
else {
|
|
62
|
-
this.password = undefined;
|
|
63
|
-
}
|
|
64
|
-
}
|
|
65
|
-
get handlers() {
|
|
66
|
-
const handlers = {
|
|
67
|
-
signInEmail: this.signIn.email,
|
|
68
|
-
signInAppsScript: this.signIn.appsScript,
|
|
69
|
-
signUpEmail: this.signUp.email,
|
|
70
|
-
signUpAppsScript: this.signUp.appsScript,
|
|
71
|
-
getSession: this.session.get.bind(this.session),
|
|
72
|
-
signOut: this.signOut.execute.bind(this.signOut),
|
|
73
|
-
...(this.password
|
|
74
|
-
? {
|
|
75
|
-
forgotPassword: this.password.forgot.bind(this.password),
|
|
76
|
-
resetPassword: this.password.reset.bind(this.password),
|
|
77
|
-
}
|
|
78
|
-
: {}),
|
|
79
|
-
};
|
|
80
|
-
return handlers;
|
|
59
|
+
})
|
|
60
|
+
: undefined);
|
|
81
61
|
}
|
|
82
62
|
}
|
package/dist/index.d.ts
CHANGED
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
export { AppsScriptAuth } from "./AppsScriptAuth";
|
|
2
2
|
export type { AppsScriptAuthRepository } from "./storage/AppsScriptAuthRepository";
|
|
3
|
-
export {
|
|
3
|
+
export type { AuthSchema, AuthSchemaOptions } from "./schema/AuthSchema";
|
|
4
|
+
export { createAuthTables } from "./schema/createAuthTables";
|
|
4
5
|
export { authPattern, type AuthPattern } from "./AuthPattern";
|
|
5
6
|
export { Account } from "./domain/Account";
|
|
6
7
|
export { User } from "./domain/User";
|
package/dist/index.js
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
export { AppsScriptAuth } from "./AppsScriptAuth";
|
|
2
|
-
export {
|
|
2
|
+
export { createAuthTables } from "./schema/createAuthTables";
|
|
3
3
|
export { authPattern } from "./AuthPattern";
|
|
4
4
|
export { Account } from "./domain/Account";
|
|
5
5
|
export { User } from "./domain/User";
|
|
@@ -1,5 +1,4 @@
|
|
|
1
1
|
export type AuthSchemaOptions = {
|
|
2
|
-
dbId: string;
|
|
3
2
|
user?: {
|
|
4
3
|
modelName?: string;
|
|
5
4
|
fields?: {
|
|
@@ -29,7 +28,6 @@ export type AuthSchemaOptions = {
|
|
|
29
28
|
};
|
|
30
29
|
};
|
|
31
30
|
export type AuthSchema = {
|
|
32
|
-
dbId: string;
|
|
33
31
|
user: {
|
|
34
32
|
modelName: string;
|
|
35
33
|
fields: {
|
|
@@ -63,8 +61,7 @@ type Fields<T> = [T] extends [null | undefined] ? undefined : "fields" extends k
|
|
|
63
61
|
type PropertyOrDefault<T, K extends PropertyKey, Default extends string> = [
|
|
64
62
|
T
|
|
65
63
|
] extends [null | undefined] ? Default : K extends keyof NonNullable<T> ? Exclude<NonNullable<T>[K], undefined> extends infer Value ? [Value] extends [never] ? Default : Value extends string ? Value : Default : Default : Default;
|
|
66
|
-
type ResolveAuthSchema<O extends AuthSchemaOptions> = {
|
|
67
|
-
dbId: O["dbId"];
|
|
64
|
+
export type ResolveAuthSchema<O extends AuthSchemaOptions> = {
|
|
68
65
|
user: {
|
|
69
66
|
modelName: PropertyOrDefault<Section<O, "user">, "modelName", "user">;
|
|
70
67
|
fields: {
|
|
@@ -93,10 +90,5 @@ type ResolveAuthSchema<O extends AuthSchemaOptions> = {
|
|
|
93
90
|
};
|
|
94
91
|
};
|
|
95
92
|
};
|
|
96
|
-
export declare
|
|
97
|
-
dbId: "";
|
|
98
|
-
}> {
|
|
99
|
-
readonly schema: ResolveAuthSchema<O>;
|
|
100
|
-
constructor(options?: O);
|
|
101
|
-
}
|
|
93
|
+
export declare function resolveAuthSchema<const O extends AuthSchemaOptions>(options: O): ResolveAuthSchema<O>;
|
|
102
94
|
export {};
|
|
@@ -1,35 +1,31 @@
|
|
|
1
|
-
export
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
fields: {
|
|
9
|
-
id: options.user?.fields?.id ?? "id",
|
|
10
|
-
name: options.user?.fields?.name ?? "name",
|
|
11
|
-
},
|
|
1
|
+
export function resolveAuthSchema(options) {
|
|
2
|
+
return {
|
|
3
|
+
user: {
|
|
4
|
+
modelName: options.user?.modelName ?? "user",
|
|
5
|
+
fields: {
|
|
6
|
+
id: options.user?.fields?.id ?? "id",
|
|
7
|
+
name: options.user?.fields?.name ?? "name",
|
|
12
8
|
},
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
9
|
+
},
|
|
10
|
+
account: {
|
|
11
|
+
modelName: options.account?.modelName ?? "account",
|
|
12
|
+
fields: {
|
|
13
|
+
id: options.account?.fields?.id ?? "id",
|
|
14
|
+
userId: options.account?.fields?.userId ?? "userId",
|
|
15
|
+
provider: options.account?.fields?.provider ?? "provider",
|
|
16
|
+
providerAccountId: options.account?.fields?.providerAccountId ?? "providerAccountId",
|
|
17
|
+
passwordHash: options.account?.fields?.passwordHash ?? "passwordHash",
|
|
22
18
|
},
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
19
|
+
},
|
|
20
|
+
passwordReset: {
|
|
21
|
+
modelName: options.passwordReset?.modelName ?? "passwordReset",
|
|
22
|
+
fields: {
|
|
23
|
+
id: options.passwordReset?.fields?.id ?? "id",
|
|
24
|
+
accountId: options.passwordReset?.fields?.accountId ?? "accountId",
|
|
25
|
+
tokenHash: options.passwordReset?.fields?.tokenHash ?? "tokenHash",
|
|
26
|
+
expiresAt: options.passwordReset?.fields?.expiresAt ?? "expiresAt",
|
|
27
|
+
enabled: options.passwordReset?.fields?.enabled ?? "enabled",
|
|
32
28
|
},
|
|
33
|
-
}
|
|
34
|
-
}
|
|
29
|
+
},
|
|
30
|
+
};
|
|
35
31
|
}
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
import { z } from "zod";
|
|
2
|
+
import { type AuthSchema, type AuthSchemaOptions } from "./AuthSchema";
|
|
3
|
+
type UserShape<S extends AuthSchema> = {
|
|
4
|
+
[K in S["user"]["fields"]["id"] | S["user"]["fields"]["name"]]: z.ZodString;
|
|
5
|
+
};
|
|
6
|
+
type AccountShape<S extends AuthSchema> = {
|
|
7
|
+
[K in S["account"]["fields"]["id"] | S["account"]["fields"]["userId"] | S["account"]["fields"]["provider"] | S["account"]["fields"]["providerAccountId"] | S["account"]["fields"]["passwordHash"]]: K extends S["account"]["fields"]["provider"] ? z.ZodEnum<{
|
|
8
|
+
emailPassword: "emailPassword";
|
|
9
|
+
appsScript: "appsScript";
|
|
10
|
+
}> : K extends S["account"]["fields"]["passwordHash"] ? z.ZodNullable<z.ZodString> : z.ZodString;
|
|
11
|
+
};
|
|
12
|
+
type PasswordResetShape<S extends AuthSchema> = {
|
|
13
|
+
[K in S["passwordReset"]["fields"]["id"] | S["passwordReset"]["fields"]["accountId"] | S["passwordReset"]["fields"]["tokenHash"] | S["passwordReset"]["fields"]["expiresAt"] | S["passwordReset"]["fields"]["enabled"]]: K extends S["passwordReset"]["fields"]["expiresAt"] ? z.ZodDate : K extends S["passwordReset"]["fields"]["enabled"] ? z.ZodBoolean : z.ZodString;
|
|
14
|
+
};
|
|
15
|
+
export declare function createAuthTables<const O extends AuthSchemaOptions = Record<never, never>>(options?: O): {
|
|
16
|
+
readonly schema: import("./AuthSchema").ResolveAuthSchema<O>;
|
|
17
|
+
readonly user: import("@gasboost/table").TableDefinition<["user" extends infer T ? T extends "user" ? T extends keyof O ? O[T] : undefined : never : never] extends [null | undefined] ? "user" : "modelName" extends infer T_1 ? T_1 extends "modelName" ? T_1 extends keyof NonNullable<"user" extends infer T ? T extends "user" ? T extends keyof O ? O[T] : undefined : never : never> ? Exclude<NonNullable<"user" extends infer T ? T extends "user" ? T extends keyof O ? O[T] : undefined : never : never>[T_1], undefined> extends infer Value ? [Value] extends [never] ? "user" : Value extends string ? Value : "user" : "user" : "user" : never : never, z.ZodObject<UserShape<import("./AuthSchema").ResolveAuthSchema<O>> extends infer T_2 ? { -readonly [P in keyof T_2]: T_2[P]; } : never, z.core.$strip>> & {
|
|
18
|
+
readonly primaryKey: Extract<keyof z.core.$InferObjectOutput<UserShape<import("./AuthSchema").ResolveAuthSchema<O>> extends infer T_2 ? { -readonly [P in keyof T_2]: T_2[P]; } : never, {}>, string>;
|
|
19
|
+
} & {
|
|
20
|
+
readonly primaryKey: [["user" extends infer T ? T extends "user" ? T extends keyof O ? O[T] : undefined : never : never] extends [null | undefined] ? undefined : "fields" extends keyof NonNullable<"user" extends infer T ? T extends "user" ? T extends keyof O ? O[T] : undefined : never : never> ? NonNullable<"user" extends infer T ? T extends "user" ? T extends keyof O ? O[T] : undefined : never : never>[keyof NonNullable<"user" extends infer T ? T extends "user" ? T extends keyof O ? O[T] : undefined : never : never> & "fields"] : undefined] extends [null | undefined] ? "id" : "id" extends infer T_3 ? T_3 extends "id" ? T_3 extends keyof NonNullable<["user" extends infer T ? T extends "user" ? T extends keyof O ? O[T] : undefined : never : never] extends [null | undefined] ? undefined : "fields" extends keyof NonNullable<"user" extends infer T ? T extends "user" ? T extends keyof O ? O[T] : undefined : never : never> ? NonNullable<"user" extends infer T ? T extends "user" ? T extends keyof O ? O[T] : undefined : never : never>[keyof NonNullable<"user" extends infer T ? T extends "user" ? T extends keyof O ? O[T] : undefined : never : never> & "fields"] : undefined> ? Exclude<NonNullable<["user" extends infer T ? T extends "user" ? T extends keyof O ? O[T] : undefined : never : never] extends [null | undefined] ? undefined : "fields" extends keyof NonNullable<"user" extends infer T ? T extends "user" ? T extends keyof O ? O[T] : undefined : never : never> ? NonNullable<"user" extends infer T ? T extends "user" ? T extends keyof O ? O[T] : undefined : never : never>[keyof NonNullable<"user" extends infer T ? T extends "user" ? T extends keyof O ? O[T] : undefined : never : never> & "fields"] : undefined>[T_3], undefined> extends infer Value ? [Value] extends [never] ? "id" : Value extends string ? Value : "id" : "id" : "id" : never : never;
|
|
21
|
+
};
|
|
22
|
+
readonly account: import("@gasboost/table").TableDefinition<["account" extends infer T_4 ? T_4 extends "account" ? T_4 extends keyof O ? O[T_4] : undefined : never : never] extends [null | undefined] ? "account" : "modelName" extends infer T_5 ? T_5 extends "modelName" ? T_5 extends keyof NonNullable<"account" extends infer T_4 ? T_4 extends "account" ? T_4 extends keyof O ? O[T_4] : undefined : never : never> ? Exclude<NonNullable<"account" extends infer T_4 ? T_4 extends "account" ? T_4 extends keyof O ? O[T_4] : undefined : never : never>[T_5], undefined> extends infer Value ? [Value] extends [never] ? "account" : Value extends string ? Value : "account" : "account" : "account" : never : never, z.ZodObject<AccountShape<import("./AuthSchema").ResolveAuthSchema<O>> extends infer T_6 ? { -readonly [P in keyof T_6]: T_6[P]; } : never, z.core.$strip>> & {
|
|
23
|
+
readonly primaryKey: Extract<keyof z.core.$InferObjectOutput<AccountShape<import("./AuthSchema").ResolveAuthSchema<O>> extends infer T_6 ? { -readonly [P in keyof T_6]: T_6[P]; } : never, {}>, string>;
|
|
24
|
+
} & {
|
|
25
|
+
readonly primaryKey: [["account" extends infer T_4 ? T_4 extends "account" ? T_4 extends keyof O ? O[T_4] : undefined : never : never] extends [null | undefined] ? undefined : "fields" extends keyof NonNullable<"account" extends infer T_4 ? T_4 extends "account" ? T_4 extends keyof O ? O[T_4] : undefined : never : never> ? NonNullable<"account" extends infer T_4 ? T_4 extends "account" ? T_4 extends keyof O ? O[T_4] : undefined : never : never>[keyof NonNullable<"account" extends infer T_4 ? T_4 extends "account" ? T_4 extends keyof O ? O[T_4] : undefined : never : never> & "fields"] : undefined] extends [null | undefined] ? "id" : "id" extends infer T_7 ? T_7 extends "id" ? T_7 extends keyof NonNullable<["account" extends infer T_4 ? T_4 extends "account" ? T_4 extends keyof O ? O[T_4] : undefined : never : never] extends [null | undefined] ? undefined : "fields" extends keyof NonNullable<"account" extends infer T_4 ? T_4 extends "account" ? T_4 extends keyof O ? O[T_4] : undefined : never : never> ? NonNullable<"account" extends infer T_4 ? T_4 extends "account" ? T_4 extends keyof O ? O[T_4] : undefined : never : never>[keyof NonNullable<"account" extends infer T_4 ? T_4 extends "account" ? T_4 extends keyof O ? O[T_4] : undefined : never : never> & "fields"] : undefined> ? Exclude<NonNullable<["account" extends infer T_4 ? T_4 extends "account" ? T_4 extends keyof O ? O[T_4] : undefined : never : never] extends [null | undefined] ? undefined : "fields" extends keyof NonNullable<"account" extends infer T_4 ? T_4 extends "account" ? T_4 extends keyof O ? O[T_4] : undefined : never : never> ? NonNullable<"account" extends infer T_4 ? T_4 extends "account" ? T_4 extends keyof O ? O[T_4] : undefined : never : never>[keyof NonNullable<"account" extends infer T_4 ? T_4 extends "account" ? T_4 extends keyof O ? O[T_4] : undefined : never : never> & "fields"] : undefined>[T_7], undefined> extends infer Value ? [Value] extends [never] ? "id" : Value extends string ? Value : "id" : "id" : "id" : never : never;
|
|
26
|
+
};
|
|
27
|
+
readonly passwordReset: import("@gasboost/table").TableDefinition<["passwordReset" extends infer T_8 ? T_8 extends "passwordReset" ? T_8 extends keyof O ? O[T_8] : undefined : never : never] extends [null | undefined] ? "passwordReset" : "modelName" extends infer T_9 ? T_9 extends "modelName" ? T_9 extends keyof NonNullable<"passwordReset" extends infer T_8 ? T_8 extends "passwordReset" ? T_8 extends keyof O ? O[T_8] : undefined : never : never> ? Exclude<NonNullable<"passwordReset" extends infer T_8 ? T_8 extends "passwordReset" ? T_8 extends keyof O ? O[T_8] : undefined : never : never>[T_9], undefined> extends infer Value ? [Value] extends [never] ? "passwordReset" : Value extends string ? Value : "passwordReset" : "passwordReset" : "passwordReset" : never : never, z.ZodObject<PasswordResetShape<import("./AuthSchema").ResolveAuthSchema<O>> extends infer T_10 ? { -readonly [P in keyof T_10]: T_10[P]; } : never, z.core.$strip>> & {
|
|
28
|
+
readonly primaryKey: Extract<keyof z.core.$InferObjectOutput<PasswordResetShape<import("./AuthSchema").ResolveAuthSchema<O>> extends infer T_10 ? { -readonly [P in keyof T_10]: T_10[P]; } : never, {}>, string>;
|
|
29
|
+
} & {
|
|
30
|
+
readonly primaryKey: [["passwordReset" extends infer T_8 ? T_8 extends "passwordReset" ? T_8 extends keyof O ? O[T_8] : undefined : never : never] extends [null | undefined] ? undefined : "fields" extends keyof NonNullable<"passwordReset" extends infer T_8 ? T_8 extends "passwordReset" ? T_8 extends keyof O ? O[T_8] : undefined : never : never> ? NonNullable<"passwordReset" extends infer T_8 ? T_8 extends "passwordReset" ? T_8 extends keyof O ? O[T_8] : undefined : never : never>[keyof NonNullable<"passwordReset" extends infer T_8 ? T_8 extends "passwordReset" ? T_8 extends keyof O ? O[T_8] : undefined : never : never> & "fields"] : undefined] extends [null | undefined] ? "id" : "id" extends infer T_11 ? T_11 extends "id" ? T_11 extends keyof NonNullable<["passwordReset" extends infer T_8 ? T_8 extends "passwordReset" ? T_8 extends keyof O ? O[T_8] : undefined : never : never] extends [null | undefined] ? undefined : "fields" extends keyof NonNullable<"passwordReset" extends infer T_8 ? T_8 extends "passwordReset" ? T_8 extends keyof O ? O[T_8] : undefined : never : never> ? NonNullable<"passwordReset" extends infer T_8 ? T_8 extends "passwordReset" ? T_8 extends keyof O ? O[T_8] : undefined : never : never>[keyof NonNullable<"passwordReset" extends infer T_8 ? T_8 extends "passwordReset" ? T_8 extends keyof O ? O[T_8] : undefined : never : never> & "fields"] : undefined> ? Exclude<NonNullable<["passwordReset" extends infer T_8 ? T_8 extends "passwordReset" ? T_8 extends keyof O ? O[T_8] : undefined : never : never] extends [null | undefined] ? undefined : "fields" extends keyof NonNullable<"passwordReset" extends infer T_8 ? T_8 extends "passwordReset" ? T_8 extends keyof O ? O[T_8] : undefined : never : never> ? NonNullable<"passwordReset" extends infer T_8 ? T_8 extends "passwordReset" ? T_8 extends keyof O ? O[T_8] : undefined : never : never>[keyof NonNullable<"passwordReset" extends infer T_8 ? T_8 extends "passwordReset" ? T_8 extends keyof O ? O[T_8] : undefined : never : never> & "fields"] : undefined>[T_11], undefined> extends infer Value ? [Value] extends [never] ? "id" : Value extends string ? Value : "id" : "id" : "id" : never : never;
|
|
31
|
+
};
|
|
32
|
+
};
|
|
33
|
+
export {};
|
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
import { z } from "zod";
|
|
2
|
+
import { resolveAuthSchema, } from "./AuthSchema";
|
|
3
|
+
function ensureUniqueFieldNames(modelName, fields) {
|
|
4
|
+
const fieldNames = Object.values(fields);
|
|
5
|
+
if (new Set(fieldNames).size !== fieldNames.length) {
|
|
6
|
+
throw new Error(`Field names for '${modelName}' must be unique.`);
|
|
7
|
+
}
|
|
8
|
+
}
|
|
9
|
+
function keyedTable(definition) {
|
|
10
|
+
return definition;
|
|
11
|
+
}
|
|
12
|
+
export function createAuthTables(options = {}) {
|
|
13
|
+
const schema = resolveAuthSchema(options);
|
|
14
|
+
ensureUniqueFieldNames(schema.user.modelName, schema.user.fields);
|
|
15
|
+
ensureUniqueFieldNames(schema.account.modelName, schema.account.fields);
|
|
16
|
+
ensureUniqueFieldNames(schema.passwordReset.modelName, schema.passwordReset.fields);
|
|
17
|
+
const userSchema = z.object({
|
|
18
|
+
[schema.user.fields.id]: z.string(),
|
|
19
|
+
[schema.user.fields.name]: z.string(),
|
|
20
|
+
});
|
|
21
|
+
const accountSchema = z.object({
|
|
22
|
+
[schema.account.fields.id]: z.string(),
|
|
23
|
+
[schema.account.fields.userId]: z.string(),
|
|
24
|
+
[schema.account.fields.provider]: z.enum(["emailPassword", "appsScript"]),
|
|
25
|
+
[schema.account.fields.providerAccountId]: z.string(),
|
|
26
|
+
[schema.account.fields.passwordHash]: z.string().nullable(),
|
|
27
|
+
});
|
|
28
|
+
const passwordResetSchema = z.object({
|
|
29
|
+
[schema.passwordReset.fields.id]: z.string(),
|
|
30
|
+
[schema.passwordReset.fields.accountId]: z.string(),
|
|
31
|
+
[schema.passwordReset.fields.tokenHash]: z.string(),
|
|
32
|
+
[schema.passwordReset.fields.expiresAt]: z.date(),
|
|
33
|
+
[schema.passwordReset.fields.enabled]: z.boolean(),
|
|
34
|
+
});
|
|
35
|
+
return {
|
|
36
|
+
schema,
|
|
37
|
+
user: keyedTable({
|
|
38
|
+
name: schema.user.modelName,
|
|
39
|
+
schema: userSchema,
|
|
40
|
+
primaryKey: schema.user.fields.id,
|
|
41
|
+
}),
|
|
42
|
+
account: keyedTable({
|
|
43
|
+
name: schema.account.modelName,
|
|
44
|
+
schema: accountSchema,
|
|
45
|
+
primaryKey: schema.account.fields.id,
|
|
46
|
+
}),
|
|
47
|
+
passwordReset: keyedTable({
|
|
48
|
+
name: schema.passwordReset.modelName,
|
|
49
|
+
schema: passwordResetSchema,
|
|
50
|
+
primaryKey: schema.passwordReset.fields.id,
|
|
51
|
+
}),
|
|
52
|
+
};
|
|
53
|
+
}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@gasboost/auth",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.4.0",
|
|
4
4
|
"description": "Modern authentication for Google Apps Script with email/password, Apps Script authentication, sessions, and password reset.",
|
|
5
5
|
"keywords": [
|
|
6
6
|
"google-apps-script",
|
|
@@ -38,8 +38,11 @@
|
|
|
38
38
|
"publishConfig": {
|
|
39
39
|
"access": "public"
|
|
40
40
|
},
|
|
41
|
+
"dependencies": {
|
|
42
|
+
"@gasboost/table": "^0.1.0",
|
|
43
|
+
"zod": "^4.5.4"
|
|
44
|
+
},
|
|
41
45
|
"devDependencies": {
|
|
42
|
-
"@gasboost/app": "^1.3.0",
|
|
43
46
|
"@gasboost/fake-core": "^0.1.2",
|
|
44
47
|
"@gasboost/fake-node": "^0.1.2",
|
|
45
48
|
"@types/google-apps-script": "^2.0.13"
|