@tutti-os/ui-rich-text 0.0.11 → 0.0.13
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +50 -57
- package/dist/at-panel/index.css +190 -0
- package/dist/at-panel/index.css.map +1 -0
- package/dist/at-panel/index.d.ts +63 -0
- package/dist/at-panel/index.js +1165 -0
- package/dist/at-panel/index.js.map +1 -0
- package/dist/at-panel/model.d.ts +386 -0
- package/dist/at-panel/model.js +39 -0
- package/dist/at-panel/model.js.map +1 -0
- package/dist/chunk-E4PWFY3N.js +264 -0
- package/dist/chunk-E4PWFY3N.js.map +1 -0
- package/dist/{chunk-K5POY2YJ.js → chunk-QK6NMNYN.js} +124 -46
- package/dist/chunk-QK6NMNYN.js.map +1 -0
- package/dist/{chunk-52PIIFZA.js → chunk-QOVFZUZN.js} +58 -49
- package/dist/chunk-QOVFZUZN.js.map +1 -0
- package/dist/core/index.d.ts +4 -4
- package/dist/core/index.js +1 -1
- package/dist/editor/index.d.ts +30 -13
- package/dist/editor/index.js +501 -171
- package/dist/editor/index.js.map +1 -1
- package/dist/index.d.ts +1 -1
- package/dist/index.js +1 -1
- package/dist/{mention-QICvf4wE.d.ts → mention-CgUcsO8r.d.ts} +35 -19
- package/dist/plugins/index.d.ts +8 -8
- package/dist/plugins/index.js +8 -8
- package/dist/types/index.d.ts +36 -24
- package/package.json +17 -3
- package/dist/chunk-52PIIFZA.js.map +0 -1
- package/dist/chunk-K5POY2YJ.js.map +0 -1
|
@@ -17,38 +17,54 @@ interface RichTextMentionResolveInput {
|
|
|
17
17
|
mention: RichTextMentionAttrs;
|
|
18
18
|
context: RichTextMentionPluginContext;
|
|
19
19
|
}
|
|
20
|
+
interface RichTextMentionIdentity {
|
|
21
|
+
providerId: string;
|
|
22
|
+
entityId: string;
|
|
23
|
+
label: string;
|
|
24
|
+
scope?: Readonly<Record<string, string>>;
|
|
25
|
+
}
|
|
26
|
+
interface RichTextMentionPresentation {
|
|
27
|
+
agentProviderId?: string;
|
|
28
|
+
agentIconUrl?: string;
|
|
29
|
+
iconUrl?: string;
|
|
30
|
+
thumbnailUrl?: string;
|
|
31
|
+
subtitle?: string;
|
|
32
|
+
description?: string;
|
|
33
|
+
participant?: string;
|
|
34
|
+
status?: string;
|
|
35
|
+
statusDataStatus?: string;
|
|
36
|
+
statusLabel?: string;
|
|
37
|
+
statusPulse?: string;
|
|
38
|
+
userAvatarPlaceholderUrl?: string;
|
|
39
|
+
}
|
|
40
|
+
interface RichTextMentionInsert {
|
|
41
|
+
entityId: string;
|
|
42
|
+
label: string;
|
|
43
|
+
scope?: Readonly<Record<string, string>>;
|
|
44
|
+
presentation?: RichTextMentionPresentation;
|
|
45
|
+
}
|
|
46
|
+
interface RichTextMentionResolved {
|
|
47
|
+
label?: string;
|
|
48
|
+
presentation?: RichTextMentionPresentation;
|
|
49
|
+
}
|
|
20
50
|
interface RichTextResolvedMention<TResolved = unknown> {
|
|
21
51
|
state: RichTextMentionRenderState;
|
|
22
52
|
label?: string;
|
|
23
53
|
tooltip?: string;
|
|
24
|
-
|
|
54
|
+
presentation?: RichTextMentionPresentation;
|
|
25
55
|
entity?: TResolved;
|
|
26
56
|
}
|
|
27
57
|
interface RichTextResolvedMentionView<TResolved = unknown> {
|
|
28
58
|
state: RichTextMentionRenderState;
|
|
29
59
|
label: string;
|
|
30
60
|
tooltip?: string;
|
|
31
|
-
|
|
61
|
+
presentation?: RichTextMentionPresentation;
|
|
32
62
|
entity?: TResolved;
|
|
33
63
|
interactive: boolean;
|
|
34
64
|
}
|
|
35
|
-
interface
|
|
36
|
-
entityId: string;
|
|
37
|
-
label: string;
|
|
38
|
-
href?: string | null;
|
|
39
|
-
kind?: string | null;
|
|
40
|
-
version?: string | null;
|
|
41
|
-
meta?: Readonly<Record<string, string>> | null;
|
|
42
|
-
}
|
|
43
|
-
interface RichTextMentionAttrs {
|
|
65
|
+
interface RichTextMentionAttrs extends RichTextMentionIdentity {
|
|
44
66
|
trigger: "@";
|
|
45
|
-
|
|
46
|
-
entityId: string;
|
|
47
|
-
label: string;
|
|
48
|
-
href?: string;
|
|
49
|
-
kind?: string;
|
|
50
|
-
version?: string;
|
|
51
|
-
meta?: Readonly<Record<string, string>>;
|
|
67
|
+
presentation?: RichTextMentionPresentation;
|
|
52
68
|
}
|
|
53
69
|
interface RichTextMentionPlugin<TItem = unknown, TResolved = unknown> {
|
|
54
70
|
id: string;
|
|
@@ -78,4 +94,4 @@ interface RichTextMentionRegistry {
|
|
|
78
94
|
resolve: (input: RichTextMentionResolveInput) => Promise<RichTextResolvedMentionView>;
|
|
79
95
|
}
|
|
80
96
|
|
|
81
|
-
export type { RichTextMentionAttrs as R,
|
|
97
|
+
export type { RichTextMentionAttrs as R, RichTextMentionIdentity as a, RichTextMentionInsert as b, RichTextMentionPlugin as c, RichTextMentionPluginContext as d, RichTextMentionPresentation as e, RichTextMentionQueryInput as f, RichTextMentionQueryMatch as g, RichTextMentionRegistry as h, RichTextMentionRenderState as i, RichTextMentionResolveInput as j, RichTextMentionResolved as k, RichTextResolvedMention as l, RichTextResolvedMentionView as m, RichTextSuggestionTrigger as n };
|
package/dist/plugins/index.d.ts
CHANGED
|
@@ -1,15 +1,15 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import {
|
|
1
|
+
import { RichTextMarkdownLinkInsertResult, RichTextMentionTriggerInsertResult, RichTextTextInsertResult, RichTextTriggerProvider, RichTextTriggerInsertResult, RichTextTriggerRegistry } from '../types/index.js';
|
|
2
|
+
import { b as RichTextMentionInsert, R as RichTextMentionAttrs, c as RichTextMentionPlugin, l as RichTextResolvedMention, m as RichTextResolvedMentionView, h as RichTextMentionRegistry } from '../mention-CgUcsO8r.js';
|
|
3
3
|
|
|
4
4
|
declare function createRichTextTextInsertResult(text: string): RichTextTextInsertResult;
|
|
5
5
|
declare function createRichTextMarkdownLinkInsertResult(label: string, href: string): RichTextMarkdownLinkInsertResult;
|
|
6
|
-
declare function createRichTextMentionInsertResult(mention:
|
|
7
|
-
declare function
|
|
8
|
-
declare function
|
|
6
|
+
declare function createRichTextMentionInsertResult(mention: RichTextMentionTriggerInsertResult["mention"]): RichTextMentionTriggerInsertResult;
|
|
7
|
+
declare function renderRichTextTriggerInsertResult(providerId: string, result: RichTextTriggerInsertResult): string;
|
|
8
|
+
declare function createRichTextTriggerProvider<TItem>(provider: RichTextTriggerProvider<TItem>): RichTextTriggerProvider<TItem>;
|
|
9
9
|
|
|
10
|
-
declare function
|
|
10
|
+
declare function createRichTextTriggerRegistry(providers: readonly RichTextTriggerProvider[]): RichTextTriggerRegistry;
|
|
11
11
|
|
|
12
|
-
declare function createRichTextMentionAttrs(
|
|
12
|
+
declare function createRichTextMentionAttrs(providerId: string, mention: RichTextMentionInsert): RichTextMentionAttrs;
|
|
13
13
|
declare function isRichTextMentionAttrs(value: unknown): value is RichTextMentionAttrs;
|
|
14
14
|
declare function getRichTextMentionDisplayText(attrs: RichTextMentionAttrs): string;
|
|
15
15
|
declare function resolveRichTextMentionView(mention: RichTextMentionAttrs, resolved?: RichTextResolvedMention | null): RichTextResolvedMentionView;
|
|
@@ -17,4 +17,4 @@ declare function createRichTextMentionPlugin<TItem, TResolved = unknown>(plugin:
|
|
|
17
17
|
|
|
18
18
|
declare function createRichTextMentionRegistry(plugins: readonly RichTextMentionPlugin[]): RichTextMentionRegistry;
|
|
19
19
|
|
|
20
|
-
export {
|
|
20
|
+
export { createRichTextMarkdownLinkInsertResult, createRichTextMentionAttrs, createRichTextMentionInsertResult, createRichTextMentionPlugin, createRichTextMentionRegistry, createRichTextTextInsertResult, createRichTextTriggerProvider, createRichTextTriggerRegistry, getRichTextMentionDisplayText, isRichTextMentionAttrs, renderRichTextTriggerInsertResult, resolveRichTextMentionView };
|
package/dist/plugins/index.js
CHANGED
|
@@ -1,30 +1,30 @@
|
|
|
1
1
|
import {
|
|
2
|
-
createRichTextAtProvider,
|
|
3
|
-
createRichTextAtRegistry,
|
|
4
2
|
createRichTextMarkdownLinkInsertResult,
|
|
5
3
|
createRichTextMentionAttrs,
|
|
6
4
|
createRichTextMentionInsertResult,
|
|
7
5
|
createRichTextMentionPlugin,
|
|
8
6
|
createRichTextMentionRegistry,
|
|
9
7
|
createRichTextTextInsertResult,
|
|
8
|
+
createRichTextTriggerProvider,
|
|
9
|
+
createRichTextTriggerRegistry,
|
|
10
10
|
getRichTextMentionDisplayText,
|
|
11
11
|
isRichTextMentionAttrs,
|
|
12
|
-
|
|
12
|
+
renderRichTextTriggerInsertResult,
|
|
13
13
|
resolveRichTextMentionView
|
|
14
|
-
} from "../chunk-
|
|
15
|
-
import "../chunk-
|
|
14
|
+
} from "../chunk-QK6NMNYN.js";
|
|
15
|
+
import "../chunk-QOVFZUZN.js";
|
|
16
16
|
export {
|
|
17
|
-
createRichTextAtProvider,
|
|
18
|
-
createRichTextAtRegistry,
|
|
19
17
|
createRichTextMarkdownLinkInsertResult,
|
|
20
18
|
createRichTextMentionAttrs,
|
|
21
19
|
createRichTextMentionInsertResult,
|
|
22
20
|
createRichTextMentionPlugin,
|
|
23
21
|
createRichTextMentionRegistry,
|
|
24
22
|
createRichTextTextInsertResult,
|
|
23
|
+
createRichTextTriggerProvider,
|
|
24
|
+
createRichTextTriggerRegistry,
|
|
25
25
|
getRichTextMentionDisplayText,
|
|
26
26
|
isRichTextMentionAttrs,
|
|
27
|
-
|
|
27
|
+
renderRichTextTriggerInsertResult,
|
|
28
28
|
resolveRichTextMentionView
|
|
29
29
|
};
|
|
30
30
|
//# sourceMappingURL=index.js.map
|
package/dist/types/index.d.ts
CHANGED
|
@@ -1,21 +1,27 @@
|
|
|
1
|
-
import {
|
|
2
|
-
export { R as RichTextMentionAttrs,
|
|
1
|
+
import { b as RichTextMentionInsert, a as RichTextMentionIdentity, k as RichTextMentionResolved } from '../mention-CgUcsO8r.js';
|
|
2
|
+
export { R as RichTextMentionAttrs, c as RichTextMentionPlugin, d as RichTextMentionPluginContext, e as RichTextMentionPresentation, f as RichTextMentionQueryInput, g as RichTextMentionQueryMatch, h as RichTextMentionRegistry, i as RichTextMentionRenderState, j as RichTextMentionResolveInput, l as RichTextResolvedMention, m as RichTextResolvedMentionView, n as RichTextSuggestionTrigger } from '../mention-CgUcsO8r.js';
|
|
3
3
|
|
|
4
|
-
type
|
|
5
|
-
|
|
4
|
+
type RichTextTrigger = "@" | "/" | "$";
|
|
5
|
+
type RichTextTriggerBoundary = "punctuation" | "whitespace";
|
|
6
|
+
interface RichTextTriggerConfig {
|
|
7
|
+
trigger: RichTextTrigger;
|
|
8
|
+
boundary: RichTextTriggerBoundary;
|
|
9
|
+
}
|
|
10
|
+
interface RichTextTriggerProviderContext {
|
|
6
11
|
locale?: string;
|
|
7
12
|
documentText?: string;
|
|
8
13
|
blockText?: string;
|
|
9
14
|
selectionText?: string;
|
|
10
15
|
metadata?: Readonly<Record<string, unknown>>;
|
|
11
16
|
}
|
|
12
|
-
interface
|
|
17
|
+
interface RichTextTriggerQueryInput {
|
|
13
18
|
keyword: string;
|
|
14
19
|
maxResults?: number;
|
|
15
20
|
abortSignal?: AbortSignal;
|
|
16
|
-
context:
|
|
21
|
+
context: RichTextTriggerProviderContext;
|
|
22
|
+
trigger: RichTextTrigger;
|
|
17
23
|
}
|
|
18
|
-
interface
|
|
24
|
+
interface RichTextMentionTriggerInsertResult {
|
|
19
25
|
kind: "mention";
|
|
20
26
|
mention: RichTextMentionInsert;
|
|
21
27
|
}
|
|
@@ -28,30 +34,36 @@ interface RichTextTextInsertResult {
|
|
|
28
34
|
kind: "text";
|
|
29
35
|
text: string;
|
|
30
36
|
}
|
|
31
|
-
type
|
|
32
|
-
interface
|
|
37
|
+
type RichTextTriggerInsertResult = RichTextMentionTriggerInsertResult | RichTextMarkdownLinkInsertResult | RichTextTextInsertResult;
|
|
38
|
+
interface RichTextTriggerProvider<TItem = unknown> {
|
|
33
39
|
id: string;
|
|
34
|
-
trigger
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
40
|
+
trigger: RichTextTrigger;
|
|
41
|
+
boundary?: RichTextTriggerBoundary;
|
|
42
|
+
query(input: RichTextTriggerQueryInput): Promise<readonly TItem[]> | readonly TItem[];
|
|
43
|
+
getItemKey(item: TItem): string;
|
|
44
|
+
getItemLabel(item: TItem): string;
|
|
45
|
+
getItemSubtitle?(item: TItem): string | null | undefined;
|
|
46
|
+
getItemThumbnailUrl?(item: TItem): string | null | undefined | Promise<string | null | undefined>;
|
|
47
|
+
getItemKeywords?(item: TItem): readonly string[] | undefined;
|
|
48
|
+
toInsertResult(item: TItem): RichTextTriggerInsertResult;
|
|
49
|
+
resolveMention?(identity: RichTextMentionIdentity): Promise<RichTextMentionResolved | null> | RichTextMentionResolved | null;
|
|
50
|
+
}
|
|
51
|
+
interface RichTextTriggerQueryMatch<TItem = unknown> {
|
|
43
52
|
providerId: string;
|
|
53
|
+
trigger: RichTextTrigger;
|
|
44
54
|
key: string;
|
|
45
55
|
label: string;
|
|
46
56
|
subtitle?: string;
|
|
57
|
+
thumbnailUrl?: string;
|
|
47
58
|
keywords?: readonly string[];
|
|
48
59
|
item: TItem;
|
|
49
|
-
insertResult:
|
|
60
|
+
insertResult: RichTextTriggerInsertResult;
|
|
50
61
|
}
|
|
51
|
-
interface
|
|
52
|
-
listProviders: () => readonly
|
|
53
|
-
getProvider: (providerId: string) =>
|
|
54
|
-
|
|
62
|
+
interface RichTextTriggerRegistry {
|
|
63
|
+
listProviders: () => readonly RichTextTriggerProvider[];
|
|
64
|
+
getProvider: (providerId: string) => RichTextTriggerProvider | undefined;
|
|
65
|
+
listTriggerConfigs: () => readonly RichTextTriggerConfig[];
|
|
66
|
+
query: (input: RichTextTriggerQueryInput) => Promise<readonly RichTextTriggerQueryMatch[]>;
|
|
55
67
|
}
|
|
56
68
|
|
|
57
|
-
export { type
|
|
69
|
+
export { type RichTextMarkdownLinkInsertResult, RichTextMentionIdentity, RichTextMentionInsert, RichTextMentionResolved, type RichTextMentionTriggerInsertResult, type RichTextTextInsertResult, type RichTextTrigger, type RichTextTriggerBoundary, type RichTextTriggerConfig, type RichTextTriggerInsertResult, type RichTextTriggerProvider, type RichTextTriggerProviderContext, type RichTextTriggerQueryInput, type RichTextTriggerQueryMatch, type RichTextTriggerRegistry };
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@tutti-os/ui-rich-text",
|
|
3
|
-
"version": "0.0.
|
|
3
|
+
"version": "0.0.13",
|
|
4
4
|
"private": false,
|
|
5
5
|
"type": "module",
|
|
6
6
|
"types": "./dist/index.d.ts",
|
|
@@ -9,6 +9,14 @@
|
|
|
9
9
|
"types": "./dist/index.d.ts",
|
|
10
10
|
"import": "./dist/index.js"
|
|
11
11
|
},
|
|
12
|
+
"./at-panel": {
|
|
13
|
+
"types": "./dist/at-panel/index.d.ts",
|
|
14
|
+
"import": "./dist/at-panel/index.js"
|
|
15
|
+
},
|
|
16
|
+
"./at-panel/model": {
|
|
17
|
+
"types": "./dist/at-panel/model.d.ts",
|
|
18
|
+
"import": "./dist/at-panel/model.js"
|
|
19
|
+
},
|
|
12
20
|
"./core": {
|
|
13
21
|
"types": "./dist/core/index.d.ts",
|
|
14
22
|
"import": "./dist/core/index.js"
|
|
@@ -36,8 +44,8 @@
|
|
|
36
44
|
"directory": "packages/ui/rich-text"
|
|
37
45
|
},
|
|
38
46
|
"dependencies": {
|
|
39
|
-
"@tutti-os/ui-i18n-runtime": "0.0.
|
|
40
|
-
"@tutti-os/ui-system": "0.0.
|
|
47
|
+
"@tutti-os/ui-i18n-runtime": "0.0.13",
|
|
48
|
+
"@tutti-os/ui-system": "0.0.13",
|
|
41
49
|
"@tiptap/core": "^3.23.6",
|
|
42
50
|
"@tiptap/extension-document": "^3.23.6",
|
|
43
51
|
"@tiptap/extension-hard-break": "^3.23.6",
|
|
@@ -71,6 +79,12 @@
|
|
|
71
79
|
},
|
|
72
80
|
"typesVersions": {
|
|
73
81
|
"*": {
|
|
82
|
+
"at-panel": [
|
|
83
|
+
"./dist/at-panel/index.d.ts"
|
|
84
|
+
],
|
|
85
|
+
"at-panel/model": [
|
|
86
|
+
"./dist/at-panel/model.d.ts"
|
|
87
|
+
],
|
|
74
88
|
"core": [
|
|
75
89
|
"./dist/core/index.d.ts"
|
|
76
90
|
],
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/extensions/names.ts","../src/core/richTextMarkdownLinks.ts","../src/core/richTextDocument.ts"],"sourcesContent":["export const workspaceReferenceNodeName = \"workspaceReference\";\nexport const mentionReferenceNodeName = \"mentionReference\";\n","export interface RichTextMarkdownLinkMatch {\n href: string;\n index: number;\n label: string;\n source: string;\n to: number;\n}\n\nexport function* findRichTextMarkdownLinks(\n value: string\n): Generator<RichTextMarkdownLinkMatch> {\n let cursor = 0;\n\n while (cursor < value.length) {\n const labelStart = value.indexOf(\"[\", cursor);\n if (labelStart < 0) {\n return;\n }\n if (labelStart > 0 && value[labelStart - 1] === \"!\") {\n cursor = labelStart + 1;\n continue;\n }\n\n const labelEnd = findMarkdownLabelEnd(value, labelStart + 1);\n if (labelEnd < 0 || value[labelEnd + 1] !== \"(\") {\n cursor = labelStart + 1;\n continue;\n }\n\n const hrefStart = labelEnd + 2;\n const hrefEnd = findMarkdownHrefEnd(value, hrefStart);\n if (hrefEnd < 0) {\n cursor = labelStart + 1;\n continue;\n }\n\n yield {\n href: unescapeMarkdownLinkText(value.slice(hrefStart, hrefEnd)),\n index: labelStart,\n label: unescapeMarkdownLinkText(value.slice(labelStart + 1, labelEnd)),\n source: value.slice(labelStart, hrefEnd + 1),\n to: hrefEnd + 1\n };\n cursor = hrefEnd + 1;\n }\n}\n\nfunction unescapeMarkdownLinkText(value: string): string {\n return value.replace(/\\\\([\\\\[\\]()])/g, \"$1\");\n}\n\nfunction findMarkdownLabelEnd(value: string, cursor: number): number {\n let escaped = false;\n\n for (let index = cursor; index < value.length; index += 1) {\n const char = value[index];\n if (escaped) {\n escaped = false;\n continue;\n }\n if (char === \"\\\\\") {\n escaped = true;\n continue;\n }\n if (char === \"]\") {\n return index;\n }\n }\n\n return -1;\n}\n\nfunction findMarkdownHrefEnd(value: string, cursor: number): number {\n let escaped = false;\n let depth = 0;\n\n for (let index = cursor; index < value.length; index += 1) {\n const char = value[index];\n if (escaped) {\n escaped = false;\n continue;\n }\n if (char === \"\\\\\") {\n escaped = true;\n continue;\n }\n if (char === \"(\") {\n depth += 1;\n continue;\n }\n if (char !== \")\") {\n continue;\n }\n if (depth === 0) {\n return index;\n }\n depth -= 1;\n }\n\n return -1;\n}\n","import type { JSONContent } from \"@tiptap/core\";\nimport {\n mentionReferenceNodeName,\n workspaceReferenceNodeName\n} from \"../extensions/names.ts\";\nimport type { RichTextMentionAttrs } from \"../types/mention.ts\";\nimport {\n findRichTextMarkdownLinks,\n type RichTextMarkdownLinkMatch\n} from \"./richTextMarkdownLinks.ts\";\n\nexport type RichTextLinkRef = {\n name: string;\n path: string;\n href: string;\n kind: \"file\" | \"folder\";\n};\n\nexport type RichTextLinkInput = {\n name?: string | null;\n path: string;\n kind?: \"file\" | \"folder\";\n};\n\nexport type RichTextMentionRef = RichTextMentionAttrs;\nexport type RichTextDocument = JSONContent;\n\nconst MARKDOWN_IMAGE_PATTERN = /!\\[([^\\]]*)\\]\\(([^)\\s]+)\\)/g;\nconst EXTERNAL_LINK_PREFIX = /^(?:[a-z]+:)?\\/\\//i;\nconst MENTION_LINK_PREFIX = /^mention:\\/\\//i;\nconst MENTION_META_PARAM_PREFIX = \"meta.\";\n\ntype LegacyJSONContentNode = {\n type?: string;\n text?: string;\n attrs?: Record<string, unknown>;\n content?: LegacyJSONContentNode[];\n};\n\nfunction normalizeLineEndings(value: string): string {\n return value.replace(/\\r\\n?/g, \"\\n\");\n}\n\nfunction normalizeContentString(value?: string | null): string {\n const trimmed = normalizeLineEndings(value ?? \"\").trim();\n if (!trimmed) {\n return \"\";\n }\n const markdown = convertLegacyDocumentString(trimmed);\n return markdown || trimmed;\n}\n\nexport function normalizeRichTextContent(value?: string | null): string {\n return normalizeContentString(value);\n}\n\nfunction convertLegacyDocumentString(value: string): string {\n try {\n const parsed = JSON.parse(value) as LegacyJSONContentNode;\n if (parsed?.type !== \"doc\" || !Array.isArray(parsed.content)) {\n return \"\";\n }\n return renderLegacyNodesToMarkdown(parsed.content).trim();\n } catch {\n return \"\";\n }\n}\n\nfunction renderLegacyNodesToMarkdown(nodes: LegacyJSONContentNode[]): string {\n return nodes\n .map((node) => renderLegacyNodeToMarkdown(node))\n .filter((part) => part.length > 0)\n .join(\"\\n\\n\");\n}\n\nfunction renderLegacyNodeToMarkdown(\n node: LegacyJSONContentNode | null | undefined\n): string {\n if (!node) {\n return \"\";\n }\n if (node.type === \"text\") {\n return node.text ?? \"\";\n }\n if (node.type === \"workspaceFileLink\") {\n const attrs = node.attrs ?? {};\n const kind = attrs.kind === \"folder\" ? \"folder\" : \"file\";\n const hrefValue =\n (typeof attrs.href === \"string\" ? attrs.href : undefined) ||\n (typeof attrs.path === \"string\" ? attrs.path : undefined) ||\n \"\";\n const href = normalizeRichTextLinkHref(hrefValue, kind);\n const label =\n (typeof attrs.name === \"string\" ? attrs.name : undefined)?.trim() ||\n href.split(\"/\").filter(Boolean).at(-1) ||\n href;\n return href && label ? `[${label}](${href})` : label;\n }\n if (Array.isArray(node.content)) {\n const inline = node.content\n .map((child) => renderLegacyNodeToMarkdown(child))\n .filter((part) => part.length > 0)\n .join(\"\")\n .trim();\n if (!inline) {\n return \"\";\n }\n if (node.type === \"paragraph\") {\n return inline;\n }\n return inline;\n }\n return \"\";\n}\n\nfunction normalizeWorkspacePath(\n pathOrHref: string,\n kind: \"file\" | \"folder\"\n): string {\n const trimmed = pathOrHref.trim();\n if (!trimmed) {\n return \"\";\n }\n if (kind === \"folder\" && !trimmed.endsWith(\"/\")) {\n return `${trimmed}/`;\n }\n return trimmed;\n}\n\nfunction isWorkspaceReferenceHref(href: string): boolean {\n const trimmed = href.trim();\n if (\n !trimmed ||\n MENTION_LINK_PREFIX.test(trimmed) ||\n EXTERNAL_LINK_PREFIX.test(trimmed)\n ) {\n return false;\n }\n return true;\n}\n\nexport function isRichTextMentionHref(href: string): boolean {\n return MENTION_LINK_PREFIX.test(href.trim());\n}\n\nfunction createMentionQueryParams(\n mention: RichTextMentionAttrs\n): URLSearchParams {\n const params = new URLSearchParams();\n if (mention.kind?.trim()) {\n params.set(\"kind\", mention.kind.trim());\n }\n if (mention.href?.trim()) {\n params.set(\"link\", mention.href.trim());\n }\n if (mention.version?.trim()) {\n params.set(\"v\", mention.version.trim());\n }\n for (const [key, value] of Object.entries(mention.meta ?? {})) {\n const nextKey = key.trim();\n const nextValue = value.trim();\n if (!nextKey || !nextValue) {\n continue;\n }\n params.set(`${MENTION_META_PARAM_PREFIX}${nextKey}`, nextValue);\n }\n return params;\n}\n\nexport function createRichTextMentionHref(\n mention: RichTextMentionAttrs\n): string {\n const plugin = mention.plugin.trim();\n const entityId = mention.entityId.trim();\n if (!plugin || !entityId) {\n return \"\";\n }\n\n const params = createMentionQueryParams(mention);\n const queryString = params.toString();\n const pathname = `${encodeURIComponent(plugin)}/${encodeURIComponent(entityId)}`;\n return queryString\n ? `mention://${pathname}?${queryString}`\n : `mention://${pathname}`;\n}\n\nexport function createRichTextMentionMarkdown(\n mention: RichTextMentionAttrs\n): string {\n const label = mention.label.trim();\n const href = createRichTextMentionHref(mention);\n if (!label || !href) {\n return \"\";\n }\n return `[${label}](${href})`;\n}\n\nexport function parseRichTextMentionHref(\n href: string,\n label?: string | null\n): RichTextMentionRef | null {\n const trimmedHref = href.trim();\n if (!isRichTextMentionHref(trimmedHref)) {\n return null;\n }\n\n try {\n const parsed = new URL(trimmedHref);\n const plugin = decodeURIComponent(parsed.hostname).trim();\n const entityId = decodeURIComponent(\n parsed.pathname.replace(/^\\/+/, \"\")\n ).trim();\n const nextLabel = label?.trim() ?? \"\";\n\n if (!plugin || !entityId || !nextLabel) {\n return null;\n }\n\n const metaEntries = [...parsed.searchParams.entries()]\n .filter(\n ([key, value]) =>\n key.startsWith(MENTION_META_PARAM_PREFIX) && value.trim().length > 0\n )\n .map(\n ([key, value]) =>\n [key.slice(MENTION_META_PARAM_PREFIX.length), value.trim()] as const\n )\n .filter(([key, value]) => key.trim().length > 0 && value.length > 0);\n\n return {\n trigger: \"@\",\n plugin,\n entityId,\n label: nextLabel,\n kind: parsed.searchParams.get(\"kind\")?.trim() || undefined,\n href: parsed.searchParams.get(\"link\")?.trim() || undefined,\n version: parsed.searchParams.get(\"v\")?.trim() || undefined,\n meta: metaEntries.length > 0 ? Object.fromEntries(metaEntries) : undefined\n };\n } catch {\n return null;\n }\n}\n\nexport function normalizeRichTextLinkHref(\n pathOrHref: string,\n kind: \"file\" | \"folder\" = \"file\"\n): string {\n return normalizeWorkspacePath(pathOrHref, kind);\n}\n\nexport function createRichTextLinkMarkdown(input: RichTextLinkInput): string {\n const kind = input.kind === \"folder\" ? \"folder\" : \"file\";\n const href = normalizeRichTextLinkHref(input.path, kind);\n const displayName =\n input.name?.trim() ||\n href.split(\"/\").filter(Boolean).at(-1) ||\n href ||\n input.path.trim();\n if (!href || !displayName) {\n return \"\";\n }\n return `[${escapeMarkdownLinkLabel(displayName)}](${escapeMarkdownLinkHref(href)})`;\n}\n\nexport function appendRichTextLinksToContent(\n value: string | null | undefined,\n refs: readonly RichTextLinkInput[]\n): string {\n const content = normalizeContentString(value);\n const existing = new Set(\n extractRichTextLinksFromContent(content).map((ref) => ref.path)\n );\n const rendered = refs\n .map((ref) => {\n const kind = ref.kind === \"folder\" ? \"folder\" : \"file\";\n const path = normalizeRichTextLinkHref(ref.path, kind);\n if (!path || existing.has(path)) {\n return \"\";\n }\n existing.add(path);\n return createRichTextLinkMarkdown({ ...ref, path, kind });\n })\n .filter(Boolean);\n\n if (rendered.length === 0) {\n return content;\n }\n return content ? `${content} ${rendered.join(\" \")}` : rendered.join(\" \");\n}\n\nexport function extractRichTextLinksFromContent(\n value: string | null | undefined\n): RichTextLinkRef[] {\n const content = normalizeContentString(value);\n const refs = new Map<string, RichTextLinkRef>();\n for (const match of findRichTextMarkdownLinks(content)) {\n const name = match.label.trim();\n const href = match.href.trim();\n if (!name || !isWorkspaceReferenceHref(href)) {\n continue;\n }\n const kind = href.endsWith(\"/\") ? \"folder\" : \"file\";\n const path = normalizeRichTextLinkHref(href, kind);\n if (!path || refs.has(path)) {\n continue;\n }\n refs.set(path, {\n name,\n path,\n href: path,\n kind\n });\n }\n return [...refs.values()];\n}\n\nexport function extractRichTextMentionsFromContent(\n value: string | null | undefined\n): RichTextMentionRef[] {\n const content = normalizeContentString(value);\n const refs = new Map<string, RichTextMentionRef>();\n\n for (const match of findRichTextMarkdownLinks(content)) {\n const label = match.label.trim();\n const href = match.href.trim();\n const mention = parseRichTextMentionHref(href, label);\n if (!mention) {\n continue;\n }\n const mentionKey = `${mention.plugin}:${mention.entityId}`;\n if (refs.has(mentionKey)) {\n continue;\n }\n refs.set(mentionKey, mention);\n }\n\n return [...refs.values()];\n}\n\nexport function removeRichTextMentionFromContent(\n content: string,\n mention: Pick<RichTextMentionAttrs, \"plugin\" | \"entityId\">\n): string {\n const plugin = mention.plugin.trim();\n const entityId = mention.entityId.trim();\n if (!plugin || !entityId) {\n return normalizeContentString(content);\n }\n\n const normalized = normalizeContentString(content);\n const next = replaceRichTextMarkdownLinks(normalized, (match) => {\n const parsedMention = parseRichTextMentionHref(match.href, match.label);\n if (!parsedMention) {\n return match.source;\n }\n return parsedMention.plugin === plugin &&\n parsedMention.entityId === entityId\n ? \"\"\n : match.source;\n });\n\n return next\n .replace(/[ \\t]+\\n/g, \"\\n\")\n .replace(/\\n{3,}/g, \"\\n\\n\")\n .trim();\n}\n\nexport function removeRichTextLinkFromContent(\n content: string,\n path: string\n): string {\n const targetPath = path.trim();\n if (!targetPath) {\n return normalizeContentString(content);\n }\n const normalized = normalizeContentString(content);\n const next = replaceRichTextMarkdownLinks(normalized, (match) => {\n const href = match.href.trim();\n const kind = href.endsWith(\"/\") ? \"folder\" : \"file\";\n const refPath = normalizeRichTextLinkHref(href, kind);\n return refPath === targetPath ? \"\" : match.source;\n });\n return next\n .replace(/[ \\t]+\\n/g, \"\\n\")\n .replace(/\\n[ \\t]+/g, \"\\n\")\n .replace(/[ \\t]{2,}/g, \" \")\n .replace(/\\n{3,}/g, \"\\n\\n\")\n .trim();\n}\n\nexport function extractPlainTextFromContent(value?: string | null): string {\n const content = normalizeContentString(value);\n if (!content) {\n return \"\";\n }\n return replaceRichTextMarkdownLinks(\n content.replace(MARKDOWN_IMAGE_PATTERN, \" $1 \"),\n (match) => ` ${match.label} `\n )\n .replace(/^[\\s>*#+-]+/gm, \" \")\n .replace(/`([^`]+)`/g, \" $1 \")\n .replace(/[*_~]/g, \" \")\n .replace(/\\s+/g, \" \")\n .trim();\n}\n\nexport function extractPlainTextWithoutFilesFromContent(\n value?: string | null\n): string {\n const content = normalizeContentString(value);\n if (!content) {\n return \"\";\n }\n return replaceRichTextMarkdownLinks(\n content.replace(MARKDOWN_IMAGE_PATTERN, \" \"),\n () => \" \"\n )\n .replace(/^[\\s>*#+-]+/gm, \" \")\n .replace(/`([^`]+)`/g, \" $1 \")\n .replace(/[*_~]/g, \" \")\n .replace(/\\s+/g, \" \")\n .trim();\n}\n\nexport function parseRichTextContentToDocument(\n value?: string | null\n): RichTextDocument {\n const content = normalizeContentString(value);\n if (!content) {\n return {\n type: \"doc\",\n content: [{ type: \"paragraph\" }]\n };\n }\n\n const paragraphs = content\n .split(/\\n{2,}/)\n .map((paragraph) => createRichTextParagraphNode(paragraph))\n .filter((paragraph) => Array.isArray(paragraph.content));\n\n return {\n type: \"doc\",\n content: paragraphs.length > 0 ? paragraphs : [{ type: \"paragraph\" }]\n };\n}\n\nexport function serializeRichTextDocumentToContent(\n document: RichTextDocument\n): string {\n const paragraphs = (document.content ?? [])\n .map((node) => serializeRichTextBlockNode(node))\n .filter((value) => value.length > 0);\n\n return paragraphs.join(\"\\n\\n\").trim();\n}\n\nfunction createRichTextParagraphNode(paragraph: string): JSONContent {\n return {\n type: \"paragraph\",\n content: createRichTextInlineNodes(paragraph)\n };\n}\n\nfunction createRichTextInlineNodes(text: string): JSONContent[] {\n const content: JSONContent[] = [];\n let cursor = 0;\n\n for (const match of findRichTextMarkdownLinks(text)) {\n const { index, source } = match;\n if (index > cursor) {\n appendPlainTextNodes(content, text.slice(cursor, index));\n }\n\n const label = match.label.trim();\n const href = match.href.trim();\n const mention = parseRichTextMentionHref(href, label);\n if (mention) {\n content.push({\n type: mentionReferenceNodeName,\n attrs: mention\n });\n } else if (label && isWorkspaceReferenceHref(href)) {\n const kind = href.endsWith(\"/\") ? \"folder\" : \"file\";\n content.push({\n type: workspaceReferenceNodeName,\n attrs: {\n kind,\n label,\n path: normalizeRichTextLinkHref(href, kind)\n }\n });\n } else {\n appendPlainTextNodes(content, source);\n }\n\n cursor = match.to;\n }\n\n if (cursor < text.length) {\n appendPlainTextNodes(content, text.slice(cursor));\n }\n\n return content;\n}\n\nfunction replaceRichTextMarkdownLinks(\n value: string,\n replace: (match: RichTextMarkdownLinkMatch) => string\n): string {\n let nextValue = \"\";\n let cursor = 0;\n\n for (const match of findRichTextMarkdownLinks(value)) {\n nextValue += value.slice(cursor, match.index);\n nextValue += replace(match);\n cursor = match.to;\n }\n\n return `${nextValue}${value.slice(cursor)}`;\n}\n\nfunction escapeMarkdownLinkLabel(value: string): string {\n return value.replace(/[\\\\[\\]]/g, \"\\\\$&\");\n}\n\nfunction escapeMarkdownLinkHref(value: string): string {\n return value.replace(/[\\\\()]/g, \"\\\\$&\");\n}\n\nfunction appendPlainTextNodes(content: JSONContent[], text: string): void {\n if (!text) {\n return;\n }\n\n const lines = text.split(\"\\n\");\n lines.forEach((line, index) => {\n if (line.length > 0) {\n content.push({\n type: \"text\",\n text: line\n });\n }\n if (index < lines.length - 1) {\n content.push({ type: \"hardBreak\" });\n }\n });\n}\n\nfunction serializeRichTextBlockNode(node: JSONContent): string {\n if (node.type === \"paragraph\") {\n return serializeRichTextInlineNodes(node.content ?? []);\n }\n return serializeRichTextInlineNodes(node.content ?? []);\n}\n\nfunction serializeRichTextInlineNodes(nodes: readonly JSONContent[]): string {\n return nodes\n .map((node) => {\n if (node.type === \"text\") {\n return typeof node.text === \"string\" ? node.text : \"\";\n }\n if (node.type === \"hardBreak\") {\n return \"\\n\";\n }\n if (node.type === workspaceReferenceNodeName) {\n const attrs = node.attrs ?? {};\n return createRichTextLinkMarkdown({\n kind: attrs.kind === \"folder\" ? \"folder\" : \"file\",\n name: typeof attrs.label === \"string\" ? attrs.label : \"\",\n path: typeof attrs.path === \"string\" ? attrs.path : \"\"\n });\n }\n if (node.type === mentionReferenceNodeName) {\n const attrs = node.attrs ?? {};\n const label = typeof attrs.label === \"string\" ? attrs.label.trim() : \"\";\n const plugin =\n typeof attrs.plugin === \"string\" ? attrs.plugin.trim() : \"\";\n const entityId =\n typeof attrs.entityId === \"string\" ? attrs.entityId.trim() : \"\";\n if (!label || !plugin || !entityId) {\n return \"\";\n }\n return createRichTextMentionMarkdown({\n entityId,\n href: typeof attrs.href === \"string\" ? attrs.href : undefined,\n kind: typeof attrs.kind === \"string\" ? attrs.kind : undefined,\n label,\n meta:\n attrs.meta && typeof attrs.meta === \"object\"\n ? (attrs.meta as Record<string, string>)\n : undefined,\n plugin,\n trigger: \"@\",\n version: typeof attrs.version === \"string\" ? attrs.version : undefined\n });\n }\n\n if (Array.isArray(node.content)) {\n return serializeRichTextInlineNodes(node.content);\n }\n\n return \"\";\n })\n .join(\"\");\n}\n"],"mappings":";AAAO,IAAM,6BAA6B;AACnC,IAAM,2BAA2B;;;ACOjC,UAAU,0BACf,OACsC;AACtC,MAAI,SAAS;AAEb,SAAO,SAAS,MAAM,QAAQ;AAC5B,UAAM,aAAa,MAAM,QAAQ,KAAK,MAAM;AAC5C,QAAI,aAAa,GAAG;AAClB;AAAA,IACF;AACA,QAAI,aAAa,KAAK,MAAM,aAAa,CAAC,MAAM,KAAK;AACnD,eAAS,aAAa;AACtB;AAAA,IACF;AAEA,UAAM,WAAW,qBAAqB,OAAO,aAAa,CAAC;AAC3D,QAAI,WAAW,KAAK,MAAM,WAAW,CAAC,MAAM,KAAK;AAC/C,eAAS,aAAa;AACtB;AAAA,IACF;AAEA,UAAM,YAAY,WAAW;AAC7B,UAAM,UAAU,oBAAoB,OAAO,SAAS;AACpD,QAAI,UAAU,GAAG;AACf,eAAS,aAAa;AACtB;AAAA,IACF;AAEA,UAAM;AAAA,MACJ,MAAM,yBAAyB,MAAM,MAAM,WAAW,OAAO,CAAC;AAAA,MAC9D,OAAO;AAAA,MACP,OAAO,yBAAyB,MAAM,MAAM,aAAa,GAAG,QAAQ,CAAC;AAAA,MACrE,QAAQ,MAAM,MAAM,YAAY,UAAU,CAAC;AAAA,MAC3C,IAAI,UAAU;AAAA,IAChB;AACA,aAAS,UAAU;AAAA,EACrB;AACF;AAEA,SAAS,yBAAyB,OAAuB;AACvD,SAAO,MAAM,QAAQ,kBAAkB,IAAI;AAC7C;AAEA,SAAS,qBAAqB,OAAe,QAAwB;AACnE,MAAI,UAAU;AAEd,WAAS,QAAQ,QAAQ,QAAQ,MAAM,QAAQ,SAAS,GAAG;AACzD,UAAM,OAAO,MAAM,KAAK;AACxB,QAAI,SAAS;AACX,gBAAU;AACV;AAAA,IACF;AACA,QAAI,SAAS,MAAM;AACjB,gBAAU;AACV;AAAA,IACF;AACA,QAAI,SAAS,KAAK;AAChB,aAAO;AAAA,IACT;AAAA,EACF;AAEA,SAAO;AACT;AAEA,SAAS,oBAAoB,OAAe,QAAwB;AAClE,MAAI,UAAU;AACd,MAAI,QAAQ;AAEZ,WAAS,QAAQ,QAAQ,QAAQ,MAAM,QAAQ,SAAS,GAAG;AACzD,UAAM,OAAO,MAAM,KAAK;AACxB,QAAI,SAAS;AACX,gBAAU;AACV;AAAA,IACF;AACA,QAAI,SAAS,MAAM;AACjB,gBAAU;AACV;AAAA,IACF;AACA,QAAI,SAAS,KAAK;AAChB,eAAS;AACT;AAAA,IACF;AACA,QAAI,SAAS,KAAK;AAChB;AAAA,IACF;AACA,QAAI,UAAU,GAAG;AACf,aAAO;AAAA,IACT;AACA,aAAS;AAAA,EACX;AAEA,SAAO;AACT;;;ACzEA,IAAM,yBAAyB;AAC/B,IAAM,uBAAuB;AAC7B,IAAM,sBAAsB;AAC5B,IAAM,4BAA4B;AASlC,SAAS,qBAAqB,OAAuB;AACnD,SAAO,MAAM,QAAQ,UAAU,IAAI;AACrC;AAEA,SAAS,uBAAuB,OAA+B;AAC7D,QAAM,UAAU,qBAAqB,SAAS,EAAE,EAAE,KAAK;AACvD,MAAI,CAAC,SAAS;AACZ,WAAO;AAAA,EACT;AACA,QAAM,WAAW,4BAA4B,OAAO;AACpD,SAAO,YAAY;AACrB;AAEO,SAAS,yBAAyB,OAA+B;AACtE,SAAO,uBAAuB,KAAK;AACrC;AAEA,SAAS,4BAA4B,OAAuB;AAC1D,MAAI;AACF,UAAM,SAAS,KAAK,MAAM,KAAK;AAC/B,QAAI,QAAQ,SAAS,SAAS,CAAC,MAAM,QAAQ,OAAO,OAAO,GAAG;AAC5D,aAAO;AAAA,IACT;AACA,WAAO,4BAA4B,OAAO,OAAO,EAAE,KAAK;AAAA,EAC1D,QAAQ;AACN,WAAO;AAAA,EACT;AACF;AAEA,SAAS,4BAA4B,OAAwC;AAC3E,SAAO,MACJ,IAAI,CAAC,SAAS,2BAA2B,IAAI,CAAC,EAC9C,OAAO,CAAC,SAAS,KAAK,SAAS,CAAC,EAChC,KAAK,MAAM;AAChB;AAEA,SAAS,2BACP,MACQ;AACR,MAAI,CAAC,MAAM;AACT,WAAO;AAAA,EACT;AACA,MAAI,KAAK,SAAS,QAAQ;AACxB,WAAO,KAAK,QAAQ;AAAA,EACtB;AACA,MAAI,KAAK,SAAS,qBAAqB;AACrC,UAAM,QAAQ,KAAK,SAAS,CAAC;AAC7B,UAAM,OAAO,MAAM,SAAS,WAAW,WAAW;AAClD,UAAM,aACH,OAAO,MAAM,SAAS,WAAW,MAAM,OAAO,YAC9C,OAAO,MAAM,SAAS,WAAW,MAAM,OAAO,WAC/C;AACF,UAAM,OAAO,0BAA0B,WAAW,IAAI;AACtD,UAAM,SACH,OAAO,MAAM,SAAS,WAAW,MAAM,OAAO,SAAY,KAAK,KAChE,KAAK,MAAM,GAAG,EAAE,OAAO,OAAO,EAAE,GAAG,EAAE,KACrC;AACF,WAAO,QAAQ,QAAQ,IAAI,KAAK,KAAK,IAAI,MAAM;AAAA,EACjD;AACA,MAAI,MAAM,QAAQ,KAAK,OAAO,GAAG;AAC/B,UAAM,SAAS,KAAK,QACjB,IAAI,CAAC,UAAU,2BAA2B,KAAK,CAAC,EAChD,OAAO,CAAC,SAAS,KAAK,SAAS,CAAC,EAChC,KAAK,EAAE,EACP,KAAK;AACR,QAAI,CAAC,QAAQ;AACX,aAAO;AAAA,IACT;AACA,QAAI,KAAK,SAAS,aAAa;AAC7B,aAAO;AAAA,IACT;AACA,WAAO;AAAA,EACT;AACA,SAAO;AACT;AAEA,SAAS,uBACP,YACA,MACQ;AACR,QAAM,UAAU,WAAW,KAAK;AAChC,MAAI,CAAC,SAAS;AACZ,WAAO;AAAA,EACT;AACA,MAAI,SAAS,YAAY,CAAC,QAAQ,SAAS,GAAG,GAAG;AAC/C,WAAO,GAAG,OAAO;AAAA,EACnB;AACA,SAAO;AACT;AAEA,SAAS,yBAAyB,MAAuB;AACvD,QAAM,UAAU,KAAK,KAAK;AAC1B,MACE,CAAC,WACD,oBAAoB,KAAK,OAAO,KAChC,qBAAqB,KAAK,OAAO,GACjC;AACA,WAAO;AAAA,EACT;AACA,SAAO;AACT;AAEO,SAAS,sBAAsB,MAAuB;AAC3D,SAAO,oBAAoB,KAAK,KAAK,KAAK,CAAC;AAC7C;AAEA,SAAS,yBACP,SACiB;AACjB,QAAM,SAAS,IAAI,gBAAgB;AACnC,MAAI,QAAQ,MAAM,KAAK,GAAG;AACxB,WAAO,IAAI,QAAQ,QAAQ,KAAK,KAAK,CAAC;AAAA,EACxC;AACA,MAAI,QAAQ,MAAM,KAAK,GAAG;AACxB,WAAO,IAAI,QAAQ,QAAQ,KAAK,KAAK,CAAC;AAAA,EACxC;AACA,MAAI,QAAQ,SAAS,KAAK,GAAG;AAC3B,WAAO,IAAI,KAAK,QAAQ,QAAQ,KAAK,CAAC;AAAA,EACxC;AACA,aAAW,CAAC,KAAK,KAAK,KAAK,OAAO,QAAQ,QAAQ,QAAQ,CAAC,CAAC,GAAG;AAC7D,UAAM,UAAU,IAAI,KAAK;AACzB,UAAM,YAAY,MAAM,KAAK;AAC7B,QAAI,CAAC,WAAW,CAAC,WAAW;AAC1B;AAAA,IACF;AACA,WAAO,IAAI,GAAG,yBAAyB,GAAG,OAAO,IAAI,SAAS;AAAA,EAChE;AACA,SAAO;AACT;AAEO,SAAS,0BACd,SACQ;AACR,QAAM,SAAS,QAAQ,OAAO,KAAK;AACnC,QAAM,WAAW,QAAQ,SAAS,KAAK;AACvC,MAAI,CAAC,UAAU,CAAC,UAAU;AACxB,WAAO;AAAA,EACT;AAEA,QAAM,SAAS,yBAAyB,OAAO;AAC/C,QAAM,cAAc,OAAO,SAAS;AACpC,QAAM,WAAW,GAAG,mBAAmB,MAAM,CAAC,IAAI,mBAAmB,QAAQ,CAAC;AAC9E,SAAO,cACH,aAAa,QAAQ,IAAI,WAAW,KACpC,aAAa,QAAQ;AAC3B;AAEO,SAAS,8BACd,SACQ;AACR,QAAM,QAAQ,QAAQ,MAAM,KAAK;AACjC,QAAM,OAAO,0BAA0B,OAAO;AAC9C,MAAI,CAAC,SAAS,CAAC,MAAM;AACnB,WAAO;AAAA,EACT;AACA,SAAO,IAAI,KAAK,KAAK,IAAI;AAC3B;AAEO,SAAS,yBACd,MACA,OAC2B;AAC3B,QAAM,cAAc,KAAK,KAAK;AAC9B,MAAI,CAAC,sBAAsB,WAAW,GAAG;AACvC,WAAO;AAAA,EACT;AAEA,MAAI;AACF,UAAM,SAAS,IAAI,IAAI,WAAW;AAClC,UAAM,SAAS,mBAAmB,OAAO,QAAQ,EAAE,KAAK;AACxD,UAAM,WAAW;AAAA,MACf,OAAO,SAAS,QAAQ,QAAQ,EAAE;AAAA,IACpC,EAAE,KAAK;AACP,UAAM,YAAY,OAAO,KAAK,KAAK;AAEnC,QAAI,CAAC,UAAU,CAAC,YAAY,CAAC,WAAW;AACtC,aAAO;AAAA,IACT;AAEA,UAAM,cAAc,CAAC,GAAG,OAAO,aAAa,QAAQ,CAAC,EAClD;AAAA,MACC,CAAC,CAAC,KAAK,KAAK,MACV,IAAI,WAAW,yBAAyB,KAAK,MAAM,KAAK,EAAE,SAAS;AAAA,IACvE,EACC;AAAA,MACC,CAAC,CAAC,KAAK,KAAK,MACV,CAAC,IAAI,MAAM,0BAA0B,MAAM,GAAG,MAAM,KAAK,CAAC;AAAA,IAC9D,EACC,OAAO,CAAC,CAAC,KAAK,KAAK,MAAM,IAAI,KAAK,EAAE,SAAS,KAAK,MAAM,SAAS,CAAC;AAErE,WAAO;AAAA,MACL,SAAS;AAAA,MACT;AAAA,MACA;AAAA,MACA,OAAO;AAAA,MACP,MAAM,OAAO,aAAa,IAAI,MAAM,GAAG,KAAK,KAAK;AAAA,MACjD,MAAM,OAAO,aAAa,IAAI,MAAM,GAAG,KAAK,KAAK;AAAA,MACjD,SAAS,OAAO,aAAa,IAAI,GAAG,GAAG,KAAK,KAAK;AAAA,MACjD,MAAM,YAAY,SAAS,IAAI,OAAO,YAAY,WAAW,IAAI;AAAA,IACnE;AAAA,EACF,QAAQ;AACN,WAAO;AAAA,EACT;AACF;AAEO,SAAS,0BACd,YACA,OAA0B,QAClB;AACR,SAAO,uBAAuB,YAAY,IAAI;AAChD;AAEO,SAAS,2BAA2B,OAAkC;AAC3E,QAAM,OAAO,MAAM,SAAS,WAAW,WAAW;AAClD,QAAM,OAAO,0BAA0B,MAAM,MAAM,IAAI;AACvD,QAAM,cACJ,MAAM,MAAM,KAAK,KACjB,KAAK,MAAM,GAAG,EAAE,OAAO,OAAO,EAAE,GAAG,EAAE,KACrC,QACA,MAAM,KAAK,KAAK;AAClB,MAAI,CAAC,QAAQ,CAAC,aAAa;AACzB,WAAO;AAAA,EACT;AACA,SAAO,IAAI,wBAAwB,WAAW,CAAC,KAAK,uBAAuB,IAAI,CAAC;AAClF;AAEO,SAAS,6BACd,OACA,MACQ;AACR,QAAM,UAAU,uBAAuB,KAAK;AAC5C,QAAM,WAAW,IAAI;AAAA,IACnB,gCAAgC,OAAO,EAAE,IAAI,CAAC,QAAQ,IAAI,IAAI;AAAA,EAChE;AACA,QAAM,WAAW,KACd,IAAI,CAAC,QAAQ;AACZ,UAAM,OAAO,IAAI,SAAS,WAAW,WAAW;AAChD,UAAM,OAAO,0BAA0B,IAAI,MAAM,IAAI;AACrD,QAAI,CAAC,QAAQ,SAAS,IAAI,IAAI,GAAG;AAC/B,aAAO;AAAA,IACT;AACA,aAAS,IAAI,IAAI;AACjB,WAAO,2BAA2B,EAAE,GAAG,KAAK,MAAM,KAAK,CAAC;AAAA,EAC1D,CAAC,EACA,OAAO,OAAO;AAEjB,MAAI,SAAS,WAAW,GAAG;AACzB,WAAO;AAAA,EACT;AACA,SAAO,UAAU,GAAG,OAAO,IAAI,SAAS,KAAK,GAAG,CAAC,KAAK,SAAS,KAAK,GAAG;AACzE;AAEO,SAAS,gCACd,OACmB;AACnB,QAAM,UAAU,uBAAuB,KAAK;AAC5C,QAAM,OAAO,oBAAI,IAA6B;AAC9C,aAAW,SAAS,0BAA0B,OAAO,GAAG;AACtD,UAAM,OAAO,MAAM,MAAM,KAAK;AAC9B,UAAM,OAAO,MAAM,KAAK,KAAK;AAC7B,QAAI,CAAC,QAAQ,CAAC,yBAAyB,IAAI,GAAG;AAC5C;AAAA,IACF;AACA,UAAM,OAAO,KAAK,SAAS,GAAG,IAAI,WAAW;AAC7C,UAAM,OAAO,0BAA0B,MAAM,IAAI;AACjD,QAAI,CAAC,QAAQ,KAAK,IAAI,IAAI,GAAG;AAC3B;AAAA,IACF;AACA,SAAK,IAAI,MAAM;AAAA,MACb;AAAA,MACA;AAAA,MACA,MAAM;AAAA,MACN;AAAA,IACF,CAAC;AAAA,EACH;AACA,SAAO,CAAC,GAAG,KAAK,OAAO,CAAC;AAC1B;AAEO,SAAS,mCACd,OACsB;AACtB,QAAM,UAAU,uBAAuB,KAAK;AAC5C,QAAM,OAAO,oBAAI,IAAgC;AAEjD,aAAW,SAAS,0BAA0B,OAAO,GAAG;AACtD,UAAM,QAAQ,MAAM,MAAM,KAAK;AAC/B,UAAM,OAAO,MAAM,KAAK,KAAK;AAC7B,UAAM,UAAU,yBAAyB,MAAM,KAAK;AACpD,QAAI,CAAC,SAAS;AACZ;AAAA,IACF;AACA,UAAM,aAAa,GAAG,QAAQ,MAAM,IAAI,QAAQ,QAAQ;AACxD,QAAI,KAAK,IAAI,UAAU,GAAG;AACxB;AAAA,IACF;AACA,SAAK,IAAI,YAAY,OAAO;AAAA,EAC9B;AAEA,SAAO,CAAC,GAAG,KAAK,OAAO,CAAC;AAC1B;AAEO,SAAS,iCACd,SACA,SACQ;AACR,QAAM,SAAS,QAAQ,OAAO,KAAK;AACnC,QAAM,WAAW,QAAQ,SAAS,KAAK;AACvC,MAAI,CAAC,UAAU,CAAC,UAAU;AACxB,WAAO,uBAAuB,OAAO;AAAA,EACvC;AAEA,QAAM,aAAa,uBAAuB,OAAO;AACjD,QAAM,OAAO,6BAA6B,YAAY,CAAC,UAAU;AAC/D,UAAM,gBAAgB,yBAAyB,MAAM,MAAM,MAAM,KAAK;AACtE,QAAI,CAAC,eAAe;AAClB,aAAO,MAAM;AAAA,IACf;AACA,WAAO,cAAc,WAAW,UAC9B,cAAc,aAAa,WACzB,KACA,MAAM;AAAA,EACZ,CAAC;AAED,SAAO,KACJ,QAAQ,aAAa,IAAI,EACzB,QAAQ,WAAW,MAAM,EACzB,KAAK;AACV;AAEO,SAAS,8BACd,SACA,MACQ;AACR,QAAM,aAAa,KAAK,KAAK;AAC7B,MAAI,CAAC,YAAY;AACf,WAAO,uBAAuB,OAAO;AAAA,EACvC;AACA,QAAM,aAAa,uBAAuB,OAAO;AACjD,QAAM,OAAO,6BAA6B,YAAY,CAAC,UAAU;AAC/D,UAAM,OAAO,MAAM,KAAK,KAAK;AAC7B,UAAM,OAAO,KAAK,SAAS,GAAG,IAAI,WAAW;AAC7C,UAAM,UAAU,0BAA0B,MAAM,IAAI;AACpD,WAAO,YAAY,aAAa,KAAK,MAAM;AAAA,EAC7C,CAAC;AACD,SAAO,KACJ,QAAQ,aAAa,IAAI,EACzB,QAAQ,aAAa,IAAI,EACzB,QAAQ,cAAc,GAAG,EACzB,QAAQ,WAAW,MAAM,EACzB,KAAK;AACV;AAEO,SAAS,4BAA4B,OAA+B;AACzE,QAAM,UAAU,uBAAuB,KAAK;AAC5C,MAAI,CAAC,SAAS;AACZ,WAAO;AAAA,EACT;AACA,SAAO;AAAA,IACL,QAAQ,QAAQ,wBAAwB,MAAM;AAAA,IAC9C,CAAC,UAAU,IAAI,MAAM,KAAK;AAAA,EAC5B,EACG,QAAQ,iBAAiB,GAAG,EAC5B,QAAQ,cAAc,MAAM,EAC5B,QAAQ,UAAU,GAAG,EACrB,QAAQ,QAAQ,GAAG,EACnB,KAAK;AACV;AAEO,SAAS,wCACd,OACQ;AACR,QAAM,UAAU,uBAAuB,KAAK;AAC5C,MAAI,CAAC,SAAS;AACZ,WAAO;AAAA,EACT;AACA,SAAO;AAAA,IACL,QAAQ,QAAQ,wBAAwB,GAAG;AAAA,IAC3C,MAAM;AAAA,EACR,EACG,QAAQ,iBAAiB,GAAG,EAC5B,QAAQ,cAAc,MAAM,EAC5B,QAAQ,UAAU,GAAG,EACrB,QAAQ,QAAQ,GAAG,EACnB,KAAK;AACV;AAEO,SAAS,+BACd,OACkB;AAClB,QAAM,UAAU,uBAAuB,KAAK;AAC5C,MAAI,CAAC,SAAS;AACZ,WAAO;AAAA,MACL,MAAM;AAAA,MACN,SAAS,CAAC,EAAE,MAAM,YAAY,CAAC;AAAA,IACjC;AAAA,EACF;AAEA,QAAM,aAAa,QAChB,MAAM,QAAQ,EACd,IAAI,CAAC,cAAc,4BAA4B,SAAS,CAAC,EACzD,OAAO,CAAC,cAAc,MAAM,QAAQ,UAAU,OAAO,CAAC;AAEzD,SAAO;AAAA,IACL,MAAM;AAAA,IACN,SAAS,WAAW,SAAS,IAAI,aAAa,CAAC,EAAE,MAAM,YAAY,CAAC;AAAA,EACtE;AACF;AAEO,SAAS,mCACd,UACQ;AACR,QAAM,cAAc,SAAS,WAAW,CAAC,GACtC,IAAI,CAAC,SAAS,2BAA2B,IAAI,CAAC,EAC9C,OAAO,CAAC,UAAU,MAAM,SAAS,CAAC;AAErC,SAAO,WAAW,KAAK,MAAM,EAAE,KAAK;AACtC;AAEA,SAAS,4BAA4B,WAAgC;AACnE,SAAO;AAAA,IACL,MAAM;AAAA,IACN,SAAS,0BAA0B,SAAS;AAAA,EAC9C;AACF;AAEA,SAAS,0BAA0B,MAA6B;AAC9D,QAAM,UAAyB,CAAC;AAChC,MAAI,SAAS;AAEb,aAAW,SAAS,0BAA0B,IAAI,GAAG;AACnD,UAAM,EAAE,OAAO,OAAO,IAAI;AAC1B,QAAI,QAAQ,QAAQ;AAClB,2BAAqB,SAAS,KAAK,MAAM,QAAQ,KAAK,CAAC;AAAA,IACzD;AAEA,UAAM,QAAQ,MAAM,MAAM,KAAK;AAC/B,UAAM,OAAO,MAAM,KAAK,KAAK;AAC7B,UAAM,UAAU,yBAAyB,MAAM,KAAK;AACpD,QAAI,SAAS;AACX,cAAQ,KAAK;AAAA,QACX,MAAM;AAAA,QACN,OAAO;AAAA,MACT,CAAC;AAAA,IACH,WAAW,SAAS,yBAAyB,IAAI,GAAG;AAClD,YAAM,OAAO,KAAK,SAAS,GAAG,IAAI,WAAW;AAC7C,cAAQ,KAAK;AAAA,QACX,MAAM;AAAA,QACN,OAAO;AAAA,UACL;AAAA,UACA;AAAA,UACA,MAAM,0BAA0B,MAAM,IAAI;AAAA,QAC5C;AAAA,MACF,CAAC;AAAA,IACH,OAAO;AACL,2BAAqB,SAAS,MAAM;AAAA,IACtC;AAEA,aAAS,MAAM;AAAA,EACjB;AAEA,MAAI,SAAS,KAAK,QAAQ;AACxB,yBAAqB,SAAS,KAAK,MAAM,MAAM,CAAC;AAAA,EAClD;AAEA,SAAO;AACT;AAEA,SAAS,6BACP,OACA,SACQ;AACR,MAAI,YAAY;AAChB,MAAI,SAAS;AAEb,aAAW,SAAS,0BAA0B,KAAK,GAAG;AACpD,iBAAa,MAAM,MAAM,QAAQ,MAAM,KAAK;AAC5C,iBAAa,QAAQ,KAAK;AAC1B,aAAS,MAAM;AAAA,EACjB;AAEA,SAAO,GAAG,SAAS,GAAG,MAAM,MAAM,MAAM,CAAC;AAC3C;AAEA,SAAS,wBAAwB,OAAuB;AACtD,SAAO,MAAM,QAAQ,YAAY,MAAM;AACzC;AAEA,SAAS,uBAAuB,OAAuB;AACrD,SAAO,MAAM,QAAQ,WAAW,MAAM;AACxC;AAEA,SAAS,qBAAqB,SAAwB,MAAoB;AACxE,MAAI,CAAC,MAAM;AACT;AAAA,EACF;AAEA,QAAM,QAAQ,KAAK,MAAM,IAAI;AAC7B,QAAM,QAAQ,CAAC,MAAM,UAAU;AAC7B,QAAI,KAAK,SAAS,GAAG;AACnB,cAAQ,KAAK;AAAA,QACX,MAAM;AAAA,QACN,MAAM;AAAA,MACR,CAAC;AAAA,IACH;AACA,QAAI,QAAQ,MAAM,SAAS,GAAG;AAC5B,cAAQ,KAAK,EAAE,MAAM,YAAY,CAAC;AAAA,IACpC;AAAA,EACF,CAAC;AACH;AAEA,SAAS,2BAA2B,MAA2B;AAC7D,MAAI,KAAK,SAAS,aAAa;AAC7B,WAAO,6BAA6B,KAAK,WAAW,CAAC,CAAC;AAAA,EACxD;AACA,SAAO,6BAA6B,KAAK,WAAW,CAAC,CAAC;AACxD;AAEA,SAAS,6BAA6B,OAAuC;AAC3E,SAAO,MACJ,IAAI,CAAC,SAAS;AACb,QAAI,KAAK,SAAS,QAAQ;AACxB,aAAO,OAAO,KAAK,SAAS,WAAW,KAAK,OAAO;AAAA,IACrD;AACA,QAAI,KAAK,SAAS,aAAa;AAC7B,aAAO;AAAA,IACT;AACA,QAAI,KAAK,SAAS,4BAA4B;AAC5C,YAAM,QAAQ,KAAK,SAAS,CAAC;AAC7B,aAAO,2BAA2B;AAAA,QAChC,MAAM,MAAM,SAAS,WAAW,WAAW;AAAA,QAC3C,MAAM,OAAO,MAAM,UAAU,WAAW,MAAM,QAAQ;AAAA,QACtD,MAAM,OAAO,MAAM,SAAS,WAAW,MAAM,OAAO;AAAA,MACtD,CAAC;AAAA,IACH;AACA,QAAI,KAAK,SAAS,0BAA0B;AAC1C,YAAM,QAAQ,KAAK,SAAS,CAAC;AAC7B,YAAM,QAAQ,OAAO,MAAM,UAAU,WAAW,MAAM,MAAM,KAAK,IAAI;AACrE,YAAM,SACJ,OAAO,MAAM,WAAW,WAAW,MAAM,OAAO,KAAK,IAAI;AAC3D,YAAM,WACJ,OAAO,MAAM,aAAa,WAAW,MAAM,SAAS,KAAK,IAAI;AAC/D,UAAI,CAAC,SAAS,CAAC,UAAU,CAAC,UAAU;AAClC,eAAO;AAAA,MACT;AACA,aAAO,8BAA8B;AAAA,QACnC;AAAA,QACA,MAAM,OAAO,MAAM,SAAS,WAAW,MAAM,OAAO;AAAA,QACpD,MAAM,OAAO,MAAM,SAAS,WAAW,MAAM,OAAO;AAAA,QACpD;AAAA,QACA,MACE,MAAM,QAAQ,OAAO,MAAM,SAAS,WAC/B,MAAM,OACP;AAAA,QACN;AAAA,QACA,SAAS;AAAA,QACT,SAAS,OAAO,MAAM,YAAY,WAAW,MAAM,UAAU;AAAA,MAC/D,CAAC;AAAA,IACH;AAEA,QAAI,MAAM,QAAQ,KAAK,OAAO,GAAG;AAC/B,aAAO,6BAA6B,KAAK,OAAO;AAAA,IAClD;AAEA,WAAO;AAAA,EACT,CAAC,EACA,KAAK,EAAE;AACZ;","names":[]}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/plugins/mention.ts","../src/plugins/at.ts","../src/plugins/atRegistry.ts","../src/plugins/mentionRegistry.ts"],"sourcesContent":["import type {\n RichTextMentionAttrs,\n RichTextMentionInsert,\n RichTextMentionPlugin,\n RichTextResolvedMention,\n RichTextResolvedMentionView\n} from \"../types/mention.ts\";\n\nconst richTextMentionTrigger = \"@\";\n\nfunction normalizeOptionalString(value?: string | null): string | undefined {\n const trimmed = value?.trim();\n return trimmed ? trimmed : undefined;\n}\n\nfunction normalizeMentionMeta(\n meta?: Readonly<Record<string, string>> | null\n): Readonly<Record<string, string>> | undefined {\n if (!meta) {\n return undefined;\n }\n\n const nextEntries = Object.entries(meta)\n .map(([key, value]) => [key.trim(), value.trim()] as const)\n .filter(([key, value]) => key.length > 0 && value.length > 0);\n\n if (nextEntries.length === 0) {\n return undefined;\n }\n\n return Object.freeze(Object.fromEntries(nextEntries));\n}\n\nexport function createRichTextMentionAttrs(\n pluginId: string,\n mention: RichTextMentionInsert\n): RichTextMentionAttrs {\n const plugin = pluginId.trim();\n const entityId = mention.entityId.trim();\n const label = mention.label.trim();\n\n if (!plugin) {\n throw new Error(\"Rich text mention plugin id is required.\");\n }\n if (!entityId) {\n throw new Error(\"Rich text mention entityId is required.\");\n }\n if (!label) {\n throw new Error(\"Rich text mention label is required.\");\n }\n\n return {\n trigger: richTextMentionTrigger,\n plugin,\n entityId,\n label,\n href: normalizeOptionalString(mention.href),\n kind: normalizeOptionalString(mention.kind),\n version: normalizeOptionalString(mention.version),\n meta: normalizeMentionMeta(mention.meta)\n };\n}\n\nexport function isRichTextMentionAttrs(\n value: unknown\n): value is RichTextMentionAttrs {\n if (!value || typeof value !== \"object\") {\n return false;\n }\n\n const candidate = value as Partial<RichTextMentionAttrs>;\n return (\n candidate.trigger === richTextMentionTrigger &&\n typeof candidate.plugin === \"string\" &&\n candidate.plugin.trim().length > 0 &&\n typeof candidate.entityId === \"string\" &&\n candidate.entityId.trim().length > 0 &&\n typeof candidate.label === \"string\" &&\n candidate.label.trim().length > 0\n );\n}\n\nexport function getRichTextMentionDisplayText(\n attrs: RichTextMentionAttrs\n): string {\n return `@${attrs.label}`;\n}\n\nexport function resolveRichTextMentionView(\n mention: RichTextMentionAttrs,\n resolved?: RichTextResolvedMention | null\n): RichTextResolvedMentionView {\n const state = resolved?.state ?? \"active\";\n const label = resolved?.label?.trim() || mention.label;\n const href = normalizeOptionalString(resolved?.href);\n const tooltip = normalizeOptionalString(resolved?.tooltip);\n\n return {\n state,\n label,\n tooltip,\n href,\n entity: resolved?.entity,\n interactive: state === \"active\"\n };\n}\n\nexport function createRichTextMentionPlugin<TItem, TResolved = unknown>(\n plugin: RichTextMentionPlugin<TItem, TResolved>\n): RichTextMentionPlugin<TItem, TResolved> {\n const id = plugin.id.trim();\n if (!id) {\n throw new Error(\"Rich text mention plugin id is required.\");\n }\n\n return {\n ...plugin,\n id,\n trigger: richTextMentionTrigger\n };\n}\n","import { createRichTextMentionAttrs } from \"./mention.ts\";\nimport {\n createRichTextMentionMarkdown,\n createRichTextLinkMarkdown\n} from \"../core/richTextDocument.ts\";\nimport type {\n RichTextAtInsertResult,\n RichTextAtProvider,\n RichTextMarkdownLinkInsertResult,\n RichTextMentionAtInsertResult,\n RichTextTextInsertResult\n} from \"../types/at.ts\";\n\nconst richTextAtTrigger = \"@\";\n\nfunction normalizeRequiredString(value: string, fieldName: string): string {\n const trimmed = value.trim();\n if (!trimmed) {\n throw new Error(`Rich text ${fieldName} is required.`);\n }\n return trimmed;\n}\n\nexport function createRichTextTextInsertResult(\n text: string\n): RichTextTextInsertResult {\n return {\n kind: \"text\",\n text\n };\n}\n\nexport function createRichTextMarkdownLinkInsertResult(\n label: string,\n href: string\n): RichTextMarkdownLinkInsertResult {\n return {\n kind: \"markdown-link\",\n label: normalizeRequiredString(label, \"insert label\"),\n href: normalizeRequiredString(href, \"insert href\")\n };\n}\n\nexport function createRichTextMentionInsertResult(\n mention: RichTextMentionAtInsertResult[\"mention\"]\n): RichTextMentionAtInsertResult {\n return {\n kind: \"mention\",\n mention\n };\n}\n\nexport function renderRichTextAtInsertResult(\n providerId: string,\n result: RichTextAtInsertResult\n): string {\n switch (result.kind) {\n case \"mention\":\n return createRichTextMentionMarkdown(\n createRichTextMentionAttrs(providerId, result.mention)\n );\n case \"markdown-link\":\n return createRichTextLinkMarkdown({\n name: result.label,\n path: result.href,\n kind: result.href.endsWith(\"/\") ? \"folder\" : \"file\"\n });\n case \"text\":\n return result.text;\n default:\n return \"\";\n }\n}\n\nexport function createRichTextAtProvider<TItem>(\n provider: RichTextAtProvider<TItem>\n): RichTextAtProvider<TItem> {\n const id = normalizeRequiredString(provider.id, \"provider id\");\n\n return {\n ...provider,\n id,\n trigger: richTextAtTrigger\n };\n}\n","import type {\n RichTextAtProvider,\n RichTextAtQueryInput,\n RichTextAtQueryMatch,\n RichTextAtRegistry\n} from \"../types/at.ts\";\n\nfunction normalizeProviderId(providerId: string): string {\n return providerId.trim();\n}\n\nexport function createRichTextAtRegistry(\n providers: readonly RichTextAtProvider[]\n): RichTextAtRegistry {\n const providerMap = new Map<string, RichTextAtProvider>();\n\n for (const provider of providers) {\n const providerId = normalizeProviderId(provider.id);\n if (!providerId) {\n throw new Error(\"Rich text @ provider id is required.\");\n }\n if (providerMap.has(providerId)) {\n throw new Error(`Duplicate rich text @ provider id: ${providerId}`);\n }\n providerMap.set(providerId, provider);\n }\n\n async function query(\n input: RichTextAtQueryInput\n ): Promise<readonly RichTextAtQueryMatch[]> {\n if (input.abortSignal?.aborted) {\n return [];\n }\n\n const matches = await Promise.all(\n [...providerMap.values()].map(async (provider) => {\n if (input.abortSignal?.aborted) {\n return [];\n }\n const items = await provider.query(input);\n if (input.abortSignal?.aborted) {\n return [];\n }\n return items.map<RichTextAtQueryMatch>((item) => ({\n providerId: provider.id,\n key: provider.getItemKey(item),\n label: provider.getItemLabel(item),\n subtitle: provider.getItemSubtitle?.(item) || undefined,\n keywords: provider.getItemKeywords?.(item),\n item,\n insertResult: provider.toInsertResult(item)\n }));\n })\n );\n\n const flatMatches = matches.flat();\n const limit = input.maxResults;\n if (typeof limit === \"number\" && limit >= 0) {\n return flatMatches.slice(0, limit);\n }\n return flatMatches;\n }\n\n return {\n listProviders: () => [...providerMap.values()],\n getProvider: (providerId: string) =>\n providerMap.get(normalizeProviderId(providerId)),\n query\n };\n}\n","import {\n createRichTextMentionAttrs,\n resolveRichTextMentionView\n} from \"./mention.ts\";\nimport type {\n RichTextMentionPlugin,\n RichTextMentionQueryInput,\n RichTextMentionQueryMatch,\n RichTextMentionRegistry,\n RichTextMentionResolveInput,\n RichTextResolvedMentionView\n} from \"../types/mention.ts\";\n\nfunction normalizePluginId(pluginId: string): string {\n return pluginId.trim();\n}\n\nexport function createRichTextMentionRegistry(\n plugins: readonly RichTextMentionPlugin[]\n): RichTextMentionRegistry {\n const pluginMap = new Map<string, RichTextMentionPlugin>();\n\n for (const plugin of plugins) {\n const pluginId = normalizePluginId(plugin.id);\n if (!pluginId) {\n throw new Error(\"Rich text mention plugin id is required.\");\n }\n if (pluginMap.has(pluginId)) {\n throw new Error(`Duplicate rich text mention plugin id: ${pluginId}`);\n }\n pluginMap.set(pluginId, plugin);\n }\n\n async function query(\n input: RichTextMentionQueryInput\n ): Promise<readonly RichTextMentionQueryMatch[]> {\n const matches = await Promise.all(\n [...pluginMap.values()].map(async (plugin) => {\n const items = await plugin.query(input);\n return items.map<RichTextMentionQueryMatch>((item) => ({\n pluginId: plugin.id,\n key: plugin.getItemKey(item),\n label: plugin.getItemLabel(item),\n subtitle: plugin.getItemSubtitle?.(item) || undefined,\n keywords: plugin.getItemKeywords?.(item),\n item,\n mention: createRichTextMentionAttrs(plugin.id, plugin.toMention(item))\n }));\n })\n );\n\n const flatMatches = matches.flat();\n const limit = input.maxResults;\n if (typeof limit === \"number\" && limit >= 0) {\n return flatMatches.slice(0, limit);\n }\n return flatMatches;\n }\n\n async function resolve(\n input: RichTextMentionResolveInput\n ): Promise<RichTextResolvedMentionView> {\n const plugin = pluginMap.get(input.mention.plugin);\n if (!plugin) {\n return resolveRichTextMentionView(input.mention, {\n state: \"missing\"\n });\n }\n\n if (!plugin.resolveMention) {\n return resolveRichTextMentionView(input.mention, {\n state: \"active\"\n });\n }\n\n return resolveRichTextMentionView(\n input.mention,\n await plugin.resolveMention(input)\n );\n }\n\n return {\n listPlugins: () => [...pluginMap.values()],\n getPlugin: (pluginId: string) => pluginMap.get(normalizePluginId(pluginId)),\n query,\n resolve\n };\n}\n"],"mappings":"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","names":[]}
|