santi 0.0.0-beta.39 → 0.0.0-beta.42

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.
@@ -5,6 +5,7 @@
5
5
  const path = require('path')
6
6
  const Prerenderer = require('@prerenderer/prerenderer')
7
7
  const { minify } = require('html-minifier')
8
+ const express = require('express')
8
9
 
9
10
  function PrerenderSPAPlugin(...args) {
10
11
  const rendererOptions = {} // Primarily for backwards-compatibility.
@@ -78,10 +79,19 @@ PrerenderSPAPlugin.prototype.apply = function(compiler) {
78
79
 
79
80
  const afterEmit = (compilation, done) => {
80
81
  const PrerendererInstance = new Prerenderer(this._options)
82
+ const publicPath = this._options.publicPath !== '/' ? this._options.publicPath.replace(/\/$/, '') : '/'
83
+
84
+ if (publicPath !== '/') {
85
+ PrerendererInstance._server._expressServer.use(publicPath, express.static(this._options.staticDir, {
86
+ dotfiles: 'allow'
87
+ }))
88
+ }
81
89
 
82
90
  PrerendererInstance.initialize()
83
91
  .then(() => {
84
- return PrerendererInstance.renderRoutes(this._options.routes || [])
92
+ return PrerendererInstance.renderRoutes(this._options.routes.map(route => (
93
+ publicPath !== '/' ? `${publicPath}${route}` : route
94
+ )) || [])
85
95
  })
86
96
  // Backwards-compatibility with v2 (postprocessHTML should be migrated to postProcess)
87
97
  .then(renderedRoutes =>
@@ -132,7 +142,7 @@ PrerenderSPAPlugin.prototype.apply = function(compiler) {
132
142
  if (!rendered.outputPath) {
133
143
  rendered.outputPath = path.join(
134
144
  this._options.outputDir || this._options.staticDir,
135
- rendered.route,
145
+ publicPath !== '/' ? rendered.route.replace(publicPath, '') : rendered.route,
136
146
  'index.html'
137
147
  )
138
148
  }
package/config/index.js CHANGED
@@ -98,6 +98,7 @@ module.exports = {
98
98
  new PrerenderSPAPlugin({
99
99
  // Required - The path to the webpack-outputted app to prerender.
100
100
  staticDir: paths.appBuild,
101
+ publicPath: paths.publicUrlOrPath,
101
102
  // Required - Routes to render.
102
103
  routes: prerenderRoutes,
103
104
  server: {
@@ -132,6 +133,6 @@ module.exports = {
132
133
  ),
133
134
  devServer: overrideDevServer.apply(
134
135
  null,
135
- [...devServer, addDevProxy()].filter(Boolean)
136
+ [...devServer, addDevProxy({ publicPath: paths.publicUrlOrPath })].filter(Boolean)
136
137
  ),
137
138
  }
@@ -5,7 +5,7 @@ const { devSsr, getConfig } = require('../../server')
5
5
 
6
6
  const { ssr, mode, proxy: proxyTable } = getConfig()
7
7
 
8
- const addDevProxy = () => (config) => {
8
+ const addDevProxy = ({ publicPath } = {}) => (config) => {
9
9
  const originBefore = config.before
10
10
  const originOnListening = config.onListening
11
11
 
@@ -27,6 +27,7 @@ const addDevProxy = () => (config) => {
27
27
  app.use(
28
28
  devSsr({
29
29
  ...ssr,
30
+ publicPath,
30
31
  logError: false,
31
32
  renderAfterTimeout: ssr.timeout || 1000,
32
33
  ejectPortModifier(modifier) {
package/index.d.ts CHANGED
@@ -3,6 +3,44 @@ import hoistStatics from 'hoist-non-react-statics';
3
3
  import NodeKey from 'react-node-key';
4
4
  import ReactDOM from 'react-dom';
5
5
 
6
+ function ownKeys(object, enumerableOnly) {
7
+ var keys = Object.keys(object);
8
+
9
+ if (Object.getOwnPropertySymbols) {
10
+ var symbols = Object.getOwnPropertySymbols(object);
11
+
12
+ if (enumerableOnly) {
13
+ symbols = symbols.filter(function (sym) {
14
+ return Object.getOwnPropertyDescriptor(object, sym).enumerable;
15
+ });
16
+ }
17
+
18
+ keys.push.apply(keys, symbols);
19
+ }
20
+
21
+ return keys;
22
+ }
23
+
24
+ function _objectSpread2(target) {
25
+ for (var i = 1; i < arguments.length; i++) {
26
+ var source = arguments[i] != null ? arguments[i] : {};
27
+
28
+ if (i % 2) {
29
+ ownKeys(Object(source), true).forEach(function (key) {
30
+ _defineProperty(target, key, source[key]);
31
+ });
32
+ } else if (Object.getOwnPropertyDescriptors) {
33
+ Object.defineProperties(target, Object.getOwnPropertyDescriptors(source));
34
+ } else {
35
+ ownKeys(Object(source)).forEach(function (key) {
36
+ Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key));
37
+ });
38
+ }
39
+ }
40
+
41
+ return target;
42
+ }
43
+
6
44
  function asyncGeneratorStep(gen, resolve, reject, _next, _throw, key, arg) {
7
45
  try {
8
46
  var info = gen[key](arg);
@@ -72,40 +110,6 @@ function _extends() {
72
110
  return _extends.apply(this, arguments);
73
111
  }
74
112
 
75
- function ownKeys(object, enumerableOnly) {
76
- var keys = Object.keys(object);
77
-
78
- if (Object.getOwnPropertySymbols) {
79
- var symbols = Object.getOwnPropertySymbols(object);
80
- if (enumerableOnly) symbols = symbols.filter(function (sym) {
81
- return Object.getOwnPropertyDescriptor(object, sym).enumerable;
82
- });
83
- keys.push.apply(keys, symbols);
84
- }
85
-
86
- return keys;
87
- }
88
-
89
- function _objectSpread2(target) {
90
- for (var i = 1; i < arguments.length; i++) {
91
- var source = arguments[i] != null ? arguments[i] : {};
92
-
93
- if (i % 2) {
94
- ownKeys(Object(source), true).forEach(function (key) {
95
- _defineProperty(target, key, source[key]);
96
- });
97
- } else if (Object.getOwnPropertyDescriptors) {
98
- Object.defineProperties(target, Object.getOwnPropertyDescriptors(source));
99
- } else {
100
- ownKeys(Object(source)).forEach(function (key) {
101
- Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key));
102
- });
103
- }
104
- }
105
-
106
- return target;
107
- }
108
-
109
113
  function _objectWithoutPropertiesLoose(source, excluded) {
110
114
  if (source == null) return {};
111
115
  var target = {};
@@ -151,14 +155,17 @@ function _arrayWithHoles(arr) {
151
155
  }
152
156
 
153
157
  function _iterableToArrayLimit(arr, i) {
154
- if (typeof Symbol === "undefined" || !(Symbol.iterator in Object(arr))) return;
158
+ var _i = arr == null ? null : typeof Symbol !== "undefined" && arr[Symbol.iterator] || arr["@@iterator"];
159
+
160
+ if (_i == null) return;
155
161
  var _arr = [];
156
162
  var _n = true;
157
163
  var _d = false;
158
- var _e = undefined;
164
+
165
+ var _s, _e;
159
166
 
160
167
  try {
161
- for (var _i = arr[Symbol.iterator](), _s; !(_n = (_s = _i.next()).done); _n = true) {
168
+ for (_i = _i.call(arr); !(_n = (_s = _i.next()).done); _n = true) {
162
169
  _arr.push(_s.value);
163
170
 
164
171
  if (i && _arr.length === i) break;
@@ -310,6 +317,7 @@ var promiseGuess = function promiseGuess(executor, valuer) {
310
317
  };
311
318
  };
312
319
 
320
+ var _excluded = ["forwardRef", "__key"];
313
321
  var _filehash = "nNBh";
314
322
  var context = /*#__PURE__*/createContext();
315
323
  var Provider = context.Provider;
@@ -318,7 +326,7 @@ function withSanti(Component) {
318
326
  function WrappedComponent(_ref) {
319
327
  var forwardRef = _ref.forwardRef,
320
328
  nodeKey = _ref.__key,
321
- props = _objectWithoutProperties(_ref, ["forwardRef", "__key"]);
329
+ props = _objectWithoutProperties(_ref, _excluded);
322
330
 
323
331
  var count = 0;
324
332
  var contextValue = useMemo(function () {
@@ -497,6 +505,7 @@ function useState(initialState, key) {
497
505
  }, nodeKey];
498
506
  }
499
507
 
508
+ var _excluded$1 = ["forwardedRef"];
500
509
  var _filehash$1 = "8NS2";
501
510
 
502
511
  var getInitialProps = function getInitialProps(fetch) {
@@ -505,7 +514,7 @@ var getInitialProps = function getInitialProps(fetch) {
505
514
  return function (Component) {
506
515
  function WrappedComponent(_ref) {
507
516
  var forwardedRef = _ref.forwardedRef,
508
- props = _objectWithoutProperties(_ref, ["forwardedRef"]);
517
+ props = _objectWithoutProperties(_ref, _excluded$1);
509
518
 
510
519
  var _useState = useState$1(false),
511
520
  _useState2 = _slicedToArray(_useState, 2),
@@ -10,6 +10,44 @@ var hoistStatics = _interopDefault(require('hoist-non-react-statics'));
10
10
  var NodeKey = _interopDefault(require('react-node-key'));
11
11
  var ReactDOM = _interopDefault(require('react-dom'));
12
12
 
13
+ function ownKeys(object, enumerableOnly) {
14
+ var keys = Object.keys(object);
15
+
16
+ if (Object.getOwnPropertySymbols) {
17
+ var symbols = Object.getOwnPropertySymbols(object);
18
+
19
+ if (enumerableOnly) {
20
+ symbols = symbols.filter(function (sym) {
21
+ return Object.getOwnPropertyDescriptor(object, sym).enumerable;
22
+ });
23
+ }
24
+
25
+ keys.push.apply(keys, symbols);
26
+ }
27
+
28
+ return keys;
29
+ }
30
+
31
+ function _objectSpread2(target) {
32
+ for (var i = 1; i < arguments.length; i++) {
33
+ var source = arguments[i] != null ? arguments[i] : {};
34
+
35
+ if (i % 2) {
36
+ ownKeys(Object(source), true).forEach(function (key) {
37
+ _defineProperty(target, key, source[key]);
38
+ });
39
+ } else if (Object.getOwnPropertyDescriptors) {
40
+ Object.defineProperties(target, Object.getOwnPropertyDescriptors(source));
41
+ } else {
42
+ ownKeys(Object(source)).forEach(function (key) {
43
+ Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key));
44
+ });
45
+ }
46
+ }
47
+
48
+ return target;
49
+ }
50
+
13
51
  function asyncGeneratorStep(gen, resolve, reject, _next, _throw, key, arg) {
14
52
  try {
15
53
  var info = gen[key](arg);
@@ -79,40 +117,6 @@ function _extends() {
79
117
  return _extends.apply(this, arguments);
80
118
  }
81
119
 
82
- function ownKeys(object, enumerableOnly) {
83
- var keys = Object.keys(object);
84
-
85
- if (Object.getOwnPropertySymbols) {
86
- var symbols = Object.getOwnPropertySymbols(object);
87
- if (enumerableOnly) symbols = symbols.filter(function (sym) {
88
- return Object.getOwnPropertyDescriptor(object, sym).enumerable;
89
- });
90
- keys.push.apply(keys, symbols);
91
- }
92
-
93
- return keys;
94
- }
95
-
96
- function _objectSpread2(target) {
97
- for (var i = 1; i < arguments.length; i++) {
98
- var source = arguments[i] != null ? arguments[i] : {};
99
-
100
- if (i % 2) {
101
- ownKeys(Object(source), true).forEach(function (key) {
102
- _defineProperty(target, key, source[key]);
103
- });
104
- } else if (Object.getOwnPropertyDescriptors) {
105
- Object.defineProperties(target, Object.getOwnPropertyDescriptors(source));
106
- } else {
107
- ownKeys(Object(source)).forEach(function (key) {
108
- Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key));
109
- });
110
- }
111
- }
112
-
113
- return target;
114
- }
115
-
116
120
  function _objectWithoutPropertiesLoose(source, excluded) {
117
121
  if (source == null) return {};
118
122
  var target = {};
@@ -158,14 +162,17 @@ function _arrayWithHoles(arr) {
158
162
  }
159
163
 
160
164
  function _iterableToArrayLimit(arr, i) {
161
- if (typeof Symbol === "undefined" || !(Symbol.iterator in Object(arr))) return;
165
+ var _i = arr == null ? null : typeof Symbol !== "undefined" && arr[Symbol.iterator] || arr["@@iterator"];
166
+
167
+ if (_i == null) return;
162
168
  var _arr = [];
163
169
  var _n = true;
164
170
  var _d = false;
165
- var _e = undefined;
171
+
172
+ var _s, _e;
166
173
 
167
174
  try {
168
- for (var _i = arr[Symbol.iterator](), _s; !(_n = (_s = _i.next()).done); _n = true) {
175
+ for (_i = _i.call(arr); !(_n = (_s = _i.next()).done); _n = true) {
169
176
  _arr.push(_s.value);
170
177
 
171
178
  if (i && _arr.length === i) break;
@@ -317,6 +324,7 @@ var promiseGuess = function promiseGuess(executor, valuer) {
317
324
  };
318
325
  };
319
326
 
327
+ var _excluded = ["forwardRef", "__key"];
320
328
  var _filehash = "nNBh";
321
329
  var context = /*#__PURE__*/React.createContext();
322
330
  var Provider = context.Provider;
@@ -325,7 +333,7 @@ function withSanti(Component) {
325
333
  function WrappedComponent(_ref) {
326
334
  var forwardRef = _ref.forwardRef,
327
335
  nodeKey = _ref.__key,
328
- props = _objectWithoutProperties(_ref, ["forwardRef", "__key"]);
336
+ props = _objectWithoutProperties(_ref, _excluded);
329
337
 
330
338
  var count = 0;
331
339
  var contextValue = React.useMemo(function () {
@@ -504,6 +512,7 @@ function useState(initialState, key) {
504
512
  }, nodeKey];
505
513
  }
506
514
 
515
+ var _excluded$1 = ["forwardedRef"];
507
516
  var _filehash$1 = "8NS2";
508
517
 
509
518
  var getInitialProps = function getInitialProps(fetch) {
@@ -512,7 +521,7 @@ var getInitialProps = function getInitialProps(fetch) {
512
521
  return function (Component) {
513
522
  function WrappedComponent(_ref) {
514
523
  var forwardedRef = _ref.forwardedRef,
515
- props = _objectWithoutProperties(_ref, ["forwardedRef"]);
524
+ props = _objectWithoutProperties(_ref, _excluded$1);
516
525
 
517
526
  var _useState = React.useState(false),
518
527
  _useState2 = _slicedToArray(_useState, 2),
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sources":["../../client/helpers/base/is/index.js","../../client/helpers/base/try/index.js","../../client/helpers/utils.js","../../client/withSanti.js","../../client/store.js","../../client/useState.js","../../client/getInitialProps.js","../../client/ready.js","../../client/components/Container/index.js","../../client/render.js","../../client/components/Ready/index.js","../../client/components/NoSSR/index.js","../../client/index.js"],"sourcesContent":["// 值类型判断 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++\nexport const isUndefined = val => typeof val === 'undefined'\n\nexport const isNull = val => val === null\n\nexport const isFunction = val => typeof val === 'function'\n\nexport const isArray = val =>\n isFunction(Array.isArray) ? Array.isArray(val) : val instanceof Array\n\nexport const isRegExp = val => val instanceof RegExp\n\nexport const isObject = val =>\n typeof val === 'object' && !(isArray(val) || isNull(val))\n\nexport const isBoolean = val => typeof val === 'boolean'\n\nexport const isString = val => typeof val === 'string'\n\nexport const isExist = val => !(isUndefined(val) || isNull(val))\n\nexport const isNaN = val =>\n isFunction(Number.isNaN) ? Number.isNaN(val) : val !== val // eslint-disable-line\n\nexport const isNumber = val => typeof val === 'number' && !isNaN(val)\n\nexport const isPromiseLike = val => isExist(val) && isFunction(val.then)\n// 值类型判断 -------------------------------------------------------------\n","import { isString, isUndefined, isFunction, isNumber } from '../is'\n\nexport const get = (obj, keys = [], defaultValue) => {\n try {\n if (isNumber(keys)) {\n keys = String(keys)\n }\n let result = (isString(keys) ? keys.split('.') : keys).reduce(\n (res, key) => res[key],\n obj\n )\n return isUndefined(result) ? defaultValue : result\n } catch (e) {\n return defaultValue\n }\n}\n\nexport const run = (obj, keys = [], ...args) => {\n keys = isString(keys) ? keys.split('.') : keys\n\n const func = get(obj, keys)\n const context = get(obj, keys.slice(0, -1))\n\n return isFunction(func) ? func.call(context, ...args) : func\n}\n\nexport const value = (...values) =>\n values.reduce(\n (value, nextValue) => (isUndefined(value) ? run(nextValue) : run(value)),\n undefined\n )\n","import { isArray, isPromiseLike } from './base/is'\n\nexport const nextTick = (func) => Promise.resolve().then(func)\n\nexport const delay = (time) =>\n new Promise((resolve) => setTimeout(resolve, time))\n\n/**\n * [防抖]\n * @param {Function} func 执行函数\n * @param {Number} wait 多少毫秒后运行一次\n */\nexport const debounce = (func, wait = 16) => {\n let timeout\n\n return function (...args) {\n clearTimeout(timeout)\n\n timeout = setTimeout(() => {\n func.apply(this, args)\n }, wait)\n\n return timeout\n }\n}\n\n/**\n * [用来智能处理Promise类型返回值]\n * 当值生成过程为 promise 时,将得到 promise 类型返回值,按约定 resolve 最终值\n * 当过程不为 promise 时将直接得到值\n * @param {Function} executor 执行过程获取\n * @param {Function} valuer 值处理过程\n */\nexport const promiseGuess = (executor, valuer) =>\n function (...args) {\n let value = executor.apply(this, args)\n\n return isPromiseLike(value)\n ? new Promise((resolve) =>\n value\n .then((value) => resolve(valuer.call(this, null, value, ...args)))\n .catch((err) => resolve(valuer.call(this, err, undefined, ...args)))\n )\n : valuer.call(this, null, value, ...args)\n }\n\nexport function getKey2Id() {\n let uuid = 0\n const map = new Map()\n\n // 对每种 NodeType 做编号处理\n return function key2Id(key) {\n let id = map.get(key)\n\n if (!id) {\n id = (++uuid).toString(32)\n map.set(key, id)\n }\n\n return id\n }\n}\n\nexport function isBrowser() {\n return !window.__SSR__\n}\n\nexport function isPrerendering() {\n return !!window.__PR__\n}\n","import React, { forwardRef, createContext, useContext, useMemo } from 'react'\nimport hoistStatics from 'hoist-non-react-statics'\nimport NodeKey from 'react-node-key'\n\nconst context = createContext()\nconst { Provider } = context\n\nfunction withSanti(Component) {\n function WrappedComponent({ forwardRef, __key: nodeKey, ...props }) {\n let count = 0\n const contextValue = useMemo(\n () => ({\n nodeKey,\n getCountedKey: () => (nodeKey ? `${nodeKey}:${count++}` : undefined)\n }),\n [nodeKey]\n )\n\n return (\n <Provider value={contextValue}>\n <Component {...props} ref={forwardRef} />\n </Provider>\n )\n }\n\n const ForwardedRefHOC = forwardRef((props, ref) => (\n <NodeKey>\n {nodeKey => (\n <WrappedComponent {...props} forwardedRef={ref} __key={nodeKey} />\n )}\n </NodeKey>\n ))\n\n return hoistStatics(ForwardedRefHOC, WrappedComponent)\n}\n\nexport function useNodeKey() {\n return (\n useContext(context) || {\n nodeKey: undefined,\n getCountedKey: () => undefined\n }\n )\n}\n\nexport function useSID() {\n const { nodeKey: sid, getCountedKey: getCountedSID } = useNodeKey()\n return { sid, getCountedSID }\n}\n\nexport default withSanti\n","import { run, isUndefined, promiseGuess, isExist } from './helpers'\n\nconst KEY = '__SSRDATA__'\n\nfunction inject() {\n let script = document.getElementById(KEY) || document.createElement('script')\n script.id = KEY\n script.innerHTML = `window.${KEY}={};`\n document.head.appendChild(script)\n}\n\nfunction bootstrap() {\n if (window.__SSR__) {\n inject()\n } else {\n if (isExist(document.getElementById(KEY))) {\n window.__SSRED__ = true\n }\n }\n const data = window[KEY] || {}\n\n function remove(key) {\n delete data[key]\n }\n\n function set(key, value) {\n if (!window.__SSR__) {\n return\n }\n data[key] = value\n document.getElementById(KEY).innerHTML = `window.${KEY}=${JSON.stringify(\n data\n )};`\n }\n\n function get(key) {\n let value = data[key]\n remove(key) // 初始值只在 html 就绪后使用一次,使用即销毁\n return value\n }\n\n return { set, get, remove }\n}\n\nconst store = bootstrap()\n\nexport default {\n get: promiseGuess(\n (key, builder) => {\n if (!key && window.__SSR__) {\n // 若无 key 则 SSR 阶段不计算\n return undefined\n }\n\n let value\n\n if (!window.__SSR__) {\n value = store.get(key)\n }\n\n if (isUndefined(value)) {\n value = run(builder)\n }\n\n return value\n },\n (err, value, key) => {\n if (!key) {\n return [null, value]\n }\n\n if (err) {\n store.remove(key)\n return [err, undefined]\n }\n\n if (window.__SSR__) {\n store.set(key, value)\n }\n\n return [null, value]\n }\n ),\n set: store.set\n}\n","import { useState as useReactState } from 'react'\n\nimport { run, debounce } from './helpers'\nimport { useNodeKey } from './withSanti'\nimport store from './store'\n\nconst warningMissingKey = debounce(() => {\n if (window.__SSR__) {\n return\n }\n\n console.warn('You shouldn\\'t use \"santi.useState\" outside a \"withSanti\"')\n}, 32)\n\nfunction useState(initialState, key) {\n const { getCountedKey } = useNodeKey()\n const nodeKey = key || run(getCountedKey)\n const [state, setState] = useReactState(() => {\n if (!nodeKey) {\n warningMissingKey()\n }\n\n const [err, value] = store.get(nodeKey, initialState)\n\n if (err) {\n console.error(err)\n }\n\n return value\n })\n\n return [\n state,\n getNextState => {\n const nextState = run(getNextState, undefined, state)\n\n store.set(nodeKey, nextState)\n\n return setState(nextState)\n },\n nodeKey\n ]\n}\n\nexport default useState\n","import React, { useState, forwardRef, useRef, useEffect } from 'react'\nimport hoistStatics from 'hoist-non-react-statics'\n\nimport { run } from './helpers'\nimport withSanti, { useNodeKey } from './withSanti'\nimport store from './store'\n\nconst getInitialProps = (fetch, fallback = null, key) => Component => {\n function WrappedComponent({ forwardedRef, ...props }) {\n const [ready, setReady] = useState(false)\n const [ssrProps, setSsrProps] = useState({})\n const mounted = useRef(true)\n const { getCountedKey } = useNodeKey()\n const nodeKey = key || run(getCountedKey)\n\n useEffect(() => {\n async function init() {\n const [err, ssrProps] = await store.get(nodeKey, () =>\n run(fetch, undefined, props)\n )\n\n if (err) {\n console.error('[getInitialProps error]', err)\n return\n }\n\n if (mounted.current && ssrProps) {\n setSsrProps(ssrProps)\n setReady(true)\n }\n }\n\n init()\n\n return () => {\n mounted.current = false\n }\n }, [])\n\n return ready ? (\n <Component {...{ ...props, ...ssrProps }} ref={forwardedRef} />\n ) : (\n run(fallback, undefined, props)\n )\n }\n\n const ForwardedRefHOC = forwardRef((props, ref) => (\n <WrappedComponent {...props} forwardedRef={ref} />\n ))\n\n return withSanti(hoistStatics(ForwardedRefHOC, WrappedComponent))\n}\n\nexport default getInitialProps\n","import { delay } from './helpers'\n\nconst ready = async (delayMillisecond = -1) => {\n try {\n if (delayMillisecond && Number(delayMillisecond) >= 0) {\n await delay(delayMillisecond)\n }\n\n if (window.__SSR__ && !window.__SSRREADY__) {\n const script = document.createElement('script')\n script.innerHTML = 'window.__SSRREADY__=true'\n document.head.appendChild(script)\n }\n // ssr 阶段:通知 santi 可以采集页面内容\n // csr 阶段:通知 santi/render 已完成呈现\n document.dispatchEvent(new Event('ssr-ready'))\n } finally {\n // nothing\n }\n}\n\nexport default ready\n","import withSanti from '../../withSanti'\n\nexport default withSanti(({ children }) => children)\n","import React from 'react'\nimport ReactDOM from 'react-dom'\n\nimport Container from './components/Container'\nimport { isFunction } from './helpers'\n\nconst ROOT_KEY = 'ssr-root'\n\nfunction render(content, container, callback) {\n const element = <Container>{content}</Container>\n\n // 支持热加载\n // FIXME: Dev 阶段会导致渲染抖动\n if (module.hot) {\n return ReactDOM.render(element, container, callback)\n }\n\n // ssr 阶段将内容渲染至动态生成的 ssr-root 节点中\n if (window.__SSR__) {\n let ssrRoot = document.getElementById(ROOT_KEY)\n if (!ssrRoot) {\n ssrRoot = document.createElement('div')\n ssrRoot.style.cssText = 'width:100%;height:100%;'\n ssrRoot.id = ROOT_KEY\n document.body.insertBefore(ssrRoot, container)\n }\n\n return ReactDOM.render(element, ssrRoot, callback)\n }\n\n // csr 阶段若为 ssr 渲染结果,则在 csr 完成后替换 ssr 结果\n // 注:不使用水合操作(ReactDOM.hydrate)因为可能造成节点错误问题\n if (window.__SSRED__) {\n const ssrRoot = document.getElementById(ROOT_KEY)\n let renderCallback = callback\n\n container.style.display = 'none'\n container.innerHTML = ssrRoot.innerHTML\n\n function display() {\n // 做一定延时,尽可能保证平滑呈现\n setTimeout(() => {\n const ssrRoot = document.getElementById(ROOT_KEY)\n if (ssrRoot) {\n try {\n ssrRoot.parentNode.removeChild(ssrRoot)\n } finally {\n // nothing\n }\n }\n container.style.display = ''\n }, 56)\n }\n\n // 若为快照 ssr 则 csr 阶段将同样收到 ssr-ready 事件,在此事件后平滑呈现真实可用交互\n if (window.__SSRREADY__) {\n function onReady() {\n display()\n document.removeEventListener('ssr-ready', onReady)\n }\n document.addEventListener('ssr-ready', onReady)\n } else {\n // 若不为快照 ssr(一般为超时自动快照),则在 render 回调结束后呈现真实结果\n renderCallback = function(...args) {\n // FIXME: 超时快照可能造成呈现不平滑,具体表现为 SSR 切到真实内容过程中有轻微空屏现象,通俗为 “闪一下”,此问题待完美修正\n display()\n\n if (isFunction(callback)) {\n callback.apply(this, args)\n }\n }\n }\n\n return ReactDOM.render(element, container, renderCallback)\n }\n\n // csr 若不为 ssr 渲染结果则正常渲染\n return ReactDOM.render(element, container, callback)\n}\n\nexport default render\n","import React, { useState, useEffect } from 'react'\n\nimport ready from '../../ready'\n\nfunction Ready({ children, delay, onMount = false, when = false }) {\n useEffect(() => {\n if (onMount) {\n ready(delay)\n }\n }, [])\n\n useEffect(() => {\n if (when) {\n ready(delay)\n }\n }, [when])\n\n return children\n}\n\nfunction ReadyOnMount({ children, delay }) {\n const [ready, setReady] = useState(false)\n useEffect(() => {\n setReady(true)\n }, [])\n\n return (\n <Ready delay={delay} when={ready}>\n {children}\n </Ready>\n )\n}\n\nReady.OnMount = ReadyOnMount\n\nexport default Ready\n","import { run } from '../../helpers'\n\nfunction NoSSR({ children, fallback = null }) {\n return window.__SSR__ ? run(fallback) : children\n}\n\nexport default NoSSR\n","import useState from './useState'\nimport getInitialProps from './getInitialProps'\nimport ready from './ready'\nimport render from './render'\nimport store from './store'\nimport withSanti, { useNodeKey, useSID } from './withSanti'\nimport Ready from './components/Ready'\nimport NoSSR from './components/NoSSR'\n\nexport default {\n render,\n store,\n useState,\n getInitialProps,\n ready,\n withSanti,\n useNodeKey,\n useSID,\n Ready,\n NoSSR\n}\n\nexport {\n render,\n store,\n useState,\n getInitialProps,\n ready,\n withSanti,\n useNodeKey,\n useSID,\n Ready,\n NoSSR\n}\n"],"names":["isUndefined","val","isNull","isFunction","isString","isExist","isNaN","Number","isNumber","isPromiseLike","then","get","obj","keys","defaultValue","String","result","split","reduce","res","key","e","run","func","context","slice","args","call","delay","time","Promise","resolve","setTimeout","debounce","wait","timeout","clearTimeout","apply","promiseGuess","executor","valuer","value","err","undefined","createContext","Provider","withSanti","Component","WrappedComponent","forwardRef","nodeKey","__key","props","count","contextValue","useMemo","getCountedKey","React","ForwardedRefHOC","ref","hoistStatics","useNodeKey","useContext","useSID","sid","getCountedSID","KEY","inject","script","document","getElementById","createElement","id","innerHTML","head","appendChild","bootstrap","window","__SSR__","__SSRED__","data","remove","set","JSON","stringify","store","builder","warningMissingKey","console","warn","useState","initialState","useReactState","error","state","setState","getNextState","nextState","getInitialProps","fetch","fallback","forwardedRef","ready","setReady","ssrProps","setSsrProps","mounted","useRef","useEffect","init","current","delayMillisecond","__SSRREADY__","dispatchEvent","Event","children","ROOT_KEY","render","content","container","callback","element","module","hot","ReactDOM","ssrRoot","style","cssText","body","insertBefore","display","parentNode","removeChild","renderCallback","onReady","removeEventListener","addEventListener","Ready","onMount","when","ReadyOnMount","OnMount","NoSSR"],"mappings":"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"}
1
+ {"version":3,"file":"index.js","sources":["../../client/helpers/base/is/index.js","../../client/helpers/base/try/index.js","../../client/helpers/utils.js","../../client/withSanti.js","../../client/store.js","../../client/useState.js","../../client/getInitialProps.js","../../client/ready.js","../../client/components/Container/index.js","../../client/render.js","../../client/components/Ready/index.js","../../client/components/NoSSR/index.js","../../client/index.js"],"sourcesContent":["// 值类型判断 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++\nexport const isUndefined = val => typeof val === 'undefined'\n\nexport const isNull = val => val === null\n\nexport const isFunction = val => typeof val === 'function'\n\nexport const isArray = val =>\n isFunction(Array.isArray) ? Array.isArray(val) : val instanceof Array\n\nexport const isRegExp = val => val instanceof RegExp\n\nexport const isObject = val =>\n typeof val === 'object' && !(isArray(val) || isNull(val))\n\nexport const isBoolean = val => typeof val === 'boolean'\n\nexport const isString = val => typeof val === 'string'\n\nexport const isExist = val => !(isUndefined(val) || isNull(val))\n\nexport const isNaN = val =>\n isFunction(Number.isNaN) ? Number.isNaN(val) : val !== val // eslint-disable-line\n\nexport const isNumber = val => typeof val === 'number' && !isNaN(val)\n\nexport const isPromiseLike = val => isExist(val) && isFunction(val.then)\n// 值类型判断 -------------------------------------------------------------\n","import { isString, isUndefined, isFunction, isNumber } from '../is'\n\nexport const get = (obj, keys = [], defaultValue) => {\n try {\n if (isNumber(keys)) {\n keys = String(keys)\n }\n let result = (isString(keys) ? keys.split('.') : keys).reduce(\n (res, key) => res[key],\n obj\n )\n return isUndefined(result) ? defaultValue : result\n } catch (e) {\n return defaultValue\n }\n}\n\nexport const run = (obj, keys = [], ...args) => {\n keys = isString(keys) ? keys.split('.') : keys\n\n const func = get(obj, keys)\n const context = get(obj, keys.slice(0, -1))\n\n return isFunction(func) ? func.call(context, ...args) : func\n}\n\nexport const value = (...values) =>\n values.reduce(\n (value, nextValue) => (isUndefined(value) ? run(nextValue) : run(value)),\n undefined\n )\n","import { isArray, isPromiseLike } from './base/is'\n\nexport const nextTick = (func) => Promise.resolve().then(func)\n\nexport const delay = (time) =>\n new Promise((resolve) => setTimeout(resolve, time))\n\n/**\n * [防抖]\n * @param {Function} func 执行函数\n * @param {Number} wait 多少毫秒后运行一次\n */\nexport const debounce = (func, wait = 16) => {\n let timeout\n\n return function (...args) {\n clearTimeout(timeout)\n\n timeout = setTimeout(() => {\n func.apply(this, args)\n }, wait)\n\n return timeout\n }\n}\n\n/**\n * [用来智能处理Promise类型返回值]\n * 当值生成过程为 promise 时,将得到 promise 类型返回值,按约定 resolve 最终值\n * 当过程不为 promise 时将直接得到值\n * @param {Function} executor 执行过程获取\n * @param {Function} valuer 值处理过程\n */\nexport const promiseGuess = (executor, valuer) =>\n function (...args) {\n let value = executor.apply(this, args)\n\n return isPromiseLike(value)\n ? new Promise((resolve) =>\n value\n .then((value) => resolve(valuer.call(this, null, value, ...args)))\n .catch((err) => resolve(valuer.call(this, err, undefined, ...args)))\n )\n : valuer.call(this, null, value, ...args)\n }\n\nexport function getKey2Id() {\n let uuid = 0\n const map = new Map()\n\n // 对每种 NodeType 做编号处理\n return function key2Id(key) {\n let id = map.get(key)\n\n if (!id) {\n id = (++uuid).toString(32)\n map.set(key, id)\n }\n\n return id\n }\n}\n\nexport function isBrowser() {\n return !window.__SSR__\n}\n\nexport function isPrerendering() {\n return !!window.__PR__\n}\n","import React, { forwardRef, createContext, useContext, useMemo } from 'react'\nimport hoistStatics from 'hoist-non-react-statics'\nimport NodeKey from 'react-node-key'\n\nconst context = createContext()\nconst { Provider } = context\n\nfunction withSanti(Component) {\n function WrappedComponent({ forwardRef, __key: nodeKey, ...props }) {\n let count = 0\n const contextValue = useMemo(\n () => ({\n nodeKey,\n getCountedKey: () => (nodeKey ? `${nodeKey}:${count++}` : undefined)\n }),\n [nodeKey]\n )\n\n return (\n <Provider value={contextValue}>\n <Component {...props} ref={forwardRef} />\n </Provider>\n )\n }\n\n const ForwardedRefHOC = forwardRef((props, ref) => (\n <NodeKey>\n {nodeKey => (\n <WrappedComponent {...props} forwardedRef={ref} __key={nodeKey} />\n )}\n </NodeKey>\n ))\n\n return hoistStatics(ForwardedRefHOC, WrappedComponent)\n}\n\nexport function useNodeKey() {\n return (\n useContext(context) || {\n nodeKey: undefined,\n getCountedKey: () => undefined\n }\n )\n}\n\nexport function useSID() {\n const { nodeKey: sid, getCountedKey: getCountedSID } = useNodeKey()\n return { sid, getCountedSID }\n}\n\nexport default withSanti\n","import { run, isUndefined, promiseGuess, isExist } from './helpers'\n\nconst KEY = '__SSRDATA__'\n\nfunction inject() {\n let script = document.getElementById(KEY) || document.createElement('script')\n script.id = KEY\n script.innerHTML = `window.${KEY}={};`\n document.head.appendChild(script)\n}\n\nfunction bootstrap() {\n if (window.__SSR__) {\n inject()\n } else {\n if (isExist(document.getElementById(KEY))) {\n window.__SSRED__ = true\n }\n }\n const data = window[KEY] || {}\n\n function remove(key) {\n delete data[key]\n }\n\n function set(key, value) {\n if (!window.__SSR__) {\n return\n }\n data[key] = value\n document.getElementById(KEY).innerHTML = `window.${KEY}=${JSON.stringify(\n data\n )};`\n }\n\n function get(key) {\n let value = data[key]\n remove(key) // 初始值只在 html 就绪后使用一次,使用即销毁\n return value\n }\n\n return { set, get, remove }\n}\n\nconst store = bootstrap()\n\nexport default {\n get: promiseGuess(\n (key, builder) => {\n if (!key && window.__SSR__) {\n // 若无 key 则 SSR 阶段不计算\n return undefined\n }\n\n let value\n\n if (!window.__SSR__) {\n value = store.get(key)\n }\n\n if (isUndefined(value)) {\n value = run(builder)\n }\n\n return value\n },\n (err, value, key) => {\n if (!key) {\n return [null, value]\n }\n\n if (err) {\n store.remove(key)\n return [err, undefined]\n }\n\n if (window.__SSR__) {\n store.set(key, value)\n }\n\n return [null, value]\n }\n ),\n set: store.set\n}\n","import { useState as useReactState } from 'react'\n\nimport { run, debounce } from './helpers'\nimport { useNodeKey } from './withSanti'\nimport store from './store'\n\nconst warningMissingKey = debounce(() => {\n if (window.__SSR__) {\n return\n }\n\n console.warn('You shouldn\\'t use \"santi.useState\" outside a \"withSanti\"')\n}, 32)\n\nfunction useState(initialState, key) {\n const { getCountedKey } = useNodeKey()\n const nodeKey = key || run(getCountedKey)\n const [state, setState] = useReactState(() => {\n if (!nodeKey) {\n warningMissingKey()\n }\n\n const [err, value] = store.get(nodeKey, initialState)\n\n if (err) {\n console.error(err)\n }\n\n return value\n })\n\n return [\n state,\n getNextState => {\n const nextState = run(getNextState, undefined, state)\n\n store.set(nodeKey, nextState)\n\n return setState(nextState)\n },\n nodeKey\n ]\n}\n\nexport default useState\n","import React, { useState, forwardRef, useRef, useEffect } from 'react'\nimport hoistStatics from 'hoist-non-react-statics'\n\nimport { run } from './helpers'\nimport withSanti, { useNodeKey } from './withSanti'\nimport store from './store'\n\nconst getInitialProps = (fetch, fallback = null, key) => Component => {\n function WrappedComponent({ forwardedRef, ...props }) {\n const [ready, setReady] = useState(false)\n const [ssrProps, setSsrProps] = useState({})\n const mounted = useRef(true)\n const { getCountedKey } = useNodeKey()\n const nodeKey = key || run(getCountedKey)\n\n useEffect(() => {\n async function init() {\n const [err, ssrProps] = await store.get(nodeKey, () =>\n run(fetch, undefined, props)\n )\n\n if (err) {\n console.error('[getInitialProps error]', err)\n return\n }\n\n if (mounted.current && ssrProps) {\n setSsrProps(ssrProps)\n setReady(true)\n }\n }\n\n init()\n\n return () => {\n mounted.current = false\n }\n }, [])\n\n return ready ? (\n <Component {...{ ...props, ...ssrProps }} ref={forwardedRef} />\n ) : (\n run(fallback, undefined, props)\n )\n }\n\n const ForwardedRefHOC = forwardRef((props, ref) => (\n <WrappedComponent {...props} forwardedRef={ref} />\n ))\n\n return withSanti(hoistStatics(ForwardedRefHOC, WrappedComponent))\n}\n\nexport default getInitialProps\n","import { delay } from './helpers'\n\nconst ready = async (delayMillisecond = -1) => {\n try {\n if (delayMillisecond && Number(delayMillisecond) >= 0) {\n await delay(delayMillisecond)\n }\n\n if (window.__SSR__ && !window.__SSRREADY__) {\n const script = document.createElement('script')\n script.innerHTML = 'window.__SSRREADY__=true'\n document.head.appendChild(script)\n }\n // ssr 阶段:通知 santi 可以采集页面内容\n // csr 阶段:通知 santi/render 已完成呈现\n document.dispatchEvent(new Event('ssr-ready'))\n } finally {\n // nothing\n }\n}\n\nexport default ready\n","import withSanti from '../../withSanti'\n\nexport default withSanti(({ children }) => children)\n","import React from 'react'\nimport ReactDOM from 'react-dom'\n\nimport Container from './components/Container'\nimport { isFunction } from './helpers'\n\nconst ROOT_KEY = 'ssr-root'\n\nfunction render(content, container, callback) {\n const element = <Container>{content}</Container>\n\n // 支持热加载\n // FIXME: Dev 阶段会导致渲染抖动\n if (module.hot) {\n return ReactDOM.render(element, container, callback)\n }\n\n // ssr 阶段将内容渲染至动态生成的 ssr-root 节点中\n if (window.__SSR__) {\n let ssrRoot = document.getElementById(ROOT_KEY)\n if (!ssrRoot) {\n ssrRoot = document.createElement('div')\n ssrRoot.style.cssText = 'width:100%;height:100%;'\n ssrRoot.id = ROOT_KEY\n document.body.insertBefore(ssrRoot, container)\n }\n\n return ReactDOM.render(element, ssrRoot, callback)\n }\n\n // csr 阶段若为 ssr 渲染结果,则在 csr 完成后替换 ssr 结果\n // 注:不使用水合操作(ReactDOM.hydrate)因为可能造成节点错误问题\n if (window.__SSRED__) {\n const ssrRoot = document.getElementById(ROOT_KEY)\n let renderCallback = callback\n\n container.style.display = 'none'\n container.innerHTML = ssrRoot.innerHTML\n\n function display() {\n // 做一定延时,尽可能保证平滑呈现\n setTimeout(() => {\n const ssrRoot = document.getElementById(ROOT_KEY)\n if (ssrRoot) {\n try {\n ssrRoot.parentNode.removeChild(ssrRoot)\n } finally {\n // nothing\n }\n }\n container.style.display = ''\n }, 56)\n }\n\n // 若为快照 ssr 则 csr 阶段将同样收到 ssr-ready 事件,在此事件后平滑呈现真实可用交互\n if (window.__SSRREADY__) {\n function onReady() {\n display()\n document.removeEventListener('ssr-ready', onReady)\n }\n document.addEventListener('ssr-ready', onReady)\n } else {\n // 若不为快照 ssr(一般为超时自动快照),则在 render 回调结束后呈现真实结果\n renderCallback = function(...args) {\n // FIXME: 超时快照可能造成呈现不平滑,具体表现为 SSR 切到真实内容过程中有轻微空屏现象,通俗为 “闪一下”,此问题待完美修正\n display()\n\n if (isFunction(callback)) {\n callback.apply(this, args)\n }\n }\n }\n\n return ReactDOM.render(element, container, renderCallback)\n }\n\n // csr 若不为 ssr 渲染结果则正常渲染\n return ReactDOM.render(element, container, callback)\n}\n\nexport default render\n","import React, { useState, useEffect } from 'react'\n\nimport ready from '../../ready'\n\nfunction Ready({ children, delay, onMount = false, when = false }) {\n useEffect(() => {\n if (onMount) {\n ready(delay)\n }\n }, [])\n\n useEffect(() => {\n if (when) {\n ready(delay)\n }\n }, [when])\n\n return children\n}\n\nfunction ReadyOnMount({ children, delay }) {\n const [ready, setReady] = useState(false)\n useEffect(() => {\n setReady(true)\n }, [])\n\n return (\n <Ready delay={delay} when={ready}>\n {children}\n </Ready>\n )\n}\n\nReady.OnMount = ReadyOnMount\n\nexport default Ready\n","import { run } from '../../helpers'\n\nfunction NoSSR({ children, fallback = null }) {\n return window.__SSR__ ? run(fallback) : children\n}\n\nexport default NoSSR\n","import useState from './useState'\nimport getInitialProps from './getInitialProps'\nimport ready from './ready'\nimport render from './render'\nimport store from './store'\nimport withSanti, { useNodeKey, useSID } from './withSanti'\nimport Ready from './components/Ready'\nimport NoSSR from './components/NoSSR'\n\nexport default {\n render,\n store,\n useState,\n getInitialProps,\n ready,\n withSanti,\n useNodeKey,\n useSID,\n Ready,\n NoSSR\n}\n\nexport {\n render,\n store,\n useState,\n getInitialProps,\n ready,\n withSanti,\n useNodeKey,\n useSID,\n Ready,\n NoSSR\n}\n"],"names":["isUndefined","val","isNull","isFunction","isString","isExist","isNaN","Number","isNumber","isPromiseLike","then","get","obj","keys","defaultValue","String","result","split","reduce","res","key","e","run","func","context","slice","args","call","delay","time","Promise","resolve","setTimeout","debounce","wait","timeout","clearTimeout","apply","promiseGuess","executor","valuer","value","err","undefined","createContext","Provider","withSanti","Component","WrappedComponent","forwardRef","nodeKey","__key","props","count","contextValue","useMemo","getCountedKey","React","ForwardedRefHOC","ref","hoistStatics","useNodeKey","useContext","useSID","sid","getCountedSID","KEY","inject","script","document","getElementById","createElement","id","innerHTML","head","appendChild","bootstrap","window","__SSR__","__SSRED__","data","remove","set","JSON","stringify","store","builder","warningMissingKey","console","warn","useState","initialState","useReactState","error","state","setState","getNextState","nextState","getInitialProps","fetch","fallback","forwardedRef","ready","setReady","ssrProps","setSsrProps","mounted","useRef","useEffect","init","current","delayMillisecond","__SSRREADY__","dispatchEvent","Event","children","ROOT_KEY","render","content","container","callback","element","module","hot","ReactDOM","ssrRoot","style","cssText","body","insertBefore","display","parentNode","removeChild","renderCallback","onReady","removeEventListener","addEventListener","Ready","onMount","when","ReadyOnMount","OnMount","NoSSR"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA;AACO,IAAMA,WAAW,GAAG,SAAdA,WAAc,CAAAC,GAAG;AAAA,SAAI,OAAOA,GAAP,KAAe,WAAnB;AAAA,CAAvB;AAEA,IAAMC,MAAM,GAAG,SAATA,MAAS,CAAAD,GAAG;AAAA,SAAIA,GAAG,KAAK,IAAZ;AAAA,CAAlB;AAEA,IAAME,UAAU,GAAG,SAAbA,UAAa,CAAAF,GAAG;AAAA,SAAI,OAAOA,GAAP,KAAe,UAAnB;AAAA,CAAtB;AAYA,IAAMG,QAAQ,GAAG,SAAXA,QAAW,CAAAH,GAAG;AAAA,SAAI,OAAOA,GAAP,KAAe,QAAnB;AAAA,CAApB;AAEA,IAAMI,OAAO,GAAG,SAAVA,OAAU,CAAAJ,GAAG;AAAA,SAAI,EAAED,WAAW,CAACC,GAAD,CAAX,IAAoBC,MAAM,CAACD,GAAD,CAA5B,CAAJ;AAAA,CAAnB;AAEA,IAAMK,KAAK,GAAG,SAARA,KAAQ,CAAAL,GAAG;AAAA,SACtBE,UAAU,CAACI,MAAM,CAACD,KAAR,CAAV,GAA2BC,MAAM,CAACD,KAAP,CAAaL,GAAb,CAA3B,GAA+CA,GAAG,KAAKA,GADjC;AAAA,CAAjB;;AAGA,IAAMO,QAAQ,GAAG,SAAXA,QAAW,CAAAP,GAAG;AAAA,SAAI,OAAOA,GAAP,KAAe,QAAf,IAA2B,CAACK,KAAK,CAACL,GAAD,CAArC;AAAA,CAApB;AAEA,IAAMQ,aAAa,GAAG,SAAhBA,aAAgB,CAAAR,GAAG;AAAA,SAAII,OAAO,CAACJ,GAAD,CAAP,IAAgBE,UAAU,CAACF,GAAG,CAACS,IAAL,CAA9B;AAAA,CAAzB;;ACxBA,IAAMC,GAAG,GAAG,SAANA,GAAM,CAACC,GAAD,EAAkC;AAAA,MAA5BC,IAA4B,uEAArB,EAAqB;AAAA,MAAjBC,YAAiB;;AACnD,MAAI;AACF,QAAIN,QAAQ,CAACK,IAAD,CAAZ,EAAoB;AAClBA,MAAAA,IAAI,GAAGE,MAAM,CAACF,IAAD,CAAb;AACD;;AACD,QAAIG,MAAM,GAAG,CAACZ,QAAQ,CAACS,IAAD,CAAR,GAAiBA,IAAI,CAACI,KAAL,CAAW,GAAX,CAAjB,GAAmCJ,IAApC,EAA0CK,MAA1C,CACX,UAACC,GAAD,EAAMC,GAAN;AAAA,aAAcD,GAAG,CAACC,GAAD,CAAjB;AAAA,KADW,EAEXR,GAFW,CAAb;AAIA,WAAOZ,WAAW,CAACgB,MAAD,CAAX,GAAsBF,YAAtB,GAAqCE,MAA5C;AACD,GATD,CASE,OAAOK,CAAP,EAAU;AACV,WAAOP,YAAP;AACD;AACF,CAbM;AAeP,AAAO,IAAMQ,GAAG,GAAG,SAANA,GAAM,CAACV,GAAD,EAA6B;AAAA,MAAvBC,IAAuB,uEAAhB,EAAgB;AAC9CA,EAAAA,IAAI,GAAGT,QAAQ,CAACS,IAAD,CAAR,GAAiBA,IAAI,CAACI,KAAL,CAAW,GAAX,CAAjB,GAAmCJ,IAA1C;AAEA,MAAMU,IAAI,GAAGZ,GAAG,CAACC,GAAD,EAAMC,IAAN,CAAhB;AACA,MAAMW,OAAO,GAAGb,GAAG,CAACC,GAAD,EAAMC,IAAI,CAACY,KAAL,CAAW,CAAX,EAAc,CAAC,CAAf,CAAN,CAAnB;;AAJ8C,oCAATC,IAAS;AAATA,IAAAA,IAAS;AAAA;;AAM9C,SAAOvB,UAAU,CAACoB,IAAD,CAAV,GAAmBA,IAAI,CAACI,IAAL,OAAAJ,IAAI,GAAMC,OAAN,SAAkBE,IAAlB,EAAvB,GAAiDH,IAAxD;AACD,CAPM;;ACbA,IAAMK,KAAK,GAAG,SAARA,KAAQ,CAACC,IAAD;AAAA,SACnB,IAAIC,OAAJ,CAAY,UAACC,OAAD;AAAA,WAAaC,UAAU,CAACD,OAAD,EAAUF,IAAV,CAAvB;AAAA,GAAZ,CADmB;AAAA,CAAd;AAGP;AACA;AACA;AACA;AACA;;AACA,AAAO,IAAMI,QAAQ,GAAG,SAAXA,QAAW,CAACV,IAAD,EAAqB;AAAA,MAAdW,IAAc,uEAAP,EAAO;AAC3C,MAAIC,OAAJ;AAEA,SAAO,YAAmB;AAAA;;AAAA,sCAANT,IAAM;AAANA,MAAAA,IAAM;AAAA;;AACxBU,IAAAA,YAAY,CAACD,OAAD,CAAZ;AAEAA,IAAAA,OAAO,GAAGH,UAAU,CAAC,YAAM;AACzBT,MAAAA,IAAI,CAACc,KAAL,CAAW,KAAX,EAAiBX,IAAjB;AACD,KAFmB,EAEjBQ,IAFiB,CAApB;AAIA,WAAOC,OAAP;AACD,GARD;AASD,CAZM;AAcP;AACA;AACA;AACA;AACA;AACA;AACA;;AACA,AAAO,IAAMG,YAAY,GAAG,SAAfA,YAAe,CAACC,QAAD,EAAWC,MAAX;AAAA,SAC1B,YAAmB;AAAA;;AAAA,uCAANd,IAAM;AAANA,MAAAA,IAAM;AAAA;;AACjB,QAAIe,KAAK,GAAGF,QAAQ,CAACF,KAAT,CAAe,IAAf,EAAqBX,IAArB,CAAZ;AAEA,WAAOjB,aAAa,CAACgC,KAAD,CAAb,GACH,IAAIX,OAAJ,CAAY,UAACC,OAAD;AAAA,aACVU,KAAK,CACF/B,IADH,CACQ,UAAC+B,KAAD;AAAA,eAAWV,OAAO,CAACS,MAAM,CAACb,IAAP,OAAAa,MAAM,GAAM,MAAN,EAAY,IAAZ,EAAkBC,KAAlB,SAA4Bf,IAA5B,EAAP,CAAlB;AAAA,OADR,WAES,UAACgB,GAAD;AAAA,eAASX,OAAO,CAACS,MAAM,CAACb,IAAP,OAAAa,MAAM,GAAM,MAAN,EAAYE,GAAZ,EAAiBC,SAAjB,SAA+BjB,IAA/B,EAAP,CAAhB;AAAA,OAFT,CADU;AAAA,KAAZ,CADG,GAMHc,MAAM,CAACb,IAAP,OAAAa,MAAM,GAAM,IAAN,EAAY,IAAZ,EAAkBC,KAAlB,SAA4Bf,IAA5B,EANV;AAOD,GAXyB;AAAA,CAArB;;;ACjCP;AAIA,IAAMF,OAAO,gBAAGoB,mBAAa,EAA7B;AACA,IAAQC,QAAR,GAAqBrB,OAArB,CAAQqB,QAAR;;AAEA,SAASC,SAAT,CAAmBC,SAAnB,EAA8B;AAC5B,WAASC,gBAAT,OAAoE;AAAA,QAAxCC,UAAwC,QAAxCA,UAAwC;AAAA,QAArBC,OAAqB,QAA5BC,KAA4B;AAAA,QAATC,KAAS;;AAClE,QAAIC,KAAK,GAAG,CAAZ;AACA,QAAMC,YAAY,GAAGC,aAAO,CAC1B;AAAA,aAAO;AACLL,QAAAA,OAAO,EAAPA,OADK;AAELM,QAAAA,aAAa,EAAE;AAAA,iBAAON,OAAO,aAAMA,OAAN,cAAiBG,KAAK,EAAtB,IAA6BV,SAA3C;AAAA;AAFV,OAAP;AAAA,KAD0B,EAK1B,CAACO,OAAD,CAL0B,CAA5B;AAQA,wBACEO,6BAAC,QAAD;AAAU,MAAA,KAAK,EAAEH,YAAjB;AAAA;AAAA,oBACEG,6BAAC,SAAD,eAAeL,KAAf;AAAsB,MAAA,GAAG,EAAEH,UAA3B;AAAA;AAAA,OADF,CADF;AAKD;;AAED,MAAMS,eAAe,gBAAGT,gBAAU,CAAC,UAACG,KAAD,EAAQO,GAAR;AAAA,wBACjCF,6BAAC,OAAD;AAAA;AAAA,OACG,UAAAP,OAAO;AAAA,0BACNO,6BAAC,gBAAD,eAAsBL,KAAtB;AAA6B,QAAA,YAAY,EAAEO,GAA3C;AAAgD,QAAA,KAAK,EAAET,OAAvD;AAAA;AAAA,SADM;AAAA,KADV,CADiC;AAAA,GAAD,CAAlC;AAQA,SAAOU,YAAY,CAACF,eAAD,EAAkBV,gBAAlB,CAAnB;AACD;;AAED,AAAO,SAASa,UAAT,GAAsB;AAC3B,SACEC,gBAAU,CAACtC,OAAD,CAAV,IAAuB;AACrB0B,IAAAA,OAAO,EAAEP,SADY;AAErBa,IAAAA,aAAa,EAAE;AAAA,aAAMb,SAAN;AAAA;AAFM,GADzB;AAMD;AAED,AAAO,SAASoB,MAAT,GAAkB;AACvB,oBAAuDF,UAAU,EAAjE;AAAA,MAAiBG,GAAjB,eAAQd,OAAR;AAAA,MAAqCe,aAArC,eAAsBT,aAAtB;;AACA,SAAO;AAAEQ,IAAAA,GAAG,EAAHA,GAAF;AAAOC,IAAAA,aAAa,EAAbA;AAAP,GAAP;AACD;;AC9CD,IAAMC,GAAG,GAAG,aAAZ;;AAEA,SAASC,MAAT,GAAkB;AAChB,MAAIC,MAAM,GAAGC,QAAQ,CAACC,cAAT,CAAwBJ,GAAxB,KAAgCG,QAAQ,CAACE,aAAT,CAAuB,QAAvB,CAA7C;AACAH,EAAAA,MAAM,CAACI,EAAP,GAAYN,GAAZ;AACAE,EAAAA,MAAM,CAACK,SAAP,oBAA6BP,GAA7B;AACAG,EAAAA,QAAQ,CAACK,IAAT,CAAcC,WAAd,CAA0BP,MAA1B;AACD;;AAED,SAASQ,SAAT,GAAqB;AACnB,MAAIC,MAAM,CAACC,OAAX,EAAoB;AAClBX,IAAAA,MAAM;AACP,GAFD,MAEO;AACL,QAAI9D,OAAO,CAACgE,QAAQ,CAACC,cAAT,CAAwBJ,GAAxB,CAAD,CAAX,EAA2C;AACzCW,MAAAA,MAAM,CAACE,SAAP,GAAmB,IAAnB;AACD;AACF;;AACD,MAAMC,IAAI,GAAGH,MAAM,CAACX,GAAD,CAAN,IAAe,EAA5B;;AAEA,WAASe,MAAT,CAAgB7D,GAAhB,EAAqB;AACnB,WAAO4D,IAAI,CAAC5D,GAAD,CAAX;AACD;;AAED,WAAS8D,GAAT,CAAa9D,GAAb,EAAkBqB,KAAlB,EAAyB;AACvB,QAAI,CAACoC,MAAM,CAACC,OAAZ,EAAqB;AACnB;AACD;;AACDE,IAAAA,IAAI,CAAC5D,GAAD,CAAJ,GAAYqB,KAAZ;AACA4B,IAAAA,QAAQ,CAACC,cAAT,CAAwBJ,GAAxB,EAA6BO,SAA7B,oBAAmDP,GAAnD,cAA0DiB,IAAI,CAACC,SAAL,CACxDJ,IADwD,CAA1D;AAGD;;AAED,WAASrE,GAAT,CAAaS,GAAb,EAAkB;AAChB,QAAIqB,KAAK,GAAGuC,IAAI,CAAC5D,GAAD,CAAhB;AACA6D,IAAAA,MAAM,CAAC7D,GAAD,CAAN,CAFgB;;AAGhB,WAAOqB,KAAP;AACD;;AAED,SAAO;AAAEyC,IAAAA,GAAG,EAAHA,GAAF;AAAOvE,IAAAA,GAAG,EAAHA,GAAP;AAAYsE,IAAAA,MAAM,EAANA;AAAZ,GAAP;AACD;;AAED,IAAMI,KAAK,GAAGT,SAAS,EAAvB;AAEA,cAAe;AACbjE,EAAAA,GAAG,EAAE2B,YAAY,CACf,UAAClB,GAAD,EAAMkE,OAAN,EAAkB;AAChB,QAAI,CAAClE,GAAD,IAAQyD,MAAM,CAACC,OAAnB,EAA4B;AAC1B;AACA,aAAOnC,SAAP;AACD;;AAED,QAAIF,KAAJ;;AAEA,QAAI,CAACoC,MAAM,CAACC,OAAZ,EAAqB;AACnBrC,MAAAA,KAAK,GAAG4C,KAAK,CAAC1E,GAAN,CAAUS,GAAV,CAAR;AACD;;AAED,QAAIpB,WAAW,CAACyC,KAAD,CAAf,EAAwB;AACtBA,MAAAA,KAAK,GAAGnB,GAAG,CAACgE,OAAD,CAAX;AACD;;AAED,WAAO7C,KAAP;AACD,GAlBc,EAmBf,UAACC,GAAD,EAAMD,KAAN,EAAarB,GAAb,EAAqB;AACnB,QAAI,CAACA,GAAL,EAAU;AACR,aAAO,CAAC,IAAD,EAAOqB,KAAP,CAAP;AACD;;AAED,QAAIC,GAAJ,EAAS;AACP2C,MAAAA,KAAK,CAACJ,MAAN,CAAa7D,GAAb;AACA,aAAO,CAACsB,GAAD,EAAMC,SAAN,CAAP;AACD;;AAED,QAAIkC,MAAM,CAACC,OAAX,EAAoB;AAClBO,MAAAA,KAAK,CAACH,GAAN,CAAU9D,GAAV,EAAeqB,KAAf;AACD;;AAED,WAAO,CAAC,IAAD,EAAOA,KAAP,CAAP;AACD,GAlCc,CADJ;AAqCbyC,EAAAA,GAAG,EAAEG,KAAK,CAACH;AArCE,CAAf;;ACxCA,IAAMK,iBAAiB,GAAGtD,QAAQ,CAAC,YAAM;AACvC,MAAI4C,MAAM,CAACC,OAAX,EAAoB;AAClB;AACD;;AAEDU,EAAAA,OAAO,CAACC,IAAR,CAAa,2DAAb;AACD,CANiC,EAM/B,EAN+B,CAAlC;;AAQA,SAASC,QAAT,CAAkBC,YAAlB,EAAgCvE,GAAhC,EAAqC;AACnC,oBAA0ByC,UAAU,EAApC;AAAA,MAAQL,aAAR,eAAQA,aAAR;;AACA,MAAMN,OAAO,GAAG9B,GAAG,IAAIE,GAAG,CAACkC,aAAD,CAA1B;;AACA,uBAA0BoC,cAAa,CAAC,YAAM;AAC5C,QAAI,CAAC1C,OAAL,EAAc;AACZqC,MAAAA,iBAAiB;AAClB;;AAED,qBAAqBF,OAAK,CAAC1E,GAAN,CAAUuC,OAAV,EAAmByC,YAAnB,CAArB;AAAA;AAAA,QAAOjD,GAAP;AAAA,QAAYD,KAAZ;;AAEA,QAAIC,GAAJ,EAAS;AACP8C,MAAAA,OAAO,CAACK,KAAR,CAAcnD,GAAd;AACD;;AAED,WAAOD,KAAP;AACD,GAZsC,CAAvC;AAAA;AAAA,MAAOqD,KAAP;AAAA,MAAcC,QAAd;;AAcA,SAAO,CACLD,KADK,EAEL,UAAAE,YAAY,EAAI;AACd,QAAMC,SAAS,GAAG3E,GAAG,CAAC0E,YAAD,EAAerD,SAAf,EAA0BmD,KAA1B,CAArB;AAEAT,IAAAA,OAAK,CAACH,GAAN,CAAUhC,OAAV,EAAmB+C,SAAnB;AAEA,WAAOF,QAAQ,CAACE,SAAD,CAAf;AACD,GARI,EASL/C,OATK,CAAP;AAWD;;;AC1CD;;AAOA,IAAMgD,eAAe,GAAG,SAAlBA,eAAkB,CAACC,KAAD;AAAA,MAAQC,QAAR,uEAAmB,IAAnB;AAAA,MAAyBhF,GAAzB;AAAA,SAAiC,UAAA2B,SAAS,EAAI;AACpE,aAASC,gBAAT,OAAsD;AAAA,UAA1BqD,YAA0B,QAA1BA,YAA0B;AAAA,UAATjD,KAAS;;AACpD,sBAA0BsC,cAAQ,CAAC,KAAD,CAAlC;AAAA;AAAA,UAAOY,KAAP;AAAA,UAAcC,QAAd;;AACA,uBAAgCb,cAAQ,CAAC,EAAD,CAAxC;AAAA;AAAA,UAAOc,QAAP;AAAA,UAAiBC,WAAjB;;AACA,UAAMC,OAAO,GAAGC,YAAM,CAAC,IAAD,CAAtB;;AACA,wBAA0B9C,UAAU,EAApC;AAAA,UAAQL,aAAR,eAAQA,aAAR;;AACA,UAAMN,OAAO,GAAG9B,GAAG,IAAIE,GAAG,CAACkC,aAAD,CAA1B;AAEAoD,MAAAA,eAAS,CAAC,YAAM;AAAA,iBACCC,IADD;AAAA;AAAA;;AAAA;AAAA,0EACd;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,2BACgCxB,OAAK,CAAC1E,GAAN,CAAUuC,OAAV,EAAmB;AAAA,6BAC/C5B,GAAG,CAAC6E,KAAD,EAAQxD,SAAR,EAAmBS,KAAnB,CAD4C;AAAA,qBAAnB,CADhC;;AAAA;AAAA;AAAA;AACSV,oBAAAA,GADT;AACc8D,oBAAAA,QADd;;AAAA,yBAKM9D,GALN;AAAA;AAAA;AAAA;;AAMI8C,oBAAAA,OAAO,CAACK,KAAR,CAAc,yBAAd,EAAyCnD,GAAzC;AANJ;;AAAA;AAUE,wBAAIgE,OAAO,CAACI,OAAR,IAAmBN,QAAvB,EAAiC;AAC/BC,sBAAAA,WAAW,CAACD,QAAD,CAAX;AACAD,sBAAAA,QAAQ,CAAC,IAAD,CAAR;AACD;;AAbH;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,WADc;AAAA;AAAA;;AAiBdM,QAAAA,IAAI;AAEJ,eAAO,YAAM;AACXH,UAAAA,OAAO,CAACI,OAAR,GAAkB,KAAlB;AACD,SAFD;AAGD,OAtBQ,EAsBN,EAtBM,CAAT;AAwBA,aAAOR,KAAK,gBACV7C,6BAAC,SAAD,iDAAoBL,KAApB,GAA8BoD,QAA9B;AAA0C,QAAA,GAAG,EAAEH,YAA/C;AAAA;AAAA,SADU,GAGV/E,GAAG,CAAC8E,QAAD,EAAWzD,SAAX,EAAsBS,KAAtB,CAHL;AAKD;;AAED,QAAMM,eAAe,gBAAGT,gBAAU,CAAC,UAACG,KAAD,EAAQO,GAAR;AAAA,0BACjCF,6BAAC,gBAAD,eAAsBL,KAAtB;AAA6B,QAAA,YAAY,EAAEO,GAA3C;AAAA;AAAA,SADiC;AAAA,KAAD,CAAlC;AAIA,WAAOb,SAAS,CAACc,YAAY,CAACF,eAAD,EAAkBV,gBAAlB,CAAb,CAAhB;AACD,GA5CuB;AAAA,CAAxB;;ACLA,IAAMsD,KAAK;AAAA,qEAAG;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAOS,YAAAA,gBAAP,2DAA0B,CAAC,CAA3B;AAAA;;AAAA,kBAENA,gBAAgB,IAAIxG,MAAM,CAACwG,gBAAD,CAAN,IAA4B,CAF1C;AAAA;AAAA;AAAA;;AAAA;AAAA,mBAGFnF,KAAK,CAACmF,gBAAD,CAHH;;AAAA;AAMV,gBAAIlC,MAAM,CAACC,OAAP,IAAkB,CAACD,MAAM,CAACmC,YAA9B,EAA4C;AACpC5C,cAAAA,MADoC,GAC3BC,QAAQ,CAACE,aAAT,CAAuB,QAAvB,CAD2B;AAE1CH,cAAAA,MAAM,CAACK,SAAP,GAAmB,0BAAnB;AACAJ,cAAAA,QAAQ,CAACK,IAAT,CAAcC,WAAd,CAA0BP,MAA1B;AACD,aAVS;AAYV;;;AACAC,YAAAA,QAAQ,CAAC4C,aAAT,CAAuB,IAAIC,KAAJ,CAAU,WAAV,CAAvB;;AAbU;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,GAAH;;AAAA,kBAALZ,KAAK;AAAA;AAAA;AAAA,GAAX;;ACAA,gBAAexD,SAAS,CAAC;AAAA,MAAGqE,QAAH,QAAGA,QAAH;AAAA,SAAkBA,QAAlB;AAAA,CAAD,CAAxB;;;ACIA,IAAMC,QAAQ,GAAG,UAAjB;;AAEA,SAASC,MAAT,CAAgBC,OAAhB,EAAyBC,SAAzB,EAAoCC,QAApC,EAA8C;AAC5C,MAAMC,OAAO,gBAAGhE,6BAAC,SAAD;AAAA;AAAA,KAAY6D,OAAZ,CAAhB,CAD4C;AAI5C;;AACA,MAAII,MAAM,CAACC,GAAX,EAAgB;AACd,WAAOC,QAAQ,CAACP,MAAT,CAAgBI,OAAhB,EAAyBF,SAAzB,EAAoCC,QAApC,CAAP;AACD,GAP2C;;;AAU5C,MAAI3C,MAAM,CAACC,OAAX,EAAoB;AAClB,QAAI+C,OAAO,GAAGxD,QAAQ,CAACC,cAAT,CAAwB8C,QAAxB,CAAd;;AACA,QAAI,CAACS,OAAL,EAAc;AACZA,MAAAA,OAAO,GAAGxD,QAAQ,CAACE,aAAT,CAAuB,KAAvB,CAAV;AACAsD,MAAAA,OAAO,CAACC,KAAR,CAAcC,OAAd,GAAwB,yBAAxB;AACAF,MAAAA,OAAO,CAACrD,EAAR,GAAa4C,QAAb;AACA/C,MAAAA,QAAQ,CAAC2D,IAAT,CAAcC,YAAd,CAA2BJ,OAA3B,EAAoCN,SAApC;AACD;;AAED,WAAOK,QAAQ,CAACP,MAAT,CAAgBI,OAAhB,EAAyBI,OAAzB,EAAkCL,QAAlC,CAAP;AACD,GApB2C;AAuB5C;;;AACA,MAAI3C,MAAM,CAACE,SAAX,EAAsB;AAAA,QAOXmD,OAPW,GAOpB,SAASA,OAAT,GAAmB;AACjB;AACAlG,MAAAA,UAAU,CAAC,YAAM;AACf,YAAM6F,OAAO,GAAGxD,QAAQ,CAACC,cAAT,CAAwB8C,QAAxB,CAAhB;;AACA,YAAIS,OAAJ,EAAa;AACX,cAAI;AACFA,YAAAA,OAAO,CAACM,UAAR,CAAmBC,WAAnB,CAA+BP,OAA/B;AACD,WAFD,SAEU;AAET;AACF;;AACDN,QAAAA,SAAS,CAACO,KAAV,CAAgBI,OAAhB,GAA0B,EAA1B;AACD,OAVS,EAUP,EAVO,CAAV;AAWD,KApBmB;;;AACpB,QAAML,QAAO,GAAGxD,QAAQ,CAACC,cAAT,CAAwB8C,QAAxB,CAAhB;;AACA,QAAIiB,cAAc,GAAGb,QAArB;AAEAD,IAAAA,SAAS,CAACO,KAAV,CAAgBI,OAAhB,GAA0B,MAA1B;AACAX,IAAAA,SAAS,CAAC9C,SAAV,GAAsBoD,QAAO,CAACpD,SAA9B;;AAkBA,QAAII,MAAM,CAACmC,YAAX,EAAyB;AAAA,UACdsB,OADc,GACvB,SAASA,OAAT,GAAmB;AACjBJ,QAAAA,OAAO;AACP7D,QAAAA,QAAQ,CAACkE,mBAAT,CAA6B,WAA7B,EAA0CD,OAA1C;AACD,OAJsB;;AAKvBjE,MAAAA,QAAQ,CAACmE,gBAAT,CAA0B,WAA1B,EAAuCF,OAAvC;AACD,KAND,MAMO;AACL;AACAD,MAAAA,cAAc,GAAG,0BAAkB;AACjC;AACAH,QAAAA,OAAO;;AAEP,YAAI/H,UAAU,CAACqH,QAAD,CAAd,EAA0B;AAAA,4CAJC9F,IAID;AAJCA,YAAAA,IAID;AAAA;;AACxB8F,UAAAA,QAAQ,CAACnF,KAAT,CAAe,IAAf,EAAqBX,IAArB;AACD;AACF,OAPD;AAQD;;AAED,WAAOkG,QAAQ,CAACP,MAAT,CAAgBI,OAAhB,EAAyBF,SAAzB,EAAoCc,cAApC,CAAP;AACD,GAlE2C;;;AAqE5C,SAAOT,QAAQ,CAACP,MAAT,CAAgBI,OAAhB,EAAyBF,SAAzB,EAAoCC,QAApC,CAAP;AACD;;;;AC1ED,SAASiB,KAAT,OAAmE;AAAA,MAAlDtB,QAAkD,QAAlDA,QAAkD;AAAA,MAAxCvF,KAAwC,QAAxCA,KAAwC;AAAA,0BAAjC8G,OAAiC;AAAA,MAAjCA,OAAiC,6BAAvB,KAAuB;AAAA,uBAAhBC,IAAgB;AAAA,MAAhBA,IAAgB,0BAAT,KAAS;AACjE/B,EAAAA,eAAS,CAAC,YAAM;AACd,QAAI8B,OAAJ,EAAa;AACXpC,MAAAA,KAAK,CAAC1E,KAAD,CAAL;AACD;AACF,GAJQ,EAIN,EAJM,CAAT;AAMAgF,EAAAA,eAAS,CAAC,YAAM;AACd,QAAI+B,IAAJ,EAAU;AACRrC,MAAAA,KAAK,CAAC1E,KAAD,CAAL;AACD;AACF,GAJQ,EAIN,CAAC+G,IAAD,CAJM,CAAT;AAMA,SAAOxB,QAAP;AACD;;AAED,SAASyB,YAAT,QAA2C;AAAA,MAAnBzB,QAAmB,SAAnBA,QAAmB;AAAA,MAATvF,KAAS,SAATA,KAAS;;AACzC,kBAA0B8D,cAAQ,CAAC,KAAD,CAAlC;AAAA;AAAA,MAAOY,KAAP;AAAA,MAAcC,QAAd;;AACAK,EAAAA,eAAS,CAAC,YAAM;AACdL,IAAAA,QAAQ,CAAC,IAAD,CAAR;AACD,GAFQ,EAEN,EAFM,CAAT;AAIA,sBACE9C,6BAAC,KAAD;AAAO,IAAA,KAAK,EAAE7B,KAAd;AAAqB,IAAA,IAAI,EAAE0E,KAA3B;AAAA;AAAA,KACGa,QADH,CADF;AAKD;;AAEDsB,KAAK,CAACI,OAAN,GAAgBD,YAAhB;;AC/BA,SAASE,KAAT,OAA8C;AAAA,MAA7B3B,QAA6B,QAA7BA,QAA6B;AAAA,2BAAnBf,QAAmB;AAAA,MAAnBA,QAAmB,8BAAR,IAAQ;AAC5C,SAAOvB,MAAM,CAACC,OAAP,GAAiBxD,GAAG,CAAC8E,QAAD,CAApB,GAAiCe,QAAxC;AACD;;ACKD,YAAe;AACbE,EAAAA,MAAM,EAANA,MADa;AAEbhC,EAAAA,KAAK,EAALA,OAFa;AAGbK,EAAAA,QAAQ,EAARA,QAHa;AAIbQ,EAAAA,eAAe,EAAfA,eAJa;AAKbI,EAAAA,KAAK,EAALA,KALa;AAMbxD,EAAAA,SAAS,EAATA,SANa;AAObe,EAAAA,UAAU,EAAVA,UAPa;AAQbE,EAAAA,MAAM,EAANA,MARa;AASb0E,EAAAA,KAAK,EAALA,KATa;AAUbK,EAAAA,KAAK,EAALA;AAVa,CAAf;;;;;;;;;;;;;;"}
@@ -1 +1 @@
1
- !function(e,t){"object"==typeof exports&&"undefined"!=typeof module?t(exports,require("react"),require("hoist-non-react-statics"),require("react-node-key"),require("react-dom")):"function"==typeof define&&define.amd?define(["exports","react","hoist-non-react-statics","react-node-key","react-dom"],t):t((e=e||self).SantiClient={},e.React,e.hoistStatics,e.NodeKey,e.ReactDOM)}(this,function(e,y,t,o,i){"use strict";var p="default"in y?y.default:y;function a(e,t,n,r,o,u,i){try{var c=e[u](i),a=c.value}catch(e){return void n(e)}c.done?t(a):Promise.resolve(a).then(r,o)}function v(c){return function(){var e=this,i=arguments;return new Promise(function(t,n){var r=c.apply(e,i);function o(e){a(r,t,n,o,u,"next",e)}function u(e){a(r,t,n,o,u,"throw",e)}o(void 0)})}}function m(){return(m=Object.assign||function(e){for(var t=1;t<arguments.length;t++){var n,r=arguments[t];for(n in r)Object.prototype.hasOwnProperty.call(r,n)&&(e[n]=r[n])}return e}).apply(this,arguments)}function n(t,e){var n,r=Object.keys(t);return Object.getOwnPropertySymbols&&(n=Object.getOwnPropertySymbols(t),e&&(n=n.filter(function(e){return Object.getOwnPropertyDescriptor(t,e).enumerable})),r.push.apply(r,n)),r}function w(r){for(var e=1;e<arguments.length;e++){var o=null!=arguments[e]?arguments[e]:{};e%2?n(Object(o),!0).forEach(function(e){var t,n;t=r,e=o[n=e],n in t?Object.defineProperty(t,n,{value:e,enumerable:!0,configurable:!0,writable:!0}):t[n]=e}):Object.getOwnPropertyDescriptors?Object.defineProperties(r,Object.getOwnPropertyDescriptors(o)):n(Object(o)).forEach(function(e){Object.defineProperty(r,e,Object.getOwnPropertyDescriptor(o,e))})}return r}function h(e,t){if(null==e)return{};var n,r=function(e,t){if(null==e)return{};for(var n,r={},o=Object.keys(e),u=0;u<o.length;u++)n=o[u],0<=t.indexOf(n)||(r[n]=e[n]);return r}(e,t);if(Object.getOwnPropertySymbols)for(var o=Object.getOwnPropertySymbols(e),u=0;u<o.length;u++)n=o[u],0<=t.indexOf(n)||Object.prototype.propertyIsEnumerable.call(e,n)&&(r[n]=e[n]);return r}function _(e,t){return function(e){if(Array.isArray(e))return e}(e)||function(e,t){if("undefined"==typeof Symbol||!(Symbol.iterator in Object(e)))return;var n=[],r=!0,o=!1,u=void 0;try{for(var i,c=e[Symbol.iterator]();!(r=(i=c.next()).done)&&(n.push(i.value),!t||n.length!==t);r=!0);}catch(e){o=!0,u=e}finally{try{r||null==c.return||c.return()}finally{if(o)throw u}}return n}(e,t)||function(e,t){if(!e)return;if("string"==typeof e)return r(e,t);var n=Object.prototype.toString.call(e).slice(8,-1);"Object"===n&&e.constructor&&(n=e.constructor.name);if("Map"===n||"Set"===n)return Array.from(e);if("Arguments"===n||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n))return r(e,t)}(e,t)||function(){throw new TypeError("Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}()}function r(e,t){(null==t||t>e.length)&&(t=e.length);for(var n=0,r=new Array(t);n<t;n++)r[n]=e[n];return r}t=t&&Object.prototype.hasOwnProperty.call(t,"default")?t.default:t,o=o&&Object.prototype.hasOwnProperty.call(o,"default")?o.default:o,i=i&&Object.prototype.hasOwnProperty.call(i,"default")?i.default:i;function u(e){return void 0===e}function c(e){return"function"==typeof e}function f(e){return"string"==typeof e}function d(e){return!(u(e)||null===e)}function l(e){return"number"==typeof e&&(e=e,!(c(Number.isNaN)?Number.isNaN(e):e!=e))}function s(e){var t=1<arguments.length&&void 0!==arguments[1]?arguments[1]:[],n=2<arguments.length?arguments[2]:void 0;try{l(t)&&(t=String(t));var r=(f(t)?t.split("."):t).reduce(function(e,t){return e[t]},e);return u(r)?n:r}catch(e){return n}}function S(e){for(var t=f(t=1<arguments.length&&void 0!==arguments[1]?arguments[1]:[])?t.split("."):t,n=s(e,t),t=s(e,t.slice(0,-1)),r=arguments.length,o=new Array(2<r?r-2:0),u=2;u<r;u++)o[u-2]=arguments[u];return c(n)?n.call.apply(n,[t].concat(o)):n}var g="nNBh",b=y.createContext(),O=b.Provider;function R(u){function r(e){var t=e.forwardRef,n=e.__key,r=h(e,["forwardRef","__key"]),o=0,e=y.useMemo(function(){return{nodeKey:n,getCountedKey:function(){return n?"".concat(n,":").concat(o++):void 0}}},[n]);return p.createElement(O,{value:e,_nk:"".concat(g,"11")},p.createElement(u,m({},r,{ref:t,_nk:"".concat(g,"21")})))}return t(y.forwardRef(function(t,n){return p.createElement(o,{_nk:"".concat(g,"31")},function(e){return p.createElement(r,m({},t,{forwardedRef:n,__key:e,_nk:"".concat(g,"41")}))})}),r)}function E(){return y.useContext(b)||{nodeKey:void 0,getCountedKey:function(){}}}function j(){var e=E();return{sid:e.nodeKey,getCountedSID:e.getCountedKey}}var P="__SSRDATA__";var k,x,I=function(){var e;window.__SSR__?((e=document.getElementById(P)||document.createElement("script")).id=P,e.innerHTML="window.".concat(P,"={};"),document.head.appendChild(e)):d(document.getElementById(P))&&(window.__SSRED__=!0);var n=window[P]||{};function r(e){delete n[e]}return{set:function(e,t){window.__SSR__&&(n[e]=t,document.getElementById(P).innerHTML="window.".concat(P,"=").concat(JSON.stringify(n),";"))},get:function(e){var t=n[e];return r(e),t},remove:r}}(),N={get:(k=function(e,t){var n;if(e||!window.__SSR__)return window.__SSR__||(n=I.get(e)),n=u(n)?S(t):n},x=function(e,t,n){return n?e?(I.remove(n),[e,void 0]):(window.__SSR__&&I.set(n,t),[null,t]):[null,t]},function(){for(var n=this,e=arguments.length,r=new Array(e),t=0;t<e;t++)r[t]=arguments[t];var o,u=k.apply(this,r);return d(o=u)&&c(o.then)?new Promise(function(t){return u.then(function(e){return t(x.call.apply(x,[n,null,e].concat(r)))}).catch(function(e){return t(x.call.apply(x,[n,e,void 0].concat(r)))})}):x.call.apply(x,[this,null,u].concat(r))}),set:I.set},A=function(o){var u,i=1<arguments.length&&void 0!==arguments[1]?arguments[1]:16;return function(){for(var e=this,t=arguments.length,n=new Array(t),r=0;r<t;r++)n[r]=arguments[r];return clearTimeout(u),u=setTimeout(function(){o.apply(e,n)},i)}}(function(){window.__SSR__||console.warn('You shouldn\'t use "santi.useState" outside a "withSanti"')},32);function D(n,e){var t=E().getCountedKey,r=e||S(t),t=y.useState(function(){r||A();var e=_(N.get(r,n),2),t=e[0],e=e[1];return t&&console.error(t),e}),t=_(t,2),o=t[0],u=t[1];return[o,function(e){e=S(e,void 0,o);return N.set(r,e),u(e)},r]}function C(d){var l=1<arguments.length&&void 0!==arguments[1]?arguments[1]:null,s=2<arguments.length?arguments[2]:void 0;return function(f){function n(e){var t=e.forwardedRef,r=h(e,["forwardedRef"]),n=_(y.useState(!1),2),o=n[0],u=n[1],e=_(y.useState({}),2),n=e[0],i=e[1],c=y.useRef(!0),e=E().getCountedKey,a=s||S(e);return y.useEffect(function(){function e(){return(e=v(regeneratorRuntime.mark(function e(){var t,n;return regeneratorRuntime.wrap(function(e){for(;;)switch(e.prev=e.next){case 0:return e.next=2,N.get(a,function(){return S(d,void 0,r)});case 2:if(t=e.sent,n=_(t,2),t=n[0],n=n[1],t)return console.error("[getInitialProps error]",t),e.abrupt("return");e.next=9;break;case 9:c.current&&n&&(i(n),u(!0));case 10:case"end":return e.stop()}},e)}))).apply(this,arguments)}return function(){e.apply(this,arguments)}(),function(){c.current=!1}},[]),o?p.createElement(f,m({},w(w({},r),n),{ref:t,_nk:"".concat(K,"11")})):S(l,void 0,r)}return R(t(y.forwardRef(function(e,t){return p.createElement(n,m({},e,{forwardedRef:t,_nk:"".concat(K,"21")}))}),n))}}var K="8NS2",T=function(){var e=v(regeneratorRuntime.mark(function e(){var t,n=arguments;return regeneratorRuntime.wrap(function(e){for(;;)switch(e.prev=e.next){case 0:if(t=0<n.length&&void 0!==n[0]?n[0]:-1,e.prev=1,t&&0<=Number(t))return e.next=5,function(t){return new Promise(function(e){return setTimeout(e,t)})}(t);e.next=5;break;case 5:window.__SSR__&&!window.__SSRREADY__&&((t=document.createElement("script")).innerHTML="window.__SSRREADY__=true",document.head.appendChild(t)),document.dispatchEvent(new Event("ssr-ready"));case 7:return e.prev=7,e.finish(7);case 9:case"end":return e.stop()}},e,null,[[1,,7,9]])}));return function(){return e.apply(this,arguments)}}(),M=R(function(e){return e.children}),B="ssr-root";function L(e,t,r){var n=p.createElement(M,{_nk:"".concat("4mmK","11")},e);if(module.hot)return i.render(n,t,r);if(window.__SSR__){var o=document.getElementById(B);return o||((o=document.createElement("div")).style.cssText="width:100%;height:100%;",o.id=B,document.body.insertBefore(o,t)),i.render(n,o,r)}if(window.__SSRED__){var u=function(){setTimeout(function(){var e=document.getElementById(B);e&&e.parentNode.removeChild(e),t.style.display=""},56)},e=document.getElementById(B),o=r;return t.style.display="none",t.innerHTML=e.innerHTML,window.__SSRREADY__?(e=function e(){u(),document.removeEventListener("ssr-ready",e)},document.addEventListener("ssr-ready",e)):o=function(){if(u(),c(r)){for(var e=arguments.length,t=new Array(e),n=0;n<e;n++)t[n]=arguments[n];r.apply(this,t)}},i.render(n,t,o)}return i.render(n,t,r)}function H(e){var t=e.children,n=e.delay,r=e.onMount,o=void 0!==r&&r,e=e.when,u=void 0!==e&&e;return y.useEffect(function(){o&&T(n)},[]),y.useEffect(function(){u&&T(n)},[u]),t}function q(e){var t=e.children,e=e.fallback,e=void 0===e?null:e;return window.__SSR__?S(e):t}H.OnMount=function(e){var t=e.children,n=e.delay,r=_(y.useState(!1),2),e=r[0],o=r[1];return y.useEffect(function(){o(!0)},[]),p.createElement(H,{delay:n,when:e,_nk:"".concat("B/hE","11")},t)};var Y={render:L,store:N,useState:D,getInitialProps:C,ready:T,withSanti:R,useNodeKey:E,useSID:j,Ready:H,NoSSR:q};e.NoSSR=q,e.Ready=H,e.default=Y,e.getInitialProps=C,e.ready=T,e.render=L,e.store=N,e.useNodeKey=E,e.useSID=j,e.useState=D,e.withSanti=R,Object.defineProperty(e,"__esModule",{value:!0})});
1
+ !function(e,t){"object"==typeof exports&&"undefined"!=typeof module?t(exports,require("react"),require("hoist-non-react-statics"),require("react-node-key"),require("react-dom")):"function"==typeof define&&define.amd?define(["exports","react","hoist-non-react-statics","react-node-key","react-dom"],t):t((e=e||self).SantiClient={},e.React,e.hoistStatics,e.NodeKey,e.ReactDOM)}(this,function(e,y,t,o,i){"use strict";var p="default"in y?y.default:y;function n(t,e){var n,r=Object.keys(t);return Object.getOwnPropertySymbols&&(n=Object.getOwnPropertySymbols(t),e&&(n=n.filter(function(e){return Object.getOwnPropertyDescriptor(t,e).enumerable})),r.push.apply(r,n)),r}function v(r){for(var e=1;e<arguments.length;e++){var o=null!=arguments[e]?arguments[e]:{};e%2?n(Object(o),!0).forEach(function(e){var t,n;t=r,e=o[n=e],n in t?Object.defineProperty(t,n,{value:e,enumerable:!0,configurable:!0,writable:!0}):t[n]=e}):Object.getOwnPropertyDescriptors?Object.defineProperties(r,Object.getOwnPropertyDescriptors(o)):n(Object(o)).forEach(function(e){Object.defineProperty(r,e,Object.getOwnPropertyDescriptor(o,e))})}return r}function a(e,t,n,r,o,u,i){try{var c=e[u](i),a=c.value}catch(e){return void n(e)}c.done?t(a):Promise.resolve(a).then(r,o)}function m(c){return function(){var e=this,i=arguments;return new Promise(function(t,n){var r=c.apply(e,i);function o(e){a(r,t,n,o,u,"next",e)}function u(e){a(r,t,n,o,u,"throw",e)}o(void 0)})}}function w(){return(w=Object.assign||function(e){for(var t=1;t<arguments.length;t++){var n,r=arguments[t];for(n in r)Object.prototype.hasOwnProperty.call(r,n)&&(e[n]=r[n])}return e}).apply(this,arguments)}function h(e,t){if(null==e)return{};var n,r=function(e,t){if(null==e)return{};for(var n,r={},o=Object.keys(e),u=0;u<o.length;u++)n=o[u],0<=t.indexOf(n)||(r[n]=e[n]);return r}(e,t);if(Object.getOwnPropertySymbols)for(var o=Object.getOwnPropertySymbols(e),u=0;u<o.length;u++)n=o[u],0<=t.indexOf(n)||Object.prototype.propertyIsEnumerable.call(e,n)&&(r[n]=e[n]);return r}function _(e,t){return function(e){if(Array.isArray(e))return e}(e)||function(e,t){var n=null==e?null:"undefined"!=typeof Symbol&&e[Symbol.iterator]||e["@@iterator"];if(null!=n){var r,o,u=[],i=!0,c=!1;try{for(n=n.call(e);!(i=(r=n.next()).done)&&(u.push(r.value),!t||u.length!==t);i=!0);}catch(e){c=!0,o=e}finally{try{i||null==n.return||n.return()}finally{if(c)throw o}}return u}}(e,t)||function(e,t){if(e){if("string"==typeof e)return r(e,t);var n=Object.prototype.toString.call(e).slice(8,-1);return"Map"===(n="Object"===n&&e.constructor?e.constructor.name:n)||"Set"===n?Array.from(e):"Arguments"===n||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)?r(e,t):void 0}}(e,t)||function(){throw new TypeError("Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}()}function r(e,t){(null==t||t>e.length)&&(t=e.length);for(var n=0,r=new Array(t);n<t;n++)r[n]=e[n];return r}t=t&&Object.prototype.hasOwnProperty.call(t,"default")?t.default:t,o=o&&Object.prototype.hasOwnProperty.call(o,"default")?o.default:o,i=i&&Object.prototype.hasOwnProperty.call(i,"default")?i.default:i;function c(e){var t=1<arguments.length&&void 0!==arguments[1]?arguments[1]:[],n=2<arguments.length?arguments[2]:void 0;try{g(t)&&(t=String(t));var r=(d(t)?t.split("."):t).reduce(function(e,t){return e[t]},e);return u(r)?n:r}catch(e){return n}}function S(e){for(var t=d(t=1<arguments.length&&void 0!==arguments[1]?arguments[1]:[])?t.split("."):t,n=c(e,t),t=c(e,t.slice(0,-1)),r=arguments.length,o=new Array(2<r?r-2:0),u=2;u<r;u++)o[u-2]=arguments[u];return l(n)?n.call.apply(n,[t].concat(o)):n}var u=function(e){return void 0===e},f=function(e){return null===e},l=function(e){return"function"==typeof e},d=function(e){return"string"==typeof e},s=function(e){return!(u(e)||f(e))},g=function(e){return"number"==typeof e&&(e=e,!(l(Number.isNaN)?Number.isNaN(e):e!=e))},b=["forwardRef","__key"],O="nNBh",R=y.createContext(),E=R.Provider;function j(u){function r(e){var t=e.forwardRef,n=e.__key,r=h(e,b),o=0,e=y.useMemo(function(){return{nodeKey:n,getCountedKey:function(){return n?"".concat(n,":").concat(o++):void 0}}},[n]);return p.createElement(E,{value:e,_nk:"".concat(O,"11")},p.createElement(u,w({},r,{ref:t,_nk:"".concat(O,"21")})))}return t(y.forwardRef(function(t,n){return p.createElement(o,{_nk:"".concat(O,"31")},function(e){return p.createElement(r,w({},t,{forwardedRef:n,__key:e,_nk:"".concat(O,"41")}))})}),r)}function P(){return y.useContext(R)||{nodeKey:void 0,getCountedKey:function(){}}}function k(){var e=P();return{sid:e.nodeKey,getCountedSID:e.getCountedKey}}var x="__SSRDATA__";var I,N,A=function(){var e;window.__SSR__?((e=document.getElementById(x)||document.createElement("script")).id=x,e.innerHTML="window.".concat(x,"={};"),document.head.appendChild(e)):s(document.getElementById(x))&&(window.__SSRED__=!0);var n=window[x]||{};function r(e){delete n[e]}return{set:function(e,t){window.__SSR__&&(n[e]=t,document.getElementById(x).innerHTML="window.".concat(x,"=").concat(JSON.stringify(n),";"))},get:function(e){var t=n[e];return r(e),t},remove:r}}(),D={get:(I=function(e,t){var n;if(e||!window.__SSR__)return window.__SSR__||(n=A.get(e)),n=u(n)?S(t):n},N=function(e,t,n){return n?e?(A.remove(n),[e,void 0]):(window.__SSR__&&A.set(n,t),[null,t]):[null,t]},function(){for(var n=this,e=arguments.length,r=new Array(e),t=0;t<e;t++)r[t]=arguments[t];var o,u=I.apply(this,r);return s(o=u)&&l(o.then)?new Promise(function(t){return u.then(function(e){return t(N.call.apply(N,[n,null,e].concat(r)))}).catch(function(e){return t(N.call.apply(N,[n,e,void 0].concat(r)))})}):N.call.apply(N,[this,null,u].concat(r))}),set:A.set},C=function(o){var u,i=1<arguments.length&&void 0!==arguments[1]?arguments[1]:16;return function(){for(var e=this,t=arguments.length,n=new Array(t),r=0;r<t;r++)n[r]=arguments[r];return clearTimeout(u),u=setTimeout(function(){o.apply(e,n)},i)}}(function(){window.__SSR__||console.warn('You shouldn\'t use "santi.useState" outside a "withSanti"')},32);function K(n,e){var t=P().getCountedKey,r=e||S(t),t=y.useState(function(){r||C();var e=_(D.get(r,n),2),t=e[0],e=e[1];return t&&console.error(t),e}),t=_(t,2),o=t[0],u=t[1];return[o,function(e){e=S(e,void 0,o);return D.set(r,e),u(e)},r]}function T(l){var d=1<arguments.length&&void 0!==arguments[1]?arguments[1]:null,s=2<arguments.length?arguments[2]:void 0;return function(f){function n(e){var t=e.forwardedRef,r=h(e,M),n=_(y.useState(!1),2),o=n[0],u=n[1],e=_(y.useState({}),2),n=e[0],i=e[1],c=y.useRef(!0),e=P().getCountedKey,a=s||S(e);return y.useEffect(function(){function e(){return(e=m(regeneratorRuntime.mark(function e(){var t,n;return regeneratorRuntime.wrap(function(e){for(;;)switch(e.prev=e.next){case 0:return e.next=2,D.get(a,function(){return S(l,void 0,r)});case 2:if(t=e.sent,n=_(t,2),t=n[0],n=n[1],t)return console.error("[getInitialProps error]",t),e.abrupt("return");e.next=9;break;case 9:c.current&&n&&(i(n),u(!0));case 10:case"end":return e.stop()}},e)}))).apply(this,arguments)}return function(){e.apply(this,arguments)}(),function(){c.current=!1}},[]),o?p.createElement(f,w({},v(v({},r),n),{ref:t,_nk:"".concat(B,"11")})):S(d,void 0,r)}return j(t(y.forwardRef(function(e,t){return p.createElement(n,w({},e,{forwardedRef:t,_nk:"".concat(B,"21")}))}),n))}}var M=["forwardedRef"],B="8NS2",L=function(){var e=m(regeneratorRuntime.mark(function e(){var t,n=arguments;return regeneratorRuntime.wrap(function(e){for(;;)switch(e.prev=e.next){case 0:if(t=0<n.length&&void 0!==n[0]?n[0]:-1,e.prev=1,t&&0<=Number(t))return e.next=5,function(t){return new Promise(function(e){return setTimeout(e,t)})}(t);e.next=5;break;case 5:window.__SSR__&&!window.__SSRREADY__&&((t=document.createElement("script")).innerHTML="window.__SSRREADY__=true",document.head.appendChild(t)),document.dispatchEvent(new Event("ssr-ready"));case 7:return e.prev=7,e.finish(7);case 9:case"end":return e.stop()}},e,null,[[1,,7,9]])}));return function(){return e.apply(this,arguments)}}(),H=j(function(e){return e.children}),q="ssr-root";function Y(e,t,r){var n=p.createElement(H,{_nk:"".concat("4mmK","11")},e);if(module.hot)return i.render(n,t,r);if(window.__SSR__){var o=document.getElementById(q);return o||((o=document.createElement("div")).style.cssText="width:100%;height:100%;",o.id=q,document.body.insertBefore(o,t)),i.render(n,o,r)}if(window.__SSRED__){var u=function(){setTimeout(function(){var e=document.getElementById(q);e&&e.parentNode.removeChild(e),t.style.display=""},56)},e=document.getElementById(q),o=r;return t.style.display="none",t.innerHTML=e.innerHTML,window.__SSRREADY__?document.addEventListener("ssr-ready",function e(){u(),document.removeEventListener("ssr-ready",e)}):o=function(){if(u(),l(r)){for(var e=arguments.length,t=new Array(e),n=0;n<e;n++)t[n]=arguments[n];r.apply(this,t)}},i.render(n,t,o)}return i.render(n,t,r)}function J(e){var t=e.children,n=e.delay,r=e.onMount,o=void 0!==r&&r,e=e.when,u=void 0!==e&&e;return y.useEffect(function(){o&&L(n)},[]),y.useEffect(function(){u&&L(n)},[u]),t}function U(e){var t=e.children,e=e.fallback;return window.__SSR__?S(void 0===e?null:e):t}J.OnMount=function(e){var t=e.children,n=e.delay,r=_(y.useState(!1),2),e=r[0],o=r[1];return y.useEffect(function(){o(!0)},[]),p.createElement(J,{delay:n,when:e,_nk:"".concat("B/hE","11")},t)};var $={render:Y,store:D,useState:K,getInitialProps:T,ready:L,withSanti:j,useNodeKey:P,useSID:k,Ready:J,NoSSR:U};e.NoSSR=U,e.Ready=J,e.default=$,e.getInitialProps=T,e.ready=L,e.render=Y,e.store=D,e.useNodeKey=P,e.useSID=k,e.useState=K,e.withSanti=j,Object.defineProperty(e,"__esModule",{value:!0})});
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "santi",
3
- "version": "0.0.0-beta.39",
3
+ "version": "0.0.0-beta.42",
4
4
  "description": "Isomorphic framework for base on create-react-app and jsdom",
5
5
  "bin": {
6
6
  "santi": "bin/santi.js"
@@ -51,11 +51,14 @@
51
51
  "promise-limit": "^2.7.0",
52
52
  "qs": "^6.9.1",
53
53
  "react-app-rewired": "^2.1.8",
54
- "react-node-key": "^0.1.8",
54
+ "react-node-key": "^0.3.1",
55
55
  "react-scripts": "^3.4.4",
56
56
  "szfe-tools": "^0.0.0-beta.7",
57
57
  "webpack-bundle-analyzer": "^3.6.0",
58
- "yargs": "^15.0.2"
58
+ "yargs": "^15.0.2",
59
+ "lodash": "^4.17.15",
60
+ "postcss": "^7.0.17",
61
+ "postcss-selector-parser": "6.0.2"
59
62
  },
60
63
  "devDependencies": {
61
64
  "@babel/core": "^7.7.5",
@@ -22,6 +22,7 @@ function runKoa(config = KOA_DEFAULT, port) {
22
22
  const {
23
23
  proxy: proxyTable,
24
24
  staticDir = paths.appBuild,
25
+ publicPath = paths.publicUrlOrPath,
25
26
  static: staticOpts
26
27
  } = {
27
28
  ...KOA_DEFAULT,
@@ -37,7 +38,8 @@ function runKoa(config = KOA_DEFAULT, port) {
37
38
  app.use(
38
39
  koaFallbackStatic(staticDir, {
39
40
  ...staticOpts,
40
- fallback: '__root.html'
41
+ fallback: '__root.html',
42
+ publicPath
41
43
  })
42
44
  )
43
45
 
@@ -29,6 +29,7 @@ function run(config = DEFAULT, port) {
29
29
  app.use(
30
30
  koaSsr({
31
31
  staticDir: paths.appBuild,
32
+ publicPath: paths.publicUrlOrPath,
32
33
  ...DEFAULT,
33
34
  ...ssrConfig,
34
35
  ...config,
@@ -1,9 +1,11 @@
1
1
  const koaStatic = require('./koaStatic')
2
2
 
3
- function koaFallbackStatic(root, { fallback = '/', ...opts } = {}) {
3
+ function koaFallbackStatic(root, { fallback = '/', publicPath = '/', ...opts } = {}) {
4
4
  const serveStatic = koaStatic(root, opts)
5
5
 
6
6
  return async (ctx, next) => {
7
+ ctx.request.url = ctx.request.url.replace(publicPath, '/')
8
+
7
9
  if (
8
10
  /\.html$/.test(ctx.request.url) ||
9
11
  !/text\/html/.test(ctx.header.accept)
@@ -1,5 +1,5 @@
1
1
  const { run } = require('szfe-tools')
2
-
2
+ const express = require('express')
3
3
  const Prerenderer = require('./Prerenderer')
4
4
 
5
5
  const JSDOMPrerenderer = require('../JSDOMPrerenderer')
@@ -8,7 +8,7 @@ const renderWithJSDOM = require('../renderWithJSDOM')
8
8
  const DEFAULT_RENDERER_CONFIG = {}
9
9
 
10
10
  module.exports = class Renderer {
11
- constructor({ staticDir, server, proxy, ...rendererConfig }) {
11
+ constructor({ staticDir, publicPath, server, proxy, ...rendererConfig }) {
12
12
  this.config = {
13
13
  ...DEFAULT_RENDERER_CONFIG,
14
14
  ...rendererConfig
@@ -25,6 +25,12 @@ module.exports = class Renderer {
25
25
  renderer: new JSDOMPrerenderer(this.config)
26
26
  })
27
27
 
28
+ if (publicPath !== '/') {
29
+ prerender._server._expressServer.use(publicPath, express.static(staticDir, {
30
+ dotfiles: 'allow'
31
+ }))
32
+ }
33
+
28
34
  prerender.initialize()
29
35
 
30
36
  this.renderer = {
@@ -36,6 +36,7 @@ const defaultCacheEngine = {
36
36
  module.exports = function ssr({
37
37
  devMode = false,
38
38
  staticDir,
39
+ publicPath,
39
40
  server,
40
41
  log: useLog = true,
41
42
  renderConfig: renderConfigTable = [],
@@ -53,6 +54,7 @@ module.exports = function ssr({
53
54
  // https://github.com/koajs/send/blob/5.0.0/index.js#L80
54
55
  gzip: true,
55
56
  fallback: '__root.html',
57
+ publicPath,
56
58
  })
57
59
  : server
58
60
  ? httpProxy({
@@ -70,6 +72,7 @@ module.exports = function ssr({
70
72
 
71
73
  const { render } = new Renderer({
72
74
  staticDir,
75
+ publicPath,
73
76
  server,
74
77
  ...rendererConfig,
75
78
  })
@@ -140,6 +143,8 @@ module.exports = function ssr({
140
143
  try {
141
144
  if (useSsr && isUndefined(key)) {
142
145
  const html = await render(ctx.request.url, {
146
+ uncss: rendererConfig.uncss,
147
+ timeout: rendererConfig.timeout,
143
148
  cookie: ctx.request.headers.cookie,
144
149
  inject: {
145
150
  __REQUEST__,
@@ -185,7 +190,8 @@ module.exports = function ssr({
185
190
  }
186
191
 
187
192
  renderTask = render(ctx.request.url, {
188
- timeout: renderConfig.timeout,
193
+ uncss: renderConfig.uncss || rendererConfig.uncss,
194
+ timeout: renderConfig.timeout || rendererConfig.timeout,
189
195
  cookie: ctx.request.headers.cookie,
190
196
  inject: {
191
197
  __REQUEST__,
@@ -1,4 +1,7 @@
1
+ const uncss = require('./uncss')
2
+
1
3
  const DEFAULT_CONFIG = {
4
+ uncss: false,
2
5
  deferHeadScripts: true,
3
6
  asyncHeadScripts: false,
4
7
  inlinePrimaryStyle: true,
@@ -21,7 +24,7 @@ const getPageContent = (dom, config = DEFAULT_CONFIG, resources) =>
21
24
  let interval
22
25
  let timeout
23
26
 
24
- function captureDocument() {
27
+ async function captureDocument() {
25
28
  // console.log('节点数:', document.body.querySelectorAll('*').length)
26
29
  if (options.deferHeadScripts) {
27
30
  // defer scripts
@@ -57,6 +60,21 @@ const getPageContent = (dom, config = DEFAULT_CONFIG, resources) =>
57
60
  })
58
61
  }
59
62
 
63
+ // 过滤无效 css
64
+ if (config.uncss) {
65
+ await Promise.all(
66
+ [...document.head.querySelectorAll('style')].map(async (style) => {
67
+ const nextInnerHTML = await uncss(dom, style.innerHTML)
68
+
69
+ if (nextInnerHTML.length > 0) {
70
+ style.innerHTML = nextInnerHTML
71
+ } else {
72
+ style.parentNode.removeChild(style)
73
+ }
74
+ })
75
+ )
76
+ }
77
+
60
78
  // get page content string
61
79
  try {
62
80
  const html = dom.serialize()
@@ -0,0 +1,325 @@
1
+ // From: https://github.com/uncss/uncss/blob/0.17.3/src/lib.js
2
+
3
+ const postcss = require('postcss'),
4
+ postcssSelectorParser = require('postcss-selector-parser'),
5
+ _ = require('lodash')
6
+
7
+ /**
8
+ * Filter unused selectors.
9
+ * @param {Object} window A jsdom window
10
+ * @param {Array} sels List of selectors to be filtered
11
+ * @return {Array}
12
+ */
13
+ function findAll(window, sels) {
14
+ const document = window.document
15
+
16
+ // Unwrap noscript elements.
17
+ const elements = document.getElementsByTagName('noscript')
18
+ Array.prototype.forEach.call(elements, (ns) => {
19
+ const wrapper = document.createElement('div')
20
+ wrapper.innerHTML = ns.textContent
21
+ // Insert each child of the <noscript> as its sibling
22
+ Array.prototype.forEach.call(wrapper.children, (child) => {
23
+ ns.parentNode.insertBefore(child, ns)
24
+ })
25
+ })
26
+
27
+ // Do the filtering.
28
+ return sels.filter((selector) => {
29
+ try {
30
+ return document.querySelector(selector)
31
+ // eslint-disable-next-line no-unused-vars
32
+ } catch (e) {
33
+ // We ignore the error because there are a bunch of selectors which are out of our control.
34
+ // In that case, we consider them as unused.
35
+ return true
36
+ }
37
+ })
38
+ }
39
+
40
+ /* Some styles are applied only with user interaction, and therefore its
41
+ * selectors cannot be used with querySelectorAll.
42
+ * http://www.w3.org/TR/2001/CR-css3-selectors-20011113/
43
+ */
44
+ const dePseudify = (() => {
45
+ const ignoredPseudos = [
46
+ /* link */
47
+ ':link',
48
+ ':visited',
49
+ /* user action */
50
+ ':hover',
51
+ ':active',
52
+ ':focus',
53
+ ':focus-within',
54
+ /* UI element states */
55
+ ':enabled',
56
+ ':disabled',
57
+ ':checked',
58
+ ':indeterminate',
59
+ /* form validation */
60
+ ':required',
61
+ ':invalid',
62
+ ':valid',
63
+ /* pseudo elements */
64
+ '::first-line',
65
+ '::first-letter',
66
+ '::selection',
67
+ '::before',
68
+ '::after',
69
+ /* pseudo classes */
70
+ ':target',
71
+ /* CSS2 pseudo elements */
72
+ ':before',
73
+ ':after',
74
+ /* Vendor-specific pseudo-elements:
75
+ * https://developer.mozilla.org/ja/docs/Glossary/Vendor_Prefix
76
+ */
77
+ '::?-(?:moz|ms|webkit|o)-[a-z0-9-]+',
78
+ ],
79
+ // Actual regex is of the format: /^(:hover|:focus|...)$/i
80
+ pseudosRegex = new RegExp(`^(${ignoredPseudos.join('|')})$`, 'i')
81
+
82
+ const transform = (selectors) => {
83
+ selectors.walkPseudos((selector) => {
84
+ if (pseudosRegex.test(selector.value)) {
85
+ selector.remove()
86
+ }
87
+ })
88
+ }
89
+
90
+ const processor = postcssSelectorParser(transform)
91
+
92
+ return (selector) => processor.processSync(selector)
93
+ })()
94
+
95
+ /**
96
+ * Private function used in filterUnusedRules.
97
+ * @param {Array} selectors CSS selectors created by the CSS parser
98
+ * @param {Array} ignore List of selectors to be ignored
99
+ * @param {Array} usedSelectors List of Selectors found in the jsdom pages
100
+ * @return {Array} The selectors matched in the DOMs
101
+ */
102
+ function filterUnusedSelectors(selectors, ignore, usedSelectors) {
103
+ /* There are some selectors not supported for matching, like
104
+ * :before, :after
105
+ * They should be removed only if the parent is not found.
106
+ * Example: '.clearfix:before' should be removed only if there
107
+ * is no '.clearfix'
108
+ */
109
+ return selectors.filter((selector) => {
110
+ selector = dePseudify(selector)
111
+ /* TODO: process @-rules */
112
+ if (selector[0] === '@') {
113
+ return true
114
+ }
115
+ for (let i = 0, len = ignore.length; i < len; ++i) {
116
+ if (_.isRegExp(ignore[i]) && ignore[i].test(selector)) {
117
+ return true
118
+ }
119
+ if (/:\w+/.test(ignore[i])) {
120
+ const ignored = dePseudify(ignore[i])
121
+ if (ignored === selector) {
122
+ return true
123
+ }
124
+ }
125
+ if (ignore[i] === selector) {
126
+ return true
127
+ }
128
+ }
129
+ return usedSelectors.indexOf(selector) !== -1
130
+ })
131
+ }
132
+
133
+ /**
134
+ * Filter @keyframes that are not used
135
+ * @param {Object} css The postcss.Root node
136
+ * @param {Array} animations
137
+ * @param {Array} unusedRules
138
+ * @return {Array}
139
+ */
140
+ function filterKeyframes(css, unusedRules) {
141
+ const usedAnimations = []
142
+ css.walkDecls((decl) => {
143
+ if (_.endsWith(decl.prop, 'animation-name')) {
144
+ /* Multiple animations, separated by comma */
145
+ usedAnimations.push(...postcss.list.comma(decl.value))
146
+ } else if (_.endsWith(decl.prop, 'animation')) {
147
+ /* Support multiple animations */
148
+ postcss.list.comma(decl.value).forEach((anim) => {
149
+ /* If declared as animation, name can be anywhere in the string; so we include all the properties */
150
+ usedAnimations.push(...postcss.list.space(anim))
151
+ })
152
+ }
153
+ })
154
+ const usedAnimationsSet = new Set(usedAnimations)
155
+ css.walkAtRules(/keyframes$/, (atRule) => {
156
+ if (!usedAnimationsSet.has(atRule.params)) {
157
+ unusedRules.push(atRule)
158
+ atRule.remove()
159
+ }
160
+ })
161
+ }
162
+
163
+ /**
164
+ * Filter rules with no selectors remaining
165
+ * @param {Object} css The postcss.Root node
166
+ * @return {Array}
167
+ */
168
+ function filterEmptyAtRules(css) {
169
+ /* Filter media queries with no remaining rules */
170
+ css.walkAtRules((atRule) => {
171
+ if (atRule.name === 'media' && atRule.nodes.length === 0) {
172
+ atRule.remove()
173
+ }
174
+ })
175
+ }
176
+
177
+ /**
178
+ * Find which selectors are used in {pages}
179
+ * @param {Array} page List of jsdom pages
180
+ * @param {Object} css The postcss.Root node
181
+ * @return {Promise}
182
+ */
183
+ function getUsedSelectors(page, css) {
184
+ let usedSelectors = []
185
+ css.walkRules((rule) => {
186
+ rule.selectors.filter((s) => /^@/.test(s)).forEach((s) => console.log(s))
187
+ usedSelectors = _.concat(usedSelectors, rule.selectors.map(dePseudify))
188
+ })
189
+
190
+ return findAll(page.window, usedSelectors)
191
+ }
192
+
193
+ /**
194
+ * Get all the selectors mentioned in {css}
195
+ * @param {Object} css The postcss.Root node
196
+ * @return {Array}
197
+ */
198
+ function getAllSelectors(css) {
199
+ let selectors = []
200
+ css.walkRules((rule) => {
201
+ selectors = _.concat(selectors, rule.selector)
202
+ })
203
+ return selectors
204
+ }
205
+
206
+ /**
207
+ * Remove css rules not used in the dom
208
+ * @param {Array} pages List of jsdom pages
209
+ * @param {Object} css The postcss.Root node
210
+ * @param {Array} ignore List of selectors to be ignored
211
+ * @param {Array} usedSelectors List of selectors that are found in {pages}
212
+ * @return {Object} A css_parse-compatible stylesheet
213
+ */
214
+ function filterUnusedRules(css, ignore, usedSelectors) {
215
+ let ignoreNextRule = false,
216
+ ignoreNextRulesStart = false,
217
+ unusedRuleSelectors,
218
+ usedRuleSelectors
219
+
220
+ const unusedRules = []
221
+
222
+ /* Rule format:
223
+ * { selectors: [ '...', '...' ],
224
+ * declarations: [ { property: '...', value: '...' } ]
225
+ * },.
226
+ * Two steps: filter the unused selectors for each rule,
227
+ * filter the rules with no selectors
228
+ */
229
+ ignoreNextRule = false
230
+ css.walk((rule) => {
231
+ if (rule.type === 'comment') {
232
+ if (/^!?\s?uncss:ignore start\s?$/.test(rule.text)) {
233
+ // ignore next rules while using comment `/* uncss:ignore start */`
234
+ ignoreNextRulesStart = true
235
+ } else if (/^!?\s?uncss:ignore end\s?$/.test(rule.text)) {
236
+ // until `/* uncss:ignore end */` was found
237
+ ignoreNextRulesStart = false
238
+ } else if (/^!?\s?uncss:ignore\s?$/.test(rule.text)) {
239
+ // ignore next rule while using comment `/* uncss:ignore */`
240
+ ignoreNextRule = true
241
+ }
242
+ } else if (rule.type === 'rule') {
243
+ if (
244
+ rule.parent.type === 'atrule' &&
245
+ _.endsWith(rule.parent.name, 'keyframes')
246
+ ) {
247
+ // Don't remove animation keyframes that have selector names of '30%' or 'to'
248
+ return
249
+ }
250
+ if (ignoreNextRulesStart) {
251
+ ignore = ignore.concat(rule.selectors)
252
+ } else if (ignoreNextRule) {
253
+ ignoreNextRule = false
254
+ ignore = ignore.concat(rule.selectors)
255
+ }
256
+
257
+ usedRuleSelectors = filterUnusedSelectors(
258
+ rule.selectors,
259
+ ignore,
260
+ usedSelectors
261
+ )
262
+ unusedRuleSelectors = rule.selectors.filter(
263
+ (selector) => usedRuleSelectors.indexOf(selector) < 0
264
+ )
265
+ if (unusedRuleSelectors && unusedRuleSelectors.length) {
266
+ unusedRules.push({
267
+ type: 'rule',
268
+ selectors: unusedRuleSelectors,
269
+ position: rule.source,
270
+ })
271
+ }
272
+ if (usedRuleSelectors.length === 0) {
273
+ rule.remove()
274
+ } else {
275
+ rule.selectors = usedRuleSelectors
276
+ }
277
+ }
278
+ })
279
+
280
+ /* Filter the @media rules with no rules */
281
+ filterEmptyAtRules(css)
282
+
283
+ /* Filter unused @keyframes */
284
+ filterKeyframes(css, unusedRules)
285
+
286
+ return css
287
+ }
288
+
289
+ /**
290
+ * Main exposed function
291
+ * @param {Array} pages List of jsdom pages
292
+ * @param {Object} css The postcss.Root node
293
+ * @param {Array} ignore List of selectors to be ignored
294
+ * @return {Promise}
295
+ */
296
+ module.exports = async function uncss(page, cssText, ignore = []) {
297
+ const pages = [page]
298
+ const css = postcss.parse(cssText)
299
+ css.walkAtRules('font-face', (rule) => {
300
+ rule.remove()
301
+ })
302
+ const nestedUsedSelectors = await Promise.all(
303
+ pages.map((page) => getUsedSelectors(page, css))
304
+ )
305
+ const usedSelectors = _.flatten(nestedUsedSelectors)
306
+ const filteredCss = filterUnusedRules(css, ignore, usedSelectors)
307
+ // console.log(usedSelectors)
308
+ // const allSelectors = getAllSelectors(css)
309
+
310
+ let newCssStr = ''
311
+ postcss.stringify(filteredCss, (result) => {
312
+ newCssStr += result
313
+ })
314
+
315
+ return newCssStr
316
+ // return [
317
+ // filteredCss,
318
+ // {
319
+ // /* Get the selectors for the report */
320
+ // all: allSelectors,
321
+ // unused: _.difference(allSelectors, usedSelectors),
322
+ // used: usedSelectors,
323
+ // },
324
+ // ]
325
+ }