/
var
/
www
/
html
/
sugardemo
/
include
/
javascript
/
single-spa
/
Upload File
HOME
{"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.name = appOrParcel.name\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 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;\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 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<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';\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(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 { 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\nexport function toLoadPromise(app) {\n return Promise.resolve().then(() => {\n if (app.status !== NOT_LOADED) {\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 Error(`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 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 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 app.status = SKIP_BECAUSE_BROKEN;\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 <a> tag as its context, or with an event whose currentTarget is an <a> 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, current.path)) {\n // different path or a different host\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 <a> tag's href is.\n */\nwindow.singleSpaNavigate = navigateToUrl;\n\nfunction parseUri(str) {\n // parseUri 1.2.2\n // (c) Steven Levithan <stevenlevithan.com>\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 { isActive, isLoaded, isntLoaded, toName, NOT_LOADED, shouldBeActive, shouldntBeActive, isntActive, notSkipped } 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 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(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 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","NOT_LOADED","LOADING_SOURCE_CODE","NOT_BOOTSTRAPPED","BOOTSTRAPPING","NOT_MOUNTED","MOUNTING","MOUNTED","UPDATING","UNMOUNTING","UNLOADING","SKIP_BECAUSE_BROKEN","isActive","isntActive","isLoaded","isntLoaded","shouldBeActive","activeWhen","window","location","shouldntBeActive","notSkipped","item","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","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","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","unmountUnloadPromises","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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"}