cqm-models 3.1.1 → 3.1.2

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.
data/dist/index.js CHANGED
@@ -3408,7 +3408,7 @@ function Any(key, options) {
3408
3408
  Any.prototype = Object.create(mongoose.SchemaType.prototype);
3409
3409
 
3410
3410
  function RecursiveCast(any) {
3411
- if (any && any.value && any.unit) {
3411
+ if (any && any.value !== undefined && any.unit) {
3412
3412
  return new cql.Quantity(any.value, any.unit);
3413
3413
  }
3414
3414
 
@@ -7027,8 +7027,8 @@ class Unit {
7027
7027
  * concatenated string. Basically it checks to see if the string
7028
7028
  * needs to be enclosed either in parentheses or square brackets.
7029
7029
  *
7030
- * The string is enclosed if it is not a number, does not start with
7031
- * a parenthesis or square bracket, and includes a period, and asterisk,
7030
+ * The string is enclosed if it is not a number, is not already enclosed in a pair of
7031
+ * parentheses or square brackets, and includes a period, and asterisk,
7032
7032
  * a slash or a blank space.
7033
7033
  *
7034
7034
  * @param str the string
@@ -7044,7 +7044,7 @@ class Unit {
7044
7044
  if (intUtils_.isNumericString(str)) {
7045
7045
  ret = str;
7046
7046
  } else {
7047
- if (str.charAt(0) === '(' || str.charAt(0) === '[') {
7047
+ if (str.charAt(0) === '(' && str.endsWith(')') || str.charAt(0) === '[' && str.endsWith(']')) {
7048
7048
  ret = str;
7049
7049
  } else if (/[./* ]/.test(str)) {
7050
7050
  ret = startChar + str + endChar;
@@ -9926,7 +9926,7 @@ var objectKeys = Object.keys || function (obj) {
9926
9926
  };
9927
9927
 
9928
9928
  }).call(this)}).call(this,typeof global !== "undefined" ? global : typeof self !== "undefined" ? self : typeof window !== "undefined" ? window : {})
9929
- },{"object-assign":323,"util/":105}],103:[function(require,module,exports){
9929
+ },{"object-assign":325,"util/":105}],103:[function(require,module,exports){
9930
9930
  if (typeof Object.create === 'function') {
9931
9931
  // implementation from standard node.js 'util' module
9932
9932
  module.exports = function inherits(ctor, superCtor) {
@@ -10548,7 +10548,7 @@ function hasOwnProperty(obj, prop) {
10548
10548
  }
10549
10549
 
10550
10550
  }).call(this)}).call(this,require('_process'),typeof global !== "undefined" ? global : typeof self !== "undefined" ? self : typeof window !== "undefined" ? window : {})
10551
- },{"./support/isBuffer":104,"_process":324,"inherits":103}],106:[function(require,module,exports){
10551
+ },{"./support/isBuffer":104,"_process":326,"inherits":103}],106:[function(require,module,exports){
10552
10552
  'use strict'
10553
10553
 
10554
10554
  exports.byteLength = byteLength
@@ -16326,7 +16326,7 @@ module.exports = ret;
16326
16326
  },{"./es5":13}]},{},[4])(4)
16327
16327
  }); ;if (typeof window !== 'undefined' && window !== null) { window.P = window.Promise; } else if (typeof self !== 'undefined' && self !== null) { self.P = self.Promise; }
16328
16328
  }).call(this)}).call(this,require('_process'),typeof global !== "undefined" ? global : typeof self !== "undefined" ? self : typeof window !== "undefined" ? window : {},require("timers").setImmediate)
16329
- },{"_process":324,"timers":328}],108:[function(require,module,exports){
16329
+ },{"_process":326,"timers":330}],108:[function(require,module,exports){
16330
16330
  (function (global){(function (){
16331
16331
  /**
16332
16332
  * Module dependencies.
@@ -18260,6 +18260,11 @@ Long.prototype.toNumber = function() {
18260
18260
  return this.high_ * Long.TWO_PWR_32_DBL_ + this.getLowBitsUnsigned();
18261
18261
  };
18262
18262
 
18263
+ /** Converts the Long to a BigInt (arbitrary precision). */
18264
+ Long.prototype.toBigInt = function () {
18265
+ return BigInt(this.toString());
18266
+ }
18267
+
18263
18268
  /**
18264
18269
  * Return the JSON value.
18265
18270
  *
@@ -18894,6 +18899,15 @@ Long.fromNumber = function(value) {
18894
18899
  }
18895
18900
  };
18896
18901
 
18902
+ /**
18903
+ * Returns a Long representing the given value, provided that it is a finite number. Otherwise, zero is returned.
18904
+ * @param {bigint} value - The number in question
18905
+ * @returns {Long} The corresponding Long value
18906
+ */
18907
+ Long.fromBigInt = function(value) {
18908
+ return Long.fromString(value.toString(10), 10);
18909
+ }
18910
+
18897
18911
  /**
18898
18912
  * Returns a Long representing the 64-bit integer that comes by concatenating the given high and low bits. Each is assumed to use 32 bits.
18899
18913
  *
@@ -19593,7 +19607,7 @@ module.exports.ObjectID = ObjectID;
19593
19607
  module.exports.ObjectId = ObjectID;
19594
19608
 
19595
19609
  }).call(this)}).call(this,require('_process'),require("buffer").Buffer)
19596
- },{"./parser/utils":124,"_process":324,"buffer":128,"util":331}],121:[function(require,module,exports){
19610
+ },{"./parser/utils":124,"_process":326,"buffer":128,"util":333}],121:[function(require,module,exports){
19597
19611
  (function (Buffer){(function (){
19598
19612
  'use strict';
19599
19613
 
@@ -21349,6 +21363,8 @@ var serializeInto = function serializeInto(
21349
21363
  index = serializeString(buffer, key, value, index, true);
21350
21364
  } else if (type === 'number') {
21351
21365
  index = serializeNumber(buffer, key, value, index, true);
21366
+ } else if(type === 'bigint') {
21367
+ throw new TypeError('Unsupported type BigInt, please use Decimal128');
21352
21368
  } else if (type === 'boolean') {
21353
21369
  index = serializeBoolean(buffer, key, value, index, true);
21354
21370
  } else if (value instanceof Date || isDate(value)) {
@@ -21460,6 +21476,8 @@ var serializeInto = function serializeInto(
21460
21476
  index = serializeString(buffer, key, value, index);
21461
21477
  } else if (type === 'number') {
21462
21478
  index = serializeNumber(buffer, key, value, index);
21479
+ } else if(type === 'bigint') {
21480
+ throw new TypeError('Unsupported type BigInt, please use Decimal128');
21463
21481
  } else if (type === 'boolean') {
21464
21482
  index = serializeBoolean(buffer, key, value, index);
21465
21483
  } else if (value instanceof Date || isDate(value)) {
@@ -21563,6 +21581,8 @@ var serializeInto = function serializeInto(
21563
21581
  index = serializeString(buffer, key, value, index);
21564
21582
  } else if (type === 'number') {
21565
21583
  index = serializeNumber(buffer, key, value, index);
21584
+ } else if(type === 'bigint') {
21585
+ throw new TypeError('Unsupported type BigInt, please use Decimal128');
21566
21586
  } else if (type === 'boolean') {
21567
21587
  index = serializeBoolean(buffer, key, value, index);
21568
21588
  } else if (value instanceof Date || isDate(value)) {
@@ -21949,7 +21969,7 @@ module.exports = Symbol;
21949
21969
  module.exports.Symbol = Symbol;
21950
21970
 
21951
21971
  }).call(this)}).call(this,require("buffer").Buffer)
21952
- },{"buffer":128,"util":331}],127:[function(require,module,exports){
21972
+ },{"buffer":128,"util":333}],127:[function(require,module,exports){
21953
21973
  // Licensed under the Apache License, Version 2.0 (the "License");
21954
21974
  // you may not use this file except in compliance with the License.
21955
21975
  // You may obtain a copy of the License at
@@ -40713,7 +40733,7 @@ function decorateNextFn(fn) {
40713
40733
  module.exports = Kareem;
40714
40734
 
40715
40735
  }).call(this)}).call(this,require('_process'))
40716
- },{"_process":324}],182:[function(require,module,exports){
40736
+ },{"_process":326}],182:[function(require,module,exports){
40717
40737
  'use strict';
40718
40738
 
40719
40739
  Object.defineProperty(exports, '__esModule', { value: true });
@@ -41430,13 +41450,13 @@ var monthsNarrow = ["J", "F", "M", "A", "M", "J", "J", "A", "S", "O", "N", "D"];
41430
41450
  function months(length) {
41431
41451
  switch (length) {
41432
41452
  case "narrow":
41433
- return monthsNarrow;
41453
+ return [].concat(monthsNarrow);
41434
41454
 
41435
41455
  case "short":
41436
- return monthsShort;
41456
+ return [].concat(monthsShort);
41437
41457
 
41438
41458
  case "long":
41439
- return monthsLong;
41459
+ return [].concat(monthsLong);
41440
41460
 
41441
41461
  case "numeric":
41442
41462
  return ["1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12"];
@@ -41454,13 +41474,13 @@ var weekdaysNarrow = ["M", "T", "W", "T", "F", "S", "S"];
41454
41474
  function weekdays(length) {
41455
41475
  switch (length) {
41456
41476
  case "narrow":
41457
- return weekdaysNarrow;
41477
+ return [].concat(weekdaysNarrow);
41458
41478
 
41459
41479
  case "short":
41460
- return weekdaysShort;
41480
+ return [].concat(weekdaysShort);
41461
41481
 
41462
41482
  case "long":
41463
- return weekdaysLong;
41483
+ return [].concat(weekdaysLong);
41464
41484
 
41465
41485
  case "numeric":
41466
41486
  return ["1", "2", "3", "4", "5", "6", "7"];
@@ -41476,13 +41496,13 @@ var erasNarrow = ["B", "A"];
41476
41496
  function eras(length) {
41477
41497
  switch (length) {
41478
41498
  case "narrow":
41479
- return erasNarrow;
41499
+ return [].concat(erasNarrow);
41480
41500
 
41481
41501
  case "short":
41482
- return erasShort;
41502
+ return [].concat(erasShort);
41483
41503
 
41484
41504
  case "long":
41485
- return erasLong;
41505
+ return [].concat(erasLong);
41486
41506
 
41487
41507
  default:
41488
41508
  return null;
@@ -42497,7 +42517,7 @@ var IANAZone = /*#__PURE__*/function (_Zone) {
42497
42517
 
42498
42518
  IANAZone.parseGMTOffset = function parseGMTOffset(specifier) {
42499
42519
  if (specifier) {
42500
- var match = specifier.match(/^Etc\/GMT([+-]\d{1,2})$/i);
42520
+ var match = specifier.match(/^Etc\/GMT(0|[+-]\d{1,2})$/i);
42501
42521
 
42502
42522
  if (match) {
42503
42523
  return -60 * parseInt(match[1]);
@@ -42540,8 +42560,10 @@ var IANAZone = /*#__PURE__*/function (_Zone) {
42540
42560
  ;
42541
42561
 
42542
42562
  _proto.offset = function offset(ts) {
42543
- var date = new Date(ts),
42544
- dtf = makeDTF(this.name),
42563
+ var date = new Date(ts);
42564
+ if (isNaN(date)) return NaN;
42565
+
42566
+ var dtf = makeDTF(this.name),
42545
42567
  _ref2 = dtf.formatToParts ? partsOffset(dtf, date) : hackyOffset(dtf, date),
42546
42568
  year = _ref2[0],
42547
42569
  month = _ref2[1],
@@ -43200,12 +43222,16 @@ var PolyDateFormatter = /*#__PURE__*/function () {
43200
43222
  if (dt.zone.universal && this.hasIntl) {
43201
43223
  // UTC-8 or Etc/UTC-8 are not part of tzdata, only Etc/GMT+8 and the like.
43202
43224
  // That is why fixed-offset TZ is set to that unless it is:
43203
- // 1. Outside of the supported range Etc/GMT-14 to Etc/GMT+12.
43204
- // 2. Not a whole hour, e.g. UTC+4:30.
43225
+ // 1. Representing offset 0 when UTC is used to maintain previous behavior and does not become GMT.
43226
+ // 2. Unsupported by the browser:
43227
+ // - some do not support Etc/
43228
+ // - < Etc/GMT-14, > Etc/GMT+12, and 30-minute or 45-minute offsets are not part of tzdata
43205
43229
  var gmtOffset = -1 * (dt.offset / 60);
43230
+ var offsetZ = gmtOffset >= 0 ? "Etc/GMT+" + gmtOffset : "Etc/GMT" + gmtOffset;
43231
+ var isOffsetZoneSupported = IANAZone.isValidZone(offsetZ);
43206
43232
 
43207
- if (gmtOffset >= -14 && gmtOffset <= 12 && gmtOffset % 1 === 0) {
43208
- z = gmtOffset >= 0 ? "Etc/GMT+" + gmtOffset : "Etc/GMT" + gmtOffset;
43233
+ if (dt.offset !== 0 && isOffsetZoneSupported) {
43234
+ z = offsetZ;
43209
43235
  this.dt = dt;
43210
43236
  } else {
43211
43237
  // Not all fixed-offset zones like Etc/+4:30 are present in tzdata.
@@ -43742,9 +43768,14 @@ function extractISODuration(match) {
43742
43768
  secondStr = match[7],
43743
43769
  millisecondsStr = match[8];
43744
43770
  var hasNegativePrefix = s[0] === "-";
43771
+ var negativeSeconds = secondStr && secondStr[0] === "-";
43772
+
43773
+ var maybeNegate = function maybeNegate(num, force) {
43774
+ if (force === void 0) {
43775
+ force = false;
43776
+ }
43745
43777
 
43746
- var maybeNegate = function maybeNegate(num) {
43747
- return num && hasNegativePrefix ? -num : num;
43778
+ return num !== undefined && (force || num && hasNegativePrefix) ? -num : num;
43748
43779
  };
43749
43780
 
43750
43781
  return [{
@@ -43754,8 +43785,8 @@ function extractISODuration(match) {
43754
43785
  days: maybeNegate(parseInteger(dayStr)),
43755
43786
  hours: maybeNegate(parseInteger(hourStr)),
43756
43787
  minutes: maybeNegate(parseInteger(minuteStr)),
43757
- seconds: maybeNegate(parseInteger(secondStr)),
43758
- milliseconds: maybeNegate(parseMillis(millisecondsStr))
43788
+ seconds: maybeNegate(parseInteger(secondStr), secondStr === "-0"),
43789
+ milliseconds: maybeNegate(parseMillis(millisecondsStr), negativeSeconds)
43759
43790
  }];
43760
43791
  } // These are a little braindead. EDT *should* tell us that we're in, say, America/New_York
43761
43792
  // and not just that we're in -240 *right now*. But since I don't think these are used that often
@@ -43860,14 +43891,14 @@ var isoOrdinalWithTimeExtensionRegex = combineRegexes(isoOrdinalRegex, isoTimeEx
43860
43891
  var isoTimeCombinedRegex = combineRegexes(isoTimeRegex);
43861
43892
  var extractISOYmdTimeAndOffset = combineExtractors(extractISOYmd, extractISOTime, extractISOOffset);
43862
43893
  var extractISOWeekTimeAndOffset = combineExtractors(extractISOWeekData, extractISOTime, extractISOOffset);
43863
- var extractISOOrdinalDataAndTime = combineExtractors(extractISOOrdinalData, extractISOTime);
43894
+ var extractISOOrdinalDateAndTime = combineExtractors(extractISOOrdinalData, extractISOTime, extractISOOffset);
43864
43895
  var extractISOTimeAndOffset = combineExtractors(extractISOTime, extractISOOffset);
43865
43896
  /**
43866
43897
  * @private
43867
43898
  */
43868
43899
 
43869
43900
  function parseISODate(s) {
43870
- return parse(s, [isoYmdWithTimeExtensionRegex, extractISOYmdTimeAndOffset], [isoWeekWithTimeExtensionRegex, extractISOWeekTimeAndOffset], [isoOrdinalWithTimeExtensionRegex, extractISOOrdinalDataAndTime], [isoTimeCombinedRegex, extractISOTimeAndOffset]);
43901
+ return parse(s, [isoYmdWithTimeExtensionRegex, extractISOYmdTimeAndOffset], [isoWeekWithTimeExtensionRegex, extractISOWeekTimeAndOffset], [isoOrdinalWithTimeExtensionRegex, extractISOOrdinalDateAndTime], [isoTimeCombinedRegex, extractISOTimeAndOffset]);
43871
43902
  }
43872
43903
  function parseRFC2822Date(s) {
43873
43904
  return parse(preprocessRFC2822(s), [rfc2822, extractRFC2822]);
@@ -44095,7 +44126,7 @@ var Duration = /*#__PURE__*/function () {
44095
44126
  }, opts));
44096
44127
  }
44097
44128
  /**
44098
- * Create a Duration from a JavaScript object with keys like 'years' and 'hours.
44129
+ * Create a Duration from a JavaScript object with keys like 'years' and 'hours'.
44099
44130
  * If this object is empty then a zero milliseconds duration is returned.
44100
44131
  * @param {Object} obj - the object to create the DateTime from
44101
44132
  * @param {number} obj.years
@@ -44487,9 +44518,9 @@ var Duration = /*#__PURE__*/function () {
44487
44518
  /**
44488
44519
  * Get the value of unit.
44489
44520
  * @param {string} unit - a unit such as 'minute' or 'day'
44490
- * @example Duration.fromObject({years: 2, days: 3}).years //=> 2
44491
- * @example Duration.fromObject({years: 2, days: 3}).months //=> 0
44492
- * @example Duration.fromObject({years: 2, days: 3}).days //=> 3
44521
+ * @example Duration.fromObject({years: 2, days: 3}).get('years') //=> 2
44522
+ * @example Duration.fromObject({years: 2, days: 3}).get('months') //=> 0
44523
+ * @example Duration.fromObject({years: 2, days: 3}).get('days') //=> 3
44493
44524
  * @return {number}
44494
44525
  */
44495
44526
  ;
@@ -45195,15 +45226,18 @@ var Interval = /*#__PURE__*/function () {
45195
45226
  }
45196
45227
 
45197
45228
  var s = this.s,
45198
- added,
45229
+ idx = 1,
45199
45230
  next;
45200
45231
  var results = [];
45201
45232
 
45202
45233
  while (s < this.e) {
45203
- added = s.plus(dur);
45234
+ var added = this.start.plus(dur.mapUnits(function (x) {
45235
+ return x * idx;
45236
+ }));
45204
45237
  next = +added > +this.e ? this.e : added;
45205
45238
  results.push(Interval.fromDateTimes(s, next));
45206
45239
  s = next;
45240
+ idx += 1;
45207
45241
  }
45208
45242
 
45209
45243
  return results;
@@ -45290,7 +45324,7 @@ var Interval = /*#__PURE__*/function () {
45290
45324
  var s = this.s > other.s ? this.s : other.s,
45291
45325
  e = this.e < other.e ? this.e : other.e;
45292
45326
 
45293
- if (s > e) {
45327
+ if (s >= e) {
45294
45328
  return null;
45295
45329
  } else {
45296
45330
  return Interval.fromDateTimes(s, e);
@@ -45615,6 +45649,7 @@ var Info = /*#__PURE__*/function () {
45615
45649
  * @param {Object} opts - options
45616
45650
  * @param {string} [opts.locale] - the locale code
45617
45651
  * @param {string} [opts.numberingSystem=null] - the numbering system
45652
+ * @param {string} [opts.locObj=null] - an existing locale object to use
45618
45653
  * @param {string} [opts.outputCalendar='gregory'] - the calendar
45619
45654
  * @example Info.months()[0] //=> 'January'
45620
45655
  * @example Info.months('short')[0] //=> 'Jan'
@@ -45636,10 +45671,12 @@ var Info = /*#__PURE__*/function () {
45636
45671
  locale = _ref$locale === void 0 ? null : _ref$locale,
45637
45672
  _ref$numberingSystem = _ref.numberingSystem,
45638
45673
  numberingSystem = _ref$numberingSystem === void 0 ? null : _ref$numberingSystem,
45674
+ _ref$locObj = _ref.locObj,
45675
+ locObj = _ref$locObj === void 0 ? null : _ref$locObj,
45639
45676
  _ref$outputCalendar = _ref.outputCalendar,
45640
45677
  outputCalendar = _ref$outputCalendar === void 0 ? "gregory" : _ref$outputCalendar;
45641
45678
 
45642
- return Locale.create(locale, numberingSystem, outputCalendar).months(length);
45679
+ return (locObj || Locale.create(locale, numberingSystem, outputCalendar)).months(length);
45643
45680
  }
45644
45681
  /**
45645
45682
  * Return an array of format month names.
@@ -45650,6 +45687,7 @@ var Info = /*#__PURE__*/function () {
45650
45687
  * @param {Object} opts - options
45651
45688
  * @param {string} [opts.locale] - the locale code
45652
45689
  * @param {string} [opts.numberingSystem=null] - the numbering system
45690
+ * @param {string} [opts.locObj=null] - an existing locale object to use
45653
45691
  * @param {string} [opts.outputCalendar='gregory'] - the calendar
45654
45692
  * @return {[string]}
45655
45693
  */
@@ -45665,10 +45703,12 @@ var Info = /*#__PURE__*/function () {
45665
45703
  locale = _ref2$locale === void 0 ? null : _ref2$locale,
45666
45704
  _ref2$numberingSystem = _ref2.numberingSystem,
45667
45705
  numberingSystem = _ref2$numberingSystem === void 0 ? null : _ref2$numberingSystem,
45706
+ _ref2$locObj = _ref2.locObj,
45707
+ locObj = _ref2$locObj === void 0 ? null : _ref2$locObj,
45668
45708
  _ref2$outputCalendar = _ref2.outputCalendar,
45669
45709
  outputCalendar = _ref2$outputCalendar === void 0 ? "gregory" : _ref2$outputCalendar;
45670
45710
 
45671
- return Locale.create(locale, numberingSystem, outputCalendar).months(length, true);
45711
+ return (locObj || Locale.create(locale, numberingSystem, outputCalendar)).months(length, true);
45672
45712
  }
45673
45713
  /**
45674
45714
  * Return an array of standalone week names.
@@ -45677,6 +45717,7 @@ var Info = /*#__PURE__*/function () {
45677
45717
  * @param {Object} opts - options
45678
45718
  * @param {string} [opts.locale] - the locale code
45679
45719
  * @param {string} [opts.numberingSystem=null] - the numbering system
45720
+ * @param {string} [opts.locObj=null] - an existing locale object to use
45680
45721
  * @example Info.weekdays()[0] //=> 'Monday'
45681
45722
  * @example Info.weekdays('short')[0] //=> 'Mon'
45682
45723
  * @example Info.weekdays('short', { locale: 'fr-CA' })[0] //=> 'lun.'
@@ -45694,9 +45735,11 @@ var Info = /*#__PURE__*/function () {
45694
45735
  _ref3$locale = _ref3.locale,
45695
45736
  locale = _ref3$locale === void 0 ? null : _ref3$locale,
45696
45737
  _ref3$numberingSystem = _ref3.numberingSystem,
45697
- numberingSystem = _ref3$numberingSystem === void 0 ? null : _ref3$numberingSystem;
45738
+ numberingSystem = _ref3$numberingSystem === void 0 ? null : _ref3$numberingSystem,
45739
+ _ref3$locObj = _ref3.locObj,
45740
+ locObj = _ref3$locObj === void 0 ? null : _ref3$locObj;
45698
45741
 
45699
- return Locale.create(locale, numberingSystem, null).weekdays(length);
45742
+ return (locObj || Locale.create(locale, numberingSystem, null)).weekdays(length);
45700
45743
  }
45701
45744
  /**
45702
45745
  * Return an array of format week names.
@@ -45707,6 +45750,7 @@ var Info = /*#__PURE__*/function () {
45707
45750
  * @param {Object} opts - options
45708
45751
  * @param {string} [opts.locale=null] - the locale code
45709
45752
  * @param {string} [opts.numberingSystem=null] - the numbering system
45753
+ * @param {string} [opts.locObj=null] - an existing locale object to use
45710
45754
  * @return {[string]}
45711
45755
  */
45712
45756
  ;
@@ -45720,9 +45764,11 @@ var Info = /*#__PURE__*/function () {
45720
45764
  _ref4$locale = _ref4.locale,
45721
45765
  locale = _ref4$locale === void 0 ? null : _ref4$locale,
45722
45766
  _ref4$numberingSystem = _ref4.numberingSystem,
45723
- numberingSystem = _ref4$numberingSystem === void 0 ? null : _ref4$numberingSystem;
45767
+ numberingSystem = _ref4$numberingSystem === void 0 ? null : _ref4$numberingSystem,
45768
+ _ref4$locObj = _ref4.locObj,
45769
+ locObj = _ref4$locObj === void 0 ? null : _ref4$locObj;
45724
45770
 
45725
- return Locale.create(locale, numberingSystem, null).weekdays(length, true);
45771
+ return (locObj || Locale.create(locale, numberingSystem, null)).weekdays(length, true);
45726
45772
  }
45727
45773
  /**
45728
45774
  * Return an array of meridiems.
@@ -47013,7 +47059,7 @@ function diffRelative(start, end, opts) {
47013
47059
  }
47014
47060
  }
47015
47061
 
47016
- return format(0, opts.units[opts.units.length - 1]);
47062
+ return format(start > end ? -0 : 0, opts.units[opts.units.length - 1]);
47017
47063
  }
47018
47064
  /**
47019
47065
  * A DateTime is an immutable data structure representing a specific date and time and accompanying methods. It contains class and instance methods for creating, parsing, interrogating, transforming, and formatting them.
@@ -47140,7 +47186,7 @@ var DateTime = /*#__PURE__*/function () {
47140
47186
 
47141
47187
  DateTime.local = function local(year, month, day, hour, minute, second, millisecond) {
47142
47188
  if (isUndefined(year)) {
47143
- return new DateTime({});
47189
+ return DateTime.now();
47144
47190
  } else {
47145
47191
  return quickDT({
47146
47192
  year: year,
@@ -47408,8 +47454,8 @@ var DateTime = /*#__PURE__*/function () {
47408
47454
  * @param {string|Zone} [opts.zone='local'] - use this zone if no offset is specified in the input string itself. Will also convert the time to this zone
47409
47455
  * @param {boolean} [opts.setZone=false] - override the zone with a fixed-offset zone specified in the string itself, if it specifies one
47410
47456
  * @param {string} [opts.locale='system's locale'] - a locale to set on the resulting DateTime instance
47411
- * @param {string} opts.outputCalendar - the output calendar to set on the resulting DateTime instance
47412
- * @param {string} opts.numberingSystem - the numbering system to set on the resulting DateTime instance
47457
+ * @param {string} [opts.outputCalendar] - the output calendar to set on the resulting DateTime instance
47458
+ * @param {string} [opts.numberingSystem] - the numbering system to set on the resulting DateTime instance
47413
47459
  * @example DateTime.fromISO('2016-05-25T09:08:34.123')
47414
47460
  * @example DateTime.fromISO('2016-05-25T09:08:34.123+06:00')
47415
47461
  * @example DateTime.fromISO('2016-05-25T09:08:34.123+06:00', {setZone: true})
@@ -47784,7 +47830,21 @@ var DateTime = /*#__PURE__*/function () {
47784
47830
  _proto.set = function set(values) {
47785
47831
  if (!this.isValid) return this;
47786
47832
  var normalized = normalizeObject(values, normalizeUnit, []),
47787
- settingWeekStuff = !isUndefined(normalized.weekYear) || !isUndefined(normalized.weekNumber) || !isUndefined(normalized.weekday);
47833
+ settingWeekStuff = !isUndefined(normalized.weekYear) || !isUndefined(normalized.weekNumber) || !isUndefined(normalized.weekday),
47834
+ containsOrdinal = !isUndefined(normalized.ordinal),
47835
+ containsGregorYear = !isUndefined(normalized.year),
47836
+ containsGregorMD = !isUndefined(normalized.month) || !isUndefined(normalized.day),
47837
+ containsGregor = containsGregorYear || containsGregorMD,
47838
+ definiteWeekDef = normalized.weekYear || normalized.weekNumber;
47839
+
47840
+ if ((containsGregor || containsOrdinal) && definiteWeekDef) {
47841
+ throw new ConflictingSpecificationError("Can't mix weekYear/weekNumber units with year/month/day or ordinals");
47842
+ }
47843
+
47844
+ if (containsGregorMD && containsOrdinal) {
47845
+ throw new ConflictingSpecificationError("Can't mix ordinal dates with month/day");
47846
+ }
47847
+
47788
47848
  var mixed;
47789
47849
 
47790
47850
  if (settingWeekStuff) {
@@ -48368,7 +48428,7 @@ var DateTime = /*#__PURE__*/function () {
48368
48428
  * @param {Object} options - options that affect the output
48369
48429
  * @param {DateTime} [options.base=DateTime.now()] - the DateTime to use as the basis to which this time is compared. Defaults to now.
48370
48430
  * @param {string} [options.style="long"] - the style of units, must be "long", "short", or "narrow"
48371
- * @param {string} options.unit - use a specific unit; if omitted, the method will pick the unit. Use one of "years", "quarters", "months", "weeks", "days", "hours", "minutes", or "seconds"
48431
+ * @param {string|string[]} options.unit - use a specific unit or array of units; if omitted, or an array, the method will pick the best unit. Use an array or one of "years", "quarters", "months", "weeks", "days", "hours", "minutes", or "seconds"
48372
48432
  * @param {boolean} [options.round=true] - whether to round the numbers in the output.
48373
48433
  * @param {number} [options.padding=0] - padding in milliseconds. This allows you to round up the result if it fits inside the threshold. Don't use in combination with {round: false} because the decimal output will include the padding.
48374
48434
  * @param {string} options.locale - override the locale of this DateTime
@@ -48392,9 +48452,18 @@ var DateTime = /*#__PURE__*/function () {
48392
48452
  zone: this.zone
48393
48453
  }),
48394
48454
  padding = options.padding ? this < base ? -options.padding : options.padding : 0;
48455
+ var units = ["years", "months", "days", "hours", "minutes", "seconds"];
48456
+ var unit = options.unit;
48457
+
48458
+ if (Array.isArray(options.unit)) {
48459
+ units = options.unit;
48460
+ unit = undefined;
48461
+ }
48462
+
48395
48463
  return diffRelative(base, this.plus(padding), Object.assign(options, {
48396
48464
  numeric: "always",
48397
- units: ["years", "months", "days", "hours", "minutes", "seconds"]
48465
+ units: units,
48466
+ unit: unit
48398
48467
  }));
48399
48468
  }
48400
48469
  /**
@@ -48681,7 +48750,7 @@ var DateTime = /*#__PURE__*/function () {
48681
48750
  /**
48682
48751
  * Get the week year
48683
48752
  * @see https://en.wikipedia.org/wiki/ISO_week_date
48684
- * @example DateTime.local(2014, 11, 31).weekYear //=> 2015
48753
+ * @example DateTime.local(2014, 12, 31).weekYear //=> 2015
48685
48754
  * @type {number}
48686
48755
  */
48687
48756
 
@@ -48737,7 +48806,7 @@ var DateTime = /*#__PURE__*/function () {
48737
48806
  key: "monthShort",
48738
48807
  get: function get() {
48739
48808
  return this.isValid ? Info.months("short", {
48740
- locale: this.locale
48809
+ locObj: this.loc
48741
48810
  })[this.month - 1] : null;
48742
48811
  }
48743
48812
  /**
@@ -48751,7 +48820,7 @@ var DateTime = /*#__PURE__*/function () {
48751
48820
  key: "monthLong",
48752
48821
  get: function get() {
48753
48822
  return this.isValid ? Info.months("long", {
48754
- locale: this.locale
48823
+ locObj: this.loc
48755
48824
  })[this.month - 1] : null;
48756
48825
  }
48757
48826
  /**
@@ -48765,7 +48834,7 @@ var DateTime = /*#__PURE__*/function () {
48765
48834
  key: "weekdayShort",
48766
48835
  get: function get() {
48767
48836
  return this.isValid ? Info.weekdays("short", {
48768
- locale: this.locale
48837
+ locObj: this.loc
48769
48838
  })[this.weekday - 1] : null;
48770
48839
  }
48771
48840
  /**
@@ -48779,7 +48848,7 @@ var DateTime = /*#__PURE__*/function () {
48779
48848
  key: "weekdayLong",
48780
48849
  get: function get() {
48781
48850
  return this.isValid ? Info.weekdays("long", {
48782
- locale: this.locale
48851
+ locObj: this.loc
48783
48852
  })[this.weekday - 1] : null;
48784
48853
  }
48785
48854
  /**
@@ -49138,7 +49207,7 @@ function friendlyDateTime(dateTimeish) {
49138
49207
  }
49139
49208
  }
49140
49209
 
49141
- var VERSION = "1.26.0";
49210
+ var VERSION = "1.28.0";
49142
49211
 
49143
49212
  exports.DateTime = DateTime;
49144
49213
  exports.Duration = Duration;
@@ -49235,11 +49304,14 @@ exports.Schema = require('./schema');
49235
49304
  *
49236
49305
  * ####Types:
49237
49306
  *
49238
- * - [ObjectId](#types-objectid-js)
49239
- * - [Buffer](#types-buffer-js)
49240
- * - [SubDocument](#types-embedded-js)
49241
- * - [Array](#types-array-js)
49242
- * - [DocumentArray](#types-documentarray-js)
49307
+ * - [Array](/docs/schematypes.html#arrays)
49308
+ * - [Buffer](/docs/schematypes.html#buffers)
49309
+ * - [Embedded](/docs/schematypes.html#schemas)
49310
+ * - [DocumentArray](/docs/api/documentarraypath.html)
49311
+ * - [Decimal128](/docs/api.html#mongoose_Mongoose-Decimal128)
49312
+ * - [ObjectId](/docs/schematypes.html#objectids)
49313
+ * - [Map](/docs/schematypes.html#maps)
49314
+ * - [Subdocument](/docs/schematypes.html#schemas)
49243
49315
  *
49244
49316
  * Using this exposed access to the `ObjectId` type, we can construct ids on demand.
49245
49317
  *
@@ -49322,7 +49394,7 @@ if (typeof window !== 'undefined') {
49322
49394
  }
49323
49395
 
49324
49396
  }).call(this)}).call(this,require("buffer").Buffer)
49325
- },{"./document_provider.js":194,"./driver":195,"./drivers/browser":199,"./error/index":203,"./promise_provider":271,"./schema":273,"./schematype.js":294,"./types":302,"./utils.js":306,"./virtualtype":307,"buffer":128}],185:[function(require,module,exports){
49397
+ },{"./document_provider.js":194,"./driver":195,"./drivers/browser":199,"./error/index":203,"./promise_provider":273,"./schema":275,"./schematype.js":296,"./types":304,"./utils.js":308,"./virtualtype":309,"buffer":128}],185:[function(require,module,exports){
49326
49398
  /*!
49327
49399
  * Module dependencies.
49328
49400
  */
@@ -49424,7 +49496,7 @@ Document.$emitter = new EventEmitter();
49424
49496
  Document.ValidationError = ValidationError;
49425
49497
  module.exports = exports = Document;
49426
49498
 
49427
- },{"./document":193,"./error/index":203,"./helpers/isObject":233,"./helpers/model/applyHooks":235,"./schema":273,"./types/objectid":304,"events":176}],186:[function(require,module,exports){
49499
+ },{"./document":193,"./error/index":203,"./helpers/isObject":235,"./helpers/model/applyHooks":237,"./schema":275,"./types/objectid":306,"events":176}],186:[function(require,module,exports){
49428
49500
  'use strict';
49429
49501
 
49430
49502
  /*!
@@ -49436,6 +49508,7 @@ const StrictModeError = require('./error/strict');
49436
49508
  const Types = require('./schema/index');
49437
49509
  const castTextSearch = require('./schema/operators/text');
49438
49510
  const get = require('./helpers/get');
49511
+ const getConstructorName = require('./helpers/getConstructorName');
49439
49512
  const getSchemaDiscriminatorByValue = require('./helpers/discriminator/getSchemaDiscriminatorByValue');
49440
49513
  const isOperator = require('./helpers/query/isOperator');
49441
49514
  const util = require('util');
@@ -49694,7 +49767,7 @@ module.exports = function cast(schema, obj, options, context) {
49694
49767
  }
49695
49768
  } else if (val == null) {
49696
49769
  continue;
49697
- } else if (val.constructor.name === 'Object') {
49770
+ } else if (getConstructorName(val) === 'Object') {
49698
49771
  any$conditionals = Object.keys(val).some(isOperator);
49699
49772
 
49700
49773
  if (!any$conditionals) {
@@ -49789,7 +49862,7 @@ function _cast(val, numbertype, context) {
49789
49862
  }
49790
49863
  }
49791
49864
  }
49792
- },{"./error/cast":201,"./error/strict":213,"./helpers/discriminator/getSchemaDiscriminatorByValue":223,"./helpers/get":228,"./helpers/isMongooseObject":232,"./helpers/isObject":233,"./helpers/query/isOperator":242,"./schema/index":281,"./schema/operators/text":290,"util":331}],187:[function(require,module,exports){
49865
+ },{"./error/cast":201,"./error/strict":213,"./helpers/discriminator/getSchemaDiscriminatorByValue":224,"./helpers/get":229,"./helpers/getConstructorName":230,"./helpers/isMongooseObject":234,"./helpers/isObject":235,"./helpers/query/isOperator":244,"./schema/index":283,"./schema/operators/text":292,"util":333}],187:[function(require,module,exports){
49793
49866
  'use strict';
49794
49867
 
49795
49868
  const CastError = require('../error/cast');
@@ -49904,7 +49977,7 @@ module.exports = function castDecimal128(value) {
49904
49977
  assert.ok(false);
49905
49978
  };
49906
49979
  }).call(this)}).call(this,{"isBuffer":require("../../../is-buffer/index.js")})
49907
- },{"../../../is-buffer/index.js":178,"../types/decimal128":299,"assert":102}],190:[function(require,module,exports){
49980
+ },{"../../../is-buffer/index.js":178,"../types/decimal128":301,"assert":102}],190:[function(require,module,exports){
49908
49981
  'use strict';
49909
49982
 
49910
49983
  const assert = require('assert');
@@ -50019,7 +50092,7 @@ module.exports = function castString(value, path) {
50019
50092
  };
50020
50093
 
50021
50094
  },{"../error/cast":201}],193:[function(require,module,exports){
50022
- (function (Buffer,process){(function (){
50095
+ (function (Buffer){(function (){
50023
50096
  'use strict';
50024
50097
 
50025
50098
  /*!
@@ -50047,6 +50120,7 @@ const get = require('./helpers/get');
50047
50120
  const getEmbeddedDiscriminatorPath = require('./helpers/document/getEmbeddedDiscriminatorPath');
50048
50121
  const handleSpreadDoc = require('./helpers/document/handleSpreadDoc');
50049
50122
  const idGetter = require('./plugins/idGetter');
50123
+ const immediate = require('./helpers/immediate');
50050
50124
  const isDefiningProjection = require('./helpers/projection/isDefiningProjection');
50051
50125
  const isExclusive = require('./helpers/projection/isExclusive');
50052
50126
  const inspect = require('util').inspect;
@@ -50069,6 +50143,7 @@ const documentSchemaSymbol = require('./helpers/symbols').documentSchemaSymbol;
50069
50143
  const getSymbol = require('./helpers/symbols').getSymbol;
50070
50144
  const populateModelSymbol = require('./helpers/symbols').populateModelSymbol;
50071
50145
  const scopeSymbol = require('./helpers/symbols').scopeSymbol;
50146
+ const schemaMixedSymbol = require('./schema/symbols').schemaMixedSymbol;
50072
50147
 
50073
50148
  let DocumentArray;
50074
50149
  let MongooseArray;
@@ -50098,9 +50173,8 @@ function Document(obj, fields, skipId, options) {
50098
50173
  options = Object.assign({}, options);
50099
50174
  const defaults = get(options, 'defaults', true);
50100
50175
  options.defaults = defaults;
50101
-
50102
50176
  // Support `browserDocument.js` syntax
50103
- if (this.schema == null) {
50177
+ if (this.$__schema == null) {
50104
50178
  const _schema = utils.isObject(fields) && !fields.instanceOfSchema ?
50105
50179
  new Schema(fields) :
50106
50180
  fields;
@@ -50117,12 +50191,11 @@ function Document(obj, fields, skipId, options) {
50117
50191
  this.$__.$options = options || {};
50118
50192
  this.$locals = {};
50119
50193
  this.$op = null;
50120
-
50121
50194
  if (obj != null && typeof obj !== 'object') {
50122
50195
  throw new ObjectParameterError(obj, 'obj', 'Document');
50123
50196
  }
50124
50197
 
50125
- const schema = this.schema;
50198
+ const schema = this.$__schema;
50126
50199
 
50127
50200
  if (typeof fields === 'boolean' || fields === 'throw') {
50128
50201
  this.$__.strictMode = fields;
@@ -50225,6 +50298,17 @@ for (const i in EventEmitter.prototype) {
50225
50298
  Document[i] = EventEmitter.prototype[i];
50226
50299
  }
50227
50300
 
50301
+ /**
50302
+ * The document's internal schema.
50303
+ *
50304
+ * @api private
50305
+ * @property schema
50306
+ * @memberOf Document
50307
+ * @instance
50308
+ */
50309
+
50310
+ Document.prototype.$__schema;
50311
+
50228
50312
  /**
50229
50313
  * The document's schema.
50230
50314
  *
@@ -50276,6 +50360,28 @@ Object.defineProperty(Document.prototype, '$locals', {
50276
50360
 
50277
50361
  Document.prototype.isNew;
50278
50362
 
50363
+ /**
50364
+ * Set this property to add additional query filters when Mongoose saves this document and `isNew` is false.
50365
+ *
50366
+ * ####Example:
50367
+ *
50368
+ * // Make sure `save()` never updates a soft deleted document.
50369
+ * schema.pre('save', function() {
50370
+ * this.$where = { isDeleted: false };
50371
+ * });
50372
+ *
50373
+ * @api public
50374
+ * @property $where
50375
+ * @memberOf Document
50376
+ * @instance
50377
+ */
50378
+
50379
+ Object.defineProperty(Document.prototype, '$where', {
50380
+ configurable: false,
50381
+ enumerable: false,
50382
+ writable: true
50383
+ });
50384
+
50279
50385
  /**
50280
50386
  * The string version of this documents _id.
50281
50387
  *
@@ -50354,7 +50460,7 @@ function $__hasIncludedChildren(fields) {
50354
50460
  */
50355
50461
 
50356
50462
  function $__applyDefaults(doc, fields, skipId, exclude, hasIncludedChildren, isBeforeSetters, pathsToSkip) {
50357
- const paths = Object.keys(doc.schema.paths);
50463
+ const paths = Object.keys(doc.$__schema.paths);
50358
50464
  const plen = paths.length;
50359
50465
 
50360
50466
  for (let i = 0; i < plen; ++i) {
@@ -50366,12 +50472,11 @@ function $__applyDefaults(doc, fields, skipId, exclude, hasIncludedChildren, isB
50366
50472
  continue;
50367
50473
  }
50368
50474
 
50369
- const type = doc.schema.paths[p];
50370
- const path = p.indexOf('.') === -1 ? [p] : p.split('.');
50475
+ const type = doc.$__schema.paths[p];
50476
+ const path = type.splitPath();
50371
50477
  const len = path.length;
50372
50478
  let included = false;
50373
50479
  let doc_ = doc._doc;
50374
-
50375
50480
  for (let j = 0; j < len; ++j) {
50376
50481
  if (doc_ == null) {
50377
50482
  break;
@@ -50480,7 +50585,7 @@ function $__applyDefaults(doc, fields, skipId, exclude, hasIncludedChildren, isB
50480
50585
  Document.prototype.$__buildDoc = function(obj, fields, skipId, exclude, hasIncludedChildren) {
50481
50586
  const doc = {};
50482
50587
 
50483
- const paths = Object.keys(this.schema.paths).
50588
+ const paths = Object.keys(this.$__schema.paths).
50484
50589
  // Don't build up any paths that are underneath a map, we don't know
50485
50590
  // what the keys will be
50486
50591
  filter(p => !p.includes('$*'));
@@ -50499,7 +50604,7 @@ Document.prototype.$__buildDoc = function(obj, fields, skipId, exclude, hasInclu
50499
50604
  }
50500
50605
  }
50501
50606
 
50502
- const path = p.split('.');
50607
+ const path = this.$__schema.paths[p].splitPath();
50503
50608
  const len = path.length;
50504
50609
  const last = len - 1;
50505
50610
  let curPath = '';
@@ -50600,6 +50705,7 @@ Document.prototype.$__init = function(doc, opts) {
50600
50705
  }
50601
50706
  child.$__.parent = this;
50602
50707
  }
50708
+ item._childDocs = [];
50603
50709
  }
50604
50710
  }
50605
50711
 
@@ -50611,7 +50717,6 @@ Document.prototype.$__init = function(doc, opts) {
50611
50717
  this.constructor.emit('init', this);
50612
50718
 
50613
50719
  this.$__._id = this._id;
50614
-
50615
50720
  return this;
50616
50721
  };
50617
50722
 
@@ -50680,12 +50785,12 @@ function init(self, obj, doc, opts, prefix) {
50680
50785
  function _init(index) {
50681
50786
  i = keys[index];
50682
50787
  path = prefix + i;
50683
- schema = self.schema.path(path);
50788
+ schema = self.$__schema.path(path);
50684
50789
 
50685
50790
  // Should still work if not a model-level discriminator, but should not be
50686
50791
  // necessary. This is *only* to catch the case where we queried using the
50687
50792
  // base model and the discriminated model has a projection
50688
- if (self.schema.$isRootDiscriminator && !self.$__isSelected(path)) {
50793
+ if (self.$__schema.$isRootDiscriminator && !self.$__isSelected(path)) {
50689
50794
  return;
50690
50795
  }
50691
50796
 
@@ -50790,10 +50895,10 @@ Document.prototype.update = function update() {
50790
50895
 
50791
50896
  Document.prototype.updateOne = function updateOne(doc, options, callback) {
50792
50897
  const query = this.constructor.updateOne({ _id: this._id }, doc, options);
50793
- query._pre(cb => {
50898
+ query.pre(cb => {
50794
50899
  this.constructor._middleware.execPre('updateOne', this, [this], cb);
50795
50900
  });
50796
- query._post(cb => {
50901
+ query.post(cb => {
50797
50902
  this.constructor._middleware.execPost('updateOne', this, [this], {}, cb);
50798
50903
  });
50799
50904
 
@@ -50815,7 +50920,7 @@ Document.prototype.updateOne = function updateOne(doc, options, callback) {
50815
50920
  *
50816
50921
  * ####Valid options:
50817
50922
  *
50818
- * - same as in [Model.replaceOne](#model_Model.replaceOne)
50923
+ * - same as in [Model.replaceOne](https://mongoosejs.com/docs/api/model.html#model_Model.replaceOne)
50819
50924
  *
50820
50925
  * @see Model.replaceOne #model_Model.replaceOne
50821
50926
  * @param {Object} doc
@@ -50858,12 +50963,22 @@ Document.prototype.replaceOne = function replaceOne() {
50858
50963
 
50859
50964
  Document.prototype.$session = function $session(session) {
50860
50965
  if (arguments.length === 0) {
50966
+ if (this.$__.session != null && this.$__.session.hasEnded) {
50967
+ this.$__.session = null;
50968
+ return null;
50969
+ }
50861
50970
  return this.$__.session;
50862
50971
  }
50972
+
50973
+ if (session != null && session.hasEnded) {
50974
+ throw new MongooseError('Cannot set a document\'s session to a session that has ended. Make sure you haven\'t ' +
50975
+ 'called `endSession()` on the session you are passing to `$session()`.');
50976
+ }
50977
+
50863
50978
  this.$__.session = session;
50864
50979
 
50865
50980
  if (!this.ownerDocument) {
50866
- const subdocs = this.$__getAllSubdocs();
50981
+ const subdocs = this.$getAllSubdocs();
50867
50982
  for (const child of subdocs) {
50868
50983
  child.$session(session);
50869
50984
  }
@@ -50893,10 +51008,10 @@ Document.prototype.overwrite = function overwrite(obj) {
50893
51008
  continue;
50894
51009
  }
50895
51010
  // Explicitly skip version key
50896
- if (this.schema.options.versionKey && key === this.schema.options.versionKey) {
51011
+ if (this.$__schema.options.versionKey && key === this.$__schema.options.versionKey) {
50897
51012
  continue;
50898
51013
  }
50899
- if (this.schema.options.discriminatorKey && key === this.schema.options.discriminatorKey) {
51014
+ if (this.$__schema.options.discriminatorKey && key === this.$__schema.options.discriminatorKey) {
50900
51015
  continue;
50901
51016
  }
50902
51017
  this.$set(key, obj[key]);
@@ -50920,7 +51035,6 @@ Document.prototype.overwrite = function overwrite(obj) {
50920
51035
  */
50921
51036
 
50922
51037
  Document.prototype.$set = function $set(path, val, type, options) {
50923
-
50924
51038
  if (utils.isPOJO(type)) {
50925
51039
  options = type;
50926
51040
  type = undefined;
@@ -50930,6 +51044,7 @@ Document.prototype.$set = function $set(path, val, type, options) {
50930
51044
  const merge = options.merge;
50931
51045
  const adhoc = type && type !== true;
50932
51046
  const constructing = type === true;
51047
+ const typeKey = this.$__schema.options.typeKey;
50933
51048
  let adhocs;
50934
51049
  let keys;
50935
51050
  let i = 0;
@@ -50943,7 +51058,7 @@ Document.prototype.$set = function $set(path, val, type, options) {
50943
51058
 
50944
51059
  if (adhoc) {
50945
51060
  adhocs = this.$__.adhocPaths || (this.$__.adhocPaths = {});
50946
- adhocs[path] = this.schema.interpretAsType(path, type, this.schema.options);
51061
+ adhocs[path] = this.$__schema.interpretAsType(path, type, this.$__schema.options);
50947
51062
  }
50948
51063
 
50949
51064
  if (path == null) {
@@ -50983,7 +51098,7 @@ Document.prototype.$set = function $set(path, val, type, options) {
50983
51098
  for (let i = 0; i < len; ++i) {
50984
51099
  key = keys[i];
50985
51100
  const pathName = prefix + key;
50986
- pathtype = this.schema.pathType(pathName);
51101
+ pathtype = this.$__schema.pathType(pathName);
50987
51102
 
50988
51103
  // On initial set, delete any nested keys if we're going to overwrite
50989
51104
  // them to ensure we keep the user's key order.
@@ -50996,6 +51111,9 @@ Document.prototype.$set = function $set(path, val, type, options) {
50996
51111
  delete this._doc[key];
50997
51112
  // Make sure we set `{}` back even if we minimize re: gh-8565
50998
51113
  options = Object.assign({}, options, { _skipMinimizeTopLevel: true });
51114
+ } else {
51115
+ // Make sure we set `{_skipMinimizeTopLevel: false}` if don't have overwrite: gh-10441
51116
+ options = Object.assign({}, options, { _skipMinimizeTopLevel: false });
50999
51117
  }
51000
51118
 
51001
51119
  const someCondition = typeof path[key] === 'object' &&
@@ -51006,9 +51124,9 @@ Document.prototype.$set = function $set(path, val, type, options) {
51006
51124
  pathtype !== 'real' &&
51007
51125
  pathtype !== 'adhocOrUndefined' &&
51008
51126
  !(this.$__path(pathName) instanceof MixedSchema) &&
51009
- !(this.schema.paths[pathName] &&
51010
- this.schema.paths[pathName].options &&
51011
- this.schema.paths[pathName].options.ref);
51127
+ !(this.$__schema.paths[pathName] &&
51128
+ this.$__schema.paths[pathName].options &&
51129
+ this.$__schema.paths[pathName].options.ref);
51012
51130
 
51013
51131
  if (someCondition) {
51014
51132
  this.$__.$setCalled.add(prefix + key);
@@ -51027,8 +51145,8 @@ Document.prototype.$set = function $set(path, val, type, options) {
51027
51145
  if (pathtype === 'real' || pathtype === 'virtual') {
51028
51146
  // Check for setting single embedded schema to document (gh-3535)
51029
51147
  let p = path[key];
51030
- if (this.schema.paths[pathName] &&
51031
- this.schema.paths[pathName].$isSingleNested &&
51148
+ if (this.$__schema.paths[pathName] &&
51149
+ this.$__schema.paths[pathName].$isSingleNested &&
51032
51150
  path[key] instanceof Document) {
51033
51151
  p = p.toObject({ virtuals: false, transform: false });
51034
51152
  }
@@ -51053,7 +51171,7 @@ Document.prototype.$set = function $set(path, val, type, options) {
51053
51171
  this.$__.$setCalled.add(path);
51054
51172
  }
51055
51173
 
51056
- let pathType = this.schema.pathType(path);
51174
+ let pathType = this.$__schema.pathType(path);
51057
51175
  if (pathType === 'adhocOrUndefined') {
51058
51176
  pathType = getEmbeddedDiscriminatorPath(this, path, { typeOnly: true });
51059
51177
  }
@@ -51104,8 +51222,8 @@ Document.prototype.$set = function $set(path, val, type, options) {
51104
51222
  const parts = path.indexOf('.') === -1 ? [path] : path.split('.');
51105
51223
 
51106
51224
  // Might need to change path for top-level alias
51107
- if (typeof this.schema.aliases[parts[0]] == 'string') {
51108
- parts[0] = this.schema.aliases[parts[0]];
51225
+ if (typeof this.$__schema.aliases[parts[0]] == 'string') {
51226
+ parts[0] = this.$__schema.aliases[parts[0]];
51109
51227
  }
51110
51228
 
51111
51229
  if (pathType === 'adhocOrUndefined' && strict) {
@@ -51116,12 +51234,12 @@ Document.prototype.$set = function $set(path, val, type, options) {
51116
51234
  const subpath = parts.slice(0, i + 1).join('.');
51117
51235
 
51118
51236
  // If path is underneath a virtual, bypass everything and just set it.
51119
- if (i + 1 < parts.length && this.schema.pathType(subpath) === 'virtual') {
51237
+ if (i + 1 < parts.length && this.$__schema.pathType(subpath) === 'virtual') {
51120
51238
  mpath.set(path, val, this);
51121
51239
  return this;
51122
51240
  }
51123
51241
 
51124
- schema = this.schema.path(subpath);
51242
+ schema = this.$__schema.path(subpath);
51125
51243
  if (schema == null) {
51126
51244
  continue;
51127
51245
  }
@@ -51145,7 +51263,7 @@ Document.prototype.$set = function $set(path, val, type, options) {
51145
51263
  return this;
51146
51264
  }
51147
51265
  } else if (pathType === 'virtual') {
51148
- schema = this.schema.virtualpath(path);
51266
+ schema = this.$__schema.virtualpath(path);
51149
51267
  schema.applySetters(val, this);
51150
51268
  return this;
51151
51269
  } else {
@@ -51265,25 +51383,20 @@ Document.prototype.$set = function $set(path, val, type, options) {
51265
51383
 
51266
51384
  let popOpts;
51267
51385
  if (schema.options &&
51268
- Array.isArray(schema.options[this.schema.options.typeKey]) &&
51269
- schema.options[this.schema.options.typeKey].length &&
51270
- schema.options[this.schema.options.typeKey][0].ref &&
51271
- _isManuallyPopulatedArray(val, schema.options[this.schema.options.typeKey][0].ref)) {
51272
- if (this.ownerDocument) {
51273
- popOpts = { [populateModelSymbol]: val[0].constructor };
51274
- this.ownerDocument().populated(this.$__fullPath(path),
51275
- val.map(function(v) { return v._id; }), popOpts);
51276
- } else {
51277
- popOpts = { [populateModelSymbol]: val[0].constructor };
51278
- this.populated(path, val.map(function(v) { return v._id; }), popOpts);
51279
- }
51386
+ Array.isArray(schema.options[typeKey]) &&
51387
+ schema.options[typeKey].length &&
51388
+ schema.options[typeKey][0].ref &&
51389
+ _isManuallyPopulatedArray(val, schema.options[typeKey][0].ref)) {
51390
+ popOpts = { [populateModelSymbol]: val[0].constructor };
51391
+ this.populated(path, val.map(function(v) { return v._id; }), popOpts);
51392
+
51280
51393
  for (const doc of val) {
51281
51394
  doc.$__.wasPopulated = true;
51282
51395
  }
51283
51396
  didPopulate = true;
51284
51397
  }
51285
51398
 
51286
- if (this.schema.singleNestedPaths[path] == null) {
51399
+ if (this.$__schema.singleNestedPaths[path] == null) {
51287
51400
  // If this path is underneath a single nested schema, we'll call the setter
51288
51401
  // later in `$__set()` because we don't take `_doc` when we iterate through
51289
51402
  // a single nested doc. That's to make sure we get the correct context.
@@ -51442,7 +51555,7 @@ Document.prototype.$__shouldModify = function(pathToMark, path, constructing, pa
51442
51555
  // Re: the note about gh-7196, `val` is the raw value without casting or
51443
51556
  // setters if the full path is under a single nested subdoc because we don't
51444
51557
  // want to double run setters. So don't set it as modified. See gh-7264.
51445
- if (this.schema.singleNestedPaths[path] != null) {
51558
+ if (this.$__schema.singleNestedPaths[path] != null) {
51446
51559
  return false;
51447
51560
  }
51448
51561
 
@@ -51605,20 +51718,20 @@ Document.prototype.get = function(path, type, options) {
51605
51718
  let adhoc;
51606
51719
  options = options || {};
51607
51720
  if (type) {
51608
- adhoc = this.schema.interpretAsType(path, type, this.schema.options);
51721
+ adhoc = this.$__schema.interpretAsType(path, type, this.$__schema.options);
51609
51722
  }
51610
51723
 
51611
51724
  let schema = this.$__path(path);
51612
51725
  if (schema == null) {
51613
- schema = this.schema.virtualpath(path);
51726
+ schema = this.$__schema.virtualpath(path);
51614
51727
  }
51615
51728
  if (schema instanceof MixedSchema) {
51616
- const virtual = this.schema.virtualpath(path);
51729
+ const virtual = this.$__schema.virtualpath(path);
51617
51730
  if (virtual != null) {
51618
51731
  schema = virtual;
51619
51732
  }
51620
51733
  }
51621
- const pieces = path.split('.');
51734
+ const pieces = path.indexOf('.') === -1 ? [path] : path.split('.');
51622
51735
  let obj = this._doc;
51623
51736
 
51624
51737
  if (schema instanceof VirtualType) {
@@ -51626,8 +51739,8 @@ Document.prototype.get = function(path, type, options) {
51626
51739
  }
51627
51740
 
51628
51741
  // Might need to change path for top-level alias
51629
- if (typeof this.schema.aliases[pieces[0]] == 'string') {
51630
- pieces[0] = this.schema.aliases[pieces[0]];
51742
+ if (typeof this.$__schema.aliases[pieces[0]] == 'string') {
51743
+ pieces[0] = this.$__schema.aliases[pieces[0]];
51631
51744
  }
51632
51745
 
51633
51746
  for (let i = 0, l = pieces.length; i < l; i++) {
@@ -51652,7 +51765,7 @@ Document.prototype.get = function(path, type, options) {
51652
51765
 
51653
51766
  if (schema != null && options.getters !== false) {
51654
51767
  obj = schema.applyGetters(obj, this);
51655
- } else if (this.schema.nested[path] && options.virtuals) {
51768
+ } else if (this.$__schema.nested[path] && options.virtuals) {
51656
51769
  // Might need to apply virtuals if this is a nested path
51657
51770
  return applyVirtuals(this, utils.clone(obj) || {}, { path: path });
51658
51771
  }
@@ -51683,7 +51796,7 @@ Document.prototype.$__path = function(path) {
51683
51796
  if (adhocType) {
51684
51797
  return adhocType;
51685
51798
  }
51686
- return this.schema.path(path);
51799
+ return this.$__schema.path(path);
51687
51800
  };
51688
51801
 
51689
51802
  /**
@@ -52218,6 +52331,7 @@ Document.prototype.isDirectSelected = function isDirectSelected(path) {
52218
52331
  * @param {Array|String} [pathsToValidate] list of paths to validate. If set, Mongoose will validate only the modified paths that are in the given list.
52219
52332
  * @param {Object} [options] internal options
52220
52333
  * @param {Boolean} [options.validateModifiedOnly=false] if `true` mongoose validates only modified paths.
52334
+ * @param {Array|string} [options.pathsToSkip] list of paths to skip. If set, Mongoose will validate every modified path that is not in this list.
52221
52335
  * @param {Function} [callback] optional callback called after validation completes, passing an error if one occurred
52222
52336
  * @return {Promise} Promise
52223
52337
  * @api public
@@ -52238,7 +52352,17 @@ Document.prototype.validate = function(pathsToValidate, options, callback) {
52238
52352
  this.$__.validating = new ParallelValidateError(this, { parentStack: options && options.parentStack });
52239
52353
  }
52240
52354
 
52241
- if (typeof pathsToValidate === 'function') {
52355
+ if (arguments.length === 1) {
52356
+ if (typeof arguments[0] === 'object' && !Array.isArray(arguments[0])) {
52357
+ options = arguments[0];
52358
+ callback = null;
52359
+ pathsToValidate = null;
52360
+ } else if (typeof arguments[0] === 'function') {
52361
+ callback = arguments[0];
52362
+ options = null;
52363
+ pathsToValidate = null;
52364
+ }
52365
+ } else if (typeof pathsToValidate === 'function') {
52242
52366
  callback = pathsToValidate;
52243
52367
  options = null;
52244
52368
  pathsToValidate = null;
@@ -52247,6 +52371,10 @@ Document.prototype.validate = function(pathsToValidate, options, callback) {
52247
52371
  options = pathsToValidate;
52248
52372
  pathsToValidate = null;
52249
52373
  }
52374
+ if (options && typeof options.pathsToSkip === 'string') {
52375
+ const isOnePathOnly = options.pathsToSkip.indexOf(' ') === -1;
52376
+ options.pathsToSkip = isOnePathOnly ? [options.pathsToSkip] : options.pathsToSkip.split(' ');
52377
+ }
52250
52378
 
52251
52379
  return promiseOrCallback(callback, cb => {
52252
52380
  if (parallelValidate != null) {
@@ -52266,7 +52394,7 @@ Document.prototype.validate = function(pathsToValidate, options, callback) {
52266
52394
 
52267
52395
  function _evaluateRequiredFunctions(doc) {
52268
52396
  Object.keys(doc.$__.activePaths.states.require).forEach(path => {
52269
- const p = doc.schema.path(path);
52397
+ const p = doc.$__schema.path(path);
52270
52398
 
52271
52399
  if (p != null && typeof p.originalRequiredValue === 'function') {
52272
52400
  doc.$__.cachedRequired[path] = p.originalRequiredValue.call(doc, doc);
@@ -52299,7 +52427,7 @@ function _getPathsToValidate(doc) {
52299
52427
  Object.keys(doc.$__.activePaths.states.default).forEach(addToPaths);
52300
52428
  function addToPaths(p) { paths.add(p); }
52301
52429
 
52302
- const subdocs = doc.$__getAllSubdocs();
52430
+ const subdocs = doc.$getAllSubdocs();
52303
52431
  const modifiedPaths = doc.modifiedPaths();
52304
52432
  for (const subdoc of subdocs) {
52305
52433
  if (subdoc.$basePath) {
@@ -52326,7 +52454,7 @@ function _getPathsToValidate(doc) {
52326
52454
  // gh-661: if a whole array is modified, make sure to run validation on all
52327
52455
  // the children as well
52328
52456
  for (const path of paths) {
52329
- const _pathType = doc.schema.path(path);
52457
+ const _pathType = doc.$__schema.path(path);
52330
52458
  if (!_pathType ||
52331
52459
  !_pathType.$isMongooseArray ||
52332
52460
  // To avoid potential performance issues, skip doc arrays whose children
@@ -52355,12 +52483,12 @@ function _getPathsToValidate(doc) {
52355
52483
 
52356
52484
  const flattenOptions = { skipArrays: true };
52357
52485
  for (const pathToCheck of paths) {
52358
- if (doc.schema.nested[pathToCheck]) {
52486
+ if (doc.$__schema.nested[pathToCheck]) {
52359
52487
  let _v = doc.$__getValue(pathToCheck);
52360
52488
  if (isMongooseObject(_v)) {
52361
52489
  _v = _v.toObject({ transform: false });
52362
52490
  }
52363
- const flat = flatten(_v, pathToCheck, flattenOptions, doc.schema);
52491
+ const flat = flatten(_v, pathToCheck, flattenOptions, doc.$__schema);
52364
52492
  Object.keys(flat).forEach(addToPaths);
52365
52493
  }
52366
52494
  }
@@ -52369,11 +52497,11 @@ function _getPathsToValidate(doc) {
52369
52497
  // Single nested paths (paths embedded under single nested subdocs) will
52370
52498
  // be validated on their own when we call `validate()` on the subdoc itself.
52371
52499
  // Re: gh-8468
52372
- if (doc.schema.singleNestedPaths.hasOwnProperty(path)) {
52500
+ if (doc.$__schema.singleNestedPaths.hasOwnProperty(path)) {
52373
52501
  paths.delete(path);
52374
52502
  continue;
52375
52503
  }
52376
- const _pathType = doc.schema.path(path);
52504
+ const _pathType = doc.$__schema.path(path);
52377
52505
  if (!_pathType || !_pathType.$isSchemaMap) {
52378
52506
  continue;
52379
52507
  }
@@ -52409,11 +52537,13 @@ Document.prototype.$__validate = function(pathsToValidate, options, callback) {
52409
52537
  (typeof options === 'object') &&
52410
52538
  ('validateModifiedOnly' in options);
52411
52539
 
52540
+ const pathsToSkip = get(options, 'pathsToSkip', null);
52541
+
52412
52542
  let shouldValidateModifiedOnly;
52413
52543
  if (hasValidateModifiedOnlyOption) {
52414
52544
  shouldValidateModifiedOnly = !!options.validateModifiedOnly;
52415
52545
  } else {
52416
- shouldValidateModifiedOnly = this.schema.options.validateModifiedOnly;
52546
+ shouldValidateModifiedOnly = this.$__schema.options.validateModifiedOnly;
52417
52547
  }
52418
52548
 
52419
52549
  const _this = this;
@@ -52458,14 +52588,19 @@ Document.prototype.$__validate = function(pathsToValidate, options, callback) {
52458
52588
  pathDetails[0].filter((path) => this.isModified(path)) :
52459
52589
  pathDetails[0];
52460
52590
  const skipSchemaValidators = pathDetails[1];
52591
+ if (typeof pathsToValidate === 'string') {
52592
+ pathsToValidate = pathsToValidate.split(' ');
52593
+ }
52461
52594
  if (Array.isArray(pathsToValidate)) {
52462
52595
  paths = _handlePathsToValidate(paths, pathsToValidate);
52596
+ } else if (pathsToSkip) {
52597
+ paths = _handlePathsToSkip(paths, pathsToSkip);
52463
52598
  }
52464
52599
  if (paths.length === 0) {
52465
- return process.nextTick(function() {
52600
+ return immediate(function() {
52466
52601
  const error = _complete();
52467
52602
  if (error) {
52468
- return _this.schema.s.hooks.execPost('validate:error', _this, [_this], { error: error }, function(error) {
52603
+ return _this.$__schema.s.hooks.execPost('validate:error', _this, [_this], { error: error }, function(error) {
52469
52604
  callback(error);
52470
52605
  });
52471
52606
  }
@@ -52476,17 +52611,11 @@ Document.prototype.$__validate = function(pathsToValidate, options, callback) {
52476
52611
  const validated = {};
52477
52612
  let total = 0;
52478
52613
 
52479
- const complete = function() {
52480
- const error = _complete();
52481
- if (error) {
52482
- return _this.schema.s.hooks.execPost('validate:error', _this, [_this], { error: error }, function(error) {
52483
- callback(error);
52484
- });
52485
- }
52486
- callback(null, _this);
52487
- };
52614
+ for (const path of paths) {
52615
+ validatePath(path);
52616
+ }
52488
52617
 
52489
- const validatePath = function(path) {
52618
+ function validatePath(path) {
52490
52619
  if (path == null || validated[path]) {
52491
52620
  return;
52492
52621
  }
@@ -52494,8 +52623,8 @@ Document.prototype.$__validate = function(pathsToValidate, options, callback) {
52494
52623
  validated[path] = true;
52495
52624
  total++;
52496
52625
 
52497
- process.nextTick(function() {
52498
- const schemaType = _this.schema.path(path);
52626
+ immediate(function() {
52627
+ const schemaType = _this.$__schema.path(path);
52499
52628
 
52500
52629
  if (!schemaType) {
52501
52630
  return --total || complete();
@@ -52507,6 +52636,11 @@ Document.prototype.$__validate = function(pathsToValidate, options, callback) {
52507
52636
  return;
52508
52637
  }
52509
52638
 
52639
+ // If setting a path under a mixed path, avoid using the mixed path validator (gh-10141)
52640
+ if (schemaType[schemaMixedSymbol] != null && path !== schemaType.path) {
52641
+ return --total || complete();
52642
+ }
52643
+
52510
52644
  let val = _this.$__getValue(path);
52511
52645
 
52512
52646
  // If you `populate()` and get back a null value, required validators
@@ -52537,12 +52671,18 @@ Document.prototype.$__validate = function(pathsToValidate, options, callback) {
52537
52671
  --total || complete();
52538
52672
  }, scope, doValidateOptions);
52539
52673
  });
52540
- };
52674
+ }
52541
52675
 
52542
- const numPaths = paths.length;
52543
- for (let i = 0; i < numPaths; ++i) {
52544
- validatePath(paths[i]);
52676
+ function complete() {
52677
+ const error = _complete();
52678
+ if (error) {
52679
+ return _this.$__schema.s.hooks.execPost('validate:error', _this, [_this], { error: error }, function(error) {
52680
+ callback(error);
52681
+ });
52682
+ }
52683
+ callback(null, _this);
52545
52684
  }
52685
+
52546
52686
  };
52547
52687
 
52548
52688
  /*!
@@ -52578,6 +52718,15 @@ function _handlePathsToValidate(paths, pathsToValidate) {
52578
52718
  return ret;
52579
52719
  }
52580
52720
 
52721
+ /*!
52722
+ * ignore
52723
+ */
52724
+ function _handlePathsToSkip(paths, pathsToSkip) {
52725
+ pathsToSkip = new Set(pathsToSkip);
52726
+ paths = paths.filter(p => !pathsToSkip.has(p));
52727
+ return paths;
52728
+ }
52729
+
52581
52730
  /**
52582
52731
  * Executes registered validation rules (skipping asynchronous validators) for this document.
52583
52732
  *
@@ -52597,6 +52746,7 @@ function _handlePathsToValidate(paths, pathsToValidate) {
52597
52746
  * @param {Array|string} pathsToValidate only validate the given paths
52598
52747
  * @param {Object} [options] options for validation
52599
52748
  * @param {Boolean} [options.validateModifiedOnly=false] If `true`, Mongoose will only validate modified paths, as opposed to modified paths and `required` paths.
52749
+ * @param {Array|string} [options.pathsToSkip] list of paths to skip. If set, Mongoose will validate every modified path that is not in this list.
52600
52750
  * @return {ValidationError|undefined} ValidationError if there are errors during validation, or undefined if there is no error.
52601
52751
  * @api public
52602
52752
  */
@@ -52604,6 +52754,11 @@ function _handlePathsToValidate(paths, pathsToValidate) {
52604
52754
  Document.prototype.validateSync = function(pathsToValidate, options) {
52605
52755
  const _this = this;
52606
52756
 
52757
+ if (arguments.length === 1 && typeof arguments[0] === 'object' && !Array.isArray(arguments[0])) {
52758
+ options = arguments[0];
52759
+ pathsToValidate = null;
52760
+ }
52761
+
52607
52762
  const hasValidateModifiedOnlyOption = options &&
52608
52763
  (typeof options === 'object') &&
52609
52764
  ('validateModifiedOnly' in options);
@@ -52612,11 +52767,16 @@ Document.prototype.validateSync = function(pathsToValidate, options) {
52612
52767
  if (hasValidateModifiedOnlyOption) {
52613
52768
  shouldValidateModifiedOnly = !!options.validateModifiedOnly;
52614
52769
  } else {
52615
- shouldValidateModifiedOnly = this.schema.options.validateModifiedOnly;
52770
+ shouldValidateModifiedOnly = this.$__schema.options.validateModifiedOnly;
52616
52771
  }
52617
52772
 
52773
+ let pathsToSkip = options && options.pathsToSkip;
52774
+
52618
52775
  if (typeof pathsToValidate === 'string') {
52619
- pathsToValidate = pathsToValidate.split(' ');
52776
+ const isOnePathOnly = pathsToValidate.indexOf(' ') === -1;
52777
+ pathsToValidate = isOnePathOnly ? [pathsToValidate] : pathsToValidate.split(' ');
52778
+ } else if (typeof pathsToSkip === 'string' && pathsToSkip.indexOf(' ') !== -1) {
52779
+ pathsToSkip = pathsToSkip.split(' ');
52620
52780
  }
52621
52781
 
52622
52782
  // only validate required fields when necessary
@@ -52628,6 +52788,8 @@ Document.prototype.validateSync = function(pathsToValidate, options) {
52628
52788
 
52629
52789
  if (Array.isArray(pathsToValidate)) {
52630
52790
  paths = _handlePathsToValidate(paths, pathsToValidate);
52791
+ } else if (Array.isArray(pathsToSkip)) {
52792
+ paths = _handlePathsToSkip(paths, pathsToSkip);
52631
52793
  }
52632
52794
  const validating = {};
52633
52795
 
@@ -52638,7 +52800,7 @@ Document.prototype.validateSync = function(pathsToValidate, options) {
52638
52800
 
52639
52801
  validating[path] = true;
52640
52802
 
52641
- const p = _this.schema.path(path);
52803
+ const p = _this.$__schema.path(path);
52642
52804
  if (!p) {
52643
52805
  return;
52644
52806
  }
@@ -52911,7 +53073,13 @@ Document.prototype.$__reset = function reset() {
52911
53073
  }).
52912
53074
  forEach(function(doc) {
52913
53075
  doc.$__reset();
52914
- _this.$__.activePaths.init(doc.$basePath);
53076
+ if (doc.$__parent === _this) {
53077
+ _this.$__.activePaths.init(doc.$basePath);
53078
+ } else if (doc.$__parent != null && doc.$__parent.ownerDocument) {
53079
+ // If map path underneath subdocument, may end up with a case where
53080
+ // map path is modified but parent still needs to be reset. See gh-10295
53081
+ doc.$__parent.$__reset();
53082
+ }
52915
53083
  });
52916
53084
 
52917
53085
  // clear atomics
@@ -52938,7 +53106,7 @@ Document.prototype.$__reset = function reset() {
52938
53106
  this.$__.validationError = undefined;
52939
53107
  this.errors = undefined;
52940
53108
  _this = this;
52941
- this.schema.requiredPaths().forEach(function(path) {
53109
+ this.$__schema.requiredPaths().forEach(function(path) {
52942
53110
  _this.$__.activePaths.require(path);
52943
53111
  });
52944
53112
 
@@ -52968,7 +53136,7 @@ Document.prototype.$__undoReset = function $__undoReset() {
52968
53136
  }
52969
53137
  }
52970
53138
 
52971
- for (const subdoc of this.$__getAllSubdocs()) {
53139
+ for (const subdoc of this.$getAllSubdocs()) {
52972
53140
  subdoc.$__undoReset();
52973
53141
  }
52974
53142
  };
@@ -52992,7 +53160,6 @@ Document.prototype.$__dirty = function() {
52992
53160
  schema: _this.$__path(path)
52993
53161
  };
52994
53162
  });
52995
-
52996
53163
  // gh-2558: if we had to set a default and the value is not undefined,
52997
53164
  // we have to save as well
52998
53165
  all = all.concat(this.$__.activePaths.map('default', function(path) {
@@ -53036,7 +53203,6 @@ Document.prototype.$__dirty = function() {
53036
53203
  top.value[arrayAtomicsSymbol].$set = top.value;
53037
53204
  }
53038
53205
  });
53039
-
53040
53206
  top = lastPath = null;
53041
53207
  return minimal;
53042
53208
  };
@@ -53059,8 +53225,10 @@ Document.prototype.$__setSchema = function(schema) {
53059
53225
  for (const key of Object.keys(schema.virtuals)) {
53060
53226
  schema.virtuals[key]._applyDefaultGetters();
53061
53227
  }
53062
-
53063
- this.schema = schema;
53228
+ if (schema.path('schema') == null) {
53229
+ this.schema = schema;
53230
+ }
53231
+ this.$__schema = schema;
53064
53232
  this[documentSchemaSymbol] = schema;
53065
53233
  };
53066
53234
 
@@ -53096,21 +53264,25 @@ Document.prototype.$__getArrayPathsToValidate = function() {
53096
53264
  /**
53097
53265
  * Get all subdocs (by bfs)
53098
53266
  *
53099
- * @api private
53100
- * @method $__getAllSubdocs
53267
+ * @api public
53268
+ * @method $getAllSubdocs
53101
53269
  * @memberOf Document
53102
53270
  * @instance
53103
53271
  */
53104
53272
 
53105
- Document.prototype.$__getAllSubdocs = function() {
53273
+ Document.prototype.$getAllSubdocs = function $getAllSubdocs() {
53106
53274
  DocumentArray || (DocumentArray = require('./types/documentarray'));
53107
53275
  Embedded = Embedded || require('./types/embedded');
53108
53276
 
53109
53277
  function docReducer(doc, seed, path) {
53110
53278
  let val = doc;
53279
+ let isNested = false;
53111
53280
  if (path) {
53112
53281
  if (doc instanceof Document && doc[documentSchemaSymbol].paths[path]) {
53113
53282
  val = doc._doc[path];
53283
+ } else if (doc instanceof Document && doc[documentSchemaSymbol].nested[path]) {
53284
+ val = doc._doc[path];
53285
+ isNested = true;
53114
53286
  } else {
53115
53287
  val = doc[path];
53116
53288
  }
@@ -53138,18 +53310,18 @@ Document.prototype.$__getAllSubdocs = function() {
53138
53310
  seed.push(doc);
53139
53311
  }
53140
53312
  });
53141
- } else if (val instanceof Document && val.$__isNested) {
53142
- seed = Object.keys(val).reduce(function(seed, path) {
53143
- return docReducer(val, seed, path);
53144
- }, seed);
53313
+ } else if (isNested && val != null) {
53314
+ for (const path of Object.keys(val)) {
53315
+ docReducer(val, seed, path);
53316
+ }
53145
53317
  }
53146
53318
  return seed;
53147
53319
  }
53148
53320
 
53149
- const _this = this;
53150
- const subDocs = Object.keys(this._doc).reduce(function(seed, path) {
53151
- return docReducer(_this, seed, path);
53152
- }, []);
53321
+ const subDocs = [];
53322
+ for (const path of Object.keys(this._doc)) {
53323
+ docReducer(this, subDocs, path);
53324
+ }
53153
53325
 
53154
53326
  return subDocs;
53155
53327
  };
@@ -53159,7 +53331,7 @@ Document.prototype.$__getAllSubdocs = function() {
53159
53331
  */
53160
53332
 
53161
53333
  function applyQueue(doc) {
53162
- const q = doc.schema && doc.schema.callQueue;
53334
+ const q = doc.$__schema && doc.$__schema.callQueue;
53163
53335
  if (!q.length) {
53164
53336
  return;
53165
53337
  }
@@ -53201,7 +53373,7 @@ Document.prototype.$toObject = function(options, json) {
53201
53373
 
53202
53374
  const path = json ? 'toJSON' : 'toObject';
53203
53375
  const baseOptions = get(this, 'constructor.base.options.' + path, {});
53204
- const schemaOptions = get(this, 'schema.options', {});
53376
+ const schemaOptions = get(this, '$__schema.options', {});
53205
53377
  // merge base default options with Schema's set default options if available.
53206
53378
  // `clone` is necessary here because `utils.options` directly modifies the second input.
53207
53379
  defaultOptions = utils.options(defaultOptions, clone(baseOptions));
@@ -53211,10 +53383,6 @@ Document.prototype.$toObject = function(options, json) {
53211
53383
  options = utils.isPOJO(options) ? clone(options) : {};
53212
53384
  options._calledWithOptions = options._calledWithOptions || clone(options);
53213
53385
 
53214
- if (!('flattenMaps' in options)) {
53215
- options.flattenMaps = defaultOptions.flattenMaps;
53216
- }
53217
-
53218
53386
  let _minimize;
53219
53387
  if (options._calledWithOptions.minimize != null) {
53220
53388
  _minimize = options.minimize;
@@ -53224,6 +53392,15 @@ Document.prototype.$toObject = function(options, json) {
53224
53392
  _minimize = schemaOptions.minimize;
53225
53393
  }
53226
53394
 
53395
+ let flattenMaps;
53396
+ if (options._calledWithOptions.flattenMaps != null) {
53397
+ flattenMaps = options.flattenMaps;
53398
+ } else if (defaultOptions.flattenMaps != null) {
53399
+ flattenMaps = defaultOptions.flattenMaps;
53400
+ } else {
53401
+ flattenMaps = schemaOptions.flattenMaps;
53402
+ }
53403
+
53227
53404
  // The original options that will be passed to `clone()`. Important because
53228
53405
  // `clone()` will recursively call `$toObject()` on embedded docs, so we
53229
53406
  // need the original options the user passed in, plus `_isNested` and
@@ -53231,7 +53408,8 @@ Document.prototype.$toObject = function(options, json) {
53231
53408
  const cloneOptions = Object.assign(utils.clone(options), {
53232
53409
  _isNested: true,
53233
53410
  json: json,
53234
- minimize: _minimize
53411
+ minimize: _minimize,
53412
+ flattenMaps: flattenMaps
53235
53413
  });
53236
53414
 
53237
53415
  if (utils.hasUserDefinedProperty(options, 'getters')) {
@@ -53280,8 +53458,8 @@ Document.prototype.$toObject = function(options, json) {
53280
53458
  applyVirtuals(this, ret, gettersOptions, options);
53281
53459
  }
53282
53460
 
53283
- if (options.versionKey === false && this.schema.options.versionKey) {
53284
- delete ret[this.schema.options.versionKey];
53461
+ if (options.versionKey === false && this.$__schema.options.versionKey) {
53462
+ delete ret[this.$__schema.options.versionKey];
53285
53463
  }
53286
53464
 
53287
53465
  let transform = options.transform;
@@ -53511,7 +53689,7 @@ function minimize(obj) {
53511
53689
  */
53512
53690
 
53513
53691
  function applyVirtuals(self, json, options, toObjectOptions) {
53514
- const schema = self.schema;
53692
+ const schema = self.$__schema;
53515
53693
  const paths = Object.keys(schema.virtuals);
53516
53694
  let i = paths.length;
53517
53695
  const numPaths = i;
@@ -53521,6 +53699,19 @@ function applyVirtuals(self, json, options, toObjectOptions) {
53521
53699
  let v;
53522
53700
  const aliases = get(toObjectOptions, 'aliases', true);
53523
53701
 
53702
+ let virtualsToApply = null;
53703
+ if (Array.isArray(options.virtuals)) {
53704
+ virtualsToApply = new Set(options.virtuals);
53705
+ }
53706
+ else if (options.virtuals && options.virtuals.pathsToSkip) {
53707
+ virtualsToApply = new Set(paths);
53708
+ for (let i = 0; i < options.virtuals.pathsToSkip.length; i++) {
53709
+ if (virtualsToApply.has(options.virtuals.pathsToSkip[i])) {
53710
+ virtualsToApply.delete(options.virtuals.pathsToSkip[i]);
53711
+ }
53712
+ }
53713
+ }
53714
+
53524
53715
  if (!cur) {
53525
53716
  return json;
53526
53717
  }
@@ -53529,6 +53720,10 @@ function applyVirtuals(self, json, options, toObjectOptions) {
53529
53720
  for (i = 0; i < numPaths; ++i) {
53530
53721
  path = paths[i];
53531
53722
 
53723
+ if (virtualsToApply != null && !virtualsToApply.has(path)) {
53724
+ continue;
53725
+ }
53726
+
53532
53727
  // Allow skipping aliases with `toObject({ virtuals: true, aliases: false })`
53533
53728
  if (!aliases && schema.aliases.hasOwnProperty(path)) {
53534
53729
  continue;
@@ -53561,6 +53756,7 @@ function applyVirtuals(self, json, options, toObjectOptions) {
53561
53756
  return json;
53562
53757
  }
53563
53758
 
53759
+
53564
53760
  /*!
53565
53761
  * Applies virtuals properties to `json`.
53566
53762
  *
@@ -53570,7 +53766,7 @@ function applyVirtuals(self, json, options, toObjectOptions) {
53570
53766
  */
53571
53767
 
53572
53768
  function applyGetters(self, json, options) {
53573
- const schema = self.schema;
53769
+ const schema = self.$__schema;
53574
53770
  const paths = Object.keys(schema.paths);
53575
53771
  let i = paths.length;
53576
53772
  let path;
@@ -53625,7 +53821,7 @@ function applyGetters(self, json, options) {
53625
53821
  */
53626
53822
 
53627
53823
  function applySchemaTypeTransforms(self, json) {
53628
- const schema = self.schema;
53824
+ const schema = self.$__schema;
53629
53825
  const paths = Object.keys(schema.paths || {});
53630
53826
  const cur = self._doc;
53631
53827
 
@@ -53668,7 +53864,7 @@ function throwErrorIfPromise(path, transformedValue) {
53668
53864
  */
53669
53865
 
53670
53866
  function omitDeselectedFields(self, json) {
53671
- const schema = self.schema;
53867
+ const schema = self.$__schema;
53672
53868
  const paths = Object.keys(schema.paths || {});
53673
53869
  const cur = self._doc;
53674
53870
 
@@ -53923,6 +54119,34 @@ Document.prototype.populate = function populate() {
53923
54119
  return this;
53924
54120
  };
53925
54121
 
54122
+ /**
54123
+ * Gets all populated documents associated with this document.
54124
+ *
54125
+ * @api public
54126
+ * @return {Array<Document>} array of populated documents. Empty array if there are no populated documents associated with this document.
54127
+ * @memberOf Document
54128
+ * @instance
54129
+ */
54130
+ Document.prototype.$getPopulatedDocs = function $getPopulatedDocs() {
54131
+ let keys = [];
54132
+ if (this.$__.populated != null) {
54133
+ keys = keys.concat(Object.keys(this.$__.populated));
54134
+ }
54135
+ if (this.$$populatedVirtuals != null) {
54136
+ keys = keys.concat(Object.keys(this.$$populatedVirtuals));
54137
+ }
54138
+ let result = [];
54139
+ for (const key of keys) {
54140
+ const value = this.get(key);
54141
+ if (Array.isArray(value)) {
54142
+ result = result.concat(value);
54143
+ } else if (value instanceof Document) {
54144
+ result.push(value);
54145
+ }
54146
+ }
54147
+ return result;
54148
+ };
54149
+
53926
54150
  /**
53927
54151
  * Explicitly executes population and returns a promise. Useful for promises integration.
53928
54152
  *
@@ -53992,25 +54216,21 @@ Document.prototype.execPopulate = function(callback) {
53992
54216
 
53993
54217
  Document.prototype.populated = function(path, val, options) {
53994
54218
  // val and options are internal
53995
- if (val === null || val === void 0) {
54219
+ if (val == null || val === true) {
53996
54220
  if (!this.$__.populated) {
53997
54221
  return undefined;
53998
54222
  }
53999
- const v = this.$__.populated[path];
54223
+
54224
+ // Map paths can be populated with either `path.$*` or just `path`
54225
+ const _path = path.endsWith('.$*') ? path.replace(/\.\$\*$/, '') : path;
54226
+
54227
+ const v = this.$__.populated[_path];
54000
54228
  if (v) {
54001
- return v.value;
54229
+ return val === true ? v : v.value;
54002
54230
  }
54003
54231
  return undefined;
54004
54232
  }
54005
54233
 
54006
- // internal
54007
- if (val === true) {
54008
- if (!this.$__.populated) {
54009
- return undefined;
54010
- }
54011
- return this.$__.populated[path];
54012
- }
54013
-
54014
54234
  this.$__.populated || (this.$__.populated = {});
54015
54235
  this.$__.populated[path] = { value: val, options: options };
54016
54236
 
@@ -54043,7 +54263,7 @@ Document.prototype.populated = function(path, val, options) {
54043
54263
  * console.log(doc.author); // '5144cf8050f071d979c118a7'
54044
54264
  * })
54045
54265
  *
54046
- * If the path was not populated, this is a no-op.
54266
+ * If the path was not provided, then all populated fields are returned to their unpopulated state.
54047
54267
  *
54048
54268
  * @param {String} path
54049
54269
  * @return {Document} this
@@ -54078,7 +54298,7 @@ Document.prototype.depopulate = function(path) {
54078
54298
  continue;
54079
54299
  }
54080
54300
  delete populated[key];
54081
- this.$set(key, populatedIds);
54301
+ utils.setValue(key, populatedIds, this._doc);
54082
54302
  }
54083
54303
  return this;
54084
54304
  }
@@ -54091,7 +54311,7 @@ Document.prototype.depopulate = function(path) {
54091
54311
  delete this.$$populatedVirtuals[singlePath];
54092
54312
  delete this._doc[singlePath];
54093
54313
  } else if (populatedIds) {
54094
- this.$set(singlePath, populatedIds);
54314
+ utils.setValue(singlePath, populatedIds, this._doc);
54095
54315
  }
54096
54316
  }
54097
54317
  return this;
@@ -54168,8 +54388,8 @@ Document.prototype.getChanges = function() {
54168
54388
  Document.ValidationError = ValidationError;
54169
54389
  module.exports = exports = Document;
54170
54390
 
54171
- }).call(this)}).call(this,{"isBuffer":require("../../is-buffer/index.js")},require('_process'))
54172
- },{"../../is-buffer/index.js":178,"./error/index":203,"./error/objectExpected":208,"./error/objectParameter":209,"./error/parallelValidate":212,"./error/strict":213,"./error/validation":214,"./error/validator":215,"./helpers/common":219,"./helpers/document/cleanModifiedSubpaths":224,"./helpers/document/compile":225,"./helpers/document/getEmbeddedDiscriminatorPath":226,"./helpers/document/handleSpreadDoc":227,"./helpers/get":228,"./helpers/isPromise":234,"./helpers/projection/isDefiningProjection":238,"./helpers/projection/isExclusive":239,"./helpers/promiseOrCallback":240,"./helpers/symbols":251,"./internal":255,"./options":256,"./plugins/idGetter":270,"./queryhelpers":272,"./schema":273,"./schema/mixed":283,"./types/array":296,"./types/documentarray":300,"./types/embedded":301,"./utils":306,"./virtualtype":307,"_process":324,"events":176,"mpath":309,"util":331}],194:[function(require,module,exports){
54391
+ }).call(this)}).call(this,{"isBuffer":require("../../is-buffer/index.js")})
54392
+ },{"../../is-buffer/index.js":178,"./error/index":203,"./error/objectExpected":208,"./error/objectParameter":209,"./error/parallelValidate":212,"./error/strict":213,"./error/validation":214,"./error/validator":215,"./helpers/common":219,"./helpers/document/cleanModifiedSubpaths":225,"./helpers/document/compile":226,"./helpers/document/getEmbeddedDiscriminatorPath":227,"./helpers/document/handleSpreadDoc":228,"./helpers/get":229,"./helpers/immediate":232,"./helpers/isPromise":236,"./helpers/projection/isDefiningProjection":240,"./helpers/projection/isExclusive":241,"./helpers/promiseOrCallback":242,"./helpers/symbols":253,"./internal":257,"./options":258,"./plugins/idGetter":272,"./queryhelpers":274,"./schema":275,"./schema/mixed":285,"./schema/symbols":295,"./types/array":298,"./types/documentarray":302,"./types/embedded":303,"./utils":308,"./virtualtype":309,"events":176,"mpath":311,"util":333}],194:[function(require,module,exports){
54173
54393
  'use strict';
54174
54394
 
54175
54395
  /* eslint-env browser */
@@ -54263,6 +54483,9 @@ exports.Binary = require('./binary');
54263
54483
  exports.Collection = function() {
54264
54484
  throw new Error('Cannot create a collection from browser library');
54265
54485
  };
54486
+ exports.getConnection = () => function() {
54487
+ throw new Error('Cannot create a connection from browser library');
54488
+ };
54266
54489
  exports.Decimal128 = require('./decimal128');
54267
54490
  exports.ObjectId = require('./objectid');
54268
54491
  exports.ReadPreference = require('./ReadPreference');
@@ -54322,8 +54545,9 @@ class CastError extends MongooseError {
54322
54545
  // If no args, assume we'll `init()` later.
54323
54546
  if (arguments.length > 0) {
54324
54547
  const stringValue = getStringValue(value);
54548
+ const valueType = getValueType(value);
54325
54549
  const messageFormat = getMessageFormat(schemaType);
54326
- const msg = formatMessage(null, type, stringValue, path, messageFormat);
54550
+ const msg = formatMessage(null, type, stringValue, path, messageFormat, valueType);
54327
54551
  super(msg);
54328
54552
  this.init(type, value, path, reason, schemaType);
54329
54553
  } else {
@@ -54331,6 +54555,18 @@ class CastError extends MongooseError {
54331
54555
  }
54332
54556
  }
54333
54557
 
54558
+ toJSON() {
54559
+ return {
54560
+ stringValue: this.stringValue,
54561
+ valueType: this.valueType,
54562
+ kind: this.kind,
54563
+ value: this.value,
54564
+ path: this.path,
54565
+ reason: this.reason,
54566
+ name: this.name,
54567
+ message: this.message
54568
+ };
54569
+ }
54334
54570
  /*!
54335
54571
  * ignore
54336
54572
  */
@@ -54341,6 +54577,7 @@ class CastError extends MongooseError {
54341
54577
  this.value = value;
54342
54578
  this.path = path;
54343
54579
  this.reason = reason;
54580
+ this.valueType = getValueType(value);
54344
54581
  }
54345
54582
 
54346
54583
  /*!
@@ -54355,6 +54592,7 @@ class CastError extends MongooseError {
54355
54592
  this.path = other.path;
54356
54593
  this.reason = other.reason;
54357
54594
  this.message = other.message;
54595
+ this.valueType = other.valueType;
54358
54596
  }
54359
54597
 
54360
54598
  /*!
@@ -54363,7 +54601,7 @@ class CastError extends MongooseError {
54363
54601
  setModel(model) {
54364
54602
  this.model = model;
54365
54603
  this.message = formatMessage(model, this.kind, this.stringValue, this.path,
54366
- this.messageFormat);
54604
+ this.messageFormat, this.valueType);
54367
54605
  }
54368
54606
  }
54369
54607
 
@@ -54380,6 +54618,21 @@ function getStringValue(value) {
54380
54618
  return stringValue;
54381
54619
  }
54382
54620
 
54621
+ function getValueType(value) {
54622
+ if (value == null) {
54623
+ return '' + value;
54624
+ }
54625
+
54626
+ const t = typeof value;
54627
+ if (t !== 'object') {
54628
+ return t;
54629
+ }
54630
+ if (typeof value.constructor !== 'function') {
54631
+ return t;
54632
+ }
54633
+ return value.constructor.name;
54634
+ }
54635
+
54383
54636
  function getMessageFormat(schemaType) {
54384
54637
  const messageFormat = get(schemaType, 'options.cast', null);
54385
54638
  if (typeof messageFormat === 'string') {
@@ -54391,7 +54644,7 @@ function getMessageFormat(schemaType) {
54391
54644
  * ignore
54392
54645
  */
54393
54646
 
54394
- function formatMessage(model, kind, stringValue, path, messageFormat) {
54647
+ function formatMessage(model, kind, stringValue, path, messageFormat, valueType) {
54395
54648
  if (messageFormat != null) {
54396
54649
  let ret = messageFormat.
54397
54650
  replace('{KIND}', kind).
@@ -54403,12 +54656,12 @@ function formatMessage(model, kind, stringValue, path, messageFormat) {
54403
54656
 
54404
54657
  return ret;
54405
54658
  } else {
54659
+ const valueTypeMsg = valueType ? ' (type ' + valueType + ')' : '';
54406
54660
  let ret = 'Cast to ' + kind + ' failed for value ' +
54407
- stringValue + ' at path "' + path + '"';
54661
+ stringValue + valueTypeMsg + ' at path "' + path + '"';
54408
54662
  if (model != null) {
54409
54663
  ret += ' for model "' + model.modelName + '"';
54410
54664
  }
54411
-
54412
54665
  return ret;
54413
54666
  }
54414
54667
  }
@@ -54419,7 +54672,7 @@ function formatMessage(model, kind, stringValue, path, messageFormat) {
54419
54672
 
54420
54673
  module.exports = CastError;
54421
54674
 
54422
- },{"../helpers/get":228,"./mongooseError":206,"util":331}],202:[function(require,module,exports){
54675
+ },{"../helpers/get":229,"./mongooseError":206,"util":333}],202:[function(require,module,exports){
54423
54676
 
54424
54677
  /*!
54425
54678
  * Module dependencies.
@@ -54807,7 +55060,7 @@ Object.defineProperty(DocumentNotFoundError.prototype, 'name', {
54807
55060
 
54808
55061
  module.exports = DocumentNotFoundError;
54809
55062
 
54810
- },{"./":203,"util":331}],208:[function(require,module,exports){
55063
+ },{"./":203,"util":333}],208:[function(require,module,exports){
54811
55064
  /*!
54812
55065
  * Module dependencies.
54813
55066
  */
@@ -55009,6 +55262,7 @@ module.exports = StrictModeError;
55009
55262
  'use strict';
55010
55263
 
55011
55264
  const MongooseError = require('./mongooseError');
55265
+ const getConstructorName = require('../helpers/getConstructorName');
55012
55266
  const util = require('util');
55013
55267
 
55014
55268
  class ValidationError extends MongooseError {
@@ -55021,7 +55275,7 @@ class ValidationError extends MongooseError {
55021
55275
  */
55022
55276
  constructor(instance) {
55023
55277
  let _message;
55024
- if (instance && instance.constructor.name === 'model') {
55278
+ if (getConstructorName(instance) === 'model') {
55025
55279
  _message = instance.constructor.modelName + ' validation failed';
55026
55280
  } else {
55027
55281
  _message = 'Validation failed';
@@ -55114,7 +55368,7 @@ function _generateMessage(err) {
55114
55368
 
55115
55369
  module.exports = ValidationError;
55116
55370
 
55117
- },{"./mongooseError":206,"util":331}],215:[function(require,module,exports){
55371
+ },{"../helpers/getConstructorName":230,"./mongooseError":206,"util":333}],215:[function(require,module,exports){
55118
55372
  /*!
55119
55373
  * Module dependencies.
55120
55374
  */
@@ -55260,6 +55514,9 @@ function arrayDepth(arr) {
55260
55514
  if (arr.length === 0) {
55261
55515
  return { min: 1, max: 1, containsNonArrayItem: false };
55262
55516
  }
55517
+ if (arr.length === 1 && !Array.isArray(arr[0])) {
55518
+ return { min: 1, max: 1, containsNonArrayItem: false };
55519
+ }
55263
55520
 
55264
55521
  const res = arrayDepth(arr[0]);
55265
55522
 
@@ -55423,7 +55680,7 @@ function cloneArray(arr, options) {
55423
55680
 
55424
55681
  return ret;
55425
55682
  }
55426
- },{"../types/decimal128":299,"../types/objectid":304,"../utils":306,"./getFunctionName":229,"./isBsonType":231,"./isMongooseObject":232,"./isObject":233,"./specialProperties":250,"./symbols":251,"regexp-clone":325}],219:[function(require,module,exports){
55683
+ },{"../types/decimal128":301,"../types/objectid":306,"../utils":308,"./getFunctionName":231,"./isBsonType":233,"./isMongooseObject":234,"./isObject":235,"./specialProperties":252,"./symbols":253,"regexp-clone":327}],219:[function(require,module,exports){
55427
55684
  (function (Buffer){(function (){
55428
55685
  'use strict';
55429
55686
 
@@ -55533,7 +55790,24 @@ function shouldFlatten(val) {
55533
55790
  }
55534
55791
 
55535
55792
  }).call(this)}).call(this,require("buffer").Buffer)
55536
- },{"../driver":195,"../types/decimal128":299,"../types/objectid":304,"./isMongooseObject":232,"buffer":128}],220:[function(require,module,exports){
55793
+ },{"../driver":195,"../types/decimal128":301,"../types/objectid":306,"./isMongooseObject":234,"buffer":128}],220:[function(require,module,exports){
55794
+ 'use strict';
55795
+
55796
+ const ObjectId = require('../../types/objectid');
55797
+
55798
+ module.exports = function areDiscriminatorValuesEqual(a, b) {
55799
+ if (typeof a === 'string' && typeof b === 'string') {
55800
+ return a === b;
55801
+ }
55802
+ if (typeof a === 'number' && typeof b === 'number') {
55803
+ return a === b;
55804
+ }
55805
+ if (a instanceof ObjectId && b instanceof ObjectId) {
55806
+ return a.toString() === b.toString();
55807
+ }
55808
+ return false;
55809
+ };
55810
+ },{"../../types/objectid":306}],221:[function(require,module,exports){
55537
55811
  'use strict';
55538
55812
 
55539
55813
  module.exports = function checkEmbeddedDiscriminatorKeyProjection(userProjection, path, schema, selected, addedPaths) {
@@ -55546,7 +55820,7 @@ module.exports = function checkEmbeddedDiscriminatorKeyProjection(userProjection
55546
55820
  selected.splice(selected.indexOf(_discriminatorKey), 1);
55547
55821
  }
55548
55822
  };
55549
- },{}],221:[function(require,module,exports){
55823
+ },{}],222:[function(require,module,exports){
55550
55824
  'use strict';
55551
55825
 
55552
55826
  const getDiscriminatorByValue = require('./getDiscriminatorByValue');
@@ -55563,7 +55837,7 @@ module.exports = function getConstructor(Constructor, value) {
55563
55837
  if (Constructor.discriminators[value[discriminatorKey]]) {
55564
55838
  Constructor = Constructor.discriminators[value[discriminatorKey]];
55565
55839
  } else {
55566
- const constructorByValue = getDiscriminatorByValue(Constructor, value[discriminatorKey]);
55840
+ const constructorByValue = getDiscriminatorByValue(Constructor.discriminators, value[discriminatorKey]);
55567
55841
  if (constructorByValue) {
55568
55842
  Constructor = constructorByValue;
55569
55843
  }
@@ -55572,9 +55846,11 @@ module.exports = function getConstructor(Constructor, value) {
55572
55846
 
55573
55847
  return Constructor;
55574
55848
  };
55575
- },{"./getDiscriminatorByValue":222}],222:[function(require,module,exports){
55849
+ },{"./getDiscriminatorByValue":223}],223:[function(require,module,exports){
55576
55850
  'use strict';
55577
55851
 
55852
+ const areDiscriminatorValuesEqual = require('./areDiscriminatorValuesEqual');
55853
+
55578
55854
  /*!
55579
55855
  * returns discriminator by discriminatorMapping.value
55580
55856
  *
@@ -55582,27 +55858,27 @@ module.exports = function getConstructor(Constructor, value) {
55582
55858
  * @param {string} value
55583
55859
  */
55584
55860
 
55585
- module.exports = function getDiscriminatorByValue(model, value) {
55586
- let discriminator = null;
55587
- if (!model.discriminators) {
55588
- return discriminator;
55861
+ module.exports = function getDiscriminatorByValue(discriminators, value) {
55862
+ if (discriminators == null) {
55863
+ return null;
55589
55864
  }
55590
- for (const name in model.discriminators) {
55591
- const it = model.discriminators[name];
55865
+ for (const name of Object.keys(discriminators)) {
55866
+ const it = discriminators[name];
55592
55867
  if (
55593
55868
  it.schema &&
55594
55869
  it.schema.discriminatorMapping &&
55595
- it.schema.discriminatorMapping.value == value
55870
+ areDiscriminatorValuesEqual(it.schema.discriminatorMapping.value, value)
55596
55871
  ) {
55597
- discriminator = it;
55598
- break;
55872
+ return it;
55599
55873
  }
55600
55874
  }
55601
- return discriminator;
55875
+ return null;
55602
55876
  };
55603
- },{}],223:[function(require,module,exports){
55877
+ },{"./areDiscriminatorValuesEqual":220}],224:[function(require,module,exports){
55604
55878
  'use strict';
55605
55879
 
55880
+ const areDiscriminatorValuesEqual = require('./areDiscriminatorValuesEqual');
55881
+
55606
55882
  /*!
55607
55883
  * returns discriminator by discriminatorMapping.value
55608
55884
  *
@@ -55619,13 +55895,13 @@ module.exports = function getSchemaDiscriminatorByValue(schema, value) {
55619
55895
  if (discriminatorSchema.discriminatorMapping == null) {
55620
55896
  continue;
55621
55897
  }
55622
- if (discriminatorSchema.discriminatorMapping.value === value) {
55898
+ if (areDiscriminatorValuesEqual(discriminatorSchema.discriminatorMapping.value, value)) {
55623
55899
  return discriminatorSchema;
55624
55900
  }
55625
55901
  }
55626
55902
  return null;
55627
55903
  };
55628
- },{}],224:[function(require,module,exports){
55904
+ },{"./areDiscriminatorValuesEqual":220}],225:[function(require,module,exports){
55629
55905
  'use strict';
55630
55906
 
55631
55907
  /*!
@@ -55642,7 +55918,7 @@ module.exports = function cleanModifiedSubpaths(doc, path, options) {
55642
55918
  }
55643
55919
  for (const modifiedPath of Object.keys(doc.$__.activePaths.states.modify)) {
55644
55920
  if (skipDocArrays) {
55645
- const schemaType = doc.schema.path(modifiedPath);
55921
+ const schemaType = doc.$__schema.path(modifiedPath);
55646
55922
  if (schemaType && schemaType.$isMongooseDocumentArray) {
55647
55923
  continue;
55648
55924
  }
@@ -55655,7 +55931,7 @@ module.exports = function cleanModifiedSubpaths(doc, path, options) {
55655
55931
  return deleted;
55656
55932
  };
55657
55933
 
55658
- },{}],225:[function(require,module,exports){
55934
+ },{}],226:[function(require,module,exports){
55659
55935
  'use strict';
55660
55936
 
55661
55937
  const documentSchemaSymbol = require('../../helpers/symbols').documentSchemaSymbol;
@@ -55732,6 +56008,13 @@ function defineKey(prop, subprops, prototype, prefix, keys, options) {
55732
56008
  value: prototype.schema
55733
56009
  });
55734
56010
 
56011
+ Object.defineProperty(nested, '$__schema', {
56012
+ enumerable: false,
56013
+ configurable: true,
56014
+ writable: false,
56015
+ value: prototype.schema
56016
+ });
56017
+
55735
56018
  Object.defineProperty(nested, documentSchemaSymbol, {
55736
56019
  enumerable: false,
55737
56020
  configurable: true,
@@ -55839,13 +56122,7 @@ function getOwnPropertyDescriptors(object) {
55839
56122
  const result = {};
55840
56123
 
55841
56124
  Object.getOwnPropertyNames(object).forEach(function(key) {
55842
- result[key] = Object.getOwnPropertyDescriptor(object, key);
55843
- // Assume these are schema paths, ignore them re: #5470
55844
- if (result[key].get) {
55845
- delete result[key];
55846
- return;
55847
- }
55848
- result[key].enumerable = [
56125
+ const skip = [
55849
56126
  'isNew',
55850
56127
  '$__',
55851
56128
  'errors',
@@ -55856,12 +56133,18 @@ function getOwnPropertyDescriptors(object) {
55856
56133
  '__index',
55857
56134
  '$isDocumentArrayElement'
55858
56135
  ].indexOf(key) === -1;
56136
+ if (skip) {
56137
+ return;
56138
+ }
56139
+
56140
+ result[key] = Object.getOwnPropertyDescriptor(object, key);
56141
+ result[key].enumerable = false;
55859
56142
  });
55860
56143
 
55861
56144
  return result;
55862
56145
  }
55863
56146
 
55864
- },{"../../document":193,"../../helpers/get":228,"../../helpers/symbols":251,"../../options":256,"../../utils":306}],226:[function(require,module,exports){
56147
+ },{"../../document":193,"../../helpers/get":229,"../../helpers/symbols":253,"../../options":258,"../../utils":308}],227:[function(require,module,exports){
55865
56148
  'use strict';
55866
56149
 
55867
56150
  const get = require('../get');
@@ -55906,7 +56189,7 @@ module.exports = function getEmbeddedDiscriminatorPath(doc, path, options) {
55906
56189
  return typeOnly ? type : schema;
55907
56190
  };
55908
56191
 
55909
- },{"../get":228}],227:[function(require,module,exports){
56192
+ },{"../get":229}],228:[function(require,module,exports){
55910
56193
  'use strict';
55911
56194
 
55912
56195
  const utils = require('../../utils');
@@ -55924,7 +56207,7 @@ module.exports = function handleSpreadDoc(v) {
55924
56207
 
55925
56208
  return v;
55926
56209
  };
55927
- },{"../../utils":306}],228:[function(require,module,exports){
56210
+ },{"../../utils":308}],229:[function(require,module,exports){
55928
56211
  'use strict';
55929
56212
 
55930
56213
  /*!
@@ -55933,7 +56216,30 @@ module.exports = function handleSpreadDoc(v) {
55933
56216
  */
55934
56217
 
55935
56218
  module.exports = function get(obj, path, def) {
55936
- const parts = path.split('.');
56219
+ let parts;
56220
+ let isPathArray = false;
56221
+ if (typeof path === 'string') {
56222
+ if (path.indexOf('.') === -1) {
56223
+ const _v = getProperty(obj, path);
56224
+ if (_v == null) {
56225
+ return def;
56226
+ }
56227
+ return _v;
56228
+ }
56229
+
56230
+ parts = path.split('.');
56231
+ } else {
56232
+ isPathArray = true;
56233
+ parts = path;
56234
+
56235
+ if (parts.length === 1) {
56236
+ const _v = getProperty(obj, parts[0]);
56237
+ if (_v == null) {
56238
+ return def;
56239
+ }
56240
+ return _v;
56241
+ }
56242
+ }
55937
56243
  let rest = path;
55938
56244
  let cur = obj;
55939
56245
  for (const part of parts) {
@@ -55943,13 +56249,15 @@ module.exports = function get(obj, path, def) {
55943
56249
 
55944
56250
  // `lib/cast.js` depends on being able to get dotted paths in updates,
55945
56251
  // like `{ $set: { 'a.b': 42 } }`
55946
- if (cur[rest] != null) {
56252
+ if (!isPathArray && cur[rest] != null) {
55947
56253
  return cur[rest];
55948
56254
  }
55949
56255
 
55950
56256
  cur = getProperty(cur, part);
55951
56257
 
55952
- rest = rest.substr(part.length + 1);
56258
+ if (!isPathArray) {
56259
+ rest = rest.substr(part.length + 1);
56260
+ }
55953
56261
  }
55954
56262
 
55955
56263
  return cur == null ? def : cur;
@@ -55964,7 +56272,23 @@ function getProperty(obj, prop) {
55964
56272
  }
55965
56273
  return obj[prop];
55966
56274
  }
55967
- },{}],229:[function(require,module,exports){
56275
+ },{}],230:[function(require,module,exports){
56276
+ 'use strict';
56277
+
56278
+ /*!
56279
+ * If `val` is an object, returns constructor name, if possible. Otherwise returns undefined.
56280
+ */
56281
+
56282
+ module.exports = function getConstructorName(val) {
56283
+ if (val == null) {
56284
+ return void 0;
56285
+ }
56286
+ if (typeof val.constructor !== 'function') {
56287
+ return void 0;
56288
+ }
56289
+ return val.constructor.name;
56290
+ };
56291
+ },{}],231:[function(require,module,exports){
55968
56292
  'use strict';
55969
56293
 
55970
56294
  module.exports = function(fn) {
@@ -55974,7 +56298,7 @@ module.exports = function(fn) {
55974
56298
  return (fn.toString().trim().match(/^function\s*([^\s(]+)/) || [])[1];
55975
56299
  };
55976
56300
 
55977
- },{}],230:[function(require,module,exports){
56301
+ },{}],232:[function(require,module,exports){
55978
56302
  (function (process){(function (){
55979
56303
  /*!
55980
56304
  * Centralize this so we can more easily work around issues with people
@@ -55985,12 +56309,14 @@ module.exports = function(fn) {
55985
56309
 
55986
56310
  'use strict';
55987
56311
 
56312
+ const nextTick = process.nextTick.bind(process);
56313
+
55988
56314
  module.exports = function immediate(cb) {
55989
- return process.nextTick(cb);
56315
+ return nextTick(cb);
55990
56316
  };
55991
56317
 
55992
56318
  }).call(this)}).call(this,require('_process'))
55993
- },{"_process":324}],231:[function(require,module,exports){
56319
+ },{"_process":326}],233:[function(require,module,exports){
55994
56320
  'use strict';
55995
56321
 
55996
56322
  const get = require('./get');
@@ -56005,7 +56331,7 @@ function isBsonType(obj, typename) {
56005
56331
 
56006
56332
  module.exports = isBsonType;
56007
56333
 
56008
- },{"./get":228}],232:[function(require,module,exports){
56334
+ },{"./get":229}],234:[function(require,module,exports){
56009
56335
  'use strict';
56010
56336
 
56011
56337
  /*!
@@ -56027,7 +56353,7 @@ module.exports = function(v) {
56027
56353
  v.isMongooseBuffer || // Buffer
56028
56354
  v.$isMongooseMap; // Map
56029
56355
  };
56030
- },{}],233:[function(require,module,exports){
56356
+ },{}],235:[function(require,module,exports){
56031
56357
  (function (Buffer){(function (){
56032
56358
  'use strict';
56033
56359
 
@@ -56046,14 +56372,14 @@ module.exports = function(arg) {
56046
56372
  return Object.prototype.toString.call(arg) === '[object Object]';
56047
56373
  };
56048
56374
  }).call(this)}).call(this,{"isBuffer":require("../../../is-buffer/index.js")})
56049
- },{"../../../is-buffer/index.js":178}],234:[function(require,module,exports){
56375
+ },{"../../../is-buffer/index.js":178}],236:[function(require,module,exports){
56050
56376
  'use strict';
56051
56377
  function isPromise(val) {
56052
56378
  return !!val && (typeof val === 'object' || typeof val === 'function') && typeof val.then === 'function';
56053
56379
  }
56054
56380
 
56055
56381
  module.exports = isPromise;
56056
- },{}],235:[function(require,module,exports){
56382
+ },{}],237:[function(require,module,exports){
56057
56383
  'use strict';
56058
56384
 
56059
56385
  const symbols = require('../../schema/symbols');
@@ -56192,7 +56518,7 @@ function applyHooks(model, schema, options) {
56192
56518
  createWrapper(method, originalMethod, null, customMethodOptions);
56193
56519
  }
56194
56520
  }
56195
- },{"../../schema/symbols":293,"../promiseOrCallback":240}],236:[function(require,module,exports){
56521
+ },{"../../schema/symbols":295,"../promiseOrCallback":242}],238:[function(require,module,exports){
56196
56522
  'use strict';
56197
56523
 
56198
56524
  const Mixed = require('../../schema/mixed');
@@ -56258,7 +56584,7 @@ module.exports = function discriminator(model, name, schema, tiedValue, applyPlu
56258
56584
  }
56259
56585
 
56260
56586
  let value = name;
56261
- if (typeof tiedValue == 'string' && tiedValue.length) {
56587
+ if ((typeof tiedValue === 'string' && tiedValue.length) || tiedValue != null) {
56262
56588
  value = tiedValue;
56263
56589
  }
56264
56590
 
@@ -56321,17 +56647,17 @@ module.exports = function discriminator(model, name, schema, tiedValue, applyPlu
56321
56647
  default: value,
56322
56648
  select: true,
56323
56649
  set: function(newName) {
56324
- if (newName === value) {
56650
+ if (newName === value || (Array.isArray(value) && utils.deepEqual(newName, value))) {
56325
56651
  return value;
56326
56652
  }
56327
56653
  throw new Error('Can\'t set discriminator key "' + key + '"');
56328
56654
  },
56329
56655
  $skipDiscriminatorCheck: true
56330
56656
  };
56331
- obj[key][schema.options.typeKey] = existingPath ?
56332
- existingPath.instance :
56333
- String;
56657
+ obj[key][schema.options.typeKey] = existingPath ? existingPath.options[schema.options.typeKey] : String;
56334
56658
  schema.add(obj);
56659
+
56660
+
56335
56661
  schema.discriminatorMapping = { key: key, value: value, isRoot: false };
56336
56662
 
56337
56663
  if (baseSchema.options.collection) {
@@ -56399,7 +56725,7 @@ module.exports = function discriminator(model, name, schema, tiedValue, applyPlu
56399
56725
  return schema;
56400
56726
  };
56401
56727
 
56402
- },{"../../schema/mixed":283,"../../utils":306,"../document/compile":225,"../get":228}],237:[function(require,module,exports){
56728
+ },{"../../schema/mixed":285,"../../utils":308,"../document/compile":226,"../get":229}],239:[function(require,module,exports){
56403
56729
  'use strict';
56404
56730
 
56405
56731
  const MongooseError = require('../../error/mongooseError');
@@ -56419,7 +56745,7 @@ function validateRef(ref, path) {
56419
56745
  throw new MongooseError('Invalid ref at path "' + path + '". Got ' +
56420
56746
  util.inspect(ref, { depth: 0 }));
56421
56747
  }
56422
- },{"../../error/mongooseError":206,"util":331}],238:[function(require,module,exports){
56748
+ },{"../../error/mongooseError":206,"util":333}],240:[function(require,module,exports){
56423
56749
  'use strict';
56424
56750
 
56425
56751
  /*!
@@ -56439,7 +56765,7 @@ module.exports = function isDefiningProjection(val) {
56439
56765
  return true;
56440
56766
  };
56441
56767
 
56442
- },{}],239:[function(require,module,exports){
56768
+ },{}],241:[function(require,module,exports){
56443
56769
  'use strict';
56444
56770
 
56445
56771
  const isDefiningProjection = require('./isDefiningProjection');
@@ -56449,6 +56775,10 @@ const isDefiningProjection = require('./isDefiningProjection');
56449
56775
  */
56450
56776
 
56451
56777
  module.exports = function isExclusive(projection) {
56778
+ if (projection == null) {
56779
+ return null;
56780
+ }
56781
+
56452
56782
  const keys = Object.keys(projection);
56453
56783
  let ki = keys.length;
56454
56784
  let exclude = null;
@@ -56469,26 +56799,26 @@ module.exports = function isExclusive(projection) {
56469
56799
  return exclude;
56470
56800
  };
56471
56801
 
56472
- },{"./isDefiningProjection":238}],240:[function(require,module,exports){
56473
- (function (process){(function (){
56802
+ },{"./isDefiningProjection":240}],242:[function(require,module,exports){
56474
56803
  'use strict';
56475
56804
 
56476
56805
  const PromiseProvider = require('../promise_provider');
56806
+ const immediate = require('./immediate');
56477
56807
 
56478
- const emittedSymbol = Symbol.for('mongoose:emitted');
56808
+ const emittedSymbol = Symbol('mongoose:emitted');
56479
56809
 
56480
56810
  module.exports = function promiseOrCallback(callback, fn, ee, Promise) {
56481
56811
  if (typeof callback === 'function') {
56482
56812
  return fn(function(error) {
56483
56813
  if (error != null) {
56484
- if (ee != null && ee.listeners('error').length > 0 && !error[emittedSymbol]) {
56814
+ if (ee != null && ee.listeners != null && ee.listeners('error').length > 0 && !error[emittedSymbol]) {
56485
56815
  error[emittedSymbol] = true;
56486
56816
  ee.emit('error', error);
56487
56817
  }
56488
56818
  try {
56489
56819
  callback(error);
56490
56820
  } catch (error) {
56491
- return process.nextTick(() => {
56821
+ return immediate(() => {
56492
56822
  throw error;
56493
56823
  });
56494
56824
  }
@@ -56503,7 +56833,7 @@ module.exports = function promiseOrCallback(callback, fn, ee, Promise) {
56503
56833
  return new Promise((resolve, reject) => {
56504
56834
  fn(function(error, res) {
56505
56835
  if (error != null) {
56506
- if (ee != null && ee.listeners('error').length > 0 && !error[emittedSymbol]) {
56836
+ if (ee != null && ee.listeners != null && ee.listeners('error').length > 0 && !error[emittedSymbol]) {
56507
56837
  error[emittedSymbol] = true;
56508
56838
  ee.emit('error', error);
56509
56839
  }
@@ -56516,8 +56846,8 @@ module.exports = function promiseOrCallback(callback, fn, ee, Promise) {
56516
56846
  });
56517
56847
  });
56518
56848
  };
56519
- }).call(this)}).call(this,require('_process'))
56520
- },{"../promise_provider":271,"_process":324}],241:[function(require,module,exports){
56849
+
56850
+ },{"../promise_provider":273,"./immediate":232}],243:[function(require,module,exports){
56521
56851
  'use strict';
56522
56852
 
56523
56853
  /*!
@@ -56611,7 +56941,7 @@ function _getContexts(hook) {
56611
56941
  }
56612
56942
  return ret;
56613
56943
  }
56614
- },{}],242:[function(require,module,exports){
56944
+ },{}],244:[function(require,module,exports){
56615
56945
  'use strict';
56616
56946
 
56617
56947
  const specialKeys = new Set([
@@ -56623,7 +56953,7 @@ const specialKeys = new Set([
56623
56953
  module.exports = function isOperator(path) {
56624
56954
  return path.startsWith('$') && !specialKeys.has(path);
56625
56955
  };
56626
- },{}],243:[function(require,module,exports){
56956
+ },{}],245:[function(require,module,exports){
56627
56957
  'use strict';
56628
56958
 
56629
56959
  module.exports = function addAutoId(schema) {
@@ -56631,7 +56961,7 @@ module.exports = function addAutoId(schema) {
56631
56961
  _obj._id[schema.options.typeKey] = 'ObjectId';
56632
56962
  schema.add(_obj);
56633
56963
  };
56634
- },{}],244:[function(require,module,exports){
56964
+ },{}],246:[function(require,module,exports){
56635
56965
  'use strict';
56636
56966
 
56637
56967
  /**
@@ -56644,7 +56974,7 @@ module.exports = function cleanPositionalOperators(path) {
56644
56974
  replace(/\.\$(\[[^\]]*\])?(?=\.)/g, '.0').
56645
56975
  replace(/\.\$(\[[^\]]*\])?$/g, '.0');
56646
56976
  };
56647
- },{}],245:[function(require,module,exports){
56977
+ },{}],247:[function(require,module,exports){
56648
56978
  'use strict';
56649
56979
 
56650
56980
  const get = require('../get');
@@ -56801,7 +57131,7 @@ module.exports = function getIndexes(schema) {
56801
57131
  }
56802
57132
  };
56803
57133
 
56804
- },{"../get":228,"../isObject":233}],246:[function(require,module,exports){
57134
+ },{"../get":229,"../isObject":235}],248:[function(require,module,exports){
56805
57135
  'use strict';
56806
57136
 
56807
57137
  const addAutoId = require('./addAutoId');
@@ -56822,7 +57152,7 @@ module.exports = function handleIdOption(schema, options) {
56822
57152
 
56823
57153
  return schema;
56824
57154
  };
56825
- },{"./addAutoId":243}],247:[function(require,module,exports){
57155
+ },{"./addAutoId":245}],249:[function(require,module,exports){
56826
57156
  'use strict';
56827
57157
 
56828
57158
  module.exports = handleTimestampOption;
@@ -56847,11 +57177,19 @@ function handleTimestampOption(arg, prop) {
56847
57177
  }
56848
57178
  return arg[prop];
56849
57179
  }
56850
- },{}],248:[function(require,module,exports){
57180
+ },{}],250:[function(require,module,exports){
56851
57181
  'use strict';
56852
57182
 
56853
- module.exports = function merge(s1, s2) {
56854
- s1.add(s2.tree || {});
57183
+ module.exports = function merge(s1, s2, skipConflictingPaths) {
57184
+ const paths = Object.keys(s2.tree);
57185
+ const pathsToAdd = {};
57186
+ for (const key of paths) {
57187
+ if (skipConflictingPaths && (s1.paths[key] || s1.nested[key] || s1.singleNestedPaths[key])) {
57188
+ continue;
57189
+ }
57190
+ pathsToAdd[key] = s2.tree[key];
57191
+ }
57192
+ s1.add(pathsToAdd);
56855
57193
 
56856
57194
  s1.callQueue = s1.callQueue.concat(s2.callQueue);
56857
57195
  s1.method(s2.methods);
@@ -56868,7 +57206,7 @@ module.exports = function merge(s1, s2) {
56868
57206
  s1.s.hooks.merge(s2.s.hooks, false);
56869
57207
  };
56870
57208
 
56871
- },{}],249:[function(require,module,exports){
57209
+ },{}],251:[function(require,module,exports){
56872
57210
  'use strict';
56873
57211
 
56874
57212
  const StrictModeError = require('../../error/strict');
@@ -56915,11 +57253,11 @@ function createImmutableSetter(path, immutable) {
56915
57253
  };
56916
57254
  }
56917
57255
 
56918
- },{"../../error/strict":213}],250:[function(require,module,exports){
57256
+ },{"../../error/strict":213}],252:[function(require,module,exports){
56919
57257
  'use strict';
56920
57258
 
56921
57259
  module.exports = new Set(['__proto__', 'constructor', 'prototype']);
56922
- },{}],251:[function(require,module,exports){
57260
+ },{}],253:[function(require,module,exports){
56923
57261
  'use strict';
56924
57262
 
56925
57263
  exports.arrayAtomicsSymbol = Symbol('mongoose#Array#_atomics');
@@ -56939,7 +57277,7 @@ exports.schemaTypeSymbol = Symbol('mongoose#schemaType');
56939
57277
  exports.sessionNewDocuments = Symbol('mongoose:ClientSession#newDocuments');
56940
57278
  exports.scopeSymbol = Symbol('mongoose#Document#scope');
56941
57279
  exports.validatorErrorSymbol = Symbol('mongoose:validatorError');
56942
- },{}],252:[function(require,module,exports){
57280
+ },{}],254:[function(require,module,exports){
56943
57281
  'use strict';
56944
57282
 
56945
57283
  const applyTimestampsToChildren = require('../update/applyTimestampsToChildren');
@@ -56993,7 +57331,7 @@ module.exports = function setupTimestamps(schema, timestamps) {
56993
57331
  (this.ownerDocument ? this.ownerDocument() : this).constructor.base.now();
56994
57332
  const auto_id = this._id && this._id.auto;
56995
57333
 
56996
- if (!skipCreatedAt && createdAt && !this.get(createdAt) && this.$__isSelected(createdAt)) {
57334
+ if (!skipCreatedAt && this.isNew && createdAt && !this.get(createdAt) && this.$__isSelected(createdAt)) {
56997
57335
  this.$set(createdAt, auto_id ? this._id.getTimestamp() : defaultTimestamp);
56998
57336
  }
56999
57337
 
@@ -57051,7 +57389,7 @@ module.exports = function setupTimestamps(schema, timestamps) {
57051
57389
  next();
57052
57390
  }
57053
57391
  };
57054
- },{"../../schema/symbols":293,"../get":228,"../schema/handleTimestampOption":247,"../update/applyTimestampsToChildren":253,"../update/applyTimestampsToUpdate":254}],253:[function(require,module,exports){
57392
+ },{"../../schema/symbols":295,"../get":229,"../schema/handleTimestampOption":249,"../update/applyTimestampsToChildren":255,"../update/applyTimestampsToUpdate":256}],255:[function(require,module,exports){
57055
57393
  'use strict';
57056
57394
 
57057
57395
  const cleanPositionalOperators = require('../schema/cleanPositionalOperators');
@@ -57073,34 +57411,10 @@ function applyTimestampsToChildren(now, update, schema) {
57073
57411
 
57074
57412
  if (hasDollarKey) {
57075
57413
  if (update.$push) {
57076
- for (const key of Object.keys(update.$push)) {
57077
- const $path = schema.path(key);
57078
- if (update.$push[key] &&
57079
- $path &&
57080
- $path.$isMongooseDocumentArray &&
57081
- $path.schema.options.timestamps) {
57082
- const timestamps = $path.schema.options.timestamps;
57083
- const createdAt = handleTimestampOption(timestamps, 'createdAt');
57084
- const updatedAt = handleTimestampOption(timestamps, 'updatedAt');
57085
- if (update.$push[key].$each) {
57086
- update.$push[key].$each.forEach(function(subdoc) {
57087
- if (updatedAt != null) {
57088
- subdoc[updatedAt] = now;
57089
- }
57090
- if (createdAt != null) {
57091
- subdoc[createdAt] = now;
57092
- }
57093
- });
57094
- } else {
57095
- if (updatedAt != null) {
57096
- update.$push[key][updatedAt] = now;
57097
- }
57098
- if (createdAt != null) {
57099
- update.$push[key][createdAt] = now;
57100
- }
57101
- }
57102
- }
57103
- }
57414
+ _applyTimestampToUpdateOperator(update.$push);
57415
+ }
57416
+ if (update.$addToSet) {
57417
+ _applyTimestampToUpdateOperator(update.$addToSet);
57104
57418
  }
57105
57419
  if (update.$set != null) {
57106
57420
  const keys = Object.keys(update.$set);
@@ -57108,12 +57422,49 @@ function applyTimestampsToChildren(now, update, schema) {
57108
57422
  applyTimestampsToUpdateKey(schema, key, update.$set, now);
57109
57423
  }
57110
57424
  }
57425
+ if (update.$setOnInsert != null) {
57426
+ const keys = Object.keys(update.$setOnInsert);
57427
+ for (const key of keys) {
57428
+ applyTimestampsToUpdateKey(schema, key, update.$setOnInsert, now);
57429
+ }
57430
+ }
57111
57431
  }
57112
57432
 
57113
57433
  const updateKeys = Object.keys(update).filter(key => !key.startsWith('$'));
57114
57434
  for (const key of updateKeys) {
57115
57435
  applyTimestampsToUpdateKey(schema, key, update, now);
57116
57436
  }
57437
+
57438
+ function _applyTimestampToUpdateOperator(op) {
57439
+ for (const key of Object.keys(op)) {
57440
+ const $path = schema.path(key.replace(/\.\$\./i, '.').replace(/.\$$/, ''));
57441
+ if (op[key] &&
57442
+ $path &&
57443
+ $path.$isMongooseDocumentArray &&
57444
+ $path.schema.options.timestamps) {
57445
+ const timestamps = $path.schema.options.timestamps;
57446
+ const createdAt = handleTimestampOption(timestamps, 'createdAt');
57447
+ const updatedAt = handleTimestampOption(timestamps, 'updatedAt');
57448
+ if (op[key].$each) {
57449
+ op[key].$each.forEach(function(subdoc) {
57450
+ if (updatedAt != null) {
57451
+ subdoc[updatedAt] = now;
57452
+ }
57453
+ if (createdAt != null) {
57454
+ subdoc[createdAt] = now;
57455
+ }
57456
+ });
57457
+ } else {
57458
+ if (updatedAt != null) {
57459
+ op[key][updatedAt] = now;
57460
+ }
57461
+ if (createdAt != null) {
57462
+ op[key][createdAt] = now;
57463
+ }
57464
+ }
57465
+ }
57466
+ }
57467
+ }
57117
57468
  }
57118
57469
 
57119
57470
  function applyTimestampsToDocumentArray(arr, schematype, now) {
@@ -57224,7 +57575,7 @@ function applyTimestampsToUpdateKey(schema, key, update, now) {
57224
57575
  }
57225
57576
  }
57226
57577
  }
57227
- },{"../schema/cleanPositionalOperators":244,"../schema/handleTimestampOption":247}],254:[function(require,module,exports){
57578
+ },{"../schema/cleanPositionalOperators":246,"../schema/handleTimestampOption":249}],256:[function(require,module,exports){
57228
57579
  'use strict';
57229
57580
 
57230
57581
  /*!
@@ -57345,7 +57696,7 @@ function applyTimestampsToUpdate(now, createdAt, updatedAt, currentUpdate, optio
57345
57696
  return updates;
57346
57697
  }
57347
57698
 
57348
- },{"../get":228}],255:[function(require,module,exports){
57699
+ },{"../get":229}],257:[function(require,module,exports){
57349
57700
  /*!
57350
57701
  * Dependencies
57351
57702
  */
@@ -57385,7 +57736,7 @@ function InternalCache() {
57385
57736
  this.fullPath = undefined;
57386
57737
  }
57387
57738
 
57388
- },{"./statemachine":295}],256:[function(require,module,exports){
57739
+ },{"./statemachine":297}],258:[function(require,module,exports){
57389
57740
  'use strict';
57390
57741
 
57391
57742
  /*!
@@ -57398,10 +57749,11 @@ exports.internalToObjectOptions = {
57398
57749
  getters: false,
57399
57750
  _skipDepopulateTopLevel: true,
57400
57751
  depopulate: true,
57401
- flattenDecimals: false
57752
+ flattenDecimals: false,
57753
+ useProjection: false
57402
57754
  };
57403
57755
 
57404
- },{}],257:[function(require,module,exports){
57756
+ },{}],259:[function(require,module,exports){
57405
57757
  'use strict';
57406
57758
 
57407
57759
  const clone = require('../helpers/clone');
@@ -57438,7 +57790,7 @@ class PopulateOptions {
57438
57790
  */
57439
57791
 
57440
57792
  module.exports = PopulateOptions;
57441
- },{"../helpers/clone":218}],258:[function(require,module,exports){
57793
+ },{"../helpers/clone":218}],260:[function(require,module,exports){
57442
57794
  'use strict';
57443
57795
 
57444
57796
  const SchemaTypeOptions = require('./SchemaTypeOptions');
@@ -57491,14 +57843,14 @@ Object.defineProperty(SchemaArrayOptions.prototype, 'enum', opts);
57491
57843
  * @instance
57492
57844
  */
57493
57845
 
57494
- Object.defineProperty(SchemaArrayOptions.prototype, 'enum', opts);
57846
+ Object.defineProperty(SchemaArrayOptions.prototype, 'of', opts);
57495
57847
 
57496
57848
  /*!
57497
57849
  * ignore
57498
57850
  */
57499
57851
 
57500
57852
  module.exports = SchemaArrayOptions;
57501
- },{"./SchemaTypeOptions":267,"./propertyOptions":269}],259:[function(require,module,exports){
57853
+ },{"./SchemaTypeOptions":269,"./propertyOptions":271}],261:[function(require,module,exports){
57502
57854
  'use strict';
57503
57855
 
57504
57856
  const SchemaTypeOptions = require('./SchemaTypeOptions');
@@ -57537,7 +57889,7 @@ Object.defineProperty(SchemaBufferOptions.prototype, 'subtype', opts);
57537
57889
  */
57538
57890
 
57539
57891
  module.exports = SchemaBufferOptions;
57540
- },{"./SchemaTypeOptions":267,"./propertyOptions":269}],260:[function(require,module,exports){
57892
+ },{"./SchemaTypeOptions":269,"./propertyOptions":271}],262:[function(require,module,exports){
57541
57893
  'use strict';
57542
57894
 
57543
57895
  const SchemaTypeOptions = require('./SchemaTypeOptions');
@@ -57602,7 +57954,7 @@ Object.defineProperty(SchemaDateOptions.prototype, 'expires', opts);
57602
57954
  */
57603
57955
 
57604
57956
  module.exports = SchemaDateOptions;
57605
- },{"./SchemaTypeOptions":267,"./propertyOptions":269}],261:[function(require,module,exports){
57957
+ },{"./SchemaTypeOptions":269,"./propertyOptions":271}],263:[function(require,module,exports){
57606
57958
  'use strict';
57607
57959
 
57608
57960
  const SchemaTypeOptions = require('./SchemaTypeOptions');
@@ -57671,7 +58023,7 @@ Object.defineProperty(SchemaDocumentArrayOptions.prototype, '_id', opts);
57671
58023
  */
57672
58024
 
57673
58025
  module.exports = SchemaDocumentArrayOptions;
57674
- },{"./SchemaTypeOptions":267,"./propertyOptions":269}],262:[function(require,module,exports){
58026
+ },{"./SchemaTypeOptions":269,"./propertyOptions":271}],264:[function(require,module,exports){
57675
58027
  'use strict';
57676
58028
 
57677
58029
  const SchemaTypeOptions = require('./SchemaTypeOptions');
@@ -57715,7 +58067,7 @@ const opts = require('./propertyOptions');
57715
58067
  Object.defineProperty(SchemaMapOptions.prototype, 'of', opts);
57716
58068
 
57717
58069
  module.exports = SchemaMapOptions;
57718
- },{"./SchemaTypeOptions":267,"./propertyOptions":269}],263:[function(require,module,exports){
58070
+ },{"./SchemaTypeOptions":269,"./propertyOptions":271}],265:[function(require,module,exports){
57719
58071
  'use strict';
57720
58072
 
57721
58073
  const SchemaTypeOptions = require('./SchemaTypeOptions');
@@ -57815,7 +58167,7 @@ Object.defineProperty(SchemaNumberOptions.prototype, 'populate', opts);
57815
58167
  */
57816
58168
 
57817
58169
  module.exports = SchemaNumberOptions;
57818
- },{"./SchemaTypeOptions":267,"./propertyOptions":269}],264:[function(require,module,exports){
58170
+ },{"./SchemaTypeOptions":269,"./propertyOptions":271}],266:[function(require,module,exports){
57819
58171
  'use strict';
57820
58172
 
57821
58173
  const SchemaTypeOptions = require('./SchemaTypeOptions');
@@ -57879,7 +58231,7 @@ Object.defineProperty(SchemaObjectIdOptions.prototype, 'populate', opts);
57879
58231
  */
57880
58232
 
57881
58233
  module.exports = SchemaObjectIdOptions;
57882
- },{"./SchemaTypeOptions":267,"./propertyOptions":269}],265:[function(require,module,exports){
58234
+ },{"./SchemaTypeOptions":269,"./propertyOptions":271}],267:[function(require,module,exports){
57883
58235
  'use strict';
57884
58236
 
57885
58237
  const SchemaTypeOptions = require('./SchemaTypeOptions');
@@ -57922,7 +58274,7 @@ const opts = require('./propertyOptions');
57922
58274
  Object.defineProperty(SchemaSingleNestedOptions.prototype, '_id', opts);
57923
58275
 
57924
58276
  module.exports = SchemaSingleNestedOptions;
57925
- },{"./SchemaTypeOptions":267,"./propertyOptions":269}],266:[function(require,module,exports){
58277
+ },{"./SchemaTypeOptions":269,"./propertyOptions":271}],268:[function(require,module,exports){
57926
58278
  'use strict';
57927
58279
 
57928
58280
  const SchemaTypeOptions = require('./SchemaTypeOptions');
@@ -58062,7 +58414,7 @@ Object.defineProperty(SchemaStringOptions.prototype, 'populate', opts);
58062
58414
 
58063
58415
  module.exports = SchemaStringOptions;
58064
58416
 
58065
- },{"./SchemaTypeOptions":267,"./propertyOptions":269}],267:[function(require,module,exports){
58417
+ },{"./SchemaTypeOptions":269,"./propertyOptions":271}],269:[function(require,module,exports){
58066
58418
  'use strict';
58067
58419
 
58068
58420
  const clone = require('../helpers/clone');
@@ -58294,7 +58646,7 @@ Object.defineProperty(SchemaTypeOptions.prototype, 'text', opts);
58294
58646
  Object.defineProperty(SchemaTypeOptions.prototype, 'transform', opts);
58295
58647
 
58296
58648
  module.exports = SchemaTypeOptions;
58297
- },{"../helpers/clone":218,"./propertyOptions":269}],268:[function(require,module,exports){
58649
+ },{"../helpers/clone":218,"./propertyOptions":271}],270:[function(require,module,exports){
58298
58650
  'use strict';
58299
58651
 
58300
58652
  const opts = require('./propertyOptions');
@@ -58459,7 +58811,7 @@ Object.defineProperty(VirtualOptions.prototype, 'limit', opts);
58459
58811
  Object.defineProperty(VirtualOptions.prototype, 'perDocumentLimit', opts);
58460
58812
 
58461
58813
  module.exports = VirtualOptions;
58462
- },{"./propertyOptions":269}],269:[function(require,module,exports){
58814
+ },{"./propertyOptions":271}],271:[function(require,module,exports){
58463
58815
  'use strict';
58464
58816
 
58465
58817
  module.exports = Object.freeze({
@@ -58468,7 +58820,7 @@ module.exports = Object.freeze({
58468
58820
  writable: true,
58469
58821
  value: void 0
58470
58822
  });
58471
- },{}],270:[function(require,module,exports){
58823
+ },{}],272:[function(require,module,exports){
58472
58824
  'use strict';
58473
58825
 
58474
58826
  /*!
@@ -58498,7 +58850,7 @@ function idGetter() {
58498
58850
  return null;
58499
58851
  }
58500
58852
 
58501
- },{}],271:[function(require,module,exports){
58853
+ },{}],273:[function(require,module,exports){
58502
58854
  (function (global){(function (){
58503
58855
  /*!
58504
58856
  * ignore
@@ -58551,7 +58903,7 @@ store.set(global.Promise);
58551
58903
  module.exports = store;
58552
58904
 
58553
58905
  }).call(this)}).call(this,typeof global !== "undefined" ? global : typeof self !== "undefined" ? self : typeof window !== "undefined" ? window : {})
58554
- },{"assert":102,"mquery":316}],272:[function(require,module,exports){
58906
+ },{"assert":102,"mquery":318}],274:[function(require,module,exports){
58555
58907
  'use strict';
58556
58908
 
58557
58909
  /*!
@@ -58585,6 +58937,10 @@ exports.preparePopulationOptions = function preparePopulationOptions(query, opti
58585
58937
  forEach(makeLean(options.lean));
58586
58938
  }
58587
58939
 
58940
+ pop.forEach(opts => {
58941
+ opts._localModel = query.model;
58942
+ });
58943
+
58588
58944
  return pop;
58589
58945
  };
58590
58946
 
@@ -58625,6 +58981,9 @@ exports.preparePopulationOptionsMQ = function preparePopulationOptionsMQ(query,
58625
58981
  pop.forEach(p => {
58626
58982
  p._queryProjection = projection;
58627
58983
  });
58984
+ pop.forEach(opts => {
58985
+ opts._localModel = query.model;
58986
+ });
58628
58987
 
58629
58988
  return pop;
58630
58989
  };
@@ -58639,7 +58998,7 @@ exports.preparePopulationOptionsMQ = function preparePopulationOptionsMQ(query,
58639
58998
  *
58640
58999
  * @return {Document}
58641
59000
  */
58642
- exports.createModel = function createModel(model, doc, fields, userProvidedFields) {
59001
+ exports.createModel = function createModel(model, doc, fields, userProvidedFields, options) {
58643
59002
  model.hooks.execPreSync('createModel', doc);
58644
59003
  const discriminatorMapping = model.schema ?
58645
59004
  model.schema.discriminatorMapping :
@@ -58651,18 +59010,22 @@ exports.createModel = function createModel(model, doc, fields, userProvidedField
58651
59010
 
58652
59011
  const value = doc[key];
58653
59012
  if (key && value && model.discriminators) {
58654
- const discriminator = model.discriminators[value] || getDiscriminatorByValue(model, value);
59013
+ const discriminator = model.discriminators[value] || getDiscriminatorByValue(model.discriminators, value);
58655
59014
  if (discriminator) {
58656
59015
  const _fields = clone(userProvidedFields);
58657
59016
  exports.applyPaths(_fields, discriminator.schema);
58658
59017
  return new discriminator(undefined, _fields, true);
58659
59018
  }
58660
59019
  }
58661
-
59020
+ if (typeof options === 'undefined') {
59021
+ options = {};
59022
+ options.defaults = true;
59023
+ }
58662
59024
  return new model(undefined, fields, {
58663
59025
  skipId: true,
58664
59026
  isNew: false,
58665
- willInit: true
59027
+ willInit: true,
59028
+ defaults: options.defaults
58666
59029
  });
58667
59030
  };
58668
59031
 
@@ -58753,7 +59116,11 @@ exports.applyPaths = function applyPaths(fields, schema) {
58753
59116
  schema.eachPath(function(path, type) {
58754
59117
  if (prefix) path = prefix + '.' + path;
58755
59118
 
58756
- const addedPath = analyzePath(path, type);
59119
+ let addedPath = analyzePath(path, type);
59120
+ // arrays
59121
+ if (addedPath == null && type.$isMongooseArray && !type.$isMongooseDocumentArray) {
59122
+ addedPath = analyzePath(path, type.caster);
59123
+ }
58757
59124
  if (addedPath != null) {
58758
59125
  addedPaths.push(addedPath);
58759
59126
  }
@@ -58868,7 +59235,7 @@ exports.handleDeleteWriteOpResult = function handleDeleteWriteOpResult(callback)
58868
59235
  };
58869
59236
  };
58870
59237
 
58871
- },{"./helpers/clone":218,"./helpers/discriminator/checkEmbeddedDiscriminatorKeyProjection":220,"./helpers/discriminator/getDiscriminatorByValue":222,"./helpers/get":228,"./helpers/projection/isDefiningProjection":238}],273:[function(require,module,exports){
59238
+ },{"./helpers/clone":218,"./helpers/discriminator/checkEmbeddedDiscriminatorKeyProjection":221,"./helpers/discriminator/getDiscriminatorByValue":223,"./helpers/get":229,"./helpers/projection/isDefiningProjection":240}],275:[function(require,module,exports){
58872
59239
  (function (Buffer){(function (){
58873
59240
  'use strict';
58874
59241
 
@@ -58886,6 +59253,7 @@ const VirtualType = require('./virtualtype');
58886
59253
  const addAutoId = require('./helpers/schema/addAutoId');
58887
59254
  const arrayParentSymbol = require('./helpers/symbols').arrayParentSymbol;
58888
59255
  const get = require('./helpers/get');
59256
+ const getConstructorName = require('./helpers/getConstructorName');
58889
59257
  const getIndexes = require('./helpers/schema/getIndexes');
58890
59258
  const merge = require('./helpers/schema/merge');
58891
59259
  const mpath = require('mpath');
@@ -58925,6 +59293,7 @@ let id = 0;
58925
59293
  * - [bufferTimeoutMS](/docs/guide.html#bufferTimeoutMS): number - defaults to 10000 (10 seconds). If `bufferCommands` is enabled, the amount of time Mongoose will wait for connectivity to be restablished before erroring out.
58926
59294
  * - [capped](/docs/guide.html#capped): bool - defaults to false
58927
59295
  * - [collection](/docs/guide.html#collection): string - no default
59296
+ * - [discriminatorKey](/docs/guide.html#discriminatorKey): string - defaults to `__t`
58928
59297
  * - [id](/docs/guide.html#id): bool - defaults to true
58929
59298
  * - [_id](/docs/guide.html#_id): bool - defaults to true
58930
59299
  * - [minimize](/docs/guide.html#minimize): bool - controls [document#toObject](#document_Document-toObject) behavior when called manually - defaults to true
@@ -58985,6 +59354,7 @@ function Schema(obj, options) {
58985
59354
  this.plugins = [];
58986
59355
  // For internal debugging. Do not use this to try to save a schema in MDB.
58987
59356
  this.$id = ++id;
59357
+ this.mapPaths = [];
58988
59358
 
58989
59359
  this.s = {
58990
59360
  hooks: new Kareem()
@@ -59191,6 +59561,7 @@ Schema.prototype.clone = function() {
59191
59561
  s.$globalPluginsApplied = this.$globalPluginsApplied;
59192
59562
  s.$isRootDiscriminator = this.$isRootDiscriminator;
59193
59563
  s.$implicitlyCreated = this.$implicitlyCreated;
59564
+ s.mapPaths = [].concat(this.mapPaths);
59194
59565
 
59195
59566
  if (this.discriminatorMapping != null) {
59196
59567
  s.discriminatorMapping = Object.assign({}, this.discriminatorMapping);
@@ -59338,6 +59709,11 @@ Schema.prototype.add = function add(obj, prefix) {
59338
59709
  }
59339
59710
 
59340
59711
  prefix = prefix || '';
59712
+ // avoid prototype pollution
59713
+ if (prefix === '__proto__.' || prefix === 'constructor.' || prefix === 'prototype.') {
59714
+ return this;
59715
+ }
59716
+
59341
59717
  const keys = Object.keys(obj);
59342
59718
 
59343
59719
  for (const key of keys) {
@@ -59463,7 +59839,6 @@ reserved.isNew =
59463
59839
  reserved.populated =
59464
59840
  reserved.remove =
59465
59841
  reserved.save =
59466
- reserved.schema =
59467
59842
  reserved.toObject =
59468
59843
  reserved.validate = 1;
59469
59844
 
@@ -59560,8 +59935,13 @@ Schema.prototype.path = function(path, obj) {
59560
59935
  !utils.hasUserDefinedProperty(obj.of, this.options.typeKey);
59561
59936
  _mapType = isInlineSchema ? new Schema(obj.of) : obj.of;
59562
59937
  }
59938
+ if (utils.hasUserDefinedProperty(obj, 'ref')) {
59939
+ _mapType = { type: _mapType, ref: obj.ref };
59940
+ }
59941
+
59563
59942
  this.paths[mapPath] = this.interpretAsType(mapPath,
59564
59943
  _mapType, this.options);
59944
+ this.mapPaths.push(this.paths[mapPath]);
59565
59945
  schemaType.$__schemaType = this.paths[mapPath];
59566
59946
  }
59567
59947
 
@@ -59638,19 +60018,25 @@ Schema.prototype.path = function(path, obj) {
59638
60018
 
59639
60019
  if (schemaType.$isMongooseDocumentArray) {
59640
60020
  for (const key of Object.keys(schemaType.schema.paths)) {
59641
- this.subpaths[path + '.' + key] = schemaType.schema.paths[key];
59642
- schemaType.schema.paths[key].$isUnderneathDocArray = true;
60021
+ const _schemaType = schemaType.schema.paths[key];
60022
+ this.subpaths[path + '.' + key] = _schemaType;
60023
+ if (typeof _schemaType === 'object' && _schemaType != null) {
60024
+ _schemaType.$isUnderneathDocArray = true;
60025
+ }
59643
60026
  }
59644
60027
  for (const key of Object.keys(schemaType.schema.subpaths)) {
59645
- this.subpaths[path + '.' + key] = schemaType.schema.subpaths[key];
59646
- schemaType.schema.subpaths[key].$isUnderneathDocArray = true;
60028
+ const _schemaType = schemaType.schema.subpaths[key];
60029
+ this.subpaths[path + '.' + key] = _schemaType;
60030
+ if (typeof _schemaType === 'object' && _schemaType != null) {
60031
+ _schemaType.$isUnderneathDocArray = true;
60032
+ }
59647
60033
  }
59648
60034
  for (const key of Object.keys(schemaType.schema.singleNestedPaths)) {
59649
- if (typeof schemaType.schema.singleNestedPaths[cleanPath] !== 'object') {
59650
- continue;
60035
+ const _schemaType = schemaType.schema.singleNestedPaths[key];
60036
+ this.subpaths[path + '.' + key] = _schemaType;
60037
+ if (typeof _schemaType === 'object' && _schemaType != null) {
60038
+ _schemaType.$isUnderneathDocArray = true;
59651
60039
  }
59652
- this.subpaths[path + '.' + key] = schemaType.schema.singleNestedPaths[key];
59653
- schemaType.schema.singleNestedPaths[key].$isUnderneathDocArray = true;
59654
60040
  }
59655
60041
  }
59656
60042
 
@@ -59708,10 +60094,11 @@ function _pathToPositionalSyntax(path) {
59708
60094
  */
59709
60095
 
59710
60096
  function getMapPath(schema, path) {
59711
- for (const _path of Object.keys(schema.paths)) {
59712
- if (!_path.includes('.$*')) {
59713
- continue;
59714
- }
60097
+ if (schema.mapPaths.length === 0) {
60098
+ return null;
60099
+ }
60100
+ for (const val of schema.mapPaths) {
60101
+ const _path = val.path;
59715
60102
  const re = new RegExp('^' + _path.replace(/\.\$\*/g, '\\.[^.]+') + '$');
59716
60103
  if (re.test(path)) {
59717
60104
  return schema.paths[_path];
@@ -59785,11 +60172,21 @@ Schema.prototype.interpretAsType = function(path, obj, options) {
59785
60172
  : type[0];
59786
60173
 
59787
60174
  if (cast && cast.instanceOfSchema) {
60175
+ if (!(cast instanceof Schema)) {
60176
+ throw new TypeError('Schema for array path `' + path +
60177
+ '` is from a different copy of the Mongoose module. Please make sure you\'re using the same version ' +
60178
+ 'of Mongoose everywhere with `npm list mongoose`.');
60179
+ }
59788
60180
  return new MongooseTypes.DocumentArray(path, cast, obj);
59789
60181
  }
59790
60182
  if (cast &&
59791
60183
  cast[options.typeKey] &&
59792
60184
  cast[options.typeKey].instanceOfSchema) {
60185
+ if (!(cast[options.typeKey] instanceof Schema)) {
60186
+ throw new TypeError('Schema for array path `' + path +
60187
+ '` is from a different copy of the Mongoose module. Please make sure you\'re using the same version ' +
60188
+ 'of Mongoose everywhere with `npm list mongoose`.');
60189
+ }
59793
60190
  return new MongooseTypes.DocumentArray(path, cast[options.typeKey], obj, cast);
59794
60191
  }
59795
60192
 
@@ -59842,6 +60239,11 @@ Schema.prototype.interpretAsType = function(path, obj, options) {
59842
60239
  ? type
59843
60240
  : type.schemaName || utils.getFunctionName(type);
59844
60241
 
60242
+ // For Jest 26+, see #10296
60243
+ if (name === 'ClockDate') {
60244
+ name = 'Date';
60245
+ }
60246
+
59845
60247
  if (!MongooseTypes.hasOwnProperty(name)) {
59846
60248
  throw new TypeError('Invalid schema configuration: ' +
59847
60249
  `\`${name}\` is not a valid type within the array \`${path}\`.` +
@@ -59872,6 +60274,10 @@ Schema.prototype.interpretAsType = function(path, obj, options) {
59872
60274
  if (name === 'ObjectID') {
59873
60275
  name = 'ObjectId';
59874
60276
  }
60277
+ // For Jest 26+, see #10296
60278
+ if (name === 'ClockDate') {
60279
+ name = 'Date';
60280
+ }
59875
60281
 
59876
60282
  if (MongooseTypes[name] == null) {
59877
60283
  throw new TypeError(`Invalid schema configuration: \`${name}\` is not ` +
@@ -60326,7 +60732,7 @@ Schema.prototype.plugin = function(fn, opts) {
60326
60732
  * fizz.purr();
60327
60733
  * fizz.scratch();
60328
60734
  *
60329
- * NOTE: `Schema.method()` adds instance methods to the `Schema.methods` object. You can also add instance methods directly to the `Schema.methods` object as seen in the [guide](./guide.html#methods)
60735
+ * NOTE: `Schema.method()` adds instance methods to the `Schema.methods` object. You can also add instance methods directly to the `Schema.methods` object as seen in the [guide](/docs/guide.html#methods)
60330
60736
  *
60331
60737
  * @param {String|Object} method name
60332
60738
  * @param {Function} [fn]
@@ -60388,7 +60794,7 @@ Schema.prototype.static = function(name, fn) {
60388
60794
  *
60389
60795
  * @param {Object} fields
60390
60796
  * @param {Object} [options] Options to pass to [MongoDB driver's `createIndex()` function](http://mongodb.github.io/node-mongodb-native/2.0/api/Collection.html#createIndex)
60391
- * @param {String} [options.expires=null] Mongoose-specific syntactic sugar, uses [ms](https://www.npmjs.com/package/ms) to convert `expires` option into seconds for the `expireAfterSeconds` in the above link.
60797
+ * @param {String | number} [options.expires=null] Mongoose-specific syntactic sugar, uses [ms](https://www.npmjs.com/package/ms) to convert `expires` option into seconds for the `expireAfterSeconds` in the above link.
60392
60798
  * @api public
60393
60799
  */
60394
60800
 
@@ -60509,8 +60915,8 @@ Object.defineProperty(Schema, 'indexTypes', {
60509
60915
  });
60510
60916
 
60511
60917
  /**
60512
- * Returns a list of indexes that this schema declares, via `schema.index()`
60513
- * or by `index: true` in a path's options.
60918
+ * Returns a list of indexes that this schema declares, via `schema.index()` or by `index: true` in a path's options.
60919
+ * Indexes are expressed as an array `[spec, options]`.
60514
60920
  *
60515
60921
  * ####Example:
60516
60922
  *
@@ -60523,6 +60929,17 @@ Object.defineProperty(Schema, 'indexTypes', {
60523
60929
  * // [ { registeredAt: 1 }, { background: true } ] ]
60524
60930
  * userSchema.indexes();
60525
60931
  *
60932
+ * [Plugins](/docs/plugins.html) can use the return value of this function to modify a schema's indexes.
60933
+ * For example, the below plugin makes every index unique by default.
60934
+ *
60935
+ * function myPlugin(schema) {
60936
+ * for (const index of schema.indexes()) {
60937
+ * if (index[1].unique === undefined) {
60938
+ * index[1].unique = true;
60939
+ * }
60940
+ * }
60941
+ * }
60942
+ *
60526
60943
  * @api public
60527
60944
  * @return {Array} list of indexes defined in the schema
60528
60945
  */
@@ -60546,7 +60963,7 @@ Schema.prototype.indexes = function() {
60546
60963
  */
60547
60964
 
60548
60965
  Schema.prototype.virtual = function(name, options) {
60549
- if (name instanceof VirtualType || (name != null && name.constructor.name === 'VirtualType')) {
60966
+ if (name instanceof VirtualType || getConstructorName(name) === 'VirtualType') {
60550
60967
  return this.virtual(name.path, name.options);
60551
60968
  }
60552
60969
 
@@ -60730,9 +61147,9 @@ function _deletePath(schema, name) {
60730
61147
  /**
60731
61148
  * Loads an ES6 class into a schema. Maps [setters](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Functions/set) + [getters](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Functions/get), [static methods](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Classes/static),
60732
61149
  * and [instance methods](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Classes#Class_body_and_method_definitions)
60733
- * to schema [virtuals](http://mongoosejs.com/docs/guide.html#virtuals),
60734
- * [statics](http://mongoosejs.com/docs/guide.html#statics), and
60735
- * [methods](http://mongoosejs.com/docs/guide.html#methods).
61150
+ * to schema [virtuals](/docs/guide.html#virtuals),
61151
+ * [statics](/docs/guide.html#statics), and
61152
+ * [methods](/docs/guide.html#methods).
60736
61153
  *
60737
61154
  * ####Example:
60738
61155
  *
@@ -60777,12 +61194,12 @@ Schema.prototype.loadClass = function(model, virtualsOnly) {
60777
61194
  // Add static methods
60778
61195
  if (!virtualsOnly) {
60779
61196
  Object.getOwnPropertyNames(model).forEach(function(name) {
60780
- if (name.match(/^(length|name|prototype)$/)) {
61197
+ if (name.match(/^(length|name|prototype|constructor|__proto__)$/)) {
60781
61198
  return;
60782
61199
  }
60783
- const method = Object.getOwnPropertyDescriptor(model, name);
60784
- if (typeof method.value === 'function') {
60785
- this.static(name, method.value);
61200
+ const prop = Object.getOwnPropertyDescriptor(model, name);
61201
+ if (prop.hasOwnProperty('value')) {
61202
+ this.static(name, prop.value);
60786
61203
  }
60787
61204
  }, this);
60788
61205
  }
@@ -60880,7 +61297,7 @@ Schema.prototype._getSchema = function(path) {
60880
61297
  }
60881
61298
  } else if (foundschema.$isSchemaMap) {
60882
61299
  if (p + 1 >= parts.length) {
60883
- return foundschema.$__schemaType;
61300
+ return foundschema;
60884
61301
  }
60885
61302
  const ret = search(parts.slice(p + 1), foundschema.$__schemaType.schema);
60886
61303
  return ret;
@@ -60991,14 +61408,14 @@ module.exports = exports = Schema;
60991
61408
  *
60992
61409
  * ####Types:
60993
61410
  *
60994
- * - [String](#schema-string-js)
60995
- * - [Number](#schema-number-js)
60996
- * - [Boolean](#schema-boolean-js) | Bool
60997
- * - [Array](#schema-array-js)
60998
- * - [Buffer](#schema-buffer-js)
60999
- * - [Date](#schema-date-js)
61000
- * - [ObjectId](#schema-objectid-js) | Oid
61001
- * - [Mixed](#schema-mixed-js)
61411
+ * - [String](/docs/schematypes.html#strings)
61412
+ * - [Number](/docs/schematypes.html#numbers)
61413
+ * - [Boolean](/docs/schematypes.html#booleans) | Bool
61414
+ * - [Array](/docs/schematypes.html#arrays)
61415
+ * - [Buffer](/docs/schematypes.html#buffers)
61416
+ * - [Date](/docs/schematypes.html#dates)
61417
+ * - [ObjectId](/docs/schematypes.html#objectids) | Oid
61418
+ * - [Mixed](/docs/schematypes.html#mixed)
61002
61419
  *
61003
61420
  * Using this exposed access to the `Mixed` SchemaType, we can use them in our schema.
61004
61421
  *
@@ -61017,7 +61434,7 @@ Schema.Types = MongooseTypes = require('./schema/index');
61017
61434
  exports.ObjectId = MongooseTypes.ObjectId;
61018
61435
 
61019
61436
  }).call(this)}).call(this,{"isBuffer":require("../../is-buffer/index.js")})
61020
- },{"../../is-buffer/index.js":178,"./driver":195,"./error/mongooseError":206,"./helpers/get":228,"./helpers/model/applyHooks":235,"./helpers/populate/validateRef":237,"./helpers/query/applyQueryMiddleware":241,"./helpers/schema/addAutoId":243,"./helpers/schema/getIndexes":245,"./helpers/schema/merge":248,"./helpers/symbols":251,"./helpers/timestamps/setupTimestamps":252,"./options/SchemaTypeOptions":267,"./options/VirtualOptions":268,"./schema/index":281,"./schematype":294,"./utils":306,"./virtualtype":307,"events":176,"kareem":181,"mpath":309,"util":331}],274:[function(require,module,exports){
61437
+ },{"../../is-buffer/index.js":178,"./driver":195,"./error/mongooseError":206,"./helpers/get":229,"./helpers/getConstructorName":230,"./helpers/model/applyHooks":237,"./helpers/populate/validateRef":239,"./helpers/query/applyQueryMiddleware":243,"./helpers/schema/addAutoId":245,"./helpers/schema/getIndexes":247,"./helpers/schema/merge":250,"./helpers/symbols":253,"./helpers/timestamps/setupTimestamps":254,"./options/SchemaTypeOptions":269,"./options/VirtualOptions":270,"./schema/index":283,"./schematype":296,"./utils":308,"./virtualtype":309,"events":176,"kareem":181,"mpath":311,"util":333}],276:[function(require,module,exports){
61021
61438
  'use strict';
61022
61439
 
61023
61440
  /*!
@@ -61355,7 +61772,7 @@ SingleNestedPath.prototype.clone = function() {
61355
61772
  return schematype;
61356
61773
  };
61357
61774
 
61358
- },{"../error/cast":201,"../error/objectExpected":208,"../helpers/discriminator/getConstructor":221,"../helpers/get":228,"../helpers/model/discriminator":236,"../helpers/schema/handleIdOption":246,"../options":256,"../options/SchemaSingleNestedOptions":265,"../schematype":294,"../types/subdocument":305,"./operators/exists":287,"./operators/geospatial":288,"./operators/helpers":289,"events":176}],275:[function(require,module,exports){
61775
+ },{"../error/cast":201,"../error/objectExpected":208,"../helpers/discriminator/getConstructor":222,"../helpers/get":229,"../helpers/model/discriminator":238,"../helpers/schema/handleIdOption":248,"../options":258,"../options/SchemaSingleNestedOptions":267,"../schematype":296,"../types/subdocument":307,"./operators/exists":289,"./operators/geospatial":290,"./operators/helpers":291,"events":176}],277:[function(require,module,exports){
61359
61776
  'use strict';
61360
61777
 
61361
61778
  /*!
@@ -61383,6 +61800,7 @@ let MongooseArray;
61383
61800
  let EmbeddedDoc;
61384
61801
 
61385
61802
  const isNestedArraySymbol = Symbol('mongoose#isNestedArray');
61803
+ const emptyOpts = Object.freeze({});
61386
61804
 
61387
61805
  /**
61388
61806
  * Array SchemaType constructor
@@ -61418,6 +61836,10 @@ function SchemaArray(key, cast, options, schemaOptions) {
61418
61836
  }
61419
61837
  }
61420
61838
 
61839
+ if (options != null && options.ref != null && castOptions.ref == null) {
61840
+ castOptions.ref = options.ref;
61841
+ }
61842
+
61421
61843
  if (cast === Object) {
61422
61844
  cast = Mixed;
61423
61845
  }
@@ -61439,16 +61861,16 @@ function SchemaArray(key, cast, options, schemaOptions) {
61439
61861
  if (typeof caster === 'function' &&
61440
61862
  !caster.$isArraySubdocument &&
61441
61863
  !caster.$isSchemaMap) {
61442
- this.caster = new caster(null, castOptions);
61864
+ const path = this.caster instanceof EmbeddedDoc ? null : key;
61865
+ this.caster = new caster(path, castOptions);
61443
61866
  } else {
61444
61867
  this.caster = caster;
61868
+ if (!(this.caster instanceof EmbeddedDoc)) {
61869
+ this.caster.path = key;
61870
+ }
61445
61871
  }
61446
61872
 
61447
61873
  this.$embeddedSchemaType = this.caster;
61448
-
61449
- if (!(this.caster instanceof EmbeddedDoc)) {
61450
- this.caster.path = key;
61451
- }
61452
61874
  }
61453
61875
 
61454
61876
  this.$isMongooseArray = true;
@@ -61499,6 +61921,10 @@ SchemaArray.schemaName = 'Array';
61499
61921
 
61500
61922
  SchemaArray.options = { castNonArrays: true };
61501
61923
 
61924
+ /*!
61925
+ * ignore
61926
+ */
61927
+
61502
61928
  SchemaArray.defaultOptions = {};
61503
61929
 
61504
61930
  /**
@@ -61516,7 +61942,6 @@ SchemaArray.defaultOptions = {};
61516
61942
  * @param {*} value - value for option
61517
61943
  * @return {undefined}
61518
61944
  * @function set
61519
- * @static
61520
61945
  * @api public
61521
61946
  */
61522
61947
  SchemaArray.set = SchemaType.set;
@@ -61549,7 +61974,6 @@ SchemaArray._checkRequired = SchemaType.prototype.checkRequired;
61549
61974
  * @param {Function} fn
61550
61975
  * @return {Function}
61551
61976
  * @function checkRequired
61552
- * @static
61553
61977
  * @api public
61554
61978
  */
61555
61979
 
@@ -61619,7 +62043,7 @@ SchemaArray.prototype.enum = function() {
61619
62043
  */
61620
62044
 
61621
62045
  SchemaArray.prototype.applyGetters = function(value, scope) {
61622
- if (scope != null && scope.populated(this.path)) {
62046
+ if (scope != null && scope.$__ != null && scope.populated(this.path)) {
61623
62047
  // means the object id was populated
61624
62048
  return value;
61625
62049
  }
@@ -61635,14 +62059,14 @@ SchemaArray.prototype.applyGetters = function(value, scope) {
61635
62059
  };
61636
62060
 
61637
62061
  SchemaArray.prototype._applySetters = function(value, scope, init, priorVal) {
61638
- if (this.casterConstructor instanceof SchemaArray &&
62062
+ if (this.casterConstructor.$isMongooseArray &&
61639
62063
  SchemaArray.options.castNonArrays &&
61640
62064
  !this[isNestedArraySymbol]) {
61641
62065
  // Check nesting levels and wrap in array if necessary
61642
62066
  let depth = 0;
61643
62067
  let arr = this;
61644
62068
  while (arr != null &&
61645
- arr instanceof SchemaArray &&
62069
+ arr.$isMongooseArray &&
61646
62070
  !arr.$isMongooseDocumentArray) {
61647
62071
  ++depth;
61648
62072
  arr = arr.casterConstructor;
@@ -61679,7 +62103,8 @@ SchemaArray.prototype.cast = function(value, doc, init, prev, options) {
61679
62103
  let l;
61680
62104
 
61681
62105
  if (Array.isArray(value)) {
61682
- if (!value.length && doc) {
62106
+ const len = value.length;
62107
+ if (!len && doc) {
61683
62108
  const indexes = doc.schema.indexedPaths();
61684
62109
 
61685
62110
  const arrayPath = this.path;
@@ -61704,39 +62129,35 @@ SchemaArray.prototype.cast = function(value, doc, init, prev, options) {
61704
62129
  }
61705
62130
  }
61706
62131
 
61707
- if (!(value && value.isMongooseArray)) {
61708
- value = MongooseArray(value, get(options, 'path', null) || this._arrayPath || this.path, doc, this);
61709
- } else if (value && value.isMongooseArray) {
61710
- // We need to create a new array, otherwise change tracking will
61711
- // update the old doc (gh-4449)
61712
- value = MongooseArray(value, get(options, 'path', null) || this._arrayPath || this.path, doc, this);
61713
- }
62132
+ options = options || emptyOpts;
62133
+
62134
+ value = MongooseArray(value, options.path || this._arrayPath || this.path, doc, this);
61714
62135
 
61715
- const isPopulated = doc != null && doc.$__ != null && doc.populated(this.path);
61716
- if (isPopulated && init) {
62136
+ if (init && doc != null && doc.$__ != null && doc.populated(this.path)) {
61717
62137
  return value;
61718
62138
  }
61719
62139
 
61720
62140
  const caster = this.caster;
62141
+ const isMongooseArray = caster.$isMongooseArray;
62142
+ const isArrayOfNumbers = caster.instance === 'Number';
61721
62143
  if (caster && this.casterConstructor !== Mixed) {
61722
62144
  try {
61723
- const len = value.length;
61724
62145
  for (i = 0; i < len; i++) {
61725
62146
  // Special case: number arrays disallow undefined.
61726
62147
  // Re: gh-840
61727
62148
  // See commit 1298fe92d2c790a90594bd08199e45a4a09162a6
61728
- if (caster.instance === 'Number' && value[i] === void 0) {
62149
+ if (isArrayOfNumbers && value[i] === void 0) {
61729
62150
  throw new MongooseError('Mongoose number arrays disallow storing undefined');
61730
62151
  }
61731
62152
  const opts = {};
61732
62153
  // Perf: creating `arrayPath` is expensive for large arrays.
61733
62154
  // We only need `arrayPath` if this is a nested array, so
61734
62155
  // skip if possible.
61735
- if (caster.$isMongooseArray) {
61736
- if (options != null && options.arrayPath != null) {
61737
- opts.arrayPath = options.arrayPath + '.' + i;
61738
- } else if (this.caster._arrayParentPath != null) {
61739
- opts.arrayPath = this.caster._arrayParentPath + '.' + i;
62156
+ if (isMongooseArray) {
62157
+ if (options.arrayPath != null) {
62158
+ opts.arrayPathIndex = i;
62159
+ } else if (caster._arrayParentPath != null) {
62160
+ opts.arrayPathIndex = i;
61740
62161
  }
61741
62162
  }
61742
62163
  value[i] = caster.applySetters(value[i], doc, init, void 0, opts);
@@ -61762,12 +62183,50 @@ SchemaArray.prototype.cast = function(value, doc, init, prev, options) {
61762
62183
  throw new CastError('Array', util.inspect(value), this.path, null, this);
61763
62184
  };
61764
62185
 
62186
+ /*!
62187
+ * ignore
62188
+ */
62189
+
62190
+ SchemaArray.prototype._castForPopulate = function _castForPopulate(value, doc) {
62191
+ // lazy load
62192
+ MongooseArray || (MongooseArray = require('../types').Array);
62193
+
62194
+ if (Array.isArray(value)) {
62195
+ let i;
62196
+ const len = value.length;
62197
+
62198
+ const caster = this.caster;
62199
+ if (caster && this.casterConstructor !== Mixed) {
62200
+ try {
62201
+ for (i = 0; i < len; i++) {
62202
+ const opts = {};
62203
+ // Perf: creating `arrayPath` is expensive for large arrays.
62204
+ // We only need `arrayPath` if this is a nested array, so
62205
+ // skip if possible.
62206
+ if (caster.$isMongooseArray && caster._arrayParentPath != null) {
62207
+ opts.arrayPathIndex = i;
62208
+ }
62209
+
62210
+ value[i] = caster.cast(value[i], doc, false, void 0, opts);
62211
+ }
62212
+ } catch (e) {
62213
+ // rethrow
62214
+ throw new CastError('[' + e.kind + ']', util.inspect(value), this.path + '.' + i, e, this);
62215
+ }
62216
+ }
62217
+
62218
+ return value;
62219
+ }
62220
+
62221
+ throw new CastError('Array', util.inspect(value), this.path, null, this);
62222
+ };
62223
+
61765
62224
  /*!
61766
62225
  * Ignore
61767
62226
  */
61768
62227
 
61769
62228
  SchemaArray.prototype.discriminator = function(name, schema) {
61770
- let arr = this; // eslint-disable-line consistent-this
62229
+ let arr = this;
61771
62230
  while (arr.$isMongooseArray && !arr.$isMongooseDocumentArray) {
61772
62231
  arr = arr.casterConstructor;
61773
62232
  if (arr == null || typeof arr === 'function') {
@@ -61825,7 +62284,7 @@ SchemaArray.prototype.castForQuery = function($conditional, value) {
61825
62284
  Constructor.discriminators[val[Constructor.schema.options.discriminatorKey]]) {
61826
62285
  Constructor = Constructor.discriminators[val[Constructor.schema.options.discriminatorKey]];
61827
62286
  } else {
61828
- const constructorByValue = getDiscriminatorByValue(Constructor, val[Constructor.schema.options.discriminatorKey]);
62287
+ const constructorByValue = getDiscriminatorByValue(Constructor.discriminators, val[Constructor.schema.options.discriminatorKey]);
61829
62288
  if (constructorByValue) {
61830
62289
  Constructor = constructorByValue;
61831
62290
  }
@@ -61966,7 +62425,7 @@ handle.$in = SchemaType.prototype.$conditionalHandlers.$in;
61966
62425
 
61967
62426
  module.exports = SchemaArray;
61968
62427
 
61969
- },{"../cast":186,"../error/mongooseError":206,"../helpers/arrayDepth":217,"../helpers/discriminator/getDiscriminatorByValue":222,"../helpers/get":228,"../helpers/query/isOperator":242,"../options/SchemaArrayOptions":258,"../schematype":294,"../types":302,"../utils":306,"./index.js":281,"./mixed":283,"./operators/exists":287,"./operators/geospatial":288,"./operators/helpers":289,"./operators/type":291,"util":331}],276:[function(require,module,exports){
62428
+ },{"../cast":186,"../error/mongooseError":206,"../helpers/arrayDepth":217,"../helpers/discriminator/getDiscriminatorByValue":223,"../helpers/get":229,"../helpers/query/isOperator":244,"../options/SchemaArrayOptions":260,"../schematype":296,"../types":304,"../utils":308,"./index.js":283,"./mixed":285,"./operators/exists":289,"./operators/geospatial":290,"./operators/helpers":291,"./operators/type":293,"util":333}],278:[function(require,module,exports){
61970
62429
  'use strict';
61971
62430
 
61972
62431
  /*!
@@ -62238,7 +62697,7 @@ SchemaBoolean.prototype._castNullish = function _castNullish(v) {
62238
62697
 
62239
62698
  module.exports = SchemaBoolean;
62240
62699
 
62241
- },{"../cast/boolean":187,"../error/cast":201,"../schematype":294,"../utils":306}],277:[function(require,module,exports){
62700
+ },{"../cast/boolean":187,"../error/cast":201,"../schematype":296,"../utils":308}],279:[function(require,module,exports){
62242
62701
  (function (Buffer){(function (){
62243
62702
  /*!
62244
62703
  * Module dependencies.
@@ -62252,11 +62711,8 @@ const SchemaType = require('../schematype');
62252
62711
  const handleBitwiseOperator = require('./operators/bitwise');
62253
62712
  const utils = require('../utils');
62254
62713
 
62255
- const populateModelSymbol = require('../helpers/symbols').populateModelSymbol;
62256
-
62257
62714
  const Binary = MongooseBuffer.Binary;
62258
62715
  const CastError = SchemaType.CastError;
62259
- let Document;
62260
62716
 
62261
62717
  /**
62262
62718
  * Buffer SchemaType constructor
@@ -62366,36 +62822,30 @@ SchemaBuffer.prototype.checkRequired = function(value, doc) {
62366
62822
  SchemaBuffer.prototype.cast = function(value, doc, init) {
62367
62823
  let ret;
62368
62824
  if (SchemaType._isRef(this, value, doc, init)) {
62369
- // wait! we may need to cast this to a document
62370
-
62371
- if (value === null || value === undefined) {
62825
+ if (value && value.isMongooseBuffer) {
62372
62826
  return value;
62373
62827
  }
62374
62828
 
62375
- // lazy load
62376
- Document || (Document = require('./../document'));
62377
-
62378
- if (value instanceof Document) {
62379
- value.$__.wasPopulated = true;
62829
+ if (Buffer.isBuffer(value)) {
62830
+ if (!value || !value.isMongooseBuffer) {
62831
+ value = new MongooseBuffer(value, [this.path, doc]);
62832
+ if (this.options.subtype != null) {
62833
+ value._subtype = this.options.subtype;
62834
+ }
62835
+ }
62380
62836
  return value;
62381
62837
  }
62382
62838
 
62383
- // setting a populated path
62384
- if (Buffer.isBuffer(value)) {
62385
- return value;
62386
- } else if (!utils.isObject(value)) {
62387
- throw new CastError('Buffer', value, this.path, null, this);
62839
+ if (value instanceof Binary) {
62840
+ ret = new MongooseBuffer(value.value(true), [this.path, doc]);
62841
+ if (typeof value.sub_type !== 'number') {
62842
+ throw new CastError('Buffer', value, this.path, null, this);
62843
+ }
62844
+ ret._subtype = value.sub_type;
62845
+ return ret;
62388
62846
  }
62389
62847
 
62390
- // Handle the case where user directly sets a populated
62391
- // path to a plain object; cast to the Model used in
62392
- // the population query.
62393
- const path = doc.$__fullPath(this.path);
62394
- const owner = doc.ownerDocument ? doc.ownerDocument() : doc;
62395
- const pop = owner.populated(path, true);
62396
- ret = new pop.options[populateModelSymbol](value);
62397
- ret.$__.wasPopulated = true;
62398
- return ret;
62848
+ return this._castRef(value, doc, init);
62399
62849
  }
62400
62850
 
62401
62851
  // documents
@@ -62518,7 +62968,7 @@ SchemaBuffer.prototype.castForQuery = function($conditional, val) {
62518
62968
  module.exports = SchemaBuffer;
62519
62969
 
62520
62970
  }).call(this)}).call(this,{"isBuffer":require("../../../is-buffer/index.js")})
62521
- },{"../../../is-buffer/index.js":178,"../helpers/symbols":251,"../options/SchemaBufferOptions":259,"../schematype":294,"../types/buffer":297,"../utils":306,"./../document":193,"./operators/bitwise":286}],278:[function(require,module,exports){
62971
+ },{"../../../is-buffer/index.js":178,"../options/SchemaBufferOptions":261,"../schematype":296,"../types/buffer":299,"../utils":308,"./operators/bitwise":288}],280:[function(require,module,exports){
62522
62972
  /*!
62523
62973
  * Module requirements.
62524
62974
  */
@@ -62529,6 +62979,7 @@ const MongooseError = require('../error/index');
62529
62979
  const SchemaDateOptions = require('../options/SchemaDateOptions');
62530
62980
  const SchemaType = require('../schematype');
62531
62981
  const castDate = require('../cast/date');
62982
+ const getConstructorName = require('../helpers/getConstructorName');
62532
62983
  const utils = require('../utils');
62533
62984
 
62534
62985
  const CastError = SchemaType.CastError;
@@ -62668,7 +63119,7 @@ SchemaDate._defaultCaster = v => {
62668
63119
  */
62669
63120
 
62670
63121
  SchemaDate.prototype.expires = function(when) {
62671
- if (!this._index || this._index.constructor.name !== 'Object') {
63122
+ if (getConstructorName(this._index) !== 'Object') {
62672
63123
  this._index = {};
62673
63124
  }
62674
63125
 
@@ -62922,8 +63373,7 @@ SchemaDate.prototype.castForQuery = function($conditional, val) {
62922
63373
 
62923
63374
  module.exports = SchemaDate;
62924
63375
 
62925
- },{"../cast/date":188,"../error/index":203,"../options/SchemaDateOptions":260,"../schematype":294,"../utils":306}],279:[function(require,module,exports){
62926
- (function (Buffer){(function (){
63376
+ },{"../cast/date":188,"../error/index":203,"../helpers/getConstructorName":230,"../options/SchemaDateOptions":262,"../schematype":296,"../utils":308}],281:[function(require,module,exports){
62927
63377
  /*!
62928
63378
  * Module dependencies.
62929
63379
  */
@@ -62936,10 +63386,6 @@ const Decimal128Type = require('../types/decimal128');
62936
63386
  const castDecimal128 = require('../cast/decimal128');
62937
63387
  const utils = require('../utils');
62938
63388
 
62939
- const populateModelSymbol = require('../helpers/symbols').populateModelSymbol;
62940
-
62941
- let Document;
62942
-
62943
63389
  /**
62944
63390
  * Decimal128 SchemaType constructor.
62945
63391
  *
@@ -63094,44 +63540,11 @@ Decimal128.prototype.checkRequired = function checkRequired(value, doc) {
63094
63540
 
63095
63541
  Decimal128.prototype.cast = function(value, doc, init) {
63096
63542
  if (SchemaType._isRef(this, value, doc, init)) {
63097
- // wait! we may need to cast this to a document
63098
-
63099
- if (value === null || value === undefined) {
63100
- return value;
63101
- }
63102
-
63103
- // lazy load
63104
- Document || (Document = require('./../document'));
63105
-
63106
- if (value instanceof Document) {
63107
- value.$__.wasPopulated = true;
63108
- return value;
63109
- }
63110
-
63111
- // setting a populated path
63112
63543
  if (value instanceof Decimal128Type) {
63113
63544
  return value;
63114
- } else if (Buffer.isBuffer(value) || !utils.isObject(value)) {
63115
- throw new CastError('Decimal128', value, this.path, null, this);
63116
- }
63117
-
63118
- // Handle the case where user directly sets a populated
63119
- // path to a plain object; cast to the Model used in
63120
- // the population query.
63121
- const path = doc.$__fullPath(this.path);
63122
- const owner = doc.ownerDocument ? doc.ownerDocument() : doc;
63123
- const pop = owner.populated(path, true);
63124
- let ret = value;
63125
- if (!doc.$__.populated ||
63126
- !doc.$__.populated[path] ||
63127
- !doc.$__.populated[path].options ||
63128
- !doc.$__.populated[path].options.options ||
63129
- !doc.$__.populated[path].options.options.lean) {
63130
- ret = new pop.options[populateModelSymbol](value);
63131
- ret.$__.wasPopulated = true;
63132
63545
  }
63133
63546
 
63134
- return ret;
63547
+ return this._castRef(value, doc, init);
63135
63548
  }
63136
63549
 
63137
63550
  let castDecimal128;
@@ -63172,8 +63585,7 @@ Decimal128.prototype.$conditionalHandlers =
63172
63585
 
63173
63586
  module.exports = Decimal128;
63174
63587
 
63175
- }).call(this)}).call(this,{"isBuffer":require("../../../is-buffer/index.js")})
63176
- },{"../../../is-buffer/index.js":178,"../cast/decimal128":189,"../helpers/symbols":251,"../schematype":294,"../types/decimal128":299,"../utils":306,"./../document":193}],280:[function(require,module,exports){
63588
+ },{"../cast/decimal128":189,"../schematype":296,"../types/decimal128":301,"../utils":308}],282:[function(require,module,exports){
63177
63589
  'use strict';
63178
63590
 
63179
63591
  /*!
@@ -63194,6 +63606,7 @@ const util = require('util');
63194
63606
  const utils = require('../utils');
63195
63607
  const getConstructor = require('../helpers/discriminator/getConstructor');
63196
63608
 
63609
+ const arrayAtomicsSymbol = require('../helpers/symbols').arrayAtomicsSymbol;
63197
63610
  const arrayPathSymbol = require('../helpers/symbols').arrayPathSymbol;
63198
63611
  const documentArrayParent = require('../helpers/symbols').documentArrayParent;
63199
63612
 
@@ -63577,8 +63990,12 @@ DocumentArrayPath.prototype.cast = function(value, doc, init, prev, options) {
63577
63990
  value = new MongooseDocumentArray(value, this.path, doc);
63578
63991
  }
63579
63992
 
63580
- if (options.arrayPath != null) {
63581
- value[arrayPathSymbol] = options.arrayPath;
63993
+ if (prev != null) {
63994
+ value[arrayAtomicsSymbol] = prev[arrayAtomicsSymbol] || {};
63995
+ }
63996
+
63997
+ if (options.arrayPathIndex != null) {
63998
+ value[arrayPathSymbol] = this.path + '.' + options.arrayPathIndex;
63582
63999
  }
63583
64000
 
63584
64001
  const len = value.length;
@@ -63738,7 +64155,7 @@ DocumentArrayPath.set = SchemaType.set;
63738
64155
 
63739
64156
  module.exports = DocumentArrayPath;
63740
64157
 
63741
- },{"../error/cast":201,"../error/validation":214,"../helpers/discriminator/getConstructor":221,"../helpers/get":228,"../helpers/model/discriminator":236,"../helpers/schema/handleIdOption":246,"../helpers/symbols":251,"../options/SchemaDocumentArrayOptions":261,"../schematype":294,"../types/documentarray":300,"../types/embedded":301,"../utils":306,"./array":275,"events":176,"util":331}],281:[function(require,module,exports){
64158
+ },{"../error/cast":201,"../error/validation":214,"../helpers/discriminator/getConstructor":222,"../helpers/get":229,"../helpers/model/discriminator":238,"../helpers/schema/handleIdOption":248,"../helpers/symbols":253,"../options/SchemaDocumentArrayOptions":263,"../schematype":296,"../types/documentarray":302,"../types/embedded":303,"../utils":308,"./array":277,"events":176,"util":333}],283:[function(require,module,exports){
63742
64159
 
63743
64160
  /*!
63744
64161
  * Module exports.
@@ -63777,7 +64194,7 @@ exports.Object = exports.Mixed;
63777
64194
  exports.Bool = exports.Boolean;
63778
64195
  exports.ObjectID = exports.ObjectId;
63779
64196
 
63780
- },{"./SingleNestedPath":274,"./array":275,"./boolean":276,"./buffer":277,"./date":278,"./decimal128":279,"./documentarray":280,"./map":282,"./mixed":283,"./number":284,"./objectid":285,"./string":292}],282:[function(require,module,exports){
64197
+ },{"./SingleNestedPath":276,"./array":277,"./boolean":278,"./buffer":279,"./date":280,"./decimal128":281,"./documentarray":282,"./map":284,"./mixed":285,"./number":286,"./objectid":287,"./string":294}],284:[function(require,module,exports){
63781
64198
  (function (global){(function (){
63782
64199
  'use strict';
63783
64200
 
@@ -63857,7 +64274,7 @@ Map.defaultOptions = {};
63857
64274
  module.exports = Map;
63858
64275
 
63859
64276
  }).call(this)}).call(this,typeof global !== "undefined" ? global : typeof self !== "undefined" ? self : typeof window !== "undefined" ? window : {})
63860
- },{"../options/SchemaMapOptions":262,"../schematype":294,"../types/map":303}],283:[function(require,module,exports){
64277
+ },{"../options/SchemaMapOptions":264,"../schematype":296,"../types/map":305}],285:[function(require,module,exports){
63861
64278
  /*!
63862
64279
  * Module dependencies.
63863
64280
  */
@@ -63867,6 +64284,7 @@ module.exports = Map;
63867
64284
  const SchemaType = require('../schematype');
63868
64285
  const symbols = require('./symbols');
63869
64286
  const isObject = require('../helpers/isObject');
64287
+ const utils = require('../utils');
63870
64288
 
63871
64289
  /**
63872
64290
  * Mixed SchemaType constructor.
@@ -63963,6 +64381,9 @@ Mixed.set = SchemaType.set;
63963
64381
  */
63964
64382
 
63965
64383
  Mixed.prototype.cast = function(val) {
64384
+ if (val instanceof Error) {
64385
+ return utils.errorToPOJO(val);
64386
+ }
63966
64387
  return val;
63967
64388
  };
63968
64389
 
@@ -63987,8 +64408,7 @@ Mixed.prototype.castForQuery = function($cond, val) {
63987
64408
 
63988
64409
  module.exports = Mixed;
63989
64410
 
63990
- },{"../helpers/isObject":233,"../schematype":294,"./symbols":293}],284:[function(require,module,exports){
63991
- (function (Buffer){(function (){
64411
+ },{"../helpers/isObject":235,"../schematype":296,"../utils":308,"./symbols":295}],286:[function(require,module,exports){
63992
64412
  'use strict';
63993
64413
 
63994
64414
  /*!
@@ -64002,10 +64422,7 @@ const castNumber = require('../cast/number');
64002
64422
  const handleBitwiseOperator = require('./operators/bitwise');
64003
64423
  const utils = require('../utils');
64004
64424
 
64005
- const populateModelSymbol = require('../helpers/symbols').populateModelSymbol;
64006
-
64007
64425
  const CastError = SchemaType.CastError;
64008
- let Document;
64009
64426
 
64010
64427
  /**
64011
64428
  * Number SchemaType constructor.
@@ -64341,36 +64758,11 @@ SchemaNumber.prototype.enum = function(values, message) {
64341
64758
 
64342
64759
  SchemaNumber.prototype.cast = function(value, doc, init) {
64343
64760
  if (SchemaType._isRef(this, value, doc, init)) {
64344
- // wait! we may need to cast this to a document
64345
-
64346
- if (value === null || value === undefined) {
64347
- return value;
64348
- }
64349
-
64350
- // lazy load
64351
- Document || (Document = require('./../document'));
64352
-
64353
- if (value instanceof Document) {
64354
- value.$__.wasPopulated = true;
64355
- return value;
64356
- }
64357
-
64358
- // setting a populated path
64359
64761
  if (typeof value === 'number') {
64360
64762
  return value;
64361
- } else if (Buffer.isBuffer(value) || !utils.isObject(value)) {
64362
- throw new CastError('Number', value, this.path, null, this);
64363
64763
  }
64364
64764
 
64365
- // Handle the case where user directly sets a populated
64366
- // path to a plain object; cast to the Model used in
64367
- // the population query.
64368
- const path = doc.$__fullPath(this.path);
64369
- const owner = doc.ownerDocument ? doc.ownerDocument() : doc;
64370
- const pop = owner.populated(path, true);
64371
- const ret = new pop.options[populateModelSymbol](value);
64372
- ret.$__.wasPopulated = true;
64373
- return ret;
64765
+ return this._castRef(value, doc, init);
64374
64766
  }
64375
64767
 
64376
64768
  const val = value && typeof value._id !== 'undefined' ?
@@ -64451,9 +64843,7 @@ SchemaNumber.prototype.castForQuery = function($conditional, val) {
64451
64843
 
64452
64844
  module.exports = SchemaNumber;
64453
64845
 
64454
- }).call(this)}).call(this,{"isBuffer":require("../../../is-buffer/index.js")})
64455
- },{"../../../is-buffer/index.js":178,"../cast/number":190,"../error/index":203,"../helpers/symbols":251,"../options/SchemaNumberOptions":263,"../schematype":294,"../utils":306,"./../document":193,"./operators/bitwise":286}],285:[function(require,module,exports){
64456
- (function (Buffer){(function (){
64846
+ },{"../cast/number":190,"../error/index":203,"../options/SchemaNumberOptions":265,"../schematype":296,"../utils":308,"./operators/bitwise":288}],287:[function(require,module,exports){
64457
64847
  /*!
64458
64848
  * Module dependencies.
64459
64849
  */
@@ -64463,11 +64853,10 @@ module.exports = SchemaNumber;
64463
64853
  const SchemaObjectIdOptions = require('../options/SchemaObjectIdOptions');
64464
64854
  const SchemaType = require('../schematype');
64465
64855
  const castObjectId = require('../cast/objectid');
64856
+ const getConstructorName = require('../helpers/getConstructorName');
64466
64857
  const oid = require('../types/objectid');
64467
64858
  const utils = require('../utils');
64468
64859
 
64469
- const populateModelSymbol = require('../helpers/symbols').populateModelSymbol;
64470
-
64471
64860
  const CastError = SchemaType.CastError;
64472
64861
  let Document;
64473
64862
 
@@ -64681,45 +65070,13 @@ ObjectId.prototype.checkRequired = function checkRequired(value, doc) {
64681
65070
  ObjectId.prototype.cast = function(value, doc, init) {
64682
65071
  if (SchemaType._isRef(this, value, doc, init)) {
64683
65072
  // wait! we may need to cast this to a document
64684
-
64685
- if (value === null || value === undefined) {
64686
- return value;
64687
- }
64688
-
64689
- // lazy load
64690
- Document || (Document = require('./../document'));
64691
-
64692
- if (value instanceof Document) {
64693
- value.$__.wasPopulated = true;
64694
- return value;
64695
- }
64696
-
64697
- // setting a populated path
64698
65073
  if (value instanceof oid) {
64699
65074
  return value;
64700
- } else if ((value.constructor.name || '').toLowerCase() === 'objectid') {
65075
+ } else if ((getConstructorName(value) || '').toLowerCase() === 'objectid') {
64701
65076
  return new oid(value.toHexString());
64702
- } else if (Buffer.isBuffer(value) || !utils.isObject(value)) {
64703
- throw new CastError('ObjectId', value, this.path, null, this);
64704
- }
64705
-
64706
- // Handle the case where user directly sets a populated
64707
- // path to a plain object; cast to the Model used in
64708
- // the population query.
64709
- const path = doc.$__fullPath(this.path);
64710
- const owner = doc.ownerDocument ? doc.ownerDocument() : doc;
64711
- const pop = owner.populated(path, true);
64712
- let ret = value;
64713
- if (!doc.$__.populated ||
64714
- !doc.$__.populated[path] ||
64715
- !doc.$__.populated[path].options ||
64716
- !doc.$__.populated[path].options.options ||
64717
- !doc.$__.populated[path].options.options.lean) {
64718
- ret = new pop.options[populateModelSymbol](value);
64719
- ret.$__.wasPopulated = true;
64720
65077
  }
64721
65078
 
64722
- return ret;
65079
+ return this._castRef(value, doc, init);
64723
65080
  }
64724
65081
 
64725
65082
  let castObjectId;
@@ -64786,8 +65143,7 @@ function resetId(v) {
64786
65143
 
64787
65144
  module.exports = ObjectId;
64788
65145
 
64789
- }).call(this)}).call(this,{"isBuffer":require("../../../is-buffer/index.js")})
64790
- },{"../../../is-buffer/index.js":178,"../cast/objectid":191,"../helpers/symbols":251,"../options/SchemaObjectIdOptions":264,"../schematype":294,"../types/objectid":304,"../utils":306,"./../document":193}],286:[function(require,module,exports){
65146
+ },{"../cast/objectid":191,"../helpers/getConstructorName":230,"../options/SchemaObjectIdOptions":266,"../schematype":296,"../types/objectid":306,"../utils":308,"./../document":193}],288:[function(require,module,exports){
64791
65147
  (function (Buffer){(function (){
64792
65148
  /*!
64793
65149
  * Module requirements.
@@ -64829,7 +65185,7 @@ function _castNumber(path, num) {
64829
65185
  module.exports = handleBitwiseOperator;
64830
65186
 
64831
65187
  }).call(this)}).call(this,{"isBuffer":require("../../../../is-buffer/index.js")})
64832
- },{"../../../../is-buffer/index.js":178,"../../error/cast":201}],287:[function(require,module,exports){
65188
+ },{"../../../../is-buffer/index.js":178,"../../error/cast":201}],289:[function(require,module,exports){
64833
65189
  'use strict';
64834
65190
 
64835
65191
  const castBoolean = require('../../cast/boolean');
@@ -64843,7 +65199,7 @@ module.exports = function(val) {
64843
65199
  return castBoolean(val, path);
64844
65200
  };
64845
65201
 
64846
- },{"../../cast/boolean":187}],288:[function(require,module,exports){
65202
+ },{"../../cast/boolean":187}],290:[function(require,module,exports){
64847
65203
  /*!
64848
65204
  * Module requirements.
64849
65205
  */
@@ -64952,7 +65308,7 @@ function _castMinMaxDistance(self, val) {
64952
65308
  }
64953
65309
  }
64954
65310
 
64955
- },{"../array":275,"./helpers":289}],289:[function(require,module,exports){
65311
+ },{"../array":277,"./helpers":291}],291:[function(require,module,exports){
64956
65312
  'use strict';
64957
65313
 
64958
65314
  /*!
@@ -64986,7 +65342,7 @@ function castArraysOfNumbers(arr, self) {
64986
65342
  });
64987
65343
  }
64988
65344
 
64989
- },{"../number":284}],290:[function(require,module,exports){
65345
+ },{"../number":286}],292:[function(require,module,exports){
64990
65346
  'use strict';
64991
65347
 
64992
65348
  const CastError = require('../../error/cast');
@@ -65027,7 +65383,7 @@ module.exports = function(val, path) {
65027
65383
  return val;
65028
65384
  };
65029
65385
 
65030
- },{"../../cast/boolean":187,"../../cast/string":192,"../../error/cast":201}],291:[function(require,module,exports){
65386
+ },{"../../cast/boolean":187,"../../cast/string":192,"../../error/cast":201}],293:[function(require,module,exports){
65031
65387
  'use strict';
65032
65388
 
65033
65389
  /*!
@@ -65049,8 +65405,7 @@ module.exports = function(val) {
65049
65405
  return val;
65050
65406
  };
65051
65407
 
65052
- },{}],292:[function(require,module,exports){
65053
- (function (Buffer){(function (){
65408
+ },{}],294:[function(require,module,exports){
65054
65409
  'use strict';
65055
65410
 
65056
65411
  /*!
@@ -65063,10 +65418,7 @@ const SchemaStringOptions = require('../options/SchemaStringOptions');
65063
65418
  const castString = require('../cast/string');
65064
65419
  const utils = require('../utils');
65065
65420
 
65066
- const populateModelSymbol = require('../helpers/symbols').populateModelSymbol;
65067
-
65068
65421
  const CastError = SchemaType.CastError;
65069
- let Document;
65070
65422
 
65071
65423
  /**
65072
65424
  * String SchemaType constructor.
@@ -65637,36 +65989,11 @@ SchemaString.prototype.checkRequired = function checkRequired(value, doc) {
65637
65989
 
65638
65990
  SchemaString.prototype.cast = function(value, doc, init) {
65639
65991
  if (SchemaType._isRef(this, value, doc, init)) {
65640
- // wait! we may need to cast this to a document
65641
-
65642
- if (value === null || value === undefined) {
65643
- return value;
65644
- }
65645
-
65646
- // lazy load
65647
- Document || (Document = require('./../document'));
65648
-
65649
- if (value instanceof Document) {
65650
- value.$__.wasPopulated = true;
65651
- return value;
65652
- }
65653
-
65654
- // setting a populated path
65655
65992
  if (typeof value === 'string') {
65656
65993
  return value;
65657
- } else if (Buffer.isBuffer(value) || !utils.isObject(value)) {
65658
- throw new CastError('string', value, this.path, null, this);
65659
65994
  }
65660
65995
 
65661
- // Handle the case where user directly sets a populated
65662
- // path to a plain object; cast to the Model used in
65663
- // the population query.
65664
- const path = doc.$__fullPath(this.path);
65665
- const owner = doc.ownerDocument ? doc.ownerDocument() : doc;
65666
- const pop = owner.populated(path, true);
65667
- const ret = new pop.options[populateModelSymbol](value);
65668
- ret.$__.wasPopulated = true;
65669
- return ret;
65996
+ return this._castRef(value, doc, init);
65670
65997
  }
65671
65998
 
65672
65999
  let castString;
@@ -65752,14 +66079,13 @@ SchemaString.prototype.castForQuery = function($conditional, val) {
65752
66079
 
65753
66080
  module.exports = SchemaString;
65754
66081
 
65755
- }).call(this)}).call(this,{"isBuffer":require("../../../is-buffer/index.js")})
65756
- },{"../../../is-buffer/index.js":178,"../cast/string":192,"../error/index":203,"../helpers/symbols":251,"../options/SchemaStringOptions":266,"../schematype":294,"../utils":306,"./../document":193}],293:[function(require,module,exports){
66082
+ },{"../cast/string":192,"../error/index":203,"../options/SchemaStringOptions":268,"../schematype":296,"../utils":308}],295:[function(require,module,exports){
65757
66083
  'use strict';
65758
66084
 
65759
66085
  exports.schemaMixedSymbol = Symbol.for('mongoose:schema_mixed');
65760
66086
 
65761
66087
  exports.builtInMiddleware = Symbol.for('mongoose:built-in-middleware');
65762
- },{}],294:[function(require,module,exports){
66088
+ },{}],296:[function(require,module,exports){
65763
66089
  (function (Buffer){(function (){
65764
66090
  'use strict';
65765
66091
 
@@ -65780,6 +66106,8 @@ const utils = require('./utils');
65780
66106
  const validatorErrorSymbol = require('./helpers/symbols').validatorErrorSymbol;
65781
66107
  const documentIsModified = require('./helpers/symbols').documentIsModified;
65782
66108
 
66109
+ const populateModelSymbol = require('./helpers/symbols').populateModelSymbol;
66110
+
65783
66111
  const CastError = MongooseError.CastError;
65784
66112
  const ValidatorError = MongooseError.ValidatorError;
65785
66113
 
@@ -65808,6 +66136,8 @@ function SchemaType(path, options, instance) {
65808
66136
  [];
65809
66137
  this.setters = [];
65810
66138
 
66139
+ this.splitPath();
66140
+
65811
66141
  options = options || {};
65812
66142
  const defaultOptions = this.constructor.defaultOptions || {};
65813
66143
  const defaultOptionsKeys = Object.keys(defaultOptions);
@@ -65882,11 +66212,27 @@ function SchemaType(path, options, instance) {
65882
66212
  }
65883
66213
 
65884
66214
  /*!
65885
- * ignore
66215
+ * The class that Mongoose uses internally to instantiate this SchemaType's `options` property.
65886
66216
  */
65887
66217
 
65888
66218
  SchemaType.prototype.OptionsConstructor = SchemaTypeOptions;
65889
66219
 
66220
+ /*!
66221
+ * ignore
66222
+ */
66223
+
66224
+ SchemaType.prototype.splitPath = function() {
66225
+ if (this._presplitPath != null) {
66226
+ return this._presplitPath;
66227
+ }
66228
+ if (this.path == null) {
66229
+ return undefined;
66230
+ }
66231
+
66232
+ this._presplitPath = this.path.indexOf('.') === -1 ? [this.path] : this.path.split('.');
66233
+ return this._presplitPath;
66234
+ };
66235
+
65890
66236
  /**
65891
66237
  * Get/set the function used to cast arbitrary values to this type.
65892
66238
  *
@@ -65953,6 +66299,19 @@ SchemaType.prototype.castFunction = function castFunction(caster) {
65953
66299
  return this._castFunction;
65954
66300
  };
65955
66301
 
66302
+ /**
66303
+ * The function that Mongoose calls to cast arbitrary values to this SchemaType.
66304
+ *
66305
+ * @param {Object} value value to cast
66306
+ * @param {Document} doc document that triggers the casting
66307
+ * @param {Boolean} init
66308
+ * @api public
66309
+ */
66310
+
66311
+ SchemaType.prototype.cast = function cast() {
66312
+ throw new Error('Base SchemaType class does not implement a `cast()` function');
66313
+ };
66314
+
65956
66315
  /**
65957
66316
  * Sets a default option for this schema type.
65958
66317
  *
@@ -66819,8 +67178,8 @@ SchemaType.prototype._applySetters = function(value, scope, init) {
66819
67178
  }
66820
67179
  const setters = this.setters;
66821
67180
 
66822
- for (const setter of utils.clone(setters).reverse()) {
66823
- v = setter.call(scope, v, this);
67181
+ for (let i = setters.length - 1; i >= 0; i--) {
67182
+ v = setters[i].call(scope, v, this);
66824
67183
  }
66825
67184
 
66826
67185
  return v;
@@ -66845,7 +67204,6 @@ SchemaType.prototype._castNullish = function _castNullish(v) {
66845
67204
 
66846
67205
  SchemaType.prototype.applySetters = function(value, scope, init, priorVal, options) {
66847
67206
  let v = this._applySetters(value, scope, init, priorVal, options);
66848
-
66849
67207
  if (v == null) {
66850
67208
  return this._castNullish(v);
66851
67209
  }
@@ -67177,11 +67535,54 @@ SchemaType._isRef = function(self, value, doc, init) {
67177
67535
  ) {
67178
67536
  return true;
67179
67537
  }
67538
+
67539
+ return init;
67180
67540
  }
67181
67541
 
67182
67542
  return false;
67183
67543
  };
67184
67544
 
67545
+ /*!
67546
+ * ignore
67547
+ */
67548
+
67549
+ SchemaType.prototype._castRef = function _castRef(value, doc, init) {
67550
+ if (value == null) {
67551
+ return value;
67552
+ }
67553
+
67554
+ if (value.$__ != null) {
67555
+ value.$__.wasPopulated = true;
67556
+ return value;
67557
+ }
67558
+
67559
+ // setting a populated path
67560
+ if (Buffer.isBuffer(value) || !utils.isObject(value)) {
67561
+ if (init) {
67562
+ return value;
67563
+ }
67564
+ throw new CastError(this.instance, value, this.path, null, this);
67565
+ }
67566
+
67567
+ // Handle the case where user directly sets a populated
67568
+ // path to a plain object; cast to the Model used in
67569
+ // the population query.
67570
+ const path = doc.$__fullPath(this.path);
67571
+ const owner = doc.ownerDocument ? doc.ownerDocument() : doc;
67572
+ const pop = owner.populated(path, true);
67573
+ let ret = value;
67574
+ if (!doc.$__.populated ||
67575
+ !doc.$__.populated[path] ||
67576
+ !doc.$__.populated[path].options ||
67577
+ !doc.$__.populated[path].options.options ||
67578
+ !doc.$__.populated[path].options.options.lean) {
67579
+ ret = new pop.options[populateModelSymbol](value);
67580
+ ret.$__.wasPopulated = true;
67581
+ }
67582
+
67583
+ return ret;
67584
+ };
67585
+
67185
67586
  /*!
67186
67587
  * ignore
67187
67588
  */
@@ -67360,7 +67761,7 @@ exports.CastError = CastError;
67360
67761
  exports.ValidatorError = ValidatorError;
67361
67762
 
67362
67763
  }).call(this)}).call(this,{"isBuffer":require("../../is-buffer/index.js")})
67363
- },{"../../is-buffer/index.js":178,"./error/index":203,"./helpers/get":228,"./helpers/immediate":230,"./helpers/schematype/handleImmutable":249,"./helpers/symbols":251,"./options/SchemaTypeOptions":267,"./schema/operators/exists":287,"./schema/operators/type":291,"./utils":306,"util":331}],295:[function(require,module,exports){
67764
+ },{"../../is-buffer/index.js":178,"./error/index":203,"./helpers/get":229,"./helpers/immediate":232,"./helpers/schematype/handleImmutable":251,"./helpers/symbols":253,"./options/SchemaTypeOptions":269,"./schema/operators/exists":289,"./schema/operators/type":293,"./utils":308,"util":333}],297:[function(require,module,exports){
67364
67765
 
67365
67766
  /*!
67366
67767
  * Module dependencies.
@@ -67542,7 +67943,7 @@ StateMachine.prototype.map = function map() {
67542
67943
  return this.map.apply(this, arguments);
67543
67944
  };
67544
67945
 
67545
- },{"./utils":306}],296:[function(require,module,exports){
67946
+ },{"./utils":308}],298:[function(require,module,exports){
67546
67947
  /*!
67547
67948
  * Module dependencies.
67548
67949
  */
@@ -67550,7 +67951,6 @@ StateMachine.prototype.map = function map() {
67550
67951
  'use strict';
67551
67952
 
67552
67953
  const CoreMongooseArray = require('./core_array');
67553
- const Document = require('../document');
67554
67954
 
67555
67955
  const arrayAtomicsSymbol = require('../helpers/symbols').arrayAtomicsSymbol;
67556
67956
  const arrayParentSymbol = require('../helpers/symbols').arrayParentSymbol;
@@ -67575,28 +67975,44 @@ const _basePush = Array.prototype.push;
67575
67975
  */
67576
67976
 
67577
67977
  function MongooseArray(values, path, doc, schematype) {
67578
- const arr = new CoreMongooseArray();
67579
- arr[arrayAtomicsSymbol] = {};
67978
+ let arr;
67580
67979
 
67581
67980
  if (Array.isArray(values)) {
67582
67981
  const len = values.length;
67583
- for (let i = 0; i < len; ++i) {
67584
- _basePush.call(arr, values[i]);
67982
+
67983
+ // Perf optimizations for small arrays: much faster to use `...` than `for` + `push`,
67984
+ // but large arrays may cause stack overflows. And for arrays of length 0/1, just
67985
+ // modifying the array is faster. Seems small, but adds up when you have a document
67986
+ // with thousands of nested arrays.
67987
+ if (len === 0) {
67988
+ arr = new CoreMongooseArray();
67989
+ } else if (len === 1) {
67990
+ arr = new CoreMongooseArray(1);
67991
+ arr[0] = values[0];
67992
+ } else if (len < 10000) {
67993
+ arr = new CoreMongooseArray();
67994
+ _basePush.apply(arr, values);
67995
+ } else {
67996
+ arr = new CoreMongooseArray();
67997
+ for (let i = 0; i < len; ++i) {
67998
+ _basePush.call(arr, values[i]);
67999
+ }
67585
68000
  }
67586
68001
 
67587
68002
  if (values[arrayAtomicsSymbol] != null) {
67588
68003
  arr[arrayAtomicsSymbol] = values[arrayAtomicsSymbol];
67589
68004
  }
68005
+ } else {
68006
+ arr = new CoreMongooseArray();
67590
68007
  }
67591
68008
 
67592
68009
  arr[arrayPathSymbol] = path;
67593
- arr[arraySchemaSymbol] = void 0;
67594
68010
 
67595
68011
  // Because doc comes from the context of another function, doc === global
67596
68012
  // can happen if there was a null somewhere up the chain (see #3020)
67597
68013
  // RB Jun 17, 2015 updated to check for presence of expected paths instead
67598
68014
  // to make more proof against unusual node environments
67599
- if (doc && doc instanceof Document) {
68015
+ if (doc != null && doc.$__ != null) {
67600
68016
  arr[arrayParentSymbol] = doc;
67601
68017
  arr[arraySchemaSymbol] = schematype || doc.schema.path(path);
67602
68018
  }
@@ -67610,7 +68026,7 @@ function MongooseArray(values, path, doc, schematype) {
67610
68026
 
67611
68027
  module.exports = exports = MongooseArray;
67612
68028
 
67613
- },{"../document":193,"../helpers/symbols":251,"./core_array":298}],297:[function(require,module,exports){
68029
+ },{"../helpers/symbols":253,"./core_array":300}],299:[function(require,module,exports){
67614
68030
  /*!
67615
68031
  * Module dependencies.
67616
68032
  */
@@ -67888,7 +68304,7 @@ MongooseBuffer.Binary = Binary;
67888
68304
 
67889
68305
  module.exports = MongooseBuffer;
67890
68306
 
67891
- },{"../driver":195,"../utils":306,"safe-buffer":326}],298:[function(require,module,exports){
68307
+ },{"../driver":195,"../utils":308,"safe-buffer":328}],300:[function(require,module,exports){
67892
68308
  (function (Buffer){(function (){
67893
68309
  'use strict';
67894
68310
 
@@ -67986,7 +68402,7 @@ class CoreMongooseArray extends Array {
67986
68402
  */
67987
68403
 
67988
68404
  $atomics() {
67989
- return this[arrayAtomicsSymbol];
68405
+ return this[arrayAtomicsSymbol] || {};
67990
68406
  }
67991
68407
 
67992
68408
  /*!
@@ -68140,8 +68556,8 @@ class CoreMongooseArray extends Array {
68140
68556
 
68141
68557
  // gh-2399
68142
68558
  // we should cast model only when it's not a discriminator
68143
- const isDisc = value.schema && value.schema.discriminatorMapping &&
68144
- value.schema.discriminatorMapping.key !== undefined;
68559
+ const isDisc = value.$__schema && value.$__schema.discriminatorMapping &&
68560
+ value.$__schema.discriminatorMapping.key !== undefined;
68145
68561
  if (!isDisc) {
68146
68562
  value = new Model(value);
68147
68563
  }
@@ -68220,6 +68636,8 @@ class CoreMongooseArray extends Array {
68220
68636
  return this;
68221
68637
  }
68222
68638
 
68639
+ this[arrayAtomicsSymbol] || (this[arrayAtomicsSymbol] = {});
68640
+
68223
68641
  const atomics = this[arrayAtomicsSymbol];
68224
68642
 
68225
68643
  // reset pop/shift after save
@@ -68860,7 +69278,7 @@ function _checkManualPopulation(arr, docs) {
68860
69278
  module.exports = CoreMongooseArray;
68861
69279
 
68862
69280
  }).call(this)}).call(this,{"isBuffer":require("../../../is-buffer/index.js")})
68863
- },{"../../../is-buffer/index.js":178,"../document":193,"../error/mongooseError":206,"../helpers/document/cleanModifiedSubpaths":224,"../helpers/get":228,"../helpers/symbols":251,"../options":256,"../utils":306,"./embedded":301,"./objectid":304,"util":331}],299:[function(require,module,exports){
69281
+ },{"../../../is-buffer/index.js":178,"../document":193,"../error/mongooseError":206,"../helpers/document/cleanModifiedSubpaths":225,"../helpers/get":229,"../helpers/symbols":253,"../options":258,"../utils":308,"./embedded":303,"./objectid":306,"util":333}],301:[function(require,module,exports){
68864
69282
  /**
68865
69283
  * ObjectId type constructor
68866
69284
  *
@@ -68875,7 +69293,7 @@ module.exports = CoreMongooseArray;
68875
69293
 
68876
69294
  module.exports = require('../driver').get().Decimal128;
68877
69295
 
68878
- },{"../driver":195}],300:[function(require,module,exports){
69296
+ },{"../driver":195}],302:[function(require,module,exports){
68879
69297
  (function (Buffer){(function (){
68880
69298
  'use strict';
68881
69299
 
@@ -68975,7 +69393,7 @@ class CoreDocumentArray extends CoreMongooseArray {
68975
69393
  Constructor.discriminators[value[Constructor.schema.options.discriminatorKey]]) {
68976
69394
  Constructor = Constructor.discriminators[value[Constructor.schema.options.discriminatorKey]];
68977
69395
  } else {
68978
- const constructorByValue = getDiscriminatorByValue(Constructor, value[Constructor.schema.options.discriminatorKey]);
69396
+ const constructorByValue = getDiscriminatorByValue(Constructor.discriminators, value[Constructor.schema.options.discriminatorKey]);
68979
69397
  if (constructorByValue) {
68980
69398
  Constructor = constructorByValue;
68981
69399
  }
@@ -69168,7 +69586,7 @@ class CoreDocumentArray extends CoreMongooseArray {
69168
69586
  Constructor.discriminators[obj[Constructor.schema.options.discriminatorKey]]) {
69169
69587
  Constructor = Constructor.discriminators[obj[Constructor.schema.options.discriminatorKey]];
69170
69588
  } else {
69171
- const constructorByValue = getDiscriminatorByValue(Constructor, obj[Constructor.schema.options.discriminatorKey]);
69589
+ const constructorByValue = getDiscriminatorByValue(Constructor.discriminators, obj[Constructor.schema.options.discriminatorKey]);
69172
69590
  if (constructorByValue) {
69173
69591
  Constructor = constructorByValue;
69174
69592
  }
@@ -69327,7 +69745,7 @@ function MongooseDocumentArray(values, path, doc) {
69327
69745
  module.exports = MongooseDocumentArray;
69328
69746
 
69329
69747
  }).call(this)}).call(this,{"isBuffer":require("../../../is-buffer/index.js")})
69330
- },{"../../../is-buffer/index.js":178,"../cast/objectid":191,"../document":193,"../helpers/discriminator/getDiscriminatorByValue":222,"../helpers/symbols":251,"../options":256,"../utils":306,"./core_array":298,"./objectid":304,"util":331}],301:[function(require,module,exports){
69748
+ },{"../../../is-buffer/index.js":178,"../cast/objectid":191,"../document":193,"../helpers/discriminator/getDiscriminatorByValue":223,"../helpers/symbols":253,"../options":258,"../utils":308,"./core_array":300,"./objectid":306,"util":333}],303:[function(require,module,exports){
69331
69749
  /* eslint no-func-assign: 1 */
69332
69750
 
69333
69751
  /*!
@@ -69727,7 +70145,7 @@ EmbeddedDocument.prototype.ownerDocument = function() {
69727
70145
 
69728
70146
  EmbeddedDocument.prototype.$__fullPath = function(path) {
69729
70147
  if (!this.$__.fullPath) {
69730
- let parent = this; // eslint-disable-line consistent-this
70148
+ let parent = this;
69731
70149
  if (!parent[documentArrayParent]) {
69732
70150
  return path;
69733
70151
  }
@@ -69789,7 +70207,7 @@ EmbeddedDocument.prototype.parentArray = function() {
69789
70207
 
69790
70208
  module.exports = EmbeddedDocument;
69791
70209
 
69792
- },{"../document_provider":194,"../error/validation":214,"../helpers/get":228,"../helpers/immediate":230,"../helpers/promiseOrCallback":240,"../helpers/symbols":251,"../options":256,"events":176,"util":331}],302:[function(require,module,exports){
70210
+ },{"../document_provider":194,"../error/validation":214,"../helpers/get":229,"../helpers/immediate":232,"../helpers/promiseOrCallback":242,"../helpers/symbols":253,"../options":258,"events":176,"util":333}],304:[function(require,module,exports){
69793
70211
 
69794
70212
  /*!
69795
70213
  * Module exports.
@@ -69811,13 +70229,15 @@ exports.Map = require('./map');
69811
70229
 
69812
70230
  exports.Subdocument = require('./subdocument');
69813
70231
 
69814
- },{"./array":296,"./buffer":297,"./decimal128":299,"./documentarray":300,"./embedded":301,"./map":303,"./objectid":304,"./subdocument":305}],303:[function(require,module,exports){
70232
+ },{"./array":298,"./buffer":299,"./decimal128":301,"./documentarray":302,"./embedded":303,"./map":305,"./objectid":306,"./subdocument":307}],305:[function(require,module,exports){
69815
70233
  'use strict';
69816
70234
 
69817
70235
  const Mixed = require('../schema/mixed');
69818
70236
  const ObjectId = require('./objectid');
70237
+ const clone = require('../helpers/clone');
69819
70238
  const deepEqual = require('../utils').deepEqual;
69820
70239
  const get = require('../helpers/get');
70240
+ const getConstructorName = require('../helpers/getConstructorName');
69821
70241
  const handleSpreadDoc = require('../helpers/document/handleSpreadDoc');
69822
70242
  const util = require('util');
69823
70243
  const specialProperties = require('../helpers/specialProperties');
@@ -69830,7 +70250,7 @@ const populateModelSymbol = require('../helpers/symbols').populateModelSymbol;
69830
70250
 
69831
70251
  class MongooseMap extends Map {
69832
70252
  constructor(v, path, doc, schemaType) {
69833
- if (v != null && v.constructor.name === 'Object') {
70253
+ if (getConstructorName(v) === 'Object') {
69834
70254
  v = Object.keys(v).reduce((arr, key) => arr.concat([[key, v[key]]]), []);
69835
70255
  }
69836
70256
  super(v);
@@ -69947,7 +70367,7 @@ class MongooseMap extends Map {
69947
70367
  const ret = {};
69948
70368
  const keys = this.keys();
69949
70369
  for (const key of keys) {
69950
- ret[key] = this.get(key);
70370
+ ret[key] = clone(this.get(key));
69951
70371
  }
69952
70372
  return ret;
69953
70373
  }
@@ -70051,7 +70471,7 @@ function checkValidKey(key) {
70051
70471
 
70052
70472
  module.exports = MongooseMap;
70053
70473
 
70054
- },{"../helpers/document/handleSpreadDoc":227,"../helpers/get":228,"../helpers/specialProperties":250,"../helpers/symbols":251,"../schema/mixed":283,"../utils":306,"./objectid":304,"util":331}],304:[function(require,module,exports){
70474
+ },{"../helpers/clone":218,"../helpers/document/handleSpreadDoc":228,"../helpers/get":229,"../helpers/getConstructorName":230,"../helpers/specialProperties":252,"../helpers/symbols":253,"../schema/mixed":285,"../utils":308,"./objectid":306,"util":333}],306:[function(require,module,exports){
70055
70475
  /**
70056
70476
  * ObjectId type constructor
70057
70477
  *
@@ -70083,7 +70503,7 @@ ObjectId.prototype[objectIdSymbol] = true;
70083
70503
 
70084
70504
  module.exports = ObjectId;
70085
70505
 
70086
- },{"../driver":195,"../helpers/symbols":251}],305:[function(require,module,exports){
70506
+ },{"../driver":195,"../helpers/symbols":253}],307:[function(require,module,exports){
70087
70507
  'use strict';
70088
70508
 
70089
70509
  const Document = require('../document');
@@ -70111,9 +70531,9 @@ function Subdocument(value, fields, parent, skipId, options) {
70111
70531
  let initedPaths = null;
70112
70532
  if (hasPriorDoc) {
70113
70533
  this._doc = Object.assign({}, options.priorDoc._doc);
70114
- delete this._doc[this.schema.options.discriminatorKey];
70534
+ delete this._doc[this.$__schema.options.discriminatorKey];
70115
70535
  initedPaths = Object.keys(options.priorDoc._doc || {}).
70116
- filter(key => key !== this.schema.options.discriminatorKey);
70536
+ filter(key => key !== this.$__schema.options.discriminatorKey);
70117
70537
  }
70118
70538
  if (parent != null) {
70119
70539
  // If setting a nested path, should copy isNew from parent re: gh-7048
@@ -70129,7 +70549,7 @@ function Subdocument(value, fields, parent, skipId, options) {
70129
70549
  if (!this.$__.activePaths.states.modify[key] &&
70130
70550
  !this.$__.activePaths.states.default[key] &&
70131
70551
  !this.$__.$setCalled.has(key)) {
70132
- const schematype = this.schema.path(key);
70552
+ const schematype = this.$__schema.path(key);
70133
70553
  const def = schematype == null ? void 0 : schematype.getDefault(this);
70134
70554
  if (def === void 0) {
70135
70555
  delete this._doc[key];
@@ -70386,7 +70806,7 @@ function registerRemoveListener(sub) {
70386
70806
  owner.on('remove', emitRemove);
70387
70807
  }
70388
70808
 
70389
- },{"../document":193,"../helpers/immediate":230,"../helpers/promiseOrCallback":240,"../helpers/symbols":251,"../options":256}],306:[function(require,module,exports){
70809
+ },{"../document":193,"../helpers/immediate":232,"../helpers/promiseOrCallback":242,"../helpers/symbols":253,"../options":258}],308:[function(require,module,exports){
70390
70810
  (function (process){(function (){
70391
70811
  'use strict';
70392
70812
 
@@ -70402,11 +70822,13 @@ const Decimal = require('./types/decimal128');
70402
70822
  const ObjectId = require('./types/objectid');
70403
70823
  const PopulateOptions = require('./options/PopulateOptions');
70404
70824
  const clone = require('./helpers/clone');
70825
+ const immediate = require('./helpers/immediate');
70405
70826
  const isObject = require('./helpers/isObject');
70406
70827
  const isBsonType = require('./helpers/isBsonType');
70407
70828
  const getFunctionName = require('./helpers/getFunctionName');
70408
70829
  const isMongooseObject = require('./helpers/isMongooseObject');
70409
70830
  const promiseOrCallback = require('./helpers/promiseOrCallback');
70831
+ const schemaMerge = require('./helpers/schema/merge');
70410
70832
  const specialProperties = require('./helpers/specialProperties');
70411
70833
 
70412
70834
  let Document;
@@ -70672,7 +71094,7 @@ exports.merge = function merge(to, from, options, path) {
70672
71094
  continue;
70673
71095
  } else if (from[key].instanceOfSchema) {
70674
71096
  if (to[key].instanceOfSchema) {
70675
- to[key].add(from[key].clone());
71097
+ schemaMerge(to[key], from[key].clone(), options.isDiscriminatorSchemaMerge);
70676
71098
  } else {
70677
71099
  to[key] = from[key].clone();
70678
71100
  }
@@ -70829,7 +71251,7 @@ exports.tick = function tick(callback) {
70829
71251
  } catch (err) {
70830
71252
  // only nextTick on err to get out of
70831
71253
  // the event loop and avoid state corruption.
70832
- process.nextTick(function() {
71254
+ immediate(function() {
70833
71255
  throw err;
70834
71256
  });
70835
71257
  }
@@ -71145,23 +71567,23 @@ exports.isArrayIndex = function(val) {
71145
71567
  */
71146
71568
 
71147
71569
  exports.array.unique = function(arr) {
71148
- const primitives = {};
71149
- const ids = {};
71570
+ const primitives = new Set();
71571
+ const ids = new Set();
71150
71572
  const ret = [];
71151
71573
 
71152
71574
  for (const item of arr) {
71153
71575
  if (typeof item === 'number' || typeof item === 'string' || item == null) {
71154
- if (primitives[item]) {
71576
+ if (primitives.has(item)) {
71155
71577
  continue;
71156
71578
  }
71157
71579
  ret.push(item);
71158
- primitives[item] = true;
71580
+ primitives.add(item);
71159
71581
  } else if (item instanceof ObjectId) {
71160
- if (ids[item.toString()]) {
71582
+ if (ids.has(item.toString())) {
71161
71583
  continue;
71162
71584
  }
71163
71585
  ret.push(item);
71164
- ids[item.toString()] = true;
71586
+ ids.add(item.toString());
71165
71587
  } else {
71166
71588
  ret.push(item);
71167
71589
  }
@@ -71311,8 +71733,23 @@ exports.getOption = function(name) {
71311
71733
 
71312
71734
  exports.noop = function() {};
71313
71735
 
71736
+ exports.errorToPOJO = function errorToPOJO(error) {
71737
+ const isError = error instanceof Error;
71738
+ if (!isError) {
71739
+ throw new Error('`error` must be `instanceof Error`.');
71740
+ }
71741
+
71742
+ const ret = {};
71743
+ for (const properyName of Object.getOwnPropertyNames(error)) {
71744
+ ret[properyName] = error[properyName];
71745
+ }
71746
+ return ret;
71747
+ };
71748
+
71749
+ exports.nodeMajorVersion = parseInt(process.versions.node.split('.')[0], 10);
71750
+
71314
71751
  }).call(this)}).call(this,require('_process'))
71315
- },{"./document":193,"./helpers/clone":218,"./helpers/getFunctionName":229,"./helpers/isBsonType":231,"./helpers/isMongooseObject":232,"./helpers/isObject":233,"./helpers/promiseOrCallback":240,"./helpers/specialProperties":250,"./options/PopulateOptions":257,"./types/decimal128":299,"./types/objectid":304,"_process":324,"mpath":309,"ms":308,"safe-buffer":326,"sliced":327}],307:[function(require,module,exports){
71752
+ },{"./document":193,"./helpers/clone":218,"./helpers/getFunctionName":231,"./helpers/immediate":232,"./helpers/isBsonType":233,"./helpers/isMongooseObject":234,"./helpers/isObject":235,"./helpers/promiseOrCallback":242,"./helpers/schema/merge":250,"./helpers/specialProperties":252,"./options/PopulateOptions":259,"./types/decimal128":301,"./types/objectid":306,"_process":326,"mpath":311,"ms":310,"safe-buffer":328,"sliced":329}],309:[function(require,module,exports){
71316
71753
  'use strict';
71317
71754
 
71318
71755
  const utils = require('./utils');
@@ -71490,7 +71927,7 @@ VirtualType.prototype.applySetters = function(value, doc) {
71490
71927
 
71491
71928
  module.exports = VirtualType;
71492
71929
 
71493
- },{"./utils":306}],308:[function(require,module,exports){
71930
+ },{"./utils":308}],310:[function(require,module,exports){
71494
71931
  /**
71495
71932
  * Helpers.
71496
71933
  */
@@ -71654,12 +72091,12 @@ function plural(ms, msAbs, n, name) {
71654
72091
  return Math.round(ms / n) + ' ' + name + (isPlural ? 's' : '');
71655
72092
  }
71656
72093
 
71657
- },{}],309:[function(require,module,exports){
72094
+ },{}],311:[function(require,module,exports){
71658
72095
  'use strict';
71659
72096
 
71660
72097
  module.exports = exports = require('./lib');
71661
72098
 
71662
- },{"./lib":310}],310:[function(require,module,exports){
72099
+ },{"./lib":312}],312:[function(require,module,exports){
71663
72100
  /* eslint strict:off */
71664
72101
  /* eslint no-var: off */
71665
72102
  /* eslint no-redeclare: off */
@@ -71726,6 +72163,9 @@ exports.get = function(path, o, special, map) {
71726
72163
 
71727
72164
  for (var i = 0; i < parts.length; ++i) {
71728
72165
  part = parts[i];
72166
+ if (typeof parts[i] !== 'string' && typeof parts[i] !== 'number') {
72167
+ throw new TypeError('Each segment of path to `get()` must be a string or number, got ' + typeof parts[i]);
72168
+ }
71729
72169
 
71730
72170
  if (Array.isArray(obj) && !/^\d+$/.test(part)) {
71731
72171
  // reading a property from the array items
@@ -71774,6 +72214,9 @@ exports.has = function(path, o) {
71774
72214
  var len = parts.length;
71775
72215
  var cur = o;
71776
72216
  for (var i = 0; i < len; ++i) {
72217
+ if (typeof parts[i] !== 'string' && typeof parts[i] !== 'number') {
72218
+ throw new TypeError('Each segment of path to `has()` must be a string or number, got ' + typeof parts[i]);
72219
+ }
71777
72220
  if (cur == null || typeof cur !== 'object' || !(parts[i] in cur)) {
71778
72221
  return false;
71779
72222
  }
@@ -71805,6 +72248,9 @@ exports.unset = function(path, o) {
71805
72248
  if (cur == null || typeof cur !== 'object' || !(parts[i] in cur)) {
71806
72249
  return false;
71807
72250
  }
72251
+ if (typeof parts[i] !== 'string' && typeof parts[i] !== 'number') {
72252
+ throw new TypeError('Each segment of path to `unset()` must be a string or number, got ' + typeof parts[i]);
72253
+ }
71808
72254
  // Disallow any updates to __proto__ or special properties.
71809
72255
  if (ignoreProperties.indexOf(parts[i]) !== -1) {
71810
72256
  return false;
@@ -71855,6 +72301,9 @@ exports.set = function(path, val, o, special, map, _copying) {
71855
72301
  if (null == o) return;
71856
72302
 
71857
72303
  for (var i = 0; i < parts.length; ++i) {
72304
+ if (typeof parts[i] !== 'string' && typeof parts[i] !== 'number') {
72305
+ throw new TypeError('Each segment of path to `set()` must be a string or number, got ' + typeof parts[i]);
72306
+ }
71858
72307
  // Silently ignore any updates to `__proto__`, these are potentially
71859
72308
  // dangerous if using mpath with unsanitized data.
71860
72309
  if (ignoreProperties.indexOf(parts[i]) !== -1) {
@@ -71974,7 +72423,7 @@ function _setArray(obj, val, part, lookup, special, map) {
71974
72423
  function K(v) {
71975
72424
  return v;
71976
72425
  }
71977
- },{"./stringToParts":311}],311:[function(require,module,exports){
72426
+ },{"./stringToParts":313}],313:[function(require,module,exports){
71978
72427
  'use strict';
71979
72428
 
71980
72429
  module.exports = function stringToParts(str) {
@@ -72023,7 +72472,7 @@ module.exports = function stringToParts(str) {
72023
72472
 
72024
72473
  return result;
72025
72474
  };
72026
- },{}],312:[function(require,module,exports){
72475
+ },{}],314:[function(require,module,exports){
72027
72476
  'use strict';
72028
72477
 
72029
72478
  /**
@@ -72071,7 +72520,7 @@ function notImplemented(method) {
72071
72520
  };
72072
72521
  }
72073
72522
 
72074
- },{}],313:[function(require,module,exports){
72523
+ },{}],315:[function(require,module,exports){
72075
72524
  'use strict';
72076
72525
 
72077
72526
  var env = require('../env');
@@ -72086,7 +72535,7 @@ module.exports =
72086
72535
  require('./collection');
72087
72536
 
72088
72537
 
72089
- },{"../env":315,"./collection":312,"./node":314}],314:[function(require,module,exports){
72538
+ },{"../env":317,"./collection":314,"./node":316}],316:[function(require,module,exports){
72090
72539
  'use strict';
72091
72540
 
72092
72541
  /**
@@ -72239,7 +72688,7 @@ NodeCollection.prototype.findCursor = function(match, findOptions) {
72239
72688
 
72240
72689
  module.exports = exports = NodeCollection;
72241
72690
 
72242
- },{"../utils":318,"./collection":312}],315:[function(require,module,exports){
72691
+ },{"../utils":320,"./collection":314}],317:[function(require,module,exports){
72243
72692
  (function (process,global,Buffer){(function (){
72244
72693
  'use strict';
72245
72694
 
@@ -72265,7 +72714,7 @@ exports.type = exports.isNode ? 'node'
72265
72714
  : 'unknown';
72266
72715
 
72267
72716
  }).call(this)}).call(this,require('_process'),typeof global !== "undefined" ? global : typeof self !== "undefined" ? self : typeof window !== "undefined" ? window : {},require("buffer").Buffer)
72268
- },{"_process":324,"buffer":128}],316:[function(require,module,exports){
72717
+ },{"_process":326,"buffer":128}],318:[function(require,module,exports){
72269
72718
  'use strict';
72270
72719
 
72271
72720
  /**
@@ -75519,7 +75968,7 @@ module.exports = exports = Query;
75519
75968
  // TODO
75520
75969
  // test utils
75521
75970
 
75522
- },{"./collection":313,"./collection/collection":312,"./env":315,"./permissions":317,"./utils":318,"assert":102,"bluebird":107,"debug":319,"sliced":327,"util":331}],317:[function(require,module,exports){
75971
+ },{"./collection":315,"./collection/collection":314,"./env":317,"./permissions":319,"./utils":320,"assert":102,"bluebird":107,"debug":321,"sliced":329,"util":333}],319:[function(require,module,exports){
75523
75972
  'use strict';
75524
75973
 
75525
75974
  var denied = exports;
@@ -75609,7 +76058,7 @@ denied.count.maxScan =
75609
76058
  denied.count.snapshot =
75610
76059
  denied.count.tailable = true;
75611
76060
 
75612
- },{}],318:[function(require,module,exports){
76061
+ },{}],320:[function(require,module,exports){
75613
76062
  (function (process,setImmediate){(function (){
75614
76063
  'use strict';
75615
76064
 
@@ -75783,6 +76232,9 @@ exports.mergeClone = function mergeClone(to, from) {
75783
76232
 
75784
76233
  while (i--) {
75785
76234
  key = keys[i];
76235
+ if (specialProperties.indexOf(key) !== -1) {
76236
+ continue;
76237
+ }
75786
76238
  if ('undefined' === typeof to[key]) {
75787
76239
  to[key] = clone(from[key]);
75788
76240
  } else {
@@ -75973,7 +76425,7 @@ exports.isArgumentsObject = function(v) {
75973
76425
  };
75974
76426
 
75975
76427
  }).call(this)}).call(this,require('_process'),require("timers").setImmediate)
75976
- },{"_process":324,"regexp-clone":325,"safe-buffer":321,"timers":328}],319:[function(require,module,exports){
76428
+ },{"_process":326,"regexp-clone":327,"safe-buffer":323,"timers":330}],321:[function(require,module,exports){
75977
76429
  (function (process){(function (){
75978
76430
  /**
75979
76431
  * This is the web browser implementation of `debug()`.
@@ -76172,7 +76624,7 @@ function localstorage() {
76172
76624
  }
76173
76625
 
76174
76626
  }).call(this)}).call(this,require('_process'))
76175
- },{"./debug":320,"_process":324}],320:[function(require,module,exports){
76627
+ },{"./debug":322,"_process":326}],322:[function(require,module,exports){
76176
76628
 
76177
76629
  /**
76178
76630
  * This is the common logic for both the Node.js and web browser
@@ -76399,7 +76851,7 @@ function coerce(val) {
76399
76851
  return val;
76400
76852
  }
76401
76853
 
76402
- },{"ms":322}],321:[function(require,module,exports){
76854
+ },{"ms":324}],323:[function(require,module,exports){
76403
76855
  /* eslint-disable node/no-deprecated-api */
76404
76856
  var buffer = require('buffer')
76405
76857
  var Buffer = buffer.Buffer
@@ -76463,7 +76915,7 @@ SafeBuffer.allocUnsafeSlow = function (size) {
76463
76915
  return buffer.SlowBuffer(size)
76464
76916
  }
76465
76917
 
76466
- },{"buffer":128}],322:[function(require,module,exports){
76918
+ },{"buffer":128}],324:[function(require,module,exports){
76467
76919
  /**
76468
76920
  * Helpers.
76469
76921
  */
@@ -76617,7 +77069,7 @@ function plural(ms, n, name) {
76617
77069
  return Math.ceil(ms / n) + ' ' + name + 's';
76618
77070
  }
76619
77071
 
76620
- },{}],323:[function(require,module,exports){
77072
+ },{}],325:[function(require,module,exports){
76621
77073
  /*
76622
77074
  object-assign
76623
77075
  (c) Sindre Sorhus
@@ -76709,7 +77161,7 @@ module.exports = shouldUseNative() ? Object.assign : function (target, source) {
76709
77161
  return to;
76710
77162
  };
76711
77163
 
76712
- },{}],324:[function(require,module,exports){
77164
+ },{}],326:[function(require,module,exports){
76713
77165
  // shim for using process in browser
76714
77166
  var process = module.exports = {};
76715
77167
 
@@ -76895,7 +77347,7 @@ process.chdir = function (dir) {
76895
77347
  };
76896
77348
  process.umask = function() { return 0; };
76897
77349
 
76898
- },{}],325:[function(require,module,exports){
77350
+ },{}],327:[function(require,module,exports){
76899
77351
 
76900
77352
  const toString = Object.prototype.toString;
76901
77353
 
@@ -76924,7 +77376,7 @@ module.exports = exports = function (regexp) {
76924
77376
  }
76925
77377
 
76926
77378
 
76927
- },{}],326:[function(require,module,exports){
77379
+ },{}],328:[function(require,module,exports){
76928
77380
  /*! safe-buffer. MIT License. Feross Aboukhadijeh <https://feross.org/opensource> */
76929
77381
  /* eslint-disable node/no-deprecated-api */
76930
77382
  var buffer = require('buffer')
@@ -76991,7 +77443,7 @@ SafeBuffer.allocUnsafeSlow = function (size) {
76991
77443
  return buffer.SlowBuffer(size)
76992
77444
  }
76993
77445
 
76994
- },{"buffer":128}],327:[function(require,module,exports){
77446
+ },{"buffer":128}],329:[function(require,module,exports){
76995
77447
 
76996
77448
  /**
76997
77449
  * An Array.prototype.slice.call(arguments) alternative
@@ -77026,7 +77478,7 @@ module.exports = function (args, slice, sliceEnd) {
77026
77478
  }
77027
77479
 
77028
77480
 
77029
- },{}],328:[function(require,module,exports){
77481
+ },{}],330:[function(require,module,exports){
77030
77482
  (function (setImmediate,clearImmediate){(function (){
77031
77483
  var nextTick = require('process/browser.js').nextTick;
77032
77484
  var apply = Function.prototype.apply;
@@ -77105,10 +77557,10 @@ exports.clearImmediate = typeof clearImmediate === "function" ? clearImmediate :
77105
77557
  delete immediateIds[id];
77106
77558
  };
77107
77559
  }).call(this)}).call(this,require("timers").setImmediate,require("timers").clearImmediate)
77108
- },{"process/browser.js":324,"timers":328}],329:[function(require,module,exports){
77560
+ },{"process/browser.js":326,"timers":330}],331:[function(require,module,exports){
77109
77561
  arguments[4][103][0].apply(exports,arguments)
77110
- },{"dup":103}],330:[function(require,module,exports){
77562
+ },{"dup":103}],332:[function(require,module,exports){
77111
77563
  arguments[4][104][0].apply(exports,arguments)
77112
- },{"dup":104}],331:[function(require,module,exports){
77564
+ },{"dup":104}],333:[function(require,module,exports){
77113
77565
  arguments[4][105][0].apply(exports,arguments)
77114
- },{"./support/isBuffer":330,"_process":324,"dup":105,"inherits":329}]},{},[87]);
77566
+ },{"./support/isBuffer":332,"_process":326,"dup":105,"inherits":331}]},{},[87]);