@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,223 @@
1
+ import { AppOrParcelStatus, isActive, shouldBeActive, toName } from "./app.helpers.js";
2
+ import { formatErrorMessage } from "./app-errors.js";
3
+ import { isInBrowser } from "../utils/runtime-environment.js";
4
+ import { isStarted } from "../start.js";
5
+ import { toUnmountPromise } from "../lifecycles/unmount.js";
6
+ import { addAppToUnload, getAppUnloadInfo, toUnloadPromise } from "../lifecycles/unload.js";
7
+ import { reroute, triggerAppChange } from "../navigation/reroute.js";
8
+ import { ensureJQuerySupport } from "../jquery-support.js";
9
+ //#region src/applications/apps.ts
10
+ var apps = [];
11
+ function getAppChanges() {
12
+ const appsToUnload = [], appsToUnmount = [], appsToLoad = [], appsToMount = [];
13
+ const currentTime = (/* @__PURE__ */ new Date()).getTime();
14
+ apps.forEach((app) => {
15
+ const appShouldBeActive = app.status !== AppOrParcelStatus.SKIP_BECAUSE_BROKEN && shouldBeActive(app);
16
+ switch (app.status) {
17
+ case AppOrParcelStatus.LOAD_ERROR:
18
+ if (appShouldBeActive && currentTime - app.loadErrorTime >= 200) appsToLoad.push(app);
19
+ break;
20
+ case AppOrParcelStatus.NOT_LOADED:
21
+ case AppOrParcelStatus.LOADING_SOURCE_CODE:
22
+ if (appShouldBeActive) appsToLoad.push(app);
23
+ break;
24
+ case AppOrParcelStatus.NOT_BOOTSTRAPPED:
25
+ case AppOrParcelStatus.NOT_MOUNTED:
26
+ if (!appShouldBeActive && getAppUnloadInfo(toName(app))) appsToUnload.push(app);
27
+ else if (appShouldBeActive) appsToMount.push(app);
28
+ break;
29
+ case AppOrParcelStatus.MOUNTED:
30
+ if (!appShouldBeActive) appsToUnmount.push(app);
31
+ break;
32
+ }
33
+ });
34
+ return {
35
+ appsToUnload,
36
+ appsToUnmount,
37
+ appsToLoad,
38
+ appsToMount
39
+ };
40
+ }
41
+ function getMountedApps() {
42
+ return apps.filter(isActive).map(toName);
43
+ }
44
+ function getAppNames() {
45
+ return apps.map(toName);
46
+ }
47
+ function getRawAppData() {
48
+ return [...apps];
49
+ }
50
+ function getAppStatus(appName) {
51
+ const app = apps.find((app) => toName(app) === appName);
52
+ return app ? app.status : null;
53
+ }
54
+ var startWarningInitialized = false;
55
+ function registerApplication(appNameOrConfig, appOrLoadApp, activeWhen, customProps) {
56
+ const registration = sanitizeArguments(appNameOrConfig, appOrLoadApp, activeWhen, customProps);
57
+ if (!isStarted() && !startWarningInitialized) {
58
+ startWarningInitialized = true;
59
+ setTimeout(() => {
60
+ if (!isStarted()) console.warn(formatErrorMessage(1, process.env.NODE_ENV !== "production" && `singleSpa.start() has not been called, 5000ms after single-spa was loaded. Before start() is called, apps can be declared and loaded, but not initialized or mounted.`));
61
+ }, 5e3);
62
+ }
63
+ if (getAppNames().indexOf(registration.name) !== -1) throw Error(formatErrorMessage(21, process.env.NODE_ENV !== "production" && `There is already an app registered with name ${registration.name}`, registration.name));
64
+ apps.push(Object.assign({
65
+ loadErrorTime: null,
66
+ status: AppOrParcelStatus.NOT_LOADED,
67
+ parcels: {},
68
+ devtools: { overlays: {
69
+ options: {},
70
+ selectors: []
71
+ } }
72
+ }, registration));
73
+ if (isInBrowser) {
74
+ ensureJQuerySupport();
75
+ reroute();
76
+ }
77
+ }
78
+ function checkActivityFunctions(location = window.location) {
79
+ return apps.filter((app) => app.activeWhen(location)).map(toName);
80
+ }
81
+ function unregisterApplication(appName) {
82
+ if (apps.filter((app) => toName(app) === appName).length === 0) throw Error(formatErrorMessage(25, process.env.NODE_ENV !== "production" && `Cannot unregister application '${appName}' because no such application has been registered`, appName));
83
+ return (isInBrowser ? unloadApplication(appName, { waitForUnmount: false }) : Promise.resolve()).then(() => {
84
+ const appIndex = apps.map(toName).indexOf(appName);
85
+ apps.splice(appIndex, 1);
86
+ });
87
+ }
88
+ function unloadApplication(appName, opts = { waitForUnmount: false }) {
89
+ if (typeof appName !== "string") throw Error(formatErrorMessage(26, process.env.NODE_ENV !== "production" && `unloadApplication requires a string 'appName'`));
90
+ const app = apps.find((app) => toName(app) === appName);
91
+ if (!app) throw Error(formatErrorMessage(27, process.env.NODE_ENV !== "production" && `Could not unload application '${appName}' because no such application has been registered`, appName));
92
+ const appUnloadInfo = getAppUnloadInfo(toName(app));
93
+ if (opts === null || opts === void 0 ? void 0 : opts.waitForUnmount) if (appUnloadInfo) return appUnloadInfo.promise;
94
+ else {
95
+ const promise = new Promise((resolve, reject) => {
96
+ addAppToUnload(app, () => promise, resolve, reject);
97
+ });
98
+ return promise;
99
+ }
100
+ else {
101
+ let resultPromise;
102
+ if (appUnloadInfo) {
103
+ resultPromise = appUnloadInfo.promise;
104
+ immediatelyUnloadApp(app, appUnloadInfo.resolve, appUnloadInfo.reject);
105
+ } else resultPromise = new Promise((resolve, reject) => {
106
+ addAppToUnload(app, () => resultPromise, resolve, reject);
107
+ immediatelyUnloadApp(app, resolve, reject);
108
+ });
109
+ return resultPromise;
110
+ }
111
+ }
112
+ function immediatelyUnloadApp(app, resolve, reject) {
113
+ Promise.resolve().then(() => {
114
+ if (checkActivityFunctions().find((activeApp) => activeApp === toName(app))) return triggerAppChange();
115
+ }).then(() => {
116
+ return toUnmountPromise(app).then(toUnloadPromise).then(() => {
117
+ resolve();
118
+ setTimeout(() => {
119
+ reroute();
120
+ });
121
+ });
122
+ }).catch(reject);
123
+ }
124
+ function validateRegisterWithArguments(name, appOrLoadApp, activeWhen, customProps) {
125
+ if (typeof name !== "string" || name.length === 0) throw Error(formatErrorMessage(20, process.env.NODE_ENV !== "production" && `The 1st argument to registerApplication must be a non-empty string 'appName'`));
126
+ if (!appOrLoadApp) throw Error(formatErrorMessage(23, process.env.NODE_ENV !== "production" && "The 2nd argument to registerApplication must be an application or loading application function"));
127
+ if (typeof activeWhen !== "function") throw Error(formatErrorMessage(24, process.env.NODE_ENV !== "production" && "The 3rd argument to registerApplication must be an activeWhen function"));
128
+ if (!validCustomProps(customProps)) throw Error(formatErrorMessage(22, process.env.NODE_ENV !== "production" && "The optional 4th argument is a customProps and must be an object"));
129
+ }
130
+ function validateRegisterWithConfig(config) {
131
+ if (Array.isArray(config) || config === null) throw Error(formatErrorMessage(39, process.env.NODE_ENV !== "production" && "Configuration object can't be an Array or null!"));
132
+ const validKeys = [
133
+ "name",
134
+ "app",
135
+ "activeWhen",
136
+ "customProps"
137
+ ];
138
+ const invalidKeys = Object.keys(config).reduce((invalidKeys, prop) => validKeys.indexOf(prop) >= 0 ? invalidKeys : invalidKeys.concat(prop), []);
139
+ if (invalidKeys.length !== 0) throw Error(formatErrorMessage(38, process.env.NODE_ENV !== "production" && `The configuration object accepts only: ${validKeys.join(", ")}. Invalid keys: ${invalidKeys.join(", ")}.`, validKeys.join(", "), invalidKeys.join(", ")));
140
+ if (typeof config.name !== "string" || config.name.length === 0) throw Error(formatErrorMessage(20, process.env.NODE_ENV !== "production" && "The config.name on registerApplication must be a non-empty string"));
141
+ if (typeof config.app !== "object" && typeof config.app !== "function") throw Error(formatErrorMessage(20, process.env.NODE_ENV !== "production" && "The config.app on registerApplication must be an application or a loading function"));
142
+ const allowsStringAndFunction = (activeWhen) => typeof activeWhen === "string" || typeof activeWhen === "function";
143
+ if (!allowsStringAndFunction(config.activeWhen) && !(Array.isArray(config.activeWhen) && config.activeWhen.every(allowsStringAndFunction))) throw Error(formatErrorMessage(24, process.env.NODE_ENV !== "production" && "The config.activeWhen on registerApplication must be a string, function or an array with both"));
144
+ if (!validCustomProps(config.customProps)) throw Error(formatErrorMessage(22, process.env.NODE_ENV !== "production" && "The optional config.customProps must be an object"));
145
+ }
146
+ function validCustomProps(customProps) {
147
+ return !customProps || typeof customProps === "function" || typeof customProps === "object" && customProps !== null && !Array.isArray(customProps);
148
+ }
149
+ function sanitizeArguments(appNameOrConfig, appOrLoadApp, activeWhen, customProps) {
150
+ const usingObjectAPI = typeof appNameOrConfig === "object";
151
+ let unsanitizedRegistration;
152
+ if (usingObjectAPI) {
153
+ validateRegisterWithConfig(appNameOrConfig);
154
+ unsanitizedRegistration = {
155
+ name: appNameOrConfig.name,
156
+ app: appNameOrConfig.app,
157
+ activeWhen: appNameOrConfig.activeWhen,
158
+ customProps: appNameOrConfig.customProps
159
+ };
160
+ } else {
161
+ validateRegisterWithArguments(appNameOrConfig, appOrLoadApp, activeWhen, customProps);
162
+ unsanitizedRegistration = {
163
+ name: appNameOrConfig,
164
+ app: appOrLoadApp,
165
+ activeWhen,
166
+ customProps
167
+ };
168
+ }
169
+ return {
170
+ name: unsanitizedRegistration.name,
171
+ loadApp: sanitizeLoadApp(unsanitizedRegistration.app),
172
+ customProps: sanitizeCustomProps(unsanitizedRegistration.customProps),
173
+ activeWhen: sanitizeActiveWhen(unsanitizedRegistration.activeWhen)
174
+ };
175
+ }
176
+ function sanitizeLoadApp(loadApp) {
177
+ if (typeof loadApp !== "function") return () => Promise.resolve(loadApp);
178
+ return loadApp;
179
+ }
180
+ function sanitizeCustomProps(customProps) {
181
+ return customProps ? customProps : {};
182
+ }
183
+ function sanitizeActiveWhen(activeWhen) {
184
+ const activityFnArray = (Array.isArray(activeWhen) ? activeWhen : [activeWhen]).map((activeWhenOrPath) => typeof activeWhenOrPath === "function" ? activeWhenOrPath : pathToActiveWhen(activeWhenOrPath, false));
185
+ return (location) => activityFnArray.some((activeWhen) => activeWhen(location));
186
+ }
187
+ function pathToActiveWhen(path, exactMatch) {
188
+ const regex = toDynamicPathValidatorRegex(path, exactMatch);
189
+ return (location) => {
190
+ const route = location.href.replace(location.origin, "").replace(location.search, "").split("?")[0];
191
+ return regex.test(route);
192
+ };
193
+ }
194
+ function toDynamicPathValidatorRegex(path, exactMatch) {
195
+ let lastIndex = 0, inDynamic = false, regexStr = "^";
196
+ if (path[0] !== "/") path = "/" + path;
197
+ for (let charIndex = 0; charIndex < path.length; charIndex++) {
198
+ const char = path[charIndex];
199
+ if (!inDynamic && char === ":" || inDynamic && char === "/") appendToRegex(charIndex);
200
+ }
201
+ appendToRegex(path.length);
202
+ return new RegExp(regexStr, "i");
203
+ function appendToRegex(index) {
204
+ const anyCharMaybeTrailingSlashRegex = "[^/]+/?";
205
+ const commonStringSubPath = escapeStrRegex(path.slice(lastIndex, index));
206
+ regexStr += inDynamic ? anyCharMaybeTrailingSlashRegex : commonStringSubPath;
207
+ if (index === path.length) if (inDynamic) {
208
+ if (exactMatch) regexStr += "$";
209
+ } else {
210
+ const suffix = exactMatch ? "" : ".*";
211
+ regexStr = regexStr.charAt(regexStr.length - 1) === "/" ? `${regexStr}${suffix}$` : `${regexStr}(/${suffix})?(#.*)?$`;
212
+ }
213
+ inDynamic = !inDynamic;
214
+ lastIndex = index;
215
+ }
216
+ function escapeStrRegex(str) {
217
+ return str.replace(/[|\\{}()[\]^$+*?.]/g, "\\$&");
218
+ }
219
+ }
220
+ //#endregion
221
+ export { checkActivityFunctions, getAppChanges, getAppNames, getAppStatus, getMountedApps, getRawAppData, pathToActiveWhen, registerApplication, unloadApplication, unregisterApplication, validateRegisterWithConfig };
222
+
223
+ //# sourceMappingURL=apps.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"apps.js","names":[],"sources":["../../../src/applications/apps.ts"],"sourcesContent":["import { ensureJQuerySupport } from '../jquery-support';\nimport { isActive, toName, shouldBeActive, InternalApplication, AppOrParcelStatus } from './app.helpers';\nimport { reroute, triggerAppChange } from '../navigation/reroute';\nimport { toUnmountPromise } from '../lifecycles/unmount';\nimport { toUnloadPromise, getAppUnloadInfo, addAppToUnload } from '../lifecycles/unload';\nimport { formatErrorMessage } from './app-errors';\nimport { isInBrowser } from '../utils/runtime-environment';\nimport { isStarted } from '../start';\nimport {\n Activity,\n ActivityFn,\n AppProps,\n Application,\n CustomProps,\n CustomPropsFn,\n LifeCycles,\n LoadApp,\n LoadedApp,\n RegisterApplicationConfig,\n SingleSpaLocation,\n} from '../lifecycles/lifecycle.helpers';\n\nconst apps: InternalApplication[] = [];\n\ninterface AppChanges {\n appsToUnload: InternalApplication[];\n appsToUnmount: InternalApplication[];\n appsToLoad: InternalApplication[];\n appsToMount: InternalApplication[];\n}\n\nexport function getAppChanges(): AppChanges {\n const appsToUnload: InternalApplication[] = [],\n appsToUnmount: InternalApplication[] = [],\n appsToLoad: InternalApplication[] = [],\n appsToMount: InternalApplication[] = [];\n\n // We re-attempt to download applications in LOAD_ERROR after a timeout of 200 milliseconds\n const currentTime: number = new Date().getTime();\n\n apps.forEach((app) => {\n const appShouldBeActive = app.status !== AppOrParcelStatus.SKIP_BECAUSE_BROKEN && shouldBeActive(app);\n\n switch (app.status) {\n case AppOrParcelStatus.LOAD_ERROR:\n if (appShouldBeActive && currentTime - app.loadErrorTime >= 200) {\n appsToLoad.push(app);\n }\n break;\n case AppOrParcelStatus.NOT_LOADED:\n case AppOrParcelStatus.LOADING_SOURCE_CODE:\n if (appShouldBeActive) {\n appsToLoad.push(app);\n }\n break;\n case AppOrParcelStatus.NOT_BOOTSTRAPPED:\n case AppOrParcelStatus.NOT_MOUNTED:\n if (!appShouldBeActive && getAppUnloadInfo(toName(app))) {\n appsToUnload.push(app);\n } else if (appShouldBeActive) {\n appsToMount.push(app);\n }\n break;\n case AppOrParcelStatus.MOUNTED:\n if (!appShouldBeActive) {\n appsToUnmount.push(app);\n }\n break;\n // all other statuses are ignored\n }\n });\n\n return { appsToUnload, appsToUnmount, appsToLoad, appsToMount };\n}\n\nexport function getMountedApps(): string[] {\n return apps.filter(isActive).map(toName);\n}\n\nexport function getAppNames(): string[] {\n return apps.map(toName);\n}\n\n// used in devtools, not (currently) exposed as a single-spa API\nexport function getRawAppData(): InternalApplication[] {\n return [...apps];\n}\n\nexport function getAppStatus(appName): AppOrParcelStatus | null {\n const app = apps.find((app) => toName(app) === appName);\n return app ? app.status : null;\n}\n\nlet startWarningInitialized: boolean = false;\n\nexport function registerApplication<ExtraProps extends CustomProps = {}>(RegisterApplicationConfig): void;\nexport function registerApplication<ExtraProps extends CustomProps = {}>(\n appName: string,\n app: Application,\n activeWhen: Activity,\n customProps: ExtraProps | CustomPropsFn<ExtraProps>,\n): void;\nexport function registerApplication<ExtraProps extends CustomProps = {}>(\n appNameOrConfig: string | RegisterApplicationConfig,\n appOrLoadApp?: Application,\n activeWhen?: Activity,\n customProps?: ExtraProps | CustomPropsFn<ExtraProps>,\n): void {\n const registration = sanitizeArguments(appNameOrConfig, appOrLoadApp, activeWhen, customProps);\n\n if (!isStarted() && !startWarningInitialized) {\n startWarningInitialized = true;\n\n setTimeout(() => {\n if (!isStarted()) {\n console.warn(\n formatErrorMessage(\n 1,\n __DEV__ &&\n `singleSpa.start() has not been called, 5000ms after single-spa was loaded. Before start() is called, apps can be declared and loaded, but not initialized or mounted.`,\n ),\n );\n }\n }, 5000);\n }\n\n if (getAppNames().indexOf(registration.name) !== -1)\n throw Error(\n formatErrorMessage(\n 21,\n __DEV__ && `There is already an app registered with name ${registration.name}`,\n registration.name,\n ),\n );\n\n apps.push(\n Object.assign(\n {\n loadErrorTime: null,\n status: AppOrParcelStatus.NOT_LOADED,\n parcels: {},\n devtools: {\n overlays: {\n options: {},\n selectors: [],\n },\n },\n },\n registration,\n ),\n );\n\n if (isInBrowser) {\n ensureJQuerySupport();\n reroute();\n }\n}\n\nexport function checkActivityFunctions(location: SingleSpaLocation = window.location): string[] {\n return apps.filter((app) => app.activeWhen(location)).map(toName);\n}\n\nexport function unregisterApplication(appName: string): Promise<void> {\n if (apps.filter((app) => toName(app) === appName).length === 0) {\n throw Error(\n formatErrorMessage(\n 25,\n __DEV__ && `Cannot unregister application '${appName}' because no such application has been registered`,\n appName,\n ),\n );\n }\n\n const unloadPromise = isInBrowser\n ? // See https://github.com/single-spa/single-spa/issues/871 for why waitForUnmount is false\n unloadApplication(appName, { waitForUnmount: false })\n : Promise.resolve();\n\n return unloadPromise.then(() => {\n const appIndex = apps.map(toName).indexOf(appName);\n apps.splice(appIndex, 1);\n });\n}\n\nexport function unloadApplication(\n appName: string,\n opts: { waitForUnmount: boolean } = { waitForUnmount: false },\n): Promise<void> {\n if (typeof appName !== 'string') {\n throw Error(formatErrorMessage(26, __DEV__ && `unloadApplication requires a string 'appName'`));\n }\n const app = apps.find((app) => toName(app) === appName);\n if (!app) {\n throw Error(\n formatErrorMessage(\n 27,\n __DEV__ && `Could not unload application '${appName}' because no such application has been registered`,\n appName,\n ),\n );\n }\n\n const appUnloadInfo = getAppUnloadInfo(toName(app));\n if (opts?.waitForUnmount) {\n // We need to wait for unmount before unloading the app\n\n if (appUnloadInfo) {\n // Someone else is already waiting for this, too\n return appUnloadInfo.promise;\n } else {\n // We're the first ones wanting the app to be resolved.\n const promise = new Promise<void>((resolve, reject) => {\n addAppToUnload(app, () => promise, resolve, reject);\n });\n return promise;\n }\n } else {\n /* We should unmount the app, unload it, and remount it immediately.\n */\n\n let resultPromise;\n\n if (appUnloadInfo) {\n // Someone else is already waiting for this app to unload\n resultPromise = appUnloadInfo.promise;\n immediatelyUnloadApp(app, appUnloadInfo.resolve, appUnloadInfo.reject);\n } else {\n // We're the first ones wanting the app to be resolved.\n resultPromise = new Promise((resolve, reject) => {\n addAppToUnload(app, () => resultPromise, resolve, reject);\n immediatelyUnloadApp(app, resolve, reject);\n });\n }\n\n return resultPromise;\n }\n}\n\nfunction immediatelyUnloadApp(\n app: InternalApplication,\n resolve: (value?: any) => void,\n reject: (value?: any) => void,\n): void {\n Promise.resolve()\n .then(() => {\n // Before unmounting the application, we first must wait for it to finish mounting\n // Otherwise, the test for issue 871 in unregister-application.spec.js fails because\n // the application isn't really unmounted.\n if (checkActivityFunctions().find((activeApp) => activeApp === toName(app))) {\n return triggerAppChange();\n }\n })\n .then(() => {\n return toUnmountPromise(app as LoadedApp)\n .then(toUnloadPromise)\n .then(() => {\n resolve();\n setTimeout(() => {\n // reroute, but the unload promise is done\n reroute();\n });\n });\n })\n .catch(reject);\n}\n\nfunction validateRegisterWithArguments(\n name: string,\n appOrLoadApp: Application,\n activeWhen: Activity,\n customProps?: CustomProps | CustomPropsFn,\n): void {\n if (typeof name !== 'string' || name.length === 0)\n throw Error(\n formatErrorMessage(20, __DEV__ && `The 1st argument to registerApplication must be a non-empty string 'appName'`),\n );\n\n if (!appOrLoadApp)\n throw Error(\n formatErrorMessage(\n 23,\n __DEV__ && 'The 2nd argument to registerApplication must be an application or loading application function',\n ),\n );\n\n if (typeof activeWhen !== 'function')\n throw Error(\n formatErrorMessage(24, __DEV__ && 'The 3rd argument to registerApplication must be an activeWhen function'),\n );\n\n if (!validCustomProps(customProps))\n throw Error(formatErrorMessage(22, __DEV__ && 'The optional 4th argument is a customProps and must be an object'));\n}\n\nexport function validateRegisterWithConfig(config: Partial<RegisterApplicationConfig>): void {\n if (Array.isArray(config) || config === null)\n throw Error(formatErrorMessage(39, __DEV__ && \"Configuration object can't be an Array or null!\"));\n const validKeys = ['name', 'app', 'activeWhen', 'customProps'];\n const invalidKeys = Object.keys(config).reduce(\n (invalidKeys, prop) => (validKeys.indexOf(prop) >= 0 ? invalidKeys : invalidKeys.concat(prop)),\n [],\n );\n if (invalidKeys.length !== 0)\n throw Error(\n formatErrorMessage(\n 38,\n __DEV__ &&\n `The configuration object accepts only: ${validKeys.join(', ')}. Invalid keys: ${invalidKeys.join(', ')}.`,\n validKeys.join(', '),\n invalidKeys.join(', '),\n ),\n );\n if (typeof config.name !== 'string' || config.name.length === 0)\n throw Error(formatErrorMessage(20, __DEV__ && 'The config.name on registerApplication must be a non-empty string'));\n if (typeof config.app !== 'object' && typeof config.app !== 'function')\n throw Error(\n formatErrorMessage(\n 20,\n __DEV__ && 'The config.app on registerApplication must be an application or a loading function',\n ),\n );\n const allowsStringAndFunction = (activeWhen) => typeof activeWhen === 'string' || typeof activeWhen === 'function';\n if (\n !allowsStringAndFunction(config.activeWhen) &&\n !(Array.isArray(config.activeWhen) && config.activeWhen.every(allowsStringAndFunction))\n )\n throw Error(\n formatErrorMessage(\n 24,\n __DEV__ && 'The config.activeWhen on registerApplication must be a string, function or an array with both',\n ),\n );\n if (!validCustomProps(config.customProps))\n throw Error(formatErrorMessage(22, __DEV__ && 'The optional config.customProps must be an object'));\n}\n\nfunction validCustomProps(customProps: unknown): boolean {\n return (\n !customProps ||\n typeof customProps === 'function' ||\n (typeof customProps === 'object' && customProps !== null && !Array.isArray(customProps))\n );\n}\n\ninterface ApplicationRegistration {\n name: string;\n loadApp: LoadApp;\n activeWhen: ActivityFn;\n customProps?: CustomProps;\n}\n\nfunction sanitizeArguments<ExtraProps extends CustomProps = {}>(\n appNameOrConfig: string | RegisterApplicationConfig,\n appOrLoadApp: Application,\n activeWhen: Activity,\n customProps?: ExtraProps | CustomPropsFn<ExtraProps>,\n): ApplicationRegistration {\n const usingObjectAPI = typeof appNameOrConfig === 'object';\n\n let unsanitizedRegistration: {\n name: string;\n app: Application;\n activeWhen: Activity;\n customProps: CustomProps | CustomPropsFn<CustomProps>;\n };\n\n if (usingObjectAPI) {\n validateRegisterWithConfig(appNameOrConfig);\n unsanitizedRegistration = {\n name: appNameOrConfig.name,\n app: appNameOrConfig.app,\n activeWhen: appNameOrConfig.activeWhen,\n customProps: appNameOrConfig.customProps,\n };\n } else {\n validateRegisterWithArguments(appNameOrConfig, appOrLoadApp, activeWhen, customProps);\n unsanitizedRegistration = {\n name: appNameOrConfig,\n app: appOrLoadApp,\n activeWhen,\n customProps,\n };\n }\n\n return {\n name: unsanitizedRegistration.name,\n loadApp: sanitizeLoadApp(unsanitizedRegistration.app),\n customProps: sanitizeCustomProps(unsanitizedRegistration.customProps),\n activeWhen: sanitizeActiveWhen(unsanitizedRegistration.activeWhen),\n };\n}\n\nfunction sanitizeLoadApp<ExtraProps extends CustomProps = {}>(\n loadApp: Application,\n): (config: ExtraProps & AppProps) => Promise<LifeCycles<ExtraProps>> {\n if (typeof loadApp !== 'function') {\n return () => Promise.resolve(loadApp);\n }\n\n return loadApp;\n}\n\nfunction sanitizeCustomProps(customProps?: CustomProps): CustomProps {\n return customProps ? customProps : {};\n}\n\nfunction sanitizeActiveWhen(activeWhen: Activity): ActivityFn {\n const activeWhenArray: (ActivityFn | string)[] = Array.isArray(activeWhen) ? activeWhen : [activeWhen];\n const activityFnArray: ActivityFn[] = activeWhenArray.map((activeWhenOrPath) =>\n typeof activeWhenOrPath === 'function' ? activeWhenOrPath : pathToActiveWhen(activeWhenOrPath, false),\n );\n\n return (location) => activityFnArray.some((activeWhen) => activeWhen(location));\n}\n\nexport function pathToActiveWhen(path: string, exactMatch?: boolean): ActivityFn {\n const regex = toDynamicPathValidatorRegex(path, exactMatch);\n\n return (location: Location) => {\n const route = location.href.replace(location.origin, '').replace(location.search, '').split('?')[0];\n return regex.test(route);\n };\n}\n\nfunction toDynamicPathValidatorRegex(path: string, exactMatch?: boolean) {\n let lastIndex: number = 0,\n inDynamic: boolean = false,\n regexStr: string = '^';\n\n if (path[0] !== '/') {\n path = '/' + path;\n }\n\n for (let charIndex = 0; charIndex < path.length; charIndex++) {\n const char = path[charIndex];\n const startOfDynamic = !inDynamic && char === ':';\n const endOfDynamic = inDynamic && char === '/';\n if (startOfDynamic || endOfDynamic) {\n appendToRegex(charIndex);\n }\n }\n\n appendToRegex(path.length);\n return new RegExp(regexStr, 'i');\n\n function appendToRegex(index) {\n const anyCharMaybeTrailingSlashRegex = '[^/]+/?';\n const commonStringSubPath = escapeStrRegex(path.slice(lastIndex, index));\n\n regexStr += inDynamic ? anyCharMaybeTrailingSlashRegex : commonStringSubPath;\n\n if (index === path.length) {\n if (inDynamic) {\n if (exactMatch) {\n // Ensure exact match paths that end in a dynamic portion don't match\n // urls with characters after a slash after the dynamic portion.\n regexStr += '$';\n }\n } else {\n // For exact matches, expect no more characters. Otherwise, allow\n // any characters.\n const suffix = exactMatch ? '' : '.*';\n\n regexStr =\n // use charAt instead as we could not use es6 method endsWith\n regexStr.charAt(regexStr.length - 1) === '/' ? `${regexStr}${suffix}$` : `${regexStr}(/${suffix})?(#.*)?$`;\n }\n }\n\n inDynamic = !inDynamic;\n lastIndex = index;\n }\n\n function escapeStrRegex(str) {\n // borrowed from https://github.com/sindresorhus/escape-string-regexp/blob/master/index.js\n return str.replace(/[|\\\\{}()[\\]^$+*?.]/g, '\\\\$&');\n }\n}\n"],"mappings":"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"}
@@ -0,0 +1,19 @@
1
+ import { AppOrParcel } from '../lifecycles/lifecycle.helpers';
2
+ export interface AppOrParcelTimeouts {
3
+ bootstrap: Timeout;
4
+ mount: Timeout;
5
+ unmount: Timeout;
6
+ unload: Timeout;
7
+ update: Timeout;
8
+ }
9
+ export interface Timeout {
10
+ millis: number;
11
+ dieOnTimeout: boolean;
12
+ warningMillis: number;
13
+ }
14
+ export declare function setBootstrapMaxTime(time: number, dieOnTimeout: boolean, warningMillis: number): void;
15
+ export declare function setMountMaxTime(time: number, dieOnTimeout: boolean, warningMillis: number): void;
16
+ export declare function setUnmountMaxTime(time: number, dieOnTimeout: boolean, warningMillis: number): void;
17
+ export declare function setUnloadMaxTime(time: number, dieOnTimeout: boolean, warningMillis: number): void;
18
+ export declare function reasonableTime(appOrParcel: AppOrParcel, lifecycle: 'bootstrap' | 'mount' | 'update' | 'unmount' | 'unload'): Promise<any>;
19
+ export declare function ensureValidAppTimeouts(timeouts: Partial<AppOrParcelTimeouts>): AppOrParcelTimeouts;
@@ -0,0 +1,109 @@
1
+ import { objectType, toName } from "./app.helpers.js";
2
+ import { formatErrorMessage } from "./app-errors.js";
3
+ import { getProps } from "../lifecycles/prop.helpers.js";
4
+ //#region src/applications/timeouts.ts
5
+ var defaultWarningMillis = 1e3;
6
+ var globalTimeoutConfig = {
7
+ bootstrap: {
8
+ millis: 4e3,
9
+ dieOnTimeout: false,
10
+ warningMillis: defaultWarningMillis
11
+ },
12
+ mount: {
13
+ millis: 3e3,
14
+ dieOnTimeout: false,
15
+ warningMillis: defaultWarningMillis
16
+ },
17
+ unmount: {
18
+ millis: 3e3,
19
+ dieOnTimeout: false,
20
+ warningMillis: defaultWarningMillis
21
+ },
22
+ unload: {
23
+ millis: 3e3,
24
+ dieOnTimeout: false,
25
+ warningMillis: defaultWarningMillis
26
+ },
27
+ update: {
28
+ millis: 3e3,
29
+ dieOnTimeout: false,
30
+ warningMillis: defaultWarningMillis
31
+ }
32
+ };
33
+ function setBootstrapMaxTime(time, dieOnTimeout, warningMillis) {
34
+ if (typeof time !== "number" || time <= 0) throw Error(formatErrorMessage(16, process.env.NODE_ENV !== "production" && `bootstrap max time must be a positive integer number of milliseconds`));
35
+ globalTimeoutConfig.bootstrap = {
36
+ millis: time,
37
+ dieOnTimeout,
38
+ warningMillis: warningMillis || defaultWarningMillis
39
+ };
40
+ }
41
+ function setMountMaxTime(time, dieOnTimeout, warningMillis) {
42
+ if (typeof time !== "number" || time <= 0) throw Error(formatErrorMessage(17, process.env.NODE_ENV !== "production" && `mount max time must be a positive integer number of milliseconds`));
43
+ globalTimeoutConfig.mount = {
44
+ millis: time,
45
+ dieOnTimeout,
46
+ warningMillis: warningMillis || defaultWarningMillis
47
+ };
48
+ }
49
+ function setUnmountMaxTime(time, dieOnTimeout, warningMillis) {
50
+ if (typeof time !== "number" || time <= 0) throw Error(formatErrorMessage(18, process.env.NODE_ENV !== "production" && `unmount max time must be a positive integer number of milliseconds`));
51
+ globalTimeoutConfig.unmount = {
52
+ millis: time,
53
+ dieOnTimeout,
54
+ warningMillis: warningMillis || defaultWarningMillis
55
+ };
56
+ }
57
+ function setUnloadMaxTime(time, dieOnTimeout, warningMillis) {
58
+ if (typeof time !== "number" || time <= 0) throw Error(formatErrorMessage(19, process.env.NODE_ENV !== "production" && `unload max time must be a positive integer number of milliseconds`));
59
+ globalTimeoutConfig.unload = {
60
+ millis: time,
61
+ dieOnTimeout,
62
+ warningMillis: warningMillis || defaultWarningMillis
63
+ };
64
+ }
65
+ function reasonableTime(appOrParcel, lifecycle) {
66
+ const timeoutConfig = appOrParcel.timeouts[lifecycle];
67
+ const warningPeriod = timeoutConfig.warningMillis;
68
+ const type = objectType(appOrParcel);
69
+ return new Promise((resolve, reject) => {
70
+ let finished = false;
71
+ let errored = false;
72
+ appOrParcel[lifecycle](getProps(appOrParcel)).then((val) => {
73
+ finished = true;
74
+ resolve(val);
75
+ }).catch((val) => {
76
+ finished = true;
77
+ reject(val);
78
+ });
79
+ setTimeout(() => maybeTimingOut(1), warningPeriod);
80
+ setTimeout(() => maybeTimingOut(true), timeoutConfig.millis);
81
+ const errMsg = formatErrorMessage(31, process.env.NODE_ENV !== "production" && `Lifecycle function ${lifecycle} for ${type} ${toName(appOrParcel)} lifecycle did not resolve or reject for ${timeoutConfig.millis} ms.`, lifecycle, type, toName(appOrParcel), timeoutConfig.millis);
82
+ function maybeTimingOut(shouldError) {
83
+ if (!finished) {
84
+ if (shouldError === true) {
85
+ errored = true;
86
+ if (timeoutConfig.dieOnTimeout) reject(Error(errMsg));
87
+ else console.error(errMsg);
88
+ } else if (!errored) {
89
+ const numWarnings = shouldError;
90
+ const numMillis = numWarnings * warningPeriod;
91
+ console.warn(errMsg);
92
+ if (numMillis + warningPeriod < timeoutConfig.millis) setTimeout(() => maybeTimingOut(numWarnings + 1), warningPeriod);
93
+ }
94
+ }
95
+ }
96
+ });
97
+ }
98
+ function ensureValidAppTimeouts(timeouts) {
99
+ const result = {};
100
+ for (let key in globalTimeoutConfig) {
101
+ var _timeouts$key;
102
+ result[key] = Object.assign({}, globalTimeoutConfig[key], (_timeouts$key = timeouts === null || timeouts === void 0 ? void 0 : timeouts[key]) !== null && _timeouts$key !== void 0 ? _timeouts$key : {});
103
+ }
104
+ return result;
105
+ }
106
+ //#endregion
107
+ export { ensureValidAppTimeouts, reasonableTime, setBootstrapMaxTime, setMountMaxTime, setUnloadMaxTime, setUnmountMaxTime };
108
+
109
+ //# sourceMappingURL=timeouts.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"timeouts.js","names":[],"sources":["../../../src/applications/timeouts.ts"],"sourcesContent":["import { getProps } from '../lifecycles/prop.helpers';\nimport { objectType, toName } from './app.helpers';\nimport { formatErrorMessage } from './app-errors';\nimport { AppOrParcel } from '../lifecycles/lifecycle.helpers';\n\nexport interface AppOrParcelTimeouts {\n bootstrap: Timeout;\n mount: Timeout;\n unmount: Timeout;\n unload: Timeout;\n update: Timeout;\n}\n\nexport interface Timeout {\n millis: number;\n dieOnTimeout: boolean;\n warningMillis: number;\n}\n\nconst defaultWarningMillis: number = 1000;\n\nconst globalTimeoutConfig: AppOrParcelTimeouts = {\n bootstrap: {\n millis: 4000,\n dieOnTimeout: false,\n warningMillis: defaultWarningMillis,\n },\n mount: {\n millis: 3000,\n dieOnTimeout: false,\n warningMillis: defaultWarningMillis,\n },\n unmount: {\n millis: 3000,\n dieOnTimeout: false,\n warningMillis: defaultWarningMillis,\n },\n unload: {\n millis: 3000,\n dieOnTimeout: false,\n warningMillis: defaultWarningMillis,\n },\n update: {\n millis: 3000,\n dieOnTimeout: false,\n warningMillis: defaultWarningMillis,\n },\n};\n\nexport function setBootstrapMaxTime(time: number, dieOnTimeout: boolean, warningMillis: number): void {\n if (typeof time !== 'number' || time <= 0) {\n throw Error(\n formatErrorMessage(16, __DEV__ && `bootstrap max time must be a positive integer number of milliseconds`),\n );\n }\n\n globalTimeoutConfig.bootstrap = {\n millis: time,\n dieOnTimeout,\n warningMillis: warningMillis || defaultWarningMillis,\n };\n}\n\nexport function setMountMaxTime(time: number, dieOnTimeout: boolean, warningMillis: number): void {\n if (typeof time !== 'number' || time <= 0) {\n throw Error(formatErrorMessage(17, __DEV__ && `mount max time must be a positive integer number of milliseconds`));\n }\n\n globalTimeoutConfig.mount = {\n millis: time,\n dieOnTimeout,\n warningMillis: warningMillis || defaultWarningMillis,\n };\n}\n\nexport function setUnmountMaxTime(time: number, dieOnTimeout: boolean, warningMillis: number) {\n if (typeof time !== 'number' || time <= 0) {\n throw Error(\n formatErrorMessage(18, __DEV__ && `unmount max time must be a positive integer number of milliseconds`),\n );\n }\n\n globalTimeoutConfig.unmount = {\n millis: time,\n dieOnTimeout,\n warningMillis: warningMillis || defaultWarningMillis,\n };\n}\n\nexport function setUnloadMaxTime(time: number, dieOnTimeout: boolean, warningMillis: number) {\n if (typeof time !== 'number' || time <= 0) {\n throw Error(formatErrorMessage(19, __DEV__ && `unload max time must be a positive integer number of milliseconds`));\n }\n\n globalTimeoutConfig.unload = {\n millis: time,\n dieOnTimeout,\n warningMillis: warningMillis || defaultWarningMillis,\n };\n}\n\nexport function reasonableTime(\n appOrParcel: AppOrParcel,\n lifecycle: 'bootstrap' | 'mount' | 'update' | 'unmount' | 'unload',\n): Promise<any> {\n const timeoutConfig = appOrParcel.timeouts[lifecycle];\n const warningPeriod = timeoutConfig.warningMillis;\n const type = objectType(appOrParcel);\n\n return new Promise((resolve, reject) => {\n let finished: boolean = false;\n let errored: boolean = false;\n\n appOrParcel[lifecycle](getProps(appOrParcel))\n .then((val) => {\n finished = true;\n resolve(val);\n })\n .catch((val) => {\n finished = true;\n reject(val);\n });\n\n setTimeout(() => maybeTimingOut(1), warningPeriod);\n setTimeout(() => maybeTimingOut(true), timeoutConfig.millis);\n\n const errMsg = formatErrorMessage(\n 31,\n __DEV__ &&\n `Lifecycle function ${lifecycle} for ${type} ${toName(\n appOrParcel,\n )} lifecycle did not resolve or reject for ${timeoutConfig.millis} ms.`,\n lifecycle,\n type,\n toName(appOrParcel),\n timeoutConfig.millis,\n );\n\n function maybeTimingOut(shouldError: true | number) {\n if (!finished) {\n if (shouldError === true) {\n errored = true;\n if (timeoutConfig.dieOnTimeout) {\n reject(Error(errMsg));\n } else {\n console.error(errMsg);\n //don't resolve or reject, we're waiting this one out\n }\n } else if (!errored) {\n const numWarnings: number = shouldError;\n const numMillis = numWarnings * warningPeriod;\n console.warn(errMsg);\n if (numMillis + warningPeriod < timeoutConfig.millis) {\n setTimeout(() => maybeTimingOut(numWarnings + 1), warningPeriod);\n }\n }\n }\n }\n });\n}\n\nexport function ensureValidAppTimeouts(timeouts: Partial<AppOrParcelTimeouts>): AppOrParcelTimeouts {\n const result = {};\n\n for (let key in globalTimeoutConfig) {\n result[key] = Object.assign({}, globalTimeoutConfig[key], timeouts?.[key] ?? {});\n }\n\n return result as AppOrParcelTimeouts;\n}\n"],"mappings":"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"}
@@ -0,0 +1,4 @@
1
+ declare const __DEV__: boolean;
2
+ // Upstream also declared `process` here for its BABEL_ENV probe; this monorepo compiles with
3
+ // @types/node, whose `process` global covers that access and conflicts with a redeclaration.
4
+ declare const __PROFILE__: boolean;
@@ -0,0 +1,16 @@
1
+ import { getRawAppData, unregisterApplication } from '../applications/apps';
2
+ import { reroute } from '../navigation/reroute';
3
+ import { AppOrParcelStatus } from '../applications/app.helpers';
4
+ import { toLoadPromise } from '../lifecycles/load';
5
+ import { toBootstrapPromise } from '../lifecycles/bootstrap';
6
+ import { getProfilerData } from './profiler';
7
+ declare const _default: {
8
+ getRawAppData: typeof getRawAppData;
9
+ reroute: typeof reroute;
10
+ NOT_LOADED: AppOrParcelStatus;
11
+ toLoadPromise: typeof toLoadPromise;
12
+ toBootstrapPromise: typeof toBootstrapPromise;
13
+ unregisterApplication: typeof unregisterApplication;
14
+ getProfilerData: typeof getProfilerData;
15
+ };
16
+ export default _default;
@@ -0,0 +1,20 @@
1
+ import { AppOrParcelStatus } from "../applications/app.helpers.js";
2
+ import { getProfilerData } from "./profiler.js";
3
+ import { toBootstrapPromise } from "../lifecycles/bootstrap.js";
4
+ import { toLoadPromise } from "../lifecycles/load.js";
5
+ import { reroute } from "../navigation/reroute.js";
6
+ import { getRawAppData, unregisterApplication } from "../applications/apps.js";
7
+ //#region src/devtools/devtools.ts
8
+ var devtools_default = {
9
+ getRawAppData,
10
+ reroute,
11
+ NOT_LOADED: AppOrParcelStatus.NOT_LOADED,
12
+ toLoadPromise,
13
+ toBootstrapPromise,
14
+ unregisterApplication,
15
+ getProfilerData
16
+ };
17
+ //#endregion
18
+ export { devtools_default as default };
19
+
20
+ //# sourceMappingURL=devtools.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"devtools.js","names":[],"sources":["../../../src/devtools/devtools.ts"],"sourcesContent":["import { getRawAppData, unregisterApplication } from '../applications/apps';\nimport { reroute } from '../navigation/reroute';\nimport { AppOrParcelStatus } from '../applications/app.helpers';\nimport { toLoadPromise } from '../lifecycles/load';\nimport { toBootstrapPromise } from '../lifecycles/bootstrap';\nimport { getProfilerData } from './profiler';\n\nexport default {\n getRawAppData,\n reroute,\n NOT_LOADED: AppOrParcelStatus.NOT_LOADED,\n toLoadPromise,\n toBootstrapPromise: toBootstrapPromise,\n unregisterApplication,\n getProfilerData,\n};\n"],"mappings":";;;;;;;AAOA,IAAA,mBAAe;CACb;CACA;CACA,YAAY,kBAAkB;CAC9B;CACoB;CACpB;CACA;AACF"}
@@ -0,0 +1,11 @@
1
+ export interface ProfileEntry {
2
+ type: 'application' | 'parcel' | 'routing';
3
+ name: string;
4
+ kind: 'bootstrap' | 'load' | 'mount' | 'unload' | 'unmount' | 'update' | 'loadApps' | 'silentNavigation' | 'browserNavigation' | 'triggerAppChange';
5
+ operationSucceeded: boolean;
6
+ start: number;
7
+ end: number;
8
+ }
9
+ export declare function getProfilerData(): ProfileEntry[];
10
+ export declare function addProfileEntry(type: ProfileEntry['type'], name: ProfileEntry['name'], kind: ProfileEntry['kind'], start: ProfileEntry['start'], end: ProfileEntry['end'], operationSucceeded: ProfileEntry['operationSucceeded']): void;
11
+ export declare function clearProfilerData(): void;
@@ -0,0 +1,22 @@
1
+ //#region src/devtools/profiler.ts
2
+ var profileEntries = [];
3
+ function getProfilerData() {
4
+ return profileEntries;
5
+ }
6
+ function addProfileEntry(type, name, kind, start, end, operationSucceeded) {
7
+ profileEntries.push({
8
+ type,
9
+ name,
10
+ start,
11
+ end,
12
+ kind,
13
+ operationSucceeded
14
+ });
15
+ }
16
+ function clearProfilerData() {
17
+ profileEntries = [];
18
+ }
19
+ //#endregion
20
+ export { addProfileEntry, clearProfilerData, getProfilerData };
21
+
22
+ //# sourceMappingURL=profiler.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"profiler.js","names":[],"sources":["../../../src/devtools/profiler.ts"],"sourcesContent":["let profileEntries: ProfileEntry[] = [];\n\nexport interface ProfileEntry {\n type: 'application' | 'parcel' | 'routing';\n name: string;\n kind:\n | 'bootstrap'\n | 'load'\n | 'mount'\n | 'unload'\n | 'unmount'\n | 'update'\n | 'loadApps'\n | 'silentNavigation'\n | 'browserNavigation'\n | 'triggerAppChange';\n operationSucceeded: boolean;\n start: number;\n end: number;\n}\n\nexport function getProfilerData() {\n return profileEntries;\n}\n\nexport function addProfileEntry(\n type: ProfileEntry['type'],\n name: ProfileEntry['name'],\n kind: ProfileEntry['kind'],\n start: ProfileEntry['start'],\n end: ProfileEntry['end'],\n operationSucceeded: ProfileEntry['operationSucceeded'],\n): void {\n profileEntries.push({\n type,\n name,\n start,\n end,\n kind,\n operationSucceeded,\n });\n}\n\nexport function clearProfilerData(): void {\n profileEntries = [];\n}\n"],"mappings":";AAAA,IAAI,iBAAiC,CAAC;AAqBtC,SAAgB,kBAAkB;CAChC,OAAO;AACT;AAEA,SAAgB,gBACd,MACA,MACA,MACA,OACA,KACA,oBACM;CACN,eAAe,KAAK;EAClB;EACA;EACA;EACA;EACA;EACA;CACF,CAAC;AACH;AAEA,SAAgB,oBAA0B;CACxC,iBAAiB,CAAC;AACpB"}
@@ -0,0 +1 @@
1
+ export * from './single-spa';
@@ -0,0 +1,10 @@
1
+ import { AppOrParcelStatus } from "./applications/app.helpers.js";
2
+ import { addErrorHandler, removeErrorHandler } from "./applications/app-errors.js";
3
+ import { start } from "./start.js";
4
+ import { mountRootParcel } from "./parcels/mount-parcel.js";
5
+ import { setBootstrapMaxTime, setMountMaxTime, setUnloadMaxTime, setUnmountMaxTime } from "./applications/timeouts.js";
6
+ import { triggerAppChange } from "./navigation/reroute.js";
7
+ import { navigateToUrl, patchHistoryApi } from "./navigation/navigation-events.js";
8
+ import { ensureJQuerySupport } from "./jquery-support.js";
9
+ import { checkActivityFunctions, getAppNames, getAppStatus, getMountedApps, pathToActiveWhen, registerApplication, unloadApplication, unregisterApplication } from "./applications/apps.js";
10
+ 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 };
@@ -0,0 +1,7 @@
1
+ export declare function ensureJQuerySupport(jQuery?: any): void;
2
+ declare global {
3
+ interface Window {
4
+ jQuery?: any;
5
+ $?: any;
6
+ }
7
+ }
@@ -0,0 +1,33 @@
1
+ import { routingEventsListeningTo } from "./navigation/navigation-events.js";
2
+ //#region src/jquery-support.ts
3
+ var hasInitialized = false;
4
+ function ensureJQuerySupport(jQuery = window.jQuery) {
5
+ var _window;
6
+ if (!jQuery && ((_window = window) === null || _window === void 0 || (_window = _window.$) === null || _window === void 0 || (_window = _window.fn) === null || _window === void 0 ? void 0 : _window.jquery)) jQuery = window.$;
7
+ if (jQuery && !hasInitialized) {
8
+ const originalJQueryOn = jQuery.fn.on;
9
+ const originalJQueryOff = jQuery.fn.off;
10
+ jQuery.fn.on = function(eventString, fn) {
11
+ return captureRoutingEvents.call(this, originalJQueryOn, window.addEventListener, eventString, fn, arguments);
12
+ };
13
+ jQuery.fn.off = function(eventString, fn) {
14
+ return captureRoutingEvents.call(this, originalJQueryOff, window.removeEventListener, eventString, fn, arguments);
15
+ };
16
+ hasInitialized = true;
17
+ }
18
+ }
19
+ function captureRoutingEvents(originalJQueryFunction, nativeFunctionToCall, eventString, fn, originalArgs) {
20
+ if (typeof eventString !== "string") return originalJQueryFunction.apply(this, originalArgs);
21
+ eventString.split(/\s+/).forEach((eventName) => {
22
+ if (routingEventsListeningTo.indexOf(eventName) >= 0) {
23
+ nativeFunctionToCall(eventName, fn);
24
+ eventString = eventString.replace(eventName, "");
25
+ }
26
+ });
27
+ if (eventString.trim() === "") return this;
28
+ else return originalJQueryFunction.apply(this, originalArgs);
29
+ }
30
+ //#endregion
31
+ export { ensureJQuerySupport };
32
+
33
+ //# sourceMappingURL=jquery-support.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"jquery-support.js","names":[],"sources":["../../src/jquery-support.ts"],"sourcesContent":["import { routingEventsListeningTo } from './navigation/navigation-events';\n\nlet hasInitialized: boolean = false;\n\nexport function ensureJQuerySupport(jQuery: any = window.jQuery): void {\n if (!jQuery && window?.$?.fn?.jquery) {\n jQuery = window.$;\n }\n\n if (jQuery && !hasInitialized) {\n const originalJQueryOn = jQuery.fn.on;\n const originalJQueryOff = jQuery.fn.off;\n\n jQuery.fn.on = function (eventString, fn) {\n return captureRoutingEvents.call(this, originalJQueryOn, window.addEventListener, eventString, fn, arguments);\n };\n\n jQuery.fn.off = function (eventString, fn) {\n return captureRoutingEvents.call(this, originalJQueryOff, window.removeEventListener, eventString, fn, arguments);\n };\n\n hasInitialized = true;\n }\n}\n\nfunction captureRoutingEvents(\n originalJQueryFunction: Function,\n nativeFunctionToCall: Function,\n eventString: string,\n fn: Function,\n originalArgs: any[],\n) {\n if (typeof eventString !== 'string') {\n return originalJQueryFunction.apply(this, originalArgs);\n }\n\n const eventNames = eventString.split(/\\s+/);\n eventNames.forEach((eventName) => {\n if (routingEventsListeningTo.indexOf(eventName) >= 0) {\n nativeFunctionToCall(eventName, fn);\n eventString = eventString.replace(eventName, '');\n }\n });\n\n if (eventString.trim() === '') {\n return this;\n } else {\n return originalJQueryFunction.apply(this, originalArgs);\n }\n}\n\ndeclare global {\n interface Window {\n jQuery?: any;\n $?: any;\n }\n}\n"],"mappings":";;AAEA,IAAI,iBAA0B;AAE9B,SAAgB,oBAAoB,SAAc,OAAO,QAAc;;CACrE,IAAI,CAAC,YAAA,UAAU,YAAA,QAAA,YAAA,KAAA,MAAA,UAAA,QAAQ,OAAA,QAAA,YAAA,KAAA,MAAA,UAAA,QAAG,QAAA,QAAA,YAAA,KAAA,IAAA,KAAA,IAAA,QAAI,SAC5B,SAAS,OAAO;CAGlB,IAAI,UAAU,CAAC,gBAAgB;EAC7B,MAAM,mBAAmB,OAAO,GAAG;EACnC,MAAM,oBAAoB,OAAO,GAAG;EAEpC,OAAO,GAAG,KAAK,SAAU,aAAa,IAAI;GACxC,OAAO,qBAAqB,KAAK,MAAM,kBAAkB,OAAO,kBAAkB,aAAa,IAAI,SAAS;EAC9G;EAEA,OAAO,GAAG,MAAM,SAAU,aAAa,IAAI;GACzC,OAAO,qBAAqB,KAAK,MAAM,mBAAmB,OAAO,qBAAqB,aAAa,IAAI,SAAS;EAClH;EAEA,iBAAiB;CACnB;AACF;AAEA,SAAS,qBACP,wBACA,sBACA,aACA,IACA,cACA;CACA,IAAI,OAAO,gBAAgB,UACzB,OAAO,uBAAuB,MAAM,MAAM,YAAY;CAIxD,AADmB,YAAY,MAAM,KACrC,CAAA,CAAW,SAAS,cAAc;EAChC,IAAI,yBAAyB,QAAQ,SAAS,KAAK,GAAG;GACpD,qBAAqB,WAAW,EAAE;GAClC,cAAc,YAAY,QAAQ,WAAW,EAAE;EACjD;CACF,CAAC;CAED,IAAI,YAAY,KAAK,MAAM,IACzB,OAAO;MAEP,OAAO,uBAAuB,MAAM,MAAM,YAAY;AAE1D"}
@@ -0,0 +1,2 @@
1
+ import { LoadedAppOrParcel } from './lifecycle.helpers';
2
+ export declare function toBootstrapPromise(appOrParcel: LoadedAppOrParcel, hardFail?: boolean): Promise<LoadedAppOrParcel>;
@@ -0,0 +1,26 @@
1
+ import { AppOrParcelStatus } from "../applications/app.helpers.js";
2
+ import { handleAppError, transformErr } from "../applications/app-errors.js";
3
+ import "../devtools/profiler.js";
4
+ import { reasonableTime } from "../applications/timeouts.js";
5
+ //#region src/lifecycles/bootstrap.ts
6
+ function toBootstrapPromise(appOrParcel, hardFail) {
7
+ return Promise.resolve().then(() => {
8
+ if (appOrParcel.status !== AppOrParcelStatus.NOT_BOOTSTRAPPED) return appOrParcel;
9
+ appOrParcel.status = AppOrParcelStatus.BOOTSTRAPPING;
10
+ return reasonableTime(appOrParcel, "bootstrap").then(successfulBootstrap).catch((err) => {
11
+ if (hardFail) throw transformErr(err, appOrParcel, AppOrParcelStatus.SKIP_BECAUSE_BROKEN);
12
+ else {
13
+ handleAppError(err, appOrParcel, AppOrParcelStatus.SKIP_BECAUSE_BROKEN);
14
+ return appOrParcel;
15
+ }
16
+ });
17
+ });
18
+ function successfulBootstrap() {
19
+ appOrParcel.status = AppOrParcelStatus.NOT_MOUNTED;
20
+ return appOrParcel;
21
+ }
22
+ }
23
+ //#endregion
24
+ export { toBootstrapPromise };
25
+
26
+ //# sourceMappingURL=bootstrap.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"bootstrap.js","names":[],"sources":["../../../src/lifecycles/bootstrap.ts"],"sourcesContent":["import { AppOrParcelStatus, toName, isParcel } from '../applications/app.helpers';\nimport { reasonableTime } from '../applications/timeouts';\nimport { handleAppError, transformErr } from '../applications/app-errors';\nimport { ProfileEntry, addProfileEntry } from '../devtools/profiler';\nimport { LoadedAppOrParcel } from './lifecycle.helpers';\n\nexport function toBootstrapPromise(appOrParcel: LoadedAppOrParcel, hardFail?: boolean): Promise<LoadedAppOrParcel> {\n let startTime: number, profileEventType: ProfileEntry['type'];\n\n return Promise.resolve().then(() => {\n if (appOrParcel.status !== AppOrParcelStatus.NOT_BOOTSTRAPPED) {\n return appOrParcel;\n }\n\n if (__PROFILE__) {\n profileEventType = isParcel(appOrParcel) ? 'parcel' : 'application';\n startTime = performance.now();\n }\n\n appOrParcel.status = AppOrParcelStatus.BOOTSTRAPPING;\n\n return reasonableTime(appOrParcel, 'bootstrap')\n .then(successfulBootstrap)\n .catch((err) => {\n if (__PROFILE__) {\n addProfileEntry(profileEventType, toName(appOrParcel), 'bootstrap', startTime, performance.now(), false);\n }\n\n if (hardFail) {\n throw transformErr(err, appOrParcel, AppOrParcelStatus.SKIP_BECAUSE_BROKEN);\n } else {\n handleAppError(err, appOrParcel, AppOrParcelStatus.SKIP_BECAUSE_BROKEN);\n return appOrParcel;\n }\n });\n });\n\n function successfulBootstrap(): LoadedAppOrParcel {\n appOrParcel.status = AppOrParcelStatus.NOT_MOUNTED;\n\n if (__PROFILE__) {\n addProfileEntry(profileEventType, toName(appOrParcel), 'bootstrap', startTime, performance.now(), true);\n }\n\n return appOrParcel;\n }\n}\n"],"mappings":";;;;;AAMA,SAAgB,mBAAmB,aAAgC,UAAgD;CAGjH,OAAO,QAAQ,QAAQ,CAAC,CAAC,WAAW;EAClC,IAAI,YAAY,WAAW,kBAAkB,kBAC3C,OAAO;EAQT,YAAY,SAAS,kBAAkB;EAEvC,OAAO,eAAe,aAAa,WAAW,CAAC,CAC5C,KAAK,mBAAmB,CAAC,CACzB,OAAO,QAAQ;GAKd,IAAI,UACF,MAAM,aAAa,KAAK,aAAa,kBAAkB,mBAAmB;QACrE;IACL,eAAe,KAAK,aAAa,kBAAkB,mBAAmB;IACtE,OAAO;GACT;EACF,CAAC;CACL,CAAC;CAED,SAAS,sBAAyC;EAChD,YAAY,SAAS,kBAAkB;EAMvC,OAAO;CACT;AACF"}