@atlaskit/editor-common 125.0.0 → 125.2.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.
Files changed (58) hide show
  1. package/CHANGELOG.md +39 -0
  2. package/dist/cjs/element-browser/components/ElementBrowserLoader.js +31 -8
  3. package/dist/cjs/extensibility/Extension.js +4 -2
  4. package/dist/cjs/extensibility/ExtensionComponent.js +3 -1
  5. package/dist/cjs/extensibility/ExtensionNodeWrapper.js +3 -0
  6. package/dist/cjs/extensibility/GeneratedContentReveal.js +18 -20
  7. package/dist/cjs/extensibility/extensionNodeView.js +61 -24
  8. package/dist/cjs/extensions/extension-handlers.js +96 -17
  9. package/dist/cjs/floating-toolbar/DropdownMenuExtensionItems.js +25 -4
  10. package/dist/cjs/icons/index.js +33 -10
  11. package/dist/cjs/messages/find-replace.js +5 -0
  12. package/dist/cjs/monitoring/error.js +1 -1
  13. package/dist/cjs/quick-insert/assets/index.js +888 -257
  14. package/dist/cjs/ui/DropList/index.js +1 -1
  15. package/dist/cjs/ui/Mention/mention-with-profilecard.js +30 -11
  16. package/dist/es2019/element-browser/components/ElementBrowserLoader.js +16 -2
  17. package/dist/es2019/extensibility/Extension.js +4 -2
  18. package/dist/es2019/extensibility/ExtensionComponent.js +3 -1
  19. package/dist/es2019/extensibility/ExtensionNodeWrapper.js +2 -0
  20. package/dist/es2019/extensibility/GeneratedContentReveal.js +11 -16
  21. package/dist/es2019/extensibility/extensionNodeView.js +51 -23
  22. package/dist/es2019/extensions/extension-handlers.js +70 -15
  23. package/dist/es2019/floating-toolbar/DropdownMenuExtensionItems.js +16 -2
  24. package/dist/es2019/icons/index.js +17 -3
  25. package/dist/es2019/messages/find-replace.js +5 -0
  26. package/dist/es2019/monitoring/error.js +1 -1
  27. package/dist/es2019/quick-insert/assets/index.js +386 -66
  28. package/dist/es2019/ui/DropList/index.js +1 -1
  29. package/dist/es2019/ui/Mention/mention-with-profilecard.js +15 -4
  30. package/dist/esm/element-browser/components/ElementBrowserLoader.js +28 -6
  31. package/dist/esm/extensibility/Extension.js +4 -2
  32. package/dist/esm/extensibility/ExtensionComponent.js +3 -1
  33. package/dist/esm/extensibility/ExtensionNodeWrapper.js +3 -0
  34. package/dist/esm/extensibility/GeneratedContentReveal.js +18 -20
  35. package/dist/esm/extensibility/extensionNodeView.js +56 -23
  36. package/dist/esm/extensions/extension-handlers.js +97 -17
  37. package/dist/esm/floating-toolbar/DropdownMenuExtensionItems.js +24 -4
  38. package/dist/esm/icons/index.js +29 -7
  39. package/dist/esm/messages/find-replace.js +5 -0
  40. package/dist/esm/monitoring/error.js +1 -1
  41. package/dist/esm/quick-insert/assets/index.js +764 -194
  42. package/dist/esm/ui/DropList/index.js +1 -1
  43. package/dist/esm/ui/Mention/mention-with-profilecard.js +25 -8
  44. package/dist/types/analytics/types/ai-suggestions-events.d.ts +4 -6
  45. package/dist/types/analytics/types/find-replace-events.d.ts +2 -0
  46. package/dist/types/extensibility/Extension.d.ts +2 -0
  47. package/dist/types/extensibility/ExtensionComponent.d.ts +2 -0
  48. package/dist/types/extensibility/ExtensionNodeWrapper.d.ts +3 -1
  49. package/dist/types/extensibility/GeneratedContentReveal.d.ts +3 -1
  50. package/dist/types/extensibility/extensionNodeView.d.ts +13 -12
  51. package/dist/types/icons/index.d.ts +5 -3
  52. package/dist/types/messages/find-replace.d.ts +27 -22
  53. package/dist/types/quick-insert/assets/index.d.ts +34 -32
  54. package/package.json +5 -4
  55. package/dist/cjs/extensibility/useNativeEmbedSettled.js +0 -56
  56. package/dist/es2019/extensibility/useNativeEmbedSettled.js +0 -49
  57. package/dist/esm/extensibility/useNativeEmbedSettled.js +0 -51
  58. package/dist/types/extensibility/useNativeEmbedSettled.d.ts +0 -12
@@ -7,6 +7,11 @@ import React from 'react';
7
7
  // eslint-disable-next-line @atlaskit/ui-styling-standard/use-compiled -- Ignored via go/DSP-18766
8
8
  import { css, jsx } from '@emotion/react';
9
9
  import Loadable from 'react-loadable';
10
+ // oxlint-disable-next-line @atlassian/no-restricted-imports
11
+ import { lazy, LazySuspense } from 'react-loosely-lazy';
12
+
13
+ // oxlint-disable-next-line @atlassian/no-restricted-imports
14
+ import { isExperimentEnabled } from '@atlaskit/platform-feature-experiments/is-experiment-enabled';
10
15
  import Spinner from '@atlaskit/spinner/spinner';
11
16
  var spinnerContainer = css({
12
17
  display: 'flex',
@@ -15,12 +20,19 @@ var spinnerContainer = css({
15
20
  height: '100%',
16
21
  width: '100%'
17
22
  });
18
- var ElementBrowserLoader = Loadable({
19
- loader: function loader() {
20
- return import( /* webpackChunkName: "@atlaskit-internal_editor-element-browser" */'../ElementBrowser').then(function (module) {
21
- return module.default;
22
- });
23
- },
23
+ var loadElementBrowser = function loadElementBrowser() {
24
+ return import( /* webpackChunkName: "@atlaskit-internal_editor-element-browser" */'../ElementBrowser').then(function (module) {
25
+ return module.default;
26
+ });
27
+ };
28
+ var ElementBrowserLazy = lazy(function () {
29
+ return import( /* webpackChunkName: "@atlaskit-internal_editor-element-browser" */'../ElementBrowser').then(function (module) {
30
+ return module.default;
31
+ });
32
+ });
33
+ ElementBrowserLazy.displayName = 'lazy(ElementBrowser)';
34
+ var ElementBrowserLoadable = Loadable({
35
+ loader: loadElementBrowser,
24
36
  loading: function loading() {
25
37
  return jsx("div", {
26
38
  css: spinnerContainer
@@ -30,4 +42,14 @@ var ElementBrowserLoader = Loadable({
30
42
  }));
31
43
  }
32
44
  });
45
+ var ElementBrowserLoader = function ElementBrowserLoader(props) {
46
+ return isExperimentEnabled('platform_editor_loosely_lazy_migration') ? jsx(LazySuspense, {
47
+ fallback: null
48
+ }, jsx(ElementBrowserLazy, props)) :
49
+ // eslint-disable-next-line react/jsx-props-no-spreading
50
+ jsx(ElementBrowserLoadable, props);
51
+ };
52
+ ElementBrowserLoader.preload = function () {
53
+ return isExperimentEnabled('platform_editor_loosely_lazy_migration') ? ElementBrowserLazy.preload() : ElementBrowserLoadable.preload();
54
+ };
33
55
  export default ElementBrowserLoader;
@@ -33,7 +33,8 @@ export var Extension = /*#__PURE__*/function (_Component) {
33
33
  macroInteractionDesignFeatureFlags = _this$props.macroInteractionDesignFeatureFlags,
34
34
  showLivePagesBodiedMacrosRendererView = _this$props.showLivePagesBodiedMacrosRendererView,
35
35
  showUpdatedLivePages1PBodiedExtensionUI = _this$props.showUpdatedLivePages1PBodiedExtensionUI,
36
- rendererExtensionHandlers = _this$props.rendererExtensionHandlers;
36
+ rendererExtensionHandlers = _this$props.rendererExtensionHandlers,
37
+ onContentReady = _this$props.onContentReady;
37
38
 
38
39
  // Extensions are not yet using the new plugin architecture, and the use of the pluginInjectionApi
39
40
  // is not type safe in editor-common.
@@ -59,7 +60,8 @@ export var Extension = /*#__PURE__*/function (_Component) {
59
60
  showLivePagesBodiedMacrosRendererView: showLivePagesBodiedMacrosRendererView,
60
61
  showUpdatedLivePages1PBodiedExtensionUI: showUpdatedLivePages1PBodiedExtensionUI,
61
62
  rendererExtensionHandlers: rendererExtensionHandlers,
62
- isLivePageViewMode: isLivePageViewMode
63
+ isLivePageViewMode: isLivePageViewMode,
64
+ onContentReady: onContentReady
63
65
  });
64
66
  });
65
67
  _this.providerFactory = props.providerFactory || new ProviderFactory();
@@ -233,7 +233,8 @@ var ExtensionComponentInner = /*#__PURE__*/function (_Component) {
233
233
  extensionLoadingHandlers = _this$props2.extensionLoadingHandlers,
234
234
  editorView = _this$props2.editorView,
235
235
  showBodiedExtensionRendererView = _this$props2.showBodiedExtensionRendererView,
236
- rendererExtensionHandlers = _this$props2.rendererExtensionHandlers;
236
+ rendererExtensionHandlers = _this$props2.rendererExtensionHandlers,
237
+ onContentReady = _this$props2.onContentReady;
237
238
  var _pmNode$attrs = pmNode.attrs,
238
239
  extensionType = _pmNode$attrs.extensionType,
239
240
  extensionKey = _pmNode$attrs.extensionKey,
@@ -288,6 +289,7 @@ var ExtensionComponentInner = /*#__PURE__*/function (_Component) {
288
289
  references: _this.props.references,
289
290
  isSelected: isSelected,
290
291
  loadingFallback: loadingFallback,
292
+ onContentReady: onContentReady,
291
293
  showUnknownMacroPlaceholder: true
292
294
  });
293
295
  }
@@ -68,6 +68,8 @@ export var ExtensionNodeWrapper = function ExtensionNodeWrapper(_ref) {
68
68
  macroInteractionDesignFeatureFlags = _ref.macroInteractionDesignFeatureFlags,
69
69
  _ref$generatedContent = _ref.generatedContentMotion,
70
70
  generatedContentMotion = _ref$generatedContent === void 0 ? false : _ref$generatedContent,
71
+ _ref$contentReady = _ref.contentReady,
72
+ contentReady = _ref$contentReady === void 0 ? false : _ref$contentReady,
71
73
  intl = _ref.intl;
72
74
  var _ref2 = macroInteractionDesignFeatureFlags || {},
73
75
  showMacroInteractionDesignUpdates = _ref2.showMacroInteractionDesignUpdates;
@@ -75,6 +77,7 @@ export var ExtensionNodeWrapper = function ExtensionNodeWrapper(_ref) {
75
77
  // Fixed for the node view's lifetime: switching would remount the subtree and reload the embed.
76
78
  if (generatedContentMotion) {
77
79
  return jsx(GeneratedContentReveal, {
80
+ contentReady: contentReady,
78
81
  intl: intl,
79
82
  showMacroInteractionDesignUpdates: showMacroInteractionDesignUpdates
80
83
  }, children);
@@ -4,14 +4,13 @@ import "./GeneratedContentReveal.compiled.css";
4
4
  import { ax, ix } from "@compiled/react/runtime";
5
5
  import React, { useCallback, useEffect, useState } from 'react';
6
6
  import { ExtensionSSRReactContextsProvider } from './ExtensionSSRReactContextsProvider';
7
- import { useNativeEmbedSettled } from './useNativeEmbedSettled';
8
7
 
9
8
  /*
10
9
  * Animates a native embed into the document once it has loaded.
11
10
  *
12
11
  * 1. `collapsed` — clipped to zero height and `inert`. The embed loads behind it, full size but
13
12
  * unseen, with its own loading overlay hidden.
14
- * 2. `useNativeEmbedSettled` calls back once the embed has finished loading.
13
+ * 2. The extension reports its content ready through `contentReady`.
15
14
  * 3. `revealing` — the node animates open to its content height (400ms).
16
15
  * 4. The embed fades in (200ms), delayed so it follows the opening instead of overlapping it.
17
16
  * 5. `open` — on `animationend`, when the content first becomes visible, `inert` is dropped.
@@ -56,42 +55,41 @@ var embedContentEnteringStyles = null;
56
55
 
57
56
  export var GeneratedContentReveal = function GeneratedContentReveal(_ref) {
58
57
  var children = _ref.children,
58
+ contentReady = _ref.contentReady,
59
59
  intl = _ref.intl,
60
60
  showMacroInteractionDesignUpdates = _ref.showMacroInteractionDesignUpdates;
61
- // Held in state so the effects below run once the span exists.
61
+ // Held in state so the effect below runs once the span exists.
62
62
  var _useState = useState(null),
63
63
  _useState2 = _slicedToArray(_useState, 2),
64
64
  wrapperElement = _useState2[0],
65
65
  setWrapperElement = _useState2[1];
66
- var _useState3 = useState('collapsed'),
66
+ var _useState3 = useState(false),
67
67
  _useState4 = _slicedToArray(_useState3, 2),
68
- state = _useState4[0],
69
- setState = _useState4[1];
68
+ readyTimedOut = _useState4[0],
69
+ setReadyTimedOut = _useState4[1];
70
+ var _useState5 = useState(false),
71
+ _useState6 = _slicedToArray(_useState5, 2),
72
+ opened = _useState6[0],
73
+ setOpened = _useState6[1];
70
74
 
71
- // Only a collapsed node opens, so whichever of the readiness signal and the fail-safe timer
72
- // comes second changes nothing.
73
- var startRevealing = useCallback(function () {
74
- setState(function (current) {
75
- return current === 'collapsed' ? 'revealing' : current;
76
- });
77
- }, []);
78
-
79
- // Step 2 → 3.
80
- useNativeEmbedSettled(wrapperElement, startRevealing);
75
+ // Derived, so the two ways a node opens need no ordering between them.
76
+ var state = opened ? 'open' : contentReady || readyTimedOut ? 'revealing' : 'collapsed';
81
77
 
82
78
  // One timer, set on mount, so the deadline never moves.
83
79
  useEffect(function () {
84
- var timer = setTimeout(startRevealing, READY_TIMEOUT_MS);
80
+ var timer = setTimeout(function () {
81
+ return setReadyTimedOut(true);
82
+ }, READY_TIMEOUT_MS);
85
83
  return function () {
86
84
  return clearTimeout(timer);
87
85
  };
88
- }, [startRevealing]);
86
+ }, []);
89
87
  useEffect(function () {
90
88
  if (state !== 'revealing') {
91
89
  return;
92
90
  }
93
91
  var timer = setTimeout(function () {
94
- return setState('open');
92
+ return setOpened(true);
95
93
  }, REVEAL_TIMEOUT_MS);
96
94
  return function () {
97
95
  return clearTimeout(timer);
@@ -106,7 +104,7 @@ export var GeneratedContentReveal = function GeneratedContentReveal(_ref) {
106
104
  var onAnimationEnd = useCallback(function (event) {
107
105
  // The extension's own content animates too, and those events bubble.
108
106
  if (event.target === event.currentTarget) {
109
- setState('open');
107
+ setOpened(true);
110
108
  }
111
109
  }, []);
112
110
  return /*#__PURE__*/React.createElement(ExtensionSSRReactContextsProvider, {
@@ -1,3 +1,4 @@
1
+ import _slicedToArray from "@babel/runtime/helpers/slicedToArray";
1
2
  import _classCallCheck from "@babel/runtime/helpers/classCallCheck";
2
3
  import _createClass from "@babel/runtime/helpers/createClass";
3
4
  import _possibleConstructorReturn from "@babel/runtime/helpers/possibleConstructorReturn";
@@ -8,7 +9,7 @@ import _defineProperty from "@babel/runtime/helpers/defineProperty";
8
9
  function _callSuper(t, o, e) { return o = _getPrototypeOf(o), _possibleConstructorReturn(t, _isNativeReflectConstruct() ? Reflect.construct(o, e || [], _getPrototypeOf(t).constructor) : o.apply(t, e)); }
9
10
  function _isNativeReflectConstruct() { try { var t = !Boolean.prototype.valueOf.call(Reflect.construct(Boolean, [], function () {})); } catch (t) {} return (_isNativeReflectConstruct = function _isNativeReflectConstruct() { return !!t; })(); }
10
11
  function _superPropGet(t, o, e, r) { var p = _get(_getPrototypeOf(1 & r ? t.prototype : t), o, e); return 2 & r && "function" == typeof p ? function (t) { return p.apply(e, t); } : p; }
11
- import React from 'react';
12
+ import React, { useCallback, useState } from 'react';
12
13
  import { fg } from '@atlaskit/platform-feature-flags/fg';
13
14
  import { expValEquals } from '@atlaskit/tmp-editor-statsig/exp-val-equals';
14
15
  import { isSSR } from '../core-utils';
@@ -302,22 +303,14 @@ export var ExtensionNode = /*#__PURE__*/function (_ReactNodeView) {
302
303
  }, {
303
304
  key: "render",
304
305
  value: function render(props, forwardRef) {
305
- var _props$extensionNodeV, _props$extensionNodeV2;
306
306
  // While sitting on SSR DOM, skip the React portal — see {@link didReuseSsrDom}.
307
307
  if (this.didReuseSsrDom) {
308
308
  return null;
309
309
  }
310
- return /*#__PURE__*/React.createElement(ExtensionNodeWrapper, {
311
- intl: props.intl,
312
- nodeType: this.node.type.name,
313
- macroInteractionDesignFeatureFlags: props.macroInteractionDesignFeatureFlags
314
- // Only native embeds animate in; the reveal waits on the embed's own loading state.
315
- ,
316
- generatedContentMotion: !!((_props$extensionNodeV = props.extensionNodeViewOptions) !== null && _props$extensionNodeV !== void 0 && _props$extensionNodeV.allowAIGeneratedContentMotion) && isNativeEmbedExtension(this.node)
317
- }, /*#__PURE__*/React.createElement(Extension, {
310
+ return /*#__PURE__*/React.createElement(ExtensionNodeRender, {
318
311
  editorView: this.view,
319
- node: this.node,
320
- eventDispatcher: this.eventDispatcher
312
+ eventDispatcher: this.eventDispatcher,
313
+ forwardRef: forwardRef
321
314
  // The getPos arg is always a function when used with nodes
322
315
  // the version of the types we use has a union with the type
323
316
  // for marks.
@@ -326,20 +319,60 @@ export var ExtensionNode = /*#__PURE__*/function (_ReactNodeView) {
326
319
  // https://github.com/DefinitelyTyped/DefinitelyTyped/pull/57384
327
320
  ,
328
321
  getPos: this.getPos,
329
- providerFactory: props.providerFactory,
330
- handleContentDOMRef: forwardRef,
331
- extensionHandlers: props.extensionHandlers,
332
- extensionLoadingHandlers: props.extensionLoadingHandlers,
333
- editorAppearance: (_props$extensionNodeV2 = props.extensionNodeViewOptions) === null || _props$extensionNodeV2 === void 0 ? void 0 : _props$extensionNodeV2.appearance,
334
- pluginInjectionApi: props.pluginInjectionApi,
335
- macroInteractionDesignFeatureFlags: props.macroInteractionDesignFeatureFlags,
336
- showLivePagesBodiedMacrosRendererView: props.showLivePagesBodiedMacrosRendererView,
337
- showUpdatedLivePages1PBodiedExtensionUI: props.showUpdatedLivePages1PBodiedExtensionUI,
338
- rendererExtensionHandlers: props.rendererExtensionHandlers
339
- }));
322
+ node: this.node,
323
+ renderProps: props
324
+ });
340
325
  }
341
326
  }]);
342
327
  }(ReactNodeView);
328
+ /**
329
+ * Wraps the extension in its node wrapper. A component rather than part of the node view's `render`,
330
+ * so `contentReady` can be React state: the extension reports its content ready from inside the
331
+ * wrapper, and the wrapper animates the node in once it has.
332
+ */
333
+ function ExtensionNodeRender(_ref2) {
334
+ var _renderProps$extensio, _renderProps$extensio2;
335
+ var editorView = _ref2.editorView,
336
+ eventDispatcher = _ref2.eventDispatcher,
337
+ forwardRef = _ref2.forwardRef,
338
+ getPos = _ref2.getPos,
339
+ node = _ref2.node,
340
+ renderProps = _ref2.renderProps;
341
+ var _useState = useState(false),
342
+ _useState2 = _slicedToArray(_useState, 2),
343
+ contentReady = _useState2[0],
344
+ setContentReady = _useState2[1];
345
+ var onContentReady = useCallback(function () {
346
+ return setContentReady(true);
347
+ }, []);
348
+
349
+ // Only native embeds animate in; every other extension type renders as it does without the
350
+ // option, so nothing waits on a signal it does not send.
351
+ var generatedContentMotion = !!((_renderProps$extensio = renderProps.extensionNodeViewOptions) !== null && _renderProps$extensio !== void 0 && _renderProps$extensio.allowAIGeneratedContentMotion) && isNativeEmbedExtension(node);
352
+ return /*#__PURE__*/React.createElement(ExtensionNodeWrapper, {
353
+ intl: renderProps.intl,
354
+ nodeType: node.type.name,
355
+ macroInteractionDesignFeatureFlags: renderProps.macroInteractionDesignFeatureFlags,
356
+ generatedContentMotion: generatedContentMotion,
357
+ contentReady: contentReady
358
+ }, /*#__PURE__*/React.createElement(Extension, {
359
+ editorView: editorView,
360
+ node: node,
361
+ eventDispatcher: eventDispatcher,
362
+ getPos: getPos,
363
+ providerFactory: renderProps.providerFactory,
364
+ handleContentDOMRef: forwardRef,
365
+ extensionHandlers: renderProps.extensionHandlers,
366
+ extensionLoadingHandlers: renderProps.extensionLoadingHandlers,
367
+ editorAppearance: (_renderProps$extensio2 = renderProps.extensionNodeViewOptions) === null || _renderProps$extensio2 === void 0 ? void 0 : _renderProps$extensio2.appearance,
368
+ pluginInjectionApi: renderProps.pluginInjectionApi,
369
+ macroInteractionDesignFeatureFlags: renderProps.macroInteractionDesignFeatureFlags,
370
+ showLivePagesBodiedMacrosRendererView: renderProps.showLivePagesBodiedMacrosRendererView,
371
+ showUpdatedLivePages1PBodiedExtensionUI: renderProps.showUpdatedLivePages1PBodiedExtensionUI,
372
+ rendererExtensionHandlers: renderProps.rendererExtensionHandlers,
373
+ onContentReady: generatedContentMotion ? onContentReady : undefined
374
+ }));
375
+ }
343
376
 
344
377
  // eslint-disable-next-line @atlaskit/volt-strict-mode/no-multiple-exports
345
378
  export default function ExtensionNodeView(portalProviderAPI, eventDispatcher, providerFactory, extensionHandlers, extensionLoadingHandlers, extensionNodeViewOptions, pluginInjectionApi, macroInteractionDesignFeatureFlags, showLivePagesBodiedMacrosRendererView, showUpdatedLivePages1PBodiedExtensionUI, rendererExtensionHandlers, intl) {
@@ -1,9 +1,21 @@
1
+ import _extends from "@babel/runtime/helpers/extends";
2
+ import _classCallCheck from "@babel/runtime/helpers/classCallCheck";
3
+ import _createClass from "@babel/runtime/helpers/createClass";
4
+ import _possibleConstructorReturn from "@babel/runtime/helpers/possibleConstructorReturn";
5
+ import _getPrototypeOf from "@babel/runtime/helpers/getPrototypeOf";
6
+ import _inherits from "@babel/runtime/helpers/inherits";
7
+ import _defineProperty from "@babel/runtime/helpers/defineProperty";
1
8
  import _slicedToArray from "@babel/runtime/helpers/slicedToArray";
2
9
  import _asyncToGenerator from "@babel/runtime/helpers/asyncToGenerator";
3
10
  import _regeneratorRuntime from "@babel/runtime/regenerator";
11
+ function _callSuper(t, o, e) { return o = _getPrototypeOf(o), _possibleConstructorReturn(t, _isNativeReflectConstruct() ? Reflect.construct(o, e || [], _getPrototypeOf(t).constructor) : o.apply(t, e)); }
12
+ function _isNativeReflectConstruct() { try { var t = !Boolean.prototype.valueOf.call(Reflect.construct(Boolean, [], function () {})); } catch (t) {} return (_isNativeReflectConstruct = function _isNativeReflectConstruct() { return !!t; })(); }
4
13
  import React from 'react';
5
14
  import { useIntl } from 'react-intl';
6
15
  import Loadable from 'react-loadable';
16
+ // oxlint-disable-next-line @atlassian/no-restricted-imports
17
+ import { lazy, LazySuspense } from 'react-loosely-lazy';
18
+ import { isExperimentEnabled } from '@atlaskit/platform-feature-experiments/is-experiment-enabled';
7
19
  import { getExtensionKeyAndNodeKey, resolveImport } from './manifest-helpers';
8
20
  import { messages } from './messages';
9
21
  import { resolveImportSync } from './resolveImportSync';
@@ -105,6 +117,52 @@ function isUnknownConfluenceMacroWithBody(extensionNode) {
105
117
  var _extensionNode$parame;
106
118
  return extensionNode !== null && extensionNode.type === 'extension' && extensionNode.extensionType === 'com.atlassian.confluence.macro.core' && !!((_extensionNode$parame = extensionNode.parameters) !== null && _extensionNode$parame !== void 0 && (_extensionNode$parame = _extensionNode$parame.macroParams) !== null && _extensionNode$parame !== void 0 && (_extensionNode$parame = _extensionNode$parame.__bodyContent) !== null && _extensionNode$parame !== void 0 && _extensionNode$parame.value);
107
119
  }
120
+ // eslint-disable-next-line @repo/internal/react/no-class-components -- error boundaries require a class component
121
+ var ExtensionRendererErrorBoundary = /*#__PURE__*/function (_React$Component) {
122
+ function ExtensionRendererErrorBoundary() {
123
+ var _this;
124
+ _classCallCheck(this, ExtensionRendererErrorBoundary);
125
+ for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) {
126
+ args[_key] = arguments[_key];
127
+ }
128
+ _this = _callSuper(this, ExtensionRendererErrorBoundary, [].concat(args));
129
+ _defineProperty(_this, "state", {});
130
+ return _this;
131
+ }
132
+ _inherits(ExtensionRendererErrorBoundary, _React$Component);
133
+ return _createClass(ExtensionRendererErrorBoundary, [{
134
+ key: "componentDidCatch",
135
+ value: function componentDidCatch(error) {
136
+ // eslint-disable-next-line no-console
137
+ console.error('Error rendering extension', error);
138
+ }
139
+ }, {
140
+ key: "render",
141
+ value: function render() {
142
+ return this.state.error ? renderExtensionLoadingError(this.state.error, this.props.fallbackProps) : this.props.children;
143
+ }
144
+ }], [{
145
+ key: "getDerivedStateFromError",
146
+ value: function getDerivedStateFromError(error) {
147
+ return {
148
+ error: error
149
+ };
150
+ }
151
+ }]);
152
+ }(React.Component);
153
+ var noop = function noop() {};
154
+ function renderExtensionLoadingError(error, props) {
155
+ // Needed because the old react-loadable (older code-splitting library) error handling behaviour might be relied on by extensions.
156
+ // https://unpkg.com/react-loadable@5.2.2/lib/index.js
157
+ return /*#__PURE__*/React.createElement(ExtensionLoading, _extends({
158
+ isLoading: false,
159
+ pastDelay: true,
160
+ timedOut: false,
161
+ error: error,
162
+ retry: noop
163
+ // eslint-disable-next-line react/jsx-props-no-spreading
164
+ }, props));
165
+ }
108
166
  function ExtensionLoading(props) {
109
167
  var intl = useIntl();
110
168
  var extensionNode = props.node;
@@ -127,29 +185,51 @@ function ExtensionLoading(props) {
127
185
 
128
186
  // eslint-disable-next-line @atlaskit/volt-strict-mode/no-multiple-exports
129
187
  export function getNodeRenderer(extensionProvider, extensionType, extensionKey) {
130
- return Loadable({
131
- loader: function loader() {
132
- var maybePromise = getExtensionModuleNodeMaybePreloaded(extensionProvider, extensionType, extensionKey);
133
- if (maybePromise instanceof Promise) {
134
- return maybePromise.then(function (node) {
135
- return resolveImport(node.render());
136
- });
137
- } else {
138
- var _renderSync, _ref;
139
- var preloaded = maybePromise === null || maybePromise === void 0 || (_renderSync = (_ref = maybePromise).renderSync) === null || _renderSync === void 0 ? void 0 : _renderSync.call(_ref);
140
- // Only product implemented preloading will return sync result
141
- // However the out-of-box won't handle this. Confluence uses a custom implementation
142
- return preloaded ?
143
- // eslint-disable-next-line @typescript-eslint/no-explicit-any
144
- resolveImportSync(preloaded) : resolveImport(maybePromise.render());
145
- }
146
- },
188
+ var loadNodeRenderer = function loadNodeRenderer() {
189
+ var _renderSync, _ref;
190
+ var maybePromise = getExtensionModuleNodeMaybePreloaded(extensionProvider, extensionType, extensionKey);
191
+ if (maybePromise instanceof Promise) {
192
+ return maybePromise.then(function (node) {
193
+ return resolveImport(node.render());
194
+ });
195
+ }
196
+ var preloaded = maybePromise === null || maybePromise === void 0 || (_renderSync = (_ref = maybePromise).renderSync) === null || _renderSync === void 0 ? void 0 : _renderSync.call(_ref);
197
+ // Only product implemented preloading will return sync result
198
+ // However the out-of-box won't handle this. Confluence uses a custom implementation
199
+ return preloaded ?
200
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
201
+ resolveImportSync(preloaded) : resolveImport(maybePromise.render());
202
+ };
203
+ var LazyNodeRenderer = lazy(function () {
204
+ return loadNodeRenderer();
205
+ });
206
+ LazyNodeRenderer.displayName = 'lazy(NodeRenderer)';
207
+ // Ignored via go/ees005
208
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
209
+ var LoadableNodeRenderer = Loadable({
210
+ loader: loadNodeRenderer,
147
211
  // react-loadable passes all props from <NodeRenderer> to the loading component at runtime,
148
212
  // but its TypeScript types only expect LoadingComponentProps. We cast here because
149
213
  // ExtensionLoading accepts additional props (node, showUnknownMacroPlaceholder) that
150
214
  // react-loadable will pass through but doesn't know about in its type definitions.
151
215
  loading: ExtensionLoading
152
216
  });
217
+ var NodeRenderer = function NodeRenderer(props) {
218
+ var _props$loadingFallbac;
219
+ if (!isExperimentEnabled('platform_editor_loosely_lazy_migration')) {
220
+ // eslint-disable-next-line react/jsx-props-no-spreading
221
+ return /*#__PURE__*/React.createElement(LoadableNodeRenderer, props);
222
+ }
223
+ return /*#__PURE__*/React.createElement(ExtensionRendererErrorBoundary, {
224
+ fallbackProps: props
225
+ }, /*#__PURE__*/React.createElement(LazySuspense, {
226
+ fallback: (_props$loadingFallbac = props.loadingFallback) !== null && _props$loadingFallbac !== void 0 ? _props$loadingFallbac : null
227
+ }, /*#__PURE__*/React.createElement(LazyNodeRenderer, props)));
228
+ };
229
+ NodeRenderer.preload = function () {
230
+ return isExperimentEnabled('platform_editor_loosely_lazy_migration') ? LazyNodeRenderer.preload() : LoadableNodeRenderer.preload();
231
+ };
232
+ return NodeRenderer;
153
233
  }
154
234
  // eslint-disable-next-line @atlaskit/editor/no-re-export
155
235
  export { getExtensionManifest } from './getExtensionManifest';
@@ -3,6 +3,9 @@ import _asyncToGenerator from "@babel/runtime/helpers/asyncToGenerator";
3
3
  import _regeneratorRuntime from "@babel/runtime/regenerator";
4
4
  import React, { useEffect, useRef, useState } from 'react';
5
5
  import Loadable from 'react-loadable';
6
+ // oxlint-disable-next-line @atlassian/no-restricted-imports
7
+ import { lazy, LazySuspense } from 'react-loosely-lazy';
8
+ import { isExperimentEnabled } from '@atlaskit/platform-feature-experiments/is-experiment-enabled';
6
9
  import { getContextualToolbarItemsFromModule } from '../extensions';
7
10
  import { nodeToJSON } from '../utils';
8
11
  import { DropdownMenuItem } from './DropdownMenuItem';
@@ -85,12 +88,29 @@ var DropdownMenuExtensionItem = function DropdownMenuExtensionItem(_ref3) {
85
88
  // Use ref to keep icon component stable across renders
86
89
  var iconRef = useRef(null);
87
90
  if (!iconRef.current && item.icon) {
88
- iconRef.current = Loadable({
89
- loader: function loader() {
90
- return resolveExtensionIcon(item.icon);
91
- },
91
+ var loadIcon = function loadIcon() {
92
+ return resolveExtensionIcon(item.icon);
93
+ };
94
+ var IconLazy = lazy(function () {
95
+ return resolveExtensionIcon(item.icon);
96
+ });
97
+ IconLazy.displayName = 'lazy(ExtensionIcon)';
98
+ var IconLoadable = Loadable({
99
+ loader: loadIcon,
92
100
  loading: noop
93
101
  });
102
+ var Icon = function Icon(props) {
103
+ return isExperimentEnabled('platform_editor_loosely_lazy_migration') ? /*#__PURE__*/React.createElement(LazySuspense, {
104
+ fallback: null
105
+ }, /*#__PURE__*/React.createElement(IconLazy, props)) :
106
+ /*#__PURE__*/
107
+ // eslint-disable-next-line react/jsx-props-no-spreading -- pass icon props to the legacy component
108
+ React.createElement(IconLoadable, props);
109
+ };
110
+ Icon.preload = function () {
111
+ return isExperimentEnabled('platform_editor_loosely_lazy_migration') ? IconLazy.preload() : IconLoadable.preload();
112
+ };
113
+ iconRef.current = Icon;
94
114
  }
95
115
  var dropdownItem = convertExtensionToDropdownMenuItem({
96
116
  item: item,
@@ -1,7 +1,11 @@
1
1
  // Disable no-re-export rule for entry point files
2
2
  /* eslint-disable @atlaskit/editor/no-re-export */
3
3
 
4
+ import React from 'react';
4
5
  import Loadable from 'react-loadable';
6
+ // oxlint-disable-next-line @atlassian/no-restricted-imports
7
+ import { lazy, LazySuspense } from 'react-loosely-lazy';
8
+ import { isExperimentEnabled } from '@atlaskit/platform-feature-experiments/is-experiment-enabled';
5
9
  export { PanelInfoIcon } from './shared/PanelInfoIcon';
6
10
  export { PanelWarningIcon } from './shared/PanelWarningIcon';
7
11
  export { PanelErrorIcon } from './shared/PanelErrorIcon';
@@ -10,13 +14,31 @@ export { PanelNoteIcon } from './shared/PanelNoteIcon';
10
14
  export { BorderIcon } from './shared/BorderIcon';
11
15
  export { SteppedRainbowIconDecoration, rainbow, disabledRainbow } from './shared/SteppedRainbowIconDecoration';
12
16
  export { DynamicStrokeIconDecoration } from './shared/DynamicStrokeIconDecoration';
13
- export var IconTable = Loadable({
14
- loader: function loader() {
15
- return import( /* webpackChunkName: "@atlaskit-internal_editor-icon-table" */'../icons/shared/table').then(function (module) {
16
- return module.default;
17
- });
18
- },
17
+ var loadIconTable = function loadIconTable() {
18
+ return import( /* webpackChunkName: "@atlaskit-internal_editor-icon-table" */'../icons/shared/table').then(function (module) {
19
+ return module.default;
20
+ });
21
+ };
22
+ var IconTableLazy = lazy(function () {
23
+ return import( /* webpackChunkName: "@atlaskit-internal_editor-icon-table" */'../icons/shared/table').then(function (module) {
24
+ return module.default;
25
+ });
26
+ });
27
+ IconTableLazy.displayName = 'lazy(IconTable)';
28
+ var IconTableLoadable = Loadable({
29
+ loader: loadIconTable,
19
30
  loading: function loading() {
20
31
  return null;
21
32
  }
22
- });
33
+ });
34
+ export var IconTable = function IconTable(props) {
35
+ return isExperimentEnabled('platform_editor_loosely_lazy_migration') ? /*#__PURE__*/React.createElement(LazySuspense, {
36
+ fallback: null
37
+ }, /*#__PURE__*/React.createElement(IconTableLazy, props)) :
38
+ /*#__PURE__*/
39
+ // eslint-disable-next-line react/jsx-props-no-spreading -- pass icon props to the legacy component
40
+ React.createElement(IconTableLoadable, props);
41
+ };
42
+ IconTable.preload = function () {
43
+ return isExperimentEnabled('platform_editor_loosely_lazy_migration') ? IconTableLazy.preload() : IconTableLoadable.preload();
44
+ };
@@ -25,6 +25,11 @@ export var findReplaceMessages = defineMessages({
25
25
  defaultMessage: 'Find and Replace',
26
26
  description: 'Aria label for the "Find and Replace" dialog'
27
27
  },
28
+ findDialogAriaLabel: {
29
+ id: 'fabric.editor.findDialogAriaLabel',
30
+ defaultMessage: 'Find',
31
+ description: 'Aria label for the "Find" dialog, used where the dialog offers find without replace'
32
+ },
28
33
  closeFindReplaceDialog: {
29
34
  id: 'fabric.editor.closeFindReplaceDialog',
30
35
  defaultMessage: 'Close',
@@ -19,7 +19,7 @@ var NETWORK_FAILURE_REGEX = /^network failure/i;
19
19
  var RESIZE_OBSERVER_LOOP_REGEX = /ResizeObserver loop completed with undelivered notifications/;
20
20
  var SENTRY_DSN = 'https://0b10c8e02fb44d8796c047b102c9bee8@o55978.ingest.sentry.io/4505129224110080';
21
21
  var packageName = 'editor-common'; // Sentry doesn't accept '/' in its releases https://docs.sentry.io/platforms/javascript/configuration/releases/
22
- var packageVersion = "124.0.0";
22
+ var packageVersion = "125.1.0";
23
23
  var sanitiseSentryEvents = function sanitiseSentryEvents(data, _hint) {
24
24
  // Remove URL as it has UGC
25
25
  // Ignored via go/ees007