{"version":3,"sources":["jsdelivr-header.js","/npm/tree-changes@0.11.3/src/index.ts","/npm/tree-changes@0.11.3/src/helpers.ts"],"names":[],"mappings":"AAAA;AACA;AACA;AACA;AACA;AACA;AACA,svBCNA,cAAA,GAAA,SAAA,cAAA,CAAA,QAAA,IAAA,cAAA,OAAA,QAAA,aAAA,eAAA,IAAA,mBAAkB,QAAA,QAAA,2BAClB,gBAAe,QAAA,QAAA,YCDf,kBAAkB,QAAA,QAAA,2BAClB,eAAe,QAAA,QAAA,YAIR,SAAS,iBAAiB,GAC/B,OAAO,EAAW,OAAO,GAAe,eAAA,QAAG,OAAO,IAAM,eAAA,QAAG,MAAM,IAAM,eAAA,QAAG,YAAY,IACxF,CAEO,SAAS,cAAc,EAAY,EAAa,GACrD,QAAK,WAAW,EAAM,KAIlB,CAAC,EAAM,GAAO,MAAM,eAAA,QAAG,QACjB,EAAK,KAAK,SAAS,KAAW,EAAM,KAAK,SAAS,IAIxD,CAAC,EAAM,GAAO,MAAM,eAAA,QAAG,cAEtB,OAAO,QAAQ,GAAM,KAAK,SAAS,KAAW,OAAO,QAAQ,GAAO,KAAK,SAAS,IAIhF,IAAU,EACnB,CAEO,SAAS,eACd,EACA,EACA,GAEA,MAAM,OAAE,EAAA,IAAQ,EAAA,SAAK,EAAA,KAAU,GAAS,EAClC,EAAO,OAAO,EAAc,GAC5B,EAAQ,OAAO,EAAM,GAE3B,IAAI,EACF,CAAC,EAAM,GAAO,MAAM,eAAA,QAAG,UAAqB,cAAT,EAAuB,EAAO,EAAQ,EAAO,GAUlF,OARK,eAAA,QAAG,UAAU,KAChB,EAAU,GAAW,IAAU,GAG5B,eAAA,QAAG,UAAU,KAChB,EAAU,GAAW,IAAS,GAGzB,CACT,CAEO,SAAS,cACd,EACA,EACA,GAEA,MAAM,IAAE,EAAA,KAAK,EAAA,MAAM,GAAU,EAEvB,EAAO,OAAO,EAAc,GAC5B,EAAQ,OAAO,EAAM,GACrB,EAAmB,UAAT,EAAmB,EAAO,EACpC,EAAqB,UAAT,EAAmB,EAAQ,EAE7C,OAAK,eAAA,QAAG,gBAAgB,GAapB,CAAC,EAAM,GAAO,MAAM,eAAA,QAAG,QACjB,EAAU,MAAM,iBAAiB,IAGvC,CAAC,EAAM,GAAO,MAAM,eAAA,QAAG,aAClB,aAAa,OAAO,KAAK,GAAU,OAAO,KAAK,KAIrD,CAAC,EAAM,GAAO,OAAM,GAAK,eAAA,QAAG,UAAU,IAAM,eAAA,QAAG,QAAQ,OAC9C,UAAT,GACI,eAAA,QAAG,QAAQ,IAAS,eAAA,QAAG,QAAQ,GAChC,eAAA,QAAG,QAAQ,KAAU,eAAA,QAAG,QAAQ,IAxBhC,eAAA,QAAG,QAAQ,MAET,eAAA,QAAG,MAAM,KAAY,eAAA,QAAG,YAAY,KAC/B,cAAc,EAAS,EAAW,IAG3C,EAAO,kBAAA,SAAM,EAAW,EAoB9B,CAEO,SAAS,aAAsB,EAAoB,GAAY,IAAE,GAAoB,CAAC,GAC3F,IAAI,EAAO,OAAO,EAAc,GAC5B,EAAQ,OAAO,EAAM,GAEzB,IAAK,WAAW,EAAM,GACpB,MAAM,IAAI,UAAU,+BAGtB,IAAK,cAAc,EAAM,GACvB,MAAM,IAAI,UAAU,4BAQtB,MALI,CAAC,EAAM,GAAO,MAAM,eAAA,QAAG,eACzB,EAAO,OAAO,KAAK,GACnB,EAAQ,OAAO,KAAK,IAGf,CAAC,EAAM,EAChB,CAEO,SAAS,SAAS,GACvB,MAAO,EAAE,EAAK,KACR,eAAA,QAAG,MAAM,IACX,EACE,kBAAA,SAAM,EAAO,IACb,EAAM,MAAK,IAAA,EAAK,kBAAA,SAAM,EAAG,IAAW,eAAA,QAAG,MAAM,IAAU,iBAAiB,EAAjB,CAAwB,KAK/E,eAAA,QAAG,YAAY,IAAU,EAAM,KACxB,EAAM,KAAG,EAAK,kBAAA,SAAM,EAAM,GAAM,IAG3C,EAAO,kBAAA,SAAM,EAAO,EAExB,CAEO,SAAS,aAAa,EAAgB,GAC3C,OAAO,EAAM,MAAK,IAAM,EAAK,SAAS,IACxC,CAEO,SAAS,SAAS,GACvB,OAAQ,GACF,eAAA,QAAG,MAAM,GACJ,EAAM,MAAK,IAAA,EAAK,kBAAA,SAAM,EAAG,IAAW,eAAA,QAAG,MAAM,IAAU,iBAAiB,EAAjB,CAAwB,MAGxF,EAAO,kBAAA,SAAM,EAAO,EAExB,CAEO,SAAS,mBAAsB,EAAwB,GAC5D,OAAO,eAAA,QAAG,MAAM,GACZ,EAAc,MAAK,IAAA,EAAK,kBAAA,SAAM,EAAG,MAAM,EACvC,kBAAA,SAAM,EAAe,EAC3B,CAEO,SAAS,iBAAiB,GAC/B,OAAQ,GAAmB,EAAK,MAAK,IAAA,EAAK,kBAAA,SAAM,EAAG,IACrD,CAEO,SAAS,cAAc,GAC5B,OACE,EAAW,MAAM,eAAA,QAAG,QACpB,EAAW,MAAM,eAAA,QAAG,SACpB,EAAW,MAAM,eAAA,QAAG,cACpB,EAAW,MAAM,eAAA,QAAG,OAExB,CAEO,SAAS,OAAgC,EAAS,GAEvD,GAAI,eAAA,QAAG,YAAY,IAAS,eAAA,QAAG,MAAM,GAAO,CAE1C,GAAI,eAAA,QAAG,OAAO,GAAW,CAGvB,OAF0B,EAAS,MAAM,KAE5B,QAAO,CAAC,EAAK,IAAM,GAAO,EAAI,IAAI,EACjD,CAGA,OAAI,eAAA,QAAG,OAAO,GACL,EAAK,GAGP,CACT,CAEA,OAAO,CACT,CDhLe,SAAR,YACL,EACA,GAEA,GAAI,CAAC,EAAc,GAAM,KAAK,gBAAA,QAAG,iBAC/B,MAAM,IAAI,MAAM,+BAGlB,IAAK,CAAC,EAAc,GAAM,OAAM,GAAK,gBAAA,QAAG,YAAY,IAAM,gBAAA,QAAG,MAAM,KACjE,MAAM,IAAI,MAAM,mCAoHlB,MAAO,CAAE,MAjHK,CAAC,EAAS,KACtB,IACE,OAAO,cAAiB,EAAc,EAAM,CAAE,MAAK,KAAM,QAAS,SACpE,OAEE,OAAO,CACT,GA2Gc,QAxGA,CAAC,EAAkB,EAAgB,KACjD,IACE,MAAM,EAAO,OAAO,EAAc,GAC5B,EAAQ,OAAO,EAAM,GACrB,EAAY,gBAAA,QAAG,QAAQ,GACvB,EAAc,gBAAA,QAAG,QAAQ,GAE/B,GAAI,GAAa,EAAa,CAC5B,MAAM,EAAiB,EACnB,mBAAmB,EAAU,IAC5B,mBAAmB,EAAQ,GAC1B,EAAkB,mBAAmB,EAAQ,GAEnD,OAAO,GAAkB,CAC3B,CAEA,MAAI,CAAC,EAAM,GAAO,MAAM,gBAAA,QAAG,QAAU,CAAC,EAAM,GAAO,MAAM,gBAAA,QAAG,eACnD,EAAC,mBAAA,SAAM,EAAM,GAGf,IAAS,CAClB,OAEE,OAAO,CACT,GAgFuB,YA7EL,CAAC,EAAiB,EAAiB,KACrD,IAAK,gBAAA,QAAG,QAAQ,GACd,OAAO,EAGT,IACE,MAAM,EAAO,OAAO,EAAc,GAC5B,EAAQ,OAAO,EAAM,GACrB,EAAY,gBAAA,QAAG,QAAQ,GAE7B,OACE,mBAAmB,EAAU,KAC5B,EAAY,mBAAmB,EAAQ,IAAU,EAEtD,OAEE,OAAO,CACT,GA4DoC,UAzDpB,CAAC,EAAQ,EAAgB,KACzC,IAAK,gBAAA,QAAG,QAAQ,GACd,OAAO,EAGT,IACE,OAAO,eAAkB,EAAc,EAAM,CAAE,MAAK,SAAQ,WAAU,KAAM,aAC9E,OAEE,OAAO,CACT,GA+C+C,QA5ChC,IACf,IACE,MAAO,EAAM,GAAS,aAAa,EAAc,EAAM,CAAE,QAEzD,QAAS,EAAK,SAAW,EAAM,MACjC,OAEE,OAAO,CACT,GAoCwD,OAjC1C,IACd,IACE,MAAO,EAAM,GAAS,aAAa,EAAc,EAAM,CAAE,QAEzD,OAAQ,EAAK,UAAY,EAAM,MACjC,OAEE,OAAO,CACT,GAyBgE,UAtBhD,CAAC,EAAQ,EAAgB,KACzC,IAAK,gBAAA,QAAG,QAAQ,GACd,OAAO,EAGT,IACE,OAAO,eAAkB,EAAc,EAAM,CAAE,MAAK,SAAQ,WAAU,KAAM,aAC9E,OAEE,OAAO,CACT,GAY2E,QAT7D,CAAC,EAAS,KACxB,IACE,OAAO,cAAiB,EAAc,EAAM,CAAE,MAAK,KAAM,UAAW,SACtE,OAEE,OAAO,CACT,GAIJ,C","file":"/npm/tree-changes@0.11.3/dist/index.js","sourceRoot":"","sourcesContent":["/**\n * Minified by jsDelivr using Terser v5.37.0.\n * Original file: /npm/tree-changes@0.11.3/dist/index.js\n *\n * Do NOT use SRI with dynamically generated files! More information: https://www.jsdelivr.com/using-sri-with-dynamic-files\n */\n","import equal from '@gilbarbara/deep-equal';\nimport is from 'is-lite';\n\nimport { compareNumbers, compareValues, getIterables, includesOrEqualsTo, nested } from './helpers';\nimport { Data, KeyType, TreeChanges, Value } from './types';\n\nexport default function treeChanges<P extends Data, D extends Data, K = KeyType<P, D>>(\n  previousData: P,\n  data: D,\n): TreeChanges<K> {\n  if ([previousData, data].some(is.nullOrUndefined)) {\n    throw new Error('Missing required parameters');\n  }\n\n  if (![previousData, data].every(d => is.plainObject(d) || is.array(d))) {\n    throw new Error('Expected plain objects or array');\n  }\n\n  const added = (key?: K, value?: Value): boolean => {\n    try {\n      return compareValues<K>(previousData, data, { key, type: 'added', value });\n    } catch {\n      /* istanbul ignore next */\n      return false;\n    }\n  };\n\n  const changed = (key?: K | string, actual?: Value, previous?: Value): boolean => {\n    try {\n      const left = nested(previousData, key);\n      const right = nested(data, key);\n      const hasActual = is.defined(actual);\n      const hasPrevious = is.defined(previous);\n\n      if (hasActual || hasPrevious) {\n        const leftComparator = hasPrevious\n          ? includesOrEqualsTo(previous, left)\n          : !includesOrEqualsTo(actual, left);\n        const rightComparator = includesOrEqualsTo(actual, right);\n\n        return leftComparator && rightComparator;\n      }\n\n      if ([left, right].every(is.array) || [left, right].every(is.plainObject)) {\n        return !equal(left, right);\n      }\n\n      return left !== right;\n    } catch {\n      /* istanbul ignore next */\n      return false;\n    }\n  };\n\n  const changedFrom = (key: K | string, previous: Value, actual?: Value): boolean => {\n    if (!is.defined(key)) {\n      return false;\n    }\n\n    try {\n      const left = nested(previousData, key);\n      const right = nested(data, key);\n      const hasActual = is.defined(actual);\n\n      return (\n        includesOrEqualsTo(previous, left) &&\n        (hasActual ? includesOrEqualsTo(actual, right) : !hasActual)\n      );\n    } catch {\n      /* istanbul ignore next */\n      return false;\n    }\n  };\n\n  const decreased = (key: K, actual?: Value, previous?: Value): boolean => {\n    if (!is.defined(key)) {\n      return false;\n    }\n\n    try {\n      return compareNumbers<K>(previousData, data, { key, actual, previous, type: 'decreased' });\n    } catch {\n      /* istanbul ignore next */\n      return false;\n    }\n  };\n\n  const emptied = (key?: K): boolean => {\n    try {\n      const [left, right] = getIterables(previousData, data, { key });\n\n      return !!left.length && !right.length;\n    } catch {\n      /* istanbul ignore next */\n      return false;\n    }\n  };\n\n  const filled = (key?: K): boolean => {\n    try {\n      const [left, right] = getIterables(previousData, data, { key });\n\n      return !left.length && !!right.length;\n    } catch {\n      /* istanbul ignore next */\n      return false;\n    }\n  };\n\n  const increased = (key: K, actual?: Value, previous?: Value): boolean => {\n    if (!is.defined(key)) {\n      return false;\n    }\n\n    try {\n      return compareNumbers<K>(previousData, data, { key, actual, previous, type: 'increased' });\n    } catch {\n      /* istanbul ignore next */\n      return false;\n    }\n  };\n\n  const removed = (key?: K, value?: Value): boolean => {\n    try {\n      return compareValues<K>(previousData, data, { key, type: 'removed', value });\n    } catch {\n      /* istanbul ignore next */\n      return false;\n    }\n  };\n\n  return { added, changed, changedFrom, decreased, emptied, filled, increased, removed };\n}\n\nexport type { Data, KeyType, TreeChanges, Value } from './types';\n","import equal from '@gilbarbara/deep-equal';\nimport is from 'is-lite';\n\nimport { CompareValuesOptions, Data, Key, Options, ValidTypes, Value } from './types';\n\nexport function canHaveLength(...arguments_: any): boolean {\n  return arguments_.every((d: unknown) => is.string(d) || is.array(d) || is.plainObject(d));\n}\n\nexport function checkEquality(left: Data, right: Data, value: Value) {\n  if (!isSameType(left, right)) {\n    return false;\n  }\n\n  if ([left, right].every(is.array)) {\n    return !left.some(hasValue(value)) && right.some(hasValue(value));\n  }\n\n  /* istanbul ignore else */\n  if ([left, right].every(is.plainObject)) {\n    return (\n      !Object.entries(left).some(hasEntry(value)) && Object.entries(right).some(hasEntry(value))\n    );\n  }\n\n  return right === value;\n}\n\nexport function compareNumbers<K = Key>(\n  previousData: Data,\n  data: Data,\n  options: Options<K>,\n): boolean {\n  const { actual, key, previous, type } = options;\n  const left = nested(previousData, key);\n  const right = nested(data, key);\n\n  let changed =\n    [left, right].every(is.number) && (type === 'increased' ? left < right : left > right);\n\n  if (!is.undefined(actual)) {\n    changed = changed && right === actual;\n  }\n\n  if (!is.undefined(previous)) {\n    changed = changed && left === previous;\n  }\n\n  return changed;\n}\n\nexport function compareValues<K = Key>(\n  previousData: Data,\n  data: Data,\n  options: CompareValuesOptions<K>,\n) {\n  const { key, type, value } = options;\n\n  const left = nested(previousData, key);\n  const right = nested(data, key);\n  const primary = type === 'added' ? left : right;\n  const secondary = type === 'added' ? right : left;\n\n  if (!is.nullOrUndefined(value)) {\n    if (is.defined(primary)) {\n      // check if nested data matches\n      if (is.array(primary) || is.plainObject(primary)) {\n        return checkEquality(primary, secondary, value);\n      }\n    } else {\n      return equal(secondary, value);\n    }\n\n    return false;\n  }\n\n  if ([left, right].every(is.array)) {\n    return !secondary.every(isEqualPredicate(primary));\n  }\n\n  if ([left, right].every(is.plainObject)) {\n    return hasExtraKeys(Object.keys(primary), Object.keys(secondary));\n  }\n\n  return (\n    ![left, right].every(d => is.primitive(d) && is.defined(d)) &&\n    (type === 'added'\n      ? !is.defined(left) && is.defined(right)\n      : is.defined(left) && !is.defined(right))\n  );\n}\n\nexport function getIterables<K = Key>(previousData: Data, data: Data, { key }: Options<K> = {}) {\n  let left = nested(previousData, key);\n  let right = nested(data, key);\n\n  if (!isSameType(left, right)) {\n    throw new TypeError('Inputs have different types');\n  }\n\n  if (!canHaveLength(left, right)) {\n    throw new TypeError(\"Inputs don't have length\");\n  }\n\n  if ([left, right].every(is.plainObject)) {\n    left = Object.keys(left);\n    right = Object.keys(right);\n  }\n\n  return [left, right];\n}\n\nexport function hasEntry(input: Value) {\n  return ([key, value]: [string, Value]) => {\n    if (is.array(input)) {\n      return (\n        equal(input, value) ||\n        input.some(d => equal(d, value) || (is.array(value) && isEqualPredicate(value)(d)))\n      );\n    }\n\n    /* istanbul ignore else */\n    if (is.plainObject(input) && input[key]) {\n      return !!input[key] && equal(input[key], value);\n    }\n\n    return equal(input, value);\n  };\n}\n\nexport function hasExtraKeys(left: string[], right: string[]): boolean {\n  return right.some(d => !left.includes(d));\n}\n\nexport function hasValue(input: Value) {\n  return (value: Value) => {\n    if (is.array(input)) {\n      return input.some(d => equal(d, value) || (is.array(value) && isEqualPredicate(value)(d)));\n    }\n\n    return equal(input, value);\n  };\n}\n\nexport function includesOrEqualsTo<T>(previousValue: T | T[], value: T): boolean {\n  return is.array(previousValue)\n    ? previousValue.some(d => equal(d, value))\n    : equal(previousValue, value);\n}\n\nexport function isEqualPredicate(data: unknown[]) {\n  return (value: unknown) => data.some(d => equal(d, value));\n}\n\nexport function isSameType(...arguments_: ValidTypes[]): boolean {\n  return (\n    arguments_.every(is.array) ||\n    arguments_.every(is.number) ||\n    arguments_.every(is.plainObject) ||\n    arguments_.every(is.string)\n  );\n}\n\nexport function nested<T extends Data, K = Key>(data: T, property?: K) {\n  /* istanbul ignore else */\n  if (is.plainObject(data) || is.array(data)) {\n    /* istanbul ignore else */\n    if (is.string(property)) {\n      const props: Array<any> = property.split('.');\n\n      return props.reduce((acc, d) => acc && acc[d], data);\n    }\n\n    /* istanbul ignore else */\n    if (is.number(property)) {\n      return data[property];\n    }\n\n    return data;\n  }\n\n  return data;\n}\n"]}