@proofkit/better-auth 0.3.1-beta.0 → 0.4.0-beta.10
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/bin/intent.js +20 -0
- package/dist/esm/adapter.d.ts +6 -10
- package/dist/esm/adapter.js +58 -93
- package/dist/esm/adapter.js.map +1 -1
- package/dist/esm/better-auth-cli/utils/add-svelte-kit-env-modules.js.map +1 -1
- package/dist/esm/better-auth-cli/utils/get-config.js.map +1 -1
- package/dist/esm/better-auth-cli/utils/get-tsconfig-info.js.map +1 -1
- package/dist/esm/cli/index.js +66 -23
- package/dist/esm/cli/index.js.map +1 -1
- package/dist/esm/migrate.d.ts +26 -84
- package/dist/esm/migrate.js +92 -100
- package/dist/esm/migrate.js.map +1 -1
- package/package.json +24 -19
- package/skills/better-auth-setup/SKILL.md +233 -0
- package/src/adapter.ts +84 -107
- package/src/cli/index.ts +88 -28
- package/src/migrate.ts +143 -157
- package/dist/esm/odata/index.d.ts +0 -29
- package/dist/esm/odata/index.js +0 -157
- package/dist/esm/odata/index.js.map +0 -1
- package/src/odata/index.ts +0 -219
package/bin/intent.js
ADDED
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
// Auto-generated by @tanstack/intent setup
|
|
3
|
+
// Exposes the intent end-user CLI for consumers of this library.
|
|
4
|
+
// Commit this file, then add to your package.json:
|
|
5
|
+
// "bin": { "intent": "./bin/intent.js" }
|
|
6
|
+
try {
|
|
7
|
+
await import("@tanstack/intent/intent-library");
|
|
8
|
+
} catch (e) {
|
|
9
|
+
if (e?.code === "ERR_MODULE_NOT_FOUND" || e?.code === "MODULE_NOT_FOUND") {
|
|
10
|
+
console.error("@tanstack/intent is not installed.");
|
|
11
|
+
console.error("");
|
|
12
|
+
console.error("Install it as a dev dependency:");
|
|
13
|
+
console.error(" npm add -D @tanstack/intent");
|
|
14
|
+
console.error("");
|
|
15
|
+
console.error("Or run directly:");
|
|
16
|
+
console.error(" npx @tanstack/intent@latest list");
|
|
17
|
+
process.exit(1);
|
|
18
|
+
}
|
|
19
|
+
throw e;
|
|
20
|
+
}
|
package/dist/esm/adapter.d.ts
CHANGED
|
@@ -1,13 +1,9 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import {
|
|
3
|
-
interface FileMakerAdapterConfig {
|
|
4
|
-
debugLogs?:
|
|
1
|
+
import { Database } from '../../fmodata/src.js';
|
|
2
|
+
import { CleanedWhere, DBAdapterDebugLogOption } from 'better-auth/adapters';
|
|
3
|
+
export interface FileMakerAdapterConfig {
|
|
4
|
+
debugLogs?: DBAdapterDebugLogOption;
|
|
5
5
|
usePlural?: boolean;
|
|
6
|
-
|
|
7
|
-
}
|
|
8
|
-
export interface AdapterOptions {
|
|
9
|
-
config: FileMakerAdapterConfig;
|
|
6
|
+
database: Database;
|
|
10
7
|
}
|
|
11
8
|
export declare function parseWhere(where?: CleanedWhere[]): string;
|
|
12
|
-
export declare const FileMakerAdapter: (
|
|
13
|
-
export {};
|
|
9
|
+
export declare const FileMakerAdapter: (config: FileMakerAdapterConfig) => import('better-auth/adapters').AdapterFactory<import('better-auth').BetterAuthOptions>;
|
package/dist/esm/adapter.js
CHANGED
|
@@ -1,26 +1,5 @@
|
|
|
1
1
|
import { logger } from "better-auth";
|
|
2
|
-
import {
|
|
3
|
-
import buildQuery from "odata-query";
|
|
4
|
-
import { z, prettifyError } from "zod/v4";
|
|
5
|
-
import { createRawFetch } from "./odata/index.js";
|
|
6
|
-
const configSchema = z.object({
|
|
7
|
-
debugLogs: z.unknown().optional(),
|
|
8
|
-
usePlural: z.boolean().optional(),
|
|
9
|
-
odata: z.object({
|
|
10
|
-
serverUrl: z.url(),
|
|
11
|
-
auth: z.union([z.object({ username: z.string(), password: z.string() }), z.object({ apiKey: z.string() })]),
|
|
12
|
-
database: z.string().endsWith(".fmp12")
|
|
13
|
-
})
|
|
14
|
-
});
|
|
15
|
-
const defaultConfig = {
|
|
16
|
-
debugLogs: false,
|
|
17
|
-
usePlural: false,
|
|
18
|
-
odata: {
|
|
19
|
-
serverUrl: "",
|
|
20
|
-
auth: { username: "", password: "" },
|
|
21
|
-
database: ""
|
|
22
|
-
}
|
|
23
|
-
};
|
|
2
|
+
import { createAdapterFactory } from "better-auth/adapters";
|
|
24
3
|
const FIELD_SPECIAL_CHARS_REGEX = /[\s_]/;
|
|
25
4
|
const ISO_DATE_REGEX = /^\d{4}-\d{2}-\d{2}T\d{2}:\d{2}:\d{2}(\.\d{3})?Z?$/;
|
|
26
5
|
function parseWhere(where) {
|
|
@@ -107,43 +86,48 @@ function parseWhere(where) {
|
|
|
107
86
|
}
|
|
108
87
|
return clauses.join(" ");
|
|
109
88
|
}
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
89
|
+
function buildQueryString(params) {
|
|
90
|
+
var _a;
|
|
91
|
+
const parts = [];
|
|
92
|
+
if (params.top !== void 0) {
|
|
93
|
+
parts.push(`$top=${params.top}`);
|
|
114
94
|
}
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
95
|
+
if (params.skip !== void 0) {
|
|
96
|
+
parts.push(`$skip=${params.skip}`);
|
|
97
|
+
}
|
|
98
|
+
if (params.filter) {
|
|
99
|
+
parts.push(`$filter=${encodeURIComponent(params.filter)}`);
|
|
100
|
+
}
|
|
101
|
+
if (params.orderBy) {
|
|
102
|
+
parts.push(`$orderby=${encodeURIComponent(params.orderBy)}`);
|
|
103
|
+
}
|
|
104
|
+
if ((_a = params.select) == null ? void 0 : _a.length) {
|
|
105
|
+
parts.push(`$select=${params.select.map(encodeURIComponent).join(",")}`);
|
|
106
|
+
}
|
|
107
|
+
return parts.length > 0 ? `?${parts.join("&")}` : "";
|
|
108
|
+
}
|
|
109
|
+
const FileMakerAdapter = (config) => {
|
|
110
|
+
if (!config.database || typeof config.database !== "object") {
|
|
111
|
+
throw new Error("FileMakerAdapter requires a `database` (fmodata Database instance).");
|
|
112
|
+
}
|
|
113
|
+
const db = config.database;
|
|
114
|
+
const adapterFactory = createAdapterFactory({
|
|
121
115
|
config: {
|
|
122
116
|
adapterId: "filemaker",
|
|
123
117
|
adapterName: "FileMaker",
|
|
124
118
|
usePlural: config.usePlural ?? false,
|
|
125
|
-
// Whether the table names in the schema are plural.
|
|
126
119
|
debugLogs: config.debugLogs ?? false,
|
|
127
|
-
// Whether to enable debug logs.
|
|
128
120
|
supportsJSON: false,
|
|
129
|
-
// Whether the database supports JSON. (Default: false)
|
|
130
121
|
supportsDates: false,
|
|
131
|
-
// Whether the database supports dates. (Default: true)
|
|
132
122
|
supportsBooleans: false,
|
|
133
|
-
// Whether the database supports booleans. (Default: true)
|
|
134
123
|
supportsNumericIds: false
|
|
135
|
-
// Whether the database supports auto-incrementing numeric IDs. (Default: true)
|
|
136
124
|
},
|
|
137
125
|
adapter: () => {
|
|
138
126
|
return {
|
|
139
127
|
create: async ({ data, model }) => {
|
|
140
|
-
|
|
141
|
-
console.log("session", data);
|
|
142
|
-
}
|
|
143
|
-
const result = await fetch(`/${model}`, {
|
|
128
|
+
const result = await db._makeRequest(`/${model}`, {
|
|
144
129
|
method: "POST",
|
|
145
|
-
body: data
|
|
146
|
-
output: z.looseObject({ id: z.string() })
|
|
130
|
+
body: JSON.stringify(data)
|
|
147
131
|
});
|
|
148
132
|
if (result.error) {
|
|
149
133
|
throw new Error("Failed to create record");
|
|
@@ -154,14 +138,11 @@ const FileMakerAdapter = (_config = defaultConfig) => {
|
|
|
154
138
|
var _a;
|
|
155
139
|
const filter = parseWhere(where);
|
|
156
140
|
logger.debug("$filter", filter);
|
|
157
|
-
const query =
|
|
141
|
+
const query = buildQueryString({
|
|
158
142
|
filter: filter.length > 0 ? filter : void 0
|
|
159
143
|
});
|
|
160
|
-
const result = await
|
|
161
|
-
|
|
162
|
-
output: z.object({ value: z.number() })
|
|
163
|
-
});
|
|
164
|
-
if (!result.data) {
|
|
144
|
+
const result = await db._makeRequest(`/${model}/$count${query}`);
|
|
145
|
+
if (result.error) {
|
|
165
146
|
throw new Error("Failed to count records");
|
|
166
147
|
}
|
|
167
148
|
return ((_a = result.data) == null ? void 0 : _a.value) ?? 0;
|
|
@@ -170,14 +151,11 @@ const FileMakerAdapter = (_config = defaultConfig) => {
|
|
|
170
151
|
var _a, _b;
|
|
171
152
|
const filter = parseWhere(where);
|
|
172
153
|
logger.debug("$filter", filter);
|
|
173
|
-
const query =
|
|
154
|
+
const query = buildQueryString({
|
|
174
155
|
top: 1,
|
|
175
156
|
filter: filter.length > 0 ? filter : void 0
|
|
176
157
|
});
|
|
177
|
-
const result = await
|
|
178
|
-
method: "GET",
|
|
179
|
-
output: z.object({ value: z.array(z.any()) })
|
|
180
|
-
});
|
|
158
|
+
const result = await db._makeRequest(`/${model}${query}`);
|
|
181
159
|
if (result.error) {
|
|
182
160
|
throw new Error("Failed to find record");
|
|
183
161
|
}
|
|
@@ -187,17 +165,14 @@ const FileMakerAdapter = (_config = defaultConfig) => {
|
|
|
187
165
|
var _a;
|
|
188
166
|
const filter = parseWhere(where);
|
|
189
167
|
logger.debug("FIND MANY", { where, filter });
|
|
190
|
-
const query =
|
|
168
|
+
const query = buildQueryString({
|
|
191
169
|
top: limit,
|
|
192
170
|
skip: offset,
|
|
193
171
|
orderBy: sortBy ? `${sortBy.field} ${sortBy.direction ?? "asc"}` : void 0,
|
|
194
172
|
filter: filter.length > 0 ? filter : void 0
|
|
195
173
|
});
|
|
196
174
|
logger.debug("QUERY", query);
|
|
197
|
-
const result = await
|
|
198
|
-
method: "GET",
|
|
199
|
-
output: z.object({ value: z.array(z.any()) })
|
|
200
|
-
});
|
|
175
|
+
const result = await db._makeRequest(`/${model}${query}`);
|
|
201
176
|
logger.debug("RESULT", result);
|
|
202
177
|
if (result.error) {
|
|
203
178
|
throw new Error("Failed to find records");
|
|
@@ -207,45 +182,36 @@ const FileMakerAdapter = (_config = defaultConfig) => {
|
|
|
207
182
|
delete: async ({ model, where }) => {
|
|
208
183
|
var _a, _b, _c;
|
|
209
184
|
const filter = parseWhere(where);
|
|
210
|
-
console.log("DELETE", { model, where, filter });
|
|
211
185
|
logger.debug("$filter", filter);
|
|
212
|
-
const query =
|
|
186
|
+
const query = buildQueryString({
|
|
213
187
|
top: 1,
|
|
214
188
|
select: [`"id"`],
|
|
215
189
|
filter: filter.length > 0 ? filter : void 0
|
|
216
190
|
});
|
|
217
|
-
const toDelete = await
|
|
218
|
-
method: "GET",
|
|
219
|
-
output: z.object({ value: z.array(z.object({ id: z.string() })) })
|
|
220
|
-
});
|
|
191
|
+
const toDelete = await db._makeRequest(`/${model}${query}`);
|
|
221
192
|
const id = (_c = (_b = (_a = toDelete.data) == null ? void 0 : _a.value) == null ? void 0 : _b[0]) == null ? void 0 : _c.id;
|
|
222
193
|
if (!id) {
|
|
223
194
|
return;
|
|
224
195
|
}
|
|
225
|
-
const result = await
|
|
196
|
+
const result = await db._makeRequest(`/${model}('${id}')`, {
|
|
226
197
|
method: "DELETE"
|
|
227
198
|
});
|
|
228
199
|
if (result.error) {
|
|
229
|
-
console.log("DELETE ERROR", result.error);
|
|
230
200
|
throw new Error("Failed to delete record");
|
|
231
201
|
}
|
|
232
202
|
},
|
|
233
203
|
deleteMany: async ({ model, where }) => {
|
|
234
204
|
var _a, _b;
|
|
235
205
|
const filter = parseWhere(where);
|
|
236
|
-
|
|
237
|
-
const query = buildQuery({
|
|
206
|
+
const query = buildQueryString({
|
|
238
207
|
select: [`"id"`],
|
|
239
208
|
filter: filter.length > 0 ? filter : void 0
|
|
240
209
|
});
|
|
241
|
-
const rows = await
|
|
242
|
-
method: "GET",
|
|
243
|
-
output: z.object({ value: z.array(z.object({ id: z.string() })) })
|
|
244
|
-
});
|
|
210
|
+
const rows = await db._makeRequest(`/${model}${query}`);
|
|
245
211
|
const ids = ((_b = (_a = rows.data) == null ? void 0 : _a.value) == null ? void 0 : _b.map((r) => r.id)) ?? [];
|
|
246
212
|
let deleted = 0;
|
|
247
213
|
for (const id of ids) {
|
|
248
|
-
const res = await
|
|
214
|
+
const res = await db._makeRequest(`/${model}('${id}')`, {
|
|
249
215
|
method: "DELETE"
|
|
250
216
|
});
|
|
251
217
|
if (!res.error) {
|
|
@@ -259,51 +225,42 @@ const FileMakerAdapter = (_config = defaultConfig) => {
|
|
|
259
225
|
const filter = parseWhere(where);
|
|
260
226
|
logger.debug("UPDATE", { model, where, update });
|
|
261
227
|
logger.debug("$filter", filter);
|
|
262
|
-
const query =
|
|
228
|
+
const query = buildQueryString({
|
|
263
229
|
select: [`"id"`],
|
|
264
230
|
filter: filter.length > 0 ? filter : void 0
|
|
265
231
|
});
|
|
266
|
-
const existing = await
|
|
267
|
-
method: "GET",
|
|
268
|
-
output: z.object({ value: z.array(z.object({ id: z.string() })) })
|
|
269
|
-
});
|
|
232
|
+
const existing = await db._makeRequest(`/${model}${query}`);
|
|
270
233
|
logger.debug("EXISTING", existing.data);
|
|
271
234
|
const id = (_c = (_b = (_a = existing.data) == null ? void 0 : _a.value) == null ? void 0 : _b[0]) == null ? void 0 : _c.id;
|
|
272
235
|
if (!id) {
|
|
273
236
|
return null;
|
|
274
237
|
}
|
|
275
|
-
const patchRes = await
|
|
238
|
+
const patchRes = await db._makeRequest(`/${model}('${id}')`, {
|
|
276
239
|
method: "PATCH",
|
|
277
|
-
body: update
|
|
240
|
+
body: JSON.stringify(update)
|
|
278
241
|
});
|
|
279
242
|
logger.debug("PATCH RES", patchRes.data);
|
|
280
243
|
if (patchRes.error) {
|
|
281
244
|
return null;
|
|
282
245
|
}
|
|
283
|
-
const readBack = await
|
|
284
|
-
method: "GET",
|
|
285
|
-
output: z.record(z.string(), z.unknown())
|
|
286
|
-
});
|
|
246
|
+
const readBack = await db._makeRequest(`/${model}('${id}')`);
|
|
287
247
|
logger.debug("READ BACK", readBack.data);
|
|
288
248
|
return readBack.data ?? null;
|
|
289
249
|
},
|
|
290
250
|
updateMany: async ({ model, where, update }) => {
|
|
291
251
|
var _a, _b;
|
|
292
252
|
const filter = parseWhere(where);
|
|
293
|
-
const query =
|
|
253
|
+
const query = buildQueryString({
|
|
294
254
|
select: [`"id"`],
|
|
295
255
|
filter: filter.length > 0 ? filter : void 0
|
|
296
256
|
});
|
|
297
|
-
const rows = await
|
|
298
|
-
method: "GET",
|
|
299
|
-
output: z.object({ value: z.array(z.object({ id: z.string() })) })
|
|
300
|
-
});
|
|
257
|
+
const rows = await db._makeRequest(`/${model}${query}`);
|
|
301
258
|
const ids = ((_b = (_a = rows.data) == null ? void 0 : _a.value) == null ? void 0 : _b.map((r) => r.id)) ?? [];
|
|
302
259
|
let updated = 0;
|
|
303
260
|
for (const id of ids) {
|
|
304
|
-
const res = await
|
|
261
|
+
const res = await db._makeRequest(`/${model}('${id}')`, {
|
|
305
262
|
method: "PATCH",
|
|
306
|
-
body: update
|
|
263
|
+
body: JSON.stringify(update)
|
|
307
264
|
});
|
|
308
265
|
if (!res.error) {
|
|
309
266
|
updated++;
|
|
@@ -314,6 +271,14 @@ const FileMakerAdapter = (_config = defaultConfig) => {
|
|
|
314
271
|
};
|
|
315
272
|
}
|
|
316
273
|
});
|
|
274
|
+
const originalFactory = adapterFactory;
|
|
275
|
+
const wrappedFactory = ((options) => {
|
|
276
|
+
const adapter = originalFactory(options);
|
|
277
|
+
adapter.database = db;
|
|
278
|
+
return adapter;
|
|
279
|
+
});
|
|
280
|
+
wrappedFactory.database = db;
|
|
281
|
+
return wrappedFactory;
|
|
317
282
|
};
|
|
318
283
|
export {
|
|
319
284
|
FileMakerAdapter,
|
package/dist/esm/adapter.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"adapter.js","sources":["../../src/adapter.ts"],"sourcesContent":["/** biome-ignore-all lint/suspicious/noExplicitAny: library code */\nimport { logger } from \"better-auth\";\nimport { type AdapterDebugLogs, type CleanedWhere, createAdapter } from \"better-auth/adapters\";\nimport buildQuery from \"odata-query\";\nimport { prettifyError, z } from \"zod/v4\";\nimport { createRawFetch, type FmOdataConfig } from \"./odata\";\n\nconst configSchema = z.object({\n debugLogs: z.unknown().optional(),\n usePlural: z.boolean().optional(),\n odata: z.object({\n serverUrl: z.url(),\n auth: z.union([z.object({ username: z.string(), password: z.string() }), z.object({ apiKey: z.string() })]),\n database: z.string().endsWith(\".fmp12\"),\n }),\n});\n\ninterface FileMakerAdapterConfig {\n /**\n * Helps you debug issues with the adapter.\n */\n debugLogs?: AdapterDebugLogs;\n /**\n * If the table names in the schema are plural.\n */\n usePlural?: boolean;\n\n /**\n * Connection details for the FileMaker server.\n */\n odata: FmOdataConfig;\n}\n\nexport interface AdapterOptions {\n config: FileMakerAdapterConfig;\n}\n\nconst defaultConfig: Required<FileMakerAdapterConfig> = {\n debugLogs: false,\n usePlural: false,\n odata: {\n serverUrl: \"\",\n auth: { username: \"\", password: \"\" },\n database: \"\",\n },\n};\n\n// Regex patterns for field validation and ISO date detection\nconst FIELD_SPECIAL_CHARS_REGEX = /[\\s_]/;\nconst ISO_DATE_REGEX = /^\\d{4}-\\d{2}-\\d{2}T\\d{2}:\\d{2}:\\d{2}(\\.\\d{3})?Z?$/;\n\n/**\n * Parse the where clause to an OData filter string.\n * @param where - The where clause to parse.\n * @returns The OData filter string.\n * @internal\n */\nexport function parseWhere(where?: CleanedWhere[]): string {\n if (!where || where.length === 0) {\n return \"\";\n }\n\n // Helper to quote field names with special chars or if field is 'id'\n function quoteField(field: string, value?: any) {\n // Never quote for null or date values (per test expectations)\n if (value === null || value instanceof Date) {\n return field;\n }\n // Always quote if field is 'id' or has space or underscore\n if (field === \"id\" || FIELD_SPECIAL_CHARS_REGEX.test(field)) {\n return `\"${field}\"`;\n }\n return field;\n }\n\n // Helper to format values for OData\n function formatValue(value: any): string {\n if (value === null) {\n return \"null\";\n }\n if (typeof value === \"boolean\") {\n return value ? \"true\" : \"false\";\n }\n if (value instanceof Date) {\n return value.toISOString();\n }\n if (Array.isArray(value)) {\n return `(${value.map(formatValue).join(\",\")})`;\n }\n\n // Handle strings - check if it's an ISO date string first\n if (typeof value === \"string\") {\n // Check if it's an ISO date string (YYYY-MM-DDTHH:mm:ss.sssZ format)\n if (ISO_DATE_REGEX.test(value)) {\n return value; // Return ISO date strings without quotes\n }\n return `'${value.replace(/'/g, \"''\")}'`; // Regular strings get quotes\n }\n\n return value?.toString() ?? \"\";\n }\n\n // Map our operators to OData\n const opMap: Record<string, string> = {\n eq: \"eq\",\n ne: \"ne\",\n lt: \"lt\",\n lte: \"le\",\n gt: \"gt\",\n gte: \"ge\",\n };\n\n // Build each clause\n const clauses: string[] = [];\n for (let i = 0; i < where.length; i++) {\n const cond = where[i];\n if (!cond) {\n continue;\n }\n const field = quoteField(cond.field, cond.value);\n let clause = \"\";\n switch (cond.operator) {\n case \"eq\":\n case \"ne\":\n case \"lt\":\n case \"lte\":\n case \"gt\":\n case \"gte\":\n clause = `${field} ${opMap[cond.operator]} ${formatValue(cond.value)}`;\n break;\n case \"in\":\n if (Array.isArray(cond.value)) {\n clause = cond.value.map((v) => `${field} eq ${formatValue(v)}`).join(\" or \");\n clause = `(${clause})`;\n }\n break;\n case \"contains\":\n clause = `contains(${field}, ${formatValue(cond.value)})`;\n break;\n case \"starts_with\":\n clause = `startswith(${field}, ${formatValue(cond.value)})`;\n break;\n case \"ends_with\":\n clause = `endswith(${field}, ${formatValue(cond.value)})`;\n break;\n default:\n clause = `${field} eq ${formatValue(cond.value)}`;\n }\n clauses.push(clause);\n // Add connector if not last\n if (i < where.length - 1) {\n clauses.push((cond.connector || \"and\").toLowerCase());\n }\n }\n return clauses.join(\" \");\n}\n\nexport const FileMakerAdapter = (_config: FileMakerAdapterConfig = defaultConfig) => {\n const parsed = configSchema.loose().safeParse(_config);\n\n if (!parsed.success) {\n throw new Error(`Invalid configuration: ${prettifyError(parsed.error)}`);\n }\n const config = parsed.data;\n\n const { fetch } = createRawFetch({\n ...config.odata,\n logging: config.debugLogs ? \"verbose\" : \"none\",\n });\n\n return createAdapter({\n config: {\n adapterId: \"filemaker\",\n adapterName: \"FileMaker\",\n usePlural: config.usePlural ?? false, // Whether the table names in the schema are plural.\n debugLogs: config.debugLogs ?? false, // Whether to enable debug logs.\n supportsJSON: false, // Whether the database supports JSON. (Default: false)\n supportsDates: false, // Whether the database supports dates. (Default: true)\n supportsBooleans: false, // Whether the database supports booleans. (Default: true)\n supportsNumericIds: false, // Whether the database supports auto-incrementing numeric IDs. (Default: true)\n },\n adapter: () => {\n return {\n create: async ({ data, model }) => {\n if (model === \"session\") {\n console.log(\"session\", data);\n }\n\n const result = await fetch(`/${model}`, {\n method: \"POST\",\n body: data,\n output: z.looseObject({ id: z.string() }),\n });\n\n if (result.error) {\n throw new Error(\"Failed to create record\");\n }\n\n return result.data as any;\n },\n count: async ({ model, where }) => {\n const filter = parseWhere(where);\n logger.debug(\"$filter\", filter);\n\n const query = buildQuery({\n filter: filter.length > 0 ? filter : undefined,\n });\n\n const result = await fetch(`/${model}/$count${query}`, {\n method: \"GET\",\n output: z.object({ value: z.number() }),\n });\n if (!result.data) {\n throw new Error(\"Failed to count records\");\n }\n return (result.data?.value as any) ?? 0;\n },\n findOne: async ({ model, where }) => {\n const filter = parseWhere(where);\n logger.debug(\"$filter\", filter);\n\n const query = buildQuery({\n top: 1,\n filter: filter.length > 0 ? filter : undefined,\n });\n\n const result = await fetch(`/${model}${query}`, {\n method: \"GET\",\n output: z.object({ value: z.array(z.any()) }),\n });\n if (result.error) {\n throw new Error(\"Failed to find record\");\n }\n return (result.data?.value?.[0] as any) ?? null;\n },\n findMany: async ({ model, where, limit, offset, sortBy }) => {\n const filter = parseWhere(where);\n logger.debug(\"FIND MANY\", { where, filter });\n\n const query = buildQuery({\n top: limit,\n skip: offset,\n orderBy: sortBy ? `${sortBy.field} ${sortBy.direction ?? \"asc\"}` : undefined,\n filter: filter.length > 0 ? filter : undefined,\n });\n logger.debug(\"QUERY\", query);\n\n const result = await fetch(`/${model}${query}`, {\n method: \"GET\",\n output: z.object({ value: z.array(z.any()) }),\n });\n logger.debug(\"RESULT\", result);\n\n if (result.error) {\n throw new Error(\"Failed to find records\");\n }\n\n return (result.data?.value as any) ?? [];\n },\n delete: async ({ model, where }) => {\n const filter = parseWhere(where);\n console.log(\"DELETE\", { model, where, filter });\n logger.debug(\"$filter\", filter);\n\n // Find a single id matching the filter\n const query = buildQuery({\n top: 1,\n select: [`\"id\"`],\n filter: filter.length > 0 ? filter : undefined,\n });\n\n const toDelete = await fetch(`/${model}${query}`, {\n method: \"GET\",\n output: z.object({ value: z.array(z.object({ id: z.string() })) }),\n });\n\n const id = toDelete.data?.value?.[0]?.id;\n if (!id) {\n // Nothing to delete\n return;\n }\n\n const result = await fetch(`/${model}('${id}')`, {\n method: \"DELETE\",\n });\n if (result.error) {\n console.log(\"DELETE ERROR\", result.error);\n throw new Error(\"Failed to delete record\");\n }\n },\n deleteMany: async ({ model, where }) => {\n const filter = parseWhere(where);\n console.log(\"DELETE MANY\", { model, where, filter });\n\n // Find all ids matching the filter\n const query = buildQuery({\n select: [`\"id\"`],\n filter: filter.length > 0 ? filter : undefined,\n });\n\n const rows = await fetch(`/${model}${query}`, {\n method: \"GET\",\n output: z.object({ value: z.array(z.object({ id: z.string() })) }),\n });\n\n const ids = rows.data?.value?.map((r: any) => r.id) ?? [];\n let deleted = 0;\n for (const id of ids) {\n const res = await fetch(`/${model}('${id}')`, {\n method: \"DELETE\",\n });\n if (!res.error) {\n deleted++;\n }\n }\n return deleted;\n },\n update: async ({ model, where, update }) => {\n const filter = parseWhere(where);\n logger.debug(\"UPDATE\", { model, where, update });\n logger.debug(\"$filter\", filter);\n // Find one id to update\n const query = buildQuery({\n select: [`\"id\"`],\n filter: filter.length > 0 ? filter : undefined,\n });\n\n const existing = await fetch(`/${model}${query}`, {\n method: \"GET\",\n output: z.object({ value: z.array(z.object({ id: z.string() })) }),\n });\n logger.debug(\"EXISTING\", existing.data);\n\n const id = existing.data?.value?.[0]?.id;\n if (!id) {\n return null;\n }\n\n const patchRes = await fetch(`/${model}('${id}')`, {\n method: \"PATCH\",\n body: update,\n });\n logger.debug(\"PATCH RES\", patchRes.data);\n if (patchRes.error) {\n return null;\n }\n\n // Read back the updated record\n const readBack = await fetch(`/${model}('${id}')`, {\n method: \"GET\",\n output: z.record(z.string(), z.unknown()),\n });\n logger.debug(\"READ BACK\", readBack.data);\n return (readBack.data as any) ?? null;\n },\n updateMany: async ({ model, where, update }) => {\n const filter = parseWhere(where);\n // Find all ids matching the filter\n const query = buildQuery({\n select: [`\"id\"`],\n filter: filter.length > 0 ? filter : undefined,\n });\n\n const rows = await fetch(`/${model}${query}`, {\n method: \"GET\",\n output: z.object({ value: z.array(z.object({ id: z.string() })) }),\n });\n\n const ids = rows.data?.value?.map((r: any) => r.id) ?? [];\n let updated = 0;\n for (const id of ids) {\n const res = await fetch(`/${model}('${id}')`, {\n method: \"PATCH\",\n body: update,\n });\n if (!res.error) {\n updated++;\n }\n }\n return updated as any;\n },\n };\n },\n });\n};\n"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"adapter.js","sources":["../../src/adapter.ts"],"sourcesContent":["/** biome-ignore-all lint/suspicious/noExplicitAny: library code */\nimport type { Database } from \"@proofkit/fmodata\";\nimport { logger } from \"better-auth\";\nimport { type CleanedWhere, createAdapterFactory, type DBAdapterDebugLogOption } from \"better-auth/adapters\";\n\nexport interface FileMakerAdapterConfig {\n /**\n * Helps you debug issues with the adapter.\n */\n debugLogs?: DBAdapterDebugLogOption;\n /**\n * If the table names in the schema are plural.\n */\n usePlural?: boolean;\n /**\n * The fmodata Database instance to use for all OData requests.\n */\n database: Database;\n}\n\n// Regex patterns for field validation and ISO date detection\nconst FIELD_SPECIAL_CHARS_REGEX = /[\\s_]/;\nconst ISO_DATE_REGEX = /^\\d{4}-\\d{2}-\\d{2}T\\d{2}:\\d{2}:\\d{2}(\\.\\d{3})?Z?$/;\n\n/**\n * Parse the where clause to an OData filter string.\n * @param where - The where clause to parse.\n * @returns The OData filter string.\n * @internal\n */\nexport function parseWhere(where?: CleanedWhere[]): string {\n if (!where || where.length === 0) {\n return \"\";\n }\n\n // Helper to quote field names with special chars or if field is 'id'\n function quoteField(field: string, value?: any) {\n // Never quote for null or date values (per test expectations)\n if (value === null || value instanceof Date) {\n return field;\n }\n // Always quote if field is 'id' or has space or underscore\n if (field === \"id\" || FIELD_SPECIAL_CHARS_REGEX.test(field)) {\n return `\"${field}\"`;\n }\n return field;\n }\n\n // Helper to format values for OData\n function formatValue(value: any): string {\n if (value === null) {\n return \"null\";\n }\n if (typeof value === \"boolean\") {\n return value ? \"true\" : \"false\";\n }\n if (value instanceof Date) {\n return value.toISOString();\n }\n if (Array.isArray(value)) {\n return `(${value.map(formatValue).join(\",\")})`;\n }\n\n // Handle strings - check if it's an ISO date string first\n if (typeof value === \"string\") {\n // Check if it's an ISO date string (YYYY-MM-DDTHH:mm:ss.sssZ format)\n if (ISO_DATE_REGEX.test(value)) {\n return value; // Return ISO date strings without quotes\n }\n return `'${value.replace(/'/g, \"''\")}'`; // Regular strings get quotes\n }\n\n return value?.toString() ?? \"\";\n }\n\n // Map our operators to OData\n const opMap: Record<string, string> = {\n eq: \"eq\",\n ne: \"ne\",\n lt: \"lt\",\n lte: \"le\",\n gt: \"gt\",\n gte: \"ge\",\n };\n\n // Build each clause\n const clauses: string[] = [];\n for (let i = 0; i < where.length; i++) {\n const cond = where[i];\n if (!cond) {\n continue;\n }\n const field = quoteField(cond.field, cond.value);\n let clause = \"\";\n switch (cond.operator) {\n case \"eq\":\n case \"ne\":\n case \"lt\":\n case \"lte\":\n case \"gt\":\n case \"gte\":\n clause = `${field} ${opMap[cond.operator]} ${formatValue(cond.value)}`;\n break;\n case \"in\":\n if (Array.isArray(cond.value)) {\n clause = cond.value.map((v) => `${field} eq ${formatValue(v)}`).join(\" or \");\n clause = `(${clause})`;\n }\n break;\n case \"contains\":\n clause = `contains(${field}, ${formatValue(cond.value)})`;\n break;\n case \"starts_with\":\n clause = `startswith(${field}, ${formatValue(cond.value)})`;\n break;\n case \"ends_with\":\n clause = `endswith(${field}, ${formatValue(cond.value)})`;\n break;\n default:\n clause = `${field} eq ${formatValue(cond.value)}`;\n }\n clauses.push(clause);\n // Add connector if not last\n if (i < where.length - 1) {\n clauses.push((cond.connector || \"and\").toLowerCase());\n }\n }\n return clauses.join(\" \");\n}\n\n/**\n * Build an OData query string from parameters.\n */\nfunction buildQueryString(params: {\n top?: number;\n skip?: number;\n filter?: string;\n orderBy?: string;\n select?: string[];\n}): string {\n const parts: string[] = [];\n if (params.top !== undefined) {\n parts.push(`$top=${params.top}`);\n }\n if (params.skip !== undefined) {\n parts.push(`$skip=${params.skip}`);\n }\n if (params.filter) {\n parts.push(`$filter=${encodeURIComponent(params.filter)}`);\n }\n if (params.orderBy) {\n parts.push(`$orderby=${encodeURIComponent(params.orderBy)}`);\n }\n if (params.select?.length) {\n parts.push(`$select=${params.select.map(encodeURIComponent).join(\",\")}`);\n }\n return parts.length > 0 ? `?${parts.join(\"&\")}` : \"\";\n}\n\nexport const FileMakerAdapter = (config: FileMakerAdapterConfig) => {\n if (!config.database || typeof config.database !== \"object\") {\n throw new Error(\"FileMakerAdapter requires a `database` (fmodata Database instance).\");\n }\n\n const db = config.database;\n\n const adapterFactory = createAdapterFactory({\n config: {\n adapterId: \"filemaker\",\n adapterName: \"FileMaker\",\n usePlural: config.usePlural ?? false,\n debugLogs: config.debugLogs ?? false,\n supportsJSON: false,\n supportsDates: false,\n supportsBooleans: false,\n supportsNumericIds: false,\n },\n adapter: () => {\n return {\n create: async ({ data, model }) => {\n const result = await db._makeRequest<Record<string, any>>(`/${model}`, {\n method: \"POST\",\n body: JSON.stringify(data),\n });\n\n if (result.error) {\n throw new Error(\"Failed to create record\");\n }\n\n return result.data as any;\n },\n count: async ({ model, where }) => {\n const filter = parseWhere(where);\n logger.debug(\"$filter\", filter);\n\n const query = buildQueryString({\n filter: filter.length > 0 ? filter : undefined,\n });\n\n const result = await db._makeRequest<{ value: number }>(`/${model}/$count${query}`);\n if (result.error) {\n throw new Error(\"Failed to count records\");\n }\n return (result.data?.value as any) ?? 0;\n },\n findOne: async ({ model, where }) => {\n const filter = parseWhere(where);\n logger.debug(\"$filter\", filter);\n\n const query = buildQueryString({\n top: 1,\n filter: filter.length > 0 ? filter : undefined,\n });\n\n const result = await db._makeRequest<{ value: any[] }>(`/${model}${query}`);\n if (result.error) {\n throw new Error(\"Failed to find record\");\n }\n return (result.data?.value?.[0] as any) ?? null;\n },\n findMany: async ({ model, where, limit, offset, sortBy }) => {\n const filter = parseWhere(where);\n logger.debug(\"FIND MANY\", { where, filter });\n\n const query = buildQueryString({\n top: limit,\n skip: offset,\n orderBy: sortBy ? `${sortBy.field} ${sortBy.direction ?? \"asc\"}` : undefined,\n filter: filter.length > 0 ? filter : undefined,\n });\n logger.debug(\"QUERY\", query);\n\n const result = await db._makeRequest<{ value: any[] }>(`/${model}${query}`);\n logger.debug(\"RESULT\", result);\n\n if (result.error) {\n throw new Error(\"Failed to find records\");\n }\n\n return (result.data?.value as any) ?? [];\n },\n delete: async ({ model, where }) => {\n const filter = parseWhere(where);\n logger.debug(\"$filter\", filter);\n\n // Find a single id matching the filter\n const query = buildQueryString({\n top: 1,\n select: [`\"id\"`],\n filter: filter.length > 0 ? filter : undefined,\n });\n\n const toDelete = await db._makeRequest<{ value: { id: string }[] }>(`/${model}${query}`);\n\n const id = toDelete.data?.value?.[0]?.id;\n if (!id) {\n return;\n }\n\n const result = await db._makeRequest(`/${model}('${id}')`, {\n method: \"DELETE\",\n });\n if (result.error) {\n throw new Error(\"Failed to delete record\");\n }\n },\n deleteMany: async ({ model, where }) => {\n const filter = parseWhere(where);\n\n // Find all ids matching the filter\n const query = buildQueryString({\n select: [`\"id\"`],\n filter: filter.length > 0 ? filter : undefined,\n });\n\n const rows = await db._makeRequest<{ value: { id: string }[] }>(`/${model}${query}`);\n\n const ids = rows.data?.value?.map((r: any) => r.id) ?? [];\n let deleted = 0;\n for (const id of ids) {\n const res = await db._makeRequest(`/${model}('${id}')`, {\n method: \"DELETE\",\n });\n if (!res.error) {\n deleted++;\n }\n }\n return deleted;\n },\n update: async ({ model, where, update }) => {\n const filter = parseWhere(where);\n logger.debug(\"UPDATE\", { model, where, update });\n logger.debug(\"$filter\", filter);\n\n // Find one id to update\n const query = buildQueryString({\n select: [`\"id\"`],\n filter: filter.length > 0 ? filter : undefined,\n });\n\n const existing = await db._makeRequest<{ value: { id: string }[] }>(`/${model}${query}`);\n logger.debug(\"EXISTING\", existing.data);\n\n const id = existing.data?.value?.[0]?.id;\n if (!id) {\n return null;\n }\n\n const patchRes = await db._makeRequest(`/${model}('${id}')`, {\n method: \"PATCH\",\n body: JSON.stringify(update),\n });\n logger.debug(\"PATCH RES\", patchRes.data);\n if (patchRes.error) {\n return null;\n }\n\n // Read back the updated record\n const readBack = await db._makeRequest<Record<string, unknown>>(`/${model}('${id}')`);\n logger.debug(\"READ BACK\", readBack.data);\n return (readBack.data as any) ?? null;\n },\n updateMany: async ({ model, where, update }) => {\n const filter = parseWhere(where);\n\n // Find all ids matching the filter\n const query = buildQueryString({\n select: [`\"id\"`],\n filter: filter.length > 0 ? filter : undefined,\n });\n\n const rows = await db._makeRequest<{ value: { id: string }[] }>(`/${model}${query}`);\n\n const ids = rows.data?.value?.map((r: any) => r.id) ?? [];\n let updated = 0;\n for (const id of ids) {\n const res = await db._makeRequest(`/${model}('${id}')`, {\n method: \"PATCH\",\n body: JSON.stringify(update),\n });\n if (!res.error) {\n updated++;\n }\n }\n return updated as any;\n },\n };\n },\n });\n\n // Expose the Database instance for CLI access.\n // Set on both the factory function (for pre-getAdapter extraction)\n // and the returned adapter (for post-getAdapter extraction).\n const originalFactory = adapterFactory;\n const wrappedFactory = ((options: unknown) => {\n const adapter = (originalFactory as (opts: unknown) => Record<string, unknown>)(options);\n adapter.database = db;\n return adapter;\n }) as typeof adapterFactory;\n (wrappedFactory as unknown as { database: Database }).database = db;\n return wrappedFactory;\n};\n"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"add-svelte-kit-env-modules.js","sources":["../../../../src/better-auth-cli/utils/add-svelte-kit-env-modules.ts"],"sourcesContent":["export function addSvelteKitEnvModules(aliases: Record<string, string>) {\n aliases[\"$env/dynamic/private\"] = createDataUriModule(createDynamicEnvModule());\n aliases[\"$env/dynamic/public\"] = createDataUriModule(createDynamicEnvModule());\n aliases[\"$env/static/private\"] = createDataUriModule(createStaticEnvModule(filterPrivateEnv(\"PUBLIC_\", \"\")));\n aliases[\"$env/static/public\"] = createDataUriModule(createStaticEnvModule(filterPublicEnv(\"PUBLIC_\", \"\")));\n}\n\nfunction createDataUriModule(module: string) {\n return `data:text/javascript;charset=utf-8,${encodeURIComponent(module)}`;\n}\n\nfunction createStaticEnvModule(env: Record<string, string>) {\n const declarations = Object.keys(env)\n .filter((k) => validIdentifier.test(k) && !reserved.has(k))\n .map((k) => `export const ${k} = ${JSON.stringify(env[k])};`);\n\n return `\n ${declarations.join(\"\\n\")}\n // jiti dirty hack: .unknown\n `;\n}\n\nfunction createDynamicEnvModule() {\n return `\n export const env = process.env;\n // jiti dirty hack: .unknown\n `;\n}\n\nexport function filterPrivateEnv(publicPrefix: string, privatePrefix: string) {\n return Object.fromEntries(\n Object.entries(process.env).filter(\n ([k]) => k.startsWith(privatePrefix) && (publicPrefix === \"\" || !k.startsWith(publicPrefix)),\n ),\n ) as Record<string, string>;\n}\n\nexport function filterPublicEnv(publicPrefix: string, privatePrefix: string) {\n return Object.fromEntries(\n Object.entries(process.env).filter(\n ([k]) => k.startsWith(publicPrefix) && (privatePrefix === \"\" || !k.startsWith(privatePrefix)),\n ),\n ) as Record<string, string>;\n}\n\nconst validIdentifier = /^[a-zA-Z_$][a-zA-Z0-9_$]*$/;\nconst reserved = new Set([\n \"do\",\n \"if\",\n \"in\",\n \"for\",\n \"let\",\n \"new\",\n \"try\",\n \"var\",\n \"case\",\n \"else\",\n \"enum\",\n \"eval\",\n \"null\",\n \"this\",\n \"true\",\n \"void\",\n \"with\",\n \"await\",\n \"break\",\n \"catch\",\n \"class\",\n \"const\",\n \"false\",\n \"super\",\n \"throw\",\n \"while\",\n \"yield\",\n \"delete\",\n \"export\",\n \"import\",\n \"public\",\n \"return\",\n \"static\",\n \"switch\",\n \"typeof\",\n \"default\",\n \"extends\",\n \"finally\",\n \"package\",\n \"private\",\n \"continue\",\n \"debugger\",\n \"function\",\n \"arguments\",\n \"interface\",\n \"protected\",\n \"implements\",\n \"instanceof\",\n]);\n"],"names":[],"mappings":"AAAO,SAAS,uBAAuB,SAAiC;AACtE,UAAQ,sBAAsB,IAAI,oBAAoB,uBAAA,CAAwB;AAC9E,UAAQ,qBAAqB,IAAI,oBAAoB,uBAAA,CAAwB;
|
|
1
|
+
{"version":3,"file":"add-svelte-kit-env-modules.js","sources":["../../../../src/better-auth-cli/utils/add-svelte-kit-env-modules.ts"],"sourcesContent":["export function addSvelteKitEnvModules(aliases: Record<string, string>) {\n aliases[\"$env/dynamic/private\"] = createDataUriModule(createDynamicEnvModule());\n aliases[\"$env/dynamic/public\"] = createDataUriModule(createDynamicEnvModule());\n aliases[\"$env/static/private\"] = createDataUriModule(createStaticEnvModule(filterPrivateEnv(\"PUBLIC_\", \"\")));\n aliases[\"$env/static/public\"] = createDataUriModule(createStaticEnvModule(filterPublicEnv(\"PUBLIC_\", \"\")));\n}\n\nfunction createDataUriModule(module: string) {\n return `data:text/javascript;charset=utf-8,${encodeURIComponent(module)}`;\n}\n\nfunction createStaticEnvModule(env: Record<string, string>) {\n const declarations = Object.keys(env)\n .filter((k) => validIdentifier.test(k) && !reserved.has(k))\n .map((k) => `export const ${k} = ${JSON.stringify(env[k])};`);\n\n return `\n ${declarations.join(\"\\n\")}\n // jiti dirty hack: .unknown\n `;\n}\n\nfunction createDynamicEnvModule() {\n return `\n export const env = process.env;\n // jiti dirty hack: .unknown\n `;\n}\n\nexport function filterPrivateEnv(publicPrefix: string, privatePrefix: string) {\n return Object.fromEntries(\n Object.entries(process.env).filter(\n ([k]) => k.startsWith(privatePrefix) && (publicPrefix === \"\" || !k.startsWith(publicPrefix)),\n ),\n ) as Record<string, string>;\n}\n\nexport function filterPublicEnv(publicPrefix: string, privatePrefix: string) {\n return Object.fromEntries(\n Object.entries(process.env).filter(\n ([k]) => k.startsWith(publicPrefix) && (privatePrefix === \"\" || !k.startsWith(privatePrefix)),\n ),\n ) as Record<string, string>;\n}\n\nconst validIdentifier = /^[a-zA-Z_$][a-zA-Z0-9_$]*$/;\nconst reserved = new Set([\n \"do\",\n \"if\",\n \"in\",\n \"for\",\n \"let\",\n \"new\",\n \"try\",\n \"var\",\n \"case\",\n \"else\",\n \"enum\",\n \"eval\",\n \"null\",\n \"this\",\n \"true\",\n \"void\",\n \"with\",\n \"await\",\n \"break\",\n \"catch\",\n \"class\",\n \"const\",\n \"false\",\n \"super\",\n \"throw\",\n \"while\",\n \"yield\",\n \"delete\",\n \"export\",\n \"import\",\n \"public\",\n \"return\",\n \"static\",\n \"switch\",\n \"typeof\",\n \"default\",\n \"extends\",\n \"finally\",\n \"package\",\n \"private\",\n \"continue\",\n \"debugger\",\n \"function\",\n \"arguments\",\n \"interface\",\n \"protected\",\n \"implements\",\n \"instanceof\",\n]);\n"],"names":[],"mappings":"AAAO,SAAS,uBAAuB,SAAiC;AACtE,UAAQ,sBAAsB,IAAI,oBAAoB,uBAAA,CAAwB;AAC9E,UAAQ,qBAAqB,IAAI,oBAAoB,uBAAA,CAAwB;AAC7E,UAAQ,qBAAqB,IAAI,oBAAoB,sBAAsB,iBAAiB,WAAW,EAAE,CAAC,CAAC;AAC3G,UAAQ,oBAAoB,IAAI,oBAAoB,sBAAsB,gBAAgB,WAAW,EAAE,CAAC,CAAC;AAC3G;AAEA,SAAS,oBAAoB,QAAgB;AAC3C,SAAO,sCAAsC,mBAAmB,MAAM,CAAC;AACzE;AAEA,SAAS,sBAAsB,KAA6B;AAC1D,QAAM,eAAe,OAAO,KAAK,GAAG,EACjC,OAAO,CAAC,MAAM,gBAAgB,KAAK,CAAC,KAAK,CAAC,SAAS,IAAI,CAAC,CAAC,EACzD,IAAI,CAAC,MAAM,gBAAgB,CAAC,MAAM,KAAK,UAAU,IAAI,CAAC,CAAC,CAAC,GAAG;AAE9D,SAAO;AAAA,IACL,aAAa,KAAK,IAAI,CAAC;AAAA;AAAA;AAG3B;AAEA,SAAS,yBAAyB;AAChC,SAAO;AAAA;AAAA;AAAA;AAIT;AAEO,SAAS,iBAAiB,cAAsB,eAAuB;AAC5E,SAAO,OAAO;AAAA,IACZ,OAAO,QAAQ,QAAQ,GAAG,EAAE;AAAA,MAC1B,CAAC,CAAC,CAAC,MAAM,EAAE,WAAW,aAAa,KAA6B,CAAC,EAAE,WAAW,YAAY;AAAA,IAAA;AAAA,EAC5F;AAEJ;AAEO,SAAS,gBAAgB,cAAsB,eAAuB;AAC3E,SAAO,OAAO;AAAA,IACZ,OAAO,QAAQ,QAAQ,GAAG,EAAE;AAAA,MAC1B,CAAC,CAAC,CAAC,MAAM,EAAE,WAAW,YAAY,KAAM,kBAAkB;AAAA,IAAiC;AAAA,EAC7F;AAEJ;AAEA,MAAM,kBAAkB;AACxB,MAAM,+BAAe,IAAI;AAAA,EACvB;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,CAAC;"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"get-config.js","sources":["../../../../src/better-auth-cli/utils/get-config.ts"],"sourcesContent":["import fs, { existsSync } from \"node:fs\";\nimport path from \"node:path\";\n// @ts-expect-error not typed\nimport babelPresetReact from \"@babel/preset-react\";\n// @ts-expect-error not typed\nimport babelPresetTypeScript from \"@babel/preset-typescript\";\nimport type { BetterAuthOptions } from \"better-auth\";\nimport { BetterAuthError, logger } from \"better-auth\";\nimport { loadConfig } from \"c12\";\nimport { addSvelteKitEnvModules } from \"./add-svelte-kit-env-modules\";\nimport { getTsconfigInfo } from \"./get-tsconfig-info\";\n\nlet possiblePaths = [\"auth.ts\", \"auth.tsx\", \"auth.js\", \"auth.jsx\", \"auth.server.js\", \"auth.server.ts\"];\n\npossiblePaths = [\n ...possiblePaths,\n ...possiblePaths.map((it) => `lib/server/${it}`),\n ...possiblePaths.map((it) => `server/${it}`),\n ...possiblePaths.map((it) => `lib/${it}`),\n ...possiblePaths.map((it) => `utils/${it}`),\n];\npossiblePaths = [\n ...possiblePaths,\n ...possiblePaths.map((it) => `src/${it}`),\n ...possiblePaths.map((it) => `app/${it}`),\n];\n\nfunction getPathAliases(cwd: string): Record<string, string> | null {\n const tsConfigPath = path.join(cwd, \"tsconfig.json\");\n if (!fs.existsSync(tsConfigPath)) {\n return null;\n }\n try {\n const tsConfig = getTsconfigInfo(cwd);\n const { paths = {}, baseUrl = \".\" } = tsConfig.compilerOptions || {};\n const result: Record<string, string> = {};\n const obj = Object.entries(paths) as [string, string[]][];\n for (const [alias, aliasPaths] of obj) {\n for (const aliasedPath of aliasPaths) {\n const resolvedBaseUrl = path.join(cwd, baseUrl);\n const finalAlias = alias.slice(-1) === \"*\" ? alias.slice(0, -1) : alias;\n const finalAliasedPath = aliasedPath.slice(-1) === \"*\" ? aliasedPath.slice(0, -1) : aliasedPath;\n\n result[finalAlias || \"\"] = path.join(resolvedBaseUrl, finalAliasedPath);\n }\n }\n addSvelteKitEnvModules(result);\n return result;\n } catch (error) {\n console.error(error);\n throw new BetterAuthError(\"Error parsing tsconfig.json\");\n }\n}\n/**\n * .tsx files are not supported by Jiti.\n */\nconst jitiOptions = (cwd: string) => {\n const alias = getPathAliases(cwd) || {};\n return {\n transformOptions: {\n babel: {\n presets: [\n [\n babelPresetTypeScript,\n {\n isTSX: true,\n allExtensions: true,\n },\n ],\n [babelPresetReact, { runtime: \"automatic\" }],\n ],\n },\n },\n extensions: [\".ts\", \".tsx\", \".js\", \".jsx\"],\n alias,\n };\n};\nexport async function getConfig({\n cwd,\n configPath,\n shouldThrowOnError = false,\n}: {\n cwd: string;\n configPath?: string;\n shouldThrowOnError?: boolean;\n}) {\n try {\n let configFile: BetterAuthOptions | null = null;\n if (configPath) {\n let resolvedPath: string = path.join(cwd, configPath);\n if (existsSync(configPath)) {\n resolvedPath = configPath; // If the configPath is a file, use it as is, as it means the path wasn't relative.\n }\n const { config } = await loadConfig<{\n auth: {\n options: BetterAuthOptions;\n };\n default?: {\n options: BetterAuthOptions;\n };\n }>({\n configFile: resolvedPath,\n dotenv: true,\n jitiOptions: jitiOptions(cwd),\n });\n if (!(config.auth || config.default)) {\n if (shouldThrowOnError) {\n throw new Error(\n `Couldn't read your auth config in ${resolvedPath}. Make sure to default export your auth instance or to export as a variable named auth.`,\n );\n }\n logger.error(\n `[#better-auth]: Couldn't read your auth config in ${resolvedPath}. Make sure to default export your auth instance or to export as a variable named auth.`,\n );\n process.exit(1);\n }\n configFile = config.auth?.options || config.default?.options || null;\n }\n\n if (!configFile) {\n for (const possiblePath of possiblePaths) {\n try {\n const { config } = await loadConfig<{\n auth: {\n options: BetterAuthOptions;\n };\n default?: {\n options: BetterAuthOptions;\n };\n }>({\n configFile: possiblePath,\n jitiOptions: jitiOptions(cwd),\n });\n const hasConfig = Object.keys(config).length > 0;\n if (hasConfig) {\n configFile = config.auth?.options || config.default?.options || null;\n if (!configFile) {\n if (shouldThrowOnError) {\n throw new Error(\n \"Couldn't read your auth config. Make sure to default export your auth instance or to export as a variable named auth.\",\n );\n }\n logger.error(\"[#better-auth]: Couldn't read your auth config.\");\n console.log(\"\");\n logger.info(\n \"[#better-auth]: Make sure to default export your auth instance or to export as a variable named auth.\",\n );\n process.exit(1);\n }\n break;\n }\n } catch (e) {\n if (\n typeof e === \"object\" &&\n e &&\n \"message\" in e &&\n typeof e.message === \"string\" &&\n e.message.includes(\"This module cannot be imported from a Client Component module\")\n ) {\n if (shouldThrowOnError) {\n throw new Error(\n `Please remove import 'server-only' from your auth config file temporarily. The CLI cannot resolve the configuration with it included. You can re-add it after running the CLI.`,\n );\n }\n logger.error(\n `Please remove import 'server-only' from your auth config file temporarily. The CLI cannot resolve the configuration with it included. You can re-add it after running the CLI.`,\n );\n process.exit(1);\n }\n if (shouldThrowOnError) {\n throw e;\n }\n logger.error(\"[#better-auth]: Couldn't read your auth config.\", e);\n process.exit(1);\n }\n }\n }\n return configFile;\n } catch (e) {\n if (\n typeof e === \"object\" &&\n e &&\n \"message\" in e &&\n typeof e.message === \"string\" &&\n e.message.includes(\"This module cannot be imported from a Client Component module\")\n ) {\n if (shouldThrowOnError) {\n throw new Error(\n `Please remove import 'server-only' from your auth config file temporarily. The CLI cannot resolve the configuration with it included. You can re-add it after running the CLI.`,\n );\n }\n logger.error(\n `Please remove import 'server-only' from your auth config file temporarily. The CLI cannot resolve the configuration with it included. You can re-add it after running the CLI.`,\n );\n process.exit(1);\n }\n if (shouldThrowOnError) {\n throw e;\n }\n\n logger.error(\"Couldn't read your auth config.\", e);\n process.exit(1);\n }\n}\n\nexport { possiblePaths };\n"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"get-config.js","sources":["../../../../src/better-auth-cli/utils/get-config.ts"],"sourcesContent":["import fs, { existsSync } from \"node:fs\";\nimport path from \"node:path\";\n// @ts-expect-error not typed\nimport babelPresetReact from \"@babel/preset-react\";\n// @ts-expect-error not typed\nimport babelPresetTypeScript from \"@babel/preset-typescript\";\nimport type { BetterAuthOptions } from \"better-auth\";\nimport { BetterAuthError, logger } from \"better-auth\";\nimport { loadConfig } from \"c12\";\nimport { addSvelteKitEnvModules } from \"./add-svelte-kit-env-modules\";\nimport { getTsconfigInfo } from \"./get-tsconfig-info\";\n\nlet possiblePaths = [\"auth.ts\", \"auth.tsx\", \"auth.js\", \"auth.jsx\", \"auth.server.js\", \"auth.server.ts\"];\n\npossiblePaths = [\n ...possiblePaths,\n ...possiblePaths.map((it) => `lib/server/${it}`),\n ...possiblePaths.map((it) => `server/${it}`),\n ...possiblePaths.map((it) => `lib/${it}`),\n ...possiblePaths.map((it) => `utils/${it}`),\n];\npossiblePaths = [\n ...possiblePaths,\n ...possiblePaths.map((it) => `src/${it}`),\n ...possiblePaths.map((it) => `app/${it}`),\n];\n\nfunction getPathAliases(cwd: string): Record<string, string> | null {\n const tsConfigPath = path.join(cwd, \"tsconfig.json\");\n if (!fs.existsSync(tsConfigPath)) {\n return null;\n }\n try {\n const tsConfig = getTsconfigInfo(cwd);\n const { paths = {}, baseUrl = \".\" } = tsConfig.compilerOptions || {};\n const result: Record<string, string> = {};\n const obj = Object.entries(paths) as [string, string[]][];\n for (const [alias, aliasPaths] of obj) {\n for (const aliasedPath of aliasPaths) {\n const resolvedBaseUrl = path.join(cwd, baseUrl);\n const finalAlias = alias.slice(-1) === \"*\" ? alias.slice(0, -1) : alias;\n const finalAliasedPath = aliasedPath.slice(-1) === \"*\" ? aliasedPath.slice(0, -1) : aliasedPath;\n\n result[finalAlias || \"\"] = path.join(resolvedBaseUrl, finalAliasedPath);\n }\n }\n addSvelteKitEnvModules(result);\n return result;\n } catch (error) {\n console.error(error);\n throw new BetterAuthError(\"Error parsing tsconfig.json\");\n }\n}\n/**\n * .tsx files are not supported by Jiti.\n */\nconst jitiOptions = (cwd: string) => {\n const alias = getPathAliases(cwd) || {};\n return {\n transformOptions: {\n babel: {\n presets: [\n [\n babelPresetTypeScript,\n {\n isTSX: true,\n allExtensions: true,\n },\n ],\n [babelPresetReact, { runtime: \"automatic\" }],\n ],\n },\n },\n extensions: [\".ts\", \".tsx\", \".js\", \".jsx\"],\n alias,\n };\n};\nexport async function getConfig({\n cwd,\n configPath,\n shouldThrowOnError = false,\n}: {\n cwd: string;\n configPath?: string;\n shouldThrowOnError?: boolean;\n}) {\n try {\n let configFile: BetterAuthOptions | null = null;\n if (configPath) {\n let resolvedPath: string = path.join(cwd, configPath);\n if (existsSync(configPath)) {\n resolvedPath = configPath; // If the configPath is a file, use it as is, as it means the path wasn't relative.\n }\n const { config } = await loadConfig<{\n auth: {\n options: BetterAuthOptions;\n };\n default?: {\n options: BetterAuthOptions;\n };\n }>({\n configFile: resolvedPath,\n dotenv: true,\n jitiOptions: jitiOptions(cwd),\n });\n if (!(config.auth || config.default)) {\n if (shouldThrowOnError) {\n throw new Error(\n `Couldn't read your auth config in ${resolvedPath}. Make sure to default export your auth instance or to export as a variable named auth.`,\n );\n }\n logger.error(\n `[#better-auth]: Couldn't read your auth config in ${resolvedPath}. Make sure to default export your auth instance or to export as a variable named auth.`,\n );\n process.exit(1);\n }\n configFile = config.auth?.options || config.default?.options || null;\n }\n\n if (!configFile) {\n for (const possiblePath of possiblePaths) {\n try {\n const { config } = await loadConfig<{\n auth: {\n options: BetterAuthOptions;\n };\n default?: {\n options: BetterAuthOptions;\n };\n }>({\n configFile: possiblePath,\n jitiOptions: jitiOptions(cwd),\n });\n const hasConfig = Object.keys(config).length > 0;\n if (hasConfig) {\n configFile = config.auth?.options || config.default?.options || null;\n if (!configFile) {\n if (shouldThrowOnError) {\n throw new Error(\n \"Couldn't read your auth config. Make sure to default export your auth instance or to export as a variable named auth.\",\n );\n }\n logger.error(\"[#better-auth]: Couldn't read your auth config.\");\n console.log(\"\");\n logger.info(\n \"[#better-auth]: Make sure to default export your auth instance or to export as a variable named auth.\",\n );\n process.exit(1);\n }\n break;\n }\n } catch (e) {\n if (\n typeof e === \"object\" &&\n e &&\n \"message\" in e &&\n typeof e.message === \"string\" &&\n e.message.includes(\"This module cannot be imported from a Client Component module\")\n ) {\n if (shouldThrowOnError) {\n throw new Error(\n `Please remove import 'server-only' from your auth config file temporarily. The CLI cannot resolve the configuration with it included. You can re-add it after running the CLI.`,\n );\n }\n logger.error(\n `Please remove import 'server-only' from your auth config file temporarily. The CLI cannot resolve the configuration with it included. You can re-add it after running the CLI.`,\n );\n process.exit(1);\n }\n if (shouldThrowOnError) {\n throw e;\n }\n logger.error(\"[#better-auth]: Couldn't read your auth config.\", e);\n process.exit(1);\n }\n }\n }\n return configFile;\n } catch (e) {\n if (\n typeof e === \"object\" &&\n e &&\n \"message\" in e &&\n typeof e.message === \"string\" &&\n e.message.includes(\"This module cannot be imported from a Client Component module\")\n ) {\n if (shouldThrowOnError) {\n throw new Error(\n `Please remove import 'server-only' from your auth config file temporarily. The CLI cannot resolve the configuration with it included. You can re-add it after running the CLI.`,\n );\n }\n logger.error(\n `Please remove import 'server-only' from your auth config file temporarily. The CLI cannot resolve the configuration with it included. You can re-add it after running the CLI.`,\n );\n process.exit(1);\n }\n if (shouldThrowOnError) {\n throw e;\n }\n\n logger.error(\"Couldn't read your auth config.\", e);\n process.exit(1);\n }\n}\n\nexport { possiblePaths };\n"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"get-tsconfig-info.js","sources":["../../../../src/better-auth-cli/utils/get-tsconfig-info.ts"],"sourcesContent":["import path from \"node:path\";\nimport fs from \"fs-extra\";\n\nexport function stripJsonComments(jsonString: string): string {\n return jsonString\n .replace(/\\\\\"|\"(?:\\\\\"|[^\"])*\"|(\\/\\/.*|\\/\\*[\\s\\S]*?\\*\\/)/g, (m, g) => (g ? \"\" : m))\n .replace(/,(?=\\s*[}\\]])/g, \"\");\n}\nexport function getTsconfigInfo(cwd?: string, flatPath?: string) {\n let tsConfigPath: string;\n if (flatPath) {\n tsConfigPath = flatPath;\n } else {\n tsConfigPath = cwd ? path.join(cwd, \"tsconfig.json\") : path.join(\"tsconfig.json\");\n }\n const text = fs.readFileSync(tsConfigPath, \"utf-8\");\n return JSON.parse(stripJsonComments(text));\n}\n"],"names":[],"mappings":";;AAGO,SAAS,kBAAkB,YAA4B;AAC5D,SAAO,WACJ,QAAQ,kDAAkD,CAAC,GAAG,MAAO,IAAI,KAAK,CAAE,EAChF,QAAQ,kBAAkB,EAAE;AACjC;
|
|
1
|
+
{"version":3,"file":"get-tsconfig-info.js","sources":["../../../../src/better-auth-cli/utils/get-tsconfig-info.ts"],"sourcesContent":["import path from \"node:path\";\nimport fs from \"fs-extra\";\n\nexport function stripJsonComments(jsonString: string): string {\n return jsonString\n .replace(/\\\\\"|\"(?:\\\\\"|[^\"])*\"|(\\/\\/.*|\\/\\*[\\s\\S]*?\\*\\/)/g, (m, g) => (g ? \"\" : m))\n .replace(/,(?=\\s*[}\\]])/g, \"\");\n}\nexport function getTsconfigInfo(cwd?: string, flatPath?: string) {\n let tsConfigPath: string;\n if (flatPath) {\n tsConfigPath = flatPath;\n } else {\n tsConfigPath = cwd ? path.join(cwd, \"tsconfig.json\") : path.join(\"tsconfig.json\");\n }\n const text = fs.readFileSync(tsConfigPath, \"utf-8\");\n return JSON.parse(stripJsonComments(text));\n}\n"],"names":[],"mappings":";;AAGO,SAAS,kBAAkB,YAA4B;AAC5D,SAAO,WACJ,QAAQ,kDAAkD,CAAC,GAAG,MAAO,IAAI,KAAK,CAAE,EAChF,QAAQ,kBAAkB,EAAE;AACjC;AACO,SAAS,gBAAgB,KAAc,UAAmB;AAC/D,MAAI;AAGG;AACL,mBAAe,MAAM,KAAK,KAAK,KAAK,eAAe,IAAI,KAAK,KAAK,eAAe;AAAA,EAClF;AACA,QAAM,OAAO,GAAG,aAAa,cAAc,OAAO;AAClD,SAAO,KAAK,MAAM,kBAAkB,IAAI,CAAC;AAC3C;"}
|