use-abcd 1.4.2 → 1.4.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/chunks/{client-DReyDQ23.js → client-BfugfaiH.js} +54 -54
- package/dist/chunks/client-BfugfaiH.js.map +1 -0
- package/dist/index.js +105 -104
- package/dist/index.js.map +1 -1
- package/dist/runtime/client.d.ts +7 -7
- package/dist/runtime/client.js +1 -1
- package/dist/sync-queue.d.ts +9 -4
- package/dist/types.d.ts +1 -1
- package/package.json +1 -1
- package/dist/chunks/client-DReyDQ23.js.map +0 -1
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
import { c as
|
|
2
|
-
function
|
|
1
|
+
import { c as l } from "./types-Dy4rYb2N.js";
|
|
2
|
+
function w() {
|
|
3
3
|
return {
|
|
4
4
|
create: {
|
|
5
5
|
guard: (r) => !!r.create,
|
|
@@ -18,17 +18,17 @@ function l() {
|
|
|
18
18
|
}
|
|
19
19
|
};
|
|
20
20
|
}
|
|
21
|
-
async function
|
|
21
|
+
async function m(r, e, s) {
|
|
22
22
|
if (s.aborted)
|
|
23
23
|
return { id: r.id, status: "error", error: "Operation aborted" };
|
|
24
|
-
const
|
|
25
|
-
if (!
|
|
24
|
+
const n = w()[r.type];
|
|
25
|
+
if (!n)
|
|
26
26
|
return { id: r.id, status: "error", error: `Unknown change type: ${r.type}` };
|
|
27
|
-
if (!
|
|
27
|
+
if (!n.guard(e))
|
|
28
28
|
return { id: r.id, status: "success" };
|
|
29
29
|
try {
|
|
30
|
-
const t = await
|
|
31
|
-
return
|
|
30
|
+
const t = await n.execute(r, e, s);
|
|
31
|
+
return n.toResult(r, t);
|
|
32
32
|
} catch (t) {
|
|
33
33
|
return {
|
|
34
34
|
id: r.id,
|
|
@@ -37,86 +37,86 @@ async function w(r, e, s) {
|
|
|
37
37
|
};
|
|
38
38
|
}
|
|
39
39
|
}
|
|
40
|
-
function
|
|
40
|
+
function S(r) {
|
|
41
41
|
return {
|
|
42
|
-
onSync: async (s, c) => Promise.all(s.map((
|
|
42
|
+
onSync: async (s, c, n) => Promise.all(s.map((t) => m(t, r, n))),
|
|
43
43
|
handlers: { create: r.create, update: r.update, delete: r.delete }
|
|
44
44
|
};
|
|
45
45
|
}
|
|
46
|
-
function
|
|
47
|
-
const { onSync: e, handlers: s } =
|
|
48
|
-
return { onSync: e, onSyncWithStats: async (
|
|
49
|
-
const
|
|
50
|
-
return
|
|
46
|
+
function b(r) {
|
|
47
|
+
const { onSync: e, handlers: s } = S(r);
|
|
48
|
+
return { onSync: e, onSyncWithStats: async (n, t, o) => {
|
|
49
|
+
const u = await e(n, t, o);
|
|
50
|
+
return l(u);
|
|
51
51
|
}, handlers: s };
|
|
52
52
|
}
|
|
53
|
-
function
|
|
53
|
+
function h(r) {
|
|
54
54
|
return { success: !0, ...r };
|
|
55
55
|
}
|
|
56
|
-
function
|
|
56
|
+
function O(r) {
|
|
57
57
|
return { success: !1, error: r };
|
|
58
58
|
}
|
|
59
|
-
function
|
|
59
|
+
function R(r) {
|
|
60
60
|
const e = typeof r == "string" ? r : r.endpoint, s = typeof r == "string" ? {} : r.headers ?? {}, c = typeof r == "string" ? void 0 : r.scope;
|
|
61
61
|
return { onFetch: async (o, u) => {
|
|
62
62
|
if (u.aborted)
|
|
63
63
|
throw new Error("Operation aborted");
|
|
64
64
|
try {
|
|
65
|
-
const
|
|
65
|
+
const i = { scope: c, query: o }, a = await fetch(e, {
|
|
66
66
|
method: "POST",
|
|
67
67
|
headers: { "Content-Type": "application/json", ...s },
|
|
68
|
-
body: JSON.stringify(
|
|
68
|
+
body: JSON.stringify(i),
|
|
69
69
|
signal: u
|
|
70
70
|
});
|
|
71
|
-
if (!
|
|
72
|
-
let
|
|
71
|
+
if (!a.ok) {
|
|
72
|
+
let p = "Fetch request failed";
|
|
73
73
|
try {
|
|
74
|
-
const
|
|
75
|
-
|
|
74
|
+
const d = await a.json();
|
|
75
|
+
d.error && (p = d.error);
|
|
76
76
|
} catch {
|
|
77
77
|
}
|
|
78
|
-
throw new Error(
|
|
78
|
+
throw new Error(p);
|
|
79
79
|
}
|
|
80
|
-
return (await
|
|
81
|
-
} catch (
|
|
82
|
-
throw
|
|
80
|
+
return (await a.json()).results ?? [];
|
|
81
|
+
} catch (i) {
|
|
82
|
+
throw i instanceof Error && i.name === "AbortError" ? new Error("Operation aborted") : i;
|
|
83
83
|
}
|
|
84
|
-
}, onSync: async (o, u) => {
|
|
85
|
-
if (
|
|
86
|
-
return o.map((
|
|
87
|
-
id:
|
|
84
|
+
}, onSync: async (o, u, i) => {
|
|
85
|
+
if (i.aborted)
|
|
86
|
+
return o.map((a) => ({
|
|
87
|
+
id: a.id,
|
|
88
88
|
status: "error",
|
|
89
89
|
error: "Operation aborted"
|
|
90
90
|
}));
|
|
91
91
|
try {
|
|
92
|
-
const
|
|
92
|
+
const a = { scope: c, changes: o }, y = await fetch(e, {
|
|
93
93
|
method: "POST",
|
|
94
94
|
headers: { "Content-Type": "application/json", ...s },
|
|
95
|
-
body: JSON.stringify(
|
|
96
|
-
signal:
|
|
95
|
+
body: JSON.stringify(a),
|
|
96
|
+
signal: i
|
|
97
97
|
});
|
|
98
|
-
if (!
|
|
98
|
+
if (!y.ok) {
|
|
99
99
|
let d = "Sync request failed";
|
|
100
100
|
try {
|
|
101
|
-
const
|
|
102
|
-
|
|
101
|
+
const f = await y.json();
|
|
102
|
+
f.error && (d = f.error);
|
|
103
103
|
} catch {
|
|
104
104
|
}
|
|
105
|
-
return o.map((
|
|
105
|
+
return o.map((f) => ({ id: f.id, status: "error", error: d }));
|
|
106
106
|
}
|
|
107
|
-
return (await
|
|
107
|
+
return (await y.json()).syncResults ?? o.map((d) => ({
|
|
108
108
|
id: d.id,
|
|
109
109
|
status: "error",
|
|
110
110
|
error: "No sync results returned"
|
|
111
111
|
}));
|
|
112
|
-
} catch (
|
|
113
|
-
const
|
|
114
|
-
return o.map((p) => ({ id: p.id, status: "error", error:
|
|
112
|
+
} catch (a) {
|
|
113
|
+
const y = a instanceof Error && a.name === "AbortError" ? "Operation aborted" : a instanceof Error ? a.message : "Unknown error";
|
|
114
|
+
return o.map((p) => ({ id: p.id, status: "error", error: y }));
|
|
115
115
|
}
|
|
116
116
|
} };
|
|
117
117
|
}
|
|
118
|
-
async function
|
|
119
|
-
const { fetch: e, parseResponse: s, parseError: c } = r,
|
|
118
|
+
async function j(r) {
|
|
119
|
+
const { fetch: e, parseResponse: s, parseError: c } = r, n = (t) => typeof c == "function" ? c(t) : typeof c == "string" ? c : t instanceof Error ? t.message : "Request failed";
|
|
120
120
|
try {
|
|
121
121
|
const t = await e;
|
|
122
122
|
if (!t.ok) {
|
|
@@ -126,19 +126,19 @@ async function R(r) {
|
|
|
126
126
|
u.message ? o = new Error(u.message) : u.error && (o = new Error(u.error));
|
|
127
127
|
} catch {
|
|
128
128
|
}
|
|
129
|
-
return { success: !1, error:
|
|
129
|
+
return { success: !1, error: n(o) };
|
|
130
130
|
}
|
|
131
131
|
return s ? { success: !0, ...await s(t) } : { success: !0 };
|
|
132
132
|
} catch (t) {
|
|
133
|
-
return t instanceof Error && t.name === "AbortError" ? { success: !1, error: "Operation aborted" } : { success: !1, error:
|
|
133
|
+
return t instanceof Error && t.name === "AbortError" ? { success: !1, error: "Operation aborted" } : { success: !1, error: n(t) };
|
|
134
134
|
}
|
|
135
135
|
}
|
|
136
136
|
export {
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
137
|
+
b as a,
|
|
138
|
+
R as b,
|
|
139
|
+
S as c,
|
|
140
|
+
O as d,
|
|
141
|
+
j as f,
|
|
142
|
+
h as s
|
|
143
143
|
};
|
|
144
|
-
//# sourceMappingURL=client-
|
|
144
|
+
//# sourceMappingURL=client-BfugfaiH.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"client-BfugfaiH.js","sources":["../../src/runtime/client.ts"],"sourcesContent":["import type { Change, SyncResult } from \"../types\";\nimport {\n type SyncHandlerResult,\n type SyncBatchResult,\n type SyncRequestBody,\n type SyncResponseBody,\n categorizeResults,\n} from \"./types\";\n\nexport type { SyncHandlerResult, SyncBatchResult };\nexport { categorizeResults };\n\n// ============================================================================\n// Types\n// ============================================================================\n\nexport type CreateHandler<T> = (data: T, signal: AbortSignal) => Promise<SyncHandlerResult>;\nexport type UpdateHandler<T> = (\n id: string,\n data: T,\n signal: AbortSignal,\n) => Promise<SyncHandlerResult>;\nexport type DeleteHandler<T> = (\n id: string,\n data: T,\n signal: AbortSignal,\n) => Promise<SyncHandlerResult>;\n\nexport type SyncBuilderConfig<T> = {\n create?: CreateHandler<T>;\n update?: UpdateHandler<T>;\n delete?: DeleteHandler<T>;\n};\n\nexport type SyncBuilder<T, C = unknown> = {\n onSync: (changes: Change<T>[], context: C, signal: AbortSignal) => Promise<SyncResult[]>;\n handlers: {\n create?: CreateHandler<T>;\n update?: UpdateHandler<T>;\n delete?: DeleteHandler<T>;\n };\n};\n\nexport type FetchToSyncResultOptions = {\n fetch: Promise<Response>;\n parseResponse?: (response: Response) => Promise<{ newId?: string }>;\n parseError?: string | ((error: unknown) => string);\n};\n\n// ============================================================================\n// Change Processing\n// ============================================================================\n\ntype ChangeProcessor<T> = {\n guard: (config: SyncBuilderConfig<T>) => boolean;\n execute: (\n change: Change<T>,\n config: SyncBuilderConfig<T>,\n signal: AbortSignal,\n ) => Promise<SyncHandlerResult>;\n toResult: (change: Change<T>, result: SyncHandlerResult) => SyncResult;\n};\n\nfunction createChangeProcessors<T>(): Record<string, ChangeProcessor<T>> {\n return {\n create: {\n guard: (config) => !!config.create,\n execute: (change, config, signal) => config.create!(change.data, signal),\n toResult: (change, result) =>\n result.success === true\n ? { id: change.id, status: \"success\" as const, newId: result.newId }\n : { id: change.id, status: \"error\" as const, error: result.error },\n },\n\n update: {\n guard: (config) => !!config.update,\n execute: (change, config, signal) => config.update!(change.id, change.data, signal),\n toResult: (change, result) =>\n result.success === true\n ? { id: change.id, status: \"success\" as const }\n : { id: change.id, status: \"error\" as const, error: result.error },\n },\n\n delete: {\n guard: (config) => !!config.delete,\n execute: (change, config, signal) => config.delete!(change.id, change.data, signal),\n toResult: (change, result) =>\n result.success === true\n ? { id: change.id, status: \"success\" as const }\n : { id: change.id, status: \"error\" as const, error: result.error },\n },\n };\n}\n\nasync function processChange<T>(\n change: Change<T>,\n config: SyncBuilderConfig<T>,\n signal: AbortSignal,\n): Promise<SyncResult> {\n if (signal.aborted) {\n return { id: change.id, status: \"error\", error: \"Operation aborted\" };\n }\n\n const processors = createChangeProcessors<T>();\n const processor = processors[change.type];\n\n if (!processor) {\n return { id: change.id, status: \"error\", error: `Unknown change type: ${change.type}` };\n }\n\n // If handler not configured, treat as success (offline-first support)\n if (!processor.guard(config)) {\n return { id: change.id, status: \"success\" };\n }\n\n try {\n const result = await processor.execute(change, config, signal);\n return processor.toResult(change, result);\n } catch (error) {\n return {\n id: change.id,\n status: \"error\",\n error: error instanceof Error ? error.message : \"Unknown error\",\n };\n }\n}\n\n// ============================================================================\n// Public API\n// ============================================================================\n\nexport function createSyncClient<T, C = unknown>(config: SyncBuilderConfig<T>): SyncBuilder<T, C> {\n const onSync = async (\n changes: Change<T>[],\n _context: C,\n signal: AbortSignal,\n ): Promise<SyncResult[]> => {\n return Promise.all(changes.map((change) => processChange(change, config, signal)));\n };\n\n return {\n onSync,\n handlers: { create: config.create, update: config.update, delete: config.delete },\n };\n}\n\nexport function createSyncClientWithStats<T, C = unknown>(\n config: SyncBuilderConfig<T>,\n): {\n onSync: (changes: Change<T>[], context: C, signal: AbortSignal) => Promise<SyncResult[]>;\n onSyncWithStats: (\n changes: Change<T>[],\n context: C,\n signal: AbortSignal,\n ) => Promise<SyncBatchResult>;\n handlers: { create?: CreateHandler<T>; update?: UpdateHandler<T>; delete?: DeleteHandler<T> };\n} {\n const { onSync, handlers } = createSyncClient<T, C>(config);\n\n const onSyncWithStats = async (\n changes: Change<T>[],\n context: C,\n signal: AbortSignal,\n ): Promise<SyncBatchResult> => {\n const results = await onSync(changes, context, signal);\n return categorizeResults(results);\n };\n\n return { onSync, onSyncWithStats, handlers };\n}\n\nexport function syncSuccess(options?: { newId?: string }): SyncHandlerResult {\n return { success: true, ...options };\n}\n\nexport function syncError(error: string): SyncHandlerResult {\n return { success: false, error };\n}\n\nexport type EndpointSyncClientConfig = {\n endpoint: string;\n headers?: Record<string, string>;\n scope?: string;\n};\n\nexport type EndpointSyncClient<T, Q = unknown> = {\n onFetch: (query: Q, signal: AbortSignal) => Promise<T[]>;\n onSync: (changes: Change<T>[], context: Q, signal: AbortSignal) => Promise<SyncResult[]>;\n};\n\nexport function createSyncClientFromEndpoint<T, Q = unknown>(\n config: string | EndpointSyncClientConfig,\n): EndpointSyncClient<T, Q> {\n const endpoint = typeof config === \"string\" ? config : config.endpoint;\n const headers = typeof config === \"string\" ? {} : (config.headers ?? {});\n const scope = typeof config === \"string\" ? undefined : config.scope;\n\n const onFetch = async (query: Q, signal: AbortSignal): Promise<T[]> => {\n if (signal.aborted) {\n throw new Error(\"Operation aborted\");\n }\n\n try {\n const body: SyncRequestBody<T, Q> = { scope, query };\n const response = await fetch(endpoint, {\n method: \"POST\",\n headers: { \"Content-Type\": \"application/json\", ...headers },\n body: JSON.stringify(body),\n signal,\n });\n\n if (!response.ok) {\n let errorMsg = \"Fetch request failed\";\n try {\n const errorBody = await response.json();\n if (errorBody.error) errorMsg = errorBody.error;\n } catch {\n // Ignore JSON parse errors\n }\n throw new Error(errorMsg);\n }\n\n const responseBody: SyncResponseBody<T> = await response.json();\n return responseBody.results ?? [];\n } catch (error) {\n if (error instanceof Error && error.name === \"AbortError\") {\n throw new Error(\"Operation aborted\");\n }\n throw error;\n }\n };\n\n const onSync = async (\n changes: Change<T>[],\n _context: Q,\n signal: AbortSignal,\n ): Promise<SyncResult[]> => {\n if (signal.aborted) {\n return changes.map((c) => ({\n id: c.id,\n status: \"error\" as const,\n error: \"Operation aborted\",\n }));\n }\n\n try {\n const body: SyncRequestBody<T, Q> = { scope, changes };\n const response = await fetch(endpoint, {\n method: \"POST\",\n headers: { \"Content-Type\": \"application/json\", ...headers },\n body: JSON.stringify(body),\n signal,\n });\n\n if (!response.ok) {\n let errorMsg = \"Sync request failed\";\n try {\n const errorBody = await response.json();\n if (errorBody.error) errorMsg = errorBody.error;\n } catch {\n // Ignore JSON parse errors\n }\n return changes.map((c) => ({ id: c.id, status: \"error\" as const, error: errorMsg }));\n }\n\n const responseBody: SyncResponseBody<T> = await response.json();\n return (\n responseBody.syncResults ??\n changes.map((c) => ({\n id: c.id,\n status: \"error\" as const,\n error: \"No sync results returned\",\n }))\n );\n } catch (error) {\n const errorMsg =\n error instanceof Error && error.name === \"AbortError\"\n ? \"Operation aborted\"\n : error instanceof Error\n ? error.message\n : \"Unknown error\";\n return changes.map((c) => ({ id: c.id, status: \"error\" as const, error: errorMsg }));\n }\n };\n\n return { onFetch, onSync };\n}\n\nexport async function fetchToSyncResult(\n options: FetchToSyncResultOptions,\n): Promise<SyncHandlerResult> {\n const { fetch: fetchPromise, parseResponse, parseError } = options;\n\n const getErrorMessage = (error: unknown): string => {\n if (typeof parseError === \"function\") return parseError(error);\n if (typeof parseError === \"string\") return parseError;\n return error instanceof Error ? error.message : \"Request failed\";\n };\n\n try {\n const response = await fetchPromise;\n\n if (!response.ok) {\n let error: unknown = new Error(\"Request failed\");\n try {\n const body = await response.json();\n if (body.message) error = new Error(body.message);\n else if (body.error) error = new Error(body.error);\n } catch {\n // Ignore JSON parse errors\n }\n return { success: false, error: getErrorMessage(error) };\n }\n\n if (parseResponse) {\n const result = await parseResponse(response);\n return { success: true, ...result };\n }\n\n return { success: true };\n } catch (error) {\n if (error instanceof Error && error.name === \"AbortError\") {\n return { success: false, error: \"Operation aborted\" };\n }\n return { success: false, error: getErrorMessage(error) };\n }\n}\n"],"names":["createChangeProcessors","config","change","signal","result","processChange","processor","error","createSyncClient","changes","_context","createSyncClientWithStats","onSync","handlers","context","results","categorizeResults","syncSuccess","options","syncError","createSyncClientFromEndpoint","endpoint","headers","scope","query","body","response","errorMsg","errorBody","c","fetchToSyncResult","fetchPromise","parseResponse","parseError","getErrorMessage"],"mappings":"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"}
|