@omegup/msync 0.0.36 → 0.0.38

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 (4) hide show
  1. package/index.d.ts +1 -1
  2. package/index.esm.js +378 -378
  3. package/index.js +378 -378
  4. package/package.json +1 -1
package/index.esm.js CHANGED
@@ -1,5 +1,5 @@
1
- import { SynchronousPromise } from 'synchronous-promise';
2
1
  import { UUID, MongoClient } from 'mongodb';
2
+ import { SynchronousPromise } from 'synchronous-promise';
3
3
  import crypto$1 from 'crypto';
4
4
  import { writeFile } from 'fs/promises';
5
5
 
@@ -646,131 +646,390 @@ const $setDelta = (updater) => {
646
646
  .with($setEach(k => to(nil), dict)).stages;
647
647
  };
648
648
 
649
- const $unwindDelta = (k1, k2, k, includeNull) => {
650
- const outer = includeNull === null;
651
- const newItems = {
652
- $filter: {
653
- input: { $ifNull: [`$after.${k2}`, []] },
654
- as: 'a',
655
- cond: {
656
- $not: {
657
- $in: [
658
- '$$a._id',
649
+ const dayAndMonthPart = (date) => asExpr({
650
+ raw: f => asExprRaw({ $dateToString: { date: date.raw(f).get(), format: '%m-%d' } }),
651
+ });
652
+ const now = () => asExpr({
653
+ raw: f => asExprRaw('$$NOW'),
654
+ });
655
+ const monthPart = (date) => asExpr({
656
+ raw: f => asExprRaw({ $dateToString: { date: date.raw(f).get(), format: '%Y-%m' } }),
657
+ });
658
+ const weekPart = (date) => asExpr({
659
+ raw: f => asExprRaw({ $dateToString: { date: date.raw(f).get(), format: '%Y-%U' } }),
660
+ });
661
+ const year = (date) => asExpr({
662
+ raw: f => asExprRaw({ $year: date.raw(f).get() }),
663
+ });
664
+ const dateAdd = (date, amount, unit) => asExpr({
665
+ raw: f => asExprRaw({
666
+ $dateAdd: {
667
+ startDate: date.raw(f).get(),
668
+ unit: unit.raw(f).get(),
669
+ amount: amount.raw(f).get(),
670
+ },
671
+ }),
672
+ });
673
+ const maxDate = (expr) => asExpr({
674
+ raw: f => asExprRaw({ $max: expr.raw(f).get() }),
675
+ });
676
+ const minDate = (expr) => asExpr({
677
+ raw: f => asExprRaw({ $min: expr.raw(f).get() }),
678
+ });
679
+ const datePart = (date) => asExpr({
680
+ raw: f => asExprRaw({ $dateToString: { date: date.raw(f).get(), format: '%Y-%m-%d' } }),
681
+ });
682
+ const startOf = (startDate, freq, offset) => asExpr({
683
+ raw: f => asExprRaw({
684
+ $let: {
685
+ vars: { d: startDate.raw(f).get(), f: freq.raw(f).get(), i: offset.raw(f).get() },
686
+ in: {
687
+ $switch: {
688
+ branches: [
659
689
  {
660
- $map: {
661
- input: { $ifNull: [`$before.${k2}`, []] },
662
- as: 'b',
663
- in: '$$b._id',
690
+ case: { $eq: ['$$f', 'week'] },
691
+ then: {
692
+ $dateFromParts: {
693
+ isoWeekYear: { $isoWeekYear: '$$d' },
694
+ isoWeek: {
695
+ $add: [
696
+ { $isoWeek: '$$d' },
697
+ {
698
+ $cond: {
699
+ if: {
700
+ $lt: ['$$i', { $isoDayOfWeek: '$$d' }],
701
+ },
702
+ then: 1,
703
+ else: 0,
704
+ },
705
+ },
706
+ ],
707
+ },
708
+ isoDayOfWeek: '$$i',
709
+ },
664
710
  },
665
711
  },
666
- ],
667
- },
668
- },
669
- },
670
- };
671
- const oldItems = {
672
- $filter: {
673
- input: {
674
- $map: {
675
- input: { $ifNull: [`$before.${k2}`, []] },
676
- as: 'b',
677
- in: {
678
- before: '$$b',
679
- after: {
680
- $ifNull: [
681
- {
682
- $first: {
683
- $filter: {
684
- input: `$after.${k2}`,
685
- as: 'a',
686
- cond: { $eq: ['$$a._id', '$$b._id'] },
687
- },
712
+ {
713
+ case: { $eq: ['$$f', 'month'] },
714
+ then: {
715
+ $dateFromParts: {
716
+ year: { $year: '$$d' },
717
+ month: {
718
+ $add: [
719
+ { $month: '$$d' },
720
+ {
721
+ $cond: {
722
+ if: {
723
+ $lt: ['$$i', { $dayOfMonth: '$$d' }],
724
+ },
725
+ then: 1,
726
+ else: 0,
727
+ },
728
+ },
729
+ ],
688
730
  },
731
+ day: '$$i',
689
732
  },
690
- null,
691
- ],
733
+ },
734
+ },
735
+ {
736
+ case: { $eq: ['$$f', 'year'] },
737
+ then: {
738
+ $dateFromParts: {
739
+ year: {
740
+ $add: [
741
+ { $year: '$$d' },
742
+ {
743
+ $cond: {
744
+ if: {
745
+ $or: [
746
+ {
747
+ $lt: [{ $floor: { $divide: ['$$i', 100] } }, { $month: '$$d' }],
748
+ },
749
+ {
750
+ $and: [
751
+ {
752
+ $eq: [
753
+ { $floor: { $divide: ['$$i', 100] } },
754
+ { $month: '$$d' },
755
+ ],
756
+ },
757
+ {
758
+ $lt: [{ $mod: ['$$i', 100] }, { $dayOfMonth: '$$d' }],
759
+ },
760
+ ],
761
+ },
762
+ ],
763
+ },
764
+ then: 1,
765
+ else: 0,
766
+ },
767
+ },
768
+ ],
769
+ },
770
+ month: { $floor: { $divide: ['$$i', 100] } },
771
+ day: { $mod: ['$$i', 100] },
772
+ },
773
+ },
774
+ },
775
+ ],
776
+ default: {
777
+ $dateFromParts: {
778
+ year: { $year: '$$d' },
779
+ month: { $month: '$$d' },
780
+ day: { $add: [{ $dayOfMonth: '$$d' }, '$$i'] },
692
781
  },
693
782
  },
694
783
  },
695
784
  },
696
- as: 'a',
697
- cond: { $ne: ['$$a.before', '$$a.after'] },
698
785
  },
699
- };
700
- const ifNull = (k, part, str = `$${k}.${part}._id`) => outer && k == k2 ? { $ifNull: [str, 'null'] } : str;
701
- const interDot = ([a, b]) => [a, '.', b];
702
- const partReplace = (part) => ({
703
- $cond: {
704
- if: { $or: [{ $eq: [`$${k1}.${part}`, null] }, { $eq: [`$${k2}.${part}`, null] }] },
705
- then: null,
706
- else: {
707
- _id: k
708
- ? ifNull(k, part)
709
- : {
710
- $concat: interDot([k1, k2].sort().map(k => ifNull(k, part))),
711
- },
712
- [k1]: `$${k1}.${part}`,
713
- [k2]: outer
714
- ? {
715
- $cond: {
716
- if: `$${k2}.${part}._id`,
717
- then: `$${k2}.${part}`,
718
- else: null,
719
- },
720
- }
721
- : `$${k2}.${part}`,
786
+ }),
787
+ });
788
+ const dateDiff = ({ end, unit, start, }) => asExpr({
789
+ raw: f => asExprRaw({
790
+ $let: {
791
+ vars: {
792
+ f: unit.raw(f).get(),
793
+ end: end.raw(f).get(),
794
+ start: start.raw(f).get(),
722
795
  },
723
- },
724
- });
725
- const stages = link()
726
- .with(asStages([
727
- {
728
- $set: {
729
- [k1]: {
730
- before: { $ifNull: [`$before.${k1}`, null] },
731
- after: { $ifNull: [`$after.${k1}`, null] },
732
- },
733
- [k2]: {
734
- $concatArrays: [
735
- outer
736
- ? {
737
- $cond: {
738
- if: { $eq: [`$before.${k2}`, []] },
796
+ in: {
797
+ $let: {
798
+ vars: {
799
+ diff: {
800
+ $dateDiff: {
801
+ startDate: '$$start',
802
+ endDate: '$$end',
803
+ unit: '$$f',
804
+ },
805
+ },
806
+ },
807
+ in: {
808
+ $switch: {
809
+ branches: [
810
+ {
811
+ case: { $eq: ['$$f', 'month'] },
739
812
  then: {
740
813
  $cond: {
741
- if: { $eq: [`$after.${k2}`, []] },
742
- then: [],
743
- else: [{ before: {}, after: null }],
814
+ if: {
815
+ $lte: [{ $dayOfMonth: '$$start' }, { $dayOfMonth: '$$end' }],
816
+ },
817
+ then: '$$diff',
818
+ else: { $subtract: ['$$diff', 1] },
744
819
  },
745
820
  },
746
- else: oldItems,
747
821
  },
748
- }
749
- : oldItems,
750
- {
751
- $map: {
752
- input: outer
753
- ? {
822
+ {
823
+ case: { $eq: ['$$f', 'week'] },
824
+ then: {
754
825
  $cond: {
755
826
  if: {
756
- $and: [{ $ne: [`$before.${k2}`, []] }, { $eq: [`$after.${k2}`, []] }],
827
+ $lte: [{ $isoDayOfWeek: '$$start' }, { $isoDayOfWeek: '$$end' }],
757
828
  },
758
- then: [{}],
759
- else: newItems,
829
+ then: '$$diff',
830
+ else: { $subtract: ['$$diff', 1] },
760
831
  },
761
- }
762
- : newItems,
763
- as: 'a',
764
- in: { before: null, after: '$$a' },
765
- },
766
- },
767
- ],
768
- },
769
- },
770
- },
771
- ]))
772
- .with($unwind_(k2))
773
- .with(asStages([
832
+ },
833
+ },
834
+ {
835
+ case: { $eq: ['$$f', 'year'] },
836
+ then: {
837
+ $cond: {
838
+ if: {
839
+ $or: [
840
+ {
841
+ $lt: [{ $month: '$$start' }, { $month: '$$end' }],
842
+ },
843
+ {
844
+ $and: [
845
+ {
846
+ $eq: [{ $month: '$$start' }, { $month: '$$end' }],
847
+ },
848
+ {
849
+ $lte: [{ $dayOfMonth: '$$start' }, { $dayOfMonth: '$$end' }],
850
+ },
851
+ ],
852
+ },
853
+ ],
854
+ },
855
+ then: '$$diff',
856
+ else: { $subtract: ['$$diff', 1] },
857
+ },
858
+ },
859
+ },
860
+ ],
861
+ default: '$$diff',
862
+ },
863
+ },
864
+ },
865
+ },
866
+ },
867
+ }),
868
+ });
869
+
870
+ const range = (start, end, step) => asExpr({
871
+ raw: f => asExprRaw({ $range: [start.raw(f).get(), end.raw(f).get(), step?.raw(f).get() ?? 1] }),
872
+ });
873
+ const $map1 = (ex, map) => asExpr({
874
+ raw: f => asExprRaw({
875
+ $map: {
876
+ input: ex.raw(f).get(),
877
+ as: 'item',
878
+ in: map(ctx()('item')).raw(f).get(),
879
+ },
880
+ }),
881
+ });
882
+ const $map = (ex, map) => $map1(ex, i => map(i.expr()));
883
+
884
+ const operator = () => (op) => (operand) => {
885
+ return {
886
+ raw: { [op]: operand },
887
+ expr: (field) => asExpr({
888
+ raw: f => asExprRaw({ [op]: [$ifNull(field.expr(), nil).raw(f).get(), operand] }),
889
+ }),
890
+ };
891
+ };
892
+
893
+ const dualEq = operator();
894
+ const $eq = dualEq('$eq');
895
+ const $ne = dualEq('$ne');
896
+ const comp = operator();
897
+ const $gt = comp('$gt');
898
+ const $gtTs = comp('$gt');
899
+ const $gteTs = comp('$gte');
900
+ const $lt = comp('$lt');
901
+ const dateLt = comp('$lt');
902
+ const $gte = comp('$gte');
903
+ const $lte = comp('$lte');
904
+
905
+ const $expr = (expr) => ({
906
+ raw: f => ({ $expr: expr.raw(f).get() }),
907
+ });
908
+
909
+ const dualIn = operator();
910
+ const $in = dualIn('$in');
911
+ const $nin = dualIn('$nin');
912
+
913
+ const $unwindDelta = (k1, k2, k, includeNull) => {
914
+ const outer = includeNull === null;
915
+ const newItems = {
916
+ $filter: {
917
+ input: { $ifNull: [`$after.${k2}`, []] },
918
+ as: 'a',
919
+ cond: {
920
+ $not: {
921
+ $in: [
922
+ '$$a._id',
923
+ {
924
+ $map: {
925
+ input: { $ifNull: [`$before.${k2}`, []] },
926
+ as: 'b',
927
+ in: '$$b._id',
928
+ },
929
+ },
930
+ ],
931
+ },
932
+ },
933
+ },
934
+ };
935
+ const oldItems = {
936
+ $map: {
937
+ input: { $ifNull: [`$before.${k2}`, []] },
938
+ as: 'b',
939
+ in: {
940
+ before: '$$b',
941
+ after: {
942
+ $ifNull: [
943
+ {
944
+ $first: {
945
+ $filter: {
946
+ input: `$after.${k2}`,
947
+ as: 'a',
948
+ cond: { $eq: ['$$a._id', '$$b._id'] },
949
+ },
950
+ },
951
+ },
952
+ null,
953
+ ],
954
+ },
955
+ },
956
+ },
957
+ };
958
+ const ifNull = (k, part, str = `$${k}.${part}._id`) => outer && k == k2 ? { $ifNull: [str, 'null'] } : str;
959
+ const interDot = ([a, b]) => [a, '.', b];
960
+ const partReplace = (part) => ({
961
+ $cond: {
962
+ if: { $or: [{ $eq: [`$${k1}.${part}`, null] }, { $eq: [`$${k2}.${part}`, null] }] },
963
+ then: null,
964
+ else: {
965
+ _id: k
966
+ ? ifNull(k, part)
967
+ : {
968
+ $concat: interDot([k1, k2].sort().map(k => ifNull(k, part))),
969
+ },
970
+ [k1]: `$${k1}.${part}`,
971
+ [k2]: outer
972
+ ? {
973
+ $cond: {
974
+ if: `$${k2}.${part}._id`,
975
+ then: `$${k2}.${part}`,
976
+ else: null,
977
+ },
978
+ }
979
+ : `$${k2}.${part}`,
980
+ },
981
+ },
982
+ });
983
+ const part = (k) => root().of(k).expr();
984
+ const stages = link()
985
+ .with(asStages([
986
+ {
987
+ $set: {
988
+ [k1]: {
989
+ before: { $ifNull: [`$before.${k1}`, null] },
990
+ after: { $ifNull: [`$after.${k1}`, null] },
991
+ },
992
+ [k2]: {
993
+ $concatArrays: [
994
+ outer
995
+ ? {
996
+ $cond: {
997
+ if: { $eq: [`$before.${k2}`, []] },
998
+ then: {
999
+ $cond: {
1000
+ if: { $eq: [`$after.${k2}`, []] },
1001
+ then: [],
1002
+ else: [{ before: {}, after: null }],
1003
+ },
1004
+ },
1005
+ else: oldItems,
1006
+ },
1007
+ }
1008
+ : oldItems,
1009
+ {
1010
+ $map: {
1011
+ input: outer
1012
+ ? {
1013
+ $cond: {
1014
+ if: {
1015
+ $and: [{ $ne: [`$before.${k2}`, []] }, { $eq: [`$after.${k2}`, []] }],
1016
+ },
1017
+ then: [{}],
1018
+ else: newItems,
1019
+ },
1020
+ }
1021
+ : newItems,
1022
+ as: 'a',
1023
+ in: { before: null, after: '$$a' },
1024
+ },
1025
+ },
1026
+ ],
1027
+ },
1028
+ },
1029
+ },
1030
+ ]))
1031
+ .with($unwind_(k2))
1032
+ .with(asStages([
774
1033
  {
775
1034
  $replaceWith: {
776
1035
  _id: '$_id',
@@ -778,7 +1037,8 @@ const $unwindDelta = (k1, k2, k, includeNull) => {
778
1037
  after: partReplace('after'),
779
1038
  },
780
1039
  },
781
- ])).stages;
1040
+ ]))
1041
+ .with($match_($expr(ne(part('before'))(part('after'))))).stages;
782
1042
  return stages;
783
1043
  };
784
1044
 
@@ -827,10 +1087,6 @@ const $lookupDelta = ({ field1, field2 }, { coll, exec, input }, k1, k2, k, incl
827
1087
  })).with($unwindDelta(k1, k2, k, includeNull)).stages;
828
1088
  };
829
1089
 
830
- const $expr = (expr) => ({
831
- raw: f => ({ $expr: expr.raw(f).get() }),
832
- });
833
-
834
1090
  const $lookupRaw = ({ field1, field2 }, { coll, exec, input }, k2, k) => (f) => {
835
1091
  root().of('_id').expr();
836
1092
  root().of(k2).of('_id').expr();
@@ -947,18 +1203,22 @@ class Machine {
947
1203
  }
948
1204
  start(cb) {
949
1205
  const run = this.runner();
950
- return runCont(run(), cb);
1206
+ return runCont(run, cb);
951
1207
  }
952
1208
  }
953
1209
  const wrap = (root) => root;
954
- const runCont = async ({ next, clear }, cb) => {
955
- const { cont, info } = await next;
956
- const stopped = cb?.(info);
957
- if (stopped) {
1210
+ const runCont = async (it, cb) => {
1211
+ const { next, stop, clear } = it();
1212
+ const res = await next.then(next => ({ ok: true, next }), err => ({ ok: false, err }));
1213
+ if (!res.ok) {
1214
+ return runCont(stop, cb);
1215
+ }
1216
+ const { cont, info } = res.next;
1217
+ if (cb?.(info)) {
958
1218
  await clear();
959
1219
  throw new Error('Machine stopped');
960
1220
  }
961
- return runCont(cont(), cb);
1221
+ return runCont(cont, cb);
962
1222
  };
963
1223
 
964
1224
  const merge = ({ lsource: L, rsource: R, }) => mergeIterators({ sources: { L, R } });
@@ -1007,31 +1267,6 @@ const $outerLookup = (p, outer) => (l) => $lookup1({
1007
1267
  left: l(emptyDelta()),
1008
1268
  }, outer);
1009
1269
 
1010
- const operator = () => (op) => (operand) => {
1011
- return {
1012
- raw: { [op]: operand },
1013
- expr: (field) => asExpr({
1014
- raw: f => asExprRaw({ [op]: [$ifNull(field.expr(), nil).raw(f).get(), operand] }),
1015
- }),
1016
- };
1017
- };
1018
-
1019
- const dualEq = operator();
1020
- const $eq = dualEq('$eq');
1021
- const $ne = dualEq('$ne');
1022
- const comp = operator();
1023
- const $gt = comp('$gt');
1024
- const $gtTs = comp('$gt');
1025
- const $gteTs = comp('$gte');
1026
- const $lt = comp('$lt');
1027
- const dateLt = comp('$lt');
1028
- const $gte = comp('$gte');
1029
- const $lte = comp('$lte');
1030
-
1031
- const dualIn = operator();
1032
- const $in = dualIn('$in');
1033
- const $nin = dualIn('$nin');
1034
-
1035
1270
  const make = (alter) => {
1036
1271
  return (op, args) => alter(op, args.filter(defined));
1037
1272
  };
@@ -1152,7 +1387,7 @@ const aggregate = (input, snapshot = true, start = Date.now()) => input(({ coll,
1152
1387
  log('execed', req, result, 'took', Date.now() - start);
1153
1388
  return result;
1154
1389
  }, err => {
1155
- log('err', req);
1390
+ log('err', req, err);
1156
1391
  throw new Error(err);
1157
1392
  });
1158
1393
  });
@@ -1510,241 +1745,6 @@ const executes = (view, input, streamName) => {
1510
1745
  const emptyLin = () => ({ lin: link().stages });
1511
1746
  const from = (view, streamName) => pipe(input => executes(view, input.lin, streamName), { lin: link().stages }, ({ lin: a }, { lin: b }) => ({ lin: concatStages(a, b) }), emptyLin);
1512
1747
 
1513
- const dayAndMonthPart = (date) => asExpr({
1514
- raw: f => asExprRaw({ $dateToString: { date: date.raw(f).get(), format: '%m-%d' } }),
1515
- });
1516
- const now = () => asExpr({
1517
- raw: f => asExprRaw('$$NOW'),
1518
- });
1519
- const monthPart = (date) => asExpr({
1520
- raw: f => asExprRaw({ $dateToString: { date: date.raw(f).get(), format: '%Y-%m' } }),
1521
- });
1522
- const weekPart = (date) => asExpr({
1523
- raw: f => asExprRaw({ $dateToString: { date: date.raw(f).get(), format: '%Y-%U' } }),
1524
- });
1525
- const year = (date) => asExpr({
1526
- raw: f => asExprRaw({ $year: date.raw(f).get() }),
1527
- });
1528
- const dateAdd = (date, amount, unit) => asExpr({
1529
- raw: f => asExprRaw({
1530
- $dateAdd: {
1531
- startDate: date.raw(f).get(),
1532
- unit: unit.raw(f).get(),
1533
- amount: amount.raw(f).get(),
1534
- },
1535
- }),
1536
- });
1537
- const maxDate = (expr) => asExpr({
1538
- raw: f => asExprRaw({ $max: expr.raw(f).get() }),
1539
- });
1540
- const minDate = (expr) => asExpr({
1541
- raw: f => asExprRaw({ $min: expr.raw(f).get() }),
1542
- });
1543
- const datePart = (date) => asExpr({
1544
- raw: f => asExprRaw({ $dateToString: { date: date.raw(f).get(), format: '%Y-%m-%d' } }),
1545
- });
1546
- const startOf = (startDate, freq, offset) => asExpr({
1547
- raw: f => asExprRaw({
1548
- $let: {
1549
- vars: { d: startDate.raw(f).get(), f: freq.raw(f).get(), i: offset.raw(f).get() },
1550
- in: {
1551
- $switch: {
1552
- branches: [
1553
- {
1554
- case: { $eq: ['$$f', 'week'] },
1555
- then: {
1556
- $dateFromParts: {
1557
- isoWeekYear: { $isoWeekYear: '$$d' },
1558
- isoWeek: {
1559
- $add: [
1560
- { $isoWeek: '$$d' },
1561
- {
1562
- $cond: {
1563
- if: {
1564
- $lt: ['$$i', { $isoDayOfWeek: '$$d' }],
1565
- },
1566
- then: 1,
1567
- else: 0,
1568
- },
1569
- },
1570
- ],
1571
- },
1572
- isoDayOfWeek: '$$i',
1573
- },
1574
- },
1575
- },
1576
- {
1577
- case: { $eq: ['$$f', 'month'] },
1578
- then: {
1579
- $dateFromParts: {
1580
- year: { $year: '$$d' },
1581
- month: {
1582
- $add: [
1583
- { $month: '$$d' },
1584
- {
1585
- $cond: {
1586
- if: {
1587
- $lt: ['$$i', { $dayOfMonth: '$$d' }],
1588
- },
1589
- then: 1,
1590
- else: 0,
1591
- },
1592
- },
1593
- ],
1594
- },
1595
- day: '$$i',
1596
- },
1597
- },
1598
- },
1599
- {
1600
- case: { $eq: ['$$f', 'year'] },
1601
- then: {
1602
- $dateFromParts: {
1603
- year: {
1604
- $add: [
1605
- { $year: '$$d' },
1606
- {
1607
- $cond: {
1608
- if: {
1609
- $or: [
1610
- {
1611
- $lt: [{ $floor: { $divide: ['$$i', 100] } }, { $month: '$$d' }],
1612
- },
1613
- {
1614
- $and: [
1615
- {
1616
- $eq: [
1617
- { $floor: { $divide: ['$$i', 100] } },
1618
- { $month: '$$d' },
1619
- ],
1620
- },
1621
- {
1622
- $lt: [{ $mod: ['$$i', 100] }, { $dayOfMonth: '$$d' }],
1623
- },
1624
- ],
1625
- },
1626
- ],
1627
- },
1628
- then: 1,
1629
- else: 0,
1630
- },
1631
- },
1632
- ],
1633
- },
1634
- month: { $floor: { $divide: ['$$i', 100] } },
1635
- day: { $mod: ['$$i', 100] },
1636
- },
1637
- },
1638
- },
1639
- ],
1640
- default: {
1641
- $dateFromParts: {
1642
- year: { $year: '$$d' },
1643
- month: { $month: '$$d' },
1644
- day: { $add: [{ $dayOfMonth: '$$d' }, '$$i'] },
1645
- },
1646
- },
1647
- },
1648
- },
1649
- },
1650
- }),
1651
- });
1652
- const dateDiff = ({ end, unit, start, }) => asExpr({
1653
- raw: f => asExprRaw({
1654
- $let: {
1655
- vars: {
1656
- f: unit.raw(f).get(),
1657
- end: end.raw(f).get(),
1658
- start: start.raw(f).get(),
1659
- },
1660
- in: {
1661
- $let: {
1662
- vars: {
1663
- diff: {
1664
- $dateDiff: {
1665
- startDate: '$$start',
1666
- endDate: '$$end',
1667
- unit: '$$f',
1668
- },
1669
- },
1670
- },
1671
- in: {
1672
- $switch: {
1673
- branches: [
1674
- {
1675
- case: { $eq: ['$$f', 'month'] },
1676
- then: {
1677
- $cond: {
1678
- if: {
1679
- $lte: [{ $dayOfMonth: '$$start' }, { $dayOfMonth: '$$end' }],
1680
- },
1681
- then: '$$diff',
1682
- else: { $subtract: ['$$diff', 1] },
1683
- },
1684
- },
1685
- },
1686
- {
1687
- case: { $eq: ['$$f', 'week'] },
1688
- then: {
1689
- $cond: {
1690
- if: {
1691
- $lte: [{ $isoDayOfWeek: '$$start' }, { $isoDayOfWeek: '$$end' }],
1692
- },
1693
- then: '$$diff',
1694
- else: { $subtract: ['$$diff', 1] },
1695
- },
1696
- },
1697
- },
1698
- {
1699
- case: { $eq: ['$$f', 'year'] },
1700
- then: {
1701
- $cond: {
1702
- if: {
1703
- $or: [
1704
- {
1705
- $lt: [{ $month: '$$start' }, { $month: '$$end' }],
1706
- },
1707
- {
1708
- $and: [
1709
- {
1710
- $eq: [{ $month: '$$start' }, { $month: '$$end' }],
1711
- },
1712
- {
1713
- $lte: [{ $dayOfMonth: '$$start' }, { $dayOfMonth: '$$end' }],
1714
- },
1715
- ],
1716
- },
1717
- ],
1718
- },
1719
- then: '$$diff',
1720
- else: { $subtract: ['$$diff', 1] },
1721
- },
1722
- },
1723
- },
1724
- ],
1725
- default: '$$diff',
1726
- },
1727
- },
1728
- },
1729
- },
1730
- },
1731
- }),
1732
- });
1733
-
1734
- const range = (start, end, step) => asExpr({
1735
- raw: f => asExprRaw({ $range: [start.raw(f).get(), end.raw(f).get(), step?.raw(f).get() ?? 1] }),
1736
- });
1737
- const $map1 = (ex, map) => asExpr({
1738
- raw: f => asExprRaw({
1739
- $map: {
1740
- input: ex.raw(f).get(),
1741
- as: 'item',
1742
- in: map(ctx()('item')).raw(f).get(),
1743
- },
1744
- }),
1745
- });
1746
- const $map = (ex, map) => $map1(ex, i => map(i.expr()));
1747
-
1748
1748
  require('dotenv').config();
1749
1749
  const uri = process.env['MONGO_URL'];
1750
1750