@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 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` を使用できます。
@@ -26,28 +26,15 @@ type AppsScriptAuthConfig<TEmailPassword extends EmailPasswordAuthOptions | unde
26
26
  appsScript?: AppsScriptAuthenticationOptions;
27
27
  hooks?: AuthHooks<THookResult>;
28
28
  };
29
- type BaseHandlers<THookResult> = {
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
- } ? BaseHandlers<THookResult> & PasswordHandlers : BaseHandlers<THookResult>;
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: AppsScriptAuthPassword | undefined;
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 {};
@@ -51,32 +51,12 @@ export class AppsScriptAuth {
51
51
  sessionStorage,
52
52
  });
53
53
  this.signOut = new AppsScriptAuthSignOut(sessionStorage);
54
- if (emailPasswordConfig?.passwordReset) {
55
- this.password = new AppsScriptAuthPassword({
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 { AuthSchemaConfig, type AuthSchema, type AuthSchemaOptions, } from "./schema/AuthSchema";
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 { AuthSchemaConfig, } from "./schema/AuthSchema";
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 class AuthSchemaConfig<const O extends AuthSchemaOptions = {
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 class AuthSchemaConfig {
2
- schema;
3
- constructor(options = { dbId: "" }) {
4
- this.schema = {
5
- dbId: options.dbId,
6
- user: {
7
- modelName: options.user?.modelName ?? "user",
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
- account: {
14
- modelName: options.account?.modelName ?? "account",
15
- fields: {
16
- id: options.account?.fields?.id ?? "id",
17
- userId: options.account?.fields?.userId ?? "userId",
18
- provider: options.account?.fields?.provider ?? "provider",
19
- providerAccountId: options.account?.fields?.providerAccountId ?? "providerAccountId",
20
- passwordHash: options.account?.fields?.passwordHash ?? "passwordHash",
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
- passwordReset: {
24
- modelName: options.passwordReset?.modelName ?? "passwordReset",
25
- fields: {
26
- id: options.passwordReset?.fields?.id ?? "id",
27
- accountId: options.passwordReset?.fields?.accountId ?? "accountId",
28
- tokenHash: options.passwordReset?.fields?.tokenHash ?? "tokenHash",
29
- expiresAt: options.passwordReset?.fields?.expiresAt ?? "expiresAt",
30
- enabled: options.passwordReset?.fields?.enabled ?? "enabled",
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.2.1",
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"