UNPKG

76.7 kBSource Map (JSON)View Raw
1{"version":3,"file":"single-spa.min.js","sources":["../../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/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/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) {\n const transformedErr = transformErr(err, app);\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) {\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 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 isntActive(app) {\n return !isActive(app);\n}\n\nexport function isLoaded(app) {\n return (\n app.status !== NOT_LOADED &&\n app.status !== LOADING_SOURCE_CODE &&\n app.status !== LOAD_ERROR\n );\n}\n\nexport function isntLoaded(app) {\n return !isLoaded(app);\n}\n\nexport function shouldBeActive(app) {\n try {\n return app.activeWhen(window.location);\n } catch (err) {\n handleAppError(err, app);\n app.status = SKIP_BECAUSE_BROKEN;\n }\n}\n\nexport function shouldntBeActive(app) {\n try {\n return !app.activeWhen(window.location);\n } catch (err) {\n handleAppError(err, app);\n app.status = SKIP_BECAUSE_BROKEN;\n }\n}\n\nexport function notSkipped(item) {\n return (\n item !== SKIP_BECAUSE_BROKEN &&\n (!item || item.status !== SKIP_BECAUSE_BROKEN)\n );\n}\n\nexport function withoutLoadErrors(app) {\n return app.status === LOAD_ERROR\n ? new Date().getTime() - app.loadErrorTime >= 200\n : true;\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 Array.isArray(arr) && !find(arr, item => typeof item !== \"function\");\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","import {\n NOT_BOOTSTRAPPED,\n BOOTSTRAPPING,\n NOT_MOUNTED,\n SKIP_BECAUSE_BROKEN\n} from \"../applications/app.helpers.js\";\nimport { reasonableTime } from \"../applications/timeouts.js\";\nimport { handleAppError, transformErr } from \"../applications/app-errors.js\";\n\nexport function toBootstrapPromise(appOrParcel, hardFail) {\n return Promise.resolve().then(() => {\n if (appOrParcel.status !== NOT_BOOTSTRAPPED) {\n return appOrParcel;\n }\n\n appOrParcel.status = BOOTSTRAPPING;\n\n return reasonableTime(appOrParcel, \"bootstrap\")\n .then(() => {\n appOrParcel.status = NOT_MOUNTED;\n return appOrParcel;\n })\n .catch(err => {\n appOrParcel.status = SKIP_BECAUSE_BROKEN;\n if (hardFail) {\n throw transformErr(err, appOrParcel);\n } else {\n handleAppError(err, appOrParcel);\n return appOrParcel;\n }\n });\n });\n}\n","import {\n UNMOUNTING,\n NOT_MOUNTED,\n MOUNTED,\n SKIP_BECAUSE_BROKEN\n} from \"../applications/app.helpers.js\";\nimport { handleAppError, transformErr } from \"../applications/app-errors.js\";\nimport { reasonableTime } from \"../applications/timeouts.js\";\n\nexport function toUnmountPromise(appOrParcel, hardFail) {\n return Promise.resolve().then(() => {\n if (appOrParcel.status !== MOUNTED) {\n return appOrParcel;\n }\n appOrParcel.status = UNMOUNTING;\n\n const unmountChildrenParcels = Object.keys(\n appOrParcel.parcels\n ).map(parcelId => appOrParcel.parcels[parcelId].unmountThisParcel());\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 const transformedErr = transformErr(parentError, appOrParcel);\n appOrParcel.status = SKIP_BECAUSE_BROKEN;\n throw transformedErr;\n } else {\n handleAppError(parentError, appOrParcel);\n appOrParcel.status = 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\")\n .then(() => {\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 .catch(err => {\n if (hardFail) {\n const transformedErr = transformErr(err, appOrParcel);\n appOrParcel.status = SKIP_BECAUSE_BROKEN;\n throw transformedErr;\n } else {\n handleAppError(err, appOrParcel);\n appOrParcel.status = SKIP_BECAUSE_BROKEN;\n }\n });\n }\n });\n}\n","import {\n NOT_MOUNTED,\n MOUNTED,\n SKIP_BECAUSE_BROKEN\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\";\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 if (!beforeFirstMountFired) {\n window.dispatchEvent(new CustomEvent(\"single-spa:before-first-mount\"));\n beforeFirstMountFired = true;\n }\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 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).then(\n setSkipBecauseBroken,\n setSkipBecauseBroken\n );\n\n function setSkipBecauseBroken() {\n if (!hardFail) {\n handleAppError(err, appOrParcel);\n appOrParcel.status = SKIP_BECAUSE_BROKEN;\n return appOrParcel;\n } else {\n const transformedErr = transformErr(err, appOrParcel);\n appOrParcel.status = SKIP_BECAUSE_BROKEN;\n throw transformedErr;\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 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 id = parcelCount++;\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 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\n return toUnmountPromise(parcel, true)\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 const name = config.name || `parcel-${id}`;\n\n if (!validLifecycleFn(config.bootstrap)) {\n throw Error(\n formatErrorMessage(\n 9,\n __DEV__ && `Parcel ${name} must have a valid 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} from \"../applications/app.helpers.js\";\nimport {\n transformErr,\n formatErrorMessage\n} from \"../applications/app-errors.js\";\nimport { reasonableTime } from \"../applications/timeouts.js\";\n\nexport function toUpdatePromise(parcel) {\n return Promise.resolve().then(() => {\n if (parcel.status !== MOUNTED) {\n throw Error(\n formatErrorMessage(\n 32,\n __DEV__ &&\n `Cannot update parcel '${toName(\n parcel\n )}' because it is not mounted`,\n toName(parcel)\n )\n );\n }\n\n parcel.status = UPDATING;\n\n return reasonableTime(parcel, \"update\")\n .then(() => {\n parcel.status = MOUNTED;\n return parcel;\n })\n .catch(err => {\n const transformedErr = transformErr(err, parcel);\n parcel.status = SKIP_BECAUSE_BROKEN;\n throw transformedErr;\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\";\n\nexport function getProps(appOrParcel) {\n const result = assign({}, appOrParcel.customProps, {\n name: toName(appOrParcel),\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\";\n\nexport function toLoadPromise(app) {\n return Promise.resolve().then(() => {\n if (app.status !== NOT_LOADED && app.status !== LOAD_ERROR) {\n return app;\n }\n\n app.status = LOADING_SOURCE_CODE;\n\n let appOpts, isUserErr;\n\n return Promise.resolve()\n .then(() => {\n const loadPromise = app.loadImpl(getProps(app));\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 app\n )}', loadingFunction, activityFunction)`,\n toName(app)\n )\n );\n }\n return loadPromise.then(val => {\n app.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 (!validLifecycleFn(appOpts.bootstrap)) {\n validationErrCode = 35;\n if (__DEV__) {\n validationErrMessage = `does not export a 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 bootstrap 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 bootstrap 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 app\n )}' resolved with the following, which does not have bootstrap, mount, and unmount functions`,\n type,\n toName(app),\n appOptsStr\n ),\n appOpts\n );\n handleAppError(validationErrMessage, app);\n app.status = SKIP_BECAUSE_BROKEN;\n return app;\n }\n\n if (appOpts.devtools && appOpts.devtools.overlays) {\n app.devtools.overlays = assign(\n {},\n app.devtools.overlays,\n appOpts.devtools.overlays\n );\n }\n\n app.status = NOT_BOOTSTRAPPED;\n app.bootstrap = flattenFnArray(appOpts, \"bootstrap\");\n app.mount = flattenFnArray(appOpts, \"mount\");\n app.unmount = flattenFnArray(appOpts, \"unmount\");\n app.unload = flattenFnArray(appOpts, \"unload\");\n app.timeouts = ensureValidAppTimeouts(appOpts.timeouts);\n\n return app;\n });\n })\n .catch(err => {\n handleAppError(err, app);\n if (isUserErr) {\n app.status = SKIP_BECAUSE_BROKEN;\n } else {\n app.status = LOAD_ERROR;\n app.loadErrorTime = new Date().getTime();\n }\n\n return app;\n });\n });\n}\n","import { reroute } from \"./reroute.js\";\nimport { find } from \"../utils/find.js\";\nimport { formatErrorMessage } from \"../applications/app-errors.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.pathname\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\nfunction urlReroute() {\n reroute([], arguments);\n}\n\n// We will trigger an app change for any routing events.\nwindow.addEventListener(\"hashchange\", urlReroute);\nwindow.addEventListener(\"popstate\", urlReroute);\n\n// Monkeypatch addEventListener so that we can ensure correct timing\nconst originalAddEventListener = window.addEventListener;\nconst originalRemoveEventListener = window.removeEventListener;\nwindow.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\nwindow.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 return;\n }\n }\n\n return originalRemoveEventListener.apply(this, arguments);\n};\n\nconst originalPushState = window.history.pushState;\nwindow.history.pushState = function(state) {\n const result = originalPushState.apply(this, arguments);\n\n urlReroute(createPopStateEvent(state));\n\n return result;\n};\n\nconst originalReplaceState = window.history.replaceState;\nwindow.history.replaceState = function(state) {\n const result = originalReplaceState.apply(this, arguments);\n urlReroute(createPopStateEvent(state));\n return result;\n};\n\nfunction createPopStateEvent(state) {\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.\n try {\n return 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 const evt = document.createEvent(\"PopStateEvent\");\n evt.initPopStateEvent(\"popstate\", false, false, state);\n return evt;\n }\n}\n\n/* For convenience in `onclick` attributes, we expose a global function for navigating to\n * whatever an <a> tag's href is.\n */\nwindow.singleSpaNavigate = navigateToUrl;\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 SKIP_BECAUSE_BROKEN,\n isntActive,\n toName\n} from \"../applications/app.helpers.js\";\nimport { handleAppError } from \"../applications/app-errors.js\";\nimport { reasonableTime } from \"../applications/timeouts.js\";\n\nconst appsToUnload = {};\n\nexport function toUnloadPromise(app) {\n return Promise.resolve().then(() => {\n const unloadInfo = appsToUnload[toName(app)];\n\n if (!unloadInfo) {\n /* No one has called unloadApplication for this app,\n */\n return app;\n }\n\n if (app.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(app, unloadInfo);\n return app;\n }\n\n if (app.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(() => app);\n }\n\n if (app.status !== NOT_MOUNTED) {\n /* The app cannot be unloaded until it is unmounted.\n */\n return app;\n }\n\n app.status = UNLOADING;\n return reasonableTime(app, \"unload\")\n .then(() => {\n finishUnloadingApp(app, unloadInfo);\n return app;\n })\n .catch(err => {\n errorUnloadingApp(app, unloadInfo, err);\n return app;\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);\n app.status = 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\nexport function getAppsToUnload() {\n return Object.keys(appsToUnload)\n .map(appName => appsToUnload[appName].app)\n .filter(isntActive);\n}\n","import { ensureJQuerySupport } from \"../jquery-support.js\";\nimport {\n isActive,\n isLoaded,\n isntLoaded,\n toName,\n NOT_LOADED,\n shouldBeActive,\n shouldntBeActive,\n isntActive,\n notSkipped,\n withoutLoadErrors\n} from \"./app.helpers.js\";\nimport { reroute } 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\";\n\nconst apps = [];\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\nexport function registerApplication(\n appName,\n applicationOrLoadingFn,\n activityFn,\n customProps = {}\n) {\n if (typeof appName !== \"string\" || appName.length === 0)\n throw Error(\n formatErrorMessage(\n 20,\n __DEV__ &&\n `The first argument to registerApplication must be a non-empty string 'appName'`\n )\n );\n if (getAppNames().indexOf(appName) !== -1)\n throw Error(\n formatErrorMessage(\n 21,\n __DEV__ && `There is already an app declared with name ${appName}`,\n appName\n )\n );\n if (typeof customProps !== \"object\" || Array.isArray(customProps))\n throw Error(\n formatErrorMessage(22, __DEV__ && \"customProps must be an object\")\n );\n\n if (!applicationOrLoadingFn)\n throw Error(\n formatErrorMessage(\n 23,\n __DEV__ && \"The application or loading function is required\"\n )\n );\n\n let loadImpl;\n if (typeof applicationOrLoadingFn !== \"function\") {\n // applicationOrLoadingFn is an application\n loadImpl = () => Promise.resolve(applicationOrLoadingFn);\n } else {\n // applicationOrLoadingFn is a loadingFn\n loadImpl = applicationOrLoadingFn;\n }\n\n if (typeof activityFn !== \"function\")\n throw Error(\n formatErrorMessage(\n 24,\n __DEV__ && `The activityFunction argument must be a function`\n )\n );\n\n apps.push({\n loadErrorTime: null,\n name: appName,\n loadImpl,\n activeWhen: activityFn,\n status: NOT_LOADED,\n parcels: {},\n devtools: {\n overlays: {\n options: {},\n selectors: []\n }\n },\n customProps\n });\n\n ensureJQuerySupport();\n\n reroute();\n}\n\nexport function checkActivityFunctions(location) {\n return apps.filter(app => app.activeWhen(location)).map(toName);\n}\n\nexport function getAppsToLoad() {\n return apps\n .filter(notSkipped)\n .filter(withoutLoadErrors)\n .filter(isntLoaded)\n .filter(shouldBeActive);\n}\n\nexport function getAppsToUnmount() {\n return apps\n .filter(notSkipped)\n .filter(isActive)\n .filter(shouldntBeActive);\n}\n\nexport function getAppsToMount() {\n return apps\n .filter(notSkipped)\n .filter(isntActive)\n .filter(isLoaded)\n .filter(shouldBeActive);\n}\n\nexport function unregisterApplication(appName) {\n if (!apps.find(app => toName(app) === appName)) {\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 return unloadApplication(appName).then(() => {\n const appIndex = apps.findIndex(app => toName(app) === 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 toUnmountPromise(app)\n .then(toUnloadPromise)\n .then(() => {\n resolve();\n setTimeout(() => {\n // reroute, but the unload promise is done\n reroute();\n });\n })\n .catch(reject);\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 getMountedApps,\n getAppsToLoad,\n getAppsToUnmount,\n getAppsToMount\n} from \"../applications/apps.js\";\nimport { callCapturedEventListeners } from \"./navigation-events.js\";\nimport { getAppsToUnload, toUnloadPromise } from \"../lifecycles/unload.js\";\n\nlet appChangeUnderway = false,\n peopleWaitingOnAppChange = [];\n\nexport function triggerAppChange() {\n // Call reroute with no arguments, intentionally\n return reroute();\n}\n\nexport function reroute(pendingPromises = [], eventArguments) {\n if (appChangeUnderway) {\n return new Promise((resolve, reject) => {\n peopleWaitingOnAppChange.push({\n resolve,\n reject,\n eventArguments\n });\n });\n }\n\n appChangeUnderway = true;\n let wasNoOp = true;\n\n if (isStarted()) {\n return performAppChanges();\n } else {\n return loadApps();\n }\n\n function loadApps() {\n return Promise.resolve().then(() => {\n const loadPromises = getAppsToLoad().map(toLoadPromise);\n\n if (loadPromises.length > 0) {\n wasNoOp = false;\n }\n\n return Promise.all(loadPromises)\n .then(finishUpAndReturn)\n .catch(err => {\n callAllEventListeners();\n throw err;\n });\n });\n }\n\n function performAppChanges() {\n return Promise.resolve().then(() => {\n window.dispatchEvent(\n new CustomEvent(\n \"single-spa:before-routing-event\",\n getCustomEventDetail()\n )\n );\n const unloadPromises = getAppsToUnload().map(toUnloadPromise);\n\n const unmountUnloadPromises = getAppsToUnmount()\n .map(toUnmountPromise)\n .map(unmountPromise => unmountPromise.then(toUnloadPromise));\n\n const allUnmountPromises = unmountUnloadPromises.concat(unloadPromises);\n if (allUnmountPromises.length > 0) {\n wasNoOp = false;\n }\n\n const unmountAllPromise = Promise.all(allUnmountPromises);\n\n const appsToLoad = getAppsToLoad();\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)\n .then(toBootstrapPromise)\n .then(app => {\n return unmountAllPromise.then(() => toMountPromise(app));\n });\n });\n if (loadThenMountPromises.length > 0) {\n wasNoOp = false;\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 = getAppsToMount()\n .filter(appToMount => appsToLoad.indexOf(appToMount) < 0)\n .map(appToMount => {\n return toBootstrapPromise(appToMount)\n .then(() => unmountAllPromise)\n .then(() => toMountPromise(appToMount));\n });\n if (mountPromises.length > 0) {\n wasNoOp = false;\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(false));\n });\n });\n }\n\n function finishUpAndReturn(callEventListeners = true) {\n const returnValue = getMountedApps();\n\n if (callEventListeners) {\n callAllEventListeners();\n }\n pendingPromises.forEach(promise => promise.resolve(returnValue));\n\n try {\n const appChangeEventName = wasNoOp\n ? \"single-spa:no-app-change\"\n : \"single-spa:app-change\";\n window.dispatchEvent(\n new CustomEvent(appChangeEventName, getCustomEventDetail())\n );\n window.dispatchEvent(\n new CustomEvent(\"single-spa:routing-event\", getCustomEventDetail())\n );\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 pendingPromises.forEach(pendingPromise => {\n callCapturedEventListeners(pendingPromise.eventArguments);\n });\n\n callCapturedEventListeners(eventArguments);\n }\n\n function getCustomEventDetail() {\n const result = { detail: {} };\n\n if (eventArguments && eventArguments[0]) {\n result.detail.originalEvent = eventArguments[0];\n }\n\n return result;\n }\n}\n","import { reroute } from \"./navigation/reroute.js\";\nimport { formatErrorMessage } from \"./applications/app-errors.js\";\n\nlet started = false;\n\nexport function start() {\n started = true;\n reroute();\n}\n\nexport function isStarted() {\n return started;\n}\n\nsetTimeout(() => {\n if (!started) {\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","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\";\n\nexport default {\n getRawAppData,\n reroute,\n NOT_LOADED,\n toLoadPromise,\n toBootstrapPromise,\n unregisterApplication\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 getMountedApps,\n getAppStatus,\n unloadApplication,\n checkActivityFunctions,\n getAppNames\n} from \"./applications/apps.js\";\nexport { navigateToUrl } 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 UNMOUNTING,\n SKIP_BECAUSE_BROKEN\n} from \"./applications/app.helpers.js\";\n\nimport devtools from \"./devtools/devtools\";\nif (window && window.__SINGLE_SPA_DEVTOOLS__) {\n window.__SINGLE_SPA_DEVTOOLS__.exposedMethods = devtools;\n}\n"],"names":["NativeCustomEvent","CustomEvent","p","detail","foo","type","e","useNative","document","createEvent","params","initCustomEvent","bubbles","cancelable","createEventObject","Boolean","errorHandlers","handleAppError","err","app","transformedErr","transformErr","length","forEach","handler","setTimeout","addErrorHandler","Error","formatErrorMessage","push","removeErrorHandler","removedSomething","filter","h","isHandler","code","msg","args","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","isntActive","isLoaded","isntLoaded","shouldBeActive","activeWhen","window","location","shouldntBeActive","notSkipped","item","withoutLoadErrors","Date","getTime","loadErrorTime","name","isParcel","unmountThisParcel","assign","i","arguments","key","find","arr","func","validLifecycleFn","fn","Array","isArray","flattenFnArray","lifecycle","fns","Promise","resolve","props","reduce","resultPromise","index","then","thisPromise","smellsLikeAPromise","reject","promise","catch","toBootstrapPromise","hardFail","reasonableTime","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","domElement","externalRepresentation","id","passedConfigLoadingFunction","configLoadingFunction","parcel","parentName","value","resolveUnmount","rejectUnmount","loadPromise","bootstrapPromise","bootstrap","mount","unmount","update","timeouts","ensureValidAppTimeouts","promiseWithoutReturnValue","toUpdatePromise","mountPromise","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","loadImpl","isUserErr","validationErrCode","appOpts","appOptsStr","validationErrMessage","devtools","overlays","capturedEventListeners","hashchange","popstate","routingEventsListeningTo","navigateToUrl","obj","url","href","currentTarget","preventDefault","current","parseUri","destination","indexOf","hash","host","pathname","search","history","pushState","callCapturedEventListeners","eventArguments","eventType","listener","urlReroute","reroute","addEventListener","originalAddEventListener","originalRemoveEventListener","removeEventListener","eventName","listenerFn","originalPushState","state","createPopStateEvent","originalReplaceState","replaceState","PopStateEvent","evt","initPopStateEvent","str","anchor","createElement","singleSpaNavigate","hasInitialized","ensureJQuerySupport","jQuery","$","jquery","originalJQueryOn","on","originalJQueryOff","off","eventString","captureRoutingEvents","call","originalJQueryFunction","nativeFunctionToCall","originalArgs","split","replace","trim","appsToUnload","toUnloadPromise","unloadInfo","finishUnloadingApp","errorUnloadingApp","addAppToUnload","promiseGetter","defineProperty","get","apps","getMountedApps","getAppNames","getAppStatus","appName","registerApplication","applicationOrLoadingFn","activityFn","options","selectors","checkActivityFunctions","getAppsToLoad","unloadApplication","opts","waitForUnmount","App","appUnloadInfo","getAppUnloadInfo","immediatelyUnloadApp","appChangeUnderway","peopleWaitingOnAppChange","triggerAppChange","pendingPromises","wasNoOp","started","getCustomEventDetail","unloadPromises","allUnmountPromises","concat","unmountAllPromise","appsToLoad","loadThenMountPromises","mountPromises","appToMount","callAllEventListeners","finishUpAndReturn","loadPromises","callEventListeners","returnValue","appChangeEventName","nextPendingPromises","pendingPromise","originalEvent","start","getRawAppData","unregisterApplication","appIndex","findIndex","splice","__SINGLE_SPA_DEVTOOLS__","exposedMethods"],"mappings":"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"}
\No newline at end of file