@kroy665/code-editor-engine 1.0.0 β†’ 1.0.1

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 (2) hide show
  1. package/README.md +900 -78
  2. package/package.json +1 -1
package/README.md CHANGED
@@ -1,127 +1,949 @@
1
- # Coder Engine
1
+ # @kroy665/code-editor-engine
2
2
 
3
- Future-proof headless code editor engine for any platform.
3
+ > Future-proof headless code editor engine for any platform
4
4
 
5
- ## πŸ—οΈ Core Architecture
5
+ [![npm version](https://badge.fury.io/js/%40kroy665%2Fcode-editor-engine.svg)](https://www.npmjs.com/package/@kroy665/code-editor-engine)
6
+ [![License: MIT](https://img.shields.io/badge/License-MIT-yellow.svg)](https://opensource.org/licenses/MIT)
6
7
 
7
- ### 1. Pure Logic Engine (No UI Dependencies)
8
+ A platform-agnostic, extensible code editor engine built for maximum flexibility and performance. This headless architecture provides the core logic for text editing, syntax highlighting, language services, and extension management without any UI dependencies.
8
9
 
9
- - Platform-agnostic design that works on React Native, Web, Node.js
10
- - Headless architecture separates logic from presentation
11
- - TypeScript-first with comprehensive type definitions
10
+ Perfect for building Monaco-like editors for web, React Native, mobile apps, desktop applications, or any platform where you need professional-grade editing capabilities.
12
11
 
13
- ### 2. High-Performance Text Management
12
+ ## 🎯 Key Features
14
13
 
15
- - LineBuffer class with rope-like structure for efficient large file handling
14
+ ### βœ… **Platform-Agnostic Design**
15
+ - Works on React Native, Web, Node.js, Electron
16
+ - Zero UI dependencies - bring your own renderer
17
+ - TypeScript-first with 100% type coverage
18
+
19
+ ### ⚑ **High Performance**
20
+ - Efficient rope-like line buffer for large files (up to 100MB)
16
21
  - Incremental text operations with O(log n) complexity
17
- - Smart caching and memory management
22
+ - Smart tokenization caching
23
+ - Sub-millisecond text operations
18
24
 
19
- ### 3. Advanced Command System
25
+ ### 🎨 **Syntax Highlighting**
26
+ - Built-in tokenizer with state-machine architecture
27
+ - Pre-configured support for JavaScript, TypeScript, Python
28
+ - Extensible language definition system
29
+ - Regex-based pattern matching with priorities
20
30
 
21
- - Command pattern with full undo/redo support
31
+ ### πŸ”„ **Complete Undo/Redo**
32
+ - Command pattern with full history
22
33
  - Composite commands for complex operations
23
- - Command grouping with automatic timeouts
24
- - Built-in commands for all text operations
34
+ - Configurable stack size
35
+ - Smart command grouping with timeouts
36
+
37
+ ### 🎭 **Event-Driven Architecture**
38
+ - Type-safe event emitter
39
+ - Priority-based event handling
40
+ - Async event support
41
+ - Proper disposal and memory management
42
+
43
+ ### 🧩 **Extension System**
44
+ - VSCode-compatible extension API
45
+ - Activation events for lazy loading
46
+ - State management (global and workspace)
47
+ - Dependency resolution
48
+ - Extension marketplace interface
49
+
50
+ ### 🌐 **Language Services Interface**
51
+ - LSP-compatible APIs
52
+ - Code completion support
53
+ - Hover information
54
+ - Diagnostics
55
+ - Go to definition
56
+ - Code actions
57
+ - Formatting
58
+ - Rename operations
59
+
60
+ ## πŸ“¦ Installation
61
+
62
+ ```bash
63
+ npm install @kroy665/code-editor-engine
64
+ ```
25
65
 
26
- ### 4. Robust Event System
66
+ Or with yarn:
27
67
 
28
- - Type-safe event emitter with priority support
29
- - Async event handling capabilities
30
- - Memory leak prevention with proper disposal
68
+ ```bash
69
+ yarn add @kroy665/code-editor-engine
70
+ ```
31
71
 
32
- ### 5. Extensible Language Services
72
+ Or with pnpm:
33
73
 
34
- - Modular tokenizer with state-machine architecture
35
- - Built-in support for JavaScript, TypeScript, Python
36
- - LSP-compatible interface for external language servers
37
- - Hot-swappable language definitions
74
+ ```bash
75
+ pnpm add @kroy665/code-editor-engine
76
+ ```
38
77
 
39
- ### 6. Plugin Architecture
78
+ ## πŸš€ Quick Start
40
79
 
41
- - Full extension system with activation events
42
- - Extension marketplace compatibility
43
- - State management for extensions
44
- - Dependency resolution and lifecycle management
80
+ ### Basic Usage
45
81
 
46
- ## πŸš€ Key Features
82
+ ```typescript
83
+ import { createEditor, position } from '@kroy665/code-editor-engine';
47
84
 
48
- ### βœ… Future-Proof Design
85
+ // Create an editor with built-in language support
86
+ const { editor } = createEditor({
87
+ languages: ['javascript', 'typescript', 'python']
88
+ });
49
89
 
50
- - ES modules with tree-shaking support
51
- - Incremental compilation and lazy loading
52
- - Hot module replacement compatible
53
- - Web Workers support for heavy operations
90
+ // Open a document
91
+ await editor.openDocument(
92
+ 'file:///example.js',
93
+ 'console.log("Hello, World!");',
94
+ 'javascript'
95
+ );
54
96
 
55
- ### βœ… Performance Optimized
97
+ // Insert text at cursor position
98
+ await editor.insertText(' // This is a comment', position(0, 29));
56
99
 
57
- - Handles files up to 100MB efficiently
58
- - Sub-millisecond text operations
59
- - Intelligent tokenization caching
60
- - Memory-efficient data structures
100
+ // Get current content
101
+ const content = editor.document?.getText();
102
+ console.log(content);
103
+ // Output: console.log("Hello, World!"); // This is a comment
104
+ ```
105
+
106
+ ### With Undo/Redo
107
+
108
+ ```typescript
109
+ import { createEditor, position, range } from '@kroy665/code-editor-engine';
110
+
111
+ const { editor } = createEditor();
112
+
113
+ await editor.openDocument('file:///example.js', 'let x = 1;', 'javascript');
61
114
 
62
- ### βœ… Fully Typed
115
+ // Make some edits
116
+ await editor.insertText('\nlet y = 2;', position(1, 0));
117
+ await editor.insertText('\nlet z = 3;', position(2, 0));
63
118
 
64
- - 100% TypeScript coverage
65
- - Comprehensive interface definitions
66
- - Generic type safety throughout
67
- - IDE autocompletion support
119
+ console.log(editor.document?.getText());
120
+ // Output:
121
+ // let x = 1;
122
+ // let y = 2;
123
+ // let z = 3;
68
124
 
69
- ### βœ… Extensible
125
+ // Undo last two changes
126
+ await editor.undo();
127
+ await editor.undo();
70
128
 
71
- - Plugin-based architecture
72
- - Language service providers
73
- - Custom command registration
74
- - Theme and configuration management
129
+ console.log(editor.document?.getText());
130
+ // Output: let x = 1;
75
131
 
76
- ## πŸ“¦ Project Structure
132
+ // Redo one change
133
+ await editor.redo();
77
134
 
135
+ console.log(editor.document?.getText());
136
+ // Output:
137
+ // let x = 1;
138
+ // let y = 2;
78
139
  ```
79
- coder-engine/
80
- β”œβ”€β”€ src/
81
- β”‚ β”œβ”€β”€ types/core.ts # Complete type definitions
82
- β”‚ β”œβ”€β”€ core/
83
- β”‚ β”‚ β”œβ”€β”€ TextDocument.ts # Efficient text management
84
- β”‚ β”‚ β”œβ”€β”€ EventSystem.ts # Type-safe events
85
- β”‚ β”‚ β”œβ”€β”€ CommandSystem.ts # Undo/redo system
86
- β”‚ β”‚ └── CodeEditor.ts # Main engine
87
- β”‚ β”œβ”€β”€ language/
88
- β”‚ β”‚ β”œβ”€β”€ Tokenizer.ts # Syntax highlighting
89
- β”‚ β”‚ └── Extensions.ts # Plugin system
90
- β”‚ └── index.ts # Public API
91
- β”œβ”€β”€ package.json # NPM configuration
92
- β”œβ”€β”€ tsconfig.json # TypeScript config
93
- └── README.md # Documentation
140
+
141
+ ### Multiple Selections
142
+
143
+ ```typescript
144
+ import { createEditor, selection } from '@kroy665/code-editor-engine';
145
+
146
+ const { editor } = createEditor();
147
+
148
+ await editor.openDocument(
149
+ 'file:///example.js',
150
+ 'const a = 1;\nconst b = 2;\nconst c = 3;',
151
+ 'javascript'
152
+ );
153
+
154
+ // Set multiple cursors
155
+ editor.setSelections([
156
+ selection(0, 6, 0, 7), // Select 'a'
157
+ selection(1, 6, 1, 7), // Select 'b'
158
+ selection(2, 6, 2, 7), // Select 'c'
159
+ ]);
160
+
161
+ console.log(editor.selections.length); // 3
94
162
  ```
95
163
 
96
- ## πŸ’‘ Usage Examples
164
+ ### Event Handling
97
165
 
98
- ### Basic Editor
166
+ ```typescript
167
+ import { createEditor } from '@kroy665/code-editor-engine';
168
+
169
+ const { editor } = createEditor();
170
+
171
+ // Listen to text changes
172
+ editor.on('text-changed', ({ document }) => {
173
+ console.log('Text changed:', document.getText());
174
+ });
175
+
176
+ // Listen to cursor movement
177
+ editor.on('cursor-moved', ({ position }) => {
178
+ console.log('Cursor moved to:', position);
179
+ });
180
+
181
+ // Listen to selection changes
182
+ editor.on('selection-changed', ({ selections }) => {
183
+ console.log('Selections:', selections.length);
184
+ });
185
+
186
+ await editor.openDocument('file:///example.js', 'let x = 1;', 'javascript');
187
+ ```
188
+
189
+ ## πŸ“š Core Concepts
190
+
191
+ ### 1. Document Management
99
192
 
100
193
  ```typescript
101
- import { createEditor, position } from '@kroy665/code-editor-engine';
194
+ import { createEditor } from '@kroy665/code-editor-engine';
195
+
196
+ const { editor } = createEditor();
197
+
198
+ // Open a document
199
+ await editor.openDocument('file:///path/to/file.js', 'content', 'javascript');
200
+
201
+ // Access document properties
202
+ console.log(editor.document?.uri); // file:///path/to/file.js
203
+ console.log(editor.document?.languageId); // javascript
204
+ console.log(editor.document?.lineCount); // number of lines
205
+ console.log(editor.document?.version); // document version
206
+
207
+ // Get document content
208
+ const fullText = editor.document?.getText();
209
+ const lineText = editor.document?.getLineContent(0);
210
+
211
+ // Close document
212
+ editor.closeDocument();
213
+ ```
214
+
215
+ ### 2. Text Operations
216
+
217
+ ```typescript
218
+ import { createEditor, position, range } from '@kroy665/code-editor-engine';
219
+
220
+ const { editor } = createEditor();
221
+ await editor.openDocument('file:///example.js', 'hello world', 'javascript');
222
+
223
+ // Insert text
224
+ await editor.insertText(' beautiful', position(0, 5));
225
+ // Result: "hello beautiful world"
226
+
227
+ // Delete text
228
+ await editor.deleteText(range(0, 6, 0, 16));
229
+ // Result: "hello world"
230
+
231
+ // Replace text
232
+ await editor.replaceText(range(0, 0, 0, 5), 'goodbye');
233
+ // Result: "goodbye world"
234
+ ```
235
+
236
+ ### 3. Command System
237
+
238
+ ```typescript
239
+ import { createEditor, Command } from '@kroy665/code-editor-engine';
240
+
241
+ const { editor } = createEditor();
242
+
243
+ // Register custom command
244
+ const customCommand: Command = {
245
+ id: 'custom.upperCase',
246
+ label: 'Convert to Upper Case',
247
+ execute: async () => {
248
+ const doc = editor.document;
249
+ if (doc) {
250
+ const text = doc.getText();
251
+ await editor.replaceText(
252
+ range(0, 0, doc.lineCount - 1, doc.getLineContent(doc.lineCount - 1).length),
253
+ text.toUpperCase()
254
+ );
255
+ }
256
+ }
257
+ };
258
+
259
+ editor.registerCommand(customCommand);
260
+
261
+ // Execute command
262
+ await editor.executeCommand('custom.upperCase');
263
+
264
+ // Built-in commands
265
+ await editor.executeCommand('editor.undo');
266
+ await editor.executeCommand('editor.redo');
267
+ ```
268
+
269
+ ### 4. Syntax Highlighting
102
270
 
103
- const { editor } = createEditor({ languages: ['javascript'] });
104
- await editor.openDocument('file.js', 'console.log("hello");', 'javascript');
105
- await editor.insertText(' // comment', position(0, 22));
271
+ ```typescript
272
+ import {
273
+ createEditor,
274
+ TokenizerLanguageService,
275
+ BuiltInLanguages
276
+ } from '@kroy665/code-editor-engine';
277
+
278
+ const { editor } = createEditor();
279
+
280
+ // Register language service
281
+ const jsService = new TokenizerLanguageService('javascript');
282
+ editor.registerLanguageService(jsService);
283
+
284
+ // Open a JavaScript file
285
+ await editor.openDocument(
286
+ 'file:///example.js',
287
+ 'const greeting = "Hello, World!";',
288
+ 'javascript'
289
+ );
290
+
291
+ // Get tokens for syntax highlighting
292
+ const service = editor.getLanguageService('javascript');
293
+ if (service && service.tokenize) {
294
+ const tokens = await service.tokenize(editor.document!);
295
+
296
+ tokens.forEach(token => {
297
+ console.log(`${token.type}: "${token.text}" at line ${token.range.start.line}`);
298
+ });
299
+ }
106
300
  ```
107
301
 
108
- ### With Extensions
302
+ ### 5. Custom Language Definition
109
303
 
110
304
  ```typescript
111
- const customExtension = {
305
+ import {
306
+ createEditor,
307
+ Tokenizer,
308
+ TokenType,
309
+ LanguageDefinition
310
+ } from '@kroy665/code-editor-engine';
311
+
312
+ // Define a custom language
313
+ const customLanguage: LanguageDefinition = {
314
+ languageId: 'mylang',
315
+ name: 'My Custom Language',
316
+ extensions: ['.mylang'],
317
+ defaultState: 'root',
318
+ keywords: ['let', 'const', 'if', 'else', 'function'],
319
+ states: {
320
+ root: [
321
+ // Comments
322
+ { pattern: /\/\/.*$/gm, type: TokenType.Comment },
323
+
324
+ // Strings
325
+ { pattern: /"([^"\\]|\\.)*"/g, type: TokenType.String },
326
+
327
+ // Numbers
328
+ { pattern: /\b\d+\.?\d*\b/g, type: TokenType.Number },
329
+
330
+ // Identifiers
331
+ { pattern: /[a-zA-Z_][a-zA-Z0-9_]*/g, type: TokenType.Identifier },
332
+
333
+ // Operators
334
+ { pattern: /[+\-*/%=<>!&|^~?:]+/g, type: TokenType.Operator },
335
+ ]
336
+ }
337
+ };
338
+
339
+ const tokenizer = new Tokenizer();
340
+ tokenizer.registerLanguage(customLanguage);
341
+ ```
342
+
343
+ ### 6. Extension Development
344
+
345
+ ```typescript
346
+ import { Extension, ExtensionContext } from '@kroy665/code-editor-engine';
347
+
348
+ // Create a custom extension
349
+ const myExtension: Extension = {
112
350
  id: 'my-extension',
113
351
  name: 'My Extension',
114
352
  version: '1.0.0',
115
- async activate(context) {
116
- context.registerCommand('myCommand', { /* ... */ });
353
+ description: 'My awesome extension',
354
+ activationEvents: ['onLanguage:javascript'],
355
+
356
+ async activate(context: ExtensionContext) {
357
+ console.log('Extension activated!');
358
+
359
+ // Register commands
360
+ const command = {
361
+ id: 'myext.hello',
362
+ label: 'Say Hello',
363
+ execute: () => console.log('Hello from extension!')
364
+ };
365
+
366
+ context.registerCommand('myext.hello', command);
367
+
368
+ // Use state storage
369
+ await context.globalState.update('lastActivated', Date.now());
370
+ },
371
+
372
+ async deactivate() {
373
+ console.log('Extension deactivated');
117
374
  }
118
375
  };
119
376
 
377
+ // Use the extension
120
378
  const { editor, extensionHost } = createEditor({
121
- extensions: [customExtension]
379
+ extensions: [myExtension]
122
380
  });
381
+
382
+ // Activate the extension
383
+ await extensionHost.activateByEvent('onLanguage:javascript');
384
+ ```
385
+
386
+ ### 7. Language Service Provider
387
+
388
+ ```typescript
389
+ import {
390
+ LanguageService,
391
+ CompletionItem,
392
+ CompletionItemKind,
393
+ Position,
394
+ TextDocument
395
+ } from '@kroy665/code-editor-engine';
396
+
397
+ // Create a custom language service
398
+ class MyLanguageService implements LanguageService {
399
+ languageId = 'javascript';
400
+
401
+ async provideCompletions(
402
+ document: TextDocument,
403
+ position: Position
404
+ ): Promise<CompletionItem[]> {
405
+ return [
406
+ {
407
+ label: 'console',
408
+ kind: CompletionItemKind.Variable,
409
+ detail: 'Console object',
410
+ insertText: 'console',
411
+ documentation: 'The console object provides access to debugging console'
412
+ },
413
+ {
414
+ label: 'log',
415
+ kind: CompletionItemKind.Method,
416
+ detail: '(method) log(...data: any[]): void',
417
+ insertText: 'log',
418
+ documentation: 'Outputs a message to the console'
419
+ }
420
+ ];
421
+ }
422
+
423
+ async provideHover(document: TextDocument, position: Position) {
424
+ const word = document.getWordRangeAtPosition(position);
425
+ if (!word) return null;
426
+
427
+ const text = document.getText(word);
428
+
429
+ return {
430
+ contents: [`**${text}**`, 'Variable declaration'],
431
+ range: word
432
+ };
433
+ }
434
+ }
435
+
436
+ const { editor } = createEditor();
437
+ editor.registerLanguageService(new MyLanguageService());
438
+ ```
439
+
440
+ ### 8. Builder Pattern
441
+
442
+ ```typescript
443
+ import { editor } from '@kroy665/code-editor-engine';
444
+
445
+ // Use the fluent builder API
446
+ const myEditor = editor()
447
+ .withTabSize(2)
448
+ .withSpaces(true)
449
+ .readOnly(false)
450
+ .withLanguageService(myLanguageService)
451
+ .withCommand(myCommand)
452
+ .build();
453
+
454
+ await myEditor.openDocument('file:///example.js', 'code', 'javascript');
455
+ ```
456
+
457
+ ### 9. Working with LineBuffer Directly
458
+
459
+ ```typescript
460
+ import { LineBuffer, position, range } from '@kroy665/code-editor-engine';
461
+
462
+ // Create a line buffer for efficient text manipulation
463
+ const buffer = new LineBuffer('Hello\nWorld\n!');
464
+
465
+ console.log(buffer.lineCount); // 3
466
+ console.log(buffer.getLineContent(0)); // "Hello"
467
+ console.log(buffer.getText()); // "Hello\nWorld\n!"
468
+
469
+ // Insert text
470
+ buffer.insertText(position(0, 5), ' there');
471
+ console.log(buffer.getLineContent(0)); // "Hello there"
472
+
473
+ // Delete text
474
+ buffer.deleteText(range(0, 6, 0, 11));
475
+ console.log(buffer.getLineContent(0)); // "Hello "
476
+
477
+ // Find text
478
+ const match = buffer.findNext('World', position(0, 0));
479
+ console.log(match); // { start: { line: 1, column: 0 }, end: { line: 1, column: 5 } }
480
+
481
+ // Find all occurrences
482
+ const matches = buffer.findAll('l', { caseSensitive: true });
483
+ console.log(matches.length); // Number of 'l' characters
484
+ ```
485
+
486
+ ### 10. Event System Features
487
+
488
+ ```typescript
489
+ import { TypedEventEmitter, PriorityEventEmitter } from '@kroy665/code-editor-engine';
490
+
491
+ // Priority-based events
492
+ type MyEvents = {
493
+ 'data-changed': { value: number };
494
+ };
495
+
496
+ const emitter = new PriorityEventEmitter<MyEvents>();
497
+
498
+ // High priority listener (executes first)
499
+ emitter.onWithPriority('data-changed', (data) => {
500
+ console.log('High priority:', data.value);
501
+ }, 100);
502
+
503
+ // Normal priority listener
504
+ emitter.on('data-changed', (data) => {
505
+ console.log('Normal priority:', data.value);
506
+ });
507
+
508
+ // Low priority listener
509
+ emitter.onWithPriority('data-changed', (data) => {
510
+ console.log('Low priority:', data.value);
511
+ }, -100);
512
+
513
+ emitter.emit('data-changed', { value: 42 });
514
+ // Output:
515
+ // High priority: 42
516
+ // Normal priority: 42
517
+ // Low priority: 42
518
+ ```
519
+
520
+ ## πŸ—οΈ Architecture
521
+
522
+ ```
523
+ β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
524
+ β”‚ Your UI Layer β”‚
525
+ β”‚ (React, React Native, Vue, etc.) β”‚
526
+ β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜
527
+ β”‚
528
+ β”‚ Events & Commands
529
+ β–Ό
530
+ β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
531
+ β”‚ Code Editor Engine β”‚
532
+ β”‚ β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β” β”‚
533
+ β”‚ β”‚ Extension System β”‚ β”‚
534
+ β”‚ β”‚ β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β” β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β” β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β” β”‚ β”‚
535
+ β”‚ β”‚ β”‚Extension β”‚ β”‚Extension β”‚ β”‚Extension β”‚ β”‚ β”‚
536
+ β”‚ β”‚ β”‚ 1 β”‚ β”‚ 2 β”‚ β”‚ 3 β”‚ β”‚ β”‚
537
+ β”‚ β”‚ β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜ β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜ β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜ β”‚ β”‚
538
+ β”‚ β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜ β”‚
539
+ β”‚ β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β” β”‚
540
+ β”‚ β”‚ Language Services β”‚ β”‚
541
+ β”‚ β”‚ - Tokenization - Completion β”‚ β”‚
542
+ β”‚ β”‚ - Diagnostics - Hover β”‚ β”‚
543
+ β”‚ β”‚ - Formatting - Code Actions β”‚ β”‚
544
+ β”‚ β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜ β”‚
545
+ β”‚ β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β” β”‚
546
+ β”‚ β”‚ Core Editor β”‚ β”‚
547
+ β”‚ β”‚ - Document Management β”‚ β”‚
548
+ β”‚ β”‚ - Text Operations β”‚ β”‚
549
+ β”‚ β”‚ - Selection Management β”‚ β”‚
550
+ β”‚ β”‚ - Event System β”‚ β”‚
551
+ β”‚ β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜ β”‚
552
+ β”‚ β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β” β”‚
553
+ β”‚ β”‚ Command System β”‚ β”‚
554
+ β”‚ β”‚ - Command Registry β”‚ β”‚
555
+ β”‚ β”‚ - Undo/Redo Stack β”‚ β”‚
556
+ β”‚ β”‚ - Command Grouping β”‚ β”‚
557
+ β”‚ β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜ β”‚
558
+ β”‚ β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β” β”‚
559
+ β”‚ β”‚ Text Buffer β”‚ β”‚
560
+ β”‚ β”‚ - LineBuffer (Rope-like structure) β”‚ β”‚
561
+ β”‚ β”‚ - Efficient insertions/deletions β”‚ β”‚
562
+ β”‚ β”‚ - Position/Range operations β”‚ β”‚
563
+ β”‚ β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜ β”‚
564
+ β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜
123
565
  ```
124
566
 
125
- ## 🎯 Design Philosophy
567
+ ## πŸ“– API Reference
568
+
569
+ ### Main Entry Points
570
+
571
+ #### `createEditor(options?): { editor, extensionHost }`
572
+ Creates a complete editor instance with extensions.
573
+
574
+ **Options:**
575
+ - `editorOptions?: Partial<EditorOptions>` - Editor configuration
576
+ - `languages?: string[]` - Languages to enable (`'javascript'`, `'typescript'`, `'python'`)
577
+ - `extensions?: Extension[]` - Custom extensions to load
578
+ - `builtInExtensions?: boolean` - Load built-in extensions (default: `true`)
579
+
580
+ #### `createMinimalEditor(options?): CodeEditor`
581
+ Creates a minimal editor without extensions.
582
+
583
+ #### Helper Functions
584
+
585
+ ```typescript
586
+ // Position helpers
587
+ position(line: number, column: number): Position
588
+
589
+ // Range helpers
590
+ range(
591
+ startLine: number,
592
+ startColumn: number,
593
+ endLine: number,
594
+ endColumn: number
595
+ ): Range
596
+
597
+ // Selection helpers
598
+ selection(
599
+ anchorLine: number,
600
+ anchorColumn: number,
601
+ activeLine: number,
602
+ activeColumn: number
603
+ ): Selection
604
+ ```
605
+
606
+ ### Editor Options
607
+
608
+ ```typescript
609
+ interface EditorOptions {
610
+ tabSize: number; // Default: 4
611
+ insertSpaces: boolean; // Default: true
612
+ autoIndent: boolean; // Default: true
613
+ wordWrap: boolean; // Default: false
614
+ lineNumbers: boolean; // Default: true
615
+ readOnly: boolean; // Default: false
616
+ undoStackSize: number; // Default: 1000
617
+ }
618
+ ```
619
+
620
+ ### Events
621
+
622
+ ```typescript
623
+ interface EditorEvents {
624
+ 'text-changed': { changes: TextChange[]; document: TextDocument };
625
+ 'selection-changed': { selections: Selection[]; document: TextDocument };
626
+ 'cursor-moved': { position: Position; document: TextDocument };
627
+ 'language-changed': { languageId: string; document: TextDocument };
628
+ 'document-opened': { document: TextDocument };
629
+ 'document-closed': { uri: string };
630
+ 'document-saved': { document: TextDocument };
631
+ 'undo': { command: Command };
632
+ 'redo': { command: Command };
633
+ }
634
+ ```
635
+
636
+ ### Token Types
637
+
638
+ ```typescript
639
+ enum TokenType {
640
+ Text = 'text',
641
+ Keyword = 'keyword',
642
+ String = 'string',
643
+ Comment = 'comment',
644
+ Number = 'number',
645
+ Operator = 'operator',
646
+ Identifier = 'identifier',
647
+ Type = 'type',
648
+ Function = 'function',
649
+ Variable = 'variable',
650
+ Property = 'property',
651
+ Class = 'class',
652
+ // ... and more
653
+ }
654
+ ```
655
+
656
+ ## 🎨 Use Cases
657
+
658
+ ### React Native Mobile App
659
+
660
+ ```typescript
661
+ import { createEditor } from '@kroy665/code-editor-engine';
662
+ import { View, Text, TextInput } from 'react-native';
663
+
664
+ function CodeEditorScreen() {
665
+ const [editor] = useState(() => createEditor({ languages: ['javascript'] }).editor);
666
+ const [content, setContent] = useState('');
667
+
668
+ useEffect(() => {
669
+ editor.on('text-changed', ({ document }) => {
670
+ setContent(document.getText());
671
+ });
672
+
673
+ editor.openDocument('file:///temp.js', '', 'javascript');
674
+ }, []);
675
+
676
+ const handleTextChange = async (text: string) => {
677
+ if (editor.document) {
678
+ await editor.replaceText(
679
+ range(0, 0, editor.document.lineCount - 1, 999),
680
+ text
681
+ );
682
+ }
683
+ };
684
+
685
+ return (
686
+ <View>
687
+ <TextInput
688
+ multiline
689
+ value={content}
690
+ onChangeText={handleTextChange}
691
+ style={{ fontFamily: 'monospace' }}
692
+ />
693
+ </View>
694
+ );
695
+ }
696
+ ```
697
+
698
+ ### Web-based Code Editor
699
+
700
+ ```typescript
701
+ import { createEditor } from '@kroy665/code-editor-engine';
702
+
703
+ class WebEditor {
704
+ private editor = createEditor({ languages: ['typescript'] }).editor;
705
+ private editorElement: HTMLTextAreaElement;
706
+
707
+ constructor(element: HTMLTextAreaElement) {
708
+ this.editorElement = element;
709
+ this.setupEventListeners();
710
+ }
711
+
712
+ private async setupEventListeners() {
713
+ await this.editor.openDocument('file:///untitled.ts', '', 'typescript');
714
+
715
+ this.editorElement.addEventListener('input', async (e) => {
716
+ const target = e.target as HTMLTextAreaElement;
717
+ if (this.editor.document) {
718
+ await this.editor.replaceText(
719
+ range(0, 0, this.editor.document.lineCount - 1, 999),
720
+ target.value
721
+ );
722
+ }
723
+ });
724
+
725
+ this.editor.on('text-changed', ({ document }) => {
726
+ this.editorElement.value = document.getText();
727
+ });
728
+ }
729
+
730
+ async undo() {
731
+ await this.editor.undo();
732
+ }
733
+
734
+ async redo() {
735
+ await this.editor.redo();
736
+ }
737
+ }
738
+ ```
739
+
740
+ ### Node.js CLI Tool
741
+
742
+ ```typescript
743
+ import { createEditor } from '@kroy665/code-editor-engine';
744
+ import * as fs from 'fs';
745
+
746
+ async function editFile(filePath: string) {
747
+ const content = fs.readFileSync(filePath, 'utf-8');
748
+ const { editor } = createEditor({ languages: ['javascript'] });
749
+
750
+ await editor.openDocument(`file:///${filePath}`, content, 'javascript');
751
+
752
+ // Perform automated edits
753
+ await editor.insertText('\n// Auto-generated comment', position(0, 0));
754
+
755
+ // Get language service for syntax checking
756
+ const service = editor.getLanguageService('javascript');
757
+ if (service?.tokenize) {
758
+ const tokens = await service.tokenize(editor.document!);
759
+ console.log(`Found ${tokens.length} tokens`);
760
+ }
761
+
762
+ // Save back to file
763
+ const newContent = editor.document?.getText();
764
+ if (newContent) {
765
+ fs.writeFileSync(filePath, newContent);
766
+ }
767
+ }
768
+ ```
769
+
770
+ ## πŸ”§ Advanced Topics
771
+
772
+ ### Memory Management
773
+
774
+ ```typescript
775
+ import { createEditor } from '@kroy665/code-editor-engine';
776
+
777
+ const { editor, extensionHost } = createEditor();
778
+
779
+ // ... use editor ...
780
+
781
+ // Proper cleanup
782
+ editor.dispose(); // Dispose editor and free resources
783
+ extensionHost.dispose(); // Dispose all extensions
784
+
785
+ // Check if disposed
786
+ console.log(editor.disposed); // true
787
+ ```
788
+
789
+ ### Custom Command with Undo/Redo
790
+
791
+ ```typescript
792
+ import { UndoableCommand, CommandContext } from '@kroy665/code-editor-engine';
793
+
794
+ class UpperCaseCommand extends UndoableCommand {
795
+ private previousText: string = '';
796
+ private range: Range;
797
+
798
+ constructor(private context: CommandContext, range: Range) {
799
+ super('custom.uppercase', 'Convert to Upper Case');
800
+ this.range = range;
801
+ }
802
+
803
+ execute() {
804
+ const document = this.context.document;
805
+ this.previousText = document.getText(this.range);
806
+
807
+ const buffer = (document as any).getBuffer();
808
+ buffer.replaceText(this.range, this.previousText.toUpperCase());
809
+
810
+ this.markExecuted();
811
+ }
812
+
813
+ undo() {
814
+ if (!this.executed) return;
815
+
816
+ const document = this.context.document;
817
+ const buffer = (document as any).getBuffer();
818
+ buffer.replaceText(this.range, this.previousText);
819
+
820
+ this.markUndone();
821
+ }
822
+ }
823
+ ```
824
+
825
+ ### Performance Monitoring
826
+
827
+ ```typescript
828
+ import { Performance, Memory, Debug } from '@kroy665/code-editor-engine';
829
+
830
+ // Measure operation performance
831
+ const result = await Performance.measure('insertText', async () => {
832
+ await editor.insertText('large text content', position(0, 0));
833
+ });
834
+
835
+ // Profile synchronous operations
836
+ const { result: tokens, time } = Performance.profile(() => {
837
+ return tokenizer.tokenize(document);
838
+ });
839
+ console.log(`Tokenization took ${time.toFixed(2)}ms`);
840
+
841
+ // Check memory usage (Node.js only)
842
+ const usage = Memory.getUsage();
843
+ if (usage) {
844
+ console.log('Heap used:', (usage.heapUsed / 1024 / 1024).toFixed(2), 'MB');
845
+ }
846
+
847
+ // Debug logging (only in development)
848
+ Debug.log('Editor initialized');
849
+ Debug.warn('Large file detected');
850
+ Debug.error('Failed to save');
851
+ ```
852
+
853
+ ### Platform Detection
854
+
855
+ ```typescript
856
+ import { Platform } from '@kroy665/code-editor-engine';
857
+
858
+ if (Platform.isReactNative()) {
859
+ console.log('Running in React Native');
860
+ } else if (Platform.isBrowser()) {
861
+ console.log('Running in browser');
862
+ } else if (Platform.isNode()) {
863
+ console.log('Running in Node.js');
864
+ }
865
+ ```
866
+
867
+ ## πŸ§ͺ Testing
868
+
869
+ ```typescript
870
+ import { createEditor, position } from '@kroy665/code-editor-engine';
871
+
872
+ describe('CodeEditor', () => {
873
+ let editor: CodeEditor;
874
+
875
+ beforeEach(() => {
876
+ editor = createEditor().editor;
877
+ });
878
+
879
+ afterEach(() => {
880
+ editor.dispose();
881
+ });
882
+
883
+ test('should insert text correctly', async () => {
884
+ await editor.openDocument('test.js', 'hello', 'javascript');
885
+ await editor.insertText(' world', position(0, 5));
886
+
887
+ expect(editor.document?.getText()).toBe('hello world');
888
+ });
889
+
890
+ test('should support undo/redo', async () => {
891
+ await editor.openDocument('test.js', 'original', 'javascript');
892
+ await editor.insertText(' modified', position(0, 8));
893
+
894
+ expect(editor.document?.getText()).toBe('original modified');
895
+
896
+ await editor.undo();
897
+ expect(editor.document?.getText()).toBe('original');
898
+
899
+ await editor.redo();
900
+ expect(editor.document?.getText()).toBe('original modified');
901
+ });
902
+ });
903
+ ```
904
+
905
+ ## πŸ“Š Performance Benchmarks
906
+
907
+ - **Insert Operation**: < 1ms for typical edits
908
+ - **Delete Operation**: < 1ms for typical edits
909
+ - **Undo/Redo**: < 1ms per operation
910
+ - **Tokenization**: ~10-50ms for 1000 lines (cached)
911
+ - **Memory**: ~1-5MB per 10,000 lines of code
912
+
913
+ ## πŸ—ΊοΈ Roadmap
914
+
915
+ - [ ] Code folding support
916
+ - [ ] Minimap support
917
+ - [ ] Multi-threaded tokenization with Web Workers
918
+ - [ ] Incremental parsing for better performance
919
+ - [ ] LSP client integration
920
+ - [ ] Tree-sitter grammar support
921
+ - [ ] Collaborative editing (CRDT)
922
+ - [ ] Virtual scrolling for huge files
923
+ - [ ] Advanced find/replace with regex
924
+ - [ ] Bracket matching and auto-closing
925
+
926
+ ## 🀝 Contributing
927
+
928
+ Contributions are welcome! Please feel free to submit a Pull Request.
929
+
930
+ ## πŸ“„ License
931
+
932
+ MIT Β© Koushik Roy
933
+
934
+ ## πŸ”— Links
935
+
936
+ - [GitHub Repository](https://github.com/Kroy665/code-editor-engine)
937
+ - [npm Package](https://www.npmjs.com/package/@kroy665/code-editor-engine)
938
+ - [Issue Tracker](https://github.com/Kroy665/code-editor-engine/issues)
939
+
940
+ ## πŸ’‘ Support
941
+
942
+ If you have questions or need help, please:
943
+ - Open an issue on GitHub
944
+ - Check the examples in the `/examples` directory
945
+ - Review the TypeScript definitions for detailed API documentation
946
+
947
+ ---
126
948
 
127
- This engine provides everything needed to build Monaco-like editors for any platform, with a focus on mobile-first design and future compatibility. The headless architecture means you can plug in any UI framework while getting professional-grade editing capabilities.
949
+ **Built with ❀️ for developers who need a powerful, flexible code editing engine**
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@kroy665/code-editor-engine",
3
- "version": "1.0.0",
3
+ "version": "1.0.1",
4
4
  "description": "Future-proof headless code editor engine for any platform",
5
5
  "main": "dist/index.js",
6
6
  "module": "dist/index.esm.js",