schemock 0.0.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (52) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +82 -0
  3. package/dist/adapters/index.d.mts +1364 -0
  4. package/dist/adapters/index.d.ts +1364 -0
  5. package/dist/adapters/index.js +36988 -0
  6. package/dist/adapters/index.js.map +1 -0
  7. package/dist/adapters/index.mjs +36972 -0
  8. package/dist/adapters/index.mjs.map +1 -0
  9. package/dist/cli/index.d.mts +831 -0
  10. package/dist/cli/index.d.ts +831 -0
  11. package/dist/cli/index.js +4425 -0
  12. package/dist/cli/index.js.map +1 -0
  13. package/dist/cli/index.mjs +4401 -0
  14. package/dist/cli/index.mjs.map +1 -0
  15. package/dist/cli.js +6776 -0
  16. package/dist/index.d.mts +8 -0
  17. package/dist/index.d.ts +8 -0
  18. package/dist/index.js +39439 -0
  19. package/dist/index.js.map +1 -0
  20. package/dist/index.mjs +39367 -0
  21. package/dist/index.mjs.map +1 -0
  22. package/dist/middleware/index.d.mts +688 -0
  23. package/dist/middleware/index.d.ts +688 -0
  24. package/dist/middleware/index.js +921 -0
  25. package/dist/middleware/index.js.map +1 -0
  26. package/dist/middleware/index.mjs +899 -0
  27. package/dist/middleware/index.mjs.map +1 -0
  28. package/dist/react/index.d.mts +316 -0
  29. package/dist/react/index.d.ts +316 -0
  30. package/dist/react/index.js +466 -0
  31. package/dist/react/index.js.map +1 -0
  32. package/dist/react/index.mjs +456 -0
  33. package/dist/react/index.mjs.map +1 -0
  34. package/dist/runtime/index.d.mts +814 -0
  35. package/dist/runtime/index.d.ts +814 -0
  36. package/dist/runtime/index.js +1270 -0
  37. package/dist/runtime/index.js.map +1 -0
  38. package/dist/runtime/index.mjs +1246 -0
  39. package/dist/runtime/index.mjs.map +1 -0
  40. package/dist/schema/index.d.mts +838 -0
  41. package/dist/schema/index.d.ts +838 -0
  42. package/dist/schema/index.js +696 -0
  43. package/dist/schema/index.js.map +1 -0
  44. package/dist/schema/index.mjs +681 -0
  45. package/dist/schema/index.mjs.map +1 -0
  46. package/dist/types-C1MiZh1d.d.ts +96 -0
  47. package/dist/types-C2bd2vgy.d.mts +773 -0
  48. package/dist/types-C2bd2vgy.d.ts +773 -0
  49. package/dist/types-C9VMgu3E.d.mts +289 -0
  50. package/dist/types-DV2DS7wj.d.mts +96 -0
  51. package/dist/types-c2AN3vky.d.ts +289 -0
  52. package/package.json +116 -0
@@ -0,0 +1,466 @@
1
+ 'use strict';
2
+
3
+ var react = require('react');
4
+ var reactQuery = require('@tanstack/react-query');
5
+ var jsxRuntime = require('react/jsx-runtime');
6
+
7
+ // src/react/context.ts
8
+ var DataLayerContext = react.createContext(null);
9
+ function useDataLayerContext() {
10
+ const context = react.useContext(DataLayerContext);
11
+ if (!context) {
12
+ throw new Error(
13
+ "useDataLayerContext must be used within a DataLayerProvider. Wrap your app with <DataLayerProvider adapter={adapter}>...</DataLayerProvider>"
14
+ );
15
+ }
16
+ return context;
17
+ }
18
+ function useAdapter() {
19
+ return useDataLayerContext().adapter;
20
+ }
21
+ function useQueryClientFromContext() {
22
+ return useDataLayerContext().queryClient;
23
+ }
24
+ var DataLayerProvider = ({
25
+ adapter,
26
+ schemas = [],
27
+ middleware = [],
28
+ queryClient: providedQueryClient,
29
+ defaultOptions,
30
+ children
31
+ }) => {
32
+ const queryClient = react.useMemo(() => {
33
+ if (providedQueryClient) {
34
+ return providedQueryClient;
35
+ }
36
+ return new reactQuery.QueryClient({
37
+ defaultOptions: {
38
+ queries: {
39
+ staleTime: defaultOptions?.staleTime ?? 0,
40
+ gcTime: defaultOptions?.cacheTime ?? 5 * 60 * 1e3,
41
+ retry: defaultOptions?.retry ?? 3,
42
+ refetchOnWindowFocus: false
43
+ },
44
+ mutations: {
45
+ retry: defaultOptions?.retry ?? 0
46
+ }
47
+ }
48
+ });
49
+ }, [providedQueryClient, defaultOptions]);
50
+ const schemaMap = react.useMemo(() => {
51
+ const map = /* @__PURE__ */ new Map();
52
+ for (const schema of schemas) {
53
+ map.set(schema.name, schema);
54
+ }
55
+ return map;
56
+ }, [schemas]);
57
+ const contextValue = react.useMemo(
58
+ () => ({
59
+ adapter,
60
+ queryClient,
61
+ schemas: schemaMap,
62
+ middleware,
63
+ getSchema: (name) => schemaMap.get(name)
64
+ }),
65
+ [adapter, queryClient, schemaMap, middleware]
66
+ );
67
+ return /* @__PURE__ */ jsxRuntime.jsx(reactQuery.QueryClientProvider, { client: queryClient, children: /* @__PURE__ */ jsxRuntime.jsx(DataLayerContext.Provider, { value: contextValue, children }) });
68
+ };
69
+
70
+ // src/middleware/chain.ts
71
+ var MiddlewareChain = class {
72
+ /** The middleware stack */
73
+ middlewares;
74
+ /**
75
+ * Create a new MiddlewareChain.
76
+ *
77
+ * @param middlewares - Array of middleware to execute in order
78
+ */
79
+ constructor(middlewares) {
80
+ this.middlewares = middlewares.filter((m) => m.enabled !== false);
81
+ }
82
+ /**
83
+ * Execute the middleware chain with the given handler.
84
+ *
85
+ * @param ctx - The middleware context
86
+ * @param handler - The final handler (adapter call)
87
+ * @returns The response after all middleware processing
88
+ *
89
+ * @example
90
+ * ```typescript
91
+ * const result = await chain.execute<User[]>(
92
+ * { entity: 'user', operation: 'findMany', metadata: {} },
93
+ * () => adapter.findMany({ entity: 'user' })
94
+ * );
95
+ * ```
96
+ */
97
+ async execute(ctx, handler) {
98
+ ctx.startTime = Date.now();
99
+ ctx.metadata = ctx.metadata ?? {};
100
+ const hasFunctionHandlers = this.middlewares.some((m) => m.handler);
101
+ if (hasFunctionHandlers) {
102
+ return this.executeFunctionStyle(ctx, handler);
103
+ }
104
+ return this.executeHookStyle(ctx, handler);
105
+ }
106
+ /**
107
+ * Execute middleware using hook-style (before/after/onError).
108
+ */
109
+ async executeHookStyle(ctx, handler) {
110
+ for (const middleware of this.middlewares) {
111
+ if (middleware.before) {
112
+ const result = await middleware.before(ctx);
113
+ if (result && !result.continue) {
114
+ if (result.response) {
115
+ return result.response;
116
+ }
117
+ if (result.error) {
118
+ throw result.error;
119
+ }
120
+ }
121
+ }
122
+ }
123
+ let response;
124
+ try {
125
+ response = await handler();
126
+ } catch (error) {
127
+ for (const middleware of this.middlewares) {
128
+ if (middleware.onError) {
129
+ const result = await middleware.onError(
130
+ ctx,
131
+ error instanceof Error ? error : new Error(String(error))
132
+ );
133
+ if (result && !result.continue) {
134
+ if (result.response) {
135
+ return result.response;
136
+ }
137
+ if (result.error) {
138
+ throw result.error;
139
+ }
140
+ }
141
+ }
142
+ }
143
+ throw error;
144
+ }
145
+ for (let i = this.middlewares.length - 1; i >= 0; i--) {
146
+ const middleware = this.middlewares[i];
147
+ if (middleware.after) {
148
+ response = await middleware.after(ctx, response);
149
+ }
150
+ }
151
+ return response;
152
+ }
153
+ /**
154
+ * Execute middleware using function-style (Koa-like compose).
155
+ */
156
+ async executeFunctionStyle(ctx, handler) {
157
+ let index = -1;
158
+ const dispatch = async (i) => {
159
+ if (i <= index) {
160
+ throw new Error("next() called multiple times");
161
+ }
162
+ index = i;
163
+ if (i >= this.middlewares.length) {
164
+ return handler();
165
+ }
166
+ const middleware = this.middlewares[i];
167
+ if (middleware.handler) {
168
+ return middleware.handler(ctx, () => dispatch(i + 1));
169
+ }
170
+ if (middleware.before) {
171
+ const result = await middleware.before(ctx);
172
+ if (result && !result.continue) {
173
+ if (result.response) {
174
+ return result.response;
175
+ }
176
+ if (result.error) {
177
+ throw result.error;
178
+ }
179
+ }
180
+ }
181
+ let response;
182
+ try {
183
+ response = await dispatch(i + 1);
184
+ } catch (error) {
185
+ if (middleware.onError) {
186
+ const result = await middleware.onError(
187
+ ctx,
188
+ error instanceof Error ? error : new Error(String(error))
189
+ );
190
+ if (result && !result.continue) {
191
+ if (result.response) {
192
+ return result.response;
193
+ }
194
+ if (result.error) {
195
+ throw result.error;
196
+ }
197
+ }
198
+ }
199
+ throw error;
200
+ }
201
+ if (middleware.after) {
202
+ response = await middleware.after(ctx, response);
203
+ }
204
+ return response;
205
+ };
206
+ return dispatch(0);
207
+ }
208
+ /**
209
+ * Add middleware to the chain.
210
+ *
211
+ * @param middleware - Middleware to add
212
+ */
213
+ use(middleware) {
214
+ if (middleware.enabled !== false) {
215
+ this.middlewares.push(middleware);
216
+ }
217
+ return this;
218
+ }
219
+ /**
220
+ * Remove middleware by name.
221
+ *
222
+ * @param name - Name of middleware to remove
223
+ */
224
+ remove(name) {
225
+ this.middlewares = this.middlewares.filter((m) => m.name !== name);
226
+ return this;
227
+ }
228
+ /**
229
+ * Get middleware by name.
230
+ *
231
+ * @param name - Middleware name
232
+ * @returns The middleware or undefined
233
+ */
234
+ get(name) {
235
+ return this.middlewares.find((m) => m.name === name);
236
+ }
237
+ /**
238
+ * Get all middleware names.
239
+ *
240
+ * @returns Array of middleware names
241
+ */
242
+ names() {
243
+ return this.middlewares.map((m) => m.name);
244
+ }
245
+ /**
246
+ * Get the middleware count.
247
+ */
248
+ get length() {
249
+ return this.middlewares.length;
250
+ }
251
+ };
252
+
253
+ // src/react/hooks.ts
254
+ function useData(entity, options) {
255
+ const { adapter, middleware } = useDataLayerContext();
256
+ const chain = new MiddlewareChain(middleware);
257
+ const {
258
+ id,
259
+ include,
260
+ where,
261
+ limit,
262
+ offset,
263
+ orderBy,
264
+ select,
265
+ enabled = true,
266
+ staleTime,
267
+ placeholderData
268
+ } = options ?? {};
269
+ const queryKey = [
270
+ entity.name,
271
+ id ?? "list",
272
+ { where, limit, offset, orderBy, include, select }
273
+ ];
274
+ return reactQuery.useQuery({
275
+ queryKey,
276
+ queryFn: async () => {
277
+ const ctx = {
278
+ entity: entity.name,
279
+ params: id ? { id } : void 0,
280
+ filter: where,
281
+ limit,
282
+ offset,
283
+ orderBy,
284
+ select,
285
+ include
286
+ };
287
+ const middlewareCtx = {
288
+ ...ctx,
289
+ operation: id ? "findOne" : "findMany",
290
+ metadata: {}
291
+ };
292
+ const result = await chain.execute(
293
+ middlewareCtx,
294
+ () => id ? adapter.findOne(ctx) : adapter.findMany(ctx)
295
+ );
296
+ if (result.error) {
297
+ throw result.error;
298
+ }
299
+ return result.data;
300
+ },
301
+ enabled,
302
+ staleTime,
303
+ // Cast needed for React Query v5's strict NonFunctionGuard type checking
304
+ ...placeholderData !== void 0 && { placeholderData }
305
+ });
306
+ }
307
+ function useMutate(entity, options) {
308
+ const { adapter, middleware } = useDataLayerContext();
309
+ const queryClient = reactQuery.useQueryClient();
310
+ const chain = new MiddlewareChain(middleware);
311
+ const { invalidateOnSuccess = true, invalidateQueries } = options ?? {};
312
+ const invalidate = () => {
313
+ if (invalidateOnSuccess) {
314
+ queryClient.invalidateQueries({ queryKey: [entity.name] });
315
+ }
316
+ if (invalidateQueries) {
317
+ for (const key of invalidateQueries) {
318
+ queryClient.invalidateQueries({ queryKey: key });
319
+ }
320
+ }
321
+ };
322
+ const create = reactQuery.useMutation({
323
+ mutationFn: async (data) => {
324
+ const ctx = {
325
+ entity: entity.name,
326
+ data
327
+ };
328
+ const middlewareCtx = {
329
+ ...ctx,
330
+ operation: "create",
331
+ metadata: {}
332
+ };
333
+ const result = await chain.execute(
334
+ middlewareCtx,
335
+ () => adapter.create(ctx)
336
+ );
337
+ if (result.error) {
338
+ throw result.error;
339
+ }
340
+ return result.data;
341
+ },
342
+ onSuccess: invalidate
343
+ });
344
+ const update = reactQuery.useMutation({
345
+ mutationFn: async ({ id, data }) => {
346
+ const ctx = {
347
+ entity: entity.name,
348
+ params: { id },
349
+ data
350
+ };
351
+ const middlewareCtx = {
352
+ ...ctx,
353
+ operation: "update",
354
+ metadata: {}
355
+ };
356
+ const result = await chain.execute(
357
+ middlewareCtx,
358
+ () => adapter.update(ctx)
359
+ );
360
+ if (result.error) {
361
+ throw result.error;
362
+ }
363
+ return result.data;
364
+ },
365
+ onSuccess: invalidate
366
+ });
367
+ const remove = reactQuery.useMutation({
368
+ mutationFn: async (id) => {
369
+ const ctx = {
370
+ entity: entity.name,
371
+ params: { id }
372
+ };
373
+ const middlewareCtx = {
374
+ ...ctx,
375
+ operation: "delete",
376
+ metadata: {}
377
+ };
378
+ const result = await chain.execute(
379
+ middlewareCtx,
380
+ () => adapter.delete(ctx)
381
+ );
382
+ if (result.error) {
383
+ throw result.error;
384
+ }
385
+ },
386
+ onSuccess: invalidate
387
+ });
388
+ return { create, update, remove };
389
+ }
390
+ function useView(view, options) {
391
+ const { adapter, middleware } = useDataLayerContext();
392
+ const chain = new MiddlewareChain(middleware);
393
+ const { params, enabled = true, staleTime, placeholderData } = options ?? {};
394
+ const queryKey = ["view", view.name, params];
395
+ return reactQuery.useQuery({
396
+ queryKey,
397
+ queryFn: async () => {
398
+ let endpoint = view.endpoint;
399
+ if (params) {
400
+ for (const [key, value] of Object.entries(params)) {
401
+ endpoint = endpoint.replace(`:${key}`, value);
402
+ }
403
+ }
404
+ const ctx = {
405
+ entity: view.name,
406
+ endpoint,
407
+ params
408
+ };
409
+ const middlewareCtx = {
410
+ ...ctx,
411
+ operation: "view",
412
+ metadata: {}
413
+ };
414
+ const result = await chain.execute(
415
+ middlewareCtx,
416
+ () => adapter.findOne(ctx)
417
+ );
418
+ if (result.error) {
419
+ throw result.error;
420
+ }
421
+ return result.data;
422
+ },
423
+ enabled,
424
+ staleTime,
425
+ // Cast needed for React Query v5's strict NonFunctionGuard type checking
426
+ ...placeholderData !== void 0 && { placeholderData }
427
+ });
428
+ }
429
+ function usePrefetch(entity) {
430
+ const queryClient = reactQuery.useQueryClient();
431
+ const { adapter } = useDataLayerContext();
432
+ return (options) => {
433
+ const { id, where, limit, offset, orderBy } = options ?? {};
434
+ const queryKey = [entity.name, id ?? "list", { where, limit, offset, orderBy }];
435
+ return queryClient.prefetchQuery({
436
+ queryKey,
437
+ queryFn: async () => {
438
+ const ctx = {
439
+ entity: entity.name,
440
+ params: id ? { id } : void 0,
441
+ filter: where,
442
+ limit,
443
+ offset,
444
+ orderBy
445
+ };
446
+ const result = id ? await adapter.findOne(ctx) : await adapter.findMany(ctx);
447
+ if (result.error) {
448
+ throw result.error;
449
+ }
450
+ return result.data;
451
+ }
452
+ });
453
+ };
454
+ }
455
+
456
+ exports.DataLayerContext = DataLayerContext;
457
+ exports.DataLayerProvider = DataLayerProvider;
458
+ exports.useAdapter = useAdapter;
459
+ exports.useData = useData;
460
+ exports.useDataLayerContext = useDataLayerContext;
461
+ exports.useMutate = useMutate;
462
+ exports.usePrefetch = usePrefetch;
463
+ exports.useQueryClientFromContext = useQueryClientFromContext;
464
+ exports.useView = useView;
465
+ //# sourceMappingURL=index.js.map
466
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../src/react/context.ts","../../src/react/provider.tsx","../../src/middleware/chain.ts","../../src/react/hooks.ts"],"names":["createContext","useContext","useMemo","QueryClient","jsx","QueryClientProvider","useQuery","useQueryClient","useMutation"],"mappings":";;;;;;;AAoCO,IAAM,gBAAA,GAAmBA,oBAA4C,IAAI;AAqBzE,SAAS,mBAAA,GAA6C;AAC3D,EAAA,MAAM,OAAA,GAAUC,iBAAW,gBAAgB,CAAA;AAE3C,EAAA,IAAI,CAAC,OAAA,EAAS;AACZ,IAAA,MAAM,IAAI,KAAA;AAAA,MACR;AAAA,KAEF;AAAA,EACF;AAEA,EAAA,OAAO,OAAA;AACT;AAeO,SAAS,UAAA,GAAsB;AACpC,EAAA,OAAO,qBAAoB,CAAE,OAAA;AAC/B;AAOO,SAAS,yBAAA,GAAyC;AACvD,EAAA,OAAO,qBAAoB,CAAE,WAAA;AAC/B;ACTO,IAAM,oBAAsD,CAAC;AAAA,EAClE,OAAA;AAAA,EACA,UAAU,EAAC;AAAA,EACX,aAAa,EAAC;AAAA,EACd,WAAA,EAAa,mBAAA;AAAA,EACb,cAAA;AAAA,EACA;AACF,CAAA,KAAM;AAEJ,EAAA,MAAM,WAAA,GAAcC,cAAQ,MAAM;AAChC,IAAA,IAAI,mBAAA,EAAqB;AACvB,MAAA,OAAO,mBAAA;AAAA,IACT;AAEA,IAAA,OAAO,IAAIC,sBAAA,CAAY;AAAA,MACrB,cAAA,EAAgB;AAAA,QACd,OAAA,EAAS;AAAA,UACP,SAAA,EAAW,gBAAgB,SAAA,IAAa,CAAA;AAAA,UACxC,MAAA,EAAQ,cAAA,EAAgB,SAAA,IAAa,CAAA,GAAI,EAAA,GAAK,GAAA;AAAA,UAC9C,KAAA,EAAO,gBAAgB,KAAA,IAAS,CAAA;AAAA,UAChC,oBAAA,EAAsB;AAAA,SACxB;AAAA,QACA,SAAA,EAAW;AAAA,UACT,KAAA,EAAO,gBAAgB,KAAA,IAAS;AAAA;AAClC;AACF,KACD,CAAA;AAAA,EACH,CAAA,EAAG,CAAC,mBAAA,EAAqB,cAAc,CAAC,CAAA;AAGxC,EAAA,MAAM,SAAA,GAAYD,cAAQ,MAAM;AAC9B,IAAA,MAAM,GAAA,uBAAU,GAAA,EAA0B;AAC1C,IAAA,KAAA,MAAW,UAAU,OAAA,EAAS;AAC5B,MAAA,GAAA,CAAI,GAAA,CAAI,MAAA,CAAO,IAAA,EAAM,MAAM,CAAA;AAAA,IAC7B;AACA,IAAA,OAAO,GAAA;AAAA,EACT,CAAA,EAAG,CAAC,OAAO,CAAC,CAAA;AAGZ,EAAA,MAAM,YAAA,GAAsCA,aAAA;AAAA,IAC1C,OAAO;AAAA,MACL,OAAA;AAAA,MACA,WAAA;AAAA,MACA,OAAA,EAAS,SAAA;AAAA,MACT,UAAA;AAAA,MACA,SAAA,EAAW,CAAC,IAAA,KAAiB,SAAA,CAAU,IAAI,IAAI;AAAA,KACjD,CAAA;AAAA,IACA,CAAC,OAAA,EAAS,WAAA,EAAa,SAAA,EAAW,UAAU;AAAA,GAC9C;AAEA,EAAA,uBACEE,cAAA,CAACC,8BAAA,EAAA,EAAoB,MAAA,EAAQ,WAAA,EAC3B,QAAA,kBAAAD,cAAA,CAAC,gBAAA,CAAiB,QAAA,EAAjB,EAA0B,KAAA,EAAO,YAAA,EAC/B,QAAA,EACH,CAAA,EACF,CAAA;AAEJ;;;AC9GO,IAAM,kBAAN,MAAsB;AAAA;AAAA,EAEnB,WAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOR,YAAY,WAAA,EAA2B;AACrC,IAAA,IAAA,CAAK,cAAc,WAAA,CAAY,MAAA,CAAO,CAAC,CAAA,KAAM,CAAA,CAAE,YAAY,KAAK,CAAA;AAAA,EAClE;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAiBA,MAAM,OAAA,CACJ,GAAA,EACA,OAAA,EAC6B;AAE7B,IAAA,GAAA,CAAI,SAAA,GAAY,KAAK,GAAA,EAAI;AACzB,IAAA,GAAA,CAAI,QAAA,GAAW,GAAA,CAAI,QAAA,IAAY,EAAC;AAGhC,IAAA,MAAM,sBAAsB,IAAA,CAAK,WAAA,CAAY,KAAK,CAAC,CAAA,KAAM,EAAE,OAAO,CAAA;AAElE,IAAA,IAAI,mBAAA,EAAqB;AACvB,MAAA,OAAO,IAAA,CAAK,oBAAA,CAAqB,GAAA,EAAK,OAAO,CAAA;AAAA,IAC/C;AAEA,IAAA,OAAO,IAAA,CAAK,gBAAA,CAAiB,GAAA,EAAK,OAAO,CAAA;AAAA,EAC3C;AAAA;AAAA;AAAA;AAAA,EAKA,MAAc,gBAAA,CACZ,GAAA,EACA,OAAA,EAC6B;AAE7B,IAAA,KAAA,MAAW,UAAA,IAAc,KAAK,WAAA,EAAa;AACzC,MAAA,IAAI,WAAW,MAAA,EAAQ;AACrB,QAAA,MAAM,MAAA,GAAS,MAAM,UAAA,CAAW,MAAA,CAAO,GAAG,CAAA;AAC1C,QAAA,IAAI,MAAA,IAAU,CAAC,MAAA,CAAO,QAAA,EAAU;AAE9B,UAAA,IAAI,OAAO,QAAA,EAAU;AACnB,YAAA,OAAO,MAAA,CAAO,QAAA;AAAA,UAChB;AACA,UAAA,IAAI,OAAO,KAAA,EAAO;AAChB,YAAA,MAAM,MAAA,CAAO,KAAA;AAAA,UACf;AAAA,QACF;AAAA,MACF;AAAA,IACF;AAGA,IAAA,IAAI,QAAA;AACJ,IAAA,IAAI;AACF,MAAA,QAAA,GAAW,MAAM,OAAA,EAAQ;AAAA,IAC3B,SAAS,KAAA,EAAO;AAEd,MAAA,KAAA,MAAW,UAAA,IAAc,KAAK,WAAA,EAAa;AACzC,QAAA,IAAI,WAAW,OAAA,EAAS;AACtB,UAAA,MAAM,MAAA,GAAS,MAAM,UAAA,CAAW,OAAA;AAAA,YAC9B,GAAA;AAAA,YACA,iBAAiB,KAAA,GAAQ,KAAA,GAAQ,IAAI,KAAA,CAAM,MAAA,CAAO,KAAK,CAAC;AAAA,WAC1D;AACA,UAAA,IAAI,MAAA,IAAU,CAAC,MAAA,CAAO,QAAA,EAAU;AAC9B,YAAA,IAAI,OAAO,QAAA,EAAU;AACnB,cAAA,OAAO,MAAA,CAAO,QAAA;AAAA,YAChB;AACA,YAAA,IAAI,OAAO,KAAA,EAAO;AAChB,cAAA,MAAM,MAAA,CAAO,KAAA;AAAA,YACf;AAAA,UACF;AAAA,QACF;AAAA,MACF;AAEA,MAAA,MAAM,KAAA;AAAA,IACR;AAGA,IAAA,KAAA,IAAS,IAAI,IAAA,CAAK,WAAA,CAAY,SAAS,CAAA,EAAG,CAAA,IAAK,GAAG,CAAA,EAAA,EAAK;AACrD,MAAA,MAAM,UAAA,GAAa,IAAA,CAAK,WAAA,CAAY,CAAC,CAAA;AACrC,MAAA,IAAI,WAAW,KAAA,EAAO;AACpB,QAAA,QAAA,GAAW,MAAM,UAAA,CAAW,KAAA,CAAM,GAAA,EAAK,QAAQ,CAAA;AAAA,MACjD;AAAA,IACF;AAEA,IAAA,OAAO,QAAA;AAAA,EACT;AAAA;AAAA;AAAA;AAAA,EAKA,MAAc,oBAAA,CACZ,GAAA,EACA,OAAA,EAC6B;AAE7B,IAAA,IAAI,KAAA,GAAQ,EAAA;AAEZ,IAAA,MAAM,QAAA,GAAW,OAAO,CAAA,KAA2C;AACjE,MAAA,IAAI,KAAK,KAAA,EAAO;AACd,QAAA,MAAM,IAAI,MAAM,8BAA8B,CAAA;AAAA,MAChD;AACA,MAAA,KAAA,GAAQ,CAAA;AAER,MAAA,IAAI,CAAA,IAAK,IAAA,CAAK,WAAA,CAAY,MAAA,EAAQ;AAEhC,QAAA,OAAO,OAAA,EAAQ;AAAA,MACjB;AAEA,MAAA,MAAM,UAAA,GAAa,IAAA,CAAK,WAAA,CAAY,CAAC,CAAA;AAErC,MAAA,IAAI,WAAW,OAAA,EAAS;AAEtB,QAAA,OAAO,WAAW,OAAA,CAAQ,GAAA,EAAK,MAAM,QAAA,CAAS,CAAA,GAAI,CAAC,CAAC,CAAA;AAAA,MACtD;AAGA,MAAA,IAAI,WAAW,MAAA,EAAQ;AACrB,QAAA,MAAM,MAAA,GAAS,MAAM,UAAA,CAAW,MAAA,CAAO,GAAG,CAAA;AAC1C,QAAA,IAAI,MAAA,IAAU,CAAC,MAAA,CAAO,QAAA,EAAU;AAC9B,UAAA,IAAI,OAAO,QAAA,EAAU;AACnB,YAAA,OAAO,MAAA,CAAO,QAAA;AAAA,UAChB;AACA,UAAA,IAAI,OAAO,KAAA,EAAO;AAChB,YAAA,MAAM,MAAA,CAAO,KAAA;AAAA,UACf;AAAA,QACF;AAAA,MACF;AAEA,MAAA,IAAI,QAAA;AACJ,MAAA,IAAI;AACF,QAAA,QAAA,GAAW,MAAM,QAAA,CAAS,CAAA,GAAI,CAAC,CAAA;AAAA,MACjC,SAAS,KAAA,EAAO;AACd,QAAA,IAAI,WAAW,OAAA,EAAS;AACtB,UAAA,MAAM,MAAA,GAAS,MAAM,UAAA,CAAW,OAAA;AAAA,YAC9B,GAAA;AAAA,YACA,iBAAiB,KAAA,GAAQ,KAAA,GAAQ,IAAI,KAAA,CAAM,MAAA,CAAO,KAAK,CAAC;AAAA,WAC1D;AACA,UAAA,IAAI,MAAA,IAAU,CAAC,MAAA,CAAO,QAAA,EAAU;AAC9B,YAAA,IAAI,OAAO,QAAA,EAAU;AACnB,cAAA,OAAO,MAAA,CAAO,QAAA;AAAA,YAChB;AACA,YAAA,IAAI,OAAO,KAAA,EAAO;AAChB,cAAA,MAAM,MAAA,CAAO,KAAA;AAAA,YACf;AAAA,UACF;AAAA,QACF;AACA,QAAA,MAAM,KAAA;AAAA,MACR;AAEA,MAAA,IAAI,WAAW,KAAA,EAAO;AACpB,QAAA,QAAA,GAAW,MAAM,UAAA,CAAW,KAAA,CAAM,GAAA,EAAK,QAAQ,CAAA;AAAA,MACjD;AAEA,MAAA,OAAO,QAAA;AAAA,IACT,CAAA;AAEA,IAAA,OAAO,SAAS,CAAC,CAAA;AAAA,EACnB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,IAAI,UAAA,EAA8B;AAChC,IAAA,IAAI,UAAA,CAAW,YAAY,KAAA,EAAO;AAChC,MAAA,IAAA,CAAK,WAAA,CAAY,KAAK,UAAU,CAAA;AAAA,IAClC;AACA,IAAA,OAAO,IAAA;AAAA,EACT;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,OAAO,IAAA,EAAoB;AACzB,IAAA,IAAA,CAAK,WAAA,GAAc,KAAK,WAAA,CAAY,MAAA,CAAO,CAAC,CAAA,KAAM,CAAA,CAAE,SAAS,IAAI,CAAA;AACjE,IAAA,OAAO,IAAA;AAAA,EACT;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQA,IAAI,IAAA,EAAsC;AACxC,IAAA,OAAO,KAAK,WAAA,CAAY,IAAA,CAAK,CAAC,CAAA,KAAM,CAAA,CAAE,SAAS,IAAI,CAAA;AAAA,EACrD;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,KAAA,GAAkB;AAChB,IAAA,OAAO,KAAK,WAAA,CAAY,GAAA,CAAI,CAAC,CAAA,KAAM,EAAE,IAAI,CAAA;AAAA,EAC3C;AAAA;AAAA;AAAA;AAAA,EAKA,IAAI,MAAA,GAAiB;AACnB,IAAA,OAAO,KAAK,WAAA,CAAY,MAAA;AAAA,EAC1B;AACF,CAAA;;;ACpLO,SAAS,OAAA,CACd,QACA,OAAA,EACyB;AACzB,EAAA,MAAM,EAAE,OAAA,EAAS,UAAA,EAAW,GAAI,mBAAA,EAAoB;AACpD,EAAA,MAAM,KAAA,GAAQ,IAAI,eAAA,CAAgB,UAAU,CAAA;AAE5C,EAAA,MAAM;AAAA,IACJ,EAAA;AAAA,IACA,OAAA;AAAA,IACA,KAAA;AAAA,IACA,KAAA;AAAA,IACA,MAAA;AAAA,IACA,OAAA;AAAA,IACA,MAAA;AAAA,IACA,OAAA,GAAU,IAAA;AAAA,IACV,SAAA;AAAA,IACA;AAAA,GACF,GAAI,WAAW,EAAC;AAGhB,EAAA,MAAM,QAAA,GAAW;AAAA,IACf,MAAA,CAAO,IAAA;AAAA,IACP,EAAA,IAAM,MAAA;AAAA,IACN,EAAE,KAAA,EAAO,KAAA,EAAO,MAAA,EAAQ,OAAA,EAAS,SAAS,MAAA;AAAO,GACnD;AAEA,EAAA,OAAOE,mBAAA,CAAS;AAAA,IACd,QAAA;AAAA,IACA,SAAS,YAAY;AACnB,MAAA,MAAM,GAAA,GAAsB;AAAA,QAC1B,QAAQ,MAAA,CAAO,IAAA;AAAA,QACf,MAAA,EAAQ,EAAA,GAAK,EAAE,EAAA,EAAG,GAAI,MAAA;AAAA,QACtB,MAAA,EAAQ,KAAA;AAAA,QACR,KAAA;AAAA,QACA,MAAA;AAAA,QACA,OAAA;AAAA,QACA,MAAA;AAAA,QACA;AAAA,OACF;AAEA,MAAA,MAAM,aAAA,GAAmC;AAAA,QACvC,GAAG,GAAA;AAAA,QACH,SAAA,EAAW,KAAK,SAAA,GAAY,UAAA;AAAA,QAC5B,UAAU;AAAC,OACb;AAEA,MAAA,MAAM,MAAA,GAAS,MAAM,KAAA,CAAM,OAAA;AAAA,QAAQ,aAAA;AAAA,QAAe,MAChD,KACI,OAAA,CAAQ,OAAA,CAAW,GAAG,CAAA,GACtB,OAAA,CAAQ,SAAY,GAAG;AAAA,OAC7B;AAEA,MAAA,IAAI,OAAO,KAAA,EAAO;AAChB,QAAA,MAAM,MAAA,CAAO,KAAA;AAAA,MACf;AAEA,MAAA,OAAO,MAAA,CAAO,IAAA;AAAA,IAChB,CAAA;AAAA,IACA,OAAA;AAAA,IACA,SAAA;AAAA;AAAA,IAEA,GAAI,eAAA,KAAoB,MAAA,IAAa,EAAE,eAAA;AAA0C,GAClF,CAAA;AACH;AAuDO,SAAS,SAAA,CACd,QACA,OAAA,EACoB;AACpB,EAAA,MAAM,EAAE,OAAA,EAAS,UAAA,EAAW,GAAI,mBAAA,EAAoB;AACpD,EAAA,MAAM,cAAcC,yBAAA,EAAe;AACnC,EAAA,MAAM,KAAA,GAAQ,IAAI,eAAA,CAAgB,UAAU,CAAA;AAE5C,EAAA,MAAM,EAAE,mBAAA,GAAsB,IAAA,EAAM,iBAAA,EAAkB,GAAI,WAAW,EAAC;AAGtE,EAAA,MAAM,aAAa,MAAM;AACvB,IAAA,IAAI,mBAAA,EAAqB;AAEvB,MAAA,WAAA,CAAY,kBAAkB,EAAE,QAAA,EAAU,CAAC,MAAA,CAAO,IAAI,GAAG,CAAA;AAAA,IAC3D;AACA,IAAA,IAAI,iBAAA,EAAmB;AACrB,MAAA,KAAA,MAAW,OAAO,iBAAA,EAAmB;AACnC,QAAA,WAAA,CAAY,iBAAA,CAAkB,EAAE,QAAA,EAAU,GAAA,EAAK,CAAA;AAAA,MACjD;AAAA,IACF;AAAA,EACF,CAAA;AAGA,EAAA,MAAM,SAASC,sBAAA,CAAkC;AAAA,IAC/C,UAAA,EAAY,OAAO,IAAA,KAAS;AAC1B,MAAA,MAAM,GAAA,GAAsB;AAAA,QAC1B,QAAQ,MAAA,CAAO,IAAA;AAAA,QACf;AAAA,OACF;AAEA,MAAA,MAAM,aAAA,GAAmC;AAAA,QACvC,GAAG,GAAA;AAAA,QACH,SAAA,EAAW,QAAA;AAAA,QACX,UAAU;AAAC,OACb;AAEA,MAAA,MAAM,MAAA,GAAS,MAAM,KAAA,CAAM,OAAA;AAAA,QAAQ,aAAA;AAAA,QAAe,MAChD,OAAA,CAAQ,MAAA,CAAU,GAAG;AAAA,OACvB;AAEA,MAAA,IAAI,OAAO,KAAA,EAAO;AAChB,QAAA,MAAM,MAAA,CAAO,KAAA;AAAA,MACf;AAEA,MAAA,OAAO,MAAA,CAAO,IAAA;AAAA,IAChB,CAAA;AAAA,IACA,SAAA,EAAW;AAAA,GACZ,CAAA;AAGD,EAAA,MAAM,SAASA,sBAAA,CAAwD;AAAA,IACrE,UAAA,EAAY,OAAO,EAAE,EAAA,EAAI,MAAK,KAAM;AAClC,MAAA,MAAM,GAAA,GAAsB;AAAA,QAC1B,QAAQ,MAAA,CAAO,IAAA;AAAA,QACf,MAAA,EAAQ,EAAE,EAAA,EAAG;AAAA,QACb;AAAA,OACF;AAEA,MAAA,MAAM,aAAA,GAAmC;AAAA,QACvC,GAAG,GAAA;AAAA,QACH,SAAA,EAAW,QAAA;AAAA,QACX,UAAU;AAAC,OACb;AAEA,MAAA,MAAM,MAAA,GAAS,MAAM,KAAA,CAAM,OAAA;AAAA,QAAQ,aAAA;AAAA,QAAe,MAChD,OAAA,CAAQ,MAAA,CAAU,GAAG;AAAA,OACvB;AAEA,MAAA,IAAI,OAAO,KAAA,EAAO;AAChB,QAAA,MAAM,MAAA,CAAO,KAAA;AAAA,MACf;AAEA,MAAA,OAAO,MAAA,CAAO,IAAA;AAAA,IAChB,CAAA;AAAA,IACA,SAAA,EAAW;AAAA,GACZ,CAAA;AAGD,EAAA,MAAM,SAASA,sBAAA,CAAiC;AAAA,IAC9C,UAAA,EAAY,OAAO,EAAA,KAAO;AACxB,MAAA,MAAM,GAAA,GAAsB;AAAA,QAC1B,QAAQ,MAAA,CAAO,IAAA;AAAA,QACf,MAAA,EAAQ,EAAE,EAAA;AAAG,OACf;AAEA,MAAA,MAAM,aAAA,GAAmC;AAAA,QACvC,GAAG,GAAA;AAAA,QACH,SAAA,EAAW,QAAA;AAAA,QACX,UAAU;AAAC,OACb;AAEA,MAAA,MAAM,MAAA,GAAS,MAAM,KAAA,CAAM,OAAA;AAAA,QAAQ,aAAA;AAAA,QAAe,MAChD,OAAA,CAAQ,MAAA,CAAO,GAAG;AAAA,OACpB;AAEA,MAAA,IAAI,OAAO,KAAA,EAAO;AAChB,QAAA,MAAM,MAAA,CAAO,KAAA;AAAA,MACf;AAAA,IACF,CAAA;AAAA,IACA,SAAA,EAAW;AAAA,GACZ,CAAA;AAED,EAAA,OAAO,EAAE,MAAA,EAAQ,MAAA,EAAQ,MAAA,EAAO;AAClC;AAgCO,SAAS,OAAA,CACd,MACA,OAAA,EACmB;AACnB,EAAA,MAAM,EAAE,OAAA,EAAS,UAAA,EAAW,GAAI,mBAAA,EAAoB;AACpD,EAAA,MAAM,KAAA,GAAQ,IAAI,eAAA,CAAgB,UAAU,CAAA;AAE5C,EAAA,MAAM,EAAE,QAAQ,OAAA,GAAU,IAAA,EAAM,WAAW,eAAA,EAAgB,GAAI,WAAW,EAAC;AAG3E,EAAA,MAAM,QAAA,GAAW,CAAC,MAAA,EAAQ,IAAA,CAAK,MAAM,MAAM,CAAA;AAE3C,EAAA,OAAOF,mBAAA,CAAS;AAAA,IACd,QAAA;AAAA,IACA,SAAS,YAAY;AAEnB,MAAA,IAAI,WAAW,IAAA,CAAK,QAAA;AACpB,MAAA,IAAI,MAAA,EAAQ;AACV,QAAA,KAAA,MAAW,CAAC,GAAA,EAAK,KAAK,KAAK,MAAA,CAAO,OAAA,CAAQ,MAAM,CAAA,EAAG;AACjD,UAAA,QAAA,GAAW,QAAA,CAAS,OAAA,CAAQ,CAAA,CAAA,EAAI,GAAG,IAAI,KAAK,CAAA;AAAA,QAC9C;AAAA,MACF;AAEA,MAAA,MAAM,GAAA,GAAsB;AAAA,QAC1B,QAAQ,IAAA,CAAK,IAAA;AAAA,QACb,QAAA;AAAA,QACA;AAAA,OACF;AAEA,MAAA,MAAM,aAAA,GAAmC;AAAA,QACvC,GAAG,GAAA;AAAA,QACH,SAAA,EAAW,MAAA;AAAA,QACX,UAAU;AAAC,OACb;AAEA,MAAA,MAAM,MAAA,GAAS,MAAM,KAAA,CAAM,OAAA;AAAA,QAAQ,aAAA;AAAA,QAAe,MAChD,OAAA,CAAQ,OAAA,CAAW,GAAG;AAAA,OACxB;AAEA,MAAA,IAAI,OAAO,KAAA,EAAO;AAChB,QAAA,MAAM,MAAA,CAAO,KAAA;AAAA,MACf;AAEA,MAAA,OAAO,MAAA,CAAO,IAAA;AAAA,IAChB,CAAA;AAAA,IACA,OAAA;AAAA,IACA,SAAA;AAAA;AAAA,IAEA,GAAI,eAAA,KAAoB,MAAA,IAAa,EAAE,eAAA;AAA0C,GAClF,CAAA;AACH;AAkBO,SAAS,YAAe,MAAA,EAAyB;AACtD,EAAA,MAAM,cAAcC,yBAAA,EAAe;AACnC,EAAA,MAAM,EAAE,OAAA,EAAQ,GAAI,mBAAA,EAAoB;AAExC,EAAA,OAAO,CAAC,OAAA,KAAgC;AACtC,IAAA,MAAM,EAAE,IAAI,KAAA,EAAO,KAAA,EAAO,QAAQ,OAAA,EAAQ,GAAI,WAAW,EAAC;AAC1D,IAAA,MAAM,QAAA,GAAW,CAAC,MAAA,CAAO,IAAA,EAAM,EAAA,IAAM,MAAA,EAAQ,EAAE,KAAA,EAAO,KAAA,EAAO,MAAA,EAAQ,OAAA,EAAS,CAAA;AAE9E,IAAA,OAAO,YAAY,aAAA,CAAc;AAAA,MAC/B,QAAA;AAAA,MACA,SAAS,YAAY;AACnB,QAAA,MAAM,GAAA,GAAsB;AAAA,UAC1B,QAAQ,MAAA,CAAO,IAAA;AAAA,UACf,MAAA,EAAQ,EAAA,GAAK,EAAE,EAAA,EAAG,GAAI,MAAA;AAAA,UACtB,MAAA,EAAQ,KAAA;AAAA,UACR,KAAA;AAAA,UACA,MAAA;AAAA,UACA;AAAA,SACF;AAEA,QAAA,MAAM,MAAA,GAAS,EAAA,GACX,MAAM,OAAA,CAAQ,OAAA,CAAW,GAAG,CAAA,GAC5B,MAAM,OAAA,CAAQ,QAAA,CAAY,GAAG,CAAA;AAEjC,QAAA,IAAI,OAAO,KAAA,EAAO;AAChB,UAAA,MAAM,MAAA,CAAO,KAAA;AAAA,QACf;AAEA,QAAA,OAAO,MAAA,CAAO,IAAA;AAAA,MAChB;AAAA,KACD,CAAA;AAAA,EACH,CAAA;AACF","file":"index.js","sourcesContent":["/**\n * DataLayer Context - React context for data layer configuration\n *\n * Provides adapter and query client access throughout the React tree.\n *\n * @module react/context\n * @category React\n */\n\nimport { createContext, useContext } from 'react';\nimport type { QueryClient } from '@tanstack/react-query';\nimport type { Adapter } from '../adapters/types';\nimport type { Middleware } from '../middleware/types';\nimport type { EntitySchema } from '../schema/types';\n\n/**\n * Value provided by the DataLayer context.\n */\nexport interface DataLayerContextValue {\n /** The adapter to use for data operations */\n adapter: Adapter;\n /** React Query client instance */\n queryClient: QueryClient;\n /** Registered entity schemas */\n schemas: Map<string, EntitySchema>;\n /** Middleware chain */\n middleware: Middleware[];\n /** Get schema by entity name */\n getSchema: (name: string) => EntitySchema | undefined;\n}\n\n/**\n * React context for the data layer.\n *\n * Holds the adapter, query client, and schema registry.\n */\nexport const DataLayerContext = createContext<DataLayerContextValue | null>(null);\n\n/**\n * Hook to access the DataLayer context.\n *\n * @returns The DataLayer context value\n * @throws Error if used outside of DataLayerProvider\n *\n * @example\n * ```typescript\n * function MyComponent() {\n * const { adapter, queryClient } = useDataLayerContext();\n *\n * const handleRefresh = () => {\n * queryClient.invalidateQueries();\n * };\n *\n * return <button onClick={handleRefresh}>Refresh</button>;\n * }\n * ```\n */\nexport function useDataLayerContext(): DataLayerContextValue {\n const context = useContext(DataLayerContext);\n\n if (!context) {\n throw new Error(\n 'useDataLayerContext must be used within a DataLayerProvider. ' +\n 'Wrap your app with <DataLayerProvider adapter={adapter}>...</DataLayerProvider>'\n );\n }\n\n return context;\n}\n\n/**\n * Hook to get the current adapter.\n *\n * @returns The adapter instance\n *\n * @example\n * ```typescript\n * function MyComponent() {\n * const adapter = useAdapter();\n * // Use adapter directly for custom operations\n * }\n * ```\n */\nexport function useAdapter(): Adapter {\n return useDataLayerContext().adapter;\n}\n\n/**\n * Hook to get the query client.\n *\n * @returns The QueryClient instance\n */\nexport function useQueryClientFromContext(): QueryClient {\n return useDataLayerContext().queryClient;\n}\n","/**\n * DataLayerProvider - React context provider for data layer\n *\n * Wraps your application to provide adapter and query client\n * to all data hooks.\n *\n * @module react/provider\n * @category React\n */\n\nimport React, { useMemo, type ReactNode } from 'react';\nimport { QueryClient, QueryClientProvider } from '@tanstack/react-query';\nimport type { Adapter } from '../adapters/types';\nimport type { Middleware } from '../middleware/types';\nimport type { EntitySchema } from '../schema/types';\nimport { DataLayerContext, type DataLayerContextValue } from './context';\n\n/**\n * Props for the DataLayerProvider component.\n */\nexport interface DataLayerProviderProps {\n /** The adapter to use for data operations */\n adapter: Adapter;\n /** Entity schemas to register */\n schemas?: EntitySchema[];\n /** Middleware chain to apply */\n middleware?: Middleware[];\n /** Custom QueryClient (optional, will create one if not provided) */\n queryClient?: QueryClient;\n /** Default query options */\n defaultOptions?: {\n /** Default stale time in ms */\n staleTime?: number;\n /** Default cache time in ms */\n cacheTime?: number;\n /** Default retry count */\n retry?: number;\n };\n /** Child components */\n children: ReactNode;\n}\n\n/**\n * DataLayerProvider component.\n *\n * Provides the data layer context to all child components,\n * enabling the use of useData, useMutate, and useView hooks.\n *\n * @example\n * ```typescript\n * import { DataLayerProvider } from 'schemock/react';\n * import { createMockAdapter } from 'schemock/adapters';\n *\n * const adapter = createMockAdapter([userSchema, postSchema]);\n *\n * function App() {\n * return (\n * <DataLayerProvider adapter={adapter} schemas={[userSchema, postSchema]}>\n * <MyApp />\n * </DataLayerProvider>\n * );\n * }\n * ```\n *\n * @example\n * ```typescript\n * // With custom query client and middleware\n * const queryClient = new QueryClient({\n * defaultOptions: { queries: { staleTime: 5000 } },\n * });\n *\n * function App() {\n * return (\n * <DataLayerProvider\n * adapter={adapter}\n * schemas={schemas}\n * queryClient={queryClient}\n * middleware={[authMiddleware, loggerMiddleware]}\n * >\n * <MyApp />\n * </DataLayerProvider>\n * );\n * }\n * ```\n */\nexport const DataLayerProvider: React.FC<DataLayerProviderProps> = ({\n adapter,\n schemas = [],\n middleware = [],\n queryClient: providedQueryClient,\n defaultOptions,\n children,\n}) => {\n // Create or use provided QueryClient\n const queryClient = useMemo(() => {\n if (providedQueryClient) {\n return providedQueryClient;\n }\n\n return new QueryClient({\n defaultOptions: {\n queries: {\n staleTime: defaultOptions?.staleTime ?? 0,\n gcTime: defaultOptions?.cacheTime ?? 5 * 60 * 1000,\n retry: defaultOptions?.retry ?? 3,\n refetchOnWindowFocus: false,\n },\n mutations: {\n retry: defaultOptions?.retry ?? 0,\n },\n },\n });\n }, [providedQueryClient, defaultOptions]);\n\n // Create schema registry\n const schemaMap = useMemo(() => {\n const map = new Map<string, EntitySchema>();\n for (const schema of schemas) {\n map.set(schema.name, schema);\n }\n return map;\n }, [schemas]);\n\n // Create context value\n const contextValue: DataLayerContextValue = useMemo(\n () => ({\n adapter,\n queryClient,\n schemas: schemaMap,\n middleware,\n getSchema: (name: string) => schemaMap.get(name),\n }),\n [adapter, queryClient, schemaMap, middleware]\n );\n\n return (\n <QueryClientProvider client={queryClient}>\n <DataLayerContext.Provider value={contextValue}>\n {children}\n </DataLayerContext.Provider>\n </QueryClientProvider>\n );\n};\n","/**\n * MiddlewareChain - Executor for composable middleware\n *\n * Chains middleware in order, executing before hooks, the handler,\n * and after hooks in sequence.\n *\n * @module middleware/chain\n * @category Middleware\n */\n\nimport type { AdapterResponse } from '../adapters/types';\nimport type { Middleware, MiddlewareContext, MiddlewareResult } from './types';\n\n/**\n * MiddlewareChain class for executing middleware in sequence.\n *\n * Supports both hook-based middleware (before/after/onError) and\n * function-based middleware (Koa-style handler).\n *\n * @example\n * ```typescript\n * const chain = new MiddlewareChain([\n * createAuthMiddleware({ getToken: () => 'token' }),\n * createLoggerMiddleware(),\n * createCacheMiddleware({ ttl: 60000 }),\n * ]);\n *\n * const result = await chain.execute(ctx, async () => {\n * return adapter.findMany(ctx);\n * });\n * ```\n */\nexport class MiddlewareChain {\n /** The middleware stack */\n private middlewares: Middleware[];\n\n /**\n * Create a new MiddlewareChain.\n *\n * @param middlewares - Array of middleware to execute in order\n */\n constructor(middlewares: Middleware[]) {\n this.middlewares = middlewares.filter((m) => m.enabled !== false);\n }\n\n /**\n * Execute the middleware chain with the given handler.\n *\n * @param ctx - The middleware context\n * @param handler - The final handler (adapter call)\n * @returns The response after all middleware processing\n *\n * @example\n * ```typescript\n * const result = await chain.execute<User[]>(\n * { entity: 'user', operation: 'findMany', metadata: {} },\n * () => adapter.findMany({ entity: 'user' })\n * );\n * ```\n */\n async execute<T>(\n ctx: MiddlewareContext,\n handler: () => Promise<AdapterResponse<T>>\n ): Promise<AdapterResponse<T>> {\n // Set start time for timing middleware\n ctx.startTime = Date.now();\n ctx.metadata = ctx.metadata ?? {};\n\n // Check if any middleware uses function-style handlers\n const hasFunctionHandlers = this.middlewares.some((m) => m.handler);\n\n if (hasFunctionHandlers) {\n return this.executeFunctionStyle(ctx, handler);\n }\n\n return this.executeHookStyle(ctx, handler);\n }\n\n /**\n * Execute middleware using hook-style (before/after/onError).\n */\n private async executeHookStyle<T>(\n ctx: MiddlewareContext,\n handler: () => Promise<AdapterResponse<T>>\n ): Promise<AdapterResponse<T>> {\n // Execute all 'before' hooks\n for (const middleware of this.middlewares) {\n if (middleware.before) {\n const result = await middleware.before(ctx);\n if (result && !result.continue) {\n // Short-circuit with provided response\n if (result.response) {\n return result.response as AdapterResponse<T>;\n }\n if (result.error) {\n throw result.error;\n }\n }\n }\n }\n\n // Execute the main handler\n let response: AdapterResponse<T>;\n try {\n response = await handler();\n } catch (error) {\n // Execute onError hooks\n for (const middleware of this.middlewares) {\n if (middleware.onError) {\n const result = await middleware.onError(\n ctx,\n error instanceof Error ? error : new Error(String(error))\n );\n if (result && !result.continue) {\n if (result.response) {\n return result.response as AdapterResponse<T>;\n }\n if (result.error) {\n throw result.error;\n }\n }\n }\n }\n // Re-throw if not handled\n throw error;\n }\n\n // Execute all 'after' hooks in reverse order\n for (let i = this.middlewares.length - 1; i >= 0; i--) {\n const middleware = this.middlewares[i];\n if (middleware.after) {\n response = await middleware.after(ctx, response);\n }\n }\n\n return response;\n }\n\n /**\n * Execute middleware using function-style (Koa-like compose).\n */\n private async executeFunctionStyle<T>(\n ctx: MiddlewareContext,\n handler: () => Promise<AdapterResponse<T>>\n ): Promise<AdapterResponse<T>> {\n // Build the middleware stack from right to left\n let index = -1;\n\n const dispatch = async (i: number): Promise<AdapterResponse<T>> => {\n if (i <= index) {\n throw new Error('next() called multiple times');\n }\n index = i;\n\n if (i >= this.middlewares.length) {\n // End of middleware chain, execute handler\n return handler();\n }\n\n const middleware = this.middlewares[i];\n\n if (middleware.handler) {\n // Function-style middleware\n return middleware.handler(ctx, () => dispatch(i + 1));\n }\n\n // Hook-style middleware in function chain\n if (middleware.before) {\n const result = await middleware.before(ctx);\n if (result && !result.continue) {\n if (result.response) {\n return result.response as AdapterResponse<T>;\n }\n if (result.error) {\n throw result.error;\n }\n }\n }\n\n let response: AdapterResponse<T>;\n try {\n response = await dispatch(i + 1);\n } catch (error) {\n if (middleware.onError) {\n const result = await middleware.onError(\n ctx,\n error instanceof Error ? error : new Error(String(error))\n );\n if (result && !result.continue) {\n if (result.response) {\n return result.response as AdapterResponse<T>;\n }\n if (result.error) {\n throw result.error;\n }\n }\n }\n throw error;\n }\n\n if (middleware.after) {\n response = await middleware.after(ctx, response);\n }\n\n return response;\n };\n\n return dispatch(0);\n }\n\n /**\n * Add middleware to the chain.\n *\n * @param middleware - Middleware to add\n */\n use(middleware: Middleware): this {\n if (middleware.enabled !== false) {\n this.middlewares.push(middleware);\n }\n return this;\n }\n\n /**\n * Remove middleware by name.\n *\n * @param name - Name of middleware to remove\n */\n remove(name: string): this {\n this.middlewares = this.middlewares.filter((m) => m.name !== name);\n return this;\n }\n\n /**\n * Get middleware by name.\n *\n * @param name - Middleware name\n * @returns The middleware or undefined\n */\n get(name: string): Middleware | undefined {\n return this.middlewares.find((m) => m.name === name);\n }\n\n /**\n * Get all middleware names.\n *\n * @returns Array of middleware names\n */\n names(): string[] {\n return this.middlewares.map((m) => m.name);\n }\n\n /**\n * Get the middleware count.\n */\n get length(): number {\n return this.middlewares.length;\n }\n}\n\n/**\n * Create a middleware chain from an array of middleware.\n *\n * @param middlewares - Array of middleware\n * @returns A configured MiddlewareChain\n *\n * @example\n * ```typescript\n * const chain = createMiddlewareChain([\n * createAuthMiddleware({ getToken: () => token }),\n * createLoggerMiddleware(),\n * ]);\n * ```\n */\nexport function createMiddlewareChain(middlewares: Middleware[]): MiddlewareChain {\n return new MiddlewareChain(middlewares);\n}\n","/**\n * React Hooks - Data fetching and mutation hooks\n *\n * Provides useData, useMutate, and useView hooks for\n * React Query integration with Schemock.\n *\n * @module react/hooks\n * @category React\n */\n\nimport {\n useQuery,\n useMutation,\n useQueryClient,\n type UseQueryResult,\n type UseMutationResult,\n} from '@tanstack/react-query';\nimport type { EntitySchema, ViewSchema } from '../schema/types';\nimport type { AdapterContext, AdapterResponse } from '../adapters/types';\nimport { useDataLayerContext } from './context';\nimport { MiddlewareChain } from '../middleware/chain';\nimport type { MiddlewareContext } from '../middleware/types';\n\n/**\n * Options for useData hook.\n */\nexport interface UseDataOptions<T> {\n /** Fetch single entity by ID */\n id?: string;\n /** Relations to include */\n include?: string[];\n /** Filter conditions */\n where?: Record<string, unknown>;\n /** Number of items to fetch */\n limit?: number;\n /** Pagination offset */\n offset?: number;\n /** Ordering */\n orderBy?: Record<string, 'asc' | 'desc'>;\n /** Fields to select */\n select?: string[];\n /** Whether the query is enabled */\n enabled?: boolean;\n /** Stale time in ms */\n staleTime?: number;\n /** Placeholder data */\n placeholderData?: T | T[];\n}\n\n/**\n * useData hook for fetching entities.\n *\n * Fetches single or multiple entities based on options.\n *\n * @param entity - The entity schema to fetch\n * @param options - Query options\n * @returns React Query result\n *\n * @example\n * ```typescript\n * // Fetch single entity\n * const { data: user } = useData(userSchema, { id: '123' });\n *\n * // Fetch multiple entities\n * const { data: users } = useData(userSchema, {\n * where: { role: 'admin' },\n * limit: 10,\n * orderBy: { createdAt: 'desc' },\n * });\n *\n * // Fetch with relations\n * const { data: user } = useData(userSchema, {\n * id: '123',\n * include: ['posts', 'comments'],\n * });\n * ```\n */\nexport function useData<T>(\n entity: EntitySchema<T>,\n options?: UseDataOptions<T>\n): UseQueryResult<T | T[]> {\n const { adapter, middleware } = useDataLayerContext();\n const chain = new MiddlewareChain(middleware);\n\n const {\n id,\n include,\n where,\n limit,\n offset,\n orderBy,\n select,\n enabled = true,\n staleTime,\n placeholderData,\n } = options ?? {};\n\n // Build query key\n const queryKey = [\n entity.name,\n id ?? 'list',\n { where, limit, offset, orderBy, include, select },\n ];\n\n return useQuery({\n queryKey,\n queryFn: async () => {\n const ctx: AdapterContext = {\n entity: entity.name,\n params: id ? { id } : undefined,\n filter: where,\n limit,\n offset,\n orderBy,\n select,\n include,\n };\n\n const middlewareCtx: MiddlewareContext = {\n ...ctx,\n operation: id ? 'findOne' : 'findMany',\n metadata: {},\n };\n\n const result = await chain.execute(middlewareCtx, () =>\n id\n ? adapter.findOne<T>(ctx)\n : adapter.findMany<T>(ctx) as unknown as Promise<AdapterResponse<T>>\n );\n\n if (result.error) {\n throw result.error;\n }\n\n return result.data;\n },\n enabled,\n staleTime,\n // Cast needed for React Query v5's strict NonFunctionGuard type checking\n ...(placeholderData !== undefined && { placeholderData: placeholderData as never }),\n });\n}\n\n/**\n * Result from useMutate hook.\n */\nexport interface UseMutateResult<T> {\n /** Create mutation */\n create: UseMutationResult<T, Error, Partial<T>>;\n /** Update mutation */\n update: UseMutationResult<T, Error, { id: string; data: Partial<T> }>;\n /** Delete mutation */\n remove: UseMutationResult<void, Error, string>;\n}\n\n/**\n * Options for useMutate hook.\n */\nexport interface UseMutateOptions {\n /** Invalidate queries on success */\n invalidateOnSuccess?: boolean;\n /** Specific query keys to invalidate */\n invalidateQueries?: unknown[][];\n /** Optimistic update function */\n onOptimisticUpdate?: () => void;\n}\n\n/**\n * useMutate hook for CRUD mutations.\n *\n * Provides create, update, and delete mutations for an entity.\n *\n * @param entity - The entity schema\n * @param options - Mutation options\n * @returns Object with create, update, and remove mutations\n *\n * @example\n * ```typescript\n * const { create, update, remove } = useMutate(userSchema);\n *\n * // Create\n * const handleCreate = async () => {\n * await create.mutateAsync({ name: 'John', email: 'john@example.com' });\n * };\n *\n * // Update\n * const handleUpdate = async (id: string) => {\n * await update.mutateAsync({ id, data: { name: 'Jane' } });\n * };\n *\n * // Delete\n * const handleDelete = async (id: string) => {\n * await remove.mutateAsync(id);\n * };\n * ```\n */\nexport function useMutate<T>(\n entity: EntitySchema<T>,\n options?: UseMutateOptions\n): UseMutateResult<T> {\n const { adapter, middleware } = useDataLayerContext();\n const queryClient = useQueryClient();\n const chain = new MiddlewareChain(middleware);\n\n const { invalidateOnSuccess = true, invalidateQueries } = options ?? {};\n\n // Helper to invalidate queries\n const invalidate = () => {\n if (invalidateOnSuccess) {\n // Invalidate all queries for this entity\n queryClient.invalidateQueries({ queryKey: [entity.name] });\n }\n if (invalidateQueries) {\n for (const key of invalidateQueries) {\n queryClient.invalidateQueries({ queryKey: key });\n }\n }\n };\n\n // Create mutation\n const create = useMutation<T, Error, Partial<T>>({\n mutationFn: async (data) => {\n const ctx: AdapterContext = {\n entity: entity.name,\n data,\n };\n\n const middlewareCtx: MiddlewareContext = {\n ...ctx,\n operation: 'create',\n metadata: {},\n };\n\n const result = await chain.execute(middlewareCtx, () =>\n adapter.create<T>(ctx)\n );\n\n if (result.error) {\n throw result.error;\n }\n\n return result.data;\n },\n onSuccess: invalidate,\n });\n\n // Update mutation\n const update = useMutation<T, Error, { id: string; data: Partial<T> }>({\n mutationFn: async ({ id, data }) => {\n const ctx: AdapterContext = {\n entity: entity.name,\n params: { id },\n data,\n };\n\n const middlewareCtx: MiddlewareContext = {\n ...ctx,\n operation: 'update',\n metadata: {},\n };\n\n const result = await chain.execute(middlewareCtx, () =>\n adapter.update<T>(ctx)\n );\n\n if (result.error) {\n throw result.error;\n }\n\n return result.data;\n },\n onSuccess: invalidate,\n });\n\n // Delete mutation\n const remove = useMutation<void, Error, string>({\n mutationFn: async (id) => {\n const ctx: AdapterContext = {\n entity: entity.name,\n params: { id },\n };\n\n const middlewareCtx: MiddlewareContext = {\n ...ctx,\n operation: 'delete',\n metadata: {},\n };\n\n const result = await chain.execute(middlewareCtx, () =>\n adapter.delete(ctx)\n );\n\n if (result.error) {\n throw result.error;\n }\n },\n onSuccess: invalidate,\n });\n\n return { create, update, remove };\n}\n\n/**\n * Options for useView hook.\n */\nexport interface UseViewOptions<T> {\n /** URL parameters for the view */\n params?: Record<string, string>;\n /** Whether the query is enabled */\n enabled?: boolean;\n /** Stale time in ms */\n staleTime?: number;\n /** Placeholder data */\n placeholderData?: T;\n}\n\n/**\n * useView hook for fetching computed views.\n *\n * Fetches data from a view schema endpoint.\n *\n * @param view - The view schema\n * @param options - View options\n * @returns React Query result\n *\n * @example\n * ```typescript\n * const userFullView = defineView('user-full', ...);\n *\n * const { data } = useView(userFullView, { params: { id: '123' } });\n * ```\n */\nexport function useView<T>(\n view: ViewSchema,\n options?: UseViewOptions<T>\n): UseQueryResult<T> {\n const { adapter, middleware } = useDataLayerContext();\n const chain = new MiddlewareChain(middleware);\n\n const { params, enabled = true, staleTime, placeholderData } = options ?? {};\n\n // Build query key\n const queryKey = ['view', view.name, params];\n\n return useQuery({\n queryKey,\n queryFn: async () => {\n // Build endpoint with params\n let endpoint = view.endpoint;\n if (params) {\n for (const [key, value] of Object.entries(params)) {\n endpoint = endpoint.replace(`:${key}`, value);\n }\n }\n\n const ctx: AdapterContext = {\n entity: view.name,\n endpoint,\n params,\n };\n\n const middlewareCtx: MiddlewareContext = {\n ...ctx,\n operation: 'view',\n metadata: {},\n };\n\n const result = await chain.execute(middlewareCtx, () =>\n adapter.findOne<T>(ctx)\n );\n\n if (result.error) {\n throw result.error;\n }\n\n return result.data;\n },\n enabled,\n staleTime,\n // Cast needed for React Query v5's strict NonFunctionGuard type checking\n ...(placeholderData !== undefined && { placeholderData: placeholderData as never }),\n });\n}\n\n/**\n * Hook to prefetch data.\n *\n * @param entity - The entity schema\n * @param options - Data options\n *\n * @example\n * ```typescript\n * const prefetchUser = usePrefetch(userSchema);\n *\n * // Prefetch on hover\n * <div onMouseEnter={() => prefetchUser({ id: '123' })}>\n * User Profile\n * </div>\n * ```\n */\nexport function usePrefetch<T>(entity: EntitySchema<T>) {\n const queryClient = useQueryClient();\n const { adapter } = useDataLayerContext();\n\n return (options?: UseDataOptions<T>) => {\n const { id, where, limit, offset, orderBy } = options ?? {};\n const queryKey = [entity.name, id ?? 'list', { where, limit, offset, orderBy }];\n\n return queryClient.prefetchQuery({\n queryKey,\n queryFn: async () => {\n const ctx: AdapterContext = {\n entity: entity.name,\n params: id ? { id } : undefined,\n filter: where,\n limit,\n offset,\n orderBy,\n };\n\n const result = id\n ? await adapter.findOne<T>(ctx)\n : await adapter.findMany<T>(ctx);\n\n if (result.error) {\n throw result.error;\n }\n\n return result.data;\n },\n });\n };\n}\n"]}