@next-core/runtime 1.21.0 → 1.21.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/cjs/createRoot.js +4 -6
- package/dist/cjs/createRoot.js.map +1 -1
- package/dist/cjs/internal/CustomTemplates/bindTemplateProxy.js +1 -1
- package/dist/cjs/internal/CustomTemplates/bindTemplateProxy.js.map +1 -1
- package/dist/cjs/internal/Renderer.js +159 -59
- package/dist/cjs/internal/Renderer.js.map +1 -1
- package/dist/cjs/internal/RendererContext.js +87 -11
- package/dist/cjs/internal/RendererContext.js.map +1 -1
- package/dist/cjs/internal/Router.js +109 -77
- package/dist/cjs/internal/Router.js.map +1 -1
- package/dist/cjs/internal/data/DataStore.js +53 -7
- package/dist/cjs/internal/data/DataStore.js.map +1 -1
- package/dist/cjs/internal/matchRoutes.js +9 -5
- package/dist/cjs/internal/matchRoutes.js.map +1 -1
- package/dist/cjs/internal/matchStoryboard.js +8 -3
- package/dist/cjs/internal/matchStoryboard.js.map +1 -1
- package/dist/cjs/internal/secret_internals.js +11 -18
- package/dist/cjs/internal/secret_internals.js.map +1 -1
- package/dist/esm/createRoot.js +5 -7
- package/dist/esm/createRoot.js.map +1 -1
- package/dist/esm/internal/CustomTemplates/bindTemplateProxy.js +1 -1
- package/dist/esm/internal/CustomTemplates/bindTemplateProxy.js.map +1 -1
- package/dist/esm/internal/Renderer.js +167 -69
- package/dist/esm/internal/Renderer.js.map +1 -1
- package/dist/esm/internal/RendererContext.js +94 -11
- package/dist/esm/internal/RendererContext.js.map +1 -1
- package/dist/esm/internal/Router.js +148 -103
- package/dist/esm/internal/Router.js.map +1 -1
- package/dist/esm/internal/data/DataStore.js +51 -6
- package/dist/esm/internal/data/DataStore.js.map +1 -1
- package/dist/esm/internal/matchRoutes.js +8 -5
- package/dist/esm/internal/matchRoutes.js.map +1 -1
- package/dist/esm/internal/matchStoryboard.js +7 -3
- package/dist/esm/internal/matchStoryboard.js.map +1 -1
- package/dist/esm/internal/secret_internals.js +13 -20
- package/dist/esm/internal/secret_internals.js.map +1 -1
- package/dist/types/internal/Renderer.d.ts +12 -4
- package/dist/types/internal/RendererContext.d.ts +31 -5
- package/dist/types/internal/data/DataStore.d.ts +13 -4
- package/dist/types/internal/matchRoutes.d.ts +6 -0
- package/dist/types/internal/matchStoryboard.d.ts +1 -0
- package/package.json +3 -3
|
@@ -7,11 +7,10 @@ Object.defineProperty(exports, "__esModule", {
|
|
|
7
7
|
exports.Router = void 0;
|
|
8
8
|
var _classPrivateMethodInitSpec2 = _interopRequireDefault(require("@babel/runtime/helpers/classPrivateMethodInitSpec"));
|
|
9
9
|
var _classPrivateFieldInitSpec2 = _interopRequireDefault(require("@babel/runtime/helpers/classPrivateFieldInitSpec"));
|
|
10
|
-
var
|
|
10
|
+
var _classPrivateFieldGet7 = _interopRequireDefault(require("@babel/runtime/helpers/classPrivateFieldGet"));
|
|
11
11
|
var _classPrivateMethodGet2 = _interopRequireDefault(require("@babel/runtime/helpers/classPrivateMethodGet"));
|
|
12
12
|
var _classPrivateFieldSet2 = _interopRequireDefault(require("@babel/runtime/helpers/classPrivateFieldSet"));
|
|
13
13
|
var _history2 = require("history");
|
|
14
|
-
var _loader = require("@next-core/loader");
|
|
15
14
|
var _http = require("@next-core/http");
|
|
16
15
|
var _lodash = require("lodash");
|
|
17
16
|
var _history3 = require("../history.js");
|
|
@@ -124,27 +123,29 @@ class Router {
|
|
|
124
123
|
}));
|
|
125
124
|
}
|
|
126
125
|
getRenderId() {
|
|
127
|
-
return (0,
|
|
126
|
+
return (0, _classPrivateFieldGet7.default)(this, _renderId);
|
|
128
127
|
}
|
|
129
128
|
getRuntimeContext() {
|
|
130
|
-
return (0,
|
|
129
|
+
return (0, _classPrivateFieldGet7.default)(this, _runtimeContext);
|
|
131
130
|
}
|
|
132
131
|
getRecentApps() {
|
|
133
132
|
return {
|
|
134
|
-
currentApp: (0,
|
|
135
|
-
previousApp: (0,
|
|
133
|
+
currentApp: (0, _classPrivateFieldGet7.default)(this, _currentApp),
|
|
134
|
+
previousApp: (0, _classPrivateFieldGet7.default)(this, _previousApp)
|
|
136
135
|
};
|
|
137
136
|
}
|
|
138
137
|
getNavConfig() {
|
|
139
|
-
return (0,
|
|
138
|
+
return (0, _classPrivateFieldGet7.default)(this, _navConfig);
|
|
140
139
|
}
|
|
141
140
|
bootstrap() {
|
|
142
141
|
(0, _abortController.initAbortController)();
|
|
143
142
|
const history = (0, _history3.getHistory)();
|
|
144
143
|
(0, _classPrivateFieldSet2.default)(this, _prevLocation, history.location);
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
144
|
+
let renderId = 0;
|
|
145
|
+
history.listen(async (location, action) => {
|
|
146
|
+
var _classPrivateFieldGet2, _location$state, _classPrivateFieldGet4;
|
|
147
|
+
const currentRenderId = ++renderId;
|
|
148
|
+
let ignoreRendering;
|
|
148
149
|
const omittedLocationProps = {
|
|
149
150
|
hash: undefined,
|
|
150
151
|
state: undefined
|
|
@@ -157,13 +158,13 @@ class Router {
|
|
|
157
158
|
// such as goBack or goForward,
|
|
158
159
|
action === "POP" && (
|
|
159
160
|
// and the previous location was triggered by hash link,
|
|
160
|
-
(0,
|
|
161
|
+
(0, _classPrivateFieldGet7.default)(this, _prevLocation).key === undefined ||
|
|
161
162
|
// or the previous location specified notify false.
|
|
162
|
-
((_classPrivateFieldGet2 = (0,
|
|
163
|
+
((_classPrivateFieldGet2 = (0, _classPrivateFieldGet7.default)(this, _prevLocation).state) === null || _classPrivateFieldGet2 === void 0 ? void 0 : _classPrivateFieldGet2.notify) === false)) {
|
|
163
164
|
omittedLocationProps.key = undefined;
|
|
164
165
|
}
|
|
165
166
|
if ((0, _history2.locationsAreEqual)({
|
|
166
|
-
...(0,
|
|
167
|
+
...(0, _classPrivateFieldGet7.default)(this, _prevLocation),
|
|
167
168
|
...omittedLocationProps
|
|
168
169
|
}, {
|
|
169
170
|
...location,
|
|
@@ -173,15 +174,24 @@ class Router {
|
|
|
173
174
|
// Ignore rendering if notify is `false`.
|
|
174
175
|
ignoreRendering = true;
|
|
175
176
|
}
|
|
177
|
+
if (!ignoreRendering) {
|
|
178
|
+
var _classPrivateFieldGet3;
|
|
179
|
+
ignoreRendering = await ((_classPrivateFieldGet3 = (0, _classPrivateFieldGet7.default)(this, _rendererContext)) === null || _classPrivateFieldGet3 === void 0 ? void 0 : _classPrivateFieldGet3.didPerformIncrementalRender(location));
|
|
180
|
+
}
|
|
181
|
+
|
|
182
|
+
// Ignore stale renders
|
|
183
|
+
if (renderId !== currentRenderId) {
|
|
184
|
+
return;
|
|
185
|
+
}
|
|
176
186
|
if (ignoreRendering) {
|
|
177
187
|
(0, _classPrivateFieldSet2.default)(this, _prevLocation, location);
|
|
178
188
|
return;
|
|
179
189
|
}
|
|
180
190
|
(0, _abortController.abortPendingRequest)();
|
|
181
191
|
(0, _classPrivateFieldSet2.default)(this, _prevLocation, location);
|
|
182
|
-
(
|
|
192
|
+
(_classPrivateFieldGet4 = (0, _classPrivateFieldGet7.default)(this, _rendererContext)) === null || _classPrivateFieldGet4 === void 0 ? void 0 : _classPrivateFieldGet4.dispatchPageLeave();
|
|
183
193
|
if (action === "POP") {
|
|
184
|
-
const storyboard = (0, _matchStoryboard.matchStoryboard)((0,
|
|
194
|
+
const storyboard = (0, _matchStoryboard.matchStoryboard)((0, _classPrivateFieldGet7.default)(this, _storyboards), location.pathname);
|
|
185
195
|
// When a browser action of goBack or goForward is performing,
|
|
186
196
|
// force reload when the target page is a page of an outside app.
|
|
187
197
|
if ((0, _matchStoryboard.isOutsideApp)(storyboard)) {
|
|
@@ -189,7 +199,7 @@ class Router {
|
|
|
189
199
|
return;
|
|
190
200
|
}
|
|
191
201
|
}
|
|
192
|
-
if ((0,
|
|
202
|
+
if ((0, _classPrivateFieldGet7.default)(this, _rendering)) {
|
|
193
203
|
(0, _classPrivateFieldSet2.default)(this, _nextLocation, location);
|
|
194
204
|
} else {
|
|
195
205
|
// devtoolsHookEmit("locationChange");
|
|
@@ -201,10 +211,10 @@ class Router {
|
|
|
201
211
|
}
|
|
202
212
|
exports.Router = Router;
|
|
203
213
|
function _getBlockMessageBeforePageLave2(detail) {
|
|
204
|
-
var
|
|
214
|
+
var _classPrivateFieldGet5;
|
|
205
215
|
const history = (0, _history3.getHistory)();
|
|
206
216
|
const previousMessage = history.getBlockMessage();
|
|
207
|
-
(
|
|
217
|
+
(_classPrivateFieldGet5 = (0, _classPrivateFieldGet7.default)(this, _rendererContext)) === null || _classPrivateFieldGet5 === void 0 ? void 0 : _classPrivateFieldGet5.dispatchBeforePageLeave(detail);
|
|
208
218
|
const message = history.getBlockMessage();
|
|
209
219
|
if (!previousMessage && message) {
|
|
210
220
|
// Auto unblock only if new block was introduced by `onBeforePageLeave`.
|
|
@@ -214,7 +224,7 @@ function _getBlockMessageBeforePageLave2(detail) {
|
|
|
214
224
|
}
|
|
215
225
|
function _safeRedirect2(to, state, from) {
|
|
216
226
|
var _this$redirectCount, _this$redirectCount2;
|
|
217
|
-
if (((0, _classPrivateFieldSet2.default)(this, _redirectCount, (_this$redirectCount = (0,
|
|
227
|
+
if (((0, _classPrivateFieldSet2.default)(this, _redirectCount, (_this$redirectCount = (0, _classPrivateFieldGet7.default)(this, _redirectCount), _this$redirectCount2 = _this$redirectCount++, _this$redirectCount)), _this$redirectCount2) > 10) {
|
|
218
228
|
const message = `Infinite redirect detected: from "${from.pathname}${from.search}${from.hash}" to "${to}"`;
|
|
219
229
|
// istanbul ignore else: error cannot be caught in test
|
|
220
230
|
if (process.env.NODE_ENV === "test") {
|
|
@@ -233,15 +243,15 @@ async function _queuedRender2(location) {
|
|
|
233
243
|
await (0, _classPrivateMethodGet2.default)(this, _render, _render2).call(this, location);
|
|
234
244
|
} finally {
|
|
235
245
|
(0, _classPrivateFieldSet2.default)(this, _rendering, false);
|
|
236
|
-
if ((0,
|
|
237
|
-
const nextLocation = (0,
|
|
246
|
+
if ((0, _classPrivateFieldGet7.default)(this, _nextLocation)) {
|
|
247
|
+
const nextLocation = (0, _classPrivateFieldGet7.default)(this, _nextLocation);
|
|
238
248
|
(0, _classPrivateFieldSet2.default)(this, _nextLocation, undefined);
|
|
239
249
|
await (0, _classPrivateMethodGet2.default)(this, _queuedRender, _queuedRender2).call(this, nextLocation);
|
|
240
250
|
}
|
|
241
251
|
}
|
|
242
252
|
}
|
|
243
253
|
async function _render2(location) {
|
|
244
|
-
var _hooks$flowApi,
|
|
254
|
+
var _hooks$flowApi, _classPrivateFieldGet6;
|
|
245
255
|
(0, _classPrivateFieldSet2.default)(this, _renderId, (0, _lodash.uniqueId)("render-id-1"));
|
|
246
256
|
(0, _markAsComputed.resetAllComputedMarks)();
|
|
247
257
|
(0, _resolveData.clearResolveCache)();
|
|
@@ -249,8 +259,8 @@ async function _render2(location) {
|
|
|
249
259
|
const history = (0, _history3.getHistory)();
|
|
250
260
|
history.unblock();
|
|
251
261
|
const renderStartTime = performance.now();
|
|
252
|
-
const storyboard = (0, _matchStoryboard.matchStoryboard)((0,
|
|
253
|
-
const previousApp = (
|
|
262
|
+
const storyboard = (0, _matchStoryboard.matchStoryboard)((0, _classPrivateFieldGet7.default)(this, _storyboards), location.pathname);
|
|
263
|
+
const previousApp = (_classPrivateFieldGet6 = (0, _classPrivateFieldGet7.default)(this, _runtimeContext)) === null || _classPrivateFieldGet6 === void 0 ? void 0 : _classPrivateFieldGet6.app;
|
|
254
264
|
if (storyboard !== null && storyboard !== void 0 && storyboard.app) {
|
|
255
265
|
await (0, _fulfilStoryboard.fulfilStoryboard)(storyboard);
|
|
256
266
|
}
|
|
@@ -263,9 +273,9 @@ async function _render2(location) {
|
|
|
263
273
|
|
|
264
274
|
// Set `Router::#currentApp` before calling `getFeatureFlags()`
|
|
265
275
|
const flags = (0, _Runtime.getRuntime)().getFeatureFlags();
|
|
266
|
-
const prevRendererContext = (0,
|
|
276
|
+
const prevRendererContext = (0, _classPrivateFieldGet7.default)(this, _rendererContext);
|
|
267
277
|
const redirectTo = (to, state) => {
|
|
268
|
-
(0,
|
|
278
|
+
(0, _classPrivateFieldGet7.default)(this, _rendererContextTrashCan).add(prevRendererContext);
|
|
269
279
|
(0, _classPrivateMethodGet2.default)(this, _safeRedirect, _safeRedirect2).call(this, to, state, location);
|
|
270
280
|
};
|
|
271
281
|
const redirectToLogin = () => {
|
|
@@ -287,14 +297,14 @@ async function _render2(location) {
|
|
|
287
297
|
(0, _mount.unmountTree)(portal);
|
|
288
298
|
|
|
289
299
|
// Note: redirects can lead to multiple trash renderer contexts.
|
|
290
|
-
(0,
|
|
291
|
-
for (const item of (0,
|
|
300
|
+
(0, _classPrivateFieldGet7.default)(this, _rendererContextTrashCan).add(prevRendererContext);
|
|
301
|
+
for (const item of (0, _classPrivateFieldGet7.default)(this, _rendererContextTrashCan)) {
|
|
292
302
|
if (item) {
|
|
293
303
|
item.dispatchOnUnmount();
|
|
294
304
|
item.dispose();
|
|
295
305
|
}
|
|
296
306
|
}
|
|
297
|
-
(0,
|
|
307
|
+
(0, _classPrivateFieldGet7.default)(this, _rendererContextTrashCan).clear();
|
|
298
308
|
_Runtime.hooks === null || _Runtime.hooks === void 0 || (_hooks$messageDispatc = _Runtime.hooks.messageDispatcher) === null || _hooks$messageDispatc === void 0 ? void 0 : _hooks$messageDispatc.reset();
|
|
299
309
|
if (appChanged) {
|
|
300
310
|
(0, _classPrivateFieldSet2.default)(this, _previousApp, previousApp);
|
|
@@ -311,7 +321,53 @@ async function _render2(location) {
|
|
|
311
321
|
if (currentApp) {
|
|
312
322
|
var _hooks$checkInstalled, _hooks$auth, _hooks$checkPermissio, _storyboard$meta, _hooks$flowApi2, _storyboard$meta2;
|
|
313
323
|
_Runtime.hooks === null || _Runtime.hooks === void 0 || (_hooks$checkInstalled = _Runtime.hooks.checkInstalledApps) === null || _hooks$checkInstalled === void 0 ? void 0 : _hooks$checkInstalled.preCheckInstalledApps(storyboard, appId => !!(0, _Runtime._internalApiGetAppInBootstrapData)(appId));
|
|
314
|
-
const
|
|
324
|
+
const routeHelper = {
|
|
325
|
+
bailout: output => {
|
|
326
|
+
if (output.unauthenticated) {
|
|
327
|
+
redirectToLogin();
|
|
328
|
+
return true;
|
|
329
|
+
}
|
|
330
|
+
if (output.redirect) {
|
|
331
|
+
redirectTo(output.redirect.path, output.redirect.state);
|
|
332
|
+
return true;
|
|
333
|
+
}
|
|
334
|
+
// Reset redirect count if no redirect is set.
|
|
335
|
+
(0, _classPrivateFieldSet2.default)(this, _redirectCount, 0);
|
|
336
|
+
},
|
|
337
|
+
mergeMenus: async menuRequests => {
|
|
338
|
+
const menuConfs = await Promise.all(menuRequests);
|
|
339
|
+
(0, _classPrivateFieldSet2.default)(this, _navConfig, mergeMenuConfs(menuConfs));
|
|
340
|
+
},
|
|
341
|
+
catch: (error, returnNode) => {
|
|
342
|
+
if ((0, _handleHttpError.isUnauthenticatedError)(error) && !window.NO_AUTH_GUARD) {
|
|
343
|
+
redirectToLogin();
|
|
344
|
+
return;
|
|
345
|
+
} else if (error instanceof _http.HttpAbortError) {
|
|
346
|
+
(0, _classPrivateFieldGet7.default)(this, _rendererContextTrashCan).add(prevRendererContext);
|
|
347
|
+
return;
|
|
348
|
+
} else {
|
|
349
|
+
return {
|
|
350
|
+
failed: true,
|
|
351
|
+
output: {
|
|
352
|
+
node: {
|
|
353
|
+
tag: _enums.RenderTag.BRICK,
|
|
354
|
+
type: "div",
|
|
355
|
+
properties: {
|
|
356
|
+
textContent: (0, _handleHttpError.httpErrorToString)(error)
|
|
357
|
+
},
|
|
358
|
+
runtimeContext: null,
|
|
359
|
+
return: returnNode
|
|
360
|
+
},
|
|
361
|
+
blockingList: [],
|
|
362
|
+
menuRequests: []
|
|
363
|
+
}
|
|
364
|
+
};
|
|
365
|
+
}
|
|
366
|
+
}
|
|
367
|
+
};
|
|
368
|
+
const rendererContext = (0, _classPrivateFieldSet2.default)(this, _rendererContext, new _RendererContext.RendererContext("page", {
|
|
369
|
+
routeHelper
|
|
370
|
+
}));
|
|
315
371
|
const runtimeContext = (0, _classPrivateFieldSet2.default)(this, _runtimeContext, {
|
|
316
372
|
app: currentApp,
|
|
317
373
|
location,
|
|
@@ -337,47 +393,25 @@ async function _render2(location) {
|
|
|
337
393
|
let output;
|
|
338
394
|
let stores = [];
|
|
339
395
|
try {
|
|
340
|
-
output = await (0, _Renderer.renderRoutes)(renderRoot, (0, _insertPreviewRoutes.insertPreviewRoutes)(storyboard.routes), runtimeContext, rendererContext);
|
|
341
|
-
if (output
|
|
342
|
-
redirectToLogin();
|
|
343
|
-
return;
|
|
344
|
-
}
|
|
345
|
-
if (output.redirect) {
|
|
346
|
-
redirectTo(output.redirect.path, output.redirect.state);
|
|
396
|
+
output = await (0, _Renderer.renderRoutes)(renderRoot, (0, _insertPreviewRoutes.insertPreviewRoutes)(storyboard.routes), runtimeContext, rendererContext, []);
|
|
397
|
+
if (routeHelper.bailout(output)) {
|
|
347
398
|
return;
|
|
348
399
|
}
|
|
349
|
-
|
|
350
|
-
(0,
|
|
351
|
-
|
|
352
|
-
|
|
353
|
-
await Promise.all([...output.blockingList, ...stores.map(store => store.waitForAll()), ...runtimeContext.pendingPermissionsPreCheck]);
|
|
354
|
-
const menuConfs = await Promise.all(output.menuRequests);
|
|
355
|
-
(0, _classPrivateFieldSet2.default)(this, _navConfig, mergeMenuConfs(menuConfs));
|
|
400
|
+
stores = (0, _Renderer.getDataStores)(runtimeContext);
|
|
401
|
+
await (0, _Renderer.postAsyncRender)(output, runtimeContext, stores);
|
|
402
|
+
await routeHelper.mergeMenus(output.menuRequests);
|
|
403
|
+
rendererContext.setInitialMenuRequests(output.menuRequests);
|
|
356
404
|
} catch (error) {
|
|
357
405
|
// eslint-disable-next-line no-console
|
|
358
406
|
console.error("Router failed:", error);
|
|
359
|
-
|
|
360
|
-
|
|
407
|
+
const result = routeHelper.catch(error, renderRoot);
|
|
408
|
+
if (!result) {
|
|
361
409
|
return;
|
|
362
|
-
} else if (error instanceof _http.HttpAbortError) {
|
|
363
|
-
(0, _classPrivateFieldGet6.default)(this, _rendererContextTrashCan).add(prevRendererContext);
|
|
364
|
-
return;
|
|
365
|
-
} else {
|
|
366
|
-
failed = true;
|
|
367
|
-
output = {
|
|
368
|
-
node: {
|
|
369
|
-
tag: _enums.RenderTag.BRICK,
|
|
370
|
-
type: "div",
|
|
371
|
-
properties: {
|
|
372
|
-
textContent: (0, _handleHttpError.httpErrorToString)(error)
|
|
373
|
-
},
|
|
374
|
-
runtimeContext: null,
|
|
375
|
-
return: renderRoot
|
|
376
|
-
},
|
|
377
|
-
blockingList: [],
|
|
378
|
-
menuRequests: []
|
|
379
|
-
};
|
|
380
410
|
}
|
|
411
|
+
({
|
|
412
|
+
failed,
|
|
413
|
+
output
|
|
414
|
+
} = result);
|
|
381
415
|
}
|
|
382
416
|
renderRoot.child = output.node;
|
|
383
417
|
cleanUpPreviousRender();
|
|
@@ -394,15 +428,15 @@ async function _render2(location) {
|
|
|
394
428
|
// See https://github.com/ReactTraining/react-router/blob/master/packages/react-router-dom/docs/guides/scroll-restoration.md
|
|
395
429
|
window.scrollTo(0, 0);
|
|
396
430
|
if (!failed) {
|
|
397
|
-
for (const store of stores) {
|
|
398
|
-
store.handleAsyncAfterMount();
|
|
399
|
-
}
|
|
400
431
|
rendererContext.dispatchPageLoad();
|
|
401
432
|
rendererContext.dispatchAnchorLoad();
|
|
402
433
|
rendererContext.dispatchOnMount();
|
|
403
434
|
rendererContext.initializeScrollIntoView();
|
|
404
435
|
rendererContext.initializeMediaChange();
|
|
405
436
|
rendererContext.initializeMessageDispatcher();
|
|
437
|
+
for (const store of stores) {
|
|
438
|
+
store.mountAsyncData();
|
|
439
|
+
}
|
|
406
440
|
}
|
|
407
441
|
const renderTime = performance.now() - renderStartTime;
|
|
408
442
|
window.dispatchEvent(new CustomEvent("route.render", {
|
|
@@ -442,16 +476,14 @@ function mergeMenuConfs(menuConfs) {
|
|
|
442
476
|
breadcrumb: []
|
|
443
477
|
};
|
|
444
478
|
for (const menuConf of menuConfs) {
|
|
445
|
-
|
|
446
|
-
|
|
447
|
-
|
|
448
|
-
|
|
449
|
-
if (breadcrumb) {
|
|
450
|
-
|
|
451
|
-
|
|
452
|
-
|
|
453
|
-
navConfig.breadcrumb.push(...breadcrumb.items);
|
|
454
|
-
}
|
|
479
|
+
const {
|
|
480
|
+
breadcrumb
|
|
481
|
+
} = menuConf;
|
|
482
|
+
if (breadcrumb) {
|
|
483
|
+
if (breadcrumb.overwrite) {
|
|
484
|
+
navConfig.breadcrumb = breadcrumb.items;
|
|
485
|
+
} else {
|
|
486
|
+
navConfig.breadcrumb.push(...breadcrumb.items);
|
|
455
487
|
}
|
|
456
488
|
}
|
|
457
489
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Router.js","names":["_history2","require","_loader","_http","_lodash","_history3","_Renderer","_DataStore","_resolveData","_mount","_matchStoryboard","_StoryboardFunctions","_RendererContext","_themeAndMode","_Runtime","_getPageInfo","_markAsComputed","_handleHttpError","_abortController","_registerCustomTemplates","_fulfilStoryboard","_enums","_insertPreviewRoutes","_storyboards","WeakMap","_rendering","_prevLocation","_nextLocation","_runtimeContext","_rendererContext","_rendererContextTrashCan","_redirectCount","_renderId","_currentApp","_previousApp","_navConfig","_getBlockMessageBeforePageLave","WeakSet","_safeRedirect","_queuedRender","_render","Router","constructor","storyboards","_classPrivateMethodInitSpec2","default","_classPrivateFieldInitSpec2","writable","value","Set","_classPrivateFieldSet2","history","getHistory","window","addEventListener","event","message","_classPrivateMethodGet2","_getBlockMessageBeforePageLave2","call","preventDefault","returnValue","block","location","action","getRenderId","_classPrivateFieldGet6","getRuntimeContext","getRecentApps","currentApp","previousApp","getNavConfig","bootstrap","initAbortController","listen","_classPrivateFieldGet2","_location$state","_classPrivateFieldGet3","ignoreRendering","omittedLocationProps","hash","undefined","state","key","notify","locationsAreEqual","abortPendingRequest","dispatchPageLeave","storyboard","matchStoryboard","pathname","isOutsideApp","reload","_queuedRender2","catch","handleHttpError","exports","detail","_classPrivateFieldGet4","previousMessage","getBlockMessage","dispatchBeforePageLeave","unblock","_safeRedirect2","to","from","_this$redirectCount","_this$redirectCount2","search","process","env","NODE_ENV","console","error","Error","replace","_render2","nextLocation","_hooks$flowApi","_classPrivateFieldGet5","uniqueId","resetAllComputedMarks","clearResolveCache","hooks","flowApi","clearCollectWidgetContract","renderStartTime","performance","now","app","fulfilStoryboard","appChanged","id","flags","getRuntime","getFeatureFlags","prevRendererContext","redirectTo","add","redirectToLogin","main","document","querySelector","portal","renderRoot","tag","RenderTag","ROOT","container","createPortal","cleanUpPreviousRender","_hooks$messageDispatc","unmountTree","item","dispatchOnUnmount","dispose","clear","messageDispatcher","reset","dispatchEvent","CustomEvent","setTheme","getLocalAppsTheme","theme","setMode","_hooks$checkInstalled","_hooks$auth","_hooks$checkPermissio","_storyboard$meta","_hooks$flowApi2","_storyboard$meta2","checkInstalledApps","preCheckInstalledApps","appId","_internalApiGetAppInBootstrapData","rendererContext","RendererContext","runtimeContext","query","URLSearchParams","sys","auth","getAuth","getPageInfo","settings","brand","getBrandSettings","ctxStore","DataStore","pendingPermissionsPreCheck","checkPermissions","preCheckPermissions","tplStateStoreMap","Map","formStateStoreMap","registerCustomTemplates","registerStoryboardFunctions","meta","functions","collectContract","contracts","failed","output","stores","renderRoutes","insertPreviewRoutes","routes","unauthenticated","redirect","path","flushStableLoadBricks","values","Promise","all","blockingList","map","store","waitForAll","menuConfs","menuRequests","mergeMenuConfs","isUnauthenticatedError","NO_AUTH_GUARD","HttpAbortError","node","BRICK","type","properties","textContent","httpErrorToString","return","child","route","dispatchBeforePageLoad","applyTheme","applyMode","mountTree","scrollTo","handleAsyncAfterMount","dispatchPageLoad","dispatchAnchorLoad","dispatchOnMount","initializeScrollIntoView","initializeMediaChange","initializeMessageDispatcher","renderTime","isLoggedIn","navConfig","breadcrumb","menuConf","overwrite","items","push"],"sources":["../../../src/internal/Router.ts"],"sourcesContent":["import { Action, locationsAreEqual } from \"history\";\nimport { flushStableLoadBricks } from \"@next-core/loader\";\nimport type {\n BreadcrumbItemConf,\n MicroApp,\n StaticMenuConf,\n Storyboard,\n} from \"@next-core/types\";\nimport { HttpAbortError } from \"@next-core/http\";\nimport { uniqueId } from \"lodash\";\nimport { NextHistoryState, NextLocation, getHistory } from \"../history.js\";\nimport { RenderOutput, renderRoutes } from \"./Renderer.js\";\nimport { DataStore } from \"./data/DataStore.js\";\nimport { clearResolveCache } from \"./data/resolveData.js\";\nimport { mountTree, unmountTree } from \"./mount.js\";\nimport { isOutsideApp, matchStoryboard } from \"./matchStoryboard.js\";\nimport { registerStoryboardFunctions } from \"./compute/StoryboardFunctions.js\";\nimport { RendererContext } from \"./RendererContext.js\";\nimport {\n applyMode,\n applyTheme,\n getLocalAppsTheme,\n setMode,\n setTheme,\n} from \"../themeAndMode.js\";\nimport {\n _internalApiGetAppInBootstrapData,\n getRuntime,\n hooks,\n} from \"./Runtime.js\";\nimport { getPageInfo } from \"../getPageInfo.js\";\nimport type { RenderBrick, RenderRoot, RuntimeContext } from \"./interfaces.js\";\nimport { resetAllComputedMarks } from \"./compute/markAsComputed.js\";\nimport {\n handleHttpError,\n httpErrorToString,\n isUnauthenticatedError,\n} from \"../handleHttpError.js\";\nimport { abortPendingRequest, initAbortController } from \"./abortController.js\";\nimport { registerCustomTemplates } from \"./registerCustomTemplates.js\";\nimport { fulfilStoryboard } from \"./fulfilStoryboard.js\";\nimport { RenderTag } from \"./enums.js\";\nimport { insertPreviewRoutes } from \"./insertPreviewRoutes.js\";\n\nexport class Router {\n readonly #storyboards: Storyboard[];\n #rendering = false;\n #prevLocation!: NextLocation;\n #nextLocation?: NextLocation;\n #runtimeContext?: RuntimeContext;\n #rendererContext?: RendererContext;\n #rendererContextTrashCan = new Set<RendererContext | undefined>();\n #redirectCount = 0;\n #renderId?: string;\n #currentApp?: MicroApp;\n #previousApp?: MicroApp;\n #navConfig?: {\n breadcrumb?: BreadcrumbItemConf[];\n };\n\n constructor(storyboards: Storyboard[]) {\n this.#storyboards = storyboards;\n\n const history = getHistory();\n window.addEventListener(\"beforeunload\", (event) => {\n const message = this.#getBlockMessageBeforePageLave({});\n // See examples in https://developer.mozilla.org/en-US/docs/Web/API/WindowEventHandlers/onbeforeunload\n if (message) {\n // Cancel the event\n // If you prevent default behavior in Mozilla Firefox prompt will always be shown\n event.preventDefault();\n // Chrome requires returnValue to be set\n event.returnValue = \"\";\n } else {\n // the absence of a returnValue property on the event will guarantee the browser unload happens\n delete event.returnValue;\n }\n });\n\n history.block((location, action) =>\n this.#getBlockMessageBeforePageLave({ location, action })\n );\n }\n\n getRenderId() {\n return this.#renderId;\n }\n\n getRuntimeContext() {\n return this.#runtimeContext;\n }\n\n getRecentApps() {\n return {\n currentApp: this.#currentApp,\n previousApp: this.#previousApp,\n };\n }\n\n getNavConfig() {\n return this.#navConfig;\n }\n\n #getBlockMessageBeforePageLave(detail: {\n location?: NextLocation;\n action?: Action;\n }): string | undefined {\n const history = getHistory();\n const previousMessage = history.getBlockMessage();\n this.#rendererContext?.dispatchBeforePageLeave(detail);\n const message = history.getBlockMessage();\n if (!previousMessage && message) {\n // Auto unblock only if new block was introduced by `onBeforePageLeave`.\n history.unblock();\n }\n return message;\n }\n\n #safeRedirect(\n to: string,\n state: NextHistoryState | undefined,\n from: NextLocation\n ): void {\n if (this.#redirectCount++ > 10) {\n const message = `Infinite redirect detected: from \"${from.pathname}${from.search}${from.hash}\" to \"${to}\"`;\n // istanbul ignore else: error cannot be caught in test\n if (process.env.NODE_ENV === \"test\") {\n // eslint-disable-next-line no-console\n console.error(message);\n return;\n } else {\n throw new Error(message);\n }\n }\n getHistory().replace(to, state);\n }\n\n bootstrap() {\n initAbortController();\n const history = getHistory();\n this.#prevLocation = history.location;\n history.listen((location, action) => {\n let ignoreRendering = false;\n const omittedLocationProps: Partial<NextLocation> = {\n hash: undefined,\n state: undefined,\n };\n // Omit the \"key\" when checking whether locations are equal in certain situations.\n if (\n // When current location is triggered by browser action of hash link.\n location.key === undefined ||\n // When current location is triggered by browser action of non-push-or-replace,\n // such as goBack or goForward,\n (action === \"POP\" &&\n // and the previous location was triggered by hash link,\n (this.#prevLocation.key === undefined ||\n // or the previous location specified notify false.\n this.#prevLocation.state?.notify === false))\n ) {\n omittedLocationProps.key = undefined;\n }\n if (\n locationsAreEqual(\n { ...this.#prevLocation, ...omittedLocationProps },\n { ...location, ...omittedLocationProps }\n ) ||\n (action !== \"POP\" && location.state?.notify === false)\n ) {\n // Ignore rendering if location not changed except hash, state and optional key.\n // Ignore rendering if notify is `false`.\n ignoreRendering = true;\n }\n if (ignoreRendering) {\n this.#prevLocation = location;\n return;\n }\n abortPendingRequest();\n this.#prevLocation = location;\n this.#rendererContext?.dispatchPageLeave();\n\n if (action === \"POP\") {\n const storyboard = matchStoryboard(\n this.#storyboards,\n location.pathname\n );\n // When a browser action of goBack or goForward is performing,\n // force reload when the target page is a page of an outside app.\n if (isOutsideApp(storyboard)) {\n window.location.reload();\n return;\n }\n }\n\n if (this.#rendering) {\n this.#nextLocation = location;\n } else {\n // devtoolsHookEmit(\"locationChange\");\n this.#queuedRender(location).catch(handleHttpError);\n }\n });\n return this.#queuedRender(history.location);\n }\n\n async #queuedRender(location: NextLocation): Promise<void> {\n this.#rendering = true;\n try {\n await this.#render(location);\n } finally {\n this.#rendering = false;\n if (this.#nextLocation) {\n const nextLocation = this.#nextLocation;\n this.#nextLocation = undefined;\n await this.#queuedRender(nextLocation);\n }\n }\n }\n\n async #render(location: NextLocation): Promise<void> {\n this.#renderId = uniqueId(\"render-id-1\");\n\n resetAllComputedMarks();\n clearResolveCache();\n hooks?.flowApi?.clearCollectWidgetContract();\n\n const history = getHistory();\n history.unblock();\n\n const renderStartTime = performance.now();\n\n const storyboard = matchStoryboard(this.#storyboards, location.pathname);\n\n const previousApp = this.#runtimeContext?.app;\n if (storyboard?.app) {\n await fulfilStoryboard(storyboard);\n }\n const currentApp = (this.#currentApp = storyboard?.app);\n\n // Storyboard maybe re-assigned, e.g. when open launchpad.\n const appChanged =\n previousApp && currentApp\n ? previousApp.id !== currentApp.id\n : previousApp !== currentApp;\n\n // TODO: handle favicon\n\n // Set `Router::#currentApp` before calling `getFeatureFlags()`\n const flags = getRuntime().getFeatureFlags();\n const prevRendererContext = this.#rendererContext;\n\n const redirectTo = (to: string, state?: NextHistoryState): void => {\n this.#rendererContextTrashCan.add(prevRendererContext);\n this.#safeRedirect(to, state, location);\n };\n\n const redirectToLogin = (): void => {\n const to = flags[\"sso-enabled\"] ? \"/sso-auth/login\" : \"/auth/login\";\n redirectTo(to, { from: location });\n };\n\n const main = document.querySelector(\"#main-mount-point\") as HTMLElement;\n const portal = document.querySelector(\"#portal-mount-point\") as HTMLElement;\n\n const renderRoot: RenderRoot = {\n tag: RenderTag.ROOT,\n container: main,\n createPortal: portal,\n };\n\n const cleanUpPreviousRender = (): void => {\n unmountTree(main);\n unmountTree(portal);\n\n // Note: redirects can lead to multiple trash renderer contexts.\n this.#rendererContextTrashCan.add(prevRendererContext);\n for (const item of this.#rendererContextTrashCan) {\n if (item) {\n item.dispatchOnUnmount();\n item.dispose();\n }\n }\n this.#rendererContextTrashCan.clear();\n hooks?.messageDispatcher?.reset();\n\n if (appChanged) {\n this.#previousApp = previousApp;\n window.dispatchEvent(\n new CustomEvent(\"app.change\", {\n detail: {\n previousApp,\n currentApp,\n },\n })\n );\n }\n };\n\n setTheme(\n (currentApp &&\n (getLocalAppsTheme()[currentApp.id] || currentApp.theme)) ||\n \"light\"\n );\n setMode(\"default\");\n\n if (currentApp) {\n hooks?.checkInstalledApps?.preCheckInstalledApps(\n storyboard,\n (appId) => !!_internalApiGetAppInBootstrapData(appId)\n );\n\n const rendererContext = (this.#rendererContext = new RendererContext(\n \"page\"\n ));\n\n const runtimeContext: RuntimeContext = (this.#runtimeContext = {\n app: currentApp,\n location,\n query: new URLSearchParams(location.search),\n flags,\n sys: {\n ...hooks?.auth?.getAuth(),\n ...getPageInfo(),\n settings: {\n brand: getRuntime().getBrandSettings(),\n },\n },\n ctxStore: new DataStore(\"CTX\", undefined, rendererContext),\n pendingPermissionsPreCheck: [\n hooks?.checkPermissions?.preCheckPermissions(storyboard),\n ],\n tplStateStoreMap: new Map<string, DataStore<\"STATE\">>(),\n formStateStoreMap: new Map<string, DataStore<\"FORM_STATE\">>(),\n });\n\n this.#navConfig = undefined;\n\n registerCustomTemplates(storyboard);\n registerStoryboardFunctions(storyboard.meta?.functions, currentApp);\n hooks?.flowApi?.collectContract(storyboard.meta?.contracts);\n\n let failed = false;\n let output: RenderOutput;\n let stores: DataStore<\"CTX\" | \"STATE\" | \"FORM_STATE\">[] = [];\n\n try {\n output = await renderRoutes(\n renderRoot,\n insertPreviewRoutes(storyboard.routes),\n runtimeContext,\n rendererContext\n );\n if (output.unauthenticated) {\n redirectToLogin();\n return;\n }\n if (output.redirect) {\n redirectTo(output.redirect.path, output.redirect.state);\n return;\n }\n // Reset redirect count if no redirect is set.\n this.#redirectCount = 0;\n\n flushStableLoadBricks();\n\n stores = [\n runtimeContext.ctxStore,\n ...runtimeContext.tplStateStoreMap.values(),\n ...runtimeContext.formStateStoreMap.values(),\n ];\n\n await Promise.all([\n ...output.blockingList,\n ...stores.map((store) => store.waitForAll()),\n ...runtimeContext.pendingPermissionsPreCheck,\n ]);\n\n const menuConfs = await Promise.all(output.menuRequests);\n this.#navConfig = mergeMenuConfs(menuConfs);\n } catch (error) {\n // eslint-disable-next-line no-console\n console.error(\"Router failed:\", error);\n\n if (isUnauthenticatedError(error) && !window.NO_AUTH_GUARD) {\n redirectToLogin();\n return;\n } else if (error instanceof HttpAbortError) {\n this.#rendererContextTrashCan.add(prevRendererContext);\n return;\n } else {\n failed = true;\n output = {\n node: {\n tag: RenderTag.BRICK,\n type: \"div\",\n properties: {\n textContent: httpErrorToString(error),\n },\n runtimeContext: null!,\n return: renderRoot,\n },\n blockingList: [],\n menuRequests: [],\n };\n }\n }\n renderRoot.child = output.node;\n\n cleanUpPreviousRender();\n\n if ((output.route && output.route.type !== \"routes\") || failed) {\n if (!failed) {\n // There is a window to set theme and mode by `lifeCycle.onBeforePageLoad`.\n rendererContext.dispatchBeforePageLoad();\n }\n applyTheme();\n applyMode();\n\n mountTree(renderRoot);\n\n // Scroll to top after each rendering.\n // See https://github.com/ReactTraining/react-router/blob/master/packages/react-router-dom/docs/guides/scroll-restoration.md\n window.scrollTo(0, 0);\n\n if (!failed) {\n for (const store of stores) {\n store.handleAsyncAfterMount();\n }\n\n rendererContext.dispatchPageLoad();\n rendererContext.dispatchAnchorLoad();\n rendererContext.dispatchOnMount();\n rendererContext.initializeScrollIntoView();\n rendererContext.initializeMediaChange();\n rendererContext.initializeMessageDispatcher();\n }\n\n const renderTime = performance.now() - renderStartTime;\n window.dispatchEvent(\n new CustomEvent(\"route.render\", {\n detail: {\n renderTime,\n },\n })\n );\n\n return;\n }\n } else if (\n !window.NO_AUTH_GUARD &&\n hooks?.auth &&\n !hooks.auth.isLoggedIn()\n ) {\n // Todo(steve): refine after api-gateway supports fetching storyboards before logged in.\n // Redirect to login if no storyboard is matched.\n redirectToLogin();\n return;\n } else {\n cleanUpPreviousRender();\n }\n\n applyTheme();\n applyMode();\n\n const node: RenderBrick = {\n tag: RenderTag.BRICK,\n type: \"div\",\n properties: {\n textContent: \"Page not found\",\n },\n runtimeContext: null!,\n return: renderRoot,\n };\n renderRoot.child = node;\n\n mountTree(renderRoot);\n\n // Scroll to top after each rendering.\n window.scrollTo(0, 0);\n }\n}\n\nfunction mergeMenuConfs(menuConfs: (StaticMenuConf | undefined)[]) {\n const navConfig = {\n breadcrumb: [] as BreadcrumbItemConf[],\n };\n for (const menuConf of menuConfs) {\n if (menuConf) {\n const { breadcrumb } = menuConf;\n if (breadcrumb) {\n if (breadcrumb.overwrite) {\n navConfig.breadcrumb = breadcrumb.items;\n } else {\n navConfig.breadcrumb.push(...breadcrumb.items);\n }\n }\n }\n }\n return navConfig;\n}\n"],"mappings":";;;;;;;;;;;;AAAA,IAAAA,SAAA,GAAAC,OAAA;AACA,IAAAC,OAAA,GAAAD,OAAA;AAOA,IAAAE,KAAA,GAAAF,OAAA;AACA,IAAAG,OAAA,GAAAH,OAAA;AACA,IAAAI,SAAA,GAAAJ,OAAA;AACA,IAAAK,SAAA,GAAAL,OAAA;AACA,IAAAM,UAAA,GAAAN,OAAA;AACA,IAAAO,YAAA,GAAAP,OAAA;AACA,IAAAQ,MAAA,GAAAR,OAAA;AACA,IAAAS,gBAAA,GAAAT,OAAA;AACA,IAAAU,oBAAA,GAAAV,OAAA;AACA,IAAAW,gBAAA,GAAAX,OAAA;AACA,IAAAY,aAAA,GAAAZ,OAAA;AAOA,IAAAa,QAAA,GAAAb,OAAA;AAKA,IAAAc,YAAA,GAAAd,OAAA;AAEA,IAAAe,eAAA,GAAAf,OAAA;AACA,IAAAgB,gBAAA,GAAAhB,OAAA;AAKA,IAAAiB,gBAAA,GAAAjB,OAAA;AACA,IAAAkB,wBAAA,GAAAlB,OAAA;AACA,IAAAmB,iBAAA,GAAAnB,OAAA;AACA,IAAAoB,MAAA,GAAApB,OAAA;AACA,IAAAqB,oBAAA,GAAArB,OAAA;AAA+D,IAAAsB,YAAA,oBAAAC,OAAA;AAAA,IAAAC,UAAA,oBAAAD,OAAA;AAAA,IAAAE,aAAA,oBAAAF,OAAA;AAAA,IAAAG,aAAA,oBAAAH,OAAA;AAAA,IAAAI,eAAA,oBAAAJ,OAAA;AAAA,IAAAK,gBAAA,oBAAAL,OAAA;AAAA,IAAAM,wBAAA,oBAAAN,OAAA;AAAA,IAAAO,cAAA,oBAAAP,OAAA;AAAA,IAAAQ,SAAA,oBAAAR,OAAA;AAAA,IAAAS,WAAA,oBAAAT,OAAA;AAAA,IAAAU,YAAA,oBAAAV,OAAA;AAAA,IAAAW,UAAA,oBAAAX,OAAA;AAAA,IAAAY,8BAAA,oBAAAC,OAAA;AAAA,IAAAC,aAAA,oBAAAD,OAAA;AAAA,IAAAE,aAAA,oBAAAF,OAAA;AAAA,IAAAG,OAAA,oBAAAH,OAAA;AAExD,MAAMI,MAAM,CAAC;EAgBlBC,WAAWA,CAACC,WAAyB,EAAE;IAAA,IAAAC,4BAAA,CAAAC,OAAA,QAAAL,OAAA;IAAA,IAAAI,4BAAA,CAAAC,OAAA,QAAAN,aAAA;IAAA,IAAAK,4BAAA,CAAAC,OAAA,QAAAP,aAAA;IAAA,IAAAM,4BAAA,CAAAC,OAAA,QAAAT,8BAAA;IAAA,IAAAU,2BAAA,CAAAD,OAAA,QAAAtB,YAAA;MAAAwB,QAAA;MAAAC,KAAA;IAAA;IAAA,IAAAF,2BAAA,CAAAD,OAAA,QAAApB,UAAA;MAAAsB,QAAA;MAAAC,KAAA,EAd1B;IAAK;IAAA,IAAAF,2BAAA,CAAAD,OAAA,QAAAnB,aAAA;MAAAqB,QAAA;MAAAC,KAAA;IAAA;IAAA,IAAAF,2BAAA,CAAAD,OAAA,QAAAlB,aAAA;MAAAoB,QAAA;MAAAC,KAAA;IAAA;IAAA,IAAAF,2BAAA,CAAAD,OAAA,QAAAjB,eAAA;MAAAmB,QAAA;MAAAC,KAAA;IAAA;IAAA,IAAAF,2BAAA,CAAAD,OAAA,QAAAhB,gBAAA;MAAAkB,QAAA;MAAAC,KAAA;IAAA;IAAA,IAAAF,2BAAA,CAAAD,OAAA,QAAAf,wBAAA;MAAAiB,QAAA;MAAAC,KAAA,EAKS,IAAIC,GAAG,CAA8B;IAAC;IAAA,IAAAH,2BAAA,CAAAD,OAAA,QAAAd,cAAA;MAAAgB,QAAA;MAAAC,KAAA,EAChD;IAAC;IAAA,IAAAF,2BAAA,CAAAD,OAAA,QAAAb,SAAA;MAAAe,QAAA;MAAAC,KAAA;IAAA;IAAA,IAAAF,2BAAA,CAAAD,OAAA,QAAAZ,WAAA;MAAAc,QAAA;MAAAC,KAAA;IAAA;IAAA,IAAAF,2BAAA,CAAAD,OAAA,QAAAX,YAAA;MAAAa,QAAA;MAAAC,KAAA;IAAA;IAAA,IAAAF,2BAAA,CAAAD,OAAA,QAAAV,UAAA;MAAAY,QAAA;MAAAC,KAAA;IAAA;IAShB,IAAAE,sBAAA,CAAAL,OAAA,MAAI,EAAAtB,YAAA,EAAgBoB,WAAW;IAE/B,MAAMQ,QAAO,GAAG,IAAAC,oBAAU,EAAC,CAAC;IAC5BC,MAAM,CAACC,gBAAgB,CAAC,cAAc,EAAGC,KAAK,IAAK;MACjD,MAAMC,OAAO,OAAAC,uBAAA,CAAAZ,OAAA,EAAG,IAAI,EAAAT,8BAAA,EAAAsB,+BAAA,EAAAC,IAAA,CAAJ,IAAI,EAAgC,CAAC,CAAC,CAAC;MACvD;MACA,IAAIH,OAAO,EAAE;QACX;QACA;QACAD,KAAK,CAACK,cAAc,CAAC,CAAC;QACtB;QACAL,KAAK,CAACM,WAAW,GAAG,EAAE;MACxB,CAAC,MAAM;QACL;QACA,OAAON,KAAK,CAACM,WAAW;MAC1B;IACF,CAAC,CAAC;IAEFV,QAAO,CAACW,KAAK,CAAC,CAACC,QAAQ,EAAEC,MAAM,SAAAP,uBAAA,CAAAZ,OAAA,EAC7B,IAAI,EAAAT,8BAAA,EAAAsB,+BAAA,EAAAC,IAAA,CAAJ,IAAI,EAAgC;MAAEI,QAAQ;MAAEC;IAAO,CAAC,CAC1D,CAAC;EACH;EAEAC,WAAWA,CAAA,EAAG;IACZ,WAAAC,sBAAA,CAAArB,OAAA,EAAO,IAAI,EAAAb,SAAA;EACb;EAEAmC,iBAAiBA,CAAA,EAAG;IAClB,WAAAD,sBAAA,CAAArB,OAAA,EAAO,IAAI,EAAAjB,eAAA;EACb;EAEAwC,aAAaA,CAAA,EAAG;IACd,OAAO;MACLC,UAAU,MAAAH,sBAAA,CAAArB,OAAA,EAAE,IAAI,EAAAZ,WAAA,CAAY;MAC5BqC,WAAW,MAAAJ,sBAAA,CAAArB,OAAA,EAAE,IAAI,EAAAX,YAAA;IACnB,CAAC;EACH;EAEAqC,YAAYA,CAAA,EAAG;IACb,WAAAL,sBAAA,CAAArB,OAAA,EAAO,IAAI,EAAAV,UAAA;EACb;EAoCAqC,SAASA,CAAA,EAAG;IACV,IAAAC,oCAAmB,EAAC,CAAC;IACrB,MAAMtB,OAAO,GAAG,IAAAC,oBAAU,EAAC,CAAC;IAC5B,IAAAF,sBAAA,CAAAL,OAAA,MAAI,EAAAnB,aAAA,EAAiByB,OAAO,CAACY,QAAQ;IACrCZ,OAAO,CAACuB,MAAM,CAAC,CAACX,QAAQ,EAAEC,MAAM,KAAK;MAAA,IAAAW,sBAAA,EAAAC,eAAA,EAAAC,sBAAA;MACnC,IAAIC,eAAe,GAAG,KAAK;MAC3B,MAAMC,oBAA2C,GAAG;QAClDC,IAAI,EAAEC,SAAS;QACfC,KAAK,EAAED;MACT,CAAC;MACD;MACA;MACE;MACAlB,QAAQ,CAACoB,GAAG,KAAKF,SAAS;MAC1B;MACA;MACCjB,MAAM,KAAK,KAAK;MACf;MACC,IAAAE,sBAAA,CAAArB,OAAA,MAAI,EAAAnB,aAAA,EAAeyD,GAAG,KAAKF,SAAS;MACnC;MACA,EAAAN,sBAAA,OAAAT,sBAAA,CAAArB,OAAA,MAAI,EAAAnB,aAAA,EAAewD,KAAK,cAAAP,sBAAA,uBAAxBA,sBAAA,CAA0BS,MAAM,MAAK,KAAK,CAAE,EAChD;QACAL,oBAAoB,CAACI,GAAG,GAAGF,SAAS;MACtC;MACA,IACE,IAAAI,2BAAiB,EACf;QAAE,OAAAnB,sBAAA,CAAArB,OAAA,EAAG,IAAI,EAAAnB,aAAA,CAAc;QAAE,GAAGqD;MAAqB,CAAC,EAClD;QAAE,GAAGhB,QAAQ;QAAE,GAAGgB;MAAqB,CACzC,CAAC,IACAf,MAAM,KAAK,KAAK,IAAI,EAAAY,eAAA,GAAAb,QAAQ,CAACmB,KAAK,cAAAN,eAAA,uBAAdA,eAAA,CAAgBQ,MAAM,MAAK,KAAM,EACtD;QACA;QACA;QACAN,eAAe,GAAG,IAAI;MACxB;MACA,IAAIA,eAAe,EAAE;QACnB,IAAA5B,sBAAA,CAAAL,OAAA,MAAI,EAAAnB,aAAA,EAAiBqC,QAAQ;QAC7B;MACF;MACA,IAAAuB,oCAAmB,EAAC,CAAC;MACrB,IAAApC,sBAAA,CAAAL,OAAA,MAAI,EAAAnB,aAAA,EAAiBqC,QAAQ;MAC7B,CAAAc,sBAAA,OAAAX,sBAAA,CAAArB,OAAA,MAAI,EAAAhB,gBAAA,eAAAgD,sBAAA,uBAAJA,sBAAA,CAAuBU,iBAAiB,CAAC,CAAC;MAE1C,IAAIvB,MAAM,KAAK,KAAK,EAAE;QACpB,MAAMwB,UAAU,GAAG,IAAAC,gCAAe,MAAAvB,sBAAA,CAAArB,OAAA,EAChC,IAAI,EAAAtB,YAAA,GACJwC,QAAQ,CAAC2B,QACX,CAAC;QACD;QACA;QACA,IAAI,IAAAC,6BAAY,EAACH,UAAU,CAAC,EAAE;UAC5BnC,MAAM,CAACU,QAAQ,CAAC6B,MAAM,CAAC,CAAC;UACxB;QACF;MACF;MAEA,QAAA1B,sBAAA,CAAArB,OAAA,EAAI,IAAI,EAAApB,UAAA,GAAa;QACnB,IAAAyB,sBAAA,CAAAL,OAAA,MAAI,EAAAlB,aAAA,EAAiBoC,QAAQ;MAC/B,CAAC,MAAM;QACL;QACA,IAAAN,uBAAA,CAAAZ,OAAA,MAAI,EAAAN,aAAA,EAAAsD,cAAA,EAAAlC,IAAA,CAAJ,IAAI,EAAeI,QAAQ,EAAE+B,KAAK,CAACC,gCAAe,CAAC;MACrD;IACF,CAAC,CAAC;IACF,WAAAtC,uBAAA,CAAAZ,OAAA,EAAO,IAAI,EAAAN,aAAA,EAAAsD,cAAA,EAAAlC,IAAA,CAAJ,IAAI,EAAeR,OAAO,CAACY,QAAQ;EAC5C;AAqRF;AAACiC,OAAA,CAAAvD,MAAA,GAAAA,MAAA;AAAA,SAAAiB,gCAvXgCuC,MAG9B,EAAsB;EAAA,IAAAC,sBAAA;EACrB,MAAM/C,OAAO,GAAG,IAAAC,oBAAU,EAAC,CAAC;EAC5B,MAAM+C,eAAe,GAAGhD,OAAO,CAACiD,eAAe,CAAC,CAAC;EACjD,CAAAF,sBAAA,OAAAhC,sBAAA,CAAArB,OAAA,MAAI,EAAAhB,gBAAA,eAAAqE,sBAAA,uBAAJA,sBAAA,CAAuBG,uBAAuB,CAACJ,MAAM,CAAC;EACtD,MAAMzC,OAAO,GAAGL,OAAO,CAACiD,eAAe,CAAC,CAAC;EACzC,IAAI,CAACD,eAAe,IAAI3C,OAAO,EAAE;IAC/B;IACAL,OAAO,CAACmD,OAAO,CAAC,CAAC;EACnB;EACA,OAAO9C,OAAO;AAChB;AAAC,SAAA+C,eAGCC,EAAU,EACVtB,KAAmC,EACnCuB,IAAkB,EACZ;EAAA,IAAAC,mBAAA,EAAAC,oBAAA;EACN,IAAI,KAAAzD,sBAAA,CAAAL,OAAA,MAAI,EAAAd,cAAA,GAAA2E,mBAAA,OAAAxC,sBAAA,CAAArB,OAAA,EAAJ,IAAI,EAAAd,cAAA,GAAA4E,oBAAA,GAAAD,mBAAA,IAAAA,mBAAA,IAAAC,oBAAA,IAAoB,EAAE,EAAE;IAC9B,MAAMnD,OAAO,GAAI,qCAAoCiD,IAAI,CAACf,QAAS,GAAEe,IAAI,CAACG,MAAO,GAAEH,IAAI,CAACzB,IAAK,SAAQwB,EAAG,GAAE;IAC1G;IACA,IAAIK,OAAO,CAACC,GAAG,CAACC,QAAQ,KAAK,MAAM,EAAE;MACnC;MACAC,OAAO,CAACC,KAAK,CAACzD,OAAO,CAAC;MACtB;IACF,CAAC,MAAM;MACL,MAAM,IAAI0D,KAAK,CAAC1D,OAAO,CAAC;IAC1B;EACF;EACA,IAAAJ,oBAAU,EAAC,CAAC,CAAC+D,OAAO,CAACX,EAAE,EAAEtB,KAAK,CAAC;AACjC;AAAC,eAAAW,eAoEmB9B,QAAsB,EAAiB;EACzD,IAAAb,sBAAA,CAAAL,OAAA,MAAI,EAAApB,UAAA,EAAc,IAAI;EACtB,IAAI;IACF,UAAAgC,uBAAA,CAAAZ,OAAA,EAAM,IAAI,EAAAL,OAAA,EAAA4E,QAAA,EAAAzD,IAAA,CAAJ,IAAI,EAASI,QAAQ,CAAC;EAC9B,CAAC,SAAS;IACR,IAAAb,sBAAA,CAAAL,OAAA,MAAI,EAAApB,UAAA,EAAc,KAAK;IACvB,QAAAyC,sBAAA,CAAArB,OAAA,EAAI,IAAI,EAAAlB,aAAA,GAAgB;MACtB,MAAM0F,YAAY,OAAAnD,sBAAA,CAAArB,OAAA,EAAG,IAAI,EAAAlB,aAAA,CAAc;MACvC,IAAAuB,sBAAA,CAAAL,OAAA,MAAI,EAAAlB,aAAA,EAAiBsD,SAAS;MAC9B,UAAAxB,uBAAA,CAAAZ,OAAA,EAAM,IAAI,EAAAN,aAAA,EAAAsD,cAAA,EAAAlC,IAAA,CAAJ,IAAI,EAAe0D,YAAY,CAAC;IACxC;EACF;AACF;AAAC,eAAAD,SAEarD,QAAsB,EAAiB;EAAA,IAAAuD,cAAA,EAAAC,sBAAA;EACnD,IAAArE,sBAAA,CAAAL,OAAA,MAAI,EAAAb,SAAA,EAAa,IAAAwF,gBAAQ,EAAC,aAAa,CAAC;EAExC,IAAAC,qCAAqB,EAAC,CAAC;EACvB,IAAAC,8BAAiB,EAAC,CAAC;EACnBC,cAAK,aAALA,cAAK,gBAAAL,cAAA,GAALK,cAAK,CAAEC,OAAO,cAAAN,cAAA,uBAAdA,cAAA,CAAgBO,0BAA0B,CAAC,CAAC;EAE5C,MAAM1E,OAAO,GAAG,IAAAC,oBAAU,EAAC,CAAC;EAC5BD,OAAO,CAACmD,OAAO,CAAC,CAAC;EAEjB,MAAMwB,eAAe,GAAGC,WAAW,CAACC,GAAG,CAAC,CAAC;EAEzC,MAAMxC,UAAU,GAAG,IAAAC,gCAAe,MAAAvB,sBAAA,CAAArB,OAAA,EAAC,IAAI,EAAAtB,YAAA,GAAewC,QAAQ,CAAC2B,QAAQ,CAAC;EAExE,MAAMpB,WAAW,IAAAiD,sBAAA,OAAArD,sBAAA,CAAArB,OAAA,EAAG,IAAI,EAAAjB,eAAA,eAAA2F,sBAAA,uBAAJA,sBAAA,CAAsBU,GAAG;EAC7C,IAAIzC,UAAU,aAAVA,UAAU,eAAVA,UAAU,CAAEyC,GAAG,EAAE;IACnB,MAAM,IAAAC,kCAAgB,EAAC1C,UAAU,CAAC;EACpC;EACA,MAAMnB,UAAU,OAAAnB,sBAAA,CAAAL,OAAA,EAAI,IAAI,EAAAZ,WAAA,EAAeuD,UAAU,aAAVA,UAAU,uBAAVA,UAAU,CAAEyC,GAAG,CAAC;;EAEvD;EACA,MAAME,UAAU,GACd7D,WAAW,IAAID,UAAU,GACrBC,WAAW,CAAC8D,EAAE,KAAK/D,UAAU,CAAC+D,EAAE,GAChC9D,WAAW,KAAKD,UAAU;;EAEhC;;EAEA;EACA,MAAMgE,KAAK,GAAG,IAAAC,mBAAU,EAAC,CAAC,CAACC,eAAe,CAAC,CAAC;EAC5C,MAAMC,mBAAmB,OAAAtE,sBAAA,CAAArB,OAAA,EAAG,IAAI,EAAAhB,gBAAA,CAAiB;EAEjD,MAAM4G,UAAU,GAAGA,CAACjC,EAAU,EAAEtB,KAAwB,KAAW;IACjE,IAAAhB,sBAAA,CAAArB,OAAA,MAAI,EAAAf,wBAAA,EAA0B4G,GAAG,CAACF,mBAAmB,CAAC;IACtD,IAAA/E,uBAAA,CAAAZ,OAAA,MAAI,EAAAP,aAAA,EAAAiE,cAAA,EAAA5C,IAAA,CAAJ,IAAI,EAAe6C,EAAE,EAAEtB,KAAK,EAAEnB,QAAQ;EACxC,CAAC;EAED,MAAM4E,eAAe,GAAGA,CAAA,KAAY;IAClC,MAAMnC,EAAE,GAAG6B,KAAK,CAAC,aAAa,CAAC,GAAG,iBAAiB,GAAG,aAAa;IACnEI,UAAU,CAACjC,EAAE,EAAE;MAAEC,IAAI,EAAE1C;IAAS,CAAC,CAAC;EACpC,CAAC;EAED,MAAM6E,IAAI,GAAGC,QAAQ,CAACC,aAAa,CAAC,mBAAmB,CAAgB;EACvE,MAAMC,MAAM,GAAGF,QAAQ,CAACC,aAAa,CAAC,qBAAqB,CAAgB;EAE3E,MAAME,UAAsB,GAAG;IAC7BC,GAAG,EAAEC,gBAAS,CAACC,IAAI;IACnBC,SAAS,EAAER,IAAI;IACfS,YAAY,EAAEN;EAChB,CAAC;EAED,MAAMO,qBAAqB,GAAGA,CAAA,KAAY;IAAA,IAAAC,qBAAA;IACxC,IAAAC,kBAAW,EAACZ,IAAI,CAAC;IACjB,IAAAY,kBAAW,EAACT,MAAM,CAAC;;IAEnB;IACA,IAAA7E,sBAAA,CAAArB,OAAA,MAAI,EAAAf,wBAAA,EAA0B4G,GAAG,CAACF,mBAAmB,CAAC;IACtD,KAAK,MAAMiB,IAAI,QAAAvF,sBAAA,CAAArB,OAAA,EAAI,IAAI,EAAAf,wBAAA,GAA2B;MAChD,IAAI2H,IAAI,EAAE;QACRA,IAAI,CAACC,iBAAiB,CAAC,CAAC;QACxBD,IAAI,CAACE,OAAO,CAAC,CAAC;MAChB;IACF;IACA,IAAAzF,sBAAA,CAAArB,OAAA,MAAI,EAAAf,wBAAA,EAA0B8H,KAAK,CAAC,CAAC;IACrCjC,cAAK,aAALA,cAAK,gBAAA4B,qBAAA,GAAL5B,cAAK,CAAEkC,iBAAiB,cAAAN,qBAAA,uBAAxBA,qBAAA,CAA0BO,KAAK,CAAC,CAAC;IAEjC,IAAI3B,UAAU,EAAE;MACd,IAAAjF,sBAAA,CAAAL,OAAA,MAAI,EAAAX,YAAA,EAAgBoC,WAAW;MAC/BjB,MAAM,CAAC0G,aAAa,CAClB,IAAIC,WAAW,CAAC,YAAY,EAAE;QAC5B/D,MAAM,EAAE;UACN3B,WAAW;UACXD;QACF;MACF,CAAC,CACH,CAAC;IACH;EACF,CAAC;EAED,IAAA4F,sBAAQ,EACL5F,UAAU,KACR,IAAA6F,+BAAiB,EAAC,CAAC,CAAC7F,UAAU,CAAC+D,EAAE,CAAC,IAAI/D,UAAU,CAAC8F,KAAK,CAAC,IACxD,OACJ,CAAC;EACD,IAAAC,qBAAO,EAAC,SAAS,CAAC;EAElB,IAAI/F,UAAU,EAAE;IAAA,IAAAgG,qBAAA,EAAAC,WAAA,EAAAC,qBAAA,EAAAC,gBAAA,EAAAC,eAAA,EAAAC,iBAAA;IACd/C,cAAK,aAALA,cAAK,gBAAA0C,qBAAA,GAAL1C,cAAK,CAAEgD,kBAAkB,cAAAN,qBAAA,uBAAzBA,qBAAA,CAA2BO,qBAAqB,CAC9CpF,UAAU,EACTqF,KAAK,IAAK,CAAC,CAAC,IAAAC,0CAAiC,EAACD,KAAK,CACtD,CAAC;IAED,MAAME,eAAe,OAAA7H,sBAAA,CAAAL,OAAA,EAAI,IAAI,EAAAhB,gBAAA,EAAoB,IAAImJ,gCAAe,CAClE,MACF,CAAC,CAAC;IAEF,MAAMC,cAA8B,OAAA/H,sBAAA,CAAAL,OAAA,EAAI,IAAI,EAAAjB,eAAA,EAAmB;MAC7DqG,GAAG,EAAE5D,UAAU;MACfN,QAAQ;MACRmH,KAAK,EAAE,IAAIC,eAAe,CAACpH,QAAQ,CAAC6C,MAAM,CAAC;MAC3CyB,KAAK;MACL+C,GAAG,EAAE;QACH,IAAGzD,cAAK,aAALA,cAAK,gBAAA2C,WAAA,GAAL3C,cAAK,CAAE0D,IAAI,cAAAf,WAAA,uBAAXA,WAAA,CAAagB,OAAO,CAAC,CAAC;QACzB,GAAG,IAAAC,wBAAW,EAAC,CAAC;QAChBC,QAAQ,EAAE;UACRC,KAAK,EAAE,IAAAnD,mBAAU,EAAC,CAAC,CAACoD,gBAAgB,CAAC;QACvC;MACF,CAAC;MACDC,QAAQ,EAAE,IAAIC,oBAAS,CAAC,KAAK,EAAE3G,SAAS,EAAE8F,eAAe,CAAC;MAC1Dc,0BAA0B,EAAE,CAC1BlE,cAAK,aAALA,cAAK,gBAAA4C,qBAAA,GAAL5C,cAAK,CAAEmE,gBAAgB,cAAAvB,qBAAA,uBAAvBA,qBAAA,CAAyBwB,mBAAmB,CAACvG,UAAU,CAAC,CACzD;MACDwG,gBAAgB,EAAE,IAAIC,GAAG,CAA6B,CAAC;MACvDC,iBAAiB,EAAE,IAAID,GAAG,CAAkC;IAC9D,CAAC,CAAC;IAEF,IAAA/I,sBAAA,CAAAL,OAAA,MAAI,EAAAV,UAAA,EAAc8C,SAAS;IAE3B,IAAAkH,gDAAuB,EAAC3G,UAAU,CAAC;IACnC,IAAA4G,gDAA2B,GAAA5B,gBAAA,GAAChF,UAAU,CAAC6G,IAAI,cAAA7B,gBAAA,uBAAfA,gBAAA,CAAiB8B,SAAS,EAAEjI,UAAU,CAAC;IACnEsD,cAAK,aAALA,cAAK,gBAAA8C,eAAA,GAAL9C,cAAK,CAAEC,OAAO,cAAA6C,eAAA,uBAAdA,eAAA,CAAgB8B,eAAe,EAAA7B,iBAAA,GAAClF,UAAU,CAAC6G,IAAI,cAAA3B,iBAAA,uBAAfA,iBAAA,CAAiB8B,SAAS,CAAC;IAE3D,IAAIC,MAAM,GAAG,KAAK;IAClB,IAAIC,MAAoB;IACxB,IAAIC,MAAmD,GAAG,EAAE;IAE5D,IAAI;MACFD,MAAM,GAAG,MAAM,IAAAE,sBAAY,EACzB5D,UAAU,EACV,IAAA6D,wCAAmB,EAACrH,UAAU,CAACsH,MAAM,CAAC,EACtC7B,cAAc,EACdF,eACF,CAAC;MACD,IAAI2B,MAAM,CAACK,eAAe,EAAE;QAC1BpE,eAAe,CAAC,CAAC;QACjB;MACF;MACA,IAAI+D,MAAM,CAACM,QAAQ,EAAE;QACnBvE,UAAU,CAACiE,MAAM,CAACM,QAAQ,CAACC,IAAI,EAAEP,MAAM,CAACM,QAAQ,CAAC9H,KAAK,CAAC;QACvD;MACF;MACA;MACA,IAAAhC,sBAAA,CAAAL,OAAA,MAAI,EAAAd,cAAA,EAAkB,CAAC;MAEvB,IAAAmL,6BAAqB,EAAC,CAAC;MAEvBP,MAAM,GAAG,CACP1B,cAAc,CAACU,QAAQ,EACvB,GAAGV,cAAc,CAACe,gBAAgB,CAACmB,MAAM,CAAC,CAAC,EAC3C,GAAGlC,cAAc,CAACiB,iBAAiB,CAACiB,MAAM,CAAC,CAAC,CAC7C;MAED,MAAMC,OAAO,CAACC,GAAG,CAAC,CAChB,GAAGX,MAAM,CAACY,YAAY,EACtB,GAAGX,MAAM,CAACY,GAAG,CAAEC,KAAK,IAAKA,KAAK,CAACC,UAAU,CAAC,CAAC,CAAC,EAC5C,GAAGxC,cAAc,CAACY,0BAA0B,CAC7C,CAAC;MAEF,MAAM6B,SAAS,GAAG,MAAMN,OAAO,CAACC,GAAG,CAACX,MAAM,CAACiB,YAAY,CAAC;MACxD,IAAAzK,sBAAA,CAAAL,OAAA,MAAI,EAAAV,UAAA,EAAcyL,cAAc,CAACF,SAAS,CAAC;IAC7C,CAAC,CAAC,OAAOzG,KAAK,EAAE;MACd;MACAD,OAAO,CAACC,KAAK,CAAC,gBAAgB,EAAEA,KAAK,CAAC;MAEtC,IAAI,IAAA4G,uCAAsB,EAAC5G,KAAK,CAAC,IAAI,CAAC5D,MAAM,CAACyK,aAAa,EAAE;QAC1DnF,eAAe,CAAC,CAAC;QACjB;MACF,CAAC,MAAM,IAAI1B,KAAK,YAAY8G,oBAAc,EAAE;QAC1C,IAAA7J,sBAAA,CAAArB,OAAA,MAAI,EAAAf,wBAAA,EAA0B4G,GAAG,CAACF,mBAAmB,CAAC;QACtD;MACF,CAAC,MAAM;QACLiE,MAAM,GAAG,IAAI;QACbC,MAAM,GAAG;UACPsB,IAAI,EAAE;YACJ/E,GAAG,EAAEC,gBAAS,CAAC+E,KAAK;YACpBC,IAAI,EAAE,KAAK;YACXC,UAAU,EAAE;cACVC,WAAW,EAAE,IAAAC,kCAAiB,EAACpH,KAAK;YACtC,CAAC;YACDgE,cAAc,EAAE,IAAK;YACrBqD,MAAM,EAAEtF;UACV,CAAC;UACDsE,YAAY,EAAE,EAAE;UAChBK,YAAY,EAAE;QAChB,CAAC;MACH;IACF;IACA3E,UAAU,CAACuF,KAAK,GAAG7B,MAAM,CAACsB,IAAI;IAE9B1E,qBAAqB,CAAC,CAAC;IAEvB,IAAKoD,MAAM,CAAC8B,KAAK,IAAI9B,MAAM,CAAC8B,KAAK,CAACN,IAAI,KAAK,QAAQ,IAAKzB,MAAM,EAAE;MAC9D,IAAI,CAACA,MAAM,EAAE;QACX;QACA1B,eAAe,CAAC0D,sBAAsB,CAAC,CAAC;MAC1C;MACA,IAAAC,wBAAU,EAAC,CAAC;MACZ,IAAAC,uBAAS,EAAC,CAAC;MAEX,IAAAC,gBAAS,EAAC5F,UAAU,CAAC;;MAErB;MACA;MACA3F,MAAM,CAACwL,QAAQ,CAAC,CAAC,EAAE,CAAC,CAAC;MAErB,IAAI,CAACpC,MAAM,EAAE;QACX,KAAK,MAAMe,KAAK,IAAIb,MAAM,EAAE;UAC1Ba,KAAK,CAACsB,qBAAqB,CAAC,CAAC;QAC/B;QAEA/D,eAAe,CAACgE,gBAAgB,CAAC,CAAC;QAClChE,eAAe,CAACiE,kBAAkB,CAAC,CAAC;QACpCjE,eAAe,CAACkE,eAAe,CAAC,CAAC;QACjClE,eAAe,CAACmE,wBAAwB,CAAC,CAAC;QAC1CnE,eAAe,CAACoE,qBAAqB,CAAC,CAAC;QACvCpE,eAAe,CAACqE,2BAA2B,CAAC,CAAC;MAC/C;MAEA,MAAMC,UAAU,GAAGtH,WAAW,CAACC,GAAG,CAAC,CAAC,GAAGF,eAAe;MACtDzE,MAAM,CAAC0G,aAAa,CAClB,IAAIC,WAAW,CAAC,cAAc,EAAE;QAC9B/D,MAAM,EAAE;UACNoJ;QACF;MACF,CAAC,CACH,CAAC;MAED;IACF;EACF,CAAC,MAAM,IACL,CAAChM,MAAM,CAACyK,aAAa,IACrBnG,cAAK,aAALA,cAAK,eAALA,cAAK,CAAE0D,IAAI,IACX,CAAC1D,cAAK,CAAC0D,IAAI,CAACiE,UAAU,CAAC,CAAC,EACxB;IACA;IACA;IACA3G,eAAe,CAAC,CAAC;IACjB;EACF,CAAC,MAAM;IACLW,qBAAqB,CAAC,CAAC;EACzB;EAEA,IAAAoF,wBAAU,EAAC,CAAC;EACZ,IAAAC,uBAAS,EAAC,CAAC;EAEX,MAAMX,IAAiB,GAAG;IACxB/E,GAAG,EAAEC,gBAAS,CAAC+E,KAAK;IACpBC,IAAI,EAAE,KAAK;IACXC,UAAU,EAAE;MACVC,WAAW,EAAE;IACf,CAAC;IACDnD,cAAc,EAAE,IAAK;IACrBqD,MAAM,EAAEtF;EACV,CAAC;EACDA,UAAU,CAACuF,KAAK,GAAGP,IAAI;EAEvB,IAAAY,gBAAS,EAAC5F,UAAU,CAAC;;EAErB;EACA3F,MAAM,CAACwL,QAAQ,CAAC,CAAC,EAAE,CAAC,CAAC;AACvB;AAGF,SAASjB,cAAcA,CAACF,SAAyC,EAAE;EACjE,MAAM6B,SAAS,GAAG;IAChBC,UAAU,EAAE;EACd,CAAC;EACD,KAAK,MAAMC,QAAQ,IAAI/B,SAAS,EAAE;IAChC,IAAI+B,QAAQ,EAAE;MACZ,MAAM;QAAED;MAAW,CAAC,GAAGC,QAAQ;MAC/B,IAAID,UAAU,EAAE;QACd,IAAIA,UAAU,CAACE,SAAS,EAAE;UACxBH,SAAS,CAACC,UAAU,GAAGA,UAAU,CAACG,KAAK;QACzC,CAAC,MAAM;UACLJ,SAAS,CAACC,UAAU,CAACI,IAAI,CAAC,GAAGJ,UAAU,CAACG,KAAK,CAAC;QAChD;MACF;IACF;EACF;EACA,OAAOJ,SAAS;AAClB"}
|
|
1
|
+
{"version":3,"file":"Router.js","names":["_history2","require","_http","_lodash","_history3","_Renderer","_DataStore","_resolveData","_mount","_matchStoryboard","_StoryboardFunctions","_RendererContext","_themeAndMode","_Runtime","_getPageInfo","_markAsComputed","_handleHttpError","_abortController","_registerCustomTemplates","_fulfilStoryboard","_enums","_insertPreviewRoutes","_storyboards","WeakMap","_rendering","_prevLocation","_nextLocation","_runtimeContext","_rendererContext","_rendererContextTrashCan","_redirectCount","_renderId","_currentApp","_previousApp","_navConfig","_getBlockMessageBeforePageLave","WeakSet","_safeRedirect","_queuedRender","_render","Router","constructor","storyboards","_classPrivateMethodInitSpec2","default","_classPrivateFieldInitSpec2","writable","value","Set","_classPrivateFieldSet2","history","getHistory","window","addEventListener","event","message","_classPrivateMethodGet2","_getBlockMessageBeforePageLave2","call","preventDefault","returnValue","block","location","action","getRenderId","_classPrivateFieldGet7","getRuntimeContext","getRecentApps","currentApp","previousApp","getNavConfig","bootstrap","initAbortController","renderId","listen","_classPrivateFieldGet2","_location$state","_classPrivateFieldGet4","currentRenderId","ignoreRendering","omittedLocationProps","hash","undefined","state","key","notify","locationsAreEqual","_classPrivateFieldGet3","didPerformIncrementalRender","abortPendingRequest","dispatchPageLeave","storyboard","matchStoryboard","pathname","isOutsideApp","reload","_queuedRender2","catch","handleHttpError","exports","detail","_classPrivateFieldGet5","previousMessage","getBlockMessage","dispatchBeforePageLeave","unblock","_safeRedirect2","to","from","_this$redirectCount","_this$redirectCount2","search","process","env","NODE_ENV","console","error","Error","replace","_render2","nextLocation","_hooks$flowApi","_classPrivateFieldGet6","uniqueId","resetAllComputedMarks","clearResolveCache","hooks","flowApi","clearCollectWidgetContract","renderStartTime","performance","now","app","fulfilStoryboard","appChanged","id","flags","getRuntime","getFeatureFlags","prevRendererContext","redirectTo","add","redirectToLogin","main","document","querySelector","portal","renderRoot","tag","RenderTag","ROOT","container","createPortal","cleanUpPreviousRender","_hooks$messageDispatc","unmountTree","item","dispatchOnUnmount","dispose","clear","messageDispatcher","reset","dispatchEvent","CustomEvent","setTheme","getLocalAppsTheme","theme","setMode","_hooks$checkInstalled","_hooks$auth","_hooks$checkPermissio","_storyboard$meta","_hooks$flowApi2","_storyboard$meta2","checkInstalledApps","preCheckInstalledApps","appId","_internalApiGetAppInBootstrapData","routeHelper","bailout","output","unauthenticated","redirect","path","mergeMenus","menuRequests","menuConfs","Promise","all","mergeMenuConfs","returnNode","isUnauthenticatedError","NO_AUTH_GUARD","HttpAbortError","failed","node","BRICK","type","properties","textContent","httpErrorToString","runtimeContext","return","blockingList","rendererContext","RendererContext","query","URLSearchParams","sys","auth","getAuth","getPageInfo","settings","brand","getBrandSettings","ctxStore","DataStore","pendingPermissionsPreCheck","checkPermissions","preCheckPermissions","tplStateStoreMap","Map","formStateStoreMap","registerCustomTemplates","registerStoryboardFunctions","meta","functions","collectContract","contracts","stores","renderRoutes","insertPreviewRoutes","routes","getDataStores","postAsyncRender","setInitialMenuRequests","result","child","route","dispatchBeforePageLoad","applyTheme","applyMode","mountTree","scrollTo","dispatchPageLoad","dispatchAnchorLoad","dispatchOnMount","initializeScrollIntoView","initializeMediaChange","initializeMessageDispatcher","store","mountAsyncData","renderTime","isLoggedIn","navConfig","breadcrumb","menuConf","overwrite","items","push"],"sources":["../../../src/internal/Router.ts"],"sourcesContent":["import { Action, locationsAreEqual } from \"history\";\nimport type {\n BreadcrumbItemConf,\n MicroApp,\n StaticMenuConf,\n Storyboard,\n} from \"@next-core/types\";\nimport { HttpAbortError } from \"@next-core/http\";\nimport { uniqueId } from \"lodash\";\nimport { NextHistoryState, NextLocation, getHistory } from \"../history.js\";\nimport {\n RenderOutput,\n getDataStores,\n postAsyncRender,\n renderRoutes,\n} from \"./Renderer.js\";\nimport { DataStore } from \"./data/DataStore.js\";\nimport { clearResolveCache } from \"./data/resolveData.js\";\nimport { mountTree, unmountTree } from \"./mount.js\";\nimport { isOutsideApp, matchStoryboard } from \"./matchStoryboard.js\";\nimport { registerStoryboardFunctions } from \"./compute/StoryboardFunctions.js\";\nimport { RendererContext, RouteHelper } from \"./RendererContext.js\";\nimport {\n applyMode,\n applyTheme,\n getLocalAppsTheme,\n setMode,\n setTheme,\n} from \"../themeAndMode.js\";\nimport {\n _internalApiGetAppInBootstrapData,\n getRuntime,\n hooks,\n} from \"./Runtime.js\";\nimport { getPageInfo } from \"../getPageInfo.js\";\nimport type { RenderBrick, RenderRoot, RuntimeContext } from \"./interfaces.js\";\nimport { resetAllComputedMarks } from \"./compute/markAsComputed.js\";\nimport {\n handleHttpError,\n httpErrorToString,\n isUnauthenticatedError,\n} from \"../handleHttpError.js\";\nimport { abortPendingRequest, initAbortController } from \"./abortController.js\";\nimport { registerCustomTemplates } from \"./registerCustomTemplates.js\";\nimport { fulfilStoryboard } from \"./fulfilStoryboard.js\";\nimport { RenderTag } from \"./enums.js\";\nimport { insertPreviewRoutes } from \"./insertPreviewRoutes.js\";\n\nexport class Router {\n readonly #storyboards: Storyboard[];\n #rendering = false;\n #prevLocation!: NextLocation;\n #nextLocation?: NextLocation;\n #runtimeContext?: RuntimeContext;\n #rendererContext?: RendererContext;\n #rendererContextTrashCan = new Set<RendererContext | undefined>();\n #redirectCount = 0;\n #renderId?: string;\n #currentApp?: MicroApp;\n #previousApp?: MicroApp;\n #navConfig?: {\n breadcrumb?: BreadcrumbItemConf[];\n };\n\n constructor(storyboards: Storyboard[]) {\n this.#storyboards = storyboards;\n\n const history = getHistory();\n window.addEventListener(\"beforeunload\", (event) => {\n const message = this.#getBlockMessageBeforePageLave({});\n // See examples in https://developer.mozilla.org/en-US/docs/Web/API/WindowEventHandlers/onbeforeunload\n if (message) {\n // Cancel the event\n // If you prevent default behavior in Mozilla Firefox prompt will always be shown\n event.preventDefault();\n // Chrome requires returnValue to be set\n event.returnValue = \"\";\n } else {\n // the absence of a returnValue property on the event will guarantee the browser unload happens\n delete event.returnValue;\n }\n });\n\n history.block((location, action) =>\n this.#getBlockMessageBeforePageLave({ location, action })\n );\n }\n\n getRenderId() {\n return this.#renderId;\n }\n\n getRuntimeContext() {\n return this.#runtimeContext;\n }\n\n getRecentApps() {\n return {\n currentApp: this.#currentApp,\n previousApp: this.#previousApp,\n };\n }\n\n getNavConfig() {\n return this.#navConfig;\n }\n\n #getBlockMessageBeforePageLave(detail: {\n location?: NextLocation;\n action?: Action;\n }): string | undefined {\n const history = getHistory();\n const previousMessage = history.getBlockMessage();\n this.#rendererContext?.dispatchBeforePageLeave(detail);\n const message = history.getBlockMessage();\n if (!previousMessage && message) {\n // Auto unblock only if new block was introduced by `onBeforePageLeave`.\n history.unblock();\n }\n return message;\n }\n\n #safeRedirect(\n to: string,\n state: NextHistoryState | undefined,\n from: NextLocation\n ): void {\n if (this.#redirectCount++ > 10) {\n const message = `Infinite redirect detected: from \"${from.pathname}${from.search}${from.hash}\" to \"${to}\"`;\n // istanbul ignore else: error cannot be caught in test\n if (process.env.NODE_ENV === \"test\") {\n // eslint-disable-next-line no-console\n console.error(message);\n return;\n } else {\n throw new Error(message);\n }\n }\n getHistory().replace(to, state);\n }\n\n bootstrap() {\n initAbortController();\n const history = getHistory();\n this.#prevLocation = history.location;\n let renderId = 0;\n history.listen(async (location, action) => {\n const currentRenderId = ++renderId;\n let ignoreRendering: boolean | undefined;\n const omittedLocationProps: Partial<NextLocation> = {\n hash: undefined,\n state: undefined,\n };\n // Omit the \"key\" when checking whether locations are equal in certain situations.\n if (\n // When current location is triggered by browser action of hash link.\n location.key === undefined ||\n // When current location is triggered by browser action of non-push-or-replace,\n // such as goBack or goForward,\n (action === \"POP\" &&\n // and the previous location was triggered by hash link,\n (this.#prevLocation.key === undefined ||\n // or the previous location specified notify false.\n this.#prevLocation.state?.notify === false))\n ) {\n omittedLocationProps.key = undefined;\n }\n if (\n locationsAreEqual(\n { ...this.#prevLocation, ...omittedLocationProps },\n { ...location, ...omittedLocationProps }\n ) ||\n (action !== \"POP\" && location.state?.notify === false)\n ) {\n // Ignore rendering if location not changed except hash, state and optional key.\n // Ignore rendering if notify is `false`.\n ignoreRendering = true;\n }\n\n if (!ignoreRendering) {\n ignoreRendering =\n await this.#rendererContext?.didPerformIncrementalRender(location);\n }\n\n // Ignore stale renders\n if (renderId !== currentRenderId) {\n return;\n }\n\n if (ignoreRendering) {\n this.#prevLocation = location;\n return;\n }\n\n abortPendingRequest();\n this.#prevLocation = location;\n this.#rendererContext?.dispatchPageLeave();\n\n if (action === \"POP\") {\n const storyboard = matchStoryboard(\n this.#storyboards,\n location.pathname\n );\n // When a browser action of goBack or goForward is performing,\n // force reload when the target page is a page of an outside app.\n if (isOutsideApp(storyboard)) {\n window.location.reload();\n return;\n }\n }\n\n if (this.#rendering) {\n this.#nextLocation = location;\n } else {\n // devtoolsHookEmit(\"locationChange\");\n this.#queuedRender(location).catch(handleHttpError);\n }\n });\n return this.#queuedRender(history.location);\n }\n\n async #queuedRender(location: NextLocation): Promise<void> {\n this.#rendering = true;\n try {\n await this.#render(location);\n } finally {\n this.#rendering = false;\n if (this.#nextLocation) {\n const nextLocation = this.#nextLocation;\n this.#nextLocation = undefined;\n await this.#queuedRender(nextLocation);\n }\n }\n }\n\n async #render(location: NextLocation): Promise<void> {\n this.#renderId = uniqueId(\"render-id-1\");\n\n resetAllComputedMarks();\n clearResolveCache();\n hooks?.flowApi?.clearCollectWidgetContract();\n\n const history = getHistory();\n history.unblock();\n\n const renderStartTime = performance.now();\n\n const storyboard = matchStoryboard(this.#storyboards, location.pathname);\n\n const previousApp = this.#runtimeContext?.app;\n if (storyboard?.app) {\n await fulfilStoryboard(storyboard);\n }\n const currentApp = (this.#currentApp = storyboard?.app);\n\n // Storyboard maybe re-assigned, e.g. when open launchpad.\n const appChanged =\n previousApp && currentApp\n ? previousApp.id !== currentApp.id\n : previousApp !== currentApp;\n\n // TODO: handle favicon\n\n // Set `Router::#currentApp` before calling `getFeatureFlags()`\n const flags = getRuntime().getFeatureFlags();\n const prevRendererContext = this.#rendererContext;\n\n const redirectTo = (to: string, state?: NextHistoryState): void => {\n this.#rendererContextTrashCan.add(prevRendererContext);\n this.#safeRedirect(to, state, location);\n };\n\n const redirectToLogin = (): void => {\n const to = flags[\"sso-enabled\"] ? \"/sso-auth/login\" : \"/auth/login\";\n redirectTo(to, { from: location });\n };\n\n const main = document.querySelector(\"#main-mount-point\") as HTMLElement;\n const portal = document.querySelector(\"#portal-mount-point\") as HTMLElement;\n\n const renderRoot: RenderRoot = {\n tag: RenderTag.ROOT,\n container: main,\n createPortal: portal,\n };\n\n const cleanUpPreviousRender = (): void => {\n unmountTree(main);\n unmountTree(portal);\n\n // Note: redirects can lead to multiple trash renderer contexts.\n this.#rendererContextTrashCan.add(prevRendererContext);\n for (const item of this.#rendererContextTrashCan) {\n if (item) {\n item.dispatchOnUnmount();\n item.dispose();\n }\n }\n this.#rendererContextTrashCan.clear();\n hooks?.messageDispatcher?.reset();\n\n if (appChanged) {\n this.#previousApp = previousApp;\n window.dispatchEvent(\n new CustomEvent(\"app.change\", {\n detail: {\n previousApp,\n currentApp,\n },\n })\n );\n }\n };\n\n setTheme(\n (currentApp &&\n (getLocalAppsTheme()[currentApp.id] || currentApp.theme)) ||\n \"light\"\n );\n setMode(\"default\");\n\n if (currentApp) {\n hooks?.checkInstalledApps?.preCheckInstalledApps(\n storyboard,\n (appId) => !!_internalApiGetAppInBootstrapData(appId)\n );\n\n const routeHelper: RouteHelper = {\n bailout: (output) => {\n if (output.unauthenticated) {\n redirectToLogin();\n return true;\n }\n if (output.redirect) {\n redirectTo(output.redirect.path, output.redirect.state);\n return true;\n }\n // Reset redirect count if no redirect is set.\n this.#redirectCount = 0;\n },\n mergeMenus: async (menuRequests) => {\n const menuConfs = await Promise.all(menuRequests);\n this.#navConfig = mergeMenuConfs(menuConfs);\n },\n catch: (error, returnNode) => {\n if (isUnauthenticatedError(error) && !window.NO_AUTH_GUARD) {\n redirectToLogin();\n return;\n } else if (error instanceof HttpAbortError) {\n this.#rendererContextTrashCan.add(prevRendererContext);\n return;\n } else {\n return {\n failed: true,\n output: {\n node: {\n tag: RenderTag.BRICK,\n type: \"div\",\n properties: {\n textContent: httpErrorToString(error),\n },\n runtimeContext: null!,\n return: returnNode,\n },\n blockingList: [],\n menuRequests: [],\n },\n };\n }\n },\n };\n\n const rendererContext = (this.#rendererContext = new RendererContext(\n \"page\",\n { routeHelper }\n ));\n\n const runtimeContext: RuntimeContext = (this.#runtimeContext = {\n app: currentApp,\n location,\n query: new URLSearchParams(location.search),\n flags,\n sys: {\n ...hooks?.auth?.getAuth(),\n ...getPageInfo(),\n settings: {\n brand: getRuntime().getBrandSettings(),\n },\n },\n ctxStore: new DataStore(\"CTX\", undefined, rendererContext),\n pendingPermissionsPreCheck: [\n hooks?.checkPermissions?.preCheckPermissions(storyboard),\n ],\n tplStateStoreMap: new Map<string, DataStore<\"STATE\">>(),\n formStateStoreMap: new Map<string, DataStore<\"FORM_STATE\">>(),\n });\n\n this.#navConfig = undefined;\n\n registerCustomTemplates(storyboard);\n registerStoryboardFunctions(storyboard.meta?.functions, currentApp);\n hooks?.flowApi?.collectContract(storyboard.meta?.contracts);\n\n let failed = false;\n let output: RenderOutput;\n let stores: DataStore<\"CTX\" | \"STATE\" | \"FORM_STATE\">[] = [];\n\n try {\n output = await renderRoutes(\n renderRoot,\n insertPreviewRoutes(storyboard.routes),\n runtimeContext,\n rendererContext,\n []\n );\n if (routeHelper.bailout(output)) {\n return;\n }\n\n stores = getDataStores(runtimeContext);\n\n await postAsyncRender(output, runtimeContext, stores);\n\n await routeHelper.mergeMenus(output.menuRequests);\n rendererContext.setInitialMenuRequests(output.menuRequests);\n } catch (error) {\n // eslint-disable-next-line no-console\n console.error(\"Router failed:\", error);\n\n const result = routeHelper.catch(error, renderRoot);\n if (!result) {\n return;\n }\n ({ failed, output } = result);\n }\n renderRoot.child = output.node;\n\n cleanUpPreviousRender();\n\n if ((output.route && output.route.type !== \"routes\") || failed) {\n if (!failed) {\n // There is a window to set theme and mode by `lifeCycle.onBeforePageLoad`.\n rendererContext.dispatchBeforePageLoad();\n }\n applyTheme();\n applyMode();\n\n mountTree(renderRoot);\n\n // Scroll to top after each rendering.\n // See https://github.com/ReactTraining/react-router/blob/master/packages/react-router-dom/docs/guides/scroll-restoration.md\n window.scrollTo(0, 0);\n\n if (!failed) {\n rendererContext.dispatchPageLoad();\n rendererContext.dispatchAnchorLoad();\n rendererContext.dispatchOnMount();\n rendererContext.initializeScrollIntoView();\n rendererContext.initializeMediaChange();\n rendererContext.initializeMessageDispatcher();\n\n for (const store of stores) {\n store.mountAsyncData();\n }\n }\n\n const renderTime = performance.now() - renderStartTime;\n window.dispatchEvent(\n new CustomEvent(\"route.render\", {\n detail: {\n renderTime,\n },\n })\n );\n\n return;\n }\n } else if (\n !window.NO_AUTH_GUARD &&\n hooks?.auth &&\n !hooks.auth.isLoggedIn()\n ) {\n // Todo(steve): refine after api-gateway supports fetching storyboards before logged in.\n // Redirect to login if no storyboard is matched.\n redirectToLogin();\n return;\n } else {\n cleanUpPreviousRender();\n }\n\n applyTheme();\n applyMode();\n\n const node: RenderBrick = {\n tag: RenderTag.BRICK,\n type: \"div\",\n properties: {\n textContent: \"Page not found\",\n },\n runtimeContext: null!,\n return: renderRoot,\n };\n renderRoot.child = node;\n\n mountTree(renderRoot);\n\n // Scroll to top after each rendering.\n window.scrollTo(0, 0);\n }\n}\n\nfunction mergeMenuConfs(menuConfs: StaticMenuConf[]) {\n const navConfig = {\n breadcrumb: [] as BreadcrumbItemConf[],\n };\n for (const menuConf of menuConfs) {\n const { breadcrumb } = menuConf;\n if (breadcrumb) {\n if (breadcrumb.overwrite) {\n navConfig.breadcrumb = breadcrumb.items;\n } else {\n navConfig.breadcrumb.push(...breadcrumb.items);\n }\n }\n }\n return navConfig;\n}\n"],"mappings":"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"}
|
|
@@ -1,11 +1,13 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
|
|
3
|
+
var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault").default;
|
|
3
4
|
Object.defineProperty(exports, "__esModule", {
|
|
4
5
|
value: true
|
|
5
6
|
});
|
|
6
7
|
exports.DataStore = void 0;
|
|
7
8
|
var _general = require("@next-core/utils/general");
|
|
8
9
|
var _storyboard = require("@next-core/utils/storyboard");
|
|
10
|
+
var _eventTarget = _interopRequireDefault(require("@ungap/event-target"));
|
|
9
11
|
var _bindListeners = require("../bindListeners.js");
|
|
10
12
|
var _checkIf = require("../compute/checkIf.js");
|
|
11
13
|
var _computeRealValue = require("../compute/computeRealValue.js");
|
|
@@ -23,6 +25,7 @@ class DataStore {
|
|
|
23
25
|
batchUpdate = false;
|
|
24
26
|
batchUpdateContextsNames = [];
|
|
25
27
|
rendererContext;
|
|
28
|
+
routeMap = new WeakMap();
|
|
26
29
|
|
|
27
30
|
// 把 `rendererContext` 放在参数列表的最后,并作为可选,以减少测试文件的调整
|
|
28
31
|
constructor(type, hostBrick, rendererContext) {
|
|
@@ -155,9 +158,9 @@ class DataStore {
|
|
|
155
158
|
detail: item.value
|
|
156
159
|
}));
|
|
157
160
|
}
|
|
158
|
-
define(dataConfs, runtimeContext, asyncHostPropertyEntries) {
|
|
161
|
+
define(dataConfs, runtimeContext, asyncHostPropertyEntries, routePath) {
|
|
159
162
|
if (Array.isArray(dataConfs) && dataConfs.length > 0) {
|
|
160
|
-
const pending = (0, _resolveDataStore.resolveDataStore)(dataConfs, dataConf => this.resolve(dataConf, runtimeContext, asyncHostPropertyEntries), this.type);
|
|
163
|
+
const pending = (0, _resolveDataStore.resolveDataStore)(dataConfs, dataConf => this.resolve(dataConf, runtimeContext, asyncHostPropertyEntries, routePath), this.type);
|
|
161
164
|
this.pendingStack.push(pending);
|
|
162
165
|
}
|
|
163
166
|
}
|
|
@@ -176,6 +179,16 @@ class DataStore {
|
|
|
176
179
|
}
|
|
177
180
|
}
|
|
178
181
|
async waitForAll() {
|
|
182
|
+
// Silent each pending contexts, since the error is handled by batched `pendingResult`
|
|
183
|
+
for (const {
|
|
184
|
+
pendingContexts
|
|
185
|
+
} of this.pendingStack) {
|
|
186
|
+
for (const p of pendingContexts.values()) {
|
|
187
|
+
p.catch(() => {
|
|
188
|
+
/* No-op */
|
|
189
|
+
});
|
|
190
|
+
}
|
|
191
|
+
}
|
|
179
192
|
for (const {
|
|
180
193
|
pendingResult
|
|
181
194
|
} of this.pendingStack) {
|
|
@@ -183,10 +196,22 @@ class DataStore {
|
|
|
183
196
|
}
|
|
184
197
|
}
|
|
185
198
|
|
|
186
|
-
/**
|
|
187
|
-
|
|
199
|
+
/**
|
|
200
|
+
* After mount, dispatch the change event when an async data is loaded.
|
|
201
|
+
*
|
|
202
|
+
* If param `route` is present, handle data defined in that route (or its descendants) only.
|
|
203
|
+
*/
|
|
204
|
+
mountAsyncData(route) {
|
|
188
205
|
this.data.forEach(item => {
|
|
189
|
-
|
|
206
|
+
var _this$routeMap$get;
|
|
207
|
+
if (item.async && (!route || (_this$routeMap$get = this.routeMap.get(route)) !== null && _this$routeMap$get !== void 0 && _this$routeMap$get.has(item.name))) {
|
|
208
|
+
// istanbul ignore next
|
|
209
|
+
if (item.asyncMounted) {
|
|
210
|
+
// eslint-disable-next-line no-console
|
|
211
|
+
console.error(`Async data "${item.name}" already mounted. This is a bug of Brick Next, please report it.`);
|
|
212
|
+
return;
|
|
213
|
+
}
|
|
214
|
+
item.asyncMounted = true;
|
|
190
215
|
// An async data always has `loading`
|
|
191
216
|
// eslint-disable-next-line @typescript-eslint/no-non-null-assertion
|
|
192
217
|
item.loading.then(value => {
|
|
@@ -199,7 +224,7 @@ class DataStore {
|
|
|
199
224
|
}
|
|
200
225
|
});
|
|
201
226
|
}
|
|
202
|
-
async resolve(dataConf, runtimeContext, asyncHostPropertyEntries) {
|
|
227
|
+
async resolve(dataConf, runtimeContext, asyncHostPropertyEntries, routePath) {
|
|
203
228
|
if (!(await (0, _checkIf.asyncCheckIf)(dataConf, runtimeContext))) {
|
|
204
229
|
return false;
|
|
205
230
|
}
|
|
@@ -236,9 +261,10 @@ class DataStore {
|
|
|
236
261
|
}
|
|
237
262
|
}
|
|
238
263
|
const newData = {
|
|
264
|
+
name: dataConf.name,
|
|
239
265
|
value,
|
|
240
266
|
// This is required for tracking context, even if no `onChange` is specified.
|
|
241
|
-
eventTarget: new
|
|
267
|
+
eventTarget: new _eventTarget.default(),
|
|
242
268
|
load,
|
|
243
269
|
loaded: resolvePolicy === "eager",
|
|
244
270
|
loading,
|
|
@@ -279,8 +305,28 @@ class DataStore {
|
|
|
279
305
|
throw new Error(`${this.type} '${dataConf.name}' has already been declared`);
|
|
280
306
|
}
|
|
281
307
|
this.data.set(dataConf.name, newData);
|
|
308
|
+
if (Array.isArray(routePath)) {
|
|
309
|
+
for (const route of routePath) {
|
|
310
|
+
const names = this.routeMap.get(route);
|
|
311
|
+
if (names) {
|
|
312
|
+
names.add(dataConf.name);
|
|
313
|
+
} else {
|
|
314
|
+
this.routeMap.set(route, new Set([dataConf.name]));
|
|
315
|
+
}
|
|
316
|
+
}
|
|
317
|
+
}
|
|
282
318
|
return true;
|
|
283
319
|
}
|
|
320
|
+
disposeDataInRoutes(routes) {
|
|
321
|
+
for (const route of routes) {
|
|
322
|
+
const names = this.routeMap.get(route);
|
|
323
|
+
if (names !== undefined) {
|
|
324
|
+
for (const name of names) {
|
|
325
|
+
this.data.delete(name);
|
|
326
|
+
}
|
|
327
|
+
}
|
|
328
|
+
}
|
|
329
|
+
}
|
|
284
330
|
batchAddListener(listener, contextConf) {
|
|
285
331
|
return event => {
|
|
286
332
|
if (this.batchUpdate && this.batchUpdateContextsNames.includes(contextConf.name)) {
|