@lexion-rte/core 0.1.0

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.
@@ -0,0 +1,33 @@
1
+ import { Node as ProseMirrorNode, type Schema } from "prosemirror-model";
2
+ import { EditorState, type Transaction } from "prosemirror-state";
3
+ import type { CommandHandler, JSONDocument, LexionEditor as LexionEditorContract, LexionEditorOptions, LexionExtension } from "./types.js";
4
+ export declare class LexionEditor implements LexionEditorContract {
5
+ private readonly _schema;
6
+ private _state;
7
+ private readonly commandMap;
8
+ private readonly extensionsByKey;
9
+ private readonly extensionCommandsByKey;
10
+ private destroyed;
11
+ constructor(options?: LexionEditorOptions);
12
+ get schema(): Schema;
13
+ get state(): EditorState;
14
+ get doc(): ProseMirrorNode;
15
+ getJSON(): JSONDocument;
16
+ setJSON(document: JSONDocument): void;
17
+ dispatchTransaction(transaction: Transaction): void;
18
+ execute(command: string, ...args: readonly unknown[]): boolean;
19
+ registerCommand(name: string, command: CommandHandler): void;
20
+ unregisterCommand(name: string): void;
21
+ use(extension: LexionExtension): void;
22
+ removePlugin(key: string): void;
23
+ destroy(): void;
24
+ private assertNotDestroyed;
25
+ private resolveSchema;
26
+ private parseDocument;
27
+ private createState;
28
+ private addExtension;
29
+ private createPluginLifecycleContext;
30
+ private runExtensionOnCreate;
31
+ private registerCommands;
32
+ }
33
+ //# sourceMappingURL=editor.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"editor.d.ts","sourceRoot":"","sources":["../src/editor.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,IAAI,eAAe,EAAE,KAAK,MAAM,EAAE,MAAM,mBAAmB,CAAC;AACzE,OAAO,EAAE,WAAW,EAAe,KAAK,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAG/E,OAAO,KAAK,EACV,cAAc,EAGd,YAAY,EACZ,YAAY,IAAI,oBAAoB,EACpC,mBAAmB,EACnB,eAAe,EAGhB,MAAM,YAAY,CAAC;AAEpB,qBAAa,YAAa,YAAW,oBAAoB;IACvD,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAS;IACjC,OAAO,CAAC,MAAM,CAAc;IAC5B,OAAO,CAAC,QAAQ,CAAC,UAAU,CAA8B;IACzD,OAAO,CAAC,QAAQ,CAAC,eAAe,CAA+B;IAC/D,OAAO,CAAC,QAAQ,CAAC,sBAAsB,CAAiC;IACxE,OAAO,CAAC,SAAS,CAAU;gBAER,OAAO,GAAE,mBAAwB;IAmBpD,IAAW,MAAM,IAAI,MAAM,CAE1B;IAED,IAAW,KAAK,IAAI,WAAW,CAE9B;IAED,IAAW,GAAG,IAAI,eAAe,CAEhC;IAEM,OAAO,IAAI,YAAY;IAIvB,OAAO,CAAC,QAAQ,EAAE,YAAY,GAAG,IAAI;IAMrC,mBAAmB,CAAC,WAAW,EAAE,WAAW,GAAG,IAAI;IAKnD,OAAO,CAAC,OAAO,EAAE,MAAM,EAAE,GAAG,IAAI,EAAE,SAAS,OAAO,EAAE,GAAG,OAAO;IAmB9D,eAAe,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,cAAc,GAAG,IAAI;IAQ5D,iBAAiB,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI;IAKrC,GAAG,CAAC,SAAS,EAAE,eAAe,GAAG,IAAI;IAOrC,YAAY,CAAC,GAAG,EAAE,MAAM,GAAG,IAAI;IAmB/B,OAAO,IAAI,IAAI;IAgBtB,OAAO,CAAC,kBAAkB;IAM1B,OAAO,CAAC,aAAa;IAyBrB,OAAO,CAAC,aAAa;IAIrB,OAAO,CAAC,WAAW;IAwBnB,OAAO,CAAC,YAAY;IAoBpB,OAAO,CAAC,4BAA4B;IAOpC,OAAO,CAAC,oBAAoB;IAO5B,OAAO,CAAC,gBAAgB;CAKzB"}
package/dist/editor.js ADDED
@@ -0,0 +1,187 @@
1
+ import { Node as ProseMirrorNode } from "prosemirror-model";
2
+ import { EditorState } from "prosemirror-state";
3
+ import { coreSchema } from "./schema.js";
4
+ export class LexionEditor {
5
+ _schema;
6
+ _state;
7
+ commandMap;
8
+ extensionsByKey;
9
+ extensionCommandsByKey;
10
+ destroyed;
11
+ constructor(options = {}) {
12
+ const optionsExtensions = options.extensions ?? options.plugins ?? [];
13
+ this._schema = this.resolveSchema(options.schema, optionsExtensions);
14
+ this.commandMap = new Map();
15
+ this.extensionsByKey = new Map();
16
+ this.extensionCommandsByKey = new Map();
17
+ this.destroyed = false;
18
+ this.registerCommands(options.commands ?? {});
19
+ for (const extension of optionsExtensions) {
20
+ this.addExtension(extension);
21
+ }
22
+ const initialDoc = options.doc ? this.parseDocument(options.doc) : undefined;
23
+ this._state = this.createState(initialDoc);
24
+ this.runExtensionOnCreate();
25
+ }
26
+ get schema() {
27
+ return this._schema;
28
+ }
29
+ get state() {
30
+ return this._state;
31
+ }
32
+ get doc() {
33
+ return this._state.doc;
34
+ }
35
+ getJSON() {
36
+ return this._state.doc.toJSON();
37
+ }
38
+ setJSON(document) {
39
+ this.assertNotDestroyed();
40
+ const nextDocument = this.parseDocument(document);
41
+ this._state = this.createState(nextDocument);
42
+ }
43
+ dispatchTransaction(transaction) {
44
+ this.assertNotDestroyed();
45
+ this._state = this._state.apply(transaction);
46
+ }
47
+ execute(command, ...args) {
48
+ this.assertNotDestroyed();
49
+ const handler = this.commandMap.get(command);
50
+ if (!handler) {
51
+ throw new Error(`Unknown command: ${command}`);
52
+ }
53
+ const context = {
54
+ editor: this,
55
+ schema: this._schema,
56
+ state: this._state,
57
+ dispatch: (transaction) => {
58
+ this.dispatchTransaction(transaction);
59
+ }
60
+ };
61
+ return handler(context, ...args);
62
+ }
63
+ registerCommand(name, command) {
64
+ this.assertNotDestroyed();
65
+ if (this.commandMap.has(name)) {
66
+ throw new Error(`Command already registered: ${name}`);
67
+ }
68
+ this.commandMap.set(name, command);
69
+ }
70
+ unregisterCommand(name) {
71
+ this.assertNotDestroyed();
72
+ this.commandMap.delete(name);
73
+ }
74
+ use(extension) {
75
+ this.assertNotDestroyed();
76
+ this.addExtension(extension);
77
+ this._state = this.createState(this._state.doc);
78
+ this.runExtensionOnCreate([extension]);
79
+ }
80
+ removePlugin(key) {
81
+ this.assertNotDestroyed();
82
+ const extension = this.extensionsByKey.get(key);
83
+ if (!extension) {
84
+ return;
85
+ }
86
+ const lifecycleContext = this.createPluginLifecycleContext();
87
+ extension.onDestroy?.(lifecycleContext);
88
+ for (const commandName of this.extensionCommandsByKey.get(key) ?? []) {
89
+ this.commandMap.delete(commandName);
90
+ }
91
+ this.extensionCommandsByKey.delete(key);
92
+ this.extensionsByKey.delete(key);
93
+ this._state = this.createState(this._state.doc);
94
+ }
95
+ destroy() {
96
+ if (this.destroyed) {
97
+ return;
98
+ }
99
+ const lifecycleContext = this.createPluginLifecycleContext();
100
+ for (const extension of [...this.extensionsByKey.values()].reverse()) {
101
+ extension.onDestroy?.(lifecycleContext);
102
+ }
103
+ this.commandMap.clear();
104
+ this.extensionCommandsByKey.clear();
105
+ this.extensionsByKey.clear();
106
+ this.destroyed = true;
107
+ }
108
+ assertNotDestroyed() {
109
+ if (this.destroyed) {
110
+ throw new Error("LexionEditor instance has been destroyed");
111
+ }
112
+ }
113
+ resolveSchema(explicitSchema, extensions) {
114
+ if (explicitSchema) {
115
+ return explicitSchema;
116
+ }
117
+ const schemaCandidates = [];
118
+ for (const extension of extensions) {
119
+ if (!extension.schema) {
120
+ continue;
121
+ }
122
+ const schema = typeof extension.schema === "function" ? extension.schema() : extension.schema;
123
+ schemaCandidates.push(schema);
124
+ }
125
+ if (schemaCandidates.length > 1) {
126
+ throw new Error("Only one schema provider extension is supported per editor instance");
127
+ }
128
+ return schemaCandidates[0] ?? coreSchema;
129
+ }
130
+ parseDocument(document) {
131
+ return ProseMirrorNode.fromJSON(this._schema, document);
132
+ }
133
+ createState(document) {
134
+ const pluginContext = { schema: this._schema };
135
+ const plugins = [];
136
+ for (const extension of this.extensionsByKey.values()) {
137
+ for (const prosemirrorPlugin of extension.prosemirrorPlugins?.(pluginContext) ?? []) {
138
+ plugins.push(prosemirrorPlugin);
139
+ }
140
+ }
141
+ const config = document
142
+ ? {
143
+ schema: this._schema,
144
+ doc: document,
145
+ plugins
146
+ }
147
+ : {
148
+ schema: this._schema,
149
+ plugins
150
+ };
151
+ return EditorState.create(config);
152
+ }
153
+ addExtension(extension) {
154
+ if (this.extensionsByKey.has(extension.key)) {
155
+ throw new Error(`Extension already registered: ${extension.key}`);
156
+ }
157
+ this.extensionsByKey.set(extension.key, extension);
158
+ const commandNames = [];
159
+ const extensionCommands = extension.commands?.({ schema: this._schema }) ?? {};
160
+ for (const [name, handler] of Object.entries(extensionCommands)) {
161
+ if (this.commandMap.has(name)) {
162
+ throw new Error(`Command already registered: ${name}`);
163
+ }
164
+ this.commandMap.set(name, handler);
165
+ commandNames.push(name);
166
+ }
167
+ this.extensionCommandsByKey.set(extension.key, commandNames);
168
+ }
169
+ createPluginLifecycleContext() {
170
+ return {
171
+ editor: this,
172
+ schema: this._schema
173
+ };
174
+ }
175
+ runExtensionOnCreate(extensions) {
176
+ const lifecycleContext = this.createPluginLifecycleContext();
177
+ for (const extension of extensions ?? this.extensionsByKey.values()) {
178
+ extension.onCreate?.(lifecycleContext);
179
+ }
180
+ }
181
+ registerCommands(commands) {
182
+ for (const [name, command] of Object.entries(commands)) {
183
+ this.registerCommand(name, command);
184
+ }
185
+ }
186
+ }
187
+ //# sourceMappingURL=editor.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"editor.js","sourceRoot":"","sources":["../src/editor.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,4 @@
1
+ export { LexionEditor } from "./editor.js";
2
+ export { createCoreSchema, coreSchema } from "./schema.js";
3
+ export type { CommandHandler, CommandMap, EditorCommandContext, JSONDocument, JSONArray, JSONObject, JSONPrimitive, JSONValue, LexionEditorOptions, LexionExtension, LexionPlugin, PluginFactoryContext, PluginLifecycleContext } from "./types.js";
4
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAC3C,OAAO,EAAE,gBAAgB,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAC3D,YAAY,EACV,cAAc,EACd,UAAU,EACV,oBAAoB,EACpB,YAAY,EACZ,SAAS,EACT,UAAU,EACV,aAAa,EACb,SAAS,EACT,mBAAmB,EACnB,eAAe,EACf,YAAY,EACZ,oBAAoB,EACpB,sBAAsB,EACvB,MAAM,YAAY,CAAC"}
package/dist/index.js ADDED
@@ -0,0 +1,3 @@
1
+ export { LexionEditor } from "./editor.js";
2
+ export { createCoreSchema, coreSchema } from "./schema.js";
3
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAC3C,OAAO,EAAE,gBAAgB,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC"}
@@ -0,0 +1,4 @@
1
+ import { Schema } from "prosemirror-model";
2
+ export declare const createCoreSchema: () => Schema;
3
+ export declare const coreSchema: Schema<any, any>;
4
+ //# sourceMappingURL=schema.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"schema.d.ts","sourceRoot":"","sources":["../src/schema.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAgC,MAAM,mBAAmB,CAAC;AA8BzE,eAAO,MAAM,gBAAgB,QAAO,MAIhC,CAAC;AAEL,eAAO,MAAM,UAAU,kBAAqB,CAAC"}
package/dist/schema.js ADDED
@@ -0,0 +1,33 @@
1
+ import { Schema } from "prosemirror-model";
2
+ const coreNodeSpecs = {
3
+ doc: {
4
+ content: "block+"
5
+ },
6
+ paragraph: {
7
+ group: "block",
8
+ content: "inline*",
9
+ parseDOM: [{ tag: "p" }],
10
+ toDOM() {
11
+ return ["p", 0];
12
+ }
13
+ },
14
+ text: {
15
+ group: "inline"
16
+ },
17
+ hard_break: {
18
+ inline: true,
19
+ group: "inline",
20
+ selectable: false,
21
+ parseDOM: [{ tag: "br" }],
22
+ toDOM() {
23
+ return ["br"];
24
+ }
25
+ }
26
+ };
27
+ const coreMarkSpecs = {};
28
+ export const createCoreSchema = () => new Schema({
29
+ nodes: coreNodeSpecs,
30
+ marks: coreMarkSpecs
31
+ });
32
+ export const coreSchema = createCoreSchema();
33
+ //# sourceMappingURL=schema.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"schema.js","sourceRoot":"","sources":["../src/schema.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAgC,MAAM,mBAAmB,CAAC;AAEzE,MAAM,aAAa,GAA6B;IAC9C,GAAG,EAAE;QACH,OAAO,EAAE,QAAQ;KAClB;IACD,SAAS,EAAE;QACT,KAAK,EAAE,OAAO;QACd,OAAO,EAAE,SAAS;QAClB,QAAQ,EAAE,CAAC,EAAE,GAAG,EAAE,GAAG,EAAE,CAAC;QACxB,KAAK;YACH,OAAO,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC;QAClB,CAAC;KACF;IACD,IAAI,EAAE;QACJ,KAAK,EAAE,QAAQ;KAChB;IACD,UAAU,EAAE;QACV,MAAM,EAAE,IAAI;QACZ,KAAK,EAAE,QAAQ;QACf,UAAU,EAAE,KAAK;QACjB,QAAQ,EAAE,CAAC,EAAE,GAAG,EAAE,IAAI,EAAE,CAAC;QACzB,KAAK;YACH,OAAO,CAAC,IAAI,CAAC,CAAC;QAChB,CAAC;KACF;CACF,CAAC;AAEF,MAAM,aAAa,GAA6B,EAAE,CAAC;AAEnD,MAAM,CAAC,MAAM,gBAAgB,GAAG,GAAW,EAAE,CAC3C,IAAI,MAAM,CAAC;IACT,KAAK,EAAE,aAAa;IACpB,KAAK,EAAE,aAAa;CACrB,CAAC,CAAC;AAEL,MAAM,CAAC,MAAM,UAAU,GAAG,gBAAgB,EAAE,CAAC"}
@@ -0,0 +1,54 @@
1
+ import type { Node as ProseMirrorNode, Schema } from "prosemirror-model";
2
+ import type { Plugin, EditorState, Transaction } from "prosemirror-state";
3
+ export type JSONPrimitive = string | number | boolean | null;
4
+ export type JSONValue = JSONPrimitive | JSONObject | JSONArray;
5
+ export interface JSONObject {
6
+ readonly [key: string]: JSONValue;
7
+ }
8
+ export type JSONArray = readonly JSONValue[];
9
+ export type JSONDocument = JSONObject;
10
+ export interface LexionEditorOptions {
11
+ readonly schema?: Schema;
12
+ readonly doc?: JSONDocument;
13
+ readonly extensions?: readonly LexionExtension[];
14
+ readonly plugins?: readonly LexionPlugin[];
15
+ readonly commands?: CommandMap;
16
+ }
17
+ export interface PluginFactoryContext {
18
+ readonly schema: Schema;
19
+ }
20
+ export interface PluginLifecycleContext extends PluginFactoryContext {
21
+ readonly editor: LexionEditor;
22
+ }
23
+ export interface EditorCommandContext {
24
+ readonly editor: LexionEditor;
25
+ readonly schema: Schema;
26
+ readonly state: EditorState;
27
+ readonly dispatch: (transaction: Transaction) => void;
28
+ }
29
+ export type CommandHandler = (context: EditorCommandContext, ...args: readonly unknown[]) => boolean;
30
+ export type CommandMap = Readonly<Record<string, CommandHandler>>;
31
+ export interface LexionExtension {
32
+ readonly key: string;
33
+ readonly schema?: Schema | (() => Schema);
34
+ readonly prosemirrorPlugins?: (context: PluginFactoryContext) => readonly Plugin[];
35
+ readonly commands?: (context: PluginFactoryContext) => CommandMap;
36
+ readonly onCreate?: (context: PluginLifecycleContext) => void;
37
+ readonly onDestroy?: (context: PluginLifecycleContext) => void;
38
+ }
39
+ export type LexionPlugin = LexionExtension;
40
+ export interface LexionEditor {
41
+ readonly schema: Schema;
42
+ readonly state: EditorState;
43
+ readonly doc: ProseMirrorNode;
44
+ getJSON: () => JSONDocument;
45
+ setJSON: (document: JSONDocument) => void;
46
+ dispatchTransaction: (transaction: Transaction) => void;
47
+ execute: (command: string, ...args: readonly unknown[]) => boolean;
48
+ registerCommand: (name: string, command: CommandHandler) => void;
49
+ unregisterCommand: (name: string) => void;
50
+ use: (extension: LexionExtension) => void;
51
+ removePlugin: (key: string) => void;
52
+ destroy: () => void;
53
+ }
54
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"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"}
package/dist/types.js ADDED
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":""}
package/package.json ADDED
@@ -0,0 +1,43 @@
1
+ {
2
+ "name": "@lexion-rte/core",
3
+ "version": "0.1.0",
4
+ "description": "Headless core runtime for the Lexion editor platform.",
5
+ "private": false,
6
+ "type": "module",
7
+ "main": "./dist/index.js",
8
+ "types": "./dist/index.d.ts",
9
+ "exports": {
10
+ ".": {
11
+ "types": "./dist/index.d.ts",
12
+ "import": "./dist/index.js"
13
+ }
14
+ },
15
+ "license": "GPL-3.0-only",
16
+ "repository": {
17
+ "type": "git",
18
+ "url": "https://github.com/lexion-rte/lexion.git",
19
+ "directory": "packages/core"
20
+ },
21
+ "homepage": "https://github.com/lexion-rte/lexion/tree/main/packages/core",
22
+ "bugs": {
23
+ "url": "https://github.com/lexion-rte/lexion/issues"
24
+ },
25
+ "keywords": [
26
+ "lexion",
27
+ "editor",
28
+ "rich-text",
29
+ "prosemirror",
30
+ "core"
31
+ ],
32
+ "publishConfig": {
33
+ "access": "public"
34
+ },
35
+ "dependencies": {
36
+ "prosemirror-model": "^1.22.3",
37
+ "prosemirror-state": "^1.4.3"
38
+ },
39
+ "scripts": {
40
+ "build": "tsc -p tsconfig.json",
41
+ "lint": "eslint src --ext .ts"
42
+ }
43
+ }
@@ -0,0 +1,33 @@
1
+ import { Node as ProseMirrorNode, type Schema } from "prosemirror-model";
2
+ import { EditorState, type Transaction } from "prosemirror-state";
3
+ import type { CommandHandler, JSONDocument, LexionEditor as LexionEditorContract, LexionEditorOptions, LexionExtension } from "./types.js";
4
+ export declare class LexionEditor implements LexionEditorContract {
5
+ private readonly _schema;
6
+ private _state;
7
+ private readonly commandMap;
8
+ private readonly extensionsByKey;
9
+ private readonly extensionCommandsByKey;
10
+ private destroyed;
11
+ constructor(options?: LexionEditorOptions);
12
+ get schema(): Schema;
13
+ get state(): EditorState;
14
+ get doc(): ProseMirrorNode;
15
+ getJSON(): JSONDocument;
16
+ setJSON(document: JSONDocument): void;
17
+ dispatchTransaction(transaction: Transaction): void;
18
+ execute(command: string, ...args: readonly unknown[]): boolean;
19
+ registerCommand(name: string, command: CommandHandler): void;
20
+ unregisterCommand(name: string): void;
21
+ use(extension: LexionExtension): void;
22
+ removePlugin(key: string): void;
23
+ destroy(): void;
24
+ private assertNotDestroyed;
25
+ private resolveSchema;
26
+ private parseDocument;
27
+ private createState;
28
+ private addExtension;
29
+ private createPluginLifecycleContext;
30
+ private runExtensionOnCreate;
31
+ private registerCommands;
32
+ }
33
+ //# sourceMappingURL=editor.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"editor.d.ts","sourceRoot":"","sources":["editor.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,IAAI,eAAe,EAAE,KAAK,MAAM,EAAE,MAAM,mBAAmB,CAAC;AACzE,OAAO,EAAE,WAAW,EAAe,KAAK,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAG/E,OAAO,KAAK,EACV,cAAc,EAGd,YAAY,EACZ,YAAY,IAAI,oBAAoB,EACpC,mBAAmB,EACnB,eAAe,EAGhB,MAAM,YAAY,CAAC;AAEpB,qBAAa,YAAa,YAAW,oBAAoB;IACvD,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAS;IACjC,OAAO,CAAC,MAAM,CAAc;IAC5B,OAAO,CAAC,QAAQ,CAAC,UAAU,CAA8B;IACzD,OAAO,CAAC,QAAQ,CAAC,eAAe,CAA+B;IAC/D,OAAO,CAAC,QAAQ,CAAC,sBAAsB,CAAiC;IACxE,OAAO,CAAC,SAAS,CAAU;gBAER,OAAO,GAAE,mBAAwB;IAmBpD,IAAW,MAAM,IAAI,MAAM,CAE1B;IAED,IAAW,KAAK,IAAI,WAAW,CAE9B;IAED,IAAW,GAAG,IAAI,eAAe,CAEhC;IAEM,OAAO,IAAI,YAAY;IAIvB,OAAO,CAAC,QAAQ,EAAE,YAAY,GAAG,IAAI;IAMrC,mBAAmB,CAAC,WAAW,EAAE,WAAW,GAAG,IAAI;IAKnD,OAAO,CAAC,OAAO,EAAE,MAAM,EAAE,GAAG,IAAI,EAAE,SAAS,OAAO,EAAE,GAAG,OAAO;IAmB9D,eAAe,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,cAAc,GAAG,IAAI;IAQ5D,iBAAiB,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI;IAKrC,GAAG,CAAC,SAAS,EAAE,eAAe,GAAG,IAAI;IAOrC,YAAY,CAAC,GAAG,EAAE,MAAM,GAAG,IAAI;IAmB/B,OAAO,IAAI,IAAI;IAgBtB,OAAO,CAAC,kBAAkB;IAM1B,OAAO,CAAC,aAAa;IAyBrB,OAAO,CAAC,aAAa;IAIrB,OAAO,CAAC,WAAW;IAwBnB,OAAO,CAAC,YAAY;IAoBpB,OAAO,CAAC,4BAA4B;IAOpC,OAAO,CAAC,oBAAoB;IAO5B,OAAO,CAAC,gBAAgB;CAKzB"}
package/src/editor.js ADDED
@@ -0,0 +1,187 @@
1
+ import { Node as ProseMirrorNode } from "prosemirror-model";
2
+ import { EditorState } from "prosemirror-state";
3
+ import { coreSchema } from "./schema.js";
4
+ export class LexionEditor {
5
+ _schema;
6
+ _state;
7
+ commandMap;
8
+ extensionsByKey;
9
+ extensionCommandsByKey;
10
+ destroyed;
11
+ constructor(options = {}) {
12
+ const optionsExtensions = options.extensions ?? options.plugins ?? [];
13
+ this._schema = this.resolveSchema(options.schema, optionsExtensions);
14
+ this.commandMap = new Map();
15
+ this.extensionsByKey = new Map();
16
+ this.extensionCommandsByKey = new Map();
17
+ this.destroyed = false;
18
+ this.registerCommands(options.commands ?? {});
19
+ for (const extension of optionsExtensions) {
20
+ this.addExtension(extension);
21
+ }
22
+ const initialDoc = options.doc ? this.parseDocument(options.doc) : undefined;
23
+ this._state = this.createState(initialDoc);
24
+ this.runExtensionOnCreate();
25
+ }
26
+ get schema() {
27
+ return this._schema;
28
+ }
29
+ get state() {
30
+ return this._state;
31
+ }
32
+ get doc() {
33
+ return this._state.doc;
34
+ }
35
+ getJSON() {
36
+ return this._state.doc.toJSON();
37
+ }
38
+ setJSON(document) {
39
+ this.assertNotDestroyed();
40
+ const nextDocument = this.parseDocument(document);
41
+ this._state = this.createState(nextDocument);
42
+ }
43
+ dispatchTransaction(transaction) {
44
+ this.assertNotDestroyed();
45
+ this._state = this._state.apply(transaction);
46
+ }
47
+ execute(command, ...args) {
48
+ this.assertNotDestroyed();
49
+ const handler = this.commandMap.get(command);
50
+ if (!handler) {
51
+ throw new Error(`Unknown command: ${command}`);
52
+ }
53
+ const context = {
54
+ editor: this,
55
+ schema: this._schema,
56
+ state: this._state,
57
+ dispatch: (transaction) => {
58
+ this.dispatchTransaction(transaction);
59
+ }
60
+ };
61
+ return handler(context, ...args);
62
+ }
63
+ registerCommand(name, command) {
64
+ this.assertNotDestroyed();
65
+ if (this.commandMap.has(name)) {
66
+ throw new Error(`Command already registered: ${name}`);
67
+ }
68
+ this.commandMap.set(name, command);
69
+ }
70
+ unregisterCommand(name) {
71
+ this.assertNotDestroyed();
72
+ this.commandMap.delete(name);
73
+ }
74
+ use(extension) {
75
+ this.assertNotDestroyed();
76
+ this.addExtension(extension);
77
+ this._state = this.createState(this._state.doc);
78
+ this.runExtensionOnCreate([extension]);
79
+ }
80
+ removePlugin(key) {
81
+ this.assertNotDestroyed();
82
+ const extension = this.extensionsByKey.get(key);
83
+ if (!extension) {
84
+ return;
85
+ }
86
+ const lifecycleContext = this.createPluginLifecycleContext();
87
+ extension.onDestroy?.(lifecycleContext);
88
+ for (const commandName of this.extensionCommandsByKey.get(key) ?? []) {
89
+ this.commandMap.delete(commandName);
90
+ }
91
+ this.extensionCommandsByKey.delete(key);
92
+ this.extensionsByKey.delete(key);
93
+ this._state = this.createState(this._state.doc);
94
+ }
95
+ destroy() {
96
+ if (this.destroyed) {
97
+ return;
98
+ }
99
+ const lifecycleContext = this.createPluginLifecycleContext();
100
+ for (const extension of [...this.extensionsByKey.values()].reverse()) {
101
+ extension.onDestroy?.(lifecycleContext);
102
+ }
103
+ this.commandMap.clear();
104
+ this.extensionCommandsByKey.clear();
105
+ this.extensionsByKey.clear();
106
+ this.destroyed = true;
107
+ }
108
+ assertNotDestroyed() {
109
+ if (this.destroyed) {
110
+ throw new Error("LexionEditor instance has been destroyed");
111
+ }
112
+ }
113
+ resolveSchema(explicitSchema, extensions) {
114
+ if (explicitSchema) {
115
+ return explicitSchema;
116
+ }
117
+ const schemaCandidates = [];
118
+ for (const extension of extensions) {
119
+ if (!extension.schema) {
120
+ continue;
121
+ }
122
+ const schema = typeof extension.schema === "function" ? extension.schema() : extension.schema;
123
+ schemaCandidates.push(schema);
124
+ }
125
+ if (schemaCandidates.length > 1) {
126
+ throw new Error("Only one schema provider extension is supported per editor instance");
127
+ }
128
+ return schemaCandidates[0] ?? coreSchema;
129
+ }
130
+ parseDocument(document) {
131
+ return ProseMirrorNode.fromJSON(this._schema, document);
132
+ }
133
+ createState(document) {
134
+ const pluginContext = { schema: this._schema };
135
+ const plugins = [];
136
+ for (const extension of this.extensionsByKey.values()) {
137
+ for (const prosemirrorPlugin of extension.prosemirrorPlugins?.(pluginContext) ?? []) {
138
+ plugins.push(prosemirrorPlugin);
139
+ }
140
+ }
141
+ const config = document
142
+ ? {
143
+ schema: this._schema,
144
+ doc: document,
145
+ plugins
146
+ }
147
+ : {
148
+ schema: this._schema,
149
+ plugins
150
+ };
151
+ return EditorState.create(config);
152
+ }
153
+ addExtension(extension) {
154
+ if (this.extensionsByKey.has(extension.key)) {
155
+ throw new Error(`Extension already registered: ${extension.key}`);
156
+ }
157
+ this.extensionsByKey.set(extension.key, extension);
158
+ const commandNames = [];
159
+ const extensionCommands = extension.commands?.({ schema: this._schema }) ?? {};
160
+ for (const [name, handler] of Object.entries(extensionCommands)) {
161
+ if (this.commandMap.has(name)) {
162
+ throw new Error(`Command already registered: ${name}`);
163
+ }
164
+ this.commandMap.set(name, handler);
165
+ commandNames.push(name);
166
+ }
167
+ this.extensionCommandsByKey.set(extension.key, commandNames);
168
+ }
169
+ createPluginLifecycleContext() {
170
+ return {
171
+ editor: this,
172
+ schema: this._schema
173
+ };
174
+ }
175
+ runExtensionOnCreate(extensions) {
176
+ const lifecycleContext = this.createPluginLifecycleContext();
177
+ for (const extension of extensions ?? this.extensionsByKey.values()) {
178
+ extension.onCreate?.(lifecycleContext);
179
+ }
180
+ }
181
+ registerCommands(commands) {
182
+ for (const [name, command] of Object.entries(commands)) {
183
+ this.registerCommand(name, command);
184
+ }
185
+ }
186
+ }
187
+ //# sourceMappingURL=editor.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"editor.js","sourceRoot":"","sources":["editor.ts"],"names":[],"mappings":"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"}