@coze-editor/core 0.1.0-alpha.09ffeb

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.
package/LICENSE ADDED
@@ -0,0 +1,21 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2025 coze-dev
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.
@@ -0,0 +1,423 @@
1
+ // src/editor.ts
2
+ import mitt from "mitt";
3
+ import { EditorView as EditorView3 } from "@codemirror/view";
4
+ import { EditorState } from "@codemirror/state";
5
+
6
+ // src/plugins.ts
7
+ import { EditorView } from "@codemirror/view";
8
+
9
+ // src/spec.ts
10
+ var EVENT_SILENT = Symbol("event/silent");
11
+ function option(name, handler) {
12
+ return {
13
+ type: "option",
14
+ name,
15
+ handler
16
+ };
17
+ }
18
+ function api(name, handler) {
19
+ return {
20
+ type: "api",
21
+ name,
22
+ handler
23
+ };
24
+ }
25
+ function event(name, handler) {
26
+ return {
27
+ type: "event",
28
+ name,
29
+ handler
30
+ };
31
+ }
32
+ function domEventHandler(name) {
33
+ return {
34
+ type: "domEventHandler",
35
+ name
36
+ };
37
+ }
38
+ function extension(ext) {
39
+ return {
40
+ type: "extension",
41
+ extension: ext
42
+ };
43
+ }
44
+
45
+ // src/options.ts
46
+ import {
47
+ Compartment
48
+ } from "@codemirror/state";
49
+ var OptionHandler = class {
50
+ constructor(fn) {
51
+ this.fn = fn;
52
+ }
53
+ compartment = new Compartment();
54
+ extension;
55
+ value;
56
+ init(value) {
57
+ this.value = value;
58
+ const extension2 = this.fn(value);
59
+ return this.compartment.of(extension2 ?? []);
60
+ }
61
+ set(value) {
62
+ if (value === this.value) {
63
+ return;
64
+ }
65
+ this.value = value;
66
+ const extension2 = this.fn(value);
67
+ return this.compartment.reconfigure(extension2 ?? []);
68
+ }
69
+ };
70
+ var Options = class {
71
+ cachedValues = /* @__PURE__ */ Object.create(null);
72
+ handlers = /* @__PURE__ */ Object.create(null);
73
+ add(name, handler) {
74
+ this.handlers[name] = this.handlers[name] ?? [];
75
+ this.handlers[name].push(handler);
76
+ }
77
+ init(values) {
78
+ const extensions = [];
79
+ Object.keys(this.handlers).map((key) => {
80
+ const value = values[key];
81
+ this.cachedValues[key] = value;
82
+ const hs = this.handlers[key];
83
+ if (hs) {
84
+ hs.forEach((h) => {
85
+ const extension2 = h.init(value);
86
+ if (extension2) {
87
+ extensions.push(extension2);
88
+ }
89
+ });
90
+ }
91
+ });
92
+ return extensions;
93
+ }
94
+ get(key) {
95
+ return this.cachedValues[key];
96
+ }
97
+ set(values) {
98
+ const effects = [];
99
+ Object.keys(values).map((key) => {
100
+ const value = values[key];
101
+ this.cachedValues[key] = value;
102
+ const hs = this.handlers[key];
103
+ if (hs) {
104
+ hs.forEach((h) => {
105
+ const effect = h.set(value);
106
+ if (effect) {
107
+ effects.push(effect);
108
+ }
109
+ });
110
+ }
111
+ });
112
+ return effects;
113
+ }
114
+ };
115
+
116
+ // src/plugins.ts
117
+ var optionPlugin = (spec) => ({
118
+ apply(ctx) {
119
+ ctx.hooks.setupOption.tap("option", (params) => {
120
+ const { key, options } = params;
121
+ if (key === spec.name) {
122
+ options.add(spec.name, new OptionHandler(spec.handler));
123
+ }
124
+ });
125
+ }
126
+ });
127
+ var apiPlugin = (spec) => ({
128
+ apply(ctx) {
129
+ ctx.hooks.extendAPI.tap("api", (params) => {
130
+ const { context, api: api2 } = params;
131
+ const method = spec.handler(context);
132
+ api2[spec.name] = method;
133
+ });
134
+ }
135
+ });
136
+ var eventPlugin = (spec) => ({
137
+ apply(ctx) {
138
+ ctx.hooks.addExtension.tap("event", (params) => {
139
+ const { events, extensions } = params;
140
+ extensions.push(
141
+ EditorView.updateListener.of((update) => {
142
+ const result = spec.handler(update);
143
+ if (result !== EVENT_SILENT) {
144
+ events.emit(spec.name, result);
145
+ }
146
+ })
147
+ );
148
+ });
149
+ }
150
+ });
151
+ var domEventHandlerPlugin = (spec) => ({
152
+ apply(ctx) {
153
+ ctx.hooks.addExtension.tap("domEventHandler", (params) => {
154
+ const { events, extensions } = params;
155
+ extensions.push(
156
+ EditorView.domEventHandlers({
157
+ [spec.name]: (e) => {
158
+ events.emit(spec.name, e);
159
+ }
160
+ })
161
+ );
162
+ });
163
+ }
164
+ });
165
+ var extensionPlugin = (spec) => ({
166
+ apply(ctx) {
167
+ ctx.hooks.addExtension.tap("extension", (params) => {
168
+ const { extensions } = params;
169
+ extensions.push(spec.extension);
170
+ });
171
+ }
172
+ });
173
+
174
+ // src/injector.ts
175
+ import { Compartment as Compartment2 } from "@codemirror/state";
176
+ var InjectPosition = /* @__PURE__ */ ((InjectPosition2) => {
177
+ InjectPosition2["Head"] = "head";
178
+ InjectPosition2["Tail"] = "tail";
179
+ return InjectPosition2;
180
+ })(InjectPosition || {});
181
+ function createInjector() {
182
+ const headCompartment = new Compartment2();
183
+ const tailCompartment = new Compartment2();
184
+ const headExtensions = [];
185
+ const tailExtensions = [];
186
+ return {
187
+ view: null,
188
+ provideView(view) {
189
+ this.view = view;
190
+ },
191
+ inject(extension2, position = "tail" /* Tail */) {
192
+ const compartment = position === "head" /* Head */ ? headCompartment : tailCompartment;
193
+ const extensions = position === "head" /* Head */ ? headExtensions : tailExtensions;
194
+ extensions.push(extension2);
195
+ queueMicrotask(() => {
196
+ if (this.view) {
197
+ this.view.dispatch({
198
+ effects: compartment.reconfigure(extensions)
199
+ });
200
+ }
201
+ });
202
+ return () => {
203
+ const index = extensions.indexOf(extension2);
204
+ if (~index) {
205
+ extensions.splice(index, 1);
206
+ }
207
+ queueMicrotask(() => {
208
+ if (this.view) {
209
+ this.view.dispatch({
210
+ effects: compartment.reconfigure(extensions)
211
+ });
212
+ }
213
+ });
214
+ };
215
+ },
216
+ // @internal
217
+ getCompartment(position) {
218
+ return position === "head" /* Head */ ? headCompartment.of(headExtensions) : tailCompartment.of(tailExtensions);
219
+ }
220
+ // setTransactionsHandler(handler) {
221
+ // if (typeof handler === 'function') {
222
+ // transactionsHandlers.push(handler)
223
+ // }
224
+ // return () => {
225
+ // const index = transactionsHandlers.indexOf(handler)
226
+ // if (~index) {
227
+ // transactionsHandlers.splice(index, 1)
228
+ // }
229
+ // }
230
+ // },
231
+ // getTransactionsHandler() {
232
+ // return transactionsHandlers[transactionsHandlers.length - 1]
233
+ // },
234
+ // for fields export
235
+ // exportField(field) {
236
+ // return {
237
+ // as(name: string) {
238
+ // toJSONConfig[name] = field;
239
+ // }
240
+ // }
241
+ // },
242
+ // getExportFieldsConfig() {
243
+ // return toJSONConfig;
244
+ // },
245
+ };
246
+ }
247
+
248
+ // src/hook.ts
249
+ var SyncHook = class {
250
+ #fns = [];
251
+ tap(id, hookFn) {
252
+ this.#fns.push([id, hookFn]);
253
+ }
254
+ call(...args) {
255
+ const fns = this.#fns;
256
+ fns.forEach((item) => {
257
+ const fn = item[1];
258
+ if (typeof fn === "function") {
259
+ fn(...args);
260
+ }
261
+ });
262
+ }
263
+ };
264
+ function createSyncHook() {
265
+ return new SyncHook();
266
+ }
267
+
268
+ // src/disable-edit-context.ts
269
+ import { EditorView as EditorView2 } from "@codemirror/view";
270
+ function disableEditContext() {
271
+ EditorView2.EDIT_CONTEXT = false;
272
+ }
273
+
274
+ // src/editor.ts
275
+ disableEditContext();
276
+ function create({
277
+ plugins,
278
+ injector = createInjector()
279
+ }) {
280
+ const hooks = {
281
+ extendAPI: createSyncHook(),
282
+ setupOption: createSyncHook(),
283
+ addExtension: createSyncHook()
284
+ };
285
+ const ctx = { hooks };
286
+ const optionKeys = [];
287
+ const eventKeys = [];
288
+ plugins.forEach((plugin) => {
289
+ switch (plugin.type) {
290
+ case "option":
291
+ optionKeys.push(plugin.name);
292
+ optionPlugin(plugin).apply(ctx);
293
+ break;
294
+ case "api":
295
+ apiPlugin(plugin).apply(ctx);
296
+ break;
297
+ case "event":
298
+ eventKeys.push(plugin.name);
299
+ eventPlugin(plugin).apply(ctx);
300
+ break;
301
+ case "domEventHandler":
302
+ eventKeys.push(plugin.name);
303
+ domEventHandlerPlugin(plugin).apply(ctx);
304
+ break;
305
+ case "extension":
306
+ extensionPlugin(plugin).apply(ctx);
307
+ break;
308
+ }
309
+ });
310
+ function getExtensions(values, {
311
+ options,
312
+ events
313
+ }) {
314
+ optionKeys.forEach((key) => {
315
+ hooks.setupOption.call({
316
+ key,
317
+ options
318
+ });
319
+ });
320
+ const extensions = [];
321
+ hooks.addExtension.call({
322
+ events,
323
+ extensions
324
+ });
325
+ return [
326
+ injector.getCompartment("head" /* Head */),
327
+ ...options.init(values),
328
+ ...extensions,
329
+ injector.getCompartment("tail" /* Tail */)
330
+ ];
331
+ }
332
+ function createOptions() {
333
+ return new Options();
334
+ }
335
+ function createEvents() {
336
+ return mitt();
337
+ }
338
+ function createAPI({
339
+ view,
340
+ options,
341
+ events
342
+ }) {
343
+ function setOptions(optValues) {
344
+ const effects = options.set(optValues);
345
+ if (effects.length === 0) {
346
+ return;
347
+ }
348
+ view.dispatch({ effects });
349
+ }
350
+ function getOption(key) {
351
+ return options.get(key);
352
+ }
353
+ const context = {
354
+ view,
355
+ set: setOptions,
356
+ get: getOption
357
+ };
358
+ const api2 = /* @__PURE__ */ Object.create(null);
359
+ hooks.extendAPI.call({
360
+ context,
361
+ api: api2
362
+ });
363
+ api2.$view = view;
364
+ api2.$on = events.on.bind(events);
365
+ api2.$off = events.off.bind(events);
366
+ api2.$get = getOption;
367
+ api2.$set = setOptions;
368
+ api2.$inject = injector.inject.bind(injector);
369
+ api2.$destroy = () => {
370
+ view.destroy();
371
+ events.off("*");
372
+ };
373
+ return api2;
374
+ }
375
+ function render(opts) {
376
+ const { parent, root, defaultValue } = opts;
377
+ let { extensions: userExtensions } = opts;
378
+ if (!Array.isArray(userExtensions)) {
379
+ userExtensions = [];
380
+ }
381
+ const options = createOptions();
382
+ const events = createEvents();
383
+ const extensions = getExtensions(opts.options, {
384
+ options,
385
+ events
386
+ });
387
+ const view = new EditorView3({
388
+ parent,
389
+ root,
390
+ state: EditorState.create({
391
+ doc: defaultValue ?? "",
392
+ extensions: [...extensions, ...userExtensions]
393
+ })
394
+ });
395
+ injector.provideView(view);
396
+ const api2 = createAPI({
397
+ view,
398
+ options,
399
+ events
400
+ });
401
+ return api2;
402
+ }
403
+ return {
404
+ render,
405
+ getExtensions,
406
+ createAPI,
407
+ createOptions,
408
+ createEvents,
409
+ eventKeys
410
+ };
411
+ }
412
+ export {
413
+ EVENT_SILENT,
414
+ InjectPosition,
415
+ api,
416
+ create,
417
+ createInjector,
418
+ domEventHandler,
419
+ event,
420
+ extension,
421
+ option
422
+ };
423
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../src/editor.ts","../../src/plugins.ts","../../src/spec.ts","../../src/options.ts","../../src/injector.ts","../../src/hook.ts","../../src/disable-edit-context.ts"],"sourcesContent":["/* eslint-disable max-lines-per-function */\n// Copyright (c) 2025 coze-dev\n// SPDX-License-Identifier: MIT\n\n/* eslint-disable @typescript-eslint/no-explicit-any */\nimport mitt, { type EventType, type Emitter } from 'mitt';\nimport { EditorView } from '@codemirror/view';\nimport { EditorState, type Extension } from '@codemirror/state';\n\nimport {\n type EditorPluginSpec,\n type InferValues,\n type InferEvents,\n type InferAPI,\n} from './spec';\nimport {\n apiPlugin,\n domEventHandlerPlugin,\n eventPlugin,\n extensionPlugin,\n optionPlugin,\n} from './plugins';\nimport { Options } from './options';\nimport { InjectPosition, type Injector, createInjector } from './injector';\nimport { createSyncHook } from './hook';\nimport { disableEditContext } from './disable-edit-context';\n\ndisableEditContext();\n\n// eslint-disable-next-line @typescript-eslint/no-unused-vars\ninterface EditorOptions<T, U> {\n parent: HTMLElement;\n root?: Document | ShadowRoot;\n defaultValue?: string;\n options: T;\n extensions?: Extension[];\n}\n\ntype InferOnOff<Events> = <K extends keyof Events>(\n eventName: K,\n handler: (params: Events[K]) => void,\n) => void;\n\ntype InferEventMap<Events> = {\n [K in keyof Events]: (params: Events[K]) => void;\n};\n\ntype InferGet<Values> = <K extends keyof Values>(\n key: K,\n) => Values[K] | undefined;\n\ntype InferSet<Values> = (values: Values) => void;\n\ninterface InitOptionHookParams {\n key: string;\n options: Options;\n}\n\ninterface ExtendAPIHookParams<Values> {\n context: {\n view: EditorView;\n get: (key: keyof Values) => Values[keyof Values];\n set: (values: Values) => void;\n };\n}\n\ninterface AddExtensionHookParams {\n events: Emitter<any>;\n extensions: Extension[];\n}\n\ninterface BuiltinEditorAPI {\n $view: EditorView;\n $on: (name: string, handler: Function) => void;\n $off: (name: string, handler: Function) => void;\n $get: (key: string) => unknown;\n $set: (key: string, value: unknown) => void;\n $destroy: () => void;\n $inject: (extension: Extension, position?: InjectPosition) => () => void;\n}\n\ntype InferEditorAPIFromPlugins<\n T extends EditorPluginSpec<string, any, any>[],\n Events = InferEvents<T[number]>,\n AllValues = InferValues<T[number]>,\n Values = Partial<AllValues>,\n> = InferAPI<T[number]> & { $on: InferOnOff<Events> } & {\n $off: InferOnOff<Events>;\n} & { $get: InferGet<AllValues> } & { $set: InferSet<Values> } & Pick<\n BuiltinEditorAPI,\n '$view' | '$destroy' | '$inject'\n > & { __private_eventmap: InferEventMap<Events> };\n\nfunction create<T extends EditorPluginSpec<string, any, any>[]>({\n plugins,\n injector = createInjector(),\n}: {\n plugins: T;\n injector?: Injector;\n}) {\n type AllValues = InferValues<T[number]>;\n type Values = Partial<AllValues>;\n type Events = InferEvents<T[number]>;\n type API = InferEditorAPIFromPlugins<T>;\n\n const hooks = {\n extendAPI: createSyncHook<ExtendAPIHookParams<Values>>(),\n setupOption: createSyncHook<InitOptionHookParams>(),\n addExtension: createSyncHook<AddExtensionHookParams>(),\n };\n\n const ctx = { hooks };\n\n const optionKeys: string[] = [];\n const eventKeys: string[] = [];\n plugins.forEach(plugin => {\n switch (plugin.type) {\n case 'option':\n optionKeys.push(plugin.name);\n optionPlugin(plugin).apply(ctx);\n break;\n case 'api':\n apiPlugin(plugin).apply(ctx);\n break;\n case 'event':\n eventKeys.push(plugin.name);\n eventPlugin(plugin).apply(ctx);\n break;\n case 'domEventHandler':\n eventKeys.push(plugin.name);\n domEventHandlerPlugin(plugin).apply(ctx);\n break;\n case 'extension':\n extensionPlugin(plugin).apply(ctx);\n break;\n }\n });\n\n function getExtensions(\n values: EditorOptions<Values, Events>['options'],\n {\n options,\n events,\n }: {\n options: Options;\n events: Emitter<Record<string, unknown>>;\n },\n ): Extension[] {\n optionKeys.forEach(key => {\n hooks.setupOption.call({\n key,\n options,\n });\n });\n\n const extensions: Extension[] = [];\n hooks.addExtension.call({\n events,\n extensions,\n });\n\n return [\n injector.getCompartment(InjectPosition.Head),\n ...options.init(values),\n ...extensions,\n injector.getCompartment(InjectPosition.Tail),\n ];\n }\n\n function createOptions() {\n return new Options();\n }\n\n function createEvents() {\n return mitt();\n }\n\n function createAPI({\n view,\n options,\n events,\n }: {\n view: EditorView;\n options: Options;\n events: Emitter<Record<EventType, unknown>>;\n }): API {\n function setOptions(optValues: Values) {\n const effects = options.set(optValues);\n // values unchanged\n if (effects.length === 0) {\n return;\n }\n view.dispatch({ effects });\n }\n\n function getOption<K extends keyof AllValues>(key: K): AllValues[K] {\n return options.get(key);\n }\n\n const context = {\n view,\n set: setOptions,\n get: getOption,\n };\n\n const api: API = Object.create(null);\n\n hooks.extendAPI.call({\n context,\n api,\n });\n\n api.$view = view;\n api.$on = events.on.bind(events);\n api.$off = events.off.bind(events);\n api.$get = getOption;\n api.$set = setOptions;\n api.$inject = injector.inject.bind(injector);\n api.$destroy = () => {\n view.destroy();\n events.off('*');\n };\n\n return api;\n }\n\n function render(opts: EditorOptions<Values, Events>): API {\n const { parent, root, defaultValue } = opts;\n let { extensions: userExtensions } = opts;\n\n if (!Array.isArray(userExtensions)) {\n userExtensions = [];\n }\n\n const options = createOptions();\n const events = createEvents();\n\n const extensions = getExtensions(opts.options, {\n options,\n events,\n });\n\n const view = new EditorView({\n parent,\n root,\n state: EditorState.create({\n doc: defaultValue ?? '',\n extensions: [...extensions, ...userExtensions],\n }),\n });\n\n injector.provideView(view);\n\n const api = createAPI({\n view,\n options,\n events,\n });\n\n return api;\n }\n\n return {\n render,\n getExtensions,\n createAPI,\n createOptions,\n createEvents,\n eventKeys,\n };\n}\n\nexport { create };\n\nexport type {\n EditorOptions,\n BuiltinEditorAPI,\n InferValues,\n InferEditorAPIFromPlugins,\n};\n","// Copyright (c) 2025 coze-dev\n// SPDX-License-Identifier: MIT\n\n/* eslint-disable @typescript-eslint/no-explicit-any */\nimport { EditorView } from '@codemirror/view';\n\nimport { EVENT_SILENT } from './spec';\nimport type {\n OptionPluginSpec,\n APIPluginSpec,\n EventPluginSpec,\n ExtensionPluginSpec,\n DOMEventHandlerPluginSpec,\n} from './spec';\nimport { OptionHandler } from './options';\n\nconst optionPlugin = (spec: OptionPluginSpec<string, any>) => ({\n apply(ctx: any) {\n ctx.hooks.setupOption.tap('option', (params: any) => {\n const { key, options } = params;\n if (key === spec.name) {\n options.add(spec.name, new OptionHandler(spec.handler));\n }\n });\n },\n});\n\nconst apiPlugin = (spec: APIPluginSpec<string, any>) => ({\n apply(ctx: any) {\n ctx.hooks.extendAPI.tap('api', (params: any) => {\n const { context, api } = params;\n const method = spec.handler(context);\n api[spec.name] = method;\n });\n },\n});\n\nconst eventPlugin = (spec: EventPluginSpec<string, any>) => ({\n apply(ctx: any) {\n ctx.hooks.addExtension.tap('event', (params: any) => {\n const { events, extensions } = params;\n extensions.push(\n EditorView.updateListener.of(update => {\n const result = spec.handler(update);\n if (result !== EVENT_SILENT) {\n events.emit(spec.name, result);\n }\n }),\n );\n });\n },\n});\n\nconst domEventHandlerPlugin = (spec: DOMEventHandlerPluginSpec<string>) => ({\n apply(ctx: any) {\n ctx.hooks.addExtension.tap('domEventHandler', (params: any) => {\n const { events, extensions } = params;\n extensions.push(\n EditorView.domEventHandlers({\n [spec.name]: e => {\n events.emit(spec.name, e);\n },\n }),\n );\n });\n },\n});\n\nconst extensionPlugin = (spec: ExtensionPluginSpec) => ({\n apply(ctx: any) {\n ctx.hooks.addExtension.tap('extension', (params: any) => {\n const { extensions } = params;\n extensions.push(spec.extension);\n });\n },\n});\n\nexport {\n optionPlugin,\n apiPlugin,\n eventPlugin,\n domEventHandlerPlugin,\n extensionPlugin,\n};\n","// Copyright (c) 2025 coze-dev\n// SPDX-License-Identifier: MIT\n\n/* eslint-disable @typescript-eslint/no-explicit-any */\nimport { type EditorView, type ViewUpdate } from '@codemirror/view';\nimport { type Extension } from '@codemirror/state';\n\nconst EVENT_SILENT = Symbol('event/silent');\n\ninterface APIContext {\n view: EditorView;\n get: (key: string) => unknown;\n set: (values: Record<string, unknown>) => void;\n}\n\ninterface APIPluginSpec<\n Name extends string,\n Params extends any[],\n ReturnValue = unknown,\n> {\n type: 'api';\n name: Name;\n handler: (context: APIContext) => (...params: Params) => ReturnValue;\n}\n\ninterface OptionPluginSpec<Name extends string, Value = unknown> {\n type: 'option';\n name: Name;\n handler: (value: Value) => Extension | undefined;\n}\n\ninterface EventPluginSpec<Name extends string, Value = unknown> {\n type: 'event';\n name: Name;\n handler: (update: ViewUpdate) => Value | typeof EVENT_SILENT;\n}\n\ninterface DOMEventHandlerPluginSpec<T extends string> {\n type: 'domEventHandler';\n name: T;\n}\n\ninterface ExtensionPluginSpec {\n type: 'extension';\n extension: Extension;\n}\n\ntype EditorPluginSpec<T extends string, U extends any[], V> =\n | APIPluginSpec<T, U, V>\n | OptionPluginSpec<T, U>\n | EventPluginSpec<T, U>\n | DOMEventHandlerPluginSpec<T>\n | ExtensionPluginSpec;\n\nfunction option<Name extends string, Value>(\n name: Name,\n handler: (value: Value) => Extension,\n): OptionPluginSpec<Name, Value> {\n return {\n type: 'option',\n name,\n handler,\n };\n}\n\nfunction api<Name extends string, Params extends any[], ReturnValue>(\n name: Name,\n handler: (context: APIContext) => (...params: Params) => ReturnValue,\n): APIPluginSpec<Name, Params, ReturnValue> {\n return {\n type: 'api',\n name,\n handler,\n };\n}\n\nfunction event<Name extends string, Params>(\n name: Name,\n handler: (update: ViewUpdate) => Params | typeof EVENT_SILENT,\n): EventPluginSpec<Name, Params> {\n return {\n type: 'event',\n name,\n handler,\n };\n}\n\nfunction domEventHandler<Name extends keyof HTMLElementEventMap>(\n name: Name,\n): DOMEventHandlerPluginSpec<Name> {\n return {\n type: 'domEventHandler',\n name,\n };\n}\n\nfunction extension(ext: Extension): ExtensionPluginSpec {\n return {\n type: 'extension',\n extension: ext,\n };\n}\n\ntype UnionToIntersection<U> = (U extends any ? (k: U) => void : never) extends (\n k: infer I,\n) => void\n ? I\n : never;\n\ntype InferValues<Plugin extends EditorPluginSpec<string, any, any>> =\n UnionToIntersection<\n Plugin extends OptionPluginSpec<infer Name, infer Value>\n ? { [K in Name]: Value }\n : never\n >;\n\ntype InferAPI<Plugin extends EditorPluginSpec<string, any, any>> =\n UnionToIntersection<\n Plugin extends APIPluginSpec<infer Name, infer Params, infer ReturnValue>\n ? { [K in Name]: (...params: Params) => ReturnValue }\n : never\n >;\n\ntype InferEvents<Plugin extends EditorPluginSpec<string, any, any>> =\n UnionToIntersection<\n Plugin extends EventPluginSpec<infer Name, infer Params>\n ? { [K in Name]: Params }\n : Plugin extends DOMEventHandlerPluginSpec<infer Name>\n ? Name extends keyof HTMLElementEventMap\n ? { [K in Name]: HTMLElementEventMap[Name] }\n : { [K in Name]: unknown }\n : never\n >;\n\ninterface Core {\n API: typeof api;\n Extesion: typeof extension;\n Event: typeof event;\n Option: typeof option;\n}\n\nexport { option, api, event, domEventHandler, extension, EVENT_SILENT };\n\nexport type {\n EditorPluginSpec,\n OptionPluginSpec,\n APIPluginSpec,\n EventPluginSpec,\n DOMEventHandlerPluginSpec,\n ExtensionPluginSpec,\n APIContext,\n InferValues,\n InferAPI,\n InferEvents,\n Core,\n};\n","// Copyright (c) 2025 coze-dev\n// SPDX-License-Identifier: MIT\n\nimport {\n Compartment,\n type Extension,\n type StateEffect,\n} from '@codemirror/state';\n\ntype OptionFunction<T = unknown> = (value: T) => Extension | undefined;\n\nclass OptionHandler<Value = unknown> {\n private compartment: Compartment = new Compartment();\n public extension: Extension | undefined;\n public value: Value | undefined;\n\n constructor(public fn: OptionFunction) {}\n\n init(value: Value): Extension {\n this.value = value;\n const extension = this.fn(value);\n return this.compartment.of(extension ?? []);\n }\n\n set(value: Value): StateEffect<unknown> | undefined {\n if (value === this.value) {\n return;\n }\n\n this.value = value;\n const extension = this.fn(value);\n return this.compartment.reconfigure(extension ?? []);\n }\n}\n\nclass Options {\n cachedValues = Object.create(null);\n handlers: Record<string, OptionHandler[]> = Object.create(null);\n\n add(name: string, handler: OptionHandler) {\n this.handlers[name] = this.handlers[name] ?? [];\n this.handlers[name].push(handler);\n }\n\n init(values: Record<string, unknown>): Extension[] {\n const extensions: Extension[] = [];\n\n Object.keys(this.handlers).map(key => {\n const value = values[key];\n\n this.cachedValues[key] = value;\n\n const hs = this.handlers[key];\n if (hs) {\n hs.forEach(h => {\n const extension = h.init(value);\n if (extension) {\n extensions.push(extension);\n }\n });\n }\n });\n\n return extensions;\n }\n\n get<T = unknown>(key: string | number | symbol): T {\n return this.cachedValues[key];\n }\n\n set(values: Record<string, unknown>): StateEffect<unknown>[] {\n const effects: StateEffect<unknown>[] = [];\n\n Object.keys(values).map(key => {\n const value = values[key];\n\n this.cachedValues[key] = value;\n\n const hs = this.handlers[key];\n if (hs) {\n hs.forEach(h => {\n const effect = h.set(value);\n if (effect) {\n effects.push(effect);\n }\n });\n }\n });\n\n return effects;\n }\n}\n\nexport { Options, OptionHandler };\n\nexport type { OptionFunction };\n","// Copyright (c) 2025 coze-dev\n// SPDX-License-Identifier: MIT\n\nimport { type EditorView } from '@codemirror/view';\nimport { Compartment, type Extension } from '@codemirror/state';\n\nenum InjectPosition {\n Head = 'head',\n Tail = 'tail',\n}\n\n// type Plugin = EditorPluginSpec<string, any, any>[]\n// type TransactionsHandler = (trs: readonly Transaction[], view: EditorView) => void;\ntype Eject = () => void;\ninterface Injector {\n view: EditorView | null;\n provideView: (view: EditorView) => void;\n inject: (extension: Extension, position?: InjectPosition) => Eject;\n getCompartment: (position: InjectPosition) => Extension;\n // exportField: (field: StateField<any>) => ({ as: (name: string) => void });\n // getExportFieldsConfig: () => Record<string, StateField<any>>;\n // setTransactionsHandler(handler: TransactionsHandler): void;\n // getTransactionsHandler(): TransactionsHandler | null;\n}\n\nfunction createInjector(): Injector {\n const headCompartment = new Compartment();\n const tailCompartment = new Compartment();\n\n const headExtensions: Extension[] = [];\n const tailExtensions: Extension[] = [];\n\n // let transactionsHandlers: TransactionsHandler[] = []\n\n return {\n view: null,\n provideView(view: EditorView) {\n this.view = view;\n },\n inject(extension, position = InjectPosition.Tail) {\n const compartment =\n position === InjectPosition.Head ? headCompartment : tailCompartment;\n const extensions =\n position === InjectPosition.Head ? headExtensions : tailExtensions;\n extensions.push(extension);\n\n queueMicrotask(() => {\n if (this.view) {\n this.view.dispatch({\n effects: compartment.reconfigure(extensions),\n });\n }\n });\n\n // eject\n return () => {\n const index = extensions.indexOf(extension);\n if (~index) {\n extensions.splice(index, 1);\n }\n\n queueMicrotask(() => {\n if (this.view) {\n this.view.dispatch({\n effects: compartment.reconfigure(extensions),\n });\n }\n });\n };\n },\n\n // @internal\n getCompartment(position: InjectPosition) {\n return position === InjectPosition.Head\n ? headCompartment.of(headExtensions)\n : tailCompartment.of(tailExtensions);\n },\n\n // setTransactionsHandler(handler) {\n // if (typeof handler === 'function') {\n // transactionsHandlers.push(handler)\n // }\n\n // return () => {\n // const index = transactionsHandlers.indexOf(handler)\n // if (~index) {\n // transactionsHandlers.splice(index, 1)\n // }\n // }\n // },\n\n // getTransactionsHandler() {\n // return transactionsHandlers[transactionsHandlers.length - 1]\n // },\n\n // for fields export\n // exportField(field) {\n // return {\n // as(name: string) {\n // toJSONConfig[name] = field;\n // }\n // }\n // },\n // getExportFieldsConfig() {\n // return toJSONConfig;\n // },\n };\n}\n\nexport { createInjector, InjectPosition };\n\nexport type { Injector };\n","// Copyright (c) 2025 coze-dev\n// SPDX-License-Identifier: MIT\n\nclass SyncHook<T = unknown> {\n #fns: [string, T][] = [];\n\n tap(id: string, hookFn: T): void {\n this.#fns.push([id, hookFn]);\n }\n\n call(...args: unknown[]): void {\n const fns = this.#fns;\n\n fns.forEach(item => {\n const fn = item[1];\n if (typeof fn === 'function') {\n fn(...args);\n }\n });\n }\n}\n\nfunction createSyncHook<T = unknown>(): SyncHook<T> {\n return new SyncHook<T>();\n}\n\nexport { createSyncHook };\n\nexport type { SyncHook };\n","// Copyright (c) 2025 coze-dev\n// SPDX-License-Identifier: MIT\n\nimport { EditorView } from '@codemirror/view';\n\nfunction disableEditContext() {\n (EditorView as any).EDIT_CONTEXT = false;\n}\n\nexport { disableEditContext };\n"],"mappings":"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","names":["EditorView","extension","api","Compartment","InjectPosition","extension","EditorView","api","EditorView"]}
@@ -0,0 +1,145 @@
1
+ import { EditorView, ViewUpdate } from '@codemirror/view';
2
+ import { Extension, StateEffect } from '@codemirror/state';
3
+ import { Emitter, EventType } from 'mitt';
4
+
5
+ declare const EVENT_SILENT: unique symbol;
6
+ interface APIContext {
7
+ view: EditorView;
8
+ get: (key: string) => unknown;
9
+ set: (values: Record<string, unknown>) => void;
10
+ }
11
+ interface APIPluginSpec<Name extends string, Params extends any[], ReturnValue = unknown> {
12
+ type: 'api';
13
+ name: Name;
14
+ handler: (context: APIContext) => (...params: Params) => ReturnValue;
15
+ }
16
+ interface OptionPluginSpec<Name extends string, Value = unknown> {
17
+ type: 'option';
18
+ name: Name;
19
+ handler: (value: Value) => Extension | undefined;
20
+ }
21
+ interface EventPluginSpec<Name extends string, Value = unknown> {
22
+ type: 'event';
23
+ name: Name;
24
+ handler: (update: ViewUpdate) => Value | typeof EVENT_SILENT;
25
+ }
26
+ interface DOMEventHandlerPluginSpec<T extends string> {
27
+ type: 'domEventHandler';
28
+ name: T;
29
+ }
30
+ interface ExtensionPluginSpec {
31
+ type: 'extension';
32
+ extension: Extension;
33
+ }
34
+ type EditorPluginSpec<T extends string, U extends any[], V> = APIPluginSpec<T, U, V> | OptionPluginSpec<T, U> | EventPluginSpec<T, U> | DOMEventHandlerPluginSpec<T> | ExtensionPluginSpec;
35
+ declare function option<Name extends string, Value>(name: Name, handler: (value: Value) => Extension): OptionPluginSpec<Name, Value>;
36
+ declare function api<Name extends string, Params extends any[], ReturnValue>(name: Name, handler: (context: APIContext) => (...params: Params) => ReturnValue): APIPluginSpec<Name, Params, ReturnValue>;
37
+ declare function event<Name extends string, Params>(name: Name, handler: (update: ViewUpdate) => Params | typeof EVENT_SILENT): EventPluginSpec<Name, Params>;
38
+ declare function domEventHandler<Name extends keyof HTMLElementEventMap>(name: Name): DOMEventHandlerPluginSpec<Name>;
39
+ declare function extension(ext: Extension): ExtensionPluginSpec;
40
+ type UnionToIntersection<U> = (U extends any ? (k: U) => void : never) extends (k: infer I) => void ? I : never;
41
+ type InferValues<Plugin extends EditorPluginSpec<string, any, any>> = UnionToIntersection<Plugin extends OptionPluginSpec<infer Name, infer Value> ? {
42
+ [K in Name]: Value;
43
+ } : never>;
44
+ type InferAPI<Plugin extends EditorPluginSpec<string, any, any>> = UnionToIntersection<Plugin extends APIPluginSpec<infer Name, infer Params, infer ReturnValue> ? {
45
+ [K in Name]: (...params: Params) => ReturnValue;
46
+ } : never>;
47
+ type InferEvents<Plugin extends EditorPluginSpec<string, any, any>> = UnionToIntersection<Plugin extends EventPluginSpec<infer Name, infer Params> ? {
48
+ [K in Name]: Params;
49
+ } : Plugin extends DOMEventHandlerPluginSpec<infer Name> ? Name extends keyof HTMLElementEventMap ? {
50
+ [K in Name]: HTMLElementEventMap[Name];
51
+ } : {
52
+ [K in Name]: unknown;
53
+ } : never>;
54
+ interface Core {
55
+ API: typeof api;
56
+ Extesion: typeof extension;
57
+ Event: typeof event;
58
+ Option: typeof option;
59
+ }
60
+
61
+ type OptionFunction<T = unknown> = (value: T) => Extension | undefined;
62
+ declare class OptionHandler<Value = unknown> {
63
+ fn: OptionFunction;
64
+ private compartment;
65
+ extension: Extension | undefined;
66
+ value: Value | undefined;
67
+ constructor(fn: OptionFunction);
68
+ init(value: Value): Extension;
69
+ set(value: Value): StateEffect<unknown> | undefined;
70
+ }
71
+ declare class Options {
72
+ cachedValues: any;
73
+ handlers: Record<string, OptionHandler[]>;
74
+ add(name: string, handler: OptionHandler): void;
75
+ init(values: Record<string, unknown>): Extension[];
76
+ get<T = unknown>(key: string | number | symbol): T;
77
+ set(values: Record<string, unknown>): StateEffect<unknown>[];
78
+ }
79
+
80
+ declare enum InjectPosition {
81
+ Head = "head",
82
+ Tail = "tail"
83
+ }
84
+ type Eject = () => void;
85
+ interface Injector {
86
+ view: EditorView | null;
87
+ provideView: (view: EditorView) => void;
88
+ inject: (extension: Extension, position?: InjectPosition) => Eject;
89
+ getCompartment: (position: InjectPosition) => Extension;
90
+ }
91
+ declare function createInjector(): Injector;
92
+
93
+ interface EditorOptions<T, U> {
94
+ parent: HTMLElement;
95
+ root?: Document | ShadowRoot;
96
+ defaultValue?: string;
97
+ options: T;
98
+ extensions?: Extension[];
99
+ }
100
+ type InferOnOff<Events> = <K extends keyof Events>(eventName: K, handler: (params: Events[K]) => void) => void;
101
+ type InferEventMap<Events> = {
102
+ [K in keyof Events]: (params: Events[K]) => void;
103
+ };
104
+ type InferGet<Values> = <K extends keyof Values>(key: K) => Values[K] | undefined;
105
+ type InferSet<Values> = (values: Values) => void;
106
+ interface BuiltinEditorAPI {
107
+ $view: EditorView;
108
+ $on: (name: string, handler: Function) => void;
109
+ $off: (name: string, handler: Function) => void;
110
+ $get: (key: string) => unknown;
111
+ $set: (key: string, value: unknown) => void;
112
+ $destroy: () => void;
113
+ $inject: (extension: Extension, position?: InjectPosition) => () => void;
114
+ }
115
+ type InferEditorAPIFromPlugins<T extends EditorPluginSpec<string, any, any>[], Events = InferEvents<T[number]>, AllValues = InferValues<T[number]>, Values = Partial<AllValues>> = InferAPI<T[number]> & {
116
+ $on: InferOnOff<Events>;
117
+ } & {
118
+ $off: InferOnOff<Events>;
119
+ } & {
120
+ $get: InferGet<AllValues>;
121
+ } & {
122
+ $set: InferSet<Values>;
123
+ } & Pick<BuiltinEditorAPI, '$view' | '$destroy' | '$inject'> & {
124
+ __private_eventmap: InferEventMap<Events>;
125
+ };
126
+ declare function create<T extends EditorPluginSpec<string, any, any>[]>({ plugins, injector, }: {
127
+ plugins: T;
128
+ injector?: Injector;
129
+ }): {
130
+ render: (opts: EditorOptions<Partial<InferValues<T[number]>>, InferEvents<T[number]>>) => InferEditorAPIFromPlugins<T, ((T[number] extends infer T_1 ? T_1 extends T[number] ? T_1 extends EventPluginSpec<infer Name extends string, infer Params> ? { [K in Name]: Params; } : T_1 extends DOMEventHandlerPluginSpec<infer Name_1 extends string> ? Name_1 extends keyof HTMLElementEventMap ? { [K_1 in Name_1]: HTMLElementEventMap[Name_1]; } : { [K_2 in Name_1]: unknown; } : never : never : never) extends infer T_2 ? T_2 extends (T[number] extends infer T_3 ? T_3 extends T[number] ? T_3 extends EventPluginSpec<infer Name extends string, infer Params> ? { [K in Name]: Params; } : T_3 extends DOMEventHandlerPluginSpec<infer Name_1 extends string> ? Name_1 extends keyof HTMLElementEventMap ? { [K_1 in Name_1]: HTMLElementEventMap[Name_1]; } : { [K_2 in Name_1]: unknown; } : never : never : never) ? T_2 extends any ? (k: T_2) => void : never : never : never) extends (k: infer I) => void ? I : never, ((T[number] extends infer T_4 ? T_4 extends T[number] ? T_4 extends OptionPluginSpec<infer Name_2 extends string, infer Value> ? { [K_3 in Name_2]: Value; } : never : never : never) extends infer T_5 ? T_5 extends (T[number] extends infer T_6 ? T_6 extends T[number] ? T_6 extends OptionPluginSpec<infer Name_2 extends string, infer Value> ? { [K_3 in Name_2]: Value; } : never : never : never) ? T_5 extends any ? (k: T_5) => void : never : never : never) extends (k: infer I) => void ? I : never, Partial<((T[number] extends infer T_7 ? T_7 extends T[number] ? T_7 extends OptionPluginSpec<infer Name_2 extends string, infer Value> ? { [K_3 in Name_2]: Value; } : never : never : never) extends infer T_8 ? T_8 extends (T[number] extends infer T_9 ? T_9 extends T[number] ? T_9 extends OptionPluginSpec<infer Name_2 extends string, infer Value> ? { [K_3 in Name_2]: Value; } : never : never : never) ? T_8 extends any ? (k: T_8) => void : never : never : never) extends (k: infer I) => void ? I : never>>;
131
+ getExtensions: (values: EditorOptions<Partial<InferValues<T[number]>>, InferEvents<T[number]>>["options"], { options, events, }: {
132
+ options: Options;
133
+ events: Emitter<Record<string, unknown>>;
134
+ }) => Extension[];
135
+ createAPI: ({ view, options, events, }: {
136
+ view: EditorView;
137
+ options: Options;
138
+ events: Emitter<Record<EventType, unknown>>;
139
+ }) => InferEditorAPIFromPlugins<T, ((T[number] extends infer T_1 ? T_1 extends T[number] ? T_1 extends EventPluginSpec<infer Name extends string, infer Params> ? { [K in Name]: Params; } : T_1 extends DOMEventHandlerPluginSpec<infer Name_1 extends string> ? Name_1 extends keyof HTMLElementEventMap ? { [K_1 in Name_1]: HTMLElementEventMap[Name_1]; } : { [K_2 in Name_1]: unknown; } : never : never : never) extends infer T_2 ? T_2 extends (T[number] extends infer T_3 ? T_3 extends T[number] ? T_3 extends EventPluginSpec<infer Name extends string, infer Params> ? { [K in Name]: Params; } : T_3 extends DOMEventHandlerPluginSpec<infer Name_1 extends string> ? Name_1 extends keyof HTMLElementEventMap ? { [K_1 in Name_1]: HTMLElementEventMap[Name_1]; } : { [K_2 in Name_1]: unknown; } : never : never : never) ? T_2 extends any ? (k: T_2) => void : never : never : never) extends (k: infer I) => void ? I : never, ((T[number] extends infer T_4 ? T_4 extends T[number] ? T_4 extends OptionPluginSpec<infer Name_2 extends string, infer Value> ? { [K_3 in Name_2]: Value; } : never : never : never) extends infer T_5 ? T_5 extends (T[number] extends infer T_6 ? T_6 extends T[number] ? T_6 extends OptionPluginSpec<infer Name_2 extends string, infer Value> ? { [K_3 in Name_2]: Value; } : never : never : never) ? T_5 extends any ? (k: T_5) => void : never : never : never) extends (k: infer I) => void ? I : never, Partial<((T[number] extends infer T_7 ? T_7 extends T[number] ? T_7 extends OptionPluginSpec<infer Name_2 extends string, infer Value> ? { [K_3 in Name_2]: Value; } : never : never : never) extends infer T_8 ? T_8 extends (T[number] extends infer T_9 ? T_9 extends T[number] ? T_9 extends OptionPluginSpec<infer Name_2 extends string, infer Value> ? { [K_3 in Name_2]: Value; } : never : never : never) ? T_8 extends any ? (k: T_8) => void : never : never : never) extends (k: infer I) => void ? I : never>>;
140
+ createOptions: () => Options;
141
+ createEvents: () => Emitter<Record<EventType, unknown>>;
142
+ eventKeys: string[];
143
+ };
144
+
145
+ export { type APIContext, type APIPluginSpec, type BuiltinEditorAPI, type Core, type DOMEventHandlerPluginSpec, EVENT_SILENT, type EditorOptions, type EditorPluginSpec, type EventPluginSpec, type ExtensionPluginSpec, type InferEditorAPIFromPlugins, type InferEvents, type InferValues, InjectPosition, type Injector, type OptionPluginSpec, api, create, createInjector, domEventHandler, event, extension, option };