react-ui-basics 0.0.211 → 0.0.213

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (50) hide show
  1. package/Animated.js +2 -6
  2. package/Animated.js.map +1 -1
  3. package/AutocompleteSelect.js +1 -5
  4. package/AutocompleteSelect.js.map +1 -1
  5. package/Button.js +1 -15
  6. package/Button.js.map +1 -1
  7. package/CalendarMonthView.d.ts +0 -1
  8. package/CircleProgress.d.ts +0 -1
  9. package/Dialog.js +1 -13
  10. package/Dialog.js.map +1 -1
  11. package/Dropzone.js +1 -13
  12. package/Dropzone.js.map +1 -1
  13. package/FormUploadProgress.js +1 -12
  14. package/FormUploadProgress.js.map +1 -1
  15. package/ImageGallery.js +7 -7
  16. package/ImageGallery.js.map +1 -1
  17. package/MaterialIcon.d.ts +0 -1
  18. package/Modal.js +1 -8
  19. package/Modal.js.map +1 -1
  20. package/Scrollable.js +2 -14
  21. package/Scrollable.js.map +1 -1
  22. package/Size.d.ts +0 -1
  23. package/SpinningProgress.d.ts +0 -1
  24. package/TextField.js +1 -23
  25. package/TextField.js.map +1 -1
  26. package/Tools.d.ts +1 -0
  27. package/Tools.js +2 -1
  28. package/Tools.js.map +1 -1
  29. package/_virtual/_rollupPluginBabelHelpers.js.map +1 -1
  30. package/bundle.css +736 -736
  31. package/package.json +3 -1
  32. package/router/Link.js +1 -6
  33. package/router/Link.js.map +1 -1
  34. package/router/NavLink.js +0 -3
  35. package/router/NavLink.js.map +1 -1
  36. package/router/Route.js +1 -8
  37. package/router/Route.js.map +1 -1
  38. package/src/Tools.ts +2 -0
  39. package/src/store/{ProxyTools.test.js → ProxyTools.test.ts} +11 -1
  40. package/src/store/ProxyTools.ts +85 -0
  41. package/src/store/Store.test.js +86 -0
  42. package/src/store/Store.ts +55 -33
  43. package/store/ProxyTools.d.ts +1 -0
  44. package/store/ProxyTools.js +72 -61
  45. package/store/ProxyTools.js.map +1 -1
  46. package/store/ProxyTools.test.d.ts +1 -0
  47. package/store/Store.d.ts +6 -7
  48. package/store/Store.js +44 -26
  49. package/store/Store.js.map +1 -1
  50. package/src/store/ProxyTools.js +0 -89
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "react-ui-basics",
3
- "version": "0.0.211",
3
+ "version": "0.0.213",
4
4
  "description": "",
5
5
  "module": "index.js",
6
6
  "_main": "index.cjs.js",
@@ -57,6 +57,7 @@
57
57
  "@babel/plugin-transform-runtime": "7.22.15",
58
58
  "@babel/preset-env": "7.22.20",
59
59
  "@babel/preset-react": "7.22.15",
60
+ "@babel/preset-typescript": "^7.23.3",
60
61
  "@rollup/plugin-typescript": "^9.0.1",
61
62
  "@storybook/addon-actions": "6.4.19",
62
63
  "@storybook/addon-controls": "6.4.19",
@@ -65,6 +66,7 @@
65
66
  "@storybook/addons": "6.4.19",
66
67
  "@storybook/react": "6.4.19",
67
68
  "@storybook/source-loader": "6.4.19",
69
+ "@types/jest": "^29.5.11",
68
70
  "@types/react": "^17.0.50",
69
71
  "@types/react-dom": "^17.0.17",
70
72
  "babel-loader": "^8.2.5",
package/router/Link.js CHANGED
@@ -1,6 +1,6 @@
1
1
  import ReactConstants from "./../ReactConstants"; import {clientHeight as __clientHeight, clientWidth as __clientWidth, createAccessor as __createAccessor, data as __data, height as __height, left as __left, length as __length, pageX as __pageX, pageY as __pageY, props as __props, scrollLeft as __scrollLeft, scrollTop as __scrollTop, state as __state, style as __style, target as __target, top as __top, value as __value, width as __width} from "./../CommonFields"; import {toConsumableArray as __toConsumableArray} from "./../_virtual/_rollupPluginBabelHelpers"; import {extends as __extends} from "./../_virtual/_rollupPluginBabelHelpers"; import {inherits as __inherits} from "./../_virtual/_rollupPluginBabelHelpers"; import 'react';
2
2
  import ReactCreateElement from '../ReactCreateElement.js';
3
- import PropTypes from 'prop-types';
3
+ import 'prop-types';
4
4
  import { pushLocation } from './HistoryTools.js';
5
5
  import { preventDefault } from '../Tools.js';
6
6
 
@@ -19,11 +19,6 @@ var Link = function Link(_ref) {
19
19
  }
20
20
  }, children);
21
21
  };
22
- if (process.env.NODE_ENV !== 'production') {
23
- Link.propTypes = {
24
- href: PropTypes.string.isRequired
25
- };
26
- }
27
22
  var Link$1 = Link;
28
23
 
29
24
  export { Link$1 as default };
@@ -1 +1 @@
1
- {"version":3,"file":"Link.js","sources":["../src/router/Link.js"],"sourcesContent":["import React from 'react';\nimport ReactCreateElement from '../ReactCreateElement';\nimport PropTypes from 'prop-types';\nimport './HistoryTools'\nimport {pushLocation} from \"./HistoryTools\";\nimport {preventDefault} from \"../Tools\";\n\nconst Link = ({children, href, className}) =>\n <a href={href} className={className} onClick={(e) => {\n if (!e.ctrlKey) {\n preventDefault(e);\n pushLocation(href);\n }\n }}>{children}</a>;\n\nif (window.isNotProductionEnvironment) {\n Link.propTypes = {\n href: PropTypes.string.isRequired,\n };\n}\n\nexport default Link;"],"names":["Link","_ref","children","href","className","ReactCreateElement","onClick","e","ctrlKey","preventDefault","pushLocation","window","isNotProductionEnvironment","propTypes","PropTypes","string","isRequired"],"mappings":";;;;;;AAOA,IAAMA,IAAI,GAAG,SAAPA,IAAIA,CAAAC,IAAA,EAAA;AAAA,EAAA,IAAKC,QAAQ,GAAAD,IAAA,CAARC,QAAQ;IAAEC,IAAI,GAAAF,IAAA,CAAJE,IAAI;IAAEC,SAAS,GAAAH,IAAA,CAATG,SAAS,CAAA;AAAA,EAAA,OACpCC,kBAAA,CAAA,GAAA,EAAA;AAAGF,IAAAA,IAAI,EAAEA,IAAK;AAACC,IAAAA,SAAS,EAAEA,SAAU;AAACE,IAAAA,OAAO,EAAE,SAAAA,OAACC,CAAAA,CAAC,EAAK;AACjD,MAAA,IAAI,CAACA,CAAC,CAACC,OAAO,EAAE;QACZC,cAAc,CAACF,CAAC,CAAC,CAAA;QACjBG,YAAY,CAACP,IAAI,CAAC,CAAA;AACtB,OAAA;AACJ,KAAA;AAAE,GAAA,EAAED,QAAY,CAAC,CAAA;AAAA,CAAA,CAAA;AAErB,IAAIS,MAAM,CAACC,0BAA0B,EAAE;EACnCZ,IAAI,CAACa,SAAS,GAAG;AACbV,IAAAA,IAAI,EAAEW,SAAS,CAACC,MAAM,CAACC,UAAAA;GAC1B,CAAA;AACL,CAAA;AAEA,aAAehB,IAAI;;;;"}
1
+ {"version":3,"file":"Link.js","sources":["../src/router/Link.js"],"sourcesContent":["import React from 'react';\nimport ReactCreateElement from '../ReactCreateElement';\nimport PropTypes from 'prop-types';\nimport './HistoryTools'\nimport {pushLocation} from \"./HistoryTools\";\nimport {preventDefault} from \"../Tools\";\n\nconst Link = ({children, href, className}) =>\n <a href={href} className={className} onClick={(e) => {\n if (!e.ctrlKey) {\n preventDefault(e);\n pushLocation(href);\n }\n }}>{children}</a>;\n\nif (window.isNotProductionEnvironment) {\n Link.propTypes = {\n href: PropTypes.string.isRequired,\n };\n}\n\nexport default Link;"],"names":["Link","_ref","children","href","className","ReactCreateElement","onClick","e","ctrlKey","preventDefault","pushLocation"],"mappings":";;;;;;AAOA,IAAMA,IAAI,GAAG,SAAPA,IAAIA,CAAAC,IAAA,EAAA;AAAA,EAAA,IAAKC,QAAQ,GAAAD,IAAA,CAARC,QAAQ;IAAEC,IAAI,GAAAF,IAAA,CAAJE,IAAI;IAAEC,SAAS,GAAAH,IAAA,CAATG,SAAS,CAAA;AAAA,EAAA,OACpCC,kBAAA,CAAA,GAAA,EAAA;AAAGF,IAAAA,IAAI,EAAEA,IAAK;AAACC,IAAAA,SAAS,EAAEA,SAAU;AAACE,IAAAA,OAAO,EAAE,SAAAA,OAACC,CAAAA,CAAC,EAAK;AACjD,MAAA,IAAI,CAACA,CAAC,CAACC,OAAO,EAAE;QACZC,cAAc,CAACF,CAAC,CAAC,CAAA;QACjBG,YAAY,CAACP,IAAI,CAAC,CAAA;AACtB,OAAA;AACJ,KAAA;AAAE,GAAA,EAAED,QAAY,CAAC,CAAA;AAAA,CAAA,CAAA;AAQrB,aAAeF,IAAI;;;;"}
package/router/NavLink.js CHANGED
@@ -21,9 +21,6 @@ var NavLink = function NavLink(_ref) {
21
21
  }
22
22
  });
23
23
  };
24
- if (process.env.NODE_ENV !== 'production') {
25
- NavLink.propTypes = Link.propTypes;
26
- }
27
24
  var NavLink$1 = NavLink;
28
25
 
29
26
  export { NavLink$1 as default };
@@ -1 +1 @@
1
- {"version":3,"file":"NavLink.js","sources":["../src/router/NavLink.js"],"sourcesContent":["import React from 'react';\nimport ReactCreateElement from '../ReactCreateElement';\nimport PropTypes from 'prop-types';\nimport './HistoryTools'\nimport Route from \"./Route\";\nimport Link from \"./Link\";\nimport {classNames} from \"../Tools\";\n\nconst NavLink = ({children, href, highlightPath, className, activeClassName}) =>\n <Route path={highlightPath || href}\n controller={matches => <Link href={href} className={classNames(className, matches && activeClassName)}>\n {children}\n </Link>}\n />;\n\nif(window.isNotProductionEnvironment) {\n NavLink.propTypes = Link.propTypes;\n}\n\nexport default NavLink;"],"names":["NavLink","_ref","children","href","highlightPath","className","activeClassName","ReactCreateElement","Route","path","controller","matches","Link","classNames","window","isNotProductionEnvironment","propTypes"],"mappings":";;;;;;;AAQA,IAAMA,OAAO,GAAG,SAAVA,OAAOA,CAAAC,IAAA,EAAA;AAAA,EAAA,IAAKC,QAAQ,GAAAD,IAAA,CAARC,QAAQ;IAAEC,IAAI,GAAAF,IAAA,CAAJE,IAAI;IAAEC,aAAa,GAAAH,IAAA,CAAbG,aAAa;IAAEC,SAAS,GAAAJ,IAAA,CAATI,SAAS;IAAEC,eAAe,GAAAL,IAAA,CAAfK,eAAe,CAAA;EAAA,OACvEC,kBAAA,CAACC,KAAK,EAAA;IAACC,IAAI,EAAEL,aAAa,IAAID,IAAK;IAC5BO,UAAU,EAAE,SAAAA,UAAAA,CAAAC,OAAO,EAAA;MAAA,OAAIJ,kBAAA,CAACK,IAAI,EAAA;AAACT,QAAAA,IAAI,EAAEA,IAAK;AAACE,QAAAA,SAAS,EAAEQ,UAAU,CAACR,SAAS,EAAEM,OAAO,IAAIL,eAAe,CAAA;AAAE,OAAA,EACjGJ,QACC,CAAC,CAAA;AAAA,KAAA;AAAC,GACd,CAAC,CAAA;AAAA,CAAA,CAAA;AAEN,IAAGY,MAAM,CAACC,0BAA0B,EAAE;AAClCf,EAAAA,OAAO,CAACgB,SAAS,GAAGJ,IAAI,CAACI,SAAS,CAAA;AACtC,CAAA;AAEA,gBAAehB,OAAO;;;;"}
1
+ {"version":3,"file":"NavLink.js","sources":["../src/router/NavLink.js"],"sourcesContent":["import React from 'react';\nimport ReactCreateElement from '../ReactCreateElement';\nimport PropTypes from 'prop-types';\nimport './HistoryTools'\nimport Route from \"./Route\";\nimport Link from \"./Link\";\nimport {classNames} from \"../Tools\";\n\nconst NavLink = ({children, href, highlightPath, className, activeClassName}) =>\n <Route path={highlightPath || href}\n controller={matches => <Link href={href} className={classNames(className, matches && activeClassName)}>\n {children}\n </Link>}\n />;\n\nif(window.isNotProductionEnvironment) {\n NavLink.propTypes = Link.propTypes;\n}\n\nexport default NavLink;"],"names":["NavLink","_ref","children","href","highlightPath","className","activeClassName","ReactCreateElement","Route","path","controller","matches","Link","classNames"],"mappings":";;;;;;;AAQA,IAAMA,OAAO,GAAG,SAAVA,OAAOA,CAAAC,IAAA,EAAA;AAAA,EAAA,IAAKC,QAAQ,GAAAD,IAAA,CAARC,QAAQ;IAAEC,IAAI,GAAAF,IAAA,CAAJE,IAAI;IAAEC,aAAa,GAAAH,IAAA,CAAbG,aAAa;IAAEC,SAAS,GAAAJ,IAAA,CAATI,SAAS;IAAEC,eAAe,GAAAL,IAAA,CAAfK,eAAe,CAAA;EAAA,OACvEC,kBAAA,CAACC,KAAK,EAAA;IAACC,IAAI,EAAEL,aAAa,IAAID,IAAK;IAC5BO,UAAU,EAAE,SAAAA,UAAAA,CAAAC,OAAO,EAAA;MAAA,OAAIJ,kBAAA,CAACK,IAAI,EAAA;AAACT,QAAAA,IAAI,EAAEA,IAAK;AAACE,QAAAA,SAAS,EAAEQ,UAAU,CAACR,SAAS,EAAEM,OAAO,IAAIL,eAAe,CAAA;AAAE,OAAA,EACjGJ,QACC,CAAC,CAAA;AAAA,KAAA;AAAC,GACd,CAAC,CAAA;AAAA,CAAA,CAAA;AAMN,gBAAeF,OAAO;;;;"}
package/router/Route.js CHANGED
@@ -1,6 +1,6 @@
1
1
  import ReactConstants from "./../ReactConstants"; import {clientHeight as __clientHeight, clientWidth as __clientWidth, createAccessor as __createAccessor, data as __data, height as __height, left as __left, length as __length, pageX as __pageX, pageY as __pageY, props as __props, scrollLeft as __scrollLeft, scrollTop as __scrollTop, state as __state, style as __style, target as __target, top as __top, value as __value, width as __width} from "./../CommonFields"; import {toConsumableArray as __toConsumableArray} from "./../_virtual/_rollupPluginBabelHelpers"; import {extends as __extends} from "./../_virtual/_rollupPluginBabelHelpers"; import {inherits as __inherits} from "./../_virtual/_rollupPluginBabelHelpers"; import { inherits as _inherits, createSuper as _createSuper, createClass as _createClass, classCallCheck as _classCallCheck, assertThisInitialized as _assertThisInitialized, slicedToArray as _slicedToArray } from '../_virtual/_rollupPluginBabelHelpers.js';
2
2
  import React from 'react';
3
- import PropTypes from 'prop-types';
3
+ import 'prop-types';
4
4
  import { setOf, allPropsExcept, isDifferent, addEventListener, WINDOW, removeEventListener, orNoop } from '../Tools.js';
5
5
  import { stateGSs, componentDidUpdate, render, componentDidMount, componentWillUnmount, PureComponent, propsGetter, setState } from '../ReactConstants.js';
6
6
 
@@ -151,13 +151,6 @@ var Route = function (_PureComponent) {
151
151
  }
152
152
  return _createClass(Route);
153
153
  }(PureComponent);
154
- if (process.env.NODE_ENV !== 'production') {
155
- Route.propTypes = {
156
- path: PropTypes.oneOfType([PropTypes.string, PropTypes.arrayOf(PropTypes.string)]).isRequired,
157
- controller: PropTypes.func,
158
- onToggle: PropTypes.func
159
- };
160
- }
161
154
  var DefaultController = function DefaultController(matches, children, props) {
162
155
  if (!matches || !children) return null;
163
156
  if (Object.keys(props).length > 0) {
@@ -1 +1 @@
1
- {"version":3,"file":"Route.js","sources":["../src/router/Route.js"],"sourcesContent":["import React from 'react';\nimport ReactCreateElement from '../ReactCreateElement';\nimport PropTypes from 'prop-types';\nimport './HistoryTools'\nimport {allPropsExcept, isDifferent, orNoop, setOf, WINDOW, addEventListener, removeEventListener} from \"../Tools\";\nimport {componentDidUpdate, render, PureComponent, componentDidMount, componentWillUnmount, propsGetter, stateGSs, setState} from \"../ReactConstants\";\n\nconst historyEvents = ['popstate', 'pushState', 'replaceState'];\n\nconst cleanPath = (path) => {\n if (path.length > 1 && path.lastIndexOf('/') === path.length - 1)\n return path.substring(0, path.length - 1);\n\n return path;\n};\n\nconst createUrlMatcher = path => {\n let matcher;\n const segments = path.split('/');\n const optionals = segments.map(it => it === '*' || it.indexOf('?') === it.length - 1);\n const containsVariables = path.indexOf(':') !== -1;\n const containsAnySegment = path.indexOf('*') !== -1;\n const containsNot = path.indexOf('!') !== -1;\n\n if (!containsAnySegment && !containsVariables && !containsNot) {\n matcher = (p) => p === path\n } else {\n const endsWithAny = path.lastIndexOf('*') === path.length - 1;\n const matchers = segments.map((segment, i) => {\n let matcher;\n const variableNameIndex = segment.indexOf(':');\n if (segment === '*')\n matcher = () => true;\n else if (variableNameIndex !== -1) {\n let variable = segment.substring(variableNameIndex + 1);\n let regex = null\n if (variable.indexOf('?') !== -1)\n variable = variable.substring(0, variable.indexOf('?'));\n if (variable.indexOf('(') !== -1) {\n let regexStart = variable.indexOf('(');\n regex = new RegExp(variable.substring(regexStart))\n variable = variable.substring(0, regexStart);\n }\n\n const prefix = variableNameIndex && segment.substring(0, variableNameIndex);\n matcher = (p, params) => {\n if (regex && !!p && !p.match(regex))\n return false\n\n if (!p && !optionals[i])\n return false;\n if (prefix) {\n if (p.indexOf(prefix) === 0)\n p = p.substring(variableNameIndex);\n else\n return false;\n }\n\n params[variable] = p;\n return true;\n }\n } else if (segment.indexOf('!') === 0) {\n const not = segment.substring(1);\n matcher = (p) => p !== not;\n } else\n matcher = (p) => p === segment;\n return matcher;\n });\n\n matcher = (path, params) => {\n const segments = path.split('/');\n const length = Math.min(matchers.length, segments.length);\n\n // only exact match if mapping not ends with *\n if (!endsWithAny && matchers.length < segments.length)\n return false;\n\n // check that each segment matches\n for (let i = 0; i < length; i++) {\n if (!matchers[i](segments[i], params))\n return false;\n }\n\n // check that all other segments are optional\n for (let i = length; i < optionals.length; i++) {\n if (!optionals[i])\n return false;\n }\n\n return true;\n };\n }\n return matcher\n};\n\nconst createUrlMatchers = path => {\n if (Array.isArray(path)) {\n const matchers = path.map(it => createUrlMatcher(it));\n return (path, params) => {\n for (let i = 0; i < matchers.length; i++) {\n let props = {};\n if (matchers[i](path, props)) {\n Object.assign(params, props);\n return true;\n }\n }\n return false;\n }\n } else {\n return createUrlMatcher(path);\n }\n};\n\nconst selfProps = setOf([\n 'children',\n 'path',\n 'controller',\n 'onToggle',\n]);\n\nclass Route extends PureComponent {\n\n constructor(properties) {\n super(properties);\n const that = this;\n that.state = {};\n let matcher;\n\n const props = propsGetter(that);\n const [\n isRendering,\n paramsState,\n mergedPropsState,\n ] = stateGSs(that, 3);\n\n const process = () => {\n let params = {};\n let nextState = {};\n let isMatching = matcher(cleanPath(WINDOW.location.pathname), params);\n\n const toggle = isMatching !== isRendering();\n toggle && (nextState[isRendering] = isMatching);\n\n if (isDifferent(paramsState(), params)) {\n nextState[mergedPropsState] = Object.assign(allPropsExcept(props(), selfProps), params);\n nextState[paramsState] = params;\n }\n\n //set new state just once to avoid several renders\n setState(that, nextState, () => {\n toggle && orNoop(props().onToggle)(isMatching);\n })\n };\n\n that[componentDidUpdate] = (prevProps, prevState) => {\n if (props() !== prevProps) {\n let mergedProps = Object.assign(allPropsExcept(props(), selfProps), paramsState());\n if (isDifferent(mergedProps, mergedPropsState()))\n mergedPropsState(mergedProps);\n }\n };\n\n that[render] = () => {\n const {children, controller} = props();\n return (controller || DefaultController)(isRendering(), children, mergedPropsState());\n };\n\n that[componentDidMount] = () => {\n matcher = createUrlMatchers(props().path);\n\n historyEvents.forEach(it => {\n addEventListener(WINDOW, it, process);\n });\n process();\n };\n\n that[componentWillUnmount] = () => {\n historyEvents.forEach(it => {\n removeEventListener(WINDOW, it, process);\n });\n };\n }\n}\n\nif (window.isNotProductionEnvironment) {\n Route.propTypes = {\n path: PropTypes.oneOfType([\n PropTypes.string,\n PropTypes.arrayOf(PropTypes.string)\n ]).isRequired,\n controller: PropTypes.func,\n onToggle: PropTypes.func,\n };\n}\n\nconst DefaultController = (matches, children, props) => {\n if (!matches || !children) return null;\n if (Object.keys(props).length > 0) {\n return React.Children.map(children, child => React.cloneElement(child, props));\n }\n return children;\n};\n\nexport default Route;"],"names":["historyEvents","cleanPath","path","length","lastIndexOf","substring","createUrlMatcher","matcher","segments","split","optionals","map","it","indexOf","containsVariables","containsAnySegment","containsNot","p","endsWithAny","matchers","segment","i","variableNameIndex","variable","regex","regexStart","RegExp","prefix","params","match","not","Math","min","createUrlMatchers","Array","isArray","props","Object","assign","selfProps","setOf","Route","_PureComponent","_inherits","_super","_createSuper","properties","_this","_classCallCheck","call","that","_assertThisInitialized","state","propsGetter","_stateGSs","stateGSs","_stateGSs2","_slicedToArray","isRendering","paramsState","mergedPropsState","process","nextState","isMatching","WINDOW","location","pathname","toggle","isDifferent","allPropsExcept","setState","orNoop","onToggle","componentDidUpdate","prevProps","prevState","mergedProps","render","_props","children","controller","DefaultController","componentDidMount","forEach","addEventListener","componentWillUnmount","removeEventListener","_createClass","PureComponent","window","isNotProductionEnvironment","propTypes","PropTypes","oneOfType","string","arrayOf","isRequired","func","matches","keys","React","Children","child","cloneElement"],"mappings":"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"}
1
+ {"version":3,"file":"Route.js","sources":["../src/router/Route.js"],"sourcesContent":["import React from 'react';\nimport ReactCreateElement from '../ReactCreateElement';\nimport PropTypes from 'prop-types';\nimport './HistoryTools'\nimport {allPropsExcept, isDifferent, orNoop, setOf, WINDOW, addEventListener, removeEventListener} from \"../Tools\";\nimport {componentDidUpdate, render, PureComponent, componentDidMount, componentWillUnmount, propsGetter, stateGSs, setState} from \"../ReactConstants\";\n\nconst historyEvents = ['popstate', 'pushState', 'replaceState'];\n\nconst cleanPath = (path) => {\n if (path.length > 1 && path.lastIndexOf('/') === path.length - 1)\n return path.substring(0, path.length - 1);\n\n return path;\n};\n\nconst createUrlMatcher = path => {\n let matcher;\n const segments = path.split('/');\n const optionals = segments.map(it => it === '*' || it.indexOf('?') === it.length - 1);\n const containsVariables = path.indexOf(':') !== -1;\n const containsAnySegment = path.indexOf('*') !== -1;\n const containsNot = path.indexOf('!') !== -1;\n\n if (!containsAnySegment && !containsVariables && !containsNot) {\n matcher = (p) => p === path\n } else {\n const endsWithAny = path.lastIndexOf('*') === path.length - 1;\n const matchers = segments.map((segment, i) => {\n let matcher;\n const variableNameIndex = segment.indexOf(':');\n if (segment === '*')\n matcher = () => true;\n else if (variableNameIndex !== -1) {\n let variable = segment.substring(variableNameIndex + 1);\n let regex = null\n if (variable.indexOf('?') !== -1)\n variable = variable.substring(0, variable.indexOf('?'));\n if (variable.indexOf('(') !== -1) {\n let regexStart = variable.indexOf('(');\n regex = new RegExp(variable.substring(regexStart))\n variable = variable.substring(0, regexStart);\n }\n\n const prefix = variableNameIndex && segment.substring(0, variableNameIndex);\n matcher = (p, params) => {\n if (regex && !!p && !p.match(regex))\n return false\n\n if (!p && !optionals[i])\n return false;\n if (prefix) {\n if (p.indexOf(prefix) === 0)\n p = p.substring(variableNameIndex);\n else\n return false;\n }\n\n params[variable] = p;\n return true;\n }\n } else if (segment.indexOf('!') === 0) {\n const not = segment.substring(1);\n matcher = (p) => p !== not;\n } else\n matcher = (p) => p === segment;\n return matcher;\n });\n\n matcher = (path, params) => {\n const segments = path.split('/');\n const length = Math.min(matchers.length, segments.length);\n\n // only exact match if mapping not ends with *\n if (!endsWithAny && matchers.length < segments.length)\n return false;\n\n // check that each segment matches\n for (let i = 0; i < length; i++) {\n if (!matchers[i](segments[i], params))\n return false;\n }\n\n // check that all other segments are optional\n for (let i = length; i < optionals.length; i++) {\n if (!optionals[i])\n return false;\n }\n\n return true;\n };\n }\n return matcher\n};\n\nconst createUrlMatchers = path => {\n if (Array.isArray(path)) {\n const matchers = path.map(it => createUrlMatcher(it));\n return (path, params) => {\n for (let i = 0; i < matchers.length; i++) {\n let props = {};\n if (matchers[i](path, props)) {\n Object.assign(params, props);\n return true;\n }\n }\n return false;\n }\n } else {\n return createUrlMatcher(path);\n }\n};\n\nconst selfProps = setOf([\n 'children',\n 'path',\n 'controller',\n 'onToggle',\n]);\n\nclass Route extends PureComponent {\n\n constructor(properties) {\n super(properties);\n const that = this;\n that.state = {};\n let matcher;\n\n const props = propsGetter(that);\n const [\n isRendering,\n paramsState,\n mergedPropsState,\n ] = stateGSs(that, 3);\n\n const process = () => {\n let params = {};\n let nextState = {};\n let isMatching = matcher(cleanPath(WINDOW.location.pathname), params);\n\n const toggle = isMatching !== isRendering();\n toggle && (nextState[isRendering] = isMatching);\n\n if (isDifferent(paramsState(), params)) {\n nextState[mergedPropsState] = Object.assign(allPropsExcept(props(), selfProps), params);\n nextState[paramsState] = params;\n }\n\n //set new state just once to avoid several renders\n setState(that, nextState, () => {\n toggle && orNoop(props().onToggle)(isMatching);\n })\n };\n\n that[componentDidUpdate] = (prevProps, prevState) => {\n if (props() !== prevProps) {\n let mergedProps = Object.assign(allPropsExcept(props(), selfProps), paramsState());\n if (isDifferent(mergedProps, mergedPropsState()))\n mergedPropsState(mergedProps);\n }\n };\n\n that[render] = () => {\n const {children, controller} = props();\n return (controller || DefaultController)(isRendering(), children, mergedPropsState());\n };\n\n that[componentDidMount] = () => {\n matcher = createUrlMatchers(props().path);\n\n historyEvents.forEach(it => {\n addEventListener(WINDOW, it, process);\n });\n process();\n };\n\n that[componentWillUnmount] = () => {\n historyEvents.forEach(it => {\n removeEventListener(WINDOW, it, process);\n });\n };\n }\n}\n\nif (window.isNotProductionEnvironment) {\n Route.propTypes = {\n path: PropTypes.oneOfType([\n PropTypes.string,\n PropTypes.arrayOf(PropTypes.string)\n ]).isRequired,\n controller: PropTypes.func,\n onToggle: PropTypes.func,\n };\n}\n\nconst DefaultController = (matches, children, props) => {\n if (!matches || !children) return null;\n if (Object.keys(props).length > 0) {\n return React.Children.map(children, child => React.cloneElement(child, props));\n }\n return children;\n};\n\nexport default Route;"],"names":["historyEvents","cleanPath","path","length","lastIndexOf","substring","createUrlMatcher","matcher","segments","split","optionals","map","it","indexOf","containsVariables","containsAnySegment","containsNot","p","endsWithAny","matchers","segment","i","variableNameIndex","variable","regex","regexStart","RegExp","prefix","params","match","not","Math","min","createUrlMatchers","Array","isArray","props","Object","assign","selfProps","setOf","Route","_PureComponent","_inherits","_super","_createSuper","properties","_this","_classCallCheck","call","that","_assertThisInitialized","state","propsGetter","_stateGSs","stateGSs","_stateGSs2","_slicedToArray","isRendering","paramsState","mergedPropsState","process","nextState","isMatching","WINDOW","location","pathname","toggle","isDifferent","allPropsExcept","setState","orNoop","onToggle","componentDidUpdate","prevProps","prevState","mergedProps","render","_props","children","controller","DefaultController","componentDidMount","forEach","addEventListener","componentWillUnmount","removeEventListener","_createClass","PureComponent","matches","keys","React","Children","child","cloneElement"],"mappings":"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"}
package/src/Tools.ts CHANGED
@@ -105,6 +105,8 @@ export const isFunction = (v) => typeOf(v) === 'function';
105
105
  export const isString = (v) => typeOf(v) === 'string';
106
106
  export const isObject = (v) => typeOf(v) === 'object';
107
107
 
108
+ export const deleteKey = (obj: object, key: string | symbol) => delete obj[key];
109
+
108
110
  const FALSE = false;
109
111
  const TRUE = true;
110
112
 
@@ -1,4 +1,9 @@
1
- import ReactConstants from "./ReactConstants"; import {clientHeight as __clientHeight, clientWidth as __clientWidth, createAccessor as __createAccessor, data as __data, height as __height, left as __left, length as __length, pageX as __pageX, pageY as __pageY, props as __props, scrollLeft as __scrollLeft, scrollTop as __scrollTop, state as __state, style as __style, target as __target, top as __top, value as __value, width as __width} from "./CommonFields"; import {toConsumableArray as __toConsumableArray} from "./_virtual/_rollupPluginBabelHelpers"; import {extends as __extends} from "./_virtual/_rollupPluginBabelHelpers"; import {inherits as __inherits} from "./_virtual/_rollupPluginBabelHelpers"; import {createProxy} from "./ProxyTools";
1
+ import {createProxy} from "./ProxyTools";
2
+
3
+ it('test proxy null', () => {
4
+ const p = createProxy(null);
5
+ expect(p).toBe(null);
6
+ });
2
7
 
3
8
  it('test proxy noop', () => {
4
9
  const user = {name: 'Bob'};
@@ -19,7 +24,10 @@ it('test proxy add property', () => {
19
24
  const user = {name: 'Bob'};
20
25
  const p = createProxy(user);
21
26
  p.age = 16
27
+ expect(p.age).toEqual(16);
28
+
22
29
  p.age = 32
30
+ expect(p.age).toEqual(32);
23
31
 
24
32
  expect(user).toEqual({name: 'Bob'});
25
33
  expect(p.bake()).toEqual({name: 'Bob', age: 32});
@@ -29,6 +37,7 @@ it('test proxy delete property', () => {
29
37
  const user = {name: 'Bob'};
30
38
  const p = createProxy(user);
31
39
  delete p.name;
40
+ expect(p.name).toBe(undefined);
32
41
 
33
42
  expect(user).toEqual({name: 'Bob'});
34
43
  expect(p.bake()).toEqual({});
@@ -59,6 +68,7 @@ it('test proxy change inner properties', () => {
59
68
  const p = createProxy(user);
60
69
 
61
70
  p.hobbies.push('poker');
71
+ expect(p.hobbies).toEqual(['chess', 'poker']);
62
72
 
63
73
  expect(user).toEqual({name: 'Bob', hobbies: ['chess']});
64
74
  expect(p.bake()).toEqual({name: 'Bob', hobbies: ['chess', 'poker']});
@@ -0,0 +1,85 @@
1
+ import {UNDEFINED, isObject, deleteKey} from "../Tools";
2
+
3
+ const FIELD_CHANGED = '__changed';
4
+ const FIELD_BAKE = 'bake';
5
+
6
+ export const createProxy = <T extends object>(target: T) => {
7
+ if (!target)
8
+ return target
9
+
10
+ let changedValue = UNDEFINED;
11
+ let deletedKeys = UNDEFINED;
12
+ let innerProxies = UNDEFINED
13
+ const isChanged = () => changedValue || (innerProxies && Object.values(innerProxies).some(it => it[FIELD_CHANGED]));
14
+ const initChangedValue = (target) => {
15
+ !changedValue && (changedValue = Array.isArray(target) ? [...target] : {...target})
16
+ };
17
+ return new Proxy<T>(target, {
18
+ get: (target: T, prop: string | symbol) => {
19
+ if (prop === FIELD_CHANGED)
20
+ return isChanged();
21
+ if (prop === FIELD_BAKE) {
22
+ return () => {
23
+ // console.log('bake', changedValue, innerProxies)
24
+ if (!isChanged())
25
+ return target
26
+
27
+ if (changedValue && !innerProxies)
28
+ return changedValue
29
+
30
+ let result = changedValue || (Array.isArray(target) ? [...target] : {...target});
31
+ for (let key in innerProxies) {
32
+ result[key] = innerProxies[key][FIELD_BAKE]()
33
+ }
34
+ return result
35
+ }
36
+ }
37
+
38
+ // console.log('get', {target, prop})
39
+ const innerProxy = innerProxies && innerProxies[prop];
40
+ if (innerProxy)
41
+ return innerProxy
42
+
43
+ const changed = changedValue && changedValue[prop]
44
+ if (changed !== UNDEFINED)
45
+ return changed
46
+
47
+ if (deletedKeys && deletedKeys[prop])
48
+ return UNDEFINED
49
+
50
+ const value = target[prop];
51
+ if (value && isObject(value)) {
52
+ !innerProxies && (innerProxies = {})
53
+ return innerProxies[prop] = createProxy(value)
54
+ }
55
+
56
+ return value;
57
+ },
58
+ set: (target: T, prop, newval) => {
59
+ // console.log('set', {target, prop, newval})
60
+ initChangedValue(target);
61
+
62
+ if (newval && isObject(newval)) {
63
+ !innerProxies && (innerProxies = {})
64
+ innerProxies[prop] = newval = createProxy(newval)
65
+ } else {
66
+ innerProxies && deleteKey(innerProxies, prop)
67
+ }
68
+ changedValue[prop] = newval
69
+ // console.log('changedValue', changedValue)
70
+ return true;
71
+ },
72
+ deleteProperty: (target: T, prop) => {
73
+ // console.log('delete', {target, prop})
74
+ initChangedValue(target);
75
+
76
+ if (prop in changedValue) {
77
+ deleteKey(changedValue, prop)
78
+ innerProxies && deleteKey(innerProxies, prop)
79
+ !deletedKeys && (deletedKeys = {})
80
+ deletedKeys[prop] = true;
81
+ }
82
+ return true;
83
+ }
84
+ })
85
+ }
@@ -0,0 +1,86 @@
1
+ import ReactConstants from "./ReactConstants"; import {clientHeight as __clientHeight, clientWidth as __clientWidth, createAccessor as __createAccessor, data as __data, height as __height, left as __left, length as __length, pageX as __pageX, pageY as __pageY, props as __props, scrollLeft as __scrollLeft, scrollTop as __scrollTop, state as __state, style as __style, target as __target, top as __top, value as __value, width as __width} from "./CommonFields"; import {toConsumableArray as __toConsumableArray} from "./_virtual/_rollupPluginBabelHelpers"; import {extends as __extends} from "./_virtual/_rollupPluginBabelHelpers"; import {inherits as __inherits} from "./_virtual/_rollupPluginBabelHelpers"; import React from 'react';
2
+ import {mount} from 'enzyme';
3
+ import Store, {useStore} from "./Store";
4
+ import {act} from 'react-dom/test-utils';
5
+
6
+ it('test 1', () => {
7
+ const store = new Store({
8
+ count: 0,
9
+ value: ''
10
+ });
11
+ let renderCount = 0
12
+ const MyComponent = () => {
13
+ let s = useStore(store);
14
+ renderCount++
15
+ return <div>{s.count}</div>;
16
+ };
17
+ const wrapper = mount(<MyComponent/>);
18
+ expect(wrapper).toHaveHTML('<div>0</div>');
19
+ expect(renderCount).toBe(1);
20
+
21
+ act(() => {
22
+ store.set(it => {
23
+ it.count++
24
+ })
25
+ });
26
+ expect(wrapper).toHaveHTML('<div>1</div>');
27
+ expect(renderCount).toBe(2);
28
+
29
+ act(() => {
30
+ store.set(it => {
31
+ it.value = 'foo'
32
+ })
33
+ });
34
+ expect(wrapper).toHaveHTML('<div>1</div>');
35
+ expect(renderCount).toBe(3);
36
+
37
+ act(() => {
38
+ store.set(it => {
39
+ it.value = 'bar'
40
+ })
41
+ });
42
+ expect(wrapper).toHaveHTML('<div>1</div>');
43
+ expect(renderCount).toBe(4);
44
+ });
45
+
46
+
47
+ it('test 2', () => {
48
+ const store = new Store({
49
+ count: 0,
50
+ value: ''
51
+ });
52
+ let renderCount = 0
53
+ const MyComponent = () => {
54
+ let count = useStore(store, it=> it.count);
55
+ renderCount++
56
+ return <div>{count}</div>;
57
+ };
58
+ const wrapper = mount(<MyComponent/>);
59
+ expect(wrapper).toHaveHTML('<div>0</div>');
60
+ expect(renderCount).toBe(1);
61
+
62
+ act(() => {
63
+ store.set(it => {
64
+ it.count++
65
+ })
66
+ });
67
+ expect(wrapper).toHaveHTML('<div>1</div>');
68
+ expect(renderCount).toBe(2);
69
+
70
+ act(() => {
71
+ store.set({
72
+ value: 'foo'
73
+ })
74
+ });
75
+ expect(wrapper).toHaveHTML('<div>1</div>');
76
+ // react executes functional-component after first setState with the same value
77
+ expect(renderCount).toBe(3);
78
+
79
+ act(() => {
80
+ store.set({
81
+ value: 'bar'
82
+ })
83
+ });
84
+ expect(wrapper).toHaveHTML('<div>1</div>');
85
+ expect(renderCount).toBe(3);
86
+ });
@@ -1,5 +1,6 @@
1
1
  import {useEffect, useState} from "react";
2
2
  import {createProxy} from "./ProxyTools";
3
+ import {isFunction, isObject} from "../Tools";
3
4
 
4
5
  interface Stores {
5
6
  [index: number]: any
@@ -8,46 +9,67 @@ interface Stores {
8
9
  let STORES: Stores = {}
9
10
  let COUNTER = 0
10
11
 
11
- export class Store<T> {
12
- private name: string
13
- private listeners: Array<() => void> = []
14
- private initialState: T
15
- private index: number
12
+ type Setter<T> = (oldState: T) => T | void;
13
+
14
+ abstract class AbstractStore<T> {
15
+ get: () => T;
16
+ set: (setter: T | Partial<T> | (Setter<T>)) => void;
17
+ reset: () => void;
18
+ subscribe: (fn: () => void) => void;
19
+ unsubscribe: (fn: () => void) => void;
20
+ toString: () => string;
21
+ }
22
+
23
+ export class Store<T> extends AbstractStore<T> {
16
24
 
17
25
  constructor(initialState: T, name?: string) {
26
+ super()
18
27
  let that = this;
19
- that.name = name;
20
- that.initialState = initialState;
21
- const index = COUNTER++;
22
- that.index = index;
23
- STORES[index] = initialState
24
- }
28
+ let listeners: Array<() => void> = []
29
+ let index = '' + COUNTER++;
30
+ let runListeners = () => {
31
+ listeners.forEach(fn => fn())
32
+ };
25
33
 
26
- get = (): T => STORES[this.index]
27
- set = (mutator: (oldState: T) => T | void) => {
28
- const proxy = createProxy(STORES[this.index]);
29
- const result = mutator(proxy);
30
- if (!result || result === proxy)
31
- STORES[this.index] = proxy.bake()
32
- else
33
- STORES[this.index] = result
34
+ STORES[index] = initialState
34
35
 
35
- this.listeners.forEach(fn => fn())
36
- }
36
+ that.unsubscribe = (fn: () => void) => {
37
+ let i = listeners.indexOf(fn)
38
+ let length = listeners.length;
39
+ if (i > -1) {
40
+ listeners[i] = listeners[length - 1]
41
+ listeners.splice(length - 1, 1)
42
+ }
43
+ }
44
+ that.get = (): T => STORES[index]
45
+ that.set = (setter) => {
46
+ let result;
47
+ if (isFunction(setter)) {
48
+ const proxy = createProxy(STORES[index]);
49
+ result = (setter as Setter<T>)(proxy);
50
+ if (!result || result === proxy)
51
+ result = proxy.bake()
52
+ } else if (isObject(setter)) {
53
+ result = {...STORES[index], ...setter}
54
+ } else {
55
+ result = setter
56
+ }
57
+
58
+ STORES[index] = result
59
+ runListeners();
60
+ }
37
61
 
38
- reset = () => {
39
- STORES[this.index] = this.initialState
40
- }
62
+ that.reset = () => {
63
+ STORES[index] = initialState
64
+ runListeners();
65
+ }
41
66
 
42
- subscribe = (fn: () => void) => {
43
- this.listeners.push(fn)
44
- }
67
+ that.subscribe = (fn: () => void) => {
68
+ listeners.push(fn)
69
+ }
45
70
 
46
- unsubscribe = (fn: () => void) => {
47
- this.listeners = this.listeners.filter(f => f !== fn)
71
+ that.toString = (): string => name;
48
72
  }
49
-
50
- toString = (): string => this.name;
51
73
  }
52
74
 
53
75
  export default Store;
@@ -75,7 +97,7 @@ export function useStore<T, R>(store: Store<T>, selector?: Selector<T, R>): R {
75
97
  if (!selector)
76
98
  selector = (defaultSelector as Selector<T, R>)
77
99
 
78
- const [state, setState] = useState(selector(store.get()))
100
+ const [state, setState] = useState(() => selector(store.get()))
79
101
 
80
102
  useEffect(() => {
81
103
  const updateState = () => {
@@ -86,7 +108,7 @@ export function useStore<T, R>(store: Store<T>, selector?: Selector<T, R>): R {
86
108
  return () => {
87
109
  store.unsubscribe(updateState);
88
110
  }
89
- }, [selector])
111
+ }, [])
90
112
 
91
113
  return state
92
114
  }
@@ -0,0 +1 @@
1
+ export declare const createProxy: <T extends object>(target: T) => any;