@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.
Files changed (137) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +52 -0
  3. package/dist/cjs/applications/app-errors.d.ts +11 -0
  4. package/dist/cjs/applications/app-errors.js +57 -0
  5. package/dist/cjs/applications/app-errors.js.map +1 -0
  6. package/dist/cjs/applications/app.helpers.d.ts +52 -0
  7. package/dist/cjs/applications/app.helpers.js +47 -0
  8. package/dist/cjs/applications/app.helpers.js.map +1 -0
  9. package/dist/cjs/applications/apps.d.ts +23 -0
  10. package/dist/cjs/applications/apps.js +234 -0
  11. package/dist/cjs/applications/apps.js.map +1 -0
  12. package/dist/cjs/applications/timeouts.d.ts +19 -0
  13. package/dist/cjs/applications/timeouts.js +115 -0
  14. package/dist/cjs/applications/timeouts.js.map +1 -0
  15. package/dist/cjs/declarations.d.ts +4 -0
  16. package/dist/cjs/devtools/devtools.d.ts +16 -0
  17. package/dist/cjs/devtools/devtools.js +24 -0
  18. package/dist/cjs/devtools/devtools.js.map +1 -0
  19. package/dist/cjs/devtools/profiler.d.ts +11 -0
  20. package/dist/cjs/devtools/profiler.js +25 -0
  21. package/dist/cjs/devtools/profiler.js.map +1 -0
  22. package/dist/cjs/index.d.ts +1 -0
  23. package/dist/cjs/index.js +32 -0
  24. package/dist/cjs/jquery-support.d.ts +7 -0
  25. package/dist/cjs/jquery-support.js +34 -0
  26. package/dist/cjs/jquery-support.js.map +1 -0
  27. package/dist/cjs/lifecycles/bootstrap.d.ts +2 -0
  28. package/dist/cjs/lifecycles/bootstrap.js +27 -0
  29. package/dist/cjs/lifecycles/bootstrap.js.map +1 -0
  30. package/dist/cjs/lifecycles/lifecycle.helpers.d.ts +90 -0
  31. package/dist/cjs/lifecycles/lifecycle.helpers.js +33 -0
  32. package/dist/cjs/lifecycles/lifecycle.helpers.js.map +1 -0
  33. package/dist/cjs/lifecycles/load.d.ts +3 -0
  34. package/dist/cjs/lifecycles/load.js +73 -0
  35. package/dist/cjs/lifecycles/load.js.map +1 -0
  36. package/dist/cjs/lifecycles/mount.d.ts +2 -0
  37. package/dist/cjs/lifecycles/mount.js +40 -0
  38. package/dist/cjs/lifecycles/mount.js.map +1 -0
  39. package/dist/cjs/lifecycles/prop.helpers.d.ts +9 -0
  40. package/dist/cjs/lifecycles/prop.helpers.js +23 -0
  41. package/dist/cjs/lifecycles/prop.helpers.js.map +1 -0
  42. package/dist/cjs/lifecycles/unload.d.ts +12 -0
  43. package/dist/cjs/lifecycles/unload.js +63 -0
  44. package/dist/cjs/lifecycles/unload.js.map +1 -0
  45. package/dist/cjs/lifecycles/unmount.d.ts +2 -0
  46. package/dist/cjs/lifecycles/unmount.js +32 -0
  47. package/dist/cjs/lifecycles/unmount.js.map +1 -0
  48. package/dist/cjs/lifecycles/update.d.ts +2 -0
  49. package/dist/cjs/lifecycles/update.js +22 -0
  50. package/dist/cjs/lifecycles/update.js.map +1 -0
  51. package/dist/cjs/navigation/navigation-events.d.ts +8 -0
  52. package/dist/cjs/navigation/navigation-events.js +102 -0
  53. package/dist/cjs/navigation/navigation-events.js.map +1 -0
  54. package/dist/cjs/navigation/reroute.d.ts +9 -0
  55. package/dist/cjs/navigation/reroute.js +182 -0
  56. package/dist/cjs/navigation/reroute.js.map +1 -0
  57. package/dist/cjs/parcels/mount-parcel.d.ts +3 -0
  58. package/dist/cjs/parcels/mount-parcel.js +122 -0
  59. package/dist/cjs/parcels/mount-parcel.js.map +1 -0
  60. package/dist/cjs/single-spa.d.ts +19 -0
  61. package/dist/cjs/single-spa.js +39 -0
  62. package/dist/cjs/single-spa.js.map +1 -0
  63. package/dist/cjs/start.d.ts +5 -0
  64. package/dist/cjs/start.js +21 -0
  65. package/dist/cjs/start.js.map +1 -0
  66. package/dist/cjs/utils/runtime-environment.d.ts +1 -0
  67. package/dist/cjs/utils/runtime-environment.js +7 -0
  68. package/dist/cjs/utils/runtime-environment.js.map +1 -0
  69. package/dist/cjs/window-globals.d.ts +8 -0
  70. package/dist/esm/applications/app-errors.d.ts +11 -0
  71. package/dist/esm/applications/app-errors.js +52 -0
  72. package/dist/esm/applications/app-errors.js.map +1 -0
  73. package/dist/esm/applications/app.helpers.d.ts +52 -0
  74. package/dist/esm/applications/app.helpers.js +41 -0
  75. package/dist/esm/applications/app.helpers.js.map +1 -0
  76. package/dist/esm/applications/apps.d.ts +23 -0
  77. package/dist/esm/applications/apps.js +223 -0
  78. package/dist/esm/applications/apps.js.map +1 -0
  79. package/dist/esm/applications/timeouts.d.ts +19 -0
  80. package/dist/esm/applications/timeouts.js +109 -0
  81. package/dist/esm/applications/timeouts.js.map +1 -0
  82. package/dist/esm/declarations.d.ts +4 -0
  83. package/dist/esm/devtools/devtools.d.ts +16 -0
  84. package/dist/esm/devtools/devtools.js +20 -0
  85. package/dist/esm/devtools/devtools.js.map +1 -0
  86. package/dist/esm/devtools/profiler.d.ts +11 -0
  87. package/dist/esm/devtools/profiler.js +22 -0
  88. package/dist/esm/devtools/profiler.js.map +1 -0
  89. package/dist/esm/index.d.ts +1 -0
  90. package/dist/esm/index.js +10 -0
  91. package/dist/esm/jquery-support.d.ts +7 -0
  92. package/dist/esm/jquery-support.js +33 -0
  93. package/dist/esm/jquery-support.js.map +1 -0
  94. package/dist/esm/lifecycles/bootstrap.d.ts +2 -0
  95. package/dist/esm/lifecycles/bootstrap.js +26 -0
  96. package/dist/esm/lifecycles/bootstrap.js.map +1 -0
  97. package/dist/esm/lifecycles/lifecycle.helpers.d.ts +90 -0
  98. package/dist/esm/lifecycles/lifecycle.helpers.js +30 -0
  99. package/dist/esm/lifecycles/lifecycle.helpers.js.map +1 -0
  100. package/dist/esm/lifecycles/load.d.ts +3 -0
  101. package/dist/esm/lifecycles/load.js +72 -0
  102. package/dist/esm/lifecycles/load.js.map +1 -0
  103. package/dist/esm/lifecycles/mount.d.ts +2 -0
  104. package/dist/esm/lifecycles/mount.js +39 -0
  105. package/dist/esm/lifecycles/mount.js.map +1 -0
  106. package/dist/esm/lifecycles/prop.helpers.d.ts +9 -0
  107. package/dist/esm/lifecycles/prop.helpers.js +22 -0
  108. package/dist/esm/lifecycles/prop.helpers.js.map +1 -0
  109. package/dist/esm/lifecycles/unload.d.ts +12 -0
  110. package/dist/esm/lifecycles/unload.js +60 -0
  111. package/dist/esm/lifecycles/unload.js.map +1 -0
  112. package/dist/esm/lifecycles/unmount.d.ts +2 -0
  113. package/dist/esm/lifecycles/unmount.js +31 -0
  114. package/dist/esm/lifecycles/unmount.js.map +1 -0
  115. package/dist/esm/lifecycles/update.d.ts +2 -0
  116. package/dist/esm/lifecycles/update.js +21 -0
  117. package/dist/esm/lifecycles/update.js.map +1 -0
  118. package/dist/esm/navigation/navigation-events.d.ts +8 -0
  119. package/dist/esm/navigation/navigation-events.js +92 -0
  120. package/dist/esm/navigation/navigation-events.js.map +1 -0
  121. package/dist/esm/navigation/reroute.d.ts +9 -0
  122. package/dist/esm/navigation/reroute.js +180 -0
  123. package/dist/esm/navigation/reroute.js.map +1 -0
  124. package/dist/esm/parcels/mount-parcel.d.ts +3 -0
  125. package/dist/esm/parcels/mount-parcel.js +120 -0
  126. package/dist/esm/parcels/mount-parcel.js.map +1 -0
  127. package/dist/esm/single-spa.d.ts +19 -0
  128. package/dist/esm/single-spa.js +17 -0
  129. package/dist/esm/single-spa.js.map +1 -0
  130. package/dist/esm/start.d.ts +5 -0
  131. package/dist/esm/start.js +19 -0
  132. package/dist/esm/start.js.map +1 -0
  133. package/dist/esm/utils/runtime-environment.d.ts +1 -0
  134. package/dist/esm/utils/runtime-environment.js +6 -0
  135. package/dist/esm/utils/runtime-environment.js.map +1 -0
  136. package/dist/esm/window-globals.d.ts +8 -0
  137. package/package.json +25 -0
@@ -0,0 +1,9 @@
1
+ type EventArguments = [HashChangeEvent | PopStateEvent];
2
+ interface WaitingPromises {
3
+ resolve(value: unknown): void;
4
+ reject(value: unknown): void;
5
+ eventArguments?: [HashChangeEvent | PopStateEvent];
6
+ }
7
+ export declare function triggerAppChange(): Promise<string[]>;
8
+ export declare function reroute(pendingPromises?: WaitingPromises[], eventArguments?: EventArguments, silentNavigation?: boolean): Promise<string[]>;
9
+ export {};
@@ -0,0 +1,180 @@
1
+ import { AppOrParcelStatus, shouldBeActive, toName } from "../applications/app.helpers.js";
2
+ import { formatErrorMessage } from "../applications/app-errors.js";
3
+ import { isInBrowser } from "../utils/runtime-environment.js";
4
+ import { isStarted } from "../start.js";
5
+ import "../devtools/profiler.js";
6
+ import { toBootstrapPromise } from "../lifecycles/bootstrap.js";
7
+ import { toUnmountPromise } from "../lifecycles/unmount.js";
8
+ import { toMountPromise } from "../lifecycles/mount.js";
9
+ import { toLoadPromise } from "../lifecycles/load.js";
10
+ import { toUnloadPromise } from "../lifecycles/unload.js";
11
+ import { callCapturedEventListeners, originalReplaceState } from "./navigation-events.js";
12
+ import { getAppChanges, getAppStatus, getMountedApps } from "../applications/apps.js";
13
+ //#region src/navigation/reroute.ts
14
+ var appChangeUnderway = false;
15
+ var promisesWaitingOnAppChange = [];
16
+ var currentUrl = isInBrowser && window.location.href;
17
+ function triggerAppChange() {
18
+ return reroute();
19
+ }
20
+ function reroute(pendingPromises = [], eventArguments = void 0, silentNavigation = false) {
21
+ if (appChangeUnderway) return new Promise((resolve, reject) => {
22
+ promisesWaitingOnAppChange.push({
23
+ resolve,
24
+ reject,
25
+ eventArguments
26
+ });
27
+ });
28
+ const { appsToUnload, appsToUnmount, appsToLoad, appsToMount } = getAppChanges();
29
+ let appsThatChanged, cancelPromises = [], oldUrl = currentUrl, newUrl = currentUrl = window.location.href;
30
+ if (isStarted()) {
31
+ appChangeUnderway = true;
32
+ appsThatChanged = appsToUnload.concat(appsToLoad, appsToUnmount, appsToMount);
33
+ return performAppChanges();
34
+ } else {
35
+ appsThatChanged = appsToLoad;
36
+ return loadApps();
37
+ }
38
+ function cancelNavigation(val = true) {
39
+ const promise = typeof (val === null || val === void 0 ? void 0 : val.then) === "function" ? val : Promise.resolve(val);
40
+ cancelPromises.push(promise.catch((err) => {
41
+ console.warn(Error(formatErrorMessage(42, process.env.NODE_ENV !== "production" && `single-spa: A cancelNavigation promise rejected with the following value: ${err}`)));
42
+ console.warn(err);
43
+ return false;
44
+ }));
45
+ }
46
+ function loadApps() {
47
+ return Promise.resolve().then(() => {
48
+ const loadPromises = appsToLoad.map(toLoadPromise);
49
+ return Promise.all(loadPromises).then(callAllEventListeners).then(() => {
50
+ return [];
51
+ }).catch((err) => {
52
+ callAllEventListeners();
53
+ throw err;
54
+ }).finally(() => {});
55
+ });
56
+ }
57
+ function performAppChanges() {
58
+ return Promise.resolve().then(() => {
59
+ fireSingleSpaEvent(appsThatChanged.length === 0 ? "before-no-app-change" : "before-app-change", getCustomEventDetail(true));
60
+ fireSingleSpaEvent("before-routing-event", getCustomEventDetail(true, { cancelNavigation }));
61
+ return Promise.all(cancelPromises).then((cancelValues) => {
62
+ if (cancelValues.some((v) => v)) {
63
+ originalReplaceState.call(window.history, history.state, "", oldUrl.substring(location.origin.length));
64
+ currentUrl = location.href;
65
+ appChangeUnderway = false;
66
+ return reroute(pendingPromises, eventArguments, true);
67
+ }
68
+ const unloadPromises = appsToUnload.map(toUnloadPromise);
69
+ const allUnmountPromises = [...appsToUnmount.map((app) => toUnmountPromise(app)).map((unmountPromise) => unmountPromise.then(toUnloadPromise)), ...unloadPromises];
70
+ const unmountAllPromise = Promise.all(allUnmountPromises);
71
+ unmountAllPromise.then(() => {
72
+ fireSingleSpaEvent("before-mount-routing-event", getCustomEventDetail(true));
73
+ }, (err) => {
74
+ throw err;
75
+ });
76
+ const loadThenMountPromises = appsToLoad.map((app) => {
77
+ return toLoadPromise(app).then((app) => tryToInitAndMount(app, unmountAllPromise));
78
+ });
79
+ const mountPromises = appsToMount.filter((appToMount) => !appsToLoad.includes(appToMount)).map((appToMount) => {
80
+ return tryToInitAndMount(appToMount, unmountAllPromise);
81
+ });
82
+ return unmountAllPromise.catch((err) => {
83
+ callAllEventListeners();
84
+ throw err;
85
+ }).then(() => {
86
+ callAllEventListeners();
87
+ return Promise.all(loadThenMountPromises.concat(mountPromises)).catch((err) => {
88
+ pendingPromises.forEach((promise) => promise.reject(err));
89
+ throw err;
90
+ }).then(() => {}, (err) => {
91
+ throw err;
92
+ }).then(finishUpAndReturn);
93
+ });
94
+ });
95
+ });
96
+ }
97
+ function finishUpAndReturn() {
98
+ const returnValue = getMountedApps();
99
+ pendingPromises.forEach((promise) => promise.resolve(returnValue));
100
+ try {
101
+ fireSingleSpaEvent(appsThatChanged.length === 0 ? "no-app-change" : "app-change", getCustomEventDetail());
102
+ fireSingleSpaEvent("routing-event", getCustomEventDetail());
103
+ } catch (err) {
104
+ setTimeout(() => {
105
+ throw err;
106
+ });
107
+ }
108
+ appChangeUnderway = false;
109
+ if (promisesWaitingOnAppChange.length > 0) {
110
+ const nextPendingPromises = promisesWaitingOnAppChange;
111
+ promisesWaitingOnAppChange = [];
112
+ reroute(nextPendingPromises);
113
+ }
114
+ return returnValue;
115
+ }
116
+ function callAllEventListeners() {
117
+ if (!silentNavigation) {
118
+ pendingPromises.forEach((pendingPromise) => {
119
+ callCapturedEventListeners(pendingPromise.eventArguments);
120
+ });
121
+ callCapturedEventListeners(eventArguments);
122
+ }
123
+ }
124
+ function getCustomEventDetail(isBeforeChanges = false, extraProperties) {
125
+ const newAppStatuses = {};
126
+ const appsByNewStatus = {
127
+ [AppOrParcelStatus.MOUNTED]: [],
128
+ [AppOrParcelStatus.NOT_MOUNTED]: [],
129
+ [AppOrParcelStatus.NOT_LOADED]: [],
130
+ [AppOrParcelStatus.SKIP_BECAUSE_BROKEN]: []
131
+ };
132
+ if (isBeforeChanges) {
133
+ appsToLoad.concat(appsToMount).forEach((app, index) => {
134
+ addApp(app, AppOrParcelStatus.MOUNTED);
135
+ });
136
+ appsToUnload.forEach((app) => {
137
+ addApp(app, AppOrParcelStatus.NOT_LOADED);
138
+ });
139
+ appsToUnmount.forEach((app) => {
140
+ addApp(app, AppOrParcelStatus.NOT_MOUNTED);
141
+ });
142
+ } else appsThatChanged.forEach((app) => {
143
+ addApp(app);
144
+ });
145
+ const result = { detail: {
146
+ newAppStatuses,
147
+ appsByNewStatus,
148
+ totalAppChanges: appsThatChanged.length,
149
+ originalEvent: eventArguments === null || eventArguments === void 0 ? void 0 : eventArguments[0],
150
+ oldUrl,
151
+ newUrl
152
+ } };
153
+ if (extraProperties) Object.assign(result.detail, extraProperties);
154
+ return result;
155
+ function addApp(app, status) {
156
+ const appName = toName(app);
157
+ status = status || getAppStatus(appName);
158
+ newAppStatuses[appName] = status;
159
+ (appsByNewStatus[status] = appsByNewStatus[status] || []).push(appName);
160
+ }
161
+ }
162
+ function fireSingleSpaEvent(name, eventProperties) {
163
+ if (!silentNavigation) window.dispatchEvent(new CustomEvent(`single-spa:${name}`, eventProperties));
164
+ }
165
+ }
166
+ /**
167
+ * Let's imagine that some kind of delay occurred during application loading.
168
+ * The user without waiting for the application to load switched to another route,
169
+ * this means that we shouldn't initialize and mount that application, thus we check
170
+ * twice if that application should be active before initialize and mounting.
171
+ * https://github.com/single-spa/single-spa/issues/524
172
+ */
173
+ function tryToInitAndMount(app, unmountAllPromise) {
174
+ if (shouldBeActive(app)) return toBootstrapPromise(app).then((app) => unmountAllPromise.then(() => shouldBeActive(app) ? toMountPromise(app) : app));
175
+ else return unmountAllPromise.then(() => app);
176
+ }
177
+ //#endregion
178
+ export { reroute, triggerAppChange };
179
+
180
+ //# sourceMappingURL=reroute.js.map
@@ -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,120 @@
1
+ import { AppOrParcelStatus, toName } from "../applications/app.helpers.js";
2
+ import { formatErrorMessage } from "../applications/app-errors.js";
3
+ import { flattenFnArray, validLifecycleFn } from "../lifecycles/lifecycle.helpers.js";
4
+ import { toBootstrapPromise } from "../lifecycles/bootstrap.js";
5
+ import { toUnmountPromise } from "../lifecycles/unmount.js";
6
+ import { toMountPromise } from "../lifecycles/mount.js";
7
+ import { toUpdatePromise } from "../lifecycles/update.js";
8
+ import { ensureValidAppTimeouts } from "../applications/timeouts.js";
9
+ //#region src/parcels/mount-parcel.ts
10
+ var parcelCount = 0;
11
+ var rootParcels = {
12
+ name: "rootParcels",
13
+ parcels: {}
14
+ };
15
+ function mountRootParcel(config, customProps) {
16
+ return mountParcel.call(rootParcels, config, customProps);
17
+ }
18
+ function mountParcel(config, customProps) {
19
+ const owningAppOrParcel = this;
20
+ if (!config || typeof config !== "object" && typeof config !== "function") throw Error(formatErrorMessage(2, process.env.NODE_ENV !== "production" && "Cannot mount parcel without a config object or config loading function"));
21
+ if (config.name && typeof config.name !== "string") throw Error(formatErrorMessage(3, process.env.NODE_ENV !== "production" && `Parcel name must be a string, if provided. Was given ${typeof config.name}`, typeof config.name));
22
+ const id = parcelCount++;
23
+ let name = config.name || `parcel-${id}`;
24
+ if (typeof customProps !== "object") throw Error(formatErrorMessage(4, process.env.NODE_ENV !== "production" && `Parcel ${name} has invalid customProps -- must be an object but was given ${typeof customProps}`, name, typeof customProps));
25
+ if (!customProps.domElement) throw Error(formatErrorMessage(5, process.env.NODE_ENV !== "production" && `Parcel ${name} cannot be mounted without a domElement provided as a prop`, name));
26
+ const passedConfigLoadingFunction = typeof config === "function";
27
+ const configLoadingFunction = passedConfigLoadingFunction ? config : () => Promise.resolve(config);
28
+ const parcel = {
29
+ id,
30
+ parcels: {},
31
+ status: passedConfigLoadingFunction ? AppOrParcelStatus.LOADING_SOURCE_CODE : AppOrParcelStatus.NOT_BOOTSTRAPPED,
32
+ customProps,
33
+ parentName: toName(owningAppOrParcel),
34
+ currentTask: void 0,
35
+ unmountThisParcel() {
36
+ return parcel.currentTask.then(() => {
37
+ if (parcel.status !== AppOrParcelStatus.MOUNTED) throw Error(formatErrorMessage(6, process.env.NODE_ENV !== "production" && `Cannot unmount parcel '${name}' -- it is in a ${parcel.status} status`, name, parcel.status));
38
+ return toUnmountPromise(parcel, true).then((value) => {
39
+ if (parcel.parentName) delete owningAppOrParcel.parcels[parcel.id];
40
+ return value;
41
+ }).then((value) => {
42
+ resolveUnmount(value);
43
+ return value;
44
+ }).catch((err) => {
45
+ parcel.status = AppOrParcelStatus.SKIP_BECAUSE_BROKEN;
46
+ rejectUnmount(err);
47
+ throw err;
48
+ });
49
+ });
50
+ }
51
+ };
52
+ let loadPromise = configLoadingFunction();
53
+ if (!loadPromise || typeof loadPromise.then !== "function") throw Error(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`));
54
+ loadPromise = loadPromise.then((config) => {
55
+ if (!config) throw Error(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`));
56
+ name = config.name || `parcel-${id}`;
57
+ if (Object.prototype.hasOwnProperty.call(config, "bootstrap") && !validLifecycleFn(config.bootstrap)) throw Error(formatErrorMessage(9, process.env.NODE_ENV !== "production" && `Parcel ${name} provided an invalid bootstrap function`, name));
58
+ if (!validLifecycleFn(config.mount)) throw Error(formatErrorMessage(10, process.env.NODE_ENV !== "production" && `Parcel ${name} must have a valid mount function`, name));
59
+ if (!validLifecycleFn(config.unmount)) throw Error(formatErrorMessage(11, process.env.NODE_ENV !== "production" && `Parcel ${name} must have a valid unmount function`, name));
60
+ if (config.update && !validLifecycleFn(config.update)) throw Error(formatErrorMessage(12, process.env.NODE_ENV !== "production" && `Parcel ${name} provided an invalid update function`, name));
61
+ const bootstrap = flattenFnArray(config, "bootstrap", true);
62
+ const mount = flattenFnArray(config, "mount", true);
63
+ const unmount = flattenFnArray(config, "unmount", true);
64
+ parcel.status = AppOrParcelStatus.NOT_BOOTSTRAPPED;
65
+ parcel.name = name;
66
+ parcel.bootstrap = bootstrap;
67
+ parcel.mount = mount;
68
+ parcel.unmount = unmount;
69
+ parcel.timeouts = ensureValidAppTimeouts(config.timeouts);
70
+ if (config.update) parcel.update = flattenFnArray(config, "update", true);
71
+ const fullParcel = parcel;
72
+ owningAppOrParcel.parcels[id] = fullParcel;
73
+ return config;
74
+ });
75
+ const bootstrapPromise = loadPromise.then(() => toBootstrapPromise(parcel, true));
76
+ const mountPromise = bootstrapPromise.then(() => parcel.currentTask = toMountPromise(parcel, true));
77
+ parcel.currentTask = mountPromise;
78
+ let resolveUnmount, rejectUnmount;
79
+ const unmountPromise = new Promise((resolve, reject) => {
80
+ resolveUnmount = resolve;
81
+ rejectUnmount = reject;
82
+ });
83
+ const externalBootstrapPromise = promiseWithoutReturnValue(bootstrapPromise);
84
+ let externalRepresentation = {
85
+ mount() {
86
+ return promiseWithoutReturnValue(Promise.resolve().then(() => {
87
+ if (parcel.status !== AppOrParcelStatus.NOT_MOUNTED) throw Error(formatErrorMessage(13, process.env.NODE_ENV !== "production" && `Cannot mount parcel '${name}' -- it is in a ${parcel.status} status`, name, parcel.status));
88
+ owningAppOrParcel.parcels[id] = parcel;
89
+ return toMountPromise(parcel);
90
+ }));
91
+ },
92
+ unmount() {
93
+ return promiseWithoutReturnValue(parcel.unmountThisParcel());
94
+ },
95
+ getStatus() {
96
+ return parcel.status;
97
+ },
98
+ loadPromise: promiseWithoutReturnValue(loadPromise),
99
+ bootstrapPromise: externalBootstrapPromise,
100
+ mountPromise: promiseWithoutReturnValue(mountPromise),
101
+ unmountPromise: promiseWithoutReturnValue(unmountPromise),
102
+ _parcel: parcel
103
+ };
104
+ loadPromise.then((config) => {
105
+ if (config.update) externalRepresentation.update = function(customProps) {
106
+ return parcel.currentTask = parcel.currentTask.then(() => {
107
+ parcel.customProps = customProps;
108
+ return promiseWithoutReturnValue(toUpdatePromise(parcel));
109
+ });
110
+ };
111
+ }, () => {});
112
+ return externalRepresentation;
113
+ }
114
+ function promiseWithoutReturnValue(promise) {
115
+ return promise.then(() => null);
116
+ }
117
+ //#endregion
118
+ export { mountParcel, mountRootParcel };
119
+
120
+ //# 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":"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"}
@@ -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,17 @@
1
+ import { AppOrParcelStatus } from "./applications/app.helpers.js";
2
+ import { addErrorHandler, removeErrorHandler } from "./applications/app-errors.js";
3
+ import { isInBrowser } from "./utils/runtime-environment.js";
4
+ import { start } from "./start.js";
5
+ import { mountRootParcel } from "./parcels/mount-parcel.js";
6
+ import { setBootstrapMaxTime, setMountMaxTime, setUnloadMaxTime, setUnmountMaxTime } from "./applications/timeouts.js";
7
+ import { triggerAppChange } from "./navigation/reroute.js";
8
+ import { navigateToUrl, patchHistoryApi } from "./navigation/navigation-events.js";
9
+ import { ensureJQuerySupport } from "./jquery-support.js";
10
+ import { checkActivityFunctions, getAppNames, getAppStatus, getMountedApps, pathToActiveWhen, registerApplication, unloadApplication, unregisterApplication } from "./applications/apps.js";
11
+ import devtools_default from "./devtools/devtools.js";
12
+ //#region src/single-spa.ts
13
+ if (isInBrowser && window.__SINGLE_SPA_DEVTOOLS__) window.__SINGLE_SPA_DEVTOOLS__.exposedMethods = devtools_default;
14
+ //#endregion
15
+ export { AppOrParcelStatus, addErrorHandler, checkActivityFunctions, ensureJQuerySupport, getAppNames, getAppStatus, getMountedApps, mountRootParcel, navigateToUrl, patchHistoryApi, pathToActiveWhen, registerApplication, removeErrorHandler, setBootstrapMaxTime, setBootstrapMaxTime as setInitMaxTime, setMountMaxTime, setUnloadMaxTime, setUnmountMaxTime, start, triggerAppChange, unloadApplication, unregisterApplication };
16
+
17
+ //# 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,eAAe,OAAO,yBACxB,OAAO,wBAAwB,iBAAiB"}
@@ -0,0 +1,5 @@
1
+ export declare function start(opts?: StartOpts): void;
2
+ export declare function isStarted(): boolean;
3
+ export interface StartOpts {
4
+ urlRerouteOnly?: boolean;
5
+ }
@@ -0,0 +1,19 @@
1
+ import { isInBrowser } from "./utils/runtime-environment.js";
2
+ import { reroute } from "./navigation/reroute.js";
3
+ import { patchHistoryApi } from "./navigation/navigation-events.js";
4
+ //#region src/start.ts
5
+ var started = false;
6
+ function start(opts) {
7
+ started = true;
8
+ if (isInBrowser) {
9
+ patchHistoryApi(opts);
10
+ reroute();
11
+ }
12
+ }
13
+ function isStarted() {
14
+ return started;
15
+ }
16
+ //#endregion
17
+ export { isStarted, start };
18
+
19
+ //# 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,aAAa;EACf,gBAAgB,IAAI;EACpB,QAAQ;CACV;AACF;AAEA,SAAgB,YAAqB;CACnC,OAAO;AACT"}
@@ -0,0 +1 @@
1
+ export declare const isInBrowser: boolean;
@@ -0,0 +1,6 @@
1
+ //#region src/utils/runtime-environment.ts
2
+ var isInBrowser = typeof window !== "undefined";
3
+ //#endregion
4
+ export { isInBrowser };
5
+
6
+ //# 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,8 @@
1
+ type NavigateArg = string | HTMLAnchorElement | MouseEvent;
2
+ declare global {
3
+ interface Window {
4
+ singleSpaNavigate: (obj: NavigateArg) => void;
5
+ }
6
+ }
7
+
8
+ export {};
package/package.json ADDED
@@ -0,0 +1,25 @@
1
+ {
2
+ "name": "@qiankunjs/single-spa",
3
+ "version": "0.0.1-rc.0",
4
+ "description": "qiankun's vendored fork of single-spa (7.0 branch @ ce0f925a, v7.0.0-beta.13)",
5
+ "repository": {
6
+ "type": "git",
7
+ "url": "git+https://github.com/umijs/qiankun.git"
8
+ },
9
+ "main": "./dist/cjs/index.js",
10
+ "module": "./dist/esm/index.js",
11
+ "types": "./dist/esm/index.d.ts",
12
+ "sideEffects": false,
13
+ "scripts": {
14
+ "build": "rimraf dist && vite build --config ../../vite.library.config.ts && tsc -p tsconfig.build.json && node ../../scripts/copy-declarations.mjs src dist/esm && node ../../scripts/copy-declarations.mjs dist/esm dist/cjs",
15
+ "test": "vitest --run"
16
+ },
17
+ "author": "Kuitos",
18
+ "license": "MIT",
19
+ "publishConfig": {
20
+ "registry": "https://registry.npmjs.org/"
21
+ },
22
+ "files": [
23
+ "dist"
24
+ ]
25
+ }