@atlaskit/editor-plugin-code-block 12.1.10 → 12.1.11

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 (64) hide show
  1. package/CHANGELOG.md +8 -0
  2. package/dist/cjs/codeBlockPlugin.js +9 -2
  3. package/dist/cjs/editor-commands/index.js +56 -4
  4. package/dist/cjs/pm-plugins/actions.js +3 -1
  5. package/dist/cjs/pm-plugins/auto-detect-state.js +11 -0
  6. package/dist/cjs/pm-plugins/auto-detect.js +57 -0
  7. package/dist/cjs/pm-plugins/main.js +1 -1
  8. package/dist/cjs/pm-plugins/toolbar.js +47 -11
  9. package/dist/cjs/pm-plugins/utils.js +0 -3
  10. package/dist/cjs/ui/CodeBlockLanguagePicker.js +15 -8
  11. package/dist/cjs/ui/LanguagePicker.js +7 -15
  12. package/dist/cjs/ui/language-picker-options.js +2 -1
  13. package/dist/cjs/utils/auto-detect-state.js +185 -0
  14. package/dist/cjs/utils/auto-detect-view.js +127 -0
  15. package/dist/cjs/utils/language-detect.js +126 -0
  16. package/dist/es2019/codeBlockPlugin.js +5 -1
  17. package/dist/es2019/editor-commands/index.js +52 -2
  18. package/dist/es2019/pm-plugins/actions.js +3 -1
  19. package/dist/es2019/pm-plugins/auto-detect-state.js +3 -0
  20. package/dist/es2019/pm-plugins/auto-detect.js +47 -0
  21. package/dist/es2019/pm-plugins/main.js +1 -1
  22. package/dist/es2019/pm-plugins/toolbar.js +41 -3
  23. package/dist/es2019/pm-plugins/utils.js +0 -3
  24. package/dist/es2019/ui/CodeBlockLanguagePicker.js +15 -8
  25. package/dist/es2019/ui/LanguagePicker.js +6 -14
  26. package/dist/es2019/ui/language-picker-options.js +2 -1
  27. package/dist/es2019/utils/auto-detect-state.js +179 -0
  28. package/dist/es2019/utils/auto-detect-view.js +108 -0
  29. package/dist/es2019/utils/language-detect.js +99 -0
  30. package/dist/esm/codeBlockPlugin.js +9 -2
  31. package/dist/esm/editor-commands/index.js +55 -3
  32. package/dist/esm/pm-plugins/actions.js +3 -1
  33. package/dist/esm/pm-plugins/auto-detect-state.js +5 -0
  34. package/dist/esm/pm-plugins/auto-detect.js +50 -0
  35. package/dist/esm/pm-plugins/main.js +1 -1
  36. package/dist/esm/pm-plugins/toolbar.js +47 -11
  37. package/dist/esm/pm-plugins/utils.js +0 -3
  38. package/dist/esm/ui/CodeBlockLanguagePicker.js +15 -8
  39. package/dist/esm/ui/LanguagePicker.js +7 -15
  40. package/dist/esm/ui/language-picker-options.js +2 -1
  41. package/dist/esm/utils/auto-detect-state.js +178 -0
  42. package/dist/esm/utils/auto-detect-view.js +120 -0
  43. package/dist/esm/utils/language-detect.js +119 -0
  44. package/dist/types/editor-commands/index.d.ts +2 -0
  45. package/dist/types/pm-plugins/actions.d.ts +2 -0
  46. package/dist/types/pm-plugins/auto-detect-state.d.ts +16 -0
  47. package/dist/types/pm-plugins/auto-detect.d.ts +5 -0
  48. package/dist/types/pm-plugins/utils.d.ts +1 -1
  49. package/dist/types/ui/CodeBlockLanguagePicker.d.ts +7 -1
  50. package/dist/types/ui/LanguagePicker.d.ts +4 -8
  51. package/dist/types/utils/auto-detect-state.d.ts +11 -0
  52. package/dist/types/utils/auto-detect-view.d.ts +8 -0
  53. package/dist/types/utils/language-detect.d.ts +3 -0
  54. package/dist/types-ts4.5/editor-commands/index.d.ts +2 -0
  55. package/dist/types-ts4.5/pm-plugins/actions.d.ts +2 -0
  56. package/dist/types-ts4.5/pm-plugins/auto-detect-state.d.ts +16 -0
  57. package/dist/types-ts4.5/pm-plugins/auto-detect.d.ts +5 -0
  58. package/dist/types-ts4.5/pm-plugins/utils.d.ts +1 -1
  59. package/dist/types-ts4.5/ui/CodeBlockLanguagePicker.d.ts +7 -1
  60. package/dist/types-ts4.5/ui/LanguagePicker.d.ts +4 -8
  61. package/dist/types-ts4.5/utils/auto-detect-state.d.ts +11 -0
  62. package/dist/types-ts4.5/utils/auto-detect-view.d.ts +8 -0
  63. package/dist/types-ts4.5/utils/language-detect.d.ts +3 -0
  64. package/package.json +3 -3
package/CHANGELOG.md CHANGED
@@ -1,5 +1,13 @@
1
1
  # @atlaskit/editor-plugin-code-block
2
2
 
3
+ ## 12.1.11
4
+
5
+ ### Patch Changes
6
+
7
+ - [`52a08b0d14e39`](https://bitbucket.org/atlassian/atlassian-frontend-monorepo/commits/52a08b0d14e39) -
8
+ Add code block language auto-detection experiment
9
+ - Updated dependencies
10
+
3
11
  ## 12.1.10
4
12
 
5
13
  ### Patch Changes
@@ -6,6 +6,7 @@ Object.defineProperty(exports, "__esModule", {
6
6
  });
7
7
  exports.default = void 0;
8
8
  var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty"));
9
+ var _toConsumableArray2 = _interopRequireDefault(require("@babel/runtime/helpers/toConsumableArray"));
9
10
  var _react = _interopRequireDefault(require("react"));
10
11
  var _adfSchema = require("@atlaskit/adf-schema");
11
12
  var _analytics = require("@atlaskit/editor-common/analytics");
@@ -16,6 +17,7 @@ var _platformFeatureFlags = require("@atlaskit/platform-feature-flags");
16
17
  var _expValEquals = require("@atlaskit/tmp-editor-statsig/exp-val-equals");
17
18
  var _experiments = require("@atlaskit/tmp-editor-statsig/experiments");
18
19
  var _editorCommands = require("./editor-commands");
20
+ var _autoDetect = require("./pm-plugins/auto-detect");
19
21
  var _codeBlockAutoFullStopTransformPlugin = require("./pm-plugins/codeBlockAutoFullStopTransformPlugin");
20
22
  var _codeBlockCopySelectionPlugin = require("./pm-plugins/codeBlockCopySelectionPlugin");
21
23
  var _ideUx = _interopRequireDefault(require("./pm-plugins/ide-ux"));
@@ -81,7 +83,12 @@ var codeBlockPlugin = function codeBlockPlugin(_ref) {
81
83
  var schema = _ref3.schema;
82
84
  return (0, _inputRule.createCodeBlockInputRule)(schema, api === null || api === void 0 || (_api$analytics = api.analytics) === null || _api$analytics === void 0 ? void 0 : _api$analytics.actions);
83
85
  }
84
- }, {
86
+ }].concat((0, _toConsumableArray2.default)((0, _expValEquals.expValEquals)('platform_editor_code_block_auto_detection', 'isEnabled', true) ? [{
87
+ name: 'codeBlockAutoDetect',
88
+ plugin: function plugin() {
89
+ return (0, _autoDetect.createAutoDetectPlugin)(api);
90
+ }
91
+ }] : []), [{
85
92
  name: 'codeBlockIDEKeyBindings',
86
93
  plugin: function plugin() {
87
94
  return (0, _ideUx.default)(api);
@@ -102,7 +109,7 @@ var codeBlockPlugin = function codeBlockPlugin(_ref) {
102
109
  plugin: function plugin() {
103
110
  return (0, _codeBlockAutoFullStopTransformPlugin.codeBlockAutoFullStopTransformPlugin)();
104
111
  }
105
- }];
112
+ }]);
106
113
  },
107
114
  // Workaround for a firefox issue where dom selection is off sync
108
115
  // https://product-fabric.atlassian.net/browse/ED-12442
@@ -6,7 +6,7 @@ Object.defineProperty(exports, "__esModule", {
6
6
  });
7
7
  exports.copyContentToClipboardWithAnalytics = exports.copyContentToClipboard = exports.changeLanguage = void 0;
8
8
  exports.createInsertCodeBlockTransaction = createInsertCodeBlockTransaction;
9
- exports.ignoreFollowingMutations = void 0;
9
+ exports.ignoreFollowingMutations = exports.detectLanguage = void 0;
10
10
  exports.insertCodeBlockWithAnalytics = insertCodeBlockWithAnalytics;
11
11
  exports.toggleWordWrapStateForCodeBlockNode = exports.toggleLineNumbersForCodeBlockNodeEditorCommand = exports.toggleLineNumbersForCodeBlockNode = exports.resetShouldIgnoreFollowingMutations = exports.resetCopiedState = exports.removeCodeBlockWithAnalytics = exports.removeCodeBlock = void 0;
12
12
  var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty"));
@@ -21,9 +21,11 @@ var _state = require("@atlaskit/editor-prosemirror/state");
21
21
  var _utils = require("@atlaskit/editor-prosemirror/utils");
22
22
  var _expValEquals = require("@atlaskit/tmp-editor-statsig/exp-val-equals");
23
23
  var _actions = require("../pm-plugins/actions");
24
+ var _autoDetectState = require("../pm-plugins/auto-detect-state");
24
25
  var _codeBlockCopySelectionPlugin = require("../pm-plugins/codeBlockCopySelectionPlugin");
25
26
  var _pluginKey = require("../pm-plugins/plugin-key");
26
27
  var _transformToCodeBlock = require("../pm-plugins/transform-to-code-block");
28
+ var _autoDetectState2 = require("../utils/auto-detect-state");
27
29
  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; }
28
30
  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; }
29
31
  var removeCodeBlockWithAnalytics = exports.removeCodeBlockWithAnalytics = function removeCodeBlockWithAnalytics(editorAnalyticsAPI) {
@@ -53,27 +55,40 @@ var removeCodeBlock = exports.removeCodeBlock = function removeCodeBlock(state,
53
55
  var changeLanguage = exports.changeLanguage = function changeLanguage(editorAnalyticsAPI) {
54
56
  return function (language, selectionSource) {
55
57
  return function (state, dispatch) {
56
- var _pluginKey$getState;
58
+ var _pluginKey$getState, _autoDetectPluginKey$;
57
59
  var codeBlock = state.schema.nodes.codeBlock;
58
60
  var pos = (_pluginKey$getState = _pluginKey.pluginKey.getState(state)) === null || _pluginKey$getState === void 0 ? void 0 : _pluginKey$getState.pos;
59
61
  if (typeof pos !== 'number') {
60
62
  return false;
61
63
  }
62
64
  var node = state.doc.nodeAt(pos);
65
+ var localId = node === null || node === void 0 ? void 0 : node.attrs.localId;
66
+ var previousAutoDetectEntry = (0, _expValEquals.expValEquals)('platform_editor_code_block_auto_detection', 'isEnabled', true) ? (_autoDetectPluginKey$ = _autoDetectState.autoDetectPluginKey.getState(state)) === null || _autoDetectPluginKey$ === void 0 ? void 0 : _autoDetectPluginKey$.languageDetectionMap[localId] : undefined;
63
67
  var tr = state.tr.setNodeMarkup(pos, codeBlock, _objectSpread(_objectSpread({}, node === null || node === void 0 ? void 0 : node.attrs), {}, {
64
68
  language: language
65
69
  })).setMeta('scrollIntoView', false);
70
+ if ((0, _expValEquals.expValEquals)('platform_editor_code_block_auto_detection', 'isEnabled', true)) {
71
+ tr.setMeta(_autoDetectState.autoDetectPluginKey, {
72
+ type: _actions.ACTIONS.REMOVE_AUTO_DETECT_ENTRY,
73
+ data: {
74
+ localId: localId
75
+ }
76
+ });
77
+ }
66
78
  var selection = (0, _utils.isNodeSelection)(state.selection) ? _state.NodeSelection.create(tr.doc, pos) : tr.selection;
67
79
  var result = tr.setSelection(selection);
68
80
  if (dispatch) {
69
81
  editorAnalyticsAPI === null || editorAnalyticsAPI === void 0 || editorAnalyticsAPI.attachAnalyticsEvent({
70
82
  action: _analytics.ACTION.LANGUAGE_SELECTED,
71
83
  actionSubject: _analytics.ACTION_SUBJECT.CODE_BLOCK,
72
- attributes: _objectSpread({
84
+ attributes: _objectSpread(_objectSpread({
73
85
  language: language !== null && language !== void 0 ? language : 'none'
74
86
  }, selectionSource ? {
75
87
  selectionSource: selectionSource
76
- } : {}),
88
+ } : {}), {}, {
89
+ autoDetectionResult: previousAutoDetectEntry === null || previousAutoDetectEntry === void 0 ? void 0 : previousAutoDetectEntry.detectionResult,
90
+ autoDetectedLanguage: previousAutoDetectEntry === null || previousAutoDetectEntry === void 0 ? void 0 : previousAutoDetectEntry.autoDetectedLanguage
91
+ }),
77
92
  eventType: _analytics.EVENT_TYPE.TRACK
78
93
  })(result);
79
94
  dispatch(result);
@@ -82,6 +97,43 @@ var changeLanguage = exports.changeLanguage = function changeLanguage(editorAnal
82
97
  };
83
98
  };
84
99
  };
100
+
101
+ /** Queue auto-detection for selected code block. */
102
+ var detectLanguage = exports.detectLanguage = function detectLanguage() {
103
+ return function (state, dispatch) {
104
+ var _pluginKey$getState2;
105
+ var pos = (_pluginKey$getState2 = _pluginKey.pluginKey.getState(state)) === null || _pluginKey$getState2 === void 0 ? void 0 : _pluginKey$getState2.pos;
106
+ if (typeof pos !== 'number') {
107
+ return false;
108
+ }
109
+ var node = state.doc.nodeAt(pos);
110
+ if (!node) {
111
+ return false;
112
+ }
113
+ var localId = (0, _autoDetectState2.getLocalId)(node);
114
+ if (!localId) {
115
+ return false;
116
+ }
117
+ var autoDetectState = _autoDetectState.autoDetectPluginKey.getState(state);
118
+ var previousEntry = autoDetectState === null || autoDetectState === void 0 ? void 0 : autoDetectState.languageDetectionMap[localId];
119
+ var entry = (0, _autoDetectState2.createAutoDetectEntry)(node, pos, (0, _autoDetectState2.hasEnoughTextForAutoDetection)(node.textContent), previousEntry);
120
+ var tr = state.tr.setNodeMarkup(pos, state.schema.nodes.codeBlock, _objectSpread(_objectSpread({}, node.attrs), {}, {
121
+ language: null
122
+ })).setMeta(_autoDetectState.autoDetectPluginKey, {
123
+ type: _actions.ACTIONS.SET_AUTO_DETECT_ENTRY,
124
+ data: {
125
+ localId: localId,
126
+ entry: entry
127
+ }
128
+ }).setMeta('scrollIntoView', false);
129
+ var selection = (0, _utils.isNodeSelection)(state.selection) ? _state.NodeSelection.create(tr.doc, pos) : tr.selection;
130
+ var result = tr.setSelection(selection);
131
+ if (dispatch) {
132
+ dispatch(result);
133
+ }
134
+ return true;
135
+ };
136
+ };
85
137
  var copyContentToClipboardWithAnalytics = exports.copyContentToClipboardWithAnalytics = function copyContentToClipboardWithAnalytics(editorAnalyticsAPI) {
86
138
  return function (state, dispatch) {
87
139
  var nodes = state.schema.nodes,
@@ -7,5 +7,7 @@ exports.ACTIONS = void 0;
7
7
  var ACTIONS = exports.ACTIONS = {
8
8
  SET_COPIED_TO_CLIPBOARD: 'SET_COPIED_TO_CLIPBOARD',
9
9
  SET_SHOULD_IGNORE_FOLLOWING_MUTATIONS: 'SET_SHOULD_IGNORE_FOLLOWING_MUTATIONS',
10
- SET_IS_WRAPPED: 'SET_IS_WRAPPED'
10
+ SET_IS_WRAPPED: 'SET_IS_WRAPPED',
11
+ SET_AUTO_DETECT_ENTRY: 'SET_AUTO_DETECT_ENTRY',
12
+ REMOVE_AUTO_DETECT_ENTRY: 'REMOVE_AUTO_DETECT_ENTRY'
11
13
  };
@@ -0,0 +1,11 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ exports.getAutoDetectPluginState = exports.autoDetectPluginKey = void 0;
7
+ var _state = require("@atlaskit/editor-prosemirror/state");
8
+ var autoDetectPluginKey = exports.autoDetectPluginKey = new _state.PluginKey('codeBlockAutoDetectPlugin');
9
+ var getAutoDetectPluginState = exports.getAutoDetectPluginState = function getAutoDetectPluginState(state) {
10
+ return autoDetectPluginKey.getState(state);
11
+ };
@@ -0,0 +1,57 @@
1
+ "use strict";
2
+
3
+ var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
4
+ Object.defineProperty(exports, "__esModule", {
5
+ value: true
6
+ });
7
+ exports.createAutoDetectPlugin = void 0;
8
+ var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty"));
9
+ var _safePlugin = require("@atlaskit/editor-common/safe-plugin");
10
+ var _autoDetectState = require("../utils/auto-detect-state");
11
+ var _autoDetectView = require("../utils/auto-detect-view");
12
+ var _actions = require("./actions");
13
+ var _autoDetectState2 = require("./auto-detect-state");
14
+ 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; }
15
+ 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; }
16
+ var createAutoDetectPlugin = exports.createAutoDetectPlugin = function createAutoDetectPlugin(api) {
17
+ return new _safePlugin.SafePlugin({
18
+ key: _autoDetectState2.autoDetectPluginKey,
19
+ state: {
20
+ init: function init() {
21
+ return {
22
+ languageDetectionMap: {}
23
+ };
24
+ },
25
+ apply: function apply(tr, pluginState) {
26
+ var meta = tr.getMeta(_autoDetectState2.autoDetectPluginKey);
27
+ var languageDetectionMap = tr.docChanged ? (0, _autoDetectState.updateAutoDetectState)(tr, pluginState) : pluginState.languageDetectionMap;
28
+ if ((meta === null || meta === void 0 ? void 0 : meta.type) === _actions.ACTIONS.SET_AUTO_DETECT_ENTRY) {
29
+ languageDetectionMap = _objectSpread(_objectSpread({}, languageDetectionMap), {}, (0, _defineProperty2.default)({}, meta.data.localId, meta.data.entry));
30
+ } else if ((meta === null || meta === void 0 ? void 0 : meta.type) === _actions.ACTIONS.REMOVE_AUTO_DETECT_ENTRY) {
31
+ languageDetectionMap = (0, _autoDetectState.removeAutoDetection)(languageDetectionMap, meta.data.localId);
32
+ }
33
+ if (languageDetectionMap === pluginState.languageDetectionMap) {
34
+ return pluginState;
35
+ }
36
+ return {
37
+ languageDetectionMap: languageDetectionMap
38
+ };
39
+ }
40
+ },
41
+ view: function view(_view) {
42
+ var timers = new Map();
43
+ return {
44
+ update: function update() {
45
+ (0, _autoDetectView.syncPendingDetectionTimers)(_view, timers, api);
46
+ },
47
+ destroy: function destroy() {
48
+ timers.forEach(function (_ref) {
49
+ var timer = _ref.timer;
50
+ return clearTimeout(timer);
51
+ });
52
+ timers.clear();
53
+ }
54
+ };
55
+ }
56
+ });
57
+ };
@@ -109,11 +109,11 @@ var createPlugin = exports.createPlugin = function createPlugin(_ref) {
109
109
  }
110
110
  if (tr.docChanged) {
111
111
  var _node = (0, _transforms.findCodeBlock)(newState, tr.selection);
112
+ var codeBlockNodes = (0, _utils.getAllChangedCodeBlocksInTransaction)(tr);
112
113
 
113
114
  // Updates mapping position of all existing decorations to new positions
114
115
  // specifically used for updating word wrap node decorators (does not cover drag & drop, validateWordWrappedDecorators does).
115
116
  var updatedDecorationSet = pluginState.decorations.map(tr.mapping, tr.doc);
116
- var codeBlockNodes = (0, _utils.getAllChangedCodeBlocksInTransaction)(tr);
117
117
  if (codeBlockNodes) {
118
118
  (0, _codeBlock.updateCodeBlockWrappedStateNodeKeys)(codeBlockNodes, _oldState);
119
119
  // Disabled when using advanced code block for performance reasons
@@ -23,12 +23,41 @@ var _editorCommands = require("../editor-commands");
23
23
  var _CodeBlockLanguagePicker = require("../ui/CodeBlockLanguagePicker");
24
24
  var _WrapIcon = require("../ui/icons/WrapIcon");
25
25
  var _languagePickerOptions = require("../ui/language-picker-options");
26
+ var _autoDetectState = require("./auto-detect-state");
26
27
  var _codeBlockCopySelectionPlugin = require("./codeBlockCopySelectionPlugin");
27
28
  var _languageList = require("./language-list");
28
29
  var _pluginKey = require("./plugin-key");
29
30
  function _interopRequireWildcard(e, t) { if ("function" == typeof WeakMap) var r = new WeakMap(), n = new WeakMap(); return (_interopRequireWildcard = function _interopRequireWildcard(e, t) { if (!t && e && e.__esModule) return e; var o, i, f = { __proto__: null, default: e }; if (null === e || "object" != _typeof(e) && "function" != typeof e) return f; if (o = t ? n : r) { if (o.has(e)) return o.get(e); o.set(e, f); } for (var _t in e) "default" !== _t && {}.hasOwnProperty.call(e, _t) && ((i = (o = Object.defineProperty) && Object.getOwnPropertyDescriptor(e, _t)) && (i.get || i.set) ? o(f, _t, i) : f[_t] = e[_t]); return f; })(e, t); }
30
31
  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; }
31
32
  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; }
33
+ var getAutoDetectPickerValue = function getAutoDetectPickerValue(_ref) {
34
+ var autoDetectEntry = _ref.autoDetectEntry,
35
+ formatMessage = _ref.formatMessage,
36
+ language = _ref.language,
37
+ languagePickerOptions = _ref.languagePickerOptions;
38
+ var defaultPickerValue = language ? languagePickerOptions.find(function (option) {
39
+ return language === _languagePickerOptions.NONE_LANGUAGE_VALUE ? option.value === _languagePickerOptions.PLAIN_TEXT_LANGUAGE_VALUE : option.value === language || option.alias.includes(language);
40
+ }) : undefined;
41
+
42
+ // A weak re-detection records noneDetected but can leave a previously auto-detected
43
+ // language on the node. Keep showing "(detected)" only while that preserved language
44
+ // still matches the node language, so manual language changes do not inherit the label.
45
+ if (defaultPickerValue && ((autoDetectEntry === null || autoDetectEntry === void 0 ? void 0 : autoDetectEntry.detectionResult) === 'detected' || (autoDetectEntry === null || autoDetectEntry === void 0 ? void 0 : autoDetectEntry.detectionResult) === 'noneDetected' && autoDetectEntry.autoDetectedLanguage === language)) {
46
+ return _objectSpread(_objectSpread({}, defaultPickerValue), {}, {
47
+ label: formatMessage(_messages.codeBlockButtonMessages.detectedLanguage, {
48
+ language: defaultPickerValue.label
49
+ })
50
+ });
51
+ }
52
+ if ((autoDetectEntry === null || autoDetectEntry === void 0 ? void 0 : autoDetectEntry.detectionResult) === 'noneDetected' && !language) {
53
+ return {
54
+ alias: [],
55
+ label: formatMessage(_messages.codeBlockButtonMessages.noneDetected),
56
+ value: _languagePickerOptions.NONE_LANGUAGE_VALUE
57
+ };
58
+ }
59
+ return defaultPickerValue;
60
+ };
32
61
  var getToolbarConfig = exports.getToolbarConfig = function getToolbarConfig() {
33
62
  var allowCopyToClipboard = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : false;
34
63
  var api = arguments.length > 1 ? arguments[1] : undefined;
@@ -45,12 +74,12 @@ var getToolbarConfig = exports.getToolbarConfig = function getToolbarConfig() {
45
74
  alias: lang.alias
46
75
  };
47
76
  });
48
- return function (state, _ref) {
49
- var _api$editorViewMode, _api$decorations$acti, _api$decorations, _api$analytics, _codeBlockState$pos, _node$attrs;
50
- var formatMessage = _ref.formatMessage;
77
+ return function (state, _ref2) {
78
+ var _api$editorViewMode, _api$decorations$acti, _api$decorations, _api$analytics, _codeBlockState$pos, _node$attrs, _node$attrs2;
79
+ var formatMessage = _ref2.formatMessage;
51
80
  var isViewMode = (api === null || api === void 0 || (_api$editorViewMode = api.editorViewMode) === null || _api$editorViewMode === void 0 || (_api$editorViewMode = _api$editorViewMode.sharedState.currentState()) === null || _api$editorViewMode === void 0 ? void 0 : _api$editorViewMode.mode) === 'view';
52
- var _ref2 = (_api$decorations$acti = api === null || api === void 0 || (_api$decorations = api.decorations) === null || _api$decorations === void 0 ? void 0 : _api$decorations.actions) !== null && _api$decorations$acti !== void 0 ? _api$decorations$acti : {},
53
- hoverDecoration = _ref2.hoverDecoration;
81
+ var _ref3 = (_api$decorations$acti = api === null || api === void 0 || (_api$decorations = api.decorations) === null || _api$decorations === void 0 ? void 0 : _api$decorations.actions) !== null && _api$decorations$acti !== void 0 ? _api$decorations$acti : {},
82
+ hoverDecoration = _ref3.hoverDecoration;
54
83
  var editorAnalyticsAPI = api === null || api === void 0 || (_api$analytics = api.analytics) === null || _api$analytics === void 0 ? void 0 : _api$analytics.actions;
55
84
  var codeBlockState = _pluginKey.pluginKey.getState(state);
56
85
  var pos = (_codeBlockState$pos = codeBlockState === null || codeBlockState === void 0 ? void 0 : codeBlockState.pos) !== null && _codeBlockState$pos !== void 0 ? _codeBlockState$pos : null;
@@ -65,6 +94,10 @@ var getToolbarConfig = exports.getToolbarConfig = function getToolbarConfig() {
65
94
  var isWrapped = (0, _codeBlock.isCodeBlockWordWrapEnabled)(node);
66
95
  var areLineNumbersVisible = (0, _codeBlock.areCodeBlockLineNumbersVisible)(node);
67
96
  var language = node === null || node === void 0 || (_node$attrs = node.attrs) === null || _node$attrs === void 0 ? void 0 : _node$attrs.language;
97
+ var localId = node === null || node === void 0 || (_node$attrs2 = node.attrs) === null || _node$attrs2 === void 0 ? void 0 : _node$attrs2.localId;
98
+ var autoDetectState = _autoDetectState.autoDetectPluginKey.getState(state);
99
+ var autoDetectEntry = (0, _expValEquals.expValEquals)('platform_editor_code_block_auto_detection', 'isEnabled', true) && typeof localId === 'string' ? autoDetectState === null || autoDetectState === void 0 ? void 0 : autoDetectState.languageDetectionMap[localId] : undefined;
100
+
68
101
  // Keep fresh option objects for the legacy toolbar select so reopening it
69
102
  // continues to start from the top rather than preserving the previously
70
103
  // focused option by reference.
@@ -90,9 +123,12 @@ var getToolbarConfig = exports.getToolbarConfig = function getToolbarConfig() {
90
123
  };
91
124
  var languagePicker;
92
125
  if ((0, _expValEquals.expValEquals)('platform_editor_code_block_q4_lovability', 'isEnabled', true) && (0, _platformFeatureFlags.fg)('platform_editor_code_block_add_line_number_button')) {
93
- var defaultPickerValue = language ? languagePickerOptions.find(function (option) {
94
- return language === _languagePickerOptions.NONE_LANGUAGE_VALUE ? option.value === _languagePickerOptions.PLAIN_TEXT_LANGUAGE_VALUE : option.value === language || option.alias.includes(language);
95
- }) : undefined;
126
+ var autoDetectPickerValue = getAutoDetectPickerValue({
127
+ autoDetectEntry: autoDetectEntry,
128
+ formatMessage: formatMessage,
129
+ language: language,
130
+ languagePickerOptions: languagePickerOptions
131
+ });
96
132
  languagePicker = {
97
133
  type: 'custom',
98
134
  fallback: [],
@@ -102,7 +138,7 @@ var getToolbarConfig = exports.getToolbarConfig = function getToolbarConfig() {
102
138
  }
103
139
  return /*#__PURE__*/_react.default.createElement(_CodeBlockLanguagePicker.CodeBlockLanguagePicker, {
104
140
  api: api,
105
- defaultValue: defaultPickerValue,
141
+ defaultValue: autoDetectPickerValue,
106
142
  editorView: view,
107
143
  filterOption: languageListFilter,
108
144
  formatMessage: formatMessage,
@@ -234,8 +270,8 @@ var getToolbarConfig = exports.getToolbarConfig = function getToolbarConfig() {
234
270
  var languageListFilter = exports.languageListFilter = function languageListFilter(option, rawInput) {
235
271
  // Ignored via go/ees005
236
272
  // eslint-disable-next-line @typescript-eslint/no-explicit-any
237
- var _ref3 = option,
238
- data = _ref3.data;
273
+ var _ref4 = option,
274
+ data = _ref4.data;
239
275
  var searchString = rawInput.toLowerCase();
240
276
  return data.label.toLowerCase().includes(searchString) || data.alias.some(function (alias) {
241
277
  return alias.toLowerCase() === searchString;
@@ -42,8 +42,5 @@ function getAllChangedCodeBlocksInTransaction(tr) {
42
42
  });
43
43
  });
44
44
  });
45
- if (changedCodeBlocks.length < 1) {
46
- return null;
47
- }
48
45
  return changedCodeBlocks;
49
46
  }
@@ -8,10 +8,14 @@ Object.defineProperty(exports, "__esModule", {
8
8
  exports.CodeBlockLanguagePicker = void 0;
9
9
  var _slicedToArray2 = _interopRequireDefault(require("@babel/runtime/helpers/slicedToArray"));
10
10
  var _react = _interopRequireWildcard(require("react"));
11
+ var _expValEquals = require("@atlaskit/tmp-editor-statsig/exp-val-equals");
12
+ var _editorCommands = require("../editor-commands");
13
+ var _languagePickerOptions = require("./language-picker-options");
11
14
  var _LanguagePicker = require("./LanguagePicker");
12
15
  var _recentLanguages = require("./recent-languages");
13
16
  function _interopRequireWildcard(e, t) { if ("function" == typeof WeakMap) var r = new WeakMap(), n = new WeakMap(); return (_interopRequireWildcard = function _interopRequireWildcard(e, t) { if (!t && e && e.__esModule) return e; var o, i, f = { __proto__: null, default: e }; if (null === e || "object" != _typeof(e) && "function" != typeof e) return f; if (o = t ? n : r) { if (o.has(e)) return o.get(e); o.set(e, f); } for (var _t in e) "default" !== _t && {}.hasOwnProperty.call(e, _t) && ((i = (o = Object.defineProperty) && Object.getOwnPropertyDescriptor(e, _t)) && (i.get || i.set) ? o(f, _t, i) : f[_t] = e[_t]); return f; })(e, t); }
14
17
  var CodeBlockLanguagePicker = exports.CodeBlockLanguagePicker = function CodeBlockLanguagePicker(_ref) {
18
+ var _api$analytics2;
15
19
  var api = _ref.api,
16
20
  defaultValue = _ref.defaultValue,
17
21
  editorView = _ref.editorView,
@@ -27,19 +31,22 @@ var CodeBlockLanguagePicker = exports.CodeBlockLanguagePicker = function CodeBlo
27
31
  var refreshRecentLanguages = (0, _react.useCallback)(function () {
28
32
  setRecentLanguageValues((0, _recentLanguages.getRecentLanguages)());
29
33
  }, []);
30
- var handleLanguageSelect = (0, _react.useCallback)(function (language) {
31
- (0, _recentLanguages.saveRecentLanguage)(language);
32
- setRecentLanguageValues((0, _recentLanguages.getRecentLanguages)());
33
- }, []);
34
+ var handleSelection = (0, _react.useCallback)(function (option, selectionSource) {
35
+ var _api$analytics;
36
+ var command = option.value === _languagePickerOptions.DETECT_LANGUAGE_VALUE && (0, _expValEquals.expValEquals)('platform_editor_code_block_auto_detection', 'isEnabled', true) ? (0, _editorCommands.detectLanguage)() : (0, _editorCommands.changeLanguage)(api === null || api === void 0 || (_api$analytics = api.analytics) === null || _api$analytics === void 0 ? void 0 : _api$analytics.actions)(option.value, selectionSource);
37
+ var commandSucceeded = command(editorView.state, editorView.dispatch);
38
+ if (commandSucceeded && option.value !== _languagePickerOptions.DETECT_LANGUAGE_VALUE) {
39
+ (0, _recentLanguages.saveRecentLanguage)(option.value);
40
+ setRecentLanguageValues((0, _recentLanguages.getRecentLanguages)());
41
+ }
42
+ }, [api === null || api === void 0 || (_api$analytics2 = api.analytics) === null || _api$analytics2 === void 0 ? void 0 : _api$analytics2.actions, editorView]);
34
43
  return /*#__PURE__*/_react.default.createElement(_LanguagePicker.LanguagePicker, {
35
- api: api,
36
44
  defaultValue: defaultValue,
37
- editorView: editorView,
38
45
  filterOption: filterOption,
39
46
  formatMessage: formatMessage,
40
47
  languagePickerOptions: languagePickerOptions,
41
48
  recentLanguageValues: recentLanguageValues,
42
- onLanguageSelect: handleLanguageSelect,
43
- onMenuOpen: refreshRecentLanguages
49
+ onMenuOpen: refreshRecentLanguages,
50
+ onSelection: handleSelection
44
51
  });
45
52
  };
@@ -17,7 +17,6 @@ var _editorSharedStyles = require("@atlaskit/editor-shared-styles");
17
17
  var _chevronDown = _interopRequireDefault(require("@atlaskit/icon/core/chevron-down"));
18
18
  var _compiled = require("@atlaskit/primitives/compiled");
19
19
  var _select = require("@atlaskit/select");
20
- var _editorCommands = require("../editor-commands");
21
20
  var _languagePickerOptions = require("./language-picker-options");
22
21
  function _interopRequireWildcard(e, t) { if ("function" == typeof WeakMap) var r = new WeakMap(), n = new WeakMap(); return (_interopRequireWildcard = function _interopRequireWildcard(e, t) { if (!t && e && e.__esModule) return e; var o, i, f = { __proto__: null, default: e }; if (null === e || "object" != _typeof(e) && "function" != typeof e) return f; if (o = t ? n : r) { if (o.has(e)) return o.get(e); o.set(e, f); } for (var _t in e) "default" !== _t && {}.hasOwnProperty.call(e, _t) && ((i = (o = Object.defineProperty) && Object.getOwnPropertyDescriptor(e, _t)) && (i.get || i.set) ? o(f, _t, i) : f[_t] = e[_t]); return f; })(e, t); }
23
22
  function _createForOfIteratorHelper(r, e) { var t = "undefined" != typeof Symbol && r[Symbol.iterator] || r["@@iterator"]; if (!t) { if (Array.isArray(r) || (t = _unsupportedIterableToArray(r)) || e && r && "number" == typeof r.length) { t && (r = t); var _n = 0, F = function F() {}; return { s: F, n: function n() { return _n >= r.length ? { done: !0 } : { done: !1, value: r[_n++] }; }, e: function e(r) { throw r; }, f: F }; } throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); } var o, a = !0, u = !1; return { s: function s() { t = t.call(r); }, n: function n() { var r = t.next(); return a = r.done, r; }, e: function e(r) { u = !0, o = r; }, f: function f() { try { a || null == t.return || t.return(); } finally { if (u) throw o; } } }; }
@@ -81,18 +80,15 @@ var getRecentlyUsedLanguages = function getRecentlyUsedLanguages(recentLanguageV
81
80
  return recentlyUsedLanguages;
82
81
  };
83
82
  var LanguagePicker = exports.LanguagePicker = function LanguagePicker(_ref) {
84
- var _api$analytics, _defaultValue$label;
85
- var api = _ref.api,
86
- defaultValue = _ref.defaultValue,
87
- editorView = _ref.editorView,
83
+ var _defaultValue$label;
84
+ var defaultValue = _ref.defaultValue,
88
85
  filterOption = _ref.filterOption,
89
86
  formatMessage = _ref.formatMessage,
90
87
  languagePickerOptions = _ref.languagePickerOptions,
91
88
  _ref$recentLanguageVa = _ref.recentLanguageValues,
92
89
  recentLanguageValues = _ref$recentLanguageVa === void 0 ? [] : _ref$recentLanguageVa,
93
- onLanguageSelect = _ref.onLanguageSelect,
94
- onMenuOpen = _ref.onMenuOpen;
95
- var editorAnalyticsAPI = api === null || api === void 0 || (_api$analytics = api.analytics) === null || _api$analytics === void 0 ? void 0 : _api$analytics.actions;
90
+ onMenuOpen = _ref.onMenuOpen,
91
+ onSelection = _ref.onSelection;
96
92
  var label = (_defaultValue$label = defaultValue === null || defaultValue === void 0 ? void 0 : defaultValue.label) !== null && _defaultValue$label !== void 0 ? _defaultValue$label : formatMessage(_messages.codeBlockButtonMessages.selectLanguage);
97
93
  var selectLanguageLabel = formatMessage(_messages.codeBlockButtonMessages.selectLanguage);
98
94
  var _useState = (0, _react.useState)(false),
@@ -127,11 +123,8 @@ var LanguagePicker = exports.LanguagePicker = function LanguagePicker(_ref) {
127
123
  }
128
124
  var isSearchSelection = inputValueRef.current.trim().length > 0;
129
125
  var selectionSource = isSearchSelection ? 'search' : (_option$selectionSour = option.selectionSource) !== null && _option$selectionSour !== void 0 ? _option$selectionSour : 'all';
130
- var commandSucceeded = (0, _editorCommands.changeLanguage)(editorAnalyticsAPI)(option.value, selectionSource)(editorView.state, editorView.dispatch);
131
- if (commandSucceeded) {
132
- onLanguageSelect === null || onLanguageSelect === void 0 || onLanguageSelect(option.value);
133
- }
134
- }, [editorAnalyticsAPI, editorView, onLanguageSelect]);
126
+ onSelection(option, selectionSource);
127
+ }, [onSelection]);
135
128
  var handleInputChange = (0, _react.useCallback)(function (newInputValue, actionMeta) {
136
129
  // React-select clears the input as part of selecting a value before onChange fires.
137
130
  // Keep the last user-typed query so handleChange can report search selections correctly.
@@ -156,10 +149,9 @@ var LanguagePicker = exports.LanguagePicker = function LanguagePicker(_ref) {
156
149
  appearance: "subtle",
157
150
  isSelected: isOpen,
158
151
  "aria-controls": ariaControls,
159
- "aria-label": selectLanguageLabel,
160
152
  testId: "code-block-language-picker-trigger"
161
153
  }, label));
162
- }, [label, selectLanguageLabel]);
154
+ }, [label]);
163
155
  return /*#__PURE__*/_react.default.createElement(_select.PopupSelect, {
164
156
  components: popupSelectComponents,
165
157
  filterOption: filterOption,
@@ -8,6 +8,7 @@ exports.getDetectLanguageOption = exports.createGroupedLanguageOptions = exports
8
8
  var _toConsumableArray2 = _interopRequireDefault(require("@babel/runtime/helpers/toConsumableArray"));
9
9
  var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty"));
10
10
  var _messages = require("@atlaskit/editor-common/messages");
11
+ var _expValEquals = require("@atlaskit/tmp-editor-statsig/exp-val-equals");
11
12
  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; }
12
13
  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; }
13
14
  var NONE_LANGUAGE_VALUE = exports.NONE_LANGUAGE_VALUE = 'none';
@@ -35,7 +36,7 @@ var createGroupedLanguageOptions = exports.createGroupedLanguageOptions = functi
35
36
  var plainTextOption = languages.find(function (language) {
36
37
  return language.value === PLAIN_TEXT_LANGUAGE_VALUE;
37
38
  });
38
- var pinnedOptions = [getDetectLanguageOption(formatMessage)];
39
+ var pinnedOptions = (0, _expValEquals.expValEquals)('platform_editor_code_block_auto_detection', 'isEnabled', true) ? [getDetectLanguageOption(formatMessage)] : [];
39
40
  if (plainTextOption) {
40
41
  pinnedOptions.push(_objectSpread(_objectSpread({}, plainTextOption), {}, {
41
42
  selectionSource: 'pinned'