@livetemplate/client 0.4.0 → 0.7.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (48) hide show
  1. package/dist/dom/event-delegation.d.ts +12 -0
  2. package/dist/dom/event-delegation.d.ts.map +1 -1
  3. package/dist/dom/event-delegation.js +199 -0
  4. package/dist/dom/event-delegation.js.map +1 -1
  5. package/dist/dom/reactive-attributes.d.ts +67 -0
  6. package/dist/dom/reactive-attributes.d.ts.map +1 -0
  7. package/dist/dom/reactive-attributes.js +201 -0
  8. package/dist/dom/reactive-attributes.js.map +1 -0
  9. package/dist/livetemplate-client.browser.js +4 -4
  10. package/dist/livetemplate-client.browser.js.map +4 -4
  11. package/dist/livetemplate-client.d.ts.map +1 -1
  12. package/dist/livetemplate-client.js +7 -0
  13. package/dist/livetemplate-client.js.map +1 -1
  14. package/dist/tests/directives.test.d.ts +2 -0
  15. package/dist/tests/directives.test.d.ts.map +1 -0
  16. package/dist/tests/directives.test.js +208 -0
  17. package/dist/tests/directives.test.js.map +1 -0
  18. package/dist/tests/event-delegation.test.js +142 -0
  19. package/dist/tests/event-delegation.test.js.map +1 -1
  20. package/dist/tests/loading-indicator.test.d.ts +2 -0
  21. package/dist/tests/loading-indicator.test.d.ts.map +1 -0
  22. package/dist/tests/loading-indicator.test.js +60 -0
  23. package/dist/tests/loading-indicator.test.js.map +1 -0
  24. package/dist/tests/logger.test.d.ts +2 -0
  25. package/dist/tests/logger.test.d.ts.map +1 -0
  26. package/dist/tests/logger.test.js +201 -0
  27. package/dist/tests/logger.test.js.map +1 -0
  28. package/dist/tests/observer-manager.test.d.ts +2 -0
  29. package/dist/tests/observer-manager.test.d.ts.map +1 -0
  30. package/dist/tests/observer-manager.test.js +192 -0
  31. package/dist/tests/observer-manager.test.js.map +1 -0
  32. package/dist/tests/reactive-attributes.test.d.ts +2 -0
  33. package/dist/tests/reactive-attributes.test.d.ts.map +1 -0
  34. package/dist/tests/reactive-attributes.test.js +393 -0
  35. package/dist/tests/reactive-attributes.test.js.map +1 -0
  36. package/dist/tests/s3-uploader.test.d.ts +2 -0
  37. package/dist/tests/s3-uploader.test.d.ts.map +1 -0
  38. package/dist/tests/s3-uploader.test.js +141 -0
  39. package/dist/tests/s3-uploader.test.js.map +1 -0
  40. package/dist/tests/upload-handler.test.d.ts +2 -0
  41. package/dist/tests/upload-handler.test.d.ts.map +1 -0
  42. package/dist/tests/upload-handler.test.js +365 -0
  43. package/dist/tests/upload-handler.test.js.map +1 -0
  44. package/dist/tests/websocket.test.d.ts +2 -0
  45. package/dist/tests/websocket.test.d.ts.map +1 -0
  46. package/dist/tests/websocket.test.js +379 -0
  47. package/dist/tests/websocket.test.js.map +1 -0
  48. package/package.json +2 -1
@@ -0,0 +1,393 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ const reactive_attributes_1 = require("../dom/reactive-attributes");
4
+ describe("Reactive Attributes", () => {
5
+ beforeEach(() => {
6
+ document.body.innerHTML = "";
7
+ });
8
+ afterEach(() => {
9
+ document.body.innerHTML = "";
10
+ });
11
+ describe("parseReactiveAttribute", () => {
12
+ describe("valid attribute parsing", () => {
13
+ it("parses global lifecycle event", () => {
14
+ const result = (0, reactive_attributes_1.parseReactiveAttribute)("lvt-reset-on:success", "");
15
+ expect(result).toEqual({
16
+ action: "reset",
17
+ lifecycle: "success",
18
+ actionName: undefined,
19
+ param: undefined,
20
+ });
21
+ });
22
+ it("parses action-specific lifecycle event", () => {
23
+ const result = (0, reactive_attributes_1.parseReactiveAttribute)("lvt-reset-on:create-todo:success", "");
24
+ expect(result).toEqual({
25
+ action: "reset",
26
+ lifecycle: "success",
27
+ actionName: "create-todo",
28
+ param: undefined,
29
+ });
30
+ });
31
+ it("parses parameterized action with value", () => {
32
+ const result = (0, reactive_attributes_1.parseReactiveAttribute)("lvt-addClass-on:pending", "loading opacity-50");
33
+ expect(result).toEqual({
34
+ action: "addClass",
35
+ lifecycle: "pending",
36
+ actionName: undefined,
37
+ param: "loading opacity-50",
38
+ });
39
+ });
40
+ it("parses action-specific parameterized action", () => {
41
+ const result = (0, reactive_attributes_1.parseReactiveAttribute)("lvt-addClass-on:save:pending", "loading");
42
+ expect(result).toEqual({
43
+ action: "addClass",
44
+ lifecycle: "pending",
45
+ actionName: "save",
46
+ param: "loading",
47
+ });
48
+ });
49
+ it("parses all lifecycle events", () => {
50
+ const lifecycles = ["pending", "success", "error", "done"];
51
+ lifecycles.forEach((lifecycle) => {
52
+ const result = (0, reactive_attributes_1.parseReactiveAttribute)(`lvt-reset-on:${lifecycle}`, "");
53
+ expect(result?.lifecycle).toBe(lifecycle);
54
+ });
55
+ });
56
+ it("parses all action types", () => {
57
+ const actions = [
58
+ "reset",
59
+ "disable",
60
+ "enable",
61
+ "addClass",
62
+ "removeClass",
63
+ "toggleClass",
64
+ "setAttr",
65
+ "toggleAttr",
66
+ ];
67
+ actions.forEach((action) => {
68
+ const result = (0, reactive_attributes_1.parseReactiveAttribute)(`lvt-${action}-on:success`, "value");
69
+ expect(result?.action).toBe(action);
70
+ });
71
+ });
72
+ it("handles action names with hyphens", () => {
73
+ const result = (0, reactive_attributes_1.parseReactiveAttribute)("lvt-reset-on:create-new-todo:success", "");
74
+ expect(result).toEqual({
75
+ action: "reset",
76
+ lifecycle: "success",
77
+ actionName: "create-new-todo",
78
+ param: undefined,
79
+ });
80
+ });
81
+ it("handles action names with colons", () => {
82
+ const result = (0, reactive_attributes_1.parseReactiveAttribute)("lvt-reset-on:todos:create:success", "");
83
+ expect(result).toEqual({
84
+ action: "reset",
85
+ lifecycle: "success",
86
+ actionName: "todos:create",
87
+ param: undefined,
88
+ });
89
+ });
90
+ });
91
+ describe("invalid attribute parsing", () => {
92
+ it("returns null for non-reactive attributes", () => {
93
+ expect((0, reactive_attributes_1.parseReactiveAttribute)("lvt-click", "action")).toBeNull();
94
+ expect((0, reactive_attributes_1.parseReactiveAttribute)("lvt-submit", "save")).toBeNull();
95
+ expect((0, reactive_attributes_1.parseReactiveAttribute)("class", "foo")).toBeNull();
96
+ });
97
+ it("returns null for unknown actions", () => {
98
+ expect((0, reactive_attributes_1.parseReactiveAttribute)("lvt-foo-on:success", "")).toBeNull();
99
+ expect((0, reactive_attributes_1.parseReactiveAttribute)("lvt-hide-on:pending", "")).toBeNull();
100
+ });
101
+ it("returns null for unknown lifecycle events", () => {
102
+ expect((0, reactive_attributes_1.parseReactiveAttribute)("lvt-reset-on:loading", "")).toBeNull();
103
+ expect((0, reactive_attributes_1.parseReactiveAttribute)("lvt-reset-on:complete", "")).toBeNull();
104
+ });
105
+ });
106
+ });
107
+ describe("executeAction", () => {
108
+ describe("reset", () => {
109
+ it("resets a form", () => {
110
+ const form = document.createElement("form");
111
+ const input = document.createElement("input");
112
+ input.name = "title";
113
+ input.value = "test value";
114
+ form.appendChild(input);
115
+ document.body.appendChild(form);
116
+ (0, reactive_attributes_1.executeAction)(form, "reset");
117
+ expect(input.value).toBe("");
118
+ });
119
+ it("does nothing for non-form elements", () => {
120
+ const div = document.createElement("div");
121
+ document.body.appendChild(div);
122
+ // Should not throw
123
+ (0, reactive_attributes_1.executeAction)(div, "reset");
124
+ });
125
+ });
126
+ describe("disable/enable", () => {
127
+ it("disables a button", () => {
128
+ const button = document.createElement("button");
129
+ document.body.appendChild(button);
130
+ (0, reactive_attributes_1.executeAction)(button, "disable");
131
+ expect(button.disabled).toBe(true);
132
+ });
133
+ it("enables a button", () => {
134
+ const button = document.createElement("button");
135
+ button.disabled = true;
136
+ document.body.appendChild(button);
137
+ (0, reactive_attributes_1.executeAction)(button, "enable");
138
+ expect(button.disabled).toBe(false);
139
+ });
140
+ it("disables an input", () => {
141
+ const input = document.createElement("input");
142
+ document.body.appendChild(input);
143
+ (0, reactive_attributes_1.executeAction)(input, "disable");
144
+ expect(input.disabled).toBe(true);
145
+ });
146
+ it("enables an input", () => {
147
+ const input = document.createElement("input");
148
+ input.disabled = true;
149
+ document.body.appendChild(input);
150
+ (0, reactive_attributes_1.executeAction)(input, "enable");
151
+ expect(input.disabled).toBe(false);
152
+ });
153
+ });
154
+ describe("addClass", () => {
155
+ it("adds a single class", () => {
156
+ const div = document.createElement("div");
157
+ document.body.appendChild(div);
158
+ (0, reactive_attributes_1.executeAction)(div, "addClass", "loading");
159
+ expect(div.classList.contains("loading")).toBe(true);
160
+ });
161
+ it("adds multiple classes", () => {
162
+ const div = document.createElement("div");
163
+ document.body.appendChild(div);
164
+ (0, reactive_attributes_1.executeAction)(div, "addClass", "loading opacity-50 cursor-wait");
165
+ expect(div.classList.contains("loading")).toBe(true);
166
+ expect(div.classList.contains("opacity-50")).toBe(true);
167
+ expect(div.classList.contains("cursor-wait")).toBe(true);
168
+ });
169
+ it("does nothing without param", () => {
170
+ const div = document.createElement("div");
171
+ document.body.appendChild(div);
172
+ (0, reactive_attributes_1.executeAction)(div, "addClass");
173
+ expect(div.className).toBe("");
174
+ });
175
+ });
176
+ describe("removeClass", () => {
177
+ it("removes a single class", () => {
178
+ const div = document.createElement("div");
179
+ div.className = "loading active";
180
+ document.body.appendChild(div);
181
+ (0, reactive_attributes_1.executeAction)(div, "removeClass", "loading");
182
+ expect(div.classList.contains("loading")).toBe(false);
183
+ expect(div.classList.contains("active")).toBe(true);
184
+ });
185
+ it("removes multiple classes", () => {
186
+ const div = document.createElement("div");
187
+ div.className = "loading opacity-50 active";
188
+ document.body.appendChild(div);
189
+ (0, reactive_attributes_1.executeAction)(div, "removeClass", "loading opacity-50");
190
+ expect(div.classList.contains("loading")).toBe(false);
191
+ expect(div.classList.contains("opacity-50")).toBe(false);
192
+ expect(div.classList.contains("active")).toBe(true);
193
+ });
194
+ });
195
+ describe("toggleClass", () => {
196
+ it("toggles class on", () => {
197
+ const div = document.createElement("div");
198
+ document.body.appendChild(div);
199
+ (0, reactive_attributes_1.executeAction)(div, "toggleClass", "active");
200
+ expect(div.classList.contains("active")).toBe(true);
201
+ });
202
+ it("toggles class off", () => {
203
+ const div = document.createElement("div");
204
+ div.className = "active";
205
+ document.body.appendChild(div);
206
+ (0, reactive_attributes_1.executeAction)(div, "toggleClass", "active");
207
+ expect(div.classList.contains("active")).toBe(false);
208
+ });
209
+ it("toggles multiple classes", () => {
210
+ const div = document.createElement("div");
211
+ div.className = "active";
212
+ document.body.appendChild(div);
213
+ (0, reactive_attributes_1.executeAction)(div, "toggleClass", "active hidden");
214
+ expect(div.classList.contains("active")).toBe(false);
215
+ expect(div.classList.contains("hidden")).toBe(true);
216
+ });
217
+ });
218
+ describe("setAttr", () => {
219
+ it("sets an attribute", () => {
220
+ const div = document.createElement("div");
221
+ document.body.appendChild(div);
222
+ (0, reactive_attributes_1.executeAction)(div, "setAttr", "aria-busy:true");
223
+ expect(div.getAttribute("aria-busy")).toBe("true");
224
+ });
225
+ it("sets attribute with empty value", () => {
226
+ const div = document.createElement("div");
227
+ document.body.appendChild(div);
228
+ (0, reactive_attributes_1.executeAction)(div, "setAttr", "data-loading:");
229
+ expect(div.getAttribute("data-loading")).toBe("");
230
+ });
231
+ it("handles value with colons", () => {
232
+ const div = document.createElement("div");
233
+ document.body.appendChild(div);
234
+ (0, reactive_attributes_1.executeAction)(div, "setAttr", "data-url:https://example.com");
235
+ expect(div.getAttribute("data-url")).toBe("https://example.com");
236
+ });
237
+ it("does nothing without colon separator", () => {
238
+ const div = document.createElement("div");
239
+ document.body.appendChild(div);
240
+ (0, reactive_attributes_1.executeAction)(div, "setAttr", "invalidformat");
241
+ expect(div.attributes.length).toBe(0);
242
+ });
243
+ });
244
+ describe("toggleAttr", () => {
245
+ it("adds boolean attribute", () => {
246
+ const input = document.createElement("input");
247
+ document.body.appendChild(input);
248
+ (0, reactive_attributes_1.executeAction)(input, "toggleAttr", "readonly");
249
+ expect(input.hasAttribute("readonly")).toBe(true);
250
+ });
251
+ it("removes boolean attribute", () => {
252
+ const input = document.createElement("input");
253
+ input.setAttribute("readonly", "");
254
+ document.body.appendChild(input);
255
+ (0, reactive_attributes_1.executeAction)(input, "toggleAttr", "readonly");
256
+ expect(input.hasAttribute("readonly")).toBe(false);
257
+ });
258
+ it("toggles hidden attribute", () => {
259
+ const div = document.createElement("div");
260
+ div.hidden = true;
261
+ document.body.appendChild(div);
262
+ (0, reactive_attributes_1.executeAction)(div, "toggleAttr", "hidden");
263
+ expect(div.hidden).toBe(false);
264
+ (0, reactive_attributes_1.executeAction)(div, "toggleAttr", "hidden");
265
+ expect(div.hidden).toBe(true);
266
+ });
267
+ });
268
+ });
269
+ describe("matchesEvent", () => {
270
+ it("matches global binding to any action", () => {
271
+ const binding = {
272
+ action: "reset",
273
+ lifecycle: "success",
274
+ };
275
+ expect((0, reactive_attributes_1.matchesEvent)(binding, "success", "create-todo")).toBe(true);
276
+ expect((0, reactive_attributes_1.matchesEvent)(binding, "success", "delete-todo")).toBe(true);
277
+ expect((0, reactive_attributes_1.matchesEvent)(binding, "success")).toBe(true);
278
+ });
279
+ it("matches action-specific binding only to that action", () => {
280
+ const binding = {
281
+ action: "reset",
282
+ lifecycle: "success",
283
+ actionName: "create-todo",
284
+ };
285
+ expect((0, reactive_attributes_1.matchesEvent)(binding, "success", "create-todo")).toBe(true);
286
+ expect((0, reactive_attributes_1.matchesEvent)(binding, "success", "delete-todo")).toBe(false);
287
+ expect((0, reactive_attributes_1.matchesEvent)(binding, "success")).toBe(false);
288
+ });
289
+ it("does not match different lifecycle events", () => {
290
+ const binding = {
291
+ action: "reset",
292
+ lifecycle: "success",
293
+ };
294
+ expect((0, reactive_attributes_1.matchesEvent)(binding, "pending", "create-todo")).toBe(false);
295
+ expect((0, reactive_attributes_1.matchesEvent)(binding, "error", "create-todo")).toBe(false);
296
+ expect((0, reactive_attributes_1.matchesEvent)(binding, "done", "create-todo")).toBe(false);
297
+ });
298
+ });
299
+ describe("processReactiveAttributes", () => {
300
+ it("processes global success bindings", () => {
301
+ const form = document.createElement("form");
302
+ form.setAttribute("lvt-reset-on:success", "");
303
+ const input = document.createElement("input");
304
+ input.name = "title";
305
+ input.value = "test";
306
+ form.appendChild(input);
307
+ document.body.appendChild(form);
308
+ (0, reactive_attributes_1.processReactiveAttributes)("success", "any-action");
309
+ expect(input.value).toBe("");
310
+ });
311
+ it("processes action-specific bindings", () => {
312
+ const form = document.createElement("form");
313
+ form.setAttribute("lvt-reset-on:create-todo:success", "");
314
+ const input = document.createElement("input");
315
+ input.name = "title";
316
+ input.value = "test";
317
+ form.appendChild(input);
318
+ document.body.appendChild(form);
319
+ // Should not reset for different action
320
+ (0, reactive_attributes_1.processReactiveAttributes)("success", "delete-todo");
321
+ expect(input.value).toBe("test");
322
+ // Should reset for matching action
323
+ (0, reactive_attributes_1.processReactiveAttributes)("success", "create-todo");
324
+ expect(input.value).toBe("");
325
+ });
326
+ it("processes multiple bindings on same element", () => {
327
+ const button = document.createElement("button");
328
+ button.setAttribute("lvt-disable-on:pending", "");
329
+ button.setAttribute("lvt-addClass-on:pending", "loading");
330
+ document.body.appendChild(button);
331
+ (0, reactive_attributes_1.processReactiveAttributes)("pending", "save");
332
+ expect(button.disabled).toBe(true);
333
+ expect(button.classList.contains("loading")).toBe(true);
334
+ });
335
+ it("processes bindings on multiple elements", () => {
336
+ const form = document.createElement("form");
337
+ form.setAttribute("lvt-reset-on:success", "");
338
+ const input = document.createElement("input");
339
+ input.value = "test";
340
+ form.appendChild(input);
341
+ const button = document.createElement("button");
342
+ button.disabled = true;
343
+ button.setAttribute("lvt-enable-on:success", "");
344
+ document.body.appendChild(form);
345
+ document.body.appendChild(button);
346
+ (0, reactive_attributes_1.processReactiveAttributes)("success", "save");
347
+ expect(input.value).toBe("");
348
+ expect(button.disabled).toBe(false);
349
+ });
350
+ it("ignores bindings for different lifecycles", () => {
351
+ const button = document.createElement("button");
352
+ button.setAttribute("lvt-disable-on:pending", "");
353
+ document.body.appendChild(button);
354
+ (0, reactive_attributes_1.processReactiveAttributes)("success", "save");
355
+ expect(button.disabled).toBe(false);
356
+ });
357
+ });
358
+ describe("setupReactiveAttributeListeners", () => {
359
+ it("sets up listeners for all lifecycle events", () => {
360
+ (0, reactive_attributes_1.setupReactiveAttributeListeners)();
361
+ const button = document.createElement("button");
362
+ button.setAttribute("lvt-disable-on:pending", "");
363
+ button.setAttribute("lvt-enable-on:done", "");
364
+ document.body.appendChild(button);
365
+ // Simulate pending event
366
+ document.dispatchEvent(new CustomEvent("lvt:pending", {
367
+ detail: { action: "save" },
368
+ bubbles: true,
369
+ }));
370
+ expect(button.disabled).toBe(true);
371
+ // Simulate done event
372
+ document.dispatchEvent(new CustomEvent("lvt:done", {
373
+ detail: { action: "save" },
374
+ bubbles: true,
375
+ }));
376
+ expect(button.disabled).toBe(false);
377
+ });
378
+ it("handles events without action name", () => {
379
+ (0, reactive_attributes_1.setupReactiveAttributeListeners)();
380
+ const div = document.createElement("div");
381
+ div.setAttribute("lvt-addClass-on:success", "success-state");
382
+ document.body.appendChild(div);
383
+ // Event without action in detail
384
+ document.dispatchEvent(new CustomEvent("lvt:success", {
385
+ detail: {},
386
+ bubbles: true,
387
+ }));
388
+ // Global binding should still work
389
+ expect(div.classList.contains("success-state")).toBe(true);
390
+ });
391
+ });
392
+ });
393
+ //# sourceMappingURL=reactive-attributes.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"reactive-attributes.test.js","sourceRoot":"","sources":["../../tests/reactive-attributes.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=s3-uploader.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"s3-uploader.test.d.ts","sourceRoot":"","sources":["../../tests/s3-uploader.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,141 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ const s3_uploader_1 = require("../upload/s3-uploader");
4
+ describe("S3Uploader", () => {
5
+ let uploader;
6
+ let mockXHR;
7
+ let xhrEventHandlers;
8
+ let uploadEventHandlers;
9
+ beforeEach(() => {
10
+ xhrEventHandlers = new Map();
11
+ uploadEventHandlers = new Map();
12
+ mockXHR = {
13
+ open: jest.fn(),
14
+ send: jest.fn(),
15
+ setRequestHeader: jest.fn(),
16
+ abort: jest.fn(),
17
+ upload: {
18
+ addEventListener: jest.fn((event, handler) => {
19
+ uploadEventHandlers.set(event, handler);
20
+ }),
21
+ },
22
+ addEventListener: jest.fn((event, handler) => {
23
+ xhrEventHandlers.set(event, handler);
24
+ }),
25
+ status: 200,
26
+ statusText: "OK",
27
+ };
28
+ global.XMLHttpRequest = jest.fn(() => mockXHR);
29
+ uploader = new s3_uploader_1.S3Uploader();
30
+ });
31
+ const createMockEntry = (overrides = {}) => ({
32
+ id: "test-entry-1",
33
+ file: new File(["test content"], "test.txt", { type: "text/plain" }),
34
+ uploadName: "test-upload",
35
+ progress: 0,
36
+ bytesUploaded: 0,
37
+ valid: true,
38
+ done: false,
39
+ ...overrides,
40
+ });
41
+ const createMockMeta = (overrides = {}) => ({
42
+ uploader: "s3",
43
+ url: "https://s3.example.com/bucket/key?presigned=signature",
44
+ ...overrides,
45
+ });
46
+ describe("upload", () => {
47
+ it("uploads file to presigned URL", async () => {
48
+ const entry = createMockEntry();
49
+ const meta = createMockMeta();
50
+ const uploadPromise = uploader.upload(entry, meta);
51
+ expect(mockXHR.open).toHaveBeenCalledWith("PUT", meta.url);
52
+ expect(mockXHR.send).toHaveBeenCalledWith(entry.file);
53
+ // Simulate successful upload
54
+ mockXHR.status = 200;
55
+ xhrEventHandlers.get("load")();
56
+ await uploadPromise;
57
+ expect(entry.done).toBe(true);
58
+ expect(entry.progress).toBe(100);
59
+ });
60
+ it("sets custom headers", async () => {
61
+ const entry = createMockEntry();
62
+ const meta = createMockMeta({
63
+ headers: {
64
+ "Content-Type": "text/plain",
65
+ "x-amz-acl": "public-read",
66
+ },
67
+ });
68
+ const uploadPromise = uploader.upload(entry, meta);
69
+ expect(mockXHR.setRequestHeader).toHaveBeenCalledWith("Content-Type", "text/plain");
70
+ expect(mockXHR.setRequestHeader).toHaveBeenCalledWith("x-amz-acl", "public-read");
71
+ mockXHR.status = 200;
72
+ xhrEventHandlers.get("load")();
73
+ await uploadPromise;
74
+ });
75
+ it("tracks upload progress", async () => {
76
+ const entry = createMockEntry();
77
+ const meta = createMockMeta();
78
+ const onProgress = jest.fn();
79
+ const uploadPromise = uploader.upload(entry, meta, onProgress);
80
+ // Simulate progress event
81
+ uploadEventHandlers.get("progress")({
82
+ lengthComputable: true,
83
+ loaded: 50,
84
+ total: 100,
85
+ });
86
+ expect(entry.bytesUploaded).toBe(50);
87
+ expect(entry.progress).toBe(50);
88
+ expect(onProgress).toHaveBeenCalledWith(entry);
89
+ // Complete upload
90
+ mockXHR.status = 200;
91
+ xhrEventHandlers.get("load")();
92
+ await uploadPromise;
93
+ });
94
+ it("handles upload failure with status code", async () => {
95
+ const entry = createMockEntry();
96
+ const meta = createMockMeta();
97
+ const uploadPromise = uploader.upload(entry, meta);
98
+ mockXHR.status = 403;
99
+ mockXHR.statusText = "Forbidden";
100
+ xhrEventHandlers.get("load")();
101
+ await expect(uploadPromise).rejects.toThrow("S3 upload failed with status 403: Forbidden");
102
+ expect(entry.error).toBe("S3 upload failed with status 403: Forbidden");
103
+ });
104
+ it("handles network error", async () => {
105
+ const entry = createMockEntry();
106
+ const meta = createMockMeta();
107
+ const uploadPromise = uploader.upload(entry, meta);
108
+ xhrEventHandlers.get("error")();
109
+ await expect(uploadPromise).rejects.toThrow("S3 upload failed: Network error");
110
+ expect(entry.error).toBe("S3 upload failed: Network error");
111
+ });
112
+ it("supports abort/cancellation", async () => {
113
+ const entry = createMockEntry();
114
+ const meta = createMockMeta();
115
+ const uploadPromise = uploader.upload(entry, meta);
116
+ // Abort the upload
117
+ entry.abortController.abort();
118
+ // The abort event should be triggered
119
+ xhrEventHandlers.get("abort")();
120
+ await expect(uploadPromise).rejects.toThrow("S3 upload cancelled");
121
+ expect(mockXHR.abort).toHaveBeenCalled();
122
+ });
123
+ it("does not call progress callback for non-computable progress", async () => {
124
+ const entry = createMockEntry();
125
+ const meta = createMockMeta();
126
+ const onProgress = jest.fn();
127
+ const uploadPromise = uploader.upload(entry, meta, onProgress);
128
+ // Simulate progress event without length
129
+ uploadEventHandlers.get("progress")({
130
+ lengthComputable: false,
131
+ loaded: 50,
132
+ total: 0,
133
+ });
134
+ expect(onProgress).not.toHaveBeenCalled();
135
+ mockXHR.status = 200;
136
+ xhrEventHandlers.get("load")();
137
+ await uploadPromise;
138
+ });
139
+ });
140
+ });
141
+ //# sourceMappingURL=s3-uploader.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"s3-uploader.test.js","sourceRoot":"","sources":["../../tests/s3-uploader.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=upload-handler.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"upload-handler.test.d.ts","sourceRoot":"","sources":["../../tests/upload-handler.test.ts"],"names":[],"mappings":""}