jodit 4.12.41 → 4.12.44

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 (71) hide show
  1. package/CHANGELOG.md +16 -0
  2. package/es2015/jodit.css +1 -1
  3. package/es2015/jodit.fat.min.js +4 -4
  4. package/es2015/jodit.js +99 -6
  5. package/es2015/jodit.min.js +4 -4
  6. package/es2015/plugins/debug/debug.css +1 -1
  7. package/es2015/plugins/debug/debug.js +1 -1
  8. package/es2015/plugins/debug/debug.min.js +1 -1
  9. package/es2015/plugins/speech-recognize/speech-recognize.css +1 -1
  10. package/es2015/plugins/speech-recognize/speech-recognize.js +1 -1
  11. package/es2015/plugins/speech-recognize/speech-recognize.min.js +1 -1
  12. package/es2018/jodit.fat.min.js +4 -4
  13. package/es2018/jodit.min.js +4 -4
  14. package/es2018/plugins/debug/debug.min.js +1 -1
  15. package/es2018/plugins/speech-recognize/speech-recognize.min.js +1 -1
  16. package/es2021/jodit.css +1 -1
  17. package/es2021/jodit.fat.min.js +6 -6
  18. package/es2021/jodit.js +99 -6
  19. package/es2021/jodit.min.js +6 -6
  20. package/es2021/plugins/debug/debug.css +1 -1
  21. package/es2021/plugins/debug/debug.js +1 -1
  22. package/es2021/plugins/debug/debug.min.js +1 -1
  23. package/es2021/plugins/speech-recognize/speech-recognize.css +1 -1
  24. package/es2021/plugins/speech-recognize/speech-recognize.js +1 -1
  25. package/es2021/plugins/speech-recognize/speech-recognize.min.js +1 -1
  26. package/es2021.en/jodit.css +1 -1
  27. package/es2021.en/jodit.fat.min.js +6 -6
  28. package/es2021.en/jodit.js +99 -6
  29. package/es2021.en/jodit.min.js +7 -7
  30. package/es2021.en/plugins/debug/debug.css +1 -1
  31. package/es2021.en/plugins/debug/debug.js +1 -1
  32. package/es2021.en/plugins/debug/debug.min.js +1 -1
  33. package/es2021.en/plugins/speech-recognize/speech-recognize.css +1 -1
  34. package/es2021.en/plugins/speech-recognize/speech-recognize.js +1 -1
  35. package/es2021.en/plugins/speech-recognize/speech-recognize.min.js +1 -1
  36. package/es5/jodit.css +2 -2
  37. package/es5/jodit.fat.min.js +2 -2
  38. package/es5/jodit.js +99 -6
  39. package/es5/jodit.min.css +2 -2
  40. package/es5/jodit.min.js +2 -2
  41. package/es5/plugins/debug/debug.css +1 -1
  42. package/es5/plugins/debug/debug.js +1 -1
  43. package/es5/plugins/debug/debug.min.js +1 -1
  44. package/es5/plugins/speech-recognize/speech-recognize.css +1 -1
  45. package/es5/plugins/speech-recognize/speech-recognize.js +1 -1
  46. package/es5/plugins/speech-recognize/speech-recognize.min.js +1 -1
  47. package/es5/polyfills.fat.min.js +1 -1
  48. package/es5/polyfills.js +1 -1
  49. package/es5/polyfills.min.js +1 -1
  50. package/esm/config.d.ts +22 -0
  51. package/esm/config.js +21 -0
  52. package/esm/core/constants.js +1 -1
  53. package/esm/core/storage/async-storage.d.ts +2 -2
  54. package/esm/core/storage/async-storage.js +19 -1
  55. package/esm/core/storage/engines/local-storage-provider.js +6 -1
  56. package/esm/core/view/view.js +1 -1
  57. package/esm/plugins/clean-html/helpers/index.d.ts +1 -0
  58. package/esm/plugins/clean-html/helpers/index.js +1 -0
  59. package/esm/plugins/clean-html/helpers/is-allowed-media-embed.d.ts +15 -0
  60. package/esm/plugins/clean-html/helpers/is-allowed-media-embed.js +28 -0
  61. package/esm/plugins/clean-html/helpers/visitor/filters/sandbox-iframes-in-content.js +7 -0
  62. package/esm/plugins/clean-html/helpers/visitor/filters/try-remove-node.js +9 -1
  63. package/esm/types/storage.d.ts +15 -0
  64. package/esm/types/view.d.ts +8 -1
  65. package/package.json +1 -1
  66. package/types/config.d.ts +22 -0
  67. package/types/core/storage/async-storage.d.ts +2 -2
  68. package/types/plugins/clean-html/helpers/index.d.ts +1 -0
  69. package/types/plugins/clean-html/helpers/is-allowed-media-embed.d.ts +15 -0
  70. package/types/types/storage.d.ts +15 -0
  71. package/types/types/view.d.ts +8 -1
@@ -1,7 +1,7 @@
1
1
  /*!
2
2
  * jodit - Jodit is an awesome and useful wysiwyg editor with filebrowser
3
3
  * Author: Chupurnov <chupurnov@gmail.com> (https://xdsoft.net/jodit/)
4
- * Version: v4.12.41
4
+ * Version: v4.12.44
5
5
  * Url: https://xdsoft.net/jodit/
6
6
  * License(s): MIT
7
7
  */
@@ -378,6 +378,26 @@ let ConfigPrototype = {};
378
378
  /**
379
379
  * if set true, then the current mode is saved in a cookie, and is restored after a reload of the page
380
380
  */ (0,_swc_helpers_define_property__WEBPACK_IMPORTED_MODULE_0__._)(this, "saveModeInStorage", false);
381
+ /**
382
+ * Configure the provider that backs {@link IViewBased.asyncStorage}.
383
+ *
384
+ * By default the editor's `asyncStorage` uses persistent `IndexedDB` (with an
385
+ * in-memory fallback when it is unavailable). Set `defaultProvider` to override it:
386
+ * - `'local'` — persist in `localStorage`;
387
+ * - `'memory'` — keep everything in memory (nothing survives a reload);
388
+ * - a custom {@link IAsyncStorage} implementation — plug in your own backend.
389
+ *
390
+ * ```javascript
391
+ * Jodit.make('#editor', {
392
+ * asyncStorage: { defaultProvider: 'local' }
393
+ * });
394
+ *
395
+ * // or a fully custom backend
396
+ * Jodit.make('#editor', {
397
+ * asyncStorage: { defaultProvider: myAsyncStorage }
398
+ * });
399
+ * ```
400
+ */ (0,_swc_helpers_define_property__WEBPACK_IMPORTED_MODULE_0__._)(this, "asyncStorage", {});
381
401
  /**
382
402
  * Class name that can be appended to the editable area
383
403
  *
@@ -1823,7 +1843,7 @@ __webpack_require__.r(__webpack_exports__);
1823
1843
  * ```
1824
1844
  * @packageDocumentation
1825
1845
  * @module constants
1826
- */ const APP_VERSION = "4.12.41";
1846
+ */ const APP_VERSION = "4.12.44";
1827
1847
  // prettier-ignore
1828
1848
  const ES = "es2021";
1829
1849
  const IS_ES_MODERN = true;
@@ -13031,9 +13051,23 @@ class AsyncStorage {
13031
13051
  await provider.close();
13032
13052
  }
13033
13053
  }
13034
- static makeStorage(persistentOrStrategy = false, suffix) {
13054
+ static makeStorage(persistentOrStrategy = false, suffix, options) {
13035
13055
  let provider = undefined;
13036
13056
  let storage = null;
13057
+ // An explicit `defaultProvider` overrides the strategy-based selection
13058
+ // below and decides which provider backs the storage.
13059
+ const defaultProvider = options?.defaultProvider;
13060
+ if (defaultProvider != null) {
13061
+ if (defaultProvider === 'local') {
13062
+ provider = (0,_engines_local_storage_provider__WEBPACK_IMPORTED_MODULE_3__.canUsePersistentStorage)('localStorage') ? new _engines_local_storage_provider__WEBPACK_IMPORTED_MODULE_3__.LocalStorageProvider(_storage__WEBPACK_IMPORTED_MODULE_5__.StorageKey + (suffix || '')) : new _engines_memory_storage_provider__WEBPACK_IMPORTED_MODULE_4__.MemoryStorageProvider();
13063
+ } else if (defaultProvider === 'memory') {
13064
+ provider = new _engines_memory_storage_provider__WEBPACK_IMPORTED_MODULE_4__.MemoryStorageProvider();
13065
+ } else {
13066
+ // A custom IAsyncStorage implementation, used as-is.
13067
+ provider = defaultProvider;
13068
+ }
13069
+ return new AsyncStorage(Promise.resolve(provider), suffix);
13070
+ }
13037
13071
  if (persistentOrStrategy === 'localStorage' || persistentOrStrategy === 'sessionStorage') {
13038
13072
  if ((0,_engines_local_storage_provider__WEBPACK_IMPORTED_MODULE_3__.canUsePersistentStorage)(persistentOrStrategy)) {
13039
13073
  provider = new _engines_local_storage_provider__WEBPACK_IMPORTED_MODULE_3__.LocalStorageProvider(_storage__WEBPACK_IMPORTED_MODULE_5__.StorageKey + (suffix || ''), persistentOrStrategy);
@@ -13321,7 +13355,12 @@ function clearUseIndexedDBCache() {
13321
13355
  }
13322
13356
  delete(key) {
13323
13357
  try {
13324
- this.storage.removeItem(this.rootKey);
13358
+ const buffer = this.storage.getItem(this.rootKey);
13359
+ if (buffer) {
13360
+ const json = JSON.parse(buffer);
13361
+ delete json[key];
13362
+ this.storage.setItem(this.rootKey, JSON.stringify(json));
13363
+ }
13325
13364
  } catch {}
13326
13365
  return this;
13327
13366
  }
@@ -16686,7 +16725,7 @@ class View extends jodit_core_component_component__WEBPACK_IMPORTED_MODULE_3__.C
16686
16725
  /**
16687
16726
  * Container for persistent set/get value
16688
16727
  */ get asyncStorage() {
16689
- return jodit_core_storage_async_storage__WEBPACK_IMPORTED_MODULE_14__.AsyncStorage.makeStorage(true, this.id);
16728
+ return jodit_core_storage_async_storage__WEBPACK_IMPORTED_MODULE_14__.AsyncStorage.makeStorage(true, this.id, this.o.asyncStorage);
16690
16729
  }
16691
16730
  /**
16692
16731
  * Short alias for `create`
@@ -27769,6 +27808,43 @@ jodit_core_ui_icon__WEBPACK_IMPORTED_MODULE_0__.Icon.set('eraser', (_eraser_svg_
27769
27808
 
27770
27809
 
27771
27810
 
27811
+
27812
+ /***/ }),
27813
+
27814
+ /***/ 28665:
27815
+ /***/ (function(__unused_webpack_module, __webpack_exports__, __webpack_require__) {
27816
+
27817
+ "use strict";
27818
+ /* harmony export */ __webpack_require__.d(__webpack_exports__, {
27819
+ /* harmony export */ isAllowedMediaEmbed: function() { return /* binding */ isAllowedMediaEmbed; }
27820
+ /* harmony export */ });
27821
+ /*!
27822
+ * Jodit Editor (https://xdsoft.net/jodit/)
27823
+ * Released under MIT see LICENSE.txt in the project root for license information.
27824
+ * Copyright (c) 2013-2026 Valerii Chupurnov. All rights reserved. https://xdsoft.net
27825
+ */ /**
27826
+ * @module plugins/clean-html
27827
+ */ // The embed URLs produced by the built-in Video button (see
27828
+ // `convertMediaUrlToVideoEmbed`): `//www.youtube.com/embed/<id>` and
27829
+ // `//player.vimeo.com/video/<id>`. `youtube-nocookie.com` is the privacy
27830
+ // variant YouTube offers for the same `/embed/` player. The `/embed/` and
27831
+ // `/video/` path prefixes are required so a bare provider link
27832
+ // (`youtube.com/@somebody`) is not treated as a player.
27833
+ const YOUTUBE_EMBED = /^(https?:)?\/\/(www\.|m\.|music\.)?youtube(-nocookie)?\.com\/embed\//i;
27834
+ const VIMEO_EMBED = /^(https?:)?\/\/player\.vimeo\.com\/video\//i;
27835
+ /**
27836
+ * Whether an `<iframe>` `src` points at a recognized YouTube/Vimeo video
27837
+ * player. Such iframes are inserted intentionally through the Video button, so
27838
+ * clean-html must not strip them (`denyTags` includes `iframe` by default) or
27839
+ * neutralize them with an empty `sandbox=""` (#1381). Arbitrary/bare iframes
27840
+ * are still removed.
27841
+ *
27842
+ * @private
27843
+ */ function isAllowedMediaEmbed(src) {
27844
+ return YOUTUBE_EMBED.test(src) || VIMEO_EMBED.test(src);
27845
+ }
27846
+
27847
+
27772
27848
  /***/ }),
27773
27849
 
27774
27850
  /***/ 37431:
@@ -28257,6 +28333,7 @@ __webpack_require__.r(__webpack_exports__);
28257
28333
  /* harmony export */ });
28258
28334
  /* harmony import */ var jodit_core_dom_dom__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(23211);
28259
28335
  /* harmony import */ var jodit_core_helpers_utils_attr__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(7909);
28336
+ /* harmony import */ var _is_allowed_media_embed__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(28665);
28260
28337
  /*!
28261
28338
  * Jodit Editor (https://xdsoft.net/jodit/)
28262
28339
  * Released under MIT see LICENSE.txt in the project root for license information.
@@ -28265,6 +28342,7 @@ __webpack_require__.r(__webpack_exports__);
28265
28342
  * @module plugins/clean-html
28266
28343
  */
28267
28344
 
28345
+
28268
28346
  /**
28269
28347
  * Add `sandbox=""` attribute to all `<iframe>` elements in the editor content
28270
28348
  * @private
@@ -28273,6 +28351,12 @@ __webpack_require__.r(__webpack_exports__);
28273
28351
  return hadEffect;
28274
28352
  }
28275
28353
  const elm = nodeElm;
28354
+ // A trusted YouTube/Vimeo player (inserted via the Video button) must not
28355
+ // get an empty `sandbox=""` — that blocks scripts and stops playback. It
28356
+ // is served in its own third-party origin, so leave it as-is (#1381).
28357
+ if ((0,_is_allowed_media_embed__WEBPACK_IMPORTED_MODULE_2__.isAllowedMediaEmbed)((0,jodit_core_helpers_utils_attr__WEBPACK_IMPORTED_MODULE_1__.attr)(elm, 'src') || '')) {
28358
+ return hadEffect;
28359
+ }
28276
28360
  if (!elm.hasAttribute('sandbox')) {
28277
28361
  (0,jodit_core_helpers_utils_attr__WEBPACK_IMPORTED_MODULE_1__.attr)(elm, 'sandbox', '');
28278
28362
  return true;
@@ -28409,6 +28493,8 @@ function filterStyleProperties(style, allowed) {
28409
28493
  /* harmony import */ var jodit_core_constants__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(81937);
28410
28494
  /* harmony import */ var jodit_core_dom_dom__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(23211);
28411
28495
  /* harmony import */ var jodit_core_helpers_string_trim__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(4040);
28496
+ /* harmony import */ var jodit_core_helpers_utils_attr__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(7909);
28497
+ /* harmony import */ var _is_allowed_media_embed__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(28665);
28412
28498
  /*!
28413
28499
  * Jodit Editor (https://xdsoft.net/jodit/)
28414
28500
  * Released under MIT see LICENSE.txt in the project root for license information.
@@ -28418,6 +28504,8 @@ function filterStyleProperties(style, allowed) {
28418
28504
  */
28419
28505
 
28420
28506
 
28507
+
28508
+
28421
28509
  /**
28422
28510
  * @private
28423
28511
  */ function tryRemoveNode(jodit, nodeElm, hadEffect, allowTags, denyTags, currentSelectionNode) {
@@ -28434,7 +28522,12 @@ function filterStyleProperties(style, allowed) {
28434
28522
  if (allow && !allow[node.nodeName]) {
28435
28523
  return true;
28436
28524
  }
28437
- if (!allow && deny && deny[node.nodeName]) {
28525
+ // A YouTube/Vimeo player inserted through the Video button is trusted
28526
+ // editor content, so keep it even though `iframe` is denied by default
28527
+ // — otherwise the embed is stripped ~300ms after insertion (#1381).
28528
+ // Arbitrary/bare iframes stay denied.
28529
+ const isTrustedEmbed = node.nodeName === 'IFRAME' && (0,_is_allowed_media_embed__WEBPACK_IMPORTED_MODULE_4__.isAllowedMediaEmbed)((0,jodit_core_helpers_utils_attr__WEBPACK_IMPORTED_MODULE_3__.attr)(node, 'src') || '');
28530
+ if (!allow && deny && deny[node.nodeName] && !isTrustedEmbed) {
28438
28531
  return true;
28439
28532
  }
28440
28533
  }