@startinblox/components-ds4go 2.2.4 → 3.0.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 (52) hide show
  1. package/.gitlab-ci.yml +8 -2
  2. package/AGENTS.md +516 -0
  3. package/cypress/component/no-component-test.cy.ts +9 -0
  4. package/cypress/e2e/helpers/components/setupCacheInvalidation.cy.ts +512 -0
  5. package/cypress/e2e/helpers/components/setupCacheOnResourceReady.cy.ts +483 -0
  6. package/cypress/e2e/helpers/components/setupComponentSubscriptions.cy.ts +239 -0
  7. package/cypress/e2e/helpers/components/setupOnSaveReset.cy.ts +380 -0
  8. package/cypress/e2e/helpers/datas/checkValueInIntervalRecursive.cy.ts +563 -0
  9. package/cypress/e2e/helpers/datas/dataBuilder.cy.ts +508 -0
  10. package/cypress/e2e/helpers/datas/filterGenerator.cy.ts +285 -0
  11. package/cypress/e2e/helpers/datas/filterObjectByDateAfter.cy.ts +389 -0
  12. package/cypress/e2e/helpers/datas/filterObjectByDateInterval.cy.ts +613 -0
  13. package/cypress/e2e/helpers/datas/filterObjectById.cy.ts +276 -0
  14. package/cypress/e2e/helpers/datas/filterObjectByInterval.cy.ts +237 -0
  15. package/cypress/e2e/helpers/datas/filterObjectByNamedValue.cy.ts +299 -0
  16. package/cypress/e2e/helpers/datas/filterObjectByType.cy.ts +307 -0
  17. package/cypress/e2e/helpers/datas/filterObjectByValue.cy.ts +375 -0
  18. package/cypress/e2e/helpers/datas/sort.cy.ts +293 -0
  19. package/cypress/e2e/helpers/ui/formatDate.cy.ts +233 -0
  20. package/cypress/e2e/helpers/utils/requestNavigation.cy.ts +257 -0
  21. package/cypress/e2e/helpers/utils/uniq.cy.ts +160 -0
  22. package/cypress/support/e2e.ts +1 -0
  23. package/cypress.config.ts +2 -0
  24. package/dist/index.js +932 -734
  25. package/locales/en.xlf +75 -0
  26. package/package.json +10 -10
  27. package/src/components/solid-boilerplate.ts +76 -0
  28. package/src/components/solid-fact-bundle-creation.ts +202 -59
  29. package/src/helpers/components/componentObjectHandler.ts +5 -7
  30. package/src/helpers/components/componentObjectsHandler.ts +8 -3
  31. package/src/helpers/components/orbitComponent.ts +87 -68
  32. package/src/helpers/components/setupCacheInvalidation.ts +50 -23
  33. package/src/helpers/components/setupCacheOnResourceReady.ts +42 -23
  34. package/src/helpers/components/setupComponentSubscriptions.ts +10 -9
  35. package/src/helpers/components/setupOnSaveReset.ts +27 -5
  36. package/src/helpers/datas/checkValueInIntervalRecursive.ts +66 -0
  37. package/src/helpers/datas/dataBuilder.ts +4 -4
  38. package/src/helpers/datas/filterGenerator.ts +13 -10
  39. package/src/helpers/datas/filterObjectByDateAfter.ts +3 -3
  40. package/src/helpers/datas/filterObjectByDateInterval.ts +44 -0
  41. package/src/helpers/datas/filterObjectById.ts +7 -6
  42. package/src/helpers/datas/filterObjectByInterval.ts +6 -110
  43. package/src/helpers/datas/filterObjectByNamedValue.ts +35 -33
  44. package/src/helpers/datas/filterObjectByType.ts +3 -3
  45. package/src/helpers/datas/filterObjectByValue.ts +17 -16
  46. package/src/helpers/datas/sort.ts +50 -23
  47. package/src/helpers/index.ts +2 -0
  48. package/src/helpers/ui/formatDate.ts +14 -1
  49. package/src/helpers/utils/requestNavigation.ts +5 -2
  50. package/src/helpers/utils/uniq.ts +1 -1
  51. package/src/styles/fact-bundle-creation.scss +102 -0
  52. package/cypress/component/solid-boilerplate.cy.ts +0 -9
@@ -0,0 +1,613 @@
1
+ import filterObjectByDateInterval from "@helpers/datas/filterObjectByDateInterval";
2
+
3
+ describe("filterObjectByDateInterval helper function", () => {
4
+ describe("Basic date interval filtering", () => {
5
+ it("should filter objects by date property within interval", () => {
6
+ const objects = [
7
+ { name: "Event 1", date: "2023-01-15" },
8
+ { name: "Event 2", date: "2023-02-15" },
9
+ { name: "Event 3", date: "2023-03-15" },
10
+ ];
11
+ const result = filterObjectByDateInterval(
12
+ objects,
13
+ "date",
14
+ "2023-02-01/2023-02-28",
15
+ );
16
+ expect(result).to.have.length(1);
17
+ expect(result[0].name).to.equal("Event 2");
18
+ });
19
+
20
+ it("should include objects with date equal to start of interval", () => {
21
+ const objects = [
22
+ { name: "Event 1", date: "2023-02-01" },
23
+ { name: "Event 2", date: "2023-02-15" },
24
+ ];
25
+ const result = filterObjectByDateInterval(
26
+ objects,
27
+ "date",
28
+ "2023-02-01/2023-02-28",
29
+ );
30
+ expect(result).to.have.length(2);
31
+ });
32
+
33
+ it("should include objects with date equal to end of interval (end of day)", () => {
34
+ const objects = [
35
+ { name: "Event 1", date: "2023-02-28" },
36
+ { name: "Event 2", date: "2023-03-01" },
37
+ ];
38
+ const result = filterObjectByDateInterval(
39
+ objects,
40
+ "date",
41
+ "2023-02-01/2023-02-28",
42
+ );
43
+ expect(result).to.have.length(1);
44
+ expect(result[0].name).to.equal("Event 1");
45
+ });
46
+
47
+ it("should handle single date interval", () => {
48
+ const objects = [
49
+ { name: "Event 1", date: "2023-02-15" },
50
+ { name: "Event 2", date: "2023-03-15" },
51
+ ];
52
+ const result = filterObjectByDateInterval(objects, "date", "2023-02-15");
53
+ expect(result).to.have.length(1);
54
+ expect(result[0].name).to.equal("Event 1");
55
+ });
56
+
57
+ it("should return all objects when propName is empty", () => {
58
+ const objects = [
59
+ { name: "Event 1", date: "2023-01-15" },
60
+ { name: "Event 2", date: "2023-02-15" },
61
+ ];
62
+ const result = filterObjectByDateInterval(
63
+ objects,
64
+ "",
65
+ "2023-02-01/2023-02-28",
66
+ );
67
+ expect(result).to.have.length(2);
68
+ });
69
+
70
+ it("should return all objects when interval is empty", () => {
71
+ const objects = [
72
+ { name: "Event 1", date: "2023-01-15" },
73
+ { name: "Event 2", date: "2023-02-15" },
74
+ ];
75
+ const result = filterObjectByDateInterval(objects, "date", "");
76
+ expect(result).to.have.length(2);
77
+ });
78
+
79
+ it("should return all objects when interval is not a string", () => {
80
+ const objects = [
81
+ { name: "Event 1", date: "2023-01-15" },
82
+ { name: "Event 2", date: "2023-02-15" },
83
+ ];
84
+ const result = filterObjectByDateInterval(objects, "date", null as any);
85
+ expect(result).to.have.length(2);
86
+ });
87
+
88
+ it("should return all objects when start date is invalid", () => {
89
+ const objects = [
90
+ { name: "Event 1", date: "2023-01-15" },
91
+ { name: "Event 2", date: "2023-02-15" },
92
+ ];
93
+ const result = filterObjectByDateInterval(
94
+ objects,
95
+ "date",
96
+ "invalid/2023-02-28",
97
+ );
98
+ expect(result).to.have.length(2);
99
+ });
100
+
101
+ it("should return all objects when end date is invalid", () => {
102
+ const objects = [
103
+ { name: "Event 1", date: "2023-01-15" },
104
+ { name: "Event 2", date: "2023-02-15" },
105
+ ];
106
+ const result = filterObjectByDateInterval(
107
+ objects,
108
+ "date",
109
+ "2023-01-01/invalid",
110
+ );
111
+ expect(result).to.have.length(2);
112
+ });
113
+
114
+ it("should return all objects when start date is after end date", () => {
115
+ const objects = [
116
+ { name: "Event 1", date: "2023-01-15" },
117
+ { name: "Event 2", date: "2023-02-15" },
118
+ ];
119
+ const result = filterObjectByDateInterval(
120
+ objects,
121
+ "date",
122
+ "2023-03-01/2023-02-01",
123
+ );
124
+ expect(result).to.have.length(2);
125
+ });
126
+ });
127
+
128
+ describe("Date format handling", () => {
129
+ it("should handle ISO date strings", () => {
130
+ const objects = [
131
+ { name: "Event 1", date: "2023-02-15T10:30:00Z" },
132
+ { name: "Event 2", date: "2023-03-15T10:30:00Z" },
133
+ ];
134
+ const result = filterObjectByDateInterval(
135
+ objects,
136
+ "date",
137
+ "2023-02-01/2023-02-28",
138
+ );
139
+ expect(result).to.have.length(1);
140
+ expect(result[0].name).to.equal("Event 1");
141
+ });
142
+
143
+ it("should handle ISO date strings with timezone", () => {
144
+ const objects = [
145
+ { name: "Event 1", date: "2023-02-15T10:30:00+05:00" },
146
+ { name: "Event 2", date: "2023-01-15T10:30:00+05:00" },
147
+ ];
148
+ const result = filterObjectByDateInterval(
149
+ objects,
150
+ "date",
151
+ "2023-02-01/2023-02-28",
152
+ );
153
+ expect(result).to.have.length(1);
154
+ expect(result[0].name).to.equal("Event 1");
155
+ });
156
+
157
+ it("should handle timestamp numbers", () => {
158
+ const objects = [
159
+ { name: "Event 1", date: "2023-02-15" },
160
+ { name: "Event 2", date: "2023-03-15" },
161
+ ];
162
+ const result = filterObjectByDateInterval(
163
+ objects,
164
+ "date",
165
+ "2023-02-01/2023-02-28",
166
+ );
167
+ expect(result).to.have.length(1);
168
+ expect(result[0].name).to.equal("Event 1");
169
+ });
170
+
171
+ it("should handle Date objects", () => {
172
+ const objects = [
173
+ { name: "Event 1", date: new Date("2023-02-15") },
174
+ { name: "Event 2", date: new Date("2023-03-15") },
175
+ ];
176
+ const result = filterObjectByDateInterval(
177
+ objects,
178
+ "date",
179
+ "2023-02-01/2023-02-28",
180
+ );
181
+ expect(result).to.have.length(1);
182
+ expect(result[0].name).to.equal("Event 1");
183
+ });
184
+
185
+ it("should handle various date formats", () => {
186
+ const objects = [
187
+ { name: "Event 1", date: "2023/02/15" },
188
+ { name: "Event 2", date: "2023-03-15" },
189
+ ];
190
+ const result = filterObjectByDateInterval(
191
+ objects,
192
+ "date",
193
+ "2023-02-01/2023-02-28",
194
+ );
195
+ expect(result).to.have.length(1);
196
+ expect(result[0].name).to.equal("Event 1");
197
+ });
198
+
199
+ it("should set end date to end of day (23:59:59.999)", () => {
200
+ const objects = [
201
+ { name: "Event 1", date: "2023-02-28" },
202
+ { name: "Event 2", date: "2023-02-28" },
203
+ { name: "Event 3", date: "2023-03-01" },
204
+ ];
205
+ const result = filterObjectByDateInterval(
206
+ objects,
207
+ "date",
208
+ "2023-02-01/2023-02-28",
209
+ );
210
+ expect(result).to.have.length(2);
211
+ });
212
+ });
213
+
214
+ describe("Nested property handling", () => {
215
+ it("should filter by nested date property", () => {
216
+ const objects = [
217
+ { name: "Project 1", metadata: { createdAt: "2023-02-15" } },
218
+ { name: "Project 2", metadata: { createdAt: "2023-01-15" } },
219
+ ];
220
+ const result = filterObjectByDateInterval(
221
+ objects,
222
+ "metadata.createdAt",
223
+ "2023-02-01/2023-02-28",
224
+ );
225
+ expect(result).to.have.length(1);
226
+ expect(result[0].name).to.equal("Project 1");
227
+ });
228
+
229
+ it("should filter by deeply nested date property", () => {
230
+ const objects = [
231
+ { name: "User 1", data: { profile: { joined: "2023-02-15" } } },
232
+ { name: "User 2", data: { profile: { joined: "2023-01-15" } } },
233
+ ];
234
+ const result = filterObjectByDateInterval(
235
+ objects,
236
+ "data.profile.joined",
237
+ "2023-02-01/2023-02-28",
238
+ );
239
+ expect(result).to.have.length(1);
240
+ expect(result[0].name).to.equal("User 1");
241
+ });
242
+
243
+ it("should search within arrays", () => {
244
+ const objects = [
245
+ {
246
+ name: "Project 1",
247
+ milestones: [{ date: "2023-02-15" }, { date: "2023-03-15" }],
248
+ },
249
+ { name: "Project 2", milestones: [{ date: "2023-01-15" }] },
250
+ ];
251
+ const result = filterObjectByDateInterval(
252
+ objects,
253
+ "milestones",
254
+ "2023-02-01/2023-02-28",
255
+ );
256
+ expect(result).to.have.length(0);
257
+ });
258
+
259
+ it("should return empty array when nested property does not exist", () => {
260
+ const objects = [
261
+ { name: "Event 1", metadata: { createdAt: "2023-02-15" } },
262
+ { name: "Event 2", metadata: { createdAt: "2023-01-15" } },
263
+ ];
264
+ const result = filterObjectByDateInterval(
265
+ objects,
266
+ "nonexistent.property",
267
+ "2023-02-01/2023-02-28",
268
+ );
269
+ expect(result).to.have.length(0);
270
+ });
271
+ });
272
+
273
+ describe("Edge cases", () => {
274
+ it("should handle empty array", () => {
275
+ const result = filterObjectByDateInterval(
276
+ [],
277
+ "date",
278
+ "2023-02-01/2023-02-28",
279
+ );
280
+ expect(result).to.deep.equal([]);
281
+ });
282
+
283
+ it("should handle objects without the property", () => {
284
+ const objects = [
285
+ { name: "Event 1", date: "2023-02-15" },
286
+ { name: "Event 2" },
287
+ { name: "Event 3", date: "2023-03-15" },
288
+ ];
289
+ const result = filterObjectByDateInterval(
290
+ objects,
291
+ "date",
292
+ "2023-02-01/2023-02-28",
293
+ );
294
+ expect(result).to.have.length(1);
295
+ expect(result[0].name).to.equal("Event 1");
296
+ });
297
+
298
+ it("should handle objects with null property", () => {
299
+ const objects = [
300
+ { name: "Event 1", date: null },
301
+ { name: "Event 2", date: "2023-02-15" },
302
+ ];
303
+ const result = filterObjectByDateInterval(
304
+ objects,
305
+ "date",
306
+ "2023-02-01/2023-02-28",
307
+ );
308
+ expect(result).to.have.length(1);
309
+ expect(result[0].name).to.equal("Event 2");
310
+ });
311
+
312
+ it("should handle objects with undefined property", () => {
313
+ const objects = [
314
+ { name: "Event 1", date: undefined },
315
+ { name: "Event 2", date: "2023-02-15" },
316
+ ];
317
+ const result = filterObjectByDateInterval(
318
+ objects,
319
+ "date",
320
+ "2023-02-01/2023-02-28",
321
+ );
322
+ expect(result).to.have.length(1);
323
+ expect(result[0].name).to.equal("Event 2");
324
+ });
325
+
326
+ it("should handle objects with invalid date string", () => {
327
+ const objects = [
328
+ { name: "Event 1", date: "not a date" },
329
+ { name: "Event 2", date: "2023-02-15" },
330
+ ];
331
+ const result = filterObjectByDateInterval(
332
+ objects,
333
+ "date",
334
+ "2023-02-01/2023-02-28",
335
+ );
336
+ expect(result).to.have.length(1);
337
+ expect(result[0].name).to.equal("Event 2");
338
+ });
339
+
340
+ it("should handle invalid date values", () => {
341
+ const objects = [
342
+ { name: "Event 1", date: Number.NaN },
343
+ { name: "Event 2", date: "2023-02-15" },
344
+ ];
345
+ const result = filterObjectByDateInterval(
346
+ objects,
347
+ "date",
348
+ "2023-02-01/2023-02-28",
349
+ );
350
+ expect(result).to.have.length(1);
351
+ expect(result[0].name).to.equal("Event 2");
352
+ });
353
+
354
+ it("should handle empty string date values", () => {
355
+ const objects = [
356
+ { name: "Event 1", date: "" },
357
+ { name: "Event 2", date: "2023-02-15" },
358
+ ];
359
+ const result = filterObjectByDateInterval(
360
+ objects,
361
+ "date",
362
+ "2023-02-01/2023-02-28",
363
+ );
364
+ expect(result).to.have.length(1);
365
+ expect(result[0].name).to.equal("Event 2");
366
+ });
367
+
368
+ it("should return empty array when no dates are within interval", () => {
369
+ const objects = [
370
+ { name: "Event 1", date: "2023-01-15" },
371
+ { name: "Event 2", date: "2023-01-20" },
372
+ ];
373
+ const result = filterObjectByDateInterval(
374
+ objects,
375
+ "date",
376
+ "2023-02-01/2023-02-28",
377
+ );
378
+ expect(result).to.have.length(0);
379
+ });
380
+
381
+ it("should return all objects when all dates are within interval", () => {
382
+ const objects = [
383
+ { name: "Event 1", date: "2023-02-15" },
384
+ { name: "Event 2", date: "2023-02-20" },
385
+ ];
386
+ const result = filterObjectByDateInterval(
387
+ objects,
388
+ "date",
389
+ "2023-02-01/2023-02-28",
390
+ );
391
+ expect(result).to.have.length(2);
392
+ });
393
+ });
394
+
395
+ describe("Precision handling", () => {
396
+ it("should compare dates with millisecond precision", () => {
397
+ const objects = [
398
+ { name: "Event 1", date: "2023-02-01T00:00:00.000Z" },
399
+ { name: "Event 2", date: "2023-02-01T00:00:00.001Z" },
400
+ ];
401
+ const result = filterObjectByDateInterval(
402
+ objects,
403
+ "date",
404
+ "2023-02-01/2023-02-28",
405
+ );
406
+ expect(result).to.have.length(2);
407
+ });
408
+
409
+ it("should handle dates with time components", () => {
410
+ const objects = [
411
+ { name: "Event 1", date: "2023-02-01T08:00:00Z" },
412
+ { name: "Event 2", date: "2023-02-01T12:00:00Z" },
413
+ { name: "Event 3", date: "2023-02-01T16:00:00Z" },
414
+ ];
415
+ const result = filterObjectByDateInterval(
416
+ objects,
417
+ "date",
418
+ "2023-02-01/2023-02-28",
419
+ );
420
+ expect(result).to.have.length(3);
421
+ });
422
+ });
423
+
424
+ describe("Real-world scenarios", () => {
425
+ it("should filter projects by creation date range", () => {
426
+ const projects = [
427
+ { name: "Project A", createdAt: "2023-01-15" },
428
+ { name: "Project B", createdAt: "2023-02-15" },
429
+ { name: "Project C", createdAt: "2023-03-15" },
430
+ { name: "Project D", createdAt: "2023-04-15" },
431
+ ];
432
+ const result = filterObjectByDateInterval(
433
+ projects,
434
+ "createdAt",
435
+ "2023-02-01/2023-03-31",
436
+ );
437
+ expect(result).to.have.length(2);
438
+ expect(result.map((p) => p.name)).to.deep.equal([
439
+ "Project B",
440
+ "Project C",
441
+ ]);
442
+ });
443
+
444
+ it("should filter events by date range", () => {
445
+ const events = [
446
+ { name: "Conference", date: "2023-06-15" },
447
+ { name: "Workshop", date: "2023-06-20" },
448
+ { name: "Meetup", date: "2023-07-01" },
449
+ ];
450
+ const result = filterObjectByDateInterval(
451
+ events,
452
+ "date",
453
+ "2023-06-01/2023-06-30",
454
+ );
455
+ expect(result).to.have.length(2);
456
+ expect(result.map((e) => e.name)).to.deep.equal([
457
+ "Conference",
458
+ "Workshop",
459
+ ]);
460
+ });
461
+
462
+ it("should filter tasks by due date", () => {
463
+ const tasks = [
464
+ { name: "Task 1", dueDate: "2023-05-01" },
465
+ { name: "Task 2", dueDate: "2023-05-15" },
466
+ { name: "Task 3", dueDate: "2023-04-01" },
467
+ ];
468
+ const result = filterObjectByDateInterval(
469
+ tasks,
470
+ "dueDate",
471
+ "2023-05-01/2023-05-31",
472
+ );
473
+ expect(result).to.have.length(2);
474
+ expect(result.map((t) => t.name)).to.deep.equal(["Task 1", "Task 2"]);
475
+ });
476
+
477
+ it("should filter articles by publication date", () => {
478
+ const articles = [
479
+ { title: "Article 1", publishedAt: "2023-01-10" },
480
+ { title: "Article 2", publishedAt: "2023-01-20" },
481
+ { title: "Article 3", publishedAt: "2023-02-05" },
482
+ ];
483
+ const result = filterObjectByDateInterval(
484
+ articles,
485
+ "publishedAt",
486
+ "2023-01-01/2023-01-31",
487
+ );
488
+ expect(result).to.have.length(2);
489
+ expect(result.map((a) => a.title)).to.deep.equal([
490
+ "Article 1",
491
+ "Article 2",
492
+ ]);
493
+ });
494
+
495
+ it("should filter invoices by due date", () => {
496
+ const invoices = [
497
+ { id: 1, dueDate: "2023-12-15" },
498
+ { id: 2, dueDate: "2023-12-31" },
499
+ { id: 3, dueDate: "2024-01-15" },
500
+ ];
501
+ const result = filterObjectByDateInterval(
502
+ invoices,
503
+ "dueDate",
504
+ "2023-12-01/2023-12-31",
505
+ );
506
+ expect(result).to.have.length(2);
507
+ expect(result.map((i) => i.id)).to.deep.equal([1, 2]);
508
+ });
509
+ });
510
+
511
+ describe("Complex nested structures", () => {
512
+ it("should find dates in deeply nested structures", () => {
513
+ const objects = [
514
+ {
515
+ name: "Project 1",
516
+ data: { history: { entry: { date: "2023-02-15" } } },
517
+ },
518
+ {
519
+ name: "Project 2",
520
+ data: { history: { entry: { date: "2023-01-15" } } },
521
+ },
522
+ ];
523
+ const result = filterObjectByDateInterval(
524
+ objects,
525
+ "data.history.entry.date",
526
+ "2023-02-01/2023-02-28",
527
+ );
528
+ expect(result).to.have.length(1);
529
+ });
530
+
531
+ it("should handle mixed date types in nested arrays", () => {
532
+ const objects = [
533
+ {
534
+ name: "Project 1",
535
+ events: ["2023-02-15", "2023-03-15", { date: "2023-04-15" }],
536
+ },
537
+ { name: "Project 2", events: ["2023-01-15"] },
538
+ ];
539
+ const result = filterObjectByDateInterval(
540
+ objects,
541
+ "events",
542
+ "2023-02-01/2023-02-28",
543
+ );
544
+ expect(result).to.have.length(0);
545
+ });
546
+
547
+ it("should handle multiple date properties in nested objects", () => {
548
+ const objects = [
549
+ {
550
+ name: "Project 1",
551
+ schedule: { start: "2023-02-10", end: "2023-02-20" },
552
+ },
553
+ {
554
+ name: "Project 2",
555
+ schedule: { start: "2023-03-10", end: "2023-03-20" },
556
+ },
557
+ ];
558
+ const result = filterObjectByDateInterval(
559
+ objects,
560
+ "schedule",
561
+ "2023-02-01/2023-02-28",
562
+ );
563
+ expect(result).to.have.length(0);
564
+ });
565
+ });
566
+
567
+ describe("Boundary conditions", () => {
568
+ it("should handle interval across year boundary", () => {
569
+ const objects = [
570
+ { name: "Event 1", date: "2023-12-15" },
571
+ { name: "Event 2", date: "2024-01-15" },
572
+ { name: "Event 3", date: "2024-02-15" },
573
+ ];
574
+ const result = filterObjectByDateInterval(
575
+ objects,
576
+ "date",
577
+ "2023-12-01/2024-01-31",
578
+ );
579
+ expect(result).to.have.length(2);
580
+ expect(result.map((e) => e.name)).to.deep.equal(["Event 1", "Event 2"]);
581
+ });
582
+
583
+ it("should handle interval across month boundary", () => {
584
+ const objects = [
585
+ { name: "Event 1", date: "2023-01-25" },
586
+ { name: "Event 2", date: "2023-02-05" },
587
+ { name: "Event 3", date: "2023-02-15" },
588
+ ];
589
+ const result = filterObjectByDateInterval(
590
+ objects,
591
+ "date",
592
+ "2023-01-20/2023-02-10",
593
+ );
594
+ expect(result).to.have.length(2);
595
+ expect(result.map((e) => e.name)).to.deep.equal(["Event 1", "Event 2"]);
596
+ });
597
+
598
+ it("should handle leap year dates", () => {
599
+ const objects = [
600
+ { name: "Event 1", date: "2024-02-28" },
601
+ { name: "Event 2", date: "2024-02-29" },
602
+ { name: "Event 3", date: "2024-03-01" },
603
+ ];
604
+ const result = filterObjectByDateInterval(
605
+ objects,
606
+ "date",
607
+ "2024-02-01/2024-02-29",
608
+ );
609
+ expect(result).to.have.length(2);
610
+ expect(result.map((e) => e.name)).to.deep.equal(["Event 1", "Event 2"]);
611
+ });
612
+ });
613
+ });