@prosekit/solid 0.4.12 → 0.4.13

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.
@@ -1,241 +1,221 @@
1
- import {
2
- EditorContextProvider,
3
- useEditorContext
4
- } from "./chunk-XDDJIQ4M.js";
1
+ import { EditorContextProvider, useEditorContext } from "./editor-context-DIj_hnDx.js";
2
+ import { ProsemirrorAdapterProvider, useMarkViewContext, useMarkViewFactory, useNodeViewContext, useNodeViewFactory } from "@prosemirror-adapter/solid";
3
+ import { createComponent, createEffect, createMemo, createSignal, onCleanup } from "solid-js";
4
+ import { EditorNotFoundError, ProseKitError, defineDocChangeHandler, defineKeymap, defineMarkViewComponent, defineMarkViewFactory, defineMountHandler, defineNodeViewComponent, defineNodeViewFactory, defineUpdateHandler, union, withPriority } from "@prosekit/core";
5
5
 
6
- // src/components/prosekit.ts
7
- import { ProsemirrorAdapterProvider } from "@prosemirror-adapter/solid";
8
- import {
9
- createComponent as createComponent3
10
- } from "solid-js";
11
-
12
- // src/extensions/solid-mark-view.ts
13
- import {
14
- defineMarkViewComponent,
15
- defineMarkViewFactory
16
- } from "@prosekit/core";
17
- import {
18
- useMarkViewContext,
19
- useMarkViewFactory
20
- } from "@prosemirror-adapter/solid";
21
- import {
22
- createComponent,
23
- createMemo
24
- } from "solid-js";
25
-
26
- // src/hooks/use-editor-extension.ts
27
- import {
28
- EditorNotFoundError
29
- } from "@prosekit/core";
30
- import {
31
- createEffect,
32
- onCleanup
33
- } from "solid-js";
34
-
35
- // src/utils/to-value.ts
6
+ //#region src/utils/to-value.ts
7
+ /**
8
+ * Accesses the value of a MaybeAccessor
9
+ *
10
+ * @example
11
+ * ```ts
12
+ * access("foo") // => "foo"
13
+ * access(() => "foo") // => "foo"
14
+ * ```
15
+ */
36
16
  function toValue(v) {
37
- return typeof v === "function" && v.length === 0 ? v() : v;
17
+ return typeof v === "function" ? v() : v;
38
18
  }
39
19
 
40
- // src/hooks/use-editor-extension.ts
20
+ //#endregion
21
+ //#region src/hooks/use-editor-extension.ts
22
+ /**
23
+ * @internal
24
+ */
41
25
  function useEditorExtension(editorAccessor, extensionAccessor) {
42
- const editorContext = useEditorContext();
43
- createEffect(() => {
44
- const editor = toValue(editorAccessor) || toValue(editorContext);
45
- const extension = extensionAccessor();
46
- if (!editor) {
47
- throw new EditorNotFoundError();
48
- }
49
- if (extension) {
50
- onCleanup(editor.use(extension));
51
- }
52
- });
26
+ const editorContext = useEditorContext();
27
+ createEffect(() => {
28
+ const editor = toValue(editorAccessor) || toValue(editorContext);
29
+ const extension = extensionAccessor();
30
+ if (!editor) throw new EditorNotFoundError();
31
+ if (extension) onCleanup(editor.use(extension));
32
+ });
53
33
  }
54
34
 
55
- // src/hooks/use-priority-extension.ts
56
- import {
57
- withPriority
58
- } from "@prosekit/core";
35
+ //#endregion
36
+ //#region src/hooks/use-priority-extension.ts
37
+ /**
38
+ * @internal
39
+ */
59
40
  function usePriorityExtension(extension, priority) {
60
- return () => {
61
- const ext = extension();
62
- return ext && priority ? withPriority(ext, priority) : ext;
63
- };
41
+ return () => {
42
+ const ext = extension();
43
+ return ext && priority ? withPriority(ext, priority) : ext;
44
+ };
64
45
  }
65
46
 
66
- // src/hooks/use-extension.ts
47
+ //#endregion
48
+ //#region src/hooks/use-extension.ts
49
+ /**
50
+ * Add an extension to the editor.
51
+ */
67
52
  function useExtension(extension, options) {
68
- useEditorExtension(
69
- options?.editor,
70
- usePriorityExtension(extension, options?.priority)
71
- );
53
+ useEditorExtension(options?.editor, usePriorityExtension(extension, options?.priority));
72
54
  }
73
55
 
74
- // src/extensions/solid-mark-view.ts
56
+ //#endregion
57
+ //#region src/extensions/solid-mark-view.ts
75
58
  function withMarkViewProps(component) {
76
- return function MarkViewPropsWrapper() {
77
- const props = useMarkViewContext();
78
- return createComponent(component, props());
79
- };
80
- }
59
+ return function MarkViewPropsWrapper() {
60
+ const props = useMarkViewContext();
61
+ return createComponent(component, props());
62
+ };
63
+ }
64
+ /**
65
+ * @internal
66
+ */
81
67
  function consumeSolidMarkViews() {
82
- const markViewFactory = useMarkViewFactory();
83
- const extension = createMemo(
84
- () => defineSolidMarkViewFactory(markViewFactory),
85
- [markViewFactory]
86
- );
87
- useExtension(extension);
88
- }
68
+ const markViewFactory = useMarkViewFactory();
69
+ const extension = createMemo(() => defineSolidMarkViewFactory(markViewFactory), [markViewFactory]);
70
+ useExtension(extension);
71
+ }
72
+ /**
73
+ * Defines a mark view using a Solid component.
74
+ *
75
+ * @public
76
+ */
89
77
  function defineSolidMarkView(options) {
90
- const { name, component, ...userOptions } = options;
91
- const args = {
92
- ...userOptions,
93
- component: withMarkViewProps(component)
94
- };
95
- return defineMarkViewComponent({
96
- group: "solid",
97
- name,
98
- args
99
- });
78
+ const { name, component,...userOptions } = options;
79
+ const args = {
80
+ ...userOptions,
81
+ component: withMarkViewProps(component)
82
+ };
83
+ return defineMarkViewComponent({
84
+ group: "solid",
85
+ name,
86
+ args
87
+ });
100
88
  }
101
89
  function defineSolidMarkViewFactory(factory) {
102
- return defineMarkViewFactory({
103
- group: "solid",
104
- factory
105
- });
90
+ return defineMarkViewFactory({
91
+ group: "solid",
92
+ factory
93
+ });
106
94
  }
107
95
 
108
- // src/extensions/solid-node-view.ts
109
- import {
110
- defineNodeViewComponent,
111
- defineNodeViewFactory
112
- } from "@prosekit/core";
113
- import {
114
- useNodeViewContext,
115
- useNodeViewFactory
116
- } from "@prosemirror-adapter/solid";
117
- import {
118
- createComponent as createComponent2,
119
- createMemo as createMemo2
120
- } from "solid-js";
96
+ //#endregion
97
+ //#region src/extensions/solid-node-view.ts
121
98
  function withNodeViewProps(component) {
122
- return function NodeViewPropsWrapper() {
123
- const props = useNodeViewContext();
124
- return createComponent2(component, props());
125
- };
126
- }
99
+ return function NodeViewPropsWrapper() {
100
+ const props = useNodeViewContext();
101
+ return createComponent(component, props());
102
+ };
103
+ }
104
+ /**
105
+ * @internal
106
+ */
127
107
  function consumeSolidNodeViews() {
128
- const nodeViewFactory = useNodeViewFactory();
129
- const extension = createMemo2(
130
- () => defineSolidNodeViewFactory(nodeViewFactory),
131
- [nodeViewFactory]
132
- );
133
- useExtension(extension);
134
- }
108
+ const nodeViewFactory = useNodeViewFactory();
109
+ const extension = createMemo(() => defineSolidNodeViewFactory(nodeViewFactory), [nodeViewFactory]);
110
+ useExtension(extension);
111
+ }
112
+ /**
113
+ * Defines a node view using a Solid component.
114
+ *
115
+ * @public
116
+ */
135
117
  function defineSolidNodeView(options) {
136
- const { name, component, ...userOptions } = options;
137
- const args = {
138
- ...userOptions,
139
- component: withNodeViewProps(component)
140
- };
141
- return defineNodeViewComponent({
142
- group: "solid",
143
- name,
144
- args
145
- });
118
+ const { name, component,...userOptions } = options;
119
+ const args = {
120
+ ...userOptions,
121
+ component: withNodeViewProps(component)
122
+ };
123
+ return defineNodeViewComponent({
124
+ group: "solid",
125
+ name,
126
+ args
127
+ });
146
128
  }
147
129
  function defineSolidNodeViewFactory(factory) {
148
- return defineNodeViewFactory({
149
- group: "solid",
150
- factory
151
- });
130
+ return defineNodeViewFactory({
131
+ group: "solid",
132
+ factory
133
+ });
152
134
  }
153
135
 
154
- // src/components/prosekit.ts
155
- var ProseKit = (props) => {
156
- return createComponent3(ProsemirrorAdapterProvider, {
157
- get children() {
158
- return createComponent3(EditorContextProvider, {
159
- get value() {
160
- return props.editor;
161
- },
162
- get children() {
163
- consumeSolidNodeViews();
164
- consumeSolidMarkViews();
165
- return props.children;
166
- }
167
- });
168
- }
169
- });
136
+ //#endregion
137
+ //#region src/components/prosekit.ts
138
+ /**
139
+ * The root component for a ProseKit editor.
140
+ *
141
+ * @public
142
+ */
143
+ const ProseKit = (props) => {
144
+ return createComponent(ProsemirrorAdapterProvider, { get children() {
145
+ return createComponent(EditorContextProvider, {
146
+ get value() {
147
+ return props.editor;
148
+ },
149
+ get children() {
150
+ consumeSolidNodeViews();
151
+ consumeSolidMarkViews();
152
+ return props.children;
153
+ }
154
+ });
155
+ } });
170
156
  };
171
157
 
172
- // src/hooks/use-doc-change.ts
173
- import { defineDocChangeHandler } from "@prosekit/core";
158
+ //#endregion
159
+ //#region src/hooks/use-doc-change.ts
160
+ /**
161
+ * Calls the given handler whenever the editor document changes.
162
+ *
163
+ * @public
164
+ */
174
165
  function useDocChange(handler, options) {
175
- const extension = defineDocChangeHandler((view) => handler(view.state.doc));
176
- return useExtension(() => extension, options);
166
+ const extension = defineDocChangeHandler((view) => handler(view.state.doc));
167
+ useExtension(() => extension, options);
177
168
  }
178
169
 
179
- // src/hooks/use-editor.ts
180
- import {
181
- defineMountHandler,
182
- defineUpdateHandler,
183
- ProseKitError,
184
- union
185
- } from "@prosekit/core";
186
- import {
187
- createEffect as createEffect2,
188
- createSignal
189
- } from "solid-js";
170
+ //#endregion
171
+ //#region src/hooks/use-editor.ts
172
+ /**
173
+ * Retrieves the editor instance from the nearest ProseKit component.
174
+ *
175
+ * @public
176
+ */
190
177
  function useEditor(options) {
191
- const update = options?.update ?? false;
192
- const editor = useEditorContext();
193
- if (!editor) {
194
- throw new ProseKitError(
195
- "useEditor must be used within the ProseKit component"
196
- );
197
- }
198
- const [depend, forceUpdate] = useForceUpdate();
199
- createEffect2(() => {
200
- if (update) {
201
- const extension = union(
202
- defineMountHandler(forceUpdate),
203
- defineUpdateHandler(forceUpdate)
204
- );
205
- return editor.use(extension);
206
- }
207
- }, [editor, update, forceUpdate]);
208
- return () => {
209
- depend();
210
- return editor;
211
- };
178
+ const update = options?.update ?? false;
179
+ const editor = useEditorContext();
180
+ if (!editor) throw new ProseKitError("useEditor must be used within the ProseKit component");
181
+ const [depend, forceUpdate] = useForceUpdate();
182
+ createEffect(() => {
183
+ if (update) {
184
+ const extension = union(defineMountHandler(forceUpdate), defineUpdateHandler(forceUpdate));
185
+ return editor.use(extension);
186
+ }
187
+ }, [
188
+ editor,
189
+ update,
190
+ forceUpdate
191
+ ]);
192
+ return () => {
193
+ depend();
194
+ return editor;
195
+ };
212
196
  }
213
197
  function useForceUpdate() {
214
- return createSignal(void 0, { equals: false });
198
+ return createSignal(void 0, { equals: false });
215
199
  }
216
200
 
217
- // src/hooks/use-keymap.ts
218
- import {
219
- defineKeymap
220
- } from "@prosekit/core";
201
+ //#endregion
202
+ //#region src/hooks/use-keymap.ts
221
203
  function useKeymap(keymap, options) {
222
- const extension = () => defineKeymap(keymap());
223
- return useExtension(extension, options);
204
+ const extension = () => defineKeymap(keymap());
205
+ useExtension(extension, options);
224
206
  }
225
207
 
226
- // src/hooks/use-state-update.ts
227
- import { defineUpdateHandler as defineUpdateHandler2 } from "@prosekit/core";
208
+ //#endregion
209
+ //#region src/hooks/use-state-update.ts
210
+ /**
211
+ * Calls the given handler whenever the editor state changes.
212
+ *
213
+ * @public
214
+ */
228
215
  function useStateUpdate(handler, options) {
229
- const extension = defineUpdateHandler2((view) => handler(view.state));
230
- return useExtension(() => extension, options);
231
- }
232
- export {
233
- ProseKit,
234
- defineSolidMarkView,
235
- defineSolidNodeView,
236
- useDocChange,
237
- useEditor,
238
- useExtension,
239
- useKeymap,
240
- useStateUpdate
241
- };
216
+ const extension = defineUpdateHandler((view) => handler(view.state));
217
+ useExtension(() => extension, options);
218
+ }
219
+
220
+ //#endregion
221
+ export { ProseKit, defineSolidMarkView, defineSolidNodeView, useDocChange, useEditor, useExtension, useKeymap, useStateUpdate };
@@ -0,0 +1,43 @@
1
+ import { Accessor, JSX, JSXElement } from "solid-js";
2
+
3
+ //#region src/types.d.ts
4
+ /**
5
+ * @internal
6
+ */
7
+ /**
8
+ * @internal
9
+ */
10
+ type PropsWithClass<P = unknown> = P & {
11
+ class?: string | undefined;
12
+ };
13
+ /**
14
+ * @internal
15
+ */
16
+ type PropsWithChildren<P = unknown> = P & {
17
+ children?: JSXElement | undefined;
18
+ };
19
+ /**
20
+ * @internal
21
+ */
22
+ type PropsWithElement<Props extends object, CustomElement extends HTMLElement> = Props & JSX.HTMLAttributes<CustomElement>;
23
+ /**
24
+ * T or a reactive/non-reactive function returning T
25
+ */
26
+ type MaybeAccessor<T> = T | Accessor<T>;
27
+
28
+ //#endregion
29
+ /**
30
+ * Accessed value of a MaybeAccessor
31
+ *
32
+ * @example
33
+ *
34
+ * ```ts
35
+ * MaybeAccessorValue<MaybeAccessor<string>>
36
+ * // => string
37
+ * MaybeAccessorValue<MaybeAccessor<() => string>>
38
+ * // => string | (() => string)
39
+ * MaybeAccessorValue<MaybeAccessor<string> | Function>
40
+ * // => string | void
41
+ * ```
42
+ */
43
+ export { MaybeAccessor, PropsWithChildren, PropsWithClass, PropsWithElement };
package/package.json CHANGED
@@ -1,8 +1,9 @@
1
1
  {
2
2
  "name": "@prosekit/solid",
3
3
  "type": "module",
4
- "version": "0.4.12",
4
+ "version": "0.4.13",
5
5
  "private": false,
6
+ "description": "Solid components and utilities for ProseKit",
6
7
  "author": {
7
8
  "name": "ocavue",
8
9
  "email": "ocavue@gmail.com"
@@ -64,9 +65,9 @@
64
65
  "dependencies": {
65
66
  "@prosemirror-adapter/core": "^0.4.0",
66
67
  "@prosemirror-adapter/solid": "^0.4.1",
67
- "@prosekit/core": "^0.8.0",
68
- "@prosekit/pm": "^0.1.9",
69
- "@prosekit/web": "^0.5.7"
68
+ "@prosekit/pm": "^0.1.10",
69
+ "@prosekit/core": "^0.8.1",
70
+ "@prosekit/web": "^0.5.8"
70
71
  },
71
72
  "peerDependencies": {
72
73
  "solid-js": ">= 1.7.0"
@@ -77,15 +78,31 @@
77
78
  }
78
79
  },
79
80
  "devDependencies": {
80
- "solid-js": "^1.9.5",
81
- "tsup": "^8.4.0",
82
- "typescript": "~5.7.3",
83
- "vitest": "^3.0.9",
84
- "@prosekit/dev": "0.0.0"
81
+ "solid-js": "^1.9.6",
82
+ "tsdown": "^0.11.1",
83
+ "typescript": "~5.8.3",
84
+ "vitest": "^3.1.3",
85
+ "@prosekit/config-tsdown": "0.0.0",
86
+ "@prosekit/config-vitest": "0.0.0"
87
+ },
88
+ "publishConfig": {
89
+ "dev": {}
90
+ },
91
+ "dev": {
92
+ "entry": {
93
+ "prosekit-solid": "./src/index.ts",
94
+ "prosekit-solid-autocomplete": "./src/components/autocomplete/index.gen.ts",
95
+ "prosekit-solid-block-handle": "./src/components/block-handle/index.gen.ts",
96
+ "prosekit-solid-inline-popover": "./src/components/inline-popover/index.gen.ts",
97
+ "prosekit-solid-popover": "./src/components/popover/index.gen.ts",
98
+ "prosekit-solid-resizable": "./src/components/resizable/index.gen.ts",
99
+ "prosekit-solid-table-handle": "./src/components/table-handle/index.gen.ts",
100
+ "prosekit-solid-tooltip": "./src/components/tooltip/index.gen.ts"
101
+ }
85
102
  },
86
103
  "scripts": {
87
104
  "build:tsc": "tsc -b tsconfig.json",
88
- "build:tsup": "tsup"
105
+ "build:tsdown": "tsdown"
89
106
  },
90
107
  "types": "./dist/prosekit-solid.d.ts",
91
108
  "typesVersions": {