@coze-editor/preset-prompt 0.1.0-alpha.7cf9d0 → 0.1.0-alpha.868621

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/esm/index.js CHANGED
@@ -203,6 +203,35 @@ var languageSupport = new LanguageSupport(promptLanguage, [
203
203
  autoCloseBrackets
204
204
  ]);
205
205
 
206
+ // src/fix-sougou-input.ts
207
+ import { EditorState } from "@codemirror/state";
208
+ var pairs = {
209
+ ":": "\uFF1A",
210
+ ",": "\uFF0C"
211
+ };
212
+ var fixSougouInput = EditorState.transactionFilter.of((tr) => {
213
+ let allow = true;
214
+ tr.changes.iterChanges((fromA, toA, _fromB, _toB, insert) => {
215
+ const insertChar = insert.toString();
216
+ const originalChar = pairs[insertChar];
217
+ if (originalChar && // {#/ and #} have 5 chars
218
+ toA - fromA > 5 && // :is replaced with :
219
+ tr.startState.sliceDoc(fromA - 1, fromA) === originalChar && tr.startState.sliceDoc(fromA, fromA + 3) === "{#/" && tr.startState.sliceDoc(toA - 2, toA) === "#}") {
220
+ allow = false;
221
+ }
222
+ if (originalChar && tr.isUserEvent("input.type") && Math.abs(tr.newSelection.main.to - tr.startState.selection.main.to) > 5 && tr.newSelection.main.to >= 2 && tr.newDoc.sliceString(
223
+ tr.newSelection.main.to - 2,
224
+ tr.newSelection.main.to
225
+ ) === "#}") {
226
+ allow = false;
227
+ }
228
+ });
229
+ if (!allow) {
230
+ return [];
231
+ }
232
+ return tr;
233
+ });
234
+
206
235
  // src/index.ts
207
236
  var preset = [
208
237
  ...sharedPreset,
@@ -214,7 +243,7 @@ var preset = [
214
243
  api("undo", undo),
215
244
  api("redo", redo),
216
245
  api("transformTextInSelection", transformTextInSelection),
217
- extension([Prec.high(focusableKeymap)])
246
+ extension([Prec.high(focusableKeymap), fixSougouInput])
218
247
  ];
219
248
  var index_default = preset;
220
249
  export {
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/index.ts","../../src/language.ts","../../src/languages/prompt/index.ts","../../src/languages/prompt/markdown.ts","../../src/languages/prompt/html.ts"],"sourcesContent":["// Copyright (c) 2025 coze-dev\n// SPDX-License-Identifier: MIT\n\nimport { sharedPreset } from '@coze-editor/preset-expression';\nimport { focusableKeymap } from '@coze-editor/extensions';\nimport {\n getMainSelectionRects,\n maxHeight,\n minHeight,\n replaceText,\n undo,\n redo,\n height,\n transformTextInSelection,\n} from '@coze-editor/core-plugins';\nimport {\n type InferEditorAPIFromPlugins,\n api,\n extension,\n option,\n} from '@coze-editor/core';\nimport { Prec } from '@codemirror/state';\n\nimport { languageSupport, markdownLanguage, promptLanguage } from './language';\n\n// const forEachFocusableWidget = ({ view }: { view: EditorView }) => {\n// return (callback: (from, to, widget) => void) => {\n// // use requestMeasure to ensure view is ready\n// view.requestMeasure({\n// read(view) {\n// // @ts-ignore\n// for (const line of view.docView.children) {\n// for (const widget of line.children) {\n// if (widget.isWidget && (widget.widget instanceof FocusableWidget)) {\n// callback(widget.posAtStart, widget.posAtEnd, widget.widget)\n// }\n// }\n// }\n// },\n// })\n// }\n// }\n\n// prompt preset 不使用 drawSelection 的原因:遇到跨行的 inline widget 时光标位置存在问题\nconst preset = [\n ...sharedPreset,\n option('minHeight', minHeight),\n option('maxHeight', maxHeight),\n option('height', height),\n api('getMainSelectionRects', getMainSelectionRects),\n api('replaceText', replaceText),\n api('undo', undo),\n api('redo', redo),\n api('transformTextInSelection', transformTextInSelection),\n extension([Prec.high(focusableKeymap)]),\n];\n\ntype EditorAPI = InferEditorAPIFromPlugins<typeof preset>;\n\nexport default preset;\n\nexport { promptLanguage, markdownLanguage, languageSupport };\n\nexport type { EditorAPI };\n","// Copyright (c) 2025 coze-dev\n// SPDX-License-Identifier: MIT\n\nimport { inputRules } from '@coze-editor/extensions';\nimport { replaceTextByRange } from '@coze-editor/core-plugins';\nimport { LanguageSupport } from '@codemirror/language';\nimport { closeBrackets } from '@codemirror/autocomplete';\n\nimport { promptLanguage, markdownLanguage, support } from './languages/prompt';\n\nconst brackets = [\"'\", '\"', '{', '[', '('];\n\nconst autoCloseBrackets = [\n closeBrackets(),\n promptLanguage.data.of({\n closeBrackets: {\n brackets,\n },\n }),\n\n markdownLanguage.data.of({\n closeBrackets: {\n brackets,\n },\n }),\n\n inputRules([\n {\n type: 'character',\n triggerCharacter: '%',\n handler({ view, from, to }) {\n const previousChar = view.state.sliceDoc(Math.max(0, from - 1), from);\n const nextChar = view.state.sliceDoc(\n from,\n Math.min(from + 1, view.state.doc.length),\n );\n if (previousChar === '{' && nextChar === '}') {\n replaceTextByRange({ view })({\n from,\n to,\n text: '%%',\n cursorOffset: -1,\n });\n return true;\n }\n\n return false;\n },\n },\n {\n type: 'character',\n triggerCharacter: '#',\n handler({ view, from, to }) {\n const previousChar = view.state.sliceDoc(Math.max(0, from - 1), from);\n const nextChar = view.state.sliceDoc(\n from,\n Math.min(from + 1, view.state.doc.length),\n );\n if (previousChar === '{' && nextChar === '}') {\n replaceTextByRange({ view })({\n from,\n to,\n text: '##',\n cursorOffset: -1,\n });\n return true;\n }\n\n return false;\n },\n },\n ]),\n];\n\nconst languageSupport = new LanguageSupport(promptLanguage, [\n support,\n autoCloseBrackets,\n]);\n\nexport { promptLanguage, markdownLanguage, languageSupport };\n","// Copyright (c) 2025 coze-dev\n// SPDX-License-Identifier: MIT\n\nimport { parseMixed } from '@lezer/common';\nimport { parser as jinjaParser } from '@coze-editor/lezer-parser-jinja2';\nimport { LRLanguage } from '@codemirror/language';\n\nimport { headingFold, markdownLanguage } from './markdown';\n\nconst promptLanguage = LRLanguage.define({\n parser: jinjaParser.configure({\n wrap: parseMixed(node => {\n if (node.type.isTop) {\n return {\n parser: markdownLanguage.parser,\n overlay: [\n {\n from: node.from,\n to: node.to,\n },\n ],\n };\n }\n\n return null;\n }),\n }),\n});\n\nconst support = [\n headingFold,\n // autoCloseTags,\n];\n\nexport { promptLanguage, markdownLanguage, support };\n","// Copyright (c) 2025 coze-dev\n// SPDX-License-Identifier: MIT\n\nimport {\n parser,\n GFM,\n Subscript,\n Superscript,\n Emoji,\n parseCode,\n} from '@lezer/markdown';\nimport { NodeProp, type NodeType, type SyntaxNode } from '@lezer/common';\nimport {\n Language,\n defineLanguageFacet,\n foldService,\n indentNodeProp,\n languageDataProp,\n syntaxTree,\n} from '@codemirror/language';\n\nimport { htmlLanguage } from './html';\n\nconst headingProp = new NodeProp();\n\nfunction isHeading(type: NodeType) {\n const match = /^(?:ATX|Setext)Heading(\\d)$/.exec(type.name);\n return match ? Number(match[1]) : undefined;\n}\n\nfunction findSectionEnd(headerNode: SyntaxNode, level: number) {\n let last = headerNode;\n for (;;) {\n const next = last.nextSibling;\n let heading;\n if (\n !next ||\n ((heading = isHeading(next.type)) != null && heading <= level)\n ) {\n break;\n }\n last = next;\n }\n return last.to;\n}\n\nconst headingFold = foldService.of((state, start, end) => {\n for (\n let node: SyntaxNode | null = syntaxTree(state).resolveInner(end, -1);\n node;\n node = node.parent\n ) {\n if (node.from < start) {\n break;\n }\n const heading = node.type.prop(headingProp) as number;\n if (heading == null) {\n continue;\n }\n const upto = findSectionEnd(node, heading);\n if (upto > end) {\n return { from: end, to: upto };\n }\n }\n return null;\n});\n\nconst data = defineLanguageFacet({});\n\nconst html = parseCode({\n htmlParser: htmlLanguage.parser,\n});\n\nconst markdownParser = parser.configure([\n html,\n GFM,\n Subscript,\n Superscript,\n Emoji,\n {\n props: [\n headingProp.add(isHeading),\n indentNodeProp.add({\n Document: () => null,\n }),\n languageDataProp.add({\n Document: data,\n }),\n ],\n },\n]);\n\nconst markdownLanguage = new Language(data, markdownParser, [], 'markdown');\n\nexport { markdownLanguage, headingFold };\n","// Copyright (c) 2025 coze-dev\n// SPDX-License-Identifier: MIT\n\nimport { parser } from '@lezer/html';\nimport { LRLanguage } from '@codemirror/language';\n\nconst htmlLanguage = LRLanguage.define({\n parser: parser.configure({\n dialect: 'noMatch',\n }),\n});\n\n// function elementName(doc: Text, tree: SyntaxNode | null | undefined, max = doc.length) {\n// if (!tree) return ''\n// let tag = tree.firstChild\n// let name = tag && tag.getChild('TagName')\n// return name ? doc.sliceString(name.from, Math.min(name.to, max)) : ''\n// }\n\n// const selfClosers = new Set(\n// 'area base br col command embed frame hr img input keygen link meta param source track wbr menuitem'\n// .split(' ')\n// )\n\n// const autoCloseTags = EditorView.inputHandler.of((view, from, to, text, insertTransaction) => {\n// if (\n// view.composing ||\n// view.state.readOnly ||\n// from != to ||\n// (text != '>' && text != '/')\n// ) {\n// return false\n// }\n\n// const base = insertTransaction(), { state } = base\n\n// if (!htmlLanguage.isActiveAt(state, from, -1)) {\n// return false\n// }\n\n// const closeTags = state.changeByRange(range => {\n// const didType = state.doc.sliceString(range.from - 1, range.to) == text\n// const { head } = range\n// const after = syntaxTree(state).resolveInner(head, -1)\n// let name\n\n// if (didType && text == '>' && after.name == 'EndTag') {\n// const tag = after.parent!\n// if (\n// (name = elementName(state.doc, tag.parent, head)) &&\n// !selfClosers.has(name)) {\n// const to = head + (state.doc.sliceString(head, head + 1) === '>' ? 1 : 0)\n// const insert = `</${name}>`\n// return { range, changes: { from: head, to, insert } }\n// }\n// } else if (didType && text == '/' && after.name == 'IncompleteCloseTag') {\n// const tag = after.parent!\n// if (after.from == head - 2 && tag.lastChild?.name != 'CloseTag' &&\n// (name = elementName(state.doc, tag, head)) && !selfClosers.has(name)) {\n// const to = head + (state.doc.sliceString(head, head + 1) === '>' ? 1 : 0)\n// const insert = `${name}>`\n// return {\n// range: EditorSelection.cursor(head + insert.length, -1),\n// changes: { from: head, to, insert }\n// }\n// }\n// }\n// return { range }\n// })\n// if (closeTags.changes.empty) return false\n// view.dispatch([\n// base,\n// state.update(closeTags, {\n// userEvent: 'input.complete',\n// scrollIntoView: true\n// })\n// ])\n// return true\n// })\n\nexport { htmlLanguage };\n"],"mappings":"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","names":["LRLanguage","parser","parser","LRLanguage"]}
1
+ {"version":3,"sources":["../../src/index.ts","../../src/language.ts","../../src/languages/prompt/index.ts","../../src/languages/prompt/markdown.ts","../../src/languages/prompt/html.ts","../../src/fix-sougou-input.ts"],"sourcesContent":["// Copyright (c) 2025 coze-dev\n// SPDX-License-Identifier: MIT\n\nimport { sharedPreset } from '@coze-editor/preset-expression';\nimport { focusableKeymap } from '@coze-editor/extensions';\nimport {\n getMainSelectionRects,\n maxHeight,\n minHeight,\n replaceText,\n undo,\n redo,\n height,\n transformTextInSelection,\n} from '@coze-editor/core-plugins';\nimport {\n type InferEditorAPIFromPlugins,\n api,\n extension,\n option,\n} from '@coze-editor/core';\nimport { Prec } from '@codemirror/state';\n\nimport { languageSupport, markdownLanguage, promptLanguage } from './language';\nimport { fixSougouInput } from './fix-sougou-input';\n\n// const forEachFocusableWidget = ({ view }: { view: EditorView }) => {\n// return (callback: (from, to, widget) => void) => {\n// // use requestMeasure to ensure view is ready\n// view.requestMeasure({\n// read(view) {\n// // @ts-ignore\n// for (const line of view.docView.children) {\n// for (const widget of line.children) {\n// if (widget.isWidget && (widget.widget instanceof FocusableWidget)) {\n// callback(widget.posAtStart, widget.posAtEnd, widget.widget)\n// }\n// }\n// }\n// },\n// })\n// }\n// }\n\n// prompt preset 不使用 drawSelection 的原因:遇到跨行的 inline widget 时光标位置存在问题\nconst preset = [\n ...sharedPreset,\n option('minHeight', minHeight),\n option('maxHeight', maxHeight),\n option('height', height),\n api('getMainSelectionRects', getMainSelectionRects),\n api('replaceText', replaceText),\n api('undo', undo),\n api('redo', redo),\n api('transformTextInSelection', transformTextInSelection),\n extension([Prec.high(focusableKeymap), fixSougouInput]),\n];\n\ntype EditorAPI = InferEditorAPIFromPlugins<typeof preset>;\n\nexport default preset;\n\nexport { promptLanguage, markdownLanguage, languageSupport };\n\nexport type { EditorAPI };\n","// Copyright (c) 2025 coze-dev\n// SPDX-License-Identifier: MIT\n\nimport { inputRules } from '@coze-editor/extensions';\nimport { replaceTextByRange } from '@coze-editor/core-plugins';\nimport { LanguageSupport } from '@codemirror/language';\nimport { closeBrackets } from '@codemirror/autocomplete';\n\nimport { promptLanguage, markdownLanguage, support } from './languages/prompt';\n\nconst brackets = [\"'\", '\"', '{', '[', '('];\n\nconst autoCloseBrackets = [\n closeBrackets(),\n promptLanguage.data.of({\n closeBrackets: {\n brackets,\n },\n }),\n\n markdownLanguage.data.of({\n closeBrackets: {\n brackets,\n },\n }),\n\n inputRules([\n {\n type: 'character',\n triggerCharacter: '%',\n handler({ view, from, to }) {\n const previousChar = view.state.sliceDoc(Math.max(0, from - 1), from);\n const nextChar = view.state.sliceDoc(\n from,\n Math.min(from + 1, view.state.doc.length),\n );\n if (previousChar === '{' && nextChar === '}') {\n replaceTextByRange({ view })({\n from,\n to,\n text: '%%',\n cursorOffset: -1,\n });\n return true;\n }\n\n return false;\n },\n },\n {\n type: 'character',\n triggerCharacter: '#',\n handler({ view, from, to }) {\n const previousChar = view.state.sliceDoc(Math.max(0, from - 1), from);\n const nextChar = view.state.sliceDoc(\n from,\n Math.min(from + 1, view.state.doc.length),\n );\n if (previousChar === '{' && nextChar === '}') {\n replaceTextByRange({ view })({\n from,\n to,\n text: '##',\n cursorOffset: -1,\n });\n return true;\n }\n\n return false;\n },\n },\n ]),\n];\n\nconst languageSupport = new LanguageSupport(promptLanguage, [\n support,\n autoCloseBrackets,\n]);\n\nexport { promptLanguage, markdownLanguage, languageSupport };\n","// Copyright (c) 2025 coze-dev\n// SPDX-License-Identifier: MIT\n\nimport { parseMixed } from '@lezer/common';\nimport { parser as jinjaParser } from '@coze-editor/lezer-parser-jinja2';\nimport { LRLanguage } from '@codemirror/language';\n\nimport { headingFold, markdownLanguage } from './markdown';\n\nconst promptLanguage = LRLanguage.define({\n parser: jinjaParser.configure({\n wrap: parseMixed(node => {\n if (node.type.isTop) {\n return {\n parser: markdownLanguage.parser,\n overlay: [\n {\n from: node.from,\n to: node.to,\n },\n ],\n };\n }\n\n return null;\n }),\n }),\n});\n\nconst support = [\n headingFold,\n // autoCloseTags,\n];\n\nexport { promptLanguage, markdownLanguage, support };\n","// Copyright (c) 2025 coze-dev\n// SPDX-License-Identifier: MIT\n\nimport {\n parser,\n GFM,\n Subscript,\n Superscript,\n Emoji,\n parseCode,\n} from '@lezer/markdown';\nimport { NodeProp, type NodeType, type SyntaxNode } from '@lezer/common';\nimport {\n Language,\n defineLanguageFacet,\n foldService,\n indentNodeProp,\n languageDataProp,\n syntaxTree,\n} from '@codemirror/language';\n\nimport { htmlLanguage } from './html';\n\nconst headingProp = new NodeProp();\n\nfunction isHeading(type: NodeType) {\n const match = /^(?:ATX|Setext)Heading(\\d)$/.exec(type.name);\n return match ? Number(match[1]) : undefined;\n}\n\nfunction findSectionEnd(headerNode: SyntaxNode, level: number) {\n let last = headerNode;\n for (;;) {\n const next = last.nextSibling;\n let heading;\n if (\n !next ||\n ((heading = isHeading(next.type)) != null && heading <= level)\n ) {\n break;\n }\n last = next;\n }\n return last.to;\n}\n\nconst headingFold = foldService.of((state, start, end) => {\n for (\n let node: SyntaxNode | null = syntaxTree(state).resolveInner(end, -1);\n node;\n node = node.parent\n ) {\n if (node.from < start) {\n break;\n }\n const heading = node.type.prop(headingProp) as number;\n if (heading == null) {\n continue;\n }\n const upto = findSectionEnd(node, heading);\n if (upto > end) {\n return { from: end, to: upto };\n }\n }\n return null;\n});\n\nconst data = defineLanguageFacet({});\n\nconst html = parseCode({\n htmlParser: htmlLanguage.parser,\n});\n\nconst markdownParser = parser.configure([\n html,\n GFM,\n Subscript,\n Superscript,\n Emoji,\n {\n props: [\n headingProp.add(isHeading),\n indentNodeProp.add({\n Document: () => null,\n }),\n languageDataProp.add({\n Document: data,\n }),\n ],\n },\n]);\n\nconst markdownLanguage = new Language(data, markdownParser, [], 'markdown');\n\nexport { markdownLanguage, headingFold };\n","// Copyright (c) 2025 coze-dev\n// SPDX-License-Identifier: MIT\n\nimport { parser } from '@lezer/html';\nimport { LRLanguage } from '@codemirror/language';\n\nconst htmlLanguage = LRLanguage.define({\n parser: parser.configure({\n dialect: 'noMatch',\n }),\n});\n\n// function elementName(doc: Text, tree: SyntaxNode | null | undefined, max = doc.length) {\n// if (!tree) return ''\n// let tag = tree.firstChild\n// let name = tag && tag.getChild('TagName')\n// return name ? doc.sliceString(name.from, Math.min(name.to, max)) : ''\n// }\n\n// const selfClosers = new Set(\n// 'area base br col command embed frame hr img input keygen link meta param source track wbr menuitem'\n// .split(' ')\n// )\n\n// const autoCloseTags = EditorView.inputHandler.of((view, from, to, text, insertTransaction) => {\n// if (\n// view.composing ||\n// view.state.readOnly ||\n// from != to ||\n// (text != '>' && text != '/')\n// ) {\n// return false\n// }\n\n// const base = insertTransaction(), { state } = base\n\n// if (!htmlLanguage.isActiveAt(state, from, -1)) {\n// return false\n// }\n\n// const closeTags = state.changeByRange(range => {\n// const didType = state.doc.sliceString(range.from - 1, range.to) == text\n// const { head } = range\n// const after = syntaxTree(state).resolveInner(head, -1)\n// let name\n\n// if (didType && text == '>' && after.name == 'EndTag') {\n// const tag = after.parent!\n// if (\n// (name = elementName(state.doc, tag.parent, head)) &&\n// !selfClosers.has(name)) {\n// const to = head + (state.doc.sliceString(head, head + 1) === '>' ? 1 : 0)\n// const insert = `</${name}>`\n// return { range, changes: { from: head, to, insert } }\n// }\n// } else if (didType && text == '/' && after.name == 'IncompleteCloseTag') {\n// const tag = after.parent!\n// if (after.from == head - 2 && tag.lastChild?.name != 'CloseTag' &&\n// (name = elementName(state.doc, tag, head)) && !selfClosers.has(name)) {\n// const to = head + (state.doc.sliceString(head, head + 1) === '>' ? 1 : 0)\n// const insert = `${name}>`\n// return {\n// range: EditorSelection.cursor(head + insert.length, -1),\n// changes: { from: head, to, insert }\n// }\n// }\n// }\n// return { range }\n// })\n// if (closeTags.changes.empty) return false\n// view.dispatch([\n// base,\n// state.update(closeTags, {\n// userEvent: 'input.complete',\n// scrollIntoView: true\n// })\n// ])\n// return true\n// })\n\nexport { htmlLanguage };\n","import { EditorState } from '@codemirror/state';\n\nconst pairs: Record<string, string> = {\n ':': ':',\n ',': ',',\n};\n\nconst fixSougouInput = EditorState.transactionFilter.of(tr => {\n let allow = true;\n tr.changes.iterChanges((fromA, toA, _fromB, _toB, insert) => {\n const insertChar = insert.toString();\n const originalChar = pairs[insertChar];\n\n // how to repro with sougou input -> type 11:2 by order inside slot\n // : is inserted, and {#/...#} is removed\n // feature:\n // - : is inserted after :\n // - {#/...#} is replaced with :\n if (\n originalChar &&\n // {#/ and #} have 5 chars\n toA - fromA > 5 &&\n // :is replaced with :\n tr.startState.sliceDoc(fromA - 1, fromA) === originalChar &&\n tr.startState.sliceDoc(fromA, fromA + 3) === '{#/' &&\n tr.startState.sliceDoc(toA - 2, toA) === '#}'\n ) {\n allow = false;\n }\n\n // how to repro with sougou input -> type 1:2 by order inside slot\n // 2 will appear after {#/...#}\n // feature:\n // - :is replaced with :\n // - selection is moved more than one character\n // - new selection is moved after slot {/#...#}\n if (\n originalChar &&\n tr.isUserEvent('input.type') &&\n Math.abs(tr.newSelection.main.to - tr.startState.selection.main.to) > 5 &&\n tr.newSelection.main.to >= 2 &&\n tr.newDoc.sliceString(\n tr.newSelection.main.to - 2,\n tr.newSelection.main.to,\n ) === '#}'\n ) {\n allow = false;\n }\n });\n\n if (!allow) {\n return [];\n }\n\n return tr;\n});\n\nexport { fixSougouInput };\n"],"mappings":"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","names":["LRLanguage","parser","parser","LRLanguage"]}
package/dist/index.js CHANGED
@@ -29,7 +29,7 @@ var import_preset_expression = require("@coze-editor/preset-expression");
29
29
  var import_extensions2 = require("@coze-editor/extensions");
30
30
  var import_core_plugins2 = require("@coze-editor/core-plugins");
31
31
  var import_core = require("@coze-editor/core");
32
- var import_state = require("@codemirror/state");
32
+ var import_state2 = require("@codemirror/state");
33
33
 
34
34
  // src/language.ts
35
35
  var import_extensions = require("@coze-editor/extensions");
@@ -202,6 +202,35 @@ var languageSupport = new import_language4.LanguageSupport(promptLanguage, [
202
202
  autoCloseBrackets
203
203
  ]);
204
204
 
205
+ // src/fix-sougou-input.ts
206
+ var import_state = require("@codemirror/state");
207
+ var pairs = {
208
+ ":": "\uFF1A",
209
+ ",": "\uFF0C"
210
+ };
211
+ var fixSougouInput = import_state.EditorState.transactionFilter.of((tr) => {
212
+ let allow = true;
213
+ tr.changes.iterChanges((fromA, toA, _fromB, _toB, insert) => {
214
+ const insertChar = insert.toString();
215
+ const originalChar = pairs[insertChar];
216
+ if (originalChar && // {#/ and #} have 5 chars
217
+ toA - fromA > 5 && // :is replaced with :
218
+ tr.startState.sliceDoc(fromA - 1, fromA) === originalChar && tr.startState.sliceDoc(fromA, fromA + 3) === "{#/" && tr.startState.sliceDoc(toA - 2, toA) === "#}") {
219
+ allow = false;
220
+ }
221
+ if (originalChar && tr.isUserEvent("input.type") && Math.abs(tr.newSelection.main.to - tr.startState.selection.main.to) > 5 && tr.newSelection.main.to >= 2 && tr.newDoc.sliceString(
222
+ tr.newSelection.main.to - 2,
223
+ tr.newSelection.main.to
224
+ ) === "#}") {
225
+ allow = false;
226
+ }
227
+ });
228
+ if (!allow) {
229
+ return [];
230
+ }
231
+ return tr;
232
+ });
233
+
205
234
  // src/index.ts
206
235
  var preset = [
207
236
  ...import_preset_expression.sharedPreset,
@@ -213,7 +242,7 @@ var preset = [
213
242
  (0, import_core.api)("undo", import_core_plugins2.undo),
214
243
  (0, import_core.api)("redo", import_core_plugins2.redo),
215
244
  (0, import_core.api)("transformTextInSelection", import_core_plugins2.transformTextInSelection),
216
- (0, import_core.extension)([import_state.Prec.high(import_extensions2.focusableKeymap)])
245
+ (0, import_core.extension)([import_state2.Prec.high(import_extensions2.focusableKeymap), fixSougouInput])
217
246
  ];
218
247
  var index_default = preset;
219
248
  // Annotate the CommonJS export names for ESM import in node:
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/index.ts","../src/language.ts","../src/languages/prompt/index.ts","../src/languages/prompt/markdown.ts","../src/languages/prompt/html.ts"],"sourcesContent":["// Copyright (c) 2025 coze-dev\n// SPDX-License-Identifier: MIT\n\nimport { sharedPreset } from '@coze-editor/preset-expression';\nimport { focusableKeymap } from '@coze-editor/extensions';\nimport {\n getMainSelectionRects,\n maxHeight,\n minHeight,\n replaceText,\n undo,\n redo,\n height,\n transformTextInSelection,\n} from '@coze-editor/core-plugins';\nimport {\n type InferEditorAPIFromPlugins,\n api,\n extension,\n option,\n} from '@coze-editor/core';\nimport { Prec } from '@codemirror/state';\n\nimport { languageSupport, markdownLanguage, promptLanguage } from './language';\n\n// const forEachFocusableWidget = ({ view }: { view: EditorView }) => {\n// return (callback: (from, to, widget) => void) => {\n// // use requestMeasure to ensure view is ready\n// view.requestMeasure({\n// read(view) {\n// // @ts-ignore\n// for (const line of view.docView.children) {\n// for (const widget of line.children) {\n// if (widget.isWidget && (widget.widget instanceof FocusableWidget)) {\n// callback(widget.posAtStart, widget.posAtEnd, widget.widget)\n// }\n// }\n// }\n// },\n// })\n// }\n// }\n\n// prompt preset 不使用 drawSelection 的原因:遇到跨行的 inline widget 时光标位置存在问题\nconst preset = [\n ...sharedPreset,\n option('minHeight', minHeight),\n option('maxHeight', maxHeight),\n option('height', height),\n api('getMainSelectionRects', getMainSelectionRects),\n api('replaceText', replaceText),\n api('undo', undo),\n api('redo', redo),\n api('transformTextInSelection', transformTextInSelection),\n extension([Prec.high(focusableKeymap)]),\n];\n\ntype EditorAPI = InferEditorAPIFromPlugins<typeof preset>;\n\nexport default preset;\n\nexport { promptLanguage, markdownLanguage, languageSupport };\n\nexport type { EditorAPI };\n","// Copyright (c) 2025 coze-dev\n// SPDX-License-Identifier: MIT\n\nimport { inputRules } from '@coze-editor/extensions';\nimport { replaceTextByRange } from '@coze-editor/core-plugins';\nimport { LanguageSupport } from '@codemirror/language';\nimport { closeBrackets } from '@codemirror/autocomplete';\n\nimport { promptLanguage, markdownLanguage, support } from './languages/prompt';\n\nconst brackets = [\"'\", '\"', '{', '[', '('];\n\nconst autoCloseBrackets = [\n closeBrackets(),\n promptLanguage.data.of({\n closeBrackets: {\n brackets,\n },\n }),\n\n markdownLanguage.data.of({\n closeBrackets: {\n brackets,\n },\n }),\n\n inputRules([\n {\n type: 'character',\n triggerCharacter: '%',\n handler({ view, from, to }) {\n const previousChar = view.state.sliceDoc(Math.max(0, from - 1), from);\n const nextChar = view.state.sliceDoc(\n from,\n Math.min(from + 1, view.state.doc.length),\n );\n if (previousChar === '{' && nextChar === '}') {\n replaceTextByRange({ view })({\n from,\n to,\n text: '%%',\n cursorOffset: -1,\n });\n return true;\n }\n\n return false;\n },\n },\n {\n type: 'character',\n triggerCharacter: '#',\n handler({ view, from, to }) {\n const previousChar = view.state.sliceDoc(Math.max(0, from - 1), from);\n const nextChar = view.state.sliceDoc(\n from,\n Math.min(from + 1, view.state.doc.length),\n );\n if (previousChar === '{' && nextChar === '}') {\n replaceTextByRange({ view })({\n from,\n to,\n text: '##',\n cursorOffset: -1,\n });\n return true;\n }\n\n return false;\n },\n },\n ]),\n];\n\nconst languageSupport = new LanguageSupport(promptLanguage, [\n support,\n autoCloseBrackets,\n]);\n\nexport { promptLanguage, markdownLanguage, languageSupport };\n","// Copyright (c) 2025 coze-dev\n// SPDX-License-Identifier: MIT\n\nimport { parseMixed } from '@lezer/common';\nimport { parser as jinjaParser } from '@coze-editor/lezer-parser-jinja2';\nimport { LRLanguage } from '@codemirror/language';\n\nimport { headingFold, markdownLanguage } from './markdown';\n\nconst promptLanguage = LRLanguage.define({\n parser: jinjaParser.configure({\n wrap: parseMixed(node => {\n if (node.type.isTop) {\n return {\n parser: markdownLanguage.parser,\n overlay: [\n {\n from: node.from,\n to: node.to,\n },\n ],\n };\n }\n\n return null;\n }),\n }),\n});\n\nconst support = [\n headingFold,\n // autoCloseTags,\n];\n\nexport { promptLanguage, markdownLanguage, support };\n","// Copyright (c) 2025 coze-dev\n// SPDX-License-Identifier: MIT\n\nimport {\n parser,\n GFM,\n Subscript,\n Superscript,\n Emoji,\n parseCode,\n} from '@lezer/markdown';\nimport { NodeProp, type NodeType, type SyntaxNode } from '@lezer/common';\nimport {\n Language,\n defineLanguageFacet,\n foldService,\n indentNodeProp,\n languageDataProp,\n syntaxTree,\n} from '@codemirror/language';\n\nimport { htmlLanguage } from './html';\n\nconst headingProp = new NodeProp();\n\nfunction isHeading(type: NodeType) {\n const match = /^(?:ATX|Setext)Heading(\\d)$/.exec(type.name);\n return match ? Number(match[1]) : undefined;\n}\n\nfunction findSectionEnd(headerNode: SyntaxNode, level: number) {\n let last = headerNode;\n for (;;) {\n const next = last.nextSibling;\n let heading;\n if (\n !next ||\n ((heading = isHeading(next.type)) != null && heading <= level)\n ) {\n break;\n }\n last = next;\n }\n return last.to;\n}\n\nconst headingFold = foldService.of((state, start, end) => {\n for (\n let node: SyntaxNode | null = syntaxTree(state).resolveInner(end, -1);\n node;\n node = node.parent\n ) {\n if (node.from < start) {\n break;\n }\n const heading = node.type.prop(headingProp) as number;\n if (heading == null) {\n continue;\n }\n const upto = findSectionEnd(node, heading);\n if (upto > end) {\n return { from: end, to: upto };\n }\n }\n return null;\n});\n\nconst data = defineLanguageFacet({});\n\nconst html = parseCode({\n htmlParser: htmlLanguage.parser,\n});\n\nconst markdownParser = parser.configure([\n html,\n GFM,\n Subscript,\n Superscript,\n Emoji,\n {\n props: [\n headingProp.add(isHeading),\n indentNodeProp.add({\n Document: () => null,\n }),\n languageDataProp.add({\n Document: data,\n }),\n ],\n },\n]);\n\nconst markdownLanguage = new Language(data, markdownParser, [], 'markdown');\n\nexport { markdownLanguage, headingFold };\n","// Copyright (c) 2025 coze-dev\n// SPDX-License-Identifier: MIT\n\nimport { parser } from '@lezer/html';\nimport { LRLanguage } from '@codemirror/language';\n\nconst htmlLanguage = LRLanguage.define({\n parser: parser.configure({\n dialect: 'noMatch',\n }),\n});\n\n// function elementName(doc: Text, tree: SyntaxNode | null | undefined, max = doc.length) {\n// if (!tree) return ''\n// let tag = tree.firstChild\n// let name = tag && tag.getChild('TagName')\n// return name ? doc.sliceString(name.from, Math.min(name.to, max)) : ''\n// }\n\n// const selfClosers = new Set(\n// 'area base br col command embed frame hr img input keygen link meta param source track wbr menuitem'\n// .split(' ')\n// )\n\n// const autoCloseTags = EditorView.inputHandler.of((view, from, to, text, insertTransaction) => {\n// if (\n// view.composing ||\n// view.state.readOnly ||\n// from != to ||\n// (text != '>' && text != '/')\n// ) {\n// return false\n// }\n\n// const base = insertTransaction(), { state } = base\n\n// if (!htmlLanguage.isActiveAt(state, from, -1)) {\n// return false\n// }\n\n// const closeTags = state.changeByRange(range => {\n// const didType = state.doc.sliceString(range.from - 1, range.to) == text\n// const { head } = range\n// const after = syntaxTree(state).resolveInner(head, -1)\n// let name\n\n// if (didType && text == '>' && after.name == 'EndTag') {\n// const tag = after.parent!\n// if (\n// (name = elementName(state.doc, tag.parent, head)) &&\n// !selfClosers.has(name)) {\n// const to = head + (state.doc.sliceString(head, head + 1) === '>' ? 1 : 0)\n// const insert = `</${name}>`\n// return { range, changes: { from: head, to, insert } }\n// }\n// } else if (didType && text == '/' && after.name == 'IncompleteCloseTag') {\n// const tag = after.parent!\n// if (after.from == head - 2 && tag.lastChild?.name != 'CloseTag' &&\n// (name = elementName(state.doc, tag, head)) && !selfClosers.has(name)) {\n// const to = head + (state.doc.sliceString(head, head + 1) === '>' ? 1 : 0)\n// const insert = `${name}>`\n// return {\n// range: EditorSelection.cursor(head + insert.length, -1),\n// changes: { from: head, to, insert }\n// }\n// }\n// }\n// return { range }\n// })\n// if (closeTags.changes.empty) return false\n// view.dispatch([\n// base,\n// state.update(closeTags, {\n// userEvent: 'input.complete',\n// scrollIntoView: true\n// })\n// ])\n// return true\n// })\n\nexport { htmlLanguage };\n"],"mappings":"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","names":["import_extensions","import_core_plugins","import_language","import_common","import_language","import_language","jinjaParser"]}
1
+ {"version":3,"sources":["../src/index.ts","../src/language.ts","../src/languages/prompt/index.ts","../src/languages/prompt/markdown.ts","../src/languages/prompt/html.ts","../src/fix-sougou-input.ts"],"sourcesContent":["// Copyright (c) 2025 coze-dev\n// SPDX-License-Identifier: MIT\n\nimport { sharedPreset } from '@coze-editor/preset-expression';\nimport { focusableKeymap } from '@coze-editor/extensions';\nimport {\n getMainSelectionRects,\n maxHeight,\n minHeight,\n replaceText,\n undo,\n redo,\n height,\n transformTextInSelection,\n} from '@coze-editor/core-plugins';\nimport {\n type InferEditorAPIFromPlugins,\n api,\n extension,\n option,\n} from '@coze-editor/core';\nimport { Prec } from '@codemirror/state';\n\nimport { languageSupport, markdownLanguage, promptLanguage } from './language';\nimport { fixSougouInput } from './fix-sougou-input';\n\n// const forEachFocusableWidget = ({ view }: { view: EditorView }) => {\n// return (callback: (from, to, widget) => void) => {\n// // use requestMeasure to ensure view is ready\n// view.requestMeasure({\n// read(view) {\n// // @ts-ignore\n// for (const line of view.docView.children) {\n// for (const widget of line.children) {\n// if (widget.isWidget && (widget.widget instanceof FocusableWidget)) {\n// callback(widget.posAtStart, widget.posAtEnd, widget.widget)\n// }\n// }\n// }\n// },\n// })\n// }\n// }\n\n// prompt preset 不使用 drawSelection 的原因:遇到跨行的 inline widget 时光标位置存在问题\nconst preset = [\n ...sharedPreset,\n option('minHeight', minHeight),\n option('maxHeight', maxHeight),\n option('height', height),\n api('getMainSelectionRects', getMainSelectionRects),\n api('replaceText', replaceText),\n api('undo', undo),\n api('redo', redo),\n api('transformTextInSelection', transformTextInSelection),\n extension([Prec.high(focusableKeymap), fixSougouInput]),\n];\n\ntype EditorAPI = InferEditorAPIFromPlugins<typeof preset>;\n\nexport default preset;\n\nexport { promptLanguage, markdownLanguage, languageSupport };\n\nexport type { EditorAPI };\n","// Copyright (c) 2025 coze-dev\n// SPDX-License-Identifier: MIT\n\nimport { inputRules } from '@coze-editor/extensions';\nimport { replaceTextByRange } from '@coze-editor/core-plugins';\nimport { LanguageSupport } from '@codemirror/language';\nimport { closeBrackets } from '@codemirror/autocomplete';\n\nimport { promptLanguage, markdownLanguage, support } from './languages/prompt';\n\nconst brackets = [\"'\", '\"', '{', '[', '('];\n\nconst autoCloseBrackets = [\n closeBrackets(),\n promptLanguage.data.of({\n closeBrackets: {\n brackets,\n },\n }),\n\n markdownLanguage.data.of({\n closeBrackets: {\n brackets,\n },\n }),\n\n inputRules([\n {\n type: 'character',\n triggerCharacter: '%',\n handler({ view, from, to }) {\n const previousChar = view.state.sliceDoc(Math.max(0, from - 1), from);\n const nextChar = view.state.sliceDoc(\n from,\n Math.min(from + 1, view.state.doc.length),\n );\n if (previousChar === '{' && nextChar === '}') {\n replaceTextByRange({ view })({\n from,\n to,\n text: '%%',\n cursorOffset: -1,\n });\n return true;\n }\n\n return false;\n },\n },\n {\n type: 'character',\n triggerCharacter: '#',\n handler({ view, from, to }) {\n const previousChar = view.state.sliceDoc(Math.max(0, from - 1), from);\n const nextChar = view.state.sliceDoc(\n from,\n Math.min(from + 1, view.state.doc.length),\n );\n if (previousChar === '{' && nextChar === '}') {\n replaceTextByRange({ view })({\n from,\n to,\n text: '##',\n cursorOffset: -1,\n });\n return true;\n }\n\n return false;\n },\n },\n ]),\n];\n\nconst languageSupport = new LanguageSupport(promptLanguage, [\n support,\n autoCloseBrackets,\n]);\n\nexport { promptLanguage, markdownLanguage, languageSupport };\n","// Copyright (c) 2025 coze-dev\n// SPDX-License-Identifier: MIT\n\nimport { parseMixed } from '@lezer/common';\nimport { parser as jinjaParser } from '@coze-editor/lezer-parser-jinja2';\nimport { LRLanguage } from '@codemirror/language';\n\nimport { headingFold, markdownLanguage } from './markdown';\n\nconst promptLanguage = LRLanguage.define({\n parser: jinjaParser.configure({\n wrap: parseMixed(node => {\n if (node.type.isTop) {\n return {\n parser: markdownLanguage.parser,\n overlay: [\n {\n from: node.from,\n to: node.to,\n },\n ],\n };\n }\n\n return null;\n }),\n }),\n});\n\nconst support = [\n headingFold,\n // autoCloseTags,\n];\n\nexport { promptLanguage, markdownLanguage, support };\n","// Copyright (c) 2025 coze-dev\n// SPDX-License-Identifier: MIT\n\nimport {\n parser,\n GFM,\n Subscript,\n Superscript,\n Emoji,\n parseCode,\n} from '@lezer/markdown';\nimport { NodeProp, type NodeType, type SyntaxNode } from '@lezer/common';\nimport {\n Language,\n defineLanguageFacet,\n foldService,\n indentNodeProp,\n languageDataProp,\n syntaxTree,\n} from '@codemirror/language';\n\nimport { htmlLanguage } from './html';\n\nconst headingProp = new NodeProp();\n\nfunction isHeading(type: NodeType) {\n const match = /^(?:ATX|Setext)Heading(\\d)$/.exec(type.name);\n return match ? Number(match[1]) : undefined;\n}\n\nfunction findSectionEnd(headerNode: SyntaxNode, level: number) {\n let last = headerNode;\n for (;;) {\n const next = last.nextSibling;\n let heading;\n if (\n !next ||\n ((heading = isHeading(next.type)) != null && heading <= level)\n ) {\n break;\n }\n last = next;\n }\n return last.to;\n}\n\nconst headingFold = foldService.of((state, start, end) => {\n for (\n let node: SyntaxNode | null = syntaxTree(state).resolveInner(end, -1);\n node;\n node = node.parent\n ) {\n if (node.from < start) {\n break;\n }\n const heading = node.type.prop(headingProp) as number;\n if (heading == null) {\n continue;\n }\n const upto = findSectionEnd(node, heading);\n if (upto > end) {\n return { from: end, to: upto };\n }\n }\n return null;\n});\n\nconst data = defineLanguageFacet({});\n\nconst html = parseCode({\n htmlParser: htmlLanguage.parser,\n});\n\nconst markdownParser = parser.configure([\n html,\n GFM,\n Subscript,\n Superscript,\n Emoji,\n {\n props: [\n headingProp.add(isHeading),\n indentNodeProp.add({\n Document: () => null,\n }),\n languageDataProp.add({\n Document: data,\n }),\n ],\n },\n]);\n\nconst markdownLanguage = new Language(data, markdownParser, [], 'markdown');\n\nexport { markdownLanguage, headingFold };\n","// Copyright (c) 2025 coze-dev\n// SPDX-License-Identifier: MIT\n\nimport { parser } from '@lezer/html';\nimport { LRLanguage } from '@codemirror/language';\n\nconst htmlLanguage = LRLanguage.define({\n parser: parser.configure({\n dialect: 'noMatch',\n }),\n});\n\n// function elementName(doc: Text, tree: SyntaxNode | null | undefined, max = doc.length) {\n// if (!tree) return ''\n// let tag = tree.firstChild\n// let name = tag && tag.getChild('TagName')\n// return name ? doc.sliceString(name.from, Math.min(name.to, max)) : ''\n// }\n\n// const selfClosers = new Set(\n// 'area base br col command embed frame hr img input keygen link meta param source track wbr menuitem'\n// .split(' ')\n// )\n\n// const autoCloseTags = EditorView.inputHandler.of((view, from, to, text, insertTransaction) => {\n// if (\n// view.composing ||\n// view.state.readOnly ||\n// from != to ||\n// (text != '>' && text != '/')\n// ) {\n// return false\n// }\n\n// const base = insertTransaction(), { state } = base\n\n// if (!htmlLanguage.isActiveAt(state, from, -1)) {\n// return false\n// }\n\n// const closeTags = state.changeByRange(range => {\n// const didType = state.doc.sliceString(range.from - 1, range.to) == text\n// const { head } = range\n// const after = syntaxTree(state).resolveInner(head, -1)\n// let name\n\n// if (didType && text == '>' && after.name == 'EndTag') {\n// const tag = after.parent!\n// if (\n// (name = elementName(state.doc, tag.parent, head)) &&\n// !selfClosers.has(name)) {\n// const to = head + (state.doc.sliceString(head, head + 1) === '>' ? 1 : 0)\n// const insert = `</${name}>`\n// return { range, changes: { from: head, to, insert } }\n// }\n// } else if (didType && text == '/' && after.name == 'IncompleteCloseTag') {\n// const tag = after.parent!\n// if (after.from == head - 2 && tag.lastChild?.name != 'CloseTag' &&\n// (name = elementName(state.doc, tag, head)) && !selfClosers.has(name)) {\n// const to = head + (state.doc.sliceString(head, head + 1) === '>' ? 1 : 0)\n// const insert = `${name}>`\n// return {\n// range: EditorSelection.cursor(head + insert.length, -1),\n// changes: { from: head, to, insert }\n// }\n// }\n// }\n// return { range }\n// })\n// if (closeTags.changes.empty) return false\n// view.dispatch([\n// base,\n// state.update(closeTags, {\n// userEvent: 'input.complete',\n// scrollIntoView: true\n// })\n// ])\n// return true\n// })\n\nexport { htmlLanguage };\n","import { EditorState } from '@codemirror/state';\n\nconst pairs: Record<string, string> = {\n ':': ':',\n ',': ',',\n};\n\nconst fixSougouInput = EditorState.transactionFilter.of(tr => {\n let allow = true;\n tr.changes.iterChanges((fromA, toA, _fromB, _toB, insert) => {\n const insertChar = insert.toString();\n const originalChar = pairs[insertChar];\n\n // how to repro with sougou input -> type 11:2 by order inside slot\n // : is inserted, and {#/...#} is removed\n // feature:\n // - : is inserted after :\n // - {#/...#} is replaced with :\n if (\n originalChar &&\n // {#/ and #} have 5 chars\n toA - fromA > 5 &&\n // :is replaced with :\n tr.startState.sliceDoc(fromA - 1, fromA) === originalChar &&\n tr.startState.sliceDoc(fromA, fromA + 3) === '{#/' &&\n tr.startState.sliceDoc(toA - 2, toA) === '#}'\n ) {\n allow = false;\n }\n\n // how to repro with sougou input -> type 1:2 by order inside slot\n // 2 will appear after {#/...#}\n // feature:\n // - :is replaced with :\n // - selection is moved more than one character\n // - new selection is moved after slot {/#...#}\n if (\n originalChar &&\n tr.isUserEvent('input.type') &&\n Math.abs(tr.newSelection.main.to - tr.startState.selection.main.to) > 5 &&\n tr.newSelection.main.to >= 2 &&\n tr.newDoc.sliceString(\n tr.newSelection.main.to - 2,\n tr.newSelection.main.to,\n ) === '#}'\n ) {\n allow = false;\n }\n });\n\n if (!allow) {\n return [];\n }\n\n return tr;\n});\n\nexport { fixSougouInput };\n"],"mappings":"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","names":["import_extensions","import_core_plugins","import_state","import_language","import_common","import_language","import_language","jinjaParser"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@coze-editor/preset-prompt",
3
- "version": "0.1.0-alpha.7cf9d0",
3
+ "version": "0.1.0-alpha.868621",
4
4
  "description": "preset-prompt",
5
5
  "license": "MIT",
6
6
  "author": "fengzilong",
@@ -25,11 +25,11 @@
25
25
  "dependencies": {
26
26
  "@codemirror/autocomplete": "^6.18.0",
27
27
  "@codemirror/language": "^6.10.1",
28
- "@coze-editor/core": "0.1.0-alpha.7cf9d0",
29
- "@coze-editor/core-plugins": "0.1.0-alpha.7cf9d0",
30
- "@coze-editor/extensions": "0.1.0-alpha.7cf9d0",
31
- "@coze-editor/lezer-parser-jinja2": "0.1.0-alpha.7cf9d0",
32
- "@coze-editor/preset-expression": "0.1.0-alpha.7cf9d0",
28
+ "@coze-editor/core": "0.1.0-alpha.868621",
29
+ "@coze-editor/core-plugins": "0.1.0-alpha.868621",
30
+ "@coze-editor/extensions": "0.1.0-alpha.868621",
31
+ "@coze-editor/lezer-parser-jinja2": "0.1.0-alpha.868621",
32
+ "@coze-editor/preset-expression": "0.1.0-alpha.868621",
33
33
  "@lezer/common": "^1.2.2",
34
34
  "@lezer/html": "^1.3.10",
35
35
  "@lezer/markdown": "^1.3.1"