@proofkit/better-auth 0.2.4 → 0.3.1-beta.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.
@@ -1,83 +1,157 @@
1
- import { createSchema, createFetch } from "@better-fetch/fetch";
2
- import { logger } from "@better-fetch/logger";
3
- import { logger as logger$1 } from "better-auth";
1
+ import { logger } from "better-auth";
4
2
  import { ok, err } from "neverthrow";
5
- import { z } from "zod/v4";
6
- const schema = createSchema({
7
- /**
8
- * Create a new table
9
- */
10
- "@post/FileMaker_Tables": {
11
- input: z.object({ tableName: z.string(), fields: z.array(z.any()) })
12
- },
13
- /**
14
- * Add fields to a table
15
- */
16
- "@patch/FileMaker_Tables/:tableName": {
17
- params: z.object({ tableName: z.string() }),
18
- input: z.object({ fields: z.array(z.any()) })
19
- },
20
- /**
21
- * Delete a table
22
- */
23
- "@delete/FileMaker_Tables/:tableName": {
24
- params: z.object({ tableName: z.string() })
25
- },
26
- /**
27
- * Delete a field from a table
28
- */
29
- "@delete/FileMaker_Tables/:tableName/:fieldName": {
30
- params: z.object({ tableName: z.string(), fieldName: z.string() })
3
+ function validateUrl(input) {
4
+ try {
5
+ const url = new URL(input);
6
+ return ok(url);
7
+ } catch (error) {
8
+ return err(error);
31
9
  }
32
- });
33
- function createFmOdataFetch(args) {
10
+ }
11
+ function createRawFetch(args) {
34
12
  const result = validateUrl(args.serverUrl);
35
13
  if (result.isErr()) {
36
14
  throw new Error("Invalid server URL");
37
15
  }
38
16
  let baseURL = result.value.origin;
39
17
  if ("apiKey" in args.auth) {
40
- baseURL += `/otto`;
18
+ baseURL += "/otto";
41
19
  }
42
20
  baseURL += `/fmi/odata/v4/${args.database}`;
43
- return createFetch({
44
- baseURL,
45
- auth: "apiKey" in args.auth ? { type: "Bearer", token: args.auth.apiKey } : {
46
- type: "Basic",
47
- username: args.auth.username,
48
- password: args.auth.password
49
- },
50
- onError: (error) => {
51
- console.error("url", error.request.url.toString());
52
- console.log(error.error);
53
- console.log("error.request.body", JSON.stringify(error.request.body));
54
- },
55
- schema,
56
- plugins: [
57
- logger({
58
- verbose: args.logging === "verbose",
59
- enabled: args.logging === "verbose" || !!args.logging,
60
- console: {
61
- fail: (...args2) => logger$1.error("better-fetch", ...args2),
62
- success: (...args2) => logger$1.info("better-fetch", ...args2),
63
- log: (...args2) => logger$1.info("better-fetch", ...args2),
64
- error: (...args2) => logger$1.error("better-fetch", ...args2),
65
- warn: (...args2) => logger$1.warn("better-fetch", ...args2)
66
- }
67
- })
68
- ]
69
- });
70
- }
71
- function validateUrl(input) {
72
- try {
73
- const url = new URL(input);
74
- return ok(url);
75
- } catch (error) {
76
- return err(error);
21
+ const authHeaders = {};
22
+ if ("apiKey" in args.auth) {
23
+ authHeaders.Authorization = `Bearer ${args.auth.apiKey}`;
24
+ } else {
25
+ const credentials = btoa(`${args.auth.username}:${args.auth.password}`);
26
+ authHeaders.Authorization = `Basic ${credentials}`;
77
27
  }
28
+ const wrappedFetch = async (input, options) => {
29
+ try {
30
+ let url;
31
+ if (typeof input === "string") {
32
+ url = input.startsWith("http") ? input : `${baseURL}${input.startsWith("/") ? input : `/${input}`}`;
33
+ } else if (input instanceof URL) {
34
+ url = input.toString();
35
+ } else if (input instanceof Request) {
36
+ url = input.url;
37
+ } else {
38
+ url = String(input);
39
+ }
40
+ let processedBody = options == null ? void 0 : options.body;
41
+ if (processedBody && typeof processedBody === "object" && !(processedBody instanceof FormData) && !(processedBody instanceof URLSearchParams) && !(processedBody instanceof ReadableStream)) {
42
+ processedBody = JSON.stringify(processedBody);
43
+ }
44
+ const headers = {
45
+ "Content-Type": "application/json",
46
+ ...authHeaders,
47
+ ...(options == null ? void 0 : options.headers) || {}
48
+ };
49
+ const requestInit = {
50
+ ...options,
51
+ headers,
52
+ body: processedBody
53
+ };
54
+ if (args.logging === "verbose" || args.logging === true) {
55
+ logger.info("raw-fetch", `${requestInit.method || "GET"} ${url}`);
56
+ if (requestInit.body) {
57
+ logger.info("raw-fetch", "Request body:", requestInit.body);
58
+ }
59
+ }
60
+ const response = await fetch(url, requestInit);
61
+ if (args.logging === "verbose" || args.logging === true) {
62
+ logger.info("raw-fetch", `Response status: ${response.status} ${response.statusText}`);
63
+ logger.info("raw-fetch", "Response headers:", Object.fromEntries(response.headers.entries()));
64
+ }
65
+ if (!response.ok) {
66
+ const errorText = await response.text().catch(() => "Unknown error");
67
+ if (args.logging === "verbose" || args.logging === true) {
68
+ logger.error("raw-fetch", `HTTP Error ${response.status}: ${errorText}`);
69
+ }
70
+ return {
71
+ error: `HTTP ${response.status}: ${errorText}`,
72
+ response
73
+ };
74
+ }
75
+ let responseData;
76
+ const contentType = response.headers.get("content-type");
77
+ if (args.logging === "verbose" || args.logging === true) {
78
+ logger.info("raw-fetch", `Response content-type: ${contentType || "none"}`);
79
+ }
80
+ if (contentType == null ? void 0 : contentType.includes("application/json")) {
81
+ try {
82
+ const responseText = await response.text();
83
+ if (args.logging === "verbose" || args.logging === true) {
84
+ logger.info("raw-fetch", `Raw response text: "${responseText}"`);
85
+ logger.info("raw-fetch", `Response text length: ${responseText.length}`);
86
+ }
87
+ if (responseText.trim() === "") {
88
+ if (args.logging === "verbose" || args.logging === true) {
89
+ logger.info("raw-fetch", "Empty JSON response, returning null");
90
+ }
91
+ responseData = null;
92
+ } else {
93
+ responseData = JSON.parse(responseText);
94
+ if (args.logging === "verbose" || args.logging === true) {
95
+ logger.info("raw-fetch", "Successfully parsed JSON response");
96
+ }
97
+ }
98
+ } catch (parseError) {
99
+ if (args.logging === "verbose" || args.logging === true) {
100
+ logger.error("raw-fetch", "JSON parse error:", parseError);
101
+ }
102
+ return {
103
+ error: `Failed to parse JSON response: ${parseError instanceof Error ? parseError.message : "Unknown parse error"}`,
104
+ response
105
+ };
106
+ }
107
+ } else if (contentType == null ? void 0 : contentType.includes("text/")) {
108
+ responseData = await response.text();
109
+ if (args.logging === "verbose" || args.logging === true) {
110
+ logger.info("raw-fetch", `Text response: "${responseData}"`);
111
+ }
112
+ } else {
113
+ try {
114
+ responseData = await response.text();
115
+ if (args.logging === "verbose" || args.logging === true) {
116
+ logger.info("raw-fetch", `Unknown content-type response as text: "${responseData}"`);
117
+ }
118
+ } catch {
119
+ responseData = null;
120
+ if (args.logging === "verbose" || args.logging === true) {
121
+ logger.info("raw-fetch", "Could not parse response as text, returning null");
122
+ }
123
+ }
124
+ }
125
+ if (options == null ? void 0 : options.output) {
126
+ const validation = options.output.safeParse(responseData);
127
+ if (validation.success) {
128
+ return {
129
+ data: validation.data,
130
+ response
131
+ };
132
+ }
133
+ return {
134
+ error: `Validation failed: ${validation.error.message}`,
135
+ response
136
+ };
137
+ }
138
+ return {
139
+ data: responseData,
140
+ response
141
+ };
142
+ } catch (error) {
143
+ return {
144
+ error: error instanceof Error ? error.message : "Unknown error occurred"
145
+ };
146
+ }
147
+ };
148
+ return {
149
+ baseURL,
150
+ fetch: wrappedFetch
151
+ };
78
152
  }
79
153
  export {
80
- createFmOdataFetch,
154
+ createRawFetch,
81
155
  validateUrl
82
156
  };
83
157
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sources":["../../../src/odata/index.ts"],"sourcesContent":["import { createFetch, createSchema } from \"@better-fetch/fetch\";\nimport { logger } from \"@better-fetch/logger\";\nimport { logger as betterAuthLogger } from \"better-auth\";\nimport { err, ok, Result } from \"neverthrow\";\nimport { z } from \"zod/v4\";\n\ntype BasicAuthCredentials = {\n username: string;\n password: string;\n};\ntype OttoAPIKeyAuth = {\n apiKey: string;\n};\ntype ODataAuth = BasicAuthCredentials | OttoAPIKeyAuth;\n\nexport type FmOdataConfig = {\n serverUrl: string;\n auth: ODataAuth;\n database: string;\n logging?: true | \"verbose\" | \"none\";\n};\n\nconst schema = createSchema({\n /**\n * Create a new table\n */\n \"@post/FileMaker_Tables\": {\n input: z.object({ tableName: z.string(), fields: z.array(z.any()) }),\n },\n /**\n * Add fields to a table\n */\n \"@patch/FileMaker_Tables/:tableName\": {\n params: z.object({ tableName: z.string() }),\n input: z.object({ fields: z.array(z.any()) }),\n },\n /**\n * Delete a table\n */\n \"@delete/FileMaker_Tables/:tableName\": {\n params: z.object({ tableName: z.string() }),\n },\n /**\n * Delete a field from a table\n */\n \"@delete/FileMaker_Tables/:tableName/:fieldName\": {\n params: z.object({ tableName: z.string(), fieldName: z.string() }),\n },\n});\n\nexport function createFmOdataFetch(args: FmOdataConfig) {\n const result = validateUrl(args.serverUrl);\n\n if (result.isErr()) {\n throw new Error(\"Invalid server URL\");\n }\n let baseURL = result.value.origin;\n if (\"apiKey\" in args.auth) {\n baseURL += `/otto`;\n }\n baseURL += `/fmi/odata/v4/${args.database}`;\n\n return createFetch({\n baseURL,\n auth:\n \"apiKey\" in args.auth\n ? { type: \"Bearer\", token: args.auth.apiKey }\n : {\n type: \"Basic\",\n username: args.auth.username,\n password: args.auth.password,\n },\n onError: (error) => {\n console.error(\"url\", error.request.url.toString());\n console.log(error.error);\n console.log(\"error.request.body\", JSON.stringify(error.request.body));\n },\n schema,\n plugins: [\n logger({\n verbose: args.logging === \"verbose\",\n enabled: args.logging === \"verbose\" || !!args.logging,\n console: {\n fail: (...args) => betterAuthLogger.error(\"better-fetch\", ...args),\n success: (...args) => betterAuthLogger.info(\"better-fetch\", ...args),\n log: (...args) => betterAuthLogger.info(\"better-fetch\", ...args),\n error: (...args) => betterAuthLogger.error(\"better-fetch\", ...args),\n warn: (...args) => betterAuthLogger.warn(\"better-fetch\", ...args),\n },\n }),\n ],\n });\n}\n\nexport function validateUrl(input: string): Result<URL, unknown> {\n try {\n const url = new URL(input);\n return ok(url);\n } catch (error) {\n return err(error);\n }\n}\n"],"names":["args","betterAuthLogger"],"mappings":";;;;;AAsBA,MAAM,SAAS,aAAa;AAAA;AAAA;AAAA;AAAA,EAI1B,0BAA0B;AAAA,IACxB,OAAO,EAAE,OAAO,EAAE,WAAW,EAAE,UAAU,QAAQ,EAAE,MAAM,EAAE,IAAK,CAAA,EAAG,CAAA;AAAA,EACrE;AAAA;AAAA;AAAA;AAAA,EAIA,sCAAsC;AAAA,IACpC,QAAQ,EAAE,OAAO,EAAE,WAAW,EAAE,OAAA,GAAU;AAAA,IAC1C,OAAO,EAAE,OAAO,EAAE,QAAQ,EAAE,MAAM,EAAE,IAAA,CAAK,EAAG,CAAA;AAAA,EAC9C;AAAA;AAAA;AAAA;AAAA,EAIA,uCAAuC;AAAA,IACrC,QAAQ,EAAE,OAAO,EAAE,WAAW,EAAE,SAAU,CAAA;AAAA,EAC5C;AAAA;AAAA;AAAA;AAAA,EAIA,kDAAkD;AAAA,IAChD,QAAQ,EAAE,OAAO,EAAE,WAAW,EAAE,OAAO,GAAG,WAAW,EAAE,SAAU,CAAA;AAAA,EAAA;AAErE,CAAC;AAEM,SAAS,mBAAmB,MAAqB;AAChD,QAAA,SAAS,YAAY,KAAK,SAAS;AAErC,MAAA,OAAO,SAAS;AACZ,UAAA,IAAI,MAAM,oBAAoB;AAAA,EAAA;AAElC,MAAA,UAAU,OAAO,MAAM;AACvB,MAAA,YAAY,KAAK,MAAM;AACd,eAAA;AAAA,EAAA;AAEF,aAAA,iBAAiB,KAAK,QAAQ;AAEzC,SAAO,YAAY;AAAA,IACjB;AAAA,IACA,MACE,YAAY,KAAK,OACb,EAAE,MAAM,UAAU,OAAO,KAAK,KAAK,OAAA,IACnC;AAAA,MACE,MAAM;AAAA,MACN,UAAU,KAAK,KAAK;AAAA,MACpB,UAAU,KAAK,KAAK;AAAA,IACtB;AAAA,IACN,SAAS,CAAC,UAAU;AAClB,cAAQ,MAAM,OAAO,MAAM,QAAQ,IAAI,UAAU;AACzC,cAAA,IAAI,MAAM,KAAK;AACvB,cAAQ,IAAI,sBAAsB,KAAK,UAAU,MAAM,QAAQ,IAAI,CAAC;AAAA,IACtE;AAAA,IACA;AAAA,IACA,SAAS;AAAA,MACP,OAAO;AAAA,QACL,SAAS,KAAK,YAAY;AAAA,QAC1B,SAAS,KAAK,YAAY,aAAa,CAAC,CAAC,KAAK;AAAA,QAC9C,SAAS;AAAA,UACP,MAAM,IAAIA,UAASC,SAAiB,MAAM,gBAAgB,GAAGD,KAAI;AAAA,UACjE,SAAS,IAAIA,UAASC,SAAiB,KAAK,gBAAgB,GAAGD,KAAI;AAAA,UACnE,KAAK,IAAIA,UAASC,SAAiB,KAAK,gBAAgB,GAAGD,KAAI;AAAA,UAC/D,OAAO,IAAIA,UAASC,SAAiB,MAAM,gBAAgB,GAAGD,KAAI;AAAA,UAClE,MAAM,IAAIA,UAASC,SAAiB,KAAK,gBAAgB,GAAGD,KAAI;AAAA,QAAA;AAAA,MAEnE,CAAA;AAAA,IAAA;AAAA,EACH,CACD;AACH;AAEO,SAAS,YAAY,OAAqC;AAC3D,MAAA;AACI,UAAA,MAAM,IAAI,IAAI,KAAK;AACzB,WAAO,GAAG,GAAG;AAAA,WACN,OAAO;AACd,WAAO,IAAI,KAAK;AAAA,EAAA;AAEpB;"}
1
+ {"version":3,"file":"index.js","sources":["../../../src/odata/index.ts"],"sourcesContent":["/** biome-ignore-all lint/suspicious/noExplicitAny: library code */\nimport { logger as betterAuthLogger } from \"better-auth\";\nimport { err, ok, type Result } from \"neverthrow\";\nimport type { z } from \"zod/v4\";\n\ninterface BasicAuthCredentials {\n username: string;\n password: string;\n}\ninterface OttoAPIKeyAuth {\n apiKey: string;\n}\ntype ODataAuth = BasicAuthCredentials | OttoAPIKeyAuth;\n\nexport interface FmOdataConfig {\n serverUrl: string;\n auth: ODataAuth;\n database: string;\n logging?: true | \"verbose\" | \"none\";\n}\n\nexport function validateUrl(input: string): Result<URL, unknown> {\n try {\n const url = new URL(input);\n return ok(url);\n } catch (error) {\n return err(error);\n }\n}\n\nexport function createRawFetch(args: FmOdataConfig) {\n const result = validateUrl(args.serverUrl);\n\n if (result.isErr()) {\n throw new Error(\"Invalid server URL\");\n }\n\n let baseURL = result.value.origin;\n if (\"apiKey\" in args.auth) {\n baseURL += \"/otto\";\n }\n baseURL += `/fmi/odata/v4/${args.database}`;\n\n // Create authentication headers\n const authHeaders: Record<string, string> = {};\n if (\"apiKey\" in args.auth) {\n authHeaders.Authorization = `Bearer ${args.auth.apiKey}`;\n } else {\n const credentials = btoa(`${args.auth.username}:${args.auth.password}`);\n authHeaders.Authorization = `Basic ${credentials}`;\n }\n\n // Enhanced fetch function with body handling, validation, and structured responses\n const wrappedFetch = async <TOutput = any>(\n input: string | URL | Request,\n options?: Omit<RequestInit, \"body\"> & {\n body?: any; // Allow any type for body\n output?: z.ZodSchema<TOutput>; // Optional schema for validation\n },\n ): Promise<{ data?: TOutput; error?: string; response?: Response }> => {\n try {\n let url: string;\n\n // Handle different input types\n if (typeof input === \"string\") {\n // If it's already a full URL, use as-is, otherwise prepend baseURL\n url = input.startsWith(\"http\") ? input : `${baseURL}${input.startsWith(\"/\") ? input : `/${input}`}`;\n } else if (input instanceof URL) {\n url = input.toString();\n } else if (input instanceof Request) {\n url = input.url;\n } else {\n url = String(input);\n }\n\n // Handle body serialization\n let processedBody = options?.body;\n if (\n processedBody &&\n typeof processedBody === \"object\" &&\n !(processedBody instanceof FormData) &&\n !(processedBody instanceof URLSearchParams) &&\n !(processedBody instanceof ReadableStream)\n ) {\n processedBody = JSON.stringify(processedBody);\n }\n\n // Merge headers\n const headers = {\n \"Content-Type\": \"application/json\",\n ...authHeaders,\n ...(options?.headers || {}),\n };\n\n const requestInit: RequestInit = {\n ...options,\n headers,\n body: processedBody,\n };\n\n // Optional logging\n if (args.logging === \"verbose\" || args.logging === true) {\n betterAuthLogger.info(\"raw-fetch\", `${requestInit.method || \"GET\"} ${url}`);\n if (requestInit.body) {\n betterAuthLogger.info(\"raw-fetch\", \"Request body:\", requestInit.body);\n }\n }\n\n const response = await fetch(url, requestInit);\n\n // Optional logging for response details\n if (args.logging === \"verbose\" || args.logging === true) {\n betterAuthLogger.info(\"raw-fetch\", `Response status: ${response.status} ${response.statusText}`);\n betterAuthLogger.info(\"raw-fetch\", \"Response headers:\", Object.fromEntries(response.headers.entries()));\n }\n\n // Check if response is ok\n if (!response.ok) {\n const errorText = await response.text().catch(() => \"Unknown error\");\n if (args.logging === \"verbose\" || args.logging === true) {\n betterAuthLogger.error(\"raw-fetch\", `HTTP Error ${response.status}: ${errorText}`);\n }\n return {\n error: `HTTP ${response.status}: ${errorText}`,\n response,\n };\n }\n\n // Parse response based on content type\n let responseData: any;\n const contentType = response.headers.get(\"content-type\");\n\n if (args.logging === \"verbose\" || args.logging === true) {\n betterAuthLogger.info(\"raw-fetch\", `Response content-type: ${contentType || \"none\"}`);\n }\n\n if (contentType?.includes(\"application/json\")) {\n try {\n const responseText = await response.text();\n if (args.logging === \"verbose\" || args.logging === true) {\n betterAuthLogger.info(\"raw-fetch\", `Raw response text: \"${responseText}\"`);\n betterAuthLogger.info(\"raw-fetch\", `Response text length: ${responseText.length}`);\n }\n\n // Handle empty responses\n if (responseText.trim() === \"\") {\n if (args.logging === \"verbose\" || args.logging === true) {\n betterAuthLogger.info(\"raw-fetch\", \"Empty JSON response, returning null\");\n }\n responseData = null;\n } else {\n responseData = JSON.parse(responseText);\n if (args.logging === \"verbose\" || args.logging === true) {\n betterAuthLogger.info(\"raw-fetch\", \"Successfully parsed JSON response\");\n }\n }\n } catch (parseError) {\n if (args.logging === \"verbose\" || args.logging === true) {\n betterAuthLogger.error(\"raw-fetch\", \"JSON parse error:\", parseError);\n }\n return {\n error: `Failed to parse JSON response: ${parseError instanceof Error ? parseError.message : \"Unknown parse error\"}`,\n response,\n };\n }\n } else if (contentType?.includes(\"text/\")) {\n // Handle text responses (text/plain, text/html, etc.)\n responseData = await response.text();\n if (args.logging === \"verbose\" || args.logging === true) {\n betterAuthLogger.info(\"raw-fetch\", `Text response: \"${responseData}\"`);\n }\n } else {\n // For other content types, try to get text but don't fail if it's binary\n try {\n responseData = await response.text();\n if (args.logging === \"verbose\" || args.logging === true) {\n betterAuthLogger.info(\"raw-fetch\", `Unknown content-type response as text: \"${responseData}\"`);\n }\n } catch {\n // If text parsing fails (e.g., binary data), return null\n responseData = null;\n if (args.logging === \"verbose\" || args.logging === true) {\n betterAuthLogger.info(\"raw-fetch\", \"Could not parse response as text, returning null\");\n }\n }\n }\n\n // Validate output if schema provided\n if (options?.output) {\n const validation = options.output.safeParse(responseData);\n if (validation.success) {\n return {\n data: validation.data,\n response,\n };\n }\n return {\n error: `Validation failed: ${validation.error.message}`,\n response,\n };\n }\n\n // Return unvalidated data\n return {\n data: responseData as TOutput,\n response,\n };\n } catch (error) {\n return {\n error: error instanceof Error ? error.message : \"Unknown error occurred\",\n };\n }\n };\n\n return {\n baseURL,\n fetch: wrappedFetch,\n };\n}\n"],"names":["betterAuthLogger"],"mappings":";;AAqBO,SAAS,YAAY,OAAqC;AAC3D,MAAA;AACI,UAAA,MAAM,IAAI,IAAI,KAAK;AACzB,WAAO,GAAG,GAAG;AAAA,WACN,OAAO;AACd,WAAO,IAAI,KAAK;AAAA,EAAA;AAEpB;AAEO,SAAS,eAAe,MAAqB;AAC5C,QAAA,SAAS,YAAY,KAAK,SAAS;AAErC,MAAA,OAAO,SAAS;AACZ,UAAA,IAAI,MAAM,oBAAoB;AAAA,EAAA;AAGlC,MAAA,UAAU,OAAO,MAAM;AACvB,MAAA,YAAY,KAAK,MAAM;AACd,eAAA;AAAA,EAAA;AAEF,aAAA,iBAAiB,KAAK,QAAQ;AAGzC,QAAM,cAAsC,CAAC;AACzC,MAAA,YAAY,KAAK,MAAM;AACzB,gBAAY,gBAAgB,UAAU,KAAK,KAAK,MAAM;AAAA,EAAA,OACjD;AACC,UAAA,cAAc,KAAK,GAAG,KAAK,KAAK,QAAQ,IAAI,KAAK,KAAK,QAAQ,EAAE;AAC1D,gBAAA,gBAAgB,SAAS,WAAW;AAAA,EAAA;AAI5C,QAAA,eAAe,OACnB,OACA,YAIqE;AACjE,QAAA;AACE,UAAA;AAGA,UAAA,OAAO,UAAU,UAAU;AAE7B,cAAM,MAAM,WAAW,MAAM,IAAI,QAAQ,GAAG,OAAO,GAAG,MAAM,WAAW,GAAG,IAAI,QAAQ,IAAI,KAAK,EAAE;AAAA,MAAA,WACxF,iBAAiB,KAAK;AAC/B,cAAM,MAAM,SAAS;AAAA,MAAA,WACZ,iBAAiB,SAAS;AACnC,cAAM,MAAM;AAAA,MAAA,OACP;AACL,cAAM,OAAO,KAAK;AAAA,MAAA;AAIpB,UAAI,gBAAgB,mCAAS;AAC7B,UACE,iBACA,OAAO,kBAAkB,YACzB,EAAE,yBAAyB,aAC3B,EAAE,yBAAyB,oBAC3B,EAAE,yBAAyB,iBAC3B;AACgB,wBAAA,KAAK,UAAU,aAAa;AAAA,MAAA;AAI9C,YAAM,UAAU;AAAA,QACd,gBAAgB;AAAA,QAChB,GAAG;AAAA,QACH,IAAI,mCAAS,YAAW,CAAA;AAAA,MAC1B;AAEA,YAAM,cAA2B;AAAA,QAC/B,GAAG;AAAA,QACH;AAAA,QACA,MAAM;AAAA,MACR;AAGA,UAAI,KAAK,YAAY,aAAa,KAAK,YAAY,MAAM;AACtCA,eAAA,KAAK,aAAa,GAAG,YAAY,UAAU,KAAK,IAAI,GAAG,EAAE;AAC1E,YAAI,YAAY,MAAM;AACpBA,iBAAiB,KAAK,aAAa,iBAAiB,YAAY,IAAI;AAAA,QAAA;AAAA,MACtE;AAGF,YAAM,WAAW,MAAM,MAAM,KAAK,WAAW;AAG7C,UAAI,KAAK,YAAY,aAAa,KAAK,YAAY,MAAM;AACtCA,eAAA,KAAK,aAAa,oBAAoB,SAAS,MAAM,IAAI,SAAS,UAAU,EAAE;AAC9EA,eAAA,KAAK,aAAa,qBAAqB,OAAO,YAAY,SAAS,QAAQ,QAAQ,CAAC,CAAC;AAAA,MAAA;AAIpG,UAAA,CAAC,SAAS,IAAI;AAChB,cAAM,YAAY,MAAM,SAAS,OAAO,MAAM,MAAM,eAAe;AACnE,YAAI,KAAK,YAAY,aAAa,KAAK,YAAY,MAAM;AACvDA,iBAAiB,MAAM,aAAa,cAAc,SAAS,MAAM,KAAK,SAAS,EAAE;AAAA,QAAA;AAE5E,eAAA;AAAA,UACL,OAAO,QAAQ,SAAS,MAAM,KAAK,SAAS;AAAA,UAC5C;AAAA,QACF;AAAA,MAAA;AAIE,UAAA;AACJ,YAAM,cAAc,SAAS,QAAQ,IAAI,cAAc;AAEvD,UAAI,KAAK,YAAY,aAAa,KAAK,YAAY,MAAM;AACvDA,eAAiB,KAAK,aAAa,0BAA0B,eAAe,MAAM,EAAE;AAAA,MAAA;AAGlF,UAAA,2CAAa,SAAS,qBAAqB;AACzC,YAAA;AACI,gBAAA,eAAe,MAAM,SAAS,KAAK;AACzC,cAAI,KAAK,YAAY,aAAa,KAAK,YAAY,MAAM;AACvDA,mBAAiB,KAAK,aAAa,uBAAuB,YAAY,GAAG;AACzEA,mBAAiB,KAAK,aAAa,yBAAyB,aAAa,MAAM,EAAE;AAAA,UAAA;AAI/E,cAAA,aAAa,KAAK,MAAM,IAAI;AAC9B,gBAAI,KAAK,YAAY,aAAa,KAAK,YAAY,MAAM;AACtCA,qBAAA,KAAK,aAAa,qCAAqC;AAAA,YAAA;AAE3D,2BAAA;AAAA,UAAA,OACV;AACU,2BAAA,KAAK,MAAM,YAAY;AACtC,gBAAI,KAAK,YAAY,aAAa,KAAK,YAAY,MAAM;AACtCA,qBAAA,KAAK,aAAa,mCAAmC;AAAA,YAAA;AAAA,UACxE;AAAA,iBAEK,YAAY;AACnB,cAAI,KAAK,YAAY,aAAa,KAAK,YAAY,MAAM;AACtCA,mBAAA,MAAM,aAAa,qBAAqB,UAAU;AAAA,UAAA;AAE9D,iBAAA;AAAA,YACL,OAAO,kCAAkC,sBAAsB,QAAQ,WAAW,UAAU,qBAAqB;AAAA,YACjH;AAAA,UACF;AAAA,QAAA;AAAA,MAEO,WAAA,2CAAa,SAAS,UAAU;AAE1B,uBAAA,MAAM,SAAS,KAAK;AACnC,YAAI,KAAK,YAAY,aAAa,KAAK,YAAY,MAAM;AACvDA,iBAAiB,KAAK,aAAa,mBAAmB,YAAY,GAAG;AAAA,QAAA;AAAA,MACvE,OACK;AAED,YAAA;AACa,yBAAA,MAAM,SAAS,KAAK;AACnC,cAAI,KAAK,YAAY,aAAa,KAAK,YAAY,MAAM;AACvDA,mBAAiB,KAAK,aAAa,2CAA2C,YAAY,GAAG;AAAA,UAAA;AAAA,QAC/F,QACM;AAES,yBAAA;AACf,cAAI,KAAK,YAAY,aAAa,KAAK,YAAY,MAAM;AACtCA,mBAAA,KAAK,aAAa,kDAAkD;AAAA,UAAA;AAAA,QACvF;AAAA,MACF;AAIF,UAAI,mCAAS,QAAQ;AACnB,cAAM,aAAa,QAAQ,OAAO,UAAU,YAAY;AACxD,YAAI,WAAW,SAAS;AACf,iBAAA;AAAA,YACL,MAAM,WAAW;AAAA,YACjB;AAAA,UACF;AAAA,QAAA;AAEK,eAAA;AAAA,UACL,OAAO,sBAAsB,WAAW,MAAM,OAAO;AAAA,UACrD;AAAA,QACF;AAAA,MAAA;AAIK,aAAA;AAAA,QACL,MAAM;AAAA,QACN;AAAA,MACF;AAAA,aACO,OAAO;AACP,aAAA;AAAA,QACL,OAAO,iBAAiB,QAAQ,MAAM,UAAU;AAAA,MAClD;AAAA,IAAA;AAAA,EAEJ;AAEO,SAAA;AAAA,IACL;AAAA,IACA,OAAO;AAAA,EACT;AACF;"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@proofkit/better-auth",
3
- "version": "0.2.4",
3
+ "version": "0.3.1-beta.0",
4
4
  "description": "FileMaker adapter for Better Auth",
5
5
  "type": "module",
6
6
  "main": "dist/esm/index.js",
@@ -38,8 +38,6 @@
38
38
  "dependencies": {
39
39
  "@babel/preset-react": "^7.27.1",
40
40
  "@babel/preset-typescript": "^7.27.1",
41
- "@better-fetch/fetch": "1.1.17",
42
- "@better-fetch/logger": "^1.1.18",
43
41
  "@commander-js/extra-typings": "^14.0.0",
44
42
  "@tanstack/vite-config": "^0.2.0",
45
43
  "better-auth": "^1.2.10",
@@ -49,23 +47,27 @@
49
47
  "dotenv": "^16.5.0",
50
48
  "fs-extra": "^11.3.0",
51
49
  "neverthrow": "^8.2.0",
50
+ "odata-query": "^8.0.4",
52
51
  "prompts": "^2.4.2",
53
52
  "vite": "^6.3.4",
54
- "zod": "3.25.64"
53
+ "zod": "^4.1.13"
55
54
  },
56
55
  "devDependencies": {
57
56
  "@types/fs-extra": "^11.0.4",
58
57
  "@types/prompts": "^2.4.9",
58
+ "@vitest/ui": "^3.2.4",
59
59
  "fm-odata-client": "^3.0.1",
60
60
  "publint": "^0.3.12",
61
- "typescript": "^5.9.2",
62
- "vitest": "^3.2.4"
61
+ "typescript": "^5.9.3",
62
+ "vitest": "^4.0.7"
63
63
  },
64
64
  "scripts": {
65
65
  "dev": "pnpm build:watch",
66
66
  "test": "vitest run",
67
67
  "build": "vite build && publint --strict",
68
68
  "build:watch": "vite build --watch",
69
- "ci": "pnpm run build && pnpm run test"
69
+ "ci": "pnpm run build && pnpm run test",
70
+ "lint": "biome check . --write",
71
+ "lint:summary": "biome check . --reporter=summary"
70
72
  }
71
73
  }