Comparing version 2.1.1 to 2.1.2
@@ -241,1 +241,9 @@ /** Object types that should never be mapped */ | ||
} | ||
// Backward compatibility with --target es5 | ||
declare global { | ||
interface Set<T> {} | ||
interface Map<K, V> {} | ||
interface WeakSet<T> {} | ||
interface WeakMap<K extends object, V> {} | ||
} |
1657
dist/immer.js
@@ -5,744 +5,704 @@ 'use strict'; | ||
var _typeof = typeof Symbol === "function" && typeof Symbol.iterator === "symbol" ? function (obj) { | ||
return typeof obj; | ||
} : function (obj) { | ||
return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; | ||
}; | ||
var classCallCheck = function (instance, Constructor) { | ||
if (!(instance instanceof Constructor)) { | ||
throw new TypeError("Cannot call a class as a function"); | ||
} | ||
}; | ||
var createClass = function () { | ||
function defineProperties(target, props) { | ||
for (var i = 0; i < props.length; i++) { | ||
var descriptor = props[i]; | ||
descriptor.enumerable = descriptor.enumerable || false; | ||
descriptor.configurable = true; | ||
if ("value" in descriptor) descriptor.writable = true; | ||
Object.defineProperty(target, descriptor.key, descriptor); | ||
} | ||
} | ||
return function (Constructor, protoProps, staticProps) { | ||
if (protoProps) defineProperties(Constructor.prototype, protoProps); | ||
if (staticProps) defineProperties(Constructor, staticProps); | ||
return Constructor; | ||
}; | ||
}(); | ||
var defineProperty = function (obj, key, value) { | ||
if (key in obj) { | ||
Object.defineProperty(obj, key, { | ||
value: value, | ||
enumerable: true, | ||
configurable: true, | ||
writable: true | ||
}); | ||
} else { | ||
obj[key] = value; | ||
} | ||
return obj; | ||
}; | ||
var NOTHING = typeof Symbol !== "undefined" ? Symbol("immer-nothing") : defineProperty({}, "immer-nothing", true); | ||
var obj; | ||
var NOTHING = typeof Symbol !== "undefined" ? Symbol("immer-nothing") : ( obj = {}, obj["immer-nothing"] = true, obj ); | ||
var DRAFTABLE = typeof Symbol !== "undefined" ? Symbol.for("immer-draftable") : "__$immer_draftable"; | ||
var DRAFT_STATE = typeof Symbol !== "undefined" ? Symbol.for("immer-state") : "__$immer_state"; | ||
function isDraft(value) { | ||
return !!value && !!value[DRAFT_STATE]; | ||
return !!value && !!value[DRAFT_STATE]; | ||
} | ||
function isDraftable(value) { | ||
if (!value || (typeof value === "undefined" ? "undefined" : _typeof(value)) !== "object") return false; | ||
if (Array.isArray(value)) return true; | ||
var proto = Object.getPrototypeOf(value); | ||
if (!proto || proto === Object.prototype) return true; | ||
return !!value[DRAFTABLE] || !!value.constructor[DRAFTABLE]; | ||
if (!value || typeof value !== "object") { return false; } | ||
if (Array.isArray(value)) { return true; } | ||
var proto = Object.getPrototypeOf(value); | ||
if (!proto || proto === Object.prototype) { return true; } | ||
return !!value[DRAFTABLE] || !!value.constructor[DRAFTABLE]; | ||
} | ||
function original(value) { | ||
if (value && value[DRAFT_STATE]) { | ||
return value[DRAFT_STATE].base; | ||
} // otherwise return undefined | ||
function original(value) { | ||
if (value && value[DRAFT_STATE]) { | ||
return value[DRAFT_STATE].base; | ||
} | ||
// otherwise return undefined | ||
} | ||
var assign = Object.assign || function assign(target, value) { | ||
for (var key in value) { | ||
if (has(value, key)) { | ||
target[key] = value[key]; | ||
} | ||
for (var key in value) { | ||
if (has(value, key)) { | ||
target[key] = value[key]; | ||
} | ||
return target; | ||
} | ||
return target; | ||
}; | ||
var ownKeys = typeof Reflect !== "undefined" && Reflect.ownKeys ? Reflect.ownKeys : typeof Object.getOwnPropertySymbols !== "undefined" ? function (obj) { return Object.getOwnPropertyNames(obj).concat(Object.getOwnPropertySymbols(obj)); } : Object.getOwnPropertyNames; | ||
function shallowCopy(base, invokeGetters) { | ||
if ( invokeGetters === void 0 ) invokeGetters = false; | ||
var ownKeys = typeof Reflect !== "undefined" && Reflect.ownKeys ? Reflect.ownKeys : typeof Object.getOwnPropertySymbols !== "undefined" ? function (obj) { | ||
return Object.getOwnPropertyNames(obj).concat(Object.getOwnPropertySymbols(obj)); | ||
} : Object.getOwnPropertyNames; | ||
if (Array.isArray(base)) { return base.slice(); } | ||
var clone = Object.create(Object.getPrototypeOf(base)); | ||
ownKeys(base).forEach(function (key) { | ||
if (key === DRAFT_STATE) { | ||
return; // Never copy over draft state. | ||
} | ||
function shallowCopy(base) { | ||
var invokeGetters = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : false; | ||
var desc = Object.getOwnPropertyDescriptor(base, key); | ||
if (Array.isArray(base)) return base.slice(); | ||
var clone = Object.create(Object.getPrototypeOf(base)); | ||
ownKeys(base).forEach(function (key) { | ||
if (key === DRAFT_STATE) { | ||
return; // Never copy over draft state. | ||
} | ||
var desc = Object.getOwnPropertyDescriptor(base, key); | ||
if (desc.get) { | ||
if (!invokeGetters) { | ||
throw new Error("Immer drafts cannot have computed properties"); | ||
} | ||
desc.value = desc.get.call(base); | ||
} | ||
if (desc.enumerable) { | ||
clone[key] = desc.value; | ||
} else { | ||
Object.defineProperty(clone, key, { | ||
value: desc.value, | ||
writable: true, | ||
configurable: true | ||
}); | ||
} | ||
}); | ||
return clone; | ||
} | ||
if (desc.get) { | ||
if (!invokeGetters) { | ||
throw new Error("Immer drafts cannot have computed properties"); | ||
} | ||
function each(value, cb) { | ||
if (Array.isArray(value)) { | ||
for (var i = 0; i < value.length; i++) { | ||
cb(i, value[i], value); | ||
} | ||
desc.value = desc.get.call(base); | ||
} | ||
if (desc.enumerable) { | ||
clone[key] = desc.value; | ||
} else { | ||
ownKeys(value).forEach(function (key) { | ||
return cb(key, value[key], value); | ||
}); | ||
Object.defineProperty(clone, key, { | ||
value: desc.value, | ||
writable: true, | ||
configurable: true | ||
}); | ||
} | ||
}); | ||
return clone; | ||
} | ||
function each(value, cb) { | ||
if (Array.isArray(value)) { | ||
for (var i = 0; i < value.length; i++) { cb(i, value[i], value); } | ||
} else { | ||
ownKeys(value).forEach(function (key) { return cb(key, value[key], value); }); | ||
} | ||
} | ||
function isEnumerable(base, prop) { | ||
return Object.getOwnPropertyDescriptor(base, prop).enumerable; | ||
return Object.getOwnPropertyDescriptor(base, prop).enumerable; | ||
} | ||
function has(thing, prop) { | ||
return Object.prototype.hasOwnProperty.call(thing, prop); | ||
return Object.prototype.hasOwnProperty.call(thing, prop); | ||
} | ||
function is(x, y) { | ||
// From: https://github.com/facebook/fbjs/blob/c69904a511b900266935168223063dd8772dfc40/packages/fbjs/src/core/shallowEqual.js | ||
if (x === y) { | ||
return x !== 0 || 1 / x === 1 / y; | ||
} else { | ||
return x !== x && y !== y; | ||
} | ||
// From: https://github.com/facebook/fbjs/blob/c69904a511b900266935168223063dd8772dfc40/packages/fbjs/src/core/shallowEqual.js | ||
if (x === y) { | ||
return x !== 0 || 1 / x === 1 / y; | ||
} else { | ||
return x !== x && y !== y; | ||
} | ||
} | ||
/** Each scope represents a `produce` call. */ | ||
var ImmerScope = function () { | ||
function ImmerScope(parent) { | ||
classCallCheck(this, ImmerScope); | ||
this.drafts = []; | ||
this.parent = parent; | ||
var ImmerScope = function ImmerScope(parent) { | ||
this.drafts = []; | ||
this.parent = parent; // Whenever the modified draft contains a draft from another scope, we | ||
// need to prevent auto-freezing so the unowned draft can be finalized. | ||
// Whenever the modified draft contains a draft from another scope, we | ||
// need to prevent auto-freezing so the unowned draft can be finalized. | ||
this.canAutoFreeze = true; | ||
this.canAutoFreeze = true; // To avoid prototype lookups: | ||
// To avoid prototype lookups: | ||
this.patches = null; | ||
} | ||
this.patches = null; | ||
}; | ||
createClass(ImmerScope, [{ | ||
key: "usePatches", | ||
value: function usePatches(patchListener) { | ||
if (patchListener) { | ||
this.patches = []; | ||
this.inversePatches = []; | ||
this.patchListener = patchListener; | ||
} | ||
} | ||
}, { | ||
key: "revoke", | ||
value: function revoke() { | ||
this.leave(); | ||
this.drafts.forEach(_revoke); | ||
this.drafts = null; // Make draft-related methods throw. | ||
} | ||
}, { | ||
key: "leave", | ||
value: function leave() { | ||
if (this === ImmerScope.current) { | ||
ImmerScope.current = this.parent; | ||
} | ||
} | ||
}]); | ||
return ImmerScope; | ||
}(); | ||
ImmerScope.prototype.usePatches = function usePatches (patchListener) { | ||
if (patchListener) { | ||
this.patches = []; | ||
this.inversePatches = []; | ||
this.patchListener = patchListener; | ||
} | ||
}; | ||
ImmerScope.prototype.revoke = function revoke$1 () { | ||
this.leave(); | ||
this.drafts.forEach(revoke); | ||
this.drafts = null; // Make draft-related methods throw. | ||
}; | ||
ImmerScope.prototype.leave = function leave () { | ||
if (this === ImmerScope.current) { | ||
ImmerScope.current = this.parent; | ||
} | ||
}; | ||
ImmerScope.current = null; | ||
ImmerScope.enter = function () { | ||
return this.current = new ImmerScope(this.current); | ||
return this.current = new ImmerScope(this.current); | ||
}; | ||
function _revoke(draft) { | ||
draft[DRAFT_STATE].revoke(); | ||
function revoke(draft) { | ||
draft[DRAFT_STATE].revoke(); | ||
} | ||
// property descriptors are recycled to make sure we don't create a get and set closure per property, | ||
// but share them all instead | ||
var descriptors = {}; | ||
function willFinalize(scope, result, isReplaced) { | ||
scope.drafts.forEach(function (draft) { | ||
draft[DRAFT_STATE].finalizing = true; | ||
}); | ||
function willFinalize(scope, result, isReplaced) { | ||
scope.drafts.forEach(function (draft) { | ||
draft[DRAFT_STATE].finalizing = true; | ||
}); | ||
if (!isReplaced) { | ||
if (scope.patches) { | ||
markChangesRecursively(scope.drafts[0]); | ||
} | ||
// This is faster when we don't care about which attributes changed. | ||
markChangesSweep(scope.drafts); | ||
if (!isReplaced) { | ||
if (scope.patches) { | ||
markChangesRecursively(scope.drafts[0]); | ||
} // This is faster when we don't care about which attributes changed. | ||
markChangesSweep(scope.drafts); | ||
} // When a child draft is returned, look for changes. | ||
else if (isDraft(result) && result[DRAFT_STATE].scope === scope) { | ||
markChangesSweep(scope.drafts); | ||
} | ||
// When a child draft is returned, look for changes. | ||
else if (isDraft(result) && result[DRAFT_STATE].scope === scope) { | ||
markChangesSweep(scope.drafts); | ||
} | ||
} | ||
function createProxy(base, parent) { | ||
var isArray = Array.isArray(base); | ||
var draft = clonePotentialDraft(base); | ||
each(draft, function (prop) { | ||
proxyProperty(draft, prop, isArray || isEnumerable(base, prop)); | ||
}); | ||
var isArray = Array.isArray(base); | ||
var draft = clonePotentialDraft(base); | ||
each(draft, function (prop) { | ||
proxyProperty(draft, prop, isArray || isEnumerable(base, prop)); | ||
}); // See "proxy.js" for property documentation. | ||
// See "proxy.js" for property documentation. | ||
var scope = parent ? parent.scope : ImmerScope.current; | ||
var state = { | ||
scope: scope, | ||
modified: false, | ||
finalizing: false, // es5 only | ||
finalized: false, | ||
assigned: {}, | ||
parent: parent, | ||
base: base, | ||
draft: draft, | ||
copy: null, | ||
revoke: revoke, | ||
revoked: false // es5 only | ||
}; | ||
var scope = parent ? parent.scope : ImmerScope.current; | ||
var state = { | ||
scope: scope, | ||
modified: false, | ||
finalizing: false, | ||
// es5 only | ||
finalized: false, | ||
assigned: {}, | ||
parent: parent, | ||
base: base, | ||
draft: draft, | ||
copy: null, | ||
revoke: revoke$1, | ||
revoked: false // es5 only | ||
createHiddenProperty(draft, DRAFT_STATE, state); | ||
scope.drafts.push(draft); | ||
return draft; | ||
}; | ||
createHiddenProperty(draft, DRAFT_STATE, state); | ||
scope.drafts.push(draft); | ||
return draft; | ||
} | ||
function revoke() { | ||
this.revoked = true; | ||
function revoke$1() { | ||
this.revoked = true; | ||
} | ||
function source(state) { | ||
return state.copy || state.base; | ||
return state.copy || state.base; | ||
} | ||
function _get(state, prop) { | ||
assertUnrevoked(state); | ||
var value = source(state)[prop]; | ||
// Drafts are only created for proxyable values that exist in the base state. | ||
if (!state.finalizing && value === state.base[prop] && isDraftable(value)) { | ||
prepareCopy(state); | ||
return state.copy[prop] = createProxy(value, state); | ||
} | ||
return value; | ||
function get(state, prop) { | ||
assertUnrevoked(state); | ||
var value = source(state)[prop]; // Drafts are only created for proxyable values that exist in the base state. | ||
if (!state.finalizing && value === state.base[prop] && isDraftable(value)) { | ||
prepareCopy(state); | ||
return state.copy[prop] = createProxy(value, state); | ||
} | ||
return value; | ||
} | ||
function _set(state, prop, value) { | ||
assertUnrevoked(state); | ||
state.assigned[prop] = true; | ||
if (!state.modified) { | ||
if (is(source(state)[prop], value)) return; | ||
markChanged(state); | ||
prepareCopy(state); | ||
} | ||
state.copy[prop] = value; | ||
function set(state, prop, value) { | ||
assertUnrevoked(state); | ||
state.assigned[prop] = true; | ||
if (!state.modified) { | ||
if (is(source(state)[prop], value)) { return; } | ||
markChanged(state); | ||
prepareCopy(state); | ||
} | ||
state.copy[prop] = value; | ||
} | ||
function markChanged(state) { | ||
if (!state.modified) { | ||
state.modified = true; | ||
if (state.parent) markChanged(state.parent); | ||
} | ||
if (!state.modified) { | ||
state.modified = true; | ||
if (state.parent) { markChanged(state.parent); } | ||
} | ||
} | ||
function prepareCopy(state) { | ||
if (!state.copy) state.copy = clonePotentialDraft(state.base); | ||
if (!state.copy) { state.copy = clonePotentialDraft(state.base); } | ||
} | ||
function clonePotentialDraft(base) { | ||
var state = base && base[DRAFT_STATE]; | ||
if (state) { | ||
state.finalizing = true; | ||
var draft = shallowCopy(state.draft, true); | ||
state.finalizing = false; | ||
return draft; | ||
} | ||
return shallowCopy(base); | ||
var state = base && base[DRAFT_STATE]; | ||
if (state) { | ||
state.finalizing = true; | ||
var draft = shallowCopy(state.draft, true); | ||
state.finalizing = false; | ||
return draft; | ||
} | ||
return shallowCopy(base); | ||
} | ||
function proxyProperty(draft, prop, enumerable) { | ||
var desc = descriptors[prop]; | ||
if (desc) { | ||
desc.enumerable = enumerable; | ||
} else { | ||
descriptors[prop] = desc = { | ||
configurable: true, | ||
enumerable: enumerable, | ||
get: function get$$1() { | ||
return _get(this[DRAFT_STATE], prop); | ||
}, | ||
set: function set$$1(value) { | ||
_set(this[DRAFT_STATE], prop, value); | ||
} | ||
}; | ||
} | ||
Object.defineProperty(draft, prop, desc); | ||
var desc = descriptors[prop]; | ||
if (desc) { | ||
desc.enumerable = enumerable; | ||
} else { | ||
descriptors[prop] = desc = { | ||
configurable: true, | ||
enumerable: enumerable, | ||
get: function get$1() { | ||
return get(this[DRAFT_STATE], prop); | ||
}, | ||
set: function set$1(value) { | ||
set(this[DRAFT_STATE], prop, value); | ||
} | ||
}; | ||
} | ||
Object.defineProperty(draft, prop, desc); | ||
} | ||
function assertUnrevoked(state) { | ||
if (state.revoked === true) throw new Error("Cannot use a proxy that has been revoked. Did you pass an object from inside an immer function to an async process? " + JSON.stringify(source(state))); | ||
} | ||
if (state.revoked === true) { throw new Error("Cannot use a proxy that has been revoked. Did you pass an object from inside an immer function to an async process? " + JSON.stringify(source(state))); } | ||
} // This looks expensive, but only proxies are visited, and only objects without known changes are scanned. | ||
// This looks expensive, but only proxies are visited, and only objects without known changes are scanned. | ||
function markChangesSweep(drafts) { | ||
// The natural order of drafts in the `scope` array is based on when they | ||
// were accessed. By processing drafts in reverse natural order, we have a | ||
// better chance of processing leaf nodes first. When a leaf node is known to | ||
// have changed, we can avoid any traversal of its ancestor nodes. | ||
for (var i = drafts.length - 1; i >= 0; i--) { | ||
var state = drafts[i][DRAFT_STATE]; | ||
if (!state.modified) { | ||
if (Array.isArray(state.base)) { | ||
if (hasArrayChanges(state)) markChanged(state); | ||
} else if (hasObjectChanges(state)) markChanged(state); | ||
} | ||
// The natural order of drafts in the `scope` array is based on when they | ||
// were accessed. By processing drafts in reverse natural order, we have a | ||
// better chance of processing leaf nodes first. When a leaf node is known to | ||
// have changed, we can avoid any traversal of its ancestor nodes. | ||
for (var i = drafts.length - 1; i >= 0; i--) { | ||
var state = drafts[i][DRAFT_STATE]; | ||
if (!state.modified) { | ||
if (Array.isArray(state.base)) { | ||
if (hasArrayChanges(state)) { markChanged(state); } | ||
} else if (hasObjectChanges(state)) { markChanged(state); } | ||
} | ||
} | ||
} | ||
function markChangesRecursively(object) { | ||
if (!object || (typeof object === "undefined" ? "undefined" : _typeof(object)) !== "object") return; | ||
var state = object[DRAFT_STATE]; | ||
if (!state) return; | ||
var base = state.base, | ||
draft = state.draft, | ||
assigned = state.assigned; | ||
if (!object || typeof object !== "object") { return; } | ||
var state = object[DRAFT_STATE]; | ||
if (!state) { return; } | ||
var base = state.base; | ||
var draft = state.draft; | ||
var assigned = state.assigned; | ||
if (!Array.isArray(object)) { | ||
// Look for added keys. | ||
Object.keys(draft).forEach(function (key) { | ||
// The `undefined` check is a fast path for pre-existing keys. | ||
if (base[key] === undefined && !has(base, key)) { | ||
assigned[key] = true; | ||
markChanged(state); | ||
} else if (!assigned[key]) { | ||
// Only untouched properties trigger recursion. | ||
markChangesRecursively(draft[key]); | ||
} | ||
}); | ||
// Look for removed keys. | ||
Object.keys(base).forEach(function (key) { | ||
// The `undefined` check is a fast path for pre-existing keys. | ||
if (draft[key] === undefined && !has(draft, key)) { | ||
assigned[key] = false; | ||
markChanged(state); | ||
} | ||
}); | ||
} else if (hasArrayChanges(state)) { | ||
if (!Array.isArray(object)) { | ||
// Look for added keys. | ||
Object.keys(draft).forEach(function (key) { | ||
// The `undefined` check is a fast path for pre-existing keys. | ||
if (base[key] === undefined && !has(base, key)) { | ||
assigned[key] = true; | ||
markChanged(state); | ||
assigned.length = true; | ||
if (draft.length < base.length) { | ||
for (var i = draft.length; i < base.length; i++) { | ||
assigned[i] = false; | ||
} | ||
} else { | ||
for (var _i = base.length; _i < draft.length; _i++) { | ||
assigned[_i] = true; | ||
} | ||
} | ||
for (var _i2 = 0; _i2 < draft.length; _i2++) { | ||
// Only untouched indices trigger recursion. | ||
if (assigned[_i2] === undefined) markChangesRecursively(draft[_i2]); | ||
} | ||
} else if (!assigned[key]) { | ||
// Only untouched properties trigger recursion. | ||
markChangesRecursively(draft[key]); | ||
} | ||
}); // Look for removed keys. | ||
Object.keys(base).forEach(function (key) { | ||
// The `undefined` check is a fast path for pre-existing keys. | ||
if (draft[key] === undefined && !has(draft, key)) { | ||
assigned[key] = false; | ||
markChanged(state); | ||
} | ||
}); | ||
} else if (hasArrayChanges(state)) { | ||
markChanged(state); | ||
assigned.length = true; | ||
if (draft.length < base.length) { | ||
for (var i = draft.length; i < base.length; i++) { assigned[i] = false; } | ||
} else { | ||
for (var i$1 = base.length; i$1 < draft.length; i$1++) { assigned[i$1] = true; } | ||
} | ||
for (var i$2 = 0; i$2 < draft.length; i$2++) { | ||
// Only untouched indices trigger recursion. | ||
if (assigned[i$2] === undefined) { markChangesRecursively(draft[i$2]); } | ||
} | ||
} | ||
} | ||
function hasObjectChanges(state) { | ||
var base = state.base, | ||
draft = state.draft; | ||
var base = state.base; | ||
var draft = state.draft; // Search for added keys and changed keys. Start at the back, because | ||
// non-numeric keys are ordered by time of definition on the object. | ||
// Search for added keys. Start at the back, because non-numeric keys | ||
// are ordered by time of definition on the object. | ||
var keys = Object.keys(draft); | ||
var keys = Object.keys(draft); | ||
for (var i = keys.length - 1; i >= 0; i--) { | ||
// The `undefined` check is a fast path for pre-existing keys. | ||
if (base[keys[i]] === undefined && !has(base, keys[i])) { | ||
return true; | ||
for (var i = keys.length - 1; i >= 0; i--) { | ||
var key = keys[i]; | ||
var baseValue = base[key]; // The `undefined` check is a fast path for pre-existing keys. | ||
if (baseValue === undefined && !has(base, key)) { | ||
return true; | ||
} // Once a base key is deleted, future changes go undetected, because its | ||
// descriptor is erased. This branch detects any missed changes. | ||
else { | ||
var value = draft[key]; | ||
var state$1 = value && value[DRAFT_STATE]; | ||
if (state$1 ? state$1.base !== baseValue : !is(value, baseValue)) { | ||
return true; | ||
} | ||
} | ||
} | ||
} // At this point, no keys were added or changed. | ||
// Compare key count to determine if keys were deleted. | ||
// Since no keys have been added, we can compare lengths to know if an | ||
// object has been deleted. | ||
return keys.length !== Object.keys(base).length; | ||
return keys.length !== Object.keys(base).length; | ||
} | ||
function hasArrayChanges(state) { | ||
var draft = state.draft; | ||
var draft = state.draft; | ||
if (draft.length !== state.base.length) { return true; } // See #116 | ||
// If we first shorten the length, our array interceptors will be removed. | ||
// If after that new items are added, result in the same original length, | ||
// those last items will have no intercepting property. | ||
// So if there is no own descriptor on the last position, we know that items were removed and added | ||
// N.B.: splice, unshift, etc only shift values around, but not prop descriptors, so we only have to check | ||
// the last one | ||
if (draft.length !== state.base.length) return true; | ||
// See #116 | ||
// If we first shorten the length, our array interceptors will be removed. | ||
// If after that new items are added, result in the same original length, | ||
// those last items will have no intercepting property. | ||
// So if there is no own descriptor on the last position, we know that items were removed and added | ||
// N.B.: splice, unshift, etc only shift values around, but not prop descriptors, so we only have to check | ||
// the last one | ||
var descriptor = Object.getOwnPropertyDescriptor(draft, draft.length - 1); | ||
// descriptor can be null, but only for newly created sparse arrays, eg. new Array(10) | ||
if (descriptor && !descriptor.get) return true; | ||
// For all other cases, we don't have to compare, as they would have been picked up by the index setters | ||
return false; | ||
var descriptor = Object.getOwnPropertyDescriptor(draft, draft.length - 1); // descriptor can be null, but only for newly created sparse arrays, eg. new Array(10) | ||
if (descriptor && !descriptor.get) { return true; } // For all other cases, we don't have to compare, as they would have been picked up by the index setters | ||
return false; | ||
} | ||
function createHiddenProperty(target, prop, value) { | ||
Object.defineProperty(target, prop, { | ||
value: value, | ||
enumerable: false, | ||
writable: true | ||
}); | ||
Object.defineProperty(target, prop, { | ||
value: value, | ||
enumerable: false, | ||
writable: true | ||
}); | ||
} | ||
var legacyProxy = Object.freeze({ | ||
willFinalize: willFinalize, | ||
createProxy: createProxy | ||
var legacyProxy = /*#__PURE__*/Object.freeze({ | ||
willFinalize: willFinalize, | ||
createProxy: createProxy | ||
}); | ||
// Do nothing before being finalized. | ||
function willFinalize$1() {} | ||
function createProxy$1(base, parent) { | ||
var scope = parent ? parent.scope : ImmerScope.current; | ||
var state = { | ||
// Track which produce call this is associated with. | ||
scope: scope, | ||
// True for both shallow and deep changes. | ||
modified: false, | ||
// Used during finalization. | ||
finalized: false, | ||
// Track which properties have been assigned (true) or deleted (false). | ||
assigned: {}, | ||
// The parent draft state. | ||
parent: parent, | ||
// The base state. | ||
base: base, | ||
// The base proxy. | ||
draft: null, | ||
// Any property proxies. | ||
drafts: {}, | ||
// The base copy with any updated values. | ||
copy: null, | ||
// Called by the `produce` function. | ||
revoke: null | ||
}; | ||
var scope = parent ? parent.scope : ImmerScope.current; | ||
var state = { | ||
// Track which produce call this is associated with. | ||
scope: scope, | ||
// True for both shallow and deep changes. | ||
modified: false, | ||
// Used during finalization. | ||
finalized: false, | ||
// Track which properties have been assigned (true) or deleted (false). | ||
assigned: {}, | ||
// The parent draft state. | ||
parent: parent, | ||
// The base state. | ||
base: base, | ||
// The base proxy. | ||
draft: null, | ||
// Any property proxies. | ||
drafts: {}, | ||
// The base copy with any updated values. | ||
copy: null, | ||
// Called by the `produce` function. | ||
revoke: null | ||
}; | ||
var ref = Array.isArray(base) ? // [state] is used for arrays, to make sure the proxy is array-ish and not violate invariants, | ||
// although state itself is an object | ||
Proxy.revocable([state], arrayTraps) : Proxy.revocable(state, objectTraps); | ||
var revoke = ref.revoke; | ||
var proxy = ref.proxy; | ||
state.draft = proxy; | ||
state.revoke = revoke; | ||
scope.drafts.push(proxy); | ||
return proxy; | ||
} | ||
var objectTraps = { | ||
get: get$1, | ||
var _ref = Array.isArray(base) ? // [state] is used for arrays, to make sure the proxy is array-ish and not violate invariants, | ||
// although state itself is an object | ||
Proxy.revocable([state], arrayTraps) : Proxy.revocable(state, objectTraps), | ||
revoke = _ref.revoke, | ||
proxy = _ref.proxy; | ||
has: function has$$1(target, prop) { | ||
return prop in source$1(target); | ||
}, | ||
state.draft = proxy; | ||
state.revoke = revoke; | ||
ownKeys: function ownKeys$$1(target) { | ||
return Reflect.ownKeys(source$1(target)); | ||
}, | ||
scope.drafts.push(proxy); | ||
return proxy; | ||
} | ||
set: set$1, | ||
deleteProperty: deleteProperty, | ||
getOwnPropertyDescriptor: getOwnPropertyDescriptor, | ||
var objectTraps = { | ||
get: get$1, | ||
has: function has$$1(target, prop) { | ||
return prop in source$1(target); | ||
}, | ||
ownKeys: function ownKeys$$1(target) { | ||
return Reflect.ownKeys(source$1(target)); | ||
}, | ||
defineProperty: function defineProperty() { | ||
throw new Error("Object.defineProperty() cannot be used on an Immer draft"); // prettier-ignore | ||
}, | ||
set: set$1, | ||
deleteProperty: deleteProperty, | ||
getOwnPropertyDescriptor: getOwnPropertyDescriptor, | ||
defineProperty: function defineProperty() { | ||
throw new Error("Object.defineProperty() cannot be used on an Immer draft"); // prettier-ignore | ||
}, | ||
getPrototypeOf: function getPrototypeOf(target) { | ||
return Object.getPrototypeOf(target.base); | ||
}, | ||
setPrototypeOf: function setPrototypeOf() { | ||
throw new Error("Object.setPrototypeOf() cannot be used on an Immer draft"); // prettier-ignore | ||
} | ||
getPrototypeOf: function getPrototypeOf(target) { | ||
return Object.getPrototypeOf(target.base); | ||
}, | ||
setPrototypeOf: function setPrototypeOf() { | ||
throw new Error("Object.setPrototypeOf() cannot be used on an Immer draft"); // prettier-ignore | ||
} | ||
}; | ||
var arrayTraps = {}; | ||
each(objectTraps, function (key, fn) { | ||
arrayTraps[key] = function () { | ||
arguments[0] = arguments[0][0]; | ||
return fn.apply(this, arguments); | ||
}; | ||
arrayTraps[key] = function () { | ||
arguments[0] = arguments[0][0]; | ||
return fn.apply(this, arguments); | ||
}; | ||
}); | ||
arrayTraps.deleteProperty = function (state, prop) { | ||
if (isNaN(parseInt(prop))) { | ||
throw new Error("Immer only supports deleting array indices"); // prettier-ignore | ||
} | ||
return objectTraps.deleteProperty.call(this, state[0], prop); | ||
if (isNaN(parseInt(prop))) { | ||
throw new Error("Immer only supports deleting array indices"); // prettier-ignore | ||
} | ||
return objectTraps.deleteProperty.call(this, state[0], prop); | ||
}; | ||
arrayTraps.set = function (state, prop, value) { | ||
if (prop !== "length" && isNaN(parseInt(prop))) { | ||
throw new Error("Immer only supports setting array indices and the 'length' property"); // prettier-ignore | ||
} | ||
return objectTraps.set.call(this, state[0], prop, value); | ||
}; | ||
if (prop !== "length" && isNaN(parseInt(prop))) { | ||
throw new Error("Immer only supports setting array indices and the 'length' property"); // prettier-ignore | ||
} | ||
// returns the object we should be reading the current value from, which is base, until some change has been made | ||
return objectTraps.set.call(this, state[0], prop, value); | ||
}; // returns the object we should be reading the current value from, which is base, until some change has been made | ||
function source$1(state) { | ||
return state.copy || state.base; | ||
return state.copy || state.base; | ||
} | ||
function get$1(state, prop) { | ||
if (prop === DRAFT_STATE) return state; | ||
var drafts = state.drafts; | ||
if (prop === DRAFT_STATE) { return state; } | ||
var drafts = state.drafts; // Check for existing draft in unmodified state. | ||
// Check for existing draft in unmodified state. | ||
if (!state.modified && has(drafts, prop)) { | ||
return drafts[prop]; | ||
} | ||
if (!state.modified && has(drafts, prop)) { | ||
return drafts[prop]; | ||
} | ||
var value = source$1(state)[prop]; | ||
if (state.finalized || !isDraftable(value)) { return value; } // Check for existing draft in modified state. | ||
var value = source$1(state)[prop]; | ||
if (state.finalized || !isDraftable(value)) return value; | ||
if (state.modified) { | ||
// Assigned values are never drafted. This catches any drafts we created, too. | ||
if (value !== state.base[prop]) { return value; } // Store drafts on the copy (when one exists). | ||
// Check for existing draft in modified state. | ||
if (state.modified) { | ||
// Assigned values are never drafted. This catches any drafts we created, too. | ||
if (value !== state.base[prop]) return value; | ||
// Store drafts on the copy (when one exists). | ||
drafts = state.copy; | ||
} | ||
drafts = state.copy; | ||
} | ||
return drafts[prop] = createProxy$1(value, state); | ||
return drafts[prop] = createProxy$1(value, state); | ||
} | ||
function set$1(state, prop, value) { | ||
if (!state.modified) { | ||
// Optimize based on value's truthiness. Truthy values are guaranteed to | ||
// never be undefined, so we can avoid the `in` operator. Lastly, truthy | ||
// values may be drafts, but falsy values are never drafts. | ||
var isUnchanged = value ? is(state.base[prop], value) || value === state.drafts[prop] : is(state.base[prop], value) && prop in state.base; | ||
if (isUnchanged) return true; | ||
markChanged$1(state); | ||
} | ||
state.assigned[prop] = true; | ||
state.copy[prop] = value; | ||
return true; | ||
if (!state.modified) { | ||
// Optimize based on value's truthiness. Truthy values are guaranteed to | ||
// never be undefined, so we can avoid the `in` operator. Lastly, truthy | ||
// values may be drafts, but falsy values are never drafts. | ||
var isUnchanged = value ? is(state.base[prop], value) || value === state.drafts[prop] : is(state.base[prop], value) && prop in state.base; | ||
if (isUnchanged) { return true; } | ||
markChanged$1(state); | ||
} | ||
state.assigned[prop] = true; | ||
state.copy[prop] = value; | ||
return true; | ||
} | ||
function deleteProperty(state, prop) { | ||
// The `undefined` check is a fast path for pre-existing keys. | ||
if (state.base[prop] !== undefined || prop in state.base) { | ||
state.assigned[prop] = false; | ||
markChanged$1(state); | ||
} | ||
if (state.copy) delete state.copy[prop]; | ||
return true; | ||
// The `undefined` check is a fast path for pre-existing keys. | ||
if (state.base[prop] !== undefined || prop in state.base) { | ||
state.assigned[prop] = false; | ||
markChanged$1(state); | ||
} | ||
if (state.copy) { delete state.copy[prop]; } | ||
return true; | ||
} | ||
function getOwnPropertyDescriptor(state, prop) { | ||
var owner = source$1(state); | ||
var desc = Reflect.getOwnPropertyDescriptor(owner, prop); | ||
if (desc) { | ||
desc.writable = true; | ||
desc.configurable = !Array.isArray(owner) || prop !== "length"; | ||
} | ||
return desc; | ||
var owner = source$1(state); | ||
var desc = Reflect.getOwnPropertyDescriptor(owner, prop); | ||
if (desc) { | ||
desc.writable = true; | ||
desc.configurable = !Array.isArray(owner) || prop !== "length"; | ||
} | ||
return desc; | ||
} | ||
function markChanged$1(state) { | ||
if (!state.modified) { | ||
state.modified = true; | ||
state.copy = assign(shallowCopy(state.base), state.drafts); | ||
state.drafts = null; | ||
if (state.parent) markChanged$1(state.parent); | ||
} | ||
if (!state.modified) { | ||
state.modified = true; | ||
state.copy = assign(shallowCopy(state.base), state.drafts); | ||
state.drafts = null; | ||
if (state.parent) { markChanged$1(state.parent); } | ||
} | ||
} | ||
var modernProxy = Object.freeze({ | ||
willFinalize: willFinalize$1, | ||
createProxy: createProxy$1 | ||
var modernProxy = /*#__PURE__*/Object.freeze({ | ||
willFinalize: willFinalize$1, | ||
createProxy: createProxy$1 | ||
}); | ||
function generatePatches(state, basePath, patches, inversePatches) { | ||
Array.isArray(state.base) ? generateArrayPatches(state, basePath, patches, inversePatches) : generateObjectPatches(state, basePath, patches, inversePatches); | ||
Array.isArray(state.base) ? generateArrayPatches(state, basePath, patches, inversePatches) : generateObjectPatches(state, basePath, patches, inversePatches); | ||
} | ||
function generateArrayPatches(state, basePath, patches, inversePatches) { | ||
var base = state.base, | ||
copy = state.copy, | ||
assigned = state.assigned; | ||
var assign$$1, assign$1; | ||
// Reduce complexity by ensuring `base` is never longer. | ||
var base = state.base; | ||
var copy = state.copy; | ||
var assigned = state.assigned; // Reduce complexity by ensuring `base` is never longer. | ||
if (copy.length < base.length) { | ||
var _ref = [copy, base]; | ||
base = _ref[0]; | ||
copy = _ref[1]; | ||
var _ref2 = [inversePatches, patches]; | ||
patches = _ref2[0]; | ||
inversePatches = _ref2[1]; | ||
} | ||
if (copy.length < base.length) { | ||
(assign$$1 = [copy, base], base = assign$$1[0], copy = assign$$1[1]); | ||
(assign$1 = [inversePatches, patches], patches = assign$1[0], inversePatches = assign$1[1]); | ||
} | ||
var delta = copy.length - base.length; | ||
var delta = copy.length - base.length; // Find the first replaced index. | ||
// Find the first replaced index. | ||
var start = 0; | ||
while (base[start] === copy[start] && start < base.length) { | ||
++start; | ||
} | ||
var start = 0; | ||
// Find the last replaced index. Search from the end to optimize splice patches. | ||
var end = base.length; | ||
while (end > start && base[end - 1] === copy[end + delta - 1]) { | ||
--end; | ||
} | ||
while (base[start] === copy[start] && start < base.length) { | ||
++start; | ||
} // Find the last replaced index. Search from the end to optimize splice patches. | ||
// Process replaced indices. | ||
for (var i = start; i < end; ++i) { | ||
if (assigned[i] && copy[i] !== base[i]) { | ||
var path = basePath.concat([i]); | ||
patches.push({ | ||
op: "replace", | ||
path: path, | ||
value: copy[i] | ||
}); | ||
inversePatches.push({ | ||
op: "replace", | ||
path: path, | ||
value: base[i] | ||
}); | ||
} | ||
var end = base.length; | ||
while (end > start && base[end - 1] === copy[end + delta - 1]) { | ||
--end; | ||
} // Process replaced indices. | ||
for (var i = start; i < end; ++i) { | ||
if (assigned[i] && copy[i] !== base[i]) { | ||
var path = basePath.concat([i]); | ||
patches.push({ | ||
op: "replace", | ||
path: path, | ||
value: copy[i] | ||
}); | ||
inversePatches.push({ | ||
op: "replace", | ||
path: path, | ||
value: base[i] | ||
}); | ||
} | ||
} | ||
var useRemove = end != base.length; | ||
var replaceCount = patches.length; | ||
var useRemove = end != base.length; | ||
var replaceCount = patches.length; // Process added indices. | ||
// Process added indices. | ||
for (var _i = end + delta - 1; _i >= end; --_i) { | ||
var _path = basePath.concat([_i]); | ||
patches[replaceCount + _i - end] = { | ||
op: "add", | ||
path: _path, | ||
value: copy[_i] | ||
}; | ||
if (useRemove) { | ||
inversePatches.push({ | ||
op: "remove", | ||
path: _path | ||
}); | ||
} | ||
for (var i$1 = end + delta - 1; i$1 >= end; --i$1) { | ||
var path$1 = basePath.concat([i$1]); | ||
patches[replaceCount + i$1 - end] = { | ||
op: "add", | ||
path: path$1, | ||
value: copy[i$1] | ||
}; | ||
if (useRemove) { | ||
inversePatches.push({ | ||
op: "remove", | ||
path: path$1 | ||
}); | ||
} | ||
} // One "replace" patch reverses all non-splicing "add" patches. | ||
// One "replace" patch reverses all non-splicing "add" patches. | ||
if (!useRemove) { | ||
inversePatches.push({ | ||
op: "replace", | ||
path: basePath.concat(["length"]), | ||
value: base.length | ||
}); | ||
} | ||
if (!useRemove) { | ||
inversePatches.push({ | ||
op: "replace", | ||
path: basePath.concat(["length"]), | ||
value: base.length | ||
}); | ||
} | ||
} | ||
function generateObjectPatches(state, basePath, patches, inversePatches) { | ||
var base = state.base, | ||
copy = state.copy; | ||
each(state.assigned, function (key, assignedValue) { | ||
var origValue = base[key]; | ||
var value = copy[key]; | ||
var op = !assignedValue ? "remove" : key in base ? "replace" : "add"; | ||
if (origValue === value && op === "replace") return; | ||
var path = basePath.concat(key); | ||
patches.push(op === "remove" ? { op: op, path: path } : { op: op, path: path, value: value }); | ||
inversePatches.push(op === "add" ? { op: "remove", path: path } : op === "remove" ? { op: "add", path: path, value: origValue } : { op: "replace", path: path, value: origValue }); | ||
var base = state.base; | ||
var copy = state.copy; | ||
each(state.assigned, function (key, assignedValue) { | ||
var origValue = base[key]; | ||
var value = copy[key]; | ||
var op = !assignedValue ? "remove" : key in base ? "replace" : "add"; | ||
if (origValue === value && op === "replace") { return; } | ||
var path = basePath.concat(key); | ||
patches.push(op === "remove" ? { | ||
op: op, | ||
path: path | ||
} : { | ||
op: op, | ||
path: path, | ||
value: value | ||
}); | ||
inversePatches.push(op === "add" ? { | ||
op: "remove", | ||
path: path | ||
} : op === "remove" ? { | ||
op: "add", | ||
path: path, | ||
value: origValue | ||
} : { | ||
op: "replace", | ||
path: path, | ||
value: origValue | ||
}); | ||
}); | ||
} | ||
function applyPatches(draft, patches) { | ||
for (var i = 0; i < patches.length; i++) { | ||
var patch = patches[i]; | ||
var path = patch.path; | ||
for (var i = 0; i < patches.length; i++) { | ||
var patch = patches[i]; | ||
var path = patch.path; | ||
if (path.length === 0 && patch.op === "replace") { | ||
draft = patch.value; | ||
} else { | ||
var base = draft; | ||
for (var _i2 = 0; _i2 < path.length - 1; _i2++) { | ||
base = base[path[_i2]]; | ||
if (!base || (typeof base === "undefined" ? "undefined" : _typeof(base)) !== "object") throw new Error("Cannot apply patch, path doesn't resolve: " + path.join("/")); // prettier-ignore | ||
} | ||
var key = path[path.length - 1]; | ||
switch (patch.op) { | ||
case "replace": | ||
base[key] = patch.value; | ||
break; | ||
case "add": | ||
if (Array.isArray(base)) { | ||
// TODO: support "foo/-" paths for appending to an array | ||
base.splice(key, 0, patch.value); | ||
} else { | ||
base[key] = patch.value; | ||
} | ||
break; | ||
case "remove": | ||
if (Array.isArray(base)) { | ||
base.splice(key, 1); | ||
} else { | ||
delete base[key]; | ||
} | ||
break; | ||
default: | ||
throw new Error("Unsupported patch operation: " + patch.op); | ||
} | ||
} | ||
if (path.length === 0 && patch.op === "replace") { | ||
draft = patch.value; | ||
} else { | ||
var base = draft; | ||
for (var i$1 = 0; i$1 < path.length - 1; i$1++) { | ||
base = base[path[i$1]]; | ||
if (!base || typeof base !== "object") { throw new Error("Cannot apply patch, path doesn't resolve: " + path.join("/")); } // prettier-ignore | ||
} | ||
var key = path[path.length - 1]; | ||
switch (patch.op) { | ||
case "replace": | ||
base[key] = patch.value; | ||
break; | ||
case "add": | ||
if (Array.isArray(base)) { | ||
// TODO: support "foo/-" paths for appending to an array | ||
base.splice(key, 0, patch.value); | ||
} else { | ||
base[key] = patch.value; | ||
} | ||
break; | ||
case "remove": | ||
if (Array.isArray(base)) { | ||
base.splice(key, 1); | ||
} else { | ||
delete base[key]; | ||
} | ||
break; | ||
default: | ||
throw new Error("Unsupported patch operation: " + patch.op); | ||
} | ||
} | ||
return draft; | ||
} | ||
return draft; | ||
} | ||
@@ -753,299 +713,298 @@ | ||
var configDefaults = { | ||
useProxies: typeof Proxy !== "undefined" && typeof Reflect !== "undefined", | ||
autoFreeze: typeof process !== "undefined" ? process.env.NODE_ENV !== "production" : verifyMinified.name === "verifyMinified", | ||
onAssign: null, | ||
onDelete: null, | ||
onCopy: null | ||
useProxies: typeof Proxy !== "undefined" && typeof Reflect !== "undefined", | ||
autoFreeze: typeof process !== "undefined" ? process.env.NODE_ENV !== "production" : verifyMinified.name === "verifyMinified", | ||
onAssign: null, | ||
onDelete: null, | ||
onCopy: null | ||
}; | ||
var Immer = function Immer(config) { | ||
assign(this, configDefaults, config); | ||
this.setUseProxies(this.useProxies); | ||
this.produce = this.produce.bind(this); | ||
}; | ||
var Immer = function () { | ||
function Immer(config) { | ||
classCallCheck(this, Immer); | ||
Immer.prototype.produce = function produce (base, recipe, patchListener) { | ||
var this$1 = this; | ||
assign(this, configDefaults, config); | ||
this.setUseProxies(this.useProxies); | ||
this.produce = this.produce.bind(this); | ||
// curried invocation | ||
if (typeof base === "function" && typeof recipe !== "function") { | ||
var defaultBase = recipe; | ||
recipe = base; // prettier-ignore | ||
return function (base) { | ||
if ( base === void 0 ) base = defaultBase; | ||
var args = [], len = arguments.length - 1; | ||
while ( len-- > 0 ) args[ len ] = arguments[ len + 1 ]; | ||
return this$1.produce(base, function (draft) { return recipe.call.apply(recipe, [ draft, draft ].concat( args )); }); | ||
}; | ||
} // prettier-ignore | ||
{ | ||
if (typeof recipe !== "function") { | ||
throw new Error("The first or second argument to `produce` must be a function"); | ||
} | ||
createClass(Immer, [{ | ||
key: "produce", | ||
value: function produce(base, recipe, patchListener) { | ||
var _this = this; | ||
if (patchListener !== undefined && typeof patchListener !== "function") { | ||
throw new Error("The third argument to `produce` must be a function or undefined"); | ||
} | ||
} | ||
var result; // Only plain objects, arrays, and "immerable classes" are drafted. | ||
// curried invocation | ||
if (typeof base === "function" && typeof recipe !== "function") { | ||
var defaultBase = recipe; | ||
recipe = base; | ||
if (isDraftable(base)) { | ||
var scope = ImmerScope.enter(); | ||
var proxy = this.createProxy(base); | ||
var hasError = true; | ||
// prettier-ignore | ||
return function () { | ||
for (var _len = arguments.length, args = Array(_len > 1 ? _len - 1 : 0), _key = 1; _key < _len; _key++) { | ||
args[_key - 1] = arguments[_key]; | ||
} | ||
try { | ||
result = recipe.call(proxy, proxy); | ||
hasError = false; | ||
} finally { | ||
// finally instead of catch + rethrow better preserves original stack | ||
if (hasError) { scope.revoke(); }else { scope.leave(); } | ||
} | ||
var base = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : defaultBase; | ||
return _this.produce(base, function (draft) { | ||
var _recipe; | ||
if (result instanceof Promise) { | ||
return result.then(function (result) { | ||
scope.usePatches(patchListener); | ||
return this$1.processResult(result, scope); | ||
}, function (error) { | ||
scope.revoke(); | ||
throw error; | ||
}); | ||
} | ||
return (_recipe = recipe).call.apply(_recipe, [draft, draft].concat(args)); | ||
}); | ||
}; | ||
} | ||
scope.usePatches(patchListener); | ||
return this.processResult(result, scope); | ||
} else { | ||
result = recipe(base); | ||
if (result === undefined) { return base; } | ||
return result !== NOTHING ? result : undefined; | ||
} | ||
}; | ||
// prettier-ignore | ||
{ | ||
if (typeof recipe !== "function") throw new Error("if first argument is not a function, the second argument to produce should be a function"); | ||
if (patchListener !== undefined && typeof patchListener !== "function") throw new Error("the third argument of a producer should not be set or a function"); | ||
} | ||
Immer.prototype.createDraft = function createDraft (base) { | ||
if (!isDraftable(base)) { | ||
throw new Error("First argument to `createDraft` must be a plain object, an array, or an immerable object"); // prettier-ignore | ||
} | ||
var result = void 0; | ||
var scope = ImmerScope.enter(); | ||
var proxy = this.createProxy(base); | ||
proxy[DRAFT_STATE].isManual = true; | ||
scope.leave(); | ||
return proxy; | ||
}; | ||
// Only plain objects, arrays, and "immerable classes" are drafted. | ||
if (isDraftable(base)) { | ||
var scope = ImmerScope.enter(); | ||
var proxy = this.createProxy(base); | ||
var hasError = true; | ||
try { | ||
result = recipe.call(proxy, proxy); | ||
hasError = false; | ||
} finally { | ||
// finally instead of catch + rethrow better preserves original stack | ||
if (hasError) scope.revoke();else scope.leave(); | ||
} | ||
if (result instanceof Promise) { | ||
return result.then(function (result) { | ||
scope.usePatches(patchListener); | ||
return _this.processResult(result, scope); | ||
}, function (error) { | ||
scope.revoke(); | ||
throw error; | ||
}); | ||
} | ||
scope.usePatches(patchListener); | ||
return this.processResult(result, scope); | ||
} else { | ||
result = recipe(base); | ||
if (result === undefined) return base; | ||
return result !== NOTHING ? result : undefined; | ||
} | ||
} | ||
}, { | ||
key: "createDraft", | ||
value: function createDraft(base) { | ||
if (!isDraftable(base)) throw new Error("First argument to createDraft should be a plain object, an array, or an immerable object."); // prettier-ignore | ||
var scope = ImmerScope.enter(); | ||
var proxy = this.createProxy(base); | ||
scope.leave(); | ||
proxy[DRAFT_STATE].customDraft = true; | ||
return proxy; | ||
} | ||
}, { | ||
key: "finishDraft", | ||
value: function finishDraft(draft, patchListener) { | ||
if (!isDraft(draft)) throw new Error("First argument to finishDraft should be an object from createDraft."); // prettier-ignore | ||
var state = draft[DRAFT_STATE]; | ||
if (!state.customDraft) throw new Error("The draft provided was not created using `createDraft`"); // prettier-ignore | ||
if (state.finalized) throw new Error("The draft provided was has already been finished"); // prettier-ignore | ||
// TODO: check if created with createDraft | ||
// TODO: check if not finsihed twice | ||
var scope = state.scope; | ||
Immer.prototype.finishDraft = function finishDraft (draft, patchListener) { | ||
var state = draft && draft[DRAFT_STATE]; | ||
scope.usePatches(patchListener); | ||
return this.processResult(undefined, scope); | ||
} | ||
}, { | ||
key: "setAutoFreeze", | ||
value: function setAutoFreeze(value) { | ||
this.autoFreeze = value; | ||
} | ||
}, { | ||
key: "setUseProxies", | ||
value: function setUseProxies(value) { | ||
this.useProxies = value; | ||
assign(this, value ? modernProxy : legacyProxy); | ||
} | ||
}, { | ||
key: "applyPatches", | ||
value: function applyPatches$$1(base, patches) { | ||
// Mutate the base state when a draft is passed. | ||
if (isDraft(base)) { | ||
return applyPatches(base, patches); | ||
} | ||
// Otherwise, produce a copy of the base state. | ||
return this.produce(base, function (draft) { | ||
return applyPatches(draft, patches); | ||
}); | ||
} | ||
/** @internal */ | ||
if (!state || !state.isManual) { | ||
throw new Error("First argument to `finishDraft` must be a draft returned by `createDraft`"); // prettier-ignore | ||
} | ||
}, { | ||
key: "processResult", | ||
value: function processResult(result, scope) { | ||
var baseDraft = scope.drafts[0]; | ||
var isReplaced = result !== undefined && result !== baseDraft; | ||
this.willFinalize(scope, result, isReplaced); | ||
if (isReplaced) { | ||
if (baseDraft[DRAFT_STATE].modified) { | ||
scope.revoke(); | ||
throw new Error("An immer producer returned a new value *and* modified its draft. Either return a new value *or* modify the draft."); // prettier-ignore | ||
} | ||
if (isDraftable(result)) { | ||
// Finalize the result in case it contains (or is) a subset of the draft. | ||
result = this.finalize(result, null, scope); | ||
} | ||
if (scope.patches) { | ||
scope.patches.push({ | ||
op: "replace", | ||
path: [], | ||
value: result | ||
}); | ||
scope.inversePatches.push({ | ||
op: "replace", | ||
path: [], | ||
value: baseDraft[DRAFT_STATE].base | ||
}); | ||
} | ||
} else { | ||
// Finalize the base draft. | ||
result = this.finalize(baseDraft, [], scope); | ||
} | ||
scope.revoke(); | ||
if (scope.patches) { | ||
scope.patchListener(scope.patches, scope.inversePatches); | ||
} | ||
return result !== NOTHING ? result : undefined; | ||
} | ||
/** | ||
* @internal | ||
* Finalize a draft, returning either the unmodified base state or a modified | ||
* copy of the base state. | ||
*/ | ||
if (state.finalized) { | ||
throw new Error("The given draft is already finalized"); // prettier-ignore | ||
} | ||
}, { | ||
key: "finalize", | ||
value: function finalize(draft, path, scope) { | ||
var _this2 = this; | ||
var scope = state.scope; | ||
scope.usePatches(patchListener); | ||
return this.processResult(undefined, scope); | ||
}; | ||
var state = draft[DRAFT_STATE]; | ||
if (!state) { | ||
if (Object.isFrozen(draft)) return draft; | ||
return this.finalizeTree(draft, null, scope); | ||
} | ||
// Never finalize drafts owned by another scope. | ||
if (state.scope !== scope) { | ||
return draft; | ||
} | ||
if (!state.modified) { | ||
return state.base; | ||
} | ||
if (!state.finalized) { | ||
state.finalized = true; | ||
this.finalizeTree(state.draft, path, scope); | ||
Immer.prototype.setAutoFreeze = function setAutoFreeze (value) { | ||
this.autoFreeze = value; | ||
}; | ||
if (this.onDelete) { | ||
// The `assigned` object is unreliable with ES5 drafts. | ||
if (this.useProxies) { | ||
var assigned = state.assigned; | ||
Immer.prototype.setUseProxies = function setUseProxies (value) { | ||
this.useProxies = value; | ||
assign(this, value ? modernProxy : legacyProxy); | ||
}; | ||
for (var prop in assigned) { | ||
if (!assigned[prop]) this.onDelete(state, prop); | ||
} | ||
} else { | ||
var base = state.base, | ||
copy = state.copy; | ||
Immer.prototype.applyPatches = function applyPatches$1 (base, patches) { | ||
// Mutate the base state when a draft is passed. | ||
if (isDraft(base)) { | ||
return applyPatches(base, patches); | ||
} // Otherwise, produce a copy of the base state. | ||
each(base, function (prop) { | ||
if (!has(copy, prop)) _this2.onDelete(state, prop); | ||
}); | ||
} | ||
} | ||
if (this.onCopy) { | ||
this.onCopy(state); | ||
} | ||
// At this point, all descendants of `state.copy` have been finalized, | ||
// so we can be sure that `scope.canAutoFreeze` is accurate. | ||
if (this.autoFreeze && scope.canAutoFreeze) { | ||
Object.freeze(state.copy); | ||
} | ||
return this.produce(base, function (draft) { return applyPatches(draft, patches); }); | ||
}; | ||
/** @internal */ | ||
if (path && scope.patches) { | ||
generatePatches(state, path, scope.patches, scope.inversePatches); | ||
} | ||
} | ||
return state.copy; | ||
Immer.prototype.processResult = function processResult (result, scope) { | ||
var baseDraft = scope.drafts[0]; | ||
var isReplaced = result !== undefined && result !== baseDraft; | ||
this.willFinalize(scope, result, isReplaced); | ||
if (isReplaced) { | ||
if (baseDraft[DRAFT_STATE].modified) { | ||
scope.revoke(); | ||
throw new Error("An immer producer returned a new value *and* modified its draft. Either return a new value *or* modify the draft."); // prettier-ignore | ||
} | ||
if (isDraftable(result)) { | ||
// Finalize the result in case it contains (or is) a subset of the draft. | ||
result = this.finalize(result, null, scope); | ||
} | ||
if (scope.patches) { | ||
scope.patches.push({ | ||
op: "replace", | ||
path: [], | ||
value: result | ||
}); | ||
scope.inversePatches.push({ | ||
op: "replace", | ||
path: [], | ||
value: baseDraft[DRAFT_STATE].base | ||
}); | ||
} | ||
} else { | ||
// Finalize the base draft. | ||
result = this.finalize(baseDraft, [], scope); | ||
} | ||
scope.revoke(); | ||
if (scope.patches) { | ||
scope.patchListener(scope.patches, scope.inversePatches); | ||
} | ||
return result !== NOTHING ? result : undefined; | ||
}; | ||
/** | ||
* @internal | ||
* Finalize a draft, returning either the unmodified base state or a modified | ||
* copy of the base state. | ||
*/ | ||
Immer.prototype.finalize = function finalize (draft, path, scope) { | ||
var this$1 = this; | ||
var state = draft[DRAFT_STATE]; | ||
if (!state) { | ||
if (Object.isFrozen(draft)) { return draft; } | ||
return this.finalizeTree(draft, null, scope); | ||
} // Never finalize drafts owned by another scope. | ||
if (state.scope !== scope) { | ||
return draft; | ||
} | ||
if (!state.modified) { | ||
return state.base; | ||
} | ||
if (!state.finalized) { | ||
state.finalized = true; | ||
this.finalizeTree(state.draft, path, scope); | ||
if (this.onDelete) { | ||
// The `assigned` object is unreliable with ES5 drafts. | ||
if (this.useProxies) { | ||
var assigned = state.assigned; | ||
for (var prop in assigned) { | ||
if (!assigned[prop]) { this.onDelete(state, prop); } | ||
} | ||
/** | ||
* @internal | ||
* Finalize all drafts in the given state tree. | ||
*/ | ||
} else { | ||
var base = state.base; | ||
var copy = state.copy; | ||
each(base, function (prop) { | ||
if (!has(copy, prop)) { this$1.onDelete(state, prop); } | ||
}); | ||
} | ||
} | ||
}, { | ||
key: "finalizeTree", | ||
value: function finalizeTree(root, rootPath, scope) { | ||
var _this3 = this; | ||
if (this.onCopy) { | ||
this.onCopy(state); | ||
} // At this point, all descendants of `state.copy` have been finalized, | ||
// so we can be sure that `scope.canAutoFreeze` is accurate. | ||
var state = root[DRAFT_STATE]; | ||
if (state) { | ||
if (!this.useProxies) { | ||
state.finalizing = true; | ||
state.copy = shallowCopy(state.draft, true); | ||
state.finalizing = false; | ||
} | ||
root = state.copy; | ||
} | ||
var needPatches = !!rootPath && !!scope.patches; | ||
var finalizeProperty = function finalizeProperty(prop, value, parent) { | ||
if (value === parent) { | ||
throw Error("Immer forbids circular references"); | ||
} | ||
if (this.autoFreeze && scope.canAutoFreeze) { | ||
Object.freeze(state.copy); | ||
} | ||
// In the `finalizeTree` method, only the `root` object may be a draft. | ||
var isDraftProp = !!state && parent === root; | ||
if (path && scope.patches) { | ||
generatePatches(state, path, scope.patches, scope.inversePatches); | ||
} | ||
} | ||
if (isDraft(value)) { | ||
var path = isDraftProp && needPatches && !state.assigned[prop] ? rootPath.concat(prop) : null; | ||
return state.copy; | ||
}; | ||
/** | ||
* @internal | ||
* Finalize all drafts in the given state tree. | ||
*/ | ||
// Drafts owned by `scope` are finalized here. | ||
value = _this3.finalize(value, path, scope); | ||
// Drafts from another scope must prevent auto-freezing. | ||
if (isDraft(value)) { | ||
scope.canAutoFreeze = false; | ||
} | ||
Immer.prototype.finalizeTree = function finalizeTree (root, rootPath, scope) { | ||
var this$1 = this; | ||
// Preserve non-enumerable properties. | ||
if (Array.isArray(parent) || isEnumerable(parent, prop)) { | ||
parent[prop] = value; | ||
} else { | ||
Object.defineProperty(parent, prop, { value: value }); | ||
} | ||
var state = root[DRAFT_STATE]; | ||
// Unchanged drafts are never passed to the `onAssign` hook. | ||
if (isDraftProp && value === state.base[prop]) return; | ||
} | ||
// Unchanged draft properties are ignored. | ||
else if (isDraftProp && is(value, state.base[prop])) { | ||
return; | ||
} | ||
// Search new objects for unfinalized drafts. Frozen objects should never contain drafts. | ||
else if (isDraftable(value) && !Object.isFrozen(value)) { | ||
each(value, finalizeProperty); | ||
} | ||
if (state) { | ||
if (!this.useProxies) { | ||
state.finalizing = true; | ||
state.copy = shallowCopy(state.draft, true); | ||
state.finalizing = false; | ||
} | ||
if (isDraftProp && _this3.onAssign) { | ||
_this3.onAssign(state, prop, value); | ||
} | ||
}; | ||
root = state.copy; | ||
} | ||
each(root, finalizeProperty); | ||
return root; | ||
var needPatches = !!rootPath && !!scope.patches; | ||
var finalizeProperty = function (prop, value, parent) { | ||
if (value === parent) { | ||
throw Error("Immer forbids circular references"); | ||
} // In the `finalizeTree` method, only the `root` object may be a draft. | ||
var isDraftProp = !!state && parent === root; | ||
if (isDraft(value)) { | ||
var path = isDraftProp && needPatches && !state.assigned[prop] ? rootPath.concat(prop) : null; // Drafts owned by `scope` are finalized here. | ||
value = this$1.finalize(value, path, scope); // Drafts from another scope must prevent auto-freezing. | ||
if (isDraft(value)) { | ||
scope.canAutoFreeze = false; | ||
} // Preserve non-enumerable properties. | ||
if (Array.isArray(parent) || isEnumerable(parent, prop)) { | ||
parent[prop] = value; | ||
} else { | ||
Object.defineProperty(parent, prop, { | ||
value: value | ||
}); | ||
} // Unchanged drafts are never passed to the `onAssign` hook. | ||
if (isDraftProp && value === state.base[prop]) { return; } | ||
} // Unchanged draft properties are ignored. | ||
else if (isDraftProp && is(value, state.base[prop])) { | ||
return; | ||
} // Search new objects for unfinalized drafts. Frozen objects should never contain drafts. | ||
else if (isDraftable(value) && !Object.isFrozen(value)) { | ||
each(value, finalizeProperty); | ||
} | ||
}]); | ||
return Immer; | ||
}(); | ||
if (isDraftProp && this$1.onAssign) { | ||
this$1.onAssign(state, prop, value); | ||
} | ||
}; | ||
each(root, finalizeProperty); | ||
return root; | ||
}; | ||
var immer = new Immer(); | ||
/** | ||
@@ -1070,2 +1029,3 @@ * The `produce` function takes a value and a "recipe function" (whose | ||
*/ | ||
var produce = immer.produce; | ||
@@ -1077,4 +1037,4 @@ /** | ||
*/ | ||
var setAutoFreeze = immer.setAutoFreeze.bind(immer); | ||
/** | ||
@@ -1086,4 +1046,4 @@ * Pass true to use the ES2015 `Proxy` class when creating drafts, which is | ||
*/ | ||
var setUseProxies = immer.setUseProxies.bind(immer); | ||
/** | ||
@@ -1094,4 +1054,4 @@ * Apply an array of Immer patches to the first argument. | ||
*/ | ||
var applyPatches$1 = immer.applyPatches.bind(immer); | ||
/** | ||
@@ -1101,4 +1061,4 @@ * Create an Immer draft from the given base state, which may be a draft itself. | ||
*/ | ||
var createDraft = immer.createDraft.bind(immer); | ||
/** | ||
@@ -1112,6 +1072,7 @@ * Finalize an Immer draft from a `createDraft` call, returning the base state | ||
*/ | ||
var finishDraft = immer.finishDraft.bind(immer); | ||
exports.produce = produce; | ||
exports['default'] = produce; | ||
exports.default = produce; | ||
exports.setAutoFreeze = setAutoFreeze; | ||
@@ -1118,0 +1079,0 @@ exports.setUseProxies = setUseProxies; |
@@ -1,2 +0,2 @@ | ||
var e,r;e=this,r=function(e){"use strict";var r,t,n,o="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e},i=function(e,r){if(!(e instanceof r))throw new TypeError("Cannot call a class as a function")},a=function(){function e(e,r){for(var t=0;t<r.length;t++){var n=r[t];n.enumerable=n.enumerable||!1,n.configurable=!0,"value"in n&&(n.writable=!0),Object.defineProperty(e,n.key,n)}}return function(r,t,n){return t&&e(r.prototype,t),n&&e(r,n),r}}(),f="undefined"!=typeof Symbol?Symbol("immer-nothing"):(n=!0,(t="immer-nothing")in(r={})?Object.defineProperty(r,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):r[t]=n,r),s="undefined"!=typeof Symbol?Symbol.for("immer-draftable"):"__$immer_draftable",u="undefined"!=typeof Symbol?Symbol.for("immer-state"):"__$immer_state";function c(e){return!!e&&!!e[u]}function l(e){if(!e||"object"!==(void 0===e?"undefined":o(e)))return!1;if(Array.isArray(e))return!0;var r=Object.getPrototypeOf(e);return!r||r===Object.prototype||(!!e[s]||!!e.constructor[s])}var p=Object.assign||function(e,r){for(var t in r)b(r,t)&&(e[t]=r[t]);return e},d="undefined"!=typeof Reflect&&Reflect.ownKeys?Reflect.ownKeys:void 0!==Object.getOwnPropertySymbols?function(e){return Object.getOwnPropertyNames(e).concat(Object.getOwnPropertySymbols(e))}:Object.getOwnPropertyNames;function h(e){var r=arguments.length>1&&void 0!==arguments[1]&&arguments[1];if(Array.isArray(e))return e.slice();var t=Object.create(Object.getPrototypeOf(e));return d(e).forEach(function(n){if(n!==u){var o=Object.getOwnPropertyDescriptor(e,n);if(o.get){if(!r)throw new Error("Immer drafts cannot have computed properties");o.value=o.get.call(e)}o.enumerable?t[n]=o.value:Object.defineProperty(t,n,{value:o.value,writable:!0,configurable:!0})}}),t}function y(e,r){if(Array.isArray(e))for(var t=0;t<e.length;t++)r(t,e[t],e);else d(e).forEach(function(t){return r(t,e[t],e)})}function v(e,r){return Object.getOwnPropertyDescriptor(e,r).enumerable}function b(e,r){return Object.prototype.hasOwnProperty.call(e,r)}function m(e,r){return e===r?0!==e||1/e==1/r:e!=e&&r!=r}var g=function(){function e(r){i(this,e),this.drafts=[],this.parent=r,this.canAutoFreeze=!0,this.patches=null}return a(e,[{key:"usePatches",value:function(e){e&&(this.patches=[],this.inversePatches=[],this.patchListener=e)}},{key:"revoke",value:function(){this.leave(),this.drafts.forEach(w),this.drafts=null}},{key:"leave",value:function(){this===e.current&&(e.current=this.parent)}}]),e}();function w(e){e[u].revoke()}g.current=null,g.enter=function(){return this.current=new g(this.current)};var P={};function O(e,r){var t=Array.isArray(e),n=E(e);y(n,function(r){!function(e,r,t){var n=P[r];n?n.enumerable=t:P[r]=n={configurable:!0,enumerable:t,get:function(){return function(e,r){D(e);var t=z(e)[r];if(!e.finalizing&&t===e.base[r]&&l(t))return k(e),e.copy[r]=O(t,e);return t}(this[u],r)},set:function(e){!function(e,r,t){if(D(e),e.assigned[r]=!0,!e.modified){if(m(z(e)[r],t))return;A(e),k(e)}e.copy[r]=t}(this[u],r,e)}};Object.defineProperty(e,r,n)}(n,r,t||v(e,r))});var o,i,a,f=r?r.scope:g.current;return o=n,i=u,a={scope:f,modified:!1,finalizing:!1,finalized:!1,assigned:{},parent:r,base:e,draft:n,copy:null,revoke:j,revoked:!1},Object.defineProperty(o,i,{value:a,enumerable:!1,writable:!0}),f.drafts.push(n),n}function j(){this.revoked=!0}function z(e){return e.copy||e.base}function A(e){e.modified||(e.modified=!0,e.parent&&A(e.parent))}function k(e){e.copy||(e.copy=E(e.base))}function E(e){var r=e&&e[u];if(r){r.finalizing=!0;var t=h(r.draft,!0);return r.finalizing=!1,t}return h(e)}function D(e){if(!0===e.revoked)throw new Error("Cannot use a proxy that has been revoked. Did you pass an object from inside an immer function to an async process? "+JSON.stringify(z(e)))}function x(e){for(var r=e.length-1;r>=0;r--){var t=e[r][u];t.modified||(Array.isArray(t.base)?S(t)&&A(t):F(t)&&A(t))}}function F(e){for(var r=e.base,t=e.draft,n=Object.keys(t),o=n.length-1;o>=0;o--)if(void 0===r[n[o]]&&!b(r,n[o]))return!0;return n.length!==Object.keys(r).length}function S(e){var r=e.draft;if(r.length!==e.base.length)return!0;var t=Object.getOwnPropertyDescriptor(r,r.length-1);return!(!t||t.get)}var R=Object.freeze({willFinalize:function(e,r,t){e.drafts.forEach(function(e){e[u].finalizing=!0}),t?c(r)&&r[u].scope===e&&x(e.drafts):(e.patches&&function e(r){if(r&&"object"===(void 0===r?"undefined":o(r))){var t=r[u];if(t){var n=t.base,i=t.draft,a=t.assigned;if(Array.isArray(r)){if(S(t)){if(A(t),a.length=!0,i.length<n.length)for(var f=i.length;f<n.length;f++)a[f]=!1;else for(var s=n.length;s<i.length;s++)a[s]=!0;for(var c=0;c<i.length;c++)void 0===a[c]&&e(i[c])}}else Object.keys(i).forEach(function(r){void 0!==n[r]||b(n,r)?a[r]||e(i[r]):(a[r]=!0,A(t))}),Object.keys(n).forEach(function(e){void 0!==i[e]||b(i,e)||(a[e]=!1,A(t))})}}}(e.drafts[0]),x(e.drafts))},createProxy:O});function I(e,r){var t=r?r.scope:g.current,n={scope:t,modified:!1,finalized:!1,assigned:{},parent:r,base:e,draft:null,drafts:{},copy:null,revoke:null},o=Array.isArray(e)?Proxy.revocable([n],_):Proxy.revocable(n,N),i=o.revoke,a=o.proxy;return n.draft=a,n.revoke=i,t.drafts.push(a),a}var N={get:function(e,r){if(r===u)return e;var t=e.drafts;if(!e.modified&&b(t,r))return t[r];var n=C(e)[r];if(e.finalized||!l(n))return n;if(e.modified){if(n!==e.base[r])return n;t=e.copy}return t[r]=I(n,e)},has:function(e,r){return r in C(e)},ownKeys:function(e){return Reflect.ownKeys(C(e))},set:function(e,r,t){if(!e.modified){var n=t?m(e.base[r],t)||t===e.drafts[r]:m(e.base[r],t)&&r in e.base;if(n)return!0;T(e)}return e.assigned[r]=!0,e.copy[r]=t,!0},deleteProperty:function(e,r){(void 0!==e.base[r]||r in e.base)&&(e.assigned[r]=!1,T(e));e.copy&&delete e.copy[r];return!0},getOwnPropertyDescriptor:function(e,r){var t=C(e),n=Reflect.getOwnPropertyDescriptor(t,r);n&&(n.writable=!0,n.configurable=!Array.isArray(t)||"length"!==r);return n},defineProperty:function(){throw new Error("Object.defineProperty() cannot be used on an Immer draft")},getPrototypeOf:function(e){return Object.getPrototypeOf(e.base)},setPrototypeOf:function(){throw new Error("Object.setPrototypeOf() cannot be used on an Immer draft")}},_={};function C(e){return e.copy||e.base}function T(e){e.modified||(e.modified=!0,e.copy=p(h(e.base),e.drafts),e.drafts=null,e.parent&&T(e.parent))}y(N,function(e,r){_[e]=function(){return arguments[0]=arguments[0][0],r.apply(this,arguments)}}),_.deleteProperty=function(e,r){if(isNaN(parseInt(r)))throw new Error("Immer only supports deleting array indices");return N.deleteProperty.call(this,e[0],r)},_.set=function(e,r,t){if("length"!==r&&isNaN(parseInt(r)))throw new Error("Immer only supports setting array indices and the 'length' property");return N.set.call(this,e[0],r,t)};var U=Object.freeze({willFinalize:function(){},createProxy:I});function K(e,r,t,n){Array.isArray(e.base)?function(e,r,t,n){var o=e.base,i=e.copy,a=e.assigned;if(i.length<o.length){var f=[i,o];o=f[0],i=f[1];var s=[n,t];t=s[0],n=s[1]}var u=i.length-o.length,c=0;for(;o[c]===i[c]&&c<o.length;)++c;var l=o.length;for(;l>c&&o[l-1]===i[l+u-1];)--l;for(var p=c;p<l;++p)if(a[p]&&i[p]!==o[p]){var d=r.concat([p]);t.push({op:"replace",path:d,value:i[p]}),n.push({op:"replace",path:d,value:o[p]})}for(var h=l!=o.length,y=t.length,v=l+u-1;v>=l;--v){var b=r.concat([v]);t[y+v-l]={op:"add",path:b,value:i[v]},h&&n.push({op:"remove",path:b})}h||n.push({op:"replace",path:r.concat(["length"]),value:o.length})}(e,r,t,n):function(e,r,t,n){var o=e.base,i=e.copy;y(e.assigned,function(e,a){var f=o[e],s=i[e],u=a?e in o?"replace":"add":"remove";if(f!==s||"replace"!==u){var c=r.concat(e);t.push("remove"===u?{op:u,path:c}:{op:u,path:c,value:s}),n.push("add"===u?{op:"remove",path:c}:"remove"===u?{op:"add",path:c,value:f}:{op:"replace",path:c,value:f})}})}(e,r,t,n)}function L(e,r){for(var t=0;t<r.length;t++){var n=r[t],i=n.path;if(0===i.length&&"replace"===n.op)e=n.value;else{for(var a=e,f=0;f<i.length-1;f++)if(!(a=a[i[f]])||"object"!==(void 0===a?"undefined":o(a)))throw new Error("Cannot apply patch, path doesn't resolve: "+i.join("/"));var s=i[i.length-1];switch(n.op){case"replace":a[s]=n.value;break;case"add":Array.isArray(a)?a.splice(s,0,n.value):a[s]=n.value;break;case"remove":Array.isArray(a)?a.splice(s,1):delete a[s];break;default:throw new Error("Unsupported patch operation: "+n.op)}}}return e}var M={useProxies:"undefined"!=typeof Proxy&&"undefined"!=typeof Reflect,autoFreeze:"undefined"!=typeof process?"production"!==process.env.NODE_ENV:"verifyMinified"===function(){}.name,onAssign:null,onDelete:null,onCopy:null},$=function(){function e(r){i(this,e),p(this,M,r),this.setUseProxies(this.useProxies),this.produce=this.produce.bind(this)}return a(e,[{key:"produce",value:function(e,r,t){var n=this;if("function"==typeof e&&"function"!=typeof r){var o=r;return r=e,function(){for(var e=arguments.length,t=Array(e>1?e-1:0),i=1;i<e;i++)t[i-1]=arguments[i];var a=arguments.length>0&&void 0!==arguments[0]?arguments[0]:o;return n.produce(a,function(e){var n;return(n=r).call.apply(n,[e,e].concat(t))})}}if("function"!=typeof r)throw new Error("if first argument is not a function, the second argument to produce should be a function");if(void 0!==t&&"function"!=typeof t)throw new Error("the third argument of a producer should not be set or a function");var i=void 0;if(l(e)){var a=g.enter(),s=this.createProxy(e),u=!0;try{i=r.call(s,s),u=!1}finally{u?a.revoke():a.leave()}return i instanceof Promise?i.then(function(e){return a.usePatches(t),n.processResult(e,a)},function(e){throw a.revoke(),e}):(a.usePatches(t),this.processResult(i,a))}return void 0===(i=r(e))?e:i!==f?i:void 0}},{key:"createDraft",value:function(e){if(!l(e))throw new Error("First argument to createDraft should be a plain object, an array, or an immerable object.");var r=g.enter(),t=this.createProxy(e);return r.leave(),t[u].customDraft=!0,t}},{key:"finishDraft",value:function(e,r){if(!c(e))throw new Error("First argument to finishDraft should be an object from createDraft.");var t=e[u];if(!t.customDraft)throw new Error("The draft provided was not created using `createDraft`");if(t.finalized)throw new Error("The draft provided was has already been finished");var n=t.scope;return n.usePatches(r),this.processResult(void 0,n)}},{key:"setAutoFreeze",value:function(e){this.autoFreeze=e}},{key:"setUseProxies",value:function(e){this.useProxies=e,p(this,e?U:R)}},{key:"applyPatches",value:function(e,r){return c(e)?L(e,r):this.produce(e,function(e){return L(e,r)})}},{key:"processResult",value:function(e,r){var t=r.drafts[0],n=void 0!==e&&e!==t;if(this.willFinalize(r,e,n),n){if(t[u].modified)throw r.revoke(),new Error("An immer producer returned a new value *and* modified its draft. Either return a new value *or* modify the draft.");l(e)&&(e=this.finalize(e,null,r)),r.patches&&(r.patches.push({op:"replace",path:[],value:e}),r.inversePatches.push({op:"replace",path:[],value:t[u].base}))}else e=this.finalize(t,[],r);return r.revoke(),r.patches&&r.patchListener(r.patches,r.inversePatches),e!==f?e:void 0}},{key:"finalize",value:function(e,r,t){var n=this,o=e[u];if(!o)return Object.isFrozen(e)?e:this.finalizeTree(e,null,t);if(o.scope!==t)return e;if(!o.modified)return o.base;if(!o.finalized){if(o.finalized=!0,this.finalizeTree(o.draft,r,t),this.onDelete)if(this.useProxies){var i=o.assigned;for(var a in i)i[a]||this.onDelete(o,a)}else{var f=o.base,s=o.copy;y(f,function(e){b(s,e)||n.onDelete(o,e)})}this.onCopy&&this.onCopy(o),this.autoFreeze&&t.canAutoFreeze&&Object.freeze(o.copy),r&&t.patches&&K(o,r,t.patches,t.inversePatches)}return o.copy}},{key:"finalizeTree",value:function(e,r,t){var n=this,o=e[u];o&&(this.useProxies||(o.finalizing=!0,o.copy=h(o.draft,!0),o.finalizing=!1),e=o.copy);var i=!!r&&!!t.patches;return y(e,function a(f,s,u){if(s===u)throw Error("Immer forbids circular references");var p=!!o&&u===e;if(c(s)){var d=p&&i&&!o.assigned[f]?r.concat(f):null;if(c(s=n.finalize(s,d,t))&&(t.canAutoFreeze=!1),Array.isArray(u)||v(u,f)?u[f]=s:Object.defineProperty(u,f,{value:s}),p&&s===o.base[f])return}else{if(p&&m(s,o.base[f]))return;l(s)&&!Object.isFrozen(s)&&y(s,a)}p&&n.onAssign&&n.onAssign(o,f,s)}),e}}]),e}(),J=new $,V=J.produce,q=J.setAutoFreeze.bind(J),B=J.setUseProxies.bind(J),G=J.applyPatches.bind(J),H=J.createDraft.bind(J),Q=J.finishDraft.bind(J);e.produce=V,e.default=V,e.setAutoFreeze=q,e.setUseProxies=B,e.applyPatches=G,e.createDraft=H,e.finishDraft=Q,e.Immer=$,e.original=function(e){if(e&&e[u])return e[u].base},e.isDraft=c,e.isDraftable=l,e.nothing=f,e.immerable=s,Object.defineProperty(e,"__esModule",{value:!0})},"object"==typeof exports&&"undefined"!=typeof module?r(exports):"function"==typeof define&&define.amd?define(["exports"],r):r(e.immer={}); | ||
!function(e,r){"object"==typeof exports&&"undefined"!=typeof module?r(exports):"function"==typeof define&&define.amd?define(["exports"],r):r((e=e||self).immer={})}(this,function(e){"use strict";var r,t="undefined"!=typeof Symbol?Symbol("immer-nothing"):((r={})["immer-nothing"]=!0,r),n="undefined"!=typeof Symbol?Symbol.for("immer-draftable"):"__$immer_draftable",o="undefined"!=typeof Symbol?Symbol.for("immer-state"):"__$immer_state";function i(e){return!!e&&!!e[o]}function a(e){if(!e||"object"!=typeof e)return!1;if(Array.isArray(e))return!0;var r=Object.getPrototypeOf(e);return!r||r===Object.prototype||(!!e[n]||!!e.constructor[n])}var s=Object.assign||function(e,r){for(var t in r)l(r,t)&&(e[t]=r[t]);return e},f="undefined"!=typeof Reflect&&Reflect.ownKeys?Reflect.ownKeys:void 0!==Object.getOwnPropertySymbols?function(e){return Object.getOwnPropertyNames(e).concat(Object.getOwnPropertySymbols(e))}:Object.getOwnPropertyNames;function c(e,r){if(void 0===r&&(r=!1),Array.isArray(e))return e.slice();var t=Object.create(Object.getPrototypeOf(e));return f(e).forEach(function(n){if(n!==o){var i=Object.getOwnPropertyDescriptor(e,n);if(i.get){if(!r)throw new Error("Immer drafts cannot have computed properties");i.value=i.get.call(e)}i.enumerable?t[n]=i.value:Object.defineProperty(t,n,{value:i.value,writable:!0,configurable:!0})}}),t}function u(e,r){if(Array.isArray(e))for(var t=0;t<e.length;t++)r(t,e[t],e);else f(e).forEach(function(t){return r(t,e[t],e)})}function p(e,r){return Object.getOwnPropertyDescriptor(e,r).enumerable}function l(e,r){return Object.prototype.hasOwnProperty.call(e,r)}function d(e,r){return e===r?0!==e||1/e==1/r:e!=e&&r!=r}var h=function(e){this.drafts=[],this.parent=e,this.canAutoFreeze=!0,this.patches=null};function y(e){e[o].revoke()}h.prototype.usePatches=function(e){e&&(this.patches=[],this.inversePatches=[],this.patchListener=e)},h.prototype.revoke=function(){this.leave(),this.drafts.forEach(y),this.drafts=null},h.prototype.leave=function(){this===h.current&&(h.current=this.parent)},h.current=null,h.enter=function(){return this.current=new h(this.current)};var v={};function b(e,r){var t=Array.isArray(e),n=O(e);u(n,function(r){!function(e,r,t){var n=v[r];n?n.enumerable=t:v[r]=n={configurable:!0,enumerable:t,get:function(){return function(e,r){j(e);var t=m(e)[r];if(!e.finalizing&&t===e.base[r]&&a(t))return P(e),e.copy[r]=b(t,e);return t}(this[o],r)},set:function(e){!function(e,r,t){if(j(e),e.assigned[r]=!0,!e.modified){if(d(m(e)[r],t))return;w(e),P(e)}e.copy[r]=t}(this[o],r,e)}};Object.defineProperty(e,r,n)}(n,r,t||p(e,r))});var i,s,f,c=r?r.scope:h.current;return i=n,s=o,f={scope:c,modified:!1,finalizing:!1,finalized:!1,assigned:{},parent:r,base:e,draft:n,copy:null,revoke:g,revoked:!1},Object.defineProperty(i,s,{value:f,enumerable:!1,writable:!0}),c.drafts.push(n),n}function g(){this.revoked=!0}function m(e){return e.copy||e.base}function w(e){e.modified||(e.modified=!0,e.parent&&w(e.parent))}function P(e){e.copy||(e.copy=O(e.base))}function O(e){var r=e&&e[o];if(r){r.finalizing=!0;var t=c(r.draft,!0);return r.finalizing=!1,t}return c(e)}function j(e){if(!0===e.revoked)throw new Error("Cannot use a proxy that has been revoked. Did you pass an object from inside an immer function to an async process? "+JSON.stringify(m(e)))}function z(e){for(var r=e.length-1;r>=0;r--){var t=e[r][o];t.modified||(Array.isArray(t.base)?E(t)&&w(t):A(t)&&w(t))}}function A(e){for(var r=e.base,t=e.draft,n=Object.keys(t),i=n.length-1;i>=0;i--){var a=n[i],s=r[a];if(void 0===s&&!l(r,a))return!0;var f=t[a],c=f&&f[o];if(c?c.base!==s:!d(f,s))return!0}return n.length!==Object.keys(r).length}function E(e){var r=e.draft;if(r.length!==e.base.length)return!0;var t=Object.getOwnPropertyDescriptor(r,r.length-1);return!(!t||t.get)}var D=Object.freeze({willFinalize:function(e,r,t){e.drafts.forEach(function(e){e[o].finalizing=!0}),t?i(r)&&r[o].scope===e&&z(e.drafts):(e.patches&&function e(r){if(r&&"object"==typeof r){var t=r[o];if(t){var n=t.base,i=t.draft,a=t.assigned;if(Array.isArray(r)){if(E(t)){if(w(t),a.length=!0,i.length<n.length)for(var s=i.length;s<n.length;s++)a[s]=!1;else for(var f=n.length;f<i.length;f++)a[f]=!0;for(var c=0;c<i.length;c++)void 0===a[c]&&e(i[c])}}else Object.keys(i).forEach(function(r){void 0!==n[r]||l(n,r)?a[r]||e(i[r]):(a[r]=!0,w(t))}),Object.keys(n).forEach(function(e){void 0!==i[e]||l(i,e)||(a[e]=!1,w(t))})}}}(e.drafts[0]),z(e.drafts))},createProxy:b});function k(e,r){var t=r?r.scope:h.current,n={scope:t,modified:!1,finalized:!1,assigned:{},parent:r,base:e,draft:null,drafts:{},copy:null,revoke:null},o=Array.isArray(e)?Proxy.revocable([n],F):Proxy.revocable(n,x),i=o.revoke,a=o.proxy;return n.draft=a,n.revoke=i,t.drafts.push(a),a}var x={get:function(e,r){if(r===o)return e;var t=e.drafts;if(!e.modified&&l(t,r))return t[r];var n=R(e)[r];if(e.finalized||!a(n))return n;if(e.modified){if(n!==e.base[r])return n;t=e.copy}return t[r]=k(n,e)},has:function(e,r){return r in R(e)},ownKeys:function(e){return Reflect.ownKeys(R(e))},set:function(e,r,t){if(!e.modified){var n=t?d(e.base[r],t)||t===e.drafts[r]:d(e.base[r],t)&&r in e.base;if(n)return!0;I(e)}return e.assigned[r]=!0,e.copy[r]=t,!0},deleteProperty:function(e,r){(void 0!==e.base[r]||r in e.base)&&(e.assigned[r]=!1,I(e));e.copy&&delete e.copy[r];return!0},getOwnPropertyDescriptor:function(e,r){var t=R(e),n=Reflect.getOwnPropertyDescriptor(t,r);n&&(n.writable=!0,n.configurable=!Array.isArray(t)||"length"!==r);return n},defineProperty:function(){throw new Error("Object.defineProperty() cannot be used on an Immer draft")},getPrototypeOf:function(e){return Object.getPrototypeOf(e.base)},setPrototypeOf:function(){throw new Error("Object.setPrototypeOf() cannot be used on an Immer draft")}},F={};function R(e){return e.copy||e.base}function I(e){e.modified||(e.modified=!0,e.copy=s(c(e.base),e.drafts),e.drafts=null,e.parent&&I(e.parent))}u(x,function(e,r){F[e]=function(){return arguments[0]=arguments[0][0],r.apply(this,arguments)}}),F.deleteProperty=function(e,r){if(isNaN(parseInt(r)))throw new Error("Immer only supports deleting array indices");return x.deleteProperty.call(this,e[0],r)},F.set=function(e,r,t){if("length"!==r&&isNaN(parseInt(r)))throw new Error("Immer only supports setting array indices and the 'length' property");return x.set.call(this,e[0],r,t)};var N=Object.freeze({willFinalize:function(){},createProxy:k});function S(e,r,t,n){Array.isArray(e.base)?function(e,r,t,n){var o,i,a=e.base,s=e.copy,f=e.assigned;s.length<a.length&&(a=(o=[s,a])[0],s=o[1],t=(i=[n,t])[0],n=i[1]);var c=s.length-a.length,u=0;for(;a[u]===s[u]&&u<a.length;)++u;var p=a.length;for(;p>u&&a[p-1]===s[p+c-1];)--p;for(var l=u;l<p;++l)if(f[l]&&s[l]!==a[l]){var d=r.concat([l]);t.push({op:"replace",path:d,value:s[l]}),n.push({op:"replace",path:d,value:a[l]})}for(var h=p!=a.length,y=t.length,v=p+c-1;v>=p;--v){var b=r.concat([v]);t[y+v-p]={op:"add",path:b,value:s[v]},h&&n.push({op:"remove",path:b})}h||n.push({op:"replace",path:r.concat(["length"]),value:a.length})}(e,r,t,n):function(e,r,t,n){var o=e.base,i=e.copy;u(e.assigned,function(e,a){var s=o[e],f=i[e],c=a?e in o?"replace":"add":"remove";if(s!==f||"replace"!==c){var u=r.concat(e);t.push("remove"===c?{op:c,path:u}:{op:c,path:u,value:f}),n.push("add"===c?{op:"remove",path:u}:"remove"===c?{op:"add",path:u,value:s}:{op:"replace",path:u,value:s})}})}(e,r,t,n)}function _(e,r){for(var t=0;t<r.length;t++){var n=r[t],o=n.path;if(0===o.length&&"replace"===n.op)e=n.value;else{for(var i=e,a=0;a<o.length-1;a++)if(!(i=i[o[a]])||"object"!=typeof i)throw new Error("Cannot apply patch, path doesn't resolve: "+o.join("/"));var s=o[o.length-1];switch(n.op){case"replace":i[s]=n.value;break;case"add":Array.isArray(i)?i.splice(s,0,n.value):i[s]=n.value;break;case"remove":Array.isArray(i)?i.splice(s,1):delete i[s];break;default:throw new Error("Unsupported patch operation: "+n.op)}}}return e}var T={useProxies:"undefined"!=typeof Proxy&&"undefined"!=typeof Reflect,autoFreeze:"undefined"!=typeof process?"production"!==process.env.NODE_ENV:"verifyMinified"===function(){}.name,onAssign:null,onDelete:null,onCopy:null},C=function(e){s(this,T,e),this.setUseProxies(this.useProxies),this.produce=this.produce.bind(this)};C.prototype.produce=function(e,r,n){var o,i=this;if("function"==typeof e&&"function"!=typeof r){var s=r;return r=e,function(e){void 0===e&&(e=s);for(var t=[],n=arguments.length-1;n-- >0;)t[n]=arguments[n+1];return i.produce(e,function(e){return r.call.apply(r,[e,e].concat(t))})}}if("function"!=typeof r)throw new Error("The first or second argument to `produce` must be a function");if(void 0!==n&&"function"!=typeof n)throw new Error("The third argument to `produce` must be a function or undefined");if(a(e)){var f=h.enter(),c=this.createProxy(e),u=!0;try{o=r.call(c,c),u=!1}finally{u?f.revoke():f.leave()}return o instanceof Promise?o.then(function(e){return f.usePatches(n),i.processResult(e,f)},function(e){throw f.revoke(),e}):(f.usePatches(n),this.processResult(o,f))}return void 0===(o=r(e))?e:o!==t?o:void 0},C.prototype.createDraft=function(e){if(!a(e))throw new Error("First argument to `createDraft` must be a plain object, an array, or an immerable object");var r=h.enter(),t=this.createProxy(e);return t[o].isManual=!0,r.leave(),t},C.prototype.finishDraft=function(e,r){var t=e&&e[o];if(!t||!t.isManual)throw new Error("First argument to `finishDraft` must be a draft returned by `createDraft`");if(t.finalized)throw new Error("The given draft is already finalized");var n=t.scope;return n.usePatches(r),this.processResult(void 0,n)},C.prototype.setAutoFreeze=function(e){this.autoFreeze=e},C.prototype.setUseProxies=function(e){this.useProxies=e,s(this,e?N:D)},C.prototype.applyPatches=function(e,r){return i(e)?_(e,r):this.produce(e,function(e){return _(e,r)})},C.prototype.processResult=function(e,r){var n=r.drafts[0],i=void 0!==e&&e!==n;if(this.willFinalize(r,e,i),i){if(n[o].modified)throw r.revoke(),new Error("An immer producer returned a new value *and* modified its draft. Either return a new value *or* modify the draft.");a(e)&&(e=this.finalize(e,null,r)),r.patches&&(r.patches.push({op:"replace",path:[],value:e}),r.inversePatches.push({op:"replace",path:[],value:n[o].base}))}else e=this.finalize(n,[],r);return r.revoke(),r.patches&&r.patchListener(r.patches,r.inversePatches),e!==t?e:void 0},C.prototype.finalize=function(e,r,t){var n=this,i=e[o];if(!i)return Object.isFrozen(e)?e:this.finalizeTree(e,null,t);if(i.scope!==t)return e;if(!i.modified)return i.base;if(!i.finalized){if(i.finalized=!0,this.finalizeTree(i.draft,r,t),this.onDelete)if(this.useProxies){var a=i.assigned;for(var s in a)a[s]||this.onDelete(i,s)}else{var f=i.base,c=i.copy;u(f,function(e){l(c,e)||n.onDelete(i,e)})}this.onCopy&&this.onCopy(i),this.autoFreeze&&t.canAutoFreeze&&Object.freeze(i.copy),r&&t.patches&&S(i,r,t.patches,t.inversePatches)}return i.copy},C.prototype.finalizeTree=function(e,r,t){var n=this,s=e[o];s&&(this.useProxies||(s.finalizing=!0,s.copy=c(s.draft,!0),s.finalizing=!1),e=s.copy);var f=!!r&&!!t.patches,l=function(o,c,h){if(c===h)throw Error("Immer forbids circular references");var y=!!s&&h===e;if(i(c)){var v=y&&f&&!s.assigned[o]?r.concat(o):null;if(i(c=n.finalize(c,v,t))&&(t.canAutoFreeze=!1),Array.isArray(h)||p(h,o)?h[o]=c:Object.defineProperty(h,o,{value:c}),y&&c===s.base[o])return}else{if(y&&d(c,s.base[o]))return;a(c)&&!Object.isFrozen(c)&&u(c,l)}y&&n.onAssign&&n.onAssign(s,o,c)};return u(e,l),e};var U=new C,K=U.produce,M=U.setAutoFreeze.bind(U),L=U.setUseProxies.bind(U),$=U.applyPatches.bind(U),J=U.createDraft.bind(U),V=U.finishDraft.bind(U);e.produce=K,e.default=K,e.setAutoFreeze=M,e.setUseProxies=L,e.applyPatches=$,e.createDraft=J,e.finishDraft=V,e.Immer=C,e.original=function(e){if(e&&e[o])return e[o].base},e.isDraft=i,e.isDraftable=a,e.nothing=t,e.immerable=n,Object.defineProperty(e,"__esModule",{value:!0})}); | ||
//# sourceMappingURL=immer.umd.js.map |
{ | ||
"name": "immer", | ||
"version": "2.1.1", | ||
"version": "2.1.2", | ||
"description": "Create your next immutable state by mutating the current one", | ||
"main": "dist/immer.js", | ||
"umd:main": "dist/immer.umd.js", | ||
"module": "dist/immer.module.js", | ||
"jsnext:main": "dist/immer.module.js", | ||
"react-native": "dist/immer.module.js", | ||
"module": "dist/immer.mjs", | ||
"jsnext:main": "dist/immer.mjs", | ||
"react-native": "dist/immer.mjs", | ||
"types": "./dist/immer.d.ts", | ||
@@ -18,4 +18,3 @@ "scripts": { | ||
"coveralls": "jest --coverage && cat ./coverage/lcov.info | ./node_modules/.bin/coveralls && rm -rf ./coverage", | ||
"build": "rimraf dist/ && yarn-or-npm rollup && yarn-or-npm typed", | ||
"rollup": "cross-env NODE_ENV=production rollup -c", | ||
"build": "rimraf dist/ && yarn-or-npm bili && yarn-or-npm typed", | ||
"typed": "cpx 'src/immer.{d.ts,js.flow}' dist -v" | ||
@@ -47,10 +46,11 @@ }, | ||
"devDependencies": { | ||
"@types/jest": "^22.2.3", | ||
"babel-cli": "^6.26.0", | ||
"babel-core": "^6.26.0", | ||
"babel-jest": "^22.0.4", | ||
"babel-plugin-external-helpers": "^6.22.0", | ||
"babel-preset-env": "^1.6.1", | ||
"babel-preset-es2015": "^6.24.1", | ||
"babel-preset-modern-browsers": "^10.0.1", | ||
"@babel/cli": "^7.2.3", | ||
"@babel/core": "^7.3.4", | ||
"@babel/node": "^7.2.2", | ||
"@babel/plugin-external-helpers": "^7.2.0", | ||
"@babel/preset-env": "^7.3.4", | ||
"@types/jest": "^24.0.11", | ||
"babel-jest": "^24.4.0", | ||
"babel-preset-modern-browsers": "^13.1.0", | ||
"bili": "^4.2.5", | ||
"coveralls": "^3.0.0", | ||
@@ -63,3 +63,3 @@ "cpx": "^1.5.0", | ||
"immutable": "^3.8.2", | ||
"jest": "^22.0.4", | ||
"jest": "^24.4.0", | ||
"lodash": "^4.17.4", | ||
@@ -71,14 +71,10 @@ "lodash.clonedeep": "^4.5.0", | ||
"rimraf": "^2.6.2", | ||
"rollup": "^0.54.0", | ||
"rollup-plugin-babel": "^3.0.3", | ||
"rollup-plugin-commonjs": "^8.2.6", | ||
"rollup-plugin-filesize": "^1.5.0", | ||
"rollup-plugin-node-resolve": "^3.0.2", | ||
"rollup-plugin-uglify": "^2.0.1", | ||
"seamless-immutable": "^7.1.3", | ||
"typescript": "3.1.1", | ||
"uglify-es": "^3.3.6", | ||
"yarn-or-npm": "^2.0.4" | ||
}, | ||
"jest": { | ||
"moduleFileExtensions": [ | ||
"js" | ||
], | ||
"testURL": "http://localhost", | ||
@@ -85,0 +81,0 @@ "transform": { |
Sorry, the diff of this file is not supported yet
Sorry, the diff of this file is not supported yet
License Policy Violation
LicenseThis package is not allowed per your license policy. Review the package's license to ensure compliance.
Found 1 instance in 1 package
Major refactor
Supply chain riskPackage has recently undergone a major refactor. It may be unstable or indicate significant internal changes. Use caution when updating to versions that include significant changes.
Found 1 instance in 1 package
License Policy Violation
LicenseThis package is not allowed per your license policy. Review the package's license to ensure compliance.
Found 1 instance in 1 package
26
296714
2021
1