tangled
alpha
login
or
join now
leaflet.pub
/
leaflet
289
fork
atom
a tool for shared writing and social publishing
289
fork
atom
overview
issues
27
pulls
pipelines
add autolink plugin to text blocks
awarm.space
1 year ago
6d06d27f
19a78e04
+498
-19
4 changed files
expand all
collapse all
unified
split
components
Blocks
TextBlock
autolink-plugin.ts
index.tsx
package-lock.json
package.json
+193
components/Blocks/TextBlock/autolink-plugin.ts
···
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
···
1
+
// copied from https://github.com/ueberdosis/tiptap/blob/main/packages/extension-link/src/helpers/autolink.ts
2
+
import {
3
+
combineTransactionSteps,
4
+
findChildrenInRange,
5
+
getChangedRanges,
6
+
getMarksBetween,
7
+
NodeWithPos,
8
+
} from "@tiptap/core";
9
+
import { MarkType } from "prosemirror-model";
10
+
import { Plugin, PluginKey } from "prosemirror-state";
11
+
import { MultiToken, tokenize } from "linkifyjs";
12
+
13
+
/**
14
+
* Check if the provided tokens form a valid link structure, which can either be a single link token
15
+
* or a link token surrounded by parentheses or square brackets.
16
+
*
17
+
* This ensures that only complete and valid text is hyperlinked, preventing cases where a valid
18
+
* top-level domain (TLD) is immediately followed by an invalid character, like a number. For
19
+
* example, with the `find` method from Linkify, entering `example.com1` would result in
20
+
* `example.com` being linked and the trailing `1` left as plain text. By using the `tokenize`
21
+
* method, we can perform more comprehensive validation on the input text.
22
+
*/
23
+
function isValidLinkStructure(
24
+
tokens: Array<ReturnType<MultiToken["toObject"]>>,
25
+
) {
26
+
if (tokens.length === 1) {
27
+
return tokens[0].isLink;
28
+
}
29
+
30
+
if (tokens.length === 3 && tokens[1].isLink) {
31
+
return ["()", "[]"].includes(tokens[0].value + tokens[2].value);
32
+
}
33
+
34
+
return false;
35
+
}
36
+
37
+
type AutolinkOptions = {
38
+
type: MarkType;
39
+
defaultProtocol: string;
40
+
shouldAutoLink: (url: string) => boolean;
41
+
};
42
+
43
+
/**
44
+
* This plugin allows you to automatically add links to your editor.
45
+
* @param options The plugin options
46
+
* @returns The plugin instance
47
+
*/
48
+
export function autolink(options: AutolinkOptions): Plugin {
49
+
return new Plugin({
50
+
key: new PluginKey("autolink"),
51
+
appendTransaction: (transactions, oldState, newState) => {
52
+
/**
53
+
* Does the transaction change the document?
54
+
*/
55
+
const docChanges =
56
+
transactions.some((transaction) => transaction.docChanged) &&
57
+
!oldState.doc.eq(newState.doc);
58
+
59
+
/**
60
+
* Prevent autolink if the transaction is not a document change or if the transaction has the meta `preventAutolink`.
61
+
*/
62
+
const preventAutolink = transactions.some((transaction) =>
63
+
transaction.getMeta("preventAutolink"),
64
+
);
65
+
66
+
/**
67
+
* Prevent autolink if the transaction is not a document change
68
+
* or if the transaction has the meta `preventAutolink`.
69
+
*/
70
+
if (!docChanges || preventAutolink) {
71
+
return;
72
+
}
73
+
74
+
const { tr } = newState;
75
+
const transform = combineTransactionSteps(oldState.doc, [
76
+
...transactions,
77
+
]);
78
+
const changes = getChangedRanges(transform);
79
+
80
+
changes.forEach(({ newRange }) => {
81
+
// Now let’s see if we can add new links.
82
+
const nodesInChangedRanges = findChildrenInRange(
83
+
newState.doc,
84
+
newRange,
85
+
(node) => node.isTextblock,
86
+
);
87
+
88
+
let textBlock: NodeWithPos | undefined;
89
+
let textBeforeWhitespace: string | undefined;
90
+
91
+
if (nodesInChangedRanges.length > 1) {
92
+
// Grab the first node within the changed ranges (ex. the first of two paragraphs when hitting enter).
93
+
textBlock = nodesInChangedRanges[0];
94
+
textBeforeWhitespace = newState.doc.textBetween(
95
+
textBlock.pos,
96
+
textBlock.pos + textBlock.node.nodeSize,
97
+
undefined,
98
+
" ",
99
+
);
100
+
} else if (
101
+
nodesInChangedRanges.length &&
102
+
// We want to make sure to include the block seperator argument to treat hard breaks like spaces.
103
+
newState.doc
104
+
.textBetween(newRange.from, newRange.to, " ", " ")
105
+
.endsWith(" ")
106
+
) {
107
+
textBlock = nodesInChangedRanges[0];
108
+
textBeforeWhitespace = newState.doc.textBetween(
109
+
textBlock.pos,
110
+
newRange.to,
111
+
undefined,
112
+
" ",
113
+
);
114
+
}
115
+
116
+
if (textBlock && textBeforeWhitespace) {
117
+
const wordsBeforeWhitespace = textBeforeWhitespace
118
+
.split(" ")
119
+
.filter((s) => s !== "");
120
+
121
+
if (wordsBeforeWhitespace.length <= 0) {
122
+
return false;
123
+
}
124
+
125
+
const lastWordBeforeSpace =
126
+
wordsBeforeWhitespace[wordsBeforeWhitespace.length - 1];
127
+
const lastWordAndBlockOffset =
128
+
textBlock.pos +
129
+
textBeforeWhitespace.lastIndexOf(lastWordBeforeSpace);
130
+
131
+
if (!lastWordBeforeSpace) {
132
+
return false;
133
+
}
134
+
135
+
const linksBeforeSpace = tokenize(lastWordBeforeSpace).map((t) =>
136
+
t.toObject(options.defaultProtocol),
137
+
);
138
+
139
+
if (!isValidLinkStructure(linksBeforeSpace)) {
140
+
return false;
141
+
}
142
+
143
+
linksBeforeSpace
144
+
.filter((link) => link.isLink)
145
+
// Calculate link position.
146
+
.map((link) => ({
147
+
...link,
148
+
from: lastWordAndBlockOffset + link.start + 1,
149
+
to: lastWordAndBlockOffset + link.end + 1,
150
+
}))
151
+
// ignore link inside code mark
152
+
.filter((link) => {
153
+
if (!newState.schema.marks.code) {
154
+
return true;
155
+
}
156
+
157
+
return !newState.doc.rangeHasMark(
158
+
link.from,
159
+
link.to,
160
+
newState.schema.marks.code,
161
+
);
162
+
})
163
+
// check whether should autolink
164
+
.filter((link) => options.shouldAutoLink(link.value))
165
+
// Add link mark.
166
+
.forEach((link) => {
167
+
if (
168
+
getMarksBetween(link.from, link.to, newState.doc).some(
169
+
(item) => item.mark.type === options.type,
170
+
)
171
+
) {
172
+
return;
173
+
}
174
+
175
+
tr.addMark(
176
+
link.from,
177
+
link.to,
178
+
options.type.create({
179
+
href: link.href,
180
+
}),
181
+
);
182
+
});
183
+
}
184
+
});
185
+
186
+
if (!tr.steps.length) {
187
+
return;
188
+
}
189
+
190
+
return tr;
191
+
},
192
+
});
193
+
}
+6
components/Blocks/TextBlock/index.tsx
···
41
import { useHandlePaste } from "./useHandlePaste";
42
import { highlightSelectionPlugin } from "./plugins";
43
import { inputrules } from "./inputRules";
0
44
import {
45
AddSmall,
46
AddTiny,
···
237
inputrules(propsRef, repRef),
238
keymap(baseKeymap),
239
highlightSelectionPlugin,
0
0
0
0
0
240
],
241
}),
242
});
···
41
import { useHandlePaste } from "./useHandlePaste";
42
import { highlightSelectionPlugin } from "./plugins";
43
import { inputrules } from "./inputRules";
44
+
import { autolink } from "./autolink-plugin";
45
import {
46
AddSmall,
47
AddTiny,
···
238
inputrules(propsRef, repRef),
239
keymap(baseKeymap),
240
highlightSelectionPlugin,
241
+
autolink({
242
+
type: schema.marks.link,
243
+
shouldAutoLink: () => true,
244
+
defaultProtocol: "https",
245
+
}),
246
],
247
}),
248
});
+297
-19
package-lock.json
···
22
"@rocicorp/undo": "^0.2.1",
23
"@supabase/ssr": "^0.3.0",
24
"@supabase/supabase-js": "^2.43.2",
0
25
"@types/mdx": "^2.0.13",
26
"@vercel/analytics": "^1.3.1",
27
"@vercel/kv": "^1.0.1",
···
30
"colorjs.io": "^0.5.2",
31
"drizzle-orm": "^0.30.10",
32
"fractional-indexing": "^3.2.0",
0
33
"next": "^14.2.4",
34
"postgres": "^3.4.4",
35
"prosemirror-commands": "^1.5.2",
···
5206
"react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0"
5207
}
5208
},
0
0
0
0
0
0
0
5209
"node_modules/@rocicorp/lock": {
5210
"version": "1.0.3",
5211
"resolved": "https://registry.npmjs.org/@rocicorp/lock/-/lock-1.0.3.tgz",
···
5333
"tslib": "^2.4.0"
5334
}
5335
},
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
5336
"node_modules/@types/acorn": {
5337
"version": "4.0.6",
5338
"resolved": "https://registry.npmjs.org/@types/acorn/-/acorn-4.0.6.tgz",
···
5376
"integrity": "sha512-dRLjCWHYg4oaA77cxO64oO+7JwCwnIzkZPdrrC71jQmQtlhM556pwKo5bUzqvZndkVbeFLIIi+9TC40JNF5hNQ==",
5377
"dev": true
5378
},
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
5379
"node_modules/@types/mdast": {
5380
"version": "4.0.4",
5381
"resolved": "https://registry.npmjs.org/@types/mdast/-/mdast-4.0.4.tgz",
···
5383
"dependencies": {
5384
"@types/unist": "*"
5385
}
0
0
0
0
0
0
0
5386
},
5387
"node_modules/@types/mdx": {
5388
"version": "2.0.13",
···
5746
"node_modules/argparse": {
5747
"version": "2.0.1",
5748
"resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz",
5749
-
"integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==",
5750
-
"dev": true
5751
},
5752
"node_modules/aria-hidden": {
5753
"version": "1.2.4",
···
6473
"engines": {
6474
"node": ">= 0.6"
6475
}
0
0
0
0
0
0
0
6476
},
6477
"node_modules/cross-spawn": {
6478
"version": "7.0.3",
···
7262
"version": "4.0.0",
7263
"resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz",
7264
"integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==",
7265
-
"dev": true,
7266
"engines": {
7267
"node": ">=10"
7268
},
···
9538
"integrity": "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==",
9539
"dev": true
9540
},
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
9541
"node_modules/locate-path": {
9542
"version": "6.0.0",
9543
"resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz",
···
9665
"url": "https://github.com/sponsors/sindresorhus"
9666
}
9667
},
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
9668
"node_modules/markdown-table": {
9669
"version": "3.0.3",
9670
"resolved": "https://registry.npmjs.org/markdown-table/-/markdown-table-3.0.3.tgz",
···
9954
"type": "opencollective",
9955
"url": "https://opencollective.com/unified"
9956
}
0
0
0
0
0
0
0
9957
},
9958
"node_modules/memoizee": {
9959
"version": "0.4.17",
···
11690
"url": "https://github.com/sponsors/wooorm"
11691
}
11692
},
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
11693
"node_modules/prosemirror-commands": {
11694
-
"version": "1.5.2",
11695
-
"resolved": "https://registry.npmjs.org/prosemirror-commands/-/prosemirror-commands-1.5.2.tgz",
11696
-
"integrity": "sha512-hgLcPaakxH8tu6YvVAaILV2tXYsW3rAdDR8WNkeKGcgeMVQg3/TMhPdVoh7iAmfgVjZGtcOSjKiQaoeKjzd2mQ==",
0
11697
"dependencies": {
11698
"prosemirror-model": "^1.0.0",
11699
"prosemirror-state": "^1.0.0",
11700
-
"prosemirror-transform": "^1.0.0"
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
11701
}
11702
},
11703
"node_modules/prosemirror-inputrules": {
···
11718
"w3c-keyname": "^2.2.0"
11719
}
11720
},
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
11721
"node_modules/prosemirror-model": {
11722
-
"version": "1.21.0",
11723
-
"resolved": "https://registry.npmjs.org/prosemirror-model/-/prosemirror-model-1.21.0.tgz",
11724
-
"integrity": "sha512-zLpS1mVCZLA7VTp82P+BfMiYVPcX1/z0Mf3gsjKZtzMWubwn2pN7CceMV0DycjlgE5JeXPR7UF4hJPbBV98oWA==",
0
11725
"dependencies": {
11726
"orderedmap": "^2.0.0"
11727
}
11728
},
11729
"node_modules/prosemirror-schema-basic": {
11730
-
"version": "1.2.2",
11731
-
"resolved": "https://registry.npmjs.org/prosemirror-schema-basic/-/prosemirror-schema-basic-1.2.2.tgz",
11732
-
"integrity": "sha512-/dT4JFEGyO7QnNTe9UaKUhjDXbTNkiWTq/N4VpKaF79bBjSExVV2NXmJpcM7z/gD7mbqNjxbmWW5nf1iNSSGnw==",
0
11733
"dependencies": {
11734
"prosemirror-model": "^1.19.0"
0
0
0
0
0
0
0
0
0
0
0
0
11735
}
11736
},
11737
"node_modules/prosemirror-state": {
···
11744
"prosemirror-view": "^1.27.0"
11745
}
11746
},
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
11747
"node_modules/prosemirror-transform": {
11748
-
"version": "1.9.0",
11749
-
"resolved": "https://registry.npmjs.org/prosemirror-transform/-/prosemirror-transform-1.9.0.tgz",
11750
-
"integrity": "sha512-5UXkr1LIRx3jmpXXNKDhv8OyAOeLTGuXNwdVfg8x27uASna/wQkr9p6fD3eupGOi4PLJfbezxTyi/7fSJypXHg==",
0
11751
"dependencies": {
11752
"prosemirror-model": "^1.21.0"
11753
}
11754
},
11755
"node_modules/prosemirror-view": {
11756
-
"version": "1.33.6",
11757
-
"resolved": "https://registry.npmjs.org/prosemirror-view/-/prosemirror-view-1.33.6.tgz",
11758
-
"integrity": "sha512-zRLUNgLIQfd8IfGprsXxWTjdA8xEAFJe8cDNrOptj6Mop9sj+BMeVbJvceyAYCm5G2dOdT2prctH7K9dfnpIMw==",
0
11759
"dependencies": {
11760
"prosemirror-model": "^1.20.0",
11761
"prosemirror-state": "^1.0.0",
···
11772
"resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz",
11773
"integrity": "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==",
11774
"license": "MIT",
0
0
0
0
0
0
0
0
0
0
11775
"engines": {
11776
"node": ">=6"
11777
}
···
12501
"dependencies": {
12502
"estree-walker": "^0.6.1"
12503
}
0
0
0
0
0
0
0
12504
},
12505
"node_modules/run-parallel": {
12506
"version": "1.2.0",
···
13472
"engines": {
13473
"node": ">=14.17"
13474
}
0
0
0
0
0
0
0
13475
},
13476
"node_modules/unbox-primitive": {
13477
"version": "1.0.2",
···
22
"@rocicorp/undo": "^0.2.1",
23
"@supabase/ssr": "^0.3.0",
24
"@supabase/supabase-js": "^2.43.2",
25
+
"@tiptap/core": "^2.11.5",
26
"@types/mdx": "^2.0.13",
27
"@vercel/analytics": "^1.3.1",
28
"@vercel/kv": "^1.0.1",
···
31
"colorjs.io": "^0.5.2",
32
"drizzle-orm": "^0.30.10",
33
"fractional-indexing": "^3.2.0",
34
+
"linkifyjs": "^4.2.0",
35
"next": "^14.2.4",
36
"postgres": "^3.4.4",
37
"prosemirror-commands": "^1.5.2",
···
5208
"react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0"
5209
}
5210
},
5211
+
"node_modules/@remirror/core-constants": {
5212
+
"version": "3.0.0",
5213
+
"resolved": "https://registry.npmjs.org/@remirror/core-constants/-/core-constants-3.0.0.tgz",
5214
+
"integrity": "sha512-42aWfPrimMfDKDi4YegyS7x+/0tlzaqwPQCULLanv3DMIlu96KTJR0fM5isWX2UViOqlGnX6YFgqWepcX+XMNg==",
5215
+
"license": "MIT",
5216
+
"peer": true
5217
+
},
5218
"node_modules/@rocicorp/lock": {
5219
"version": "1.0.3",
5220
"resolved": "https://registry.npmjs.org/@rocicorp/lock/-/lock-1.0.3.tgz",
···
5342
"tslib": "^2.4.0"
5343
}
5344
},
5345
+
"node_modules/@tiptap/core": {
5346
+
"version": "2.11.5",
5347
+
"resolved": "https://registry.npmjs.org/@tiptap/core/-/core-2.11.5.tgz",
5348
+
"integrity": "sha512-jb0KTdUJaJY53JaN7ooY3XAxHQNoMYti/H6ANo707PsLXVeEqJ9o8+eBup1JU5CuwzrgnDc2dECt2WIGX9f8Jw==",
5349
+
"license": "MIT",
5350
+
"funding": {
5351
+
"type": "github",
5352
+
"url": "https://github.com/sponsors/ueberdosis"
5353
+
},
5354
+
"peerDependencies": {
5355
+
"@tiptap/pm": "^2.7.0"
5356
+
}
5357
+
},
5358
+
"node_modules/@tiptap/pm": {
5359
+
"version": "2.11.5",
5360
+
"resolved": "https://registry.npmjs.org/@tiptap/pm/-/pm-2.11.5.tgz",
5361
+
"integrity": "sha512-z9JFtqc5ZOsdQLd9vRnXfTCQ8v5ADAfRt9Nm7SqP6FUHII8E1hs38ACzf5xursmth/VonJYb5+73Pqxk1hGIPw==",
5362
+
"license": "MIT",
5363
+
"peer": true,
5364
+
"dependencies": {
5365
+
"prosemirror-changeset": "^2.2.1",
5366
+
"prosemirror-collab": "^1.3.1",
5367
+
"prosemirror-commands": "^1.6.2",
5368
+
"prosemirror-dropcursor": "^1.8.1",
5369
+
"prosemirror-gapcursor": "^1.3.2",
5370
+
"prosemirror-history": "^1.4.1",
5371
+
"prosemirror-inputrules": "^1.4.0",
5372
+
"prosemirror-keymap": "^1.2.2",
5373
+
"prosemirror-markdown": "^1.13.1",
5374
+
"prosemirror-menu": "^1.2.4",
5375
+
"prosemirror-model": "^1.23.0",
5376
+
"prosemirror-schema-basic": "^1.2.3",
5377
+
"prosemirror-schema-list": "^1.4.1",
5378
+
"prosemirror-state": "^1.4.3",
5379
+
"prosemirror-tables": "^1.6.3",
5380
+
"prosemirror-trailing-node": "^3.0.0",
5381
+
"prosemirror-transform": "^1.10.2",
5382
+
"prosemirror-view": "^1.37.0"
5383
+
},
5384
+
"funding": {
5385
+
"type": "github",
5386
+
"url": "https://github.com/sponsors/ueberdosis"
5387
+
}
5388
+
},
5389
"node_modules/@types/acorn": {
5390
"version": "4.0.6",
5391
"resolved": "https://registry.npmjs.org/@types/acorn/-/acorn-4.0.6.tgz",
···
5429
"integrity": "sha512-dRLjCWHYg4oaA77cxO64oO+7JwCwnIzkZPdrrC71jQmQtlhM556pwKo5bUzqvZndkVbeFLIIi+9TC40JNF5hNQ==",
5430
"dev": true
5431
},
5432
+
"node_modules/@types/linkify-it": {
5433
+
"version": "5.0.0",
5434
+
"resolved": "https://registry.npmjs.org/@types/linkify-it/-/linkify-it-5.0.0.tgz",
5435
+
"integrity": "sha512-sVDA58zAw4eWAffKOaQH5/5j3XeayukzDk+ewSsnv3p4yJEZHCCzMDiZM8e0OUrRvmpGZ85jf4yDHkHsgBNr9Q==",
5436
+
"license": "MIT",
5437
+
"peer": true
5438
+
},
5439
+
"node_modules/@types/markdown-it": {
5440
+
"version": "14.1.2",
5441
+
"resolved": "https://registry.npmjs.org/@types/markdown-it/-/markdown-it-14.1.2.tgz",
5442
+
"integrity": "sha512-promo4eFwuiW+TfGxhi+0x3czqTYJkG8qB17ZUJiVF10Xm7NLVRSLUsfRTU/6h1e24VvRnXCx+hG7li58lkzog==",
5443
+
"license": "MIT",
5444
+
"peer": true,
5445
+
"dependencies": {
5446
+
"@types/linkify-it": "^5",
5447
+
"@types/mdurl": "^2"
5448
+
}
5449
+
},
5450
"node_modules/@types/mdast": {
5451
"version": "4.0.4",
5452
"resolved": "https://registry.npmjs.org/@types/mdast/-/mdast-4.0.4.tgz",
···
5454
"dependencies": {
5455
"@types/unist": "*"
5456
}
5457
+
},
5458
+
"node_modules/@types/mdurl": {
5459
+
"version": "2.0.0",
5460
+
"resolved": "https://registry.npmjs.org/@types/mdurl/-/mdurl-2.0.0.tgz",
5461
+
"integrity": "sha512-RGdgjQUZba5p6QEFAVx2OGb8rQDL/cPRG7GiedRzMcJ1tYnUANBncjbSB1NRGwbvjcPeikRABz2nshyPk1bhWg==",
5462
+
"license": "MIT",
5463
+
"peer": true
5464
},
5465
"node_modules/@types/mdx": {
5466
"version": "2.0.13",
···
5824
"node_modules/argparse": {
5825
"version": "2.0.1",
5826
"resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz",
5827
+
"integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q=="
0
5828
},
5829
"node_modules/aria-hidden": {
5830
"version": "1.2.4",
···
6550
"engines": {
6551
"node": ">= 0.6"
6552
}
6553
+
},
6554
+
"node_modules/crelt": {
6555
+
"version": "1.0.6",
6556
+
"resolved": "https://registry.npmjs.org/crelt/-/crelt-1.0.6.tgz",
6557
+
"integrity": "sha512-VQ2MBenTq1fWZUH9DJNGti7kKv6EeAuYr3cLwxUWhIu1baTaXh4Ib5W2CqHVqib4/MqbYGJqiL3Zb8GJZr3l4g==",
6558
+
"license": "MIT",
6559
+
"peer": true
6560
},
6561
"node_modules/cross-spawn": {
6562
"version": "7.0.3",
···
7346
"version": "4.0.0",
7347
"resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz",
7348
"integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==",
0
7349
"engines": {
7350
"node": ">=10"
7351
},
···
9621
"integrity": "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==",
9622
"dev": true
9623
},
9624
+
"node_modules/linkify-it": {
9625
+
"version": "5.0.0",
9626
+
"resolved": "https://registry.npmjs.org/linkify-it/-/linkify-it-5.0.0.tgz",
9627
+
"integrity": "sha512-5aHCbzQRADcdP+ATqnDuhhJ/MRIqDkZX5pyjFHRRysS8vZ5AbqGEoFIb6pYHPZ+L/OC2Lc+xT8uHVVR5CAK/wQ==",
9628
+
"license": "MIT",
9629
+
"peer": true,
9630
+
"dependencies": {
9631
+
"uc.micro": "^2.0.0"
9632
+
}
9633
+
},
9634
+
"node_modules/linkifyjs": {
9635
+
"version": "4.2.0",
9636
+
"resolved": "https://registry.npmjs.org/linkifyjs/-/linkifyjs-4.2.0.tgz",
9637
+
"integrity": "sha512-pCj3PrQyATaoTYKHrgWRF3SJwsm61udVh+vuls/Rl6SptiDhgE7ziUIudAedRY9QEfynmM7/RmLEfPUyw1HPCw==",
9638
+
"license": "MIT"
9639
+
},
9640
"node_modules/locate-path": {
9641
"version": "6.0.0",
9642
"resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz",
···
9764
"url": "https://github.com/sponsors/sindresorhus"
9765
}
9766
},
9767
+
"node_modules/markdown-it": {
9768
+
"version": "14.1.0",
9769
+
"resolved": "https://registry.npmjs.org/markdown-it/-/markdown-it-14.1.0.tgz",
9770
+
"integrity": "sha512-a54IwgWPaeBCAAsv13YgmALOF1elABB08FxO9i+r4VFk5Vl4pKokRPeX8u5TCgSsPi6ec1otfLjdOpVcgbpshg==",
9771
+
"license": "MIT",
9772
+
"peer": true,
9773
+
"dependencies": {
9774
+
"argparse": "^2.0.1",
9775
+
"entities": "^4.4.0",
9776
+
"linkify-it": "^5.0.0",
9777
+
"mdurl": "^2.0.0",
9778
+
"punycode.js": "^2.3.1",
9779
+
"uc.micro": "^2.1.0"
9780
+
},
9781
+
"bin": {
9782
+
"markdown-it": "bin/markdown-it.mjs"
9783
+
}
9784
+
},
9785
"node_modules/markdown-table": {
9786
"version": "3.0.3",
9787
"resolved": "https://registry.npmjs.org/markdown-table/-/markdown-table-3.0.3.tgz",
···
10071
"type": "opencollective",
10072
"url": "https://opencollective.com/unified"
10073
}
10074
+
},
10075
+
"node_modules/mdurl": {
10076
+
"version": "2.0.0",
10077
+
"resolved": "https://registry.npmjs.org/mdurl/-/mdurl-2.0.0.tgz",
10078
+
"integrity": "sha512-Lf+9+2r+Tdp5wXDXC4PcIBjTDtq4UKjCPMQhKIuzpJNW0b96kVqSwW0bT7FhRSfmAiFYgP+SCRvdrDozfh0U5w==",
10079
+
"license": "MIT",
10080
+
"peer": true
10081
},
10082
"node_modules/memoizee": {
10083
"version": "0.4.17",
···
11814
"url": "https://github.com/sponsors/wooorm"
11815
}
11816
},
11817
+
"node_modules/prosemirror-changeset": {
11818
+
"version": "2.2.1",
11819
+
"resolved": "https://registry.npmjs.org/prosemirror-changeset/-/prosemirror-changeset-2.2.1.tgz",
11820
+
"integrity": "sha512-J7msc6wbxB4ekDFj+n9gTW/jav/p53kdlivvuppHsrZXCaQdVgRghoZbSS3kwrRyAstRVQ4/+u5k7YfLgkkQvQ==",
11821
+
"license": "MIT",
11822
+
"peer": true,
11823
+
"dependencies": {
11824
+
"prosemirror-transform": "^1.0.0"
11825
+
}
11826
+
},
11827
+
"node_modules/prosemirror-collab": {
11828
+
"version": "1.3.1",
11829
+
"resolved": "https://registry.npmjs.org/prosemirror-collab/-/prosemirror-collab-1.3.1.tgz",
11830
+
"integrity": "sha512-4SnynYR9TTYaQVXd/ieUvsVV4PDMBzrq2xPUWutHivDuOshZXqQ5rGbZM84HEaXKbLdItse7weMGOUdDVcLKEQ==",
11831
+
"license": "MIT",
11832
+
"peer": true,
11833
+
"dependencies": {
11834
+
"prosemirror-state": "^1.0.0"
11835
+
}
11836
+
},
11837
"node_modules/prosemirror-commands": {
11838
+
"version": "1.7.0",
11839
+
"resolved": "https://registry.npmjs.org/prosemirror-commands/-/prosemirror-commands-1.7.0.tgz",
11840
+
"integrity": "sha512-6toodS4R/Aah5pdsrIwnTYPEjW70SlO5a66oo5Kk+CIrgJz3ukOoS+FYDGqvQlAX5PxoGWDX1oD++tn5X3pyRA==",
11841
+
"license": "MIT",
11842
"dependencies": {
11843
"prosemirror-model": "^1.0.0",
11844
"prosemirror-state": "^1.0.0",
11845
+
"prosemirror-transform": "^1.10.2"
11846
+
}
11847
+
},
11848
+
"node_modules/prosemirror-dropcursor": {
11849
+
"version": "1.8.1",
11850
+
"resolved": "https://registry.npmjs.org/prosemirror-dropcursor/-/prosemirror-dropcursor-1.8.1.tgz",
11851
+
"integrity": "sha512-M30WJdJZLyXHi3N8vxN6Zh5O8ZBbQCz0gURTfPmTIBNQ5pxrdU7A58QkNqfa98YEjSAL1HUyyU34f6Pm5xBSGw==",
11852
+
"license": "MIT",
11853
+
"peer": true,
11854
+
"dependencies": {
11855
+
"prosemirror-state": "^1.0.0",
11856
+
"prosemirror-transform": "^1.1.0",
11857
+
"prosemirror-view": "^1.1.0"
11858
+
}
11859
+
},
11860
+
"node_modules/prosemirror-gapcursor": {
11861
+
"version": "1.3.2",
11862
+
"resolved": "https://registry.npmjs.org/prosemirror-gapcursor/-/prosemirror-gapcursor-1.3.2.tgz",
11863
+
"integrity": "sha512-wtjswVBd2vaQRrnYZaBCbyDqr232Ed4p2QPtRIUK5FuqHYKGWkEwl08oQM4Tw7DOR0FsasARV5uJFvMZWxdNxQ==",
11864
+
"license": "MIT",
11865
+
"peer": true,
11866
+
"dependencies": {
11867
+
"prosemirror-keymap": "^1.0.0",
11868
+
"prosemirror-model": "^1.0.0",
11869
+
"prosemirror-state": "^1.0.0",
11870
+
"prosemirror-view": "^1.0.0"
11871
+
}
11872
+
},
11873
+
"node_modules/prosemirror-history": {
11874
+
"version": "1.4.1",
11875
+
"resolved": "https://registry.npmjs.org/prosemirror-history/-/prosemirror-history-1.4.1.tgz",
11876
+
"integrity": "sha512-2JZD8z2JviJrboD9cPuX/Sv/1ChFng+xh2tChQ2X4bB2HeK+rra/bmJ3xGntCcjhOqIzSDG6Id7e8RJ9QPXLEQ==",
11877
+
"license": "MIT",
11878
+
"peer": true,
11879
+
"dependencies": {
11880
+
"prosemirror-state": "^1.2.2",
11881
+
"prosemirror-transform": "^1.0.0",
11882
+
"prosemirror-view": "^1.31.0",
11883
+
"rope-sequence": "^1.3.0"
11884
}
11885
},
11886
"node_modules/prosemirror-inputrules": {
···
11901
"w3c-keyname": "^2.2.0"
11902
}
11903
},
11904
+
"node_modules/prosemirror-markdown": {
11905
+
"version": "1.13.1",
11906
+
"resolved": "https://registry.npmjs.org/prosemirror-markdown/-/prosemirror-markdown-1.13.1.tgz",
11907
+
"integrity": "sha512-Sl+oMfMtAjWtlcZoj/5L/Q39MpEnVZ840Xo330WJWUvgyhNmLBLN7MsHn07s53nG/KImevWHSE6fEj4q/GihHw==",
11908
+
"license": "MIT",
11909
+
"peer": true,
11910
+
"dependencies": {
11911
+
"@types/markdown-it": "^14.0.0",
11912
+
"markdown-it": "^14.0.0",
11913
+
"prosemirror-model": "^1.20.0"
11914
+
}
11915
+
},
11916
+
"node_modules/prosemirror-menu": {
11917
+
"version": "1.2.4",
11918
+
"resolved": "https://registry.npmjs.org/prosemirror-menu/-/prosemirror-menu-1.2.4.tgz",
11919
+
"integrity": "sha512-S/bXlc0ODQup6aiBbWVsX/eM+xJgCTAfMq/nLqaO5ID/am4wS0tTCIkzwytmao7ypEtjj39i7YbJjAgO20mIqA==",
11920
+
"license": "MIT",
11921
+
"peer": true,
11922
+
"dependencies": {
11923
+
"crelt": "^1.0.0",
11924
+
"prosemirror-commands": "^1.0.0",
11925
+
"prosemirror-history": "^1.0.0",
11926
+
"prosemirror-state": "^1.0.0"
11927
+
}
11928
+
},
11929
"node_modules/prosemirror-model": {
11930
+
"version": "1.24.1",
11931
+
"resolved": "https://registry.npmjs.org/prosemirror-model/-/prosemirror-model-1.24.1.tgz",
11932
+
"integrity": "sha512-YM053N+vTThzlWJ/AtPtF1j0ebO36nvbmDy4U7qA2XQB8JVaQp1FmB9Jhrps8s+z+uxhhVTny4m20ptUvhk0Mg==",
11933
+
"license": "MIT",
11934
"dependencies": {
11935
"orderedmap": "^2.0.0"
11936
}
11937
},
11938
"node_modules/prosemirror-schema-basic": {
11939
+
"version": "1.2.3",
11940
+
"resolved": "https://registry.npmjs.org/prosemirror-schema-basic/-/prosemirror-schema-basic-1.2.3.tgz",
11941
+
"integrity": "sha512-h+H0OQwZVqMon1PNn0AG9cTfx513zgIG2DY00eJ00Yvgb3UD+GQ/VlWW5rcaxacpCGT1Yx8nuhwXk4+QbXUfJA==",
11942
+
"license": "MIT",
11943
"dependencies": {
11944
"prosemirror-model": "^1.19.0"
11945
+
}
11946
+
},
11947
+
"node_modules/prosemirror-schema-list": {
11948
+
"version": "1.5.0",
11949
+
"resolved": "https://registry.npmjs.org/prosemirror-schema-list/-/prosemirror-schema-list-1.5.0.tgz",
11950
+
"integrity": "sha512-gg1tAfH1sqpECdhIHOA/aLg2VH3ROKBWQ4m8Qp9mBKrOxQRW61zc+gMCI8nh22gnBzd1t2u1/NPLmO3nAa3ssg==",
11951
+
"license": "MIT",
11952
+
"peer": true,
11953
+
"dependencies": {
11954
+
"prosemirror-model": "^1.0.0",
11955
+
"prosemirror-state": "^1.0.0",
11956
+
"prosemirror-transform": "^1.7.3"
11957
}
11958
},
11959
"node_modules/prosemirror-state": {
···
11966
"prosemirror-view": "^1.27.0"
11967
}
11968
},
11969
+
"node_modules/prosemirror-tables": {
11970
+
"version": "1.6.4",
11971
+
"resolved": "https://registry.npmjs.org/prosemirror-tables/-/prosemirror-tables-1.6.4.tgz",
11972
+
"integrity": "sha512-TkDY3Gw52gRFRfRn2f4wJv5WOgAOXLJA2CQJYIJ5+kdFbfj3acR4JUW6LX2e1hiEBiUwvEhzH5a3cZ5YSztpIA==",
11973
+
"license": "MIT",
11974
+
"peer": true,
11975
+
"dependencies": {
11976
+
"prosemirror-keymap": "^1.2.2",
11977
+
"prosemirror-model": "^1.24.1",
11978
+
"prosemirror-state": "^1.4.3",
11979
+
"prosemirror-transform": "^1.10.2",
11980
+
"prosemirror-view": "^1.37.2"
11981
+
}
11982
+
},
11983
+
"node_modules/prosemirror-trailing-node": {
11984
+
"version": "3.0.0",
11985
+
"resolved": "https://registry.npmjs.org/prosemirror-trailing-node/-/prosemirror-trailing-node-3.0.0.tgz",
11986
+
"integrity": "sha512-xiun5/3q0w5eRnGYfNlW1uU9W6x5MoFKWwq/0TIRgt09lv7Hcser2QYV8t4muXbEr+Fwo0geYn79Xs4GKywrRQ==",
11987
+
"license": "MIT",
11988
+
"peer": true,
11989
+
"dependencies": {
11990
+
"@remirror/core-constants": "3.0.0",
11991
+
"escape-string-regexp": "^4.0.0"
11992
+
},
11993
+
"peerDependencies": {
11994
+
"prosemirror-model": "^1.22.1",
11995
+
"prosemirror-state": "^1.4.2",
11996
+
"prosemirror-view": "^1.33.8"
11997
+
}
11998
+
},
11999
"node_modules/prosemirror-transform": {
12000
+
"version": "1.10.2",
12001
+
"resolved": "https://registry.npmjs.org/prosemirror-transform/-/prosemirror-transform-1.10.2.tgz",
12002
+
"integrity": "sha512-2iUq0wv2iRoJO/zj5mv8uDUriOHWzXRnOTVgCzSXnktS/2iQRa3UUQwVlkBlYZFtygw6Nh1+X4mGqoYBINn5KQ==",
12003
+
"license": "MIT",
12004
"dependencies": {
12005
"prosemirror-model": "^1.21.0"
12006
}
12007
},
12008
"node_modules/prosemirror-view": {
12009
+
"version": "1.38.0",
12010
+
"resolved": "https://registry.npmjs.org/prosemirror-view/-/prosemirror-view-1.38.0.tgz",
12011
+
"integrity": "sha512-O45kxXQTaP9wPdXhp8TKqCR+/unS/gnfg9Q93svQcB3j0mlp2XSPAmsPefxHADwzC+fbNS404jqRxm3UQaGvgw==",
12012
+
"license": "MIT",
12013
"dependencies": {
12014
"prosemirror-model": "^1.20.0",
12015
"prosemirror-state": "^1.0.0",
···
12026
"resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz",
12027
"integrity": "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==",
12028
"license": "MIT",
12029
+
"engines": {
12030
+
"node": ">=6"
12031
+
}
12032
+
},
12033
+
"node_modules/punycode.js": {
12034
+
"version": "2.3.1",
12035
+
"resolved": "https://registry.npmjs.org/punycode.js/-/punycode.js-2.3.1.tgz",
12036
+
"integrity": "sha512-uxFIHU0YlHYhDQtV4R9J6a52SLx28BCjT+4ieh7IGbgwVJWO+km431c4yRlREUAsAmt/uMjQUyQHNEPf0M39CA==",
12037
+
"license": "MIT",
12038
+
"peer": true,
12039
"engines": {
12040
"node": ">=6"
12041
}
···
12765
"dependencies": {
12766
"estree-walker": "^0.6.1"
12767
}
12768
+
},
12769
+
"node_modules/rope-sequence": {
12770
+
"version": "1.3.4",
12771
+
"resolved": "https://registry.npmjs.org/rope-sequence/-/rope-sequence-1.3.4.tgz",
12772
+
"integrity": "sha512-UT5EDe2cu2E/6O4igUr5PSFs23nvvukicWHx6GnOPlHAiiYbzNuCRQCuiUdHJQcqKalLKlrYJnjY0ySGsXNQXQ==",
12773
+
"license": "MIT",
12774
+
"peer": true
12775
},
12776
"node_modules/run-parallel": {
12777
"version": "1.2.0",
···
13743
"engines": {
13744
"node": ">=14.17"
13745
}
13746
+
},
13747
+
"node_modules/uc.micro": {
13748
+
"version": "2.1.0",
13749
+
"resolved": "https://registry.npmjs.org/uc.micro/-/uc.micro-2.1.0.tgz",
13750
+
"integrity": "sha512-ARDJmphmdvUk6Glw7y9DQ2bFkKBHwQHLi2lsaH6PPmz/Ka9sFOBsBluozhDltWmnv9u/cF6Rt87znRTPV+yp/A==",
13751
+
"license": "MIT",
13752
+
"peer": true
13753
},
13754
"node_modules/unbox-primitive": {
13755
"version": "1.0.2",
+2
package.json
···
24
"@rocicorp/undo": "^0.2.1",
25
"@supabase/ssr": "^0.3.0",
26
"@supabase/supabase-js": "^2.43.2",
0
27
"@types/mdx": "^2.0.13",
28
"@vercel/analytics": "^1.3.1",
29
"@vercel/kv": "^1.0.1",
···
32
"colorjs.io": "^0.5.2",
33
"drizzle-orm": "^0.30.10",
34
"fractional-indexing": "^3.2.0",
0
35
"next": "^14.2.4",
36
"postgres": "^3.4.4",
37
"prosemirror-commands": "^1.5.2",
···
24
"@rocicorp/undo": "^0.2.1",
25
"@supabase/ssr": "^0.3.0",
26
"@supabase/supabase-js": "^2.43.2",
27
+
"@tiptap/core": "^2.11.5",
28
"@types/mdx": "^2.0.13",
29
"@vercel/analytics": "^1.3.1",
30
"@vercel/kv": "^1.0.1",
···
33
"colorjs.io": "^0.5.2",
34
"drizzle-orm": "^0.30.10",
35
"fractional-indexing": "^3.2.0",
36
+
"linkifyjs": "^4.2.0",
37
"next": "^14.2.4",
38
"postgres": "^3.4.4",
39
"prosemirror-commands": "^1.5.2",