{"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/applications/timeouts.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/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","let 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('a single-spa error handler must be a function');\n }\n\n errorHandlers.push(handler);\n}\n\nexport function removeErrorHandler(handler) {\n if (typeof handler !== 'function') {\n throw Error('a single-spa error handler must be a function');\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 transformErr(ogErr, appOrParcel) {\n const objectType = appOrParcel.unmountThisParcel ? 'Parcel' : 'Application';\n const errPrefix = `${objectType} '${appOrParcel.name}' 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(`While ${appOrParcel.status}, '${appOrParcel.name}' rejected its lifecycle function promise with a non-Error. This will cause stack traces to not be accurate.`);\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.appName = appOrParcel.name;\n result.appOrParcelName = appOrParcel.name;\n try {\n result.name = appOrParcel.name\n } catch (err) {\n // See https://github.com/CanopyTax/single-spa/issues/323\n // In a future major release, we can remove the `name` property altogether,\n // as a breaking change, in favor of appOrParcelName.\n }\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 app.status !== NOT_LOADED && app.status !== LOADING_SOURCE_CODE && app.status !== LOAD_ERROR;\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 notBootstrapped(app) {\n return app.status !== NOT_BOOTSTRAPPED;\n}\n\nexport function notSkipped(item) {\n return item !== SKIP_BECAUSE_BROKEN && (!item || item.status !== SKIP_BECAUSE_BROKEN);\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","const globalTimeoutConfig = {\n bootstrap: {\n millis: 4000,\n dieOnTimeout: false,\n },\n mount: {\n millis: 3000,\n dieOnTimeout: false,\n },\n unmount: {\n millis: 3000,\n dieOnTimeout: false,\n },\n unload: {\n millis: 3000,\n dieOnTimeout: false,\n },\n};\n\nexport function setBootstrapMaxTime(time, dieOnTimeout = false) {\n if (typeof time !== 'number' || time <= 0) {\n throw Error(`bootstrap max time must be a positive integer number of milliseconds`);\n }\n\n globalTimeoutConfig.bootstrap = {\n millis: time,\n dieOnTimeout,\n };\n}\n\nexport function setMountMaxTime(time, dieOnTimeout = false) {\n if (typeof time !== 'number' || time <= 0) {\n throw Error(`mount max time must be a positive integer number of milliseconds`);\n }\n\n globalTimeoutConfig.mount = {\n millis: time,\n dieOnTimeout,\n };\n}\n\nexport function setUnmountMaxTime(time, dieOnTimeout = false) {\n if (typeof time !== 'number' || time <= 0) {\n throw Error(`unmount max time must be a positive integer number of milliseconds`);\n }\n\n globalTimeoutConfig.unmount = {\n millis: time,\n dieOnTimeout,\n };\n}\n\nexport function setUnloadMaxTime(time, dieOnTimeout = false) {\n if (typeof time !== 'number' || time <= 0) {\n throw Error(`unload max time must be a positive integer number of milliseconds`);\n }\n\n globalTimeoutConfig.unload = {\n millis: time,\n dieOnTimeout,\n };\n}\n\nexport function reasonableTime(promise, description, timeoutConfig) {\n const warningPeriod = 1000;\n\n return new Promise((resolve, reject) => {\n let finished = false;\n let errored = false;\n\n promise\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 function maybeTimingOut(shouldError) {\n if (!finished) {\n if (shouldError === true) {\n errored = true;\n if (timeoutConfig.dieOnTimeout) {\n reject(`${description} did not resolve or reject for ${timeoutConfig.millis} milliseconds`);\n } else {\n console.error(`${description} did not resolve or reject for ${timeoutConfig.millis} milliseconds -- we're no longer going to warn you about it.`);\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(`${description} did not resolve or reject within ${numMillis} milliseconds`);\n if (numMillis + warningPeriod < timeoutConfig.millis) {\n setTimeout(() => maybeTimingOut(numWarnings + 1), warningPeriod);\n }\n }\n }\n }\n });\n}\n\nexport function ensureValidAppTimeouts(timeouts = {}) {\n return {\n ...globalTimeoutConfig,\n ...timeouts,\n }\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 typeof item !== 'function');\n }\n}\n\nexport function flattenFnArray(fns, description) {\n fns = Array.isArray(fns) ? fns : [fns];\n if (fns.length === 0) {\n fns = [() => Promise.resolve()];\n }\n\n return function(props) {\n return new Promise((resolve, reject) => {\n waitForPromises(0);\n\n function waitForPromises(index) {\n const promise = fns[index](props);\n if (!smellsLikeAPromise(promise)) {\n reject(`${description} at index ${index} did not return a promise`);\n } else {\n promise\n .then(() => {\n if (index === fns.length - 1) {\n resolve();\n } else {\n waitForPromises(index + 1);\n }\n })\n .catch(reject);\n }\n }\n });\n }\n}\n\nexport function smellsLikeAPromise(promise) {\n return promise && typeof promise.then === 'function' && typeof promise.catch === 'function';\n}\n","import { NOT_BOOTSTRAPPED, BOOTSTRAPPING, NOT_MOUNTED, SKIP_BECAUSE_BROKEN } from '../applications/app.helpers.js';\nimport { reasonableTime } from '../applications/timeouts.js';\nimport { handleAppError, transformErr } from '../applications/app-errors.js';\nimport { getProps } from './prop.helpers.js'\n\nexport function toBootstrapPromise(appOrParcel, hardFail = false) {\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(getProps(appOrParcel)), `Bootstrapping appOrParcel '${appOrParcel.name}'`, appOrParcel.timeouts.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 const transformedErr = transformErr(err, appOrParcel)\n throw transformedErr\n } else {\n handleAppError(err, appOrParcel);\n return appOrParcel;\n }\n })\n })\n}\n","import { UNMOUNTING, NOT_MOUNTED, MOUNTED, SKIP_BECAUSE_BROKEN } from '../applications/app.helpers.js';\nimport { handleAppError, transformErr } from '../applications/app-errors.js';\nimport { reasonableTime } from '../applications/timeouts.js';\nimport { getProps } from './prop.helpers.js';\n\nexport function toUnmountPromise(appOrParcel, hardFail = false) {\n return Promise.resolve().then(() => {\n if (appOrParcel.status !== MOUNTED) {\n return appOrParcel;\n }\n appOrParcel.status = UNMOUNTING;\n\n const unmountChildrenParcels = Object.keys(appOrParcel.parcels)\n .map(parcelId => appOrParcel.parcels[parcelId].unmountThisParcel());\n\n let parcelError;\n\n return Promise.all(unmountChildrenParcels)\n .then(\n unmountAppOrParcel,\n parcelError => {\n // There is a parcel unmount error\n return unmountAppOrParcel()\n .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 )\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(getProps(appOrParcel)), `Unmounting application ${appOrParcel.name}'`, appOrParcel.timeouts.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 { NOT_MOUNTED, MOUNTED, SKIP_BECAUSE_BROKEN } 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 { getProps } from './prop.helpers.js';\nimport { toUnmountPromise } from './unmount.js';\n\nlet beforeFirstMountFired = false;\nlet firstMountFired = false;\n\nexport function toMountPromise(appOrParcel, hardFail = false) {\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(getProps(appOrParcel)), `Mounting application '${appOrParcel.name}'`, appOrParcel.timeouts.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)\n .then(setSkipBecauseBroken, setSkipBecauseBroken)\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 { validLifecycleFn, flattenFnArray } from '../lifecycles/lifecycle.helpers.js';\nimport { NOT_BOOTSTRAPPED, NOT_MOUNTED, MOUNTED, UPDATING, LOADING_SOURCE_CODE, SKIP_BECAUSE_BROKEN } 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';\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('Cannot mount parcel without a config object or config loading function');\n }\n\n if (config.name && typeof config.name !== 'string') {\n throw Error('Parcel name must be a string, if provided');\n }\n\n if (typeof customProps !== 'object') {\n throw Error(`Parcel ${name} has invalid customProps -- must be an object`);\n }\n\n if (!customProps.domElement) {\n throw Error(`Parcel ${name} cannot be mounted without a domElement provided as a prop`);\n }\n\n const id = parcelCount++;\n\n const passedConfigLoadingFunction = typeof config === 'function'\n const configLoadingFunction = passedConfigLoadingFunction ? config : () => Promise.resolve(config)\n\n // Internal representation\n const parcel = {\n id,\n parcels: {},\n status: passedConfigLoadingFunction ? LOADING_SOURCE_CODE : NOT_BOOTSTRAPPED,\n customProps,\n parentName: owningAppOrParcel.name,\n unmountThisParcel() {\n if (parcel.status !== MOUNTED) {\n throw Error(`Cannot unmount parcel '${name}' -- it is in a ${parcel.status} status`);\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(`When mounting a parcel, the config loading function must return a promise that resolves with the parcel config`)\n }\n\n loadPromise = loadPromise.then(config => {\n if (!config) {\n throw Error(`When mounting a parcel, the config loading function returned a promise that did not resolve with a parcel config`)\n }\n\n const name = config.name || `parcel-${id}`;\n\n if (!validLifecycleFn(config.bootstrap)) {\n throw Error(`Parcel ${name} must have a valid bootstrap function`);\n }\n\n if (!validLifecycleFn(config.mount)) {\n throw Error(`Parcel ${name} must have a valid mount function`);\n }\n\n if (!validLifecycleFn(config.unmount)) {\n throw Error(`Parcel ${name} must have a valid unmount function`);\n }\n\n if (config.update && !validLifecycleFn(config.update)) {\n throw Error(`Parcel ${name} provided an invalid update function`);\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(() => toBootstrapPromise(parcel, true));\n const mountPromise = bootstrapPromise.then(() => toMountPromise(parcel, true));\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\n .resolve()\n .then(() => {\n if (parcel.status !== NOT_MOUNTED) {\n throw Error(`Cannot mount parcel '${name}' -- it is in a ${parcel.status} status`);\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(\n parcel.unmountThisParcel()\n );\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 { UPDATING, MOUNTED, SKIP_BECAUSE_BROKEN } from '../applications/app.helpers.js';\nimport { transformErr } from '../applications/app-errors.js';\nimport { reasonableTime } from '../applications/timeouts.js';\nimport { getProps } from './prop.helpers.js';\n\nexport function toUpdatePromise(parcel) {\n return Promise.resolve().then(() => {\n if (parcel.status !== MOUNTED) {\n throw Error(`Cannot update parcel '${parcel.name}' because it is not mounted`)\n }\n\n parcel.status = UPDATING;\n\n return reasonableTime(parcel.update(getProps(parcel)), `Updating parcel '${parcel.name}'`, parcel.timeouts.mount)\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\n","import * as singleSpa from '../single-spa.js'\nimport { mountParcel } from '../parcels/mount-parcel.js';\n\nexport function getProps(appOrParcel) {\n const result = {\n ...appOrParcel.customProps,\n name: appOrParcel.name,\n mountParcel: mountParcel.bind(appOrParcel),\n singleSpa\n };\n\n if (appOrParcel.unmountThisParcel) {\n result.unmountSelf = appOrParcel.unmountThisParcel;\n }\n\n return result;\n}\n","import { LOAD_ERROR, NOT_BOOTSTRAPPED, LOADING_SOURCE_CODE, SKIP_BECAUSE_BROKEN, NOT_LOADED } from '../applications/app.helpers.js';\nimport { ensureValidAppTimeouts } from '../applications/timeouts.js';\nimport { handleAppError } from '../applications/app-errors.js';\nimport { flattenFnArray, smellsLikeAPromise, validLifecycleFn } from './lifecycle.helpers.js';\nimport { getProps } from './prop.helpers.js';\n\nclass UserError extends Error {}\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;\n\n return Promise.resolve().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 throw new UserError(`single-spa loading function did not return a promise. Check the second argument to registerApplication('${app.name}', loadingFunction, activityFunction)`);\n }\n return loadPromise.then(val => {\n app.loadErrorTime = null;\n\n appOpts = val;\n\n let validationErrMessage;\n\n if (typeof appOpts !== 'object') {\n validationErrMessage = `does not export anything`;\n }\n\n if (!validLifecycleFn(appOpts.bootstrap)) {\n validationErrMessage = `does not export a bootstrap function or array of functions`;\n }\n\n if (!validLifecycleFn(appOpts.mount)) {\n validationErrMessage = `does not export a mount function or array of functions`;\n }\n\n if (!validLifecycleFn(appOpts.unmount)) {\n validationErrMessage = `does not export an unmount function or array of functions`;\n }\n\n if (validationErrMessage) {\n console.error(`The loading function for single-spa application '${app.name}' resolved with the following, which does not have bootstrap, mount, and unmount functions`, appOpts)\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 = {...app.devtools.overlays, ...appOpts.devtools.overlays}\n }\n\n app.status = NOT_BOOTSTRAPPED;\n app.bootstrap = flattenFnArray(appOpts.bootstrap, `App '${app.name}' bootstrap function`);\n app.mount = flattenFnArray(appOpts.mount, `App '${app.name}' mount function`);\n app.unmount = flattenFnArray(appOpts.unmount, `App '${app.name}' unmount function`);\n app.unload = flattenFnArray(appOpts.unload || [], `App '${app.name}' unload function`);\n app.timeouts = ensureValidAppTimeouts(appOpts.timeouts);\n\n return app;\n })\n })\n .catch(err => {\n handleAppError(err, app);\n if (err instanceof UserError) {\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';\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, opts={}) {\n let url;\n if (typeof obj === 'string') {\n url = obj ;\n } else if (this && this.href) {\n url = this.href;\n } else if (obj && obj.currentTarget && obj.currentTarget.href && obj.preventDefault) {\n url = obj.currentTarget.href;\n obj.preventDefault();\n } else {\n throw Error(`singleSpaNavigate must be either called with a string url, with an tag as its context, or with an event whose currentTarget is an tag`);\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.anchor;\n } else if (current.host !== destination.host && destination.host) {\n if (opts.isTestingEnv) {\n return {wouldHaveReloadedThePage: true};\n } else {\n window.location.href = url;\n }\n } else if (!isSamePath(destination.path + \"?\" + destination.query, current.path + \"?\" + current.query)) {\n // different path, host, or query params\n window.history.pushState(null, null, url);\n } else {\n window.location.hash = '#' + destination.anchor;\n }\n\n function isSamePath(destination, current) {\n // if the destination has a path but no domain, it doesn't include the root '/'\n return current === destination || current === '/' + destination;\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 listener.apply(this, eventArguments);\n });\n }\n }\n}\n\nfunction urlReroute() {\n reroute([], arguments)\n}\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 (routingEventsListeningTo.indexOf(eventName) >= 0 && !find(capturedEventListeners[eventName], listener => listener === fn)) {\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[eventName].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/CanopyTax/single-spa/issues/224 and https://github.com/CanopyTax/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/CanopyTax/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 tag's href is.\n */\nwindow.singleSpaNavigate = navigateToUrl;\n\nfunction parseUri(str) {\n // parseUri 1.2.2\n // (c) Steven Levithan \n // MIT License\n // http://blog.stevenlevithan.com/archives/parseuri\n const parseOptions = {\n strictMode: true,\n key: [\"source\",\"protocol\",\"authority\",\"userInfo\",\"user\",\"password\",\"host\",\"port\",\"relative\",\"path\",\"directory\",\"file\",\"query\",\"anchor\"],\n q: {\n name: \"queryKey\",\n parser: /(?:^|&)([^&=]*)=?([^&]*)/g\n },\n parser: {\n strict: /^(?:([^:\\/?#]+):)?(?:\\/\\/((?:(([^:@]*)(?::([^:@]*))?)?@)?([^:\\/?#]*)(?::(\\d*))?))?((((?:[^?#\\/]*\\/)*)([^?#]*))(?:\\?([^#]*))?(?:#(.*))?)/,\n loose: /^(?:(?![^:@]+:[^:@\\/]*@)([^:\\/?#.]+):)?(?:\\/\\/)?((?:(([^:@]*)(?::([^:@]*))?)?@)?([^:\\/?#]*)(?::(\\d*))?)(((\\/(?:[^?#](?![^?#\\/]*\\.[^?#\\/.]+(?:[?#]|$)))*\\/?)?([^?#\\/]*))(?:\\?([^#]*))?(?:#(.*))?)/\n }\n };\n\n let o = parseOptions;\n let m = o.parser[o.strictMode ? \"strict\" : \"loose\"].exec(str);\n let uri = {};\n let i = 14;\n\n while (i--) uri[o.key[i]] = m[i] || \"\";\n\n uri[o.q.name] = {};\n uri[o.key[12]].replace(o.q.parser, function ($0, $1, $2) {\n if ($1) uri[o.q.name][$1] = $2;\n });\n\n return uri;\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(this, originalJQueryOn, window.addEventListener, eventString, fn, arguments);\n }\n\n jQuery.fn.off = function(eventString, fn) {\n return captureRoutingEvents.call(this, originalJQueryOff, window.removeEventListener, eventString, fn, arguments);\n }\n\n hasInitialized = true;\n }\n}\n\nfunction captureRoutingEvents(originalJQueryFunction, nativeFunctionToCall, eventString, fn, originalArgs) {\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 { NOT_MOUNTED, UNLOADING, NOT_LOADED, SKIP_BECAUSE_BROKEN, isntActive } from '../applications/app.helpers.js';\nimport { handleAppError } from '../applications/app-errors.js';\nimport { reasonableTime } from '../applications/timeouts.js';\nimport { getProps } from './prop.helpers.js';\n\nconst appsToUnload = {};\n\nexport function toUnloadPromise(app) {\n return Promise.resolve().then(() => {\n const unloadInfo = appsToUnload[app.name];\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(getProps(app)), `Unloading application '${app.name}'`, app.timeouts.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[app.name];\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[app.name];\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[app.name] = {app, resolve, reject};\n Object.defineProperty(appsToUnload[app.name], 'promise', {get: promiseGetter});\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 { toUnloadPromise, getAppUnloadInfo, addAppToUnload } from '../lifecycles/unload.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 => app.name === appName);\n return app ? app.status : null;\n}\n\nexport function declareChildApplication(appName, arg1, arg2) {\n console.warn('declareChildApplication is deprecated and will be removed in the next major version, use \"registerApplication\" instead')\n return registerApplication(appName, arg1, arg2)\n}\n\nexport function registerApplication(appName, applicationOrLoadingFn, activityFn, customProps = {}) {\n if (typeof appName !== 'string' || appName.length === 0)\n throw Error(`The first argument must be a non-empty string 'appName'`);\n if (getAppNames().indexOf(appName) !== -1)\n throw Error(`There is already an app declared with name ${appName}`);\n if (typeof customProps !== 'object' || Array.isArray(customProps))\n throw Error('customProps must be an object');\n\n if (!applicationOrLoadingFn)\n throw Error(`The application or loading function is required`);\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(`The activeWhen argument must be a function`);\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 const activeApps = []\n for (let i = 0; i < apps.length; i++) {\n if (apps[i].activeWhen(location)) {\n activeApps.push(apps[i].name)\n }\n }\n return activeApps\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 => app.name === appName)) {\n throw Error(`Cannot unregister application '${appName}' because no such application has been registered`)\n }\n\n return unloadApplication(appName)\n .then(() => {\n const appIndex = apps.findIndex(app => app.name === appName)\n apps.splice(appIndex, 1)\n })\n}\n\nexport function unloadChildApplication(appName, opts) {\n console.warn('unloadChildApplication is deprecated and will be removed in the next major version, use \"unloadApplication\" instead')\n return unloadApplication(appName, opts)\n}\n\nexport function unloadApplication(appName, opts={waitForUnmount: false}) {\n if (typeof appName !== 'string') {\n throw Error(`unloadApplication requires a string 'appName'`);\n }\n const app = find(apps, App => App.name === appName);\n if (!app) {\n throw Error(`Could not unload application '${appName}' because no such application has been registered`);\n }\n\n const appUnloadInfo = getAppUnloadInfo(app.name);\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 { getMountedApps, getAppsToLoad, getAppsToUnmount, getAppsToMount } from '../applications/apps.js';\nimport { callCapturedEventListeners } from './navigation-events.js';\nimport { getAppsToUnload, toUnloadPromise } from '../lifecycles/unload.js';\n\nlet appChangeUnderway = false, 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\n .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(new CustomEvent(\"single-spa:before-routing-event\", getCustomEventDetail()));\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\n .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\n .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\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 ? \"single-spa:no-app-change\": \"single-spa:app-change\";\n window.dispatchEvent(new CustomEvent(appChangeEventName, getCustomEventDetail()));\n window.dispatchEvent(new CustomEvent(\"single-spa: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 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';\n\nlet started = false;\n\nexport function start() {\n started = true;\n reroute();\n}\n\nexport function isStarted() {\n return started;\n}\n\nconst startWarningDelay = 5000;\n\nsetTimeout(() => {\n if (!started) {\n console.warn(`singleSpa.start() has not been called, ${startWarningDelay}ms after single-spa was loaded. Before start() is called, apps can be declared and loaded, but not bootstrapped or mounted. See https://github.com/CanopyTax/single-spa/blob/master/docs/single-spa-api.md#start`);\n }\n}, startWarningDelay)\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 { setBootstrapMaxTime, setMountMaxTime, setUnmountMaxTime, setUnloadMaxTime } from './applications/timeouts.js';\nexport { registerApplication, getMountedApps, getAppStatus, unloadApplication, checkActivityFunctions, getAppNames, declareChildApplication, unloadChildApplication } from './applications/apps.js';\nexport { navigateToUrl } from './navigation/navigation-events.js';\nexport { triggerAppChange } from './navigation/reroute.js';\nexport { addErrorHandler, removeErrorHandler } 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","push","removeErrorHandler","removedSomething","filter","h","isHandler","ogErr","appOrParcel","result","objectType","unmountThisParcel","errPrefix","name","status","message","console","warn","JSON","stringify","appName","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","toName","globalTimeoutConfig","bootstrap","millis","dieOnTimeout","mount","unmount","unload","setBootstrapMaxTime","time","setMountMaxTime","setUnmountMaxTime","setUnloadMaxTime","reasonableTime","promise","description","timeoutConfig","warningPeriod","Promise","resolve","reject","finished","errored","maybeTimingOut","shouldError","error","numWarnings","numMillis","then","val","catch","ensureValidAppTimeouts","timeouts","find","arr","func","i","validLifecycleFn","fn","Array","isArray","flattenFnArray","fns","props","waitForPromises","index","smellsLikeAPromise","toBootstrapPromise","hardFail","getProps","toUnmountPromise","unmountChildrenParcels","Object","keys","parcels","map","parcelId","all","unmountAppOrParcel","parcelError","parentError","beforeFirstMountFired","firstMountFired","toMountPromise","dispatchEvent","setSkipBecauseBroken","parcelCount","rootParcels","mountRootParcel","mountParcel","apply","arguments","config","customProps","owningAppOrParcel","this","_typeof","domElement","externalRepresentation","id","passedConfigLoadingFunction","configLoadingFunction","parcel","parentName","value","resolveUnmount","rejectUnmount","loadPromise","bootstrapPromise","update","promiseWithoutReturnValue","toUpdatePromise","mountPromise","unmountPromise","getStatus","bind","singleSpa","unmountSelf","UserError","toLoadPromise","loadImpl","validationErrMessage","appOpts","devtools","overlays","capturedEventListeners","hashchange","popstate","routingEventsListeningTo","navigateToUrl","obj","url","opts","href","currentTarget","preventDefault","current","parseUri","destination","indexOf","hash","anchor","host","isTestingEnv","wouldHaveReloadedThePage","isSamePath","path","query","history","pushState","callCapturedEventListeners","eventArguments","eventType","listener","_this","urlReroute","reroute","addEventListener","originalAddEventListener","originalRemoveEventListener","removeEventListener","eventName","listenerFn","originalPushState","state","createPopStateEvent","originalReplaceState","replaceState","PopStateEvent","evt","initPopStateEvent","str","o","strictMode","key","q","parser","strict","loose","m","exec","uri","replace","$0","$1","$2","singleSpaNavigate","hasInitialized","ensureJQuerySupport","jQuery","$","jquery","originalJQueryOn","on","originalJQueryOff","off","eventString","captureRoutingEvents","call","originalJQueryFunction","nativeFunctionToCall","originalArgs","split","trim","appsToUnload","toUnloadPromise","unloadInfo","finishUnloadingApp","errorUnloadingApp","addAppToUnload","promiseGetter","defineProperty","get","apps","getMountedApps","getAppNames","getAppStatus","declareChildApplication","arg1","arg2","registerApplication","applicationOrLoadingFn","activityFn","options","selectors","checkActivityFunctions","activeApps","getAppsToLoad","unloadChildApplication","unloadApplication","waitForUnmount","App","resultPromise","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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"}