@pie-lib/editable-html 9.5.13 → 10.0.0-beta.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (144) hide show
  1. package/CHANGELOG.md +0 -302
  2. package/lib/components.js +116 -0
  3. package/lib/components.js.map +1 -0
  4. package/lib/editor.js +418 -103
  5. package/lib/editor.js.map +1 -1
  6. package/lib/index.js +101 -155
  7. package/lib/index.js.map +1 -1
  8. package/lib/new-serialization.js +320 -0
  9. package/lib/new-serialization.js.map +1 -0
  10. package/lib/old-serialization.js +330 -0
  11. package/lib/parse-html.js +1 -1
  12. package/lib/parse-html.js.map +1 -1
  13. package/lib/plugins/characters/custom-popper.js +1 -1
  14. package/lib/plugins/characters/custom-popper.js.map +1 -1
  15. package/lib/plugins/characters/index.js +21 -19
  16. package/lib/plugins/characters/index.js.map +1 -1
  17. package/lib/plugins/characters/utils.js +1 -1
  18. package/lib/plugins/characters/utils.js.map +1 -1
  19. package/lib/plugins/hotKeys/index.js +67 -0
  20. package/lib/plugins/hotKeys/index.js.map +1 -0
  21. package/lib/plugins/image/alt-dialog.js +1 -6
  22. package/lib/plugins/image/alt-dialog.js.map +1 -1
  23. package/lib/plugins/image/component.js +70 -53
  24. package/lib/plugins/image/component.js.map +1 -1
  25. package/lib/plugins/image/image-toolbar.js +7 -9
  26. package/lib/plugins/image/image-toolbar.js.map +1 -1
  27. package/lib/plugins/image/index.js +83 -27
  28. package/lib/plugins/image/index.js.map +1 -1
  29. package/lib/plugins/image/insert-image-handler.js +72 -33
  30. package/lib/plugins/image/insert-image-handler.js.map +1 -1
  31. package/lib/plugins/index.js +23 -41
  32. package/lib/plugins/index.js.map +1 -1
  33. package/lib/plugins/list/index.js +64 -100
  34. package/lib/plugins/list/index.js.map +1 -1
  35. package/lib/plugins/math/index.js +86 -60
  36. package/lib/plugins/math/index.js.map +1 -1
  37. package/lib/plugins/media/index.js +202 -132
  38. package/lib/plugins/media/index.js.map +1 -1
  39. package/lib/plugins/media/media-dialog.js +17 -16
  40. package/lib/plugins/media/media-dialog.js.map +1 -1
  41. package/lib/plugins/media/media-toolbar.js +3 -3
  42. package/lib/plugins/media/media-toolbar.js.map +1 -1
  43. package/lib/plugins/media/media-wrapper.js +21 -58
  44. package/lib/plugins/media/media-wrapper.js.map +1 -1
  45. package/lib/plugins/respArea/drag-in-the-blank/choice.js +3 -3
  46. package/lib/plugins/respArea/drag-in-the-blank/choice.js.map +1 -1
  47. package/lib/plugins/respArea/drag-in-the-blank/index.js +3 -2
  48. package/lib/plugins/respArea/drag-in-the-blank/index.js.map +1 -1
  49. package/lib/plugins/respArea/explicit-constructed-response/index.js +3 -2
  50. package/lib/plugins/respArea/explicit-constructed-response/index.js.map +1 -1
  51. package/lib/plugins/respArea/icons/index.js +13 -15
  52. package/lib/plugins/respArea/icons/index.js.map +1 -1
  53. package/lib/plugins/respArea/index.js +87 -53
  54. package/lib/plugins/respArea/index.js.map +1 -1
  55. package/lib/plugins/respArea/inline-dropdown/index.js +4 -3
  56. package/lib/plugins/respArea/inline-dropdown/index.js.map +1 -1
  57. package/lib/plugins/respArea/utils.js +17 -20
  58. package/lib/plugins/respArea/utils.js.map +1 -1
  59. package/lib/plugins/table/icons/index.js +1 -1
  60. package/lib/plugins/table/icons/index.js.map +1 -1
  61. package/lib/plugins/table/index.js +381 -212
  62. package/lib/plugins/table/index.js.map +1 -1
  63. package/lib/plugins/table/table-toolbar.js +5 -6
  64. package/lib/plugins/table/table-toolbar.js.map +1 -1
  65. package/lib/plugins/toolbar/default-toolbar.js +55 -11
  66. package/lib/plugins/toolbar/default-toolbar.js.map +1 -1
  67. package/lib/plugins/toolbar/done-button.js +1 -1
  68. package/lib/plugins/toolbar/done-button.js.map +1 -1
  69. package/lib/plugins/toolbar/editor-and-toolbar.js +186 -232
  70. package/lib/plugins/toolbar/editor-and-toolbar.js.map +1 -1
  71. package/lib/plugins/toolbar/index.js +1 -2
  72. package/lib/plugins/toolbar/index.js.map +1 -1
  73. package/lib/plugins/toolbar/toolbar-buttons.js +1 -1
  74. package/lib/plugins/toolbar/toolbar-buttons.js.map +1 -1
  75. package/lib/plugins/toolbar/toolbar.js +253 -239
  76. package/lib/plugins/toolbar/toolbar.js.map +1 -1
  77. package/lib/plugins/utils.js +27 -2
  78. package/lib/plugins/utils.js.map +1 -1
  79. package/lib/serialization.js +1 -1
  80. package/lib/serialization.js.map +1 -1
  81. package/lib/slate-editor.js +302 -0
  82. package/lib/test-serializer.js +189 -0
  83. package/lib/test-serializer.js.map +1 -0
  84. package/lib/theme.js +1 -1
  85. package/lib/theme.js.map +1 -1
  86. package/package.json +18 -14
  87. package/playground/image/data.js +20 -20
  88. package/playground/image/index.html +22 -20
  89. package/playground/image/index.jsx +12 -10
  90. package/playground/index.html +25 -23
  91. package/playground/mathquill/index.html +23 -20
  92. package/playground/mathquill/index.jsx +18 -22
  93. package/playground/prod-test/index.html +24 -20
  94. package/playground/prod-test/index.jsx +5 -3
  95. package/playground/schema-override/data.js +10 -10
  96. package/playground/schema-override/image-plugin.jsx +3 -4
  97. package/playground/schema-override/index.html +21 -19
  98. package/playground/schema-override/index.jsx +13 -14
  99. package/playground/serialization/data.js +10 -10
  100. package/playground/serialization/image-plugin.jsx +3 -4
  101. package/playground/serialization/index.html +22 -20
  102. package/playground/table-examples.html +5 -8
  103. package/playground/webpack.config.js +10 -10
  104. package/src/components.js +135 -0
  105. package/src/editor.jsx +478 -141
  106. package/src/index.jsx +71 -95
  107. package/src/new-serialization.jsx +291 -0
  108. package/src/parse-html.js +1 -1
  109. package/src/plugins/characters/custom-popper.js +7 -7
  110. package/src/plugins/characters/index.jsx +33 -34
  111. package/src/plugins/characters/utils.js +81 -81
  112. package/src/plugins/hotKeys/index.js +54 -0
  113. package/src/plugins/image/alt-dialog.jsx +4 -5
  114. package/src/plugins/image/component.jsx +106 -89
  115. package/src/plugins/image/image-toolbar.jsx +27 -19
  116. package/src/plugins/image/index.jsx +75 -43
  117. package/src/plugins/image/insert-image-handler.js +62 -27
  118. package/src/plugins/index.jsx +23 -41
  119. package/src/plugins/list/index.jsx +70 -95
  120. package/src/plugins/math/index.jsx +102 -82
  121. package/src/plugins/media/index.jsx +159 -124
  122. package/src/plugins/media/media-dialog.js +98 -71
  123. package/src/plugins/media/media-toolbar.jsx +8 -8
  124. package/src/plugins/media/media-wrapper.jsx +29 -30
  125. package/src/plugins/respArea/drag-in-the-blank/choice.jsx +21 -19
  126. package/src/plugins/respArea/drag-in-the-blank/index.jsx +14 -11
  127. package/src/plugins/respArea/explicit-constructed-response/index.jsx +7 -6
  128. package/src/plugins/respArea/icons/index.jsx +11 -14
  129. package/src/plugins/respArea/index.jsx +92 -52
  130. package/src/plugins/respArea/inline-dropdown/index.jsx +9 -8
  131. package/src/plugins/respArea/utils.jsx +26 -35
  132. package/src/plugins/table/icons/index.jsx +17 -11
  133. package/src/plugins/table/index.jsx +288 -231
  134. package/src/plugins/table/table-toolbar.jsx +15 -11
  135. package/src/plugins/toolbar/default-toolbar.jsx +65 -19
  136. package/src/plugins/toolbar/done-button.jsx +4 -4
  137. package/src/plugins/toolbar/editor-and-toolbar.jsx +150 -145
  138. package/src/plugins/toolbar/index.jsx +2 -3
  139. package/src/plugins/toolbar/toolbar-buttons.jsx +11 -11
  140. package/src/plugins/toolbar/toolbar.jsx +244 -221
  141. package/src/plugins/utils.js +21 -4
  142. package/src/serialization.jsx +32 -32
  143. package/src/test-serializer.js +139 -0
  144. package/src/test-serializer.js.rej +20 -0
@@ -2,29 +2,23 @@
2
2
 
3
3
  var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
4
4
 
5
+ var _typeof = require("@babel/runtime/helpers/typeof");
6
+
5
7
  Object.defineProperty(exports, "__esModule", {
6
8
  value: true
7
9
  });
8
10
  exports["default"] = exports.Toolbar = void 0;
9
11
 
10
- var _classCallCheck2 = _interopRequireDefault(require("@babel/runtime/helpers/classCallCheck"));
11
-
12
- var _createClass2 = _interopRequireDefault(require("@babel/runtime/helpers/createClass"));
13
-
14
- var _assertThisInitialized2 = _interopRequireDefault(require("@babel/runtime/helpers/assertThisInitialized"));
15
-
16
- var _inherits2 = _interopRequireDefault(require("@babel/runtime/helpers/inherits"));
17
-
18
- var _possibleConstructorReturn2 = _interopRequireDefault(require("@babel/runtime/helpers/possibleConstructorReturn"));
19
-
20
- var _getPrototypeOf2 = _interopRequireDefault(require("@babel/runtime/helpers/getPrototypeOf"));
21
-
22
12
  var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty"));
23
13
 
24
- var _react = _interopRequireDefault(require("react"));
14
+ var _slicedToArray2 = _interopRequireDefault(require("@babel/runtime/helpers/slicedToArray"));
15
+
16
+ var _react = _interopRequireWildcard(require("react"));
25
17
 
26
18
  var _slate = require("slate");
27
19
 
20
+ var _slateReact = require("slate-react");
21
+
28
22
  var _Delete = _interopRequireDefault(require("@material-ui/icons/Delete"));
29
23
 
30
24
  var _IconButton = _interopRequireDefault(require("@material-ui/core/IconButton"));
@@ -35,31 +29,27 @@ var _classnames = _interopRequireDefault(require("classnames"));
35
29
 
36
30
  var _debug = _interopRequireDefault(require("debug"));
37
31
 
38
- var _slatePropTypes = _interopRequireDefault(require("slate-prop-types"));
39
-
40
32
  var _debounce = _interopRequireDefault(require("lodash/debounce"));
41
33
 
42
34
  var _doneButton = require("./done-button");
43
35
 
44
- var _utils = require("../utils");
45
-
46
36
  var _styles = require("@material-ui/core/styles");
47
37
 
48
38
  var _defaultToolbar = _interopRequireDefault(require("./default-toolbar"));
49
39
 
50
40
  var _characters = require("../characters");
51
41
 
52
- 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; }
42
+ function _getRequireWildcardCache(nodeInterop) { if (typeof WeakMap !== "function") return null; var cacheBabelInterop = new WeakMap(); var cacheNodeInterop = new WeakMap(); return (_getRequireWildcardCache = function _getRequireWildcardCache(nodeInterop) { return nodeInterop ? cacheNodeInterop : cacheBabelInterop; })(nodeInterop); }
53
43
 
54
- 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) { (0, _defineProperty2["default"])(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; }
44
+ function _interopRequireWildcard(obj, nodeInterop) { if (!nodeInterop && obj && obj.__esModule) { return obj; } if (obj === null || _typeof(obj) !== "object" && typeof obj !== "function") { return { "default": obj }; } var cache = _getRequireWildcardCache(nodeInterop); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var key in obj) { if (key !== "default" && Object.prototype.hasOwnProperty.call(obj, key)) { var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj["default"] = obj; if (cache) { cache.set(obj, newObj); } return newObj; }
55
45
 
56
- function _createSuper(Derived) { var hasNativeReflectConstruct = _isNativeReflectConstruct(); return function _createSuperInternal() { var Super = (0, _getPrototypeOf2["default"])(Derived), result; if (hasNativeReflectConstruct) { var NewTarget = (0, _getPrototypeOf2["default"])(this).constructor; result = Reflect.construct(Super, arguments, NewTarget); } else { result = Super.apply(this, arguments); } return (0, _possibleConstructorReturn2["default"])(this, result); }; }
46
+ 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; }
57
47
 
58
- function _isNativeReflectConstruct() { if (typeof Reflect === "undefined" || !Reflect.construct) return false; if (Reflect.construct.sham) return false; if (typeof Proxy === "function") return true; try { Boolean.prototype.valueOf.call(Reflect.construct(Boolean, [], function () {})); return true; } catch (e) { return false; } }
48
+ 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) { (0, _defineProperty2["default"])(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; }
59
49
 
60
50
  var log = (0, _debug["default"])('@pie-lib:editable-html:plugins:toolbar');
61
51
 
62
- var getCustomToolbar = function getCustomToolbar(plugin, node, value, handleDone, onDataChange) {
52
+ var getCustomToolbar = function getCustomToolbar(plugin, node, value, editor, handleDone) {
63
53
  if (!plugin) {
64
54
  return;
65
55
  }
@@ -78,225 +68,10 @@ var getCustomToolbar = function getCustomToolbar(plugin, node, value, handleDone
78
68
  return plugin.toolbar.CustomToolbarComp;
79
69
  } else if (typeof plugin.toolbar.customToolbar === 'function') {
80
70
  log('deprecated - use CustomToolbarComp');
81
- return plugin.toolbar.customToolbar(node, value, handleDone, onDataChange);
71
+ return plugin.toolbar.customToolbar(node, value, editor, handleDone);
82
72
  }
83
73
  };
84
74
 
85
- var Toolbar = /*#__PURE__*/function (_React$Component) {
86
- (0, _inherits2["default"])(Toolbar, _React$Component);
87
-
88
- var _super = _createSuper(Toolbar);
89
-
90
- function Toolbar(props) {
91
- var _this;
92
-
93
- (0, _classCallCheck2["default"])(this, Toolbar);
94
- _this = _super.call(this, props);
95
- (0, _defineProperty2["default"])((0, _assertThisInitialized2["default"])(_this), "hasMark", function (type) {
96
- var value = _this.props.value;
97
- return value.marks.some(function (mark) {
98
- return mark.type == type;
99
- });
100
- });
101
- (0, _defineProperty2["default"])((0, _assertThisInitialized2["default"])(_this), "hasBlock", function (type) {
102
- var value = _this.props.value;
103
- return value.blocks.some(function (node) {
104
- return node.type == type;
105
- });
106
- });
107
- (0, _defineProperty2["default"])((0, _assertThisInitialized2["default"])(_this), "onToggle", function (plugin) {
108
- var _this$props = _this.props,
109
- value = _this$props.value,
110
- onChange = _this$props.onChange;
111
- if (!plugin.onToggle) return;
112
- var change = plugin.onToggle(value.change());
113
- onChange(change);
114
- });
115
- (0, _defineProperty2["default"])((0, _assertThisInitialized2["default"])(_this), "onClick", function (e) {
116
- log('[onClick]');
117
- e.preventDefault();
118
- });
119
- (0, _defineProperty2["default"])((0, _assertThisInitialized2["default"])(_this), "onButtonClick", function (fn) {
120
- return function (e) {
121
- e.preventDefault();
122
- fn();
123
- };
124
- });
125
- (0, _defineProperty2["default"])((0, _assertThisInitialized2["default"])(_this), "onToolbarDone", function (change, finishEditing) {
126
- log('[onToolbarDone] change: ', change, 'finishEditing: ', finishEditing);
127
- var _this$props2 = _this.props,
128
- onChange = _this$props2.onChange,
129
- onDone = _this$props2.onDone; // use handler only if this is an actual Slate Change
130
-
131
- if (change instanceof _slate.Change) {
132
- onChange(change, function () {
133
- if (finishEditing) {
134
- onDone();
135
- }
136
- });
137
- } else {
138
- if (finishEditing) {
139
- log('[onToolbarChange] call onDone');
140
- onDone();
141
- }
142
- }
143
- });
144
- (0, _defineProperty2["default"])((0, _assertThisInitialized2["default"])(_this), "onDeleteClick", (0, _debounce["default"])(function (e, plugin, node, value, onChange) {
145
- return plugin.deleteNode(e, node, value, onChange);
146
- }, 500));
147
- (0, _defineProperty2["default"])((0, _assertThisInitialized2["default"])(_this), "onDeleteMouseDown", function (e, plugin, node, value, onChange) {
148
- e.persist();
149
-
150
- _this.onDeleteClick(e, plugin, node, value, onChange);
151
- });
152
- _this.state = {
153
- change: null
154
- };
155
- return _this;
156
- }
157
-
158
- (0, _createClass2["default"])(Toolbar, [{
159
- key: "componentWillUnmount",
160
- value: function componentWillUnmount() {
161
- (0, _characters.removeDialogs)();
162
- }
163
- }, {
164
- key: "render",
165
- value: function render() {
166
- var _this2 = this,
167
- _classNames;
168
-
169
- var _this$props3 = this.props,
170
- classes = _this$props3.classes,
171
- plugins = _this$props3.plugins,
172
- pluginProps = _this$props3.pluginProps,
173
- toolbarOpts = _this$props3.toolbarOpts,
174
- value = _this$props3.value,
175
- autoWidth = _this$props3.autoWidth,
176
- onChange = _this$props3.onChange,
177
- getFocusedValue = _this$props3.getFocusedValue,
178
- isFocused = _this$props3.isFocused,
179
- onDone = _this$props3.onDone,
180
- toolbarRef = _this$props3.toolbarRef;
181
- var node = (0, _utils.findSingleNode)(value);
182
- var parentNode = (0, _utils.findParentNode)(value, node);
183
- log(' --------------> [render] node: ', node);
184
- log('[render] node: ', node);
185
- var plugin = plugins.find(function (p) {
186
- if (!node) {
187
- return;
188
- }
189
-
190
- if (p.toolbar) {
191
- return p.toolbar.supports && p.toolbar.supports(node, value);
192
- }
193
- });
194
- var parentPlugin = plugins.find(function (p) {
195
- if (!parentNode) {
196
- return;
197
- }
198
-
199
- if (p.toolbar) {
200
- return p.toolbar.supports && p.toolbar.supports(parentNode, value);
201
- }
202
- });
203
- log('[render] plugin: ', plugin);
204
-
205
- var handleDone = function handleDone(change, done) {
206
- var handler = onDone;
207
-
208
- if (plugin && plugin.toolbar && plugin.toolbar.customToolbar) {
209
- handler = _this2.onToolbarDone;
210
- }
211
-
212
- handler(change, done);
213
-
214
- if (parentPlugin && parentPlugin.handleDone) {
215
- parentPlugin.handleDone(value, node, plugin, onChange);
216
- }
217
- };
218
-
219
- var handleDataChange = function handleDataChange(key, data) {
220
- _this2.props.onDataChange(key, data);
221
- };
222
-
223
- var CustomToolbar = getCustomToolbar(plugin, node, value, handleDone, this.props.onDataChange);
224
- var filteredPlugins = plugin && plugin.filterPlugins ? plugin.filterPlugins(node, plugins) : plugins;
225
- log('[render] CustomToolbar: ', CustomToolbar);
226
- var parentExtraStyles = parentPlugin && parentPlugin.pluginStyles ? parentPlugin.pluginStyles(node, parentNode, plugin) : {};
227
- var pluginExtraStyles = plugin && plugin.pluginStyles ? plugin.pluginStyles(node, parentNode, plugin) : {};
228
-
229
- var extraStyles = _objectSpread(_objectSpread({}, pluginExtraStyles), parentExtraStyles);
230
-
231
- var deletable = node && plugin && plugin.deleteNode;
232
- var customToolbarShowDone = node && plugin && plugin.toolbar && plugin.toolbar.showDone && !toolbarOpts.alwaysVisible; // If there is a toolbarOpts we check if the showDone is not equal to false
233
-
234
- var defaultToolbarShowDone = !toolbarOpts || toolbarOpts.showDone !== false;
235
- var hasDoneButton = defaultToolbarShowDone || customToolbarShowDone;
236
- var names = (0, _classnames["default"])(classes.toolbar, (_classNames = {}, (0, _defineProperty2["default"])(_classNames, classes.toolbarWithNoDone, !hasDoneButton), (0, _defineProperty2["default"])(_classNames, classes.toolbarTop, toolbarOpts.position === 'top'), (0, _defineProperty2["default"])(_classNames, classes.toolbarRight, toolbarOpts.alignment === 'right'), (0, _defineProperty2["default"])(_classNames, classes.focused, toolbarOpts.alwaysVisible || isFocused), (0, _defineProperty2["default"])(_classNames, classes.autoWidth, autoWidth), (0, _defineProperty2["default"])(_classNames, classes.fullWidth, !autoWidth), _classNames));
237
- return /*#__PURE__*/_react["default"].createElement("div", {
238
- className: names,
239
- style: extraStyles,
240
- onClick: this.onClick,
241
- ref: toolbarRef
242
- }, CustomToolbar ? /*#__PURE__*/_react["default"].createElement(CustomToolbar, {
243
- node: node,
244
- value: value,
245
- onToolbarDone: this.onToolbarDone,
246
- onDataChange: handleDataChange,
247
- pluginProps: pluginProps
248
- }) : /*#__PURE__*/_react["default"].createElement(_defaultToolbar["default"], {
249
- plugins: filteredPlugins,
250
- pluginProps: pluginProps,
251
- value: value,
252
- onChange: onChange,
253
- getFocusedValue: getFocusedValue,
254
- showDone: defaultToolbarShowDone,
255
- onDone: handleDone,
256
- deletable: deletable
257
- }), /*#__PURE__*/_react["default"].createElement("div", {
258
- className: classes.shared
259
- }, deletable && /*#__PURE__*/_react["default"].createElement(_IconButton["default"], {
260
- "aria-label": "Delete",
261
- className: classes.iconRoot,
262
- onMouseDown: function onMouseDown(e) {
263
- return _this2.onDeleteMouseDown(e, plugin, node, value, onChange);
264
- },
265
- classes: {
266
- root: classes.iconRoot
267
- }
268
- }, /*#__PURE__*/_react["default"].createElement(_Delete["default"], null)), customToolbarShowDone && /*#__PURE__*/_react["default"].createElement(_doneButton.DoneButton, {
269
- onClick: handleDone
270
- })));
271
- }
272
- }]);
273
- return Toolbar;
274
- }(_react["default"].Component);
275
-
276
- exports.Toolbar = Toolbar;
277
- (0, _defineProperty2["default"])(Toolbar, "propTypes", {
278
- zIndex: _propTypes["default"].number,
279
- value: _slatePropTypes["default"].value.isRequired,
280
- plugins: _propTypes["default"].array,
281
- plugin: _propTypes["default"].object,
282
- onImageClick: _propTypes["default"].func,
283
- onDone: _propTypes["default"].func.isRequired,
284
- toolbarRef: _propTypes["default"].func.isRequired,
285
- classes: _propTypes["default"].object.isRequired,
286
- isFocused: _propTypes["default"].bool,
287
- autoWidth: _propTypes["default"].bool,
288
- onChange: _propTypes["default"].func.isRequired,
289
- getFocusedValue: _propTypes["default"].func.isRequired,
290
- pluginProps: _propTypes["default"].object,
291
- toolbarOpts: _propTypes["default"].shape({
292
- position: _propTypes["default"].oneOf(['bottom', 'top']),
293
- alignment: _propTypes["default"].oneOf(['left', 'right']),
294
- alwaysVisible: _propTypes["default"].bool,
295
- ref: _propTypes["default"].func,
296
- showDone: _propTypes["default"].bool
297
- }),
298
- onDataChange: _propTypes["default"].func
299
- });
300
75
  var style = {
301
76
  toolbar: {
302
77
  position: 'absolute',
@@ -343,9 +118,248 @@ var style = {
343
118
  }
344
119
  };
345
120
 
121
+ var Toolbar = function Toolbar(props) {
122
+ var _classNames;
123
+
124
+ (0, _react.useEffect)(function () {
125
+ return function () {
126
+ return (0, _characters.removeDialogs)();
127
+ };
128
+ }, []);
129
+
130
+ var hasMark = function hasMark(type) {
131
+ var value = props.value;
132
+ return value.marks.some(function (mark) {
133
+ return mark.type === type;
134
+ });
135
+ };
136
+
137
+ var hasBlock = function hasBlock(type) {
138
+ var value = props.value;
139
+ return value.blocks.some(function (node) {
140
+ return node.type === type;
141
+ });
142
+ };
143
+
144
+ var onToggle = function onToggle(plugin) {
145
+ var value = props.value,
146
+ onChange = props.onChange;
147
+ if (!plugin.onToggle) return;
148
+ var change = plugin.onToggle(value.change());
149
+ onChange(change);
150
+ };
151
+
152
+ var onClick = function onClick(e) {
153
+ log('[onClick]');
154
+ e.preventDefault();
155
+ };
156
+
157
+ var onButtonClick = function onButtonClick(fn) {
158
+ return function (e) {
159
+ e.preventDefault();
160
+ fn();
161
+ };
162
+ };
163
+
164
+ var onToolbarDone = function onToolbarDone(change, finishEditing) {
165
+ log('[onToolbarDone] change: ', change, 'finishEditing: ', finishEditing);
166
+ var onChange = props.onChange,
167
+ onDone = props.onDone;
168
+
169
+ if (change) {
170
+ onChange(change, function () {
171
+ if (finishEditing) {
172
+ onDone();
173
+ }
174
+ });
175
+ } else {
176
+ if (finishEditing) {
177
+ log('[onToolbarChange] call onDone');
178
+ onDone();
179
+ }
180
+ }
181
+ };
182
+
183
+ var onDeleteClick = (0, _debounce["default"])(function (e, plugin, node, value, onChange) {
184
+ return plugin.deleteNode(e, node, value, onChange);
185
+ }, 500);
186
+
187
+ var onDeleteMouseDown = function onDeleteMouseDown(e, plugin, node, value, onChange) {
188
+ e.persist();
189
+ onDeleteClick(e, plugin, node, value, onChange);
190
+ };
191
+
192
+ var classes = props.classes,
193
+ plugins = props.plugins,
194
+ pluginProps = props.pluginProps,
195
+ toolbarOpts = props.toolbarOpts,
196
+ value = props.value,
197
+ autoWidth = props.autoWidth,
198
+ onChange = props.onChange,
199
+ getFocusedValue = props.getFocusedValue,
200
+ isFocused = props.isFocused,
201
+ onDone = props.onDone,
202
+ toolbarRef = props.toolbarRef;
203
+ var editor = (0, _slateReact.useSlate)();
204
+ var selection = (0, _slateReact.useSlateSelection)();
205
+
206
+ var getNode = function getNode(editor, selection, depth) {
207
+ if (!selection) {
208
+ return null;
209
+ }
210
+
211
+ var _Editor$node = _slate.Editor.node(editor, selection, depth ? {
212
+ depth: depth
213
+ } : undefined),
214
+ _Editor$node2 = (0, _slicedToArray2["default"])(_Editor$node, 2),
215
+ node = _Editor$node2[0],
216
+ path = _Editor$node2[1];
217
+
218
+ if (!node) {
219
+ return null;
220
+ }
221
+
222
+ if (!_slate.Text.isText(node)) {
223
+ return [node, path];
224
+ }
225
+
226
+ return getNode(editor, selection, path.length - 1);
227
+ };
228
+
229
+ var getParentNode = function getParentNode(editor, path) {
230
+ return Array.isArray(path) && path.length > 0 && _slate.Editor.parent(editor, path);
231
+ };
232
+
233
+ var _ref = getNode(editor, selection) || [],
234
+ _ref2 = (0, _slicedToArray2["default"])(_ref, 2),
235
+ node = _ref2[0],
236
+ nodePath = _ref2[1];
237
+
238
+ var _ref3 = getParentNode(editor, nodePath) || [],
239
+ _ref4 = (0, _slicedToArray2["default"])(_ref3, 1),
240
+ parentNode = _ref4[0];
241
+
242
+ log(' --------------> [render] node: ', node);
243
+ log('[render] node: ', node);
244
+ var plugin = plugins.find(function (p) {
245
+ if (!node) {
246
+ return;
247
+ }
248
+
249
+ if (p.toolbar) {
250
+ return p.supports && p.supports(node, editor, value);
251
+ }
252
+ });
253
+ var parentPlugin = plugins.find(function (p) {
254
+ if (!parentNode) {
255
+ return;
256
+ }
257
+
258
+ if (p.toolbar) {
259
+ return p.supports && p.supports(parentNode, editor, value);
260
+ }
261
+ });
262
+ log('[render] plugin: ', plugin);
263
+
264
+ var handleDone = function handleDone(editor) {
265
+ var handler = onDone;
266
+
267
+ if (plugin && plugin.toolbar && plugin.toolbar.customToolbar) {
268
+ handler = onToolbarDone;
269
+ }
270
+
271
+ handler(editor);
272
+
273
+ if (parentPlugin && parentPlugin.handleDone) {
274
+ parentPlugin.handleDone(editor, node, plugin);
275
+ }
276
+ };
277
+
278
+ var CustomToolbar = getCustomToolbar(plugin, node, value, editor, handleDone);
279
+ var filteredPlugins = plugin && plugin.filterPlugins ? plugin.filterPlugins(node, plugins) : plugins;
280
+ log('[render] CustomToolbar: ', CustomToolbar);
281
+ var parentExtraStyles = parentPlugin && parentPlugin.pluginStyles ? parentPlugin.pluginStyles(node, parentNode, plugin) : {};
282
+ var pluginExtraStyles = plugin && plugin.pluginStyles ? plugin.pluginStyles(node, parentNode, plugin) : {};
283
+
284
+ var extraStyles = _objectSpread(_objectSpread({}, pluginExtraStyles), parentExtraStyles);
285
+
286
+ var deletable = node && plugin && typeof plugin.deleteNode === 'function';
287
+ var customToolbarShowDone = node && plugin && plugin.toolbar && plugin.toolbar.showDone && !toolbarOpts.alwaysVisible; // If there is a toolbarOpts we check if the showDone is not equal to false
288
+
289
+ var defaultToolbarShowDone = !toolbarOpts || toolbarOpts.showDone !== false;
290
+ var hasDoneButton = defaultToolbarShowDone || customToolbarShowDone;
291
+ var names = (0, _classnames["default"])(classes.toolbar, (_classNames = {}, (0, _defineProperty2["default"])(_classNames, classes.toolbarWithNoDone, !hasDoneButton), (0, _defineProperty2["default"])(_classNames, classes.toolbarTop, toolbarOpts.position === 'top'), (0, _defineProperty2["default"])(_classNames, classes.toolbarRight, toolbarOpts.alignment === 'right'), (0, _defineProperty2["default"])(_classNames, classes.focused, toolbarOpts.alwaysVisible || isFocused), (0, _defineProperty2["default"])(_classNames, classes.autoWidth, autoWidth), (0, _defineProperty2["default"])(_classNames, classes.fullWidth, !autoWidth), _classNames));
292
+ return /*#__PURE__*/_react["default"].createElement("div", {
293
+ className: names,
294
+ style: extraStyles,
295
+ onClick: onClick,
296
+ ref: toolbarRef
297
+ }, CustomToolbar ? /*#__PURE__*/_react["default"].createElement(CustomToolbar, {
298
+ editor: editor,
299
+ node: node,
300
+ nodePath: nodePath,
301
+ value: value,
302
+ onToolbarDone: onToolbarDone,
303
+ pluginProps: pluginProps
304
+ }) : /*#__PURE__*/_react["default"].createElement(_defaultToolbar["default"], {
305
+ editor: editor,
306
+ nodePath: nodePath,
307
+ plugins: filteredPlugins,
308
+ pluginProps: pluginProps,
309
+ value: value,
310
+ onChange: onChange,
311
+ getFocusedValue: getFocusedValue,
312
+ showDone: defaultToolbarShowDone,
313
+ onDone: handleDone,
314
+ deletable: deletable
315
+ }), /*#__PURE__*/_react["default"].createElement("div", {
316
+ className: classes.shared
317
+ }, deletable && /*#__PURE__*/_react["default"].createElement(_IconButton["default"], {
318
+ "aria-label": "Delete",
319
+ className: classes.iconRoot,
320
+ onMouseDown: function onMouseDown(e) {
321
+ return onDeleteMouseDown(e, plugin, node, value, onChange);
322
+ },
323
+ classes: {
324
+ root: classes.iconRoot
325
+ }
326
+ }, /*#__PURE__*/_react["default"].createElement(_Delete["default"], null)), customToolbarShowDone && /*#__PURE__*/_react["default"].createElement(_doneButton.DoneButton, {
327
+ onClick: handleDone
328
+ })));
329
+ };
330
+
331
+ exports.Toolbar = Toolbar;
332
+ Toolbar.propTypes = {
333
+ editor: _propTypes["default"].object.isRequired,
334
+ zIndex: _propTypes["default"].number,
335
+ value: _propTypes["default"].arrayOf(_propTypes["default"].shape({
336
+ type: _propTypes["default"].string,
337
+ children: _propTypes["default"].array,
338
+ data: _propTypes["default"].object
339
+ })),
340
+ plugins: _propTypes["default"].array,
341
+ plugin: _propTypes["default"].object,
342
+ onImageClick: _propTypes["default"].func,
343
+ onDone: _propTypes["default"].func.isRequired,
344
+ toolbarRef: _propTypes["default"].func.isRequired,
345
+ classes: _propTypes["default"].object.isRequired,
346
+ isFocused: _propTypes["default"].bool,
347
+ autoWidth: _propTypes["default"].bool,
348
+ onChange: _propTypes["default"].func.isRequired,
349
+ getFocusedValue: _propTypes["default"].func.isRequired,
350
+ pluginProps: _propTypes["default"].object,
351
+ toolbarOpts: _propTypes["default"].shape({
352
+ position: _propTypes["default"].oneOf(['bottom', 'top']),
353
+ alignment: _propTypes["default"].oneOf(['left', 'right']),
354
+ alwaysVisible: _propTypes["default"].bool,
355
+ ref: _propTypes["default"].func,
356
+ showDone: _propTypes["default"].bool
357
+ })
358
+ };
359
+
346
360
  var _default = (0, _styles.withStyles)(style, {
347
361
  index: 1000
348
362
  })(Toolbar);
349
363
 
350
364
  exports["default"] = _default;
351
- //# sourceMappingURL=toolbar.js.map
365
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJsb2ciLCJkZWJ1ZyIsImdldEN1c3RvbVRvb2xiYXIiLCJwbHVnaW4iLCJub2RlIiwidmFsdWUiLCJlZGl0b3IiLCJoYW5kbGVEb25lIiwidG9vbGJhciIsIkN1c3RvbVRvb2xiYXJDb21wIiwiY3VzdG9tVG9vbGJhciIsInN0eWxlIiwicG9zaXRpb24iLCJ6SW5kZXgiLCJjdXJzb3IiLCJqdXN0aWZ5Q29udGVudCIsImJhY2tncm91bmQiLCJtaW5XaWR0aCIsIm1hcmdpbiIsInBhZGRpbmciLCJib3hTaGFkb3ciLCJib3hTaXppbmciLCJkaXNwbGF5IiwidG9vbGJhcldpdGhOb0RvbmUiLCJ0b29sYmFyVG9wIiwidG9wIiwidG9vbGJhclJpZ2h0IiwicmlnaHQiLCJmdWxsV2lkdGgiLCJ3aWR0aCIsImF1dG9XaWR0aCIsImZvY3VzZWQiLCJpY29uUm9vdCIsImhlaWdodCIsInZlcnRpY2FsQWxpZ24iLCJsYWJlbCIsImNvbG9yIiwic2hhcmVkIiwiVG9vbGJhciIsInByb3BzIiwidXNlRWZmZWN0IiwicmVtb3ZlQ2hhcmFjdGVyRGlhbG9ncyIsImhhc01hcmsiLCJ0eXBlIiwibWFya3MiLCJzb21lIiwibWFyayIsImhhc0Jsb2NrIiwiYmxvY2tzIiwib25Ub2dnbGUiLCJvbkNoYW5nZSIsImNoYW5nZSIsIm9uQ2xpY2siLCJlIiwicHJldmVudERlZmF1bHQiLCJvbkJ1dHRvbkNsaWNrIiwiZm4iLCJvblRvb2xiYXJEb25lIiwiZmluaXNoRWRpdGluZyIsIm9uRG9uZSIsIm9uRGVsZXRlQ2xpY2siLCJkZWJvdW5jZSIsImRlbGV0ZU5vZGUiLCJvbkRlbGV0ZU1vdXNlRG93biIsInBlcnNpc3QiLCJjbGFzc2VzIiwicGx1Z2lucyIsInBsdWdpblByb3BzIiwidG9vbGJhck9wdHMiLCJnZXRGb2N1c2VkVmFsdWUiLCJpc0ZvY3VzZWQiLCJ0b29sYmFyUmVmIiwidXNlU2xhdGUiLCJzZWxlY3Rpb24iLCJ1c2VTbGF0ZVNlbGVjdGlvbiIsImdldE5vZGUiLCJkZXB0aCIsIkVkaXRvciIsInVuZGVmaW5lZCIsInBhdGgiLCJUZXh0IiwiaXNUZXh0IiwibGVuZ3RoIiwiZ2V0UGFyZW50Tm9kZSIsIkFycmF5IiwiaXNBcnJheSIsInBhcmVudCIsIm5vZGVQYXRoIiwicGFyZW50Tm9kZSIsImZpbmQiLCJwIiwic3VwcG9ydHMiLCJwYXJlbnRQbHVnaW4iLCJoYW5kbGVyIiwiQ3VzdG9tVG9vbGJhciIsImZpbHRlcmVkUGx1Z2lucyIsImZpbHRlclBsdWdpbnMiLCJwYXJlbnRFeHRyYVN0eWxlcyIsInBsdWdpblN0eWxlcyIsInBsdWdpbkV4dHJhU3R5bGVzIiwiZXh0cmFTdHlsZXMiLCJkZWxldGFibGUiLCJjdXN0b21Ub29sYmFyU2hvd0RvbmUiLCJzaG93RG9uZSIsImFsd2F5c1Zpc2libGUiLCJkZWZhdWx0VG9vbGJhclNob3dEb25lIiwiaGFzRG9uZUJ1dHRvbiIsIm5hbWVzIiwiY2xhc3NOYW1lcyIsImFsaWdubWVudCIsInJvb3QiLCJwcm9wVHlwZXMiLCJQcm9wVHlwZXMiLCJvYmplY3QiLCJpc1JlcXVpcmVkIiwibnVtYmVyIiwiYXJyYXlPZiIsInNoYXBlIiwic3RyaW5nIiwiY2hpbGRyZW4iLCJhcnJheSIsImRhdGEiLCJvbkltYWdlQ2xpY2siLCJmdW5jIiwiYm9vbCIsIm9uZU9mIiwicmVmIiwid2l0aFN0eWxlcyIsImluZGV4Il0sInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL3BsdWdpbnMvdG9vbGJhci90b29sYmFyLmpzeCJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgUmVhY3QsIHsgdXNlRWZmZWN0IH0gZnJvbSAncmVhY3QnO1xuaW1wb3J0IHsgQ2hhbmdlLCBFZGl0b3IsIEVsZW1lbnQgYXMgU2xhdGVFbGVtZW50LCBUZXh0LCBOb2RlIH0gZnJvbSAnc2xhdGUnO1xuaW1wb3J0IHsgdXNlU2xhdGUsIHVzZVNsYXRlU2VsZWN0aW9uIH0gZnJvbSBcInNsYXRlLXJlYWN0XCI7XG5pbXBvcnQgRGVsZXRlIGZyb20gJ0BtYXRlcmlhbC11aS9pY29ucy9EZWxldGUnO1xuaW1wb3J0IEljb25CdXR0b24gZnJvbSAnQG1hdGVyaWFsLXVpL2NvcmUvSWNvbkJ1dHRvbic7XG5pbXBvcnQgUHJvcFR5cGVzIGZyb20gJ3Byb3AtdHlwZXMnO1xuaW1wb3J0IGNsYXNzTmFtZXMgZnJvbSAnY2xhc3NuYW1lcyc7XG5pbXBvcnQgZGVidWcgZnJvbSAnZGVidWcnO1xuaW1wb3J0IGRlYm91bmNlIGZyb20gJ2xvZGFzaC9kZWJvdW5jZSc7XG5cbmltcG9ydCB7IERvbmVCdXR0b24gfSBmcm9tICcuL2RvbmUtYnV0dG9uJztcblxuaW1wb3J0IHsgd2l0aFN0eWxlcyB9IGZyb20gJ0BtYXRlcmlhbC11aS9jb3JlL3N0eWxlcyc7XG5pbXBvcnQgRGVmYXVsdFRvb2xiYXIgZnJvbSAnLi9kZWZhdWx0LXRvb2xiYXInO1xuaW1wb3J0IHsgcmVtb3ZlRGlhbG9ncyBhcyByZW1vdmVDaGFyYWN0ZXJEaWFsb2dzIH0gZnJvbSAnLi4vY2hhcmFjdGVycyc7XG5cbmNvbnN0IGxvZyA9IGRlYnVnKCdAcGllLWxpYjplZGl0YWJsZS1odG1sOnBsdWdpbnM6dG9vbGJhcicpO1xuXG5jb25zdCBnZXRDdXN0b21Ub29sYmFyID0gKHBsdWdpbiwgbm9kZSwgdmFsdWUsIGVkaXRvciwgaGFuZGxlRG9uZSkgPT4ge1xuICBpZiAoIXBsdWdpbikge1xuICAgIHJldHVybjtcbiAgfVxuICBpZiAoIXBsdWdpbi50b29sYmFyKSB7XG4gICAgcmV0dXJuO1xuICB9XG4gIGlmIChwbHVnaW4udG9vbGJhci5DdXN0b21Ub29sYmFyQ29tcCkge1xuICAgIC8qKlxuICAgICAqIFVzaW5nIGEgcHJlLWRlZmluZWQgQ29tcG9uZW50IHNob3VsZCBiZSBwcmVmZXJyZWRcbiAgICAgKiBhcyB0aGUgcmVuZGVyaW5nIG9mIGl0IChhbmQgaXQncyBjaGlsZHJlbikgY2FuIGJlIG9wdGltaXplZCBieSBSZWFjdC5cbiAgICAgKiBJZiB5b3Uga2VlcCByZS1kZWZpbmluZyB0aGUgY29tcCB3aXRoIGFuIGlubGluZSBmdW5jdGlvblxuICAgICAqIHRoZW4gcmVhY3Qgd2lsbCBoYXZlIHRvIHJlLXJlbmRlci5cbiAgICAgKi9cbiAgICByZXR1cm4gcGx1Z2luLnRvb2xiYXIuQ3VzdG9tVG9vbGJhckNvbXA7XG4gIH0gZWxzZSBpZiAodHlwZW9mIHBsdWdpbi50b29sYmFyLmN1c3RvbVRvb2xiYXIgPT09ICdmdW5jdGlvbicpIHtcbiAgICBsb2coJ2RlcHJlY2F0ZWQgLSB1c2UgQ3VzdG9tVG9vbGJhckNvbXAnKTtcbiAgICByZXR1cm4gcGx1Z2luLnRvb2xiYXIuY3VzdG9tVG9vbGJhcihub2RlLCB2YWx1ZSwgZWRpdG9yLCBoYW5kbGVEb25lKTtcbiAgfVxufTtcblxuY29uc3Qgc3R5bGUgPSB7XG4gIHRvb2xiYXI6IHtcbiAgICBwb3NpdGlvbjogJ2Fic29sdXRlJyxcbiAgICB6SW5kZXg6IDEwLFxuICAgIGN1cnNvcjogJ3BvaW50ZXInLFxuICAgIGp1c3RpZnlDb250ZW50OiAnc3BhY2UtYmV0d2VlbicsXG4gICAgYmFja2dyb3VuZDogJ3ZhcigtLWVkaXRhYmxlLWh0bWwtdG9vbGJhci1iZywgI2VmZWZlZiknLFxuICAgIG1pbldpZHRoOiAnMjgwcHgnLFxuICAgIG1hcmdpbjogJzVweCAwIDAgMCcsXG4gICAgcGFkZGluZzogJzJweCcsXG4gICAgYm94U2hhZG93OlxuICAgICAgJzBweCAxcHggNXB4IDBweCByZ2JhKDAsIDAsIDAsIDAuMiksIDBweCAycHggMnB4IDBweCByZ2JhKDAsIDAsIDAsIDAuMTQpLCAwcHggM3B4IDFweCAtMnB4IHJnYmEoMCwgMCwgMCwgMC4xMiknLFxuICAgIGJveFNpemluZzogJ2JvcmRlci1ib3gnLFxuICAgIGRpc3BsYXk6ICdub25lJ1xuICB9LFxuICB0b29sYmFyV2l0aE5vRG9uZToge1xuICAgIG1pbldpZHRoOiAnMjY1cHgnXG4gIH0sXG4gIHRvb2xiYXJUb3A6IHtcbiAgICB0b3A6ICctNDVweCdcbiAgfSxcbiAgdG9vbGJhclJpZ2h0OiB7XG4gICAgcmlnaHQ6IDBcbiAgfSxcbiAgZnVsbFdpZHRoOiB7XG4gICAgd2lkdGg6ICcxMDAlJ1xuICB9LFxuICBhdXRvV2lkdGg6IHtcbiAgICB3aWR0aDogJ2F1dG8nXG4gIH0sXG4gIGZvY3VzZWQ6IHtcbiAgICBkaXNwbGF5OiAnZmxleCdcbiAgfSxcbiAgaWNvblJvb3Q6IHtcbiAgICB3aWR0aDogJzI4cHgnLFxuICAgIGhlaWdodDogJzI4cHgnLFxuICAgIHBhZGRpbmc6ICc0cHgnLFxuICAgIHZlcnRpY2FsQWxpZ246ICd0b3AnXG4gIH0sXG4gIGxhYmVsOiB7XG4gICAgY29sb3I6ICd2YXIoLS1lZGl0YWJsZS1odG1sLXRvb2xiYXItY2hlY2ssICMwMGJiMDApJ1xuICB9LFxuICBzaGFyZWQ6IHtcbiAgICBkaXNwbGF5OiAnZmxleCdcbiAgfVxufTtcblxuZXhwb3J0IGNvbnN0IFRvb2xiYXIgPSBwcm9wcyA9PiB7XG4gIHVzZUVmZmVjdCgoKSA9PiB7XG4gICAgcmV0dXJuICgpID0+IHJlbW92ZUNoYXJhY3RlckRpYWxvZ3MoKTtcbiAgfSwgW10pO1xuXG4gIGNvbnN0IGhhc01hcmsgPSB0eXBlID0+IHtcbiAgICBjb25zdCB7IHZhbHVlIH0gPSBwcm9wcztcbiAgICByZXR1cm4gdmFsdWUubWFya3Muc29tZShtYXJrID0+IG1hcmsudHlwZSA9PT0gdHlwZSk7XG4gIH07XG5cbiAgY29uc3QgaGFzQmxvY2sgPSB0eXBlID0+IHtcbiAgICBjb25zdCB7IHZhbHVlIH0gPSBwcm9wcztcbiAgICByZXR1cm4gdmFsdWUuYmxvY2tzLnNvbWUobm9kZSA9PiBub2RlLnR5cGUgPT09IHR5cGUpO1xuICB9O1xuXG4gIGNvbnN0IG9uVG9nZ2xlID0gcGx1Z2luID0+IHtcbiAgICBjb25zdCB7IHZhbHVlLCBvbkNoYW5nZSB9ID0gcHJvcHM7XG5cbiAgICBpZiAoIXBsdWdpbi5vblRvZ2dsZSkgcmV0dXJuO1xuXG4gICAgY29uc3QgY2hhbmdlID0gcGx1Z2luLm9uVG9nZ2xlKHZhbHVlLmNoYW5nZSgpKTtcbiAgICBvbkNoYW5nZShjaGFuZ2UpO1xuICB9O1xuXG4gIGNvbnN0IG9uQ2xpY2sgPSBlID0+IHtcbiAgICBsb2coJ1tvbkNsaWNrXScpO1xuICAgIGUucHJldmVudERlZmF1bHQoKTtcbiAgfTtcblxuICBjb25zdCBvbkJ1dHRvbkNsaWNrID0gZm4gPT4ge1xuICAgIHJldHVybiBlID0+IHtcbiAgICAgIGUucHJldmVudERlZmF1bHQoKTtcbiAgICAgIGZuKCk7XG4gICAgfTtcbiAgfTtcblxuICBjb25zdCBvblRvb2xiYXJEb25lID0gKGNoYW5nZSwgZmluaXNoRWRpdGluZykgPT4ge1xuICAgIGxvZygnW29uVG9vbGJhckRvbmVdIGNoYW5nZTogJywgY2hhbmdlLCAnZmluaXNoRWRpdGluZzogJywgZmluaXNoRWRpdGluZyk7XG4gICAgY29uc3QgeyBvbkNoYW5nZSwgb25Eb25lIH0gPSBwcm9wcztcblxuICAgIGlmIChjaGFuZ2UpIHtcbiAgICAgIG9uQ2hhbmdlKGNoYW5nZSwgKCkgPT4ge1xuICAgICAgICBpZiAoZmluaXNoRWRpdGluZykge1xuICAgICAgICAgIG9uRG9uZSgpO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9IGVsc2Uge1xuICAgICAgaWYgKGZpbmlzaEVkaXRpbmcpIHtcbiAgICAgICAgbG9nKCdbb25Ub29sYmFyQ2hhbmdlXSBjYWxsIG9uRG9uZScpO1xuICAgICAgICBvbkRvbmUoKTtcbiAgICAgIH1cbiAgICB9XG4gIH07XG5cbiAgY29uc3Qgb25EZWxldGVDbGljayA9IGRlYm91bmNlKFxuICAgIChlLCBwbHVnaW4sIG5vZGUsIHZhbHVlLCBvbkNoYW5nZSkgPT4gcGx1Z2luLmRlbGV0ZU5vZGUoZSwgbm9kZSwgdmFsdWUsIG9uQ2hhbmdlKSxcbiAgICA1MDBcbiAgKTtcblxuICBjb25zdCBvbkRlbGV0ZU1vdXNlRG93biA9IChlLCBwbHVnaW4sIG5vZGUsIHZhbHVlLCBvbkNoYW5nZSkgPT4ge1xuICAgIGUucGVyc2lzdCgpO1xuICAgIG9uRGVsZXRlQ2xpY2soZSwgcGx1Z2luLCBub2RlLCB2YWx1ZSwgb25DaGFuZ2UpO1xuICB9O1xuXG4gIGNvbnN0IHtcbiAgICBjbGFzc2VzLFxuICAgIHBsdWdpbnMsXG4gICAgcGx1Z2luUHJvcHMsXG4gICAgdG9vbGJhck9wdHMsXG4gICAgdmFsdWUsXG4gICAgYXV0b1dpZHRoLFxuICAgIG9uQ2hhbmdlLFxuICAgIGdldEZvY3VzZWRWYWx1ZSxcbiAgICBpc0ZvY3VzZWQsXG4gICAgb25Eb25lLFxuICAgIHRvb2xiYXJSZWZcbiAgfSA9IHByb3BzO1xuXG4gIGNvbnN0IGVkaXRvciA9IHVzZVNsYXRlKCk7XG4gIGNvbnN0IHNlbGVjdGlvbiA9IHVzZVNsYXRlU2VsZWN0aW9uKCk7XG4gIGNvbnN0IGdldE5vZGUgPSAoZWRpdG9yLCBzZWxlY3Rpb24sIGRlcHRoKSA9PiB7XG4gICAgaWYgKCFzZWxlY3Rpb24pIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cblxuICAgIGNvbnN0IFtub2RlLCBwYXRoXSA9IEVkaXRvci5ub2RlKGVkaXRvciwgc2VsZWN0aW9uLCBkZXB0aCA/IHsgZGVwdGggfSA6IHVuZGVmaW5lZCk7XG5cbiAgICBpZiAoIW5vZGUpIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cblxuICAgIGlmICghVGV4dC5pc1RleHQobm9kZSkpIHtcbiAgICAgIHJldHVybiBbbm9kZSwgcGF0aF07XG4gICAgfVxuXG4gICAgcmV0dXJuIGdldE5vZGUoZWRpdG9yLCBzZWxlY3Rpb24sIHBhdGgubGVuZ3RoIC0gMSk7XG4gIH07XG4gIGNvbnN0IGdldFBhcmVudE5vZGUgPSAoZWRpdG9yLCBwYXRoKSA9PiBBcnJheS5pc0FycmF5KHBhdGgpICYmIHBhdGgubGVuZ3RoID4gMCAmJiBFZGl0b3IucGFyZW50KGVkaXRvciwgcGF0aCk7XG5cbiAgY29uc3QgW25vZGUsIG5vZGVQYXRoXSA9IGdldE5vZGUoZWRpdG9yLCBzZWxlY3Rpb24pIHx8IFtdO1xuICBjb25zdCBbcGFyZW50Tm9kZV0gPSBnZXRQYXJlbnROb2RlKGVkaXRvciwgbm9kZVBhdGgpIHx8IFtdO1xuXG4gIGxvZygnIC0tLS0tLS0tLS0tLS0tPiBbcmVuZGVyXSBub2RlOiAnLCBub2RlKTtcbiAgbG9nKCdbcmVuZGVyXSBub2RlOiAnLCBub2RlKTtcblxuICBjb25zdCBwbHVnaW4gPSBwbHVnaW5zLmZpbmQocCA9PiB7XG4gICAgaWYgKCFub2RlKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgaWYgKHAudG9vbGJhcikge1xuICAgICAgcmV0dXJuIHAuc3VwcG9ydHMgJiYgcC5zdXBwb3J0cyhub2RlLCBlZGl0b3IsIHZhbHVlKTtcbiAgICB9XG4gIH0pO1xuICBjb25zdCBwYXJlbnRQbHVnaW4gPSBwbHVnaW5zLmZpbmQocCA9PiB7XG4gICAgaWYgKCFwYXJlbnROb2RlKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgaWYgKHAudG9vbGJhcikge1xuICAgICAgcmV0dXJuIHAuc3VwcG9ydHMgJiYgcC5zdXBwb3J0cyhwYXJlbnROb2RlLCBlZGl0b3IsIHZhbHVlKTtcbiAgICB9XG4gIH0pO1xuXG4gIGxvZygnW3JlbmRlcl0gcGx1Z2luOiAnLCBwbHVnaW4pO1xuXG4gIGNvbnN0IGhhbmRsZURvbmUgPSBlZGl0b3IgPT4ge1xuICAgIGxldCBoYW5kbGVyID0gb25Eb25lO1xuXG4gICAgaWYgKHBsdWdpbiAmJiBwbHVnaW4udG9vbGJhciAmJiBwbHVnaW4udG9vbGJhci5jdXN0b21Ub29sYmFyKSB7XG4gICAgICBoYW5kbGVyID0gb25Ub29sYmFyRG9uZTtcbiAgICB9XG5cbiAgICBoYW5kbGVyKGVkaXRvcik7XG5cbiAgICBpZiAocGFyZW50UGx1Z2luICYmIHBhcmVudFBsdWdpbi5oYW5kbGVEb25lKSB7XG4gICAgICBwYXJlbnRQbHVnaW4uaGFuZGxlRG9uZShlZGl0b3IsIG5vZGUsIHBsdWdpbik7XG4gICAgfVxuICB9O1xuXG4gIGNvbnN0IEN1c3RvbVRvb2xiYXIgPSBnZXRDdXN0b21Ub29sYmFyKHBsdWdpbiwgbm9kZSwgdmFsdWUsIGVkaXRvciwgaGFuZGxlRG9uZSk7XG5cbiAgY29uc3QgZmlsdGVyZWRQbHVnaW5zID1cbiAgICBwbHVnaW4gJiYgcGx1Z2luLmZpbHRlclBsdWdpbnMgPyBwbHVnaW4uZmlsdGVyUGx1Z2lucyhub2RlLCBwbHVnaW5zKSA6IHBsdWdpbnM7XG5cbiAgbG9nKCdbcmVuZGVyXSBDdXN0b21Ub29sYmFyOiAnLCBDdXN0b21Ub29sYmFyKTtcbiAgY29uc3QgcGFyZW50RXh0cmFTdHlsZXMgPVxuICAgIHBhcmVudFBsdWdpbiAmJiBwYXJlbnRQbHVnaW4ucGx1Z2luU3R5bGVzXG4gICAgICA/IHBhcmVudFBsdWdpbi5wbHVnaW5TdHlsZXMobm9kZSwgcGFyZW50Tm9kZSwgcGx1Z2luKVxuICAgICAgOiB7fTtcbiAgY29uc3QgcGx1Z2luRXh0cmFTdHlsZXMgPVxuICAgIHBsdWdpbiAmJiBwbHVnaW4ucGx1Z2luU3R5bGVzID8gcGx1Z2luLnBsdWdpblN0eWxlcyhub2RlLCBwYXJlbnROb2RlLCBwbHVnaW4pIDoge307XG4gIGNvbnN0IGV4dHJhU3R5bGVzID0ge1xuICAgIC4uLnBsdWdpbkV4dHJhU3R5bGVzLFxuICAgIC4uLnBhcmVudEV4dHJhU3R5bGVzXG4gIH07XG5cbiAgY29uc3QgZGVsZXRhYmxlID0gbm9kZSAmJiBwbHVnaW4gJiYgdHlwZW9mIHBsdWdpbi5kZWxldGVOb2RlID09PSAnZnVuY3Rpb24nO1xuICBjb25zdCBjdXN0b21Ub29sYmFyU2hvd0RvbmUgPVxuICAgIG5vZGUgJiYgcGx1Z2luICYmIHBsdWdpbi50b29sYmFyICYmIHBsdWdpbi50b29sYmFyLnNob3dEb25lICYmICF0b29sYmFyT3B0cy5hbHdheXNWaXNpYmxlO1xuXG4gIC8vIElmIHRoZXJlIGlzIGEgdG9vbGJhck9wdHMgd2UgY2hlY2sgaWYgdGhlIHNob3dEb25lIGlzIG5vdCBlcXVhbCB0byBmYWxzZVxuICBjb25zdCBkZWZhdWx0VG9vbGJhclNob3dEb25lID0gIXRvb2xiYXJPcHRzIHx8IHRvb2xiYXJPcHRzLnNob3dEb25lICE9PSBmYWxzZTtcblxuICBjb25zdCBoYXNEb25lQnV0dG9uID0gZGVmYXVsdFRvb2xiYXJTaG93RG9uZSB8fCBjdXN0b21Ub29sYmFyU2hvd0RvbmU7XG5cbiAgY29uc3QgbmFtZXMgPSBjbGFzc05hbWVzKGNsYXNzZXMudG9vbGJhciwge1xuICAgIFtjbGFzc2VzLnRvb2xiYXJXaXRoTm9Eb25lXTogIWhhc0RvbmVCdXR0b24sXG4gICAgW2NsYXNzZXMudG9vbGJhclRvcF06IHRvb2xiYXJPcHRzLnBvc2l0aW9uID09PSAndG9wJyxcbiAgICBbY2xhc3Nlcy50b29sYmFyUmlnaHRdOiB0b29sYmFyT3B0cy5hbGlnbm1lbnQgPT09ICdyaWdodCcsXG4gICAgW2NsYXNzZXMuZm9jdXNlZF06IHRvb2xiYXJPcHRzLmFsd2F5c1Zpc2libGUgfHwgaXNGb2N1c2VkLFxuICAgIFtjbGFzc2VzLmF1dG9XaWR0aF06IGF1dG9XaWR0aCxcbiAgICBbY2xhc3Nlcy5mdWxsV2lkdGhdOiAhYXV0b1dpZHRoXG4gIH0pO1xuXG4gIHJldHVybiAoXG4gICAgPGRpdiBjbGFzc05hbWU9e25hbWVzfSBzdHlsZT17ZXh0cmFTdHlsZXN9IG9uQ2xpY2s9e29uQ2xpY2t9IHJlZj17dG9vbGJhclJlZn0+XG4gICAgICB7Q3VzdG9tVG9vbGJhciA/IChcbiAgICAgICAgPEN1c3RvbVRvb2xiYXJcbiAgICAgICAgICBlZGl0b3I9e2VkaXRvcn1cbiAgICAgICAgICBub2RlPXtub2RlfVxuICAgICAgICAgIG5vZGVQYXRoPXtub2RlUGF0aH1cbiAgICAgICAgICB2YWx1ZT17dmFsdWV9XG4gICAgICAgICAgb25Ub29sYmFyRG9uZT17b25Ub29sYmFyRG9uZX1cbiAgICAgICAgICBwbHVnaW5Qcm9wcz17cGx1Z2luUHJvcHN9XG4gICAgICAgIC8+XG4gICAgICApIDogKFxuICAgICAgICA8RGVmYXVsdFRvb2xiYXJcbiAgICAgICAgICBlZGl0b3I9e2VkaXRvcn1cbiAgICAgICAgICBub2RlUGF0aD17bm9kZVBhdGh9XG4gICAgICAgICAgcGx1Z2lucz17ZmlsdGVyZWRQbHVnaW5zfVxuICAgICAgICAgIHBsdWdpblByb3BzPXtwbHVnaW5Qcm9wc31cbiAgICAgICAgICB2YWx1ZT17dmFsdWV9XG4gICAgICAgICAgb25DaGFuZ2U9e29uQ2hhbmdlfVxuICAgICAgICAgIGdldEZvY3VzZWRWYWx1ZT17Z2V0Rm9jdXNlZFZhbHVlfVxuICAgICAgICAgIHNob3dEb25lPXtkZWZhdWx0VG9vbGJhclNob3dEb25lfVxuICAgICAgICAgIG9uRG9uZT17aGFuZGxlRG9uZX1cbiAgICAgICAgICBkZWxldGFibGU9e2RlbGV0YWJsZX1cbiAgICAgICAgLz5cbiAgICAgICl9XG5cbiAgICAgIDxkaXYgY2xhc3NOYW1lPXtjbGFzc2VzLnNoYXJlZH0+XG4gICAgICAgIHtkZWxldGFibGUgJiYgKFxuICAgICAgICAgIDxJY29uQnV0dG9uXG4gICAgICAgICAgICBhcmlhLWxhYmVsPVwiRGVsZXRlXCJcbiAgICAgICAgICAgIGNsYXNzTmFtZT17Y2xhc3Nlcy5pY29uUm9vdH1cbiAgICAgICAgICAgIG9uTW91c2VEb3duPXtlID0+IG9uRGVsZXRlTW91c2VEb3duKGUsIHBsdWdpbiwgbm9kZSwgdmFsdWUsIG9uQ2hhbmdlKX1cbiAgICAgICAgICAgIGNsYXNzZXM9e3tcbiAgICAgICAgICAgICAgcm9vdDogY2xhc3Nlcy5pY29uUm9vdFxuICAgICAgICAgICAgfX1cbiAgICAgICAgICA+XG4gICAgICAgICAgICA8RGVsZXRlIC8+XG4gICAgICAgICAgPC9JY29uQnV0dG9uPlxuICAgICAgICApfVxuICAgICAgICB7Y3VzdG9tVG9vbGJhclNob3dEb25lICYmIDxEb25lQnV0dG9uIG9uQ2xpY2s9e2hhbmRsZURvbmV9IC8+fVxuICAgICAgPC9kaXY+XG4gICAgPC9kaXY+XG4gICk7XG59O1xuXG5Ub29sYmFyLnByb3BUeXBlcyA9IHtcbiAgZWRpdG9yOiBQcm9wVHlwZXMub2JqZWN0LmlzUmVxdWlyZWQsXG4gIHpJbmRleDogUHJvcFR5cGVzLm51bWJlcixcbiAgdmFsdWU6IFByb3BUeXBlcy5hcnJheU9mKFxuICAgIFByb3BUeXBlcy5zaGFwZSh7XG4gICAgICB0eXBlOiBQcm9wVHlwZXMuc3RyaW5nLFxuICAgICAgY2hpbGRyZW46IFByb3BUeXBlcy5hcnJheSxcbiAgICAgIGRhdGE6IFByb3BUeXBlcy5vYmplY3RcbiAgICB9KVxuICApLFxuICBwbHVnaW5zOiBQcm9wVHlwZXMuYXJyYXksXG4gIHBsdWdpbjogUHJvcFR5cGVzLm9iamVjdCxcbiAgb25JbWFnZUNsaWNrOiBQcm9wVHlwZXMuZnVuYyxcbiAgb25Eb25lOiBQcm9wVHlwZXMuZnVuYy5pc1JlcXVpcmVkLFxuICB0b29sYmFyUmVmOiBQcm9wVHlwZXMuZnVuYy5pc1JlcXVpcmVkLFxuICBjbGFzc2VzOiBQcm9wVHlwZXMub2JqZWN0LmlzUmVxdWlyZWQsXG4gIGlzRm9jdXNlZDogUHJvcFR5cGVzLmJvb2wsXG4gIGF1dG9XaWR0aDogUHJvcFR5cGVzLmJvb2wsXG4gIG9uQ2hhbmdlOiBQcm9wVHlwZXMuZnVuYy5pc1JlcXVpcmVkLFxuICBnZXRGb2N1c2VkVmFsdWU6IFByb3BUeXBlcy5mdW5jLmlzUmVxdWlyZWQsXG4gIHBsdWdpblByb3BzOiBQcm9wVHlwZXMub2JqZWN0LFxuICB0b29sYmFyT3B0czogUHJvcFR5cGVzLnNoYXBlKHtcbiAgICBwb3NpdGlvbjogUHJvcFR5cGVzLm9uZU9mKFsnYm90dG9tJywgJ3RvcCddKSxcbiAgICBhbGlnbm1lbnQ6IFByb3BUeXBlcy5vbmVPZihbJ2xlZnQnLCAncmlnaHQnXSksXG4gICAgYWx3YXlzVmlzaWJsZTogUHJvcFR5cGVzLmJvb2wsXG4gICAgcmVmOiBQcm9wVHlwZXMuZnVuYyxcbiAgICBzaG93RG9uZTogUHJvcFR5cGVzLmJvb2xcbiAgfSlcbn07XG5cbmV4cG9ydCBkZWZhdWx0IHdpdGhTdHlsZXMoc3R5bGUsIHsgaW5kZXg6IDEwMDAgfSkoVG9vbGJhcik7XG4iXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7OztBQUFBOztB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