{"version":3,"file":"single-spa.min.cjs","sources":["../../../node_modules/.pnpm/custom-event@1.0.1/node_modules/custom-event/index.js","../../../src/applications/app-errors.js","../../../src/applications/app.helpers.js","../../../src/utils/assign.js","../../../src/utils/find.js","../../../src/lifecycles/lifecycle.helpers.js","../../../src/devtools/profiler.js","../../../src/lifecycles/bootstrap.js","../../../src/lifecycles/unmount.js","../../../src/lifecycles/mount.js","../../../src/parcels/mount-parcel.js","../../../src/lifecycles/update.js","../../../src/lifecycles/prop.helpers.js","../../../src/applications/timeouts.js","../../../src/lifecycles/load.js","../../../src/utils/runtime-environment.js","../../../src/navigation/navigation-events.js","../../../src/jquery-support.js","../../../src/lifecycles/unload.js","../../../src/applications/apps.js","../../../src/navigation/reroute.js","../../../src/start.js","../../../src/devtools/devtools.js","../../../src/single-spa.js"],"sourcesContent":["\nvar NativeCustomEvent = global.CustomEvent;\n\nfunction useNative () {\n  try {\n    var p = new NativeCustomEvent('cat', { detail: { foo: 'bar' } });\n    return  'cat' === p.type && 'bar' === p.detail.foo;\n  } catch (e) {\n  }\n  return false;\n}\n\n/**\n * Cross-browser `CustomEvent` constructor.\n *\n * https://developer.mozilla.org/en-US/docs/Web/API/CustomEvent.CustomEvent\n *\n * @public\n */\n\nmodule.exports = useNative() ? NativeCustomEvent :\n\n// IE >= 9\n'undefined' !== typeof document && 'function' === typeof document.createEvent ? function CustomEvent (type, params) {\n  var e = document.createEvent('CustomEvent');\n  if (params) {\n    e.initCustomEvent(type, params.bubbles, params.cancelable, params.detail);\n  } else {\n    e.initCustomEvent(type, false, false, void 0);\n  }\n  return e;\n} :\n\n// IE <= 8\nfunction CustomEvent (type, params) {\n  var e = document.createEventObject();\n  e.type = type;\n  if (params) {\n    e.bubbles = Boolean(params.bubbles);\n    e.cancelable = Boolean(params.cancelable);\n    e.detail = params.detail;\n  } else {\n    e.bubbles = false;\n    e.cancelable = false;\n    e.detail = void 0;\n  }\n  return e;\n}\n","import { objectType, toName } from \"./app.helpers\";\n\nlet errorHandlers = [];\n\nexport function handleAppError(err, app, newStatus) {\n  const transformedErr = transformErr(err, app, newStatus);\n\n  if (errorHandlers.length) {\n    errorHandlers.forEach((handler) => handler(transformedErr));\n  } else {\n    setTimeout(() => {\n      throw transformedErr;\n    });\n  }\n}\n\nexport function addErrorHandler(handler) {\n  if (typeof handler !== \"function\") {\n    throw Error(\n      formatErrorMessage(\n        28,\n        __DEV__ && \"a single-spa error handler must be a function\"\n      )\n    );\n  }\n\n  errorHandlers.push(handler);\n}\n\nexport function removeErrorHandler(handler) {\n  if (typeof handler !== \"function\") {\n    throw Error(\n      formatErrorMessage(\n        29,\n        __DEV__ && \"a single-spa error handler must be a function\"\n      )\n    );\n  }\n\n  let removedSomething = false;\n  errorHandlers = errorHandlers.filter((h) => {\n    const isHandler = h === handler;\n    removedSomething = removedSomething || isHandler;\n    return !isHandler;\n  });\n\n  return removedSomething;\n}\n\nexport function formatErrorMessage(code, msg, ...args) {\n  return `single-spa minified message #${code}: ${\n    msg ? msg + \" \" : \"\"\n  }See https://single-spa.js.org/error/?code=${code}${\n    args.length ? `&arg=${args.join(\"&arg=\")}` : \"\"\n  }`;\n}\n\nexport function transformErr(ogErr, appOrParcel, newStatus) {\n  const errPrefix = `${objectType(appOrParcel)} '${toName(\n    appOrParcel\n  )}' died in status ${appOrParcel.status}: `;\n\n  let result;\n\n  if (ogErr instanceof Error) {\n    try {\n      ogErr.message = errPrefix + ogErr.message;\n    } catch (err) {\n      /* Some errors have read-only message properties, in which case there is nothing\n       * that we can do.\n       */\n    }\n    result = ogErr;\n  } else {\n    console.warn(\n      formatErrorMessage(\n        30,\n        __DEV__ &&\n          `While ${appOrParcel.status}, '${toName(\n            appOrParcel\n          )}' rejected its lifecycle function promise with a non-Error. This will cause stack traces to not be accurate.`,\n        appOrParcel.status,\n        toName(appOrParcel)\n      )\n    );\n    try {\n      result = Error(errPrefix + JSON.stringify(ogErr));\n    } catch (err) {\n      // If it's not an Error and you can't stringify it, then what else can you even do to it?\n      result = ogErr;\n    }\n  }\n\n  result.appOrParcelName = toName(appOrParcel);\n\n  // We set the status after transforming the error so that the error message\n  // references the state the application was in before the status change.\n  appOrParcel.status = newStatus;\n\n  return result;\n}\n","import { handleAppError } from \"./app-errors.js\";\n\n// App statuses\nexport const NOT_LOADED = \"NOT_LOADED\";\nexport const LOADING_SOURCE_CODE = \"LOADING_SOURCE_CODE\";\nexport const NOT_BOOTSTRAPPED = \"NOT_BOOTSTRAPPED\";\nexport const BOOTSTRAPPING = \"BOOTSTRAPPING\";\nexport const NOT_MOUNTED = \"NOT_MOUNTED\";\nexport const MOUNTING = \"MOUNTING\";\nexport const MOUNTED = \"MOUNTED\";\nexport const UPDATING = \"UPDATING\";\nexport const UNMOUNTING = \"UNMOUNTING\";\nexport const UNLOADING = \"UNLOADING\";\nexport const LOAD_ERROR = \"LOAD_ERROR\";\nexport const SKIP_BECAUSE_BROKEN = \"SKIP_BECAUSE_BROKEN\";\n\nexport function isActive(app) {\n  return app.status === MOUNTED;\n}\n\nexport function shouldBeActive(app) {\n  try {\n    return app.activeWhen(window.location);\n  } catch (err) {\n    handleAppError(err, app, SKIP_BECAUSE_BROKEN);\n    return false;\n  }\n}\n\nexport function toName(app) {\n  return app.name;\n}\n\nexport function isParcel(appOrParcel) {\n  return Boolean(appOrParcel.unmountThisParcel);\n}\n\nexport function objectType(appOrParcel) {\n  return isParcel(appOrParcel) ? \"parcel\" : \"application\";\n}\n","// Object.assign() is not available in IE11. And the babel compiled output for object spread\n// syntax checks a bunch of Symbol stuff and is almost a kb. So this function is the smaller replacement.\nexport function assign() {\n  for (let i = arguments.length - 1; i > 0; i--) {\n    for (let key in arguments[i]) {\n      if (key === \"__proto__\") {\n        continue;\n      }\n      arguments[i - 1][key] = arguments[i][key];\n    }\n  }\n\n  return arguments[0];\n}\n","/* the array.prototype.find polyfill on npmjs.com is ~20kb (not worth it)\n * and lodash is ~200kb (not worth it)\n */\n\nexport function find(arr, func) {\n  for (let i = 0; i < arr.length; i++) {\n    if (func(arr[i])) {\n      return arr[i];\n    }\n  }\n\n  return null;\n}\n","import { find } from \"../utils/find.js\";\nimport { objectType, toName } from \"../applications/app.helpers.js\";\nimport { formatErrorMessage } from \"../applications/app-errors.js\";\n\nexport function validLifecycleFn(fn) {\n  return fn && (typeof fn === \"function\" || isArrayOfFns(fn));\n\n  function isArrayOfFns(arr) {\n    return (\n      Array.isArray(arr) && !find(arr, (item) => typeof item !== \"function\")\n    );\n  }\n}\n\nexport function flattenFnArray(appOrParcel, lifecycle) {\n  let fns = appOrParcel[lifecycle] || [];\n  fns = Array.isArray(fns) ? fns : [fns];\n  if (fns.length === 0) {\n    fns = [() => Promise.resolve()];\n  }\n\n  const type = objectType(appOrParcel);\n  const name = toName(appOrParcel);\n\n  return function (props) {\n    return fns.reduce((resultPromise, fn, index) => {\n      return resultPromise.then(() => {\n        const thisPromise = fn(props);\n        return smellsLikeAPromise(thisPromise)\n          ? thisPromise\n          : Promise.reject(\n              formatErrorMessage(\n                15,\n                __DEV__ &&\n                  `Within ${type} ${name}, the lifecycle function ${lifecycle} at array index ${index} did not return a promise`,\n                type,\n                name,\n                lifecycle,\n                index\n              )\n            );\n      });\n    }, Promise.resolve());\n  };\n}\n\nexport function smellsLikeAPromise(promise) {\n  return (\n    promise &&\n    typeof promise.then === \"function\" &&\n    typeof promise.catch === \"function\"\n  );\n}\n","let profileEntries = [];\n\nexport function getProfilerData() {\n  return profileEntries;\n}\n\n/**\n *\n * @type {'application' | 'parcel' | 'routing'} ProfileType\n *\n * @param {ProfileType} type\n * @param {String} name\n * @param {number} start\n * @param {number} end\n */\nexport function addProfileEntry(\n  type,\n  name,\n  kind,\n  start,\n  end,\n  operationSucceeded\n) {\n  profileEntries.push({\n    type,\n    name,\n    start,\n    end,\n    kind,\n    operationSucceeded,\n  });\n}\n\nexport function clearProfilerData() {\n  profileEntries = [];\n}\n","import {\n  NOT_BOOTSTRAPPED,\n  BOOTSTRAPPING,\n  NOT_MOUNTED,\n  SKIP_BECAUSE_BROKEN,\n  toName,\n  isParcel,\n} from \"../applications/app.helpers.js\";\nimport { reasonableTime } from \"../applications/timeouts.js\";\nimport { handleAppError, transformErr } from \"../applications/app-errors.js\";\nimport { addProfileEntry } from \"../devtools/profiler.js\";\n\nexport function toBootstrapPromise(appOrParcel, hardFail) {\n  let startTime, profileEventType;\n\n  return Promise.resolve().then(() => {\n    if (appOrParcel.status !== NOT_BOOTSTRAPPED) {\n      return appOrParcel;\n    }\n\n    if (__PROFILE__) {\n      profileEventType = isParcel(appOrParcel) ? \"parcel\" : \"application\";\n      startTime = performance.now();\n    }\n\n    appOrParcel.status = BOOTSTRAPPING;\n\n    if (!appOrParcel.bootstrap) {\n      // Default implementation of bootstrap\n      return Promise.resolve().then(successfulBootstrap);\n    }\n\n    return reasonableTime(appOrParcel, \"bootstrap\")\n      .then(successfulBootstrap)\n      .catch((err) => {\n        if (__PROFILE__) {\n          addProfileEntry(\n            profileEventType,\n            toName(appOrParcel),\n            \"bootstrap\",\n            startTime,\n            performance.now(),\n            false\n          );\n        }\n\n        if (hardFail) {\n          throw transformErr(err, appOrParcel, SKIP_BECAUSE_BROKEN);\n        } else {\n          handleAppError(err, appOrParcel, SKIP_BECAUSE_BROKEN);\n          return appOrParcel;\n        }\n      });\n  });\n\n  function successfulBootstrap() {\n    appOrParcel.status = NOT_MOUNTED;\n\n    if (__PROFILE__) {\n      addProfileEntry(\n        profileEventType,\n        toName(appOrParcel),\n        \"bootstrap\",\n        startTime,\n        performance.now(),\n        true\n      );\n    }\n\n    return appOrParcel;\n  }\n}\n","import {\n  UNMOUNTING,\n  NOT_MOUNTED,\n  MOUNTED,\n  SKIP_BECAUSE_BROKEN,\n  toName,\n  isParcel,\n} from \"../applications/app.helpers.js\";\nimport { handleAppError, transformErr } from \"../applications/app-errors.js\";\nimport { reasonableTime } from \"../applications/timeouts.js\";\nimport { addProfileEntry } from \"../devtools/profiler.js\";\n\nexport function toUnmountPromise(appOrParcel, hardFail) {\n  return Promise.resolve().then(() => {\n    if (appOrParcel.status !== MOUNTED) {\n      return appOrParcel;\n    }\n\n    let startTime, profileEventType;\n\n    if (__PROFILE__) {\n      startTime = performance.now();\n      profileEventType = isParcel(appOrParcel) ? \"parcel\" : \"application\";\n    }\n\n    appOrParcel.status = UNMOUNTING;\n\n    const unmountChildrenParcels = Object.keys(appOrParcel.parcels).map(\n      (parcelId) => appOrParcel.parcels[parcelId].unmountThisParcel()\n    );\n\n    let parcelError;\n\n    return Promise.all(unmountChildrenParcels)\n      .then(unmountAppOrParcel, (parcelError) => {\n        // There is a parcel unmount error\n        return unmountAppOrParcel().then(() => {\n          // Unmounting the app/parcel succeeded, but unmounting its children parcels did not\n          const parentError = Error(parcelError.message);\n          if (hardFail) {\n            throw transformErr(parentError, appOrParcel, SKIP_BECAUSE_BROKEN);\n          } else {\n            handleAppError(parentError, appOrParcel, SKIP_BECAUSE_BROKEN);\n          }\n        });\n      })\n      .then(() => appOrParcel);\n\n    function unmountAppOrParcel() {\n      // We always try to unmount the appOrParcel, even if the children parcels failed to unmount.\n      return reasonableTime(appOrParcel, \"unmount\").then(\n        () => {\n          // The appOrParcel needs to stay in a broken status if its children parcels fail to unmount\n          if (!parcelError) {\n            appOrParcel.status = NOT_MOUNTED;\n          }\n\n          if (__PROFILE__) {\n            addProfileEntry(\n              profileEventType,\n              toName(appOrParcel),\n              \"unmount\",\n              startTime,\n              performance.now(),\n              true\n            );\n          }\n        },\n        (err) => {\n          if (__PROFILE__) {\n            addProfileEntry(\n              profileEventType,\n              toName(appOrParcel),\n              \"unmount\",\n              startTime,\n              performance.now(),\n              false\n            );\n          }\n\n          if (hardFail) {\n            throw transformErr(err, appOrParcel, SKIP_BECAUSE_BROKEN);\n          } else {\n            handleAppError(err, appOrParcel, SKIP_BECAUSE_BROKEN);\n          }\n        }\n      );\n    }\n  });\n}\n","import {\n  NOT_MOUNTED,\n  MOUNTED,\n  SKIP_BECAUSE_BROKEN,\n  MOUNTING,\n  toName,\n  isParcel,\n} from \"../applications/app.helpers.js\";\nimport { handleAppError, transformErr } from \"../applications/app-errors.js\";\nimport { reasonableTime } from \"../applications/timeouts.js\";\nimport CustomEvent from \"custom-event\";\nimport { toUnmountPromise } from \"./unmount.js\";\nimport { addProfileEntry } from \"../devtools/profiler.js\";\n\nlet beforeFirstMountFired = false;\nlet firstMountFired = false;\n\nexport function toMountPromise(appOrParcel, hardFail) {\n  return Promise.resolve().then(() => {\n    if (appOrParcel.status !== NOT_MOUNTED) {\n      return appOrParcel;\n    }\n\n    let startTime, profileEventType;\n\n    if (__PROFILE__) {\n      profileEventType = isParcel(appOrParcel) ? \"parcel\" : \"application\";\n      startTime = performance.now();\n    }\n\n    if (!beforeFirstMountFired) {\n      window.dispatchEvent(new CustomEvent(\"single-spa:before-first-mount\"));\n      beforeFirstMountFired = true;\n    }\n\n    appOrParcel.status = MOUNTING;\n\n    return reasonableTime(appOrParcel, \"mount\")\n      .then(() => {\n        appOrParcel.status = MOUNTED;\n\n        if (!firstMountFired) {\n          window.dispatchEvent(new CustomEvent(\"single-spa:first-mount\"));\n          firstMountFired = true;\n        }\n\n        if (__PROFILE__) {\n          addProfileEntry(\n            profileEventType,\n            toName(appOrParcel),\n            \"mount\",\n            startTime,\n            performance.now(),\n            true\n          );\n        }\n\n        return appOrParcel;\n      })\n      .catch((err) => {\n        // If we fail to mount the appOrParcel, we should attempt to unmount it before putting in SKIP_BECAUSE_BROKEN\n        // We temporarily put the appOrParcel into MOUNTED status so that toUnmountPromise actually attempts to unmount it\n        // instead of just doing a no-op.\n        appOrParcel.status = MOUNTED;\n        return toUnmountPromise(appOrParcel, true).then(\n          setSkipBecauseBroken,\n          setSkipBecauseBroken\n        );\n\n        function setSkipBecauseBroken() {\n          if (__PROFILE__) {\n            addProfileEntry(\n              profileEventType,\n              toName(appOrParcel),\n              \"mount\",\n              startTime,\n              performance.now(),\n              false\n            );\n          }\n\n          if (!hardFail) {\n            handleAppError(err, appOrParcel, SKIP_BECAUSE_BROKEN);\n            return appOrParcel;\n          } else {\n            throw transformErr(err, appOrParcel, SKIP_BECAUSE_BROKEN);\n          }\n        }\n      });\n  });\n}\n","import {\n  validLifecycleFn,\n  flattenFnArray,\n} from \"../lifecycles/lifecycle.helpers.js\";\nimport {\n  NOT_BOOTSTRAPPED,\n  NOT_MOUNTED,\n  MOUNTED,\n  LOADING_SOURCE_CODE,\n  SKIP_BECAUSE_BROKEN,\n  toName,\n} from \"../applications/app.helpers.js\";\nimport { toBootstrapPromise } from \"../lifecycles/bootstrap.js\";\nimport { toMountPromise } from \"../lifecycles/mount.js\";\nimport { toUpdatePromise } from \"../lifecycles/update.js\";\nimport { toUnmountPromise } from \"../lifecycles/unmount.js\";\nimport { ensureValidAppTimeouts } from \"../applications/timeouts.js\";\nimport { formatErrorMessage } from \"../applications/app-errors.js\";\n\nlet parcelCount = 0;\nconst rootParcels = { parcels: {} };\n\n// This is a public api, exported to users of single-spa\nexport function mountRootParcel() {\n  return mountParcel.apply(rootParcels, arguments);\n}\n\nexport function mountParcel(config, customProps) {\n  const owningAppOrParcel = this;\n\n  // Validate inputs\n  if (!config || (typeof config !== \"object\" && typeof config !== \"function\")) {\n    throw Error(\n      formatErrorMessage(\n        2,\n        __DEV__ &&\n          \"Cannot mount parcel without a config object or config loading function\"\n      )\n    );\n  }\n\n  if (config.name && typeof config.name !== \"string\") {\n    throw Error(\n      formatErrorMessage(\n        3,\n        __DEV__ &&\n          `Parcel name must be a string, if provided. Was given ${typeof config.name}`,\n        typeof config.name\n      )\n    );\n  }\n\n  const id = parcelCount++;\n  let name = config.name || `parcel-${id}`;\n\n  if (typeof customProps !== \"object\") {\n    throw Error(\n      formatErrorMessage(\n        4,\n        __DEV__ &&\n          `Parcel ${name} has invalid customProps -- must be an object but was given ${typeof customProps}`,\n        name,\n        typeof customProps\n      )\n    );\n  }\n\n  if (!customProps.domElement) {\n    throw Error(\n      formatErrorMessage(\n        5,\n        __DEV__ &&\n          `Parcel ${name} cannot be mounted without a domElement provided as a prop`,\n        name\n      )\n    );\n  }\n\n  const passedConfigLoadingFunction = typeof config === \"function\";\n  const configLoadingFunction = passedConfigLoadingFunction\n    ? config\n    : () => Promise.resolve(config);\n\n  // Internal representation\n  const parcel = {\n    id,\n    parcels: {},\n    status: passedConfigLoadingFunction\n      ? LOADING_SOURCE_CODE\n      : NOT_BOOTSTRAPPED,\n    customProps,\n    parentName: toName(owningAppOrParcel),\n    unmountThisParcel() {\n      return mountPromise\n        .then(() => {\n          if (parcel.status !== MOUNTED) {\n            throw Error(\n              formatErrorMessage(\n                6,\n                __DEV__ &&\n                  `Cannot unmount parcel '${name}' -- it is in a ${parcel.status} status`,\n                name,\n                parcel.status\n              )\n            );\n          }\n          return toUnmountPromise(parcel, true);\n        })\n        .then((value) => {\n          if (parcel.parentName) {\n            delete owningAppOrParcel.parcels[parcel.id];\n          }\n\n          return value;\n        })\n        .then((value) => {\n          resolveUnmount(value);\n          return value;\n        })\n        .catch((err) => {\n          parcel.status = SKIP_BECAUSE_BROKEN;\n          rejectUnmount(err);\n          throw err;\n        });\n    },\n  };\n\n  // We return an external representation\n  let externalRepresentation;\n\n  // Add to owning app or parcel\n  owningAppOrParcel.parcels[id] = parcel;\n\n  let loadPromise = configLoadingFunction();\n\n  if (!loadPromise || typeof loadPromise.then !== \"function\") {\n    throw Error(\n      formatErrorMessage(\n        7,\n        __DEV__ &&\n          `When mounting a parcel, the config loading function must return a promise that resolves with the parcel config`\n      )\n    );\n  }\n\n  loadPromise = loadPromise.then((config) => {\n    if (!config) {\n      throw Error(\n        formatErrorMessage(\n          8,\n          __DEV__ &&\n            `When mounting a parcel, the config loading function returned a promise that did not resolve with a parcel config`\n        )\n      );\n    }\n\n    name = config.name || `parcel-${id}`;\n\n    if (\n      // ES Module objects don't have the object prototype\n      Object.prototype.hasOwnProperty.call(config, \"bootstrap\") &&\n      !validLifecycleFn(config.bootstrap)\n    ) {\n      throw Error(\n        formatErrorMessage(\n          9,\n          __DEV__ && `Parcel ${name} provided an invalid bootstrap function`,\n          name\n        )\n      );\n    }\n\n    if (!validLifecycleFn(config.mount)) {\n      throw Error(\n        formatErrorMessage(\n          10,\n          __DEV__ && `Parcel ${name} must have a valid mount function`,\n          name\n        )\n      );\n    }\n\n    if (!validLifecycleFn(config.unmount)) {\n      throw Error(\n        formatErrorMessage(\n          11,\n          __DEV__ && `Parcel ${name} must have a valid unmount function`,\n          name\n        )\n      );\n    }\n\n    if (config.update && !validLifecycleFn(config.update)) {\n      throw Error(\n        formatErrorMessage(\n          12,\n          __DEV__ && `Parcel ${name} provided an invalid update function`,\n          name\n        )\n      );\n    }\n\n    const bootstrap = flattenFnArray(config, \"bootstrap\");\n    const mount = flattenFnArray(config, \"mount\");\n    const unmount = flattenFnArray(config, \"unmount\");\n\n    parcel.status = NOT_BOOTSTRAPPED;\n    parcel.name = name;\n    parcel.bootstrap = bootstrap;\n    parcel.mount = mount;\n    parcel.unmount = unmount;\n    parcel.timeouts = ensureValidAppTimeouts(config.timeouts);\n\n    if (config.update) {\n      parcel.update = flattenFnArray(config, \"update\");\n      externalRepresentation.update = function (customProps) {\n        parcel.customProps = customProps;\n\n        return promiseWithoutReturnValue(toUpdatePromise(parcel));\n      };\n    }\n  });\n\n  // Start bootstrapping and mounting\n  // The .then() causes the work to be put on the event loop instead of happening immediately\n  const bootstrapPromise = loadPromise.then(() =>\n    toBootstrapPromise(parcel, true)\n  );\n  const mountPromise = bootstrapPromise.then(() =>\n    toMountPromise(parcel, true)\n  );\n\n  let resolveUnmount, rejectUnmount;\n\n  const unmountPromise = new Promise((resolve, reject) => {\n    resolveUnmount = resolve;\n    rejectUnmount = reject;\n  });\n\n  externalRepresentation = {\n    mount() {\n      return promiseWithoutReturnValue(\n        Promise.resolve().then(() => {\n          if (parcel.status !== NOT_MOUNTED) {\n            throw Error(\n              formatErrorMessage(\n                13,\n                __DEV__ &&\n                  `Cannot mount parcel '${name}' -- it is in a ${parcel.status} status`,\n                name,\n                parcel.status\n              )\n            );\n          }\n\n          // Add to owning app or parcel\n          owningAppOrParcel.parcels[id] = parcel;\n\n          return toMountPromise(parcel);\n        })\n      );\n    },\n    unmount() {\n      return promiseWithoutReturnValue(parcel.unmountThisParcel());\n    },\n    getStatus() {\n      return parcel.status;\n    },\n    loadPromise: promiseWithoutReturnValue(loadPromise),\n    bootstrapPromise: promiseWithoutReturnValue(bootstrapPromise),\n    mountPromise: promiseWithoutReturnValue(mountPromise),\n    unmountPromise: promiseWithoutReturnValue(unmountPromise),\n  };\n\n  return externalRepresentation;\n}\n\nfunction promiseWithoutReturnValue(promise) {\n  return promise.then(() => null);\n}\n","import {\n  UPDATING,\n  MOUNTED,\n  SKIP_BECAUSE_BROKEN,\n  toName,\n  isParcel,\n} from \"../applications/app.helpers.js\";\nimport {\n  transformErr,\n  formatErrorMessage,\n} from \"../applications/app-errors.js\";\nimport { reasonableTime } from \"../applications/timeouts.js\";\nimport { addProfileEntry } from \"../devtools/profiler.js\";\n\nexport function toUpdatePromise(appOrParcel) {\n  return Promise.resolve().then(() => {\n    let startTime, profileEventType;\n\n    if (__PROFILE__) {\n      profileEventType = isParcel(appOrParcel) ? \"parcel\" : \"application\";\n      startTime = performance.now();\n    }\n\n    if (appOrParcel.status !== MOUNTED) {\n      throw Error(\n        formatErrorMessage(\n          32,\n          __DEV__ &&\n            `Cannot update parcel '${toName(\n              appOrParcel\n            )}' because it is not mounted`,\n          toName(appOrParcel)\n        )\n      );\n    }\n\n    appOrParcel.status = UPDATING;\n\n    return reasonableTime(appOrParcel, \"update\")\n      .then(() => {\n        appOrParcel.status = MOUNTED;\n\n        if (__PROFILE__) {\n          addProfileEntry(\n            profileEventType,\n            toName(appOrParcel),\n            \"update\",\n            startTime,\n            performance.now(),\n            true\n          );\n        }\n\n        return appOrParcel;\n      })\n      .catch((err) => {\n        if (__PROFILE__) {\n          addProfileEntry(\n            profileEventType,\n            toName(appOrParcel),\n            \"update\",\n            startTime,\n            performance.now(),\n            false\n          );\n        }\n\n        throw transformErr(err, appOrParcel, SKIP_BECAUSE_BROKEN);\n      });\n  });\n}\n","import * as singleSpa from \"../single-spa.js\";\nimport { mountParcel } from \"../parcels/mount-parcel.js\";\nimport { assign } from \"../utils/assign.js\";\nimport { isParcel, toName } from \"../applications/app.helpers.js\";\nimport { formatErrorMessage } from \"../applications/app-errors.js\";\n\nexport function getProps(appOrParcel) {\n  const name = toName(appOrParcel);\n  let customProps =\n    typeof appOrParcel.customProps === \"function\"\n      ? appOrParcel.customProps(name, window.location)\n      : appOrParcel.customProps;\n  if (\n    typeof customProps !== \"object\" ||\n    customProps === null ||\n    Array.isArray(customProps)\n  ) {\n    customProps = {};\n    console.warn(\n      formatErrorMessage(\n        40,\n        __DEV__ &&\n          `single-spa: ${name}'s customProps function must return an object. Received ${customProps}`\n      ),\n      name,\n      customProps\n    );\n  }\n  const result = assign({}, customProps, {\n    name,\n    mountParcel: mountParcel.bind(appOrParcel),\n    singleSpa,\n  });\n\n  if (isParcel(appOrParcel)) {\n    result.unmountSelf = appOrParcel.unmountThisParcel;\n  }\n\n  return result;\n}\n","import { assign } from \"../utils/assign\";\nimport { getProps } from \"../lifecycles/prop.helpers\";\nimport { objectType, toName } from \"./app.helpers\";\nimport { formatErrorMessage } from \"./app-errors\";\n\nconst defaultWarningMillis = 1000;\n\nconst globalTimeoutConfig = {\n  bootstrap: {\n    millis: 4000,\n    dieOnTimeout: false,\n    warningMillis: defaultWarningMillis,\n  },\n  mount: {\n    millis: 3000,\n    dieOnTimeout: false,\n    warningMillis: defaultWarningMillis,\n  },\n  unmount: {\n    millis: 3000,\n    dieOnTimeout: false,\n    warningMillis: defaultWarningMillis,\n  },\n  unload: {\n    millis: 3000,\n    dieOnTimeout: false,\n    warningMillis: defaultWarningMillis,\n  },\n  update: {\n    millis: 3000,\n    dieOnTimeout: false,\n    warningMillis: defaultWarningMillis,\n  },\n};\n\nexport function setBootstrapMaxTime(time, dieOnTimeout, warningMillis) {\n  if (typeof time !== \"number\" || time <= 0) {\n    throw Error(\n      formatErrorMessage(\n        16,\n        __DEV__ &&\n          `bootstrap max time must be a positive integer number of milliseconds`\n      )\n    );\n  }\n\n  globalTimeoutConfig.bootstrap = {\n    millis: time,\n    dieOnTimeout,\n    warningMillis: warningMillis || defaultWarningMillis,\n  };\n}\n\nexport function setMountMaxTime(time, dieOnTimeout, warningMillis) {\n  if (typeof time !== \"number\" || time <= 0) {\n    throw Error(\n      formatErrorMessage(\n        17,\n        __DEV__ &&\n          `mount max time must be a positive integer number of milliseconds`\n      )\n    );\n  }\n\n  globalTimeoutConfig.mount = {\n    millis: time,\n    dieOnTimeout,\n    warningMillis: warningMillis || defaultWarningMillis,\n  };\n}\n\nexport function setUnmountMaxTime(time, dieOnTimeout, warningMillis) {\n  if (typeof time !== \"number\" || time <= 0) {\n    throw Error(\n      formatErrorMessage(\n        18,\n        __DEV__ &&\n          `unmount max time must be a positive integer number of milliseconds`\n      )\n    );\n  }\n\n  globalTimeoutConfig.unmount = {\n    millis: time,\n    dieOnTimeout,\n    warningMillis: warningMillis || defaultWarningMillis,\n  };\n}\n\nexport function setUnloadMaxTime(time, dieOnTimeout, warningMillis) {\n  if (typeof time !== \"number\" || time <= 0) {\n    throw Error(\n      formatErrorMessage(\n        19,\n        __DEV__ &&\n          `unload max time must be a positive integer number of milliseconds`\n      )\n    );\n  }\n\n  globalTimeoutConfig.unload = {\n    millis: time,\n    dieOnTimeout,\n    warningMillis: warningMillis || defaultWarningMillis,\n  };\n}\n\nexport function reasonableTime(appOrParcel, lifecycle) {\n  const timeoutConfig = appOrParcel.timeouts[lifecycle];\n  const warningPeriod = timeoutConfig.warningMillis;\n  const type = objectType(appOrParcel);\n\n  return new Promise((resolve, reject) => {\n    let finished = false;\n    let errored = false;\n\n    appOrParcel[lifecycle](getProps(appOrParcel))\n      .then((val) => {\n        finished = true;\n        resolve(val);\n      })\n      .catch((val) => {\n        finished = true;\n        reject(val);\n      });\n\n    setTimeout(() => maybeTimingOut(1), warningPeriod);\n    setTimeout(() => maybeTimingOut(true), timeoutConfig.millis);\n\n    const errMsg = formatErrorMessage(\n      31,\n      __DEV__ &&\n        `Lifecycle function ${lifecycle} for ${type} ${toName(\n          appOrParcel\n        )} lifecycle did not resolve or reject for ${timeoutConfig.millis} ms.`,\n      lifecycle,\n      type,\n      toName(appOrParcel),\n      timeoutConfig.millis\n    );\n\n    function maybeTimingOut(shouldError) {\n      if (!finished) {\n        if (shouldError === true) {\n          errored = true;\n          if (timeoutConfig.dieOnTimeout) {\n            reject(Error(errMsg));\n          } else {\n            console.error(errMsg);\n            //don't resolve or reject, we're waiting this one out\n          }\n        } else if (!errored) {\n          const numWarnings = shouldError;\n          const numMillis = numWarnings * warningPeriod;\n          console.warn(errMsg);\n          if (numMillis + warningPeriod < timeoutConfig.millis) {\n            setTimeout(() => maybeTimingOut(numWarnings + 1), warningPeriod);\n          }\n        }\n      }\n    }\n  });\n}\n\nexport function ensureValidAppTimeouts(timeouts) {\n  const result = {};\n\n  for (let key in globalTimeoutConfig) {\n    result[key] = assign(\n      {},\n      globalTimeoutConfig[key],\n      (timeouts && timeouts[key]) || {}\n    );\n  }\n\n  return result;\n}\n","import {\n  LOAD_ERROR,\n  NOT_BOOTSTRAPPED,\n  LOADING_SOURCE_CODE,\n  SKIP_BECAUSE_BROKEN,\n  NOT_LOADED,\n  objectType,\n  toName,\n} from \"../applications/app.helpers.js\";\nimport { ensureValidAppTimeouts } from \"../applications/timeouts.js\";\nimport {\n  handleAppError,\n  formatErrorMessage,\n} from \"../applications/app-errors.js\";\nimport {\n  flattenFnArray,\n  smellsLikeAPromise,\n  validLifecycleFn,\n} from \"./lifecycle.helpers.js\";\nimport { getProps } from \"./prop.helpers.js\";\nimport { assign } from \"../utils/assign.js\";\nimport { addProfileEntry } from \"../devtools/profiler.js\";\n\nexport function toLoadPromise(appOrParcel) {\n  return Promise.resolve().then(() => {\n    if (appOrParcel.loadPromise) {\n      return appOrParcel.loadPromise;\n    }\n\n    if (\n      appOrParcel.status !== NOT_LOADED &&\n      appOrParcel.status !== LOAD_ERROR\n    ) {\n      return appOrParcel;\n    }\n\n    let startTime;\n\n    if (__PROFILE__) {\n      startTime = performance.now();\n    }\n\n    appOrParcel.status = LOADING_SOURCE_CODE;\n\n    let appOpts, isUserErr;\n\n    return (appOrParcel.loadPromise = Promise.resolve()\n      .then(() => {\n        const loadPromise = appOrParcel.loadApp(getProps(appOrParcel));\n        if (!smellsLikeAPromise(loadPromise)) {\n          // The name of the app will be prepended to this error message inside of the handleAppError function\n          isUserErr = true;\n          throw Error(\n            formatErrorMessage(\n              33,\n              __DEV__ &&\n                `single-spa loading function did not return a promise. Check the second argument to registerApplication('${toName(\n                  appOrParcel\n                )}', loadingFunction, activityFunction)`,\n              toName(appOrParcel)\n            )\n          );\n        }\n        return loadPromise.then((val) => {\n          appOrParcel.loadErrorTime = null;\n\n          appOpts = val;\n\n          let validationErrMessage, validationErrCode;\n\n          if (typeof appOpts !== \"object\") {\n            validationErrCode = 34;\n            if (__DEV__) {\n              validationErrMessage = `does not export anything`;\n            }\n          }\n\n          if (\n            // ES Modules don't have the Object prototype\n            Object.prototype.hasOwnProperty.call(appOpts, \"bootstrap\") &&\n            !validLifecycleFn(appOpts.bootstrap)\n          ) {\n            validationErrCode = 35;\n            if (__DEV__) {\n              validationErrMessage = `does not export a valid bootstrap function or array of functions`;\n            }\n          }\n\n          if (!validLifecycleFn(appOpts.mount)) {\n            validationErrCode = 36;\n            if (__DEV__) {\n              validationErrMessage = `does not export a mount function or array of functions`;\n            }\n          }\n\n          if (!validLifecycleFn(appOpts.unmount)) {\n            validationErrCode = 37;\n            if (__DEV__) {\n              validationErrMessage = `does not export a unmount function or array of functions`;\n            }\n          }\n\n          const type = objectType(appOpts);\n\n          if (validationErrCode) {\n            let appOptsStr;\n            try {\n              appOptsStr = JSON.stringify(appOpts);\n            } catch {}\n            console.error(\n              formatErrorMessage(\n                validationErrCode,\n                __DEV__ &&\n                  `The loading function for single-spa ${type} '${toName(\n                    appOrParcel\n                  )}' resolved with the following, which does not have bootstrap, mount, and unmount functions`,\n                type,\n                toName(appOrParcel),\n                appOptsStr\n              ),\n              appOpts\n            );\n            handleAppError(\n              validationErrMessage,\n              appOrParcel,\n              SKIP_BECAUSE_BROKEN\n            );\n            return appOrParcel;\n          }\n\n          if (appOpts.devtools && appOpts.devtools.overlays) {\n            appOrParcel.devtools.overlays = assign(\n              {},\n              appOrParcel.devtools.overlays,\n              appOpts.devtools.overlays\n            );\n          }\n\n          appOrParcel.status = NOT_BOOTSTRAPPED;\n          appOrParcel.bootstrap = flattenFnArray(appOpts, \"bootstrap\");\n          appOrParcel.mount = flattenFnArray(appOpts, \"mount\");\n          appOrParcel.unmount = flattenFnArray(appOpts, \"unmount\");\n          appOrParcel.unload = flattenFnArray(appOpts, \"unload\");\n          appOrParcel.timeouts = ensureValidAppTimeouts(appOpts.timeouts);\n\n          delete appOrParcel.loadPromise;\n\n          if (__PROFILE__) {\n            addProfileEntry(\n              \"application\",\n              toName(appOrParcel),\n              \"load\",\n              startTime,\n              performance.now(),\n              true\n            );\n          }\n\n          return appOrParcel;\n        });\n      })\n      .catch((err) => {\n        delete appOrParcel.loadPromise;\n\n        let newStatus;\n        if (isUserErr) {\n          newStatus = SKIP_BECAUSE_BROKEN;\n        } else {\n          newStatus = LOAD_ERROR;\n          appOrParcel.loadErrorTime = new Date().getTime();\n        }\n        handleAppError(err, appOrParcel, newStatus);\n\n        if (__PROFILE__) {\n          addProfileEntry(\n            \"application\",\n            toName(appOrParcel),\n            \"load\",\n            startTime,\n            performance.now(),\n            false\n          );\n        }\n\n        return appOrParcel;\n      }));\n  });\n}\n","export const isInBrowser = typeof window !== \"undefined\";\n","import { reroute } from \"./reroute.js\";\nimport { find } from \"../utils/find.js\";\nimport { formatErrorMessage } from \"../applications/app-errors.js\";\nimport { isInBrowser } from \"../utils/runtime-environment.js\";\n\n/* We capture navigation event listeners so that we can make sure\n * that application navigation listeners are not called until\n * single-spa has ensured that the correct applications are\n * unmounted and mounted.\n */\nconst capturedEventListeners = {\n  hashchange: [],\n  popstate: [],\n};\n\nexport const routingEventsListeningTo = [\"hashchange\", \"popstate\"];\n\nexport function navigateToUrl(obj) {\n  let url;\n  if (typeof obj === \"string\") {\n    url = obj;\n  } else if (this && this.href) {\n    url = this.href;\n  } else if (\n    obj &&\n    obj.currentTarget &&\n    obj.currentTarget.href &&\n    obj.preventDefault\n  ) {\n    url = obj.currentTarget.href;\n    obj.preventDefault();\n  } else {\n    throw Error(\n      formatErrorMessage(\n        14,\n        __DEV__ &&\n          `singleSpaNavigate/navigateToUrl must be either called with a string url, with an <a> tag as its context, or with an event whose currentTarget is an <a> tag`\n      )\n    );\n  }\n\n  const current = parseUri(window.location.href);\n  const destination = parseUri(url);\n\n  if (url.indexOf(\"#\") === 0) {\n    window.location.hash = destination.hash;\n  } else if (current.host !== destination.host && destination.host) {\n    if (process.env.BABEL_ENV === \"test\") {\n      return { wouldHaveReloadedThePage: true };\n    } else {\n      window.location.href = url;\n    }\n  } else if (\n    destination.pathname === current.pathname &&\n    destination.search === current.search\n  ) {\n    window.location.hash = destination.hash;\n  } else {\n    // different path, host, or query params\n    window.history.pushState(null, null, url);\n  }\n}\n\nexport function callCapturedEventListeners(eventArguments) {\n  if (eventArguments) {\n    const eventType = eventArguments[0].type;\n    if (routingEventsListeningTo.indexOf(eventType) >= 0) {\n      capturedEventListeners[eventType].forEach((listener) => {\n        try {\n          // The error thrown by application event listener should not break single-spa down.\n          // Just like https://github.com/single-spa/single-spa/blob/85f5042dff960e40936f3a5069d56fc9477fac04/src/navigation/reroute.js#L140-L146 did\n          listener.apply(this, eventArguments);\n        } catch (e) {\n          setTimeout(() => {\n            throw e;\n          });\n        }\n      });\n    }\n  }\n}\n\nlet urlRerouteOnly;\n\nfunction urlReroute() {\n  reroute([], arguments);\n}\n\nfunction patchedUpdateState(updateState, methodName) {\n  return function () {\n    const urlBefore = window.location.href;\n    const result = updateState.apply(this, arguments);\n    const urlAfter = window.location.href;\n\n    if (!urlRerouteOnly || urlBefore !== urlAfter) {\n      // fire an artificial popstate event so that\n      // single-spa applications know about routing that\n      // occurs in a different application\n      window.dispatchEvent(\n        createPopStateEvent(window.history.state, methodName)\n      );\n    }\n\n    return result;\n  };\n}\n\nfunction createPopStateEvent(state, originalMethodName) {\n  // https://github.com/single-spa/single-spa/issues/224 and https://github.com/single-spa/single-spa-angular/issues/49\n  // We need a popstate event even though the browser doesn't do one by default when you call replaceState, so that\n  // all the applications can reroute. We explicitly identify this extraneous event by setting singleSpa=true and\n  // singleSpaTrigger=<pushState|replaceState> on the event instance.\n  let evt;\n  try {\n    evt = new PopStateEvent(\"popstate\", { state });\n  } catch (err) {\n    // IE 11 compatibility https://github.com/single-spa/single-spa/issues/299\n    // https://docs.microsoft.com/en-us/openspecs/ie_standards/ms-html5e/bd560f47-b349-4d2c-baa8-f1560fb489dd\n    evt = document.createEvent(\"PopStateEvent\");\n    evt.initPopStateEvent(\"popstate\", false, false, state);\n  }\n  evt.singleSpa = true;\n  evt.singleSpaTrigger = originalMethodName;\n  return evt;\n}\n\nexport let originalReplaceState = null;\n\nlet historyApiIsPatched = false;\n\n// We patch the history API so single-spa is notified of all calls to pushState/replaceState.\n// We patch addEventListener/removeEventListener so we can capture all popstate/hashchange event listeners,\n// and delay calling them until single-spa has finished mounting/unmounting applications\nexport function patchHistoryApi(opts) {\n  if (historyApiIsPatched) {\n    throw Error(\n      formatErrorMessage(\n        43,\n        __DEV__ &&\n          `single-spa: patchHistoryApi() was called after the history api was already patched.`\n      )\n    );\n  }\n\n  // True by default, as a performance optimization that reduces\n  // the number of extraneous popstate events\n  urlRerouteOnly =\n    opts && opts.hasOwnProperty(\"urlRerouteOnly\") ? opts.urlRerouteOnly : true;\n\n  historyApiIsPatched = true;\n\n  originalReplaceState = window.history.replaceState;\n\n  // We will trigger an app change for any routing events.\n  window.addEventListener(\"hashchange\", urlReroute);\n  window.addEventListener(\"popstate\", urlReroute);\n\n  // Monkeypatch addEventListener so that we can ensure correct timing\n  const originalAddEventListener = window.addEventListener;\n  const originalRemoveEventListener = window.removeEventListener;\n  window.addEventListener = function (eventName, fn) {\n    if (typeof fn === \"function\") {\n      if (\n        routingEventsListeningTo.indexOf(eventName) >= 0 &&\n        !find(capturedEventListeners[eventName], (listener) => listener === fn)\n      ) {\n        capturedEventListeners[eventName].push(fn);\n        return;\n      }\n    }\n\n    return originalAddEventListener.apply(this, arguments);\n  };\n\n  window.removeEventListener = function (eventName, listenerFn) {\n    if (typeof listenerFn === \"function\") {\n      if (routingEventsListeningTo.indexOf(eventName) >= 0) {\n        capturedEventListeners[eventName] = capturedEventListeners[\n          eventName\n        ].filter((fn) => fn !== listenerFn);\n      }\n    }\n\n    return originalRemoveEventListener.apply(this, arguments);\n  };\n\n  window.history.pushState = patchedUpdateState(\n    window.history.pushState,\n    \"pushState\"\n  );\n  window.history.replaceState = patchedUpdateState(\n    originalReplaceState,\n    \"replaceState\"\n  );\n}\n\n// Detect if single-spa has already been loaded on the page.\n// If so, warn because this can result in lots of problems, including\n// lots of extraneous popstate events and unexpected results for\n// apis like getAppNames().\nif (isInBrowser) {\n  if (window.singleSpaNavigate) {\n    console.warn(\n      formatErrorMessage(\n        41,\n        __DEV__ &&\n          \"single-spa has been loaded twice on the page. This can result in unexpected behavior.\"\n      )\n    );\n  } else {\n    /* For convenience in `onclick` attributes, we expose a global function for navigating to\n     * whatever an <a> tag's href is.\n     */\n    window.singleSpaNavigate = navigateToUrl;\n  }\n}\n\nfunction parseUri(str) {\n  const anchor = document.createElement(\"a\");\n  anchor.href = str;\n  return anchor;\n}\n","import { routingEventsListeningTo } from \"./navigation/navigation-events.js\";\n\nlet hasInitialized = false;\n\nexport function ensureJQuerySupport(jQuery = window.jQuery) {\n  if (!jQuery) {\n    if (window.$ && window.$.fn && window.$.fn.jquery) {\n      jQuery = window.$;\n    }\n  }\n\n  if (jQuery && !hasInitialized) {\n    const originalJQueryOn = jQuery.fn.on;\n    const originalJQueryOff = jQuery.fn.off;\n\n    jQuery.fn.on = function (eventString, fn) {\n      return captureRoutingEvents.call(\n        this,\n        originalJQueryOn,\n        window.addEventListener,\n        eventString,\n        fn,\n        arguments\n      );\n    };\n\n    jQuery.fn.off = function (eventString, fn) {\n      return captureRoutingEvents.call(\n        this,\n        originalJQueryOff,\n        window.removeEventListener,\n        eventString,\n        fn,\n        arguments\n      );\n    };\n\n    hasInitialized = true;\n  }\n}\n\nfunction captureRoutingEvents(\n  originalJQueryFunction,\n  nativeFunctionToCall,\n  eventString,\n  fn,\n  originalArgs\n) {\n  if (typeof eventString !== \"string\") {\n    return originalJQueryFunction.apply(this, originalArgs);\n  }\n\n  const eventNames = eventString.split(/\\s+/);\n  eventNames.forEach((eventName) => {\n    if (routingEventsListeningTo.indexOf(eventName) >= 0) {\n      nativeFunctionToCall(eventName, fn);\n      eventString = eventString.replace(eventName, \"\");\n    }\n  });\n\n  if (eventString.trim() === \"\") {\n    return this;\n  } else {\n    return originalJQueryFunction.apply(this, originalArgs);\n  }\n}\n","import {\n  NOT_MOUNTED,\n  UNLOADING,\n  NOT_LOADED,\n  LOAD_ERROR,\n  SKIP_BECAUSE_BROKEN,\n  toName,\n} from \"../applications/app.helpers.js\";\nimport { handleAppError } from \"../applications/app-errors.js\";\nimport { reasonableTime } from \"../applications/timeouts.js\";\nimport { addProfileEntry } from \"../devtools/profiler.js\";\n\nconst appsToUnload = {};\n\nexport function toUnloadPromise(appOrParcel) {\n  return Promise.resolve().then(() => {\n    const unloadInfo = appsToUnload[toName(appOrParcel)];\n\n    if (!unloadInfo) {\n      /* No one has called unloadApplication for this app,\n       */\n      return appOrParcel;\n    }\n\n    if (appOrParcel.status === NOT_LOADED) {\n      /* This app is already unloaded. We just need to clean up\n       * anything that still thinks we need to unload the app.\n       */\n      finishUnloadingApp(appOrParcel, unloadInfo);\n      return appOrParcel;\n    }\n\n    if (appOrParcel.status === UNLOADING) {\n      /* Both unloadApplication and reroute want to unload this app.\n       * It only needs to be done once, though.\n       */\n      return unloadInfo.promise.then(() => appOrParcel);\n    }\n\n    if (\n      appOrParcel.status !== NOT_MOUNTED &&\n      appOrParcel.status !== LOAD_ERROR\n    ) {\n      /* The app cannot be unloaded until it is unmounted.\n       */\n      return appOrParcel;\n    }\n\n    let startTime;\n\n    if (__PROFILE__) {\n      startTime = performance.now();\n    }\n\n    const unloadPromise =\n      appOrParcel.status === LOAD_ERROR\n        ? Promise.resolve()\n        : reasonableTime(appOrParcel, \"unload\");\n\n    appOrParcel.status = UNLOADING;\n\n    return unloadPromise\n      .then(() => {\n        if (__PROFILE__) {\n          addProfileEntry(\n            \"application\",\n            toName(appOrParcel),\n            \"unload\",\n            startTime,\n            performance.now(),\n            true\n          );\n        }\n\n        finishUnloadingApp(appOrParcel, unloadInfo);\n\n        return appOrParcel;\n      })\n      .catch((err) => {\n        if (__PROFILE__) {\n          addProfileEntry(\n            \"application\",\n            toName(appOrParcel),\n            \"unload\",\n            startTime,\n            performance.now(),\n            false\n          );\n        }\n\n        errorUnloadingApp(appOrParcel, unloadInfo, err);\n\n        return appOrParcel;\n      });\n  });\n}\n\nfunction finishUnloadingApp(app, unloadInfo) {\n  delete appsToUnload[toName(app)];\n\n  // Unloaded apps don't have lifecycles\n  delete app.bootstrap;\n  delete app.mount;\n  delete app.unmount;\n  delete app.unload;\n\n  app.status = NOT_LOADED;\n\n  /* resolve the promise of whoever called unloadApplication.\n   * This should be done after all other cleanup/bookkeeping\n   */\n  unloadInfo.resolve();\n}\n\nfunction errorUnloadingApp(app, unloadInfo, err) {\n  delete appsToUnload[toName(app)];\n\n  // Unloaded apps don't have lifecycles\n  delete app.bootstrap;\n  delete app.mount;\n  delete app.unmount;\n  delete app.unload;\n\n  handleAppError(err, app, SKIP_BECAUSE_BROKEN);\n  unloadInfo.reject(err);\n}\n\nexport function addAppToUnload(app, promiseGetter, resolve, reject) {\n  appsToUnload[toName(app)] = { app, resolve, reject };\n  Object.defineProperty(appsToUnload[toName(app)], \"promise\", {\n    get: promiseGetter,\n  });\n}\n\nexport function getAppUnloadInfo(appName) {\n  return appsToUnload[appName];\n}\n","import { ensureJQuerySupport } from \"../jquery-support.js\";\nimport {\n  isActive,\n  toName,\n  NOT_LOADED,\n  NOT_BOOTSTRAPPED,\n  NOT_MOUNTED,\n  MOUNTED,\n  LOAD_ERROR,\n  SKIP_BECAUSE_BROKEN,\n  LOADING_SOURCE_CODE,\n  shouldBeActive,\n} from \"./app.helpers.js\";\nimport { reroute, triggerAppChange } from \"../navigation/reroute.js\";\nimport { find } from \"../utils/find.js\";\nimport { toUnmountPromise } from \"../lifecycles/unmount.js\";\nimport {\n  toUnloadPromise,\n  getAppUnloadInfo,\n  addAppToUnload,\n} from \"../lifecycles/unload.js\";\nimport { formatErrorMessage } from \"./app-errors.js\";\nimport { isInBrowser } from \"../utils/runtime-environment.js\";\nimport { assign } from \"../utils/assign\";\nimport { isStarted } from \"../start.js\";\n\nconst apps = [];\n\nexport function getAppChanges() {\n  const appsToUnload = [],\n    appsToUnmount = [],\n    appsToLoad = [],\n    appsToMount = [];\n\n  // We re-attempt to download applications in LOAD_ERROR after a timeout of 200 milliseconds\n  const currentTime = new Date().getTime();\n\n  apps.forEach((app) => {\n    const appShouldBeActive =\n      app.status !== SKIP_BECAUSE_BROKEN && shouldBeActive(app);\n\n    switch (app.status) {\n      case LOAD_ERROR:\n        if (appShouldBeActive && currentTime - app.loadErrorTime >= 200) {\n          appsToLoad.push(app);\n        }\n        break;\n      case NOT_LOADED:\n      case LOADING_SOURCE_CODE:\n        if (appShouldBeActive) {\n          appsToLoad.push(app);\n        }\n        break;\n      case NOT_BOOTSTRAPPED:\n      case NOT_MOUNTED:\n        if (!appShouldBeActive && getAppUnloadInfo(toName(app))) {\n          appsToUnload.push(app);\n        } else if (appShouldBeActive) {\n          appsToMount.push(app);\n        }\n        break;\n      case MOUNTED:\n        if (!appShouldBeActive) {\n          appsToUnmount.push(app);\n        }\n        break;\n      // all other statuses are ignored\n    }\n  });\n\n  return { appsToUnload, appsToUnmount, appsToLoad, appsToMount };\n}\n\nexport function getMountedApps() {\n  return apps.filter(isActive).map(toName);\n}\n\nexport function getAppNames() {\n  return apps.map(toName);\n}\n\n// used in devtools, not (currently) exposed as a single-spa API\nexport function getRawAppData() {\n  return [...apps];\n}\n\nexport function getAppStatus(appName) {\n  const app = find(apps, (app) => toName(app) === appName);\n  return app ? app.status : null;\n}\n\nlet startWarningInitialized = false;\n\nexport function registerApplication(\n  appNameOrConfig,\n  appOrLoadApp,\n  activeWhen,\n  customProps\n) {\n  const registration = sanitizeArguments(\n    appNameOrConfig,\n    appOrLoadApp,\n    activeWhen,\n    customProps\n  );\n\n  if (!isStarted() && !startWarningInitialized) {\n    startWarningInitialized = true;\n\n    setTimeout(() => {\n      if (!isStarted()) {\n        console.warn(\n          formatErrorMessage(\n            1,\n            __DEV__ &&\n              `singleSpa.start() has not been called, 5000ms after single-spa was loaded. Before start() is called, apps can be declared and loaded, but not bootstrapped or mounted.`\n          )\n        );\n      }\n    }, 5000);\n  }\n\n  if (getAppNames().indexOf(registration.name) !== -1)\n    throw Error(\n      formatErrorMessage(\n        21,\n        __DEV__ &&\n          `There is already an app registered with name ${registration.name}`,\n        registration.name\n      )\n    );\n\n  apps.push(\n    assign(\n      {\n        loadErrorTime: null,\n        status: NOT_LOADED,\n        parcels: {},\n        devtools: {\n          overlays: {\n            options: {},\n            selectors: [],\n          },\n        },\n      },\n      registration\n    )\n  );\n\n  if (isInBrowser) {\n    ensureJQuerySupport();\n    reroute();\n  }\n}\n\nexport function checkActivityFunctions(location = window.location) {\n  return apps.filter((app) => app.activeWhen(location)).map(toName);\n}\n\nexport function unregisterApplication(appName) {\n  if (apps.filter((app) => toName(app) === appName).length === 0) {\n    throw Error(\n      formatErrorMessage(\n        25,\n        __DEV__ &&\n          `Cannot unregister application '${appName}' because no such application has been registered`,\n        appName\n      )\n    );\n  }\n\n  const unloadPromise = isInBrowser\n    ? // See https://github.com/single-spa/single-spa/issues/871 for why waitForUnmount is false\n      unloadApplication(appName, { waitForUnmount: false })\n    : Promise.resolve();\n\n  return unloadPromise.then(() => {\n    const appIndex = apps.map(toName).indexOf(appName);\n    apps.splice(appIndex, 1);\n  });\n}\n\nexport function unloadApplication(appName, opts = { waitForUnmount: false }) {\n  if (typeof appName !== \"string\") {\n    throw Error(\n      formatErrorMessage(\n        26,\n        __DEV__ && `unloadApplication requires a string 'appName'`\n      )\n    );\n  }\n  const app = find(apps, (App) => toName(App) === appName);\n  if (!app) {\n    throw Error(\n      formatErrorMessage(\n        27,\n        __DEV__ &&\n          `Could not unload application '${appName}' because no such application has been registered`,\n        appName\n      )\n    );\n  }\n\n  const appUnloadInfo = getAppUnloadInfo(toName(app));\n  if (opts && opts.waitForUnmount) {\n    // We need to wait for unmount before unloading the app\n\n    if (appUnloadInfo) {\n      // Someone else is already waiting for this, too\n      return appUnloadInfo.promise;\n    } else {\n      // We're the first ones wanting the app to be resolved.\n      const promise = new Promise((resolve, reject) => {\n        addAppToUnload(app, () => promise, resolve, reject);\n      });\n      return promise;\n    }\n  } else {\n    /* We should unmount the app, unload it, and remount it immediately.\n     */\n\n    let resultPromise;\n\n    if (appUnloadInfo) {\n      // Someone else is already waiting for this app to unload\n      resultPromise = appUnloadInfo.promise;\n      immediatelyUnloadApp(app, appUnloadInfo.resolve, appUnloadInfo.reject);\n    } else {\n      // We're the first ones wanting the app to be resolved.\n      resultPromise = new Promise((resolve, reject) => {\n        addAppToUnload(app, () => resultPromise, resolve, reject);\n        immediatelyUnloadApp(app, resolve, reject);\n      });\n    }\n\n    return resultPromise;\n  }\n}\n\nfunction immediatelyUnloadApp(app, resolve, reject) {\n  Promise.resolve()\n    .then(() => {\n      // Before unmounting the application, we first must wait for it to finish mounting\n      // Otherwise, the test for issue 871 in unregister-application.spec.js fails because\n      // the application isn't really unmounted.\n      if (\n        find(checkActivityFunctions(), (activeApp) => activeApp === toName(app))\n      ) {\n        return triggerAppChange();\n      }\n    })\n    .then(() => {\n      return toUnmountPromise(app)\n        .then(toUnloadPromise)\n        .then(() => {\n          resolve();\n          setTimeout(() => {\n            // reroute, but the unload promise is done\n            reroute();\n          });\n        });\n    })\n    .catch(reject);\n}\n\nfunction validateRegisterWithArguments(\n  name,\n  appOrLoadApp,\n  activeWhen,\n  customProps\n) {\n  if (typeof name !== \"string\" || name.length === 0)\n    throw Error(\n      formatErrorMessage(\n        20,\n        __DEV__ &&\n          `The 1st argument to registerApplication must be a non-empty string 'appName'`\n      )\n    );\n\n  if (!appOrLoadApp)\n    throw Error(\n      formatErrorMessage(\n        23,\n        __DEV__ &&\n          \"The 2nd argument to registerApplication must be an application or loading application function\"\n      )\n    );\n\n  if (typeof activeWhen !== \"function\")\n    throw Error(\n      formatErrorMessage(\n        24,\n        __DEV__ &&\n          \"The 3rd argument to registerApplication must be an activeWhen function\"\n      )\n    );\n\n  if (!validCustomProps(customProps))\n    throw Error(\n      formatErrorMessage(\n        22,\n        __DEV__ &&\n          \"The optional 4th argument is a customProps and must be an object\"\n      )\n    );\n}\n\nexport function validateRegisterWithConfig(config) {\n  if (Array.isArray(config) || config === null)\n    throw Error(\n      formatErrorMessage(\n        39,\n        __DEV__ && \"Configuration object can't be an Array or null!\"\n      )\n    );\n  const validKeys = [\"name\", \"app\", \"activeWhen\", \"customProps\"];\n  const invalidKeys = Object.keys(config).reduce(\n    (invalidKeys, prop) =>\n      validKeys.indexOf(prop) >= 0 ? invalidKeys : invalidKeys.concat(prop),\n    []\n  );\n  if (invalidKeys.length !== 0)\n    throw Error(\n      formatErrorMessage(\n        38,\n        __DEV__ &&\n          `The configuration object accepts only: ${validKeys.join(\n            \", \"\n          )}. Invalid keys: ${invalidKeys.join(\", \")}.`,\n        validKeys.join(\", \"),\n        invalidKeys.join(\", \")\n      )\n    );\n  if (typeof config.name !== \"string\" || config.name.length === 0)\n    throw Error(\n      formatErrorMessage(\n        20,\n        __DEV__ &&\n          \"The config.name on registerApplication must be a non-empty string\"\n      )\n    );\n  if (typeof config.app !== \"object\" && typeof config.app !== \"function\")\n    throw Error(\n      formatErrorMessage(\n        20,\n        __DEV__ &&\n          \"The config.app on registerApplication must be an application or a loading function\"\n      )\n    );\n  const allowsStringAndFunction = (activeWhen) =>\n    typeof activeWhen === \"string\" || typeof activeWhen === \"function\";\n  if (\n    !allowsStringAndFunction(config.activeWhen) &&\n    !(\n      Array.isArray(config.activeWhen) &&\n      config.activeWhen.every(allowsStringAndFunction)\n    )\n  )\n    throw Error(\n      formatErrorMessage(\n        24,\n        __DEV__ &&\n          \"The config.activeWhen on registerApplication must be a string, function or an array with both\"\n      )\n    );\n  if (!validCustomProps(config.customProps))\n    throw Error(\n      formatErrorMessage(\n        22,\n        __DEV__ && \"The optional config.customProps must be an object\"\n      )\n    );\n}\n\nfunction validCustomProps(customProps) {\n  return (\n    !customProps ||\n    typeof customProps === \"function\" ||\n    (typeof customProps === \"object\" &&\n      customProps !== null &&\n      !Array.isArray(customProps))\n  );\n}\n\nfunction sanitizeArguments(\n  appNameOrConfig,\n  appOrLoadApp,\n  activeWhen,\n  customProps\n) {\n  const usingObjectAPI = typeof appNameOrConfig === \"object\";\n\n  const registration = {\n    name: null,\n    loadApp: null,\n    activeWhen: null,\n    customProps: null,\n  };\n\n  if (usingObjectAPI) {\n    validateRegisterWithConfig(appNameOrConfig);\n    registration.name = appNameOrConfig.name;\n    registration.loadApp = appNameOrConfig.app;\n    registration.activeWhen = appNameOrConfig.activeWhen;\n    registration.customProps = appNameOrConfig.customProps;\n  } else {\n    validateRegisterWithArguments(\n      appNameOrConfig,\n      appOrLoadApp,\n      activeWhen,\n      customProps\n    );\n    registration.name = appNameOrConfig;\n    registration.loadApp = appOrLoadApp;\n    registration.activeWhen = activeWhen;\n    registration.customProps = customProps;\n  }\n\n  registration.loadApp = sanitizeLoadApp(registration.loadApp);\n  registration.customProps = sanitizeCustomProps(registration.customProps);\n  registration.activeWhen = sanitizeActiveWhen(registration.activeWhen);\n\n  return registration;\n}\n\nfunction sanitizeLoadApp(loadApp) {\n  if (typeof loadApp !== \"function\") {\n    return () => Promise.resolve(loadApp);\n  }\n\n  return loadApp;\n}\n\nfunction sanitizeCustomProps(customProps) {\n  return customProps ? customProps : {};\n}\n\nfunction sanitizeActiveWhen(activeWhen) {\n  let activeWhenArray = Array.isArray(activeWhen) ? activeWhen : [activeWhen];\n  activeWhenArray = activeWhenArray.map((activeWhenOrPath) =>\n    typeof activeWhenOrPath === \"function\"\n      ? activeWhenOrPath\n      : pathToActiveWhen(activeWhenOrPath)\n  );\n\n  return (location) =>\n    activeWhenArray.some((activeWhen) => activeWhen(location));\n}\n\nexport function pathToActiveWhen(path, exactMatch) {\n  const regex = toDynamicPathValidatorRegex(path, exactMatch);\n\n  return (location) => {\n    // compatible with IE10\n    let origin = location.origin;\n    if (!origin) {\n      origin = `${location.protocol}//${location.host}`;\n    }\n    const route = location.href\n      .replace(origin, \"\")\n      .replace(location.search, \"\")\n      .split(\"?\")[0];\n    return regex.test(route);\n  };\n}\n\nfunction toDynamicPathValidatorRegex(path, exactMatch) {\n  let lastIndex = 0,\n    inDynamic = false,\n    regexStr = \"^\";\n\n  if (path[0] !== \"/\") {\n    path = \"/\" + path;\n  }\n\n  for (let charIndex = 0; charIndex < path.length; charIndex++) {\n    const char = path[charIndex];\n    const startOfDynamic = !inDynamic && char === \":\";\n    const endOfDynamic = inDynamic && char === \"/\";\n    if (startOfDynamic || endOfDynamic) {\n      appendToRegex(charIndex);\n    }\n  }\n\n  appendToRegex(path.length);\n  return new RegExp(regexStr, \"i\");\n\n  function appendToRegex(index) {\n    const anyCharMaybeTrailingSlashRegex = \"[^/]+/?\";\n    const commonStringSubPath = escapeStrRegex(path.slice(lastIndex, index));\n\n    regexStr += inDynamic\n      ? anyCharMaybeTrailingSlashRegex\n      : commonStringSubPath;\n\n    if (index === path.length) {\n      if (inDynamic) {\n        if (exactMatch) {\n          // Ensure exact match paths that end in a dynamic portion don't match\n          // urls with characters after a slash after the dynamic portion.\n          regexStr += \"$\";\n        }\n      } else {\n        // For exact matches, expect no more characters. Otherwise, allow\n        // any characters.\n        const suffix = exactMatch ? \"\" : \".*\";\n\n        regexStr =\n          // use charAt instead as we could not use es6 method endsWith\n          regexStr.charAt(regexStr.length - 1) === \"/\"\n            ? `${regexStr}${suffix}$`\n            : `${regexStr}(/${suffix})?(#.*)?$`;\n      }\n    }\n\n    inDynamic = !inDynamic;\n    lastIndex = index;\n  }\n\n  function escapeStrRegex(str) {\n    // borrowed from https://github.com/sindresorhus/escape-string-regexp/blob/master/index.js\n    return str.replace(/[|\\\\{}()[\\]^$+*?.]/g, \"\\\\$&\");\n  }\n}\n","import CustomEvent from \"custom-event\";\nimport { isStarted } from \"../start.js\";\nimport { toLoadPromise } from \"../lifecycles/load.js\";\nimport { toBootstrapPromise } from \"../lifecycles/bootstrap.js\";\nimport { toMountPromise } from \"../lifecycles/mount.js\";\nimport { toUnmountPromise } from \"../lifecycles/unmount.js\";\nimport {\n  getAppStatus,\n  getAppChanges,\n  getMountedApps,\n} from \"../applications/apps.js\";\nimport {\n  callCapturedEventListeners,\n  originalReplaceState,\n} from \"./navigation-events.js\";\nimport { toUnloadPromise } from \"../lifecycles/unload.js\";\nimport {\n  toName,\n  shouldBeActive,\n  NOT_MOUNTED,\n  MOUNTED,\n  NOT_LOADED,\n  SKIP_BECAUSE_BROKEN,\n} from \"../applications/app.helpers.js\";\nimport { assign } from \"../utils/assign.js\";\nimport { isInBrowser } from \"../utils/runtime-environment.js\";\nimport { formatErrorMessage } from \"../applications/app-errors.js\";\nimport { addProfileEntry } from \"../devtools/profiler.js\";\n\nlet appChangeUnderway = false,\n  peopleWaitingOnAppChange = [],\n  currentUrl = isInBrowser && window.location.href;\n\nexport function triggerAppChange() {\n  // Call reroute with no arguments, intentionally\n  return reroute();\n}\n\nexport function reroute(\n  pendingPromises = [],\n  eventArguments,\n  silentNavigation = false\n) {\n  if (appChangeUnderway) {\n    return new Promise((resolve, reject) => {\n      peopleWaitingOnAppChange.push({\n        resolve,\n        reject,\n        eventArguments,\n      });\n    });\n  }\n\n  let startTime, profilerKind;\n\n  if (__PROFILE__) {\n    startTime = performance.now();\n    if (silentNavigation) {\n      profilerKind = \"silentNavigation\";\n    } else if (eventArguments) {\n      profilerKind = \"browserNavigation\";\n    } else {\n      profilerKind = \"triggerAppChange\";\n    }\n  }\n\n  const { appsToUnload, appsToUnmount, appsToLoad, appsToMount } =\n    getAppChanges();\n  let appsThatChanged,\n    cancelPromises = [],\n    oldUrl = currentUrl,\n    newUrl = (currentUrl = window.location.href);\n\n  if (isStarted()) {\n    appChangeUnderway = true;\n    appsThatChanged = appsToUnload.concat(\n      appsToLoad,\n      appsToUnmount,\n      appsToMount\n    );\n    return performAppChanges();\n  } else {\n    appsThatChanged = appsToLoad;\n    return loadApps();\n  }\n\n  function cancelNavigation(val = true) {\n    const promise =\n      typeof val?.then === \"function\" ? val : Promise.resolve(val);\n    cancelPromises.push(\n      promise.catch((err) => {\n        console.warn(\n          Error(\n            formatErrorMessage(\n              42,\n              __DEV__ &&\n                `single-spa: A cancelNavigation promise rejected with the following value: ${err}`\n            )\n          )\n        );\n        console.warn(err);\n\n        // Interpret a Promise rejection to mean that the navigation should not be canceled\n        return false;\n      })\n    );\n  }\n\n  function loadApps() {\n    return Promise.resolve().then(() => {\n      const loadPromises = appsToLoad.map(toLoadPromise);\n      let succeeded;\n\n      return (\n        Promise.all(loadPromises)\n          .then(callAllEventListeners)\n          // there are no mounted apps, before start() is called, so we always return []\n          .then(() => {\n            if (__PROFILE__) {\n              succeeded = true;\n            }\n\n            return [];\n          })\n          .catch((err) => {\n            if (__PROFILE__) {\n              succeeded = false;\n            }\n\n            callAllEventListeners();\n            throw err;\n          })\n          .finally(() => {\n            if (__PROFILE__) {\n              addProfileEntry(\n                \"routing\",\n                \"loadApps\",\n                profilerKind,\n                startTime,\n                performance.now(),\n                succeeded\n              );\n            }\n          })\n      );\n    });\n  }\n\n  function performAppChanges() {\n    return Promise.resolve().then(() => {\n      // https://github.com/single-spa/single-spa/issues/545\n      fireSingleSpaEvent(\n        appsThatChanged.length === 0\n          ? \"before-no-app-change\"\n          : \"before-app-change\",\n        getCustomEventDetail(true)\n      );\n\n      fireSingleSpaEvent(\n        \"before-routing-event\",\n        getCustomEventDetail(true, { cancelNavigation })\n      );\n\n      return Promise.all(cancelPromises).then((cancelValues) => {\n        const navigationIsCanceled = cancelValues.some((v) => v);\n\n        if (navigationIsCanceled) {\n          // Change url back to old url, without triggering the normal single-spa reroute\n          originalReplaceState.call(\n            window.history,\n            history.state,\n            \"\",\n            oldUrl.substring(location.origin.length)\n          );\n\n          // Single-spa's internal tracking of current url needs to be updated after the url change above\n          currentUrl = location.href;\n\n          // necessary for the reroute function to know that the current reroute is finished\n          appChangeUnderway = false;\n\n          if (__PROFILE__) {\n            addProfileEntry(\n              \"routing\",\n              \"navigationCanceled\",\n              profilerKind,\n              startTime,\n              performance.now(),\n              true\n            );\n          }\n\n          // Tell single-spa to reroute again, this time with the url set to the old URL\n          return reroute(pendingPromises, eventArguments, true);\n        }\n\n        const unloadPromises = appsToUnload.map(toUnloadPromise);\n\n        const unmountUnloadPromises = appsToUnmount\n          .map(toUnmountPromise)\n          .map((unmountPromise) => unmountPromise.then(toUnloadPromise));\n\n        const allUnmountPromises = unmountUnloadPromises.concat(unloadPromises);\n\n        const unmountAllPromise = Promise.all(allUnmountPromises);\n\n        let unmountFinishedTime;\n\n        unmountAllPromise.then(\n          () => {\n            if (__PROFILE__) {\n              unmountFinishedTime = performance.now();\n\n              addProfileEntry(\n                \"routing\",\n                \"unmountAndUnload\",\n                profilerKind,\n                startTime,\n                performance.now(),\n                true\n              );\n            }\n            fireSingleSpaEvent(\n              \"before-mount-routing-event\",\n              getCustomEventDetail(true)\n            );\n          },\n          (err) => {\n            if (__PROFILE__) {\n              addProfileEntry(\n                \"routing\",\n                \"unmountAndUnload\",\n                profilerKind,\n                startTime,\n                performance.now(),\n                true\n              );\n            }\n\n            throw err;\n          }\n        );\n\n        /* We load and bootstrap apps while other apps are unmounting, but we\n         * wait to mount the app until all apps are finishing unmounting\n         */\n        const loadThenMountPromises = appsToLoad.map((app) => {\n          return toLoadPromise(app).then((app) =>\n            tryToBootstrapAndMount(app, unmountAllPromise)\n          );\n        });\n\n        /* These are the apps that are already bootstrapped and just need\n         * to be mounted. They each wait for all unmounting apps to finish up\n         * before they mount.\n         */\n        const mountPromises = appsToMount\n          .filter((appToMount) => appsToLoad.indexOf(appToMount) < 0)\n          .map((appToMount) => {\n            return tryToBootstrapAndMount(appToMount, unmountAllPromise);\n          });\n        return unmountAllPromise\n          .catch((err) => {\n            callAllEventListeners();\n            throw err;\n          })\n          .then(() => {\n            /* Now that the apps that needed to be unmounted are unmounted, their DOM navigation\n             * events (like hashchange or popstate) should have been cleaned up. So it's safe\n             * to let the remaining captured event listeners to handle about the DOM event.\n             */\n            callAllEventListeners();\n\n            return Promise.all(loadThenMountPromises.concat(mountPromises))\n              .catch((err) => {\n                pendingPromises.forEach((promise) => promise.reject(err));\n                throw err;\n              })\n              .then(finishUpAndReturn)\n              .then(\n                () => {\n                  if (__PROFILE__) {\n                    addProfileEntry(\n                      \"routing\",\n                      \"loadAndMount\",\n                      profilerKind,\n                      unmountFinishedTime,\n                      performance.now(),\n                      true\n                    );\n                  }\n                },\n                (err) => {\n                  if (__PROFILE__) {\n                    addProfileEntry(\n                      \"routing\",\n                      \"loadAndMount\",\n                      profilerKind,\n                      unmountFinishedTime,\n                      performance.now(),\n                      false\n                    );\n                  }\n\n                  throw err;\n                }\n              );\n          });\n      });\n    });\n  }\n\n  function finishUpAndReturn() {\n    const returnValue = getMountedApps();\n    pendingPromises.forEach((promise) => promise.resolve(returnValue));\n\n    try {\n      const appChangeEventName =\n        appsThatChanged.length === 0 ? \"no-app-change\" : \"app-change\";\n      fireSingleSpaEvent(appChangeEventName, getCustomEventDetail());\n      fireSingleSpaEvent(\"routing-event\", getCustomEventDetail());\n    } catch (err) {\n      /* We use a setTimeout because if someone else's event handler throws an error, single-spa\n       * needs to carry on. If a listener to the event throws an error, it's their own fault, not\n       * single-spa's.\n       */\n      setTimeout(() => {\n        throw err;\n      });\n    }\n\n    /* Setting this allows for subsequent calls to reroute() to actually perform\n     * a reroute instead of just getting queued behind the current reroute call.\n     * We want to do this after the mounting/unmounting is done but before we\n     * resolve the promise for the `reroute` function.\n     */\n    appChangeUnderway = false;\n\n    if (peopleWaitingOnAppChange.length > 0) {\n      /* While we were rerouting, someone else triggered another reroute that got queued.\n       * So we need reroute again.\n       */\n      const nextPendingPromises = peopleWaitingOnAppChange;\n      peopleWaitingOnAppChange = [];\n      reroute(nextPendingPromises);\n    }\n\n    return returnValue;\n  }\n\n  /* We need to call all event listeners that have been delayed because they were\n   * waiting on single-spa. This includes haschange and popstate events for both\n   * the current run of performAppChanges(), but also all of the queued event listeners.\n   * We want to call the listeners in the same order as if they had not been delayed by\n   * single-spa, which means queued ones first and then the most recent one.\n   */\n  function callAllEventListeners() {\n    // During silent navigation (when navigation was canceled and we're going back to the old URL),\n    // we should not fire any popstate / hashchange events\n    if (!silentNavigation) {\n      pendingPromises.forEach((pendingPromise) => {\n        callCapturedEventListeners(pendingPromise.eventArguments);\n      });\n\n      callCapturedEventListeners(eventArguments);\n    }\n  }\n\n  function getCustomEventDetail(isBeforeChanges = false, extraProperties) {\n    const newAppStatuses = {};\n    const appsByNewStatus = {\n      // for apps that were mounted\n      [MOUNTED]: [],\n      // for apps that were unmounted\n      [NOT_MOUNTED]: [],\n      // apps that were forcibly unloaded\n      [NOT_LOADED]: [],\n      // apps that attempted to do something but are broken now\n      [SKIP_BECAUSE_BROKEN]: [],\n    };\n\n    if (isBeforeChanges) {\n      appsToLoad.concat(appsToMount).forEach((app, index) => {\n        addApp(app, MOUNTED);\n      });\n      appsToUnload.forEach((app) => {\n        addApp(app, NOT_LOADED);\n      });\n      appsToUnmount.forEach((app) => {\n        addApp(app, NOT_MOUNTED);\n      });\n    } else {\n      appsThatChanged.forEach((app) => {\n        addApp(app);\n      });\n    }\n\n    const result = {\n      detail: {\n        newAppStatuses,\n        appsByNewStatus,\n        totalAppChanges: appsThatChanged.length,\n        originalEvent: eventArguments?.[0],\n        oldUrl,\n        newUrl,\n      },\n    };\n\n    if (extraProperties) {\n      assign(result.detail, extraProperties);\n    }\n\n    return result;\n\n    function addApp(app, status) {\n      const appName = toName(app);\n      status = status || getAppStatus(appName);\n      newAppStatuses[appName] = status;\n      const statusArr = (appsByNewStatus[status] =\n        appsByNewStatus[status] || []);\n      statusArr.push(appName);\n    }\n  }\n\n  function fireSingleSpaEvent(name, eventProperties) {\n    // During silent navigation (caused by navigation cancelation), we should not\n    // fire any single-spa events\n    if (!silentNavigation) {\n      window.dispatchEvent(\n        new CustomEvent(`single-spa:${name}`, eventProperties)\n      );\n    }\n  }\n}\n\n/**\n * Let's imagine that some kind of delay occurred during application loading.\n * The user without waiting for the application to load switched to another route,\n * this means that we shouldn't bootstrap and mount that application, thus we check\n * twice if that application should be active before bootstrapping and mounting.\n * https://github.com/single-spa/single-spa/issues/524\n */\nfunction tryToBootstrapAndMount(app, unmountAllPromise) {\n  if (shouldBeActive(app)) {\n    return toBootstrapPromise(app).then((app) =>\n      unmountAllPromise.then(() =>\n        shouldBeActive(app) ? toMountPromise(app) : app\n      )\n    );\n  } else {\n    return unmountAllPromise.then(() => app);\n  }\n}\n","import { reroute } from \"./navigation/reroute.js\";\nimport { patchHistoryApi } from \"./navigation/navigation-events.js\";\nimport { isInBrowser } from \"./utils/runtime-environment.js\";\n\nlet started = false;\n\nexport function start(opts) {\n  started = true;\n  if (isInBrowser) {\n    patchHistoryApi(opts);\n    reroute();\n  }\n}\n\nexport function isStarted() {\n  return started;\n}\n","import { getRawAppData, unregisterApplication } from \"../applications/apps\";\nimport { reroute } from \"../navigation/reroute\";\nimport { NOT_LOADED } from \"../applications/app.helpers\";\nimport { toLoadPromise } from \"../lifecycles/load\";\nimport { toBootstrapPromise } from \"../lifecycles/bootstrap\";\nimport { getProfilerData } from \"./profiler\";\n\nexport default {\n  getRawAppData,\n  reroute,\n  NOT_LOADED,\n  toLoadPromise,\n  toBootstrapPromise,\n  unregisterApplication,\n  getProfilerData,\n};\n","export { start } from \"./start.js\";\nexport { ensureJQuerySupport } from \"./jquery-support.js\";\nexport {\n  setBootstrapMaxTime,\n  setMountMaxTime,\n  setUnmountMaxTime,\n  setUnloadMaxTime,\n} from \"./applications/timeouts.js\";\nexport {\n  registerApplication,\n  unregisterApplication,\n  getMountedApps,\n  getAppStatus,\n  unloadApplication,\n  checkActivityFunctions,\n  getAppNames,\n  pathToActiveWhen,\n} from \"./applications/apps.js\";\nexport {\n  navigateToUrl,\n  patchHistoryApi,\n} from \"./navigation/navigation-events.js\";\nexport { triggerAppChange } from \"./navigation/reroute.js\";\nexport {\n  addErrorHandler,\n  removeErrorHandler,\n} from \"./applications/app-errors.js\";\nexport { mountRootParcel } from \"./parcels/mount-parcel.js\";\n\nexport {\n  NOT_LOADED,\n  LOADING_SOURCE_CODE,\n  NOT_BOOTSTRAPPED,\n  BOOTSTRAPPING,\n  NOT_MOUNTED,\n  MOUNTING,\n  UPDATING,\n  LOAD_ERROR,\n  MOUNTED,\n  UNLOADING,\n  UNMOUNTING,\n  SKIP_BECAUSE_BROKEN,\n} from \"./applications/app.helpers.js\";\n\nimport devtools from \"./devtools/devtools\";\nimport { isInBrowser } from \"./utils/runtime-environment.js\";\n\nif (isInBrowser && window.__SINGLE_SPA_DEVTOOLS__) {\n  window.__SINGLE_SPA_DEVTOOLS__.exposedMethods = devtools;\n}\n"],"names":["NativeCustomEvent","CustomEvent","customEvent","p","detail","foo","type","e","useNative","document","createEvent","params","initCustomEvent","bubbles","cancelable","createEventObject","Boolean","errorHandlers","handleAppError","err","app","newStatus","transformedErr","transformErr","length","forEach","handler","setTimeout","addErrorHandler","Error","formatErrorMessage","push","removeErrorHandler","removedSomething","filter","h","isHandler","code","msg","_len","arguments","args","Array","_key","concat","join","ogErr","appOrParcel","result","errPrefix","objectType","toName","status","message","console","warn","JSON","stringify","appOrParcelName","NOT_LOADED","LOADING_SOURCE_CODE","NOT_BOOTSTRAPPED","BOOTSTRAPPING","NOT_MOUNTED","MOUNTING","MOUNTED","UPDATING","UNMOUNTING","UNLOADING","LOAD_ERROR","SKIP_BECAUSE_BROKEN","isActive","shouldBeActive","activeWhen","window","location","name","isParcel","unmountThisParcel","assign","i","key","find","arr","func","validLifecycleFn","fn","isArray","item","isArrayOfFns","flattenFnArray","lifecycle","fns","Promise","resolve","props","reduce","resultPromise","index","then","thisPromise","smellsLikeAPromise","reject","promise","catch","profileEntries","toBootstrapPromise","hardFail","bootstrap","reasonableTime","successfulBootstrap","toUnmountPromise","unmountChildrenParcels","Object","keys","parcels","map","parcelId","all","unmountAppOrParcel","parcelError","parentError","beforeFirstMountFired","firstMountFired","toMountPromise","dispatchEvent","setSkipBecauseBroken","parcelCount","rootParcels","mountRootParcel","mountParcel","apply","config","customProps","owningAppOrParcel","this","_typeof","id","domElement","externalRepresentation","passedConfigLoadingFunction","configLoadingFunction","parcel","parentName","mountPromise","value","resolveUnmount","rejectUnmount","loadPromise","bootstrapPromise","prototype","hasOwnProperty","call","mount","unmount","update","timeouts","ensureValidAppTimeouts","promiseWithoutReturnValue","unmountPromise","getStatus","getProps","bind","singleSpa","unmountSelf","defaultWarningMillis","globalTimeoutConfig","millis","dieOnTimeout","warningMillis","unload","setBootstrapMaxTime","time","setMountMaxTime","setUnmountMaxTime","setUnloadMaxTime","timeoutConfig","warningPeriod","finished","errored","val","maybeTimingOut","errMsg","shouldError","error","numWarnings","numMillis","toLoadPromise","loadApp","isUserErr","validationErrMessage","validationErrCode","loadErrorTime","appOpts","appOptsStr","devtools","overlays","Date","getTime","urlRerouteOnly","isInBrowser","capturedEventListeners","hashchange","popstate","routingEventsListeningTo","navigateToUrl","obj","url","href","currentTarget","preventDefault","current","parseUri","destination","indexOf","hash","host","pathname","search","history","pushState","callCapturedEventListeners","eventArguments","_this","eventType","listener","urlReroute","reroute","patchedUpdateState","updateState","methodName","urlBefore","urlAfter","createPopStateEvent","state","originalMethodName","evt","PopStateEvent","initPopStateEvent","singleSpaTrigger","originalReplaceState","historyApiIsPatched","patchHistoryApi","opts","replaceState","addEventListener","originalAddEventListener","originalRemoveEventListener","removeEventListener","eventName","listenerFn","str","anchor","createElement","singleSpaNavigate","hasInitialized","ensureJQuerySupport","jQuery","undefined","$","jquery","originalJQueryOn","on","originalJQueryOff","off","eventString","captureRoutingEvents","originalJQueryFunction","nativeFunctionToCall","originalArgs","split","replace","trim","appsToUnload","toUnloadPromise","unloadInfo","finishUnloadingApp","unloadPromise","errorUnloadingApp","addAppToUnload","promiseGetter","defineProperty","get","getAppUnloadInfo","appName","apps","getAppChanges","appsToUnmount","appsToLoad","appsToMount","currentTime","appShouldBeActive","getMountedApps","getAppNames","getAppStatus","startWarningInitialized","registerApplication","appNameOrConfig","appOrLoadApp","registration","validKeys","invalidKeys","prop","allowsStringAndFunction","every","validCustomProps","validateRegisterWithConfig","validateRegisterWithArguments","sanitizeCustomProps","activeWhenArray","activeWhenOrPath","pathToActiveWhen","some","sanitizeActiveWhen","sanitizeArguments","isStarted","options","selectors","checkActivityFunctions","unregisterApplication","unloadApplication","waitForUnmount","appIndex","splice","App","appUnloadInfo","immediatelyUnloadApp","activeApp","triggerAppChange","path","exactMatch","regex","lastIndex","inDynamic","regexStr","charIndex","char","appendToRegex","RegExp","anyCharMaybeTrailingSlashRegex","commonStringSubPath","slice","suffix","charAt","toDynamicPathValidatorRegex","origin","protocol","route","test","appChangeUnderway","peopleWaitingOnAppChange","currentUrl","pendingPromises","silentNavigation","appsThatChanged","_getAppChanges","cancelPromises","oldUrl","newUrl","performAppChanges","loadApps","cancelNavigation","loadPromises","callAllEventListeners","finally","fireSingleSpaEvent","getCustomEventDetail","cancelValues","v","substring","unloadPromises","allUnmountPromises","unmountAllPromise","loadThenMountPromises","tryToBootstrapAndMount","mountPromises","appToMount","finishUpAndReturn","returnValue","nextPendingPromises","pendingPromise","_appsByNewStatus","isBeforeChanges","extraProperties","newAppStatuses","appsByNewStatus","_defineProperty","addApp","totalAppChanges","originalEvent","eventProperties","started","start","getRawAppData","getProfilerData","__SINGLE_SPA_DEVTOOLS__","exposedMethods"],"mappings":"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"}