@liveblocks/core 1.8.1 → 1.8.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/index.d.mts +93 -3
- package/dist/index.d.ts +93 -3
- package/dist/index.js +314 -3
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +313 -2
- package/dist/index.mjs.map +1 -1
- package/package.json +2 -2
package/dist/index.mjs
CHANGED
|
@@ -6,7 +6,7 @@ var __export = (target, all) => {
|
|
|
6
6
|
|
|
7
7
|
// src/version.ts
|
|
8
8
|
var PKG_NAME = "@liveblocks/core";
|
|
9
|
-
var PKG_VERSION = "1.8.
|
|
9
|
+
var PKG_VERSION = "1.8.2";
|
|
10
10
|
var PKG_FORMAT = "esm";
|
|
11
11
|
|
|
12
12
|
// src/dupe-detection.ts
|
|
@@ -3065,7 +3065,7 @@ var LiveList = class _LiveList extends AbstractCrdt {
|
|
|
3065
3065
|
this._pool?.assertStorageIsWritable();
|
|
3066
3066
|
if (index < 0 || index >= this._items.length) {
|
|
3067
3067
|
throw new Error(
|
|
3068
|
-
`Cannot delete list item at index "
|
|
3068
|
+
`Cannot delete list item at index "${index}". index should be between 0 and ${this._items.length - 1}`
|
|
3069
3069
|
);
|
|
3070
3070
|
}
|
|
3071
3071
|
const item = this._items[index];
|
|
@@ -6754,6 +6754,315 @@ function stringify(object, ...args) {
|
|
|
6754
6754
|
return JSON.stringify(sortedObject, ...args);
|
|
6755
6755
|
}
|
|
6756
6756
|
|
|
6757
|
+
// src/comments/comment-body.ts
|
|
6758
|
+
function isCommentBodyParagraph(element) {
|
|
6759
|
+
return "type" in element && element.type === "mention";
|
|
6760
|
+
}
|
|
6761
|
+
function isCommentBodyText(element) {
|
|
6762
|
+
return "text" in element && typeof element.text === "string";
|
|
6763
|
+
}
|
|
6764
|
+
function isCommentBodyMention(element) {
|
|
6765
|
+
return "type" in element && element.type === "mention";
|
|
6766
|
+
}
|
|
6767
|
+
function isCommentBodyLink(element) {
|
|
6768
|
+
return "type" in element && element.type === "link";
|
|
6769
|
+
}
|
|
6770
|
+
var commentBodyElementsGuards = {
|
|
6771
|
+
paragraph: isCommentBodyParagraph,
|
|
6772
|
+
text: isCommentBodyText,
|
|
6773
|
+
link: isCommentBodyLink,
|
|
6774
|
+
mention: isCommentBodyMention
|
|
6775
|
+
};
|
|
6776
|
+
var commentBodyElementsTypes = {
|
|
6777
|
+
paragraph: "block",
|
|
6778
|
+
text: "inline",
|
|
6779
|
+
link: "inline",
|
|
6780
|
+
mention: "inline"
|
|
6781
|
+
};
|
|
6782
|
+
function traverseCommentBody(body, elementOrVisitor, possiblyVisitor) {
|
|
6783
|
+
if (!body || !body?.content) {
|
|
6784
|
+
return;
|
|
6785
|
+
}
|
|
6786
|
+
const element = typeof elementOrVisitor === "string" ? elementOrVisitor : void 0;
|
|
6787
|
+
const type = element ? commentBodyElementsTypes[element] : "all";
|
|
6788
|
+
const guard = element ? commentBodyElementsGuards[element] : () => true;
|
|
6789
|
+
const visitor = typeof elementOrVisitor === "function" ? elementOrVisitor : possiblyVisitor;
|
|
6790
|
+
for (const block of body.content) {
|
|
6791
|
+
if (type === "all" || type === "block") {
|
|
6792
|
+
if (guard(block)) {
|
|
6793
|
+
visitor?.(block);
|
|
6794
|
+
}
|
|
6795
|
+
}
|
|
6796
|
+
if (type === "all" || type === "inline") {
|
|
6797
|
+
for (const inline of block.children) {
|
|
6798
|
+
if (guard(inline)) {
|
|
6799
|
+
visitor?.(inline);
|
|
6800
|
+
}
|
|
6801
|
+
}
|
|
6802
|
+
}
|
|
6803
|
+
}
|
|
6804
|
+
}
|
|
6805
|
+
function getMentionedIdsFromCommentBody(body) {
|
|
6806
|
+
const mentionedIds = /* @__PURE__ */ new Set();
|
|
6807
|
+
traverseCommentBody(
|
|
6808
|
+
body,
|
|
6809
|
+
"mention",
|
|
6810
|
+
(mention) => mentionedIds.add(mention.id)
|
|
6811
|
+
);
|
|
6812
|
+
return Array.from(mentionedIds);
|
|
6813
|
+
}
|
|
6814
|
+
async function resolveUsersInCommentBody(body, resolveUsers) {
|
|
6815
|
+
const resolvedUsers = /* @__PURE__ */ new Map();
|
|
6816
|
+
if (!resolveUsers) {
|
|
6817
|
+
return resolvedUsers;
|
|
6818
|
+
}
|
|
6819
|
+
const userIds = getMentionedIdsFromCommentBody(body);
|
|
6820
|
+
const users = await resolveUsers({
|
|
6821
|
+
userIds
|
|
6822
|
+
});
|
|
6823
|
+
for (const [index, userId] of userIds.entries()) {
|
|
6824
|
+
const user = users?.[index];
|
|
6825
|
+
if (user) {
|
|
6826
|
+
resolvedUsers.set(userId, user);
|
|
6827
|
+
}
|
|
6828
|
+
}
|
|
6829
|
+
return resolvedUsers;
|
|
6830
|
+
}
|
|
6831
|
+
var htmlEscapables = {
|
|
6832
|
+
"&": "&",
|
|
6833
|
+
"<": "<",
|
|
6834
|
+
">": ">",
|
|
6835
|
+
'"': """,
|
|
6836
|
+
"'": "'"
|
|
6837
|
+
};
|
|
6838
|
+
var htmlEscapablesRegex = new RegExp(
|
|
6839
|
+
Object.keys(htmlEscapables).map((entity) => `\\${entity}`).join("|"),
|
|
6840
|
+
"g"
|
|
6841
|
+
);
|
|
6842
|
+
function htmlSafe(value) {
|
|
6843
|
+
return new HtmlSafeString([String(value)], []);
|
|
6844
|
+
}
|
|
6845
|
+
function joinHtml(strings) {
|
|
6846
|
+
if (strings.length <= 0) {
|
|
6847
|
+
return new HtmlSafeString([""], []);
|
|
6848
|
+
}
|
|
6849
|
+
return new HtmlSafeString(
|
|
6850
|
+
["", ...Array(strings.length - 1).fill(""), ""],
|
|
6851
|
+
strings
|
|
6852
|
+
);
|
|
6853
|
+
}
|
|
6854
|
+
function escapeHtml(value) {
|
|
6855
|
+
if (value instanceof HtmlSafeString) {
|
|
6856
|
+
return value.toString();
|
|
6857
|
+
}
|
|
6858
|
+
if (Array.isArray(value)) {
|
|
6859
|
+
return joinHtml(value).toString();
|
|
6860
|
+
}
|
|
6861
|
+
return String(value).replace(
|
|
6862
|
+
htmlEscapablesRegex,
|
|
6863
|
+
(character) => htmlEscapables[character]
|
|
6864
|
+
);
|
|
6865
|
+
}
|
|
6866
|
+
var HtmlSafeString = class {
|
|
6867
|
+
constructor(strings, values) {
|
|
6868
|
+
this._strings = strings;
|
|
6869
|
+
this._values = values;
|
|
6870
|
+
}
|
|
6871
|
+
toString() {
|
|
6872
|
+
return this._strings.reduce((result, str, i) => {
|
|
6873
|
+
return result + escapeHtml(nn(this._values[i - 1])) + str;
|
|
6874
|
+
});
|
|
6875
|
+
}
|
|
6876
|
+
};
|
|
6877
|
+
function html(strings, ...values) {
|
|
6878
|
+
return new HtmlSafeString(strings, values);
|
|
6879
|
+
}
|
|
6880
|
+
var markdownEscapables = {
|
|
6881
|
+
_: "\\_",
|
|
6882
|
+
"*": "\\*",
|
|
6883
|
+
"#": "\\#",
|
|
6884
|
+
"`": "\\`",
|
|
6885
|
+
"~": "\\~",
|
|
6886
|
+
"!": "\\!",
|
|
6887
|
+
"|": "\\|",
|
|
6888
|
+
"(": "\\(",
|
|
6889
|
+
")": "\\)",
|
|
6890
|
+
"{": "\\{",
|
|
6891
|
+
"}": "\\}",
|
|
6892
|
+
"[": "\\[",
|
|
6893
|
+
"]": "\\]"
|
|
6894
|
+
};
|
|
6895
|
+
var markdownEscapablesRegex = new RegExp(
|
|
6896
|
+
Object.keys(markdownEscapables).map((entity) => `\\${entity}`).join("|"),
|
|
6897
|
+
"g"
|
|
6898
|
+
);
|
|
6899
|
+
function joinMarkdown(strings) {
|
|
6900
|
+
if (strings.length <= 0) {
|
|
6901
|
+
return new MarkdownSafeString([""], []);
|
|
6902
|
+
}
|
|
6903
|
+
return new MarkdownSafeString(
|
|
6904
|
+
["", ...Array(strings.length - 1).fill(""), ""],
|
|
6905
|
+
strings
|
|
6906
|
+
);
|
|
6907
|
+
}
|
|
6908
|
+
function escapeMarkdown(value) {
|
|
6909
|
+
if (value instanceof MarkdownSafeString) {
|
|
6910
|
+
return value.toString();
|
|
6911
|
+
}
|
|
6912
|
+
if (Array.isArray(value)) {
|
|
6913
|
+
return joinMarkdown(value).toString();
|
|
6914
|
+
}
|
|
6915
|
+
return String(value).replace(
|
|
6916
|
+
markdownEscapablesRegex,
|
|
6917
|
+
(character) => markdownEscapables[character]
|
|
6918
|
+
);
|
|
6919
|
+
}
|
|
6920
|
+
var MarkdownSafeString = class {
|
|
6921
|
+
constructor(strings, values) {
|
|
6922
|
+
this._strings = strings;
|
|
6923
|
+
this._values = values;
|
|
6924
|
+
}
|
|
6925
|
+
toString() {
|
|
6926
|
+
return this._strings.reduce((result, str, i) => {
|
|
6927
|
+
return result + escapeMarkdown(nn(this._values[i - 1])) + str;
|
|
6928
|
+
});
|
|
6929
|
+
}
|
|
6930
|
+
};
|
|
6931
|
+
function markdown(strings, ...values) {
|
|
6932
|
+
return new MarkdownSafeString(strings, values);
|
|
6933
|
+
}
|
|
6934
|
+
function toAbsoluteUrl(url) {
|
|
6935
|
+
if (url.startsWith("http://") || url.startsWith("https://")) {
|
|
6936
|
+
return url;
|
|
6937
|
+
} else if (url.startsWith("www.")) {
|
|
6938
|
+
return "https://" + url;
|
|
6939
|
+
}
|
|
6940
|
+
return;
|
|
6941
|
+
}
|
|
6942
|
+
var stringifyCommentBodyPlainElements = {
|
|
6943
|
+
paragraph: ({ children }) => children,
|
|
6944
|
+
text: ({ element }) => element.text,
|
|
6945
|
+
link: ({ element }) => element.url,
|
|
6946
|
+
mention: ({ element, user }) => {
|
|
6947
|
+
return `@${user?.name ?? element.id}`;
|
|
6948
|
+
}
|
|
6949
|
+
};
|
|
6950
|
+
var stringifyCommentBodyHtmlElements = {
|
|
6951
|
+
paragraph: ({ children }) => {
|
|
6952
|
+
return children ? html`<p>${htmlSafe(children)}</p>` : children;
|
|
6953
|
+
},
|
|
6954
|
+
text: ({ element }) => {
|
|
6955
|
+
let children = element.text;
|
|
6956
|
+
if (!children) {
|
|
6957
|
+
return children;
|
|
6958
|
+
}
|
|
6959
|
+
if (element.bold) {
|
|
6960
|
+
children = html`<strong>${children}</strong>`;
|
|
6961
|
+
}
|
|
6962
|
+
if (element.italic) {
|
|
6963
|
+
children = html`<em>${children}</em>`;
|
|
6964
|
+
}
|
|
6965
|
+
if (element.strikethrough) {
|
|
6966
|
+
children = html`<s>${children}</s>`;
|
|
6967
|
+
}
|
|
6968
|
+
if (element.code) {
|
|
6969
|
+
children = html`<code>${children}</code>`;
|
|
6970
|
+
}
|
|
6971
|
+
return children;
|
|
6972
|
+
},
|
|
6973
|
+
link: ({ element, href }) => {
|
|
6974
|
+
return html`<a href="${href}" target="_blank" rel="noopener noreferrer">${element.url}</a>`;
|
|
6975
|
+
},
|
|
6976
|
+
mention: ({ element, user }) => {
|
|
6977
|
+
return html`<span data-mention>@${user?.name ?? element.id}</span>`;
|
|
6978
|
+
}
|
|
6979
|
+
};
|
|
6980
|
+
var stringifyCommentBodyMarkdownElements = {
|
|
6981
|
+
paragraph: ({ children }) => {
|
|
6982
|
+
return children;
|
|
6983
|
+
},
|
|
6984
|
+
text: ({ element }) => {
|
|
6985
|
+
let children = element.text;
|
|
6986
|
+
if (!children) {
|
|
6987
|
+
return children;
|
|
6988
|
+
}
|
|
6989
|
+
if (element.bold) {
|
|
6990
|
+
children = markdown`**${children}**`;
|
|
6991
|
+
}
|
|
6992
|
+
if (element.italic) {
|
|
6993
|
+
children = markdown`_${children}_`;
|
|
6994
|
+
}
|
|
6995
|
+
if (element.strikethrough) {
|
|
6996
|
+
children = markdown`~~${children}~~`;
|
|
6997
|
+
}
|
|
6998
|
+
if (element.code) {
|
|
6999
|
+
children = markdown`\`${children}\``;
|
|
7000
|
+
}
|
|
7001
|
+
return children;
|
|
7002
|
+
},
|
|
7003
|
+
link: ({ element, href }) => {
|
|
7004
|
+
return markdown`[${element.url}](${href})`;
|
|
7005
|
+
},
|
|
7006
|
+
mention: ({ element, user }) => {
|
|
7007
|
+
return markdown`@${user?.name ?? element.id}`;
|
|
7008
|
+
}
|
|
7009
|
+
};
|
|
7010
|
+
async function stringifyCommentBody(body, options) {
|
|
7011
|
+
const format = options?.format ?? "plain";
|
|
7012
|
+
const separator = options?.separator ?? (format === "markdown" ? "\n\n" : "\n");
|
|
7013
|
+
const elements = {
|
|
7014
|
+
...format === "html" ? stringifyCommentBodyHtmlElements : format === "markdown" ? stringifyCommentBodyMarkdownElements : stringifyCommentBodyPlainElements,
|
|
7015
|
+
...options?.elements
|
|
7016
|
+
};
|
|
7017
|
+
const resolvedUsers = await resolveUsersInCommentBody(
|
|
7018
|
+
body,
|
|
7019
|
+
options?.resolveUsers
|
|
7020
|
+
);
|
|
7021
|
+
const blocks = body.content.flatMap((block, blockIndex) => {
|
|
7022
|
+
switch (block.type) {
|
|
7023
|
+
case "paragraph": {
|
|
7024
|
+
const inlines = block.children.flatMap((inline, inlineIndex) => {
|
|
7025
|
+
if (isCommentBodyMention(inline)) {
|
|
7026
|
+
return inline.id ? [
|
|
7027
|
+
elements.mention(
|
|
7028
|
+
{
|
|
7029
|
+
element: inline,
|
|
7030
|
+
user: resolvedUsers.get(inline.id)
|
|
7031
|
+
},
|
|
7032
|
+
inlineIndex
|
|
7033
|
+
)
|
|
7034
|
+
] : [];
|
|
7035
|
+
}
|
|
7036
|
+
if (isCommentBodyLink(inline)) {
|
|
7037
|
+
return [
|
|
7038
|
+
elements.link(
|
|
7039
|
+
{
|
|
7040
|
+
element: inline,
|
|
7041
|
+
href: toAbsoluteUrl(inline.url) ?? inline.url
|
|
7042
|
+
},
|
|
7043
|
+
inlineIndex
|
|
7044
|
+
)
|
|
7045
|
+
];
|
|
7046
|
+
}
|
|
7047
|
+
if (isCommentBodyText(inline)) {
|
|
7048
|
+
return [elements.text({ element: inline }, inlineIndex)];
|
|
7049
|
+
}
|
|
7050
|
+
return [];
|
|
7051
|
+
});
|
|
7052
|
+
return [
|
|
7053
|
+
elements.paragraph(
|
|
7054
|
+
{ element: block, children: inlines.join("") },
|
|
7055
|
+
blockIndex
|
|
7056
|
+
)
|
|
7057
|
+
];
|
|
7058
|
+
}
|
|
7059
|
+
default:
|
|
7060
|
+
return [];
|
|
7061
|
+
}
|
|
7062
|
+
});
|
|
7063
|
+
return blocks.join(separator);
|
|
7064
|
+
}
|
|
7065
|
+
|
|
6757
7066
|
// src/index.ts
|
|
6758
7067
|
detectDupes(PKG_NAME, PKG_VERSION, PKG_FORMAT);
|
|
6759
7068
|
export {
|
|
@@ -6780,6 +7089,7 @@ export {
|
|
|
6780
7089
|
detectDupes,
|
|
6781
7090
|
errorIf,
|
|
6782
7091
|
freeze,
|
|
7092
|
+
getMentionedIdsFromCommentBody,
|
|
6783
7093
|
isChildCrdt,
|
|
6784
7094
|
isJsonArray,
|
|
6785
7095
|
isJsonObject,
|
|
@@ -6797,6 +7107,7 @@ export {
|
|
|
6797
7107
|
raise,
|
|
6798
7108
|
shallow,
|
|
6799
7109
|
stringify,
|
|
7110
|
+
stringifyCommentBody,
|
|
6800
7111
|
throwUsageError,
|
|
6801
7112
|
toPlainLson,
|
|
6802
7113
|
tryParseJson,
|