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