@kumwe/studio-rich-text 0.1.0-alpha.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/LICENSE ADDED
@@ -0,0 +1,21 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2026 Kumwe Studio contributors
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.
package/README.md ADDED
@@ -0,0 +1,9 @@
1
+ # `@kumwe/studio-rich-text`
2
+
3
+ Status: pre-Gate-A foundation alpha. Its profile and extension surface remain subject to contract review.
4
+
5
+ A bounded Tiptap/ProseMirror adapter for rich-text leaf fields. It supplies a deliberate extension
6
+ set and validates portable JSON documents; it is not a second page-layout model.
7
+
8
+ Hosts remain responsible for sanitation at trust boundaries and for rendering the stored JSON with
9
+ their own server-side presenter.
@@ -0,0 +1,62 @@
1
+ import type { Extensions } from '@tiptap/core';
2
+ import type { JsonObject } from '@kumwe/studio-protocol';
3
+ export interface StudioRichTextMark {
4
+ attrs?: JsonObject;
5
+ type: string;
6
+ }
7
+ export interface StudioRichTextNode {
8
+ attrs?: JsonObject;
9
+ content?: StudioRichTextNode[];
10
+ marks?: StudioRichTextMark[];
11
+ text?: string;
12
+ type: string;
13
+ }
14
+ export interface StudioRichTextDocument extends StudioRichTextNode {
15
+ content: StudioRichTextNode[];
16
+ type: 'doc';
17
+ }
18
+ export interface StudioRichTextOptions {
19
+ headingLevels?: readonly (1 | 2 | 3 | 4 | 5 | 6)[];
20
+ }
21
+ export interface RichTextSpanProjection {
22
+ end: number;
23
+ marks: string[];
24
+ start: number;
25
+ }
26
+ export interface RichTextEmbedProjection {
27
+ index: number;
28
+ kind: string;
29
+ }
30
+ export interface RichTextBlockProjection {
31
+ embeds: RichTextEmbedProjection[];
32
+ spans: RichTextSpanProjection[];
33
+ text: string;
34
+ type: string;
35
+ }
36
+ export interface StudioRichTextAttributeLimits {
37
+ maximumDepth: number;
38
+ maximumItemsPerArray: number;
39
+ maximumPropertiesPerObject: number;
40
+ maximumStringLength: number;
41
+ maximumTotalBytes: number;
42
+ }
43
+ export interface StudioRichTextProfile {
44
+ allowedAttributes: Readonly<Record<string, readonly string[]>>;
45
+ allowedMarks: readonly string[];
46
+ allowedNodes: readonly string[];
47
+ attributeLimits?: Readonly<Partial<StudioRichTextAttributeLimits>>;
48
+ headingLevels?: readonly (1 | 2 | 3 | 4 | 5 | 6)[];
49
+ maximumDepth: number;
50
+ maximumDocumentBytes?: number;
51
+ maximumMarks?: number;
52
+ maximumMarksPerNode?: number;
53
+ maximumNodes: number;
54
+ maximumTextLength: number;
55
+ }
56
+ export declare const DEFAULT_RICH_TEXT_ATTRIBUTE_LIMITS: Readonly<StudioRichTextAttributeLimits>;
57
+ export declare const DEFAULT_RICH_TEXT_PROFILE: Readonly<StudioRichTextProfile>;
58
+ export declare function createStudioRichTextExtensions(options?: StudioRichTextOptions): Extensions;
59
+ export declare function parseRichTextDocument(value: unknown, profile?: Readonly<StudioRichTextProfile>): StudioRichTextDocument;
60
+ export declare function isRichTextDocumentEmpty(document: StudioRichTextDocument): boolean;
61
+ export declare function projectRichText(document: StudioRichTextDocument): RichTextBlockProjection[];
62
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;AAE/C,OAAO,KAAK,EAAE,UAAU,EAAa,MAAM,wBAAwB,CAAC;AAEpE,MAAM,WAAW,kBAAkB;IACjC,KAAK,CAAC,EAAE,UAAU,CAAC;IACnB,IAAI,EAAE,MAAM,CAAC;CACd;AAED,MAAM,WAAW,kBAAkB;IACjC,KAAK,CAAC,EAAE,UAAU,CAAC;IACnB,OAAO,CAAC,EAAE,kBAAkB,EAAE,CAAC;IAC/B,KAAK,CAAC,EAAE,kBAAkB,EAAE,CAAC;IAC7B,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,IAAI,EAAE,MAAM,CAAC;CACd;AAED,MAAM,WAAW,sBAAuB,SAAQ,kBAAkB;IAChE,OAAO,EAAE,kBAAkB,EAAE,CAAC;IAC9B,IAAI,EAAE,KAAK,CAAC;CACb;AAED,MAAM,WAAW,qBAAqB;IACpC,aAAa,CAAC,EAAE,SAAS,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC;CACpD;AAED,MAAM,WAAW,sBAAsB;IACrC,GAAG,EAAE,MAAM,CAAC;IACZ,KAAK,EAAE,MAAM,EAAE,CAAC;IAChB,KAAK,EAAE,MAAM,CAAC;CACf;AAED,MAAM,WAAW,uBAAuB;IACtC,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,EAAE,MAAM,CAAC;CACd;AAED,MAAM,WAAW,uBAAuB;IACtC,MAAM,EAAE,uBAAuB,EAAE,CAAC;IAClC,KAAK,EAAE,sBAAsB,EAAE,CAAC;IAChC,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;CACd;AAED,MAAM,WAAW,6BAA6B;IAC5C,YAAY,EAAE,MAAM,CAAC;IACrB,oBAAoB,EAAE,MAAM,CAAC;IAC7B,0BAA0B,EAAE,MAAM,CAAC;IACnC,mBAAmB,EAAE,MAAM,CAAC;IAC5B,iBAAiB,EAAE,MAAM,CAAC;CAC3B;AAED,MAAM,WAAW,qBAAqB;IACpC,iBAAiB,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,SAAS,MAAM,EAAE,CAAC,CAAC,CAAC;IAC/D,YAAY,EAAE,SAAS,MAAM,EAAE,CAAC;IAChC,YAAY,EAAE,SAAS,MAAM,EAAE,CAAC;IAChC,eAAe,CAAC,EAAE,QAAQ,CAAC,OAAO,CAAC,6BAA6B,CAAC,CAAC,CAAC;IACnE,aAAa,CAAC,EAAE,SAAS,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC;IACnD,YAAY,EAAE,MAAM,CAAC;IACrB,oBAAoB,CAAC,EAAE,MAAM,CAAC;IAC9B,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,mBAAmB,CAAC,EAAE,MAAM,CAAC;IAC7B,YAAY,EAAE,MAAM,CAAC;IACrB,iBAAiB,EAAE,MAAM,CAAC;CAC3B;AAmCD,eAAO,MAAM,kCAAkC,EAAE,QAAQ,CAAC,6BAA6B,CAOnF,CAAC;AAEL,eAAO,MAAM,yBAAyB,EAAE,QAAQ,CAAC,qBAAqB,CAepE,CAAC;AASH,wBAAgB,8BAA8B,CAAC,OAAO,GAAE,qBAA0B,GAAG,UAAU,CAW9F;AAED,wBAAgB,qBAAqB,CACnC,KAAK,EAAE,OAAO,EACd,OAAO,GAAE,QAAQ,CAAC,qBAAqB,CAA6B,GACnE,sBAAsB,CAcxB;AAED,wBAAgB,uBAAuB,CAAC,QAAQ,EAAE,sBAAsB,GAAG,OAAO,CAEjF;AAED,wBAAgB,eAAe,CAAC,QAAQ,EAAE,sBAAsB,GAAG,uBAAuB,EAAE,CAM3F"}
package/dist/index.js ADDED
@@ -0,0 +1,564 @@
1
+ import StarterKit from '@tiptap/starter-kit';
2
+ const PORTABLE_MARKS = Object.freeze(['bold', 'code', 'italic', 'strike']);
3
+ const PORTABLE_NODES = Object.freeze([
4
+ 'blockquote',
5
+ 'bulletList',
6
+ 'doc',
7
+ 'hardBreak',
8
+ 'heading',
9
+ 'horizontalRule',
10
+ 'listItem',
11
+ 'orderedList',
12
+ 'paragraph',
13
+ 'text',
14
+ ]);
15
+ const DEFAULT_HEADING_LEVELS = Object.freeze([2, 3, 4]);
16
+ const DEFAULT_MAXIMUM_DOCUMENT_BYTES = 1_048_576;
17
+ const DEFAULT_MAXIMUM_MARKS = 20_000;
18
+ const DEFAULT_MAXIMUM_MARKS_PER_NODE = PORTABLE_MARKS.length;
19
+ const RICH_TEXT_HARD_LIMITS = Object.freeze({
20
+ maximumDepth: 128,
21
+ maximumDocumentBytes: 10_485_760,
22
+ maximumMarks: 400_000,
23
+ maximumMarksPerNode: PORTABLE_MARKS.length,
24
+ maximumNodes: 100_000,
25
+ maximumTextLength: 10_485_760,
26
+ });
27
+ const ATTRIBUTE_HARD_LIMITS = Object.freeze({
28
+ maximumDepth: 32,
29
+ maximumItemsPerArray: 10_000,
30
+ maximumPropertiesPerObject: 1_000,
31
+ maximumStringLength: 1_048_576,
32
+ maximumTotalBytes: RICH_TEXT_HARD_LIMITS.maximumDocumentBytes,
33
+ });
34
+ export const DEFAULT_RICH_TEXT_ATTRIBUTE_LIMITS = Object.freeze({
35
+ maximumDepth: 8,
36
+ maximumItemsPerArray: 256,
37
+ maximumPropertiesPerObject: 64,
38
+ maximumStringLength: 4_096,
39
+ maximumTotalBytes: 65_536,
40
+ });
41
+ export const DEFAULT_RICH_TEXT_PROFILE = Object.freeze({
42
+ allowedAttributes: Object.freeze({
43
+ heading: Object.freeze(['level']),
44
+ orderedList: Object.freeze(['start']),
45
+ }),
46
+ allowedMarks: PORTABLE_MARKS,
47
+ allowedNodes: PORTABLE_NODES,
48
+ attributeLimits: DEFAULT_RICH_TEXT_ATTRIBUTE_LIMITS,
49
+ headingLevels: DEFAULT_HEADING_LEVELS,
50
+ maximumDepth: 32,
51
+ maximumDocumentBytes: DEFAULT_MAXIMUM_DOCUMENT_BYTES,
52
+ maximumMarks: DEFAULT_MAXIMUM_MARKS,
53
+ maximumMarksPerNode: DEFAULT_MAXIMUM_MARKS_PER_NODE,
54
+ maximumNodes: 5_000,
55
+ maximumTextLength: 250_000,
56
+ });
57
+ export function createStudioRichTextExtensions(options = {}) {
58
+ const headingLevels = options.headingLevels ?? DEFAULT_HEADING_LEVELS;
59
+ validateHeadingLevels(headingLevels);
60
+ return [
61
+ StarterKit.configure({
62
+ codeBlock: false,
63
+ heading: { levels: [...headingLevels] },
64
+ link: false,
65
+ underline: false,
66
+ }),
67
+ ];
68
+ }
69
+ export function parseRichTextDocument(value, profile = DEFAULT_RICH_TEXT_PROFILE) {
70
+ validateProfile(profile);
71
+ const state = { attributeBytes: 0, markCount: 0, nodeCount: 0, textLength: 0 };
72
+ const attributeLimits = resolveAttributeLimits(profile);
73
+ const node = parseNode(value, '$', 1, profile, attributeLimits, state);
74
+ if (node.type !== 'doc') {
75
+ throw new TypeError('Rich-text document root must have type "doc".');
76
+ }
77
+ const document = { ...node, content: node.content ?? [], type: 'doc' };
78
+ const serialized = JSON.stringify(document);
79
+ if (utf8ByteLength(serialized) > maximumDocumentBytes(profile)) {
80
+ throw new RangeError('Rich-text document exceeds its total-byte limit.');
81
+ }
82
+ return document;
83
+ }
84
+ export function isRichTextDocumentEmpty(document) {
85
+ return document.content.every((node) => nodeText(node).trim().length === 0);
86
+ }
87
+ export function projectRichText(document) {
88
+ const projections = [];
89
+ for (const block of document.content) {
90
+ collectBlockProjections(block, projections);
91
+ }
92
+ return projections;
93
+ }
94
+ function collectBlockProjections(node, projections) {
95
+ switch (node.type) {
96
+ case 'heading':
97
+ case 'paragraph':
98
+ projections.push(projectLeafBlock(node));
99
+ break;
100
+ case 'horizontalRule':
101
+ projections.push({ embeds: [], spans: [], text: '', type: 'horizontalRule' });
102
+ break;
103
+ case 'blockquote':
104
+ case 'bulletList':
105
+ case 'listItem':
106
+ case 'orderedList':
107
+ for (const child of node.content ?? []) {
108
+ collectBlockProjections(child, projections);
109
+ }
110
+ break;
111
+ default:
112
+ throw new TypeError(`Node type "${node.type}" has no renderer projection.`);
113
+ }
114
+ }
115
+ function projectLeafBlock(node) {
116
+ const embeds = [];
117
+ const spans = [];
118
+ let text = '';
119
+ let offset = 0;
120
+ for (const inline of node.content ?? []) {
121
+ if (inline.type === 'text') {
122
+ const value = inline.text ?? '';
123
+ const length = codePointLength(value);
124
+ const marks = (inline.marks ?? []).map((mark) => mark.type).sort();
125
+ if (marks.length > 0 && length > 0) {
126
+ const previous = spans.at(-1);
127
+ if (previous?.end === offset && sameMarkNames(previous.marks, marks)) {
128
+ previous.end = offset + length;
129
+ }
130
+ else {
131
+ spans.push({ end: offset + length, marks, start: offset });
132
+ }
133
+ }
134
+ text += value;
135
+ offset += length;
136
+ }
137
+ else {
138
+ embeds.push({ index: offset, kind: inline.type });
139
+ }
140
+ }
141
+ return { embeds, spans, text, type: node.type };
142
+ }
143
+ function sameMarkNames(left, right) {
144
+ return left.length === right.length && left.every((name, index) => name === right[index]);
145
+ }
146
+ function codePointLength(value) {
147
+ let length = 0;
148
+ for (let index = 0; index < value.length; index += 1) {
149
+ const code = value.charCodeAt(index);
150
+ if (code >= 0xd800 && code <= 0xdbff) {
151
+ const next = value.charCodeAt(index + 1);
152
+ if (next >= 0xdc00 && next <= 0xdfff) {
153
+ index += 1;
154
+ }
155
+ }
156
+ length += 1;
157
+ }
158
+ return length;
159
+ }
160
+ function parseNode(value, path, depth, profile, attributeLimits, state) {
161
+ if (!isRecord(value)) {
162
+ throw new TypeError(`${path} must be a rich-text node with a non-empty type.`);
163
+ }
164
+ assertKnownKeys(value, path, ['attrs', 'content', 'marks', 'text', 'type']);
165
+ if (typeof value.type !== 'string' || value.type.length === 0) {
166
+ throw new TypeError(`${path} must be a rich-text node with a non-empty type.`);
167
+ }
168
+ if (!profile.allowedNodes.includes(value.type)) {
169
+ throw new TypeError(`${path} uses disallowed node type "${value.type}".`);
170
+ }
171
+ if (depth > profile.maximumDepth) {
172
+ throw new RangeError(`${path} exceeds the rich-text depth limit.`);
173
+ }
174
+ state.nodeCount += 1;
175
+ if (state.nodeCount > profile.maximumNodes) {
176
+ throw new RangeError('Rich-text document exceeds its node limit.');
177
+ }
178
+ const node = { type: value.type };
179
+ if (value.text !== undefined) {
180
+ if (typeof value.text !== 'string') {
181
+ throw new TypeError(`${path}.text must be a string.`);
182
+ }
183
+ node.text = value.text;
184
+ state.textLength += value.text.length;
185
+ if (state.textLength > profile.maximumTextLength) {
186
+ throw new RangeError('Rich-text document exceeds its text-length limit.');
187
+ }
188
+ }
189
+ if (value.attrs !== undefined) {
190
+ node.attrs = parseAttributes(value.attrs, `${path}.attrs`, value.type, profile, attributeLimits, state);
191
+ }
192
+ if (value.content !== undefined) {
193
+ if (!Array.isArray(value.content)) {
194
+ throw new TypeError(`${path}.content must be an array.`);
195
+ }
196
+ assertStructuralArray(value.content, `${path}.content`);
197
+ node.content = value.content.map((child, index) => parseNode(child, `${path}.content[${index}]`, depth + 1, profile, attributeLimits, state));
198
+ }
199
+ if (value.marks !== undefined) {
200
+ if (!Array.isArray(value.marks)) {
201
+ throw new TypeError(`${path}.marks must be an array.`);
202
+ }
203
+ assertStructuralArray(value.marks, `${path}.marks`);
204
+ const maximumPerNode = profile.maximumMarksPerNode ?? DEFAULT_MAXIMUM_MARKS_PER_NODE;
205
+ const maximumMarks = profile.maximumMarks ?? DEFAULT_MAXIMUM_MARKS;
206
+ if (value.marks.length > maximumPerNode) {
207
+ throw new RangeError(`${path}.marks exceeds the per-node mark limit.`);
208
+ }
209
+ if (state.markCount + value.marks.length > maximumMarks) {
210
+ throw new RangeError('Rich-text document exceeds its aggregate mark limit.');
211
+ }
212
+ state.markCount += value.marks.length;
213
+ node.marks = value.marks.map((mark, index) => parseMark(mark, `${path}.marks[${index}]`, profile, attributeLimits, state));
214
+ assertPortableMarkSet(node.marks, `${path}.marks`);
215
+ }
216
+ assertNodeGrammar(node, path, profile);
217
+ return node;
218
+ }
219
+ function parseMark(value, path, profile, attributeLimits, state) {
220
+ if (!isRecord(value)) {
221
+ throw new TypeError(`${path} must be a mark with a non-empty type.`);
222
+ }
223
+ assertKnownKeys(value, path, ['attrs', 'type']);
224
+ if (typeof value.type !== 'string' || value.type.length === 0) {
225
+ throw new TypeError(`${path} must be a mark with a non-empty type.`);
226
+ }
227
+ if (!profile.allowedMarks.includes(value.type)) {
228
+ throw new TypeError(`${path} uses disallowed mark type "${value.type}".`);
229
+ }
230
+ const mark = { type: value.type };
231
+ if (value.attrs !== undefined) {
232
+ mark.attrs = parseAttributes(value.attrs, `${path}.attrs`, `mark:${value.type}`, profile, attributeLimits, state);
233
+ }
234
+ if (mark.attrs !== undefined) {
235
+ throw new TypeError(`${path} cannot carry attributes in the portable rich-text grammar.`);
236
+ }
237
+ return mark;
238
+ }
239
+ function assertNodeGrammar(node, path, profile) {
240
+ switch (node.type) {
241
+ case 'doc':
242
+ assertNoNodeFields(node, path, ['attrs', 'marks', 'text']);
243
+ if (node.content === undefined || node.content.length === 0) {
244
+ throw new TypeError(`${path}.content must contain at least one block node.`);
245
+ }
246
+ assertChildTypes(node.content, path, blockNodeTypes);
247
+ break;
248
+ case 'text':
249
+ assertNoNodeFields(node, path, ['attrs', 'content']);
250
+ if (node.text === undefined) {
251
+ throw new TypeError(`${path}.text is required for a text node.`);
252
+ }
253
+ if (node.text.length === 0) {
254
+ throw new TypeError(`${path}.text cannot be empty.`);
255
+ }
256
+ break;
257
+ case 'paragraph':
258
+ assertNoNodeFields(node, path, ['attrs', 'marks', 'text']);
259
+ assertChildTypes(node.content ?? [], path, inlineNodeTypes);
260
+ break;
261
+ case 'heading': {
262
+ assertNoNodeFields(node, path, ['marks', 'text']);
263
+ assertChildTypes(node.content ?? [], path, inlineNodeTypes);
264
+ const level = node.attrs?.level;
265
+ const levels = profile.headingLevels ?? DEFAULT_HEADING_LEVELS;
266
+ if (typeof level !== 'number' ||
267
+ !Number.isInteger(level) ||
268
+ !levels.includes(level)) {
269
+ throw new TypeError(`${path}.attrs.level must be a configured heading level.`);
270
+ }
271
+ break;
272
+ }
273
+ case 'orderedList': {
274
+ assertNoNodeFields(node, path, ['marks', 'text']);
275
+ assertNonEmptyChildTypes(node.content, path, listItemNodeTypes);
276
+ const start = node.attrs?.start;
277
+ if (start !== undefined && (!Number.isSafeInteger(start) || Number(start) < 1)) {
278
+ throw new TypeError(`${path}.attrs.start must be a positive integer.`);
279
+ }
280
+ break;
281
+ }
282
+ case 'bulletList':
283
+ assertNoNodeFields(node, path, ['attrs', 'marks', 'text']);
284
+ assertNonEmptyChildTypes(node.content, path, listItemNodeTypes);
285
+ break;
286
+ case 'listItem':
287
+ assertNoNodeFields(node, path, ['attrs', 'marks', 'text']);
288
+ assertNonEmptyChildTypes(node.content, path, blockNodeTypes);
289
+ if (node.content?.[0]?.type !== 'paragraph') {
290
+ throw new TypeError(`${path}.content must begin with a paragraph node.`);
291
+ }
292
+ break;
293
+ case 'blockquote':
294
+ assertNoNodeFields(node, path, ['attrs', 'marks', 'text']);
295
+ assertNonEmptyChildTypes(node.content, path, blockNodeTypes);
296
+ break;
297
+ case 'hardBreak':
298
+ case 'horizontalRule':
299
+ assertNoNodeFields(node, path, ['attrs', 'content', 'marks', 'text']);
300
+ break;
301
+ default:
302
+ throw new TypeError(`${path} uses a node without a portable grammar.`);
303
+ }
304
+ }
305
+ function assertPortableMarkSet(marks, path) {
306
+ const types = new Set();
307
+ for (const mark of marks) {
308
+ if (types.has(mark.type)) {
309
+ throw new TypeError(`${path} cannot contain duplicate ${mark.type} marks.`);
310
+ }
311
+ types.add(mark.type);
312
+ }
313
+ if (types.has('code') && types.size > 1) {
314
+ throw new TypeError(`${path} cannot combine code with another mark.`);
315
+ }
316
+ }
317
+ const blockNodeTypes = new Set([
318
+ 'blockquote',
319
+ 'bulletList',
320
+ 'heading',
321
+ 'horizontalRule',
322
+ 'orderedList',
323
+ 'paragraph',
324
+ ]);
325
+ const inlineNodeTypes = new Set(['hardBreak', 'text']);
326
+ const listItemNodeTypes = new Set(['listItem']);
327
+ function assertNoNodeFields(node, path, fields) {
328
+ const present = fields.find((field) => node[field] !== undefined);
329
+ if (present !== undefined) {
330
+ throw new TypeError(`${path}.${present} is not valid on a ${node.type} node.`);
331
+ }
332
+ }
333
+ function assertChildTypes(content, path, allowed) {
334
+ const invalidIndex = content.findIndex((child) => !allowed.has(child.type));
335
+ if (invalidIndex >= 0) {
336
+ throw new TypeError(`${path}.content[${invalidIndex}] is not valid inside this node.`);
337
+ }
338
+ }
339
+ function assertNonEmptyChildTypes(content, path, allowed) {
340
+ if (content === undefined || content.length === 0) {
341
+ throw new TypeError(`${path}.content must contain at least one child node.`);
342
+ }
343
+ assertChildTypes(content, path, allowed);
344
+ }
345
+ function parseAttributes(value, path, ownerType, profile, limits, state) {
346
+ const attributes = parseJsonObject(value, path, 1, limits, state);
347
+ const allowed = profile.allowedAttributes[ownerType] ?? [];
348
+ for (const key of Object.keys(attributes)) {
349
+ if (!allowed.includes(key)) {
350
+ throw new TypeError(`${path}.${key} is not allowed for ${ownerType}.`);
351
+ }
352
+ }
353
+ return attributes;
354
+ }
355
+ function parseJsonObject(value, path, depth, limits, state) {
356
+ if (!isRecord(value)) {
357
+ throw new TypeError(`${path} must be an object.`);
358
+ }
359
+ assertAttributeDepth(depth, path, limits);
360
+ const entries = Object.entries(value);
361
+ if (entries.length > limits.maximumPropertiesPerObject) {
362
+ throw new RangeError(`${path} exceeds the attribute property limit.`);
363
+ }
364
+ addAttributeBytes(state, limits, 2);
365
+ const parsed = {};
366
+ for (const [index, [key, entry]] of entries.entries()) {
367
+ assertAttributeKey(key, path, limits);
368
+ addAttributeBytes(state, limits, (index === 0 ? 0 : 1) + jsonByteLength(key) + 1);
369
+ parsed[key] = parseJsonValue(entry, `${path}.${key}`, depth + 1, limits, state);
370
+ }
371
+ return parsed;
372
+ }
373
+ function parseJsonValue(value, path, depth, limits, state) {
374
+ if (typeof value === 'string') {
375
+ if (value.length > limits.maximumStringLength) {
376
+ throw new RangeError(`${path} exceeds the attribute string limit.`);
377
+ }
378
+ addAttributeBytes(state, limits, jsonByteLength(value));
379
+ return value;
380
+ }
381
+ if (value === null || typeof value === 'boolean') {
382
+ addAttributeBytes(state, limits, jsonByteLength(value));
383
+ return value;
384
+ }
385
+ if (typeof value === 'number' && Number.isFinite(value)) {
386
+ addAttributeBytes(state, limits, jsonByteLength(value));
387
+ return value;
388
+ }
389
+ if (Array.isArray(value)) {
390
+ assertAttributeDepth(depth, path, limits);
391
+ assertJsonArray(value, path, limits);
392
+ addAttributeBytes(state, limits, 2);
393
+ return value.map((entry, index) => {
394
+ if (index > 0) {
395
+ addAttributeBytes(state, limits, 1);
396
+ }
397
+ return parseJsonValue(entry, `${path}[${index}]`, depth + 1, limits, state);
398
+ });
399
+ }
400
+ if (isRecord(value)) {
401
+ return parseJsonObject(value, path, depth, limits, state);
402
+ }
403
+ throw new TypeError(`${path} is not JSON-compatible.`);
404
+ }
405
+ function addAttributeBytes(state, limits, count) {
406
+ state.attributeBytes += count;
407
+ if (state.attributeBytes > limits.maximumTotalBytes) {
408
+ throw new RangeError('Rich-text attributes exceed the total-byte limit.');
409
+ }
410
+ }
411
+ function assertAttributeDepth(depth, path, limits) {
412
+ if (depth > limits.maximumDepth) {
413
+ throw new RangeError(`${path} exceeds the attribute depth limit.`);
414
+ }
415
+ }
416
+ function assertAttributeKey(key, path, limits) {
417
+ if (key === '__proto__' || key === 'constructor' || key === 'prototype') {
418
+ throw new TypeError(`${path}.${key} is a forbidden object key.`);
419
+ }
420
+ if (key.length > limits.maximumStringLength) {
421
+ throw new RangeError(`${path} contains an attribute key that exceeds the string limit.`);
422
+ }
423
+ }
424
+ function assertJsonArray(value, path, limits) {
425
+ if (value.length > limits.maximumItemsPerArray) {
426
+ throw new RangeError(`${path} exceeds the attribute item limit.`);
427
+ }
428
+ const keys = Object.keys(value);
429
+ for (const key of keys) {
430
+ if (key === '__proto__' || key === 'constructor' || key === 'prototype') {
431
+ throw new TypeError(`${path}.${key} is a forbidden object key.`);
432
+ }
433
+ }
434
+ if (keys.length !== value.length || keys.some((key, index) => key !== String(index))) {
435
+ throw new TypeError(`${path} must be a dense JSON array without extra properties.`);
436
+ }
437
+ }
438
+ function assertStructuralArray(value, path) {
439
+ if (Object.getPrototypeOf(value) !== Array.prototype ||
440
+ Object.getOwnPropertySymbols(value).length) {
441
+ throw new TypeError(`${path} must be a dense JSON array without extra properties.`);
442
+ }
443
+ const names = Object.getOwnPropertyNames(value);
444
+ if (names.length !== value.length + 1 ||
445
+ names[value.length] !== 'length' ||
446
+ names.slice(0, -1).some((name, index) => name !== String(index))) {
447
+ throw new TypeError(`${path} must be a dense JSON array without extra properties.`);
448
+ }
449
+ }
450
+ function assertKnownKeys(value, path, allowedKeys) {
451
+ const allowed = new Set(allowedKeys);
452
+ const unknown = Object.keys(value).find((key) => !allowed.has(key));
453
+ if (unknown !== undefined) {
454
+ throw new TypeError(`${path}.${unknown} is not a recognized rich-text key.`);
455
+ }
456
+ }
457
+ function jsonByteLength(value) {
458
+ const serialized = JSON.stringify(value);
459
+ if (serialized === undefined) {
460
+ throw new TypeError('Attribute value is not JSON-compatible.');
461
+ }
462
+ return utf8ByteLength(serialized);
463
+ }
464
+ function utf8ByteLength(value) {
465
+ let bytes = 0;
466
+ for (let index = 0; index < value.length; index += 1) {
467
+ const code = value.charCodeAt(index);
468
+ if (code <= 0x7f) {
469
+ bytes += 1;
470
+ }
471
+ else if (code <= 0x7ff) {
472
+ bytes += 2;
473
+ }
474
+ else if (code >= 0xd800 && code <= 0xdbff) {
475
+ const next = value.charCodeAt(index + 1);
476
+ if (next >= 0xdc00 && next <= 0xdfff) {
477
+ bytes += 4;
478
+ index += 1;
479
+ }
480
+ else {
481
+ bytes += 3;
482
+ }
483
+ }
484
+ else {
485
+ bytes += 3;
486
+ }
487
+ }
488
+ return bytes;
489
+ }
490
+ function nodeText(node) {
491
+ return `${node.text ?? ''}${(node.content ?? []).map((child) => nodeText(child)).join('')}`;
492
+ }
493
+ function isRecord(value) {
494
+ if (typeof value !== 'object' || value === null || Array.isArray(value)) {
495
+ return false;
496
+ }
497
+ const prototype = Object.getPrototypeOf(value);
498
+ return prototype === Object.prototype || prototype === null;
499
+ }
500
+ function validateProfile(profile) {
501
+ for (const [name, value] of [
502
+ ['maximumDepth', profile.maximumDepth],
503
+ ['maximumNodes', profile.maximumNodes],
504
+ ['maximumTextLength', profile.maximumTextLength],
505
+ ]) {
506
+ assertBoundedProfileLimit(name, value, RICH_TEXT_HARD_LIMITS[name]);
507
+ }
508
+ for (const [name, value] of [
509
+ ['maximumDocumentBytes', maximumDocumentBytes(profile)],
510
+ ['maximumMarks', profile.maximumMarks ?? DEFAULT_MAXIMUM_MARKS],
511
+ ['maximumMarksPerNode', profile.maximumMarksPerNode ?? DEFAULT_MAXIMUM_MARKS_PER_NODE],
512
+ ]) {
513
+ assertBoundedProfileLimit(name, value, RICH_TEXT_HARD_LIMITS[name]);
514
+ }
515
+ if ((profile.maximumMarksPerNode ?? DEFAULT_MAXIMUM_MARKS_PER_NODE) >
516
+ (profile.maximumMarks ?? DEFAULT_MAXIMUM_MARKS)) {
517
+ throw new RangeError('maximumMarksPerNode cannot exceed maximumMarks.');
518
+ }
519
+ if (!profile.allowedNodes.includes('doc') || !profile.allowedNodes.includes('text')) {
520
+ throw new TypeError('Rich-text profile must allow doc and text nodes.');
521
+ }
522
+ if (new Set(profile.allowedNodes).size !== profile.allowedNodes.length) {
523
+ throw new TypeError('Rich-text profile node names must be unique.');
524
+ }
525
+ if (new Set(profile.allowedMarks).size !== profile.allowedMarks.length) {
526
+ throw new TypeError('Rich-text profile mark names must be unique.');
527
+ }
528
+ const unsupportedNode = profile.allowedNodes.find((name) => !PORTABLE_NODES.includes(name));
529
+ if (unsupportedNode !== undefined) {
530
+ throw new TypeError(`Rich-text profile node "${unsupportedNode}" has no portable grammar.`);
531
+ }
532
+ const unsupportedMark = profile.allowedMarks.find((name) => !PORTABLE_MARKS.includes(name));
533
+ if (unsupportedMark !== undefined) {
534
+ throw new TypeError(`Rich-text profile mark "${unsupportedMark}" has no portable grammar.`);
535
+ }
536
+ validateHeadingLevels(profile.headingLevels ?? DEFAULT_HEADING_LEVELS);
537
+ resolveAttributeLimits(profile);
538
+ }
539
+ function assertBoundedProfileLimit(name, value, hardMaximum) {
540
+ if (!Number.isInteger(value) || value < 1) {
541
+ throw new RangeError(`${name} must be a positive integer.`);
542
+ }
543
+ if (value > hardMaximum) {
544
+ throw new RangeError(`${name} exceeds the immutable safety ceiling of ${hardMaximum}.`);
545
+ }
546
+ }
547
+ function validateHeadingLevels(levels) {
548
+ if (levels.length === 0 ||
549
+ new Set(levels).size !== levels.length ||
550
+ levels.some((level) => !Number.isInteger(level) || level < 1 || level > 6)) {
551
+ throw new RangeError('headingLevels must contain unique integer levels from 1 through 6.');
552
+ }
553
+ }
554
+ function maximumDocumentBytes(profile) {
555
+ return profile.maximumDocumentBytes ?? DEFAULT_MAXIMUM_DOCUMENT_BYTES;
556
+ }
557
+ function resolveAttributeLimits(profile) {
558
+ const limits = { ...DEFAULT_RICH_TEXT_ATTRIBUTE_LIMITS, ...profile.attributeLimits };
559
+ for (const [name, value] of Object.entries(limits)) {
560
+ assertBoundedProfileLimit(name, value, ATTRIBUTE_HARD_LIMITS[name]);
561
+ }
562
+ return limits;
563
+ }
564
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
package/package.json ADDED
@@ -0,0 +1,41 @@
1
+ {
2
+ "name": "@kumwe/studio-rich-text",
3
+ "version": "0.1.0-alpha.2",
4
+ "repository": {
5
+ "type": "git",
6
+ "url": "git+https://github.com/kumwe/studio.git",
7
+ "directory": "packages/rich-text"
8
+ },
9
+ "homepage": "https://github.com/kumwe/studio/tree/main/packages/rich-text#readme",
10
+ "bugs": "https://github.com/kumwe/studio/issues",
11
+ "description": "Bounded Tiptap rich-text contract for Studio leaf fields.",
12
+ "type": "module",
13
+ "sideEffects": false,
14
+ "files": [
15
+ "LICENSE",
16
+ "dist",
17
+ "README.md"
18
+ ],
19
+ "exports": {
20
+ ".": {
21
+ "types": "./dist/index.d.ts",
22
+ "import": "./dist/index.js"
23
+ }
24
+ },
25
+ "scripts": {
26
+ "build": "tsc -b"
27
+ },
28
+ "dependencies": {
29
+ "@kumwe/studio-protocol": "0.1.0-alpha.2",
30
+ "@tiptap/core": "3.30.1",
31
+ "@tiptap/starter-kit": "3.30.1"
32
+ },
33
+ "publishConfig": {
34
+ "access": "public",
35
+ "provenance": true
36
+ },
37
+ "license": "MIT",
38
+ "engines": {
39
+ "node": ">=24.0.0"
40
+ }
41
+ }