@prosekit/extensions 0.14.1 → 0.14.2
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/drop-indicator-DJq8pF92.js.map +1 -1
- package/dist/file-upload-I9m1EJAM.js.map +1 -1
- package/dist/{mark-paste-rule-n_2Ehmb5.js → mark-paste-rule--F1QPUcU.js} +2 -2
- package/dist/mark-paste-rule--F1QPUcU.js.map +1 -0
- package/dist/{mark-rule-CUnXwBuy.js → mark-rule-Bqdm49Eq.js} +2 -2
- package/dist/mark-rule-Bqdm49Eq.js.map +1 -0
- package/dist/prosekit-extensions-autocomplete.d.ts +1 -1
- package/dist/prosekit-extensions-autocomplete.js +17 -17
- package/dist/prosekit-extensions-autocomplete.js.map +1 -1
- package/dist/prosekit-extensions-background-color.d.ts +1 -1
- package/dist/prosekit-extensions-background-color.js.map +1 -1
- package/dist/prosekit-extensions-blockquote.d.ts +13 -13
- package/dist/prosekit-extensions-blockquote.d.ts.map +1 -1
- package/dist/prosekit-extensions-blockquote.js +5 -4
- package/dist/prosekit-extensions-blockquote.js.map +1 -1
- package/dist/prosekit-extensions-bold.d.ts +12 -12
- package/dist/prosekit-extensions-bold.d.ts.map +1 -1
- package/dist/prosekit-extensions-bold.js.map +1 -1
- package/dist/prosekit-extensions-code-block.d.ts +52 -35
- package/dist/prosekit-extensions-code-block.d.ts.map +1 -1
- package/dist/prosekit-extensions-code-block.js +76 -70
- package/dist/prosekit-extensions-code-block.js.map +1 -1
- package/dist/prosekit-extensions-code.d.ts +12 -12
- package/dist/prosekit-extensions-code.d.ts.map +1 -1
- package/dist/prosekit-extensions-code.js.map +1 -1
- package/dist/prosekit-extensions-commit.d.ts +1 -1
- package/dist/prosekit-extensions-commit.js +1 -1
- package/dist/prosekit-extensions-enter-rule.d.ts +2 -2
- package/dist/prosekit-extensions-enter-rule.d.ts.map +1 -1
- package/dist/prosekit-extensions-enter-rule.js.map +1 -1
- package/dist/prosekit-extensions-hard-break.d.ts +7 -7
- package/dist/prosekit-extensions-hard-break.d.ts.map +1 -1
- package/dist/prosekit-extensions-hard-break.js.map +1 -1
- package/dist/prosekit-extensions-heading.d.ts +15 -15
- package/dist/prosekit-extensions-heading.d.ts.map +1 -1
- package/dist/prosekit-extensions-heading.js.map +1 -1
- package/dist/prosekit-extensions-horizontal-rule.d.ts +7 -7
- package/dist/prosekit-extensions-horizontal-rule.d.ts.map +1 -1
- package/dist/prosekit-extensions-horizontal-rule.js +10 -9
- package/dist/prosekit-extensions-horizontal-rule.js.map +1 -1
- package/dist/prosekit-extensions-image.d.ts +11 -11
- package/dist/prosekit-extensions-image.d.ts.map +1 -1
- package/dist/prosekit-extensions-image.js +9 -9
- package/dist/prosekit-extensions-image.js.map +1 -1
- package/dist/prosekit-extensions-italic.d.ts +12 -12
- package/dist/prosekit-extensions-italic.d.ts.map +1 -1
- package/dist/prosekit-extensions-italic.js.map +1 -1
- package/dist/prosekit-extensions-link.js +2 -2
- package/dist/prosekit-extensions-link.js.map +1 -1
- package/dist/prosekit-extensions-list.d.ts +26 -26
- package/dist/prosekit-extensions-list.d.ts.map +1 -1
- package/dist/prosekit-extensions-list.js +25 -25
- package/dist/prosekit-extensions-list.js.map +1 -1
- package/dist/prosekit-extensions-loro.d.ts +16 -16
- package/dist/prosekit-extensions-loro.d.ts.map +1 -1
- package/dist/prosekit-extensions-loro.js.map +1 -1
- package/dist/prosekit-extensions-mark-rule.js +1 -1
- package/dist/prosekit-extensions-math.d.ts +3 -3
- package/dist/prosekit-extensions-math.d.ts.map +1 -1
- package/dist/prosekit-extensions-math.js +4 -0
- package/dist/prosekit-extensions-math.js.map +1 -1
- package/dist/prosekit-extensions-mod-click-prevention.js +1 -1
- package/dist/prosekit-extensions-paragraph.d.ts +7 -7
- package/dist/prosekit-extensions-paragraph.d.ts.map +1 -1
- package/dist/prosekit-extensions-paragraph.js.map +1 -1
- package/dist/prosekit-extensions-paste-rule.js +1 -1
- package/dist/prosekit-extensions-placeholder.d.ts +1 -1
- package/dist/prosekit-extensions-placeholder.js +2 -2
- package/dist/prosekit-extensions-placeholder.js.map +1 -1
- package/dist/prosekit-extensions-readonly.js +1 -1
- package/dist/prosekit-extensions-strike.js.map +1 -1
- package/dist/prosekit-extensions-table.d.ts +47 -47
- package/dist/prosekit-extensions-table.d.ts.map +1 -1
- package/dist/prosekit-extensions-table.js +1 -1
- package/dist/prosekit-extensions-text-align.d.ts +1 -1
- package/dist/prosekit-extensions-text-color.d.ts +1 -1
- package/dist/prosekit-extensions-text-color.js.map +1 -1
- package/dist/prosekit-extensions-virtual-selection.js +1 -1
- package/dist/prosekit-extensions-yjs.d.ts +3 -3
- package/dist/prosekit-extensions-yjs.d.ts.map +1 -1
- package/dist/prosekit-extensions-yjs.js.map +1 -1
- package/dist/{table-UJVYsrB7.js → table-B81i9oH9.js} +28 -28
- package/dist/table-B81i9oH9.js.map +1 -0
- package/package.json +8 -7
- package/src/autocomplete/autocomplete-helpers.ts +1 -1
- package/src/autocomplete/autocomplete-plugin.ts +2 -2
- package/src/autocomplete/autocomplete-rule.ts +1 -1
- package/src/autocomplete/autocomplete.spec.ts +4 -4
- package/src/autocomplete/autocomplete.ts +2 -2
- package/src/autocomplete/index.ts +2 -2
- package/src/background-color/background-color-commands.spec.ts +1 -1
- package/src/background-color/background-color-commands.ts +1 -1
- package/src/background-color/background-color-spec.spec.ts +1 -1
- package/src/background-color/background-color.ts +2 -2
- package/src/background-color/index.ts +3 -3
- package/src/blockquote/blockquote-input-rule.ts +1 -1
- package/src/blockquote/blockquote-keymap.spec.ts +1 -1
- package/src/blockquote/blockquote-keymap.ts +9 -7
- package/src/blockquote/blockquote.ts +4 -4
- package/src/blockquote/index.ts +5 -5
- package/src/bold/bold-input-rule.spec.ts +2 -2
- package/src/bold/bold-input-rule.ts +1 -1
- package/src/bold/bold.ts +4 -4
- package/src/bold/index.ts +5 -5
- package/src/code/code-input-rule.ts +1 -1
- package/src/code/code.ts +4 -4
- package/src/code/index.ts +5 -5
- package/src/code-block/code-block-commands.ts +1 -1
- package/src/code-block/code-block-highlight.ts +11 -1
- package/src/code-block/code-block-input-rule.ts +3 -3
- package/src/code-block/code-block-shiki.ts +13 -5
- package/src/code-block/code-block-spec.spec.ts +2 -2
- package/src/code-block/code-block-spec.ts +1 -1
- package/src/code-block/code-block.ts +4 -4
- package/src/code-block/index.ts +9 -9
- package/src/code-block/shiki-highlighter.ts +2 -2
- package/src/code-block/shiki-parser.ts +2 -2
- package/src/drop-cursor/index.ts +1 -1
- package/src/drop-indicator/drop-indicator.ts +1 -1
- package/src/drop-indicator/index.ts +1 -1
- package/src/enter-rule/index.ts +3 -3
- package/src/file/file-drop-handler.ts +1 -1
- package/src/file/file-paste-handler.spec.ts +3 -3
- package/src/file/file-paste-handler.ts +1 -1
- package/src/file/index.ts +3 -3
- package/src/gap-cursor/index.ts +1 -1
- package/src/hard-break/hard-break-keymap.spec.ts +2 -2
- package/src/hard-break/hard-break-keymap.ts +1 -1
- package/src/hard-break/hard-break.ts +3 -3
- package/src/hard-break/index.ts +4 -4
- package/src/heading/heading-commands.ts +1 -1
- package/src/heading/heading-input-rule.ts +2 -2
- package/src/heading/heading-keymap.spec.ts +1 -1
- package/src/heading/heading-spec.ts +1 -1
- package/src/heading/heading.ts +4 -4
- package/src/heading/index.ts +6 -6
- package/src/horizontal-rule/horizontal-rule-commands.spec.ts +1 -1
- package/src/horizontal-rule/horizontal-rule-commands.ts +13 -11
- package/src/horizontal-rule/horizontal-rule-input-rule.spec.ts +2 -2
- package/src/horizontal-rule/horizontal-rule-input-rule.ts +1 -1
- package/src/horizontal-rule/horizontal-rule.ts +3 -3
- package/src/horizontal-rule/index.ts +4 -4
- package/src/image/image-commands/insert-image.ts +1 -1
- package/src/image/image-commands/upload-image.spec.ts +4 -4
- package/src/image/image-commands/upload-image.ts +2 -2
- package/src/image/image-commands.ts +3 -3
- package/src/image/image-upload-handler.ts +2 -2
- package/src/image/image.ts +2 -2
- package/src/image/index.ts +6 -6
- package/src/italic/index.ts +5 -5
- package/src/italic/italic-commands.spec.ts +4 -4
- package/src/italic/italic-input-rule.spec.ts +2 -2
- package/src/italic/italic-input-rule.ts +1 -1
- package/src/italic/italic.ts +4 -4
- package/src/link/index.spec.ts +2 -2
- package/src/link/index.ts +6 -6
- package/src/link/link-paste-rule.spec.ts +2 -2
- package/src/link/link-paste-rule.ts +3 -3
- package/src/link/link-regex.spec.ts +1 -1
- package/src/list/index.ts +8 -8
- package/src/list/list-drop-indicator.ts +2 -2
- package/src/list/list-input-rules.ts +1 -1
- package/src/list/list-keymap.spec.ts +1 -1
- package/src/list/list-spec.ts +1 -1
- package/src/list/list-types.spec.ts +2 -2
- package/src/list/list.spec.ts +6 -6
- package/src/list/list.ts +7 -7
- package/src/loro/index.ts +6 -6
- package/src/loro/loro.ts +5 -5
- package/src/mark-rule/apply.ts +2 -2
- package/src/mark-rule/index.ts +2 -2
- package/src/mark-rule/mark-rule.spec.ts +4 -4
- package/src/mark-rule/mark-rule.ts +2 -2
- package/src/math/index.ts +4 -4
- package/src/math/math-block.ts +8 -1
- package/src/math/math-inline.ts +1 -1
- package/src/math/math.ts +3 -3
- package/src/paragraph/index.ts +7 -7
- package/src/paragraph/paragraph-keymap.ts +1 -1
- package/src/paragraph/paragraph.ts +3 -3
- package/src/paste-rule/index.ts +2 -2
- package/src/paste-rule/mark-paste-rule.spec.ts +8 -8
- package/src/paste-rule/mark-paste-rule.ts +2 -2
- package/src/paste-rule/paste-rule.spec.ts +2 -2
- package/src/paste-rule/paste-rule.ts +1 -1
- package/src/paste-rule/split-text-by-regex.spec.ts +1 -1
- package/src/placeholder/index.ts +1 -1
- package/src/strike/index.ts +1 -1
- package/src/table/index.ts +14 -14
- package/src/table/table-commands/delete-cell-selection.spec.ts +3 -3
- package/src/table/table-commands/exit-table.spec.ts +2 -2
- package/src/table/table-commands/insert-table.spec.ts +1 -1
- package/src/table/table-commands/move-table-column.spec.ts +2 -2
- package/src/table/table-commands/move-table-row.spec.ts +2 -2
- package/src/table/table-commands/select-table-cell.spec.ts +3 -3
- package/src/table/table-commands/select-table-cell.ts +1 -1
- package/src/table/table-commands/select-table-column.spec.ts +2 -2
- package/src/table/table-commands/select-table-column.ts +1 -1
- package/src/table/table-commands/select-table-row.spec.ts +2 -2
- package/src/table/table-commands/select-table-row.ts +1 -1
- package/src/table/table-commands/select-table.spec.ts +2 -2
- package/src/table/table-commands/select-table.ts +1 -1
- package/src/table/table-commands.ts +9 -9
- package/src/table/table-drop-indicator.ts +2 -2
- package/src/table/table-spec.spec.ts +4 -4
- package/src/table/table.ts +4 -4
- package/src/table/test-utils.ts +1 -1
- package/src/testing/index.ts +24 -24
- package/src/text-color/index.ts +3 -3
- package/src/text-color/text-color-commands.spec.ts +1 -1
- package/src/text-color/text-color-commands.ts +1 -1
- package/src/text-color/text-color-spec.spec.ts +1 -1
- package/src/text-color/text-color.ts +2 -2
- package/src/yjs/index.ts +7 -7
- package/src/yjs/yjs-cursor-plugin.ts +1 -1
- package/src/yjs/yjs-undo-plugin.ts +3 -2
- package/src/yjs/yjs.ts +6 -6
- package/dist/mark-paste-rule-n_2Ehmb5.js.map +0 -1
- package/dist/mark-rule-CUnXwBuy.js.map +0 -1
- package/dist/table-UJVYsrB7.js.map +0 -1
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
import { Extension, PlainExtension, Union } from "@prosekit/core";
|
|
2
1
|
import { Command } from "@prosekit/pm/state";
|
|
2
|
+
import { Extension, PlainExtension, Union } from "@prosekit/core";
|
|
3
3
|
import { Attrs } from "@prosekit/pm/model";
|
|
4
4
|
|
|
5
5
|
//#region src/horizontal-rule/horizontal-rule-commands.d.ts
|
|
@@ -14,6 +14,12 @@ type HorizontalRuleCommandsExtension = Extension<{
|
|
|
14
14
|
declare function insertHorizontalRule(): Command;
|
|
15
15
|
declare function defineHorizontalRuleCommands(): HorizontalRuleCommandsExtension;
|
|
16
16
|
//#endregion
|
|
17
|
+
//#region src/horizontal-rule/horizontal-rule-input-rule.d.ts
|
|
18
|
+
/**
|
|
19
|
+
* @public
|
|
20
|
+
*/
|
|
21
|
+
declare function defineHorizontalRuleInputRule(): PlainExtension;
|
|
22
|
+
//#endregion
|
|
17
23
|
//#region src/horizontal-rule/horizontal-rule-spec.d.ts
|
|
18
24
|
type HorizontalRuleSpecExtension = Extension<{
|
|
19
25
|
Nodes: {
|
|
@@ -29,11 +35,5 @@ type HorizontalRuleExtension = Union<[HorizontalRuleSpecExtension, HorizontalRul
|
|
|
29
35
|
*/
|
|
30
36
|
declare function defineHorizontalRule(): HorizontalRuleExtension;
|
|
31
37
|
//#endregion
|
|
32
|
-
//#region src/horizontal-rule/horizontal-rule-input-rule.d.ts
|
|
33
|
-
/**
|
|
34
|
-
* @public
|
|
35
|
-
*/
|
|
36
|
-
declare function defineHorizontalRuleInputRule(): PlainExtension;
|
|
37
|
-
//#endregion
|
|
38
38
|
export { type HorizontalRuleCommandsExtension, type HorizontalRuleExtension, type HorizontalRuleSpecExtension, defineHorizontalRule, defineHorizontalRuleCommands, defineHorizontalRuleInputRule, defineHorizontalRuleSpec, insertHorizontalRule };
|
|
39
39
|
//# sourceMappingURL=prosekit-extensions-horizontal-rule.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"prosekit-extensions-horizontal-rule.d.ts","names":[],"sources":["../src/horizontal-rule/horizontal-rule-commands.ts","../src/horizontal-rule/horizontal-rule-
|
|
1
|
+
{"version":3,"file":"prosekit-extensions-horizontal-rule.d.ts","names":[],"sources":["../src/horizontal-rule/horizontal-rule-commands.ts","../src/horizontal-rule/horizontal-rule-input-rule.ts","../src/horizontal-rule/horizontal-rule-spec.ts","../src/horizontal-rule/horizontal-rule.ts"],"mappings":";;;;;KAIY,+BAAA,GAAkC,SAAA;EAC5C,QAAA;IACE,oBAAA;EAAA;AAAA;;;;iBAmBY,oBAAA,CAAA,GAAwB,OAAA;AAAA,iBAIxB,4BAAA,CAAA,GAAgC,+BAAA;;;;;;iBCrBhC,6BAAA,CAAA,GAAiC,cAAA;;;KCLrC,2BAAA,GAA8B,SAAA;EACxC,KAAA;IACE,cAAA,EAAgB,KAAA;EAAA;AAAA;AAAA,iBAIJ,wBAAA,CAAA,GAA4B,2BAAA;;;KCHhC,uBAAA,GAA0B,KAAA,EACnC,2BAAA,EAA6B,+BAAA;;;;iBAMhB,oBAAA,CAAA,GAAwB,uBAAA"}
|
|
@@ -4,19 +4,20 @@ import { InputRule } from "@prosekit/pm/inputrules";
|
|
|
4
4
|
import { Fragment, Slice } from "@prosekit/pm/model";
|
|
5
5
|
|
|
6
6
|
//#region src/horizontal-rule/horizontal-rule-commands.ts
|
|
7
|
+
const insertHorizontalRuleCommand = (state, dispatch) => {
|
|
8
|
+
if (!dispatch) return true;
|
|
9
|
+
const { schema, tr } = state;
|
|
10
|
+
const node = getNodeType(schema, "horizontalRule").createChecked();
|
|
11
|
+
const pos = tr.selection.anchor;
|
|
12
|
+
tr.replaceRange(pos, pos, new Slice(Fragment.from(node), 0, 0));
|
|
13
|
+
dispatch(tr);
|
|
14
|
+
return true;
|
|
15
|
+
};
|
|
7
16
|
/**
|
|
8
17
|
* Returns a command that inserts a horizontal rule at the current selection.
|
|
9
18
|
*/
|
|
10
19
|
function insertHorizontalRule() {
|
|
11
|
-
return
|
|
12
|
-
if (!dispatch) return true;
|
|
13
|
-
const { schema, tr } = state;
|
|
14
|
-
const node = getNodeType(schema, "horizontalRule").createChecked();
|
|
15
|
-
const pos = tr.selection.anchor;
|
|
16
|
-
tr.replaceRange(pos, pos, new Slice(Fragment.from(node), 0, 0));
|
|
17
|
-
dispatch(tr);
|
|
18
|
-
return true;
|
|
19
|
-
};
|
|
20
|
+
return insertHorizontalRuleCommand;
|
|
20
21
|
}
|
|
21
22
|
function defineHorizontalRuleCommands() {
|
|
22
23
|
return defineCommands({ insertHorizontalRule });
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"prosekit-extensions-horizontal-rule.js","names":[],"sources":["../src/horizontal-rule/horizontal-rule-commands.ts","../src/horizontal-rule/horizontal-rule-input-rule.ts","../src/horizontal-rule/horizontal-rule-spec.ts","../src/horizontal-rule/horizontal-rule.ts"],"sourcesContent":["import { defineCommands, getNodeType, type Extension } from '@prosekit/core'\nimport { Fragment, Slice } from '@prosekit/pm/model'\nimport type { Command } from '@prosekit/pm/state'\n\nexport type HorizontalRuleCommandsExtension = Extension<{\n Commands: {\n insertHorizontalRule: []\n }\n}>\n\
|
|
1
|
+
{"version":3,"file":"prosekit-extensions-horizontal-rule.js","names":[],"sources":["../src/horizontal-rule/horizontal-rule-commands.ts","../src/horizontal-rule/horizontal-rule-input-rule.ts","../src/horizontal-rule/horizontal-rule-spec.ts","../src/horizontal-rule/horizontal-rule.ts"],"sourcesContent":["import { defineCommands, getNodeType, type Extension } from '@prosekit/core'\nimport { Fragment, Slice } from '@prosekit/pm/model'\nimport type { Command } from '@prosekit/pm/state'\n\nexport type HorizontalRuleCommandsExtension = Extension<{\n Commands: {\n insertHorizontalRule: []\n }\n}>\n\nconst insertHorizontalRuleCommand: Command = (state, dispatch): boolean => {\n if (!dispatch) return true\n\n const { schema, tr } = state\n const type = getNodeType(schema, 'horizontalRule')\n const node = type.createChecked()\n const pos = tr.selection.anchor\n tr.replaceRange(pos, pos, new Slice(Fragment.from(node), 0, 0))\n dispatch(tr)\n return true\n}\n\n/**\n * Returns a command that inserts a horizontal rule at the current selection.\n */\nexport function insertHorizontalRule(): Command {\n return insertHorizontalRuleCommand\n}\n\nexport function defineHorizontalRuleCommands(): HorizontalRuleCommandsExtension {\n return defineCommands({ insertHorizontalRule })\n}\n","import { getNodeType, union, type PlainExtension } from '@prosekit/core'\nimport { InputRule } from '@prosekit/pm/inputrules'\n\nimport { defineInputRule } from '../input-rule/index.ts'\n\n/**\n * @public\n */\nexport function defineHorizontalRuleInputRule(): PlainExtension {\n return union(\n defineInputRule(\n new InputRule(/^---$/, (state, match, start, end) => {\n const { schema } = state\n const { tr } = state\n const type = getNodeType(schema, 'horizontalRule')\n const node = type.createChecked()\n tr.delete(start, end).insert(start - 1, node)\n return tr.scrollIntoView()\n }),\n ),\n )\n}\n","import { defineNodeSpec, type Extension } from '@prosekit/core'\nimport type { Attrs } from '@prosekit/pm/model'\n\nexport type HorizontalRuleSpecExtension = Extension<{\n Nodes: {\n horizontalRule: Attrs\n }\n}>\n\nexport function defineHorizontalRuleSpec(): HorizontalRuleSpecExtension {\n return defineNodeSpec({\n name: 'horizontalRule',\n group: 'block',\n parseDOM: [{ tag: 'hr' }],\n // Wrap the `<hr>` in a `<div>` so that we can make it taller and easier to click.\n toDOM: () => ['div', { class: 'prosekit-horizontal-rule' }, ['hr']],\n })\n}\n","import { union, type Union } from '@prosekit/core'\n\nimport { defineHorizontalRuleCommands, type HorizontalRuleCommandsExtension } from './horizontal-rule-commands.ts'\nimport { defineHorizontalRuleInputRule } from './horizontal-rule-input-rule.ts'\nimport { defineHorizontalRuleSpec, type HorizontalRuleSpecExtension } from './horizontal-rule-spec.ts'\n\nexport type HorizontalRuleExtension = Union<\n [HorizontalRuleSpecExtension, HorizontalRuleCommandsExtension]\n>\n\n/**\n * @public\n */\nexport function defineHorizontalRule(): HorizontalRuleExtension {\n return union(\n defineHorizontalRuleSpec(),\n defineHorizontalRuleInputRule(),\n defineHorizontalRuleCommands(),\n )\n}\n"],"mappings":";;;;;;AAUA,MAAM,+BAAwC,OAAO,aAAsB;AACzE,KAAI,CAAC,SAAU,QAAO;CAEtB,MAAM,EAAE,QAAQ,OAAO;CAEvB,MAAM,OADO,YAAY,QAAQ,iBAAiB,CAChC,eAAe;CACjC,MAAM,MAAM,GAAG,UAAU;AACzB,IAAG,aAAa,KAAK,KAAK,IAAI,MAAM,SAAS,KAAK,KAAK,EAAE,GAAG,EAAE,CAAC;AAC/D,UAAS,GAAG;AACZ,QAAO;;;;;AAMT,SAAgB,uBAAgC;AAC9C,QAAO;;AAGT,SAAgB,+BAAgE;AAC9E,QAAO,eAAe,EAAE,sBAAsB,CAAC;;;;;;;;ACtBjD,SAAgB,gCAAgD;AAC9D,QAAO,MACL,gBACE,IAAI,UAAU,UAAU,OAAO,OAAO,OAAO,QAAQ;EACnD,MAAM,EAAE,WAAW;EACnB,MAAM,EAAE,OAAO;EAEf,MAAM,OADO,YAAY,QAAQ,iBAAiB,CAChC,eAAe;AACjC,KAAG,OAAO,OAAO,IAAI,CAAC,OAAO,QAAQ,GAAG,KAAK;AAC7C,SAAO,GAAG,gBAAgB;GAC1B,CACH,CACF;;;;;ACXH,SAAgB,2BAAwD;AACtE,QAAO,eAAe;EACpB,MAAM;EACN,OAAO;EACP,UAAU,CAAC,EAAE,KAAK,MAAM,CAAC;EAEzB,aAAa;GAAC;GAAO,EAAE,OAAO,4BAA4B;GAAE,CAAC,KAAK;GAAC;EACpE,CAAC;;;;;;;;ACHJ,SAAgB,uBAAgD;AAC9D,QAAO,MACL,0BAA0B,EAC1B,+BAA+B,EAC/B,8BAA8B,CAC/B"}
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { l as FileDropHandlerOptions, n as UploadTask, o as FilePasteHandlerOptions, r as Uploader } from "./file-upload-dr3IXUty.js";
|
|
2
2
|
import "./prosekit-extensions-file.js";
|
|
3
|
-
import { Extension, PlainExtension, Union } from "@prosekit/core";
|
|
4
3
|
import { Command } from "@prosekit/pm/state";
|
|
4
|
+
import { Extension, PlainExtension, Union } from "@prosekit/core";
|
|
5
5
|
import { EditorView } from "@prosekit/pm/view";
|
|
6
6
|
|
|
7
7
|
//#region src/image/image-commands/upload-image.d.ts
|
|
@@ -121,16 +121,6 @@ type ImageCommandsExtension = Extension<{
|
|
|
121
121
|
*/
|
|
122
122
|
declare function defineImageCommands(): ImageCommandsExtension;
|
|
123
123
|
//#endregion
|
|
124
|
-
//#region src/image/image.d.ts
|
|
125
|
-
/**
|
|
126
|
-
* @internal
|
|
127
|
-
*/
|
|
128
|
-
type ImageExtension = Union<[ImageSpecExtension, ImageCommandsExtension]>;
|
|
129
|
-
/**
|
|
130
|
-
* @public
|
|
131
|
-
*/
|
|
132
|
-
declare function defineImage(): ImageExtension;
|
|
133
|
-
//#endregion
|
|
134
124
|
//#region src/image/image-commands/insert-image.d.ts
|
|
135
125
|
/**
|
|
136
126
|
* Returns a command that inserts an image node with the given attributes at the
|
|
@@ -187,5 +177,15 @@ declare function defineImageUploadHandler({
|
|
|
187
177
|
onError
|
|
188
178
|
}: ImageUploadHandlerOptions): PlainExtension;
|
|
189
179
|
//#endregion
|
|
180
|
+
//#region src/image/image.d.ts
|
|
181
|
+
/**
|
|
182
|
+
* @internal
|
|
183
|
+
*/
|
|
184
|
+
type ImageExtension = Union<[ImageSpecExtension, ImageCommandsExtension]>;
|
|
185
|
+
/**
|
|
186
|
+
* @public
|
|
187
|
+
*/
|
|
188
|
+
declare function defineImage(): ImageExtension;
|
|
189
|
+
//#endregion
|
|
190
190
|
export { type ImageAttrs, type ImageCanDropPredicate, type ImageCanPastePredicate, type ImageCommandsExtension, type ImageExtension, type ImageSpecExtension, type ImageUploadErrorHandler, type ImageUploadErrorHandlerOptions, type ImageUploadHandlerOptions, type UploadImageOptions, defineImage, defineImageCommands, defineImageSpec, defineImageUploadHandler, insertImage, replaceImageURL, uploadImage };
|
|
191
191
|
//# sourceMappingURL=prosekit-extensions-image.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"prosekit-extensions-image.d.ts","names":[],"sources":["../src/image/image-commands/upload-image.ts","../src/image/image-spec.ts","../src/image/image-commands.ts","../src/image/image.ts","../src/image/image-
|
|
1
|
+
{"version":3,"file":"prosekit-extensions-image.d.ts","names":[],"sources":["../src/image/image-commands/upload-image.ts","../src/image/image-spec.ts","../src/image/image-commands.ts","../src/image/image-commands/insert-image.ts","../src/image/image-upload-handler.ts","../src/image/image.ts"],"mappings":";;;;;;;;;;;AAYA;UAAiB,kBAAA;;;;;EAKf,QAAA,EAAU,QAAA;EAoBuB;;;EAhBjC,IAAA,EAAM,IAAA;EAAA;;;;EAKN,GAAA;EAWiC;;AAQnC;;;;EAZE,OAAA;EAgBM;;;EAZN,OAAA,GAAU,uBAAA;AAAA;;AA4BZ;;;;UApBiB,8BAAA;EA8BD;;;EA1Bd,IAAA,EAAM,IAAA;EA4BN;;;EAxBA,KAAA;EA4BC;;;EAxBD,UAAA,EAAY,UAAA;AAAA;;;;;;KAQF,uBAAA,IAA2B,OAAA,EAAS,8BAAA;;;;;;;;AAkFhD;iBAxEgB,WAAA,CAAA;EACd,QAAA;EACA,IAAA;EACA,GAAA;EACA,OAAA;EACA;AAAA,GACC,kBAAA,GAAqB,OAAA;;;;;;iBAkER,eAAA,CACd,IAAA,EAAM,UAAA,EACN,MAAA,UACA,MAAA;;;;;;UCjJe,UAAA;EACf,GAAA;EACA,KAAA;EACA,MAAA;AAAA;;;;KAMU,kBAAA,GAAqB,SAAA;EAC/B,KAAA;IACE,KAAA,EAAO,UAAA;EAAA;AAAA;;;;iBAOK,eAAA,CAAA,GAAmB,kBAAA;;;;;;KCdvB,sBAAA,GAAyB,SAAA;EACnC,QAAA;IACE,WAAA,GAAc,KAAA,GAAQ,UAAA;IACtB,WAAA,GAAc,OAAA,EAAS,kBAAA;EAAA;AAAA;;;;iBAOX,mBAAA,CAAA,GAAuB,sBAAA;;;;;;;;AFPvC;iBGDgB,WAAA,CAAY,KAAA,GAAQ,UAAA,GAAa,OAAA;;;;;;KCMrC,sBAAA,IAA0B,OAAA,EAAS,uBAAA;AJL/C;;;AAAA,KIUY,qBAAA,IAAyB,OAAA,EAAS,sBAAA;;;;UAK7B,yBAAA;EJVf;;;;EIeA,QAAA,EAAU,QAAA;EJCV;;;;EIIA,QAAA,GAAW,sBAAA;EJQI;;;;EIHf,OAAA,GAAU,qBAAA;EJOJ;;;;EIFN,OAAA,GAAU,uBAAA;AAAA;AJkBZ;;;;;AAUA;AAVA,iBIAgB,wBAAA,CAAA;EACd,QAAA;EACA,QAAA;EACA,OAAA;EACA;AAAA,GACC,yBAAA,GAA4B,cAAA;;;;;;KC9DnB,cAAA,GAAiB,KAAA,EAAO,kBAAA,EAAoB,sBAAA;ALIxD;;;AAAA,iBKCgB,WAAA,CAAA,GAAe,cAAA"}
|
|
@@ -163,15 +163,6 @@ function defineImageSpec() {
|
|
|
163
163
|
});
|
|
164
164
|
}
|
|
165
165
|
|
|
166
|
-
//#endregion
|
|
167
|
-
//#region src/image/image.ts
|
|
168
|
-
/**
|
|
169
|
-
* @public
|
|
170
|
-
*/
|
|
171
|
-
function defineImage() {
|
|
172
|
-
return union(defineImageSpec(), defineImageCommands());
|
|
173
|
-
}
|
|
174
|
-
|
|
175
166
|
//#endregion
|
|
176
167
|
//#region src/image/image-upload-handler.ts
|
|
177
168
|
function defaultCanUpload({ file }) {
|
|
@@ -209,6 +200,15 @@ function defineImageUploadHandler({ uploader, canPaste = defaultCanUpload, canDr
|
|
|
209
200
|
return union(defineFilePasteHandler(handlePaste), defineFileDropHandler(handleDrop));
|
|
210
201
|
}
|
|
211
202
|
|
|
203
|
+
//#endregion
|
|
204
|
+
//#region src/image/image.ts
|
|
205
|
+
/**
|
|
206
|
+
* @public
|
|
207
|
+
*/
|
|
208
|
+
function defineImage() {
|
|
209
|
+
return union(defineImageSpec(), defineImageCommands());
|
|
210
|
+
}
|
|
211
|
+
|
|
212
212
|
//#endregion
|
|
213
213
|
export { defineImage, defineImageCommands, defineImageSpec, defineImageUploadHandler, insertImage, replaceImageURL, uploadImage };
|
|
214
214
|
//# sourceMappingURL=prosekit-extensions-image.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"prosekit-extensions-image.js","names":[],"sources":["../src/image/image-commands/insert-image.ts","../src/image/image-commands/upload-image.ts","../src/image/image-commands.ts","../src/image/image-spec.ts","../src/image/image.ts","../src/image/image-upload-handler.ts"],"sourcesContent":["import { insertNode } from '@prosekit/core'\nimport type { Command } from '@prosekit/pm/state'\n\nimport type { ImageAttrs } from '../image-spec'\n\n/**\n * Returns a command that inserts an image node with the given attributes at the\n * current selection position.\n *\n * @public\n */\nexport function insertImage(attrs?: ImageAttrs): Command {\n return insertNode({ type: 'image', attrs })\n}\n","import { insertNode, ProseKitError } from '@prosekit/core'\nimport type { Command, EditorState, Transaction } from '@prosekit/pm/state'\nimport type { EditorView } from '@prosekit/pm/view'\n\nimport { UploadTask, type Uploader } from '../../file'\nimport type { ImageAttrs } from '../image-spec'\n\n/**\n * Options for {@link uploadImage}.\n *\n * @public\n */\nexport interface UploadImageOptions {\n /**\n * The uploader used to upload the file. It should return a promise that\n * resolves to the URL of the uploaded image.\n */\n uploader: Uploader<string>\n /**\n * The file that will be uploaded.\n */\n file: File\n /**\n * The position where the image should be inserted. If not provided, the\n * image is inserted at the current selection.\n */\n pos?: number\n /**\n * If the image should replace the existing image at the given position. This\n * is only used if `pos` is provided.\n *\n * @default false\n */\n replace?: boolean\n /**\n * A handler to be called when an error occurs during the upload.\n */\n onError?: ImageUploadErrorHandler\n}\n\n/**\n * Options for the {@link ImageUploadErrorHandler} callback.\n *\n * @public\n */\nexport interface ImageUploadErrorHandlerOptions {\n /**\n * The file that was uploaded.\n */\n file: File\n /**\n * The error that occurred during the upload.\n */\n error: unknown\n /**\n * The upload task that was used to upload the file.\n */\n uploadTask: UploadTask<string>\n}\n\n/**\n * A handler to be called when an error occurs during the upload.\n *\n * @public\n */\nexport type ImageUploadErrorHandler = (options: ImageUploadErrorHandlerOptions) => void\n\n/**\n * Returns a command that uploads an image file and inserts an image node with a\n * temporary URL which is replaced once the upload completes.\n *\n * @param options\n *\n * @public\n */\nexport function uploadImage({\n uploader,\n file,\n pos,\n replace = false,\n onError,\n}: UploadImageOptions): Command {\n return (state, dispatch, view) => {\n const uploadTask = new UploadTask({ file, uploader })\n const objectURL = uploadTask.objectURL\n\n uploadTask.finished\n .then((resultURL) => {\n if (view && view.isDestroyed) {\n return\n } else if (typeof resultURL !== 'string') {\n const error = new ProseKitError(\n `Unexpected upload result. Expected a string but got ${typeof resultURL}`,\n )\n onError?.({ file, error, uploadTask })\n } else if (!view) {\n const error = new ProseKitError(\n 'View must be available to replace the image URL',\n )\n onError?.({ file, error, uploadTask })\n } else {\n replaceImageURL(view, objectURL, resultURL)\n UploadTask.delete(objectURL)\n }\n })\n .catch((error) => {\n onError?.({ file, error, uploadTask })\n })\n\n if (replace && pos != null) {\n if (replaceExistingImageURL(state, pos, objectURL, dispatch)) {\n return true\n }\n }\n\n const attrs: ImageAttrs = { src: objectURL }\n return insertNode({ type: 'image', attrs, pos })(state, dispatch, view)\n }\n}\n\nfunction replaceExistingImageURL(\n state: EditorState,\n pos: number,\n imageURL: string,\n dispatch?: (tr: Transaction) => void,\n): boolean {\n const node = state.doc.nodeAt(pos)\n if (!node || node.type.name !== 'image') {\n return false\n }\n const attrs = node.attrs as ImageAttrs\n if (attrs.src === imageURL) {\n return true\n }\n if (dispatch) {\n const tr = state.tr\n tr.setNodeAttribute(pos, 'src', imageURL)\n dispatch(tr)\n }\n return true\n}\n\n/**\n * Replaces the temporary image URL with the final uploaded URL.\n *\n * @internal\n */\nexport function replaceImageURL(\n view: EditorView,\n oldURL: string,\n newURL: string,\n): void {\n const positions: number[] = []\n view.state.doc.descendants((node, pos) => {\n if (node.type.name === 'image') {\n const attrs = node.attrs as ImageAttrs\n if (attrs.src === oldURL) {\n positions.push(pos)\n }\n }\n })\n\n if (positions.length === 0) {\n return\n }\n\n const tr = view.state.tr\n for (const pos of positions) {\n tr.setNodeAttribute(pos, 'src', newURL)\n }\n view.dispatch(tr)\n}\n","import { defineCommands, type Extension } from '@prosekit/core'\n\nimport { insertImage } from './image-commands/insert-image'\nimport { uploadImage, type UploadImageOptions } from './image-commands/upload-image'\nimport type { ImageAttrs } from './image-spec'\n\n/**\n * @internal\n */\nexport type ImageCommandsExtension = Extension<{\n Commands: {\n insertImage: [attrs?: ImageAttrs]\n uploadImage: [options: UploadImageOptions]\n }\n}>\n\n/**\n * @internal\n */\nexport function defineImageCommands(): ImageCommandsExtension {\n return defineCommands({\n insertImage,\n uploadImage,\n })\n}\n","import { defineNodeSpec, type Extension } from '@prosekit/core'\n\n/**\n * @public\n */\nexport interface ImageAttrs {\n src?: string | null\n width?: number | null\n height?: number | null\n}\n\n/**\n * @internal\n */\nexport type ImageSpecExtension = Extension<{\n Nodes: {\n image: ImageAttrs\n }\n}>\n\n/**\n * @internal\n */\nexport function defineImageSpec(): ImageSpecExtension {\n return defineNodeSpec({\n name: 'image',\n attrs: {\n src: { default: null, validate: 'string|null' },\n width: { default: null, validate: 'number|null' },\n height: { default: null, validate: 'number|null' },\n },\n group: 'block',\n defining: true,\n draggable: true,\n parseDOM: [\n {\n tag: 'img[src]',\n getAttrs: (element): ImageAttrs => {\n if (typeof element === 'string') {\n return { src: null }\n }\n\n const src = element.getAttribute('src') || null\n\n let width: number | null = null\n let height: number | null = null\n\n const rect = element.getBoundingClientRect()\n if (rect.width > 0 && rect.height > 0) {\n width = rect.width\n height = rect.height\n } else if (\n element instanceof HTMLImageElement\n && element.naturalWidth > 0\n && element.naturalHeight > 0\n ) {\n width = element.naturalWidth\n height = element.naturalHeight\n }\n return { src, width, height }\n },\n },\n ],\n toDOM(node) {\n const attrs = node.attrs as ImageAttrs\n return ['img', attrs]\n },\n })\n}\n","import { union, type Union } from '@prosekit/core'\n\nimport { defineImageCommands, type ImageCommandsExtension } from './image-commands'\nimport { defineImageSpec, type ImageSpecExtension } from './image-spec'\n\n/**\n * @internal\n */\nexport type ImageExtension = Union<[ImageSpecExtension, ImageCommandsExtension]>\n\n/**\n * @public\n */\nexport function defineImage(): ImageExtension {\n return union(defineImageSpec(), defineImageCommands())\n}\n","import { union, type PlainExtension } from '@prosekit/core'\n\nimport {\n defineFileDropHandler,\n defineFilePasteHandler,\n type FileDropHandler,\n type FileDropHandlerOptions,\n type FilePasteHandler,\n type FilePasteHandlerOptions,\n type Uploader,\n} from '../file'\n\nimport { uploadImage, type ImageUploadErrorHandler } from './image-commands/upload-image'\n\n/**\n * A predicate to determine if the pasted file should be uploaded and inserted as an image.\n */\nexport type ImageCanPastePredicate = (options: FilePasteHandlerOptions) => boolean\n\n/**\n * A predicate to determine if the dropped file should be uploaded and inserted as an image.\n */\nexport type ImageCanDropPredicate = (options: FileDropHandlerOptions) => boolean\n\n/**\n * A handler to be called when an error occurs during the upload.\n */\nexport interface ImageUploadHandlerOptions {\n /**\n * The uploader used to upload the file. It should return a promise that\n * resolves to the URL of the uploaded image.\n */\n uploader: Uploader<string>\n /**\n * A predicate to determine if the pasted file should be uploaded and inserted as an image.\n * If not provided, it defaults to only allowing paste of files with a content type starting with `image/`.\n */\n canPaste?: ImageCanPastePredicate\n /**\n * A predicate to determine if the dropped file should be uploaded and inserted as an image.\n * If not provided, it defaults to only allowing drop of files with a content type starting with `image/`.\n */\n canDrop?: ImageCanDropPredicate\n /**\n * A handler to be called when an error occurs during the upload.\n * If not provided, it defaults to logging the error to the console.\n */\n onError?: ImageUploadErrorHandler\n}\n\nfunction defaultCanUpload({ file }: { file: File }): boolean {\n // Only handle image files by default\n return file.type.startsWith('image/')\n}\n\nconst defaultOnError: ImageUploadErrorHandler = ({ error }) => {\n console.error('[prosekit] Failed to upload image:', error)\n}\n\n/**\n * Returns an extension that handles image file uploads when pasting or dropping\n * images into the editor.\n *\n * @param options\n */\nexport function defineImageUploadHandler({\n uploader,\n canPaste = defaultCanUpload,\n canDrop = defaultCanUpload,\n onError = defaultOnError,\n}: ImageUploadHandlerOptions): PlainExtension {\n const handlePaste: FilePasteHandler = (options) => {\n if (!canPaste(options)) return false\n const { view, file } = options\n const command = uploadImage({ uploader, file, onError })\n return command(view.state, view.dispatch, view)\n }\n\n const handleDrop: FileDropHandler = (options) => {\n if (!canDrop(options)) return false\n const { view, file, pos } = options\n const command = uploadImage({ uploader, file, onError, pos })\n return command(view.state, view.dispatch, view)\n }\n\n return union(\n defineFilePasteHandler(handlePaste),\n defineFileDropHandler(handleDrop),\n )\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"prosekit-extensions-image.js","names":[],"sources":["../src/image/image-commands/insert-image.ts","../src/image/image-commands/upload-image.ts","../src/image/image-commands.ts","../src/image/image-spec.ts","../src/image/image-upload-handler.ts","../src/image/image.ts"],"sourcesContent":["import { insertNode } from '@prosekit/core'\nimport type { Command } from '@prosekit/pm/state'\n\nimport type { ImageAttrs } from '../image-spec.ts'\n\n/**\n * Returns a command that inserts an image node with the given attributes at the\n * current selection position.\n *\n * @public\n */\nexport function insertImage(attrs?: ImageAttrs): Command {\n return insertNode({ type: 'image', attrs })\n}\n","import { insertNode, ProseKitError } from '@prosekit/core'\nimport type { Command, EditorState, Transaction } from '@prosekit/pm/state'\nimport type { EditorView } from '@prosekit/pm/view'\n\nimport { UploadTask, type Uploader } from '../../file/index.ts'\nimport type { ImageAttrs } from '../image-spec.ts'\n\n/**\n * Options for {@link uploadImage}.\n *\n * @public\n */\nexport interface UploadImageOptions {\n /**\n * The uploader used to upload the file. It should return a promise that\n * resolves to the URL of the uploaded image.\n */\n uploader: Uploader<string>\n /**\n * The file that will be uploaded.\n */\n file: File\n /**\n * The position where the image should be inserted. If not provided, the\n * image is inserted at the current selection.\n */\n pos?: number\n /**\n * If the image should replace the existing image at the given position. This\n * is only used if `pos` is provided.\n *\n * @default false\n */\n replace?: boolean\n /**\n * A handler to be called when an error occurs during the upload.\n */\n onError?: ImageUploadErrorHandler\n}\n\n/**\n * Options for the {@link ImageUploadErrorHandler} callback.\n *\n * @public\n */\nexport interface ImageUploadErrorHandlerOptions {\n /**\n * The file that was uploaded.\n */\n file: File\n /**\n * The error that occurred during the upload.\n */\n error: unknown\n /**\n * The upload task that was used to upload the file.\n */\n uploadTask: UploadTask<string>\n}\n\n/**\n * A handler to be called when an error occurs during the upload.\n *\n * @public\n */\nexport type ImageUploadErrorHandler = (options: ImageUploadErrorHandlerOptions) => void\n\n/**\n * Returns a command that uploads an image file and inserts an image node with a\n * temporary URL which is replaced once the upload completes.\n *\n * @param options\n *\n * @public\n */\nexport function uploadImage({\n uploader,\n file,\n pos,\n replace = false,\n onError,\n}: UploadImageOptions): Command {\n return (state, dispatch, view) => {\n const uploadTask = new UploadTask({ file, uploader })\n const objectURL = uploadTask.objectURL\n\n uploadTask.finished\n .then((resultURL) => {\n if (view && view.isDestroyed) {\n return\n } else if (typeof resultURL !== 'string') {\n const error = new ProseKitError(\n `Unexpected upload result. Expected a string but got ${typeof resultURL}`,\n )\n onError?.({ file, error, uploadTask })\n } else if (!view) {\n const error = new ProseKitError(\n 'View must be available to replace the image URL',\n )\n onError?.({ file, error, uploadTask })\n } else {\n replaceImageURL(view, objectURL, resultURL)\n UploadTask.delete(objectURL)\n }\n })\n .catch((error) => {\n onError?.({ file, error, uploadTask })\n })\n\n if (replace && pos != null) {\n if (replaceExistingImageURL(state, pos, objectURL, dispatch)) {\n return true\n }\n }\n\n const attrs: ImageAttrs = { src: objectURL }\n return insertNode({ type: 'image', attrs, pos })(state, dispatch, view)\n }\n}\n\nfunction replaceExistingImageURL(\n state: EditorState,\n pos: number,\n imageURL: string,\n dispatch?: (tr: Transaction) => void,\n): boolean {\n const node = state.doc.nodeAt(pos)\n if (!node || node.type.name !== 'image') {\n return false\n }\n const attrs = node.attrs as ImageAttrs\n if (attrs.src === imageURL) {\n return true\n }\n if (dispatch) {\n const tr = state.tr\n tr.setNodeAttribute(pos, 'src', imageURL)\n dispatch(tr)\n }\n return true\n}\n\n/**\n * Replaces the temporary image URL with the final uploaded URL.\n *\n * @internal\n */\nexport function replaceImageURL(\n view: EditorView,\n oldURL: string,\n newURL: string,\n): void {\n const positions: number[] = []\n view.state.doc.descendants((node, pos) => {\n if (node.type.name === 'image') {\n const attrs = node.attrs as ImageAttrs\n if (attrs.src === oldURL) {\n positions.push(pos)\n }\n }\n })\n\n if (positions.length === 0) {\n return\n }\n\n const tr = view.state.tr\n for (const pos of positions) {\n tr.setNodeAttribute(pos, 'src', newURL)\n }\n view.dispatch(tr)\n}\n","import { defineCommands, type Extension } from '@prosekit/core'\n\nimport { insertImage } from './image-commands/insert-image.ts'\nimport { uploadImage, type UploadImageOptions } from './image-commands/upload-image.ts'\nimport type { ImageAttrs } from './image-spec.ts'\n\n/**\n * @internal\n */\nexport type ImageCommandsExtension = Extension<{\n Commands: {\n insertImage: [attrs?: ImageAttrs]\n uploadImage: [options: UploadImageOptions]\n }\n}>\n\n/**\n * @internal\n */\nexport function defineImageCommands(): ImageCommandsExtension {\n return defineCommands({\n insertImage,\n uploadImage,\n })\n}\n","import { defineNodeSpec, type Extension } from '@prosekit/core'\n\n/**\n * @public\n */\nexport interface ImageAttrs {\n src?: string | null\n width?: number | null\n height?: number | null\n}\n\n/**\n * @internal\n */\nexport type ImageSpecExtension = Extension<{\n Nodes: {\n image: ImageAttrs\n }\n}>\n\n/**\n * @internal\n */\nexport function defineImageSpec(): ImageSpecExtension {\n return defineNodeSpec({\n name: 'image',\n attrs: {\n src: { default: null, validate: 'string|null' },\n width: { default: null, validate: 'number|null' },\n height: { default: null, validate: 'number|null' },\n },\n group: 'block',\n defining: true,\n draggable: true,\n parseDOM: [\n {\n tag: 'img[src]',\n getAttrs: (element): ImageAttrs => {\n if (typeof element === 'string') {\n return { src: null }\n }\n\n const src = element.getAttribute('src') || null\n\n let width: number | null = null\n let height: number | null = null\n\n const rect = element.getBoundingClientRect()\n if (rect.width > 0 && rect.height > 0) {\n width = rect.width\n height = rect.height\n } else if (\n element instanceof HTMLImageElement\n && element.naturalWidth > 0\n && element.naturalHeight > 0\n ) {\n width = element.naturalWidth\n height = element.naturalHeight\n }\n return { src, width, height }\n },\n },\n ],\n toDOM(node) {\n const attrs = node.attrs as ImageAttrs\n return ['img', attrs]\n },\n })\n}\n","import { union, type PlainExtension } from '@prosekit/core'\n\nimport {\n defineFileDropHandler,\n defineFilePasteHandler,\n type FileDropHandler,\n type FileDropHandlerOptions,\n type FilePasteHandler,\n type FilePasteHandlerOptions,\n type Uploader,\n} from '../file/index.ts'\n\nimport { uploadImage, type ImageUploadErrorHandler } from './image-commands/upload-image.ts'\n\n/**\n * A predicate to determine if the pasted file should be uploaded and inserted as an image.\n */\nexport type ImageCanPastePredicate = (options: FilePasteHandlerOptions) => boolean\n\n/**\n * A predicate to determine if the dropped file should be uploaded and inserted as an image.\n */\nexport type ImageCanDropPredicate = (options: FileDropHandlerOptions) => boolean\n\n/**\n * A handler to be called when an error occurs during the upload.\n */\nexport interface ImageUploadHandlerOptions {\n /**\n * The uploader used to upload the file. It should return a promise that\n * resolves to the URL of the uploaded image.\n */\n uploader: Uploader<string>\n /**\n * A predicate to determine if the pasted file should be uploaded and inserted as an image.\n * If not provided, it defaults to only allowing paste of files with a content type starting with `image/`.\n */\n canPaste?: ImageCanPastePredicate\n /**\n * A predicate to determine if the dropped file should be uploaded and inserted as an image.\n * If not provided, it defaults to only allowing drop of files with a content type starting with `image/`.\n */\n canDrop?: ImageCanDropPredicate\n /**\n * A handler to be called when an error occurs during the upload.\n * If not provided, it defaults to logging the error to the console.\n */\n onError?: ImageUploadErrorHandler\n}\n\nfunction defaultCanUpload({ file }: { file: File }): boolean {\n // Only handle image files by default\n return file.type.startsWith('image/')\n}\n\nconst defaultOnError: ImageUploadErrorHandler = ({ error }) => {\n console.error('[prosekit] Failed to upload image:', error)\n}\n\n/**\n * Returns an extension that handles image file uploads when pasting or dropping\n * images into the editor.\n *\n * @param options\n */\nexport function defineImageUploadHandler({\n uploader,\n canPaste = defaultCanUpload,\n canDrop = defaultCanUpload,\n onError = defaultOnError,\n}: ImageUploadHandlerOptions): PlainExtension {\n const handlePaste: FilePasteHandler = (options) => {\n if (!canPaste(options)) return false\n const { view, file } = options\n const command = uploadImage({ uploader, file, onError })\n return command(view.state, view.dispatch, view)\n }\n\n const handleDrop: FileDropHandler = (options) => {\n if (!canDrop(options)) return false\n const { view, file, pos } = options\n const command = uploadImage({ uploader, file, onError, pos })\n return command(view.state, view.dispatch, view)\n }\n\n return union(\n defineFilePasteHandler(handlePaste),\n defineFileDropHandler(handleDrop),\n )\n}\n","import { union, type Union } from '@prosekit/core'\n\nimport { defineImageCommands, type ImageCommandsExtension } from './image-commands.ts'\nimport { defineImageSpec, type ImageSpecExtension } from './image-spec.ts'\n\n/**\n * @internal\n */\nexport type ImageExtension = Union<[ImageSpecExtension, ImageCommandsExtension]>\n\n/**\n * @public\n */\nexport function defineImage(): ImageExtension {\n return union(defineImageSpec(), defineImageCommands())\n}\n"],"mappings":"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"}
|
|
@@ -15,6 +15,18 @@ type ItalicCommandsExtension = Extension<{
|
|
|
15
15
|
*/
|
|
16
16
|
declare function defineItalicCommands(): ItalicCommandsExtension;
|
|
17
17
|
//#endregion
|
|
18
|
+
//#region src/italic/italic-input-rule.d.ts
|
|
19
|
+
/**
|
|
20
|
+
* @internal
|
|
21
|
+
*/
|
|
22
|
+
declare function defineItalicInputRule(): PlainExtension;
|
|
23
|
+
//#endregion
|
|
24
|
+
//#region src/italic/italic-keymap.d.ts
|
|
25
|
+
/**
|
|
26
|
+
* @internal
|
|
27
|
+
*/
|
|
28
|
+
declare function defineItalicKeymap(): PlainExtension;
|
|
29
|
+
//#endregion
|
|
18
30
|
//#region src/italic/italic-spec.d.ts
|
|
19
31
|
/**
|
|
20
32
|
* @internal
|
|
@@ -39,17 +51,5 @@ type ItalicExtension = Union<[ItalicSpecExtension, ItalicCommandsExtension]>;
|
|
|
39
51
|
*/
|
|
40
52
|
declare function defineItalic(): ItalicExtension;
|
|
41
53
|
//#endregion
|
|
42
|
-
//#region src/italic/italic-input-rule.d.ts
|
|
43
|
-
/**
|
|
44
|
-
* @internal
|
|
45
|
-
*/
|
|
46
|
-
declare function defineItalicInputRule(): PlainExtension;
|
|
47
|
-
//#endregion
|
|
48
|
-
//#region src/italic/italic-keymap.d.ts
|
|
49
|
-
/**
|
|
50
|
-
* @internal
|
|
51
|
-
*/
|
|
52
|
-
declare function defineItalicKeymap(): PlainExtension;
|
|
53
|
-
//#endregion
|
|
54
54
|
export { type ItalicCommandsExtension, type ItalicExtension, type ItalicSpecExtension, defineItalic, defineItalicCommands, defineItalicInputRule, defineItalicKeymap, defineItalicSpec };
|
|
55
55
|
//# sourceMappingURL=prosekit-extensions-italic.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"prosekit-extensions-italic.d.ts","names":[],"sources":["../src/italic/italic-commands.ts","../src/italic/italic-
|
|
1
|
+
{"version":3,"file":"prosekit-extensions-italic.d.ts","names":[],"sources":["../src/italic/italic-commands.ts","../src/italic/italic-input-rule.ts","../src/italic/italic-keymap.ts","../src/italic/italic-spec.ts","../src/italic/italic.ts"],"mappings":";;;;;;;KAKY,uBAAA,GAA0B,SAAA;EACpC,QAAA;IACE,YAAA;EAAA;AAAA;;;;iBAOY,oBAAA,CAAA,GAAwB,uBAAA;;;;;;iBCPxB,qBAAA,CAAA,GAAyB,cAAA;;;;;;iBCFzB,kBAAA,CAAA,GAAsB,cAAA;;;;;AFAtC;KGCY,mBAAA,GAAsB,SAAA;EAChC,KAAA;IACE,MAAA,EAAQ,KAAA;EAAA;AAAA;;;;iBAOI,gBAAA,CAAA,GAAoB,mBAAA;;;;AHVpC;;KIKY,eAAA,GAAkB,KAAA,EAC3B,mBAAA,EAAqB,uBAAA;;;;iBAMR,YAAA,CAAA,GAAgB,eAAA"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"prosekit-extensions-italic.js","names":[],"sources":["../src/italic/italic-commands.ts","../src/italic/italic-input-rule.ts","../src/italic/italic-keymap.ts","../src/italic/italic-spec.ts","../src/italic/italic.ts"],"sourcesContent":["import { defineCommands, toggleMark, type Extension } from '@prosekit/core'\n\n/**\n * @internal\n */\nexport type ItalicCommandsExtension = Extension<{\n Commands: {\n toggleItalic: []\n }\n}>\n\n/**\n * @internal\n */\nexport function defineItalicCommands(): ItalicCommandsExtension {\n return defineCommands({\n toggleItalic: () => toggleMark({ type: 'italic' }),\n })\n}\n","import { canUseRegexLookbehind, type PlainExtension } from '@prosekit/core'\n\nimport { defineMarkInputRule } from '../input-rule'\n\n/**\n * @internal\n */\nexport function defineItalicInputRule(): PlainExtension {\n return defineMarkInputRule({\n regex: canUseRegexLookbehind()\n ? /(?<=\\s|^)\\*([^\\s*]|[^\\s*][^*]*[^\\s*])\\*$/\n : /\\*([^\\s*]|[^\\s*][^*]*[^\\s*])\\*$/,\n type: 'italic',\n })\n}\n","import { defineKeymap, toggleMark, type PlainExtension } from '@prosekit/core'\n\n/**\n * @internal\n */\nexport function defineItalicKeymap(): PlainExtension {\n return defineKeymap({\n 'Mod-i': toggleMark({ type: 'italic' }),\n })\n}\n","import { defineMarkSpec, type Extension } from '@prosekit/core'\nimport type { Attrs } from '@prosekit/pm/model'\n\n/**\n * @internal\n */\nexport type ItalicSpecExtension = Extension<{\n Marks: {\n italic: Attrs\n }\n}>\n\n/**\n * @internal\n */\nexport function defineItalicSpec(): ItalicSpecExtension {\n return defineMarkSpec({\n name: 'italic',\n parseDOM: [\n { tag: 'i' },\n { tag: 'em' },\n { style: 'font-style=italic' },\n {\n style: 'font-style=normal',\n clearMark: (m) => m.type.name === 'italic',\n },\n ],\n toDOM() {\n return ['em', 0]\n },\n })\n}\n","import { union, type Union } from '@prosekit/core'\n\nimport { defineItalicCommands, type ItalicCommandsExtension } from './italic-commands'\nimport { defineItalicInputRule } from './italic-input-rule'\nimport { defineItalicKeymap } from './italic-keymap'\nimport { defineItalicSpec, type ItalicSpecExtension } from './italic-spec'\n\n/**\n * @internal\n */\nexport type ItalicExtension = Union<\n [ItalicSpecExtension, ItalicCommandsExtension]\n>\n\n/**\n * @public\n */\nexport function defineItalic(): ItalicExtension {\n return union(\n defineItalicSpec(),\n defineItalicCommands(),\n defineItalicKeymap(),\n defineItalicInputRule(),\n )\n}\n"],"mappings":";;;;;;;AAcA,SAAgB,uBAAgD;AAC9D,QAAO,eAAe,EACpB,oBAAoB,WAAW,EAAE,MAAM,UAAU,CAAC,EACnD,CAAC;;;;;;;;ACVJ,SAAgB,wBAAwC;AACtD,QAAO,oBAAoB;EACzB,OAAO,uBAAuB,GAC1B,6CACA;EACJ,MAAM;EACP,CAAC;;;;;;;;ACRJ,SAAgB,qBAAqC;AACnD,QAAO,aAAa,EAClB,SAAS,WAAW,EAAE,MAAM,UAAU,CAAC,EACxC,CAAC;;;;;;;;ACOJ,SAAgB,mBAAwC;AACtD,QAAO,eAAe;EACpB,MAAM;EACN,UAAU;GACR,EAAE,KAAK,KAAK;GACZ,EAAE,KAAK,MAAM;GACb,EAAE,OAAO,qBAAqB;GAC9B;IACE,OAAO;IACP,YAAY,MAAM,EAAE,KAAK,SAAS;IACnC;GACF;EACD,QAAQ;AACN,UAAO,CAAC,MAAM,EAAE;;EAEnB,CAAC;;;;;;;;ACbJ,SAAgB,eAAgC;AAC9C,QAAO,MACL,kBAAkB,EAClB,sBAAsB,EACtB,oBAAoB,EACpB,uBAAuB,CACxB"}
|
|
1
|
+
{"version":3,"file":"prosekit-extensions-italic.js","names":[],"sources":["../src/italic/italic-commands.ts","../src/italic/italic-input-rule.ts","../src/italic/italic-keymap.ts","../src/italic/italic-spec.ts","../src/italic/italic.ts"],"sourcesContent":["import { defineCommands, toggleMark, type Extension } from '@prosekit/core'\n\n/**\n * @internal\n */\nexport type ItalicCommandsExtension = Extension<{\n Commands: {\n toggleItalic: []\n }\n}>\n\n/**\n * @internal\n */\nexport function defineItalicCommands(): ItalicCommandsExtension {\n return defineCommands({\n toggleItalic: () => toggleMark({ type: 'italic' }),\n })\n}\n","import { canUseRegexLookbehind, type PlainExtension } from '@prosekit/core'\n\nimport { defineMarkInputRule } from '../input-rule/index.ts'\n\n/**\n * @internal\n */\nexport function defineItalicInputRule(): PlainExtension {\n return defineMarkInputRule({\n regex: canUseRegexLookbehind()\n ? /(?<=\\s|^)\\*([^\\s*]|[^\\s*][^*]*[^\\s*])\\*$/\n : /\\*([^\\s*]|[^\\s*][^*]*[^\\s*])\\*$/,\n type: 'italic',\n })\n}\n","import { defineKeymap, toggleMark, type PlainExtension } from '@prosekit/core'\n\n/**\n * @internal\n */\nexport function defineItalicKeymap(): PlainExtension {\n return defineKeymap({\n 'Mod-i': toggleMark({ type: 'italic' }),\n })\n}\n","import { defineMarkSpec, type Extension } from '@prosekit/core'\nimport type { Attrs } from '@prosekit/pm/model'\n\n/**\n * @internal\n */\nexport type ItalicSpecExtension = Extension<{\n Marks: {\n italic: Attrs\n }\n}>\n\n/**\n * @internal\n */\nexport function defineItalicSpec(): ItalicSpecExtension {\n return defineMarkSpec({\n name: 'italic',\n parseDOM: [\n { tag: 'i' },\n { tag: 'em' },\n { style: 'font-style=italic' },\n {\n style: 'font-style=normal',\n clearMark: (m) => m.type.name === 'italic',\n },\n ],\n toDOM() {\n return ['em', 0]\n },\n })\n}\n","import { union, type Union } from '@prosekit/core'\n\nimport { defineItalicCommands, type ItalicCommandsExtension } from './italic-commands.ts'\nimport { defineItalicInputRule } from './italic-input-rule.ts'\nimport { defineItalicKeymap } from './italic-keymap.ts'\nimport { defineItalicSpec, type ItalicSpecExtension } from './italic-spec.ts'\n\n/**\n * @internal\n */\nexport type ItalicExtension = Union<\n [ItalicSpecExtension, ItalicCommandsExtension]\n>\n\n/**\n * @public\n */\nexport function defineItalic(): ItalicExtension {\n return union(\n defineItalicSpec(),\n defineItalicCommands(),\n defineItalicKeymap(),\n defineItalicInputRule(),\n )\n}\n"],"mappings":";;;;;;;AAcA,SAAgB,uBAAgD;AAC9D,QAAO,eAAe,EACpB,oBAAoB,WAAW,EAAE,MAAM,UAAU,CAAC,EACnD,CAAC;;;;;;;;ACVJ,SAAgB,wBAAwC;AACtD,QAAO,oBAAoB;EACzB,OAAO,uBAAuB,GAC1B,6CACA;EACJ,MAAM;EACP,CAAC;;;;;;;;ACRJ,SAAgB,qBAAqC;AACnD,QAAO,aAAa,EAClB,SAAS,WAAW,EAAE,MAAM,UAAU,CAAC,EACxC,CAAC;;;;;;;;ACOJ,SAAgB,mBAAwC;AACtD,QAAO,eAAe;EACpB,MAAM;EACN,UAAU;GACR,EAAE,KAAK,KAAK;GACZ,EAAE,KAAK,MAAM;GACb,EAAE,OAAO,qBAAqB;GAC9B;IACE,OAAO;IACP,YAAY,MAAM,EAAE,KAAK,SAAS;IACnC;GACF;EACD,QAAQ;AACN,UAAO,CAAC,MAAM,EAAE;;EAEnB,CAAC;;;;;;;;ACbJ,SAAgB,eAAgC;AAC9C,QAAO,MACL,kBAAkB,EAClB,sBAAsB,EACtB,oBAAoB,EACpB,uBAAuB,CACxB"}
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { defineInputRule } from "./prosekit-extensions-input-rule.js";
|
|
2
2
|
import { defineEnterRule } from "./prosekit-extensions-enter-rule.js";
|
|
3
|
-
import { t as defineMarkRule } from "./mark-rule-
|
|
4
|
-
import { t as defineMarkPasteRule } from "./mark-paste-rule
|
|
3
|
+
import { t as defineMarkRule } from "./mark-rule-Bqdm49Eq.js";
|
|
4
|
+
import { t as defineMarkPasteRule } from "./mark-paste-rule--F1QPUcU.js";
|
|
5
5
|
import { addMark, defineCommands, defineMarkSpec, expandMark, removeMark, toggleMark, union } from "@prosekit/core";
|
|
6
6
|
import { InputRule } from "@prosekit/pm/inputrules";
|
|
7
7
|
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"prosekit-extensions-link.js","names":[],"sources":["../src/link/link-regex.ts","../src/link/link-paste-rule.ts","../src/link/index.ts"],"sourcesContent":["/* eslint-disable unicorn/prefer-string-raw -- Don't use String.raw here for better bundler minification */\n\n// All valid alpha TLDs.\n// Data source: https://data.iana.org/TLD/tlds-alpha-by-domain.txt\nconst TLD_RE_PATTERN =\n 'a(?:a(?:a|rp)|b(?:arth|b(?:ott|vie)?|c|le|ogado|udhabi)|c(?:ademy|c(?:enture|ountants?)|o|tor)?|d(?:s|ult)?|e(?:g|ro|tna)?|f(?:l|rica)?|g(?:akhan|ency)?|i(?:g|r(?:bus|force|tel))?|kdn|l(?:faromeo|i(?:baba|pay)|l(?:finanz|state|y)|s(?:ace|tom))?|m(?:azon|e(?:rican(?:express|family)|x)|fam|ica|sterdam)?|n(?:alytics|droid|quan|z)|ol?|p(?:artments|p(?:le)?)|q(?:uarelle)?|r(?:a(?:b|mco)|chi|my|pa|te?)?|s(?:da|ia|sociates)?|t(?:hleta|torney)?|u(?:ction|di(?:ble|o)?|spost|t(?:hor|os?))?|vianca|ws?|xa?|z(?:ure)?)|b(?:a(?:by|idu|n(?:a(?:mex|narepublic)|d|k)|r(?:c(?:elona|lay(?:card|s))|efoot|gains)?|s(?:eball|ketball)|uhaus|yern)?|b(?:c|t|va)?|c[gn]|d|e(?:a(?:ts|uty)|er|ntley|rlin|st(?:buy)?|t)?|f|g|h(?:arti)?|i(?:ble|d|ke|ngo?|o|z)?|j|l(?:ack(?:friday)?|o(?:ckbuster|g|omberg)|ue)|m[sw]?|n(?:pparibas)?|o(?:ats|ehringer|fa|m|nd|o(?:k(?:ing)?)?|s(?:ch|t(?:ik|on))|t|utique|x)?|r(?:adesco|idgestone|o(?:adway|ker|ther)|ussels)?|s|t|u(?:ild(?:ers)?|siness|y|zz)|v|w|y|zh?)|c(?:a(?:b|fe|l(?:l|vinklein)?|m(?:era|p)?|non|p(?:etown|ital(?:one)?)|r(?:avan|ds|e(?:ers?)?|s)?|s(?:a|e|h|ino)|t(?:ering|holic)?)?|b(?:a|n|re|s)|c|d|e(?:nter|o|rn)|f[ad]?|g|h(?:a(?:n(?:el|nel)|rity|se|t)|eap|intai|r(?:istmas|ome)|urch)?|i(?:priani|rcle|sco|t(?:adel|ic?|y(?:eats)?))?|k|l(?:aims|eaning|i(?:ck|ni(?:c|que))|o(?:thing|ud)|ub(?:med)?)?|m|n|o(?:ach|des|ffee|l(?:lege|ogne)|m(?:cast|m(?:bank|unity)|p(?:a(?:ny|re)|uter)|sec)?|n(?:dos|s(?:truction|ulting)|t(?:act|ractors))|o(?:king(?:channel)?|l|p)|rsica|u(?:ntry|pons?|rses))?|pa|r(?:edit(?:card|union)?|icket|own|s|uises?)?|u(?:isinella)?|v|w|x|y(?:mru|ou)?|z)|d(?:a(?:bur|d|nce|t(?:a|e|ing|sun)|y)|clk|ds|e(?:al(?:er|s)?|gree|l(?:ivery|l|oitte|ta)|mocrat|nt(?:al|ist)|si(?:gn)?|v)?|hl|i(?:amonds|et|gital|rect(?:ory)?|s(?:co(?:unt|ver)|h)|y)|j|k|m|np|o(?:c(?:s|tor)|g|mains|t|wnload)?|rive|tv|u(?:bai|nlop|pont|rban)|v(?:ag|r)|z)|e(?:a(?:rth|t)|co?|d(?:eka|u(?:cation)?)|e|g|m(?:ail|erck)|n(?:ergy|gineer(?:ing)?|terprises)|pson|quipment|r(?:icsson|ni)?|s(?:q|tate)?|t(?:isalat)?|u(?:rovision|s)?|vents|x(?:change|p(?:ert|osed|ress)|traspace))|f(?:a(?:ge|i(?:l|rwinds|th)|mily|ns?|rm(?:ers)?|s(?:hion|t))|e(?:dex|edback|rr(?:ari|ero))|i(?:at|d(?:elity|o)|lm|na(?:l|nc(?:e|ial))|r(?:e(?:stone)?|mdale)|sh(?:ing)?|t(?:ness)?)?|j|k|l(?:i(?:ckr|ghts|r)|o(?:rist|wers)|y)|m|o(?:o(?:d(?:network)?|tball)?|r(?:d|ex|sale|um)|undation|x)?|r(?:e(?:e|senius)|l|o(?:gans|nt(?:door|ier)))?|tr|u(?:jitsu|nd?|rniture|tbol)|yi)|g(?:a(?:l(?:l(?:ery|o|up))?|mes?|p|rden|y)?|b(?:iz)?|dn?|e(?:a|nt(?:ing)?|orge)?|f|g(?:ee)?|h|i(?:fts?|v(?:es|ing))?|l(?:ass|e|ob(?:al|o))?|m(?:ail|bh|o|x)?|n|o(?:daddy|l(?:d(?:point)?|f)|o(?:dyear|g(?:le)?)?|p|t|v)|p|q|r(?:a(?:inger|phics|tis)|een|ipe|o(?:cery|up))?|s|t|u(?:ardian|cci|ge|i(?:de|tars)|ru)?|w|y)|h(?:a(?:ir|mburg|ngout|us)|bo|dfc(?:bank)?|e(?:alth(?:care)?|l(?:p|sinki)|r(?:e|mes))|gtv|i(?:phop|samitsu|tachi|v)|kt?|m|n|o(?:ckey|l(?:dings|iday)|me(?:depot|goods|s(?:ense)?)|nda|rse|s(?:pital|t(?:ing)?)|t(?:el(?:es|s)|mail)?|use|w)|r|sbc|t|u(?:ghes)?|y(?:att|undai))|i(?:bm|c(?:bc|e|u)|d|e(?:ee)?|fm|kano|l|m(?:amat|db|mo(?:bilien)?)?|n(?:c|dustries|f(?:initi|o)|g|k|s(?:titute|ur(?:ance|e))|t(?:ernational|uit)?|vestments)?|o|piranga|q|r(?:ish)?|s(?:maili|t(?:anbul)?)?|t(?:au|v)?)|j(?:a(?:guar|va)|cb|e(?:ep|tzt|welry)?|io|ll|mp?|nj|o(?:b(?:s|urg)|t|y)?|p(?:morgan|rs)?|u(?:egos|niper))|k(?:aufen|ddi|e(?:rry(?:hotels|logistics|properties))?|fh|g|h|i(?:a|ds|m|nd(?:er|le)|tchen|wi)?|m|n|o(?:eln|matsu|sher)|p(?:mg|n)?|r(?:d|ed)?|uokgroup|w|y(?:oto)?|z)|l(?:a(?:caixa|m(?:borghini|er)|n(?:c(?:aster|ia)|d(?:rover)?|xess)|salle|t(?:ino|robe)?|w(?:yer)?)?|b|c|ds|e(?:ase|clerc|frak|g(?:al|o)|xus)|gbt|i(?:dl|fe(?:insurance|style)?|ghting|ke|lly|m(?:ited|o)|n(?:coln|de|k)|psy|v(?:e|ing))?|k|l[cp]|o(?:ans?|c(?:ker|us)|l|ndon|tt[eo]|ve)|pl(?:financial)?|r|s|t(?:da?)?|u(?:ndbeck|x(?:e|ury))?|v|y)|m(?:a(?:cys|drid|i(?:f|son)|keup|n(?:agement|go)?|p|r(?:ket(?:ing|s)?|riott|shalls)|serati|ttel)?|ba|c(?:kinsey)?|d|e(?:d(?:ia)?|et|lbourne|m(?:e|orial)|nu?|rckmsd)?|g|h|i(?:ami|crosoft|l|n[it]|t(?:subishi)?)|k|l[bs]?|ma?|n|o(?:bi(?:le)?|da|e|i|m|n(?:ash|ey|ster)|r(?:mon|tgage)|scow|to(?:rcycles)?|v(?:ie)?)?|p|q|r|sd?|t[nr]?|u(?:s(?:eum|ic)|tual)?|v|w|x|y|z)|n(?:a(?:b|goya|me|tura|vy)?|ba|c|e(?:c|t(?:bank|flix|work)?|ustar|ws?|x(?:t(?:direct)?|us))?|fl?|go?|hk|i(?:co|k(?:e|on)|nja|ssa[ny])?|l|o(?:kia|rt(?:hwesternmutual|on)|w(?:ruz|tv)?)?|p|r[aw]?|tt|u|yc|z)|o(?:b(?:i|server)|ffice|kinawa|l(?:ayan(?:group)?|dnavy|lo)|m(?:ega)?|n(?:e|g|l(?:ine)?)|oo|pen|r(?:a(?:cle|nge)|g(?:anic)?|igins)|saka|t(?:suka|t)|vh)|p(?:a(?:ge|nasonic|r(?:is|s|t(?:ners|s|y))|ssagens|y)?|ccw|et?|f(?:izer)?|g|h(?:armacy|d|ilips|o(?:ne|to(?:graphy|s)?)|ysio)?|i(?:c(?:s|t(?:et|ures))|d|n[gk]?|oneer|zza)|k|l(?:a(?:ce|y(?:station)?)|u(?:mbing|s))?|m|nc?|o(?:hl|ker|litie|rn|st)|r(?:a(?:merica|xi)|ess|ime|o(?:d(?:uctions)?|f|gressive|mo|pert(?:ies|y)|tection)?|u(?:dential)?)?|s|t|ub|wc?|y)|q(?:a|pon|ue(?:bec|st))|r(?:a(?:cing|dio)|e(?:a(?:d|l(?:estate|t(?:or|y)))|cipes|d(?:stone|umbrella)?|hab|i(?:sen?|t)|liance|n(?:t(?:als)?)?|p(?:air|ort|ublican)|st(?:aurant)?|views?|xroth)?|i(?:c(?:h(?:ardli)?|oh)|l|o|p)|o(?:c(?:her|ks)|deo|gers|om)?|s(?:vp)?|u(?:gby|hr|n)?|we?|yukyu)|s(?:a(?:arland|fe(?:ty)?|kura|l(?:e|on)|ms(?:club|ung)|n(?:dvik(?:coromant)?|ofi)|p|rl|s|ve|xo)?|b[is]?|c(?:a|b|h(?:aeffler|midt|o(?:larships|ol)|ule|warz)|ience|ot)?|d|e(?:a(?:rch|t)|cur(?:e|ity)|ek|lect|ner|rvices|ven|w|xy?)?|fr|g|h(?:a(?:ngrila|rp|w)|ell|i(?:a|ksha)|o(?:es|p(?:ping)?|uji|w(?:time)?))?|i(?:lk|n(?:a|gles)|te)?|j|k(?:in?|y(?:pe)?)?|l(?:ing)?|m(?:art|ile)?|n(?:cf)?|o(?:c(?:cer|ial)|ft(?:bank|ware)|hu|l(?:ar|utions)|n[gy]|y)?|p(?:a(?:ce)?|o(?:rt|t))|rl?|s|t(?:a(?:da|ples|r|te(?:bank|farm))|c(?:group)?|o(?:ckholm|r(?:age|e))|ream|ud(?:io|y)|yle)?|u(?:cks|pp(?:l(?:ies|y)|ort)|r(?:f|gery)|zuki)?|v|w(?:atch|iss)|x|y(?:dney|stems)?|z)|t(?:a(?:b|ipei|lk|obao|rget|t(?:a(?:motors|r)|too)|xi?)|ci?|dk?|e(?:am|ch(?:nology)?|l|masek|nnis|va)|f|g|h(?:d|eat(?:er|re))?|i(?:aa|ckets|enda|ffany|ps|r(?:es|ol))|j(?:maxx|x)?|k(?:maxx)?|l|m(?:all)?|n|o(?:day|kyo|ols|p|ray|shiba|tal|urs|wn|y(?:ota|s))?|r(?:a(?:d(?:e|ing)|ining|vel(?:channel|ers(?:insurance)?)?)|ust|v)?|t|u(?:be|i|nes|shu)|vs?|w|z)|u(?:a|b(?:ank|s)|g|k|n(?:i(?:com|versity)|o)|ol|ps|s|y|z)|v(?:a(?:cations|n(?:a|guard))?|c|e(?:gas|ntures|r(?:isign|sicherung)|t)?|g|i(?:ajes|deo|g|king|llas|n|p|rgin|s(?:a|ion)|v[ao])?|laanderen|n|o(?:dka|l(?:kswagen|vo)|t(?:e|ing|o)|yage)|u(?:elos)?)|w(?:a(?:l(?:es|mart|ter)|ng(?:gou)?|tch(?:es)?)|e(?:ather(?:channel)?|b(?:cam|er|site)|d(?:ding)?|i(?:bo|r))|f|hoswho|i(?:en|ki|lliamhill|n(?:dows|e|ners)?)|me|o(?:lterskluwer|odside|r(?:ks?|ld)|w)|s|t[cf])|x(?:box|erox|finity|i(?:huan|n)|xx|yz)|y(?:a(?:chts|hoo|maxun|ndex)|e|o(?:dobashi|ga|kohama|u(?:tube)?)|t|un)|z(?:a(?:ppos|ra)?|ero|ip|m|one|uerich|w)'\n\n// Some common punctuations that can be used to stop a link\nconst PUNCTUATION_CHAR_PATTERN = '\\\\.\\\\,\\\\;\\\\!\\\\?'\n\nconst STOP_CHAR_PATTERN = '[' + PUNCTUATION_CHAR_PATTERN + ']'\n\nconst END_CHAR_PATTERN = '[^' + '\\\\s' + PUNCTUATION_CHAR_PATTERN + ']'\n\n// dprint-ignore\nconst LINK_RE_BASE_PATTERN = (\n // start of the link group\n '(' + \n '(?:' +\n // protocol identifier (optional)\n // short syntax // is allowed\n '(?:(?:https?:)?\\\\/\\\\/)?' +\n\n // host & domain names.\n '(?:' +\n '(?:' +\n '[a-z0-9\\\\u00a1-\\\\uffff]' +\n '[a-z0-9\\\\u00a1-\\\\uffff_-]{0,62}' +\n ')?' +\n '[a-z0-9\\\\u00a1-\\\\uffff]\\\\.' +\n ')+' +\n\n // TLD identifier name, must not end with dot\n '(?:' +\n TLD_RE_PATTERN +\n ')' +\n ')' +\n\n // port number (optional)\n '(?::\\\\d{2,5})?' +\n\n // sub path (optional)\n '(?:/' +\n '(?:' + \n '\\\\S*' +\n END_CHAR_PATTERN +\n ')?' +\n ')?' +\n\n // query string (optional)\n '(?:\\\\?' + \n '(?:' + \n '\\\\S*' +\n END_CHAR_PATTERN +\n ')' +\n ')?' +\n\n // fragment (optional)\n '(?:\\\\#' + \n '(?:' + \n '\\\\S*' +\n END_CHAR_PATTERN +\n ')?' +\n ')?' +\n\n // end of the link group\n ')'\n)\n\n// dprint-ignore\nconst LINK_ENTER_PATTERN = LINK_RE_BASE_PATTERN + STOP_CHAR_PATTERN + '?' + '$'\n// dprint-ignore\nconst LINK_INPUT_PATTERN = LINK_RE_BASE_PATTERN + STOP_CHAR_PATTERN + '?' + '\\\\s$'\n// dprint-ignore\nconst LINK_MARK_PATTERN = LINK_RE_BASE_PATTERN + '(?=' + STOP_CHAR_PATTERN + '|\\\\s|$)'\n\nexport const LINK_ENTER_RE: RegExp = new RegExp(LINK_ENTER_PATTERN, 'gi')\nexport const LINK_INPUT_RE: RegExp = new RegExp(LINK_INPUT_PATTERN, 'gi')\nexport const LINK_MARK_RE: RegExp = new RegExp(LINK_MARK_PATTERN, 'gi')\n","import type { PlainExtension } from '@prosekit/core'\n\nimport { defineMarkPasteRule } from '../paste-rule'\n\nimport { LINK_MARK_RE } from './link-regex'\nimport type { LinkAttrs } from './link-types'\n\n/**\n * @internal\n */\nexport function defineLinkPasteRule(): PlainExtension {\n return defineMarkPasteRule({\n type: 'link',\n regex: LINK_MARK_RE,\n getAttrs: (match: RegExpExecArray): LinkAttrs | false => {\n if (match[1]) {\n return { href: match[1] } satisfies LinkAttrs\n }\n return false\n },\n })\n}\n","import {\n addMark,\n defineCommands,\n defineMarkSpec,\n expandMark,\n removeMark,\n toggleMark,\n union,\n type Extension,\n type PlainExtension,\n type Union,\n} from '@prosekit/core'\nimport { InputRule } from '@prosekit/pm/inputrules'\n\nimport { defineEnterRule } from '../enter-rule'\nimport { defineInputRule } from '../input-rule'\nimport { defineMarkRule } from '../mark-rule'\n\nimport { defineLinkPasteRule } from './link-paste-rule'\nimport { LINK_ENTER_RE, LINK_INPUT_RE, LINK_MARK_RE } from './link-regex'\nimport type { LinkAttrs } from './link-types'\n\nexport { defineLinkPasteRule }\nexport type { LinkAttrs }\n\n/**\n * @internal\n */\nexport type LinkSpecExtension = Extension<{\n Marks: {\n link: LinkAttrs\n }\n}>\n\n/**\n * @internal\n */\nexport function defineLinkSpec(): LinkSpecExtension {\n return defineMarkSpec<'link', LinkAttrs>({\n name: 'link',\n inclusive: false,\n attrs: {\n href: { validate: 'string' },\n target: { default: null, validate: 'string|null' },\n rel: { default: null, validate: 'string|null' },\n },\n parseDOM: [\n {\n tag: 'a[href]',\n getAttrs: (dom: HTMLElement) => {\n return {\n href: dom.getAttribute('href') || '',\n target: dom.getAttribute('target') || null,\n rel: dom.getAttribute('rel') || null,\n }\n },\n },\n ],\n toDOM(node) {\n const { href, target, rel } = node.attrs as LinkAttrs\n return ['a', { href, target, rel }, 0]\n },\n })\n}\n\n/**\n * @internal\n */\nexport type LinkCommandsExtension = Extension<{\n Commands: {\n addLink: [attrs: LinkAttrs]\n removeLink: []\n toggleLink: [attrs: LinkAttrs]\n expandLink: []\n }\n}>\n\nexport function defineLinkCommands(): LinkCommandsExtension {\n return defineCommands({\n addLink: (attrs: LinkAttrs) => addMark({ type: 'link', attrs }),\n removeLink: () => removeMark({ type: 'link' }),\n toggleLink: (attrs: LinkAttrs) => toggleMark({ type: 'link', attrs }),\n expandLink: () => expandMark({ type: 'link' }),\n })\n}\n\n/**\n * Apply link marks after pressing Space.\n *\n * @internal\n */\nexport function defineLinkInputRule(): PlainExtension {\n return defineInputRule(\n new InputRule(LINK_INPUT_RE, (state, match, from) => {\n const href = match[1]\n if (!href) return null\n\n const mark = state.schema.marks.link.create({ href })\n return state.tr.addMark(from, from + href.length, mark).insertText(' ')\n }),\n )\n}\n\n/**\n * Apply link marks after typing Enter.\n *\n * @internal\n */\nexport function defineLinkEnterRule(): PlainExtension {\n return defineEnterRule({\n regex: LINK_ENTER_RE,\n handler: ({ state, from, match }) => {\n const href = match[1]\n if (!href) return null\n\n const mark = state.schema.marks.link.create({ href })\n const tr = state.tr.addMark(from, from + href.length, mark)\n return tr.docChanged ? tr : null\n },\n })\n}\n\n/**\n * Apply and remove link marks to the text during typing.\n *\n * @internal\n */\nexport function defineLinkMarkRule(): PlainExtension {\n return defineMarkRule({\n regex: LINK_MARK_RE,\n type: 'link',\n attrs: (match) => ({ href: match[1] }),\n })\n}\n\n/**\n * @internal\n */\nexport type LinkExtension = Union<[LinkSpecExtension, LinkCommandsExtension]>\n\n/**\n * @public\n */\nexport function defineLink(): LinkExtension {\n return union(\n defineLinkSpec(),\n defineLinkCommands(),\n defineLinkInputRule(),\n defineLinkEnterRule(),\n defineLinkPasteRule(),\n )\n}\n"],"mappings":";;;;;;;;AAIA,MAAM,iBACJ;AAGF,MAAM,2BAA2B;AAEjC,MAAM,oBAAoB,MAAM,2BAA2B;AAElC,KAAe;AAGxC,MAAM,uBAEF,6HAiBY,iBACJ;AAmCZ,MAAM,qBAAqB,uBAAuB,oBAAoB;AAEtE,MAAM,qBAAqB,uBAAuB,oBAAoB;AAEtE,MAAM,oBAAoB,uBAAuB;AAEjD,MAAa,gBAAwB,IAAI,OAAO,oBAAoB,KAAK;AACzE,MAAa,gBAAwB,IAAI,OAAO,oBAAoB,KAAK;AACzE,MAAa,eAAuB,IAAI,OAAO,mBAAmB,KAAK;;;;;;;ACpEvE,SAAgB,sBAAsC;AACpD,QAAO,oBAAoB;EACzB,MAAM;EACN,OAAO;EACP,WAAW,UAA8C;AACvD,OAAI,MAAM,GACR,QAAO,EAAE,MAAM,MAAM,IAAI;AAE3B,UAAO;;EAEV,CAAC;;;;;;;;ACiBJ,SAAgB,iBAAoC;AAClD,QAAO,eAAkC;EACvC,MAAM;EACN,WAAW;EACX,OAAO;GACL,MAAM,EAAE,UAAU,UAAU;GAC5B,QAAQ;IAAE,SAAS;IAAM,UAAU;IAAe;GAClD,KAAK;IAAE,SAAS;IAAM,UAAU;IAAe;GAChD;EACD,UAAU,CACR;GACE,KAAK;GACL,WAAW,QAAqB;AAC9B,WAAO;KACL,MAAM,IAAI,aAAa,OAAO,IAAI;KAClC,QAAQ,IAAI,aAAa,SAAS,IAAI;KACtC,KAAK,IAAI,aAAa,MAAM,IAAI;KACjC;;GAEJ,CACF;EACD,MAAM,MAAM;GACV,MAAM,EAAE,MAAM,QAAQ,QAAQ,KAAK;AACnC,UAAO;IAAC;IAAK;KAAE;KAAM;KAAQ;KAAK;IAAE;IAAE;;EAEzC,CAAC;;AAeJ,SAAgB,qBAA4C;AAC1D,QAAO,eAAe;EACpB,UAAU,UAAqB,QAAQ;GAAE,MAAM;GAAQ;GAAO,CAAC;EAC/D,kBAAkB,WAAW,EAAE,MAAM,QAAQ,CAAC;EAC9C,aAAa,UAAqB,WAAW;GAAE,MAAM;GAAQ;GAAO,CAAC;EACrE,kBAAkB,WAAW,EAAE,MAAM,QAAQ,CAAC;EAC/C,CAAC;;;;;;;AAQJ,SAAgB,sBAAsC;AACpD,QAAO,gBACL,IAAI,UAAU,gBAAgB,OAAO,OAAO,SAAS;EACnD,MAAM,OAAO,MAAM;AACnB,MAAI,CAAC,KAAM,QAAO;EAElB,MAAM,OAAO,MAAM,OAAO,MAAM,KAAK,OAAO,EAAE,MAAM,CAAC;AACrD,SAAO,MAAM,GAAG,QAAQ,MAAM,OAAO,KAAK,QAAQ,KAAK,CAAC,WAAW,IAAI;GACvE,CACH;;;;;;;AAQH,SAAgB,sBAAsC;AACpD,QAAO,gBAAgB;EACrB,OAAO;EACP,UAAU,EAAE,OAAO,MAAM,YAAY;GACnC,MAAM,OAAO,MAAM;AACnB,OAAI,CAAC,KAAM,QAAO;GAElB,MAAM,OAAO,MAAM,OAAO,MAAM,KAAK,OAAO,EAAE,MAAM,CAAC;GACrD,MAAM,KAAK,MAAM,GAAG,QAAQ,MAAM,OAAO,KAAK,QAAQ,KAAK;AAC3D,UAAO,GAAG,aAAa,KAAK;;EAE/B,CAAC;;;;;;;AAQJ,SAAgB,qBAAqC;AACnD,QAAO,eAAe;EACpB,OAAO;EACP,MAAM;EACN,QAAQ,WAAW,EAAE,MAAM,MAAM,IAAI;EACtC,CAAC;;;;;AAWJ,SAAgB,aAA4B;AAC1C,QAAO,MACL,gBAAgB,EAChB,oBAAoB,EACpB,qBAAqB,EACrB,qBAAqB,EACrB,qBAAqB,CACtB"}
|
|
1
|
+
{"version":3,"file":"prosekit-extensions-link.js","names":[],"sources":["../src/link/link-regex.ts","../src/link/link-paste-rule.ts","../src/link/index.ts"],"sourcesContent":["/* eslint-disable unicorn/prefer-string-raw -- Don't use String.raw here for better bundler minification */\n\n// All valid alpha TLDs.\n// Data source: https://data.iana.org/TLD/tlds-alpha-by-domain.txt\nconst TLD_RE_PATTERN =\n 'a(?:a(?:a|rp)|b(?:arth|b(?:ott|vie)?|c|le|ogado|udhabi)|c(?:ademy|c(?:enture|ountants?)|o|tor)?|d(?:s|ult)?|e(?:g|ro|tna)?|f(?:l|rica)?|g(?:akhan|ency)?|i(?:g|r(?:bus|force|tel))?|kdn|l(?:faromeo|i(?:baba|pay)|l(?:finanz|state|y)|s(?:ace|tom))?|m(?:azon|e(?:rican(?:express|family)|x)|fam|ica|sterdam)?|n(?:alytics|droid|quan|z)|ol?|p(?:artments|p(?:le)?)|q(?:uarelle)?|r(?:a(?:b|mco)|chi|my|pa|te?)?|s(?:da|ia|sociates)?|t(?:hleta|torney)?|u(?:ction|di(?:ble|o)?|spost|t(?:hor|os?))?|vianca|ws?|xa?|z(?:ure)?)|b(?:a(?:by|idu|n(?:a(?:mex|narepublic)|d|k)|r(?:c(?:elona|lay(?:card|s))|efoot|gains)?|s(?:eball|ketball)|uhaus|yern)?|b(?:c|t|va)?|c[gn]|d|e(?:a(?:ts|uty)|er|ntley|rlin|st(?:buy)?|t)?|f|g|h(?:arti)?|i(?:ble|d|ke|ngo?|o|z)?|j|l(?:ack(?:friday)?|o(?:ckbuster|g|omberg)|ue)|m[sw]?|n(?:pparibas)?|o(?:ats|ehringer|fa|m|nd|o(?:k(?:ing)?)?|s(?:ch|t(?:ik|on))|t|utique|x)?|r(?:adesco|idgestone|o(?:adway|ker|ther)|ussels)?|s|t|u(?:ild(?:ers)?|siness|y|zz)|v|w|y|zh?)|c(?:a(?:b|fe|l(?:l|vinklein)?|m(?:era|p)?|non|p(?:etown|ital(?:one)?)|r(?:avan|ds|e(?:ers?)?|s)?|s(?:a|e|h|ino)|t(?:ering|holic)?)?|b(?:a|n|re|s)|c|d|e(?:nter|o|rn)|f[ad]?|g|h(?:a(?:n(?:el|nel)|rity|se|t)|eap|intai|r(?:istmas|ome)|urch)?|i(?:priani|rcle|sco|t(?:adel|ic?|y(?:eats)?))?|k|l(?:aims|eaning|i(?:ck|ni(?:c|que))|o(?:thing|ud)|ub(?:med)?)?|m|n|o(?:ach|des|ffee|l(?:lege|ogne)|m(?:cast|m(?:bank|unity)|p(?:a(?:ny|re)|uter)|sec)?|n(?:dos|s(?:truction|ulting)|t(?:act|ractors))|o(?:king(?:channel)?|l|p)|rsica|u(?:ntry|pons?|rses))?|pa|r(?:edit(?:card|union)?|icket|own|s|uises?)?|u(?:isinella)?|v|w|x|y(?:mru|ou)?|z)|d(?:a(?:bur|d|nce|t(?:a|e|ing|sun)|y)|clk|ds|e(?:al(?:er|s)?|gree|l(?:ivery|l|oitte|ta)|mocrat|nt(?:al|ist)|si(?:gn)?|v)?|hl|i(?:amonds|et|gital|rect(?:ory)?|s(?:co(?:unt|ver)|h)|y)|j|k|m|np|o(?:c(?:s|tor)|g|mains|t|wnload)?|rive|tv|u(?:bai|nlop|pont|rban)|v(?:ag|r)|z)|e(?:a(?:rth|t)|co?|d(?:eka|u(?:cation)?)|e|g|m(?:ail|erck)|n(?:ergy|gineer(?:ing)?|terprises)|pson|quipment|r(?:icsson|ni)?|s(?:q|tate)?|t(?:isalat)?|u(?:rovision|s)?|vents|x(?:change|p(?:ert|osed|ress)|traspace))|f(?:a(?:ge|i(?:l|rwinds|th)|mily|ns?|rm(?:ers)?|s(?:hion|t))|e(?:dex|edback|rr(?:ari|ero))|i(?:at|d(?:elity|o)|lm|na(?:l|nc(?:e|ial))|r(?:e(?:stone)?|mdale)|sh(?:ing)?|t(?:ness)?)?|j|k|l(?:i(?:ckr|ghts|r)|o(?:rist|wers)|y)|m|o(?:o(?:d(?:network)?|tball)?|r(?:d|ex|sale|um)|undation|x)?|r(?:e(?:e|senius)|l|o(?:gans|nt(?:door|ier)))?|tr|u(?:jitsu|nd?|rniture|tbol)|yi)|g(?:a(?:l(?:l(?:ery|o|up))?|mes?|p|rden|y)?|b(?:iz)?|dn?|e(?:a|nt(?:ing)?|orge)?|f|g(?:ee)?|h|i(?:fts?|v(?:es|ing))?|l(?:ass|e|ob(?:al|o))?|m(?:ail|bh|o|x)?|n|o(?:daddy|l(?:d(?:point)?|f)|o(?:dyear|g(?:le)?)?|p|t|v)|p|q|r(?:a(?:inger|phics|tis)|een|ipe|o(?:cery|up))?|s|t|u(?:ardian|cci|ge|i(?:de|tars)|ru)?|w|y)|h(?:a(?:ir|mburg|ngout|us)|bo|dfc(?:bank)?|e(?:alth(?:care)?|l(?:p|sinki)|r(?:e|mes))|gtv|i(?:phop|samitsu|tachi|v)|kt?|m|n|o(?:ckey|l(?:dings|iday)|me(?:depot|goods|s(?:ense)?)|nda|rse|s(?:pital|t(?:ing)?)|t(?:el(?:es|s)|mail)?|use|w)|r|sbc|t|u(?:ghes)?|y(?:att|undai))|i(?:bm|c(?:bc|e|u)|d|e(?:ee)?|fm|kano|l|m(?:amat|db|mo(?:bilien)?)?|n(?:c|dustries|f(?:initi|o)|g|k|s(?:titute|ur(?:ance|e))|t(?:ernational|uit)?|vestments)?|o|piranga|q|r(?:ish)?|s(?:maili|t(?:anbul)?)?|t(?:au|v)?)|j(?:a(?:guar|va)|cb|e(?:ep|tzt|welry)?|io|ll|mp?|nj|o(?:b(?:s|urg)|t|y)?|p(?:morgan|rs)?|u(?:egos|niper))|k(?:aufen|ddi|e(?:rry(?:hotels|logistics|properties))?|fh|g|h|i(?:a|ds|m|nd(?:er|le)|tchen|wi)?|m|n|o(?:eln|matsu|sher)|p(?:mg|n)?|r(?:d|ed)?|uokgroup|w|y(?:oto)?|z)|l(?:a(?:caixa|m(?:borghini|er)|n(?:c(?:aster|ia)|d(?:rover)?|xess)|salle|t(?:ino|robe)?|w(?:yer)?)?|b|c|ds|e(?:ase|clerc|frak|g(?:al|o)|xus)|gbt|i(?:dl|fe(?:insurance|style)?|ghting|ke|lly|m(?:ited|o)|n(?:coln|de|k)|psy|v(?:e|ing))?|k|l[cp]|o(?:ans?|c(?:ker|us)|l|ndon|tt[eo]|ve)|pl(?:financial)?|r|s|t(?:da?)?|u(?:ndbeck|x(?:e|ury))?|v|y)|m(?:a(?:cys|drid|i(?:f|son)|keup|n(?:agement|go)?|p|r(?:ket(?:ing|s)?|riott|shalls)|serati|ttel)?|ba|c(?:kinsey)?|d|e(?:d(?:ia)?|et|lbourne|m(?:e|orial)|nu?|rckmsd)?|g|h|i(?:ami|crosoft|l|n[it]|t(?:subishi)?)|k|l[bs]?|ma?|n|o(?:bi(?:le)?|da|e|i|m|n(?:ash|ey|ster)|r(?:mon|tgage)|scow|to(?:rcycles)?|v(?:ie)?)?|p|q|r|sd?|t[nr]?|u(?:s(?:eum|ic)|tual)?|v|w|x|y|z)|n(?:a(?:b|goya|me|tura|vy)?|ba|c|e(?:c|t(?:bank|flix|work)?|ustar|ws?|x(?:t(?:direct)?|us))?|fl?|go?|hk|i(?:co|k(?:e|on)|nja|ssa[ny])?|l|o(?:kia|rt(?:hwesternmutual|on)|w(?:ruz|tv)?)?|p|r[aw]?|tt|u|yc|z)|o(?:b(?:i|server)|ffice|kinawa|l(?:ayan(?:group)?|dnavy|lo)|m(?:ega)?|n(?:e|g|l(?:ine)?)|oo|pen|r(?:a(?:cle|nge)|g(?:anic)?|igins)|saka|t(?:suka|t)|vh)|p(?:a(?:ge|nasonic|r(?:is|s|t(?:ners|s|y))|ssagens|y)?|ccw|et?|f(?:izer)?|g|h(?:armacy|d|ilips|o(?:ne|to(?:graphy|s)?)|ysio)?|i(?:c(?:s|t(?:et|ures))|d|n[gk]?|oneer|zza)|k|l(?:a(?:ce|y(?:station)?)|u(?:mbing|s))?|m|nc?|o(?:hl|ker|litie|rn|st)|r(?:a(?:merica|xi)|ess|ime|o(?:d(?:uctions)?|f|gressive|mo|pert(?:ies|y)|tection)?|u(?:dential)?)?|s|t|ub|wc?|y)|q(?:a|pon|ue(?:bec|st))|r(?:a(?:cing|dio)|e(?:a(?:d|l(?:estate|t(?:or|y)))|cipes|d(?:stone|umbrella)?|hab|i(?:sen?|t)|liance|n(?:t(?:als)?)?|p(?:air|ort|ublican)|st(?:aurant)?|views?|xroth)?|i(?:c(?:h(?:ardli)?|oh)|l|o|p)|o(?:c(?:her|ks)|deo|gers|om)?|s(?:vp)?|u(?:gby|hr|n)?|we?|yukyu)|s(?:a(?:arland|fe(?:ty)?|kura|l(?:e|on)|ms(?:club|ung)|n(?:dvik(?:coromant)?|ofi)|p|rl|s|ve|xo)?|b[is]?|c(?:a|b|h(?:aeffler|midt|o(?:larships|ol)|ule|warz)|ience|ot)?|d|e(?:a(?:rch|t)|cur(?:e|ity)|ek|lect|ner|rvices|ven|w|xy?)?|fr|g|h(?:a(?:ngrila|rp|w)|ell|i(?:a|ksha)|o(?:es|p(?:ping)?|uji|w(?:time)?))?|i(?:lk|n(?:a|gles)|te)?|j|k(?:in?|y(?:pe)?)?|l(?:ing)?|m(?:art|ile)?|n(?:cf)?|o(?:c(?:cer|ial)|ft(?:bank|ware)|hu|l(?:ar|utions)|n[gy]|y)?|p(?:a(?:ce)?|o(?:rt|t))|rl?|s|t(?:a(?:da|ples|r|te(?:bank|farm))|c(?:group)?|o(?:ckholm|r(?:age|e))|ream|ud(?:io|y)|yle)?|u(?:cks|pp(?:l(?:ies|y)|ort)|r(?:f|gery)|zuki)?|v|w(?:atch|iss)|x|y(?:dney|stems)?|z)|t(?:a(?:b|ipei|lk|obao|rget|t(?:a(?:motors|r)|too)|xi?)|ci?|dk?|e(?:am|ch(?:nology)?|l|masek|nnis|va)|f|g|h(?:d|eat(?:er|re))?|i(?:aa|ckets|enda|ffany|ps|r(?:es|ol))|j(?:maxx|x)?|k(?:maxx)?|l|m(?:all)?|n|o(?:day|kyo|ols|p|ray|shiba|tal|urs|wn|y(?:ota|s))?|r(?:a(?:d(?:e|ing)|ining|vel(?:channel|ers(?:insurance)?)?)|ust|v)?|t|u(?:be|i|nes|shu)|vs?|w|z)|u(?:a|b(?:ank|s)|g|k|n(?:i(?:com|versity)|o)|ol|ps|s|y|z)|v(?:a(?:cations|n(?:a|guard))?|c|e(?:gas|ntures|r(?:isign|sicherung)|t)?|g|i(?:ajes|deo|g|king|llas|n|p|rgin|s(?:a|ion)|v[ao])?|laanderen|n|o(?:dka|l(?:kswagen|vo)|t(?:e|ing|o)|yage)|u(?:elos)?)|w(?:a(?:l(?:es|mart|ter)|ng(?:gou)?|tch(?:es)?)|e(?:ather(?:channel)?|b(?:cam|er|site)|d(?:ding)?|i(?:bo|r))|f|hoswho|i(?:en|ki|lliamhill|n(?:dows|e|ners)?)|me|o(?:lterskluwer|odside|r(?:ks?|ld)|w)|s|t[cf])|x(?:box|erox|finity|i(?:huan|n)|xx|yz)|y(?:a(?:chts|hoo|maxun|ndex)|e|o(?:dobashi|ga|kohama|u(?:tube)?)|t|un)|z(?:a(?:ppos|ra)?|ero|ip|m|one|uerich|w)'\n\n// Some common punctuations that can be used to stop a link\nconst PUNCTUATION_CHAR_PATTERN = '\\\\.\\\\,\\\\;\\\\!\\\\?'\n\nconst STOP_CHAR_PATTERN = '[' + PUNCTUATION_CHAR_PATTERN + ']'\n\nconst END_CHAR_PATTERN = '[^' + '\\\\s' + PUNCTUATION_CHAR_PATTERN + ']'\n\n// dprint-ignore\nconst LINK_RE_BASE_PATTERN = (\n // start of the link group\n '(' + \n '(?:' +\n // protocol identifier (optional)\n // short syntax // is allowed\n '(?:(?:https?:)?\\\\/\\\\/)?' +\n\n // host & domain names.\n '(?:' +\n '(?:' +\n '[a-z0-9\\\\u00a1-\\\\uffff]' +\n '[a-z0-9\\\\u00a1-\\\\uffff_-]{0,62}' +\n ')?' +\n '[a-z0-9\\\\u00a1-\\\\uffff]\\\\.' +\n ')+' +\n\n // TLD identifier name, must not end with dot\n '(?:' +\n TLD_RE_PATTERN +\n ')' +\n ')' +\n\n // port number (optional)\n '(?::\\\\d{2,5})?' +\n\n // sub path (optional)\n '(?:/' +\n '(?:' + \n '\\\\S*' +\n END_CHAR_PATTERN +\n ')?' +\n ')?' +\n\n // query string (optional)\n '(?:\\\\?' + \n '(?:' + \n '\\\\S*' +\n END_CHAR_PATTERN +\n ')' +\n ')?' +\n\n // fragment (optional)\n '(?:\\\\#' + \n '(?:' + \n '\\\\S*' +\n END_CHAR_PATTERN +\n ')?' +\n ')?' +\n\n // end of the link group\n ')'\n)\n\n// dprint-ignore\nconst LINK_ENTER_PATTERN = LINK_RE_BASE_PATTERN + STOP_CHAR_PATTERN + '?' + '$'\n// dprint-ignore\nconst LINK_INPUT_PATTERN = LINK_RE_BASE_PATTERN + STOP_CHAR_PATTERN + '?' + '\\\\s$'\n// dprint-ignore\nconst LINK_MARK_PATTERN = LINK_RE_BASE_PATTERN + '(?=' + STOP_CHAR_PATTERN + '|\\\\s|$)'\n\nexport const LINK_ENTER_RE: RegExp = new RegExp(LINK_ENTER_PATTERN, 'gi')\nexport const LINK_INPUT_RE: RegExp = new RegExp(LINK_INPUT_PATTERN, 'gi')\nexport const LINK_MARK_RE: RegExp = new RegExp(LINK_MARK_PATTERN, 'gi')\n","import type { PlainExtension } from '@prosekit/core'\n\nimport { defineMarkPasteRule } from '../paste-rule/index.ts'\n\nimport { LINK_MARK_RE } from './link-regex.ts'\nimport type { LinkAttrs } from './link-types.ts'\n\n/**\n * @internal\n */\nexport function defineLinkPasteRule(): PlainExtension {\n return defineMarkPasteRule({\n type: 'link',\n regex: LINK_MARK_RE,\n getAttrs: (match: RegExpExecArray): LinkAttrs | false => {\n if (match[1]) {\n return { href: match[1] } satisfies LinkAttrs\n }\n return false\n },\n })\n}\n","import {\n addMark,\n defineCommands,\n defineMarkSpec,\n expandMark,\n removeMark,\n toggleMark,\n union,\n type Extension,\n type PlainExtension,\n type Union,\n} from '@prosekit/core'\nimport { InputRule } from '@prosekit/pm/inputrules'\n\nimport { defineEnterRule } from '../enter-rule/index.ts'\nimport { defineInputRule } from '../input-rule/index.ts'\nimport { defineMarkRule } from '../mark-rule/index.ts'\n\nimport { defineLinkPasteRule } from './link-paste-rule.ts'\nimport { LINK_ENTER_RE, LINK_INPUT_RE, LINK_MARK_RE } from './link-regex.ts'\nimport type { LinkAttrs } from './link-types.ts'\n\nexport { defineLinkPasteRule }\nexport type { LinkAttrs }\n\n/**\n * @internal\n */\nexport type LinkSpecExtension = Extension<{\n Marks: {\n link: LinkAttrs\n }\n}>\n\n/**\n * @internal\n */\nexport function defineLinkSpec(): LinkSpecExtension {\n return defineMarkSpec<'link', LinkAttrs>({\n name: 'link',\n inclusive: false,\n attrs: {\n href: { validate: 'string' },\n target: { default: null, validate: 'string|null' },\n rel: { default: null, validate: 'string|null' },\n },\n parseDOM: [\n {\n tag: 'a[href]',\n getAttrs: (dom: HTMLElement) => {\n return {\n href: dom.getAttribute('href') || '',\n target: dom.getAttribute('target') || null,\n rel: dom.getAttribute('rel') || null,\n }\n },\n },\n ],\n toDOM(node) {\n const { href, target, rel } = node.attrs as LinkAttrs\n return ['a', { href, target, rel }, 0]\n },\n })\n}\n\n/**\n * @internal\n */\nexport type LinkCommandsExtension = Extension<{\n Commands: {\n addLink: [attrs: LinkAttrs]\n removeLink: []\n toggleLink: [attrs: LinkAttrs]\n expandLink: []\n }\n}>\n\nexport function defineLinkCommands(): LinkCommandsExtension {\n return defineCommands({\n addLink: (attrs: LinkAttrs) => addMark({ type: 'link', attrs }),\n removeLink: () => removeMark({ type: 'link' }),\n toggleLink: (attrs: LinkAttrs) => toggleMark({ type: 'link', attrs }),\n expandLink: () => expandMark({ type: 'link' }),\n })\n}\n\n/**\n * Apply link marks after pressing Space.\n *\n * @internal\n */\nexport function defineLinkInputRule(): PlainExtension {\n return defineInputRule(\n new InputRule(LINK_INPUT_RE, (state, match, from) => {\n const href = match[1]\n if (!href) return null\n\n const mark = state.schema.marks.link.create({ href })\n return state.tr.addMark(from, from + href.length, mark).insertText(' ')\n }),\n )\n}\n\n/**\n * Apply link marks after typing Enter.\n *\n * @internal\n */\nexport function defineLinkEnterRule(): PlainExtension {\n return defineEnterRule({\n regex: LINK_ENTER_RE,\n handler: ({ state, from, match }) => {\n const href = match[1]\n if (!href) return null\n\n const mark = state.schema.marks.link.create({ href })\n const tr = state.tr.addMark(from, from + href.length, mark)\n return tr.docChanged ? tr : null\n },\n })\n}\n\n/**\n * Apply and remove link marks to the text during typing.\n *\n * @internal\n */\nexport function defineLinkMarkRule(): PlainExtension {\n return defineMarkRule({\n regex: LINK_MARK_RE,\n type: 'link',\n attrs: (match) => ({ href: match[1] }),\n })\n}\n\n/**\n * @internal\n */\nexport type LinkExtension = Union<[LinkSpecExtension, LinkCommandsExtension]>\n\n/**\n * @public\n */\nexport function defineLink(): LinkExtension {\n return union(\n defineLinkSpec(),\n defineLinkCommands(),\n defineLinkInputRule(),\n defineLinkEnterRule(),\n defineLinkPasteRule(),\n )\n}\n"],"mappings":";;;;;;;;AAIA,MAAM,iBACJ;AAGF,MAAM,2BAA2B;AAEjC,MAAM,oBAAoB,MAAM,2BAA2B;AAElC,KAAe;AAGxC,MAAM,uBAEF,6HAiBY,iBACJ;AAmCZ,MAAM,qBAAqB,uBAAuB,oBAAoB;AAEtE,MAAM,qBAAqB,uBAAuB,oBAAoB;AAEtE,MAAM,oBAAoB,uBAAuB;AAEjD,MAAa,gBAAwB,IAAI,OAAO,oBAAoB,KAAK;AACzE,MAAa,gBAAwB,IAAI,OAAO,oBAAoB,KAAK;AACzE,MAAa,eAAuB,IAAI,OAAO,mBAAmB,KAAK;;;;;;;ACpEvE,SAAgB,sBAAsC;AACpD,QAAO,oBAAoB;EACzB,MAAM;EACN,OAAO;EACP,WAAW,UAA8C;AACvD,OAAI,MAAM,GACR,QAAO,EAAE,MAAM,MAAM,IAAI;AAE3B,UAAO;;EAEV,CAAC;;;;;;;;ACiBJ,SAAgB,iBAAoC;AAClD,QAAO,eAAkC;EACvC,MAAM;EACN,WAAW;EACX,OAAO;GACL,MAAM,EAAE,UAAU,UAAU;GAC5B,QAAQ;IAAE,SAAS;IAAM,UAAU;IAAe;GAClD,KAAK;IAAE,SAAS;IAAM,UAAU;IAAe;GAChD;EACD,UAAU,CACR;GACE,KAAK;GACL,WAAW,QAAqB;AAC9B,WAAO;KACL,MAAM,IAAI,aAAa,OAAO,IAAI;KAClC,QAAQ,IAAI,aAAa,SAAS,IAAI;KACtC,KAAK,IAAI,aAAa,MAAM,IAAI;KACjC;;GAEJ,CACF;EACD,MAAM,MAAM;GACV,MAAM,EAAE,MAAM,QAAQ,QAAQ,KAAK;AACnC,UAAO;IAAC;IAAK;KAAE;KAAM;KAAQ;KAAK;IAAE;IAAE;;EAEzC,CAAC;;AAeJ,SAAgB,qBAA4C;AAC1D,QAAO,eAAe;EACpB,UAAU,UAAqB,QAAQ;GAAE,MAAM;GAAQ;GAAO,CAAC;EAC/D,kBAAkB,WAAW,EAAE,MAAM,QAAQ,CAAC;EAC9C,aAAa,UAAqB,WAAW;GAAE,MAAM;GAAQ;GAAO,CAAC;EACrE,kBAAkB,WAAW,EAAE,MAAM,QAAQ,CAAC;EAC/C,CAAC;;;;;;;AAQJ,SAAgB,sBAAsC;AACpD,QAAO,gBACL,IAAI,UAAU,gBAAgB,OAAO,OAAO,SAAS;EACnD,MAAM,OAAO,MAAM;AACnB,MAAI,CAAC,KAAM,QAAO;EAElB,MAAM,OAAO,MAAM,OAAO,MAAM,KAAK,OAAO,EAAE,MAAM,CAAC;AACrD,SAAO,MAAM,GAAG,QAAQ,MAAM,OAAO,KAAK,QAAQ,KAAK,CAAC,WAAW,IAAI;GACvE,CACH;;;;;;;AAQH,SAAgB,sBAAsC;AACpD,QAAO,gBAAgB;EACrB,OAAO;EACP,UAAU,EAAE,OAAO,MAAM,YAAY;GACnC,MAAM,OAAO,MAAM;AACnB,OAAI,CAAC,KAAM,QAAO;GAElB,MAAM,OAAO,MAAM,OAAO,MAAM,KAAK,OAAO,EAAE,MAAM,CAAC;GACrD,MAAM,KAAK,MAAM,GAAG,QAAQ,MAAM,OAAO,KAAK,QAAQ,KAAK;AAC3D,UAAO,GAAG,aAAa,KAAK;;EAE/B,CAAC;;;;;;;AAQJ,SAAgB,qBAAqC;AACnD,QAAO,eAAe;EACpB,OAAO;EACP,MAAM;EACN,QAAQ,WAAW,EAAE,MAAM,MAAM,IAAI;EACtC,CAAC;;;;;AAWJ,SAAgB,aAA4B;AAC1C,QAAO,MACL,gBAAgB,EAChB,oBAAoB,EACpB,qBAAqB,EACrB,qBAAqB,EACrB,qBAAqB,CACtB"}
|
|
@@ -25,6 +25,32 @@ type ListCommandsExtension = Extension<{
|
|
|
25
25
|
*/
|
|
26
26
|
declare function defineListCommands(): ListCommandsExtension;
|
|
27
27
|
//#endregion
|
|
28
|
+
//#region src/list/list-input-rules.d.ts
|
|
29
|
+
/**
|
|
30
|
+
* @internal
|
|
31
|
+
*/
|
|
32
|
+
declare function defineListInputRules(): Extension;
|
|
33
|
+
//#endregion
|
|
34
|
+
//#region src/list/list-keymap.d.ts
|
|
35
|
+
/**
|
|
36
|
+
* Returns a extension that adds key bindings for list.
|
|
37
|
+
*
|
|
38
|
+
* @internal
|
|
39
|
+
*/
|
|
40
|
+
declare function defineListKeymap(): PlainExtension;
|
|
41
|
+
//#endregion
|
|
42
|
+
//#region src/list/list-plugins.d.ts
|
|
43
|
+
/**
|
|
44
|
+
* @internal
|
|
45
|
+
*/
|
|
46
|
+
declare function defineListPlugins(): PlainExtension;
|
|
47
|
+
//#endregion
|
|
48
|
+
//#region src/list/list-serializer.d.ts
|
|
49
|
+
/**
|
|
50
|
+
* @internal
|
|
51
|
+
*/
|
|
52
|
+
declare function defineListSerializer(): PlainExtension;
|
|
53
|
+
//#endregion
|
|
28
54
|
//#region src/list/list-types.d.ts
|
|
29
55
|
/**
|
|
30
56
|
* The attributes of a list node.
|
|
@@ -74,31 +100,5 @@ type ListExtension = Union<[ListSpecExtension, ListCommandsExtension]>;
|
|
|
74
100
|
*/
|
|
75
101
|
declare function defineList(): ListExtension;
|
|
76
102
|
//#endregion
|
|
77
|
-
//#region src/list/list-input-rules.d.ts
|
|
78
|
-
/**
|
|
79
|
-
* @internal
|
|
80
|
-
*/
|
|
81
|
-
declare function defineListInputRules(): Extension;
|
|
82
|
-
//#endregion
|
|
83
|
-
//#region src/list/list-keymap.d.ts
|
|
84
|
-
/**
|
|
85
|
-
* Returns a extension that adds key bindings for list.
|
|
86
|
-
*
|
|
87
|
-
* @internal
|
|
88
|
-
*/
|
|
89
|
-
declare function defineListKeymap(): PlainExtension;
|
|
90
|
-
//#endregion
|
|
91
|
-
//#region src/list/list-plugins.d.ts
|
|
92
|
-
/**
|
|
93
|
-
* @internal
|
|
94
|
-
*/
|
|
95
|
-
declare function defineListPlugins(): PlainExtension;
|
|
96
|
-
//#endregion
|
|
97
|
-
//#region src/list/list-serializer.d.ts
|
|
98
|
-
/**
|
|
99
|
-
* @internal
|
|
100
|
-
*/
|
|
101
|
-
declare function defineListSerializer(): PlainExtension;
|
|
102
|
-
//#endregion
|
|
103
103
|
export { type DedentListOptions, type IndentListOptions, type ListAttrs, type ListCommandsExtension, ListDOMSerializer, type ListExtension, type ListSpecExtension, type ToggleCollapsedOptions, type UnwrapListOptions, type WrapInListGetAttrs, defineList, defineListCommands, defineListInputRules, defineListKeymap, defineListPlugins, defineListSerializer, defineListSpec };
|
|
104
104
|
//# sourceMappingURL=prosekit-extensions-list.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"prosekit-extensions-list.d.ts","names":[],"sources":["../src/list/list-commands.ts","../src/list/list-
|
|
1
|
+
{"version":3,"file":"prosekit-extensions-list.d.ts","names":[],"sources":["../src/list/list-commands.ts","../src/list/list-input-rules.ts","../src/list/list-keymap.ts","../src/list/list-plugins.ts","../src/list/list-serializer.ts","../src/list/list-types.ts","../src/list/list-spec.ts","../src/list/list.ts"],"mappings":";;;;;;AAyBA;KAAY,qBAAA,GAAwB,SAAA;EAClC,QAAA;IACE,UAAA,GAAa,OAAA,GAAU,mBAAA;IACvB,UAAA,GAAa,OAAA,GAAU,mBAAA;IACvB,QAAA,GAAW,SAAA;IACX,SAAA;IACA,eAAA,GAAkB,OAAA,GAAU,wBAAA;IAC5B,UAAA,GAAa,OAAA,GAAU,mBAAA;IACvB,UAAA,GAAa,KAAA,GAAQ,cAAA;IACrB,UAAA,GAAa,KAAA,GAAQ,cAAA;IACrB,UAAA,GAAa,KAAA,GAAQ,cAAA;EAAA;AAAA;;;;;;iBAST,kBAAA,CAAA,GAAsB,qBAAA;;;;;;iBCpCtB,oBAAA,CAAA,GAAwB,SAAA;;;;;;ADiBxC;;iBEcgB,gBAAA,CAAA,GAAoB,cAAA;;;;;;iBCVpB,iBAAA,CAAA,GAAqB,cAAA;;;;;;iBCtBrB,oBAAA,CAAA,GAAwB,cAAA;;;;;;;AJkBxC;UKpBiB,SAAA;;;;EAIf,IAAA;ELuByB;;;EKnBzB,KAAA;ELYkC;;;EKRlC,OAAA;ELSA;;;EKLA,SAAA;AAAA;;;;;ALIF;KMhBY,iBAAA,GAAoB,SAAA;EAC9B,KAAA;IACE,IAAA,EAAM,SAAA;EAAA;AAAA;;;;iBA4BM,cAAA,CAAA,GAAkB,iBAAA;;;;ANdlC;;KOZY,aAAA,GAAgB,KAAA,EAAO,iBAAA,EAAmB,qBAAA;;;;iBAKtC,UAAA,CAAA,GAAc,aAAA"}
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { defineInputRule } from "./prosekit-extensions-input-rule.js";
|
|
2
2
|
import { t as defineDropIndicator } from "./drop-indicator-DJq8pF92.js";
|
|
3
|
-
import { defineClipboardSerializer, defineCommands, defineKeymap, defineNodeSpec, definePlugin, insertNode, union } from "@prosekit/core";
|
|
4
3
|
import { Plugin } from "@prosekit/pm/state";
|
|
4
|
+
import { defineClipboardSerializer, defineCommands, defineKeymap, defineNodeSpec, definePlugin, insertNode, union } from "@prosekit/core";
|
|
5
5
|
import { chainCommands, deleteSelection } from "@prosekit/pm/commands";
|
|
6
6
|
import { isElementLike } from "@ocavue/utils";
|
|
7
7
|
import { ListDOMSerializer, createDedentListCommand, createIndentListCommand, createListEventPlugin, createListRenderingPlugin, createListSpec, createMoveListCommand, createSafariInputMethodWorkaroundPlugin, createSplitListCommand, createToggleCollapsedCommand, createToggleListCommand, createUnwrapListCommand, createWrapInListCommand, deleteCommand, enterCommand, findCheckboxInListItem, joinCollapsedListBackward, joinListElements, joinListUp, listInputRules, listToDOM, protectCollapsed, unwrapListSlice } from "prosemirror-flat-list";
|
|
@@ -32,30 +32,6 @@ function defineListCommands() {
|
|
|
32
32
|
});
|
|
33
33
|
}
|
|
34
34
|
|
|
35
|
-
//#endregion
|
|
36
|
-
//#region src/list/list-drop-indicator.ts
|
|
37
|
-
/**
|
|
38
|
-
* Configures drop indicator to avoid unexpected drop point.
|
|
39
|
-
*
|
|
40
|
-
* We don't want to drag a list node and drop it as the first
|
|
41
|
-
* child of another list node.
|
|
42
|
-
*
|
|
43
|
-
* @internal
|
|
44
|
-
*/
|
|
45
|
-
function defineListDropIndicator() {
|
|
46
|
-
return defineDropIndicator({ onDrag });
|
|
47
|
-
}
|
|
48
|
-
const onDrag = ({ view, pos }) => {
|
|
49
|
-
const slice = view.dragging?.slice;
|
|
50
|
-
if (slice && slice.openStart === 0 && slice.openEnd === 0 && slice.content.childCount === 1) {
|
|
51
|
-
if (slice.content.child(0).type.name === "list") {
|
|
52
|
-
const $pos = view.state.doc.resolve(pos);
|
|
53
|
-
if ($pos.parent.type.name === "list" && $pos.index() === 0) return false;
|
|
54
|
-
}
|
|
55
|
-
}
|
|
56
|
-
return true;
|
|
57
|
-
};
|
|
58
|
-
|
|
59
35
|
//#endregion
|
|
60
36
|
//#region src/list/list-input-rules.ts
|
|
61
37
|
/**
|
|
@@ -198,6 +174,30 @@ function defineListSpec() {
|
|
|
198
174
|
});
|
|
199
175
|
}
|
|
200
176
|
|
|
177
|
+
//#endregion
|
|
178
|
+
//#region src/list/list-drop-indicator.ts
|
|
179
|
+
/**
|
|
180
|
+
* Configures drop indicator to avoid unexpected drop point.
|
|
181
|
+
*
|
|
182
|
+
* We don't want to drag a list node and drop it as the first
|
|
183
|
+
* child of another list node.
|
|
184
|
+
*
|
|
185
|
+
* @internal
|
|
186
|
+
*/
|
|
187
|
+
function defineListDropIndicator() {
|
|
188
|
+
return defineDropIndicator({ onDrag });
|
|
189
|
+
}
|
|
190
|
+
const onDrag = ({ view, pos }) => {
|
|
191
|
+
const slice = view.dragging?.slice;
|
|
192
|
+
if (slice && slice.openStart === 0 && slice.openEnd === 0 && slice.content.childCount === 1) {
|
|
193
|
+
if (slice.content.child(0).type.name === "list") {
|
|
194
|
+
const $pos = view.state.doc.resolve(pos);
|
|
195
|
+
if ($pos.parent.type.name === "list" && $pos.index() === 0) return false;
|
|
196
|
+
}
|
|
197
|
+
}
|
|
198
|
+
return true;
|
|
199
|
+
};
|
|
200
|
+
|
|
201
201
|
//#endregion
|
|
202
202
|
//#region src/list/list.ts
|
|
203
203
|
/**
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"prosekit-extensions-list.js","names":[],"sources":["../src/list/list-commands.ts","../src/list/list-drop-indicator.ts","../src/list/list-input-rules.ts","../src/list/list-keymap.ts","../src/list/list-plugins.ts","../src/list/list-serializer.ts","../src/list/list-spec.ts","../src/list/list.ts"],"sourcesContent":["import { defineCommands, insertNode, type Extension } from '@prosekit/core'\nimport type { Command } from '@prosekit/pm/state'\nimport {\n createDedentListCommand as dedentList,\n createIndentListCommand as indentList,\n createMoveListCommand as moveList,\n createSplitListCommand as splitList,\n createToggleCollapsedCommand as toggleCollapsed,\n createToggleListCommand as toggleList,\n createUnwrapListCommand as unwrapList,\n createWrapInListCommand as wrapInList,\n type DedentListOptions,\n type IndentListOptions,\n type ListAttributes,\n type ToggleCollapsedOptions,\n type UnwrapListOptions,\n} from 'prosemirror-flat-list'\n\nfunction insertList(attrs?: ListAttributes): Command {\n return insertNode({ type: 'list', attrs })\n}\n\n/**\n * @internal\n */\nexport type ListCommandsExtension = Extension<{\n Commands: {\n dedentList: [options?: DedentListOptions]\n indentList: [options?: IndentListOptions]\n moveList: [direction: 'up' | 'down']\n splitList: []\n toggleCollapsed: [options?: ToggleCollapsedOptions]\n unwrapList: [options?: UnwrapListOptions]\n toggleList: [attrs?: ListAttributes]\n wrapInList: [attrs?: ListAttributes]\n insertList: [attrs?: ListAttributes]\n }\n}>\n\n/**\n * Defines list commands.\n *\n * @internal\n */\nexport function defineListCommands(): ListCommandsExtension {\n return defineCommands({\n dedentList,\n indentList,\n moveList,\n splitList,\n toggleCollapsed,\n unwrapList,\n toggleList,\n wrapInList,\n insertList,\n })\n}\n","import type { PlainExtension } from '@prosekit/core'\n\nimport type { DragEventHandler } from '../drop-indicator'\nimport { defineDropIndicator } from '../drop-indicator'\n\n/**\n * Configures drop indicator to avoid unexpected drop point.\n *\n * We don't want to drag a list node and drop it as the first\n * child of another list node.\n *\n * @internal\n */\nexport function defineListDropIndicator(): PlainExtension {\n return defineDropIndicator({\n onDrag,\n })\n}\n\nconst onDrag: DragEventHandler = ({ view, pos }): boolean => {\n const slice = view.dragging?.slice\n if (\n slice\n && slice.openStart === 0\n && slice.openEnd === 0\n && slice.content.childCount === 1\n ) {\n const node = slice.content.child(0)\n if (node.type.name === 'list') {\n const $pos = view.state.doc.resolve(pos)\n if ($pos.parent.type.name === 'list' && $pos.index() === 0) {\n return false\n }\n }\n }\n return true\n}\n","import { union, type Extension } from '@prosekit/core'\nimport { listInputRules } from 'prosemirror-flat-list'\n\nimport { defineInputRule } from '../input-rule'\n\n/**\n * @internal\n */\nexport function defineListInputRules(): Extension {\n return union(listInputRules.map(defineInputRule))\n}\n","import { defineKeymap, type PlainExtension } from '@prosekit/core'\nimport { chainCommands, deleteSelection } from '@prosekit/pm/commands'\nimport {\n createDedentListCommand,\n createIndentListCommand,\n deleteCommand,\n enterCommand,\n joinCollapsedListBackward,\n joinListUp,\n protectCollapsed,\n} from 'prosemirror-flat-list'\n\n// This is different from the one exported by prosemirror-flat-list, because\n// some commands are moved to `defineBaseKeymap` in `prosekit/core`.\nconst backspaceCommand = chainCommands(\n protectCollapsed,\n deleteSelection,\n joinListUp,\n joinCollapsedListBackward,\n)\n\nconst dedentListCommand = createDedentListCommand()\nconst indentListCommand = createIndentListCommand()\n\nconst listKeymap = {\n 'Enter': enterCommand,\n 'Backspace': backspaceCommand,\n 'Delete': deleteCommand,\n 'Mod-]': indentListCommand,\n 'Mod-[': dedentListCommand,\n 'Tab': indentListCommand,\n 'Shift-Tab': dedentListCommand,\n}\n\n/**\n * Returns a extension that adds key bindings for list.\n *\n * @internal\n */\nexport function defineListKeymap(): PlainExtension {\n return defineKeymap(listKeymap)\n}\n","import { definePlugin, type PlainExtension } from '@prosekit/core'\nimport { Plugin } from '@prosekit/pm/state'\nimport {\n createListEventPlugin,\n createListRenderingPlugin,\n createSafariInputMethodWorkaroundPlugin,\n unwrapListSlice,\n} from 'prosemirror-flat-list'\n\nfunction createListClipboardPlugin(): Plugin {\n return new Plugin({\n props: {\n transformCopied: unwrapListSlice,\n },\n })\n}\n\nfunction createListPlugins(): Plugin[] {\n return [\n createListEventPlugin(),\n createListRenderingPlugin(),\n createListClipboardPlugin(),\n createSafariInputMethodWorkaroundPlugin(),\n ]\n}\n\n/**\n * @internal\n */\nexport function defineListPlugins(): PlainExtension {\n return definePlugin(createListPlugins)\n}\n","import { isElementLike } from '@ocavue/utils'\nimport { defineClipboardSerializer, type PlainExtension } from '@prosekit/core'\nimport { findCheckboxInListItem, joinListElements, listToDOM } from 'prosemirror-flat-list'\n\n/**\n * @internal\n */\nexport function defineListSerializer(): PlainExtension {\n return defineClipboardSerializer({\n serializeFragmentWrapper: (fn) => {\n return (...args) => {\n const dom = fn(...args)\n return normalizeElementTree(joinListElements(dom))\n }\n },\n serializeNodeWrapper: (fn) => {\n return (...args) => {\n const dom = fn(...args)\n return isElementLike(dom)\n ? normalizeElementTree(joinListElements(dom))\n : dom\n }\n },\n nodesFromSchemaWrapper: (fn) => {\n return (...args) => {\n const nodes = fn(...args)\n return {\n ...nodes,\n list: (node) => listToDOM({ node, nativeList: true }),\n }\n }\n },\n })\n}\n\nfunction normalizeElementTree<T extends Element | DocumentFragment>(\n node: T,\n): T {\n if (isElementLike(node)) {\n normalizeTaskList(node)\n }\n\n for (const child of node.children) {\n normalizeElementTree(child)\n }\n\n return node\n}\n\n/**\n * Modifies the DOM tree for task lists to ensure that the output HTML can be\n * parsed by rehype-remark.\n */\nfunction normalizeTaskList(node: Element): void {\n if (\n !node.classList.contains('prosemirror-flat-list')\n || node.getAttribute('data-list-kind') !== 'task'\n || node.children.length !== 2\n ) {\n return\n }\n\n const marker = node.children.item(0)\n if (!marker || !marker.classList.contains('list-marker')) {\n return\n }\n\n const checkbox = findCheckboxInListItem(marker)\n if (!checkbox) {\n return\n }\n\n const content = node.children.item(1)\n if (!content || !content.classList.contains('list-content')) {\n return\n }\n\n const textBlock = content.children.item(0)\n if (!textBlock || !['P', 'H1', 'H2', 'H3', 'H4', 'H5', 'H6'].includes(textBlock.tagName)) {\n return\n }\n\n node.replaceChildren(...content.children)\n textBlock.prepend(checkbox)\n}\n","import { defineNodeSpec, type Extension } from '@prosekit/core'\nimport type { DOMOutputSpec, ProseMirrorNode } from '@prosekit/pm/model'\nimport { createListSpec, listToDOM, type ListAttributes } from 'prosemirror-flat-list'\n\nimport type { ListAttrs } from './list-types'\n\n/**\n * @internal\n */\nexport type ListSpecExtension = Extension<{\n Nodes: {\n list: ListAttrs\n }\n}>\n\nfunction getMarkers(node: ProseMirrorNode): DOMOutputSpec[] {\n const attrs = node.attrs as ListAttributes\n switch (attrs.kind) {\n case 'task':\n // Use a `label` element here so that the area around the checkbox is also checkable.\n return [\n [\n 'label',\n [\n 'input',\n { type: 'checkbox', checked: attrs.checked ? '' : undefined },\n ],\n ],\n ]\n default:\n // Always return an empty array so that the marker element is rendered. This\n // is required to make the drop indicator locate the correct position.\n return []\n }\n}\n\n/**\n * @internal\n */\nexport function defineListSpec(): ListSpecExtension {\n const spec = createListSpec()\n\n return defineNodeSpec<'list', ListAttrs>({\n ...spec,\n toDOM: (node) => {\n return listToDOM({ node, getMarkers })\n },\n name: 'list',\n })\n}\n","import { union, type Union } from '@prosekit/core'\n\nimport { defineListCommands, type ListCommandsExtension } from './list-commands'\nimport { defineListDropIndicator } from './list-drop-indicator'\nimport { defineListInputRules } from './list-input-rules'\nimport { defineListKeymap } from './list-keymap'\nimport { defineListPlugins } from './list-plugins'\nimport { defineListSerializer } from './list-serializer'\nimport { defineListSpec, type ListSpecExtension } from './list-spec'\n\n/**\n * @internal\n */\nexport type ListExtension = Union<[ListSpecExtension, ListCommandsExtension]>\n\n/**\n * @public\n */\nexport function defineList(): ListExtension {\n return union(\n defineListSpec(),\n defineListPlugins(),\n defineListKeymap(),\n defineListInputRules(),\n defineListCommands(),\n defineListSerializer(),\n defineListDropIndicator(),\n )\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"prosekit-extensions-list.js","names":[],"sources":["../src/list/list-commands.ts","../src/list/list-input-rules.ts","../src/list/list-keymap.ts","../src/list/list-plugins.ts","../src/list/list-serializer.ts","../src/list/list-spec.ts","../src/list/list-drop-indicator.ts","../src/list/list.ts"],"sourcesContent":["import { defineCommands, insertNode, type Extension } from '@prosekit/core'\nimport type { Command } from '@prosekit/pm/state'\nimport {\n createDedentListCommand as dedentList,\n createIndentListCommand as indentList,\n createMoveListCommand as moveList,\n createSplitListCommand as splitList,\n createToggleCollapsedCommand as toggleCollapsed,\n createToggleListCommand as toggleList,\n createUnwrapListCommand as unwrapList,\n createWrapInListCommand as wrapInList,\n type DedentListOptions,\n type IndentListOptions,\n type ListAttributes,\n type ToggleCollapsedOptions,\n type UnwrapListOptions,\n} from 'prosemirror-flat-list'\n\nfunction insertList(attrs?: ListAttributes): Command {\n return insertNode({ type: 'list', attrs })\n}\n\n/**\n * @internal\n */\nexport type ListCommandsExtension = Extension<{\n Commands: {\n dedentList: [options?: DedentListOptions]\n indentList: [options?: IndentListOptions]\n moveList: [direction: 'up' | 'down']\n splitList: []\n toggleCollapsed: [options?: ToggleCollapsedOptions]\n unwrapList: [options?: UnwrapListOptions]\n toggleList: [attrs?: ListAttributes]\n wrapInList: [attrs?: ListAttributes]\n insertList: [attrs?: ListAttributes]\n }\n}>\n\n/**\n * Defines list commands.\n *\n * @internal\n */\nexport function defineListCommands(): ListCommandsExtension {\n return defineCommands({\n dedentList,\n indentList,\n moveList,\n splitList,\n toggleCollapsed,\n unwrapList,\n toggleList,\n wrapInList,\n insertList,\n })\n}\n","import { union, type Extension } from '@prosekit/core'\nimport { listInputRules } from 'prosemirror-flat-list'\n\nimport { defineInputRule } from '../input-rule/index.ts'\n\n/**\n * @internal\n */\nexport function defineListInputRules(): Extension {\n return union(listInputRules.map(defineInputRule))\n}\n","import { defineKeymap, type PlainExtension } from '@prosekit/core'\nimport { chainCommands, deleteSelection } from '@prosekit/pm/commands'\nimport {\n createDedentListCommand,\n createIndentListCommand,\n deleteCommand,\n enterCommand,\n joinCollapsedListBackward,\n joinListUp,\n protectCollapsed,\n} from 'prosemirror-flat-list'\n\n// This is different from the one exported by prosemirror-flat-list, because\n// some commands are moved to `defineBaseKeymap` in `prosekit/core`.\nconst backspaceCommand = chainCommands(\n protectCollapsed,\n deleteSelection,\n joinListUp,\n joinCollapsedListBackward,\n)\n\nconst dedentListCommand = createDedentListCommand()\nconst indentListCommand = createIndentListCommand()\n\nconst listKeymap = {\n 'Enter': enterCommand,\n 'Backspace': backspaceCommand,\n 'Delete': deleteCommand,\n 'Mod-]': indentListCommand,\n 'Mod-[': dedentListCommand,\n 'Tab': indentListCommand,\n 'Shift-Tab': dedentListCommand,\n}\n\n/**\n * Returns a extension that adds key bindings for list.\n *\n * @internal\n */\nexport function defineListKeymap(): PlainExtension {\n return defineKeymap(listKeymap)\n}\n","import { definePlugin, type PlainExtension } from '@prosekit/core'\nimport { Plugin } from '@prosekit/pm/state'\nimport {\n createListEventPlugin,\n createListRenderingPlugin,\n createSafariInputMethodWorkaroundPlugin,\n unwrapListSlice,\n} from 'prosemirror-flat-list'\n\nfunction createListClipboardPlugin(): Plugin {\n return new Plugin({\n props: {\n transformCopied: unwrapListSlice,\n },\n })\n}\n\nfunction createListPlugins(): Plugin[] {\n return [\n createListEventPlugin(),\n createListRenderingPlugin(),\n createListClipboardPlugin(),\n createSafariInputMethodWorkaroundPlugin(),\n ]\n}\n\n/**\n * @internal\n */\nexport function defineListPlugins(): PlainExtension {\n return definePlugin(createListPlugins)\n}\n","import { isElementLike } from '@ocavue/utils'\nimport { defineClipboardSerializer, type PlainExtension } from '@prosekit/core'\nimport { findCheckboxInListItem, joinListElements, listToDOM } from 'prosemirror-flat-list'\n\n/**\n * @internal\n */\nexport function defineListSerializer(): PlainExtension {\n return defineClipboardSerializer({\n serializeFragmentWrapper: (fn) => {\n return (...args) => {\n const dom = fn(...args)\n return normalizeElementTree(joinListElements(dom))\n }\n },\n serializeNodeWrapper: (fn) => {\n return (...args) => {\n const dom = fn(...args)\n return isElementLike(dom)\n ? normalizeElementTree(joinListElements(dom))\n : dom\n }\n },\n nodesFromSchemaWrapper: (fn) => {\n return (...args) => {\n const nodes = fn(...args)\n return {\n ...nodes,\n list: (node) => listToDOM({ node, nativeList: true }),\n }\n }\n },\n })\n}\n\nfunction normalizeElementTree<T extends Element | DocumentFragment>(\n node: T,\n): T {\n if (isElementLike(node)) {\n normalizeTaskList(node)\n }\n\n for (const child of node.children) {\n normalizeElementTree(child)\n }\n\n return node\n}\n\n/**\n * Modifies the DOM tree for task lists to ensure that the output HTML can be\n * parsed by rehype-remark.\n */\nfunction normalizeTaskList(node: Element): void {\n if (\n !node.classList.contains('prosemirror-flat-list')\n || node.getAttribute('data-list-kind') !== 'task'\n || node.children.length !== 2\n ) {\n return\n }\n\n const marker = node.children.item(0)\n if (!marker || !marker.classList.contains('list-marker')) {\n return\n }\n\n const checkbox = findCheckboxInListItem(marker)\n if (!checkbox) {\n return\n }\n\n const content = node.children.item(1)\n if (!content || !content.classList.contains('list-content')) {\n return\n }\n\n const textBlock = content.children.item(0)\n if (!textBlock || !['P', 'H1', 'H2', 'H3', 'H4', 'H5', 'H6'].includes(textBlock.tagName)) {\n return\n }\n\n node.replaceChildren(...content.children)\n textBlock.prepend(checkbox)\n}\n","import { defineNodeSpec, type Extension } from '@prosekit/core'\nimport type { DOMOutputSpec, ProseMirrorNode } from '@prosekit/pm/model'\nimport { createListSpec, listToDOM, type ListAttributes } from 'prosemirror-flat-list'\n\nimport type { ListAttrs } from './list-types.ts'\n\n/**\n * @internal\n */\nexport type ListSpecExtension = Extension<{\n Nodes: {\n list: ListAttrs\n }\n}>\n\nfunction getMarkers(node: ProseMirrorNode): DOMOutputSpec[] {\n const attrs = node.attrs as ListAttributes\n switch (attrs.kind) {\n case 'task':\n // Use a `label` element here so that the area around the checkbox is also checkable.\n return [\n [\n 'label',\n [\n 'input',\n { type: 'checkbox', checked: attrs.checked ? '' : undefined },\n ],\n ],\n ]\n default:\n // Always return an empty array so that the marker element is rendered. This\n // is required to make the drop indicator locate the correct position.\n return []\n }\n}\n\n/**\n * @internal\n */\nexport function defineListSpec(): ListSpecExtension {\n const spec = createListSpec()\n\n return defineNodeSpec<'list', ListAttrs>({\n ...spec,\n toDOM: (node) => {\n return listToDOM({ node, getMarkers })\n },\n name: 'list',\n })\n}\n","import type { PlainExtension } from '@prosekit/core'\n\nimport type { DragEventHandler } from '../drop-indicator/index.ts'\nimport { defineDropIndicator } from '../drop-indicator/index.ts'\n\n/**\n * Configures drop indicator to avoid unexpected drop point.\n *\n * We don't want to drag a list node and drop it as the first\n * child of another list node.\n *\n * @internal\n */\nexport function defineListDropIndicator(): PlainExtension {\n return defineDropIndicator({\n onDrag,\n })\n}\n\nconst onDrag: DragEventHandler = ({ view, pos }): boolean => {\n const slice = view.dragging?.slice\n if (\n slice\n && slice.openStart === 0\n && slice.openEnd === 0\n && slice.content.childCount === 1\n ) {\n const node = slice.content.child(0)\n if (node.type.name === 'list') {\n const $pos = view.state.doc.resolve(pos)\n if ($pos.parent.type.name === 'list' && $pos.index() === 0) {\n return false\n }\n }\n }\n return true\n}\n","import { union, type Union } from '@prosekit/core'\n\nimport { defineListCommands, type ListCommandsExtension } from './list-commands.ts'\nimport { defineListDropIndicator } from './list-drop-indicator.ts'\nimport { defineListInputRules } from './list-input-rules.ts'\nimport { defineListKeymap } from './list-keymap.ts'\nimport { defineListPlugins } from './list-plugins.ts'\nimport { defineListSerializer } from './list-serializer.ts'\nimport { defineListSpec, type ListSpecExtension } from './list-spec.ts'\n\n/**\n * @internal\n */\nexport type ListExtension = Union<[ListSpecExtension, ListCommandsExtension]>\n\n/**\n * @public\n */\nexport function defineList(): ListExtension {\n return union(\n defineListSpec(),\n defineListPlugins(),\n defineListKeymap(),\n defineListInputRules(),\n defineListCommands(),\n defineListSerializer(),\n defineListDropIndicator(),\n )\n}\n"],"mappings":"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"}
|