@qiankunjs/single-spa 0.0.1-rc.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +21 -0
- package/README.md +52 -0
- package/dist/cjs/applications/app-errors.d.ts +11 -0
- package/dist/cjs/applications/app-errors.js +57 -0
- package/dist/cjs/applications/app-errors.js.map +1 -0
- package/dist/cjs/applications/app.helpers.d.ts +52 -0
- package/dist/cjs/applications/app.helpers.js +47 -0
- package/dist/cjs/applications/app.helpers.js.map +1 -0
- package/dist/cjs/applications/apps.d.ts +23 -0
- package/dist/cjs/applications/apps.js +234 -0
- package/dist/cjs/applications/apps.js.map +1 -0
- package/dist/cjs/applications/timeouts.d.ts +19 -0
- package/dist/cjs/applications/timeouts.js +115 -0
- package/dist/cjs/applications/timeouts.js.map +1 -0
- package/dist/cjs/declarations.d.ts +4 -0
- package/dist/cjs/devtools/devtools.d.ts +16 -0
- package/dist/cjs/devtools/devtools.js +24 -0
- package/dist/cjs/devtools/devtools.js.map +1 -0
- package/dist/cjs/devtools/profiler.d.ts +11 -0
- package/dist/cjs/devtools/profiler.js +25 -0
- package/dist/cjs/devtools/profiler.js.map +1 -0
- package/dist/cjs/index.d.ts +1 -0
- package/dist/cjs/index.js +32 -0
- package/dist/cjs/jquery-support.d.ts +7 -0
- package/dist/cjs/jquery-support.js +34 -0
- package/dist/cjs/jquery-support.js.map +1 -0
- package/dist/cjs/lifecycles/bootstrap.d.ts +2 -0
- package/dist/cjs/lifecycles/bootstrap.js +27 -0
- package/dist/cjs/lifecycles/bootstrap.js.map +1 -0
- package/dist/cjs/lifecycles/lifecycle.helpers.d.ts +90 -0
- package/dist/cjs/lifecycles/lifecycle.helpers.js +33 -0
- package/dist/cjs/lifecycles/lifecycle.helpers.js.map +1 -0
- package/dist/cjs/lifecycles/load.d.ts +3 -0
- package/dist/cjs/lifecycles/load.js +73 -0
- package/dist/cjs/lifecycles/load.js.map +1 -0
- package/dist/cjs/lifecycles/mount.d.ts +2 -0
- package/dist/cjs/lifecycles/mount.js +40 -0
- package/dist/cjs/lifecycles/mount.js.map +1 -0
- package/dist/cjs/lifecycles/prop.helpers.d.ts +9 -0
- package/dist/cjs/lifecycles/prop.helpers.js +23 -0
- package/dist/cjs/lifecycles/prop.helpers.js.map +1 -0
- package/dist/cjs/lifecycles/unload.d.ts +12 -0
- package/dist/cjs/lifecycles/unload.js +63 -0
- package/dist/cjs/lifecycles/unload.js.map +1 -0
- package/dist/cjs/lifecycles/unmount.d.ts +2 -0
- package/dist/cjs/lifecycles/unmount.js +32 -0
- package/dist/cjs/lifecycles/unmount.js.map +1 -0
- package/dist/cjs/lifecycles/update.d.ts +2 -0
- package/dist/cjs/lifecycles/update.js +22 -0
- package/dist/cjs/lifecycles/update.js.map +1 -0
- package/dist/cjs/navigation/navigation-events.d.ts +8 -0
- package/dist/cjs/navigation/navigation-events.js +102 -0
- package/dist/cjs/navigation/navigation-events.js.map +1 -0
- package/dist/cjs/navigation/reroute.d.ts +9 -0
- package/dist/cjs/navigation/reroute.js +182 -0
- package/dist/cjs/navigation/reroute.js.map +1 -0
- package/dist/cjs/parcels/mount-parcel.d.ts +3 -0
- package/dist/cjs/parcels/mount-parcel.js +122 -0
- package/dist/cjs/parcels/mount-parcel.js.map +1 -0
- package/dist/cjs/single-spa.d.ts +19 -0
- package/dist/cjs/single-spa.js +39 -0
- package/dist/cjs/single-spa.js.map +1 -0
- package/dist/cjs/start.d.ts +5 -0
- package/dist/cjs/start.js +21 -0
- package/dist/cjs/start.js.map +1 -0
- package/dist/cjs/utils/runtime-environment.d.ts +1 -0
- package/dist/cjs/utils/runtime-environment.js +7 -0
- package/dist/cjs/utils/runtime-environment.js.map +1 -0
- package/dist/cjs/window-globals.d.ts +8 -0
- package/dist/esm/applications/app-errors.d.ts +11 -0
- package/dist/esm/applications/app-errors.js +52 -0
- package/dist/esm/applications/app-errors.js.map +1 -0
- package/dist/esm/applications/app.helpers.d.ts +52 -0
- package/dist/esm/applications/app.helpers.js +41 -0
- package/dist/esm/applications/app.helpers.js.map +1 -0
- package/dist/esm/applications/apps.d.ts +23 -0
- package/dist/esm/applications/apps.js +223 -0
- package/dist/esm/applications/apps.js.map +1 -0
- package/dist/esm/applications/timeouts.d.ts +19 -0
- package/dist/esm/applications/timeouts.js +109 -0
- package/dist/esm/applications/timeouts.js.map +1 -0
- package/dist/esm/declarations.d.ts +4 -0
- package/dist/esm/devtools/devtools.d.ts +16 -0
- package/dist/esm/devtools/devtools.js +20 -0
- package/dist/esm/devtools/devtools.js.map +1 -0
- package/dist/esm/devtools/profiler.d.ts +11 -0
- package/dist/esm/devtools/profiler.js +22 -0
- package/dist/esm/devtools/profiler.js.map +1 -0
- package/dist/esm/index.d.ts +1 -0
- package/dist/esm/index.js +10 -0
- package/dist/esm/jquery-support.d.ts +7 -0
- package/dist/esm/jquery-support.js +33 -0
- package/dist/esm/jquery-support.js.map +1 -0
- package/dist/esm/lifecycles/bootstrap.d.ts +2 -0
- package/dist/esm/lifecycles/bootstrap.js +26 -0
- package/dist/esm/lifecycles/bootstrap.js.map +1 -0
- package/dist/esm/lifecycles/lifecycle.helpers.d.ts +90 -0
- package/dist/esm/lifecycles/lifecycle.helpers.js +30 -0
- package/dist/esm/lifecycles/lifecycle.helpers.js.map +1 -0
- package/dist/esm/lifecycles/load.d.ts +3 -0
- package/dist/esm/lifecycles/load.js +72 -0
- package/dist/esm/lifecycles/load.js.map +1 -0
- package/dist/esm/lifecycles/mount.d.ts +2 -0
- package/dist/esm/lifecycles/mount.js +39 -0
- package/dist/esm/lifecycles/mount.js.map +1 -0
- package/dist/esm/lifecycles/prop.helpers.d.ts +9 -0
- package/dist/esm/lifecycles/prop.helpers.js +22 -0
- package/dist/esm/lifecycles/prop.helpers.js.map +1 -0
- package/dist/esm/lifecycles/unload.d.ts +12 -0
- package/dist/esm/lifecycles/unload.js +60 -0
- package/dist/esm/lifecycles/unload.js.map +1 -0
- package/dist/esm/lifecycles/unmount.d.ts +2 -0
- package/dist/esm/lifecycles/unmount.js +31 -0
- package/dist/esm/lifecycles/unmount.js.map +1 -0
- package/dist/esm/lifecycles/update.d.ts +2 -0
- package/dist/esm/lifecycles/update.js +21 -0
- package/dist/esm/lifecycles/update.js.map +1 -0
- package/dist/esm/navigation/navigation-events.d.ts +8 -0
- package/dist/esm/navigation/navigation-events.js +92 -0
- package/dist/esm/navigation/navigation-events.js.map +1 -0
- package/dist/esm/navigation/reroute.d.ts +9 -0
- package/dist/esm/navigation/reroute.js +180 -0
- package/dist/esm/navigation/reroute.js.map +1 -0
- package/dist/esm/parcels/mount-parcel.d.ts +3 -0
- package/dist/esm/parcels/mount-parcel.js +120 -0
- package/dist/esm/parcels/mount-parcel.js.map +1 -0
- package/dist/esm/single-spa.d.ts +19 -0
- package/dist/esm/single-spa.js +17 -0
- package/dist/esm/single-spa.js.map +1 -0
- package/dist/esm/start.d.ts +5 -0
- package/dist/esm/start.js +19 -0
- package/dist/esm/start.js.map +1 -0
- package/dist/esm/utils/runtime-environment.d.ts +1 -0
- package/dist/esm/utils/runtime-environment.js +6 -0
- package/dist/esm/utils/runtime-environment.js.map +1 -0
- package/dist/esm/window-globals.d.ts +8 -0
- package/package.json +25 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"reroute.js","names":[],"sources":["../../../src/navigation/reroute.ts"],"sourcesContent":["import { isStarted } from '../start';\nimport { toLoadPromise } from '../lifecycles/load';\nimport { toBootstrapPromise } from '../lifecycles/bootstrap';\nimport { toMountPromise } from '../lifecycles/mount';\nimport { toUnmountPromise } from '../lifecycles/unmount';\nimport { getAppStatus, getAppChanges, getMountedApps } from '../applications/apps';\nimport { callCapturedEventListeners, originalReplaceState } from './navigation-events';\nimport { toUnloadPromise } from '../lifecycles/unload';\nimport { toName, shouldBeActive, AppOrParcelStatus, InternalApplication } from '../applications/app.helpers';\nimport { isInBrowser } from '../utils/runtime-environment';\nimport { formatErrorMessage } from '../applications/app-errors';\nimport { ProfileEntry, addProfileEntry } from '../devtools/profiler';\nimport { LoadedApp } from '../lifecycles/lifecycle.helpers';\n\ntype EventArguments = [HashChangeEvent | PopStateEvent];\n\ninterface WaitingPromises {\n resolve(value: unknown): void;\n reject(value: unknown): void;\n eventArguments?: [HashChangeEvent | PopStateEvent];\n}\n\nlet appChangeUnderway: boolean = false,\n promisesWaitingOnAppChange: WaitingPromises[] = [],\n currentUrl = isInBrowser && window.location.href;\n\nexport function triggerAppChange() {\n // Call reroute with no arguments, intentionally\n return reroute();\n}\n\nexport function reroute(\n pendingPromises: WaitingPromises[] = [],\n eventArguments: EventArguments = undefined,\n silentNavigation: boolean = false,\n): Promise<string[]> {\n if (appChangeUnderway) {\n return new Promise((resolve, reject) => {\n promisesWaitingOnAppChange.push({\n resolve,\n reject,\n eventArguments,\n });\n });\n }\n\n let startTime: number, profilerKind: ProfileEntry['kind'];\n\n if (__PROFILE__) {\n startTime = performance.now();\n if (silentNavigation) {\n profilerKind = 'silentNavigation';\n } else if (eventArguments) {\n profilerKind = 'browserNavigation';\n } else {\n profilerKind = 'triggerAppChange';\n }\n }\n\n const { appsToUnload, appsToUnmount, appsToLoad, appsToMount } = getAppChanges();\n let appsThatChanged: InternalApplication[],\n cancelPromises: Promise<unknown>[] = [],\n oldUrl: string = currentUrl,\n newUrl: string = (currentUrl = window.location.href);\n\n if (isStarted()) {\n appChangeUnderway = true;\n appsThatChanged = appsToUnload.concat(appsToLoad, appsToUnmount, appsToMount);\n return performAppChanges();\n } else {\n appsThatChanged = appsToLoad;\n return loadApps();\n }\n\n function cancelNavigation(val: boolean | Promise<boolean> = true) {\n const promise: Promise<boolean> =\n typeof (val as Promise<boolean>)?.then === 'function' ? (val as Promise<boolean>) : Promise.resolve(val);\n cancelPromises.push(\n promise.catch((err) => {\n console.warn(\n Error(\n formatErrorMessage(\n 42,\n __DEV__ && `single-spa: A cancelNavigation promise rejected with the following value: ${err}`,\n ),\n ),\n );\n console.warn(err);\n\n // Interpret a Promise rejection to mean that the navigation should not be canceled\n return false;\n }),\n );\n }\n\n function loadApps(): Promise<string[]> {\n return Promise.resolve().then(() => {\n const loadPromises = appsToLoad.map(toLoadPromise);\n let succeeded: boolean;\n\n return (\n Promise.all(loadPromises)\n .then(callAllEventListeners)\n // there are no mounted apps, before start() is called, so we always return []\n .then(() => {\n if (__PROFILE__) {\n succeeded = true;\n }\n\n return [];\n })\n .catch((err) => {\n if (__PROFILE__) {\n succeeded = false;\n }\n\n callAllEventListeners();\n throw err;\n })\n .finally(() => {\n if (__PROFILE__) {\n addProfileEntry('routing', 'loadApps', profilerKind, startTime, performance.now(), succeeded);\n }\n })\n );\n });\n }\n\n function performAppChanges(): Promise<string[]> {\n return Promise.resolve().then(() => {\n // https://github.com/single-spa/single-spa/issues/545\n fireSingleSpaEvent(\n appsThatChanged.length === 0 ? 'before-no-app-change' : 'before-app-change',\n getCustomEventDetail(true),\n );\n\n fireSingleSpaEvent('before-routing-event', getCustomEventDetail(true, { cancelNavigation }));\n\n return Promise.all(cancelPromises).then((cancelValues) => {\n const navigationIsCanceled: boolean = cancelValues.some((v) => v);\n\n if (navigationIsCanceled) {\n // Change url back to old url, without triggering the normal single-spa reroute\n originalReplaceState.call(window.history, history.state, '', oldUrl.substring(location.origin.length));\n\n // Single-spa's internal tracking of current url needs to be updated after the url change above\n currentUrl = location.href;\n\n // necessary for the reroute function to know that the current reroute is finished\n appChangeUnderway = false;\n\n if (__PROFILE__) {\n addProfileEntry('routing', 'navigationCanceled', profilerKind, startTime, performance.now(), true);\n }\n\n // Tell single-spa to reroute again, this time with the url set to the old URL\n return reroute(pendingPromises, eventArguments, true);\n }\n\n const unloadPromises: Promise<InternalApplication>[] = appsToUnload.map(toUnloadPromise);\n\n const unmountUnloadPromises = (appsToUnmount as LoadedApp[])\n .map((app) => toUnmountPromise(app))\n .map((unmountPromise: Promise<LoadedApp>) => unmountPromise.then(toUnloadPromise));\n\n const allUnmountPromises: Promise<InternalApplication>[] = [...unmountUnloadPromises, ...unloadPromises];\n\n const unmountAllPromise = Promise.all(allUnmountPromises);\n\n let unmountFinishedTime: number;\n\n unmountAllPromise.then(\n () => {\n if (__PROFILE__) {\n unmountFinishedTime = performance.now();\n\n addProfileEntry('routing', 'unmountAndUnload', profilerKind, startTime, performance.now(), true);\n }\n fireSingleSpaEvent('before-mount-routing-event', getCustomEventDetail(true));\n },\n (err) => {\n if (__PROFILE__) {\n addProfileEntry('routing', 'unmountAndUnload', profilerKind, startTime, performance.now(), true);\n }\n\n throw err;\n },\n );\n\n /* We load and init apps while other apps are unmounting, but we\n * wait to mount the app until all apps are finishing unmounting\n */\n const loadThenMountPromises: Promise<InternalApplication>[] = appsToLoad.map((app) => {\n return toLoadPromise(app).then((app) => tryToInitAndMount(app, unmountAllPromise));\n });\n\n /* These are the apps that are already initialized 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: Promise<InternalApplication>[] = appsToMount\n .filter((appToMount) => !appsToLoad.includes(appToMount))\n .map((appToMount) => {\n return tryToInitAndMount(appToMount, unmountAllPromise);\n });\n return unmountAllPromise\n .catch((err) => {\n callAllEventListeners();\n throw err;\n })\n .then(() => {\n /* Now that the apps that needed to be unmounted are unmounted, their DOM navigation\n * events (like hashchange or popstate) should have been cleaned up. So it's safe\n * to let the remaining captured event listeners to handle about the DOM event.\n */\n callAllEventListeners();\n\n return Promise.all(loadThenMountPromises.concat(mountPromises))\n .catch((err) => {\n pendingPromises.forEach((promise) => promise.reject(err));\n throw err;\n })\n .then(\n () => {\n if (__PROFILE__) {\n addProfileEntry(\n 'routing',\n 'loadAndMount',\n profilerKind,\n unmountFinishedTime,\n performance.now(),\n true,\n );\n }\n },\n (err) => {\n if (__PROFILE__) {\n addProfileEntry(\n 'routing',\n 'loadAndMount',\n profilerKind,\n unmountFinishedTime,\n performance.now(),\n false,\n );\n }\n\n throw err;\n },\n )\n .then(finishUpAndReturn);\n });\n });\n });\n }\n\n function finishUpAndReturn(): string[] {\n const returnValue = getMountedApps();\n pendingPromises.forEach((promise) => promise.resolve(returnValue));\n\n try {\n const appChangeEventName = appsThatChanged.length === 0 ? 'no-app-change' : 'app-change';\n fireSingleSpaEvent(appChangeEventName, getCustomEventDetail());\n fireSingleSpaEvent('routing-event', getCustomEventDetail());\n } catch (err) {\n /* We use a setTimeout because if someone else's event handler throws an error, single-spa\n * needs to carry on. If a listener to the event throws an error, it's their own fault, not\n * single-spa's.\n */\n setTimeout(() => {\n throw err;\n });\n }\n\n /* Setting this allows for subsequent calls to reroute() to actually perform\n * a reroute instead of just getting queued behind the current reroute call.\n * We want to do this after the mounting/unmounting is done but before we\n * resolve the promise for the `reroute` function.\n */\n appChangeUnderway = false;\n\n if (promisesWaitingOnAppChange.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 = promisesWaitingOnAppChange;\n promisesWaitingOnAppChange = [];\n reroute(nextPendingPromises);\n }\n\n return returnValue;\n }\n\n /* We need to call all event listeners that have been delayed because they were\n * waiting on single-spa. This includes haschange and popstate events for both\n * the current run of performAppChanges(), but also all of the queued event listeners.\n * We want to call the listeners in the same order as if they had not been delayed by\n * single-spa, which means queued ones first and then the most recent one.\n */\n function callAllEventListeners() {\n // During silent navigation (when navigation was canceled and we're going back to the old URL),\n // we should not fire any popstate / hashchange events\n if (!silentNavigation) {\n pendingPromises.forEach((pendingPromise) => {\n callCapturedEventListeners(pendingPromise.eventArguments);\n });\n\n callCapturedEventListeners(eventArguments);\n }\n }\n\n function getCustomEventDetail(isBeforeChanges: boolean = false, extraProperties?: Object): CustomEventInit {\n const newAppStatuses = {};\n const appsByNewStatus = {\n // for apps that were mounted\n [AppOrParcelStatus.MOUNTED]: [],\n // for apps that were unmounted\n [AppOrParcelStatus.NOT_MOUNTED]: [],\n // apps that were forcibly unloaded\n [AppOrParcelStatus.NOT_LOADED]: [],\n // apps that attempted to do something but are broken now\n [AppOrParcelStatus.SKIP_BECAUSE_BROKEN]: [],\n };\n\n if (isBeforeChanges) {\n appsToLoad.concat(appsToMount).forEach((app, index) => {\n addApp(app, AppOrParcelStatus.MOUNTED);\n });\n appsToUnload.forEach((app) => {\n addApp(app, AppOrParcelStatus.NOT_LOADED);\n });\n appsToUnmount.forEach((app) => {\n addApp(app, AppOrParcelStatus.NOT_MOUNTED);\n });\n } else {\n appsThatChanged.forEach((app) => {\n addApp(app);\n });\n }\n\n const result = {\n detail: {\n newAppStatuses,\n appsByNewStatus,\n totalAppChanges: appsThatChanged.length,\n originalEvent: eventArguments?.[0],\n oldUrl,\n newUrl,\n },\n };\n\n if (extraProperties) {\n Object.assign(result.detail, extraProperties);\n }\n\n return result;\n\n function addApp(app: InternalApplication, status?: InternalApplication['status']) {\n const appName = toName(app);\n status = status || getAppStatus(appName);\n newAppStatuses[appName] = status;\n const statusArr = (appsByNewStatus[status] = appsByNewStatus[status] || []);\n statusArr.push(appName);\n }\n }\n\n function fireSingleSpaEvent(name: string, eventProperties: CustomEventInit) {\n // During silent navigation (caused by navigation cancelation), we should not\n // fire any single-spa events\n if (!silentNavigation) {\n window.dispatchEvent(new CustomEvent(`single-spa:${name}`, eventProperties));\n }\n }\n}\n\n/**\n * Let's imagine that some kind of delay occurred during application loading.\n * The user without waiting for the application to load switched to another route,\n * this means that we shouldn't initialize and mount that application, thus we check\n * twice if that application should be active before initialize and mounting.\n * https://github.com/single-spa/single-spa/issues/524\n */\nfunction tryToInitAndMount(\n app: InternalApplication,\n unmountAllPromise: Promise<unknown>,\n): Promise<InternalApplication> {\n if (shouldBeActive(app)) {\n return toBootstrapPromise(app as LoadedApp).then((app) =>\n unmountAllPromise.then(() => (shouldBeActive(app) ? toMountPromise(app) : app)),\n ) as Promise<InternalApplication>;\n } else {\n return unmountAllPromise.then(() => app);\n }\n}\n"],"mappings":"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"}
|
|
@@ -0,0 +1,3 @@
|
|
|
1
|
+
import { CustomProps, Parcel, ParcelCustomProps, ParcelConfig, ParcelOwner } from '../lifecycles/lifecycle.helpers';
|
|
2
|
+
export declare function mountRootParcel(config: ParcelConfig, customProps: CustomProps): any;
|
|
3
|
+
export declare function mountParcel(this: ParcelOwner, config: ParcelConfig, customProps: ParcelCustomProps): Parcel;
|
|
@@ -0,0 +1,122 @@
|
|
|
1
|
+
Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
|
|
2
|
+
const require_applications_app_helpers = require("../applications/app.helpers.js");
|
|
3
|
+
const require_applications_app_errors = require("../applications/app-errors.js");
|
|
4
|
+
const require_lifecycles_lifecycle_helpers = require("../lifecycles/lifecycle.helpers.js");
|
|
5
|
+
const require_lifecycles_bootstrap = require("../lifecycles/bootstrap.js");
|
|
6
|
+
const require_lifecycles_unmount = require("../lifecycles/unmount.js");
|
|
7
|
+
const require_lifecycles_mount = require("../lifecycles/mount.js");
|
|
8
|
+
const require_lifecycles_update = require("../lifecycles/update.js");
|
|
9
|
+
const require_applications_timeouts = require("../applications/timeouts.js");
|
|
10
|
+
//#region src/parcels/mount-parcel.ts
|
|
11
|
+
var parcelCount = 0;
|
|
12
|
+
var rootParcels = {
|
|
13
|
+
name: "rootParcels",
|
|
14
|
+
parcels: {}
|
|
15
|
+
};
|
|
16
|
+
function mountRootParcel(config, customProps) {
|
|
17
|
+
return mountParcel.call(rootParcels, config, customProps);
|
|
18
|
+
}
|
|
19
|
+
function mountParcel(config, customProps) {
|
|
20
|
+
const owningAppOrParcel = this;
|
|
21
|
+
if (!config || typeof config !== "object" && typeof config !== "function") throw Error(require_applications_app_errors.formatErrorMessage(2, process.env.NODE_ENV !== "production" && "Cannot mount parcel without a config object or config loading function"));
|
|
22
|
+
if (config.name && typeof config.name !== "string") throw Error(require_applications_app_errors.formatErrorMessage(3, process.env.NODE_ENV !== "production" && `Parcel name must be a string, if provided. Was given ${typeof config.name}`, typeof config.name));
|
|
23
|
+
const id = parcelCount++;
|
|
24
|
+
let name = config.name || `parcel-${id}`;
|
|
25
|
+
if (typeof customProps !== "object") throw Error(require_applications_app_errors.formatErrorMessage(4, process.env.NODE_ENV !== "production" && `Parcel ${name} has invalid customProps -- must be an object but was given ${typeof customProps}`, name, typeof customProps));
|
|
26
|
+
if (!customProps.domElement) throw Error(require_applications_app_errors.formatErrorMessage(5, process.env.NODE_ENV !== "production" && `Parcel ${name} cannot be mounted without a domElement provided as a prop`, name));
|
|
27
|
+
const passedConfigLoadingFunction = typeof config === "function";
|
|
28
|
+
const configLoadingFunction = passedConfigLoadingFunction ? config : () => Promise.resolve(config);
|
|
29
|
+
const parcel = {
|
|
30
|
+
id,
|
|
31
|
+
parcels: {},
|
|
32
|
+
status: passedConfigLoadingFunction ? require_applications_app_helpers.AppOrParcelStatus.LOADING_SOURCE_CODE : require_applications_app_helpers.AppOrParcelStatus.NOT_BOOTSTRAPPED,
|
|
33
|
+
customProps,
|
|
34
|
+
parentName: require_applications_app_helpers.toName(owningAppOrParcel),
|
|
35
|
+
currentTask: void 0,
|
|
36
|
+
unmountThisParcel() {
|
|
37
|
+
return parcel.currentTask.then(() => {
|
|
38
|
+
if (parcel.status !== require_applications_app_helpers.AppOrParcelStatus.MOUNTED) throw Error(require_applications_app_errors.formatErrorMessage(6, process.env.NODE_ENV !== "production" && `Cannot unmount parcel '${name}' -- it is in a ${parcel.status} status`, name, parcel.status));
|
|
39
|
+
return require_lifecycles_unmount.toUnmountPromise(parcel, true).then((value) => {
|
|
40
|
+
if (parcel.parentName) delete owningAppOrParcel.parcels[parcel.id];
|
|
41
|
+
return value;
|
|
42
|
+
}).then((value) => {
|
|
43
|
+
resolveUnmount(value);
|
|
44
|
+
return value;
|
|
45
|
+
}).catch((err) => {
|
|
46
|
+
parcel.status = require_applications_app_helpers.AppOrParcelStatus.SKIP_BECAUSE_BROKEN;
|
|
47
|
+
rejectUnmount(err);
|
|
48
|
+
throw err;
|
|
49
|
+
});
|
|
50
|
+
});
|
|
51
|
+
}
|
|
52
|
+
};
|
|
53
|
+
let loadPromise = configLoadingFunction();
|
|
54
|
+
if (!loadPromise || typeof loadPromise.then !== "function") throw Error(require_applications_app_errors.formatErrorMessage(7, process.env.NODE_ENV !== "production" && `When mounting a parcel, the config loading function must return a promise that resolves with the parcel config`));
|
|
55
|
+
loadPromise = loadPromise.then((config) => {
|
|
56
|
+
if (!config) throw Error(require_applications_app_errors.formatErrorMessage(8, process.env.NODE_ENV !== "production" && `When mounting a parcel, the config loading function returned a promise that did not resolve with a parcel config`));
|
|
57
|
+
name = config.name || `parcel-${id}`;
|
|
58
|
+
if (Object.prototype.hasOwnProperty.call(config, "bootstrap") && !require_lifecycles_lifecycle_helpers.validLifecycleFn(config.bootstrap)) throw Error(require_applications_app_errors.formatErrorMessage(9, process.env.NODE_ENV !== "production" && `Parcel ${name} provided an invalid bootstrap function`, name));
|
|
59
|
+
if (!require_lifecycles_lifecycle_helpers.validLifecycleFn(config.mount)) throw Error(require_applications_app_errors.formatErrorMessage(10, process.env.NODE_ENV !== "production" && `Parcel ${name} must have a valid mount function`, name));
|
|
60
|
+
if (!require_lifecycles_lifecycle_helpers.validLifecycleFn(config.unmount)) throw Error(require_applications_app_errors.formatErrorMessage(11, process.env.NODE_ENV !== "production" && `Parcel ${name} must have a valid unmount function`, name));
|
|
61
|
+
if (config.update && !require_lifecycles_lifecycle_helpers.validLifecycleFn(config.update)) throw Error(require_applications_app_errors.formatErrorMessage(12, process.env.NODE_ENV !== "production" && `Parcel ${name} provided an invalid update function`, name));
|
|
62
|
+
const bootstrap = require_lifecycles_lifecycle_helpers.flattenFnArray(config, "bootstrap", true);
|
|
63
|
+
const mount = require_lifecycles_lifecycle_helpers.flattenFnArray(config, "mount", true);
|
|
64
|
+
const unmount = require_lifecycles_lifecycle_helpers.flattenFnArray(config, "unmount", true);
|
|
65
|
+
parcel.status = require_applications_app_helpers.AppOrParcelStatus.NOT_BOOTSTRAPPED;
|
|
66
|
+
parcel.name = name;
|
|
67
|
+
parcel.bootstrap = bootstrap;
|
|
68
|
+
parcel.mount = mount;
|
|
69
|
+
parcel.unmount = unmount;
|
|
70
|
+
parcel.timeouts = require_applications_timeouts.ensureValidAppTimeouts(config.timeouts);
|
|
71
|
+
if (config.update) parcel.update = require_lifecycles_lifecycle_helpers.flattenFnArray(config, "update", true);
|
|
72
|
+
const fullParcel = parcel;
|
|
73
|
+
owningAppOrParcel.parcels[id] = fullParcel;
|
|
74
|
+
return config;
|
|
75
|
+
});
|
|
76
|
+
const bootstrapPromise = loadPromise.then(() => require_lifecycles_bootstrap.toBootstrapPromise(parcel, true));
|
|
77
|
+
const mountPromise = bootstrapPromise.then(() => parcel.currentTask = require_lifecycles_mount.toMountPromise(parcel, true));
|
|
78
|
+
parcel.currentTask = mountPromise;
|
|
79
|
+
let resolveUnmount, rejectUnmount;
|
|
80
|
+
const unmountPromise = new Promise((resolve, reject) => {
|
|
81
|
+
resolveUnmount = resolve;
|
|
82
|
+
rejectUnmount = reject;
|
|
83
|
+
});
|
|
84
|
+
const externalBootstrapPromise = promiseWithoutReturnValue(bootstrapPromise);
|
|
85
|
+
let externalRepresentation = {
|
|
86
|
+
mount() {
|
|
87
|
+
return promiseWithoutReturnValue(Promise.resolve().then(() => {
|
|
88
|
+
if (parcel.status !== require_applications_app_helpers.AppOrParcelStatus.NOT_MOUNTED) throw Error(require_applications_app_errors.formatErrorMessage(13, process.env.NODE_ENV !== "production" && `Cannot mount parcel '${name}' -- it is in a ${parcel.status} status`, name, parcel.status));
|
|
89
|
+
owningAppOrParcel.parcels[id] = parcel;
|
|
90
|
+
return require_lifecycles_mount.toMountPromise(parcel);
|
|
91
|
+
}));
|
|
92
|
+
},
|
|
93
|
+
unmount() {
|
|
94
|
+
return promiseWithoutReturnValue(parcel.unmountThisParcel());
|
|
95
|
+
},
|
|
96
|
+
getStatus() {
|
|
97
|
+
return parcel.status;
|
|
98
|
+
},
|
|
99
|
+
loadPromise: promiseWithoutReturnValue(loadPromise),
|
|
100
|
+
bootstrapPromise: externalBootstrapPromise,
|
|
101
|
+
mountPromise: promiseWithoutReturnValue(mountPromise),
|
|
102
|
+
unmountPromise: promiseWithoutReturnValue(unmountPromise),
|
|
103
|
+
_parcel: parcel
|
|
104
|
+
};
|
|
105
|
+
loadPromise.then((config) => {
|
|
106
|
+
if (config.update) externalRepresentation.update = function(customProps) {
|
|
107
|
+
return parcel.currentTask = parcel.currentTask.then(() => {
|
|
108
|
+
parcel.customProps = customProps;
|
|
109
|
+
return promiseWithoutReturnValue(require_lifecycles_update.toUpdatePromise(parcel));
|
|
110
|
+
});
|
|
111
|
+
};
|
|
112
|
+
}, () => {});
|
|
113
|
+
return externalRepresentation;
|
|
114
|
+
}
|
|
115
|
+
function promiseWithoutReturnValue(promise) {
|
|
116
|
+
return promise.then(() => null);
|
|
117
|
+
}
|
|
118
|
+
//#endregion
|
|
119
|
+
exports.mountParcel = mountParcel;
|
|
120
|
+
exports.mountRootParcel = mountRootParcel;
|
|
121
|
+
|
|
122
|
+
//# sourceMappingURL=mount-parcel.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"mount-parcel.js","names":[],"sources":["../../../src/parcels/mount-parcel.ts"],"sourcesContent":["import {\n validLifecycleFn,\n flattenFnArray,\n CustomProps,\n Parcel,\n ParcelCustomProps,\n ParcelConfigObject,\n ParcelConfig,\n ParcelOwner,\n InternalParcel,\n} from '../lifecycles/lifecycle.helpers';\nimport { AppOrParcelStatus, toName } from '../applications/app.helpers';\nimport { toBootstrapPromise } from '../lifecycles/bootstrap';\nimport { toMountPromise } from '../lifecycles/mount';\nimport { toUpdatePromise } from '../lifecycles/update';\nimport { toUnmountPromise } from '../lifecycles/unmount';\nimport { ensureValidAppTimeouts } from '../applications/timeouts';\nimport { formatErrorMessage } from '../applications/app-errors';\n\nlet parcelCount: number = 0;\nconst rootParcels: ParcelOwner = { name: 'rootParcels', parcels: {} };\n\n// This is a public api, exported to users of single-spa\nexport function mountRootParcel(config: ParcelConfig, customProps: CustomProps) {\n return mountParcel.call(rootParcels, config, customProps);\n}\n\nexport function mountParcel(this: ParcelOwner, config: ParcelConfig, customProps: ParcelCustomProps) {\n const owningAppOrParcel = this;\n\n // Validate inputs\n if (!config || (typeof config !== 'object' && typeof config !== 'function')) {\n throw Error(\n formatErrorMessage(2, __DEV__ && 'Cannot mount parcel without a config object or config loading function'),\n );\n }\n\n if (config.name && typeof config.name !== 'string') {\n throw Error(\n formatErrorMessage(\n 3,\n __DEV__ && `Parcel name must be a string, if provided. Was given ${typeof config.name}`,\n typeof config.name,\n ),\n );\n }\n\n const id = parcelCount++;\n let name = config.name || `parcel-${id}`;\n\n if (typeof customProps !== 'object') {\n throw Error(\n formatErrorMessage(\n 4,\n __DEV__ && `Parcel ${name} has invalid customProps -- must be an object but was given ${typeof customProps}`,\n name,\n typeof customProps,\n ),\n );\n }\n\n if (!customProps.domElement) {\n throw Error(\n formatErrorMessage(\n 5,\n __DEV__ && `Parcel ${name} cannot be mounted without a domElement provided as a prop`,\n name,\n ),\n );\n }\n\n const passedConfigLoadingFunction = typeof config === 'function';\n const configLoadingFunction: () => Promise<ParcelConfigObject<CustomProps>> = passedConfigLoadingFunction\n ? config\n : () => Promise.resolve(config);\n\n // Internal representation\n const parcel: Partial<InternalParcel> = {\n id,\n parcels: {},\n status: passedConfigLoadingFunction ? AppOrParcelStatus.LOADING_SOURCE_CODE : AppOrParcelStatus.NOT_BOOTSTRAPPED,\n customProps,\n parentName: toName(owningAppOrParcel),\n currentTask: undefined,\n unmountThisParcel() {\n return parcel.currentTask.then(() => {\n if (parcel.status !== AppOrParcelStatus.MOUNTED) {\n throw Error(\n formatErrorMessage(\n 6,\n __DEV__ && `Cannot unmount parcel '${name}' -- it is in a ${parcel.status} status`,\n name,\n parcel.status,\n ),\n );\n }\n\n return toUnmountPromise(parcel as InternalParcel, 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 = AppOrParcelStatus.SKIP_BECAUSE_BROKEN;\n rejectUnmount(err);\n throw err;\n });\n });\n },\n };\n\n let loadPromise = configLoadingFunction();\n\n if (!loadPromise || typeof loadPromise.then !== 'function') {\n throw Error(\n formatErrorMessage(\n 7,\n __DEV__ &&\n `When mounting a parcel, the config loading function must return a promise that resolves with the parcel config`,\n ),\n );\n }\n\n loadPromise = loadPromise.then((config) => {\n if (!config) {\n throw Error(\n formatErrorMessage(\n 8,\n __DEV__ &&\n `When mounting a parcel, the config loading function returned a promise that did not resolve with a parcel config`,\n ),\n );\n }\n\n name = config.name || `parcel-${id}`;\n\n if (\n // ES Module objects don't have the object prototype\n Object.prototype.hasOwnProperty.call(config, 'bootstrap') &&\n !validLifecycleFn(config.bootstrap)\n ) {\n throw Error(formatErrorMessage(9, __DEV__ && `Parcel ${name} provided an invalid bootstrap function`, name));\n }\n\n if (!validLifecycleFn(config.mount)) {\n throw Error(formatErrorMessage(10, __DEV__ && `Parcel ${name} must have a valid mount function`, name));\n }\n\n if (!validLifecycleFn(config.unmount)) {\n throw Error(formatErrorMessage(11, __DEV__ && `Parcel ${name} must have a valid unmount function`, name));\n }\n\n if (config.update && !validLifecycleFn(config.update)) {\n throw Error(formatErrorMessage(12, __DEV__ && `Parcel ${name} provided an invalid update function`, name));\n }\n\n const bootstrap = flattenFnArray(config, 'bootstrap', true);\n const mount = flattenFnArray(config, 'mount', true);\n const unmount = flattenFnArray(config, 'unmount', true);\n\n parcel.status = AppOrParcelStatus.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', true);\n }\n\n const fullParcel: InternalParcel = parcel as InternalParcel;\n\n // Add to owning app or parcel\n owningAppOrParcel.parcels[id] = fullParcel;\n\n return config;\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 as InternalParcel, true));\n\n const mountPromise = bootstrapPromise.then(\n () => (parcel.currentTask = toMountPromise(parcel as InternalParcel, true)),\n );\n parcel.currentTask = mountPromise;\n\n let resolveUnmount, rejectUnmount;\n\n const unmountPromise = new Promise((resolve, reject) => {\n resolveUnmount = resolve;\n rejectUnmount = reject;\n });\n\n const externalBootstrapPromise = promiseWithoutReturnValue(bootstrapPromise);\n\n let externalRepresentation: Parcel = {\n mount() {\n return promiseWithoutReturnValue(\n Promise.resolve().then(() => {\n if (parcel.status !== AppOrParcelStatus.NOT_MOUNTED) {\n throw Error(\n formatErrorMessage(\n 13,\n __DEV__ && `Cannot mount parcel '${name}' -- it is in a ${parcel.status} status`,\n name,\n parcel.status,\n ),\n );\n }\n\n // Add to owning app or parcel\n owningAppOrParcel.parcels[id] = parcel as InternalParcel;\n\n return toMountPromise(parcel as InternalParcel);\n }),\n );\n },\n unmount() {\n return promiseWithoutReturnValue(parcel.unmountThisParcel());\n },\n getStatus() {\n return parcel.status;\n },\n loadPromise: promiseWithoutReturnValue(loadPromise),\n bootstrapPromise: externalBootstrapPromise,\n mountPromise: promiseWithoutReturnValue(mountPromise),\n unmountPromise: promiseWithoutReturnValue(unmountPromise),\n _parcel: parcel as InternalParcel,\n };\n\n loadPromise.then(\n (config) => {\n if (config.update) {\n externalRepresentation.update = function (customProps) {\n return (parcel.currentTask = parcel.currentTask.then(() => {\n parcel.customProps = customProps;\n\n return promiseWithoutReturnValue(toUpdatePromise(parcel as InternalParcel));\n }));\n };\n }\n },\n () => {\n // This catch handler avoids unhandled rejections.\n // User code can handle the rejection via externalRepresentation.loadPromise.catch\n },\n );\n\n return externalRepresentation;\n}\n\nfunction promiseWithoutReturnValue(promise) {\n return promise.then(() => null);\n}\n"],"mappings":";;;;;;;;;;AAmBA,IAAI,cAAsB;AAC1B,IAAM,cAA2B;CAAE,MAAM;CAAe,SAAS,CAAC;AAAE;AAGpE,SAAgB,gBAAgB,QAAsB,aAA0B;CAC9E,OAAO,YAAY,KAAK,aAAa,QAAQ,WAAW;AAC1D;AAEA,SAAgB,YAA+B,QAAsB,aAAgC;CACnG,MAAM,oBAAoB;CAG1B,IAAI,CAAC,UAAW,OAAO,WAAW,YAAY,OAAO,WAAW,YAC9D,MAAM,MACJ,gCAAA,mBAAmB,GAAA,QAAA,IAAA,aAAA,gBAAc,wEAAwE,CAC3G;CAGF,IAAI,OAAO,QAAQ,OAAO,OAAO,SAAS,UACxC,MAAM,MACJ,gCAAA,mBACE,GAAA,QAAA,IAAA,aAAA,gBACW,wDAAwD,OAAO,OAAO,QACjF,OAAO,OAAO,IAChB,CACF;CAGF,MAAM,KAAK;CACX,IAAI,OAAO,OAAO,QAAQ,UAAU;CAEpC,IAAI,OAAO,gBAAgB,UACzB,MAAM,MACJ,gCAAA,mBACE,GAAA,QAAA,IAAA,aAAA,gBACW,UAAU,KAAK,8DAA8D,OAAO,eAC/F,MACA,OAAO,WACT,CACF;CAGF,IAAI,CAAC,YAAY,YACf,MAAM,MACJ,gCAAA,mBACE,GAAA,QAAA,IAAA,aAAA,gBACW,UAAU,KAAK,6DAC1B,IACF,CACF;CAGF,MAAM,8BAA8B,OAAO,WAAW;CACtD,MAAM,wBAAwE,8BAC1E,eACM,QAAQ,QAAQ,MAAM;CAGhC,MAAM,SAAkC;EACtC;EACA,SAAS,CAAC;EACV,QAAQ,8BAA8B,iCAAA,kBAAkB,sBAAsB,iCAAA,kBAAkB;EAChG;EACA,YAAY,iCAAA,OAAO,iBAAiB;EACpC,aAAa;EACb,oBAAoB;GAClB,OAAO,OAAO,YAAY,WAAW;IACnC,IAAI,OAAO,WAAW,iCAAA,kBAAkB,SACtC,MAAM,MACJ,gCAAA,mBACE,GAAA,QAAA,IAAA,aAAA,gBACW,0BAA0B,KAAK,kBAAkB,OAAO,OAAO,UAC1E,MACA,OAAO,MACT,CACF;IAGF,OAAO,2BAAA,iBAAiB,QAA0B,IAAI,CAAC,CACpD,MAAM,UAAU;KACf,IAAI,OAAO,YACT,OAAO,kBAAkB,QAAQ,OAAO;KAG1C,OAAO;IACT,CAAC,CAAC,CACD,MAAM,UAAU;KACf,eAAe,KAAK;KACpB,OAAO;IACT,CAAC,CAAC,CACD,OAAO,QAAQ;KACd,OAAO,SAAS,iCAAA,kBAAkB;KAClC,cAAc,GAAG;KACjB,MAAM;IACR,CAAC;GACL,CAAC;EACH;CACF;CAEA,IAAI,cAAc,sBAAsB;CAExC,IAAI,CAAC,eAAe,OAAO,YAAY,SAAS,YAC9C,MAAM,MACJ,gCAAA,mBACE,GAAA,QAAA,IAAA,aAAA,gBAEE,gHACJ,CACF;CAGF,cAAc,YAAY,MAAM,WAAW;EACzC,IAAI,CAAC,QACH,MAAM,MACJ,gCAAA,mBACE,GAAA,QAAA,IAAA,aAAA,gBAEE,kHACJ,CACF;EAGF,OAAO,OAAO,QAAQ,UAAU;EAEhC,IAEE,OAAO,UAAU,eAAe,KAAK,QAAQ,WAAW,KACxD,CAAC,qCAAA,iBAAiB,OAAO,SAAS,GAElC,MAAM,MAAM,gCAAA,mBAAmB,GAAA,QAAA,IAAA,aAAA,gBAAc,UAAU,KAAK,0CAA0C,IAAI,CAAC;EAG7G,IAAI,CAAC,qCAAA,iBAAiB,OAAO,KAAK,GAChC,MAAM,MAAM,gCAAA,mBAAmB,IAAA,QAAA,IAAA,aAAA,gBAAe,UAAU,KAAK,oCAAoC,IAAI,CAAC;EAGxG,IAAI,CAAC,qCAAA,iBAAiB,OAAO,OAAO,GAClC,MAAM,MAAM,gCAAA,mBAAmB,IAAA,QAAA,IAAA,aAAA,gBAAe,UAAU,KAAK,sCAAsC,IAAI,CAAC;EAG1G,IAAI,OAAO,UAAU,CAAC,qCAAA,iBAAiB,OAAO,MAAM,GAClD,MAAM,MAAM,gCAAA,mBAAmB,IAAA,QAAA,IAAA,aAAA,gBAAe,UAAU,KAAK,uCAAuC,IAAI,CAAC;EAG3G,MAAM,YAAY,qCAAA,eAAe,QAAQ,aAAa,IAAI;EAC1D,MAAM,QAAQ,qCAAA,eAAe,QAAQ,SAAS,IAAI;EAClD,MAAM,UAAU,qCAAA,eAAe,QAAQ,WAAW,IAAI;EAEtD,OAAO,SAAS,iCAAA,kBAAkB;EAClC,OAAO,OAAO;EACd,OAAO,YAAY;EACnB,OAAO,QAAQ;EACf,OAAO,UAAU;EACjB,OAAO,WAAW,8BAAA,uBAAuB,OAAO,QAAQ;EAExD,IAAI,OAAO,QACT,OAAO,SAAS,qCAAA,eAAe,QAAQ,UAAU,IAAI;EAGvD,MAAM,aAA6B;EAGnC,kBAAkB,QAAQ,MAAM;EAEhC,OAAO;CACT,CAAC;CAID,MAAM,mBAAmB,YAAY,WAAW,6BAAA,mBAAmB,QAA0B,IAAI,CAAC;CAElG,MAAM,eAAe,iBAAiB,WAC7B,OAAO,cAAc,yBAAA,eAAe,QAA0B,IAAI,CAC3E;CACA,OAAO,cAAc;CAErB,IAAI,gBAAgB;CAEpB,MAAM,iBAAiB,IAAI,SAAS,SAAS,WAAW;EACtD,iBAAiB;EACjB,gBAAgB;CAClB,CAAC;CAED,MAAM,2BAA2B,0BAA0B,gBAAgB;CAE3E,IAAI,yBAAiC;EACnC,QAAQ;GACN,OAAO,0BACL,QAAQ,QAAQ,CAAC,CAAC,WAAW;IAC3B,IAAI,OAAO,WAAW,iCAAA,kBAAkB,aACtC,MAAM,MACJ,gCAAA,mBACE,IAAA,QAAA,IAAA,aAAA,gBACW,wBAAwB,KAAK,kBAAkB,OAAO,OAAO,UACxE,MACA,OAAO,MACT,CACF;IAIF,kBAAkB,QAAQ,MAAM;IAEhC,OAAO,yBAAA,eAAe,MAAwB;GAChD,CAAC,CACH;EACF;EACA,UAAU;GACR,OAAO,0BAA0B,OAAO,kBAAkB,CAAC;EAC7D;EACA,YAAY;GACV,OAAO,OAAO;EAChB;EACA,aAAa,0BAA0B,WAAW;EAClD,kBAAkB;EAClB,cAAc,0BAA0B,YAAY;EACpD,gBAAgB,0BAA0B,cAAc;EACxD,SAAS;CACX;CAEA,YAAY,MACT,WAAW;EACV,IAAI,OAAO,QACT,uBAAuB,SAAS,SAAU,aAAa;GACrD,OAAQ,OAAO,cAAc,OAAO,YAAY,WAAW;IACzD,OAAO,cAAc;IAErB,OAAO,0BAA0B,0BAAA,gBAAgB,MAAwB,CAAC;GAC5E,CAAC;EACH;CAEJ,SACM,CAGN,CACF;CAEA,OAAO;AACT;AAEA,SAAS,0BAA0B,SAAS;CAC1C,OAAO,QAAQ,WAAW,IAAI;AAChC"}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
export { start } from './start';
|
|
2
|
+
export type { StartOpts } from './start';
|
|
3
|
+
export { ensureJQuerySupport } from './jquery-support';
|
|
4
|
+
export { setBootstrapMaxTime, setBootstrapMaxTime as setInitMaxTime, setMountMaxTime, setUnmountMaxTime, setUnloadMaxTime, } from './applications/timeouts';
|
|
5
|
+
export { registerApplication, unregisterApplication, getMountedApps, getAppStatus, unloadApplication, checkActivityFunctions, getAppNames, pathToActiveWhen, } from './applications/apps';
|
|
6
|
+
export { navigateToUrl, patchHistoryApi } from './navigation/navigation-events';
|
|
7
|
+
export { triggerAppChange } from './navigation/reroute';
|
|
8
|
+
export { addErrorHandler, removeErrorHandler, type SingleSpaError, type ErrorHandler } from './applications/app-errors';
|
|
9
|
+
export { mountRootParcel } from './parcels/mount-parcel';
|
|
10
|
+
export type { CustomProps, ParcelCustomProps, CustomPropsFn, AppProps, ParcelConfig, ParcelConfigObject, LifeCycles, LifeCycleFn, Parcel, Application, LoadApp, ActivityFn, Activity, RegisterApplicationConfig, } from './lifecycles/lifecycle.helpers';
|
|
11
|
+
export { AppOrParcelStatus } from './applications/app.helpers';
|
|
12
|
+
import devtools from './devtools/devtools';
|
|
13
|
+
declare global {
|
|
14
|
+
interface Window {
|
|
15
|
+
__SINGLE_SPA_DEVTOOLS__: {
|
|
16
|
+
exposedMethods: typeof devtools;
|
|
17
|
+
};
|
|
18
|
+
}
|
|
19
|
+
}
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
|
|
2
|
+
const require_applications_app_helpers = require("./applications/app.helpers.js");
|
|
3
|
+
const require_applications_app_errors = require("./applications/app-errors.js");
|
|
4
|
+
const require_utils_runtime_environment = require("./utils/runtime-environment.js");
|
|
5
|
+
const require_start = require("./start.js");
|
|
6
|
+
const require_parcels_mount_parcel = require("./parcels/mount-parcel.js");
|
|
7
|
+
const require_applications_timeouts = require("./applications/timeouts.js");
|
|
8
|
+
const require_navigation_reroute = require("./navigation/reroute.js");
|
|
9
|
+
const require_navigation_navigation_events = require("./navigation/navigation-events.js");
|
|
10
|
+
const require_jquery_support = require("./jquery-support.js");
|
|
11
|
+
const require_applications_apps = require("./applications/apps.js");
|
|
12
|
+
const require_devtools_devtools = require("./devtools/devtools.js");
|
|
13
|
+
//#region src/single-spa.ts
|
|
14
|
+
if (require_utils_runtime_environment.isInBrowser && window.__SINGLE_SPA_DEVTOOLS__) window.__SINGLE_SPA_DEVTOOLS__.exposedMethods = require_devtools_devtools.default;
|
|
15
|
+
//#endregion
|
|
16
|
+
exports.AppOrParcelStatus = require_applications_app_helpers.AppOrParcelStatus;
|
|
17
|
+
exports.addErrorHandler = require_applications_app_errors.addErrorHandler;
|
|
18
|
+
exports.checkActivityFunctions = require_applications_apps.checkActivityFunctions;
|
|
19
|
+
exports.ensureJQuerySupport = require_jquery_support.ensureJQuerySupport;
|
|
20
|
+
exports.getAppNames = require_applications_apps.getAppNames;
|
|
21
|
+
exports.getAppStatus = require_applications_apps.getAppStatus;
|
|
22
|
+
exports.getMountedApps = require_applications_apps.getMountedApps;
|
|
23
|
+
exports.mountRootParcel = require_parcels_mount_parcel.mountRootParcel;
|
|
24
|
+
exports.navigateToUrl = require_navigation_navigation_events.navigateToUrl;
|
|
25
|
+
exports.patchHistoryApi = require_navigation_navigation_events.patchHistoryApi;
|
|
26
|
+
exports.pathToActiveWhen = require_applications_apps.pathToActiveWhen;
|
|
27
|
+
exports.registerApplication = require_applications_apps.registerApplication;
|
|
28
|
+
exports.removeErrorHandler = require_applications_app_errors.removeErrorHandler;
|
|
29
|
+
exports.setBootstrapMaxTime = require_applications_timeouts.setBootstrapMaxTime;
|
|
30
|
+
exports.setInitMaxTime = require_applications_timeouts.setBootstrapMaxTime;
|
|
31
|
+
exports.setMountMaxTime = require_applications_timeouts.setMountMaxTime;
|
|
32
|
+
exports.setUnloadMaxTime = require_applications_timeouts.setUnloadMaxTime;
|
|
33
|
+
exports.setUnmountMaxTime = require_applications_timeouts.setUnmountMaxTime;
|
|
34
|
+
exports.start = require_start.start;
|
|
35
|
+
exports.triggerAppChange = require_navigation_reroute.triggerAppChange;
|
|
36
|
+
exports.unloadApplication = require_applications_apps.unloadApplication;
|
|
37
|
+
exports.unregisterApplication = require_applications_apps.unregisterApplication;
|
|
38
|
+
|
|
39
|
+
//# sourceMappingURL=single-spa.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"single-spa.js","names":[],"sources":["../../src/single-spa.ts"],"sourcesContent":["export { start } from './start';\nexport type { StartOpts } from './start';\nexport { ensureJQuerySupport } from './jquery-support';\nexport {\n setBootstrapMaxTime,\n // qiankun fork: v7's rename stays as a permanent alias (see the fork README)\n setBootstrapMaxTime as setInitMaxTime,\n setMountMaxTime,\n setUnmountMaxTime,\n setUnloadMaxTime,\n} from './applications/timeouts';\nexport {\n registerApplication,\n unregisterApplication,\n getMountedApps,\n getAppStatus,\n unloadApplication,\n checkActivityFunctions,\n getAppNames,\n pathToActiveWhen,\n} from './applications/apps';\nexport { navigateToUrl, patchHistoryApi } from './navigation/navigation-events';\nexport { triggerAppChange } from './navigation/reroute';\nexport { addErrorHandler, removeErrorHandler, type SingleSpaError, type ErrorHandler } from './applications/app-errors';\nexport { mountRootParcel } from './parcels/mount-parcel';\nexport type {\n CustomProps,\n ParcelCustomProps,\n CustomPropsFn,\n AppProps,\n ParcelConfig,\n ParcelConfigObject,\n LifeCycles,\n LifeCycleFn,\n Parcel,\n Application,\n LoadApp,\n ActivityFn,\n Activity,\n RegisterApplicationConfig,\n} from './lifecycles/lifecycle.helpers';\n\nexport { AppOrParcelStatus } from './applications/app.helpers';\n\nimport devtools from './devtools/devtools';\nimport { isInBrowser } from './utils/runtime-environment';\n\nif (isInBrowser && window.__SINGLE_SPA_DEVTOOLS__) {\n window.__SINGLE_SPA_DEVTOOLS__.exposedMethods = devtools;\n}\n\ndeclare global {\n interface Window {\n __SINGLE_SPA_DEVTOOLS__: {\n exposedMethods: typeof devtools;\n };\n }\n}\n"],"mappings":";;;;;;;;;;;;;AA+CA,IAAI,kCAAA,eAAe,OAAO,yBACxB,OAAO,wBAAwB,iBAAiB,0BAAA"}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
|
|
2
|
+
const require_utils_runtime_environment = require("./utils/runtime-environment.js");
|
|
3
|
+
const require_navigation_reroute = require("./navigation/reroute.js");
|
|
4
|
+
const require_navigation_navigation_events = require("./navigation/navigation-events.js");
|
|
5
|
+
//#region src/start.ts
|
|
6
|
+
var started = false;
|
|
7
|
+
function start(opts) {
|
|
8
|
+
started = true;
|
|
9
|
+
if (require_utils_runtime_environment.isInBrowser) {
|
|
10
|
+
require_navigation_navigation_events.patchHistoryApi(opts);
|
|
11
|
+
require_navigation_reroute.reroute();
|
|
12
|
+
}
|
|
13
|
+
}
|
|
14
|
+
function isStarted() {
|
|
15
|
+
return started;
|
|
16
|
+
}
|
|
17
|
+
//#endregion
|
|
18
|
+
exports.isStarted = isStarted;
|
|
19
|
+
exports.start = start;
|
|
20
|
+
|
|
21
|
+
//# sourceMappingURL=start.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"start.js","names":[],"sources":["../../src/start.ts"],"sourcesContent":["import { reroute } from './navigation/reroute';\nimport { patchHistoryApi } from './navigation/navigation-events';\nimport { isInBrowser } from './utils/runtime-environment';\n\nlet started: boolean = false;\n\nexport function start(opts?: StartOpts) {\n started = true;\n if (isInBrowser) {\n patchHistoryApi(opts);\n reroute();\n }\n}\n\nexport function isStarted(): boolean {\n return started;\n}\n\nexport interface StartOpts {\n urlRerouteOnly?: boolean;\n}\n"],"mappings":";;;;;AAIA,IAAI,UAAmB;AAEvB,SAAgB,MAAM,MAAkB;CACtC,UAAU;CACV,IAAI,kCAAA,aAAa;EACf,qCAAA,gBAAgB,IAAI;EACpB,2BAAA,QAAQ;CACV;AACF;AAEA,SAAgB,YAAqB;CACnC,OAAO;AACT"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export declare const isInBrowser: boolean;
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
|
|
2
|
+
//#region src/utils/runtime-environment.ts
|
|
3
|
+
var isInBrowser = typeof window !== "undefined";
|
|
4
|
+
//#endregion
|
|
5
|
+
exports.isInBrowser = isInBrowser;
|
|
6
|
+
|
|
7
|
+
//# sourceMappingURL=runtime-environment.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"runtime-environment.js","names":[],"sources":["../../../src/utils/runtime-environment.ts"],"sourcesContent":["export const isInBrowser = typeof window !== 'undefined';\n"],"mappings":";;AAAA,IAAa,cAAc,OAAO,WAAW"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import { AppOrParcel } from '../lifecycles/lifecycle.helpers';
|
|
2
|
+
import { AppOrParcelStatus } from './app.helpers';
|
|
3
|
+
export type SingleSpaError = Error & {
|
|
4
|
+
appOrParcelName: string;
|
|
5
|
+
};
|
|
6
|
+
export type ErrorHandler = (err: SingleSpaError) => any;
|
|
7
|
+
export declare function handleAppError(err: Error, app: AppOrParcel, newStatus: AppOrParcelStatus): void;
|
|
8
|
+
export declare function addErrorHandler(handler: any): void;
|
|
9
|
+
export declare function removeErrorHandler(handler: any): boolean;
|
|
10
|
+
export declare function formatErrorMessage(code: any, msg: any, ...args: any[]): string;
|
|
11
|
+
export declare function transformErr(ogErr: Error, appOrParcel: AppOrParcel, newStatus: AppOrParcelStatus): SingleSpaError;
|
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
import { objectType, toName } from "./app.helpers.js";
|
|
2
|
+
//#region src/applications/app-errors.ts
|
|
3
|
+
var errorHandlers = [];
|
|
4
|
+
function handleAppError(err, app, newStatus) {
|
|
5
|
+
const transformedErr = transformErr(err, app, newStatus);
|
|
6
|
+
if (errorHandlers.length) errorHandlers.forEach((handler) => handler(transformedErr));
|
|
7
|
+
else setTimeout(() => {
|
|
8
|
+
throw transformedErr;
|
|
9
|
+
});
|
|
10
|
+
}
|
|
11
|
+
function addErrorHandler(handler) {
|
|
12
|
+
if (typeof handler !== "function") throw Error(formatErrorMessage(28, process.env.NODE_ENV !== "production" && "a single-spa error handler must be a function"));
|
|
13
|
+
errorHandlers.push(handler);
|
|
14
|
+
}
|
|
15
|
+
function removeErrorHandler(handler) {
|
|
16
|
+
if (typeof handler !== "function") throw Error(formatErrorMessage(29, process.env.NODE_ENV !== "production" && "a single-spa error handler must be a function"));
|
|
17
|
+
let removedSomething = false;
|
|
18
|
+
errorHandlers = errorHandlers.filter((h) => {
|
|
19
|
+
const isHandler = h === handler;
|
|
20
|
+
removedSomething = removedSomething || isHandler;
|
|
21
|
+
return !isHandler;
|
|
22
|
+
});
|
|
23
|
+
return removedSomething;
|
|
24
|
+
}
|
|
25
|
+
function formatErrorMessage(code, msg, ...args) {
|
|
26
|
+
return `single-spa minified message #${code}: ${msg ? msg + " " : ""}See https://single-spa.js.org/error/?code=${code}${args.length ? `&arg=${args.join("&arg=")}` : ""}`;
|
|
27
|
+
}
|
|
28
|
+
function transformErr(ogErr, appOrParcel, newStatus) {
|
|
29
|
+
const errPrefix = `${objectType(appOrParcel)} '${toName(appOrParcel)}' died in status ${appOrParcel.status}: `;
|
|
30
|
+
let result;
|
|
31
|
+
if (ogErr instanceof Error) {
|
|
32
|
+
try {
|
|
33
|
+
ogErr.message = errPrefix + ogErr.message;
|
|
34
|
+
} catch (err) {}
|
|
35
|
+
result = ogErr;
|
|
36
|
+
} else {
|
|
37
|
+
console.warn(formatErrorMessage(30, process.env.NODE_ENV !== "production" && `While ${appOrParcel.status}, '${toName(appOrParcel)}' rejected its lifecycle function promise with a non-Error. This will cause stack traces to not be accurate.`, appOrParcel.status, toName(appOrParcel)));
|
|
38
|
+
try {
|
|
39
|
+
result = Error(errPrefix + JSON.stringify(ogErr));
|
|
40
|
+
} catch (err) {
|
|
41
|
+
result = ogErr;
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
const singleSpaErr = result;
|
|
45
|
+
singleSpaErr.appOrParcelName = toName(appOrParcel);
|
|
46
|
+
appOrParcel.status = newStatus;
|
|
47
|
+
return singleSpaErr;
|
|
48
|
+
}
|
|
49
|
+
//#endregion
|
|
50
|
+
export { addErrorHandler, formatErrorMessage, handleAppError, removeErrorHandler, transformErr };
|
|
51
|
+
|
|
52
|
+
//# sourceMappingURL=app-errors.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"app-errors.js","names":[],"sources":["../../../src/applications/app-errors.ts"],"sourcesContent":["import { AppOrParcel } from '../lifecycles/lifecycle.helpers';\nimport { AppOrParcelStatus, objectType, toName } from './app.helpers';\n\nlet errorHandlers: ErrorHandler[] = [];\n\nexport type SingleSpaError = Error & {\n appOrParcelName: string;\n};\n\nexport type ErrorHandler = (err: SingleSpaError) => any;\n\nexport function handleAppError(err: Error, app: AppOrParcel, newStatus: AppOrParcelStatus) {\n const transformedErr = transformErr(err, app, newStatus);\n\n if (errorHandlers.length) {\n errorHandlers.forEach((handler) => handler(transformedErr));\n } else {\n setTimeout(() => {\n throw transformedErr;\n });\n }\n}\n\nexport function addErrorHandler(handler) {\n if (typeof handler !== 'function') {\n throw Error(formatErrorMessage(28, __DEV__ && '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(formatErrorMessage(29, __DEV__ && '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 formatErrorMessage(code, msg, ...args) {\n return `single-spa minified message #${code}: ${\n msg ? msg + ' ' : ''\n }See https://single-spa.js.org/error/?code=${code}${args.length ? `&arg=${args.join('&arg=')}` : ''}`;\n}\n\nexport function transformErr(ogErr: Error, appOrParcel: AppOrParcel, newStatus: AppOrParcelStatus): SingleSpaError {\n const errPrefix = `${objectType(appOrParcel)} '${toName(appOrParcel)}' died in status ${appOrParcel.status}: `;\n\n let result: Error;\n\n if (ogErr instanceof Error) {\n try {\n ogErr.message = errPrefix + ogErr.message;\n } catch (err) {\n /* Some errors have read-only message properties, in which case there is nothing\n * that we can do.\n */\n }\n result = ogErr;\n } else {\n console.warn(\n formatErrorMessage(\n 30,\n __DEV__ &&\n `While ${appOrParcel.status}, '${toName(\n appOrParcel,\n )}' rejected its lifecycle function promise with a non-Error. This will cause stack traces to not be accurate.`,\n appOrParcel.status,\n toName(appOrParcel),\n ),\n );\n try {\n result = Error(errPrefix + JSON.stringify(ogErr));\n } catch (err) {\n // If it's not an Error and you can't stringify it, then what else can you even do to it?\n result = ogErr;\n }\n }\n\n const singleSpaErr = result as SingleSpaError;\n singleSpaErr.appOrParcelName = toName(appOrParcel);\n\n // We set the status after transforming the error so that the error message\n // references the state the application was in before the status change.\n appOrParcel.status = newStatus;\n\n return singleSpaErr;\n}\n"],"mappings":";;AAGA,IAAI,gBAAgC,CAAC;AAQrC,SAAgB,eAAe,KAAY,KAAkB,WAA8B;CACzF,MAAM,iBAAiB,aAAa,KAAK,KAAK,SAAS;CAEvD,IAAI,cAAc,QAChB,cAAc,SAAS,YAAY,QAAQ,cAAc,CAAC;MAE1D,iBAAiB;EACf,MAAM;CACR,CAAC;AAEL;AAEA,SAAgB,gBAAgB,SAAS;CACvC,IAAI,OAAO,YAAY,YACrB,MAAM,MAAM,mBAAmB,IAAA,QAAA,IAAA,aAAA,gBAAe,+CAA+C,CAAC;CAGhG,cAAc,KAAK,OAAO;AAC5B;AAEA,SAAgB,mBAAmB,SAAS;CAC1C,IAAI,OAAO,YAAY,YACrB,MAAM,MAAM,mBAAmB,IAAA,QAAA,IAAA,aAAA,gBAAe,+CAA+C,CAAC;CAGhG,IAAI,mBAAmB;CACvB,gBAAgB,cAAc,QAAQ,MAAM;EAC1C,MAAM,YAAY,MAAM;EACxB,mBAAmB,oBAAoB;EACvC,OAAO,CAAC;CACV,CAAC;CAED,OAAO;AACT;AAEA,SAAgB,mBAAmB,MAAM,KAAK,GAAG,MAAM;CACrD,OAAO,gCAAgC,KAAK,IAC1C,MAAM,MAAM,MAAM,GACnB,4CAA4C,OAAO,KAAK,SAAS,QAAQ,KAAK,KAAK,OAAO,MAAM;AACnG;AAEA,SAAgB,aAAa,OAAc,aAA0B,WAA8C;CACjH,MAAM,YAAY,GAAG,WAAW,WAAW,EAAE,IAAI,OAAO,WAAW,EAAE,mBAAmB,YAAY,OAAO;CAE3G,IAAI;CAEJ,IAAI,iBAAiB,OAAO;EAC1B,IAAI;GACF,MAAM,UAAU,YAAY,MAAM;EACpC,SAAS,KAAK,CAId;EACA,SAAS;CACX,OAAO;EACL,QAAQ,KACN,mBACE,IAAA,QAAA,IAAA,aAAA,gBAEE,SAAS,YAAY,OAAO,KAAK,OAC/B,WACF,EAAE,+GACJ,YAAY,QACZ,OAAO,WAAW,CACpB,CACF;EACA,IAAI;GACF,SAAS,MAAM,YAAY,KAAK,UAAU,KAAK,CAAC;EAClD,SAAS,KAAK;GAEZ,SAAS;EACX;CACF;CAEA,MAAM,eAAe;CACrB,aAAa,kBAAkB,OAAO,WAAW;CAIjD,YAAY,SAAS;CAErB,OAAO;AACT"}
|
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
import { ActivityFn, AppOrParcel, CustomProps, InternalParcel, LoadApp, ParcelMap } from '../lifecycles/lifecycle.helpers';
|
|
2
|
+
import { AppOrParcelTimeouts } from './timeouts';
|
|
3
|
+
export declare enum AppOrParcelStatus {
|
|
4
|
+
NOT_LOADED = "NOT_LOADED",
|
|
5
|
+
LOADING_SOURCE_CODE = "LOADING_SOURCE_CODE",
|
|
6
|
+
NOT_BOOTSTRAPPED = "NOT_BOOTSTRAPPED",
|
|
7
|
+
BOOTSTRAPPING = "BOOTSTRAPPING",
|
|
8
|
+
NOT_MOUNTED = "NOT_MOUNTED",
|
|
9
|
+
MOUNTING = "MOUNTING",
|
|
10
|
+
MOUNTED = "MOUNTED",
|
|
11
|
+
UPDATING = "UPDATING",
|
|
12
|
+
UNMOUNTING = "UNMOUNTING",
|
|
13
|
+
UNLOADING = "UNLOADING",
|
|
14
|
+
LOAD_ERROR = "LOAD_ERROR",
|
|
15
|
+
SKIP_BECAUSE_BROKEN = "SKIP_BECAUSE_BROKEN"
|
|
16
|
+
}
|
|
17
|
+
export declare function isActive(app: any): boolean;
|
|
18
|
+
export declare function shouldBeActive(app: any): any;
|
|
19
|
+
export declare function toName(app: any): any;
|
|
20
|
+
export declare function isParcel(appOrParcel: AppOrParcel): appOrParcel is InternalParcel;
|
|
21
|
+
export declare function objectType(appOrParcel: AppOrParcel): 'parcel' | 'application';
|
|
22
|
+
export interface InternalApplication {
|
|
23
|
+
name: string;
|
|
24
|
+
activeWhen: ActivityFn;
|
|
25
|
+
loadApp: LoadApp;
|
|
26
|
+
status: AppOrParcelStatus;
|
|
27
|
+
loadErrorTime: number;
|
|
28
|
+
parcels: ParcelMap;
|
|
29
|
+
customProps?: CustomProps;
|
|
30
|
+
timeouts?: AppOrParcelTimeouts;
|
|
31
|
+
devtools: AppDevtools;
|
|
32
|
+
}
|
|
33
|
+
export interface AppDevtools {
|
|
34
|
+
overlays: {
|
|
35
|
+
options: OverlayOptions;
|
|
36
|
+
selectors: string[];
|
|
37
|
+
};
|
|
38
|
+
}
|
|
39
|
+
interface OverlayOptions {
|
|
40
|
+
color?: string;
|
|
41
|
+
background?: string;
|
|
42
|
+
classes?: string[];
|
|
43
|
+
height?: string;
|
|
44
|
+
left?: string;
|
|
45
|
+
position?: string;
|
|
46
|
+
top?: string;
|
|
47
|
+
width?: string;
|
|
48
|
+
zIndex?: string | number;
|
|
49
|
+
textColor?: string;
|
|
50
|
+
textBlocks?: string[];
|
|
51
|
+
}
|
|
52
|
+
export {};
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
import { handleAppError } from "./app-errors.js";
|
|
2
|
+
//#region src/applications/app.helpers.ts
|
|
3
|
+
var AppOrParcelStatus = /* @__PURE__ */ function(AppOrParcelStatus) {
|
|
4
|
+
AppOrParcelStatus["NOT_LOADED"] = "NOT_LOADED";
|
|
5
|
+
AppOrParcelStatus["LOADING_SOURCE_CODE"] = "LOADING_SOURCE_CODE";
|
|
6
|
+
AppOrParcelStatus["NOT_BOOTSTRAPPED"] = "NOT_BOOTSTRAPPED";
|
|
7
|
+
AppOrParcelStatus["BOOTSTRAPPING"] = "BOOTSTRAPPING";
|
|
8
|
+
AppOrParcelStatus["NOT_MOUNTED"] = "NOT_MOUNTED";
|
|
9
|
+
AppOrParcelStatus["MOUNTING"] = "MOUNTING";
|
|
10
|
+
AppOrParcelStatus["MOUNTED"] = "MOUNTED";
|
|
11
|
+
AppOrParcelStatus["UPDATING"] = "UPDATING";
|
|
12
|
+
AppOrParcelStatus["UNMOUNTING"] = "UNMOUNTING";
|
|
13
|
+
AppOrParcelStatus["UNLOADING"] = "UNLOADING";
|
|
14
|
+
AppOrParcelStatus["LOAD_ERROR"] = "LOAD_ERROR";
|
|
15
|
+
AppOrParcelStatus["SKIP_BECAUSE_BROKEN"] = "SKIP_BECAUSE_BROKEN";
|
|
16
|
+
return AppOrParcelStatus;
|
|
17
|
+
}({});
|
|
18
|
+
function isActive(app) {
|
|
19
|
+
return app.status === "MOUNTED";
|
|
20
|
+
}
|
|
21
|
+
function shouldBeActive(app) {
|
|
22
|
+
try {
|
|
23
|
+
return app.activeWhen(window.location);
|
|
24
|
+
} catch (err) {
|
|
25
|
+
handleAppError(err, app, "SKIP_BECAUSE_BROKEN");
|
|
26
|
+
return false;
|
|
27
|
+
}
|
|
28
|
+
}
|
|
29
|
+
function toName(app) {
|
|
30
|
+
return app.name;
|
|
31
|
+
}
|
|
32
|
+
function isParcel(appOrParcel) {
|
|
33
|
+
return Boolean(appOrParcel.unmountThisParcel);
|
|
34
|
+
}
|
|
35
|
+
function objectType(appOrParcel) {
|
|
36
|
+
return isParcel(appOrParcel) ? "parcel" : "application";
|
|
37
|
+
}
|
|
38
|
+
//#endregion
|
|
39
|
+
export { AppOrParcelStatus, isActive, isParcel, objectType, shouldBeActive, toName };
|
|
40
|
+
|
|
41
|
+
//# sourceMappingURL=app.helpers.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"app.helpers.js","names":[],"sources":["../../../src/applications/app.helpers.ts"],"sourcesContent":["import {\n ActivityFn,\n AppOrParcel,\n CustomProps,\n InternalParcel,\n LoadApp,\n ParcelMap,\n} from '../lifecycles/lifecycle.helpers';\nimport { handleAppError } from './app-errors';\nimport { AppOrParcelTimeouts } from './timeouts';\n\n// App statuses\nexport enum AppOrParcelStatus {\n NOT_LOADED = 'NOT_LOADED',\n LOADING_SOURCE_CODE = 'LOADING_SOURCE_CODE',\n NOT_BOOTSTRAPPED = 'NOT_BOOTSTRAPPED',\n BOOTSTRAPPING = 'BOOTSTRAPPING',\n NOT_MOUNTED = 'NOT_MOUNTED',\n MOUNTING = 'MOUNTING',\n MOUNTED = 'MOUNTED',\n UPDATING = 'UPDATING',\n UNMOUNTING = 'UNMOUNTING',\n UNLOADING = 'UNLOADING',\n LOAD_ERROR = 'LOAD_ERROR',\n SKIP_BECAUSE_BROKEN = 'SKIP_BECAUSE_BROKEN',\n}\n\nexport function isActive(app) {\n return app.status === AppOrParcelStatus.MOUNTED;\n}\n\nexport function shouldBeActive(app) {\n try {\n return app.activeWhen(window.location);\n } catch (err) {\n handleAppError(err, app, AppOrParcelStatus.SKIP_BECAUSE_BROKEN);\n return false;\n }\n}\n\nexport function toName(app) {\n return app.name;\n}\n\nexport function isParcel(appOrParcel: AppOrParcel): appOrParcel is InternalParcel {\n return Boolean((appOrParcel as InternalParcel).unmountThisParcel);\n}\n\nexport function objectType(appOrParcel: AppOrParcel): 'parcel' | 'application' {\n return isParcel(appOrParcel) ? 'parcel' : 'application';\n}\n\nexport interface InternalApplication {\n name: string;\n activeWhen: ActivityFn;\n loadApp: LoadApp;\n status: AppOrParcelStatus;\n loadErrorTime: number;\n parcels: ParcelMap;\n customProps?: CustomProps;\n // The ensureValidAppTimeouts function gets called once the app is loaded\n timeouts?: AppOrParcelTimeouts;\n devtools: AppDevtools;\n}\n\nexport interface AppDevtools {\n overlays: {\n options: OverlayOptions;\n selectors: string[];\n };\n}\n\n// https://github.com/single-spa/single-spa-inspector/blob/ac3e1ded68e94239dd02d04f8a094ed8e6dfefc2/src/inspected-window-helpers/overlay-helpers.js#L53\ninterface OverlayOptions {\n color?: string;\n background?: string;\n classes?: string[];\n height?: string;\n left?: string;\n position?: string;\n top?: string;\n width?: string;\n zIndex?: string | number;\n textColor?: string;\n textBlocks?: string[];\n}\n"],"mappings":";;AAYA,IAAY,oBAAL,yBAAA,mBAAA;CACL,kBAAA,gBAAA;CACA,kBAAA,yBAAA;CACA,kBAAA,sBAAA;CACA,kBAAA,mBAAA;CACA,kBAAA,iBAAA;CACA,kBAAA,cAAA;CACA,kBAAA,aAAA;CACA,kBAAA,cAAA;CACA,kBAAA,gBAAA;CACA,kBAAA,eAAA;CACA,kBAAA,gBAAA;CACA,kBAAA,yBAAA;;AACF,EAAA,CAAA,CAAA;AAEA,SAAgB,SAAS,KAAK;CAC5B,OAAO,IAAI,WAAA;AACb;AAEA,SAAgB,eAAe,KAAK;CAClC,IAAI;EACF,OAAO,IAAI,WAAW,OAAO,QAAQ;CACvC,SAAS,KAAK;EACZ,eAAe,KAAK,KAAA,qBAA0C;EAC9D,OAAO;CACT;AACF;AAEA,SAAgB,OAAO,KAAK;CAC1B,OAAO,IAAI;AACb;AAEA,SAAgB,SAAS,aAAyD;CAChF,OAAO,QAAS,YAA+B,iBAAiB;AAClE;AAEA,SAAgB,WAAW,aAAoD;CAC7E,OAAO,SAAS,WAAW,IAAI,WAAW;AAC5C"}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
import { InternalApplication, AppOrParcelStatus } from './app.helpers';
|
|
2
|
+
import { Activity, ActivityFn, Application, CustomProps, CustomPropsFn, RegisterApplicationConfig, SingleSpaLocation } from '../lifecycles/lifecycle.helpers';
|
|
3
|
+
interface AppChanges {
|
|
4
|
+
appsToUnload: InternalApplication[];
|
|
5
|
+
appsToUnmount: InternalApplication[];
|
|
6
|
+
appsToLoad: InternalApplication[];
|
|
7
|
+
appsToMount: InternalApplication[];
|
|
8
|
+
}
|
|
9
|
+
export declare function getAppChanges(): AppChanges;
|
|
10
|
+
export declare function getMountedApps(): string[];
|
|
11
|
+
export declare function getAppNames(): string[];
|
|
12
|
+
export declare function getRawAppData(): InternalApplication[];
|
|
13
|
+
export declare function getAppStatus(appName: any): AppOrParcelStatus | null;
|
|
14
|
+
export declare function registerApplication<ExtraProps extends CustomProps = {}>(RegisterApplicationConfig: any): void;
|
|
15
|
+
export declare function registerApplication<ExtraProps extends CustomProps = {}>(appName: string, app: Application, activeWhen: Activity, customProps: ExtraProps | CustomPropsFn<ExtraProps>): void;
|
|
16
|
+
export declare function checkActivityFunctions(location?: SingleSpaLocation): string[];
|
|
17
|
+
export declare function unregisterApplication(appName: string): Promise<void>;
|
|
18
|
+
export declare function unloadApplication(appName: string, opts?: {
|
|
19
|
+
waitForUnmount: boolean;
|
|
20
|
+
}): Promise<void>;
|
|
21
|
+
export declare function validateRegisterWithConfig(config: Partial<RegisterApplicationConfig>): void;
|
|
22
|
+
export declare function pathToActiveWhen(path: string, exactMatch?: boolean): ActivityFn;
|
|
23
|
+
export {};
|