@gettersethya/mira-client 0.1.0-alpha.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.
Files changed (168) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +140 -0
  3. package/dist/src/client/auth.d.ts +73 -0
  4. package/dist/src/client/auth.d.ts.map +1 -0
  5. package/dist/src/client/auth.js +72 -0
  6. package/dist/src/client/auth.js.map +1 -0
  7. package/dist/src/client/collection.d.ts +239 -0
  8. package/dist/src/client/collection.d.ts.map +1 -0
  9. package/dist/src/client/collection.js +137 -0
  10. package/dist/src/client/collection.js.map +1 -0
  11. package/dist/src/client/errors.d.ts +46 -0
  12. package/dist/src/client/errors.d.ts.map +1 -0
  13. package/dist/src/client/errors.js +40 -0
  14. package/dist/src/client/errors.js.map +1 -0
  15. package/dist/src/client/factory.d.ts +78 -0
  16. package/dist/src/client/factory.d.ts.map +1 -0
  17. package/dist/src/client/factory.js +108 -0
  18. package/dist/src/client/factory.js.map +1 -0
  19. package/dist/src/client/file.d.ts +116 -0
  20. package/dist/src/client/file.d.ts.map +1 -0
  21. package/dist/src/client/file.js +99 -0
  22. package/dist/src/client/file.js.map +1 -0
  23. package/dist/src/client/handler.d.ts +92 -0
  24. package/dist/src/client/handler.d.ts.map +1 -0
  25. package/dist/src/client/handler.js +62 -0
  26. package/dist/src/client/handler.js.map +1 -0
  27. package/dist/src/client/index.d.ts +13 -0
  28. package/dist/src/client/index.d.ts.map +1 -0
  29. package/dist/src/client/index.js +7 -0
  30. package/dist/src/client/index.js.map +1 -0
  31. package/dist/src/client/telemetry.d.ts +50 -0
  32. package/dist/src/client/telemetry.d.ts.map +1 -0
  33. package/dist/src/client/telemetry.js +32 -0
  34. package/dist/src/client/telemetry.js.map +1 -0
  35. package/dist/src/client/types.d.ts +137 -0
  36. package/dist/src/client/types.d.ts.map +1 -0
  37. package/dist/src/client/types.js +2 -0
  38. package/dist/src/client/types.js.map +1 -0
  39. package/dist/src/collection/auth.d.ts +79 -0
  40. package/dist/src/collection/auth.d.ts.map +1 -0
  41. package/dist/src/collection/auth.js +50 -0
  42. package/dist/src/collection/auth.js.map +1 -0
  43. package/dist/src/collection/base.d.ts +64 -0
  44. package/dist/src/collection/base.d.ts.map +1 -0
  45. package/dist/src/collection/base.js +40 -0
  46. package/dist/src/collection/base.js.map +1 -0
  47. package/dist/src/collection/bytes.d.ts +51 -0
  48. package/dist/src/collection/bytes.d.ts.map +1 -0
  49. package/dist/src/collection/bytes.js +51 -0
  50. package/dist/src/collection/bytes.js.map +1 -0
  51. package/dist/src/collection/errors.d.ts +29 -0
  52. package/dist/src/collection/errors.d.ts.map +1 -0
  53. package/dist/src/collection/errors.js +23 -0
  54. package/dist/src/collection/errors.js.map +1 -0
  55. package/dist/src/collection/field.d.ts +300 -0
  56. package/dist/src/collection/field.d.ts.map +1 -0
  57. package/dist/src/collection/field.js +175 -0
  58. package/dist/src/collection/field.js.map +1 -0
  59. package/dist/src/collection/index-builder.d.ts +59 -0
  60. package/dist/src/collection/index-builder.d.ts.map +1 -0
  61. package/dist/src/collection/index-builder.js +43 -0
  62. package/dist/src/collection/index-builder.js.map +1 -0
  63. package/dist/src/collection/index.d.ts +22 -0
  64. package/dist/src/collection/index.d.ts.map +1 -0
  65. package/dist/src/collection/index.js +21 -0
  66. package/dist/src/collection/index.js.map +1 -0
  67. package/dist/src/collection/serialize.d.ts +24 -0
  68. package/dist/src/collection/serialize.d.ts.map +1 -0
  69. package/dist/src/collection/serialize.js +127 -0
  70. package/dist/src/collection/serialize.js.map +1 -0
  71. package/dist/src/collection/types.d.ts +119 -0
  72. package/dist/src/collection/types.d.ts.map +1 -0
  73. package/dist/src/collection/types.js +2 -0
  74. package/dist/src/collection/types.js.map +1 -0
  75. package/dist/src/collection/view.d.ts +57 -0
  76. package/dist/src/collection/view.d.ts.map +1 -0
  77. package/dist/src/collection/view.js +49 -0
  78. package/dist/src/collection/view.js.map +1 -0
  79. package/dist/src/filter/builder.d.ts +127 -0
  80. package/dist/src/filter/builder.d.ts.map +1 -0
  81. package/dist/src/filter/builder.js +72 -0
  82. package/dist/src/filter/builder.js.map +1 -0
  83. package/dist/src/filter/compiler.d.ts +48 -0
  84. package/dist/src/filter/compiler.d.ts.map +1 -0
  85. package/dist/src/filter/compiler.js +132 -0
  86. package/dist/src/filter/compiler.js.map +1 -0
  87. package/dist/src/filter/index.d.ts +6 -0
  88. package/dist/src/filter/index.d.ts.map +1 -0
  89. package/dist/src/filter/index.js +4 -0
  90. package/dist/src/filter/index.js.map +1 -0
  91. package/dist/src/filter/types.d.ts +96 -0
  92. package/dist/src/filter/types.d.ts.map +1 -0
  93. package/dist/src/filter/types.js +44 -0
  94. package/dist/src/filter/types.js.map +1 -0
  95. package/dist/src/index.d.ts +3 -0
  96. package/dist/src/index.d.ts.map +1 -0
  97. package/dist/src/index.js +3 -0
  98. package/dist/src/index.js.map +1 -0
  99. package/dist/src/rule/builder.d.ts +97 -0
  100. package/dist/src/rule/builder.d.ts.map +1 -0
  101. package/dist/src/rule/builder.js +126 -0
  102. package/dist/src/rule/builder.js.map +1 -0
  103. package/dist/src/rule/index.d.ts +3 -0
  104. package/dist/src/rule/index.d.ts.map +1 -0
  105. package/dist/src/rule/index.js +3 -0
  106. package/dist/src/rule/index.js.map +1 -0
  107. package/dist/src/rule/types.d.ts +129 -0
  108. package/dist/src/rule/types.d.ts.map +1 -0
  109. package/dist/src/rule/types.js +2 -0
  110. package/dist/src/rule/types.js.map +1 -0
  111. package/dist/tests/client/auth.test.d.ts +2 -0
  112. package/dist/tests/client/auth.test.d.ts.map +1 -0
  113. package/dist/tests/client/auth.test.js +67 -0
  114. package/dist/tests/client/auth.test.js.map +1 -0
  115. package/dist/tests/client/collection.test.d.ts +2 -0
  116. package/dist/tests/client/collection.test.d.ts.map +1 -0
  117. package/dist/tests/client/collection.test.js +593 -0
  118. package/dist/tests/client/collection.test.js.map +1 -0
  119. package/dist/tests/client/file.test.d.ts +2 -0
  120. package/dist/tests/client/file.test.d.ts.map +1 -0
  121. package/dist/tests/client/file.test.js +21 -0
  122. package/dist/tests/client/file.test.js.map +1 -0
  123. package/dist/tests/client/handler.test.d.ts +2 -0
  124. package/dist/tests/client/handler.test.d.ts.map +1 -0
  125. package/dist/tests/client/handler.test.js +24 -0
  126. package/dist/tests/client/handler.test.js.map +1 -0
  127. package/dist/tests/client/types.test.d.ts +2 -0
  128. package/dist/tests/client/types.test.d.ts.map +1 -0
  129. package/dist/tests/client/types.test.js +168 -0
  130. package/dist/tests/client/types.test.js.map +1 -0
  131. package/dist/tests/collection/auth.test.d.ts +2 -0
  132. package/dist/tests/collection/auth.test.d.ts.map +1 -0
  133. package/dist/tests/collection/auth.test.js +44 -0
  134. package/dist/tests/collection/auth.test.js.map +1 -0
  135. package/dist/tests/collection/base.test.d.ts +2 -0
  136. package/dist/tests/collection/base.test.d.ts.map +1 -0
  137. package/dist/tests/collection/base.test.js +70 -0
  138. package/dist/tests/collection/base.test.js.map +1 -0
  139. package/dist/tests/collection/bytes.test.d.ts +2 -0
  140. package/dist/tests/collection/bytes.test.d.ts.map +1 -0
  141. package/dist/tests/collection/bytes.test.js +9 -0
  142. package/dist/tests/collection/bytes.test.js.map +1 -0
  143. package/dist/tests/collection/field.test.d.ts +2 -0
  144. package/dist/tests/collection/field.test.d.ts.map +1 -0
  145. package/dist/tests/collection/field.test.js +140 -0
  146. package/dist/tests/collection/field.test.js.map +1 -0
  147. package/dist/tests/collection/index-type.test.d.ts +2 -0
  148. package/dist/tests/collection/index-type.test.d.ts.map +1 -0
  149. package/dist/tests/collection/index-type.test.js +28 -0
  150. package/dist/tests/collection/index-type.test.js.map +1 -0
  151. package/dist/tests/collection/serialize.test.d.ts +2 -0
  152. package/dist/tests/collection/serialize.test.d.ts.map +1 -0
  153. package/dist/tests/collection/serialize.test.js +165 -0
  154. package/dist/tests/collection/serialize.test.js.map +1 -0
  155. package/dist/tests/collection/view.test.d.ts +2 -0
  156. package/dist/tests/collection/view.test.d.ts.map +1 -0
  157. package/dist/tests/collection/view.test.js +66 -0
  158. package/dist/tests/collection/view.test.js.map +1 -0
  159. package/dist/tests/filter/compiler.test.d.ts +2 -0
  160. package/dist/tests/filter/compiler.test.d.ts.map +1 -0
  161. package/dist/tests/filter/compiler.test.js +156 -0
  162. package/dist/tests/filter/compiler.test.js.map +1 -0
  163. package/dist/tests/rule/builder.test.d.ts +2 -0
  164. package/dist/tests/rule/builder.test.d.ts.map +1 -0
  165. package/dist/tests/rule/builder.test.js +290 -0
  166. package/dist/tests/rule/builder.test.js.map +1 -0
  167. package/dist/tsconfig.tsbuildinfo +1 -0
  168. package/package.json +39 -0
@@ -0,0 +1,593 @@
1
+ import { describe, expect, it } from "vitest";
2
+ import { Effect, MutableRef, Option, Schedule } from "effect";
3
+ import { Field, Bytes } from "@gettersethya/mira-collection";
4
+ import { makeCollectionClient } from "@/client/collection.js";
5
+ import { MiraError } from "@/client/errors.js";
6
+ const TestCollection = {
7
+ name: "tasks",
8
+ fields: {
9
+ title: Field.text(),
10
+ completed: Field.boolean({ default: false })
11
+ },
12
+ schema: {
13
+ "x-collection-kind": "base",
14
+ type: "object",
15
+ properties: {
16
+ title: { type: "string" },
17
+ completed: { type: "boolean", default: false }
18
+ }
19
+ }
20
+ };
21
+ const AuthCollectionDef = {
22
+ name: "users",
23
+ fields: {
24
+ name: Field.text()
25
+ },
26
+ schema: {
27
+ "x-collection-kind": "auth",
28
+ type: "object",
29
+ properties: {
30
+ name: { type: "string" }
31
+ }
32
+ }
33
+ };
34
+ const FileCollection = {
35
+ name: "uploads",
36
+ fields: {
37
+ label: Field.text(),
38
+ attachment: Field.file({ maxSize: Bytes.fromMB(5) })
39
+ },
40
+ schema: {
41
+ "x-collection-kind": "base",
42
+ type: "object",
43
+ properties: {
44
+ label: { type: "string" },
45
+ attachment: { type: "string", "x-kind": "file" }
46
+ }
47
+ }
48
+ };
49
+ function makeTestExecute(captured) {
50
+ return (req) => Effect.gen(function* () {
51
+ captured.push({
52
+ method: req.method,
53
+ url: req.url
54
+ });
55
+ if (req.method === "DELETE") {
56
+ return undefined;
57
+ }
58
+ if (req.url.includes("auth-with-password")) {
59
+ return { token: "test-token", record: { id: "1", created: "", updated: "", name: "Test" } };
60
+ }
61
+ if (req.method === "GET" && !req.url.includes("/1")) {
62
+ return { items: [], nextCursor: null };
63
+ }
64
+ return { id: "1", created: "", updated: "" };
65
+ });
66
+ }
67
+ function makeBodyCapturingExecute(captured) {
68
+ return (req) => Effect.gen(function* () {
69
+ captured.push({
70
+ method: req.method,
71
+ url: req.url,
72
+ bodyIsFormData: req.body._tag === "FormData"
73
+ });
74
+ return { id: "1", created: "", updated: "", label: "x", attachment: "x.png" };
75
+ });
76
+ }
77
+ describe("CollectionClient", () => {
78
+ it("getList with no options → GET /api/collections/tasks", async () => {
79
+ const captured = [];
80
+ const execute = makeTestExecute(captured);
81
+ const client = makeCollectionClient({
82
+ collectionName: "tasks",
83
+ schema: TestCollection.schema,
84
+ fields: TestCollection.fields,
85
+ execute,
86
+ baseUrl: "http://localhost",
87
+ authTokenRef: null,
88
+ loggedInRef: null,
89
+ fileTokenCacheRef: MutableRef.make(new Map()),
90
+ isAuth: false,
91
+ });
92
+ await client.getList().raw();
93
+ expect(captured[0].method).toBe("GET");
94
+ expect(captured[0].url).toBe("/api/collections/tasks");
95
+ });
96
+ it("getList with filter, sort, cursor, limit, expand → correct query string", async () => {
97
+ const captured = [];
98
+ const execute = makeTestExecute(captured);
99
+ const client = makeCollectionClient({
100
+ collectionName: "tasks",
101
+ schema: TestCollection.schema,
102
+ fields: TestCollection.fields,
103
+ execute,
104
+ baseUrl: "http://localhost",
105
+ authTokenRef: null,
106
+ loggedInRef: null,
107
+ fileTokenCacheRef: MutableRef.make(new Map()),
108
+ isAuth: false,
109
+ });
110
+ await client.getList({
111
+ filter: (f) => f.field("completed").eq(false),
112
+ sort: "title",
113
+ order: "asc",
114
+ cursor: 10,
115
+ limit: 20
116
+ }).raw();
117
+ expect(captured[0].url).toContain("filter=");
118
+ expect(captured[0].url).toContain("sort=title");
119
+ expect(captured[0].url).toContain("order=asc");
120
+ expect(captured[0].url).toContain("after=10");
121
+ expect(captured[0].url).toContain("limit=20");
122
+ });
123
+ it("cursor option serializes as ?after=", async () => {
124
+ const captured = [];
125
+ const execute = makeTestExecute(captured);
126
+ const client = makeCollectionClient({
127
+ collectionName: "tasks",
128
+ schema: TestCollection.schema,
129
+ fields: TestCollection.fields,
130
+ execute,
131
+ baseUrl: "http://localhost",
132
+ authTokenRef: null,
133
+ loggedInRef: null,
134
+ fileTokenCacheRef: MutableRef.make(new Map()),
135
+ isAuth: false,
136
+ });
137
+ await client.getList({ cursor: 42 }).raw();
138
+ expect(captured[0].url).toContain("after=42");
139
+ expect(captured[0].url).not.toContain("cursor=");
140
+ });
141
+ it("getOne → correct path", async () => {
142
+ const captured = [];
143
+ const execute = makeTestExecute(captured);
144
+ const client = makeCollectionClient({
145
+ collectionName: "tasks",
146
+ schema: TestCollection.schema,
147
+ fields: TestCollection.fields,
148
+ execute,
149
+ baseUrl: "http://localhost",
150
+ authTokenRef: null,
151
+ loggedInRef: null,
152
+ fileTokenCacheRef: MutableRef.make(new Map()),
153
+ isAuth: false,
154
+ });
155
+ await client.getOne("abc123").raw();
156
+ expect(captured[0].method).toBe("GET");
157
+ expect(captured[0].url).toBe("/api/collections/tasks/abc123");
158
+ });
159
+ it("create → POST with JSON body", async () => {
160
+ const captured = [];
161
+ const execute = makeTestExecute(captured);
162
+ const client = makeCollectionClient({
163
+ collectionName: "tasks",
164
+ schema: TestCollection.schema,
165
+ fields: TestCollection.fields,
166
+ execute,
167
+ baseUrl: "http://localhost",
168
+ authTokenRef: null,
169
+ loggedInRef: null,
170
+ fileTokenCacheRef: MutableRef.make(new Map()),
171
+ isAuth: false,
172
+ });
173
+ await client.create().raw({ title: "New Task" });
174
+ expect(captured[0].method).toBe("POST");
175
+ expect(captured[0].url).toBe("/api/collections/tasks");
176
+ });
177
+ it("update → PATCH with JSON body", async () => {
178
+ const captured = [];
179
+ const execute = makeTestExecute(captured);
180
+ const client = makeCollectionClient({
181
+ collectionName: "tasks",
182
+ schema: TestCollection.schema,
183
+ fields: TestCollection.fields,
184
+ execute,
185
+ baseUrl: "http://localhost",
186
+ authTokenRef: null,
187
+ loggedInRef: null,
188
+ fileTokenCacheRef: MutableRef.make(new Map()),
189
+ isAuth: false,
190
+ });
191
+ await client.update().raw({ id: "abc123", data: { title: "Updated" } });
192
+ expect(captured[0].method).toBe("PATCH");
193
+ expect(captured[0].url).toBe("/api/collections/tasks/abc123");
194
+ });
195
+ it("delete → DELETE", async () => {
196
+ const captured = [];
197
+ const execute = makeTestExecute(captured);
198
+ const client = makeCollectionClient({
199
+ collectionName: "tasks",
200
+ schema: TestCollection.schema,
201
+ fields: TestCollection.fields,
202
+ execute,
203
+ baseUrl: "http://localhost",
204
+ authTokenRef: null,
205
+ loggedInRef: null,
206
+ fileTokenCacheRef: MutableRef.make(new Map()),
207
+ isAuth: false,
208
+ });
209
+ await client.delete().raw("abc123");
210
+ expect(captured[0].method).toBe("DELETE");
211
+ expect(captured[0].url).toBe("/api/collections/tasks/abc123");
212
+ });
213
+ it("authWithPassword → correct endpoint and body", async () => {
214
+ const captured = [];
215
+ const execute = makeTestExecute(captured);
216
+ const client = makeCollectionClient({
217
+ collectionName: "users",
218
+ schema: AuthCollectionDef.schema,
219
+ fields: AuthCollectionDef.fields,
220
+ execute,
221
+ baseUrl: "http://localhost",
222
+ authTokenRef: null,
223
+ loggedInRef: null,
224
+ fileTokenCacheRef: MutableRef.make(new Map()),
225
+ isAuth: true,
226
+ });
227
+ const authWithPassword = client.authWithPassword;
228
+ if (!authWithPassword)
229
+ throw new Error("authWithPassword should be defined when isAuth=true");
230
+ const result = await authWithPassword().raw({ email: "test@example.com", password: "secret" });
231
+ expect(captured[0].method).toBe("POST");
232
+ expect(captured[0].url).toBe("/api/collections/users/auth-with-password");
233
+ expect(result.token).toBe("test-token");
234
+ });
235
+ it("create with Blob value → uses FormData body", async () => {
236
+ const captured = [];
237
+ const execute = makeBodyCapturingExecute(captured);
238
+ const client = makeCollectionClient({
239
+ collectionName: "uploads",
240
+ schema: FileCollection.schema,
241
+ fields: FileCollection.fields,
242
+ execute,
243
+ baseUrl: "http://localhost",
244
+ authTokenRef: null,
245
+ loggedInRef: null,
246
+ fileTokenCacheRef: MutableRef.make(new Map()),
247
+ isAuth: false,
248
+ });
249
+ const blob = new Blob(["data"], { type: "text/plain" });
250
+ await client.create().raw({ label: "test", attachment: blob });
251
+ expect(captured[0].bodyIsFormData).toBe(true);
252
+ });
253
+ it("create with no Blob → uses JSON body", async () => {
254
+ const captured = [];
255
+ const execute = makeBodyCapturingExecute(captured);
256
+ const client = makeCollectionClient({
257
+ collectionName: "uploads",
258
+ schema: FileCollection.schema,
259
+ fields: FileCollection.fields,
260
+ execute,
261
+ baseUrl: "http://localhost",
262
+ authTokenRef: null,
263
+ loggedInRef: null,
264
+ fileTokenCacheRef: MutableRef.make(new Map()),
265
+ isAuth: false,
266
+ });
267
+ await client.create().raw({ label: "test", attachment: "existing-file.png" });
268
+ expect(captured[0].bodyIsFormData).toBe(false);
269
+ });
270
+ it("update with Blob value → uses FormData body", async () => {
271
+ const captured = [];
272
+ const execute = makeBodyCapturingExecute(captured);
273
+ const client = makeCollectionClient({
274
+ collectionName: "uploads",
275
+ schema: FileCollection.schema,
276
+ fields: FileCollection.fields,
277
+ execute,
278
+ baseUrl: "http://localhost",
279
+ authTokenRef: null,
280
+ loggedInRef: null,
281
+ fileTokenCacheRef: MutableRef.make(new Map()),
282
+ isAuth: false,
283
+ });
284
+ const blob = new Blob(["new content"], { type: "text/plain" });
285
+ await client.update().raw({ id: "abc123", data: { attachment: blob } });
286
+ expect(captured[0].bodyIsFormData).toBe(true);
287
+ });
288
+ });
289
+ describe("getFirstOrNone", () => {
290
+ function makeClient(execute) {
291
+ return makeCollectionClient({
292
+ collectionName: "tasks",
293
+ schema: TestCollection.schema,
294
+ fields: TestCollection.fields,
295
+ execute,
296
+ baseUrl: "http://localhost",
297
+ authTokenRef: null,
298
+ loggedInRef: null,
299
+ fileTokenCacheRef: MutableRef.make(new Map()),
300
+ isAuth: false,
301
+ });
302
+ }
303
+ it("returns Option.Some when an item matches the filter", async () => {
304
+ const record = { id: "1", seqId: 1, created: "", updated: "", title: "Hello", completed: false };
305
+ const execute = () => Effect.succeed({ items: [record], nextCursor: null });
306
+ const result = await makeClient(execute)
307
+ .getFirstOrNone(f => f.field("completed").eq(false))
308
+ .raw();
309
+ expect(Option.isSome(result)).toBe(true);
310
+ if (Option.isSome(result))
311
+ expect(result.value).toEqual(record);
312
+ });
313
+ it("returns Option.None when no item matches", async () => {
314
+ const execute = () => Effect.succeed({ items: [], nextCursor: null });
315
+ const result = await makeClient(execute)
316
+ .getFirstOrNone(f => f.field("completed").eq(true))
317
+ .raw();
318
+ expect(Option.isNone(result)).toBe(true);
319
+ });
320
+ it("always sends limit=1 regardless of other options", async () => {
321
+ const captured = [];
322
+ const execute = (req) => {
323
+ captured.push({ url: req.url });
324
+ return Effect.succeed({ items: [], nextCursor: null });
325
+ };
326
+ await makeClient(execute)
327
+ .getFirstOrNone(f => f.field("completed").eq(false))
328
+ .raw();
329
+ expect(captured[0].url).toContain("limit=1");
330
+ });
331
+ it("sends filter in query string", async () => {
332
+ const captured = [];
333
+ const execute = (req) => {
334
+ captured.push({ url: req.url });
335
+ return Effect.succeed({ items: [], nextCursor: null });
336
+ };
337
+ await makeClient(execute)
338
+ .getFirstOrNone(f => f.field("completed").eq(false))
339
+ .raw();
340
+ expect(captured[0].url).toContain("filter=");
341
+ });
342
+ it("passes sort and order options through", async () => {
343
+ const captured = [];
344
+ const execute = (req) => {
345
+ captured.push({ url: req.url });
346
+ return Effect.succeed({ items: [], nextCursor: null });
347
+ };
348
+ await makeClient(execute)
349
+ .getFirstOrNone(f => f.field("completed").eq(false), { sort: "title", order: "desc" })
350
+ .raw();
351
+ expect(captured[0].url).toContain("sort=title");
352
+ expect(captured[0].url).toContain("order=desc");
353
+ });
354
+ });
355
+ describe("getFullList", () => {
356
+ function makeClient(execute) {
357
+ return makeCollectionClient({
358
+ collectionName: "tasks",
359
+ schema: TestCollection.schema,
360
+ fields: TestCollection.fields,
361
+ execute,
362
+ baseUrl: "http://localhost",
363
+ authTokenRef: null,
364
+ loggedInRef: null,
365
+ fileTokenCacheRef: MutableRef.make(new Map()),
366
+ isAuth: false,
367
+ });
368
+ }
369
+ it("defaults to limit=1000", async () => {
370
+ const captured = [];
371
+ const execute = (req) => {
372
+ captured.push({ url: req.url });
373
+ return Effect.succeed({ items: [], nextCursor: null });
374
+ };
375
+ await makeClient(execute).getFullList().raw();
376
+ expect(captured[0].url).toContain("limit=1000");
377
+ });
378
+ it("custom limit overrides default", async () => {
379
+ const captured = [];
380
+ const execute = (req) => {
381
+ captured.push({ url: req.url });
382
+ return Effect.succeed({ items: [], nextCursor: null });
383
+ };
384
+ await makeClient(execute).getFullList({ limit: 500 }).raw();
385
+ expect(captured[0].url).toContain("limit=500");
386
+ expect(captured[0].url).not.toContain("limit=1000");
387
+ });
388
+ it("returns a flat array unwrapped from the items envelope", async () => {
389
+ const records = [
390
+ { id: "1", seqId: 1, created: "", updated: "", title: "A", completed: false },
391
+ { id: "2", seqId: 2, created: "", updated: "", title: "B", completed: true },
392
+ ];
393
+ const execute = () => Effect.succeed({ items: records, nextCursor: null });
394
+ const result = await makeClient(execute).getFullList().raw();
395
+ expect(result).toEqual(records);
396
+ });
397
+ it("never sends a cursor param", async () => {
398
+ const captured = [];
399
+ const execute = (req) => {
400
+ captured.push({ url: req.url });
401
+ return Effect.succeed({ items: [], nextCursor: null });
402
+ };
403
+ await makeClient(execute).getFullList().raw();
404
+ expect(captured[0].url).not.toContain("after=");
405
+ });
406
+ it("passes filter, sort, and order through", async () => {
407
+ const captured = [];
408
+ const execute = (req) => {
409
+ captured.push({ url: req.url });
410
+ return Effect.succeed({ items: [], nextCursor: null });
411
+ };
412
+ await makeClient(execute)
413
+ .getFullList({ filter: f => f.field("completed").eq(true), sort: "title", order: "asc" })
414
+ .raw();
415
+ expect(captured[0].url).toContain("filter=");
416
+ expect(captured[0].url).toContain("sort=title");
417
+ expect(captured[0].url).toContain("order=asc");
418
+ });
419
+ });
420
+ describe("retryOptions", () => {
421
+ function makeRetryExecute(failCount) {
422
+ let count = 0;
423
+ const execute = (req) => Effect.gen(function* () {
424
+ count++;
425
+ if (count <= failCount) {
426
+ return yield* Effect.fail(new MiraError({ status: 503, body: "unavailable" }));
427
+ }
428
+ if (req.method === "DELETE")
429
+ return undefined;
430
+ if (req.url.includes("auth-with-password"))
431
+ return { token: "tok", record: { id: "u1" } };
432
+ if (req.method === "GET" && !req.url.includes("/1"))
433
+ return { items: [], nextCursor: null };
434
+ return { id: "1", created: "", updated: "" };
435
+ });
436
+ return { execute, callsMade: () => count };
437
+ }
438
+ function makeClient(execute, defaultRetryOptions) {
439
+ return makeCollectionClient({
440
+ collectionName: "tasks",
441
+ schema: TestCollection.schema,
442
+ fields: TestCollection.fields,
443
+ execute,
444
+ baseUrl: "http://localhost",
445
+ authTokenRef: null,
446
+ loggedInRef: null,
447
+ fileTokenCacheRef: MutableRef.make(new Map()),
448
+ isAuth: false,
449
+ ...(defaultRetryOptions !== undefined ? { defaultRetryOptions } : {})
450
+ });
451
+ }
452
+ const retrySchedule = Schedule.recurs(2);
453
+ it("getList retries on failure and succeeds", async () => {
454
+ const { execute, callsMade } = makeRetryExecute(2);
455
+ await makeClient(execute).getList({ retryOptions: { schedule: retrySchedule } }).raw();
456
+ expect(callsMade()).toBe(3);
457
+ });
458
+ it("getOne retries on failure and succeeds", async () => {
459
+ const { execute, callsMade } = makeRetryExecute(2);
460
+ await makeClient(execute).getOne("1", { retryOptions: { schedule: retrySchedule } }).raw();
461
+ expect(callsMade()).toBe(3);
462
+ });
463
+ it("create retries on failure via defaultRetryOptions", async () => {
464
+ const { execute, callsMade } = makeRetryExecute(2);
465
+ await makeClient(execute, { schedule: retrySchedule }).create().raw({ title: "t" });
466
+ expect(callsMade()).toBe(3);
467
+ });
468
+ it("update retries on failure via defaultRetryOptions", async () => {
469
+ const { execute, callsMade } = makeRetryExecute(2);
470
+ await makeClient(execute, { schedule: retrySchedule }).update().raw({ id: "1", data: { title: "t" } });
471
+ expect(callsMade()).toBe(3);
472
+ });
473
+ it("delete retries on failure via defaultRetryOptions", async () => {
474
+ const { execute, callsMade } = makeRetryExecute(2);
475
+ await makeClient(execute, { schedule: retrySchedule }).delete().raw("1");
476
+ expect(callsMade()).toBe(3);
477
+ });
478
+ it("authWithPassword retries on failure via defaultRetryOptions", async () => {
479
+ const { execute, callsMade } = makeRetryExecute(2);
480
+ const client = makeCollectionClient({
481
+ collectionName: "users",
482
+ schema: AuthCollectionDef.schema,
483
+ fields: AuthCollectionDef.fields,
484
+ execute,
485
+ baseUrl: "http://localhost",
486
+ authTokenRef: null,
487
+ loggedInRef: null,
488
+ fileTokenCacheRef: MutableRef.make(new Map()),
489
+ isAuth: true,
490
+ defaultRetryOptions: { schedule: retrySchedule },
491
+ });
492
+ const authWithPassword = client.authWithPassword;
493
+ if (!authWithPassword)
494
+ throw new Error("authWithPassword should be defined when isAuth=true");
495
+ await authWithPassword().raw({ email: "u@test.com", password: "pass" });
496
+ expect(callsMade()).toBe(3);
497
+ });
498
+ it("propagates error once the retry schedule is exhausted", async () => {
499
+ const { execute, callsMade } = makeRetryExecute(Infinity);
500
+ await expect(makeClient(execute).getOne("1", { retryOptions: { schedule: retrySchedule } }).raw()).rejects.toBeInstanceOf(MiraError);
501
+ expect(callsMade()).toBe(3);
502
+ });
503
+ it("without retryOptions failure propagates on the first attempt with no retry", async () => {
504
+ const { execute, callsMade } = makeRetryExecute(Infinity);
505
+ await expect(makeClient(execute).getOne("1").raw()).rejects.toBeInstanceOf(MiraError);
506
+ expect(callsMade()).toBe(1);
507
+ });
508
+ it("defaultRetryOptions applies when no method-level retryOptions is given", async () => {
509
+ const { execute, callsMade } = makeRetryExecute(2);
510
+ const client = makeCollectionClient({
511
+ collectionName: "tasks",
512
+ schema: TestCollection.schema,
513
+ fields: TestCollection.fields,
514
+ execute,
515
+ baseUrl: "http://localhost",
516
+ authTokenRef: null,
517
+ loggedInRef: null,
518
+ fileTokenCacheRef: MutableRef.make(new Map()),
519
+ isAuth: false,
520
+ defaultRetryOptions: { schedule: retrySchedule },
521
+ });
522
+ await client.getOne("1").raw();
523
+ expect(callsMade()).toBe(3);
524
+ });
525
+ it("method-level retryOptions.schedule overrides defaultRetryOptions for queries", async () => {
526
+ const { execute, callsMade } = makeRetryExecute(1);
527
+ const client = makeCollectionClient({
528
+ collectionName: "tasks",
529
+ schema: TestCollection.schema,
530
+ fields: TestCollection.fields,
531
+ execute,
532
+ baseUrl: "http://localhost",
533
+ authTokenRef: null,
534
+ loggedInRef: null,
535
+ fileTokenCacheRef: MutableRef.make(new Map()),
536
+ isAuth: false,
537
+ defaultRetryOptions: { schedule: Schedule.recurs(5) },
538
+ });
539
+ await client.getOne("1", { retryOptions: { schedule: Schedule.recurs(1) } }).raw();
540
+ expect(callsMade()).toBe(2);
541
+ });
542
+ });
543
+ describe("literalText field — filter builder", () => {
544
+ const LiteralCollection = {
545
+ name: "roles",
546
+ fields: {
547
+ role: Field.literalText({ literal: ["admin", "agent", "readonly"] })
548
+ },
549
+ schema: {
550
+ "x-collection-kind": "base",
551
+ type: "object",
552
+ properties: {
553
+ role: { type: "string", "x-kind": "literalText", "x-literal": ["admin", "agent", "readonly"] }
554
+ }
555
+ }
556
+ };
557
+ function makeClient(execute) {
558
+ return makeCollectionClient({
559
+ collectionName: "roles",
560
+ schema: LiteralCollection.schema,
561
+ fields: LiteralCollection.fields,
562
+ execute,
563
+ baseUrl: "http://localhost",
564
+ authTokenRef: null,
565
+ loggedInRef: null,
566
+ fileTokenCacheRef: MutableRef.make(new Map()),
567
+ isAuth: false,
568
+ });
569
+ }
570
+ it("filter builder eq on literalText compiles correctly", async () => {
571
+ const captured = [];
572
+ const execute = (req) => {
573
+ captured.push({ url: req.url });
574
+ return Effect.succeed({ items: [], nextCursor: null });
575
+ };
576
+ await makeClient(execute).getList({
577
+ filter: (f) => f.field("role").eq("admin")
578
+ }).raw();
579
+ expect(captured[0].url).toContain("filter=");
580
+ });
581
+ it("filter builder in on literalText compiles correctly", async () => {
582
+ const captured = [];
583
+ const execute = (req) => {
584
+ captured.push({ url: req.url });
585
+ return Effect.succeed({ items: [], nextCursor: null });
586
+ };
587
+ await makeClient(execute).getList({
588
+ filter: (f) => f.field("role").in(["admin", "agent"])
589
+ }).raw();
590
+ expect(captured[0].url).toContain("filter=");
591
+ });
592
+ });
593
+ //# sourceMappingURL=collection.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"collection.test.js","sourceRoot":"","sources":["../../../tests/client/collection.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=file.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"file.test.d.ts","sourceRoot":"","sources":["../../../tests/client/file.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,21 @@
1
+ import { describe, expect, it } from "vitest";
2
+ import { buildFileUrl } from "@/client/file.js";
3
+ describe("buildFileUrl", () => {
4
+ it("produces correct URL with no opts", () => {
5
+ const url = buildFileUrl("http://localhost", "users", "abc", "avatar.png");
6
+ expect(url).toBe("http://localhost/api/files/users/abc/avatar.png");
7
+ });
8
+ it("produces correct URL with thumb", () => {
9
+ const url = buildFileUrl("http://localhost", "users", "abc", "avatar.png", { thumb: "200x200" });
10
+ expect(url).toBe("http://localhost/api/files/users/abc/avatar.png?thumb=200x200");
11
+ });
12
+ it("produces correct URL with token", () => {
13
+ const url = buildFileUrl("http://localhost", "users", "abc", "avatar.png", { token: "tok123" });
14
+ expect(url).toBe("http://localhost/api/files/users/abc/avatar.png?token=tok123");
15
+ });
16
+ it("produces correct URL with both token and thumb", () => {
17
+ const url = buildFileUrl("http://localhost", "users", "abc", "avatar.png", { token: "tok123", thumb: "100x100" });
18
+ expect(url).toBe("http://localhost/api/files/users/abc/avatar.png?token=tok123&thumb=100x100");
19
+ });
20
+ });
21
+ //# sourceMappingURL=file.test.js.map