jodit
Version:
Jodit is an awesome and useful wysiwyg editor with filebrowser
1,501 lines (1,159 loc) • 154 kB
Markdown
# Changelog
> **Tags:**
>
> - :boom: [Breaking Change]
> - :rocket: [New Feature]
> - :bug: [Bug Fix]
> - :memo: [Documentation]
> - :house: [Internal]
> - :nail_care: [Polish]
## 4.6.2
#### :house: Internal
- When the option is turned on `extraPlugins`. If the plugin module does not find the desired plugin, then it tries to load it from the same folder where the plugin itself.
For example, if you connect the Jodit script from `./node_moudules/jodit/es2018/jodit.js` and you have a plugin `./node_moudules/jodit/es2018/plugins/my-plugin/`
```js
Jodit.make ('#Editor', {
extraPlugins: ['my-plugin'] // Will Be Loaded from ./node_modules/jodit/plugins/my-plugin/my-plugin.js
});
`` `
But now if you connect Jodit from `./node_moudules/jodit/es2018/jodit.min.js`
then the plugin will be loaded from `./node_modules/jodit/es2018/plugins/my-plugin/my-plugin.min.js`
```js
Jodit.make ('#Editor', {
extraPlugins: ['my-plugin'] // Will Be Loaded from ./node_modules/jodit/plugins/my-plugin/my-plugin.min.js
});
`` `
## 4.6.1
#### :boom: Breaking Change
- ESM assembly uses the flag fat_mode = true
Before in ESM build:
```js
console.log(Jodit.constants.FAT_MODE); // false`
console.log(Jodit.fatMode); // false`
```
Now:
```js
console.log(Jodit.constants.FAT_MODE); // true`
console.log(Jodit.fatMode); // true`
```
## 4.5.20
#### :house: Internal
```
@eslint/eslintrc ^3.3.0 → ^3.3.1
@eslint/js ^9.22.0 → ^9.23.0
@playwright/test ^1.51.0 → ^1.51.1
@swc/core ^1.11.8 → ^1.11.12
@types/node ^22.13.10 → ^22.13.11
@typescript-eslint/eslint-plugin ^8.26.1 → ^8.27.0
@typescript-eslint/parser ^8.26.1 → ^8.27.0
axios ^1.8.2 → ^1.8.4
eslint ^9.22.0 → ^9.23.0
stylelint ^16.15.0 → ^16.16.0
```
## 4.5.19
#### :house: Internal
```
@eslint/compat ^1.2.6 → ^1.2.7
@eslint/eslintrc ^3.2.0 → ^3.3.0
@eslint/js ^9.20.0 → ^9.22.0
@playwright/test ^1.50.1 → ^1.51.0
@swc/core ^1.10.16 → ^1.11.8
@types/node ^22.13.4 → ^22.13.10
@typescript-eslint/eslint-plugin ^8.24.0 → ^8.26.1
@typescript-eslint/parser ^8.24.0 → ^8.26.1
autoprefixer ^10.4.20 → ^10.4.21
axios ^1.7.9 → ^1.8.2
core-js ^3.40.0 → ^3.41.0
css-minimizer-webpack-plugin ^7.0.0 → ^7.0.2
eslint ^9.20.1 → ^9.22.0
eslint-config-prettier ^10.0.1 → ^10.1.1
globals ^15.15.0 → ^16.0.0
postcss >=8.5.2 → >=8.5.3
prettier ^3.5.1 → ^3.5.3
stylelint ^16.14.1 → ^16.15.0
terser-webpack-plugin ^5.3.11 → ^5.3.14
tsx ^4.19.2 → ^4.19.3
typescript ^5.7.3 → ^5.8.2
```
## 4.5.17
### :rocket: New Feature
- In Readonly mode, the ability to disable navigation by links has been added. By default, the option is enabled.
```js
const editor = Jodit.make('#editor', {
readonly: true,
link: {
preventReadOnlyNavigation: true
}
});
```
## 4.5.12
#### :house: Internal
```
@eslint/compat ^1.2.3 → ^1.2.6
@eslint/js ^9.16.0 → ^9.20.0
@playwright/test ^1.49.0 → ^1.50.1
@swc/core ^1.10.11 → ^1.10.16
@types/node ^22.10.1 → ^22.13.4
@typescript-eslint/eslint-plugin ^8.16.0 → ^8.24.0
@typescript-eslint/parser ^8.16.0 → ^8.24.0
axios ^1.7.8 → ^1.7.9
compression ^1.7.5 → ^1.8.0
core-js ^3.39.0 → ^3.40.0
dotenv ^16.4.5 → ^16.4.7
eslint ^9.16.0 → ^9.20.1
eslint-config-prettier ^9.1.0 → ^10.0.1
eslint-plugin-prettier ^5.2.1 → ^5.2.3
glob ^11.0.0 → ^11.0.1
globals ^15.12.0 → ^15.15.0
less ^4.2.1 → ^4.2.2
mocha ^10.8.2 → ^11.1.0
postcss >=8.4.49 → >=8.5.2
prettier ^3.4.1 → ^3.5.1
stylelint ^16.11.0 → ^16.14.1
stylelint-config-standard ^36.0.1 → ^37.0.0
stylelint-prettier ^5.0.2 → ^5.0.3
terser-webpack-plugin ^5.3.10 → ^5.3.11
ts-loader ^9.5.1 → ^9.5.2
typescript ^5.7.2 → ^5.7.3
webpack 5.96.1 → 5.98.0
webpack-cli ^5.1.4 → ^6.0.1
webpack-dev-server ^5.1.0 → ^5.2.0
```
## 4.5.10
#### :house: Internal
- Shit of the Chai JS module to the browser because the developers decided not to support the assembly for browsers anymore
### :rocket: New Feature
- Added API launching tasks for schedule with a reference on https://wicg.github.io/scheduling-apis/
- [LazyWalker](https://xdsoft.net/jodit/docs/modules/dom.html#lazywalker) module now uses the new API for scheduling tasks
```js
const editor = Jodit.make('#editor');
editor.schedulePostTask(
() => {
console.log('Task 1');
},
{ priority: 'user-blocking' }
);
```
## 4.5.5
### :rocket: New Feature
- Added the ability to add their html inserts to the plugin `paste`
```js
Jodit.make('#editor', {
events: {
onCustomPasteHTMLOption: (action, html) => {
if (action === 'custom') {
const div = document.createElement('div');
div.innerHTML = html;
const spans = div.querySelectorAll('span');
for (let i = 0; i < spans.length; i++) {
const span = spans[i];
const p = document.createElement('p');
p.innerHTML = span.innerHTML;
span.parentNode.replaceChild(p, span);
}
return div.innerHTML;
}
}
},
pasteHTMLActionList: [
{
text: 'Custom',
value: 'custom'
}
]
});
```
## 4.5.4
#### :house: Internal
- ESM build is going to the ES2018 target, not ES2020. This is due to the fact that the ES2020 target is not supported by all browsers. The ES2018 target is supported by all modern browsers. If you need to support older browsers, you can use the ES5 build.
## 4.5.2
### :rocket: New Feature
- Added plugins/all.js for ESM build
```js
import { Jodit } from 'jodit/esm/index.js';
console.log(Jodit.plugins.size); // 21 See. https://github.com/xdan/jodit/blob/main/tools/utils/resolve-alias-imports.ts#L81
import 'jodit/esm/plugins/all.js';
console.log(Jodit.plugins.size); // 62 and more in the future
```
## 4.5.1
#### :boom: Breaking Change
- If the `cleanHTML.allowTags` option was set, then this did not affect `cleanHTML.denyTags`. Now if both options are set,
then `cleanHTML.denyTags` will only be applied to those tags that are not indicated in `cleanHTML.allowTags`
```js
Jodit.make('#editor', {
cleanHTML: {
allowTags: 'script,p', // Only Script and P tags will be allowed
denyTags: 'script,img' // This option is completely ignored
}
});
```
## 4.4.8
### :bug: Bug Fix
- Fixed an error when in Jodit in the line transfer mode BR, when the indent button pressed the element was removed
## 4.3.1
#### :boom: Breaking Change
- Added the `popupRoot` option for all `IViewBased` classes (`Dialog`, `Jodit`, `FileBrowser`). Allows you to specify the parental element of dialogs and popup windows.
- If the option is not specified, then when creating a dialogue, there is a bypass of a tree, starting with the editor. If an element is found `dialog` or eny element with `position: fixed` or `position: absolute`, then it is used as a parent.
- Also, `shadowRoot` can be used as a `popupRoot`
Those. Parent search priorities:
1. `popupRoot` option
2. `shadowRoot` option
3. The closest element `dialog` or with style `position: fixed` or `position: absolute`
4. document.body
This is necessary in cases where Jodit is displayed inside the dialog windows with a focus interception.
For example, when inserting in [mui dialog] (https://mui.com/material-ui/react-dialog/)
If this is your situation, then in most cases you won't need to do anything, as Jodit will find the correct parent element on its own.
But if your code logic was configured specifically to insert into `document.body`, then you will need to explicitly specify `popupRoot: document.body`
```typescript
const editor = Jodit.make('#editor', {
popupRoot: document.body
});
```
## 4.2.48
### :bug: Bug Fix
- [Source code mode: When the text area is resized, the number of visible code view lines does not dynamically adjust #1206](https://github.com/xdan/jodit/issues/1206)
#### :house: Internal
- Use typings for `options` in `Jodti.make(element, options)` method
Before:
```typescript
class Jodit {
static make(element: HTMLElement | string, options?: object): Jodit {
//...
}
}
```
After:
```typescript
class Jodit {
static make(
element: HTMLElement | string,
options?: DeepPartial<Config>
): Jodit {
//...
}
}
```
## 4.2.45
- Fixed bug with RTL mode when all dialogs were opened without RTL mode
## 4.2.44
### :rocket: New Feature
- Added method `Jodit.modules.Helpers.ConfigDeepFlatten` it allows make plain object from prototype chain object.
```typescript
const editor = Jodit.make('#editor', {
image: {
dialogWidth: 500
}
});
console.log(editor.o.image.openOnDblClick); // true
// But you can't get all options in plain object
console.log(JSON.stringify(editor.o.image)); // {"dialogWidth":500}
const plain = Jodit.modules.Helpers.ConfigDeepFlatten(editor.o.image);
console.log(JSON.stringify(plain)); // {"dialogWidth":500, "openOnDblClick": true, "editSrc": true, ...}
```
#### :house: Internal
- Update dependencies
```plain
@eslint/compat ^1.2.2 → ^1.2.3
@eslint/eslintrc ^3.1.0 → ^3.2.0
@eslint/js ^9.14.0 → ^9.16.0
@playwright/test ^1.48.2 → ^1.49.0
@types/mocha ^10.0.9 → ^10.0.10
@types/node ^22.8.7 → ^22.10.1
@typescript-eslint/eslint-plugin ^8.12.2 → ^8.16.0
@typescript-eslint/parser ^8.12.2 → ^8.16.0
axios ^1.7.7 → ^1.7.8
eslint ^9.14.0 → ^9.16.0
eslint-plugin-tsdoc ^0.3.0 → ^0.4.0
globals ^15.11.0 → ^15.12.0
less ^4.2.0 → ^4.2.1
postcss >=8.4.47 → >=8.4.49
prettier ^3.3.3 → ^3.4.1
stylelint ^16.10.0 → ^16.11.0
typescript ^5.6.3 → ^5.7.2
```
## 4.2.42
### :rocket: New Feature
- With the symbols plugin you can use the Shift key to select multiple symbols.
[special character #1194](https://github.com/xdan/jodit/issues/1194)
### :bug: Bug Fix
- Fixed a bug in the logic of the ControlType.popup method; if the method did not return anything,
it could be used as an alternative to `exec`. But when called again it did not work.
- Fixed logic in the symbols plugin
- [Does it have an API for closing record operations #1193](https://github.com/xdan/jodit/issues/1193)
## 4.2.41
### :rocket: New Feature
- Related issue: [The video plugin only support content from youtube and vimeo #1170](https://github.com/xdan/jodit/issues/1170)
Added options `video.defaultWidth`, `video.defaultHeight`, and `video.parseUrlToVideoEmbed` to the video plugin. The `parseUrlToVideoEmbed` option allows you to add your own video parser.
```ts
Jodit.make('#editor', {
buttons: 'video',
video: {
defaultWidth: 560, // Default: 400
defaultHeight: 315, // Default: 345
parseUrlToVideoEmbed: (url, size) => {
// Add your own video provider
if (/https:\/\/sitename\.com/.test(url)) {
return `<iframe width="${size.width}" height="${size.height}" src="${url}" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture" allowfullscreen></iframe>`;
}
return Jodit.modules.Helpers.convertMediaUrlToVideoEmbed(
url,
size
);
}
},
controls: {
video: {
tooltip: 'Insert video'
}
}
});
```
## 4.2.40
### :bug: Bug Fix
- [Toolbar Customization Issue When Selecting Text Inside Table Cells](https://github.com/xdan/jodit/issues/1131)
- Fixed a bug when the tooltip remained on the screen when its popup was already closed
- [Inline popup tooltips are not visible #1141](https://github.com/xdan/jodit/issues/1141)
- Fixed a bug in the Enter plugin where inside a table you had to press Enter twice to create a new row
## 4.2.39
#### :house: Internal
- Chai.js switched to ESM from version 5.0.0, which led to problems with tests inside browser.
To solve the problem, we abandoned node_modules version and switched to jsdelivr+esm
We are not removing the dependency yet, see `./test/tests/chai-loader.js`
- Update dependencies
```plain
@eslint/compat ^1.2.0 → ^1.2.2
@eslint/js ^9.12.0 → ^9.14.0
@playwright/test ^1.48.0 → ^1.48.2
@types/karma ^6.3.8 → ^6.3.9
@types/node ^20.16.11 → ^22.8.7
@typescript-eslint/eslint-plugin ^8.8.1 → ^8.12.2
@typescript-eslint/parser ^8.8.1 → ^8.12.2
compression ^1.7.4 → ^1.7.5
core-js ^3.38.1 → ^3.39.0
eslint ^9.12.0 → ^9.14.0
mini-css-extract-plugin ^2.9.1 → ^2.9.2
mocha ^10.7.3 → ^10.8.2
tslib ^2.7.0 → ^2.8.1
tsx ^4.19.1 → ^4.19.2
webpack 5.95.0 → 5.96.1
```
## 4.2.38
### :bug: Bug Fix
- Fixed behavior of form submit with its own validation
## 4.2.37
### :bug: Bug Fix
- [Bug: this.j.o.resizer is undefined in jodit version 4 #1166](https://github.com/xdan/jodit/issues/1166)
## 4.2.35
### :bug: Bug Fix
- [Edit Link bugg when there is a iframe #1176](https://github.com/xdan/jodit/issues/1176)
## 4.2.34
### :bug: Bug Fix
- [Bug UL and OL list not working corretly with option "enter":"BR" #1178](https://github.com/xdan/jodit/issues/1178)
## 4.2.33
### :bug: Bug Fix
- Fixed bug inside Search plugin with Highlight API. When selection was not cleared
## 4.2.32
### :rocket: New Feature
- Added option `iframeSandbox: string | null = null;` Apply the `sandbox` attribute to the iframe element. The value of the attribute is a space-separated list of directives. See https://developer.mozilla.org/en-US/docs/Web/HTML/Element/iframe#attr-sandbox
Issue: https://github.com/xdan/jodit/issues/1186
```typescript
Jodit.make('#editor', {
iframe: true,
iframeSandbox: 'allow-scripts allow-same-origin'
});
```
#### :house: Internal
- Move to ESLint 9
- Update dependencies
```plain
@playwright/test ^1.45.0 → ^1.48.0
@types/mocha ^10.0.7 → ^10.0.9
@types/node ^20.14.9 → ^22.7.5
@types/yargs ^17.0.32 → ^17.0.33
@typescript-eslint/eslint-plugin ^7.14.1 → ^8.8.1
@typescript-eslint/parser ^7.14.1 → ^8.8.1
autoprefixer ^10.4.19 → ^10.4.20
axios ^1.7.2 → ^1.7.7
core-js ^3.37.1 → ^3.38.1
cssnano-preset-advanced ^7.0.3 → ^7.0.6
eslint ^8.57.0 → ^9.12.0
eslint-plugin-import ^2.29.1 → ^2.31.0
eslint-plugin-mocha ^10.4.3 → ^10.5.0
eslint-plugin-prettier ^5.1.3 → ^5.2.1
eslint-plugin-simple-import-sort ^12.1.0 → ^12.1.1
glob ^10.4.2 → ^11.0.0
karma ^6.4.3 → ^6.4.4
mini-css-extract-plugin ^2.9.0 → ^2.9.1
mocha ^10.5.1 → ^10.7.3
node-jq ^4.4.0 → ^6.0.1
postcss >=8.4.38 → >=8.4.47
prettier ^3.3.2 → ^3.3.3
stylelint ^16.6.1 → ^16.10.0
stylelint-prettier ^5.0.0 → ^5.0.2
tslib ^2.6.3 → ^2.7.0
typescript ^5.5.2 → ^5.6.3
webpack 5.92.1 → 5.95.0
webpack-dev-middleware ^7.2.1 → ^7.4.2
webpack-dev-server ^5.0.4 → ^5.1.0
```
## 4.2.28
### :rocket: New Feature
- Added option `countTextSpaces: boolean = false;` Issue https://github.com/xdan/jodit/issues/1144
```typescript
Jodit.make('#editor', {
countTextSpaces: true
});
```
### :bug: Bug Fix
- [Menu Item Popups Hidden when Jodit is inside an <dialog> element #1146](https://github.com/xdan/jodit/issues/1146)
#### :house: Internal
- Use node 20 for build
- Update dependencies
```plain
@playwright/test ^1.43.1 → ^1.45.0
@types/mocha ^10.0.6 → ^10.0.7
@types/node ^20.12.5 → ^20.14.9
@typescript-eslint/eslint-plugin ^7.5.0 → ^7.14.1
@typescript-eslint/parser ^7.5.0 → ^7.14.1
axios ^1.6.8 → ^1.7.2
core-js ^3.36.1 → ^3.37.1
css-loader ^7.0.0 → ^7.1.2
css-minimizer-webpack-plugin ^6.0.0 → ^7.0.0
cssnano-preset-advanced ^6.1.2 → ^7.0.3
eslint-plugin-mocha ^10.4.1 → ^10.4.3
eslint-plugin-simple-import-sort ^12.0.0 → ^12.1.0
eslint-plugin-tsdoc ^0.2.17 → ^0.3.0
glob ^10.3.12 → ^10.4.2
mini-css-extract-plugin ^2.8.1 → ^2.9.0
mocha ^10.4.0 → ^10.5.1
node-jq ^4.3.1 → ^4.4.0
prettier ^3.2.5 → ^3.3.2
style-loader ^3.3.4 → ^4.0.0
stylelint ^16.3.1 → ^16.6.1
stylelint-config-standard ^36.0.0 → ^36.0.1
tslib ^2.6.2 → ^2.6.3
typescript ^5.4.5 → ^5.5.2
webpack 5.91.0 → 5.92.1
```
## 4.2.26
### :bug: Bug Fix
- [Table dragging creates an issue #1128](https://github.com/xdan/jodit/issues/1128)
- AddNewLine plugin shown incorrect position after CleanHTML plugin
- Inserting a new table - added extra spaces before the table
- When merging multiple table cells after the TR tag, the CleanHTML plugin added `<br>`
- [Inline popup tooltips are not visible #1141](https://github.com/xdan/jodit/issues/1141)
- [space key issues #1143](https://github.com/xdan/jodit/issues/1143)
## 4.2.25
### :rocket: New Feature
- [add ukrainian localization #1142](https://github.com/xdan/jodit/pull/1142)
## 4.2.22
### :bug: Bug Fix
- [Try to fix Unable to use Speech Recognition #1139](https://github.com/xdan/jodit/issues/1139)
## 4.2.21
#### :house: Internal
- Improved appearance of tabs
- Fixed a bug when hovering over a button. The tooltip sometimes did not disappear
## 4.2.19
- Fixed the lag between setting the activity to a list item when opening it.
## 4.2.18
#### :house: Internal
- When connecting third-party scripts, two attributes are now added to the script tag.
[Jodit not hiding the raw textarea #1086](https://github.com/xdan/jodit/issues/1086)
```json
{
"crossorigin": "anonymous",
"referrerpolicy": "no-referrer"
}
```
- [crossorigin](https://developer.mozilla.org/en-US/docs/Web/HTML/Attributes/crossorigin)
- [referrerpolicy](https://developer.mozilla.org/en-US/docs/Web/API/HTMLScriptElement/referrerPolicy)
## 4.2.17
#### :house: Internal
- Removed conversion of list arrays into objects when creating a button in the toolbar. Previously the code looked like:
```js
Jodit.make('#editor', {
constrols: {
lineHeight: {
list: [1, 1.1, 1.2, 1.3, 1.4, 1.5, 2]
}
}
});
```
was implicitly transformed into an object of the form:
```js
Jodit.make('#editor', {
constrols: {
lineHeight: {
list: {
1: '1',
2: '2',
1.1: '1.1',
1.2: '1.2',
1.3: '1.3',
1.4: '1.4',
1.5: '1.5'
}
}
}
});
```
Thus, due to the nature of integer keys, the order of the elements was lost. Now such a transformation does not occur.
In your code you clearly need to check what came into `list` and if it is an array, then use it as is.
```js
Jodit.make('#editor', {
constrols: {
lineHeight: {
list: [1, 1.1, 1.2, 1.3, 1.4, 1.5, 2],
update(editor: IJodit, button): boolean {
if (Array.isArray(button.control)) {
// Work with array
}
}
}
}
});
```
### :bug: Bug Fix
- [Backspacing in the editor with preadded styling or added styling is not retained #1120](https://github.com/xdan/jodit/issues/1120)
- [missing generation of inferface.js and interface.d.ts in esm build path esm\plugins\image-properties #1117](https://github.com/xdan/jodit/issues/1117)
## 4.2.13
### :bug: Bug Fix
- [Table inline popup buttons issue #1129](https://github.com/xdan/jodit/issues/1129)
## 4.2.8
### :rocket: New Feature
- Controls have a new field `isVisible(editor: IJodit): boolean`, which allows you to completely hide the button in some situations.
```typescript
Jodit.make('#editor', {
controls: {
undo: {
isVisible(editor: IJodit): boolean {
return editor.history.canUndo();
}
}
}
});
```
## 4.2.1
### :bug: Bug Fix
- [Size of picture is not correct when changin a picture #1107](https://github.com/xdan/jodit/issues/1107)
- [Selection by triple click removes close tag + open tag of next paragraph #1101](https://github.com/xdan/jodit/issues/1101)
Added options `select.normalizeTripleClick: boolean = true` to normalize selection after triple click
For disable this behavior set `select.normalizeTripleClick: false`
```js
Jodit.make('#editor', {
select: {
normalizeTripleClick: false
}
});
```
## 4.1.12
#### :boom: Breaking Change
- Removed the default export from the watch decorator. We refrain from using default exports in this project (refer to CONTRIBUTING.md for more details).
Before:
```js
import watch, { watch as watch2 } from 'jodit/core/decorators/watch/watch';
```
Now only:
```js
import { watch } from 'jodit/core/decorators/watch/watch';
```
### :bug: Bug Fix
- [FileBrowser - Permissions Incorrect during Open of Dialog #1095](https://github.com/xdan/jodit/issues/1095)
## 4.1.11
- Fixed a bug within the FileBrowser module. The issue was due to the import order; the Ajax configuration was applied after the module had been initialized.
## 4.1.9
- Added `AbortError` to the `Jodit.modules` namespace. This is a custom error that is thrown when the user cancels the operation.
```js
const jodit = Jodit.make('#editor');
jodit.async
.promise((res, rej) => fetch('./test.php').then(res).catch(rej))
.catch(error => {
if (Jodit.modules.Helpers.isAbortError(error)) {
console.log('Operation was aborted');
}
});
jodit.destruct();
```
## 4.1.7
- [Wrong generation of es5 bundle - polyfills missing #1105](https://github.com/xdan/jodit/issues/1105)
## 4.1.1
- Added plugin AI Assistant. https://github.com/xdan/jodit/pull/1088 Thanks @huizarmx
#### :house: Internal
- Update dependencies
```plain
@tsconfig/node18 ^18.2.2 → ^18.2.4
@types/node ^20.11.25 → ^20.12.2
@typescript-eslint/eslint-plugin ^7.1.1 → ^7.5.0
@typescript-eslint/parser ^7.1.1 → ^7.5.0
autoprefixer ^10.4.18 → ^10.4.19
axios ^1.6.7 → ^1.6.8
core-js ^3.36.0 → ^3.36.1
cssnano-preset-advanced ^6.1.0 → ^6.1.2
eslint-plugin-mocha ^10.4.0 → ^10.4.1
glob ^10.3.10 → ^10.3.12
mocha ^10.3.0 → ^10.4.0
open ^10.0.4 → ^10.1.0
postcss >=8.4.35 → >=8.4.38
stylelint ^16.2.1 → ^16.3.1
typescript ^5.4.2 → ^5.4.3
webpack 5.90.3 → 5.91.0
webpack-dev-middleware ^7.0.0 → ^7.2.0
webpack-dev-server ^5.0.2 → ^5.0.4
```
- Update dependencies
```plain
@types/node ^20.10.7 → ^20.11.25
@typescript-eslint/eslint-plugin ^6.18.0 → ^7.1.1
@typescript-eslint/parser ^6.18.0 → ^7.1.1
autoprefixer ^10.4.16 → ^10.4.18
axios ^1.6.5 → ^1.6.7
core-js ^3.35.0 → ^3.36.0
css-loader ^6.8.1 → ^6.10.0
css-minimizer-webpack-plugin ^5.0.1 → ^6.0.0
cssnano-preset-advanced ^6.0.3 → ^6.1.0
eslint ^8.56.0 → ^8.57.0
eslint-plugin-mocha ^10.2.0 → ^10.4.0
eslint-plugin-prettier ^5.1.2 → ^5.1.3
karma ^6.4.2 → ^6.4.3
karma-firefox-launcher ^2.1.2 → ^2.1.3
less-loader ^11.1.4 → ^12.2.0
mini-css-extract-plugin ^2.7.6 → ^2.8.1
mocha ^10.2.0 → ^10.3.0
node-jq ^4.2.2 → ^4.3.1
open ^10.0.3 → ^10.0.4
postcss >=8.4.33 → >=8.4.35
postcss-loader ^7.3.4 → ^8.1.1
prettier ^3.1.1 → ^3.2.5
style-loader ^3.3.3 → ^3.3.4
stylelint ^16.1.0 → ^16.2.1
typescript ^5.3.3 → ^5.4.2
webpack 5.89.0 → 5.90.3
webpack-dev-server ^4.15.1 → ^5.0.2
webpack-hot-middleware ^2.26.0 → ^2.26.1
```
## 4.0.15
- Fixed bug in `beforeInit` hook. If the hook returned a promise, and the editor was destroyed after that,
then after resolving the promise, the editor continued the initialization procedure
## 4.0.8
- Fixed a bug in the plugins module when extra plugins did not cause the editor to be redrawn after initialization
## 4.0.7
- Added `search.useCustomHighlightAPI` option to the "Search" plugin to use the built-in text highlighting API https://developer.mozilla.org/en-US/docs/Web/API/CSS_Custom_Highlight_API
If the browser does not support this API, then standard text highlighting will be used by wrapping it in the `<span jd-tmp-selection>` tag.
- Added Finnish (Suomi) translation https://github.com/xdan/jodit/pull/1081
## 4.0.2
- [BUG: FileBrowser Context Menu Grows Infinitely](https://github.com/xdan/jodit/issues/1059)
## 4.0.1
- [See changelog](https://github.com/xdan/jodit/releases)
## 4.0.0-beta.121
#### :boom: Breaking Change
- All static methods of the `Jodit.modules.Table` module have been removed and replaced with methods of an instance of the `Table` class with the same name.
```js
const jodit = Jodit.make('#editor');
// Before
Jodit.modules.Table.mergeSelected(jodit.editor.firstChild, jodit);
// Now
jodit.getInstance('Table').mergeSelected(jodit.editor.firstChild);
```
- `.jodit-filebrowser` class prefix was renamed to `.jodit-file-browser`
- CSS key `--color-background-filebrowser-folders` was removed from global scope.
### :bug: Bug Fix
- [Folder renames not working if "space" is added in folder name #1054](https://github.com/xdan/jodit/issues/1054)
#### :house: Internal
- Update dependencies
```plain
stylelint-config-idiomatic-order v9.0.0 → v10.0.0
stylelint-config-standard ^34.0.0 → ^36.0.0
stylelint-prettier ^4.1.0 → ^4.4.0
terser-webpack-plugin ^5.3.9 → ^5.3.10
ts-node ^10.9.1 → ^10.9.2
typescript ^5.3.2 → ^5.3.3
webpack-dev-middleware ^6.1.1 → ^7.0.0
webpack-hot-middleware ^2.25.4 → ^2.26.0
```
### :rocket: New Feature
- The `Jodit.getInstance` method can accept a module constructor instead of its name:
```js
const jodit = Jodit.make('#editor');
const table = jodit.getInstance(Jodit.modules.Table);
const table2 = jodit.getInstance('Table'); // It still works
console.log(table === table2); // true
```
## 4.0.0-beta.119
- [Even though I disable some editor plugins, they are displayed on mobile #243](https://github.com/jodit/jodit-react/issues/243)
## 4.0.0-beta.118
### :bug: Bug Fix
- [fix import #1046](https://github.com/xdan/jodit/pull/1046)
#### :house: Internal
- Fixed colors for selected toolbar elements in the dark theme
## 4.0.0-beta.117
### :bug: Bug Fix
- [Marking a line with shift "pos1 or end" and pressing del removes too much and destroys structure #1038](https://github.com/xdan/jodit/issues/1038)
## 4.0.0-beta.108
### :bug: Bug Fix
- [Comment block in the template throws error "Cannot read properties of undefined (reading 'font-weight')" #1044](https://github.com/xdan/jodit/issues/1044)
#### :house: Internal
```plain
@types/ace ^0.0.50 → ^0.0.52
@types/fs-extra ^11.0.3 → ^11.0.4
@types/karma ^6.3.6 → ^6.3.8
@types/node ^20.8.7 → ^20.10.3
@types/postcss-css-variables ^0.18.2 → ^0.18.3
@types/yargs ^17.0.29 → ^17.0.32
@typescript-eslint/eslint-plugin ^6.8.0 → ^6.13.2
@typescript-eslint/parser ^6.8.0 → ^6.13.2
axios ^1.5.1 → ^1.6.2
core-js ^3.33.1 → ^3.34.0
eslint ^8.52.0 → ^8.55.0
eslint-config-prettier ^9.0.0 → ^9.1.0
eslint-plugin-import ^2.28.1 → ^2.29.0
node-jq ^4.0.1 → ^4.2.2
postcss >=8.4.31 → >=8.4.32
prettier ^3.0.3 → ^3.1.0
stylelint-prettier ^4.0.2 → ^4.1.0
ts-loader ^9.5.0 → ^9.5.1
typescript ^5.2.2 → ^5.3.2
```
## 4.0.0-beta.108
- Fixed a bug in the UITextArea UI component. Instead of adding a textarea element, it was incorrectly adding an input element.
## 4.0.0-beta.107
### :rocket: New Feature
- Introduced the pasteExcludeStripTags option. This is a list of tags that won't be removed from the pasted HTML
when in INSERT_AS_TEXT mode. By default, it includes `['br', 'hr']`.
See https://github.com/xdan/jodit/issues/1033 for more details.
```js
Jodit.make('#editor', {
pasteExcludeStripTags: ['br', 'style']
});
```
- [copy pasting twitter or istagram or etc. not as expected #1032](https://github.com/xdan/jodit/issues/1032)
## 4.0.0-beta.97
#### :house: Internal
- Calls to setTimout without the async module have been removed from autotests, and most of the asynchronous tests have been rewritten from done to async/await
## 4.0.0-beta.96
#### :boom: Breaking Change
- Removed `Jodit.modules.Helpers.val` method
## 4.0.0-beta.95
### :bug: Bug Fix
- Fixed the logic of the file upload module. When HTTP errors were simply ignored.
## 4.0.0-beta.93
### :bug: Bug Fix
- Fixed a bug with the `editor.selection.setCursorIn(box)` method, which could set the cursor inside a <br>.
## 4.0.0-beta.91
### :bug: Bug Fix
- Issues with ESM #1029, icons were not included in the esm build
Issue: https://github.com/xdan/jodit/issues/1029
- Use node 18.17.1 for build
- Update
```
@types/ace ^0.0.49 → ^0.0.50
@types/fs-extra ^11.0.2 → ^11.0.3
@types/karma ^6.3.5 → ^6.3.6
@types/node ^20.8.3 → ^20.8.7
@types/postcss-css-variables ^0.18.1 → ^0.18.2
@types/yargs ^17.0.28 → ^17.0.29
@typescript-eslint/eslint-plugin ^6.7.4 → ^6.8.0
@typescript-eslint/parser ^6.7.4 → ^6.8.0
core-js ^3.33.0 → ^3.33.1
eslint ^8.51.0 → ^8.52.0
eslint-plugin-prettier ^5.0.0 → ^5.0.1
lint-staged ^14.0.1 → ^15.0.2
stylelint ^15.10.3 → ^15.11.0
webpack 5.88.2 → 5.89.0
```
## 4.0.0-beta.89
### :rocket: New Feature
- Improved UX of dialog boxes. Added two options `closeOnEsc` defaulting to `true` and `closeOnClickOverlay` defaulting to `false`.
```js
Jodit.make('#editor', {
dialog: {
closeOnEsc: true,
closeOnClickOverlay: false
}
});
// or
const editor = Jodit.make('#editor');
editor.alert('Hello world'); // closeOnEsc = true, closeOnClickOverlay = true
editor
.dlg({
closeOnEsc: false,
closeOnClickOverlay: true
})
.open();
```
## 4.0.0-beta.88
### :bug: Bug Fix
- Fixed a bug where the cursor, when positioned at the start of the h1 tag and a style was applied to the h1 tag, would move up one tag level.
- [Firefox specific execCommands no longer needed #1028](https://github.com/xdan/jodit/issues/1028)
## 4.0.0-beta.78
- Update
```
@types/ace ^0.0.48 → ^0.0.49
@types/fs-extra ^11.0.1 → ^11.0.2
@types/karma ^6.3.4 → ^6.3.5
@types/node ^20.5.7 → ^20.8.3
@types/postcss-css-variables ^0.18.0 → ^0.18.1
@types/yargs ^17.0.24 → ^17.0.28
@typescript-eslint/eslint-plugin ^6.5.0 → ^6.7.4
@typescript-eslint/parser ^6.5.0 → ^6.7.4
autoprefixer ^10.4.15 → ^10.4.16
axios ^1.5.0 → ^1.5.1
chai ^4.3.8 → ^4.3.10
core-js ^3.32.1 → ^3.33.0
eslint ^8.48.0 → ^8.51.0
eslint-plugin-mocha ^10.1.0 → ^10.2.0
glob ^10.3.3 → ^10.3.10
postcss >=8.4.28 → >=8.4.31
prettier ^3.0.2 → ^3.0.3
ts-loader ^9.4.4 → ^9.5.0
```
## 4.0.0-beta.78
- Update
```
@types/karma ^6.3.3 → ^6.3.4
@types/node ^20.1.0 → ^20.5.0
@typescript-eslint/eslint-plugin ^5.59.2 → ^6.4.0
@typescript-eslint/parser ^5.59.2 → ^6.4.0
autoprefixer ^10.4.14 → ^10.4.15
core-js ^3.30.2 → ^3.32.0
css-loader ^6.7.3 → ^6.8.1
css-minimizer-webpack-plugin ^5.0.0 → ^5.0.1
eslint ^8.40.0 → ^8.47.0
eslint-config-prettier ^8.8.0 → ^9.0.0
eslint-plugin-import ^2.27.5 → ^2.28.0
eslint-plugin-prettier ^4.2.1 → ^5.0.0
glob ^10.2.2 → ^10.3.3
less ^4.1.3 → ^4.2.0
less-loader ^11.1.0 → ^11.1.3
lint-staged ^13.2.2 → ^14.0.0
mini-css-extract-plugin ^2.7.5 → ^2.7.6
node-jq ^2.3.5 → ^4.0.1
postcss >=8.4.23 → >=8.4.27
postcss-loader ^7.3.0 → ^7.3.3
prettier ^2.8.8 → ^3.0.1
style-loader ^3.3.2 → ^3.3.3
stylelint ^15.6.1 → ^15.10.2
stylelint-config-standard ^33.0.0 → ^34.0.0
stylelint-prettier ^3.0.0 → ^4.0.2
synchronous-promise 2.0.15 → 2.0.17
terser-webpack-plugin ^5.3.8 → ^5.3.9
ts-loader ^9.4.2 → ^9.4.4
tslib ^2.5.0 → ^2.6.1
typescript ^5.0.4 → ^5.1.6
webpack 5.82.0 → 5.88.2
webpack-cli ^5.1.0 → ^5.1.4
webpack-dev-middleware ^6.1.0 → ^6.1.1
webpack-dev-server ^4.15.0 → ^4.15.1
webpack-hot-middleware ^2.25.3 → ^2.25.4
```
## 4.0.0-beta.77
### :bug: Bug Fix
- [Image duplication issue #993](https://github.com/xdan/jodit/issues/993)
- Fixed an issue where the inline popup was not hidden after deleting an image
### :rocket: New Feature
- [When cursor is not in view and paste is done, editor doesn't scroll to the pasted content automatically #983](https://github.com/xdan/jodit/issues/983)
Added [scrollToPastedContent](https://xdsoft.net/jodit/docs/classes/config.Config.html#scrollToPastedContent)
- After inserting the HTML, the cursor will be inserted inside the block element
## 4.0.0-beta.52
#### :boom: Breaking Change
- Removed deprecated selection.applyStyle method
- Change Creates. Sandbox signature to return body,iframe tuple
- In the plugin system, the requirement field has been removed from instances,
only the field in the constructor has been left
```js
class somePlugin extends Jodit.modulules.Plugin {
static requires = ['hotkeys']; // It still works
requires = ['hotkeys']; // Now it does not work
}
```
- Deprecated were removed
- `Dom.isTag` does not support array
- `Select.applyStyle` method was removed
- `history.observer` was removed
- `editorCssClass` removed
- `wrapNodes.exclude` changed from array to set
- `allowResizeTags` changed from array to set
- `resizer.useAspectRatio` changed from array to set
- All css variables renamed to kebab-case
## 4.0.0-beta.42
- Remove all languages from lang/index.js for ESM build
- Only base plugins list in plugins/index.js for ESM build
- Remove polyfills from ESM build
- Remove `composer.json`
## 4.0.0-beta.10
```plain
@types/node ^18.15.12 → ^20.1.0
@typescript-eslint/eslint-plugin ^5.59.0 → ^5.59.2
@typescript-eslint/parser ^5.59.0 → ^5.59.2
axios ^1.3.6 → ^1.4.0
core-js ^3.30.1 → ^3.30.2
cssnano-preset-advanced ^6.0.0 → ^6.0.1
eslint ^8.38.0 → ^8.40.0
glob ^10.2.1 → ^10.2.2
karma ^6.4.1 → ^6.4.2
lint-staged ^13.2.1 → ^13.2.2
open ^8.4.2 → ^9.1.0
postcss-loader ^7.2.4 → ^7.3.0
prettier ^2.8.7 → ^2.8.8
puppeteer ^19.10.0 → ^20.1.1
stylelint ^15.5.0 → ^15.6.1
terser-webpack-plugin ^5.3.7 → ^5.3.8
webpack 5.80.0 → 5.82.0
webpack-cli ^5.0.1 → ^5.1.0
webpack-dev-middleware ^6.0.2 → ^6.1.0
webpack-dev-server ^4.13.3 → ^4.15.0
yargs ^17.7.1 → ^17.7.2
```
## 4.0.0.beta-0
#### :boom: Breaking Change
- !!! Build files removed from repository and only available in npm package !!!
- !!! bowers.json was removed !!!
- server.js was removed
- All build js files was rewritten to typescript
- `build-system` was renamed as `tools`
- Removed `exludeLangs` build option. Instead use `--includeLanguages=en` option.
- Default target for build was changed to es2015
- Build in es2018 target was removed, instead es2021 was added
- Event `getIcon` was removed. Use option `getIcon` instead
```ts
Jodit.make('#editor', {
getIcon: (name: string, clearName: string) => {
if (name === 'bold') {
return '<svg>...</svg>';
}
return null;
}
});
```
- Removed `errorMessage` event. Use `module.messages` instead
```js
Jodit.make('#editor').message.info('Hello world');
```
#### :rocket: New Feature
- Added `Jodit.modules.Dom.isList` method
- Added `Jodit.modules.Dom.isLeaf` method
- Added plugin `delete` for correct delete content with command `delete`
#### :house: Internal
```plain
@types/node ^18.13.0 → ^18.15.12
@typescript-eslint/eslint-plugin ^5.50.0 → ^5.59.0
@typescript-eslint/parser ^5.50.0 → ^5.59.0
autoprefixer ^10.4.13 → ^10.4.14
axios ^1.3.3 → ^1.3.6
core-js ^3.28.0 → ^3.30.1
css-minimizer-webpack-plugin ^4.2.2 → ^5.0.0
cssnano-preset-advanced ^5.3.9 → ^6.0.0
eslint ^8.34.0 → ^8.38.0
eslint-config-prettier ^8.6.0 → ^8.8.0
expect-mocha-image-snapshot ^3.0.1 → ^3.0.13
glob ^8.1.0 → ^10.2.1
karma-chrome-launcher ^3.1.1 → ^3.2.0
lint-staged ^13.1.2 → ^13.2.1
mini-css-extract-plugin ^2.7.2 → ^2.7.5
postcss >=8.4.21 → >=8.4.23
postcss-css-variables ^0.18.0 → ^0.19.0
postcss-loader ^7.0.2 → ^7.2.4
prettier ^2.8.4 → ^2.8.7
puppeteer ^19.7.0 → ^19.10.0
style-loader ^3.3.1 → ^3.3.2
stylelint ^15.1.0 → ^15.5.0
stylelint-config-standard ^30.0.1 → ^33.0.0
stylelint-prettier ^2.0.0 → ^3.0.0
terser-webpack-plugin ^5.3.6 → ^5.3.7
tsc-alias ^1.8.2 → ^1.8.5
typescript ^4.9.5 → ^5.0.4
webpack 5.76.0 → 5.80.0
webpack-dev-middleware ^6.0.1 → ^6.0.2
webpack-dev-server ^4.11.1 → ^4.13.3
yargs ^17.6.2 → ^17.7.1
```
## 3.24.6
#### :house: Internal
- `Jodit.modules.Helpers.htmlspecialchars` marked as deprecated. Instead use `Jodit.modules.Helpers.stripTags`
- `Jodit.modules.Helpers.stripTags` added third argument for excluding tags
```js
Jodit.modules.Helpers.stripTags(
'<p>test <strong>po<br/>p</strong><br/>stop <em>lop</em><br/></p>',
document,
new Set(['p', 'br'])
);
// <p>test po<br>p<br>stop lop<br></p>
```
- Inside `safeMode` will init only `safePluginsList` plugins. It used to init `extraPlugins` too.
- `size` plugin was added in default `safePluginsList`
```js
const editor = Jodit.make('#editor', {
safeMode: true,
safePluginsList: ['enter', 'backspace']
});
console.log(editor.__plugins); // only 'enter', 'backspace'
```
## 3.24.5
#### :bug: Bug Fix
- [Wrong new empty paragraph location when cursor is set after a table and <Enter> key is pressed #953](https://github.com/xdan/jodit/issues/953)
- The PluginSystem module has been refactored: now asynchronous plugins do not block the initialization of the editor and it is ready to work without them.
- [Remove anchor element when set black text color. #936](https://github.com/xdan/jodit/issues/936)
- [Insert_only_text makes mistakes when i copy a text html that includes a style tag #934](https://github.com/xdan/jodit/issues/934)
- [Selected font styling reverts to default style after removing the added text using the backspace key #925](https://github.com/xdan/jodit/issues/925)
#### :house: Internal
```
core-js ^3.27.2 → ^3.28.0
@types/node ^18.11.19 → ^18.13.0
axios ^1.3.2 → ^1.3.3
eslint ^8.33.0 → ^8.34.0
karma-sourcemap-loader ^0.3.8 → ^0.4.0
lint-staged ^13.1.0 → ^13.1.2
open ^8.4.0 → ^8.4.1
prettier ^2.8.3 → ^2.8.4
puppeteer ^19.6.3 → ^19.7.0
stylelint ^14.16.1 → ^15.1.0
stylelint-config-prettier ^9.0.4 → ^9.0.5
stylelint-config-standard ^29.0.0 → ^30.0.1
synchronous-promise 2.0.15 → 2.0.17
```
## 3.24.4
#### :boom: Breaking Change
- Options to hide the functionality of editing directories and files `filebrowser.createNewFolder`, `filebrowser.editImage`,
`filebrowser.deleteFolder`,`filebrowser.renameFolder`,`filebrowser.moveFolder`,`filebrowser.moveFile` were marked as deprecated.
- Instead added `filebrowser.permissionsPresets: Partial<IPermissions>` option.
Before:
```js
Jodit.make('#editor', {
filebrowser: {
createNewFolder: false,
deleteFolder: false,
renameFolder: false,
moveFolder: false,
moveFile: false,
editImage: false,
ajax: {
url: 'https://xdsoft.net/jodit/finder/'
}
}
});
```
Now
```js
Jodit.make('#editor', {
filebrowser: {
permissionsPresets: {
allowFiles: false,
allowFileMove: false,
allowFileUpload: false,
allowFileUploadRemote: false,
allowFileRemove: false,
allowFileRename: false,
allowFolders: false,
allowFolderCreate: false,
allowFolderMove: false,
allowFolderRemove: false,
allowFolderRename: false,
allowImageResize: false,
allowImageCrop: false
},
ajax: {
url: 'https://xdsoft.net/jodit/finder/'
}
}
});
```
## 3.24.3
#### :house: Internal
```plain
core-js ^3.26.1 → ^3.27.2
@types/node ^18.11.9 → ^18.11.19
@typescript-eslint/eslint-plugin ^5.45.0 → ^5.50.0
@typescript-eslint/parser ^5.45.0 → ^5.50.0
axios ^1.2.0 → ^1.3.2
css-loader ^6.7.2 → ^6.7.3
eslint ^8.28.0 → ^8.33.0
eslint-config-prettier ^8.5.0 → ^8.6.0
eslint-plugin-import ^2.26.0 → ^2.27.5
expect-mocha-image-snapshot ^2.0.14 → ^3.0.1
glob ^8.0.3 → ^8.1.0
husky ^8.0.2 → ^8.0.3
lint-staged ^13.0.4 → ^13.1.0
mini-css-extract-plugin ^2.7.0 → ^2.7.2
mocha ^10.1.0 → ^10.2.0
nock ^13.2.9 → ^13.3.0
postcss >=8.4.19 → >=8.4.21
postcss-loader ^7.0.1 → ^7.0.2
prettier ^2.8.0 → ^2.8.3
puppeteer ^19.3.0 → ^19.6.3
stylelint ^14.15.0 → ^14.16.1
synchronous-promise 2.0.15 → 2.0.17
ts-loader ^9.4.1 → ^9.4.2
tsc-alias ^1.7.1 → ^1.8.2
tslib ^2.4.1 → ^2.5.0
typescript ^4.9.3 → ^4.9.5
webpack-cli ^5.0.0 → ^5.0.1
```
## 3.24.2
#### :rocket: New Feature
- [Fix #909 Add option to provide pre-defined classes for img elements. #910](https://github.com/xdan/jodit/pull/910)
## 3.24.1
#### :boom: Breaking Change
- Constant array `MAY_BE_REMOVED_WITH_KEY` was replaced on set `INSEPARABLE_TAGS`
#### :rocket: New Feature
- Method `Select.applyStyle` marked as deprecated. Use `Select.commitStyle` instead.
Before:
```js
jodit.select.applyStyle(
{ color: red },
{
element: 'strong'
}
);
```
Now:
```js
jodit.s.commitStyle({
element: 'strong',
attributes: {
style: {
color: 'red'
}
}
});
```
- In the options of the `Select`.`commitStyle` method, the `attributes` property has been added, which allows you to
also set attributes when applying a style.
```js
jodit.s.commitStyle({
element: 'a',
attributes: {
href: 'https://stename.ru'
}
});
```
Wraps the selected text into a link with the specified address.
- When inserting a url, if the text is selected, it will automatically be replaced with a link
- In Tab plugin allow use shift+tab for lists
#### :bug: Bug Fix
- [Safari custom color picker errors out on browser check #906](https://github.com/xdan/jodit/issues/906)
#### :house: Internal
- Fixed deletion of the asserts function from the production code, instead of regular expressions, transformers are used\*\*\*\*
## 3.23.3
#### :rocket: New Feature
- Added option `IControlType.childExec` Allows you to set a separate handler for list items
```javascript
Jodit.make('.editor', {
buttons: [
{
name: 'add-date',
iconURL: 'stuf/dummy.png',
list: {
options: 'Open options'
},
exec(editor, current, control) {
editor.s.insertHTML(new Date().toString());
},
childExec(editor, current, control) {
if (control.args[0] === 'options') {
editor.alert('Options');
}
}
}
]
});
```
#