@atlaskit/editor-common 76.33.2 → 76.35.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/CHANGELOG.md +54 -0
- package/dist/cjs/collab/index.js +27 -2
- package/dist/cjs/core-utils/document-logger.js +171 -0
- package/dist/cjs/core-utils/index.js +8 -1
- package/dist/cjs/extensibility/Extension/Extension/index.js +151 -0
- package/dist/cjs/extensibility/Extension/Extension/styles.js +17 -0
- package/dist/cjs/extensibility/Extension/InlineExtension/index.js +50 -0
- package/dist/cjs/extensibility/Extension/InlineExtension/styles.js +12 -0
- package/dist/cjs/extensibility/Extension/Lozenge.js +95 -0
- package/dist/cjs/extensibility/Extension/styles.js +30 -0
- package/dist/cjs/extensibility/Extension.js +79 -0
- package/dist/cjs/extensibility/ExtensionComponent.js +252 -0
- package/dist/cjs/extensibility/ExtensionNodeWrapper.js +21 -0
- package/dist/cjs/extensibility/MultiBodiedExtension/index.js +264 -0
- package/dist/cjs/extensibility/extensionNodeView.js +91 -0
- package/dist/cjs/extensibility/index.js +42 -0
- package/dist/cjs/extensibility/types.js +5 -0
- package/dist/cjs/media-inline/media-inline-image-card.js +24 -19
- package/dist/cjs/monitoring/error.js +3 -2
- package/dist/cjs/ui/DropList/index.js +1 -1
- package/dist/cjs/utils/index.js +7 -0
- package/dist/cjs/utils/insert-node-into-ordered-list.js +91 -0
- package/dist/es2019/collab/index.js +54 -1
- package/dist/es2019/core-utils/document-logger.js +161 -0
- package/dist/es2019/core-utils/index.js +2 -1
- package/dist/es2019/extensibility/Extension/Extension/index.js +155 -0
- package/dist/es2019/extensibility/Extension/Extension/styles.js +42 -0
- package/dist/es2019/extensibility/Extension/InlineExtension/index.js +26 -0
- package/dist/es2019/extensibility/Extension/InlineExtension/styles.js +26 -0
- package/dist/es2019/extensibility/Extension/Lozenge.js +71 -0
- package/dist/es2019/extensibility/Extension/styles.js +62 -0
- package/dist/es2019/extensibility/Extension.js +52 -0
- package/dist/es2019/extensibility/ExtensionComponent.js +204 -0
- package/dist/es2019/extensibility/ExtensionNodeWrapper.js +13 -0
- package/dist/es2019/extensibility/MultiBodiedExtension/index.js +283 -0
- package/dist/es2019/extensibility/extensionNodeView.js +62 -0
- package/dist/es2019/extensibility/index.js +4 -0
- package/dist/es2019/extensibility/types.js +1 -0
- package/dist/es2019/media-inline/media-inline-image-card.js +24 -19
- package/dist/es2019/monitoring/error.js +3 -2
- package/dist/es2019/ui/DropList/index.js +1 -1
- package/dist/es2019/utils/index.js +1 -0
- package/dist/es2019/utils/insert-node-into-ordered-list.js +84 -0
- package/dist/esm/collab/index.js +23 -1
- package/dist/esm/core-utils/document-logger.js +165 -0
- package/dist/esm/core-utils/index.js +2 -1
- package/dist/esm/extensibility/Extension/Extension/index.js +146 -0
- package/dist/esm/extensibility/Extension/Extension/styles.js +10 -0
- package/dist/esm/extensibility/Extension/InlineExtension/index.js +43 -0
- package/dist/esm/extensibility/Extension/InlineExtension/styles.js +5 -0
- package/dist/esm/extensibility/Extension/Lozenge.js +90 -0
- package/dist/esm/extensibility/Extension/styles.js +11 -0
- package/dist/esm/extensibility/Extension.js +69 -0
- package/dist/esm/extensibility/ExtensionComponent.js +243 -0
- package/dist/esm/extensibility/ExtensionNodeWrapper.js +14 -0
- package/dist/esm/extensibility/MultiBodiedExtension/index.js +257 -0
- package/dist/esm/extensibility/extensionNodeView.js +83 -0
- package/dist/esm/extensibility/index.js +4 -0
- package/dist/esm/extensibility/types.js +1 -0
- package/dist/esm/media-inline/media-inline-image-card.js +24 -19
- package/dist/esm/monitoring/error.js +3 -2
- package/dist/esm/ui/DropList/index.js +1 -1
- package/dist/esm/utils/index.js +1 -0
- package/dist/esm/utils/insert-node-into-ordered-list.js +84 -0
- package/dist/types/collab/index.d.ts +7 -0
- package/dist/types/core-utils/document-logger.d.ts +6 -0
- package/dist/types/core-utils/index.d.ts +1 -0
- package/dist/types/extensibility/Extension/Extension/index.d.ts +108 -0
- package/dist/types/extensibility/Extension/Extension/styles.d.ts +5 -0
- package/dist/types/extensibility/Extension/InlineExtension/index.d.ts +12 -0
- package/dist/types/extensibility/Extension/InlineExtension/styles.d.ts +1 -0
- package/dist/types/extensibility/Extension/Lozenge.d.ts +14 -0
- package/dist/types/extensibility/Extension/styles.d.ts +7 -0
- package/dist/types/extensibility/Extension.d.ts +29 -0
- package/dist/types/extensibility/ExtensionComponent.d.ts +53 -0
- package/dist/types/extensibility/ExtensionNodeWrapper.d.ts +14 -0
- package/dist/types/extensibility/MultiBodiedExtension/index.d.ts +26 -0
- package/dist/types/extensibility/extensionNodeView.d.ts +31 -0
- package/dist/types/extensibility/index.d.ts +4 -0
- package/dist/types/extensibility/types.d.ts +6 -0
- package/dist/types/extensions/types/extension-handler.d.ts +2 -0
- package/dist/types/media-inline/media-inline-image-card.d.ts +3 -2
- package/dist/types/media-inline/types.d.ts +6 -2
- package/dist/types/types/index.d.ts +1 -1
- package/dist/types/types/next-editor-plugin.d.ts +0 -1
- package/dist/types/ui/DropList/index.d.ts +1 -1
- package/dist/types/ui-menu/ColorPickerButton/index.d.ts +1 -1
- package/dist/types/ui-menu/ToolbarButton/index.d.ts +1 -1
- package/dist/types/utils/index.d.ts +1 -0
- package/dist/types/utils/insert-node-into-ordered-list.d.ts +3 -0
- package/dist/types-ts4.5/collab/index.d.ts +7 -0
- package/dist/types-ts4.5/core-utils/document-logger.d.ts +6 -0
- package/dist/types-ts4.5/core-utils/index.d.ts +1 -0
- package/dist/types-ts4.5/extensibility/Extension/Extension/index.d.ts +108 -0
- package/dist/types-ts4.5/extensibility/Extension/Extension/styles.d.ts +5 -0
- package/dist/types-ts4.5/extensibility/Extension/InlineExtension/index.d.ts +12 -0
- package/dist/types-ts4.5/extensibility/Extension/InlineExtension/styles.d.ts +1 -0
- package/dist/types-ts4.5/extensibility/Extension/Lozenge.d.ts +14 -0
- package/dist/types-ts4.5/extensibility/Extension/styles.d.ts +7 -0
- package/dist/types-ts4.5/extensibility/Extension.d.ts +29 -0
- package/dist/types-ts4.5/extensibility/ExtensionComponent.d.ts +53 -0
- package/dist/types-ts4.5/extensibility/ExtensionNodeWrapper.d.ts +14 -0
- package/dist/types-ts4.5/extensibility/MultiBodiedExtension/index.d.ts +26 -0
- package/dist/types-ts4.5/extensibility/extensionNodeView.d.ts +31 -0
- package/dist/types-ts4.5/extensibility/index.d.ts +4 -0
- package/dist/types-ts4.5/extensibility/types.d.ts +8 -0
- package/dist/types-ts4.5/extensions/types/extension-handler.d.ts +2 -0
- package/dist/types-ts4.5/media-inline/media-inline-image-card.d.ts +3 -2
- package/dist/types-ts4.5/media-inline/types.d.ts +6 -2
- package/dist/types-ts4.5/types/index.d.ts +1 -1
- package/dist/types-ts4.5/types/next-editor-plugin.d.ts +0 -3
- package/dist/types-ts4.5/ui/DropList/index.d.ts +1 -1
- package/dist/types-ts4.5/ui-menu/ColorPickerButton/index.d.ts +1 -1
- package/dist/types-ts4.5/ui-menu/ToolbarButton/index.d.ts +1 -1
- package/dist/types-ts4.5/utils/index.d.ts +1 -0
- package/dist/types-ts4.5/utils/insert-node-into-ordered-list.d.ts +3 -0
- package/extensibility/package.json +15 -0
- package/package.json +6 -5
|
@@ -0,0 +1,243 @@
|
|
|
1
|
+
import _asyncToGenerator from "@babel/runtime/helpers/asyncToGenerator";
|
|
2
|
+
import _classCallCheck from "@babel/runtime/helpers/classCallCheck";
|
|
3
|
+
import _createClass from "@babel/runtime/helpers/createClass";
|
|
4
|
+
import _assertThisInitialized from "@babel/runtime/helpers/assertThisInitialized";
|
|
5
|
+
import _inherits from "@babel/runtime/helpers/inherits";
|
|
6
|
+
import _possibleConstructorReturn from "@babel/runtime/helpers/possibleConstructorReturn";
|
|
7
|
+
import _getPrototypeOf from "@babel/runtime/helpers/getPrototypeOf";
|
|
8
|
+
import _defineProperty from "@babel/runtime/helpers/defineProperty";
|
|
9
|
+
import _regeneratorRuntime from "@babel/runtime/regenerator";
|
|
10
|
+
function _createSuper(Derived) { var hasNativeReflectConstruct = _isNativeReflectConstruct(); return function _createSuperInternal() { var Super = _getPrototypeOf(Derived), result; if (hasNativeReflectConstruct) { var NewTarget = _getPrototypeOf(this).constructor; result = Reflect.construct(Super, arguments, NewTarget); } else { result = Super.apply(this, arguments); } return _possibleConstructorReturn(this, result); }; }
|
|
11
|
+
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; } }
|
|
12
|
+
import React from 'react';
|
|
13
|
+
import { Component } from 'react';
|
|
14
|
+
import memoizeOne from 'memoize-one';
|
|
15
|
+
import { getExtensionModuleNodePrivateProps, getNodeRenderer } from '../extensions';
|
|
16
|
+
import { getExtensionRenderer } from '../utils';
|
|
17
|
+
import Extension from './Extension/Extension';
|
|
18
|
+
import InlineExtension from './Extension/InlineExtension';
|
|
19
|
+
import MultiBodiedExtension from './MultiBodiedExtension';
|
|
20
|
+
export var ExtensionComponent = /*#__PURE__*/function (_Component) {
|
|
21
|
+
_inherits(ExtensionComponent, _Component);
|
|
22
|
+
var _super = _createSuper(ExtensionComponent);
|
|
23
|
+
function ExtensionComponent() {
|
|
24
|
+
var _this;
|
|
25
|
+
_classCallCheck(this, ExtensionComponent);
|
|
26
|
+
for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) {
|
|
27
|
+
args[_key] = arguments[_key];
|
|
28
|
+
}
|
|
29
|
+
_this = _super.call.apply(_super, [this].concat(args));
|
|
30
|
+
_defineProperty(_assertThisInitialized(_this), "privatePropsParsed", false);
|
|
31
|
+
_defineProperty(_assertThisInitialized(_this), "state", {});
|
|
32
|
+
_defineProperty(_assertThisInitialized(_this), "mounted", false);
|
|
33
|
+
// memoized to avoid rerender on extension state changes
|
|
34
|
+
_defineProperty(_assertThisInitialized(_this), "getNodeRenderer", memoizeOne(getNodeRenderer));
|
|
35
|
+
_defineProperty(_assertThisInitialized(_this), "getExtensionModuleNodePrivateProps", memoizeOne(getExtensionModuleNodePrivateProps));
|
|
36
|
+
_defineProperty(_assertThisInitialized(_this), "setStateFromPromise", function (stateKey, promise) {
|
|
37
|
+
promise && promise.then(function (p) {
|
|
38
|
+
if (!_this.mounted) {
|
|
39
|
+
return;
|
|
40
|
+
}
|
|
41
|
+
_this.setState(_defineProperty({}, stateKey, p));
|
|
42
|
+
});
|
|
43
|
+
});
|
|
44
|
+
/**
|
|
45
|
+
* Parses any private nodes once an extension provider is available.
|
|
46
|
+
*
|
|
47
|
+
* We do this separately from resolving a node renderer component since the
|
|
48
|
+
* private props come from extension provider, rather than an extension
|
|
49
|
+
* handler which only handles `render`/component concerns.
|
|
50
|
+
*/
|
|
51
|
+
_defineProperty(_assertThisInitialized(_this), "parsePrivateNodePropsIfNeeded", /*#__PURE__*/_asyncToGenerator( /*#__PURE__*/_regeneratorRuntime.mark(function _callee() {
|
|
52
|
+
var _this$props$node$attr, extensionType, extensionKey, privateProps;
|
|
53
|
+
return _regeneratorRuntime.wrap(function _callee$(_context) {
|
|
54
|
+
while (1) switch (_context.prev = _context.next) {
|
|
55
|
+
case 0:
|
|
56
|
+
if (!(_this.privatePropsParsed || !_this.state.extensionProvider)) {
|
|
57
|
+
_context.next = 2;
|
|
58
|
+
break;
|
|
59
|
+
}
|
|
60
|
+
return _context.abrupt("return");
|
|
61
|
+
case 2:
|
|
62
|
+
_this.privatePropsParsed = true;
|
|
63
|
+
_this$props$node$attr = _this.props.node.attrs, extensionType = _this$props$node$attr.extensionType, extensionKey = _this$props$node$attr.extensionKey;
|
|
64
|
+
/**
|
|
65
|
+
* getExtensionModuleNodePrivateProps can throw if there are issues in the
|
|
66
|
+
* manifest
|
|
67
|
+
*/
|
|
68
|
+
_context.prev = 4;
|
|
69
|
+
_context.next = 7;
|
|
70
|
+
return _this.getExtensionModuleNodePrivateProps(_this.state.extensionProvider, extensionType, extensionKey);
|
|
71
|
+
case 7:
|
|
72
|
+
privateProps = _context.sent;
|
|
73
|
+
_this.setState({
|
|
74
|
+
_privateProps: privateProps
|
|
75
|
+
});
|
|
76
|
+
_context.next = 14;
|
|
77
|
+
break;
|
|
78
|
+
case 11:
|
|
79
|
+
_context.prev = 11;
|
|
80
|
+
_context.t0 = _context["catch"](4);
|
|
81
|
+
// eslint-disable-next-line no-console
|
|
82
|
+
console.error('Provided extension handler has thrown an error\n', _context.t0);
|
|
83
|
+
/** We don't want this error to block renderer */
|
|
84
|
+
/** We keep rendering the default content */
|
|
85
|
+
case 14:
|
|
86
|
+
case "end":
|
|
87
|
+
return _context.stop();
|
|
88
|
+
}
|
|
89
|
+
}, _callee, null, [[4, 11]]);
|
|
90
|
+
})));
|
|
91
|
+
_defineProperty(_assertThisInitialized(_this), "handleExtension", function (pmNode, actions) {
|
|
92
|
+
var _pmNode$marks;
|
|
93
|
+
var _this$props = _this.props,
|
|
94
|
+
extensionHandlers = _this$props.extensionHandlers,
|
|
95
|
+
editorView = _this$props.editorView;
|
|
96
|
+
var _pmNode$attrs = pmNode.attrs,
|
|
97
|
+
extensionType = _pmNode$attrs.extensionType,
|
|
98
|
+
extensionKey = _pmNode$attrs.extensionKey,
|
|
99
|
+
parameters = _pmNode$attrs.parameters,
|
|
100
|
+
text = _pmNode$attrs.text;
|
|
101
|
+
var isBodiedExtension = pmNode.type.name === 'bodiedExtension';
|
|
102
|
+
if (isBodiedExtension) {
|
|
103
|
+
return;
|
|
104
|
+
}
|
|
105
|
+
var fragmentLocalId = pmNode === null || pmNode === void 0 || (_pmNode$marks = pmNode.marks) === null || _pmNode$marks === void 0 || (_pmNode$marks = _pmNode$marks.find(function (m) {
|
|
106
|
+
return m.type.name === 'fragment';
|
|
107
|
+
})) === null || _pmNode$marks === void 0 || (_pmNode$marks = _pmNode$marks.attrs) === null || _pmNode$marks === void 0 ? void 0 : _pmNode$marks.localId;
|
|
108
|
+
var node = {
|
|
109
|
+
type: pmNode.type.name,
|
|
110
|
+
extensionType: extensionType,
|
|
111
|
+
extensionKey: extensionKey,
|
|
112
|
+
parameters: parameters,
|
|
113
|
+
content: text,
|
|
114
|
+
localId: pmNode.attrs.localId,
|
|
115
|
+
fragmentLocalId: fragmentLocalId
|
|
116
|
+
};
|
|
117
|
+
var result;
|
|
118
|
+
if (extensionHandlers && extensionHandlers[extensionType]) {
|
|
119
|
+
var render = getExtensionRenderer(extensionHandlers[extensionType]);
|
|
120
|
+
result = render(node, editorView.state.doc, actions);
|
|
121
|
+
}
|
|
122
|
+
if (!result) {
|
|
123
|
+
var extensionHandlerFromProvider = _this.state.extensionProvider && _this.getNodeRenderer(_this.state.extensionProvider, extensionType, extensionKey);
|
|
124
|
+
if (extensionHandlerFromProvider) {
|
|
125
|
+
var NodeRenderer = extensionHandlerFromProvider;
|
|
126
|
+
if (node.type === 'multiBodiedExtension') {
|
|
127
|
+
return /*#__PURE__*/React.createElement(NodeRenderer, {
|
|
128
|
+
node: node,
|
|
129
|
+
references: _this.props.references,
|
|
130
|
+
actions: actions
|
|
131
|
+
});
|
|
132
|
+
} else {
|
|
133
|
+
return /*#__PURE__*/React.createElement(NodeRenderer, {
|
|
134
|
+
node: node,
|
|
135
|
+
references: _this.props.references
|
|
136
|
+
});
|
|
137
|
+
}
|
|
138
|
+
}
|
|
139
|
+
}
|
|
140
|
+
return result;
|
|
141
|
+
});
|
|
142
|
+
return _this;
|
|
143
|
+
}
|
|
144
|
+
_createClass(ExtensionComponent, [{
|
|
145
|
+
key: "UNSAFE_componentWillMount",
|
|
146
|
+
value: function UNSAFE_componentWillMount() {
|
|
147
|
+
this.mounted = true;
|
|
148
|
+
}
|
|
149
|
+
}, {
|
|
150
|
+
key: "componentDidMount",
|
|
151
|
+
value: function componentDidMount() {
|
|
152
|
+
var extensionProvider = this.props.extensionProvider;
|
|
153
|
+
if (extensionProvider) {
|
|
154
|
+
this.setStateFromPromise('extensionProvider', extensionProvider);
|
|
155
|
+
}
|
|
156
|
+
}
|
|
157
|
+
}, {
|
|
158
|
+
key: "componentDidUpdate",
|
|
159
|
+
value: function componentDidUpdate() {
|
|
160
|
+
this.parsePrivateNodePropsIfNeeded();
|
|
161
|
+
}
|
|
162
|
+
}, {
|
|
163
|
+
key: "componentWillUnmount",
|
|
164
|
+
value: function componentWillUnmount() {
|
|
165
|
+
this.mounted = false;
|
|
166
|
+
}
|
|
167
|
+
}, {
|
|
168
|
+
key: "UNSAFE_componentWillReceiveProps",
|
|
169
|
+
value: function UNSAFE_componentWillReceiveProps(nextProps) {
|
|
170
|
+
var extensionProvider = nextProps.extensionProvider;
|
|
171
|
+
if (extensionProvider && this.props.extensionProvider !== extensionProvider) {
|
|
172
|
+
this.setStateFromPromise('extensionProvider', extensionProvider);
|
|
173
|
+
}
|
|
174
|
+
}
|
|
175
|
+
}, {
|
|
176
|
+
key: "render",
|
|
177
|
+
value: function render() {
|
|
178
|
+
var _this$state$_privateP;
|
|
179
|
+
var _this$props2 = this.props,
|
|
180
|
+
node = _this$props2.node,
|
|
181
|
+
handleContentDOMRef = _this$props2.handleContentDOMRef,
|
|
182
|
+
editorView = _this$props2.editorView,
|
|
183
|
+
references = _this$props2.references,
|
|
184
|
+
editorAppearance = _this$props2.editorAppearance,
|
|
185
|
+
pluginInjectionApi = _this$props2.pluginInjectionApi,
|
|
186
|
+
getPos = _this$props2.getPos,
|
|
187
|
+
eventDispatcher = _this$props2.eventDispatcher;
|
|
188
|
+
if (node.type.name === 'multiBodiedExtension') {
|
|
189
|
+
return /*#__PURE__*/React.createElement(MultiBodiedExtension, {
|
|
190
|
+
node: node,
|
|
191
|
+
editorView: editorView,
|
|
192
|
+
getPos: getPos,
|
|
193
|
+
handleContentDOMRef: handleContentDOMRef,
|
|
194
|
+
tryExtensionHandler: this.tryExtensionHandler.bind(this),
|
|
195
|
+
eventDispatcher: eventDispatcher,
|
|
196
|
+
pluginInjectionApi: pluginInjectionApi,
|
|
197
|
+
editorAppearance: editorAppearance
|
|
198
|
+
});
|
|
199
|
+
}
|
|
200
|
+
var extensionHandlerResult = this.tryExtensionHandler(undefined);
|
|
201
|
+
switch (node.type.name) {
|
|
202
|
+
case 'extension':
|
|
203
|
+
case 'bodiedExtension':
|
|
204
|
+
return /*#__PURE__*/React.createElement(Extension, {
|
|
205
|
+
node: node,
|
|
206
|
+
getPos: this.props.getPos,
|
|
207
|
+
references: references,
|
|
208
|
+
extensionProvider: this.state.extensionProvider,
|
|
209
|
+
handleContentDOMRef: handleContentDOMRef,
|
|
210
|
+
view: editorView,
|
|
211
|
+
editorAppearance: editorAppearance,
|
|
212
|
+
hideFrame: (_this$state$_privateP = this.state._privateProps) === null || _this$state$_privateP === void 0 ? void 0 : _this$state$_privateP.__hideFrame,
|
|
213
|
+
pluginInjectionApi: pluginInjectionApi
|
|
214
|
+
}, extensionHandlerResult);
|
|
215
|
+
case 'inlineExtension':
|
|
216
|
+
return /*#__PURE__*/React.createElement(InlineExtension, {
|
|
217
|
+
node: node
|
|
218
|
+
}, extensionHandlerResult);
|
|
219
|
+
default:
|
|
220
|
+
return null;
|
|
221
|
+
}
|
|
222
|
+
}
|
|
223
|
+
}, {
|
|
224
|
+
key: "tryExtensionHandler",
|
|
225
|
+
value: function tryExtensionHandler(actions) {
|
|
226
|
+
var node = this.props.node;
|
|
227
|
+
try {
|
|
228
|
+
var extensionContent = this.handleExtension(node, actions);
|
|
229
|
+
if (extensionContent && /*#__PURE__*/React.isValidElement(extensionContent)) {
|
|
230
|
+
return extensionContent;
|
|
231
|
+
}
|
|
232
|
+
} catch (e) {
|
|
233
|
+
// eslint-disable-next-line no-console
|
|
234
|
+
console.error('Provided extension handler has thrown an error\n', e);
|
|
235
|
+
/** We don't want this error to block renderer */
|
|
236
|
+
/** We keep rendering the default content */
|
|
237
|
+
}
|
|
238
|
+
|
|
239
|
+
return null;
|
|
240
|
+
}
|
|
241
|
+
}]);
|
|
242
|
+
return ExtensionComponent;
|
|
243
|
+
}(Component);
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import React from 'react';
|
|
2
|
+
import { ZERO_WIDTH_SPACE } from '../utils';
|
|
3
|
+
/**
|
|
4
|
+
* If inlineExtension, add zero width space to the end of the nodes and wrap with span;
|
|
5
|
+
* else wrap with a div (for multi bodied extensions)
|
|
6
|
+
*
|
|
7
|
+
* @param param0
|
|
8
|
+
* @returns
|
|
9
|
+
*/
|
|
10
|
+
export var ExtensionNodeWrapper = function ExtensionNodeWrapper(_ref) {
|
|
11
|
+
var children = _ref.children,
|
|
12
|
+
nodeType = _ref.nodeType;
|
|
13
|
+
return /*#__PURE__*/React.createElement("span", null, children, nodeType === 'inlineExtension' && ZERO_WIDTH_SPACE);
|
|
14
|
+
};
|
|
@@ -0,0 +1,257 @@
|
|
|
1
|
+
import _objectDestructuringEmpty from "@babel/runtime/helpers/objectDestructuringEmpty";
|
|
2
|
+
import _extends from "@babel/runtime/helpers/extends";
|
|
3
|
+
import _slicedToArray from "@babel/runtime/helpers/slicedToArray";
|
|
4
|
+
import _taggedTemplateLiteral from "@babel/runtime/helpers/taggedTemplateLiteral";
|
|
5
|
+
import _defineProperty from "@babel/runtime/helpers/defineProperty";
|
|
6
|
+
var _templateObject, _templateObject2;
|
|
7
|
+
function ownKeys(e, r) { var t = Object.keys(e); if (Object.getOwnPropertySymbols) { var o = Object.getOwnPropertySymbols(e); r && (o = o.filter(function (r) { return Object.getOwnPropertyDescriptor(e, r).enumerable; })), t.push.apply(t, o); } return t; }
|
|
8
|
+
function _objectSpread(e) { for (var r = 1; r < arguments.length; r++) { var t = null != arguments[r] ? arguments[r] : {}; r % 2 ? ownKeys(Object(t), !0).forEach(function (r) { _defineProperty(e, r, t[r]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(e, Object.getOwnPropertyDescriptors(t)) : ownKeys(Object(t)).forEach(function (r) { Object.defineProperty(e, r, Object.getOwnPropertyDescriptor(t, r)); }); } return e; }
|
|
9
|
+
/** @jsx jsx */
|
|
10
|
+
|
|
11
|
+
import React, { useState } from 'react';
|
|
12
|
+
import { css, jsx } from '@emotion/react';
|
|
13
|
+
import { N30, N40, N50 } from '@atlaskit/theme/colors';
|
|
14
|
+
import { ACTION, ACTION_SUBJECT, EVENT_TYPE } from '../../analytics';
|
|
15
|
+
import { createDispatch } from '../../event-dispatcher';
|
|
16
|
+
import { useSharedPluginState } from '../../hooks';
|
|
17
|
+
import { analyticsEventKey, calculateBreakoutStyles } from '../../utils';
|
|
18
|
+
import { WithPluginState } from '../../with-plugin-state';
|
|
19
|
+
var useMultiBodiedExtensionActions = function useMultiBodiedExtensionActions(_ref) {
|
|
20
|
+
var updateActiveChild = _ref.updateActiveChild,
|
|
21
|
+
editorView = _ref.editorView,
|
|
22
|
+
getPos = _ref.getPos,
|
|
23
|
+
node = _ref.node,
|
|
24
|
+
eventDispatcher = _ref.eventDispatcher;
|
|
25
|
+
var actions = React.useMemo(function () {
|
|
26
|
+
return {
|
|
27
|
+
changeActive: function changeActive(index) {
|
|
28
|
+
var updateActiveChildResult = updateActiveChild(index);
|
|
29
|
+
if (eventDispatcher) {
|
|
30
|
+
sendMBEAnalyticsEvent(ACTION.CHANGE_ACTIVE, node, eventDispatcher);
|
|
31
|
+
}
|
|
32
|
+
return updateActiveChildResult;
|
|
33
|
+
},
|
|
34
|
+
addChild: function addChild() {
|
|
35
|
+
var state = editorView.state,
|
|
36
|
+
dispatch = editorView.dispatch;
|
|
37
|
+
if (node.content.childCount >= node.attrs.maxFrames) {
|
|
38
|
+
throw new Error("Cannot add more than ".concat(node.attrs.maxFrames, " frames"));
|
|
39
|
+
}
|
|
40
|
+
var p = state.schema.nodes.paragraph.createAndFill({});
|
|
41
|
+
if (!p) {
|
|
42
|
+
throw new Error('Could not create paragraph');
|
|
43
|
+
}
|
|
44
|
+
var frame = state.schema.nodes.extensionFrame.createAndFill({}, [p]);
|
|
45
|
+
var pos = getPos();
|
|
46
|
+
if (typeof pos !== 'number' || !frame) {
|
|
47
|
+
throw new Error('Could not create frame or position not valid');
|
|
48
|
+
}
|
|
49
|
+
var insertAt = Math.min((pos || 1) + node.content.size, state.doc.content.size);
|
|
50
|
+
dispatch(state.tr.insert(insertAt, frame));
|
|
51
|
+
if (eventDispatcher) {
|
|
52
|
+
sendMBEAnalyticsEvent(ACTION.ADD_CHILD, node, eventDispatcher);
|
|
53
|
+
}
|
|
54
|
+
return true;
|
|
55
|
+
},
|
|
56
|
+
getChildrenCount: function getChildrenCount() {
|
|
57
|
+
return node.content.childCount;
|
|
58
|
+
},
|
|
59
|
+
removeChild: function removeChild(index) {
|
|
60
|
+
var pos = getPos();
|
|
61
|
+
// TODO: Add child index validation here, don't trust this data
|
|
62
|
+
if (typeof pos !== 'number' || typeof index !== 'number') {
|
|
63
|
+
throw new Error('Position or index not valid');
|
|
64
|
+
}
|
|
65
|
+
var state = editorView.state,
|
|
66
|
+
dispatch = editorView.dispatch;
|
|
67
|
+
if (node.content.childCount === 1) {
|
|
68
|
+
var _tr = state.tr;
|
|
69
|
+
_tr.deleteRange(pos, pos + node.content.size);
|
|
70
|
+
dispatch(_tr);
|
|
71
|
+
return true;
|
|
72
|
+
}
|
|
73
|
+
var $pos = state.doc.resolve(pos);
|
|
74
|
+
var $startNodePos = state.doc.resolve($pos.start($pos.depth + 1));
|
|
75
|
+
var startFramePosition = $startNodePos.posAtIndex(index);
|
|
76
|
+
var maybeFrameNode = state.doc.nodeAt(startFramePosition);
|
|
77
|
+
if (!maybeFrameNode) {
|
|
78
|
+
throw new Error('Could not find frame node');
|
|
79
|
+
}
|
|
80
|
+
var endFramePosition = maybeFrameNode.content.size + startFramePosition;
|
|
81
|
+
var tr = state.tr;
|
|
82
|
+
tr.deleteRange(startFramePosition, endFramePosition);
|
|
83
|
+
dispatch(tr);
|
|
84
|
+
if (eventDispatcher) {
|
|
85
|
+
sendMBEAnalyticsEvent(ACTION.REMOVE_CHILD, node, eventDispatcher);
|
|
86
|
+
}
|
|
87
|
+
return true;
|
|
88
|
+
},
|
|
89
|
+
updateParameters: function updateParameters(parameters) {
|
|
90
|
+
var state = editorView.state,
|
|
91
|
+
dispatch = editorView.dispatch;
|
|
92
|
+
var pos = getPos();
|
|
93
|
+
if (typeof pos !== 'number') {
|
|
94
|
+
throw new Error('Position not valid');
|
|
95
|
+
}
|
|
96
|
+
var tr = state.tr.setNodeMarkup(pos, undefined, _objectSpread(_objectSpread({}, node.attrs), {}, {
|
|
97
|
+
parameters: _objectSpread(_objectSpread({}, node.attrs.parameters), {}, {
|
|
98
|
+
macroParams: parameters
|
|
99
|
+
})
|
|
100
|
+
}));
|
|
101
|
+
dispatch(tr);
|
|
102
|
+
if (eventDispatcher) {
|
|
103
|
+
sendMBEAnalyticsEvent(ACTION.UPDATE_PARAMETERS, node, eventDispatcher);
|
|
104
|
+
}
|
|
105
|
+
return true;
|
|
106
|
+
},
|
|
107
|
+
getChildren: function getChildren() {
|
|
108
|
+
var _state$doc$nodeAt;
|
|
109
|
+
var state = editorView.state;
|
|
110
|
+
var pos = getPos();
|
|
111
|
+
if (typeof pos !== 'number') {
|
|
112
|
+
return [];
|
|
113
|
+
}
|
|
114
|
+
var children = (_state$doc$nodeAt = state.doc.nodeAt(pos)) === null || _state$doc$nodeAt === void 0 ? void 0 : _state$doc$nodeAt.content;
|
|
115
|
+
if (eventDispatcher) {
|
|
116
|
+
sendMBEAnalyticsEvent(ACTION.GET_CHILDERN, node, eventDispatcher);
|
|
117
|
+
}
|
|
118
|
+
return children ? children.toJSON() : [];
|
|
119
|
+
}
|
|
120
|
+
};
|
|
121
|
+
}, [node, editorView, getPos, updateActiveChild, eventDispatcher]);
|
|
122
|
+
return actions;
|
|
123
|
+
};
|
|
124
|
+
var navigationCSS = css(_templateObject || (_templateObject = _taggedTemplateLiteral(["\n // make sure the user can't see a range selection inside the navigation\n // This is really important to keep the navigation working properly\n user-select: none;\n -webkit-user-modify: read-only;\n border: 1px solid ", ";\n"])), "var(--ds-border, ".concat(N40, ")"));
|
|
125
|
+
var MultiBodiedExtensionWithWidth = function MultiBodiedExtensionWithWidth(_ref2) {
|
|
126
|
+
var node = _ref2.node,
|
|
127
|
+
handleContentDOMRef = _ref2.handleContentDOMRef,
|
|
128
|
+
getPos = _ref2.getPos,
|
|
129
|
+
tryExtensionHandler = _ref2.tryExtensionHandler,
|
|
130
|
+
editorView = _ref2.editorView,
|
|
131
|
+
eventDispatcher = _ref2.eventDispatcher,
|
|
132
|
+
widthState = _ref2.widthState,
|
|
133
|
+
editorAppearance = _ref2.editorAppearance;
|
|
134
|
+
var _useState = useState(0),
|
|
135
|
+
_useState2 = _slicedToArray(_useState, 2),
|
|
136
|
+
activeChildIndex = _useState2[0],
|
|
137
|
+
setActiveChildIndex = _useState2[1];
|
|
138
|
+
// Adding to avoid aliasing `this` for the callbacks
|
|
139
|
+
var updateActiveChild = React.useCallback(function (index) {
|
|
140
|
+
if (typeof index !== 'number') {
|
|
141
|
+
setActiveChildIndex(0);
|
|
142
|
+
throw new Error('Index is not valid');
|
|
143
|
+
}
|
|
144
|
+
setActiveChildIndex(index);
|
|
145
|
+
return true;
|
|
146
|
+
}, [setActiveChildIndex]);
|
|
147
|
+
var actions = useMultiBodiedExtensionActions({
|
|
148
|
+
updateActiveChild: updateActiveChild,
|
|
149
|
+
editorView: editorView,
|
|
150
|
+
getPos: getPos,
|
|
151
|
+
eventDispatcher: eventDispatcher,
|
|
152
|
+
node: node
|
|
153
|
+
});
|
|
154
|
+
var extensionHandlerResult = React.useMemo(function () {
|
|
155
|
+
return tryExtensionHandler(actions);
|
|
156
|
+
}, [tryExtensionHandler, actions]);
|
|
157
|
+
var articleRef = React.useCallback(function (node) {
|
|
158
|
+
return handleContentDOMRef(node);
|
|
159
|
+
}, [handleContentDOMRef]);
|
|
160
|
+
var containerCSS = css(_templateObject2 || (_templateObject2 = _taggedTemplateLiteral(["\n border: 1px solid ", ";\n min-height: 100px;\n .multiBodiedExtension-content-dom-wrapper > [data-extension-frame='true'] {\n display: none;\n }\n\n .multiBodiedExtension-content-dom-wrapper\n > [data-extension-frame='true']:nth-of-type(", ") {\n border: 1px solid ", ";\n display: block;\n min-height: 100px;\n }\n "])), "var(--ds-border, ".concat(N30, ")"), activeChildIndex + 1, "var(--ds-border, ".concat(N50, ")"));
|
|
161
|
+
var shouldBreakout =
|
|
162
|
+
// Extension should breakout when the layout is set to 'full-width' or 'wide'.
|
|
163
|
+
['full-width', 'wide'].includes(node.attrs.layout) &&
|
|
164
|
+
// Extension breakout state should not be respected when the editor appearance is full-width mode
|
|
165
|
+
editorAppearance !== 'full-width';
|
|
166
|
+
var mbeContainerStyles = {};
|
|
167
|
+
if (shouldBreakout) {
|
|
168
|
+
var _calculateBreakoutSty = calculateBreakoutStyles({
|
|
169
|
+
mode: node.attrs.layout,
|
|
170
|
+
widthStateLineLength: widthState === null || widthState === void 0 ? void 0 : widthState.lineLength,
|
|
171
|
+
widthStateWidth: widthState === null || widthState === void 0 ? void 0 : widthState.width
|
|
172
|
+
}),
|
|
173
|
+
breakoutStyles = _extends({}, (_objectDestructuringEmpty(_calculateBreakoutSty), _calculateBreakoutSty));
|
|
174
|
+
mbeContainerStyles = breakoutStyles;
|
|
175
|
+
}
|
|
176
|
+
return jsx("section", {
|
|
177
|
+
className: "multiBodiedExtension--container",
|
|
178
|
+
css: containerCSS,
|
|
179
|
+
"data-testid": "multiBodiedExtension--container",
|
|
180
|
+
"data-active-child-index": activeChildIndex,
|
|
181
|
+
style: mbeContainerStyles
|
|
182
|
+
}, jsx("nav", {
|
|
183
|
+
className: "multiBodiedExtension-navigation",
|
|
184
|
+
css: navigationCSS,
|
|
185
|
+
"data-testid": "multiBodiedExtension-navigation"
|
|
186
|
+
}, extensionHandlerResult), jsx("article", {
|
|
187
|
+
className: "multiBodiedExtension--frames",
|
|
188
|
+
"data-testid": "multiBodiedExtension--frames",
|
|
189
|
+
ref: articleRef
|
|
190
|
+
}));
|
|
191
|
+
};
|
|
192
|
+
var sendMBEAnalyticsEvent = function sendMBEAnalyticsEvent(action, node, eventDispatcher) {
|
|
193
|
+
var analyticsDispatch = createDispatch(eventDispatcher);
|
|
194
|
+
analyticsDispatch(analyticsEventKey, {
|
|
195
|
+
payload: {
|
|
196
|
+
action: action,
|
|
197
|
+
actionSubject: ACTION_SUBJECT.MULTI_BODIED_EXTENSION,
|
|
198
|
+
eventType: EVENT_TYPE.TRACK,
|
|
199
|
+
attributes: {
|
|
200
|
+
extensionType: node.attrs.extensionType,
|
|
201
|
+
extensionKey: node.attrs.extensionKey,
|
|
202
|
+
localId: node.attrs.localId,
|
|
203
|
+
maxFramesCount: node.attrs.maxFrames,
|
|
204
|
+
currentFramesCount: node.content.childCount
|
|
205
|
+
}
|
|
206
|
+
}
|
|
207
|
+
});
|
|
208
|
+
};
|
|
209
|
+
var MultiBodiedExtensionWithSharedState = function MultiBodiedExtensionWithSharedState(props) {
|
|
210
|
+
var pluginInjectionApi = props.pluginInjectionApi;
|
|
211
|
+
var _useSharedPluginState = useSharedPluginState(pluginInjectionApi, ['width']),
|
|
212
|
+
widthState = _useSharedPluginState.widthState;
|
|
213
|
+
return jsx(MultiBodiedExtensionWithWidth, _extends({
|
|
214
|
+
widthState: widthState
|
|
215
|
+
}, props));
|
|
216
|
+
};
|
|
217
|
+
|
|
218
|
+
// Workaround taken from platform/packages/editor/editor-core/src/plugins/extension/ui/Extension/Extension/index.tsx
|
|
219
|
+
var MultiBodiedExtension = function MultiBodiedExtension(props) {
|
|
220
|
+
// TODO: ED-17836 This code is here because confluence injects
|
|
221
|
+
// the `editor-referentiality` plugin via `dangerouslyAppendPlugins`
|
|
222
|
+
// which cannot access the `pluginInjectionApi`. When we move
|
|
223
|
+
// Confluence to using presets we can remove this workaround.
|
|
224
|
+
var pluginInjectionApi = props.pluginInjectionApi;
|
|
225
|
+
return pluginInjectionApi === undefined ? jsx(MultiBodiedExtensionDeprecated, props) : jsx(MultiBodiedExtensionWithSharedState, props);
|
|
226
|
+
};
|
|
227
|
+
|
|
228
|
+
// TODO: ED-17836 This code is here because Confluence injects
|
|
229
|
+
// the `editor-referentiality` plugin via `dangerouslyAppendPlugins`
|
|
230
|
+
// which cannot access the `pluginInjectionApi`. When we move
|
|
231
|
+
// Confluence to using presets we can remove this workaround.
|
|
232
|
+
// @ts-ignore
|
|
233
|
+
var widthPluginKey = {
|
|
234
|
+
key: 'widthPlugin$',
|
|
235
|
+
getState: function getState(state) {
|
|
236
|
+
return state['widthPlugin$'];
|
|
237
|
+
}
|
|
238
|
+
};
|
|
239
|
+
var MultiBodiedExtensionDeprecated = function MultiBodiedExtensionDeprecated(props) {
|
|
240
|
+
return jsx(WithPluginState, {
|
|
241
|
+
editorView: props.editorView,
|
|
242
|
+
plugins: {
|
|
243
|
+
widthState: widthPluginKey
|
|
244
|
+
},
|
|
245
|
+
render: function render(_ref3) {
|
|
246
|
+
var widthState = _ref3.widthState;
|
|
247
|
+
return jsx(MultiBodiedExtensionWithWidth, _extends({
|
|
248
|
+
widthState: widthState
|
|
249
|
+
}, props));
|
|
250
|
+
}
|
|
251
|
+
});
|
|
252
|
+
};
|
|
253
|
+
/**
|
|
254
|
+
* End workaround
|
|
255
|
+
*/
|
|
256
|
+
|
|
257
|
+
export default MultiBodiedExtension;
|
|
@@ -0,0 +1,83 @@
|
|
|
1
|
+
import _classCallCheck from "@babel/runtime/helpers/classCallCheck";
|
|
2
|
+
import _createClass from "@babel/runtime/helpers/createClass";
|
|
3
|
+
import _inherits from "@babel/runtime/helpers/inherits";
|
|
4
|
+
import _possibleConstructorReturn from "@babel/runtime/helpers/possibleConstructorReturn";
|
|
5
|
+
import _getPrototypeOf from "@babel/runtime/helpers/getPrototypeOf";
|
|
6
|
+
function _createSuper(Derived) { var hasNativeReflectConstruct = _isNativeReflectConstruct(); return function _createSuperInternal() { var Super = _getPrototypeOf(Derived), result; if (hasNativeReflectConstruct) { var NewTarget = _getPrototypeOf(this).constructor; result = Reflect.construct(Super, arguments, NewTarget); } else { result = Super.apply(this, arguments); } return _possibleConstructorReturn(this, result); }; }
|
|
7
|
+
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; } }
|
|
8
|
+
import React from 'react';
|
|
9
|
+
import ReactNodeView from '../react-node-view';
|
|
10
|
+
import { Extension } from './Extension';
|
|
11
|
+
import { ExtensionNodeWrapper } from './ExtensionNodeWrapper';
|
|
12
|
+
// getInlineNodeViewProducer is a new api to use instead of ReactNodeView
|
|
13
|
+
// when creating inline node views, however, it is difficult to test the impact
|
|
14
|
+
// on selections when migrating inlineExtension to use the new api.
|
|
15
|
+
// The ReactNodeView api will be visited in the second phase of the selections
|
|
16
|
+
// project whilst investigating block nodes. We will revisit the Extension node view there too.
|
|
17
|
+
export var ExtensionNode = /*#__PURE__*/function (_ReactNodeView) {
|
|
18
|
+
_inherits(ExtensionNode, _ReactNodeView);
|
|
19
|
+
var _super = _createSuper(ExtensionNode);
|
|
20
|
+
function ExtensionNode() {
|
|
21
|
+
_classCallCheck(this, ExtensionNode);
|
|
22
|
+
return _super.apply(this, arguments);
|
|
23
|
+
}
|
|
24
|
+
_createClass(ExtensionNode, [{
|
|
25
|
+
key: "ignoreMutation",
|
|
26
|
+
value: function ignoreMutation(mutation) {
|
|
27
|
+
// Extensions can perform async operations that will change the DOM.
|
|
28
|
+
// To avoid having their tree rebuilt, we need to ignore the mutation
|
|
29
|
+
// for atom based extensions if its not a layout, we need to give
|
|
30
|
+
// children a chance to recalc
|
|
31
|
+
return this.node.type.isAtom || mutation.type !== 'selection' && mutation.attributeName !== 'data-layout';
|
|
32
|
+
}
|
|
33
|
+
}, {
|
|
34
|
+
key: "getContentDOM",
|
|
35
|
+
value: function getContentDOM() {
|
|
36
|
+
if (this.node.isInline) {
|
|
37
|
+
return;
|
|
38
|
+
}
|
|
39
|
+
var dom = document.createElement('div');
|
|
40
|
+
dom.className = "".concat(this.node.type.name, "-content-dom-wrapper");
|
|
41
|
+
return {
|
|
42
|
+
dom: dom
|
|
43
|
+
};
|
|
44
|
+
}
|
|
45
|
+
}, {
|
|
46
|
+
key: "render",
|
|
47
|
+
value: function render(props, forwardRef) {
|
|
48
|
+
var _props$extensionNodeV;
|
|
49
|
+
return /*#__PURE__*/React.createElement(ExtensionNodeWrapper, {
|
|
50
|
+
nodeType: this.node.type.name
|
|
51
|
+
}, /*#__PURE__*/React.createElement(Extension, {
|
|
52
|
+
editorView: this.view,
|
|
53
|
+
node: this.node,
|
|
54
|
+
eventDispatcher: this.eventDispatcher
|
|
55
|
+
// The getPos arg is always a function when used with nodes
|
|
56
|
+
// the version of the types we use has a union with the type
|
|
57
|
+
// for marks.
|
|
58
|
+
// This has been fixed in later versions of the definitly typed
|
|
59
|
+
// types (and also in prosmirror-views inbuilt types).
|
|
60
|
+
// https://github.com/DefinitelyTyped/DefinitelyTyped/pull/57384
|
|
61
|
+
,
|
|
62
|
+
getPos: this.getPos,
|
|
63
|
+
providerFactory: props.providerFactory,
|
|
64
|
+
handleContentDOMRef: forwardRef,
|
|
65
|
+
extensionHandlers: props.extensionHandlers,
|
|
66
|
+
editorAppearance: (_props$extensionNodeV = props.extensionNodeViewOptions) === null || _props$extensionNodeV === void 0 ? void 0 : _props$extensionNodeV.appearance,
|
|
67
|
+
pluginInjectionApi: props.pluginInjectionApi
|
|
68
|
+
}));
|
|
69
|
+
}
|
|
70
|
+
}]);
|
|
71
|
+
return ExtensionNode;
|
|
72
|
+
}(ReactNodeView);
|
|
73
|
+
export default function ExtensionNodeView(portalProviderAPI, eventDispatcher, providerFactory, extensionHandlers, extensionNodeViewOptions, pluginInjectionApi) {
|
|
74
|
+
return function (node, view, getPos) {
|
|
75
|
+
var hasIntlContext = true;
|
|
76
|
+
return new ExtensionNode(node, view, getPos, portalProviderAPI, eventDispatcher, {
|
|
77
|
+
providerFactory: providerFactory,
|
|
78
|
+
extensionHandlers: extensionHandlers,
|
|
79
|
+
extensionNodeViewOptions: extensionNodeViewOptions,
|
|
80
|
+
pluginInjectionApi: pluginInjectionApi
|
|
81
|
+
}, undefined, undefined, undefined, hasIntlContext).init();
|
|
82
|
+
};
|
|
83
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|