@tarojs/router 3.5.0-canary.0 → 3.5.0-canary.1

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/index.js CHANGED
@@ -3,30 +3,31 @@
3
3
  Object.defineProperty(exports, '__esModule', { value: true });
4
4
 
5
5
  var _extends = require('@babel/runtime/helpers/esm/extends');
6
+ var _objectSpread = require('@babel/runtime/helpers/objectSpread2');
6
7
  var _asyncToGenerator = require('@babel/runtime/helpers/asyncToGenerator');
7
8
  var _regeneratorRuntime = require('@babel/runtime/regenerator');
8
9
  var _toConsumableArray = require('@babel/runtime/helpers/toConsumableArray');
9
10
  var _classCallCheck = require('@babel/runtime/helpers/classCallCheck');
10
11
  var _createClass = require('@babel/runtime/helpers/createClass');
11
12
  var _defineProperty = require('@babel/runtime/helpers/defineProperty');
12
- var _slicedToArray = require('@babel/runtime/helpers/slicedToArray');
13
- var _objectSpread = require('@babel/runtime/helpers/objectSpread2');
14
13
  var runtime = require('@tarojs/runtime');
15
14
  var _typeof = require('@babel/runtime/helpers/typeof');
15
+ var _slicedToArray = require('@babel/runtime/helpers/slicedToArray');
16
16
  var _createForOfIteratorHelper = require('@babel/runtime/helpers/createForOfIteratorHelper');
17
+ var taro = require('@tarojs/taro');
17
18
 
18
19
  function _interopDefaultLegacy (e) { return e && typeof e === 'object' && 'default' in e ? e : { 'default': e }; }
19
20
 
20
21
  var _extends__default = /*#__PURE__*/_interopDefaultLegacy(_extends);
22
+ var _objectSpread__default = /*#__PURE__*/_interopDefaultLegacy(_objectSpread);
21
23
  var _asyncToGenerator__default = /*#__PURE__*/_interopDefaultLegacy(_asyncToGenerator);
22
24
  var _regeneratorRuntime__default = /*#__PURE__*/_interopDefaultLegacy(_regeneratorRuntime);
23
25
  var _toConsumableArray__default = /*#__PURE__*/_interopDefaultLegacy(_toConsumableArray);
24
26
  var _classCallCheck__default = /*#__PURE__*/_interopDefaultLegacy(_classCallCheck);
25
27
  var _createClass__default = /*#__PURE__*/_interopDefaultLegacy(_createClass);
26
28
  var _defineProperty__default = /*#__PURE__*/_interopDefaultLegacy(_defineProperty);
27
- var _slicedToArray__default = /*#__PURE__*/_interopDefaultLegacy(_slicedToArray);
28
- var _objectSpread__default = /*#__PURE__*/_interopDefaultLegacy(_objectSpread);
29
29
  var _typeof__default = /*#__PURE__*/_interopDefaultLegacy(_typeof);
30
+ var _slicedToArray__default = /*#__PURE__*/_interopDefaultLegacy(_slicedToArray);
30
31
  var _createForOfIteratorHelper__default = /*#__PURE__*/_interopDefaultLegacy(_createForOfIteratorHelper);
31
32
 
32
33
  var r,
@@ -457,10 +458,14 @@ function prependBasename() {
457
458
  var url = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : '';
458
459
  return basename.replace(/\/$/, '') + '/' + url.replace(/^\//, '');
459
460
  }
460
- var hasBasename = function hasBasename(path, prefix) {
461
+ var hasBasename = function hasBasename() {
462
+ var path = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : '';
463
+ var prefix = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : '';
461
464
  return new RegExp('^' + prefix + '(\\/|\\?|#|$)', 'i').test(path);
462
465
  };
463
- var stripBasename = function stripBasename(path, prefix) {
466
+ var stripBasename = function stripBasename() {
467
+ var path = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : '';
468
+ var prefix = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : '';
464
469
  return hasBasename(path, prefix) ? path.substr(prefix.length) : path;
465
470
  };
466
471
 
@@ -478,8 +483,10 @@ var Stacks = /*#__PURE__*/function () {
478
483
  set: function set(delta) {
479
484
  if (delta > 0) {
480
485
  this.backDelta = delta;
481
- } else {
486
+ } else if (this.backDelta > 0) {
482
487
  --this.backDelta;
488
+ } else {
489
+ this.backDelta = 0;
483
490
  }
484
491
  }
485
492
  }, {
@@ -505,12 +512,14 @@ var Stacks = /*#__PURE__*/function () {
505
512
  }, {
506
513
  key: "getLastIndex",
507
514
  value: function getLastIndex(pathname) {
515
+ var stateWith = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 1;
516
+
508
517
  var list = _toConsumableArray__default['default'](this.stacks).reverse();
509
518
 
510
- return list.findIndex(function (page) {
519
+ return list.findIndex(function (page, i) {
511
520
  var _page$path;
512
521
 
513
- return ((_page$path = page.path) === null || _page$path === void 0 ? void 0 : _page$path.replace(/\?.*/g, '')) === pathname;
522
+ return i >= stateWith && ((_page$path = page.path) === null || _page$path === void 0 ? void 0 : _page$path.replace(/\?.*/g, '')) === pathname;
514
523
  });
515
524
  }
516
525
  }, {
@@ -518,15 +527,17 @@ var Stacks = /*#__PURE__*/function () {
518
527
  value: function getDelta(pathname) {
519
528
  if (this.backDelta >= 1) {
520
529
  return this.backDelta;
521
- } // NOTE: 此处为了修复浏览器后退多级页面,在大量重复路由状况下可能出现判断错误的情况 (增强判断能力只能考虑在 query 中新增参数来判断,暂时搁置)
530
+ }
522
531
 
532
+ var index = this.getLastIndex(pathname); // NOTE: 此处为了修复浏览器后退多级页面,在大量重复路由状况下可能出现判断错误的情况 (增强判断能力只能考虑在 query 中新增参数来判断,暂时搁置)
523
533
 
524
- return this.getLastIndex(pathname) || 1;
534
+ return index > 0 ? index : 1;
525
535
  }
526
536
  }, {
527
537
  key: "getPrevIndex",
528
538
  value: function getPrevIndex(pathname) {
529
- var lastIndex = this.getLastIndex(pathname);
539
+ var stateWith = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 1;
540
+ var lastIndex = this.getLastIndex(pathname, stateWith);
530
541
 
531
542
  if (lastIndex < 0) {
532
543
  return -1;
@@ -551,51 +562,99 @@ var Stacks = /*#__PURE__*/function () {
551
562
 
552
563
  var stacks = new Stacks();
553
564
 
554
- var routesAlias = {};
555
- function setRoutesAlias(alias) {
556
- routesAlias = alias;
557
- }
558
565
  function addLeadingSlash(path) {
559
566
  if (path == null) {
560
567
  return '';
561
568
  }
562
569
 
563
570
  return path.charAt(0) === '/' ? path : '/' + path;
564
- } // eslint-disable-next-line @typescript-eslint/ban-types
565
- var isTabBar = function isTabBar(config) {
566
- var _Object$entries$find, _config$tabBar;
567
-
568
- var _config$router = config.router,
569
- _config$router$custom = _config$router.customRoutes,
570
- customRoutes = _config$router$custom === void 0 ? {} : _config$router$custom,
571
- _config$router$basena = _config$router.basename,
572
- basename = _config$router$basena === void 0 ? '' : _config$router$basena,
573
- pathname = _config$router.pathname;
574
- var routePath = stripBasename(pathname, basename);
575
- var pagePath = ((_Object$entries$find = Object.entries(customRoutes).find(function (_ref) {
576
- var _ref2 = _slicedToArray__default['default'](_ref, 2),
577
- target = _ref2[1];
578
-
579
- return target === routePath;
580
- })) === null || _Object$entries$find === void 0 ? void 0 : _Object$entries$find[0]) || routePath;
581
- return !!pagePath && (((_config$tabBar = config.tabBar) === null || _config$tabBar === void 0 ? void 0 : _config$tabBar.list) || []).some(function (t) {
582
- return t.pagePath === pagePath;
583
- });
584
- };
571
+ }
585
572
 
586
- function processNavigateUrl(option) {
587
- var _pathPieces$pathname;
573
+ var RoutesAlias = /*#__PURE__*/function () {
574
+ function RoutesAlias() {
575
+ var _this = this;
576
+
577
+ _classCallCheck__default['default'](this, RoutesAlias);
578
+
579
+ _defineProperty__default['default'](this, "conf", []);
580
+
581
+ _defineProperty__default['default'](this, "getConfig", function () {
582
+ var url = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : '';
588
583
 
589
- var pathPieces = J(option.url); // 处理自定义路由
584
+ var customRoute = _this.conf.filter(function (arr) {
585
+ return arr.includes(url);
586
+ });
587
+
588
+ return customRoute[0];
589
+ });
590
+
591
+ _defineProperty__default['default'](this, "getOrigin", function () {
592
+ var _this$getConfig;
593
+
594
+ var url = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : '';
595
+ return ((_this$getConfig = _this.getConfig(url)) === null || _this$getConfig === void 0 ? void 0 : _this$getConfig[0]) || url;
596
+ });
597
+
598
+ _defineProperty__default['default'](this, "getAlias", function () {
599
+ var _this$getConfig2;
600
+
601
+ var url = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : '';
602
+ return ((_this$getConfig2 = _this.getConfig(url)) === null || _this$getConfig2 === void 0 ? void 0 : _this$getConfig2[1]) || url;
603
+ });
604
+
605
+ _defineProperty__default['default'](this, "getAll", function () {
606
+ var url = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : '';
607
+ return _this.conf.filter(function (arr) {
608
+ return arr.includes(url);
609
+ }).reduceRight(function (p, a) {
610
+ p.unshift(a[1]);
611
+ return p;
612
+ }, [url]);
613
+ });
614
+ }
615
+
616
+ _createClass__default['default'](RoutesAlias, [{
617
+ key: "set",
618
+ value: function set() {
619
+ var _this2 = this;
620
+
621
+ var customRoutes = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};
590
622
 
591
- Object.keys(routesAlias).forEach(function (key) {
592
- if (addLeadingSlash(key) === addLeadingSlash(pathPieces.pathname)) {
593
- pathPieces.pathname = routesAlias[key];
623
+ var _loop = function _loop(_key) {
624
+ var path = customRoutes[_key];
625
+ _key = addLeadingSlash(_key);
626
+
627
+ if (typeof path === 'string') {
628
+ _this2.conf.push([_key, addLeadingSlash(path)]);
629
+ } else if ((path === null || path === void 0 ? void 0 : path.length) > 0) {
630
+ var _this2$conf;
631
+
632
+ (_this2$conf = _this2.conf).push.apply(_this2$conf, _toConsumableArray__default['default'](path.map(function (p) {
633
+ return [_key, addLeadingSlash(p)];
634
+ })));
635
+ }
636
+
637
+ key = _key;
638
+ };
639
+
640
+ for (var key in customRoutes) {
641
+ _loop(key);
642
+ }
594
643
  }
595
- }); // 处理相对路径
644
+ }]);
596
645
 
597
- if (pathPieces !== null && pathPieces !== void 0 && (_pathPieces$pathname = pathPieces.pathname) !== null && _pathPieces$pathname !== void 0 && _pathPieces$pathname.includes('./')) {
598
- var parts = exports.history.location.pathname.split('/');
646
+ return RoutesAlias;
647
+ }();
648
+
649
+ var routesAlias = new RoutesAlias();
650
+
651
+ function processNavigateUrl(option) {
652
+ var _pathPieces$pathname;
653
+
654
+ var pathPieces = J(option.url); // 处理相对路径
655
+
656
+ if ((_pathPieces$pathname = pathPieces.pathname) !== null && _pathPieces$pathname !== void 0 && _pathPieces$pathname.includes('./')) {
657
+ var parts = routesAlias.getOrigin(exports.history.location.pathname).split('/');
599
658
  parts.pop();
600
659
  pathPieces.pathname.split('/').forEach(function (item) {
601
660
  if (item === '.') {
@@ -605,8 +664,10 @@ function processNavigateUrl(option) {
605
664
  item === '..' ? parts.pop() : parts.push(item);
606
665
  });
607
666
  pathPieces.pathname = parts.join('/');
608
- } // 处理 basename
667
+ } // 处理自定义路由
668
+
609
669
 
670
+ pathPieces.pathname = routesAlias.getAlias(addLeadingSlash(pathPieces.pathname)); // 处理 basename
610
671
 
611
672
  pathPieces.pathname = prependBasename(pathPieces.pathname); // hack fix history v5 bug: https://github.com/remix-run/history/issues/814
612
673
 
@@ -629,9 +690,12 @@ function _navigate() {
629
690
  complete = option.complete,
630
691
  fail = option.fail;
631
692
  var unListen = exports.history.listen(function () {
632
- success === null || success === void 0 ? void 0 : success();
633
- complete === null || complete === void 0 ? void 0 : complete();
634
- resolve();
693
+ var res = {
694
+ errMsg: "".concat(method, ":ok")
695
+ };
696
+ success === null || success === void 0 ? void 0 : success(res);
697
+ complete === null || complete === void 0 ? void 0 : complete(res);
698
+ resolve(res);
635
699
  unListen();
636
700
  });
637
701
 
@@ -644,7 +708,10 @@ function _navigate() {
644
708
 
645
709
  if (method === 'navigateTo') {
646
710
  exports.history.push(pathPieces, state);
647
- } else if (method === 'redirectTo') {
711
+ } else if (method === 'redirectTo' || method === 'switchTab') {
712
+ exports.history.replace(pathPieces, state);
713
+ } else if (method === 'reLaunch') {
714
+ stacks.delta = stacks.length;
648
715
  exports.history.replace(pathPieces, state);
649
716
  }
650
717
  } else if (method === 'navigateBack') {
@@ -652,9 +719,12 @@ function _navigate() {
652
719
  exports.history.go(-option.delta);
653
720
  }
654
721
  } catch (error) {
655
- fail === null || fail === void 0 ? void 0 : fail(error);
656
- complete === null || complete === void 0 ? void 0 : complete();
657
- reject(error);
722
+ var res = {
723
+ errMsg: "".concat(method, ":fail ").concat(error.message || error)
724
+ };
725
+ fail === null || fail === void 0 ? void 0 : fail(res);
726
+ complete === null || complete === void 0 ? void 0 : complete(res);
727
+ reject(res);
658
728
  }
659
729
  }));
660
730
 
@@ -686,15 +756,18 @@ function navigateBack() {
686
756
  return navigate(options, 'navigateBack');
687
757
  }
688
758
  function switchTab(option) {
689
- // TODO: 清除掉所有的栈去目标页面
690
- return redirectTo(option);
759
+ return navigate(option, 'switchTab');
691
760
  }
692
761
  function reLaunch(option) {
693
- // TODO: 清除掉所有的栈去目标页面
694
- return redirectTo(option);
762
+ return navigate(option, 'reLaunch');
695
763
  }
696
764
  function getCurrentPages() {
697
- return stacks.get();
765
+ var pages = stacks.get();
766
+ return pages.map(function (e) {
767
+ return _objectSpread__default['default'](_objectSpread__default['default']({}, e), {}, {
768
+ route: e.path || ''
769
+ });
770
+ });
698
771
  }
699
772
 
700
773
  var pathToRegexp$2 = {exports: {}};
@@ -1327,117 +1400,6 @@ var UniversalRouter = function () {
1327
1400
 
1328
1401
  UniversalRouter.pathToRegexp = pathToRegexp$1;
1329
1402
 
1330
- var Taro = require('@tarojs/taro-h5');
1331
-
1332
- function initTabbar(config) {
1333
- if (config.tabBar == null) {
1334
- return;
1335
- } // TODO: 找到 tabbar 的类型
1336
-
1337
-
1338
- var tabbar = document.createElement('taro-tabbar');
1339
- var homePage = config.pages ? config.pages[0] : '';
1340
- tabbar.conf = config.tabBar;
1341
- tabbar.conf.homePage = exports.history.location.pathname === '/' ? homePage : exports.history.location.pathname;
1342
- var routerConfig = config.router;
1343
- tabbar.conf.mode = routerConfig && routerConfig.mode ? routerConfig.mode : 'hash';
1344
-
1345
- if (routerConfig.customRoutes) {
1346
- tabbar.conf.custom = true;
1347
- tabbar.conf.customRoutes = routerConfig.customRoutes;
1348
- } else {
1349
- tabbar.conf.custom = false;
1350
- tabbar.conf.customRoutes = {};
1351
- }
1352
-
1353
- if (typeof routerConfig.basename !== 'undefined') {
1354
- tabbar.conf.basename = routerConfig.basename;
1355
- }
1356
-
1357
- var container = document.getElementById('container'); // eslint-disable-next-line no-unused-expressions
1358
-
1359
- container === null || container === void 0 ? void 0 : container.appendChild(tabbar);
1360
- Taro.initTabBarApis(config);
1361
- }
1362
-
1363
- var routerConfig = Object.create(null);
1364
- function init(config) {
1365
- var _document$getElementB;
1366
-
1367
- config.router.mode = config.router.mode || 'hash';
1368
- setHistoryMode(config.router.mode, config.router.basename);
1369
- Object.assign(routerConfig, config);
1370
- (_document$getElementB = document.getElementById('app')) === null || _document$getElementB === void 0 ? void 0 : _document$getElementB.remove();
1371
- var container = document.createElement('div');
1372
- container.classList.add('taro-tabbar__container');
1373
- container.id = 'container';
1374
- var panel = document.createElement('div');
1375
- panel.classList.add('taro-tabbar__panel');
1376
- var app = document.createElement('div');
1377
- app.id = 'app';
1378
- app.classList.add('taro_router');
1379
- panel.appendChild(app);
1380
- container.appendChild(panel);
1381
- document.body.appendChild(container);
1382
- initTabbar(config);
1383
- }
1384
-
1385
- var pageScrollFn;
1386
- var pageDOM = window;
1387
- function bindPageScroll(page, config) {
1388
- pageDOM.removeEventListener('scroll', pageScrollFn);
1389
- pageDOM = getScrollContainer();
1390
- var distance = config.onReachBottomDistance || 50;
1391
- var isReachBottom = false;
1392
-
1393
- pageScrollFn = function pageScrollFn() {
1394
- page.onPageScroll && page.onPageScroll({
1395
- scrollTop: pageDOM instanceof Window ? window.scrollY : pageDOM.scrollTop
1396
- });
1397
-
1398
- if (isReachBottom && getOffset() > distance) {
1399
- isReachBottom = false;
1400
- }
1401
-
1402
- if (page.onReachBottom && !isReachBottom && getOffset() < distance) {
1403
- isReachBottom = true;
1404
- page.onReachBottom();
1405
- }
1406
- };
1407
-
1408
- pageDOM.addEventListener('scroll', pageScrollFn, false);
1409
- }
1410
- window.addEventListener('DOMSubtreeModified', function (e) {
1411
- var _e$target;
1412
-
1413
- // @ts-ignore
1414
- var className = (_e$target = e.target) === null || _e$target === void 0 ? void 0 : _e$target.className;
1415
-
1416
- if (className && /taro-tabbar__/.test(className)) {
1417
- pageDOM.removeEventListener('scroll', pageScrollFn);
1418
- pageDOM = getScrollContainer();
1419
- pageDOM.addEventListener('scroll', pageScrollFn, false);
1420
- }
1421
- }, false);
1422
-
1423
- function getScrollContainer() {
1424
- if (document.querySelector('.taro-tabbar__tabbar') === null) {
1425
- // 没设置tabbar
1426
- return window;
1427
- } else {
1428
- // 有设置tabbar
1429
- return document.querySelector('.taro-tabbar__panel') || window;
1430
- }
1431
- }
1432
-
1433
- function getOffset() {
1434
- if (pageDOM instanceof Window) {
1435
- return document.documentElement.scrollHeight - window.scrollY - window.innerHeight;
1436
- } else {
1437
- return pageDOM.scrollHeight - pageDOM.scrollTop - pageDOM.clientHeight;
1438
- }
1439
- }
1440
-
1441
1403
  var queryString = {};
1442
1404
 
1443
1405
  var strictUriEncode = function strictUriEncode(str) {
@@ -2002,147 +1964,555 @@ var filterObj = function filterObj(obj, predicate) {
2002
1964
  };
2003
1965
  })(queryString);
2004
1966
 
2005
- function getSearch() {
2006
- var search = '?';
2007
-
2008
- if (routerConfig.router.mode === 'hash') {
2009
- var idx = location.hash.indexOf('?');
1967
+ /**
1968
+ * 插入页面动画需要的样式
1969
+ */
1970
+ function loadAnimateStyle() {
1971
+ var ms = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : 300;
1972
+ var css = "\n.taro_router .taro_page {\n position: absolute;\n left: 0;\n top: 0;\n width: 100%;\n height: 100%;\n background-color: #fff;\n transform: translate(100%, 0);\n transition: transform ".concat(ms, "ms;\n z-index: 0;\n}\n\n.taro_router .taro_page.taro_tabbar_page,\n.taro_router .taro_page.taro_page_show.taro_page_stationed {\n transform: none;\n}\n\n.taro_router .taro_page.taro_page_show {\n transform: translate(0, 0);\n}");
1973
+ var style = document.createElement('style');
1974
+ style.innerHTML = css;
1975
+ document.getElementsByTagName('head')[0].appendChild(style);
1976
+ }
2010
1977
 
2011
- if (idx > -1) {
2012
- search = location.hash.slice(idx);
2013
- }
2014
- } else {
2015
- search = location.search;
2016
- }
1978
+ // @ts-nocheck
1979
+ function initTabbar(config) {
1980
+ if (config.tabBar == null) {
1981
+ return;
1982
+ } // TODO: custom-tab-bar
2017
1983
 
2018
- return search.substr(1);
2019
- }
2020
1984
 
2021
- var qs = function qs() {
2022
- var stamp = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : 0;
2023
- var search = getSearch();
2024
- var query = search ? queryString.parse(search) : {};
1985
+ var tabbar = document.createElement('taro-tabbar');
1986
+ var homePage = config.entryPagePath || (config.pages ? config.pages[0] : '');
1987
+ tabbar.conf = config.tabBar;
1988
+ tabbar.conf.homePage = exports.history.location.pathname === '/' ? homePage : exports.history.location.pathname;
1989
+ var routerConfig = config.router;
1990
+ tabbar.conf.mode = routerConfig && routerConfig.mode ? routerConfig.mode : 'hash';
2025
1991
 
2026
- if (stamp) {
2027
- query.stamp = stamp.toString();
1992
+ if (routerConfig.customRoutes) {
1993
+ tabbar.conf.custom = true;
1994
+ tabbar.conf.customRoutes = routerConfig.customRoutes;
1995
+ } else {
1996
+ tabbar.conf.custom = false;
1997
+ tabbar.conf.customRoutes = {};
2028
1998
  }
2029
1999
 
2030
- return query;
2031
- };
2000
+ if (typeof routerConfig.basename !== 'undefined') {
2001
+ tabbar.conf.basename = routerConfig.basename;
2002
+ }
2032
2003
 
2033
- /* eslint-disable dot-notation */
2034
- function pageOnReady(page) {
2035
- var onLoad = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : true;
2036
- var pageEl = document.getElementById(page.path);
2004
+ var container = document.getElementById('container');
2005
+ container === null || container === void 0 ? void 0 : container.appendChild(tabbar);
2006
+ taro.initTabBarApis(config);
2007
+ }
2037
2008
 
2038
- if (pageEl && !(pageEl !== null && pageEl !== void 0 && pageEl['__isReady'])) {
2039
- var _el$componentOnReady, _el$componentOnReady$;
2009
+ var pageResizeFn;
2010
+ function bindPageResize(page) {
2011
+ window.removeEventListener('resize', pageResizeFn);
2040
2012
 
2041
- var el = pageEl.firstElementChild;
2042
- el === null || el === void 0 ? void 0 : (_el$componentOnReady = el['componentOnReady']) === null || _el$componentOnReady === void 0 ? void 0 : (_el$componentOnReady$ = _el$componentOnReady.call(el)) === null || _el$componentOnReady$ === void 0 ? void 0 : _el$componentOnReady$.then(function () {
2043
- runtime.requestAnimationFrame(function () {
2044
- page.onReady();
2045
- pageEl['__isReady'] = true;
2046
- });
2013
+ pageResizeFn = function pageResizeFn() {
2014
+ page.onResize && page.onResize({
2015
+ size: {
2016
+ windowHeight: window.innerHeight,
2017
+ windowWidth: window.innerWidth
2018
+ }
2047
2019
  });
2048
- onLoad && (pageEl['__page'] = page);
2049
- }
2020
+ };
2021
+
2022
+ window.addEventListener('resize', pageResizeFn, false);
2050
2023
  }
2051
- function loadPage(page) {
2052
- var pageConfig = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};
2053
- var stacksIndex = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : 0;
2054
- if (!page) return;
2055
- var pageEl = document.getElementById(page.path);
2056
-
2057
- if (pageEl) {
2058
- pageEl.style.display = 'block';
2059
- } else {
2060
- page.onLoad(qs(stacksIndex), function () {
2061
- return pageOnReady(page, true);
2024
+
2025
+ var pageScrollFn;
2026
+ var pageDOM = window;
2027
+ function bindPageScroll(page, pageEl) {
2028
+ var distance = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : 50;
2029
+ pageEl.removeEventListener('scroll', pageScrollFn);
2030
+ pageDOM = pageEl;
2031
+ var isReachBottom = false;
2032
+
2033
+ pageScrollFn = function pageScrollFn() {
2034
+ page.onPageScroll && page.onPageScroll({
2035
+ scrollTop: pageDOM instanceof Window ? window.scrollY : pageDOM.scrollTop
2062
2036
  });
2063
- }
2064
2037
 
2065
- stacks.push(page);
2066
- page.onShow();
2067
- bindPageScroll(page, pageConfig);
2068
- }
2069
- function unloadPage(page) {
2070
- var delta = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 1;
2071
- if (!page) return;
2072
- stacks.delta = --delta;
2073
- stacks.pop();
2074
- page.onUnload();
2075
- if (delta >= 1) unloadPage(stacks.last, delta);
2038
+ if (isReachBottom && getOffset() > distance) {
2039
+ isReachBottom = false;
2040
+ }
2041
+
2042
+ if (page.onReachBottom && !isReachBottom && getOffset() < distance) {
2043
+ isReachBottom = true;
2044
+ page.onReachBottom();
2045
+ }
2046
+ };
2047
+
2048
+ pageDOM.addEventListener('scroll', pageScrollFn, false);
2076
2049
  }
2077
- function showPage(page) {
2078
- var pageConfig = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};
2079
- var stacksIndex = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : 0;
2080
- if (!page) return;
2081
- page.onShow();
2082
- var pageEl = document.getElementById(page.path);
2083
-
2084
- if (pageEl) {
2085
- pageEl.style.display = 'block';
2050
+
2051
+ function getOffset() {
2052
+ if (pageDOM instanceof Window) {
2053
+ return document.documentElement.scrollHeight - window.scrollY - window.innerHeight;
2086
2054
  } else {
2087
- page.onLoad(qs(stacksIndex), function () {
2088
- return pageOnReady(page, false);
2089
- });
2055
+ return pageDOM.scrollHeight - pageDOM.scrollTop - pageDOM.clientHeight;
2090
2056
  }
2091
-
2092
- bindPageScroll(page, pageConfig);
2093
2057
  }
2094
- function hidePage(page) {
2095
- if (!page) return; // NOTE: 修复多页并发问题,此处可能因为路由跳转过快,执行时页面可能还没有创建成功
2096
2058
 
2097
- var pageEl = document.getElementById(page.path);
2059
+ function setDisplay(el) {
2060
+ var type = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : '';
2098
2061
 
2099
- if (pageEl) {
2100
- pageEl.style.display = 'none';
2101
- page.onHide();
2102
- } else {
2103
- setTimeout(function () {
2104
- return hidePage(page);
2105
- }, 0);
2062
+ if (el) {
2063
+ el.style.display = type;
2106
2064
  }
2107
2065
  }
2108
2066
 
2109
- function createRouter(app, config, framework) {
2110
- var _config$router$custom;
2067
+ var PageHandler = /*#__PURE__*/function () {
2068
+ function PageHandler(config) {
2069
+ _classCallCheck__default['default'](this, PageHandler);
2111
2070
 
2112
- init(config);
2113
- var routes = [];
2114
- var alias = (_config$router$custom = config.router.customRoutes) !== null && _config$router$custom !== void 0 ? _config$router$custom : {};
2115
- var runtimeHooks = runtime.container.get(runtime.SERVICE_IDENTIFIER.Hooks);
2116
- setRoutesAlias(alias);
2071
+ _defineProperty__default['default'](this, "config", void 0);
2117
2072
 
2118
- for (var i = 0; i < config.routes.length; i++) {
2119
- var route = config.routes[i];
2120
- var path = addLeadingSlash(route.path);
2121
- routes.push({
2122
- path: alias[path] || path,
2123
- action: route.load
2073
+ _defineProperty__default['default'](this, "defaultAnimation", {
2074
+ duration: 300,
2075
+ delay: 50
2124
2076
  });
2077
+
2078
+ _defineProperty__default['default'](this, "unloadTimer", void 0);
2079
+
2080
+ _defineProperty__default['default'](this, "hideTimer", void 0);
2081
+
2082
+ _defineProperty__default['default'](this, "lastHidePage", void 0);
2083
+
2084
+ _defineProperty__default['default'](this, "lastUnloadPage", void 0);
2085
+
2086
+ this.config = config;
2087
+ this.mount();
2125
2088
  }
2126
2089
 
2127
- var basename = config.router.basename;
2090
+ _createClass__default['default'](PageHandler, [{
2091
+ key: "appId",
2092
+ get: function get() {
2093
+ return 'app';
2094
+ }
2095
+ }, {
2096
+ key: "router",
2097
+ get: function get() {
2098
+ return this.config.router;
2099
+ }
2100
+ }, {
2101
+ key: "routerMode",
2102
+ get: function get() {
2103
+ return this.router.mode || 'hash';
2104
+ }
2105
+ }, {
2106
+ key: "customRoutes",
2107
+ get: function get() {
2108
+ return this.router.customRoutes || {};
2109
+ }
2110
+ }, {
2111
+ key: "routes",
2112
+ get: function get() {
2113
+ return this.config.routes;
2114
+ }
2115
+ }, {
2116
+ key: "tabBarList",
2117
+ get: function get() {
2118
+ var _this$config$tabBar;
2119
+
2120
+ return ((_this$config$tabBar = this.config.tabBar) === null || _this$config$tabBar === void 0 ? void 0 : _this$config$tabBar.list) || [];
2121
+ }
2122
+ }, {
2123
+ key: "PullDownRefresh",
2124
+ get: function get() {
2125
+ return this.config.PullDownRefresh;
2126
+ }
2127
+ }, {
2128
+ key: "animation",
2129
+ get: function get() {
2130
+ var _this$config$animatio, _this$config;
2131
+
2132
+ return (_this$config$animatio = (_this$config = this.config) === null || _this$config === void 0 ? void 0 : _this$config.animation) !== null && _this$config$animatio !== void 0 ? _this$config$animatio : this.defaultAnimation;
2133
+ }
2134
+ }, {
2135
+ key: "animationDelay",
2136
+ get: function get() {
2137
+ var _this$defaultAnimatio;
2138
+
2139
+ return (_typeof__default['default'](this.animation) === 'object' ? this.animation.delay : this.animation ? (_this$defaultAnimatio = this.defaultAnimation) === null || _this$defaultAnimatio === void 0 ? void 0 : _this$defaultAnimatio.delay : 0) || 0;
2140
+ }
2141
+ }, {
2142
+ key: "animationDuration",
2143
+ get: function get() {
2144
+ var _this$defaultAnimatio2;
2145
+
2146
+ return (_typeof__default['default'](this.animation) === 'object' ? this.animation.duration : this.animation ? (_this$defaultAnimatio2 = this.defaultAnimation) === null || _this$defaultAnimatio2 === void 0 ? void 0 : _this$defaultAnimatio2.duration : 0) || 0;
2147
+ }
2148
+ }, {
2149
+ key: "pathname",
2150
+ get: function get() {
2151
+ return this.router.pathname;
2152
+ },
2153
+ set: function set(p) {
2154
+ this.router.pathname = p;
2155
+ }
2156
+ }, {
2157
+ key: "basename",
2158
+ get: function get() {
2159
+ return this.router.basename || '';
2160
+ }
2161
+ }, {
2162
+ key: "pageConfig",
2163
+ get: function get() {
2164
+ var _this = this;
2165
+
2166
+ return this.routes.find(function (r) {
2167
+ var _routesAlias$getConfi;
2168
+
2169
+ var routePath = stripBasename(_this.pathname, _this.basename);
2170
+ var pagePath = addLeadingSlash(r.path);
2171
+ return pagePath === routePath || ((_routesAlias$getConfi = routesAlias.getConfig(pagePath)) === null || _routesAlias$getConfi === void 0 ? void 0 : _routesAlias$getConfi.includes(routePath));
2172
+ });
2173
+ }
2174
+ }, {
2175
+ key: "isTabBar",
2176
+ get: function get() {
2177
+ var _Object$entries$find;
2178
+
2179
+ var routePath = stripBasename(this.pathname, this.basename);
2180
+ var pagePath = ((_Object$entries$find = Object.entries(this.customRoutes).find(function (_ref) {
2181
+ var _ref2 = _slicedToArray__default['default'](_ref, 2),
2182
+ target = _ref2[1];
2183
+
2184
+ if (typeof target === 'string') {
2185
+ return target === routePath;
2186
+ } else if ((target === null || target === void 0 ? void 0 : target.length) > 0) {
2187
+ return target.includes(routePath);
2188
+ }
2189
+
2190
+ return false;
2191
+ })) === null || _Object$entries$find === void 0 ? void 0 : _Object$entries$find[0]) || routePath;
2192
+ return !!pagePath && this.tabBarList.some(function (t) {
2193
+ return t.pagePath === pagePath;
2194
+ });
2195
+ }
2196
+ }, {
2197
+ key: "isSamePage",
2198
+ value: function isSamePage(page) {
2199
+ var routePath = stripBasename(this.pathname, this.basename);
2200
+ var pagePath = stripBasename(page === null || page === void 0 ? void 0 : page.path, this.basename);
2201
+ return pagePath.startsWith(routePath + '?');
2202
+ }
2203
+ }, {
2204
+ key: "search",
2205
+ get: function get() {
2206
+ var search = '?';
2207
+
2208
+ if (this.routerMode === 'hash') {
2209
+ var idx = location.hash.indexOf('?');
2210
+
2211
+ if (idx > -1) {
2212
+ search = location.hash.slice(idx);
2213
+ }
2214
+ } else {
2215
+ search = location.search;
2216
+ }
2217
+
2218
+ return search.substr(1);
2219
+ }
2220
+ }, {
2221
+ key: "getQuery",
2222
+ value: function getQuery() {
2223
+ var stamp = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : 0;
2224
+ var search = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : '';
2225
+ var options = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {};
2226
+ search = search ? "".concat(search, "&").concat(this.search) : this.search;
2227
+ var query = search ? queryString.parse(search) : {};
2228
+ query.stamp = stamp.toString();
2229
+ return _objectSpread__default['default'](_objectSpread__default['default']({}, query), options);
2230
+ }
2231
+ }, {
2232
+ key: "mount",
2233
+ value: function mount() {
2234
+ var _document$getElementB;
2235
+
2236
+ setHistoryMode(this.routerMode, this.router.basename);
2237
+ (_document$getElementB = document.getElementById('app')) === null || _document$getElementB === void 0 ? void 0 : _document$getElementB.remove();
2238
+ this.animation && loadAnimateStyle(this.animationDuration);
2239
+ var app = document.createElement('div');
2240
+ app.id = this.appId;
2241
+ app.classList.add('taro_router');
2242
+
2243
+ if (this.tabBarList.length > 1) {
2244
+ var container = document.createElement('div');
2245
+ container.classList.add('taro-tabbar__container');
2246
+ container.id = 'container';
2247
+ var panel = document.createElement('div');
2248
+ panel.classList.add('taro-tabbar__panel');
2249
+ panel.appendChild(app);
2250
+ container.appendChild(panel);
2251
+ document.body.appendChild(container);
2252
+ initTabbar(this.config);
2253
+ } else {
2254
+ document.body.appendChild(app);
2255
+ }
2256
+ }
2257
+ }, {
2258
+ key: "onReady",
2259
+ value: function onReady(page) {
2260
+ var onLoad = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : true;
2261
+ var pageEl = this.getPageContainer(page);
2262
+
2263
+ if (pageEl && !(pageEl !== null && pageEl !== void 0 && pageEl['__isReady'])) {
2264
+ var _el$componentOnReady, _el$componentOnReady$;
2265
+
2266
+ var el = pageEl.firstElementChild;
2267
+ el === null || el === void 0 ? void 0 : (_el$componentOnReady = el['componentOnReady']) === null || _el$componentOnReady === void 0 ? void 0 : (_el$componentOnReady$ = _el$componentOnReady.call(el)) === null || _el$componentOnReady$ === void 0 ? void 0 : _el$componentOnReady$.then(function () {
2268
+ runtime.requestAnimationFrame(function () {
2269
+ var _page$onReady;
2270
+
2271
+ (_page$onReady = page.onReady) === null || _page$onReady === void 0 ? void 0 : _page$onReady.call(page);
2272
+ pageEl['__isReady'] = true;
2273
+ });
2274
+ });
2275
+ onLoad && (pageEl['__page'] = page);
2276
+ }
2277
+ }
2278
+ }, {
2279
+ key: "load",
2280
+ value: function load(page) {
2281
+ var _this2 = this;
2282
+
2283
+ var pageConfig = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};
2284
+ var stacksIndex = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : 0;
2285
+ if (!page) return; // NOTE: 页面栈推入太晚可能导致 getCurrentPages 无法获取到当前页面实例
2286
+
2287
+ stacks.push(page);
2288
+ var param = this.getQuery(stacks.length, '', page.options);
2289
+ var pageEl = this.getPageContainer(page);
2290
+
2291
+ if (pageEl) {
2292
+ var _page$onShow;
2293
+
2294
+ setDisplay(pageEl);
2295
+ this.isTabBar && pageEl.classList.add('taro_tabbar_page');
2296
+ this.addAnimation(pageEl, stacksIndex === 0);
2297
+ (_page$onShow = page.onShow) === null || _page$onShow === void 0 ? void 0 : _page$onShow.call(page);
2298
+ this.bindPageEvents(page, pageEl, pageConfig);
2299
+ } else {
2300
+ var _page$onLoad;
2301
+
2302
+ (_page$onLoad = page.onLoad) === null || _page$onLoad === void 0 ? void 0 : _page$onLoad.call(page, param, function () {
2303
+ var _pageEl, _page$onShow2;
2304
+
2305
+ pageEl = _this2.getPageContainer(page);
2306
+ _this2.isTabBar && ((_pageEl = pageEl) === null || _pageEl === void 0 ? void 0 : _pageEl.classList.add('taro_tabbar_page'));
2307
+
2308
+ _this2.addAnimation(pageEl, stacksIndex === 0);
2309
+
2310
+ _this2.onReady(page, true);
2311
+
2312
+ (_page$onShow2 = page.onShow) === null || _page$onShow2 === void 0 ? void 0 : _page$onShow2.call(page);
2313
+
2314
+ _this2.bindPageEvents(page, pageEl, pageConfig);
2315
+ });
2316
+ }
2317
+ }
2318
+ }, {
2319
+ key: "unload",
2320
+ value: function unload(page) {
2321
+ var _this3 = this;
2322
+
2323
+ var delta = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 1;
2324
+ var top = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : false;
2325
+ if (!page) return;
2326
+ stacks.delta = --delta;
2327
+ stacks.pop();
2328
+
2329
+ if (this.animation && top) {
2330
+ if (this.unloadTimer) {
2331
+ var _this$lastUnloadPage, _this$lastUnloadPage$;
2332
+
2333
+ clearTimeout(this.unloadTimer);
2334
+ (_this$lastUnloadPage = this.lastUnloadPage) === null || _this$lastUnloadPage === void 0 ? void 0 : (_this$lastUnloadPage$ = _this$lastUnloadPage.onUnload) === null || _this$lastUnloadPage$ === void 0 ? void 0 : _this$lastUnloadPage$.call(_this$lastUnloadPage);
2335
+ this.unloadTimer = null;
2336
+ }
2337
+
2338
+ this.lastUnloadPage = page;
2339
+ var pageEl = this.getPageContainer(page);
2340
+ pageEl === null || pageEl === void 0 ? void 0 : pageEl.classList.remove('taro_page_stationed');
2341
+ pageEl === null || pageEl === void 0 ? void 0 : pageEl.classList.remove('taro_page_show');
2342
+ this.unloadTimer = setTimeout(function () {
2343
+ var _this3$lastUnloadPage, _this3$lastUnloadPage2;
2344
+
2345
+ _this3.unloadTimer = null;
2346
+ (_this3$lastUnloadPage = _this3.lastUnloadPage) === null || _this3$lastUnloadPage === void 0 ? void 0 : (_this3$lastUnloadPage2 = _this3$lastUnloadPage.onUnload) === null || _this3$lastUnloadPage2 === void 0 ? void 0 : _this3$lastUnloadPage2.call(_this3$lastUnloadPage);
2347
+ }, this.animationDuration);
2348
+ } else {
2349
+ var _page$onUnload;
2350
+
2351
+ var _pageEl2 = this.getPageContainer(page);
2352
+
2353
+ _pageEl2 === null || _pageEl2 === void 0 ? void 0 : _pageEl2.classList.remove('taro_page_stationed');
2354
+ _pageEl2 === null || _pageEl2 === void 0 ? void 0 : _pageEl2.classList.remove('taro_page_show');
2355
+ page === null || page === void 0 ? void 0 : (_page$onUnload = page.onUnload) === null || _page$onUnload === void 0 ? void 0 : _page$onUnload.call(page);
2356
+ }
2357
+
2358
+ if (delta >= 1) this.unload(stacks.last, delta);
2359
+ }
2360
+ }, {
2361
+ key: "show",
2362
+ value: function show(page) {
2363
+ var _this4 = this;
2364
+
2365
+ var pageConfig = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};
2366
+ var stacksIndex = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : 0;
2367
+ if (!page) return;
2368
+ var param = this.getQuery(stacks.length, '', page.options);
2369
+ var pageEl = this.getPageContainer(page);
2370
+
2371
+ if (pageEl) {
2372
+ var _page$onShow3;
2373
+
2374
+ setDisplay(pageEl);
2375
+ this.addAnimation(pageEl, stacksIndex === 0);
2376
+ (_page$onShow3 = page.onShow) === null || _page$onShow3 === void 0 ? void 0 : _page$onShow3.call(page);
2377
+ this.bindPageEvents(page, pageEl, pageConfig);
2378
+ } else {
2379
+ var _page$onLoad2;
2380
+
2381
+ (_page$onLoad2 = page.onLoad) === null || _page$onLoad2 === void 0 ? void 0 : _page$onLoad2.call(page, param, function () {
2382
+ var _page$onShow4;
2383
+
2384
+ pageEl = _this4.getPageContainer(page);
2385
+
2386
+ _this4.addAnimation(pageEl, stacksIndex === 0);
2387
+
2388
+ _this4.onReady(page, false);
2389
+
2390
+ (_page$onShow4 = page.onShow) === null || _page$onShow4 === void 0 ? void 0 : _page$onShow4.call(page);
2391
+
2392
+ _this4.bindPageEvents(page, pageEl, pageConfig);
2393
+ });
2394
+ }
2395
+ }
2396
+ }, {
2397
+ key: "hide",
2398
+ value: function hide(page) {
2399
+ var _this5 = this;
2400
+
2401
+ if (!page) return; // NOTE: 修复多页并发问题,此处可能因为路由跳转过快,执行时页面可能还没有创建成功
2402
+
2403
+ var pageEl = this.getPageContainer(page);
2404
+
2405
+ if (pageEl) {
2406
+ var _page$onHide;
2407
+
2408
+ if (this.hideTimer) {
2409
+ clearTimeout(this.hideTimer);
2410
+ this.hideTimer = null;
2411
+ setDisplay(this.lastHidePage, 'none');
2412
+ }
2413
+
2414
+ this.lastHidePage = pageEl;
2415
+ this.hideTimer = setTimeout(function () {
2416
+ _this5.hideTimer = null;
2417
+ setDisplay(_this5.lastHidePage, 'none');
2418
+ }, this.animationDuration + this.animationDelay);
2419
+ (_page$onHide = page.onHide) === null || _page$onHide === void 0 ? void 0 : _page$onHide.call(page);
2420
+ } else {
2421
+ setTimeout(function () {
2422
+ return _this5.hide(page);
2423
+ }, 0);
2424
+ }
2425
+ }
2426
+ }, {
2427
+ key: "addAnimation",
2428
+ value: function addAnimation(pageEl) {
2429
+ var _this6 = this;
2430
+
2431
+ var first = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : false;
2432
+ if (!pageEl) return;
2433
+
2434
+ if (this.animation && !first) {
2435
+ setTimeout(function () {
2436
+ pageEl.classList.add('taro_page_show');
2437
+ setTimeout(function () {
2438
+ pageEl.classList.add('taro_page_stationed');
2439
+ }, _this6.animationDuration);
2440
+ }, this.animationDelay);
2441
+ } else {
2442
+ pageEl.classList.add('taro_page_show');
2443
+ pageEl.classList.add('taro_page_stationed');
2444
+ }
2445
+ }
2446
+ }, {
2447
+ key: "getPageContainer",
2448
+ value: function getPageContainer(page) {
2449
+ var _Current$page;
2450
+
2451
+ var path = page ? page === null || page === void 0 ? void 0 : page.path : (_Current$page = runtime.Current.page) === null || _Current$page === void 0 ? void 0 : _Current$page.path;
2452
+ var id = path === null || path === void 0 ? void 0 : path.replace(/([^a-z0-9\u00a0-\uffff_-])/ig, '\\$1');
2453
+
2454
+ if (page) {
2455
+ return document.querySelector(".taro_page#".concat(id));
2456
+ }
2457
+
2458
+ var el = id ? document.querySelector(".taro_page#".concat(id)) : document.querySelector('.taro_page') || document.querySelector('.taro_router');
2459
+ return el || window;
2460
+ }
2461
+ }, {
2462
+ key: "bindPageEvents",
2463
+ value: function bindPageEvents(page, pageEl) {
2464
+ var _this$config$window;
2465
+
2466
+ var config = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {};
2467
+
2468
+ if (!pageEl) {
2469
+ pageEl = this.getPageContainer();
2470
+ }
2471
+
2472
+ var distance = config.onReachBottomDistance || ((_this$config$window = this.config.window) === null || _this$config$window === void 0 ? void 0 : _this$config$window.onReachBottomDistance) || 50;
2473
+ bindPageScroll(page, pageEl, distance);
2474
+ bindPageResize(page);
2475
+ }
2476
+ }]);
2477
+
2478
+ return PageHandler;
2479
+ }();
2480
+
2481
+ function createRouter(app, config, framework) {
2482
+ var _routes$0$path, _app$onLaunch, _app$onShow;
2483
+
2484
+ var handler = new PageHandler(config);
2485
+ var runtimeHooks = runtime.container.get(runtime.SERVICE_IDENTIFIER.Hooks);
2486
+ routesAlias.set(handler.router.customRoutes);
2487
+ var basename = handler.router.basename;
2488
+ var routes = handler.routes.map(function (route) {
2489
+ return {
2490
+ path: routesAlias.getAll(addLeadingSlash(route.path)),
2491
+ action: route.load
2492
+ };
2493
+ });
2494
+ var entryPagePath = config.entryPagePath || ((_routes$0$path = routes[0].path) === null || _routes$0$path === void 0 ? void 0 : _routes$0$path[0]);
2128
2495
  var router = new UniversalRouter(routes, {
2129
2496
  baseUrl: basename || ''
2130
2497
  });
2131
- app.onLaunch();
2498
+ var launchParam = handler.getQuery(stacks.length);
2499
+ (_app$onLaunch = app.onLaunch) === null || _app$onLaunch === void 0 ? void 0 : _app$onLaunch.call(app, launchParam);
2132
2500
 
2133
2501
  var render = /*#__PURE__*/function () {
2134
2502
  var _ref2 = _asyncToGenerator__default['default']( /*#__PURE__*/_regeneratorRuntime__default['default'].mark(function _callee(_ref) {
2135
- var location, action, element, _app$onPageNotFound, pageConfig, enablePullDownRefresh, _pageConfig$navigatio, currentPage, pathname, shouldLoad, prevIndex, delta, _prevIndex, _element$default, _runtimeHooks$createP, el, loadConfig, stacksIndex, page;
2503
+ var _config$window;
2504
+
2505
+ var location, action, element, _app$onPageNotFound, pageConfig, enablePullDownRefresh, _pageConfig$navigatio, currentPage, pathname, shouldLoad, prevIndex, delta, _prevIndex, _delta, _element$default, _runtimeHooks$createP, el, loadConfig, stacksIndex, page;
2136
2506
 
2137
2507
  return _regeneratorRuntime__default['default'].wrap(function _callee$(_context) {
2138
2508
  while (1) {
2139
2509
  switch (_context.prev = _context.next) {
2140
2510
  case 0:
2141
2511
  location = _ref.location, action = _ref.action;
2142
- routerConfig.router.pathname = location.pathname;
2512
+ handler.pathname = location.pathname;
2143
2513
  _context.prev = 2;
2144
2514
  _context.next = 5;
2145
- return router.resolve(config.router.forcePath || location.pathname);
2515
+ return router.resolve(handler.router.forcePath || handler.pathname);
2146
2516
 
2147
2517
  case 5:
2148
2518
  element = _context.sent;
@@ -2159,7 +2529,7 @@ function createRouter(app, config, framework) {
2159
2529
  }
2160
2530
 
2161
2531
  (_app$onPageNotFound = app.onPageNotFound) === null || _app$onPageNotFound === void 0 ? void 0 : _app$onPageNotFound.call(app, {
2162
- path: location.pathname
2532
+ path: handler.pathname
2163
2533
  });
2164
2534
  _context.next = 15;
2165
2535
  break;
@@ -2176,24 +2546,24 @@ function createRouter(app, config, framework) {
2176
2546
  return _context.abrupt("return");
2177
2547
 
2178
2548
  case 17:
2179
- pageConfig = config.routes.find(function (r) {
2180
- var path = addLeadingSlash(r.path);
2181
- return path === location.pathname || alias[path] === location.pathname;
2182
- });
2183
- enablePullDownRefresh = false;
2549
+ pageConfig = handler.pageConfig;
2550
+ enablePullDownRefresh = (config === null || config === void 0 ? void 0 : (_config$window = config.window) === null || _config$window === void 0 ? void 0 : _config$window.enablePullDownRefresh) || false;
2184
2551
  runtime.eventCenter.trigger('__taroRouterChange', {
2185
2552
  toLocation: {
2186
- path: location.pathname
2553
+ path: handler.pathname
2187
2554
  }
2188
2555
  });
2189
2556
 
2190
2557
  if (pageConfig) {
2191
2558
  document.title = (_pageConfig$navigatio = pageConfig.navigationBarTitleText) !== null && _pageConfig$navigatio !== void 0 ? _pageConfig$navigatio : document.title;
2192
- enablePullDownRefresh = pageConfig.enablePullDownRefresh;
2559
+
2560
+ if (typeof pageConfig.enablePullDownRefresh === 'boolean') {
2561
+ enablePullDownRefresh = pageConfig.enablePullDownRefresh;
2562
+ }
2193
2563
  }
2194
2564
 
2195
2565
  currentPage = runtime.Current.page;
2196
- pathname = location.pathname;
2566
+ pathname = handler.pathname;
2197
2567
  shouldLoad = false;
2198
2568
 
2199
2569
  if (!(action === 'POP')) {
@@ -2204,62 +2574,60 @@ function createRouter(app, config, framework) {
2204
2574
  // NOTE: 浏览器事件退后多次时,该事件只会被触发一次
2205
2575
  prevIndex = stacks.getPrevIndex(pathname);
2206
2576
  delta = stacks.getDelta(pathname);
2207
- unloadPage(currentPage, delta);
2577
+ handler.unload(currentPage, delta, prevIndex > -1);
2208
2578
 
2209
2579
  if (prevIndex > -1) {
2210
- showPage(stacks.getItem(prevIndex), pageConfig, prevIndex);
2580
+ handler.show(stacks.getItem(prevIndex), pageConfig, prevIndex);
2211
2581
  } else {
2212
2582
  shouldLoad = true;
2213
2583
  }
2214
2584
 
2215
- _context.next = 46;
2585
+ _context.next = 42;
2216
2586
  break;
2217
2587
 
2218
2588
  case 31:
2219
- if (!(action === 'PUSH')) {
2220
- _context.next = 36;
2589
+ if (!handler.isTabBar) {
2590
+ _context.next = 40;
2221
2591
  break;
2222
2592
  }
2223
2593
 
2224
- hidePage(currentPage);
2225
- shouldLoad = true;
2226
- _context.next = 46;
2227
- break;
2228
-
2229
- case 36:
2230
- if (!(action === 'REPLACE')) {
2231
- _context.next = 46;
2594
+ if (!handler.isSamePage(currentPage)) {
2595
+ _context.next = 34;
2232
2596
  break;
2233
2597
  }
2234
2598
 
2235
- if (!isTabBar(config)) {
2236
- _context.next = 44;
2237
- break;
2238
- }
2599
+ return _context.abrupt("return");
2239
2600
 
2240
- hidePage(currentPage);
2241
- _prevIndex = stacks.getPrevIndex(pathname);
2601
+ case 34:
2602
+ _prevIndex = stacks.getPrevIndex(pathname, 0);
2603
+ handler.hide(currentPage);
2242
2604
 
2243
2605
  if (!(_prevIndex > -1)) {
2244
- _context.next = 42;
2606
+ _context.next = 38;
2245
2607
  break;
2246
2608
  }
2247
2609
 
2248
- return _context.abrupt("return", showPage(stacks.getItem(_prevIndex), pageConfig, _prevIndex));
2610
+ return _context.abrupt("return", handler.show(stacks.getItem(_prevIndex), pageConfig, _prevIndex));
2249
2611
 
2250
- case 42:
2251
- _context.next = 45;
2612
+ case 38:
2613
+ _context.next = 41;
2252
2614
  break;
2253
2615
 
2254
- case 44:
2255
- unloadPage(currentPage);
2616
+ case 40:
2617
+ if (action === 'REPLACE') {
2618
+ _delta = stacks.getDelta(pathname); // NOTE: 页面路由记录并不会清空,只是移除掉缓存的 stack 以及页面
2256
2619
 
2257
- case 45:
2620
+ handler.unload(currentPage, _delta);
2621
+ } else if (action === 'PUSH') {
2622
+ handler.hide(currentPage);
2623
+ }
2624
+
2625
+ case 41:
2258
2626
  shouldLoad = true;
2259
2627
 
2260
- case 46:
2628
+ case 42:
2261
2629
  if (!(shouldLoad || stacks.length < 1)) {
2262
- _context.next = 54;
2630
+ _context.next = 50;
2263
2631
  break;
2264
2632
  }
2265
2633
 
@@ -2268,10 +2636,10 @@ function createRouter(app, config, framework) {
2268
2636
  stacksIndex = stacks.length;
2269
2637
  delete loadConfig['path'];
2270
2638
  delete loadConfig['load'];
2271
- page = runtime.createPageConfig(enablePullDownRefresh ? (_runtimeHooks$createP = runtimeHooks.createPullDownComponent) === null || _runtimeHooks$createP === void 0 ? void 0 : _runtimeHooks$createP.call(runtimeHooks, el, location.pathname, framework, routerConfig.PullDownRefresh) : el, pathname + runtime.stringify(qs(stacksIndex)), {}, loadConfig);
2272
- return _context.abrupt("return", loadPage(page, pageConfig, stacksIndex));
2639
+ page = runtime.createPageConfig(enablePullDownRefresh ? (_runtimeHooks$createP = runtimeHooks.createPullDownComponent) === null || _runtimeHooks$createP === void 0 ? void 0 : _runtimeHooks$createP.call(runtimeHooks, el, location.pathname, framework, handler.PullDownRefresh) : el, pathname + runtime.stringify(handler.getQuery(stacksIndex)), {}, loadConfig);
2640
+ return _context.abrupt("return", handler.load(page, pageConfig, stacksIndex));
2273
2641
 
2274
- case 54:
2642
+ case 50:
2275
2643
  case "end":
2276
2644
  return _context.stop();
2277
2645
  }
@@ -2285,14 +2653,14 @@ function createRouter(app, config, framework) {
2285
2653
  }();
2286
2654
 
2287
2655
  if (exports.history.location.pathname === '/') {
2288
- exports.history.replace(prependBasename(routes[0].path + exports.history.location.search));
2656
+ exports.history.replace(prependBasename(entryPagePath + exports.history.location.search));
2289
2657
  }
2290
2658
 
2291
2659
  render({
2292
2660
  location: exports.history.location,
2293
2661
  action: r.Push
2294
2662
  });
2295
- app.onShow(qs(stacks.length));
2663
+ (_app$onShow = app.onShow) === null || _app$onShow === void 0 ? void 0 : _app$onShow.call(app, launchParam);
2296
2664
  return exports.history.listen(render);
2297
2665
  }
2298
2666