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