@platejs/ai 50.1.2 → 50.2.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.
- package/dist/{getEditorPrompt-FgyoD13L.d.mts → getEditorPrompt-C7EEuMw8.d.mts} +1 -5
- package/dist/{getEditorPrompt-FgyoD13L.d.ts → getEditorPrompt-C7EEuMw8.d.ts} +1 -5
- package/dist/index.d.mts +7 -3
- package/dist/index.d.ts +7 -3
- package/dist/index.js +42 -37
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +42 -37
- package/dist/index.mjs.map +1 -1
- package/dist/react/index.d.mts +28 -8
- package/dist/react/index.d.ts +28 -8
- package/dist/react/index.js +338 -110
- package/dist/react/index.js.map +1 -1
- package/dist/react/index.mjs +277 -39
- package/dist/react/index.mjs.map +1 -1
- package/package.json +4 -3
|
@@ -42,17 +42,13 @@ interface EditorPromptParams {
|
|
|
42
42
|
isBlockSelecting: boolean;
|
|
43
43
|
isSelecting: boolean;
|
|
44
44
|
}
|
|
45
|
-
type MarkdownType = 'block' | 'blockSelection' | 'blockSelectionWithBlockId' | 'blockWithBlockId' | 'editor' | 'editorWithBlockId';
|
|
46
45
|
interface PromptConfig {
|
|
47
46
|
default: string;
|
|
48
47
|
blockSelecting?: string;
|
|
49
48
|
selecting?: string;
|
|
50
49
|
}
|
|
51
|
-
declare const replacePlaceholders: (editor: SlateEditor, text: string, { prompt, }?: {
|
|
52
|
-
prompt?: string;
|
|
53
|
-
}) => string;
|
|
54
50
|
declare const getEditorPrompt: (editor: SlateEditor, { prompt, }: {
|
|
55
51
|
prompt?: EditorPrompt;
|
|
56
52
|
}) => string;
|
|
57
53
|
|
|
58
|
-
export { type AIToolName as A, type BaseAIPluginConfig as B, type EditorPrompt as E, type
|
|
54
|
+
export { type AIToolName as A, type BaseAIPluginConfig as B, type EditorPrompt as E, type PromptConfig as P, BaseAIPlugin as a, type AIMode as b, removeAINodes as c, type EditorPromptParams as d, getEditorPrompt as g, insertAINodes as i, removeAIMarks as r };
|
|
@@ -42,17 +42,13 @@ interface EditorPromptParams {
|
|
|
42
42
|
isBlockSelecting: boolean;
|
|
43
43
|
isSelecting: boolean;
|
|
44
44
|
}
|
|
45
|
-
type MarkdownType = 'block' | 'blockSelection' | 'blockSelectionWithBlockId' | 'blockWithBlockId' | 'editor' | 'editorWithBlockId';
|
|
46
45
|
interface PromptConfig {
|
|
47
46
|
default: string;
|
|
48
47
|
blockSelecting?: string;
|
|
49
48
|
selecting?: string;
|
|
50
49
|
}
|
|
51
|
-
declare const replacePlaceholders: (editor: SlateEditor, text: string, { prompt, }?: {
|
|
52
|
-
prompt?: string;
|
|
53
|
-
}) => string;
|
|
54
50
|
declare const getEditorPrompt: (editor: SlateEditor, { prompt, }: {
|
|
55
51
|
prompt?: EditorPrompt;
|
|
56
52
|
}) => string;
|
|
57
53
|
|
|
58
|
-
export { type AIToolName as A, type BaseAIPluginConfig as B, type EditorPrompt as E, type
|
|
54
|
+
export { type AIToolName as A, type BaseAIPluginConfig as B, type EditorPrompt as E, type PromptConfig as P, BaseAIPlugin as a, type AIMode as b, removeAINodes as c, type EditorPromptParams as d, getEditorPrompt as g, insertAINodes as i, removeAIMarks as r };
|
package/dist/index.d.mts
CHANGED
|
@@ -1,5 +1,4 @@
|
|
|
1
|
-
|
|
2
|
-
export { b as AIMode, A as AIToolName, a as BaseAIPlugin, B as BaseAIPluginConfig, E as EditorPrompt, d as EditorPromptParams, P as PromptConfig, g as getEditorPrompt, i as insertAINodes, r as removeAIMarks, c as removeAINodes, e as replacePlaceholders } from './getEditorPrompt-FgyoD13L.mjs';
|
|
1
|
+
export { b as AIMode, A as AIToolName, a as BaseAIPlugin, B as BaseAIPluginConfig, E as EditorPrompt, d as EditorPromptParams, P as PromptConfig, g as getEditorPrompt, i as insertAINodes, r as removeAIMarks, c as removeAINodes } from './getEditorPrompt-C7EEuMw8.mjs';
|
|
3
2
|
import { SlateEditor, History } from 'platejs';
|
|
4
3
|
|
|
5
4
|
declare const undoAI: (editor: SlateEditor) => void;
|
|
@@ -11,8 +10,13 @@ declare const withAIBatch: (editor: SlateEditor, fn: () => void, { split, }?: {
|
|
|
11
10
|
split?: boolean;
|
|
12
11
|
}) => void;
|
|
13
12
|
|
|
13
|
+
type MarkdownType = 'block' | 'blockSelection' | 'blockSelectionWithBlockId' | 'blockWithBlockId' | 'editor' | 'editorWithBlockId';
|
|
14
|
+
declare const replacePlaceholders: (editor: SlateEditor, text: string, { prompt, }?: {
|
|
15
|
+
prompt?: string;
|
|
16
|
+
}) => string;
|
|
17
|
+
|
|
14
18
|
declare const getMarkdown: (editor: SlateEditor, { type, }: {
|
|
15
19
|
type: MarkdownType;
|
|
16
20
|
}) => string;
|
|
17
21
|
|
|
18
|
-
export { type AIBatch, MarkdownType, getMarkdown, undoAI, withAIBatch };
|
|
22
|
+
export { type AIBatch, type MarkdownType, getMarkdown, replacePlaceholders, undoAI, withAIBatch };
|
package/dist/index.d.ts
CHANGED
|
@@ -1,5 +1,4 @@
|
|
|
1
|
-
|
|
2
|
-
export { b as AIMode, A as AIToolName, a as BaseAIPlugin, B as BaseAIPluginConfig, E as EditorPrompt, d as EditorPromptParams, P as PromptConfig, g as getEditorPrompt, i as insertAINodes, r as removeAIMarks, c as removeAINodes, e as replacePlaceholders } from './getEditorPrompt-FgyoD13L.js';
|
|
1
|
+
export { b as AIMode, A as AIToolName, a as BaseAIPlugin, B as BaseAIPluginConfig, E as EditorPrompt, d as EditorPromptParams, P as PromptConfig, g as getEditorPrompt, i as insertAINodes, r as removeAIMarks, c as removeAINodes } from './getEditorPrompt-C7EEuMw8.js';
|
|
3
2
|
import { SlateEditor, History } from 'platejs';
|
|
4
3
|
|
|
5
4
|
declare const undoAI: (editor: SlateEditor) => void;
|
|
@@ -11,8 +10,13 @@ declare const withAIBatch: (editor: SlateEditor, fn: () => void, { split, }?: {
|
|
|
11
10
|
split?: boolean;
|
|
12
11
|
}) => void;
|
|
13
12
|
|
|
13
|
+
type MarkdownType = 'block' | 'blockSelection' | 'blockSelectionWithBlockId' | 'blockWithBlockId' | 'editor' | 'editorWithBlockId';
|
|
14
|
+
declare const replacePlaceholders: (editor: SlateEditor, text: string, { prompt, }?: {
|
|
15
|
+
prompt?: string;
|
|
16
|
+
}) => string;
|
|
17
|
+
|
|
14
18
|
declare const getMarkdown: (editor: SlateEditor, { type, }: {
|
|
15
19
|
type: MarkdownType;
|
|
16
20
|
}) => string;
|
|
17
21
|
|
|
18
|
-
export { type AIBatch, MarkdownType, getMarkdown, undoAI, withAIBatch };
|
|
22
|
+
export { type AIBatch, type MarkdownType, getMarkdown, replacePlaceholders, undoAI, withAIBatch };
|
package/dist/index.js
CHANGED
|
@@ -73,11 +73,16 @@ var removeAINodes = (editor, { at = [] } = {}) => {
|
|
|
73
73
|
};
|
|
74
74
|
|
|
75
75
|
// src/lib/transforms/undoAI.ts
|
|
76
|
+
var import_suggestion = require("@platejs/suggestion");
|
|
76
77
|
var undoAI = (editor) => {
|
|
77
|
-
|
|
78
|
+
const hasAINodeOrAISuggestion = editor.api.some({
|
|
78
79
|
at: [],
|
|
79
80
|
match: (n) => !!n.ai
|
|
80
|
-
})
|
|
81
|
+
}) || editor.api.some({
|
|
82
|
+
at: [],
|
|
83
|
+
match: (n) => !!n[(0, import_suggestion.getTransientSuggestionKey)()]
|
|
84
|
+
});
|
|
85
|
+
if (editor.history.undos.at(-1)?.ai && hasAINodeOrAISuggestion) {
|
|
81
86
|
editor.undo();
|
|
82
87
|
editor.history.redos.pop();
|
|
83
88
|
}
|
|
@@ -111,11 +116,42 @@ var BaseAIPlugin = (0, import_platejs3.createTSlatePlugin)({
|
|
|
111
116
|
|
|
112
117
|
// src/lib/utils/getEditorPrompt.ts
|
|
113
118
|
var import_selection = require("@platejs/selection");
|
|
114
|
-
var
|
|
119
|
+
var import_platejs4 = require("platejs");
|
|
120
|
+
var createPromptFromConfig = (config, params) => {
|
|
121
|
+
const { isBlockSelecting, isSelecting: isSelecting2 } = params;
|
|
122
|
+
if (isBlockSelecting && config.blockSelecting) {
|
|
123
|
+
return config.blockSelecting ?? config.default;
|
|
124
|
+
} else if (isSelecting2 && config.selecting) {
|
|
125
|
+
return config.selecting ?? config.default;
|
|
126
|
+
} else {
|
|
127
|
+
return config.default;
|
|
128
|
+
}
|
|
129
|
+
};
|
|
130
|
+
var getEditorPrompt = (editor, {
|
|
131
|
+
prompt = ""
|
|
132
|
+
}) => {
|
|
133
|
+
const params = {
|
|
134
|
+
editor,
|
|
135
|
+
isBlockSelecting: editor.getOption(
|
|
136
|
+
{ key: import_platejs4.KEYS.blockSelection },
|
|
137
|
+
"isSelectingSome"
|
|
138
|
+
),
|
|
139
|
+
isSelecting: (0, import_selection.isSelecting)(editor)
|
|
140
|
+
};
|
|
141
|
+
let promptText = "";
|
|
142
|
+
if (typeof prompt === "function") {
|
|
143
|
+
promptText = prompt(params);
|
|
144
|
+
} else if (typeof prompt === "object") {
|
|
145
|
+
promptText = createPromptFromConfig(prompt, params);
|
|
146
|
+
} else {
|
|
147
|
+
promptText = prompt;
|
|
148
|
+
}
|
|
149
|
+
return promptText;
|
|
150
|
+
};
|
|
115
151
|
|
|
116
152
|
// src/lib/utils/getMarkdown.ts
|
|
117
153
|
var import_markdown = require("@platejs/markdown");
|
|
118
|
-
var
|
|
154
|
+
var import_platejs5 = require("platejs");
|
|
119
155
|
var getMarkdown = (editor, {
|
|
120
156
|
type
|
|
121
157
|
}) => {
|
|
@@ -137,7 +173,7 @@ var getMarkdown = (editor, {
|
|
|
137
173
|
const modifiedFragment = [
|
|
138
174
|
{
|
|
139
175
|
children: fragment[0].children,
|
|
140
|
-
type:
|
|
176
|
+
type: import_platejs5.KEYS.p
|
|
141
177
|
}
|
|
142
178
|
];
|
|
143
179
|
return (0, import_markdown.serializeMd)(editor, {
|
|
@@ -153,7 +189,7 @@ var getMarkdown = (editor, {
|
|
|
153
189
|
return "";
|
|
154
190
|
};
|
|
155
191
|
|
|
156
|
-
// src/lib/utils/
|
|
192
|
+
// src/lib/utils/replacePlaceholders.ts
|
|
157
193
|
var replacePlaceholders = (editor, text, {
|
|
158
194
|
prompt
|
|
159
195
|
} = {}) => {
|
|
@@ -173,37 +209,6 @@ var replacePlaceholders = (editor, text, {
|
|
|
173
209
|
});
|
|
174
210
|
return result;
|
|
175
211
|
};
|
|
176
|
-
var createPromptFromConfig = (config, params) => {
|
|
177
|
-
const { isBlockSelecting, isSelecting: isSelecting2 } = params;
|
|
178
|
-
if (isBlockSelecting && config.blockSelecting) {
|
|
179
|
-
return config.blockSelecting ?? config.default;
|
|
180
|
-
} else if (isSelecting2 && config.selecting) {
|
|
181
|
-
return config.selecting ?? config.default;
|
|
182
|
-
} else {
|
|
183
|
-
return config.default;
|
|
184
|
-
}
|
|
185
|
-
};
|
|
186
|
-
var getEditorPrompt = (editor, {
|
|
187
|
-
prompt = ""
|
|
188
|
-
}) => {
|
|
189
|
-
const params = {
|
|
190
|
-
editor,
|
|
191
|
-
isBlockSelecting: editor.getOption(
|
|
192
|
-
{ key: import_platejs5.KEYS.blockSelection },
|
|
193
|
-
"isSelectingSome"
|
|
194
|
-
),
|
|
195
|
-
isSelecting: (0, import_selection.isSelecting)(editor)
|
|
196
|
-
};
|
|
197
|
-
let promptText = "";
|
|
198
|
-
if (typeof prompt === "function") {
|
|
199
|
-
promptText = prompt(params);
|
|
200
|
-
} else if (typeof prompt === "object") {
|
|
201
|
-
promptText = createPromptFromConfig(prompt, params);
|
|
202
|
-
} else {
|
|
203
|
-
promptText = prompt;
|
|
204
|
-
}
|
|
205
|
-
return promptText;
|
|
206
|
-
};
|
|
207
212
|
// Annotate the CommonJS export names for ESM import in node:
|
|
208
213
|
0 && (module.exports = {
|
|
209
214
|
BaseAIPlugin,
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/index.ts","../src/lib/BaseAIPlugin.ts","../src/lib/transforms/insertAINodes.ts","../src/lib/transforms/removeAIMarks.ts","../src/lib/transforms/removeAINodes.ts","../src/lib/transforms/undoAI.ts","../src/lib/transforms/withAIBatch.ts","../src/lib/utils/getEditorPrompt.ts","../src/lib/utils/getMarkdown.ts"],"sourcesContent":["/**\n * @file Automatically generated by barrelsby.\n */\n\nexport * from './lib/index';\n","import {\n type OmitFirst,\n type PluginConfig,\n bindFirst,\n createTSlatePlugin,\n KEYS,\n} from 'platejs';\n\nimport { removeAIMarks, undoAI } from './transforms';\nimport { insertAINodes } from './transforms/insertAINodes';\nimport { removeAINodes } from './transforms/removeAINodes';\n\nexport type BaseAIPluginConfig = PluginConfig<\n 'ai',\n {},\n {},\n {\n ai: {\n insertNodes: OmitFirst<typeof insertAINodes>;\n removeMarks: OmitFirst<typeof removeAIMarks>;\n removeNodes: OmitFirst<typeof removeAINodes>;\n };\n }\n>;\n\nexport const BaseAIPlugin = createTSlatePlugin({\n key: KEYS.ai,\n node: { isDecoration: false, isLeaf: true },\n}).extendTransforms(({ editor }) => ({\n insertNodes: bindFirst(insertAINodes, editor),\n removeMarks: bindFirst(removeAIMarks, editor),\n removeNodes: bindFirst(removeAINodes, editor),\n undo: bindFirst(undoAI, editor),\n}));\n","import type { Descendant, Path, SlateEditor } from 'platejs';\n\nexport const insertAINodes = (\n editor: SlateEditor,\n nodes: Descendant[],\n {\n target,\n }: {\n target?: Path;\n } = {}\n) => {\n if (!target && !editor.selection?.focus.path) return;\n\n const aiNodes = nodes.map((node) => ({\n ...node,\n ai: true,\n }));\n\n editor.tf.withoutNormalizing(() => {\n editor.tf.insertNodes(aiNodes, {\n at: editor.api.end(target || editor.selection!.focus.path),\n select: true,\n });\n editor.tf.collapse({ edge: 'end' });\n });\n};\n","import { type SlateEditor, type TLocation, getPluginType, KEYS } from 'platejs';\n\nexport const removeAIMarks = (\n editor: SlateEditor,\n { at = [] }: { at?: TLocation } = {}\n) => {\n const nodeType = getPluginType(editor, KEYS.ai);\n\n editor.tf.unsetNodes(nodeType, {\n at,\n match: (n) => (n as any)[nodeType],\n });\n};\n","import { type Path, type SlateEditor, TextApi } from 'platejs';\n\nexport const removeAINodes = (\n editor: SlateEditor,\n { at = [] }: { at?: Path } = {}\n) => {\n editor.tf.removeNodes({\n at,\n match: (n) => TextApi.isText(n) && !!(n as any).ai,\n });\n};\n","import type { SlateEditor } from 'platejs';\n\nexport const undoAI = (editor: SlateEditor) => {\n if (\n (editor.history.undos.at(-1) as any)?.ai &&\n editor.api.some({\n at: [],\n match: (n) => !!(n as any).ai,\n })\n ) {\n editor.undo();\n editor.history.redos.pop();\n }\n};\n","import type { History, SlateEditor } from 'platejs';\n\nexport type AIBatch = History['undos'][number] & { ai?: boolean };\n\nexport const withAIBatch = (\n editor: SlateEditor,\n fn: () => void,\n {\n split,\n }: {\n split?: boolean;\n } = {}\n) => {\n if (split) {\n editor.tf.withNewBatch(fn);\n } else {\n editor.tf.withMerging(fn);\n }\n\n const lastBatch = editor.history.undos?.at(-1) as AIBatch | undefined;\n\n if (lastBatch) {\n lastBatch.ai = true;\n }\n};\n","import { isSelecting } from '@platejs/selection';\nimport { type SlateEditor, KEYS } from 'platejs';\n\nimport { getMarkdown } from './getMarkdown';\n\nexport type EditorPrompt =\n | ((params: EditorPromptParams) => string)\n | PromptConfig\n | string;\n\nexport interface EditorPromptParams {\n editor: SlateEditor;\n isBlockSelecting: boolean;\n isSelecting: boolean;\n}\n\nexport type MarkdownType =\n | 'block'\n | 'blockSelection'\n | 'blockSelectionWithBlockId'\n | 'blockWithBlockId'\n | 'editor'\n | 'editorWithBlockId';\n\nexport interface PromptConfig {\n default: string;\n blockSelecting?: string;\n selecting?: string;\n}\n\nexport const replacePlaceholders = (\n editor: SlateEditor,\n text: string,\n {\n prompt,\n }: {\n prompt?: string;\n } = {}\n): string => {\n let result = text.replace('{prompt}', prompt || '');\n\n const placeholders: Record<string, MarkdownType> = {\n '{blockSelectionWithBlockId}': 'blockSelectionWithBlockId',\n '{blockSelection}': 'blockSelection',\n '{blockWithBlockId}': 'blockWithBlockId',\n '{block}': 'block',\n '{editorWithBlockId}': 'editorWithBlockId',\n '{editor}': 'editor',\n };\n\n Object.entries(placeholders).forEach(([placeholder, type]) => {\n if (result.includes(placeholder)) {\n result = result.replace(placeholder, getMarkdown(editor, { type }));\n }\n });\n\n return result;\n};\n\nconst createPromptFromConfig = (\n config: PromptConfig,\n params: EditorPromptParams\n): string => {\n const { isBlockSelecting, isSelecting } = params;\n\n if (isBlockSelecting && config.blockSelecting) {\n return config.blockSelecting ?? config.default;\n } else if (isSelecting && config.selecting) {\n return config.selecting ?? config.default;\n } else {\n return config.default;\n }\n};\n\nexport const getEditorPrompt = (\n editor: SlateEditor,\n {\n prompt = '',\n }: {\n prompt?: EditorPrompt;\n }\n): string => {\n const params: EditorPromptParams = {\n editor,\n isBlockSelecting: editor.getOption(\n { key: KEYS.blockSelection },\n 'isSelectingSome'\n ),\n isSelecting: isSelecting(editor),\n };\n\n let promptText = '';\n\n if (typeof prompt === 'function') {\n promptText = prompt(params);\n } else if (typeof prompt === 'object') {\n promptText = createPromptFromConfig(prompt, params);\n } else {\n promptText = prompt;\n }\n\n return promptText;\n};\n","import { serializeMd } from '@platejs/markdown';\nimport { type SlateEditor, type TElement, KEYS } from 'platejs';\n\nimport type { MarkdownType } from './getEditorPrompt';\n\n// Internal\nexport const getMarkdown = (\n editor: SlateEditor,\n {\n type,\n }: {\n type: MarkdownType;\n }\n) => {\n if (type === 'editor' || type === 'editorWithBlockId') {\n return serializeMd(editor, {\n withBlockId: type === 'editorWithBlockId',\n });\n }\n\n if (type === 'block' || type === 'blockWithBlockId') {\n const blocks = editor.api.blocks({ mode: 'highest' }).map(([node]) => node);\n\n return serializeMd(editor, {\n value: blocks,\n withBlockId: type === 'blockWithBlockId',\n });\n }\n\n if (type === 'blockSelection' || type === 'blockSelectionWithBlockId') {\n const fragment = editor.api.fragment<TElement>();\n\n // Remove any block formatting\n if (fragment.length === 1) {\n const modifiedFragment = [\n {\n children: fragment[0].children,\n type: KEYS.p,\n },\n ];\n\n return serializeMd(editor, {\n value: modifiedFragment,\n withBlockId: type === 'blockSelectionWithBlockId',\n });\n }\n\n return serializeMd(editor, {\n value: fragment,\n withBlockId: type === 'blockSelectionWithBlockId',\n });\n }\n\n return '';\n};\n"],"mappings":"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","names":["import_platejs","import_platejs","import_platejs","import_platejs","isSelecting"]}
|
|
1
|
+
{"version":3,"sources":["../src/index.ts","../src/lib/BaseAIPlugin.ts","../src/lib/transforms/insertAINodes.ts","../src/lib/transforms/removeAIMarks.ts","../src/lib/transforms/removeAINodes.ts","../src/lib/transforms/undoAI.ts","../src/lib/transforms/withAIBatch.ts","../src/lib/utils/getEditorPrompt.ts","../src/lib/utils/getMarkdown.ts","../src/lib/utils/replacePlaceholders.ts"],"sourcesContent":["/**\n * @file Automatically generated by barrelsby.\n */\n\nexport * from './lib/index';\n","import {\n type OmitFirst,\n type PluginConfig,\n bindFirst,\n createTSlatePlugin,\n KEYS,\n} from 'platejs';\n\nimport { removeAIMarks, undoAI } from './transforms';\nimport { insertAINodes } from './transforms/insertAINodes';\nimport { removeAINodes } from './transforms/removeAINodes';\n\nexport type BaseAIPluginConfig = PluginConfig<\n 'ai',\n {},\n {},\n {\n ai: {\n insertNodes: OmitFirst<typeof insertAINodes>;\n removeMarks: OmitFirst<typeof removeAIMarks>;\n removeNodes: OmitFirst<typeof removeAINodes>;\n };\n }\n>;\n\nexport const BaseAIPlugin = createTSlatePlugin({\n key: KEYS.ai,\n node: { isDecoration: false, isLeaf: true },\n}).extendTransforms(({ editor }) => ({\n insertNodes: bindFirst(insertAINodes, editor),\n removeMarks: bindFirst(removeAIMarks, editor),\n removeNodes: bindFirst(removeAINodes, editor),\n undo: bindFirst(undoAI, editor),\n}));\n","import type { Descendant, Path, SlateEditor } from 'platejs';\n\nexport const insertAINodes = (\n editor: SlateEditor,\n nodes: Descendant[],\n {\n target,\n }: {\n target?: Path;\n } = {}\n) => {\n if (!target && !editor.selection?.focus.path) return;\n\n const aiNodes = nodes.map((node) => ({\n ...node,\n ai: true,\n }));\n\n editor.tf.withoutNormalizing(() => {\n editor.tf.insertNodes(aiNodes, {\n at: editor.api.end(target || editor.selection!.focus.path),\n select: true,\n });\n editor.tf.collapse({ edge: 'end' });\n });\n};\n","import { type SlateEditor, type TLocation, getPluginType, KEYS } from 'platejs';\n\nexport const removeAIMarks = (\n editor: SlateEditor,\n { at = [] }: { at?: TLocation } = {}\n) => {\n const nodeType = getPluginType(editor, KEYS.ai);\n\n editor.tf.unsetNodes(nodeType, {\n at,\n match: (n) => (n as any)[nodeType],\n });\n};\n","import { type Path, type SlateEditor, TextApi } from 'platejs';\n\nexport const removeAINodes = (\n editor: SlateEditor,\n { at = [] }: { at?: Path } = {}\n) => {\n editor.tf.removeNodes({\n at,\n match: (n) => TextApi.isText(n) && !!(n as any).ai,\n });\n};\n","import type { SlateEditor } from 'platejs';\n\nimport { getTransientSuggestionKey } from '@platejs/suggestion';\n\nexport const undoAI = (editor: SlateEditor) => {\n const hasAINodeOrAISuggestion =\n editor.api.some({\n at: [],\n match: (n) => !!(n as any).ai,\n }) ||\n editor.api.some({\n at: [],\n match: (n) => !!n[getTransientSuggestionKey()],\n });\n\n if ((editor.history.undos.at(-1) as any)?.ai && hasAINodeOrAISuggestion) {\n editor.undo();\n editor.history.redos.pop();\n }\n};\n","import type { History, SlateEditor } from 'platejs';\n\nexport type AIBatch = History['undos'][number] & { ai?: boolean };\n\nexport const withAIBatch = (\n editor: SlateEditor,\n fn: () => void,\n {\n split,\n }: {\n split?: boolean;\n } = {}\n) => {\n if (split) {\n editor.tf.withNewBatch(fn);\n } else {\n editor.tf.withMerging(fn);\n }\n\n const lastBatch = editor.history.undos?.at(-1) as AIBatch | undefined;\n\n if (lastBatch) {\n lastBatch.ai = true;\n }\n};\n","import { isSelecting } from '@platejs/selection';\nimport { type SlateEditor, KEYS } from 'platejs';\n\nexport type EditorPrompt =\n | ((params: EditorPromptParams) => string)\n | PromptConfig\n | string;\n\nexport interface EditorPromptParams {\n editor: SlateEditor;\n isBlockSelecting: boolean;\n isSelecting: boolean;\n}\n\nexport interface PromptConfig {\n default: string;\n blockSelecting?: string;\n selecting?: string;\n}\n\nconst createPromptFromConfig = (\n config: PromptConfig,\n params: EditorPromptParams\n): string => {\n const { isBlockSelecting, isSelecting } = params;\n\n if (isBlockSelecting && config.blockSelecting) {\n return config.blockSelecting ?? config.default;\n } else if (isSelecting && config.selecting) {\n return config.selecting ?? config.default;\n } else {\n return config.default;\n }\n};\n\nexport const getEditorPrompt = (\n editor: SlateEditor,\n {\n prompt = '',\n }: {\n prompt?: EditorPrompt;\n }\n): string => {\n const params: EditorPromptParams = {\n editor,\n isBlockSelecting: editor.getOption(\n { key: KEYS.blockSelection },\n 'isSelectingSome'\n ),\n isSelecting: isSelecting(editor),\n };\n\n let promptText = '';\n\n if (typeof prompt === 'function') {\n promptText = prompt(params);\n } else if (typeof prompt === 'object') {\n promptText = createPromptFromConfig(prompt, params);\n } else {\n promptText = prompt;\n }\n\n return promptText;\n};\n","import { serializeMd } from '@platejs/markdown';\nimport { type SlateEditor, type TElement, KEYS } from 'platejs';\n\nimport type { MarkdownType } from './replacePlaceholders';\n\n// Internal\nexport const getMarkdown = (\n editor: SlateEditor,\n {\n type,\n }: {\n type: MarkdownType;\n }\n) => {\n if (type === 'editor' || type === 'editorWithBlockId') {\n return serializeMd(editor, {\n withBlockId: type === 'editorWithBlockId',\n });\n }\n\n if (type === 'block' || type === 'blockWithBlockId') {\n const blocks = editor.api.blocks({ mode: 'highest' }).map(([node]) => node);\n\n return serializeMd(editor, {\n value: blocks,\n withBlockId: type === 'blockWithBlockId',\n });\n }\n\n if (type === 'blockSelection' || type === 'blockSelectionWithBlockId') {\n const fragment = editor.api.fragment<TElement>();\n\n // Remove any block formatting\n if (fragment.length === 1) {\n const modifiedFragment = [\n {\n children: fragment[0].children,\n type: KEYS.p,\n },\n ];\n\n return serializeMd(editor, {\n value: modifiedFragment,\n withBlockId: type === 'blockSelectionWithBlockId',\n });\n }\n\n return serializeMd(editor, {\n value: fragment,\n withBlockId: type === 'blockSelectionWithBlockId',\n });\n }\n\n return '';\n};\n","import type { SlateEditor } from 'platejs';\n\nimport { getMarkdown } from './getMarkdown';\n\nexport type MarkdownType =\n | 'block'\n | 'blockSelection'\n | 'blockSelectionWithBlockId'\n | 'blockWithBlockId'\n | 'editor'\n | 'editorWithBlockId';\n\nexport const replacePlaceholders = (\n editor: SlateEditor,\n text: string,\n {\n prompt,\n }: {\n prompt?: string;\n } = {}\n): string => {\n let result = text.replace('{prompt}', prompt || '');\n\n const placeholders: Record<string, MarkdownType> = {\n '{blockSelectionWithBlockId}': 'blockSelectionWithBlockId',\n '{blockSelection}': 'blockSelection',\n '{blockWithBlockId}': 'blockWithBlockId',\n '{block}': 'block',\n '{editorWithBlockId}': 'editorWithBlockId',\n '{editor}': 'editor',\n };\n\n Object.entries(placeholders).forEach(([placeholder, type]) => {\n if (result.includes(placeholder)) {\n result = result.replace(placeholder, getMarkdown(editor, { type }));\n }\n });\n\n return result;\n};\n"],"mappings":"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","names":["import_platejs","import_platejs","import_platejs","isSelecting","import_platejs"]}
|
package/dist/index.mjs
CHANGED
|
@@ -43,11 +43,16 @@ var removeAINodes = (editor, { at = [] } = {}) => {
|
|
|
43
43
|
};
|
|
44
44
|
|
|
45
45
|
// src/lib/transforms/undoAI.ts
|
|
46
|
+
import { getTransientSuggestionKey } from "@platejs/suggestion";
|
|
46
47
|
var undoAI = (editor) => {
|
|
47
|
-
|
|
48
|
+
const hasAINodeOrAISuggestion = editor.api.some({
|
|
48
49
|
at: [],
|
|
49
50
|
match: (n) => !!n.ai
|
|
50
|
-
})
|
|
51
|
+
}) || editor.api.some({
|
|
52
|
+
at: [],
|
|
53
|
+
match: (n) => !!n[getTransientSuggestionKey()]
|
|
54
|
+
});
|
|
55
|
+
if (editor.history.undos.at(-1)?.ai && hasAINodeOrAISuggestion) {
|
|
51
56
|
editor.undo();
|
|
52
57
|
editor.history.redos.pop();
|
|
53
58
|
}
|
|
@@ -81,11 +86,42 @@ var BaseAIPlugin = createTSlatePlugin({
|
|
|
81
86
|
|
|
82
87
|
// src/lib/utils/getEditorPrompt.ts
|
|
83
88
|
import { isSelecting } from "@platejs/selection";
|
|
84
|
-
import { KEYS as
|
|
89
|
+
import { KEYS as KEYS3 } from "platejs";
|
|
90
|
+
var createPromptFromConfig = (config, params) => {
|
|
91
|
+
const { isBlockSelecting, isSelecting: isSelecting2 } = params;
|
|
92
|
+
if (isBlockSelecting && config.blockSelecting) {
|
|
93
|
+
return config.blockSelecting ?? config.default;
|
|
94
|
+
} else if (isSelecting2 && config.selecting) {
|
|
95
|
+
return config.selecting ?? config.default;
|
|
96
|
+
} else {
|
|
97
|
+
return config.default;
|
|
98
|
+
}
|
|
99
|
+
};
|
|
100
|
+
var getEditorPrompt = (editor, {
|
|
101
|
+
prompt = ""
|
|
102
|
+
}) => {
|
|
103
|
+
const params = {
|
|
104
|
+
editor,
|
|
105
|
+
isBlockSelecting: editor.getOption(
|
|
106
|
+
{ key: KEYS3.blockSelection },
|
|
107
|
+
"isSelectingSome"
|
|
108
|
+
),
|
|
109
|
+
isSelecting: isSelecting(editor)
|
|
110
|
+
};
|
|
111
|
+
let promptText = "";
|
|
112
|
+
if (typeof prompt === "function") {
|
|
113
|
+
promptText = prompt(params);
|
|
114
|
+
} else if (typeof prompt === "object") {
|
|
115
|
+
promptText = createPromptFromConfig(prompt, params);
|
|
116
|
+
} else {
|
|
117
|
+
promptText = prompt;
|
|
118
|
+
}
|
|
119
|
+
return promptText;
|
|
120
|
+
};
|
|
85
121
|
|
|
86
122
|
// src/lib/utils/getMarkdown.ts
|
|
87
123
|
import { serializeMd } from "@platejs/markdown";
|
|
88
|
-
import { KEYS as
|
|
124
|
+
import { KEYS as KEYS4 } from "platejs";
|
|
89
125
|
var getMarkdown = (editor, {
|
|
90
126
|
type
|
|
91
127
|
}) => {
|
|
@@ -107,7 +143,7 @@ var getMarkdown = (editor, {
|
|
|
107
143
|
const modifiedFragment = [
|
|
108
144
|
{
|
|
109
145
|
children: fragment[0].children,
|
|
110
|
-
type:
|
|
146
|
+
type: KEYS4.p
|
|
111
147
|
}
|
|
112
148
|
];
|
|
113
149
|
return serializeMd(editor, {
|
|
@@ -123,7 +159,7 @@ var getMarkdown = (editor, {
|
|
|
123
159
|
return "";
|
|
124
160
|
};
|
|
125
161
|
|
|
126
|
-
// src/lib/utils/
|
|
162
|
+
// src/lib/utils/replacePlaceholders.ts
|
|
127
163
|
var replacePlaceholders = (editor, text, {
|
|
128
164
|
prompt
|
|
129
165
|
} = {}) => {
|
|
@@ -143,37 +179,6 @@ var replacePlaceholders = (editor, text, {
|
|
|
143
179
|
});
|
|
144
180
|
return result;
|
|
145
181
|
};
|
|
146
|
-
var createPromptFromConfig = (config, params) => {
|
|
147
|
-
const { isBlockSelecting, isSelecting: isSelecting2 } = params;
|
|
148
|
-
if (isBlockSelecting && config.blockSelecting) {
|
|
149
|
-
return config.blockSelecting ?? config.default;
|
|
150
|
-
} else if (isSelecting2 && config.selecting) {
|
|
151
|
-
return config.selecting ?? config.default;
|
|
152
|
-
} else {
|
|
153
|
-
return config.default;
|
|
154
|
-
}
|
|
155
|
-
};
|
|
156
|
-
var getEditorPrompt = (editor, {
|
|
157
|
-
prompt = ""
|
|
158
|
-
}) => {
|
|
159
|
-
const params = {
|
|
160
|
-
editor,
|
|
161
|
-
isBlockSelecting: editor.getOption(
|
|
162
|
-
{ key: KEYS4.blockSelection },
|
|
163
|
-
"isSelectingSome"
|
|
164
|
-
),
|
|
165
|
-
isSelecting: isSelecting(editor)
|
|
166
|
-
};
|
|
167
|
-
let promptText = "";
|
|
168
|
-
if (typeof prompt === "function") {
|
|
169
|
-
promptText = prompt(params);
|
|
170
|
-
} else if (typeof prompt === "object") {
|
|
171
|
-
promptText = createPromptFromConfig(prompt, params);
|
|
172
|
-
} else {
|
|
173
|
-
promptText = prompt;
|
|
174
|
-
}
|
|
175
|
-
return promptText;
|
|
176
|
-
};
|
|
177
182
|
export {
|
|
178
183
|
BaseAIPlugin,
|
|
179
184
|
getEditorPrompt,
|
package/dist/index.mjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/lib/BaseAIPlugin.ts","../src/lib/transforms/insertAINodes.ts","../src/lib/transforms/removeAIMarks.ts","../src/lib/transforms/removeAINodes.ts","../src/lib/transforms/undoAI.ts","../src/lib/transforms/withAIBatch.ts","../src/lib/utils/getEditorPrompt.ts","../src/lib/utils/getMarkdown.ts"],"sourcesContent":["import {\n type OmitFirst,\n type PluginConfig,\n bindFirst,\n createTSlatePlugin,\n KEYS,\n} from 'platejs';\n\nimport { removeAIMarks, undoAI } from './transforms';\nimport { insertAINodes } from './transforms/insertAINodes';\nimport { removeAINodes } from './transforms/removeAINodes';\n\nexport type BaseAIPluginConfig = PluginConfig<\n 'ai',\n {},\n {},\n {\n ai: {\n insertNodes: OmitFirst<typeof insertAINodes>;\n removeMarks: OmitFirst<typeof removeAIMarks>;\n removeNodes: OmitFirst<typeof removeAINodes>;\n };\n }\n>;\n\nexport const BaseAIPlugin = createTSlatePlugin({\n key: KEYS.ai,\n node: { isDecoration: false, isLeaf: true },\n}).extendTransforms(({ editor }) => ({\n insertNodes: bindFirst(insertAINodes, editor),\n removeMarks: bindFirst(removeAIMarks, editor),\n removeNodes: bindFirst(removeAINodes, editor),\n undo: bindFirst(undoAI, editor),\n}));\n","import type { Descendant, Path, SlateEditor } from 'platejs';\n\nexport const insertAINodes = (\n editor: SlateEditor,\n nodes: Descendant[],\n {\n target,\n }: {\n target?: Path;\n } = {}\n) => {\n if (!target && !editor.selection?.focus.path) return;\n\n const aiNodes = nodes.map((node) => ({\n ...node,\n ai: true,\n }));\n\n editor.tf.withoutNormalizing(() => {\n editor.tf.insertNodes(aiNodes, {\n at: editor.api.end(target || editor.selection!.focus.path),\n select: true,\n });\n editor.tf.collapse({ edge: 'end' });\n });\n};\n","import { type SlateEditor, type TLocation, getPluginType, KEYS } from 'platejs';\n\nexport const removeAIMarks = (\n editor: SlateEditor,\n { at = [] }: { at?: TLocation } = {}\n) => {\n const nodeType = getPluginType(editor, KEYS.ai);\n\n editor.tf.unsetNodes(nodeType, {\n at,\n match: (n) => (n as any)[nodeType],\n });\n};\n","import { type Path, type SlateEditor, TextApi } from 'platejs';\n\nexport const removeAINodes = (\n editor: SlateEditor,\n { at = [] }: { at?: Path } = {}\n) => {\n editor.tf.removeNodes({\n at,\n match: (n) => TextApi.isText(n) && !!(n as any).ai,\n });\n};\n","import type { SlateEditor } from 'platejs';\n\nexport const undoAI = (editor: SlateEditor) => {\n if (\n (editor.history.undos.at(-1) as any)?.ai &&\n editor.api.some({\n at: [],\n match: (n) => !!(n as any).ai,\n })\n ) {\n editor.undo();\n editor.history.redos.pop();\n }\n};\n","import type { History, SlateEditor } from 'platejs';\n\nexport type AIBatch = History['undos'][number] & { ai?: boolean };\n\nexport const withAIBatch = (\n editor: SlateEditor,\n fn: () => void,\n {\n split,\n }: {\n split?: boolean;\n } = {}\n) => {\n if (split) {\n editor.tf.withNewBatch(fn);\n } else {\n editor.tf.withMerging(fn);\n }\n\n const lastBatch = editor.history.undos?.at(-1) as AIBatch | undefined;\n\n if (lastBatch) {\n lastBatch.ai = true;\n }\n};\n","import { isSelecting } from '@platejs/selection';\nimport { type SlateEditor, KEYS } from 'platejs';\n\nimport { getMarkdown } from './getMarkdown';\n\nexport type EditorPrompt =\n | ((params: EditorPromptParams) => string)\n | PromptConfig\n | string;\n\nexport interface EditorPromptParams {\n editor: SlateEditor;\n isBlockSelecting: boolean;\n isSelecting: boolean;\n}\n\nexport type MarkdownType =\n | 'block'\n | 'blockSelection'\n | 'blockSelectionWithBlockId'\n | 'blockWithBlockId'\n | 'editor'\n | 'editorWithBlockId';\n\nexport interface PromptConfig {\n default: string;\n blockSelecting?: string;\n selecting?: string;\n}\n\nexport const replacePlaceholders = (\n editor: SlateEditor,\n text: string,\n {\n prompt,\n }: {\n prompt?: string;\n } = {}\n): string => {\n let result = text.replace('{prompt}', prompt || '');\n\n const placeholders: Record<string, MarkdownType> = {\n '{blockSelectionWithBlockId}': 'blockSelectionWithBlockId',\n '{blockSelection}': 'blockSelection',\n '{blockWithBlockId}': 'blockWithBlockId',\n '{block}': 'block',\n '{editorWithBlockId}': 'editorWithBlockId',\n '{editor}': 'editor',\n };\n\n Object.entries(placeholders).forEach(([placeholder, type]) => {\n if (result.includes(placeholder)) {\n result = result.replace(placeholder, getMarkdown(editor, { type }));\n }\n });\n\n return result;\n};\n\nconst createPromptFromConfig = (\n config: PromptConfig,\n params: EditorPromptParams\n): string => {\n const { isBlockSelecting, isSelecting } = params;\n\n if (isBlockSelecting && config.blockSelecting) {\n return config.blockSelecting ?? config.default;\n } else if (isSelecting && config.selecting) {\n return config.selecting ?? config.default;\n } else {\n return config.default;\n }\n};\n\nexport const getEditorPrompt = (\n editor: SlateEditor,\n {\n prompt = '',\n }: {\n prompt?: EditorPrompt;\n }\n): string => {\n const params: EditorPromptParams = {\n editor,\n isBlockSelecting: editor.getOption(\n { key: KEYS.blockSelection },\n 'isSelectingSome'\n ),\n isSelecting: isSelecting(editor),\n };\n\n let promptText = '';\n\n if (typeof prompt === 'function') {\n promptText = prompt(params);\n } else if (typeof prompt === 'object') {\n promptText = createPromptFromConfig(prompt, params);\n } else {\n promptText = prompt;\n }\n\n return promptText;\n};\n","import { serializeMd } from '@platejs/markdown';\nimport { type SlateEditor, type TElement, KEYS } from 'platejs';\n\nimport type { MarkdownType } from './getEditorPrompt';\n\n// Internal\nexport const getMarkdown = (\n editor: SlateEditor,\n {\n type,\n }: {\n type: MarkdownType;\n }\n) => {\n if (type === 'editor' || type === 'editorWithBlockId') {\n return serializeMd(editor, {\n withBlockId: type === 'editorWithBlockId',\n });\n }\n\n if (type === 'block' || type === 'blockWithBlockId') {\n const blocks = editor.api.blocks({ mode: 'highest' }).map(([node]) => node);\n\n return serializeMd(editor, {\n value: blocks,\n withBlockId: type === 'blockWithBlockId',\n });\n }\n\n if (type === 'blockSelection' || type === 'blockSelectionWithBlockId') {\n const fragment = editor.api.fragment<TElement>();\n\n // Remove any block formatting\n if (fragment.length === 1) {\n const modifiedFragment = [\n {\n children: fragment[0].children,\n type: KEYS.p,\n },\n ];\n\n return serializeMd(editor, {\n value: modifiedFragment,\n withBlockId: type === 'blockSelectionWithBlockId',\n });\n }\n\n return serializeMd(editor, {\n value: fragment,\n withBlockId: type === 'blockSelectionWithBlockId',\n });\n }\n\n return '';\n};\n"],"mappings":"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","names":["KEYS","KEYS","KEYS","KEYS","isSelecting","KEYS"]}
|
|
1
|
+
{"version":3,"sources":["../src/lib/BaseAIPlugin.ts","../src/lib/transforms/insertAINodes.ts","../src/lib/transforms/removeAIMarks.ts","../src/lib/transforms/removeAINodes.ts","../src/lib/transforms/undoAI.ts","../src/lib/transforms/withAIBatch.ts","../src/lib/utils/getEditorPrompt.ts","../src/lib/utils/getMarkdown.ts","../src/lib/utils/replacePlaceholders.ts"],"sourcesContent":["import {\n type OmitFirst,\n type PluginConfig,\n bindFirst,\n createTSlatePlugin,\n KEYS,\n} from 'platejs';\n\nimport { removeAIMarks, undoAI } from './transforms';\nimport { insertAINodes } from './transforms/insertAINodes';\nimport { removeAINodes } from './transforms/removeAINodes';\n\nexport type BaseAIPluginConfig = PluginConfig<\n 'ai',\n {},\n {},\n {\n ai: {\n insertNodes: OmitFirst<typeof insertAINodes>;\n removeMarks: OmitFirst<typeof removeAIMarks>;\n removeNodes: OmitFirst<typeof removeAINodes>;\n };\n }\n>;\n\nexport const BaseAIPlugin = createTSlatePlugin({\n key: KEYS.ai,\n node: { isDecoration: false, isLeaf: true },\n}).extendTransforms(({ editor }) => ({\n insertNodes: bindFirst(insertAINodes, editor),\n removeMarks: bindFirst(removeAIMarks, editor),\n removeNodes: bindFirst(removeAINodes, editor),\n undo: bindFirst(undoAI, editor),\n}));\n","import type { Descendant, Path, SlateEditor } from 'platejs';\n\nexport const insertAINodes = (\n editor: SlateEditor,\n nodes: Descendant[],\n {\n target,\n }: {\n target?: Path;\n } = {}\n) => {\n if (!target && !editor.selection?.focus.path) return;\n\n const aiNodes = nodes.map((node) => ({\n ...node,\n ai: true,\n }));\n\n editor.tf.withoutNormalizing(() => {\n editor.tf.insertNodes(aiNodes, {\n at: editor.api.end(target || editor.selection!.focus.path),\n select: true,\n });\n editor.tf.collapse({ edge: 'end' });\n });\n};\n","import { type SlateEditor, type TLocation, getPluginType, KEYS } from 'platejs';\n\nexport const removeAIMarks = (\n editor: SlateEditor,\n { at = [] }: { at?: TLocation } = {}\n) => {\n const nodeType = getPluginType(editor, KEYS.ai);\n\n editor.tf.unsetNodes(nodeType, {\n at,\n match: (n) => (n as any)[nodeType],\n });\n};\n","import { type Path, type SlateEditor, TextApi } from 'platejs';\n\nexport const removeAINodes = (\n editor: SlateEditor,\n { at = [] }: { at?: Path } = {}\n) => {\n editor.tf.removeNodes({\n at,\n match: (n) => TextApi.isText(n) && !!(n as any).ai,\n });\n};\n","import type { SlateEditor } from 'platejs';\n\nimport { getTransientSuggestionKey } from '@platejs/suggestion';\n\nexport const undoAI = (editor: SlateEditor) => {\n const hasAINodeOrAISuggestion =\n editor.api.some({\n at: [],\n match: (n) => !!(n as any).ai,\n }) ||\n editor.api.some({\n at: [],\n match: (n) => !!n[getTransientSuggestionKey()],\n });\n\n if ((editor.history.undos.at(-1) as any)?.ai && hasAINodeOrAISuggestion) {\n editor.undo();\n editor.history.redos.pop();\n }\n};\n","import type { History, SlateEditor } from 'platejs';\n\nexport type AIBatch = History['undos'][number] & { ai?: boolean };\n\nexport const withAIBatch = (\n editor: SlateEditor,\n fn: () => void,\n {\n split,\n }: {\n split?: boolean;\n } = {}\n) => {\n if (split) {\n editor.tf.withNewBatch(fn);\n } else {\n editor.tf.withMerging(fn);\n }\n\n const lastBatch = editor.history.undos?.at(-1) as AIBatch | undefined;\n\n if (lastBatch) {\n lastBatch.ai = true;\n }\n};\n","import { isSelecting } from '@platejs/selection';\nimport { type SlateEditor, KEYS } from 'platejs';\n\nexport type EditorPrompt =\n | ((params: EditorPromptParams) => string)\n | PromptConfig\n | string;\n\nexport interface EditorPromptParams {\n editor: SlateEditor;\n isBlockSelecting: boolean;\n isSelecting: boolean;\n}\n\nexport interface PromptConfig {\n default: string;\n blockSelecting?: string;\n selecting?: string;\n}\n\nconst createPromptFromConfig = (\n config: PromptConfig,\n params: EditorPromptParams\n): string => {\n const { isBlockSelecting, isSelecting } = params;\n\n if (isBlockSelecting && config.blockSelecting) {\n return config.blockSelecting ?? config.default;\n } else if (isSelecting && config.selecting) {\n return config.selecting ?? config.default;\n } else {\n return config.default;\n }\n};\n\nexport const getEditorPrompt = (\n editor: SlateEditor,\n {\n prompt = '',\n }: {\n prompt?: EditorPrompt;\n }\n): string => {\n const params: EditorPromptParams = {\n editor,\n isBlockSelecting: editor.getOption(\n { key: KEYS.blockSelection },\n 'isSelectingSome'\n ),\n isSelecting: isSelecting(editor),\n };\n\n let promptText = '';\n\n if (typeof prompt === 'function') {\n promptText = prompt(params);\n } else if (typeof prompt === 'object') {\n promptText = createPromptFromConfig(prompt, params);\n } else {\n promptText = prompt;\n }\n\n return promptText;\n};\n","import { serializeMd } from '@platejs/markdown';\nimport { type SlateEditor, type TElement, KEYS } from 'platejs';\n\nimport type { MarkdownType } from './replacePlaceholders';\n\n// Internal\nexport const getMarkdown = (\n editor: SlateEditor,\n {\n type,\n }: {\n type: MarkdownType;\n }\n) => {\n if (type === 'editor' || type === 'editorWithBlockId') {\n return serializeMd(editor, {\n withBlockId: type === 'editorWithBlockId',\n });\n }\n\n if (type === 'block' || type === 'blockWithBlockId') {\n const blocks = editor.api.blocks({ mode: 'highest' }).map(([node]) => node);\n\n return serializeMd(editor, {\n value: blocks,\n withBlockId: type === 'blockWithBlockId',\n });\n }\n\n if (type === 'blockSelection' || type === 'blockSelectionWithBlockId') {\n const fragment = editor.api.fragment<TElement>();\n\n // Remove any block formatting\n if (fragment.length === 1) {\n const modifiedFragment = [\n {\n children: fragment[0].children,\n type: KEYS.p,\n },\n ];\n\n return serializeMd(editor, {\n value: modifiedFragment,\n withBlockId: type === 'blockSelectionWithBlockId',\n });\n }\n\n return serializeMd(editor, {\n value: fragment,\n withBlockId: type === 'blockSelectionWithBlockId',\n });\n }\n\n return '';\n};\n","import type { SlateEditor } from 'platejs';\n\nimport { getMarkdown } from './getMarkdown';\n\nexport type MarkdownType =\n | 'block'\n | 'blockSelection'\n | 'blockSelectionWithBlockId'\n | 'blockWithBlockId'\n | 'editor'\n | 'editorWithBlockId';\n\nexport const replacePlaceholders = (\n editor: SlateEditor,\n text: string,\n {\n prompt,\n }: {\n prompt?: string;\n } = {}\n): string => {\n let result = text.replace('{prompt}', prompt || '');\n\n const placeholders: Record<string, MarkdownType> = {\n '{blockSelectionWithBlockId}': 'blockSelectionWithBlockId',\n '{blockSelection}': 'blockSelection',\n '{blockWithBlockId}': 'blockWithBlockId',\n '{block}': 'block',\n '{editorWithBlockId}': 'editorWithBlockId',\n '{editor}': 'editor',\n };\n\n Object.entries(placeholders).forEach(([placeholder, type]) => {\n if (result.includes(placeholder)) {\n result = result.replace(placeholder, getMarkdown(editor, { type }));\n }\n });\n\n return result;\n};\n"],"mappings":"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","names":["KEYS","KEYS","KEYS","isSelecting","KEYS"]}
|
package/dist/react/index.d.mts
CHANGED
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
import * as platejs_react from 'platejs/react';
|
|
2
2
|
import { PlateEditor, OverrideEditor, RenderNodeWrapperProps } from 'platejs/react';
|
|
3
3
|
import * as platejs from 'platejs';
|
|
4
|
-
import { ExtendConfig, SlateEditor, Range, NodeEntry, TElement, PluginConfig, Path, OmitFirst, EditorNodesOptions, TText, Descendant, RemoveNodesOptions } from 'platejs';
|
|
5
|
-
import { B as BaseAIPluginConfig, b as AIMode, E as EditorPrompt, A as AIToolName } from '../getEditorPrompt-
|
|
4
|
+
import { ExtendConfig, SlateEditor, Range, NodeEntry, TElement, PluginConfig, Path, TIdElement, TRange, OmitFirst, EditorNodesOptions, TText, Descendant, RemoveNodesOptions } from 'platejs';
|
|
5
|
+
import { B as BaseAIPluginConfig, b as AIMode, E as EditorPrompt, A as AIToolName } from '../getEditorPrompt-C7EEuMw8.mjs';
|
|
6
6
|
import { UIMessage, ChatRequestOptions } from 'ai';
|
|
7
7
|
import { Range as Range$1 } from 'slate';
|
|
8
8
|
import { UseChatHelpers } from '@ai-sdk/react';
|
|
@@ -45,10 +45,14 @@ declare function findTextRangeInBlock({ block, findText, }: {
|
|
|
45
45
|
}): Range$1 | null;
|
|
46
46
|
|
|
47
47
|
declare const acceptAIChat: (editor: PlateEditor) => void;
|
|
48
|
+
declare const acceptSuggestions: (editor: PlateEditor) => void;
|
|
48
49
|
|
|
49
50
|
declare const insertBelowAIChat: (editor: PlateEditor, sourceEditor: SlateEditor, { format }?: {
|
|
50
51
|
format?: "all" | "none" | "single";
|
|
51
52
|
}) => void;
|
|
53
|
+
declare const insertBelowGenerate: (editor: PlateEditor, sourceEditor: SlateEditor, { format }?: {
|
|
54
|
+
format?: "all" | "none" | "single";
|
|
55
|
+
}) => void;
|
|
52
56
|
|
|
53
57
|
declare const createFormattedBlocks: ({ blocks, format, sourceBlock, }: {
|
|
54
58
|
blocks: TElement[];
|
|
@@ -73,9 +77,12 @@ type AIChatPluginConfig = PluginConfig<'aiChat', {
|
|
|
73
77
|
_blockPath: Path | null;
|
|
74
78
|
/** @private Using For streamInsertChunk */
|
|
75
79
|
_mdxName: string | null;
|
|
80
|
+
_replaceIds: string[];
|
|
76
81
|
/** @private The Editor used to generate the AI response. */
|
|
77
82
|
aiEditor: SlateEditor | null;
|
|
78
83
|
chat: UseChatHelpers<ChatMessage>;
|
|
84
|
+
chatNodes: TIdElement[];
|
|
85
|
+
chatSelection: TRange | null;
|
|
79
86
|
/** @deprecated Use api.aiChat.node({streaming:true}) instead */
|
|
80
87
|
experimental_lastTextId: string | null;
|
|
81
88
|
/**
|
|
@@ -94,7 +101,9 @@ type AIChatPluginConfig = PluginConfig<'aiChat', {
|
|
|
94
101
|
aiChat: {
|
|
95
102
|
reset: OmitFirst<typeof resetAIChat>;
|
|
96
103
|
submit: OmitFirst<typeof submitAIChat>;
|
|
97
|
-
hide: (
|
|
104
|
+
hide: (options?: {
|
|
105
|
+
focus?: boolean;
|
|
106
|
+
}) => void;
|
|
98
107
|
node: (options?: EditorNodesOptions & {
|
|
99
108
|
anchor?: boolean;
|
|
100
109
|
streaming?: boolean;
|
|
@@ -116,9 +125,12 @@ declare const AIChatPlugin: platejs_react.PlatePlugin<PluginConfig<"aiChat", {
|
|
|
116
125
|
_blockPath: Path | null;
|
|
117
126
|
/** @private Using For streamInsertChunk */
|
|
118
127
|
_mdxName: string | null;
|
|
128
|
+
_replaceIds: string[];
|
|
119
129
|
/** @private The Editor used to generate the AI response. */
|
|
120
130
|
aiEditor: SlateEditor | null;
|
|
121
131
|
chat: UseChatHelpers<ChatMessage>;
|
|
132
|
+
chatNodes: TIdElement[];
|
|
133
|
+
chatSelection: TRange | null;
|
|
122
134
|
/** @deprecated Use api.aiChat.node({streaming:true}) instead */
|
|
123
135
|
experimental_lastTextId: string | null;
|
|
124
136
|
/**
|
|
@@ -137,7 +149,9 @@ declare const AIChatPlugin: platejs_react.PlatePlugin<PluginConfig<"aiChat", {
|
|
|
137
149
|
aiChat: {
|
|
138
150
|
reset: OmitFirst<typeof resetAIChat>;
|
|
139
151
|
submit: OmitFirst<typeof submitAIChat>;
|
|
140
|
-
hide: (
|
|
152
|
+
hide: (options?: {
|
|
153
|
+
focus?: boolean;
|
|
154
|
+
}) => void;
|
|
141
155
|
node: (options?: EditorNodesOptions & {
|
|
142
156
|
anchor?: boolean;
|
|
143
157
|
streaming?: boolean;
|
|
@@ -149,7 +163,9 @@ declare const AIChatPlugin: platejs_react.PlatePlugin<PluginConfig<"aiChat", {
|
|
|
149
163
|
} & Record<"aiChat", Pick<{
|
|
150
164
|
reset: OmitFirst<typeof resetAIChat>;
|
|
151
165
|
submit: OmitFirst<typeof submitAIChat>;
|
|
152
|
-
hide: (
|
|
166
|
+
hide: (options?: {
|
|
167
|
+
focus?: boolean;
|
|
168
|
+
}) => void;
|
|
153
169
|
node: (options?: EditorNodesOptions & {
|
|
154
170
|
anchor?: boolean;
|
|
155
171
|
streaming?: boolean;
|
|
@@ -157,8 +173,10 @@ declare const AIChatPlugin: platejs_react.PlatePlugin<PluginConfig<"aiChat", {
|
|
|
157
173
|
reload: () => void;
|
|
158
174
|
show: () => void;
|
|
159
175
|
stop: () => void;
|
|
160
|
-
}, "node" | "
|
|
161
|
-
hide: (
|
|
176
|
+
}, "node" | "stop" | "reset" | "submit">> & Record<"aiChat", {
|
|
177
|
+
hide: ({ focus }?: {
|
|
178
|
+
focus?: boolean;
|
|
179
|
+
}) => void;
|
|
162
180
|
show: () => void;
|
|
163
181
|
}>, {
|
|
164
182
|
aiChat: {
|
|
@@ -242,6 +260,8 @@ declare function isCompleteMath(str: string): boolean;
|
|
|
242
260
|
|
|
243
261
|
declare const removeAnchorAIChat: (editor: PlateEditor, options?: RemoveNodesOptions) => void;
|
|
244
262
|
|
|
263
|
+
declare const applyAISuggestions: (editor: SlateEditor, content: string) => void;
|
|
264
|
+
|
|
245
265
|
declare function getLastAssistantMessage(editor: PlateEditor): ChatMessage | undefined;
|
|
246
266
|
declare function useLastAssistantMessage(): ChatMessage | undefined;
|
|
247
267
|
|
|
@@ -440,4 +460,4 @@ declare const withCopilot: OverrideEditor<CopilotPluginConfig>;
|
|
|
440
460
|
|
|
441
461
|
declare const withoutAbort: (editor: PlateEditor, fn: () => void) => void;
|
|
442
462
|
|
|
443
|
-
export { AIChatPlugin, type AIChatPluginConfig, AIPlugin, type AIPluginConfig, type CallCompletionApiOptions, type CompleteOptions, CopilotPlugin, type CopilotPluginConfig, type GetNextWord, type SteamInsertChunkOptions, type UseEditorChatOptions, acceptAIChat, acceptCopilot, acceptCopilotNextWord, aiCommentToRange, callCompletionApi, createFormattedBlocks, escapeInput, findTextRangeInBlock, getChunkTrimmed, getCurrentBlockPath, getLastAssistantMessage, getListNode, getNextWord, insertBelowAIChat, isCompleteCodeBlock, isCompleteMath, isSameNode, nodesWithProps, removeAnchorAIChat, renderCopilotBelowNodes, replaceSelectionAIChat, resetAIChat, streamDeserializeInlineMd, streamDeserializeMd, streamInsertChunk, streamSerializeMd, submitAIChat, triggerCopilotSuggestion, useAIChatEditor, useChatChunk, useEditorChat, useLastAssistantMessage, withAIChat, withCopilot, withoutAbort };
|
|
463
|
+
export { AIChatPlugin, type AIChatPluginConfig, AIPlugin, type AIPluginConfig, type CallCompletionApiOptions, type CompleteOptions, CopilotPlugin, type CopilotPluginConfig, type GetNextWord, type SteamInsertChunkOptions, type UseEditorChatOptions, acceptAIChat, acceptCopilot, acceptCopilotNextWord, acceptSuggestions, aiCommentToRange, applyAISuggestions, callCompletionApi, createFormattedBlocks, escapeInput, findTextRangeInBlock, getChunkTrimmed, getCurrentBlockPath, getLastAssistantMessage, getListNode, getNextWord, insertBelowAIChat, insertBelowGenerate, isCompleteCodeBlock, isCompleteMath, isSameNode, nodesWithProps, removeAnchorAIChat, renderCopilotBelowNodes, replaceSelectionAIChat, resetAIChat, streamDeserializeInlineMd, streamDeserializeMd, streamInsertChunk, streamSerializeMd, submitAIChat, triggerCopilotSuggestion, useAIChatEditor, useChatChunk, useEditorChat, useLastAssistantMessage, withAIChat, withCopilot, withoutAbort };
|