@gauts/auth 0.5.1 → 0.6.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.
Files changed (43) hide show
  1. package/README.md +140 -98
  2. package/SECURITY.md +1 -1
  3. package/dist/adapters/hono/index.d.ts +15 -16
  4. package/dist/adapters/hono/index.d.ts.map +1 -1
  5. package/dist/adapters/hono/index.js +1 -3
  6. package/dist/adapters/hono/index.js.map +1 -1
  7. package/dist/adapters/prisma/config.d.ts +7 -0
  8. package/dist/adapters/prisma/config.d.ts.map +1 -0
  9. package/dist/adapters/prisma/config.js +151 -0
  10. package/dist/adapters/prisma/config.js.map +1 -0
  11. package/dist/adapters/prisma/index.d.ts +3 -48
  12. package/dist/adapters/prisma/index.d.ts.map +1 -1
  13. package/dist/adapters/prisma/index.js +12 -221
  14. package/dist/adapters/prisma/index.js.map +1 -1
  15. package/dist/adapters/prisma/model.d.ts +33 -0
  16. package/dist/adapters/prisma/model.d.ts.map +1 -0
  17. package/dist/adapters/prisma/model.js +110 -0
  18. package/dist/adapters/prisma/model.js.map +1 -0
  19. package/dist/adapters/prisma/types.d.ts +125 -0
  20. package/dist/adapters/prisma/types.d.ts.map +1 -0
  21. package/dist/adapters/prisma/types.js +2 -0
  22. package/dist/adapters/prisma/types.js.map +1 -0
  23. package/dist/auth.d.ts +6 -6
  24. package/dist/auth.d.ts.map +1 -1
  25. package/dist/auth.js +1 -1
  26. package/dist/auth.js.map +1 -1
  27. package/dist/index.d.ts +1 -1
  28. package/dist/index.d.ts.map +1 -1
  29. package/dist/session/cache.d.ts +7 -7
  30. package/dist/session/cache.d.ts.map +1 -1
  31. package/dist/session/cache.js +4 -33
  32. package/dist/session/cache.js.map +1 -1
  33. package/dist/session/guards.d.ts +2 -2
  34. package/dist/session/guards.d.ts.map +1 -1
  35. package/dist/session/guards.js +12 -13
  36. package/dist/session/guards.js.map +1 -1
  37. package/dist/session/service.d.ts +4 -4
  38. package/dist/session/service.d.ts.map +1 -1
  39. package/dist/session/service.js +0 -4
  40. package/dist/session/service.js.map +1 -1
  41. package/dist/session/types.d.ts +20 -25
  42. package/dist/session/types.d.ts.map +1 -1
  43. package/package.json +1 -1
@@ -0,0 +1,151 @@
1
+ import { createError } from "../../errors.js";
2
+ import { isRecord } from "../../session/guards.js";
3
+ const PRISMA_DEFAULTS = {
4
+ account: {
5
+ name: "account",
6
+ select: ["id", "email"],
7
+ },
8
+ relation: {
9
+ select: ["id"],
10
+ },
11
+ sessions: {
12
+ name: "sessions",
13
+ },
14
+ };
15
+ export const isPrismaDelegate = (value) => {
16
+ return (isRecord(value) &&
17
+ typeof value.create === "function" &&
18
+ typeof value.findFirst === "function" &&
19
+ typeof value.findMany === "function" &&
20
+ typeof value.findUnique === "function" &&
21
+ typeof value.update === "function" &&
22
+ typeof value.updateMany === "function");
23
+ };
24
+ const isAuthScalar = (value) => {
25
+ return (value === null ||
26
+ typeof value === "boolean" ||
27
+ typeof value === "string" ||
28
+ (typeof value === "number" && Number.isFinite(value)));
29
+ };
30
+ const resolveName = ({ input, path }) => {
31
+ if (typeof input !== "string" || !input.trim()) {
32
+ throw createError({
33
+ code: "AUTH_CONFIG_INVALID",
34
+ message: `${path} must be a non-empty string.`,
35
+ });
36
+ }
37
+ return input;
38
+ };
39
+ const resolveSelect = ({ defaultSelect, input, path, }) => {
40
+ if (input === undefined) {
41
+ return defaultSelect;
42
+ }
43
+ if (!Array.isArray(input)) {
44
+ throw createError({
45
+ code: "AUTH_CONFIG_INVALID",
46
+ message: `${path}.select must contain unique non-empty field names.`,
47
+ });
48
+ }
49
+ const fields = input;
50
+ if (fields.some((field) => typeof field !== "string" || !field.trim()) ||
51
+ new Set(fields).size !== fields.length) {
52
+ throw createError({
53
+ code: "AUTH_CONFIG_INVALID",
54
+ message: `${path}.select must contain unique non-empty field names.`,
55
+ });
56
+ }
57
+ const names = fields;
58
+ return names.includes("id") ? names : ["id", ...names];
59
+ };
60
+ const isAccessValue = (value) => {
61
+ if (Array.isArray(value)) {
62
+ return value.length > 0 && value.every(isAuthScalar);
63
+ }
64
+ return isAuthScalar(value);
65
+ };
66
+ const resolveAccess = ({ input, path }) => {
67
+ if (input === undefined) {
68
+ return {};
69
+ }
70
+ if (!isRecord(input) || Object.values(input).some((value) => !isAccessValue(value))) {
71
+ throw createError({
72
+ code: "AUTH_CONFIG_INVALID",
73
+ message: `${path}.access contains an invalid condition.`,
74
+ });
75
+ }
76
+ return input;
77
+ };
78
+ const resolveModel = ({ client, defaultName, defaultSelect, input, path, relation, }) => {
79
+ if (input !== undefined && !isRecord(input)) {
80
+ throw createError({
81
+ code: "AUTH_CONFIG_INVALID",
82
+ message: `${path} model configuration is invalid.`,
83
+ });
84
+ }
85
+ const config = isRecord(input) ? input : {};
86
+ const name = config.name === undefined
87
+ ? defaultName
88
+ : resolveName({ input: config.name, path: `${path}.name` });
89
+ const delegate = isRecord(client) ? client[name] : undefined;
90
+ if (!isPrismaDelegate(delegate)) {
91
+ throw createError({
92
+ code: "AUTH_CONFIG_INVALID",
93
+ message: `Prisma model ${name} is invalid.`,
94
+ });
95
+ }
96
+ if (config.relations !== undefined && !isRecord(config.relations)) {
97
+ throw createError({
98
+ code: "AUTH_CONFIG_INVALID",
99
+ message: `${path}.relations is invalid.`,
100
+ });
101
+ }
102
+ const relations = Object.fromEntries(Object.entries(isRecord(config.relations) ? config.relations : {}).map(([relationName, relationConfig]) => [
103
+ relationName,
104
+ resolveModel({
105
+ client,
106
+ defaultName: relationName,
107
+ defaultSelect: PRISMA_DEFAULTS.relation.select,
108
+ input: relationConfig,
109
+ path: `${path}.relations.${relationName}`,
110
+ relation: relationName,
111
+ }),
112
+ ]));
113
+ return {
114
+ access: resolveAccess({ input: config.access, path }),
115
+ name,
116
+ relation,
117
+ relations,
118
+ select: resolveSelect({ defaultSelect, input: config.select, path }),
119
+ };
120
+ };
121
+ export const resolvePrismaModels = ({ client, input, }) => {
122
+ if (input !== undefined && !isRecord(input)) {
123
+ throw createError({
124
+ code: "AUTH_CONFIG_INVALID",
125
+ message: "Prisma models configuration is invalid.",
126
+ });
127
+ }
128
+ const models = isRecord(input) ? input : {};
129
+ if (models.sessions !== undefined && !isRecord(models.sessions)) {
130
+ throw createError({
131
+ code: "AUTH_CONFIG_INVALID",
132
+ message: "Prisma sessions model configuration is invalid.",
133
+ });
134
+ }
135
+ const sessions = isRecord(models.sessions) ? models.sessions : {};
136
+ const sessionName = sessions.name === undefined
137
+ ? PRISMA_DEFAULTS.sessions.name
138
+ : resolveName({ input: sessions.name, path: "models.sessions.name" });
139
+ return {
140
+ account: resolveModel({
141
+ client,
142
+ defaultName: PRISMA_DEFAULTS.account.name,
143
+ defaultSelect: PRISMA_DEFAULTS.account.select,
144
+ input: models.account,
145
+ path: "models.account",
146
+ relation: "account",
147
+ }),
148
+ sessions: sessionName,
149
+ };
150
+ };
151
+ //# sourceMappingURL=config.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config.js","sourceRoot":"","sources":["../../../src/adapters/prisma/config.ts"],"names":[],"mappings":"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"}
@@ -1,49 +1,4 @@
1
- import type { DbAdapter, SessionRecord } from "../../session/types.js";
2
- declare const DEFAULT_TABLE = "account_sessions";
3
- type DelegateMeta<T> = T[Extract<keyof T, symbol>];
4
- type DelegateRow<T> = DelegateMeta<T> extends {
5
- types: {
6
- payload: {
7
- scalars: infer Result;
8
- };
9
- };
10
- } ? Result : never;
11
- type IsSessionTable<T> = [DelegateRow<T>] extends [never] ? false : DelegateRow<T> extends SessionRecord ? true : false;
12
- export type PrismaSessionTable<Client> = {
13
- [Key in keyof Client]: IsSessionTable<Client[Key]> extends true ? Key : never;
14
- }[keyof Client] & string;
15
- export type PrismaAccessRules = {
16
- allowedRoles?: readonly string[];
17
- allowedStatuses: readonly string[];
18
- };
19
- export type PrismaRelationsConfig = {
20
- account?: string;
21
- user?: string;
22
- };
23
- export type PrismaSessionConfig<Client> = {
24
- relations?: PrismaRelationsConfig;
25
- table?: PrismaSessionTable<Client>;
26
- };
27
- export type PrismaAdapterConfig<Client> = {
28
- access: {
29
- account: PrismaAccessRules;
30
- user: PrismaAccessRules;
31
- };
32
- session?: PrismaSessionConfig<Client>;
33
- };
34
- type DefaultPrismaAdapterInput<Client extends object> = {
35
- client: Client;
36
- config: PrismaAdapterConfig<Client>;
37
- };
38
- type CustomPrismaAdapterInput<Client extends object> = {
39
- client: Client;
40
- config: PrismaAdapterConfig<Client> & {
41
- session: PrismaSessionConfig<Client> & {
42
- table: PrismaSessionTable<Client>;
43
- };
44
- };
45
- };
46
- export type PrismaAdapterInput<Client extends object> = typeof DEFAULT_TABLE extends PrismaSessionTable<Client> ? DefaultPrismaAdapterInput<Client> : CustomPrismaAdapterInput<Client>;
47
- export declare const createPrismaAdapter: <Client extends object>(input: PrismaAdapterInput<Client>) => DbAdapter;
48
- export {};
1
+ import type { PrismaAdapterInput, PrismaDb, PrismaModelsConfig } from "./types.js";
2
+ export type { PrismaAccount, PrismaAccountConfig, PrismaAccountModel, PrismaAdapterInput, PrismaModelsConfig, PrismaRelations, PrismaSessionConfig, PrismaSessionModel, } from "./types.js";
3
+ export declare const createPrismaAdapter: <Client extends object, const Models extends PrismaModelsConfig<Client> | undefined = undefined>(input: PrismaAdapterInput<Client, Models>) => PrismaDb<Client, Models>;
49
4
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/adapters/prisma/index.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAqB,SAAS,EAAE,aAAa,EAAE,MAAM,wBAAwB,CAAC;AAE1F,QAAA,MAAM,aAAa,qBAAqB,CAAC;AAEzC,KAAK,YAAY,CAAC,CAAC,IAAI,CAAC,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE,MAAM,CAAC,CAAC,CAAC;AAEnD,KAAK,WAAW,CAAC,CAAC,IACd,YAAY,CAAC,CAAC,CAAC,SAAS;IACpB,KAAK,EAAE;QACH,OAAO,EAAE;YAAE,OAAO,EAAE,MAAM,MAAM,CAAA;SAAE,CAAC;KACtC,CAAC;CACL,GACK,MAAM,GACN,KAAK,CAAC;AAEhB,KAAK,cAAc,CAAC,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,KAAK,CAAC,GACnD,KAAK,GACL,WAAW,CAAC,CAAC,CAAC,SAAS,aAAa,GAClC,IAAI,GACJ,KAAK,CAAC;AAEd,MAAM,MAAM,kBAAkB,CAAC,MAAM,IAAI;KACpC,GAAG,IAAI,MAAM,MAAM,GAAG,cAAc,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,SAAS,IAAI,GAAG,GAAG,GAAG,KAAK;CAChF,CAAC,MAAM,MAAM,CAAC,GACX,MAAM,CAAC;AAEX,MAAM,MAAM,iBAAiB,GAAG;IAC5B,YAAY,CAAC,EAAE,SAAS,MAAM,EAAE,CAAC;IACjC,eAAe,EAAE,SAAS,MAAM,EAAE,CAAC;CACtC,CAAC;AAEF,MAAM,MAAM,qBAAqB,GAAG;IAChC,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,IAAI,CAAC,EAAE,MAAM,CAAC;CACjB,CAAC;AAEF,MAAM,MAAM,mBAAmB,CAAC,MAAM,IAAI;IACtC,SAAS,CAAC,EAAE,qBAAqB,CAAC;IAClC,KAAK,CAAC,EAAE,kBAAkB,CAAC,MAAM,CAAC,CAAC;CACtC,CAAC;AAEF,MAAM,MAAM,mBAAmB,CAAC,MAAM,IAAI;IACtC,MAAM,EAAE;QACJ,OAAO,EAAE,iBAAiB,CAAC;QAC3B,IAAI,EAAE,iBAAiB,CAAC;KAC3B,CAAC;IACF,OAAO,CAAC,EAAE,mBAAmB,CAAC,MAAM,CAAC,CAAC;CACzC,CAAC;AAEF,KAAK,yBAAyB,CAAC,MAAM,SAAS,MAAM,IAAI;IACpD,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,mBAAmB,CAAC,MAAM,CAAC,CAAC;CACvC,CAAC;AAEF,KAAK,wBAAwB,CAAC,MAAM,SAAS,MAAM,IAAI;IACnD,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,mBAAmB,CAAC,MAAM,CAAC,GAAG;QAClC,OAAO,EAAE,mBAAmB,CAAC,MAAM,CAAC,GAAG;YACnC,KAAK,EAAE,kBAAkB,CAAC,MAAM,CAAC,CAAC;SACrC,CAAC;KACL,CAAC;CACL,CAAC;AAEF,MAAM,MAAM,kBAAkB,CAAC,MAAM,SAAS,MAAM,IAChD,OAAO,aAAa,SAAS,kBAAkB,CAAC,MAAM,CAAC,GACjD,yBAAyB,CAAC,MAAM,CAAC,GACjC,wBAAwB,CAAC,MAAM,CAAC,CAAC;AAsS3C,eAAO,MAAM,mBAAmB,GAAI,MAAM,SAAS,MAAM,EACrD,OAAO,kBAAkB,CAAC,MAAM,CAAC,KAClC,SAuFF,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/adapters/prisma/index.ts"],"names":[],"mappings":"AAWA,OAAO,KAAK,EAAiB,kBAAkB,EAAE,QAAQ,EAAE,kBAAkB,EAAE,MAAM,YAAY,CAAC;AAElG,YAAY,EACR,aAAa,EACb,mBAAmB,EACnB,kBAAkB,EAClB,kBAAkB,EAClB,kBAAkB,EAClB,eAAe,EACf,mBAAmB,EACnB,kBAAkB,GACrB,MAAM,YAAY,CAAC;AAEpB,eAAO,MAAM,mBAAmB,GAC5B,MAAM,SAAS,MAAM,EACrB,KAAK,CAAC,MAAM,SAAS,kBAAkB,CAAC,MAAM,CAAC,GAAG,SAAS,GAAG,SAAS,EAEvE,OAAO,kBAAkB,CAAC,MAAM,EAAE,MAAM,CAAC,KAC1C,QAAQ,CAAC,MAAM,EAAE,MAAM,CAqFzB,CAAC"}
@@ -1,224 +1,16 @@
1
1
  import { createError } from "../../errors.js";
2
- import { isAuthAccount, isNullableString, isRecord } from "../../session/guards.js";
3
- const DEFAULT_TABLE = "account_sessions";
4
- const select = {
5
- account_id: true,
6
- agent: true,
7
- created_at: true,
8
- expires_at: true,
9
- id: true,
10
- ip: true,
11
- platform: true,
12
- revoked_at: true,
13
- token_hash: true,
14
- updated_at: true,
15
- };
16
- const isNullableDate = (value) => {
17
- return value instanceof Date || value === null;
18
- };
19
- const isStringArray = (value) => {
20
- return (Array.isArray(value) &&
21
- value.every((item) => typeof item === "string" && item.length > 0));
22
- };
23
- const isDelegate = (value) => {
24
- return (isRecord(value) &&
25
- typeof value.create === "function" &&
26
- typeof value.findFirst === "function" &&
27
- typeof value.findMany === "function" &&
28
- typeof value.findUnique === "function" &&
29
- typeof value.update === "function" &&
30
- typeof value.updateMany === "function");
31
- };
32
- const isSessionRecord = (value) => {
33
- return (isRecord(value) &&
34
- typeof value.account_id === "string" &&
35
- isNullableString(value.agent) &&
36
- value.created_at instanceof Date &&
37
- value.expires_at instanceof Date &&
38
- typeof value.id === "string" &&
39
- isNullableString(value.ip) &&
40
- isNullableString(value.platform) &&
41
- isNullableDate(value.revoked_at) &&
42
- typeof value.token_hash === "string" &&
43
- isNullableDate(value.updated_at));
44
- };
45
- const resolveValues = ({ input, name }) => {
46
- if (!isStringArray(input) || input.length === 0 || new Set(input).size !== input.length) {
47
- throw createError({
48
- code: "AUTH_CONFIG_INVALID",
49
- message: `${name} must contain unique non-empty strings.`,
50
- });
51
- }
52
- return input;
53
- };
54
- const resolveAccess = (config) => {
55
- if (!isRecord(config) ||
56
- !isRecord(config.access) ||
57
- !isRecord(config.access.account) ||
58
- !isRecord(config.access.user)) {
59
- throw createError({
60
- code: "AUTH_CONFIG_INVALID",
61
- message: "Prisma account and user access rules are required.",
62
- });
63
- }
64
- return {
65
- account: {
66
- roles: config.access.account.allowedRoles === undefined
67
- ? null
68
- : resolveValues({
69
- input: config.access.account.allowedRoles,
70
- name: "access.account.allowedRoles",
71
- }),
72
- statuses: resolveValues({
73
- input: config.access.account.allowedStatuses,
74
- name: "access.account.allowedStatuses",
75
- }),
76
- },
77
- user: {
78
- roles: config.access.user.allowedRoles === undefined
79
- ? null
80
- : resolveValues({
81
- input: config.access.user.allowedRoles,
82
- name: "access.user.allowedRoles",
83
- }),
84
- statuses: resolveValues({
85
- input: config.access.user.allowedStatuses,
86
- name: "access.user.allowedStatuses",
87
- }),
88
- },
89
- };
90
- };
91
- const resolveName = ({ input, name }) => {
92
- if (typeof input !== "string" || !input) {
93
- throw createError({
94
- code: "AUTH_CONFIG_INVALID",
95
- message: `${name} must be a non-empty string.`,
96
- });
97
- }
98
- return input;
99
- };
100
- const resolveConfig = (config) => {
101
- if (!isRecord(config)) {
102
- throw createError({
103
- code: "AUTH_CONFIG_INVALID",
104
- message: "Prisma configuration is required.",
105
- });
106
- }
107
- if (config.session !== undefined && !isRecord(config.session)) {
108
- throw createError({
109
- code: "AUTH_CONFIG_INVALID",
110
- message: "Prisma session configuration is invalid.",
111
- });
112
- }
113
- const session = isRecord(config.session) ? config.session : {};
114
- if (session.relations !== undefined && !isRecord(session.relations)) {
115
- throw createError({
116
- code: "AUTH_CONFIG_INVALID",
117
- message: "Prisma session relations are invalid.",
118
- });
119
- }
120
- const relations = isRecord(session.relations) ? session.relations : {};
121
- return {
122
- access: resolveAccess(config),
123
- relations: {
124
- account: relations.account === undefined
125
- ? "account"
126
- : resolveName({
127
- input: relations.account,
128
- name: "session.relations.account",
129
- }),
130
- user: relations.user === undefined
131
- ? "user"
132
- : resolveName({ input: relations.user, name: "session.relations.user" }),
133
- },
134
- table: session.table === undefined
135
- ? DEFAULT_TABLE
136
- : resolveName({ input: session.table, name: "session.table" }),
137
- };
138
- };
139
- const matchesAccess = (value, rule) => {
140
- return rule.statuses.includes(value.status) && (!rule.roles || rule.roles.includes(value.role));
141
- };
142
- const createAuthSelect = (relations) => ({
143
- ...select,
144
- [relations.account]: {
145
- select: {
146
- email: true,
147
- id: true,
148
- name: true,
149
- role: true,
150
- status: true,
151
- timezone: true,
152
- [relations.user]: {
153
- select: {
154
- id: true,
155
- role: true,
156
- status: true,
157
- },
158
- },
159
- },
160
- },
161
- });
162
- const requireRow = (value) => {
163
- if (!isSessionRecord(value)) {
164
- throw new Error("Prisma session table returned invalid data.");
165
- }
166
- return {
167
- account_id: value.account_id,
168
- agent: value.agent,
169
- created_at: value.created_at,
170
- expires_at: value.expires_at,
171
- id: value.id,
172
- ip: value.ip,
173
- platform: value.platform,
174
- revoked_at: value.revoked_at,
175
- token_hash: value.token_hash,
176
- updated_at: value.updated_at,
177
- };
178
- };
179
- const requireRows = (value) => {
180
- if (!Array.isArray(value)) {
181
- throw new Error("Prisma session table returned invalid data.");
182
- }
183
- return value.map(requireRow);
184
- };
185
- const requireAuthRow = ({ access, relations, value }) => {
186
- const row = requireRow(value);
187
- if (!isRecord(value)) {
188
- throw new Error("Prisma account relation returned invalid data.");
189
- }
190
- const relation = value[relations.account];
191
- if (!isRecord(relation)) {
192
- throw new Error("Prisma account relation returned invalid data.");
193
- }
194
- const account = {
195
- email: relation.email,
196
- id: relation.id,
197
- name: relation.name,
198
- role: relation.role,
199
- status: relation.status,
200
- timezone: relation.timezone,
201
- user: relation[relations.user],
202
- };
203
- if (!isAuthAccount(account)) {
204
- throw new Error("Prisma account relation returned invalid data.");
205
- }
206
- return {
207
- ...row,
208
- account,
209
- allowed: matchesAccess(account, access.account) && matchesAccess(account.user, access.user),
210
- };
211
- };
2
+ import { isRecord } from "../../session/guards.js";
3
+ import { isPrismaDelegate, resolvePrismaModels } from "./config.js";
4
+ import { createAuthSelect, requireAuthRow, requireRow, requireRows, sessionSelect, } from "./model.js";
212
5
  export const createPrismaAdapter = (input) => {
213
- const config = input.config;
214
- const resolved = resolveConfig(config);
215
- const table_name = resolved.table;
216
- const table = isRecord(input.client) ? input.client[table_name] : undefined;
217
- const authSelect = createAuthSelect(resolved.relations);
218
- if (!isDelegate(table)) {
6
+ const raw = input;
7
+ const resolved = resolvePrismaModels({ client: raw.client, input: raw.models });
8
+ const table = isRecord(raw.client) ? raw.client[resolved.sessions] : undefined;
9
+ const authSelect = createAuthSelect(resolved.account);
10
+ if (!isPrismaDelegate(table)) {
219
11
  throw createError({
220
12
  code: "AUTH_CONFIG_INVALID",
221
- message: `Prisma session table ${table_name} is invalid.`,
13
+ message: `Prisma session model ${resolved.sessions} is invalid.`,
222
14
  });
223
15
  }
224
16
  return {
@@ -227,7 +19,7 @@ export const createPrismaAdapter = (input) => {
227
19
  },
228
20
  find: async ({ account_id, session_id }) => {
229
21
  const row = await table.findFirst({
230
- select,
22
+ select: sessionSelect,
231
23
  where: {
232
24
  account_id,
233
25
  id: session_id,
@@ -238,7 +30,7 @@ export const createPrismaAdapter = (input) => {
238
30
  findActive: async ({ account_id, now }) => {
239
31
  const rows = await table.findMany({
240
32
  orderBy: { created_at: "desc" },
241
- select,
33
+ select: sessionSelect,
242
34
  where: {
243
35
  account_id,
244
36
  expires_at: { gt: now },
@@ -255,8 +47,7 @@ export const createPrismaAdapter = (input) => {
255
47
  return row === null
256
48
  ? null
257
49
  : requireAuthRow({
258
- access: resolved.access,
259
- relations: resolved.relations,
50
+ account: resolved.account,
260
51
  value: row,
261
52
  });
262
53
  },
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/adapters/prisma/index.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/adapters/prisma/index.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,33 @@
1
+ import type { AuthSessionRecord, SessionRecord } from "../../session/types.js";
2
+ import type { ResolvedPrismaModel } from "./types.js";
3
+ export declare const sessionSelect: {
4
+ readonly account_id: true;
5
+ readonly agent: true;
6
+ readonly created_at: true;
7
+ readonly expires_at: true;
8
+ readonly id: true;
9
+ readonly ip: true;
10
+ readonly platform: true;
11
+ readonly revoked_at: true;
12
+ readonly token_hash: true;
13
+ readonly updated_at: true;
14
+ };
15
+ export declare const createAuthSelect: (account: ResolvedPrismaModel) => {
16
+ account_id: true;
17
+ agent: true;
18
+ created_at: true;
19
+ expires_at: true;
20
+ id: true;
21
+ ip: true;
22
+ platform: true;
23
+ revoked_at: true;
24
+ token_hash: true;
25
+ updated_at: true;
26
+ };
27
+ export declare const requireRow: (value: unknown) => SessionRecord;
28
+ export declare const requireRows: (value: unknown) => SessionRecord[];
29
+ export declare const requireAuthRow: ({ account, value, }: {
30
+ account: ResolvedPrismaModel;
31
+ value: unknown;
32
+ }) => AuthSessionRecord;
33
+ //# sourceMappingURL=model.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"model.d.ts","sourceRoot":"","sources":["../../../src/adapters/prisma/model.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAER,iBAAiB,EAEjB,aAAa,EAChB,MAAM,wBAAwB,CAAC;AAChC,OAAO,KAAK,EAAqB,mBAAmB,EAAE,MAAM,YAAY,CAAC;AAOzE,eAAO,MAAM,aAAa;;;;;;;;;;;CAWhB,CAAC;AAmCX,eAAO,MAAM,gBAAgB,GAAI,SAAS,mBAAmB;;;;;;;;;;;CAK3D,CAAC;AAuDH,eAAO,MAAM,UAAU,GAAI,OAAO,OAAO,KAAG,aAiB3C,CAAC;AAEF,eAAO,MAAM,WAAW,GAAI,OAAO,OAAO,KAAG,aAAa,EAMzD,CAAC;AAEF,eAAO,MAAM,cAAc,GAAI,qBAG5B;IACC,OAAO,EAAE,mBAAmB,CAAC;IAC7B,KAAK,EAAE,OAAO,CAAC;CAClB,KAAG,iBAcH,CAAC"}
@@ -0,0 +1,110 @@
1
+ import { isAuthValue, isNullableString, isRecord } from "../../session/guards.js";
2
+ export const sessionSelect = {
3
+ account_id: true,
4
+ agent: true,
5
+ created_at: true,
6
+ expires_at: true,
7
+ id: true,
8
+ ip: true,
9
+ platform: true,
10
+ revoked_at: true,
11
+ token_hash: true,
12
+ updated_at: true,
13
+ };
14
+ const isNullableDate = (value) => {
15
+ return value instanceof Date || value === null;
16
+ };
17
+ const isSessionRecord = (value) => {
18
+ return (isRecord(value) &&
19
+ typeof value.account_id === "string" &&
20
+ isNullableString(value.agent) &&
21
+ value.created_at instanceof Date &&
22
+ value.expires_at instanceof Date &&
23
+ typeof value.id === "string" &&
24
+ isNullableString(value.ip) &&
25
+ isNullableString(value.platform) &&
26
+ isNullableDate(value.revoked_at) &&
27
+ typeof value.token_hash === "string" &&
28
+ isNullableDate(value.updated_at));
29
+ };
30
+ const createModelSelect = (model) => {
31
+ const fields = new Set([...model.select, ...Object.keys(model.access)]);
32
+ const select = Object.fromEntries([...fields].map((field) => [field, true]));
33
+ for (const relation of Object.values(model.relations)) {
34
+ select[relation.relation] = { select: createModelSelect(relation) };
35
+ }
36
+ return select;
37
+ };
38
+ export const createAuthSelect = (account) => ({
39
+ ...sessionSelect,
40
+ [account.relation]: {
41
+ select: createModelSelect(account),
42
+ },
43
+ });
44
+ const matchesAccess = ({ access, value, }) => {
45
+ return Object.entries(access).every(([field, expected]) => {
46
+ const current = value[field];
47
+ return Array.isArray(expected)
48
+ ? expected.some((allowed) => Object.is(allowed, current))
49
+ : Object.is(expected, current);
50
+ });
51
+ };
52
+ const readModel = ({ model, value, }) => {
53
+ if (!isRecord(value)) {
54
+ throw new Error(`Prisma relation ${model.relation} returned invalid data.`);
55
+ }
56
+ const data = {};
57
+ for (const field of model.select) {
58
+ const fieldValue = value[field];
59
+ if (!isAuthValue(fieldValue) || isRecord(fieldValue) || Array.isArray(fieldValue)) {
60
+ throw new Error(`Prisma field ${model.name}.${field} returned invalid payload data.`);
61
+ }
62
+ data[field] = fieldValue;
63
+ }
64
+ if (typeof data.id !== "string") {
65
+ throw new Error(`Prisma model ${model.name} must return a string id.`);
66
+ }
67
+ let allowed = matchesAccess({ access: model.access, value });
68
+ for (const relation of Object.values(model.relations)) {
69
+ const nested = readModel({ model: relation, value: value[relation.relation] });
70
+ data[relation.relation] = nested.data;
71
+ allowed &&= nested.allowed;
72
+ }
73
+ return { allowed, data: data };
74
+ };
75
+ export const requireRow = (value) => {
76
+ if (!isSessionRecord(value)) {
77
+ throw new Error("Prisma session table returned invalid data.");
78
+ }
79
+ return {
80
+ account_id: value.account_id,
81
+ agent: value.agent,
82
+ created_at: value.created_at,
83
+ expires_at: value.expires_at,
84
+ id: value.id,
85
+ ip: value.ip,
86
+ platform: value.platform,
87
+ revoked_at: value.revoked_at,
88
+ token_hash: value.token_hash,
89
+ updated_at: value.updated_at,
90
+ };
91
+ };
92
+ export const requireRows = (value) => {
93
+ if (!Array.isArray(value)) {
94
+ throw new Error("Prisma session table returned invalid data.");
95
+ }
96
+ return value.map(requireRow);
97
+ };
98
+ export const requireAuthRow = ({ account, value, }) => {
99
+ const row = requireRow(value);
100
+ if (!isRecord(value)) {
101
+ throw new Error("Prisma account relation returned invalid data.");
102
+ }
103
+ const resolved = readModel({ model: account, value: value[account.relation] });
104
+ return {
105
+ ...row,
106
+ account: resolved.data,
107
+ allowed: resolved.allowed,
108
+ };
109
+ };
110
+ //# sourceMappingURL=model.js.map