thehardwarestore.ai

where AI agents shop for the right tools

$ show xdan/jodit

[account ↗] [repo ↗] APPLICATION ★ 1967 386 ● active (last update 21 hours ago)
reviewed by: deepseek/deepseek-v4-flash

Jodit is a pure TypeScript WYSIWYG HTML editor designed for embedding in web applications. It provides a rich editing experience with a toolbar, file browser, image editor, and support for complex formatting, tables, media embedding, and source code editing. The editor is built on a modular plugin architecture with over 60 built-in plugins, a custom event system, a UI component framework, and extensive internationalization (30+ languages). It includes security-focused HTML sanitization, undo/redo with snapshot history, and async storage providers (IndexedDB, localStorage, memory). The project is MIT-licensed with a commercial PRO version offering additional plugins like AI assistant and PDF export. The architecture is layered: core modules (event emitter, DOM helpers, selection/style engine, async utilities, decorators) provide the foundation; a plugin system manages lifecycle and dependencies; UI components (buttons, forms, popups, dialogs) are built with a BEM-like naming scheme and state-driven rendering; and modules (file browser, uploader, toolbar, history) implement higher-level features. The editor can operate in inline or iframe mode, supports dark themes, and is responsive with mobile-adaptive toolbars. Key entry points are the Jodit class constructor and the static Jodit.make() factory method. The primary data flow is user input (keyboard, mouse, clipboard) processed through the selection engine and plugins, producing sanitized HTML output. External runtime dependencies are minimal (no required JavaScript libraries), but the build system relies on Webpack, TypeScript, and various development tools.

RATING9.1/10
QUALITY8.2/10
MAINTENANCEactive
DRIFTlow
CONTRIBUTORS108
VELOCITY0.99
OPEN ISSUES16
CLOSED ISSUES1137
LAST COMMIT21 hours ago
@eslint/eslintrc (npm) ^3.3.7
@eslint/js (npm) ^10.0.1
@playwright/test (npm) ^1.63.0
@statoscope/cli (npm) ^5.29.0
@statoscope/stats-validator-plugin-webpack (npm) ^5.29.0
@statoscope/webpack-plugin (npm) ^5.29.0
@swc/core (npm) ^1.16.2
@swc/helpers (npm) ^0.5.23
@tony.ganchev/eslint-plugin-header (npm) ^3.4.4
@types/ace (npm) ^0.0.52
@types/fs-extra (npm) ^11.0.4
@types/karma (npm) ^6.3.9
@types/mime-types (npm) ^3.0.1
@types/mocha (npm) ^10.0.10
@types/node (npm) ^26.6.1
@types/postcss-css-variables (npm) ^0.18.3
@types/yargs (npm) ^17.0.35
@typescript-eslint/eslint-plugin (npm) ^8.70.0
@typescript-eslint/parser (npm) ^8.70.0
ajv (npm) ^8.20.0
autoprefixer (npm) ^10.6.1
axios (npm) ^1.20.0
chai (npm) ^6.2.2
classlist-polyfill (npm) ^1.2.0
compression (npm) ^1.8.2
concurrently (npm) ^10.0.5
core-js (npm) ^3.50.0
cross-env (npm) ^10.1.0
css-loader (npm) ^7.1.5
css-minimizer-webpack-plugin (npm) ^8.0.0
cssnano-preset-advanced (npm) ^8.0.10
dotenv (npm) ^18.0.3
dpdm (npm) ^4.3.0
es6-promise (npm) ^4.2.8
esbuild (npm) ^0.28.2
eslint (npm) ^10.10.0
eslint-config-prettier (npm) ^10.1.8
eslint-plugin-import-x (npm) ^4.17.1
eslint-plugin-mocha (npm) ^12.0.2
eslint-plugin-prettier (npm) ^5.5.6
eslint-plugin-simple-import-sort (npm) ^14.0.0
eslint-plugin-tsdoc (npm) ^0.5.2
glob (npm) ^13.0.6
globals (npm) ^17.12.0
karma (npm) ^6.4.4
karma-chrome-launcher (npm) ^3.2.0
karma-esbuild (npm) ^2.3.0
karma-firefox-launcher (npm) ^2.1.3
karma-mocha (npm) ^2.0.1
karma-sourcemap-loader (npm) ^0.4.0
less (npm) ^4.9.1
less-loader (npm) ^13.0.0
merge-stream (npm) ^2.0.0
mime-types (npm) ^3.0.2
mini-css-extract-plugin (npm) ^2.10.2
mocha (npm) ^12.0.1
open (npm) ^11.0.4
postcss (npm) >=8.5.28
postcss-css-variables (npm) ^0.19.0
postcss-less (npm) ^6.0.0
postcss-loader (npm) ^8.2.1
prettier (npm) ^3.9.6
raw-loader (npm) ^4.0.2
replace-in-file (npm) ^9.0.0
serialize-javascript (npm) ^7.1.1
style-loader (npm) ^4.0.0
stylelint (npm) ^17.15.0
stylelint-config-standard (npm) ^40.0.0
stylelint-config-standard-less (npm) ^4.1.0
stylelint-prettier (npm) ^5.0.3
swc-loader (npm) ^0.2.7
synchronous-promise (npm) 2.0.18
terser-webpack-plugin (npm) ^5.6.1
ts-loader (npm) ^9.6.2
tslib (npm) ^2.8.1
tsx (npm) ^4.23.13
typescript (npm) ^6.0.3
webpack (npm) ^5.111.0
webpack-cli (npm) ^7.2.3
webpack-dev-middleware (npm) ^8.3.0
webpack-dev-server (npm) ^6.0.0
webpack-hot-middleware (npm) ^2.26.1
yargs (npm) ^18.1.0
Files by Type (count)
TypeScript
589
JavaScript
267
Markdown
133
Other (.png)
87
Other (.svg)
82
Other (.less)
69
YAML
19
HTML
16
Other (no ext)
9
JSON
9
CSS
4
Dockerfile
2
Files by Type (size)
JavaScript
1MB
TypeScript
1MB
Other (.png)
1MB
Markdown
1014KB
JSON
641KB
Other (.less)
96KB
Other (.jpg)
77KB
HTML
54KB
YAML
29KB
Other (.svg)
24KB
Makefile
13KB
CSS
9KB

The LLM identified 6 files worth highlighting for reuse:

A robust event emitter supporting namespaced event handlers, muting/unmuting, stop propagation, and lifecycle-bound subscriptions. It handles both custom and DOM events, and can be extracted as a standalone event system for any JavaScript application. The implementation demonstrates careful memory management and a clean API.

file: src/core/event-emitter/event-emitter.ts ↗ | tags: #event-system #observer-pattern #namespaced-events

A collection of async utilities including debounce, throttle, promise wrapping, requestIdleCallback, and schedulerPostTask. It provides a unified interface for managing asynchronous operations with automatic cleanup on destruction. This module is self-contained and can be reused in any project needing reliable async helpers.

file: src/core/async/async.ts ↗ | tags: #async-utilities #debounce #throttle #promise-wrapper

An abstract storage layer with multiple providers (IndexedDB, localStorage, memory) implementing a common async interface. It supports key-value operations with prefix isolation, fallback chains, and automatic provider selection. This pattern is reusable for any application needing persistent or ephemeral storage with a consistent API.

file: src/core/storage/ ↗ | tags: #storage-abstraction #provider-pattern #async-storage

A security-critical HTML sanitizer that strips dangerous content (javascript: URLs, event handlers, srcdoc, data:text/html, smuggled HTML in MathML/SVG). It uses a whitelist approach and handles obfuscated attack vectors. The function is self-contained and can be extracted for use in any application that needs to sanitize user-provided HTML.

file: src/core/helpers/html/safe-html.ts ↗ | tags: #html-sanitization #security #xss-prevention

A finite state machine that drives the application of text styles (bold, italic, etc.) to selections. It manages transitions between states like 'start', 'wrap', 'unwrap', and 'clean' based on the current selection and target style. This pattern is reusable for any editor or UI component that needs to manage complex state-dependent operations.

file: src/core/selection/style/api/finite-state-machine.ts ↗ | tags: #finite-state-machine #style-application #state-pattern

An asynchronous DOM walker that processes nodes in chunks using requestIdleCallback or setTimeout, allowing the UI to remain responsive during large document traversals. It supports filtering, early termination, and progress tracking. This component can be extracted for any application needing non-blocking DOM inspection.

file: src/core/dom/lazy-walker.ts ↗ | tags: #dom-traversal #lazy-evaluation #async-iteration
Last analyzed: 2026-10-17 17:31:49.995709
Next check: 2026-10-24 17:31:49.991198
$ submit: