@atlaskit/editor-core 216.10.1 → 216.11.3

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 (34) hide show
  1. package/CHANGELOG.md +33 -0
  2. package/afm-cc/tsconfig.json +0 -1
  3. package/afm-jira/tsconfig.json +0 -1
  4. package/afm-products/tsconfig.json +0 -1
  5. package/dist/cjs/composable-editor/editor-internal.js +1 -0
  6. package/dist/cjs/composable-editor/hooks/useMemoEditorProps.js +2 -1
  7. package/dist/cjs/create-editor/ReactEditorView.js +92 -21
  8. package/dist/cjs/ui/Appearance/FullPage/FullPage.js +10 -2
  9. package/dist/cjs/utils/getNodesCount.js +1 -0
  10. package/dist/cjs/utils/getNodesCountWithExtensionKeys.js +32 -0
  11. package/dist/cjs/version-wrapper.js +1 -1
  12. package/dist/es2019/composable-editor/editor-internal.js +1 -0
  13. package/dist/es2019/composable-editor/hooks/useMemoEditorProps.js +2 -1
  14. package/dist/es2019/create-editor/ReactEditorView.js +82 -17
  15. package/dist/es2019/ui/Appearance/FullPage/FullPage.js +10 -2
  16. package/dist/es2019/utils/getNodesCount.js +1 -0
  17. package/dist/es2019/utils/getNodesCountWithExtensionKeys.js +26 -0
  18. package/dist/es2019/version-wrapper.js +1 -1
  19. package/dist/esm/composable-editor/editor-internal.js +1 -0
  20. package/dist/esm/composable-editor/hooks/useMemoEditorProps.js +2 -1
  21. package/dist/esm/create-editor/ReactEditorView.js +93 -22
  22. package/dist/esm/ui/Appearance/FullPage/FullPage.js +10 -2
  23. package/dist/esm/utils/getNodesCount.js +1 -0
  24. package/dist/esm/utils/getNodesCountWithExtensionKeys.js +26 -0
  25. package/dist/esm/version-wrapper.js +1 -1
  26. package/dist/types/create-editor/ReactEditorView.d.ts +5 -0
  27. package/dist/types/types/editor-appearance-component.d.ts +5 -0
  28. package/dist/types/types/editor-props.d.ts +26 -0
  29. package/dist/types/utils/getNodesCountWithExtensionKeys.d.ts +12 -0
  30. package/dist/types-ts4.5/create-editor/ReactEditorView.d.ts +5 -0
  31. package/dist/types-ts4.5/types/editor-appearance-component.d.ts +5 -0
  32. package/dist/types-ts4.5/types/editor-props.d.ts +26 -0
  33. package/dist/types-ts4.5/utils/getNodesCountWithExtensionKeys.d.ts +12 -0
  34. package/package.json +6 -3
package/CHANGELOG.md CHANGED
@@ -1,5 +1,38 @@
1
1
  # @atlaskit/editor-core
2
2
 
3
+ ## 216.11.3
4
+
5
+ ### Patch Changes
6
+
7
+ - Updated dependencies
8
+
9
+ ## 216.11.2
10
+
11
+ ### Patch Changes
12
+
13
+ - [`0eed66892511e`](https://bitbucket.org/atlassian/atlassian-frontend-monorepo/commits/0eed66892511e) -
14
+ EDITOR-5120 - Add additional ProseMirror rendered analytics attributes behind the
15
+ platform_editor_prosemirror_rendered_data experiment.
16
+ - Updated dependencies
17
+
18
+ ## 216.11.1
19
+
20
+ ### Patch Changes
21
+
22
+ - Updated dependencies
23
+
24
+ ## 216.11.0
25
+
26
+ ### Minor Changes
27
+
28
+ - [`cbc1403b3cae1`](https://bitbucket.org/atlassian/atlassian-frontend-monorepo/commits/cbc1403b3cae1) -
29
+ [EDITOR-5094](https://hello.jira.atlassian.cloud/browse/EDITOR-5094) - add PerfPortal segments for
30
+ editor SSR logic
31
+
32
+ ### Patch Changes
33
+
34
+ - Updated dependencies
35
+
3
36
  ## 216.10.1
4
37
 
5
38
  ### Patch Changes
@@ -1,7 +1,6 @@
1
1
  {
2
2
  "extends": "../../../../tsconfig.local-consumption.json",
3
3
  "compilerOptions": {
4
- "declaration": true,
5
4
  "target": "es5",
6
5
  "outDir": "../../../../../confluence/tsDist/@atlaskit__editor-core",
7
6
  "rootDir": "../",
@@ -1,7 +1,6 @@
1
1
  {
2
2
  "extends": "../../../../tsconfig.local-consumption.json",
3
3
  "compilerOptions": {
4
- "declaration": true,
5
4
  "target": "es5",
6
5
  "outDir": "../../../../../jira/tsDist/@atlaskit__editor-core/app",
7
6
  "rootDir": "../",
@@ -1,7 +1,6 @@
1
1
  {
2
2
  "extends": "../../../../tsconfig.local-consumption.json",
3
3
  "compilerOptions": {
4
- "declaration": true,
5
4
  "target": "es5",
6
5
  "outDir": "../../../../../tsDist/@atlaskit__editor-core/app",
7
6
  "rootDir": "../",
@@ -129,6 +129,7 @@ var EditorInternal = exports.EditorInternal = /*#__PURE__*/(0, _react.memo)(func
129
129
  minHeight: props.minHeight,
130
130
  onSave: props.onSave ? handleSave : undefined,
131
131
  onCancel: props.onCancel,
132
+ onSSRMeasure: props.onSSRMeasure,
132
133
  popupsMountPoint: props.popupsMountPoint,
133
134
  popupsBoundariesElement: props.popupsBoundariesElement,
134
135
  popupsScrollableElement: props.popupsScrollableElement,
@@ -94,6 +94,7 @@ var useMemoEditorProps = exports.useMemoEditorProps = function useMemoEditorProp
94
94
  mention: passedProps.mention,
95
95
  mentionInsertDisplayName: passedProps.mentionInsertDisplayName,
96
96
  uploadErrorHandler: passedProps.uploadErrorHandler,
97
+ onSSRMeasure: passedProps.onSSRMeasure,
97
98
  waitForMediaUpload: passedProps.waitForMediaUpload,
98
99
  extensionHandlers: passedProps.extensionHandlers,
99
100
  allowTextColor: passedProps.allowTextColor,
@@ -118,7 +119,7 @@ var useMemoEditorProps = exports.useMemoEditorProps = function useMemoEditorProp
118
119
  };
119
120
  var nextProps = _objectSpread(_objectSpread({}, defaultProps), allProps);
120
121
  return nextProps;
121
- }, [passedProps.preset, passedProps.appearance, passedProps.contentMode, passedProps.contentComponents, passedProps.primaryToolbarIconBefore, passedProps.secondaryToolbarComponents, passedProps.persistScrollGutter, passedProps.quickInsert, passedProps.shouldFocus, passedProps.disabled, passedProps.contextPanel, passedProps.errorReporterHandler, passedProps.contentTransformerProvider, passedProps.maxHeight, passedProps.minHeight, passedProps.placeholder, passedProps.placeholderBracketHint, passedProps.performanceTracking, passedProps.inputSamplingLimit, passedProps.defaultValue, passedProps.assistiveLabel, passedProps.assistiveDescribedBy, passedProps.popupsMountPoint, passedProps.popupsBoundariesElement, passedProps.popupsScrollableElement, passedProps.editorActions, passedProps.onEditorReady, passedProps.onDestroy, passedProps.onChange, passedProps.onCancel, passedProps.extensionProviders, passedProps.UNSAFE_useAnalyticsContext, passedProps.useStickyToolbar, passedProps.featureFlags, passedProps.onSave, passedProps.sanitizePrivateContent, passedProps.media, passedProps.collabEdit, passedProps.primaryToolbarComponents, passedProps.allowUndoRedoButtons, passedProps.linking, passedProps.activityProvider, passedProps.searchProvider, passedProps.annotationProviders, passedProps.collabEditProvider, passedProps.presenceProvider, passedProps.emojiProvider, passedProps.taskDecisionProvider, passedProps.legacyImageUploadProvider, passedProps.mentionProvider, passedProps.autoformattingProvider, passedProps.macroProvider, passedProps.contextIdentifierProvider, passedProps.allowExpand, passedProps.allowNestedTasks, passedProps.allowBlockType, passedProps.allowTasksAndDecisions, passedProps.allowBreakout, passedProps.allowRule, passedProps.allowHelpDialog, passedProps.allowPanel, passedProps.allowExtension, passedProps.allowConfluenceInlineComment, passedProps.allowTemplatePlaceholders, passedProps.allowDate, passedProps.allowLayouts, passedProps.allowStatus, passedProps.allowTextAlignment, passedProps.allowIndentation, passedProps.showIndentationButtons, passedProps.allowFindReplace, passedProps.allowBorderMark, passedProps.allowFragmentMark, passedProps.autoScrollIntoView, passedProps.elementBrowser, passedProps.maxContentSize, passedProps.saveOnEnter, passedProps.feedbackInfo, passedProps.mention, passedProps.mentionInsertDisplayName, passedProps.uploadErrorHandler, passedProps.waitForMediaUpload, passedProps.extensionHandlers, passedProps.allowTextColor, passedProps.allowTables, passedProps.insertMenuItems, passedProps.UNSAFE_cards, passedProps.smartLinks, passedProps.allowAnalyticsGASV3, passedProps.codeBlock, passedProps.textFormatting, passedProps.__livePage, passedProps.AppearanceComponent, passedProps.skipValidation, passedProps.syncBlock, passedProps.syncedBlockProvider, passedProps.pasteWarningOptions]);
122
+ }, [passedProps.preset, passedProps.appearance, passedProps.contentMode, passedProps.contentComponents, passedProps.primaryToolbarIconBefore, passedProps.secondaryToolbarComponents, passedProps.persistScrollGutter, passedProps.quickInsert, passedProps.shouldFocus, passedProps.disabled, passedProps.contextPanel, passedProps.errorReporterHandler, passedProps.contentTransformerProvider, passedProps.maxHeight, passedProps.minHeight, passedProps.placeholder, passedProps.placeholderBracketHint, passedProps.performanceTracking, passedProps.inputSamplingLimit, passedProps.defaultValue, passedProps.assistiveLabel, passedProps.assistiveDescribedBy, passedProps.popupsMountPoint, passedProps.popupsBoundariesElement, passedProps.popupsScrollableElement, passedProps.editorActions, passedProps.onEditorReady, passedProps.onDestroy, passedProps.onChange, passedProps.onCancel, passedProps.onSSRMeasure, passedProps.extensionProviders, passedProps.UNSAFE_useAnalyticsContext, passedProps.useStickyToolbar, passedProps.featureFlags, passedProps.onSave, passedProps.sanitizePrivateContent, passedProps.media, passedProps.collabEdit, passedProps.primaryToolbarComponents, passedProps.allowUndoRedoButtons, passedProps.linking, passedProps.activityProvider, passedProps.searchProvider, passedProps.annotationProviders, passedProps.collabEditProvider, passedProps.presenceProvider, passedProps.emojiProvider, passedProps.taskDecisionProvider, passedProps.legacyImageUploadProvider, passedProps.mentionProvider, passedProps.autoformattingProvider, passedProps.macroProvider, passedProps.contextIdentifierProvider, passedProps.allowExpand, passedProps.allowNestedTasks, passedProps.allowBlockType, passedProps.allowTasksAndDecisions, passedProps.allowBreakout, passedProps.allowRule, passedProps.allowHelpDialog, passedProps.allowPanel, passedProps.allowExtension, passedProps.allowConfluenceInlineComment, passedProps.allowTemplatePlaceholders, passedProps.allowDate, passedProps.allowLayouts, passedProps.allowStatus, passedProps.allowTextAlignment, passedProps.allowIndentation, passedProps.showIndentationButtons, passedProps.allowFindReplace, passedProps.allowBorderMark, passedProps.allowFragmentMark, passedProps.autoScrollIntoView, passedProps.elementBrowser, passedProps.maxContentSize, passedProps.saveOnEnter, passedProps.feedbackInfo, passedProps.mention, passedProps.mentionInsertDisplayName, passedProps.uploadErrorHandler, passedProps.waitForMediaUpload, passedProps.extensionHandlers, passedProps.allowTextColor, passedProps.allowTables, passedProps.insertMenuItems, passedProps.UNSAFE_cards, passedProps.smartLinks, passedProps.allowAnalyticsGASV3, passedProps.codeBlock, passedProps.textFormatting, passedProps.__livePage, passedProps.AppearanceComponent, passedProps.skipValidation, passedProps.syncBlock, passedProps.syncedBlockProvider, passedProps.pasteWarningOptions]);
122
123
  return memodProps;
123
124
  };
124
125
  var _default = exports.default = useMemoEditorProps;
@@ -17,10 +17,12 @@ var _analytics = require("@atlaskit/editor-common/analytics");
17
17
  var _coreUtils = require("@atlaskit/editor-common/core-utils");
18
18
  var _eventDispatcher = require("@atlaskit/editor-common/event-dispatcher");
19
19
  var _hooks = require("@atlaskit/editor-common/hooks");
20
+ var _isPerformanceApiAvailable = require("@atlaskit/editor-common/is-performance-api-available");
20
21
  var _nodeVisibility = require("@atlaskit/editor-common/node-visibility");
21
22
  var _normalizeFeatureFlags = require("@atlaskit/editor-common/normalize-feature-flags");
22
23
  var _measureRender = require("@atlaskit/editor-common/performance/measure-render");
23
24
  var _navigation = require("@atlaskit/editor-common/performance/navigation");
25
+ var _ssrMeasures = require("@atlaskit/editor-common/performance/ssr-measures");
24
26
  var _preset = require("@atlaskit/editor-common/preset");
25
27
  var _processRawValue = require("@atlaskit/editor-common/process-raw-value");
26
28
  var _uiReact = require("@atlaskit/editor-common/ui-react");
@@ -30,12 +32,14 @@ var _state2 = require("@atlaskit/editor-prosemirror/state");
30
32
  var _view = require("@atlaskit/editor-prosemirror/view");
31
33
  var _editorSsrRenderer = require("@atlaskit/editor-ssr-renderer");
32
34
  var _platformFeatureFlags = require("@atlaskit/platform-feature-flags");
35
+ var _interactionIdContext = require("@atlaskit/react-ufo/interaction-id-context");
33
36
  var _interactionMetrics = require("@atlaskit/react-ufo/interaction-metrics");
34
37
  var _expValEquals = require("@atlaskit/tmp-editor-statsig/exp-val-equals");
35
38
  var _expVal = require("@atlaskit/tmp-editor-statsig/expVal");
36
39
  var _useProviders = require("../composable-editor/hooks/useProviders");
37
40
  var _featureFlagsFromProps = require("../utils/feature-flags-from-props");
38
41
  var _getNodesCount = require("../utils/getNodesCount");
42
+ var _getNodesCountWithExtensionKeys = require("../utils/getNodesCountWithExtensionKeys");
39
43
  var _getNodesVisibleInViewport = require("../utils/getNodesVisibleInViewport");
40
44
  var _isChromeless = require("../utils/is-chromeless");
41
45
  var _isFullPage = require("../utils/is-full-page");
@@ -58,10 +62,15 @@ function _arrayLikeToArray(r, a) { (null == a || a > r.length) && (a = r.length)
58
62
  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; }
59
63
  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) { (0, _defineProperty2.default)(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; } // eslint-disable-next-line @atlaskit/platform/prefer-crypto-random-uuid -- Use crypto.randomUUID instead
60
64
  var EDIT_AREA_ID = 'ak-editor-textarea';
65
+ var SSR_TRACE_SEGMENT_NAME = 'reactEditorView';
66
+ var bootStartTime = (0, _isPerformanceApiAvailable.isPerformanceAPIAvailable)() ? performance.now() : undefined;
61
67
  function ReactEditorView(props) {
62
68
  var _pluginInjectionAPI$c, _media, _linking, _document$querySelect, _props$render, _props$render2;
69
+ // Should be always the first statement in the component
70
+ var firstRenderStartTimestampRef = (0, _react.useRef)(performance.now());
63
71
  var preset = props.preset,
64
72
  _props$editorProps = props.editorProps,
73
+ onSSRMeasure = _props$editorProps.onSSRMeasure,
65
74
  nextAppearance = _props$editorProps.appearance,
66
75
  disabled = _props$editorProps.disabled,
67
76
  editorPropFeatureFlags = _props$editorProps.featureFlags,
@@ -467,9 +476,11 @@ function ReactEditorView(props) {
467
476
  distortedDuration = _ref3.distortedDuration;
468
477
  var proseMirrorRenderedSeverity = (0, _analytics2.getAnalyticsEventSeverity)(duration, _consts.PROSEMIRROR_RENDERED_NORMAL_SEVERITY_THRESHOLD, _consts.PROSEMIRROR_RENDERED_DEGRADED_SEVERITY_THRESHOLD);
469
478
  if (viewRef.current) {
470
- var _pluginInjectionAPI$c2;
471
- var nodes = (0, _getNodesCount.getNodesCount)(viewRef.current.state.doc);
479
+ var _nodesAndExtensionKey, _pluginInjectionAPI$c2;
480
+ var nodesAndExtensionKeys = (0, _expValEquals.expValEquals)('platform_editor_prosemirror_rendered_data', 'isEnabled', true) ? (0, _getNodesCountWithExtensionKeys.getNodesCountWithExtensionKeys)(viewRef.current.state.doc) : undefined;
481
+ var nodes = (_nodesAndExtensionKey = nodesAndExtensionKeys === null || nodesAndExtensionKeys === void 0 ? void 0 : nodesAndExtensionKeys.nodes) !== null && _nodesAndExtensionKey !== void 0 ? _nodesAndExtensionKey : (0, _getNodesCount.getNodesCount)(viewRef.current.state.doc);
472
482
  var ttfb = (0, _navigation.getResponseEndTime)();
483
+ var requestToResponseTime = (0, _navigation.getRequestToResponseTime)();
473
484
  var contextIdentifier = (_pluginInjectionAPI$c2 = pluginInjectionAPI.current.api().base) === null || _pluginInjectionAPI$c2 === void 0 ? void 0 : _pluginInjectionAPI$c2.sharedState.currentState();
474
485
  var nodesInViewport = (0, _getNodesVisibleInViewport.getNodesVisibleInViewport)(viewRef.current.dom);
475
486
  var nodeSize = viewRef.current.state.doc.nodeSize;
@@ -497,10 +508,51 @@ function ReactEditorView(props) {
497
508
  } : {},
498
509
  totalNodes = _ref4.totalNodes,
499
510
  nodeSizeBucket = _ref4.nodeSizeBucket;
500
- dispatchAnalyticsEvent({
501
- action: _analytics.ACTION.PROSEMIRROR_RENDERED,
502
- actionSubject: _analytics.ACTION_SUBJECT.EDITOR,
503
- attributes: {
511
+ if ((0, _expValEquals.expValEquals)('platform_editor_prosemirror_rendered_data', 'isEnabled', true)) {
512
+ var _nodesAndExtensionKey2;
513
+ var extensionKeys = (_nodesAndExtensionKey2 = nodesAndExtensionKeys === null || nodesAndExtensionKeys === void 0 ? void 0 : nodesAndExtensionKeys.extensionKeys) !== null && _nodesAndExtensionKey2 !== void 0 ? _nodesAndExtensionKey2 : {};
514
+ var interaction = (0, _interactionMetrics.getActiveInteraction)();
515
+ var pageLoadType = interaction === null || interaction === void 0 ? void 0 : interaction.type;
516
+ var pageType = interaction === null || interaction === void 0 ? void 0 : interaction.routeName;
517
+ var timings = function () {
518
+ if (requestToResponseTime === undefined && bootStartTime === undefined) {
519
+ return undefined;
520
+ }
521
+ var timingValues = {};
522
+ if (requestToResponseTime !== undefined) {
523
+ timingValues['requestStart->responseEnd'] = Math.round(requestToResponseTime);
524
+ }
525
+ if (bootStartTime !== undefined) {
526
+ timingValues.bootToRender = Math.round(startTime - bootStartTime);
527
+ }
528
+ return timingValues;
529
+ }();
530
+ var attributes = {
531
+ duration: duration,
532
+ startTime: startTime,
533
+ nodes: nodes,
534
+ nodesInViewport: nodesInViewport,
535
+ nodeSize: nodeSize,
536
+ nodeSizeBucket: nodeSizeBucket,
537
+ totalNodes: totalNodes,
538
+ ttfb: ttfb,
539
+ severity: proseMirrorRenderedSeverity,
540
+ objectId: contextIdentifier === null || contextIdentifier === void 0 ? void 0 : contextIdentifier.objectId,
541
+ distortedDuration: distortedDuration,
542
+ pageLoadType: pageLoadType,
543
+ pageType: pageType,
544
+ timings: timings,
545
+ extensionKeys: extensionKeys,
546
+ ufoInteractionId: (0, _interactionIdContext.getInteractionId)().current
547
+ };
548
+ dispatchAnalyticsEvent({
549
+ action: _analytics.ACTION.PROSEMIRROR_RENDERED,
550
+ actionSubject: _analytics.ACTION_SUBJECT.EDITOR,
551
+ attributes: attributes,
552
+ eventType: _analytics.EVENT_TYPE.OPERATIONAL
553
+ });
554
+ } else {
555
+ var _attributes = {
504
556
  duration: duration,
505
557
  startTime: startTime,
506
558
  nodes: nodes,
@@ -512,9 +564,14 @@ function ReactEditorView(props) {
512
564
  severity: proseMirrorRenderedSeverity,
513
565
  objectId: contextIdentifier === null || contextIdentifier === void 0 ? void 0 : contextIdentifier.objectId,
514
566
  distortedDuration: distortedDuration
515
- },
516
- eventType: _analytics.EVENT_TYPE.OPERATIONAL
517
- });
567
+ };
568
+ dispatchAnalyticsEvent({
569
+ action: _analytics.ACTION.PROSEMIRROR_RENDERED,
570
+ actionSubject: _analytics.ACTION_SUBJECT.EDITOR,
571
+ attributes: _attributes,
572
+ eventType: _analytics.EVENT_TYPE.OPERATIONAL
573
+ });
574
+ }
518
575
  }
519
576
  });
520
577
  pluginInjectionAPI.current.onEditorViewUpdated({
@@ -778,20 +835,29 @@ function ReactEditorView(props) {
778
835
  if (!(0, _coreUtils.isSSR)() || !(0, _expValEquals.expValEquals)('platform_editor_ssr_renderer', 'isEnabled', true)) {
779
836
  return null;
780
837
  }
781
- var plugins = (0, _createPluginsList.default)(props.preset,
782
- // Don't pass props.editorProps directly, because editoProps in the dependency will lead to
783
- // multiple repaints, because props.editorPros is not stable object.
784
- {
785
- allowBlockType: allowBlockType
786
- }, pluginInjectionAPI.current);
787
- var schema = (0, _createSchema.createSchema)((0, _createEditor.processPluginsList)(plugins));
788
- var doc = buildDoc(schema);
838
+ var doCreatePluginList = function doCreatePluginList() {
839
+ return (0, _createPluginsList.default)(props.preset,
840
+ // Don't pass props.editorProps directly, because editoProps in the dependency will lead to
841
+ // multiple repaints, because props.editorPros is not stable object.
842
+ {
843
+ allowBlockType: allowBlockType
844
+ }, pluginInjectionAPI.current);
845
+ };
846
+ var plugins = (0, _platformFeatureFlags.fg)('platform_editor_better_editor_ssr_spans') ? (0, _ssrMeasures.profileSSROperation)("".concat(SSR_TRACE_SEGMENT_NAME, "/createPluginsList"), doCreatePluginList, onSSRMeasure) : doCreatePluginList();
847
+ var doCreateSchema = function doCreateSchema() {
848
+ return (0, _createSchema.createSchema)((0, _createEditor.processPluginsList)(plugins));
849
+ };
850
+ var schema = (0, _platformFeatureFlags.fg)('platform_editor_better_editor_ssr_spans') ? (0, _ssrMeasures.profileSSROperation)("".concat(SSR_TRACE_SEGMENT_NAME, "/createSchema"), doCreateSchema, onSSRMeasure) : doCreateSchema();
851
+ var doBuildDoc = function doBuildDoc() {
852
+ return buildDoc(schema);
853
+ };
854
+ var doc = (0, _platformFeatureFlags.fg)('platform_editor_better_editor_ssr_spans') ? (0, _ssrMeasures.profileSSROperation)("".concat(SSR_TRACE_SEGMENT_NAME, "/buildDoc"), doBuildDoc, onSSRMeasure) : doBuildDoc();
789
855
  return {
790
856
  plugins: plugins,
791
857
  schema: schema,
792
858
  doc: doc
793
859
  };
794
- }, [allowBlockType, buildDoc, props.preset]);
860
+ }, [allowBlockType, buildDoc, props.preset, onSSRMeasure]);
795
861
  var _props$editorProps3 = props.editorProps,
796
862
  assistiveLabel = _props$editorProps3.assistiveLabel,
797
863
  assistiveDescribedBy = _props$editorProps3.assistiveDescribedBy;
@@ -814,6 +880,7 @@ function ReactEditorView(props) {
814
880
  id: EDIT_AREA_ID,
815
881
  "aria-describedby": assistiveDescribedBy,
816
882
  "data-editor-id": editorId.current,
883
+ onSSRMeasure: onSSRMeasure,
817
884
  onEditorStateChanged: function onEditorStateChanged(state) {
818
885
  ssrEditorStateRef.current = state;
819
886
  // Notify listeners about the initial SSR state
@@ -823,7 +890,7 @@ function ReactEditorView(props) {
823
890
  });
824
891
  }
825
892
  });
826
- }, [ssrDeps, props.intl, props.portalProviderAPI, assistiveLabel, assistiveDescribedBy, isPageAppearance]);
893
+ }, [ssrDeps, props.intl, props.portalProviderAPI, assistiveLabel, isPageAppearance, assistiveDescribedBy, onSSRMeasure]);
827
894
  var editor = (0, _react.useMemo)(function () {
828
895
  // SSR editor will be available only in SSR environment,
829
896
  // in a browser `ssrEditor` will be `null`, and we will render a normal one ProseMirror.
@@ -840,7 +907,11 @@ function ReactEditorView(props) {
840
907
  // Render tracking is firing too many events in Jira so we are disabling them for now. See - https://product-fabric.atlassian.net/browse/ED-25616
841
908
  // Also firing too many events for the legacy content macro, so disabling for now. See - https://product-fabric.atlassian.net/browse/ED-26650
842
909
  var renderTrackingEnabled = !(0, _platformFeatureFlags.fg)('platform_editor_disable_rerender_tracking_jira') && !featureFlags.lcmPreventRenderTracking;
843
- return /*#__PURE__*/_react.default.createElement(_uiReact.ReactEditorViewContext.Provider, {
910
+ return /*#__PURE__*/_react.default.createElement(_ssrMeasures.SSRRenderMeasure, {
911
+ segmentName: SSR_TRACE_SEGMENT_NAME,
912
+ startTimestampRef: firstRenderStartTimestampRef,
913
+ onSSRMeasure: (0, _platformFeatureFlags.fg)('platform_editor_better_editor_ssr_spans') ? onSSRMeasure : undefined
914
+ }, /*#__PURE__*/_react.default.createElement(_uiReact.ReactEditorViewContext.Provider, {
844
915
  value: {
845
916
  editorRef: editorRef,
846
917
  editorView: viewRef.current,
@@ -861,7 +932,7 @@ function ReactEditorView(props) {
861
932
  dispatchAnalyticsEvent: dispatchAnalyticsEvent,
862
933
  editorRef: editorRef,
863
934
  editorAPI: (0, _expVal.expVal)('platform_editor_no_state_plugin_injection_api', 'isEnabled', false) ? pluginInjectionAPI.current.api() : editorAPI
864
- })) !== null && _props$render !== void 0 ? _props$render : editor : editor);
935
+ })) !== null && _props$render !== void 0 ? _props$render : editor : editor));
865
936
  }
866
937
 
867
938
  // Preserving exact type generated by TypeScript
@@ -11,6 +11,7 @@ var _react = _interopRequireWildcard(require("react"));
11
11
  var _react2 = require("@emotion/react");
12
12
  var _browser = require("@atlaskit/editor-common/browser");
13
13
  var _hooks = require("@atlaskit/editor-common/hooks");
14
+ var _ssrMeasures = require("@atlaskit/editor-common/performance/ssr-measures");
14
15
  var _ui = require("@atlaskit/editor-common/ui");
15
16
  var _useSharedPluginStateSelector = require("@atlaskit/editor-common/use-shared-plugin-state-selector");
16
17
  var _editorSharedStyles = require("@atlaskit/editor-shared-styles");
@@ -30,6 +31,7 @@ function _interopRequireWildcard(e, t) { if ("function" == typeof WeakMap) var r
30
31
 
31
32
  // eslint-disable-next-line @atlaskit/ui-styling-standard/use-compiled -- Ignored via go/DSP-18766
32
33
 
34
+ var SSR_TRACE_SEGMENT_NAME = 'reactEditorView/fullPageAppearance';
33
35
  var useShowKeyline = function useShowKeyline(contentAreaRef) {
34
36
  var _useState = (0, _react.useState)(false),
35
37
  _useState2 = (0, _slicedToArray2.default)(_useState, 2),
@@ -71,6 +73,8 @@ var hasCustomComponents = function hasCustomComponents(components) {
71
73
  };
72
74
  var FullPageEditor = exports.FullPageEditor = function FullPageEditor(props) {
73
75
  var _scrollContentContain, _scrollContentContain2, _scrollContentContain3, _wrapperElementRef$cu;
76
+ // Should be always the first statement in the component
77
+ var firstRenderStartTimestampRef = (0, _react.useRef)(performance.now());
74
78
  var wrapperElementRef = (0, _react.useMemo)(function () {
75
79
  return props.innerRef;
76
80
  }, [props.innerRef]);
@@ -144,7 +148,11 @@ var FullPageEditor = exports.FullPageEditor = function FullPageEditor(props) {
144
148
  }
145
149
  var isToolbarAIFCEnabled = Boolean(editorAPI === null || editorAPI === void 0 ? void 0 : editorAPI.toolbar);
146
150
  var popupsBoundariesElement = props.popupsBoundariesElement || (scrollContentContainerRef === null || scrollContentContainerRef === void 0 || (_scrollContentContain = scrollContentContainerRef.current) === null || _scrollContentContain === void 0 ? void 0 : _scrollContentContain.containerArea) || undefined;
147
- return (0, _react2.jsx)(_ui.ContextPanelWidthProvider, null, (0, _react2.jsx)("div", {
151
+ return (0, _react2.jsx)(_ssrMeasures.SSRRenderMeasure, {
152
+ segmentName: SSR_TRACE_SEGMENT_NAME,
153
+ startTimestampRef: firstRenderStartTimestampRef,
154
+ onSSRMeasure: (0, _platformFeatureFlags.fg)('platform_editor_better_editor_ssr_spans') ? props.onSSRMeasure : undefined
155
+ }, (0, _react2.jsx)(_ui.ContextPanelWidthProvider, null, (0, _react2.jsx)("div", {
148
156
  // eslint-disable-next-line @atlaskit/ui-styling-standard/no-imported-style-values, @atlaskit/design-system/consistent-css-prop-usage -- Ignored via go/DSP-18766
149
157
  css: _StyledComponents.fullPageEditorWrapper
150
158
  // eslint-disable-next-line @atlaskit/ui-styling-standard/no-classname-prop -- Ignored via go/DSP-18766
@@ -221,5 +229,5 @@ var FullPageEditor = exports.FullPageEditor = function FullPageEditor(props) {
221
229
  viewMode: state.editorViewMode,
222
230
  hasHadInteraction: hasHadInteraction,
223
231
  contentMode: props.contentMode
224
- })));
232
+ }))));
225
233
  };
@@ -4,6 +4,7 @@ Object.defineProperty(exports, "__esModule", {
4
4
  value: true
5
5
  });
6
6
  exports.getNodesCount = getNodesCount;
7
+ // When experiment platform_editor_prosemirror_rendered_data is removed, review whether this helper is still needed.
7
8
  function getNodesCount(node) {
8
9
  var count = {};
9
10
  node.nodesBetween(0, node.nodeSize - 2, function (node) {
@@ -0,0 +1,32 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ exports.getNodesCountWithExtensionKeys = getNodesCountWithExtensionKeys;
7
+ /**
8
+ * Counts node types and extension keys in a single traversal.
9
+ * We exclude the end-of-doc token by iterating to nodeSize - 2,
10
+ * which matches the typical ProseMirror pattern for traversing all child nodes.
11
+ */
12
+ function getNodesCountWithExtensionKeys(node) {
13
+ var nodes = {};
14
+ var extensionKeys = {};
15
+ var extensionNodeNames = ['extension', 'bodiedExtension', 'inlineExtension', 'multiBodiedExtension'];
16
+ node.nodesBetween(0, node.nodeSize - 2, function (currentNode) {
17
+ var _currentNode$attrs;
18
+ nodes[currentNode.type.name] = (nodes[currentNode.type.name] || 0) + 1;
19
+ if (!extensionNodeNames.includes(currentNode.type.name)) {
20
+ return;
21
+ }
22
+ var extensionKey = (_currentNode$attrs = currentNode.attrs) === null || _currentNode$attrs === void 0 ? void 0 : _currentNode$attrs.extensionKey;
23
+ if (!extensionKey) {
24
+ return;
25
+ }
26
+ extensionKeys[extensionKey] = (extensionKeys[extensionKey] || 0) + 1;
27
+ });
28
+ return {
29
+ nodes: nodes,
30
+ extensionKeys: extensionKeys
31
+ };
32
+ }
@@ -5,4 +5,4 @@ Object.defineProperty(exports, "__esModule", {
5
5
  });
6
6
  exports.version = exports.name = void 0;
7
7
  var name = exports.name = "@atlaskit/editor-core";
8
- var version = exports.version = "216.10.0";
8
+ var version = exports.version = "216.11.2";
@@ -118,6 +118,7 @@ export const EditorInternal = /*#__PURE__*/memo(({
118
118
  minHeight: props.minHeight,
119
119
  onSave: props.onSave ? handleSave : undefined,
120
120
  onCancel: props.onCancel,
121
+ onSSRMeasure: props.onSSRMeasure,
121
122
  popupsMountPoint: props.popupsMountPoint,
122
123
  popupsBoundariesElement: props.popupsBoundariesElement,
123
124
  popupsScrollableElement: props.popupsScrollableElement,
@@ -84,6 +84,7 @@ export const useMemoEditorProps = passedProps => {
84
84
  mention: passedProps.mention,
85
85
  mentionInsertDisplayName: passedProps.mentionInsertDisplayName,
86
86
  uploadErrorHandler: passedProps.uploadErrorHandler,
87
+ onSSRMeasure: passedProps.onSSRMeasure,
87
88
  waitForMediaUpload: passedProps.waitForMediaUpload,
88
89
  extensionHandlers: passedProps.extensionHandlers,
89
90
  allowTextColor: passedProps.allowTextColor,
@@ -111,7 +112,7 @@ export const useMemoEditorProps = passedProps => {
111
112
  ...allProps
112
113
  };
113
114
  return nextProps;
114
- }, [passedProps.preset, passedProps.appearance, passedProps.contentMode, passedProps.contentComponents, passedProps.primaryToolbarIconBefore, passedProps.secondaryToolbarComponents, passedProps.persistScrollGutter, passedProps.quickInsert, passedProps.shouldFocus, passedProps.disabled, passedProps.contextPanel, passedProps.errorReporterHandler, passedProps.contentTransformerProvider, passedProps.maxHeight, passedProps.minHeight, passedProps.placeholder, passedProps.placeholderBracketHint, passedProps.performanceTracking, passedProps.inputSamplingLimit, passedProps.defaultValue, passedProps.assistiveLabel, passedProps.assistiveDescribedBy, passedProps.popupsMountPoint, passedProps.popupsBoundariesElement, passedProps.popupsScrollableElement, passedProps.editorActions, passedProps.onEditorReady, passedProps.onDestroy, passedProps.onChange, passedProps.onCancel, passedProps.extensionProviders, passedProps.UNSAFE_useAnalyticsContext, passedProps.useStickyToolbar, passedProps.featureFlags, passedProps.onSave, passedProps.sanitizePrivateContent, passedProps.media, passedProps.collabEdit, passedProps.primaryToolbarComponents, passedProps.allowUndoRedoButtons, passedProps.linking, passedProps.activityProvider, passedProps.searchProvider, passedProps.annotationProviders, passedProps.collabEditProvider, passedProps.presenceProvider, passedProps.emojiProvider, passedProps.taskDecisionProvider, passedProps.legacyImageUploadProvider, passedProps.mentionProvider, passedProps.autoformattingProvider, passedProps.macroProvider, passedProps.contextIdentifierProvider, passedProps.allowExpand, passedProps.allowNestedTasks, passedProps.allowBlockType, passedProps.allowTasksAndDecisions, passedProps.allowBreakout, passedProps.allowRule, passedProps.allowHelpDialog, passedProps.allowPanel, passedProps.allowExtension, passedProps.allowConfluenceInlineComment, passedProps.allowTemplatePlaceholders, passedProps.allowDate, passedProps.allowLayouts, passedProps.allowStatus, passedProps.allowTextAlignment, passedProps.allowIndentation, passedProps.showIndentationButtons, passedProps.allowFindReplace, passedProps.allowBorderMark, passedProps.allowFragmentMark, passedProps.autoScrollIntoView, passedProps.elementBrowser, passedProps.maxContentSize, passedProps.saveOnEnter, passedProps.feedbackInfo, passedProps.mention, passedProps.mentionInsertDisplayName, passedProps.uploadErrorHandler, passedProps.waitForMediaUpload, passedProps.extensionHandlers, passedProps.allowTextColor, passedProps.allowTables, passedProps.insertMenuItems, passedProps.UNSAFE_cards, passedProps.smartLinks, passedProps.allowAnalyticsGASV3, passedProps.codeBlock, passedProps.textFormatting, passedProps.__livePage, passedProps.AppearanceComponent, passedProps.skipValidation, passedProps.syncBlock, passedProps.syncedBlockProvider, passedProps.pasteWarningOptions]);
115
+ }, [passedProps.preset, passedProps.appearance, passedProps.contentMode, passedProps.contentComponents, passedProps.primaryToolbarIconBefore, passedProps.secondaryToolbarComponents, passedProps.persistScrollGutter, passedProps.quickInsert, passedProps.shouldFocus, passedProps.disabled, passedProps.contextPanel, passedProps.errorReporterHandler, passedProps.contentTransformerProvider, passedProps.maxHeight, passedProps.minHeight, passedProps.placeholder, passedProps.placeholderBracketHint, passedProps.performanceTracking, passedProps.inputSamplingLimit, passedProps.defaultValue, passedProps.assistiveLabel, passedProps.assistiveDescribedBy, passedProps.popupsMountPoint, passedProps.popupsBoundariesElement, passedProps.popupsScrollableElement, passedProps.editorActions, passedProps.onEditorReady, passedProps.onDestroy, passedProps.onChange, passedProps.onCancel, passedProps.onSSRMeasure, passedProps.extensionProviders, passedProps.UNSAFE_useAnalyticsContext, passedProps.useStickyToolbar, passedProps.featureFlags, passedProps.onSave, passedProps.sanitizePrivateContent, passedProps.media, passedProps.collabEdit, passedProps.primaryToolbarComponents, passedProps.allowUndoRedoButtons, passedProps.linking, passedProps.activityProvider, passedProps.searchProvider, passedProps.annotationProviders, passedProps.collabEditProvider, passedProps.presenceProvider, passedProps.emojiProvider, passedProps.taskDecisionProvider, passedProps.legacyImageUploadProvider, passedProps.mentionProvider, passedProps.autoformattingProvider, passedProps.macroProvider, passedProps.contextIdentifierProvider, passedProps.allowExpand, passedProps.allowNestedTasks, passedProps.allowBlockType, passedProps.allowTasksAndDecisions, passedProps.allowBreakout, passedProps.allowRule, passedProps.allowHelpDialog, passedProps.allowPanel, passedProps.allowExtension, passedProps.allowConfluenceInlineComment, passedProps.allowTemplatePlaceholders, passedProps.allowDate, passedProps.allowLayouts, passedProps.allowStatus, passedProps.allowTextAlignment, passedProps.allowIndentation, passedProps.showIndentationButtons, passedProps.allowFindReplace, passedProps.allowBorderMark, passedProps.allowFragmentMark, passedProps.autoScrollIntoView, passedProps.elementBrowser, passedProps.maxContentSize, passedProps.saveOnEnter, passedProps.feedbackInfo, passedProps.mention, passedProps.mentionInsertDisplayName, passedProps.uploadErrorHandler, passedProps.waitForMediaUpload, passedProps.extensionHandlers, passedProps.allowTextColor, passedProps.allowTables, passedProps.insertMenuItems, passedProps.UNSAFE_cards, passedProps.smartLinks, passedProps.allowAnalyticsGASV3, passedProps.codeBlock, passedProps.textFormatting, passedProps.__livePage, passedProps.AppearanceComponent, passedProps.skipValidation, passedProps.syncBlock, passedProps.syncedBlockProvider, passedProps.pasteWarningOptions]);
115
116
  return memodProps;
116
117
  };
117
118
  export default useMemoEditorProps;