@gasboost/auth 0.3.0 → 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/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 -1
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,6 +38,10 @@
|
|
|
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
46
|
"@gasboost/fake-core": "^0.1.2",
|
|
43
47
|
"@gasboost/fake-node": "^0.1.2",
|