react-elmish 2.0.1 → 2.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md CHANGED
@@ -164,6 +164,34 @@ You can use these components like any other React component.
164
164
  >
165
165
  > You can even split the contents of the **App.ts** into two files: **Types.ts** (`Message`, `Model`, and `Props`) and **State.ts** (`init` and `update`).
166
166
 
167
+ ## A new approach
168
+
169
+ Instead of `useElmish` you can use the `useElmishMap` hook. Then you have an `UpdateMap` instead of an `update` function:
170
+
171
+ ```ts
172
+ const updateMap: UpdateMap<Props, Model, Message> {
173
+ // Now the message is the first parameter, so it is easier to omit the model parameter.
174
+ Increment: (msg) => [{ value: model.value + 1 }],
175
+ Decrement: (msg) => [{ value: model.value - 1 }],
176
+ }
177
+ ```
178
+
179
+ Add your component looks like:
180
+
181
+ ```tsx
182
+ import { useElmishMap } from "react-elmish";
183
+
184
+ const App = (props: Shared.Props) => {
185
+ const [model, dispatch] = useElmishMap(props, init, updateMap, "App");
186
+
187
+ return (
188
+ <div>
189
+ ...
190
+ </div>
191
+ );
192
+ };
193
+ ```
194
+
167
195
  ## More on messages
168
196
 
169
197
  ### Message arguments
@@ -7,9 +7,19 @@ import { UpdateReturnType } from "./ElmComponent";
7
7
  */
8
8
  export declare const handleError: <TModel, TMsg>(error: Error) => UpdateReturnType<TModel, TMsg>;
9
9
  export declare type Nullable<T> = T | null;
10
+ export interface MessageBase {
11
+ name: string | symbol;
12
+ }
10
13
  /**
11
14
  * Creates a MsgSource type.
12
15
  */
13
16
  export interface MsgSource<T extends string> {
14
17
  source: T;
15
18
  }
19
+ /**
20
+ * Type for mapping messages to functions.
21
+ * Use this type to create your update logic for the useElmishMap hook.
22
+ */
23
+ export declare type UpdateMap<TProps, TModel, TMsg extends MessageBase> = {
24
+ [M in TMsg as M["name"]]: (msg: M, model: TModel, props: TProps) => UpdateReturnType<TModel, TMsg>;
25
+ };
@@ -23,4 +23,4 @@ var handleError = function handleError(error) {
23
23
  };
24
24
 
25
25
  exports.handleError = handleError;
26
- //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uL3NyYy9FbG1VdGlsaXRpZXMudHMiXSwibmFtZXMiOlsiaGFuZGxlRXJyb3IiLCJlcnJvciIsImVycm9yTWlkZGxld2FyZSIsIkxvZ2dlclNlcnZpY2UiXSwibWFwcGluZ3MiOiI7Ozs7Ozs7QUFBQTs7QUFHQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDTyxJQUFNQSxXQUFXLEdBQUcsU0FBZEEsV0FBYyxDQUFlQyxLQUFmLEVBQWdFO0FBQ3ZGLE1BQUlDLHFCQUFKLEVBQXFCO0FBQ2pCLCtCQUFnQkQsS0FBaEI7QUFDSDs7QUFDREUsZ0dBQWVGLEtBQWYsQ0FBcUJBLEtBQXJCO0FBRUEsU0FBTyxDQUFDLEVBQUQsQ0FBUDtBQUNILENBUE0iLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBlcnJvck1pZGRsZXdhcmUsIExvZ2dlclNlcnZpY2UgfSBmcm9tIFwiLi9Jbml0XCI7XG5pbXBvcnQgeyBVcGRhdGVSZXR1cm5UeXBlIH0gZnJvbSBcIi4vRWxtQ29tcG9uZW50XCI7XG5cbi8qKlxuICogSGFuZGxlcyBhbiBlcnJvci5cbiAqIExvZ3MgdGhlIGVycm9yIGlmIGEgTG9nZ2VyIHdhcyBzcGVjaWZpZWQuXG4gKiBDYWxscyB0aGUgZXJyb3IgaGFuZGxpbmcgbWlkZGxld2FyZSBpZiBzcGVjaWZpZWQuXG4gKiBAcGFyYW0ge0Vycm9yfSBlcnJvciBUaGUgZXJyb3IuXG4gKi9cbmV4cG9ydCBjb25zdCBoYW5kbGVFcnJvciA9IDxUTW9kZWwsIFRNc2c+KGVycm9yOiBFcnJvcik6IFVwZGF0ZVJldHVyblR5cGU8VE1vZGVsLCBUTXNnPiA9PiB7XG4gICAgaWYgKGVycm9yTWlkZGxld2FyZSkge1xuICAgICAgICBlcnJvck1pZGRsZXdhcmUoZXJyb3IpO1xuICAgIH1cbiAgICBMb2dnZXJTZXJ2aWNlPy5lcnJvcihlcnJvcik7XG5cbiAgICByZXR1cm4gW3t9XTtcbn07XG5cbmV4cG9ydCB0eXBlIE51bGxhYmxlPFQ+ID0gVCB8IG51bGw7XG5cbi8qKlxuICogQ3JlYXRlcyBhIE1zZ1NvdXJjZSB0eXBlLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIE1zZ1NvdXJjZTxUIGV4dGVuZHMgc3RyaW5nPiB7XG4gICAgc291cmNlOiBULFxufSJdfQ==
26
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uL3NyYy9FbG1VdGlsaXRpZXMudHMiXSwibmFtZXMiOlsiaGFuZGxlRXJyb3IiLCJlcnJvciIsImVycm9yTWlkZGxld2FyZSIsIkxvZ2dlclNlcnZpY2UiXSwibWFwcGluZ3MiOiI7Ozs7Ozs7QUFBQTs7QUFHQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDTyxJQUFNQSxXQUFXLEdBQUcsU0FBZEEsV0FBYyxDQUFlQyxLQUFmLEVBQWdFO0FBQ3ZGLE1BQUlDLHFCQUFKLEVBQXFCO0FBQ2pCLCtCQUFnQkQsS0FBaEI7QUFDSDs7QUFDREUsZ0dBQWVGLEtBQWYsQ0FBcUJBLEtBQXJCO0FBRUEsU0FBTyxDQUFDLEVBQUQsQ0FBUDtBQUNILENBUE0iLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBlcnJvck1pZGRsZXdhcmUsIExvZ2dlclNlcnZpY2UgfSBmcm9tIFwiLi9Jbml0XCI7XG5pbXBvcnQgeyBVcGRhdGVSZXR1cm5UeXBlIH0gZnJvbSBcIi4vRWxtQ29tcG9uZW50XCI7XG5cbi8qKlxuICogSGFuZGxlcyBhbiBlcnJvci5cbiAqIExvZ3MgdGhlIGVycm9yIGlmIGEgTG9nZ2VyIHdhcyBzcGVjaWZpZWQuXG4gKiBDYWxscyB0aGUgZXJyb3IgaGFuZGxpbmcgbWlkZGxld2FyZSBpZiBzcGVjaWZpZWQuXG4gKiBAcGFyYW0ge0Vycm9yfSBlcnJvciBUaGUgZXJyb3IuXG4gKi9cbmV4cG9ydCBjb25zdCBoYW5kbGVFcnJvciA9IDxUTW9kZWwsIFRNc2c+KGVycm9yOiBFcnJvcik6IFVwZGF0ZVJldHVyblR5cGU8VE1vZGVsLCBUTXNnPiA9PiB7XG4gICAgaWYgKGVycm9yTWlkZGxld2FyZSkge1xuICAgICAgICBlcnJvck1pZGRsZXdhcmUoZXJyb3IpO1xuICAgIH1cbiAgICBMb2dnZXJTZXJ2aWNlPy5lcnJvcihlcnJvcik7XG5cbiAgICByZXR1cm4gW3t9XTtcbn07XG5cbmV4cG9ydCB0eXBlIE51bGxhYmxlPFQ+ID0gVCB8IG51bGw7XG5cbmV4cG9ydCBpbnRlcmZhY2UgTWVzc2FnZUJhc2Uge1xuICAgIG5hbWU6IHN0cmluZyB8IHN5bWJvbCxcbn1cblxuLyoqXG4gKiBDcmVhdGVzIGEgTXNnU291cmNlIHR5cGUuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgTXNnU291cmNlPFQgZXh0ZW5kcyBzdHJpbmc+IHtcbiAgICBzb3VyY2U6IFQsXG59XG5cbi8qKlxuICogVHlwZSBmb3IgbWFwcGluZyBtZXNzYWdlcyB0byBmdW5jdGlvbnMuXG4gKiBVc2UgdGhpcyB0eXBlIHRvIGNyZWF0ZSB5b3VyIHVwZGF0ZSBsb2dpYyBmb3IgdGhlIHVzZUVsbWlzaE1hcCBob29rLlxuICovXG5leHBvcnQgdHlwZSBVcGRhdGVNYXA8VFByb3BzLCBUTW9kZWwsIFRNc2cgZXh0ZW5kcyBNZXNzYWdlQmFzZT4gPSB7XG4gICAgW00gaW4gVE1zZyBhcyBNW1wibmFtZVwiXV06IChtc2c6IE0sIG1vZGVsOiBUTW9kZWwsIHByb3BzOiBUUHJvcHMpID0+IFVwZGF0ZVJldHVyblR5cGU8VE1vZGVsLCBUTXNnPjtcbn07Il19
package/dist/index.d.ts CHANGED
@@ -1,7 +1,8 @@
1
1
  import { Cmd, createCmd, Dispatch } from "./Cmd";
2
2
  import { ElmComponent, UpdateReturnType } from "./ElmComponent";
3
- import { handleError, MsgSource } from "./ElmUtilities";
3
+ import { handleError, MsgSource, UpdateMap } from "./ElmUtilities";
4
4
  import { init, Logger, Message } from "./Init";
5
- import { useElmish } from "./Hooks";
6
- export type { Logger, Message, Cmd, Dispatch, UpdateReturnType, MsgSource, };
7
- export { init, createCmd, ElmComponent, handleError, useElmish, };
5
+ import { useElmish } from "./useElmish";
6
+ import { useElmishMap } from "./useElmishMap";
7
+ export type { Logger, Message, Cmd, Dispatch, UpdateReturnType, MsgSource, UpdateMap, };
8
+ export { init, createCmd, ElmComponent, handleError, useElmish, useElmishMap, };
package/dist/index.js CHANGED
@@ -30,7 +30,13 @@ Object.defineProperty(exports, "init", {
30
30
  Object.defineProperty(exports, "useElmish", {
31
31
  enumerable: true,
32
32
  get: function get() {
33
- return _Hooks.useElmish;
33
+ return _useElmish.useElmish;
34
+ }
35
+ });
36
+ Object.defineProperty(exports, "useElmishMap", {
37
+ enumerable: true,
38
+ get: function get() {
39
+ return _useElmishMap.useElmishMap;
34
40
  }
35
41
  });
36
42
 
@@ -42,5 +48,7 @@ var _ElmUtilities = require("./ElmUtilities");
42
48
 
43
49
  var _Init = require("./Init");
44
50
 
45
- var _Hooks = require("./Hooks");
46
- //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uL3NyYy9pbmRleC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFBQTs7QUFDQTs7QUFDQTs7QUFDQTs7QUFDQSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENtZCwgY3JlYXRlQ21kLCBEaXNwYXRjaCB9IGZyb20gXCIuL0NtZFwiO1xuaW1wb3J0IHsgRWxtQ29tcG9uZW50LCBVcGRhdGVSZXR1cm5UeXBlIH0gZnJvbSBcIi4vRWxtQ29tcG9uZW50XCI7XG5pbXBvcnQgeyBoYW5kbGVFcnJvciwgTXNnU291cmNlIH0gZnJvbSBcIi4vRWxtVXRpbGl0aWVzXCI7XG5pbXBvcnQgeyBpbml0LCBMb2dnZXIsIE1lc3NhZ2UgfSBmcm9tIFwiLi9Jbml0XCI7XG5pbXBvcnQgeyB1c2VFbG1pc2ggfSBmcm9tIFwiLi9Ib29rc1wiO1xuXG5leHBvcnQgdHlwZSB7XG4gICAgTG9nZ2VyLFxuICAgIE1lc3NhZ2UsXG4gICAgQ21kLFxuICAgIERpc3BhdGNoLFxuICAgIFVwZGF0ZVJldHVyblR5cGUsXG4gICAgTXNnU291cmNlLFxufTtcblxuZXhwb3J0IHtcbiAgICBpbml0LFxuICAgIGNyZWF0ZUNtZCxcbiAgICBFbG1Db21wb25lbnQsXG4gICAgaGFuZGxlRXJyb3IsXG4gICAgdXNlRWxtaXNoLFxufTsiXX0=
51
+ var _useElmish = require("./useElmish");
52
+
53
+ var _useElmishMap = require("./useElmishMap");
54
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uL3NyYy9pbmRleC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFBQTs7QUFDQTs7QUFDQTs7QUFDQTs7QUFDQTs7QUFDQSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENtZCwgY3JlYXRlQ21kLCBEaXNwYXRjaCB9IGZyb20gXCIuL0NtZFwiO1xuaW1wb3J0IHsgRWxtQ29tcG9uZW50LCBVcGRhdGVSZXR1cm5UeXBlIH0gZnJvbSBcIi4vRWxtQ29tcG9uZW50XCI7XG5pbXBvcnQgeyBoYW5kbGVFcnJvciwgTXNnU291cmNlLCBVcGRhdGVNYXAgfSBmcm9tIFwiLi9FbG1VdGlsaXRpZXNcIjtcbmltcG9ydCB7IGluaXQsIExvZ2dlciwgTWVzc2FnZSB9IGZyb20gXCIuL0luaXRcIjtcbmltcG9ydCB7IHVzZUVsbWlzaCB9IGZyb20gXCIuL3VzZUVsbWlzaFwiO1xuaW1wb3J0IHsgdXNlRWxtaXNoTWFwIH0gZnJvbSBcIi4vdXNlRWxtaXNoTWFwXCI7XG5cbmV4cG9ydCB0eXBlIHtcbiAgICBMb2dnZXIsXG4gICAgTWVzc2FnZSxcbiAgICBDbWQsXG4gICAgRGlzcGF0Y2gsXG4gICAgVXBkYXRlUmV0dXJuVHlwZSxcbiAgICBNc2dTb3VyY2UsXG4gICAgVXBkYXRlTWFwLFxufTtcblxuZXhwb3J0IHtcbiAgICBpbml0LFxuICAgIGNyZWF0ZUNtZCxcbiAgICBFbG1Db21wb25lbnQsXG4gICAgaGFuZGxlRXJyb3IsXG4gICAgdXNlRWxtaXNoLFxuICAgIHVzZUVsbWlzaE1hcCxcbn07Il19
@@ -0,0 +1,4 @@
1
+ import { Cmd, Dispatch } from "./Cmd";
2
+ import { MessageBase } from "./ElmUtilities";
3
+ import { UpdateReturnType } from ".";
4
+ export declare function useElmish<TProps, TModel, TMsg extends MessageBase>(props: TProps, init: (props: TProps) => [TModel, Cmd<TMsg>], update: (model: TModel, msg: TMsg, props: TProps) => UpdateReturnType<TModel, TMsg>, name: string): [TModel, Dispatch<TMsg>];
@@ -0,0 +1,121 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ exports.useElmish = useElmish;
7
+
8
+ var _Init = require("./Init");
9
+
10
+ var _react = require("react");
11
+
12
+ function ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); enumerableOnly && (symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; })), keys.push.apply(keys, symbols); } return keys; }
13
+
14
+ function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = null != arguments[i] ? arguments[i] : {}; i % 2 ? ownKeys(Object(source), !0).forEach(function (key) { _defineProperty(target, key, source[key]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)) : ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } return target; }
15
+
16
+ function _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }
17
+
18
+ function _slicedToArray(arr, i) { return _arrayWithHoles(arr) || _iterableToArrayLimit(arr, i) || _unsupportedIterableToArray(arr, i) || _nonIterableRest(); }
19
+
20
+ function _nonIterableRest() { throw new TypeError("Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); }
21
+
22
+ function _unsupportedIterableToArray(o, minLen) { if (!o) return; if (typeof o === "string") return _arrayLikeToArray(o, minLen); var n = Object.prototype.toString.call(o).slice(8, -1); if (n === "Object" && o.constructor) n = o.constructor.name; if (n === "Map" || n === "Set") return Array.from(o); if (n === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray(o, minLen); }
23
+
24
+ function _arrayLikeToArray(arr, len) { if (len == null || len > arr.length) len = arr.length; for (var i = 0, arr2 = new Array(len); i < len; i++) { arr2[i] = arr[i]; } return arr2; }
25
+
26
+ function _iterableToArrayLimit(arr, i) { var _i = arr == null ? null : typeof Symbol !== "undefined" && arr[Symbol.iterator] || arr["@@iterator"]; if (_i == null) return; var _arr = []; var _n = true; var _d = false; var _s, _e; try { for (_i = _i.call(arr); !(_n = (_s = _i.next()).done); _n = true) { _arr.push(_s.value); if (i && _arr.length === i) break; } } catch (err) { _d = true; _e = err; } finally { try { if (!_n && _i["return"] != null) _i["return"](); } finally { if (_d) throw _e; } } return _arr; }
27
+
28
+ function _arrayWithHoles(arr) { if (Array.isArray(arr)) return arr; }
29
+
30
+ function useElmish(props, init, update, name) {
31
+ var reentered = false;
32
+ var buffer = [];
33
+ var currentModel = {};
34
+
35
+ var _useState = (0, _react.useState)(null),
36
+ _useState2 = _slicedToArray(_useState, 2),
37
+ model = _useState2[0],
38
+ setModel = _useState2[1];
39
+
40
+ var initializedModel = model;
41
+ var execCmd = (0, _react.useCallback)(function (cmd) {
42
+ cmd.forEach(function (call) {
43
+ try {
44
+ call(dispatch);
45
+ } catch (ex) {
46
+ _Init.LoggerService === null || _Init.LoggerService === void 0 ? void 0 : _Init.LoggerService.error(ex);
47
+ }
48
+ });
49
+ }, []);
50
+ var dispatch = (0, _react.useCallback)(function (msg) {
51
+ if (!initializedModel) {
52
+ return;
53
+ }
54
+
55
+ var modelHasChanged = function modelHasChanged(updatedModel) {
56
+ return updatedModel !== initializedModel && Object.getOwnPropertyNames(updatedModel).length > 0;
57
+ };
58
+
59
+ if (_Init.dispatchMiddleware) {
60
+ (0, _Init.dispatchMiddleware)(msg);
61
+ }
62
+
63
+ if (reentered) {
64
+ buffer.push(msg);
65
+ } else {
66
+ reentered = true;
67
+ var nextMsg = msg;
68
+ var modified = false;
69
+
70
+ while (nextMsg) {
71
+ _Init.LoggerService === null || _Init.LoggerService === void 0 ? void 0 : _Init.LoggerService.info("Elm", "message from", name, nextMsg.name);
72
+ _Init.LoggerService === null || _Init.LoggerService === void 0 ? void 0 : _Init.LoggerService.debug("Elm", "message from", name, nextMsg);
73
+
74
+ try {
75
+ var _update = update(_objectSpread(_objectSpread({}, initializedModel), currentModel), nextMsg, props),
76
+ _update2 = _slicedToArray(_update, 2),
77
+ newModel = _update2[0],
78
+ cmd = _update2[1];
79
+
80
+ if (modelHasChanged(newModel)) {
81
+ currentModel = _objectSpread(_objectSpread({}, currentModel), newModel);
82
+ modified = true;
83
+ }
84
+
85
+ if (cmd) {
86
+ execCmd(cmd);
87
+ }
88
+ } catch (ex) {
89
+ _Init.LoggerService === null || _Init.LoggerService === void 0 ? void 0 : _Init.LoggerService.error(ex);
90
+ }
91
+
92
+ nextMsg = buffer.shift();
93
+ }
94
+
95
+ reentered = false;
96
+
97
+ if (modified) {
98
+ setModel(function (prevModel) {
99
+ var updatedModel = _objectSpread(_objectSpread({}, prevModel), currentModel);
100
+
101
+ _Init.LoggerService === null || _Init.LoggerService === void 0 ? void 0 : _Init.LoggerService.debug("Elm", "update model for", name, updatedModel);
102
+ return updatedModel;
103
+ });
104
+ }
105
+ }
106
+ }, []);
107
+
108
+ if (!initializedModel) {
109
+ var _init = init(props),
110
+ _init2 = _slicedToArray(_init, 2),
111
+ initModel = _init2[0],
112
+ initCmd = _init2[1];
113
+
114
+ initializedModel = initModel;
115
+ setModel(initializedModel);
116
+ execCmd(initCmd);
117
+ }
118
+
119
+ return [initializedModel, dispatch];
120
+ }
121
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uL3NyYy91c2VFbG1pc2gudHMiXSwibmFtZXMiOlsidXNlRWxtaXNoIiwicHJvcHMiLCJpbml0IiwidXBkYXRlIiwibmFtZSIsInJlZW50ZXJlZCIsImJ1ZmZlciIsImN1cnJlbnRNb2RlbCIsIm1vZGVsIiwic2V0TW9kZWwiLCJpbml0aWFsaXplZE1vZGVsIiwiZXhlY0NtZCIsImNtZCIsImZvckVhY2giLCJjYWxsIiwiZGlzcGF0Y2giLCJleCIsIkxvZ2dlclNlcnZpY2UiLCJlcnJvciIsIm1zZyIsIm1vZGVsSGFzQ2hhbmdlZCIsInVwZGF0ZWRNb2RlbCIsIk9iamVjdCIsImdldE93blByb3BlcnR5TmFtZXMiLCJsZW5ndGgiLCJkaXNwYXRjaE1pZGRsZXdhcmUiLCJwdXNoIiwibmV4dE1zZyIsIm1vZGlmaWVkIiwiaW5mbyIsImRlYnVnIiwibmV3TW9kZWwiLCJzaGlmdCIsInByZXZNb2RlbCIsImluaXRNb2RlbCIsImluaXRDbWQiXSwibWFwcGluZ3MiOiI7Ozs7Ozs7QUFDQTs7QUFFQTs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFHTyxTQUFTQSxTQUFULENBQThEQyxLQUE5RCxFQUE2RUMsSUFBN0UsRUFBMkhDLE1BQTNILEVBQWdOQyxJQUFoTixFQUF3UDtBQUMzUCxNQUFJQyxTQUFTLEdBQUcsS0FBaEI7QUFDQSxNQUFNQyxNQUFlLEdBQUcsRUFBeEI7QUFDQSxNQUFJQyxZQUE2QixHQUFHLEVBQXBDOztBQUVBLGtCQUEwQixxQkFBMkIsSUFBM0IsQ0FBMUI7QUFBQTtBQUFBLE1BQU9DLEtBQVA7QUFBQSxNQUFjQyxRQUFkOztBQUNBLE1BQUlDLGdCQUFnQixHQUFHRixLQUF2QjtBQUVBLE1BQU1HLE9BQU8sR0FBRyx3QkFBWSxVQUFDQyxHQUFELEVBQTBCO0FBQ2xEQSxJQUFBQSxHQUFHLENBQUNDLE9BQUosQ0FBWSxVQUFBQyxJQUFJLEVBQUk7QUFDaEIsVUFBSTtBQUNBQSxRQUFBQSxJQUFJLENBQUNDLFFBQUQsQ0FBSjtBQUNILE9BRkQsQ0FFRSxPQUFPQyxFQUFQLEVBQW9CO0FBQ2xCQyxzR0FBZUMsS0FBZixDQUFxQkYsRUFBckI7QUFDSDtBQUNKLEtBTkQ7QUFPSCxHQVJlLEVBUWIsRUFSYSxDQUFoQjtBQVVBLE1BQU1ELFFBQVEsR0FBRyx3QkFBWSxVQUFDSSxHQUFELEVBQXFCO0FBQzlDLFFBQUksQ0FBQ1QsZ0JBQUwsRUFBdUI7QUFDbkI7QUFDSDs7QUFFRCxRQUFNVSxlQUFlLEdBQUcsU0FBbEJBLGVBQWtCLENBQUNDLFlBQUQ7QUFBQSxhQUE0Q0EsWUFBWSxLQUFLWCxnQkFBakIsSUFBcUNZLE1BQU0sQ0FBQ0MsbUJBQVAsQ0FBMkJGLFlBQTNCLEVBQXlDRyxNQUF6QyxHQUFrRCxDQUFuSTtBQUFBLEtBQXhCOztBQUVBLFFBQUlDLHdCQUFKLEVBQXdCO0FBQ3BCLG9DQUFtQk4sR0FBbkI7QUFDSDs7QUFFRCxRQUFJZCxTQUFKLEVBQWU7QUFDWEMsTUFBQUEsTUFBTSxDQUFDb0IsSUFBUCxDQUFZUCxHQUFaO0FBQ0gsS0FGRCxNQUVPO0FBQ0hkLE1BQUFBLFNBQVMsR0FBRyxJQUFaO0FBRUEsVUFBSXNCLE9BQXlCLEdBQUdSLEdBQWhDO0FBQ0EsVUFBSVMsUUFBUSxHQUFHLEtBQWY7O0FBRUEsYUFBT0QsT0FBUCxFQUFnQjtBQUNaVixzR0FBZVksSUFBZixDQUFvQixLQUFwQixFQUEyQixjQUEzQixFQUEyQ3pCLElBQTNDLEVBQWlEdUIsT0FBTyxDQUFDdkIsSUFBekQ7QUFDQWEsc0dBQWVhLEtBQWYsQ0FBcUIsS0FBckIsRUFBNEIsY0FBNUIsRUFBNEMxQixJQUE1QyxFQUFrRHVCLE9BQWxEOztBQUVBLFlBQUk7QUFDQSx3QkFBd0J4QixNQUFNLGlDQUFNTyxnQkFBTixHQUEyQkgsWUFBM0IsR0FBMkNvQixPQUEzQyxFQUFvRDFCLEtBQXBELENBQTlCO0FBQUE7QUFBQSxjQUFPOEIsUUFBUDtBQUFBLGNBQWlCbkIsR0FBakI7O0FBRUEsY0FBSVEsZUFBZSxDQUFDVyxRQUFELENBQW5CLEVBQStCO0FBQzNCeEIsWUFBQUEsWUFBWSxtQ0FBUUEsWUFBUixHQUF5QndCLFFBQXpCLENBQVo7QUFFQUgsWUFBQUEsUUFBUSxHQUFHLElBQVg7QUFDSDs7QUFFRCxjQUFJaEIsR0FBSixFQUFTO0FBQ0xELFlBQUFBLE9BQU8sQ0FBQ0MsR0FBRCxDQUFQO0FBQ0g7QUFDSixTQVpELENBWUUsT0FBT0ksRUFBUCxFQUFvQjtBQUNsQkMsd0dBQWVDLEtBQWYsQ0FBcUJGLEVBQXJCO0FBQ0g7O0FBRURXLFFBQUFBLE9BQU8sR0FBR3JCLE1BQU0sQ0FBQzBCLEtBQVAsRUFBVjtBQUNIOztBQUNEM0IsTUFBQUEsU0FBUyxHQUFHLEtBQVo7O0FBRUEsVUFBSXVCLFFBQUosRUFBYztBQUNWbkIsUUFBQUEsUUFBUSxDQUFDLFVBQUF3QixTQUFTLEVBQUk7QUFDbEIsY0FBTVosWUFBWSxtQ0FBUVksU0FBUixHQUFnQzFCLFlBQWhDLENBQWxCOztBQUVBVSx3R0FBZWEsS0FBZixDQUFxQixLQUFyQixFQUE0QixrQkFBNUIsRUFBZ0QxQixJQUFoRCxFQUFzRGlCLFlBQXREO0FBRUEsaUJBQU9BLFlBQVA7QUFDSCxTQU5PLENBQVI7QUFPSDtBQUNKO0FBQ0osR0FyRGdCLEVBcURkLEVBckRjLENBQWpCOztBQXVEQSxNQUFJLENBQUNYLGdCQUFMLEVBQXVCO0FBQ25CLGdCQUE2QlIsSUFBSSxDQUFDRCxLQUFELENBQWpDO0FBQUE7QUFBQSxRQUFPaUMsU0FBUDtBQUFBLFFBQWtCQyxPQUFsQjs7QUFFQXpCLElBQUFBLGdCQUFnQixHQUFHd0IsU0FBbkI7QUFDQXpCLElBQUFBLFFBQVEsQ0FBQ0MsZ0JBQUQsQ0FBUjtBQUVBQyxJQUFBQSxPQUFPLENBQUN3QixPQUFELENBQVA7QUFDSDs7QUFFRCxTQUFPLENBQUN6QixnQkFBRCxFQUFtQkssUUFBbkIsQ0FBUDtBQUNIIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ21kLCBEaXNwYXRjaCB9IGZyb20gXCIuL0NtZFwiO1xuaW1wb3J0IHsgZGlzcGF0Y2hNaWRkbGV3YXJlLCBMb2dnZXJTZXJ2aWNlIH0gZnJvbSBcIi4vSW5pdFwiO1xuaW1wb3J0IHsgTWVzc2FnZUJhc2UsIE51bGxhYmxlIH0gZnJvbSBcIi4vRWxtVXRpbGl0aWVzXCI7XG5pbXBvcnQgeyB1c2VDYWxsYmFjaywgdXNlU3RhdGUgfSBmcm9tIFwicmVhY3RcIjtcbmltcG9ydCB7IFVwZGF0ZVJldHVyblR5cGUgfSBmcm9tIFwiLlwiO1xuXG5leHBvcnQgZnVuY3Rpb24gdXNlRWxtaXNoPFRQcm9wcywgVE1vZGVsLCBUTXNnIGV4dGVuZHMgTWVzc2FnZUJhc2U+IChwcm9wczogVFByb3BzLCBpbml0OiAocHJvcHM6IFRQcm9wcykgPT4gW1RNb2RlbCwgQ21kPFRNc2c+XSwgdXBkYXRlOiAobW9kZWw6IFRNb2RlbCwgbXNnOiBUTXNnLCBwcm9wczogVFByb3BzKSA9PiBVcGRhdGVSZXR1cm5UeXBlPFRNb2RlbCwgVE1zZz4sIG5hbWU6IHN0cmluZyk6IFtUTW9kZWwsIERpc3BhdGNoPFRNc2c+XSB7XG4gICAgbGV0IHJlZW50ZXJlZCA9IGZhbHNlO1xuICAgIGNvbnN0IGJ1ZmZlcjogVE1zZyBbXSA9IFtdO1xuICAgIGxldCBjdXJyZW50TW9kZWw6IFBhcnRpYWw8VE1vZGVsPiA9IHt9O1xuXG4gICAgY29uc3QgW21vZGVsLCBzZXRNb2RlbF0gPSB1c2VTdGF0ZTxOdWxsYWJsZTxUTW9kZWw+PihudWxsKTtcbiAgICBsZXQgaW5pdGlhbGl6ZWRNb2RlbCA9IG1vZGVsO1xuXG4gICAgY29uc3QgZXhlY0NtZCA9IHVzZUNhbGxiYWNrKChjbWQ6IENtZDxUTXNnPik6IHZvaWQgPT4ge1xuICAgICAgICBjbWQuZm9yRWFjaChjYWxsID0+IHtcbiAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgY2FsbChkaXNwYXRjaCk7XG4gICAgICAgICAgICB9IGNhdGNoIChleDogdW5rbm93bikge1xuICAgICAgICAgICAgICAgIExvZ2dlclNlcnZpY2U/LmVycm9yKGV4KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgfSwgW10pO1xuXG4gICAgY29uc3QgZGlzcGF0Y2ggPSB1c2VDYWxsYmFjaygobXNnOiBUTXNnKTogdm9pZCA9PiB7XG4gICAgICAgIGlmICghaW5pdGlhbGl6ZWRNb2RlbCkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgbW9kZWxIYXNDaGFuZ2VkID0gKHVwZGF0ZWRNb2RlbDogUGFydGlhbDxUTW9kZWw+KTogYm9vbGVhbiA9PiB1cGRhdGVkTW9kZWwgIT09IGluaXRpYWxpemVkTW9kZWwgJiYgT2JqZWN0LmdldE93blByb3BlcnR5TmFtZXModXBkYXRlZE1vZGVsKS5sZW5ndGggPiAwO1xuXG4gICAgICAgIGlmIChkaXNwYXRjaE1pZGRsZXdhcmUpIHtcbiAgICAgICAgICAgIGRpc3BhdGNoTWlkZGxld2FyZShtc2cpO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHJlZW50ZXJlZCkge1xuICAgICAgICAgICAgYnVmZmVyLnB1c2gobXNnKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHJlZW50ZXJlZCA9IHRydWU7XG5cbiAgICAgICAgICAgIGxldCBuZXh0TXNnOiBUTXNnIHwgdW5kZWZpbmVkID0gbXNnO1xuICAgICAgICAgICAgbGV0IG1vZGlmaWVkID0gZmFsc2U7XG5cbiAgICAgICAgICAgIHdoaWxlIChuZXh0TXNnKSB7XG4gICAgICAgICAgICAgICAgTG9nZ2VyU2VydmljZT8uaW5mbyhcIkVsbVwiLCBcIm1lc3NhZ2UgZnJvbVwiLCBuYW1lLCBuZXh0TXNnLm5hbWUpO1xuICAgICAgICAgICAgICAgIExvZ2dlclNlcnZpY2U/LmRlYnVnKFwiRWxtXCIsIFwibWVzc2FnZSBmcm9tXCIsIG5hbWUsIG5leHRNc2cpO1xuXG4gICAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgW25ld01vZGVsLCBjbWRdID0gdXBkYXRlKHsgLi4uaW5pdGlhbGl6ZWRNb2RlbCwgLi4uY3VycmVudE1vZGVsIH0sIG5leHRNc2csIHByb3BzKTtcblxuICAgICAgICAgICAgICAgICAgICBpZiAobW9kZWxIYXNDaGFuZ2VkKG5ld01vZGVsKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgY3VycmVudE1vZGVsID0geyAuLi5jdXJyZW50TW9kZWwsIC4uLm5ld01vZGVsIH07XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIG1vZGlmaWVkID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgIGlmIChjbWQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGV4ZWNDbWQoY21kKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0gY2F0Y2ggKGV4OiB1bmtub3duKSB7XG4gICAgICAgICAgICAgICAgICAgIExvZ2dlclNlcnZpY2U/LmVycm9yKGV4KTtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICBuZXh0TXNnID0gYnVmZmVyLnNoaWZ0KCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZWVudGVyZWQgPSBmYWxzZTtcblxuICAgICAgICAgICAgaWYgKG1vZGlmaWVkKSB7XG4gICAgICAgICAgICAgICAgc2V0TW9kZWwocHJldk1vZGVsID0+IHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgdXBkYXRlZE1vZGVsID0geyAuLi5wcmV2TW9kZWwgYXMgVE1vZGVsLCAuLi5jdXJyZW50TW9kZWwgfTtcblxuICAgICAgICAgICAgICAgICAgICBMb2dnZXJTZXJ2aWNlPy5kZWJ1ZyhcIkVsbVwiLCBcInVwZGF0ZSBtb2RlbCBmb3JcIiwgbmFtZSwgdXBkYXRlZE1vZGVsKTtcblxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gdXBkYXRlZE1vZGVsO1xuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfSwgW10pO1xuXG4gICAgaWYgKCFpbml0aWFsaXplZE1vZGVsKSB7XG4gICAgICAgIGNvbnN0IFtpbml0TW9kZWwsIGluaXRDbWRdID0gaW5pdChwcm9wcyk7XG5cbiAgICAgICAgaW5pdGlhbGl6ZWRNb2RlbCA9IGluaXRNb2RlbDtcbiAgICAgICAgc2V0TW9kZWwoaW5pdGlhbGl6ZWRNb2RlbCk7XG5cbiAgICAgICAgZXhlY0NtZChpbml0Q21kKTtcbiAgICB9XG5cbiAgICByZXR1cm4gW2luaXRpYWxpemVkTW9kZWwsIGRpc3BhdGNoXTtcbn0iXX0=
@@ -0,0 +1,3 @@
1
+ import { Cmd, Dispatch } from "./Cmd";
2
+ import { MessageBase, UpdateMap } from "./ElmUtilities";
3
+ export declare function useElmishMap<TProps, TModel, TMsg extends MessageBase>(props: TProps, init: (props: TProps) => [TModel, Cmd<TMsg>], updateMap: UpdateMap<TProps, TModel, TMsg>, name: string): [TModel, Dispatch<TMsg>];
@@ -0,0 +1,123 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ exports.useElmishMap = useElmishMap;
7
+
8
+ var _Init = require("./Init");
9
+
10
+ var _react = require("react");
11
+
12
+ function ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); enumerableOnly && (symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; })), keys.push.apply(keys, symbols); } return keys; }
13
+
14
+ function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = null != arguments[i] ? arguments[i] : {}; i % 2 ? ownKeys(Object(source), !0).forEach(function (key) { _defineProperty(target, key, source[key]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)) : ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } return target; }
15
+
16
+ function _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }
17
+
18
+ function _slicedToArray(arr, i) { return _arrayWithHoles(arr) || _iterableToArrayLimit(arr, i) || _unsupportedIterableToArray(arr, i) || _nonIterableRest(); }
19
+
20
+ function _nonIterableRest() { throw new TypeError("Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); }
21
+
22
+ function _unsupportedIterableToArray(o, minLen) { if (!o) return; if (typeof o === "string") return _arrayLikeToArray(o, minLen); var n = Object.prototype.toString.call(o).slice(8, -1); if (n === "Object" && o.constructor) n = o.constructor.name; if (n === "Map" || n === "Set") return Array.from(o); if (n === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray(o, minLen); }
23
+
24
+ function _arrayLikeToArray(arr, len) { if (len == null || len > arr.length) len = arr.length; for (var i = 0, arr2 = new Array(len); i < len; i++) { arr2[i] = arr[i]; } return arr2; }
25
+
26
+ function _iterableToArrayLimit(arr, i) { var _i = arr == null ? null : typeof Symbol !== "undefined" && arr[Symbol.iterator] || arr["@@iterator"]; if (_i == null) return; var _arr = []; var _n = true; var _d = false; var _s, _e; try { for (_i = _i.call(arr); !(_n = (_s = _i.next()).done); _n = true) { _arr.push(_s.value); if (i && _arr.length === i) break; } } catch (err) { _d = true; _e = err; } finally { try { if (!_n && _i["return"] != null) _i["return"](); } finally { if (_d) throw _e; } } return _arr; }
27
+
28
+ function _arrayWithHoles(arr) { if (Array.isArray(arr)) return arr; }
29
+
30
+ function useElmishMap(props, init, updateMap, name) {
31
+ var reentered = false;
32
+ var buffer = [];
33
+ var currentModel = {};
34
+
35
+ var _useState = (0, _react.useState)(null),
36
+ _useState2 = _slicedToArray(_useState, 2),
37
+ model = _useState2[0],
38
+ setModel = _useState2[1];
39
+
40
+ var initializedModel = model;
41
+ var execCmd = (0, _react.useCallback)(function (cmd) {
42
+ cmd.forEach(function (call) {
43
+ try {
44
+ call(dispatch);
45
+ } catch (ex) {
46
+ _Init.LoggerService === null || _Init.LoggerService === void 0 ? void 0 : _Init.LoggerService.error(ex);
47
+ }
48
+ });
49
+ }, []);
50
+ var dispatch = (0, _react.useCallback)(function (msg) {
51
+ if (!initializedModel) {
52
+ return;
53
+ }
54
+
55
+ var modelHasChanged = function modelHasChanged(updatedModel) {
56
+ return updatedModel !== initializedModel && Object.getOwnPropertyNames(updatedModel).length > 0;
57
+ };
58
+
59
+ if (_Init.dispatchMiddleware) {
60
+ (0, _Init.dispatchMiddleware)(msg);
61
+ }
62
+
63
+ if (reentered) {
64
+ buffer.push(msg);
65
+ } else {
66
+ reentered = true;
67
+ var nextMsg = msg;
68
+ var modified = false;
69
+
70
+ while (nextMsg) {
71
+ _Init.LoggerService === null || _Init.LoggerService === void 0 ? void 0 : _Init.LoggerService.info("Elm", "message from", name, nextMsg.name);
72
+ _Init.LoggerService === null || _Init.LoggerService === void 0 ? void 0 : _Init.LoggerService.debug("Elm", "message from", name, nextMsg);
73
+
74
+ try {
75
+ // eslint-disable-next-line @typescript-eslint/ban-ts-comment
76
+ // @ts-expect-error -- We know that nextMsg fits
77
+ var _updateMap = updateMap[nextMsg.name](nextMsg, _objectSpread(_objectSpread({}, initializedModel), currentModel), props),
78
+ _updateMap2 = _slicedToArray(_updateMap, 2),
79
+ newModel = _updateMap2[0],
80
+ cmd = _updateMap2[1];
81
+
82
+ if (modelHasChanged(newModel)) {
83
+ currentModel = _objectSpread(_objectSpread({}, currentModel), newModel);
84
+ modified = true;
85
+ }
86
+
87
+ if (cmd) {
88
+ execCmd(cmd);
89
+ }
90
+ } catch (ex) {
91
+ _Init.LoggerService === null || _Init.LoggerService === void 0 ? void 0 : _Init.LoggerService.error(ex);
92
+ }
93
+
94
+ nextMsg = buffer.shift();
95
+ }
96
+
97
+ reentered = false;
98
+
99
+ if (modified) {
100
+ setModel(function (prevModel) {
101
+ var updatedModel = _objectSpread(_objectSpread({}, prevModel), currentModel);
102
+
103
+ _Init.LoggerService === null || _Init.LoggerService === void 0 ? void 0 : _Init.LoggerService.debug("Elm", "update model for", name, updatedModel);
104
+ return updatedModel;
105
+ });
106
+ }
107
+ }
108
+ }, []);
109
+
110
+ if (!initializedModel) {
111
+ var _init = init(props),
112
+ _init2 = _slicedToArray(_init, 2),
113
+ initModel = _init2[0],
114
+ initCmd = _init2[1];
115
+
116
+ initializedModel = initModel;
117
+ setModel(initializedModel);
118
+ execCmd(initCmd);
119
+ }
120
+
121
+ return [initializedModel, dispatch];
122
+ }
123
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uL3NyYy91c2VFbG1pc2hNYXAudHMiXSwibmFtZXMiOlsidXNlRWxtaXNoTWFwIiwicHJvcHMiLCJpbml0IiwidXBkYXRlTWFwIiwibmFtZSIsInJlZW50ZXJlZCIsImJ1ZmZlciIsImN1cnJlbnRNb2RlbCIsIm1vZGVsIiwic2V0TW9kZWwiLCJpbml0aWFsaXplZE1vZGVsIiwiZXhlY0NtZCIsImNtZCIsImZvckVhY2giLCJjYWxsIiwiZGlzcGF0Y2giLCJleCIsIkxvZ2dlclNlcnZpY2UiLCJlcnJvciIsIm1zZyIsIm1vZGVsSGFzQ2hhbmdlZCIsInVwZGF0ZWRNb2RlbCIsIk9iamVjdCIsImdldE93blByb3BlcnR5TmFtZXMiLCJsZW5ndGgiLCJkaXNwYXRjaE1pZGRsZXdhcmUiLCJwdXNoIiwibmV4dE1zZyIsIm1vZGlmaWVkIiwiaW5mbyIsImRlYnVnIiwibmV3TW9kZWwiLCJzaGlmdCIsInByZXZNb2RlbCIsImluaXRNb2RlbCIsImluaXRDbWQiXSwibWFwcGluZ3MiOiI7Ozs7Ozs7QUFDQTs7QUFFQTs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFFTyxTQUFTQSxZQUFULENBQWlFQyxLQUFqRSxFQUFnRkMsSUFBaEYsRUFBOEhDLFNBQTlILEVBQTBLQyxJQUExSyxFQUFrTjtBQUNyTixNQUFJQyxTQUFTLEdBQUcsS0FBaEI7QUFDQSxNQUFNQyxNQUFlLEdBQUcsRUFBeEI7QUFDQSxNQUFJQyxZQUE2QixHQUFHLEVBQXBDOztBQUVBLGtCQUEwQixxQkFBMkIsSUFBM0IsQ0FBMUI7QUFBQTtBQUFBLE1BQU9DLEtBQVA7QUFBQSxNQUFjQyxRQUFkOztBQUNBLE1BQUlDLGdCQUFnQixHQUFHRixLQUF2QjtBQUVBLE1BQU1HLE9BQU8sR0FBRyx3QkFBWSxVQUFDQyxHQUFELEVBQTBCO0FBQ2xEQSxJQUFBQSxHQUFHLENBQUNDLE9BQUosQ0FBWSxVQUFBQyxJQUFJLEVBQUk7QUFDaEIsVUFBSTtBQUNBQSxRQUFBQSxJQUFJLENBQUNDLFFBQUQsQ0FBSjtBQUNILE9BRkQsQ0FFRSxPQUFPQyxFQUFQLEVBQW9CO0FBQ2xCQyxzR0FBZUMsS0FBZixDQUFxQkYsRUFBckI7QUFDSDtBQUNKLEtBTkQ7QUFPSCxHQVJlLEVBUWIsRUFSYSxDQUFoQjtBQVVBLE1BQU1ELFFBQVEsR0FBRyx3QkFBWSxVQUFDSSxHQUFELEVBQXFCO0FBQzlDLFFBQUksQ0FBQ1QsZ0JBQUwsRUFBdUI7QUFDbkI7QUFDSDs7QUFFRCxRQUFNVSxlQUFlLEdBQUcsU0FBbEJBLGVBQWtCLENBQUNDLFlBQUQ7QUFBQSxhQUE0Q0EsWUFBWSxLQUFLWCxnQkFBakIsSUFBcUNZLE1BQU0sQ0FBQ0MsbUJBQVAsQ0FBMkJGLFlBQTNCLEVBQXlDRyxNQUF6QyxHQUFrRCxDQUFuSTtBQUFBLEtBQXhCOztBQUVBLFFBQUlDLHdCQUFKLEVBQXdCO0FBQ3BCLG9DQUFtQk4sR0FBbkI7QUFDSDs7QUFFRCxRQUFJZCxTQUFKLEVBQWU7QUFDWEMsTUFBQUEsTUFBTSxDQUFDb0IsSUFBUCxDQUFZUCxHQUFaO0FBQ0gsS0FGRCxNQUVPO0FBQ0hkLE1BQUFBLFNBQVMsR0FBRyxJQUFaO0FBRUEsVUFBSXNCLE9BQXlCLEdBQUdSLEdBQWhDO0FBQ0EsVUFBSVMsUUFBUSxHQUFHLEtBQWY7O0FBRUEsYUFBT0QsT0FBUCxFQUFnQjtBQUNaVixzR0FBZVksSUFBZixDQUFvQixLQUFwQixFQUEyQixjQUEzQixFQUEyQ3pCLElBQTNDLEVBQWlEdUIsT0FBTyxDQUFDdkIsSUFBekQ7QUFDQWEsc0dBQWVhLEtBQWYsQ0FBcUIsS0FBckIsRUFBNEIsY0FBNUIsRUFBNEMxQixJQUE1QyxFQUFrRHVCLE9BQWxEOztBQUVBLFlBQUk7QUFDQTtBQUNBO0FBQ0EsMkJBQXdCeEIsU0FBUyxDQUFDd0IsT0FBTyxDQUFDdkIsSUFBVCxDQUFULENBQXdDdUIsT0FBeEMsa0NBQXNEakIsZ0JBQXRELEdBQTJFSCxZQUEzRSxHQUEyRk4sS0FBM0YsQ0FBeEI7QUFBQTtBQUFBLGNBQU84QixRQUFQO0FBQUEsY0FBaUJuQixHQUFqQjs7QUFFQSxjQUFJUSxlQUFlLENBQUNXLFFBQUQsQ0FBbkIsRUFBK0I7QUFDM0J4QixZQUFBQSxZQUFZLG1DQUFRQSxZQUFSLEdBQXlCd0IsUUFBekIsQ0FBWjtBQUVBSCxZQUFBQSxRQUFRLEdBQUcsSUFBWDtBQUNIOztBQUVELGNBQUloQixHQUFKLEVBQVM7QUFDTEQsWUFBQUEsT0FBTyxDQUFDQyxHQUFELENBQVA7QUFDSDtBQUNKLFNBZEQsQ0FjRSxPQUFPSSxFQUFQLEVBQW9CO0FBQ2xCQyx3R0FBZUMsS0FBZixDQUFxQkYsRUFBckI7QUFDSDs7QUFFRFcsUUFBQUEsT0FBTyxHQUFHckIsTUFBTSxDQUFDMEIsS0FBUCxFQUFWO0FBQ0g7O0FBQ0QzQixNQUFBQSxTQUFTLEdBQUcsS0FBWjs7QUFFQSxVQUFJdUIsUUFBSixFQUFjO0FBQ1ZuQixRQUFBQSxRQUFRLENBQUMsVUFBQXdCLFNBQVMsRUFBSTtBQUNsQixjQUFNWixZQUFZLG1DQUFRWSxTQUFSLEdBQWdDMUIsWUFBaEMsQ0FBbEI7O0FBRUFVLHdHQUFlYSxLQUFmLENBQXFCLEtBQXJCLEVBQTRCLGtCQUE1QixFQUFnRDFCLElBQWhELEVBQXNEaUIsWUFBdEQ7QUFFQSxpQkFBT0EsWUFBUDtBQUNILFNBTk8sQ0FBUjtBQU9IO0FBQ0o7QUFDSixHQXZEZ0IsRUF1RGQsRUF2RGMsQ0FBakI7O0FBeURBLE1BQUksQ0FBQ1gsZ0JBQUwsRUFBdUI7QUFDbkIsZ0JBQTZCUixJQUFJLENBQUNELEtBQUQsQ0FBakM7QUFBQTtBQUFBLFFBQU9pQyxTQUFQO0FBQUEsUUFBa0JDLE9BQWxCOztBQUVBekIsSUFBQUEsZ0JBQWdCLEdBQUd3QixTQUFuQjtBQUNBekIsSUFBQUEsUUFBUSxDQUFDQyxnQkFBRCxDQUFSO0FBRUFDLElBQUFBLE9BQU8sQ0FBQ3dCLE9BQUQsQ0FBUDtBQUNIOztBQUVELFNBQU8sQ0FBQ3pCLGdCQUFELEVBQW1CSyxRQUFuQixDQUFQO0FBQ0giLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDbWQsIERpc3BhdGNoIH0gZnJvbSBcIi4vQ21kXCI7XG5pbXBvcnQgeyBkaXNwYXRjaE1pZGRsZXdhcmUsIExvZ2dlclNlcnZpY2UgfSBmcm9tIFwiLi9Jbml0XCI7XG5pbXBvcnQgeyBNZXNzYWdlQmFzZSwgTnVsbGFibGUsIFVwZGF0ZU1hcCB9IGZyb20gXCIuL0VsbVV0aWxpdGllc1wiO1xuaW1wb3J0IHsgdXNlQ2FsbGJhY2ssIHVzZVN0YXRlIH0gZnJvbSBcInJlYWN0XCI7XG5cbmV4cG9ydCBmdW5jdGlvbiB1c2VFbG1pc2hNYXA8VFByb3BzLCBUTW9kZWwsIFRNc2cgZXh0ZW5kcyBNZXNzYWdlQmFzZT4gKHByb3BzOiBUUHJvcHMsIGluaXQ6IChwcm9wczogVFByb3BzKSA9PiBbVE1vZGVsLCBDbWQ8VE1zZz5dLCB1cGRhdGVNYXA6IFVwZGF0ZU1hcDxUUHJvcHMsIFRNb2RlbCwgVE1zZz4sIG5hbWU6IHN0cmluZyk6IFtUTW9kZWwsIERpc3BhdGNoPFRNc2c+XSB7XG4gICAgbGV0IHJlZW50ZXJlZCA9IGZhbHNlO1xuICAgIGNvbnN0IGJ1ZmZlcjogVE1zZyBbXSA9IFtdO1xuICAgIGxldCBjdXJyZW50TW9kZWw6IFBhcnRpYWw8VE1vZGVsPiA9IHt9O1xuXG4gICAgY29uc3QgW21vZGVsLCBzZXRNb2RlbF0gPSB1c2VTdGF0ZTxOdWxsYWJsZTxUTW9kZWw+PihudWxsKTtcbiAgICBsZXQgaW5pdGlhbGl6ZWRNb2RlbCA9IG1vZGVsO1xuXG4gICAgY29uc3QgZXhlY0NtZCA9IHVzZUNhbGxiYWNrKChjbWQ6IENtZDxUTXNnPik6IHZvaWQgPT4ge1xuICAgICAgICBjbWQuZm9yRWFjaChjYWxsID0+IHtcbiAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgY2FsbChkaXNwYXRjaCk7XG4gICAgICAgICAgICB9IGNhdGNoIChleDogdW5rbm93bikge1xuICAgICAgICAgICAgICAgIExvZ2dlclNlcnZpY2U/LmVycm9yKGV4KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgfSwgW10pO1xuXG4gICAgY29uc3QgZGlzcGF0Y2ggPSB1c2VDYWxsYmFjaygobXNnOiBUTXNnKTogdm9pZCA9PiB7XG4gICAgICAgIGlmICghaW5pdGlhbGl6ZWRNb2RlbCkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgbW9kZWxIYXNDaGFuZ2VkID0gKHVwZGF0ZWRNb2RlbDogUGFydGlhbDxUTW9kZWw+KTogYm9vbGVhbiA9PiB1cGRhdGVkTW9kZWwgIT09IGluaXRpYWxpemVkTW9kZWwgJiYgT2JqZWN0LmdldE93blByb3BlcnR5TmFtZXModXBkYXRlZE1vZGVsKS5sZW5ndGggPiAwO1xuXG4gICAgICAgIGlmIChkaXNwYXRjaE1pZGRsZXdhcmUpIHtcbiAgICAgICAgICAgIGRpc3BhdGNoTWlkZGxld2FyZShtc2cpO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHJlZW50ZXJlZCkge1xuICAgICAgICAgICAgYnVmZmVyLnB1c2gobXNnKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHJlZW50ZXJlZCA9IHRydWU7XG5cbiAgICAgICAgICAgIGxldCBuZXh0TXNnOiBUTXNnIHwgdW5kZWZpbmVkID0gbXNnO1xuICAgICAgICAgICAgbGV0IG1vZGlmaWVkID0gZmFsc2U7XG5cbiAgICAgICAgICAgIHdoaWxlIChuZXh0TXNnKSB7XG4gICAgICAgICAgICAgICAgTG9nZ2VyU2VydmljZT8uaW5mbyhcIkVsbVwiLCBcIm1lc3NhZ2UgZnJvbVwiLCBuYW1lLCBuZXh0TXNnLm5hbWUpO1xuICAgICAgICAgICAgICAgIExvZ2dlclNlcnZpY2U/LmRlYnVnKFwiRWxtXCIsIFwibWVzc2FnZSBmcm9tXCIsIG5hbWUsIG5leHRNc2cpO1xuXG4gICAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9iYW4tdHMtY29tbWVudFxuICAgICAgICAgICAgICAgICAgICAvLyBAdHMtZXhwZWN0LWVycm9yIC0tIFdlIGtub3cgdGhhdCBuZXh0TXNnIGZpdHNcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgW25ld01vZGVsLCBjbWRdID0gdXBkYXRlTWFwW25leHRNc2cubmFtZSBhcyBUTXNnW1wibmFtZVwiXV0obmV4dE1zZywgeyAuLi5pbml0aWFsaXplZE1vZGVsLCAuLi5jdXJyZW50TW9kZWwgfSwgcHJvcHMpO1xuXG4gICAgICAgICAgICAgICAgICAgIGlmIChtb2RlbEhhc0NoYW5nZWQobmV3TW9kZWwpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjdXJyZW50TW9kZWwgPSB7IC4uLmN1cnJlbnRNb2RlbCwgLi4ubmV3TW9kZWwgfTtcblxuICAgICAgICAgICAgICAgICAgICAgICAgbW9kaWZpZWQgPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgaWYgKGNtZCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgZXhlY0NtZChjbWQpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSBjYXRjaCAoZXg6IHVua25vd24pIHtcbiAgICAgICAgICAgICAgICAgICAgTG9nZ2VyU2VydmljZT8uZXJyb3IoZXgpO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIG5leHRNc2cgPSBidWZmZXIuc2hpZnQoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJlZW50ZXJlZCA9IGZhbHNlO1xuXG4gICAgICAgICAgICBpZiAobW9kaWZpZWQpIHtcbiAgICAgICAgICAgICAgICBzZXRNb2RlbChwcmV2TW9kZWwgPT4ge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCB1cGRhdGVkTW9kZWwgPSB7IC4uLnByZXZNb2RlbCBhcyBUTW9kZWwsIC4uLmN1cnJlbnRNb2RlbCB9O1xuXG4gICAgICAgICAgICAgICAgICAgIExvZ2dlclNlcnZpY2U/LmRlYnVnKFwiRWxtXCIsIFwidXBkYXRlIG1vZGVsIGZvclwiLCBuYW1lLCB1cGRhdGVkTW9kZWwpO1xuXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB1cGRhdGVkTW9kZWw7XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9LCBbXSk7XG5cbiAgICBpZiAoIWluaXRpYWxpemVkTW9kZWwpIHtcbiAgICAgICAgY29uc3QgW2luaXRNb2RlbCwgaW5pdENtZF0gPSBpbml0KHByb3BzKTtcblxuICAgICAgICBpbml0aWFsaXplZE1vZGVsID0gaW5pdE1vZGVsO1xuICAgICAgICBzZXRNb2RlbChpbml0aWFsaXplZE1vZGVsKTtcblxuICAgICAgICBleGVjQ21kKGluaXRDbWQpO1xuICAgIH1cblxuICAgIHJldHVybiBbaW5pdGlhbGl6ZWRNb2RlbCwgZGlzcGF0Y2hdO1xufSJdfQ==
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "react-elmish",
3
- "version": "2.0.1",
3
+ "version": "2.1.0",
4
4
  "description": "Elmish for React using Typescript",
5
5
  "author": "atheck",
6
6
  "license": "MIT",
package/dist/Hooks.d.ts DELETED
@@ -1,5 +0,0 @@
1
- import { Cmd, Dispatch } from "./Cmd";
2
- import { UpdateReturnType } from ".";
3
- export declare function useElmish<TProps, TModel, TMsg extends {
4
- name: string | symbol;
5
- }>(props: TProps, init: (props: TProps) => [TModel, Cmd<TMsg>], update: (model: TModel, msg: TMsg, props: TProps) => UpdateReturnType<TModel, TMsg>, name: string): [TModel, Dispatch<TMsg>];
package/dist/Hooks.js DELETED
@@ -1,121 +0,0 @@
1
- "use strict";
2
-
3
- Object.defineProperty(exports, "__esModule", {
4
- value: true
5
- });
6
- exports.useElmish = useElmish;
7
-
8
- var _Init = require("./Init");
9
-
10
- var _react = require("react");
11
-
12
- function ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); enumerableOnly && (symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; })), keys.push.apply(keys, symbols); } return keys; }
13
-
14
- function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = null != arguments[i] ? arguments[i] : {}; i % 2 ? ownKeys(Object(source), !0).forEach(function (key) { _defineProperty(target, key, source[key]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)) : ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } return target; }
15
-
16
- function _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }
17
-
18
- function _slicedToArray(arr, i) { return _arrayWithHoles(arr) || _iterableToArrayLimit(arr, i) || _unsupportedIterableToArray(arr, i) || _nonIterableRest(); }
19
-
20
- function _nonIterableRest() { throw new TypeError("Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); }
21
-
22
- function _unsupportedIterableToArray(o, minLen) { if (!o) return; if (typeof o === "string") return _arrayLikeToArray(o, minLen); var n = Object.prototype.toString.call(o).slice(8, -1); if (n === "Object" && o.constructor) n = o.constructor.name; if (n === "Map" || n === "Set") return Array.from(o); if (n === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray(o, minLen); }
23
-
24
- function _arrayLikeToArray(arr, len) { if (len == null || len > arr.length) len = arr.length; for (var i = 0, arr2 = new Array(len); i < len; i++) { arr2[i] = arr[i]; } return arr2; }
25
-
26
- function _iterableToArrayLimit(arr, i) { var _i = arr == null ? null : typeof Symbol !== "undefined" && arr[Symbol.iterator] || arr["@@iterator"]; if (_i == null) return; var _arr = []; var _n = true; var _d = false; var _s, _e; try { for (_i = _i.call(arr); !(_n = (_s = _i.next()).done); _n = true) { _arr.push(_s.value); if (i && _arr.length === i) break; } } catch (err) { _d = true; _e = err; } finally { try { if (!_n && _i["return"] != null) _i["return"](); } finally { if (_d) throw _e; } } return _arr; }
27
-
28
- function _arrayWithHoles(arr) { if (Array.isArray(arr)) return arr; }
29
-
30
- function useElmish(props, init, update, name) {
31
- var reentered = false;
32
- var buffer = [];
33
- var currentModel = {};
34
-
35
- var _useState = (0, _react.useState)(null),
36
- _useState2 = _slicedToArray(_useState, 2),
37
- model = _useState2[0],
38
- setModel = _useState2[1];
39
-
40
- var initializedModel = model;
41
- var execCmd = (0, _react.useCallback)(function (cmd) {
42
- cmd.forEach(function (call) {
43
- try {
44
- call(dispatch);
45
- } catch (ex) {
46
- _Init.LoggerService === null || _Init.LoggerService === void 0 ? void 0 : _Init.LoggerService.error(ex);
47
- }
48
- });
49
- }, []);
50
- var dispatch = (0, _react.useCallback)(function (msg) {
51
- if (!initializedModel) {
52
- return;
53
- }
54
-
55
- var modelHasChanged = function modelHasChanged(updatedModel) {
56
- return updatedModel !== initializedModel && Object.getOwnPropertyNames(updatedModel).length > 0;
57
- };
58
-
59
- if (_Init.dispatchMiddleware) {
60
- (0, _Init.dispatchMiddleware)(msg);
61
- }
62
-
63
- if (reentered) {
64
- buffer.push(msg);
65
- } else {
66
- reentered = true;
67
- var nextMsg = msg;
68
- var modified = false;
69
-
70
- while (nextMsg) {
71
- _Init.LoggerService === null || _Init.LoggerService === void 0 ? void 0 : _Init.LoggerService.info("Elm", "message from", name, nextMsg.name);
72
- _Init.LoggerService === null || _Init.LoggerService === void 0 ? void 0 : _Init.LoggerService.debug("Elm", "message from", name, nextMsg);
73
-
74
- try {
75
- var _update = update(_objectSpread(_objectSpread({}, initializedModel), currentModel), nextMsg, props),
76
- _update2 = _slicedToArray(_update, 2),
77
- newModel = _update2[0],
78
- cmd = _update2[1];
79
-
80
- if (modelHasChanged(newModel)) {
81
- currentModel = _objectSpread(_objectSpread({}, currentModel), newModel);
82
- modified = true;
83
- }
84
-
85
- if (cmd) {
86
- execCmd(cmd);
87
- }
88
- } catch (ex) {
89
- _Init.LoggerService === null || _Init.LoggerService === void 0 ? void 0 : _Init.LoggerService.error(ex);
90
- }
91
-
92
- nextMsg = buffer.shift();
93
- }
94
-
95
- reentered = false;
96
-
97
- if (modified) {
98
- setModel(function (prevModel) {
99
- var updatedModel = _objectSpread(_objectSpread({}, prevModel), currentModel);
100
-
101
- _Init.LoggerService === null || _Init.LoggerService === void 0 ? void 0 : _Init.LoggerService.debug("Elm", "update model for", name, updatedModel);
102
- return updatedModel;
103
- });
104
- }
105
- }
106
- }, []);
107
-
108
- if (!initializedModel) {
109
- var _init = init(props),
110
- _init2 = _slicedToArray(_init, 2),
111
- initModel = _init2[0],
112
- initCmd = _init2[1];
113
-
114
- initializedModel = initModel;
115
- setModel(initializedModel);
116
- execCmd(initCmd);
117
- }
118
-
119
- return [initializedModel, dispatch];
120
- }
121
- //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uL3NyYy9Ib29rcy50cyJdLCJuYW1lcyI6WyJ1c2VFbG1pc2giLCJwcm9wcyIsImluaXQiLCJ1cGRhdGUiLCJuYW1lIiwicmVlbnRlcmVkIiwiYnVmZmVyIiwiY3VycmVudE1vZGVsIiwibW9kZWwiLCJzZXRNb2RlbCIsImluaXRpYWxpemVkTW9kZWwiLCJleGVjQ21kIiwiY21kIiwiZm9yRWFjaCIsImNhbGwiLCJkaXNwYXRjaCIsImV4IiwiTG9nZ2VyU2VydmljZSIsImVycm9yIiwibXNnIiwibW9kZWxIYXNDaGFuZ2VkIiwidXBkYXRlZE1vZGVsIiwiT2JqZWN0IiwiZ2V0T3duUHJvcGVydHlOYW1lcyIsImxlbmd0aCIsImRpc3BhdGNoTWlkZGxld2FyZSIsInB1c2giLCJuZXh0TXNnIiwibW9kaWZpZWQiLCJpbmZvIiwiZGVidWciLCJuZXdNb2RlbCIsInNoaWZ0IiwicHJldk1vZGVsIiwiaW5pdE1vZGVsIiwiaW5pdENtZCJdLCJtYXBwaW5ncyI6Ijs7Ozs7OztBQUNBOztBQUNBOzs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQUlPLFNBQVNBLFNBQVQsQ0FBNEVDLEtBQTVFLEVBQTJGQyxJQUEzRixFQUF5SUMsTUFBekksRUFBOE5DLElBQTlOLEVBQXNRO0FBQ3pRLE1BQUlDLFNBQVMsR0FBRyxLQUFoQjtBQUNBLE1BQU1DLE1BQWUsR0FBRyxFQUF4QjtBQUNBLE1BQUlDLFlBQTZCLEdBQUcsRUFBcEM7O0FBRUEsa0JBQTBCLHFCQUEyQixJQUEzQixDQUExQjtBQUFBO0FBQUEsTUFBT0MsS0FBUDtBQUFBLE1BQWNDLFFBQWQ7O0FBQ0EsTUFBSUMsZ0JBQWdCLEdBQUdGLEtBQXZCO0FBRUEsTUFBTUcsT0FBTyxHQUFHLHdCQUFZLFVBQUNDLEdBQUQsRUFBMEI7QUFDbERBLElBQUFBLEdBQUcsQ0FBQ0MsT0FBSixDQUFZLFVBQUFDLElBQUksRUFBSTtBQUNoQixVQUFJO0FBQ0FBLFFBQUFBLElBQUksQ0FBQ0MsUUFBRCxDQUFKO0FBQ0gsT0FGRCxDQUVFLE9BQU9DLEVBQVAsRUFBb0I7QUFDbEJDLHNHQUFlQyxLQUFmLENBQXFCRixFQUFyQjtBQUNIO0FBQ0osS0FORDtBQU9ILEdBUmUsRUFRYixFQVJhLENBQWhCO0FBVUEsTUFBTUQsUUFBUSxHQUFHLHdCQUFZLFVBQUNJLEdBQUQsRUFBcUI7QUFDOUMsUUFBSSxDQUFDVCxnQkFBTCxFQUF1QjtBQUNuQjtBQUNIOztBQUVELFFBQU1VLGVBQWUsR0FBRyxTQUFsQkEsZUFBa0IsQ0FBQ0MsWUFBRDtBQUFBLGFBQTRDQSxZQUFZLEtBQUtYLGdCQUFqQixJQUFxQ1ksTUFBTSxDQUFDQyxtQkFBUCxDQUEyQkYsWUFBM0IsRUFBeUNHLE1BQXpDLEdBQWtELENBQW5JO0FBQUEsS0FBeEI7O0FBRUEsUUFBSUMsd0JBQUosRUFBd0I7QUFDcEIsb0NBQW1CTixHQUFuQjtBQUNIOztBQUVELFFBQUlkLFNBQUosRUFBZTtBQUNYQyxNQUFBQSxNQUFNLENBQUNvQixJQUFQLENBQVlQLEdBQVo7QUFDSCxLQUZELE1BRU87QUFDSGQsTUFBQUEsU0FBUyxHQUFHLElBQVo7QUFFQSxVQUFJc0IsT0FBeUIsR0FBR1IsR0FBaEM7QUFDQSxVQUFJUyxRQUFRLEdBQUcsS0FBZjs7QUFFQSxhQUFPRCxPQUFQLEVBQWdCO0FBQ1pWLHNHQUFlWSxJQUFmLENBQW9CLEtBQXBCLEVBQTJCLGNBQTNCLEVBQTJDekIsSUFBM0MsRUFBaUR1QixPQUFPLENBQUN2QixJQUF6RDtBQUNBYSxzR0FBZWEsS0FBZixDQUFxQixLQUFyQixFQUE0QixjQUE1QixFQUE0QzFCLElBQTVDLEVBQWtEdUIsT0FBbEQ7O0FBRUEsWUFBSTtBQUNBLHdCQUF3QnhCLE1BQU0saUNBQU1PLGdCQUFOLEdBQTJCSCxZQUEzQixHQUEyQ29CLE9BQTNDLEVBQW9EMUIsS0FBcEQsQ0FBOUI7QUFBQTtBQUFBLGNBQU84QixRQUFQO0FBQUEsY0FBaUJuQixHQUFqQjs7QUFFQSxjQUFJUSxlQUFlLENBQUNXLFFBQUQsQ0FBbkIsRUFBK0I7QUFDM0J4QixZQUFBQSxZQUFZLG1DQUFRQSxZQUFSLEdBQXlCd0IsUUFBekIsQ0FBWjtBQUVBSCxZQUFBQSxRQUFRLEdBQUcsSUFBWDtBQUNIOztBQUVELGNBQUloQixHQUFKLEVBQVM7QUFDTEQsWUFBQUEsT0FBTyxDQUFDQyxHQUFELENBQVA7QUFDSDtBQUNKLFNBWkQsQ0FZRSxPQUFPSSxFQUFQLEVBQW9CO0FBQ2xCQyx3R0FBZUMsS0FBZixDQUFxQkYsRUFBckI7QUFDSDs7QUFFRFcsUUFBQUEsT0FBTyxHQUFHckIsTUFBTSxDQUFDMEIsS0FBUCxFQUFWO0FBQ0g7O0FBQ0QzQixNQUFBQSxTQUFTLEdBQUcsS0FBWjs7QUFFQSxVQUFJdUIsUUFBSixFQUFjO0FBQ1ZuQixRQUFBQSxRQUFRLENBQUMsVUFBQXdCLFNBQVMsRUFBSTtBQUNsQixjQUFNWixZQUFZLG1DQUFRWSxTQUFSLEdBQWdDMUIsWUFBaEMsQ0FBbEI7O0FBRUFVLHdHQUFlYSxLQUFmLENBQXFCLEtBQXJCLEVBQTRCLGtCQUE1QixFQUFnRDFCLElBQWhELEVBQXNEaUIsWUFBdEQ7QUFFQSxpQkFBT0EsWUFBUDtBQUNILFNBTk8sQ0FBUjtBQU9IO0FBQ0o7QUFDSixHQXJEZ0IsRUFxRGQsRUFyRGMsQ0FBakI7O0FBdURBLE1BQUksQ0FBQ1gsZ0JBQUwsRUFBdUI7QUFDbkIsZ0JBQTZCUixJQUFJLENBQUNELEtBQUQsQ0FBakM7QUFBQTtBQUFBLFFBQU9pQyxTQUFQO0FBQUEsUUFBa0JDLE9BQWxCOztBQUVBekIsSUFBQUEsZ0JBQWdCLEdBQUd3QixTQUFuQjtBQUNBekIsSUFBQUEsUUFBUSxDQUFDQyxnQkFBRCxDQUFSO0FBRUFDLElBQUFBLE9BQU8sQ0FBQ3dCLE9BQUQsQ0FBUDtBQUNIOztBQUVELFNBQU8sQ0FBQ3pCLGdCQUFELEVBQW1CSyxRQUFuQixDQUFQO0FBQ0giLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDbWQsIERpc3BhdGNoIH0gZnJvbSBcIi4vQ21kXCI7XG5pbXBvcnQgeyBkaXNwYXRjaE1pZGRsZXdhcmUsIExvZ2dlclNlcnZpY2UgfSBmcm9tIFwiLi9Jbml0XCI7XG5pbXBvcnQgeyB1c2VDYWxsYmFjaywgdXNlU3RhdGUgfSBmcm9tIFwicmVhY3RcIjtcbmltcG9ydCB7IE51bGxhYmxlIH0gZnJvbSBcIi4vRWxtVXRpbGl0aWVzXCI7XG5pbXBvcnQgeyBVcGRhdGVSZXR1cm5UeXBlIH0gZnJvbSBcIi5cIjtcblxuZXhwb3J0IGZ1bmN0aW9uIHVzZUVsbWlzaDxUUHJvcHMsIFRNb2RlbCwgVE1zZyBleHRlbmRzIHsgbmFtZTogc3RyaW5nIHwgc3ltYm9sIH0+IChwcm9wczogVFByb3BzLCBpbml0OiAocHJvcHM6IFRQcm9wcykgPT4gW1RNb2RlbCwgQ21kPFRNc2c+XSwgdXBkYXRlOiAobW9kZWw6IFRNb2RlbCwgbXNnOiBUTXNnLCBwcm9wczogVFByb3BzKSA9PiBVcGRhdGVSZXR1cm5UeXBlPFRNb2RlbCwgVE1zZz4sIG5hbWU6IHN0cmluZyk6IFtUTW9kZWwsIERpc3BhdGNoPFRNc2c+XSB7XG4gICAgbGV0IHJlZW50ZXJlZCA9IGZhbHNlO1xuICAgIGNvbnN0IGJ1ZmZlcjogVE1zZyBbXSA9IFtdO1xuICAgIGxldCBjdXJyZW50TW9kZWw6IFBhcnRpYWw8VE1vZGVsPiA9IHt9O1xuXG4gICAgY29uc3QgW21vZGVsLCBzZXRNb2RlbF0gPSB1c2VTdGF0ZTxOdWxsYWJsZTxUTW9kZWw+PihudWxsKTtcbiAgICBsZXQgaW5pdGlhbGl6ZWRNb2RlbCA9IG1vZGVsO1xuXG4gICAgY29uc3QgZXhlY0NtZCA9IHVzZUNhbGxiYWNrKChjbWQ6IENtZDxUTXNnPik6IHZvaWQgPT4ge1xuICAgICAgICBjbWQuZm9yRWFjaChjYWxsID0+IHtcbiAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgY2FsbChkaXNwYXRjaCk7XG4gICAgICAgICAgICB9IGNhdGNoIChleDogdW5rbm93bikge1xuICAgICAgICAgICAgICAgIExvZ2dlclNlcnZpY2U/LmVycm9yKGV4KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgfSwgW10pO1xuXG4gICAgY29uc3QgZGlzcGF0Y2ggPSB1c2VDYWxsYmFjaygobXNnOiBUTXNnKTogdm9pZCA9PiB7XG4gICAgICAgIGlmICghaW5pdGlhbGl6ZWRNb2RlbCkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgbW9kZWxIYXNDaGFuZ2VkID0gKHVwZGF0ZWRNb2RlbDogUGFydGlhbDxUTW9kZWw+KTogYm9vbGVhbiA9PiB1cGRhdGVkTW9kZWwgIT09IGluaXRpYWxpemVkTW9kZWwgJiYgT2JqZWN0LmdldE93blByb3BlcnR5TmFtZXModXBkYXRlZE1vZGVsKS5sZW5ndGggPiAwO1xuXG4gICAgICAgIGlmIChkaXNwYXRjaE1pZGRsZXdhcmUpIHtcbiAgICAgICAgICAgIGRpc3BhdGNoTWlkZGxld2FyZShtc2cpO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHJlZW50ZXJlZCkge1xuICAgICAgICAgICAgYnVmZmVyLnB1c2gobXNnKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHJlZW50ZXJlZCA9IHRydWU7XG5cbiAgICAgICAgICAgIGxldCBuZXh0TXNnOiBUTXNnIHwgdW5kZWZpbmVkID0gbXNnO1xuICAgICAgICAgICAgbGV0IG1vZGlmaWVkID0gZmFsc2U7XG5cbiAgICAgICAgICAgIHdoaWxlIChuZXh0TXNnKSB7XG4gICAgICAgICAgICAgICAgTG9nZ2VyU2VydmljZT8uaW5mbyhcIkVsbVwiLCBcIm1lc3NhZ2UgZnJvbVwiLCBuYW1lLCBuZXh0TXNnLm5hbWUpO1xuICAgICAgICAgICAgICAgIExvZ2dlclNlcnZpY2U/LmRlYnVnKFwiRWxtXCIsIFwibWVzc2FnZSBmcm9tXCIsIG5hbWUsIG5leHRNc2cpO1xuXG4gICAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgW25ld01vZGVsLCBjbWRdID0gdXBkYXRlKHsgLi4uaW5pdGlhbGl6ZWRNb2RlbCwgLi4uY3VycmVudE1vZGVsIH0sIG5leHRNc2csIHByb3BzKTtcblxuICAgICAgICAgICAgICAgICAgICBpZiAobW9kZWxIYXNDaGFuZ2VkKG5ld01vZGVsKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgY3VycmVudE1vZGVsID0geyAuLi5jdXJyZW50TW9kZWwsIC4uLm5ld01vZGVsIH07XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIG1vZGlmaWVkID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgIGlmIChjbWQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGV4ZWNDbWQoY21kKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0gY2F0Y2ggKGV4OiB1bmtub3duKSB7XG4gICAgICAgICAgICAgICAgICAgIExvZ2dlclNlcnZpY2U/LmVycm9yKGV4KTtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICBuZXh0TXNnID0gYnVmZmVyLnNoaWZ0KCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZWVudGVyZWQgPSBmYWxzZTtcblxuICAgICAgICAgICAgaWYgKG1vZGlmaWVkKSB7XG4gICAgICAgICAgICAgICAgc2V0TW9kZWwocHJldk1vZGVsID0+IHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgdXBkYXRlZE1vZGVsID0geyAuLi5wcmV2TW9kZWwgYXMgVE1vZGVsLCAuLi5jdXJyZW50TW9kZWwgfTtcblxuICAgICAgICAgICAgICAgICAgICBMb2dnZXJTZXJ2aWNlPy5kZWJ1ZyhcIkVsbVwiLCBcInVwZGF0ZSBtb2RlbCBmb3JcIiwgbmFtZSwgdXBkYXRlZE1vZGVsKTtcblxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gdXBkYXRlZE1vZGVsO1xuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfSwgW10pO1xuXG4gICAgaWYgKCFpbml0aWFsaXplZE1vZGVsKSB7XG4gICAgICAgIGNvbnN0IFtpbml0TW9kZWwsIGluaXRDbWRdID0gaW5pdChwcm9wcyk7XG5cbiAgICAgICAgaW5pdGlhbGl6ZWRNb2RlbCA9IGluaXRNb2RlbDtcbiAgICAgICAgc2V0TW9kZWwoaW5pdGlhbGl6ZWRNb2RlbCk7XG5cbiAgICAgICAgZXhlY0NtZChpbml0Q21kKTtcbiAgICB9XG5cbiAgICByZXR1cm4gW2luaXRpYWxpemVkTW9kZWwsIGRpc3BhdGNoXTtcbn0iXX0=