@mintlify/package-builder 0.0.0-stage → 0.0.3

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.
Files changed (46) hide show
  1. package/LICENSE +93 -0
  2. package/README.md +66 -2
  3. package/dist/build.d.ts +4 -0
  4. package/dist/build.js +338 -0
  5. package/dist/bundle.d.ts +44 -0
  6. package/dist/bundle.js +681 -0
  7. package/dist/cli.d.ts +13 -0
  8. package/dist/cli.js +112 -0
  9. package/dist/diagnostics.d.ts +11 -0
  10. package/dist/diagnostics.js +32 -0
  11. package/dist/hashing.d.ts +28 -0
  12. package/dist/hashing.js +98 -0
  13. package/dist/index.d.ts +12 -0
  14. package/dist/index.js +11 -0
  15. package/dist/install.d.ts +34 -0
  16. package/dist/install.js +325 -0
  17. package/dist/local-files.d.ts +11 -0
  18. package/dist/local-files.js +120 -0
  19. package/dist/lockfile.d.ts +40 -0
  20. package/dist/lockfile.js +498 -0
  21. package/dist/package-json.d.ts +14 -0
  22. package/dist/package-json.js +170 -0
  23. package/dist/package-manager.d.ts +17 -0
  24. package/dist/package-manager.js +87 -0
  25. package/dist/react.d.ts +37 -0
  26. package/dist/react.js +264 -0
  27. package/dist/render.d.ts +37 -0
  28. package/dist/render.js +292 -0
  29. package/dist/runtime/client.d.ts +11 -0
  30. package/dist/runtime/client.js +54 -0
  31. package/dist/runtime/server.d.ts +6 -0
  32. package/dist/runtime/server.js +11 -0
  33. package/dist/runtime/shell.d.ts +21 -0
  34. package/dist/runtime/shell.js +68 -0
  35. package/dist/runtime/theme.d.ts +1 -0
  36. package/dist/runtime/theme.js +1 -0
  37. package/dist/sanitize.d.ts +9 -0
  38. package/dist/sanitize.js +650 -0
  39. package/dist/semver.d.ts +2 -0
  40. package/dist/semver.js +10 -0
  41. package/dist/tsconfig.build.tsbuildinfo +1 -0
  42. package/dist/types.d.ts +98 -0
  43. package/dist/types.js +1 -0
  44. package/dist/version.d.ts +1 -0
  45. package/dist/version.js +11 -0
  46. package/package.json +74 -4
@@ -0,0 +1,650 @@
1
+ import { decodeHTMLAttribute } from 'entities/decode';
2
+ export const MAX_ISLAND_HTML_BYTES = 256 * 1024;
3
+ const HTML_ELEMENTS = [
4
+ 'a',
5
+ 'abbr',
6
+ 'address',
7
+ 'area',
8
+ 'article',
9
+ 'aside',
10
+ 'audio',
11
+ 'b',
12
+ 'bdi',
13
+ 'bdo',
14
+ 'big',
15
+ 'blockquote',
16
+ 'br',
17
+ 'button',
18
+ 'canvas',
19
+ 'caption',
20
+ 'center',
21
+ 'cite',
22
+ 'code',
23
+ 'col',
24
+ 'colgroup',
25
+ 'data',
26
+ 'datalist',
27
+ 'dd',
28
+ 'del',
29
+ 'details',
30
+ 'dfn',
31
+ 'dialog',
32
+ 'div',
33
+ 'dl',
34
+ 'dt',
35
+ 'em',
36
+ 'fieldset',
37
+ 'figcaption',
38
+ 'figure',
39
+ 'font',
40
+ 'footer',
41
+ 'h1',
42
+ 'h2',
43
+ 'h3',
44
+ 'h4',
45
+ 'h5',
46
+ 'h6',
47
+ 'header',
48
+ 'hgroup',
49
+ 'hr',
50
+ 'i',
51
+ 'img',
52
+ 'input',
53
+ 'ins',
54
+ 'kbd',
55
+ 'label',
56
+ 'legend',
57
+ 'li',
58
+ 'main',
59
+ 'map',
60
+ 'mark',
61
+ 'menu',
62
+ 'meter',
63
+ 'nav',
64
+ 'nobr',
65
+ 'ol',
66
+ 'optgroup',
67
+ 'option',
68
+ 'output',
69
+ 'p',
70
+ 'picture',
71
+ 'pre',
72
+ 'progress',
73
+ 'q',
74
+ 'rp',
75
+ 'rt',
76
+ 'ruby',
77
+ 's',
78
+ 'samp',
79
+ 'search',
80
+ 'section',
81
+ 'select',
82
+ 'slot',
83
+ 'small',
84
+ 'source',
85
+ 'span',
86
+ 'strike',
87
+ 'strong',
88
+ 'sub',
89
+ 'summary',
90
+ 'sup',
91
+ 'table',
92
+ 'tbody',
93
+ 'td',
94
+ 'template',
95
+ 'textarea',
96
+ 'tfoot',
97
+ 'th',
98
+ 'thead',
99
+ 'time',
100
+ 'title',
101
+ 'tr',
102
+ 'track',
103
+ 'tt',
104
+ 'u',
105
+ 'ul',
106
+ 'var',
107
+ 'video',
108
+ 'wbr',
109
+ ];
110
+ const SVG_ELEMENTS = [
111
+ 'svg',
112
+ 'g',
113
+ 'path',
114
+ 'circle',
115
+ 'ellipse',
116
+ 'line',
117
+ 'polyline',
118
+ 'polygon',
119
+ 'rect',
120
+ 'text',
121
+ 'tspan',
122
+ 'textpath',
123
+ 'defs',
124
+ 'lineargradient',
125
+ 'radialgradient',
126
+ 'stop',
127
+ 'clippath',
128
+ 'mask',
129
+ 'pattern',
130
+ 'marker',
131
+ 'symbol',
132
+ 'use',
133
+ 'image',
134
+ 'desc',
135
+ 'metadata',
136
+ 'filter',
137
+ 'switch',
138
+ 'view',
139
+ 'feblend',
140
+ 'fecolormatrix',
141
+ 'fecomponenttransfer',
142
+ 'fecomposite',
143
+ 'feconvolvematrix',
144
+ 'fediffuselighting',
145
+ 'fedisplacementmap',
146
+ 'fedistantlight',
147
+ 'fedropshadow',
148
+ 'feflood',
149
+ 'fefunca',
150
+ 'fefuncb',
151
+ 'fefuncg',
152
+ 'fefuncr',
153
+ 'fegaussianblur',
154
+ 'feimage',
155
+ 'femerge',
156
+ 'femergenode',
157
+ 'femorphology',
158
+ 'feoffset',
159
+ 'fepointlight',
160
+ 'fespecularlighting',
161
+ 'fespotlight',
162
+ 'fetile',
163
+ 'feturbulence',
164
+ ];
165
+ const MATHML_ELEMENTS = [
166
+ 'math',
167
+ 'mi',
168
+ 'mn',
169
+ 'mo',
170
+ 'ms',
171
+ 'mtext',
172
+ 'mrow',
173
+ 'msup',
174
+ 'msub',
175
+ 'msubsup',
176
+ 'mfrac',
177
+ 'msqrt',
178
+ 'mroot',
179
+ 'mtable',
180
+ 'mtr',
181
+ 'mtd',
182
+ 'mspace',
183
+ 'mstyle',
184
+ 'mpadded',
185
+ 'mphantom',
186
+ 'menclose',
187
+ 'munder',
188
+ 'mover',
189
+ 'munderover',
190
+ 'semantics',
191
+ 'annotation',
192
+ ];
193
+ const ALLOWED_ELEMENTS = new Set([...HTML_ELEMENTS, ...SVG_ELEMENTS, ...MATHML_ELEMENTS]);
194
+ const DROP_WITH_CONTENT = new Set([
195
+ 'script',
196
+ 'style',
197
+ 'iframe',
198
+ 'object',
199
+ 'embed',
200
+ 'frame',
201
+ 'frameset',
202
+ 'applet',
203
+ 'noscript',
204
+ 'noembed',
205
+ 'noframes',
206
+ 'xmp',
207
+ 'plaintext',
208
+ 'foreignobject',
209
+ 'annotation-xml',
210
+ 'base',
211
+ 'meta',
212
+ 'link',
213
+ 'param',
214
+ 'animate',
215
+ 'animatemotion',
216
+ 'animatetransform',
217
+ 'set',
218
+ 'discard',
219
+ 'handler',
220
+ 'listener',
221
+ 'portal',
222
+ 'fencedframe',
223
+ ]);
224
+ const RAW_TEXT = new Set(['script', 'style', 'xmp', 'iframe', 'noembed', 'noframes', 'noscript']);
225
+ const RCDATA = new Set(['textarea', 'title']);
226
+ const VOID_ELEMENTS = new Set([
227
+ 'area',
228
+ 'base',
229
+ 'br',
230
+ 'col',
231
+ 'embed',
232
+ 'hr',
233
+ 'img',
234
+ 'input',
235
+ 'keygen',
236
+ 'link',
237
+ 'meta',
238
+ 'param',
239
+ 'source',
240
+ 'track',
241
+ 'wbr',
242
+ ]);
243
+ const URL_ATTRIBUTES = new Set([
244
+ 'href',
245
+ 'xlink:href',
246
+ 'src',
247
+ 'action',
248
+ 'poster',
249
+ 'background',
250
+ 'cite',
251
+ 'data',
252
+ 'longdesc',
253
+ 'lowsrc',
254
+ 'dynsrc',
255
+ 'manifest',
256
+ 'codebase',
257
+ 'icon',
258
+ ]);
259
+ const SRCSET_ATTRIBUTES = new Set(['srcset', 'imagesrcset']);
260
+ const DROPPED_ATTRIBUTES = new Set([
261
+ 'srcdoc',
262
+ 'ping',
263
+ 'is',
264
+ 'http-equiv',
265
+ 'form',
266
+ 'formaction',
267
+ 'formenctype',
268
+ 'formmethod',
269
+ 'formnovalidate',
270
+ 'formtarget',
271
+ ]);
272
+ const ID_REFERENCE_ATTRIBUTES = new Set([
273
+ 'for',
274
+ 'list',
275
+ 'headers',
276
+ 'itemref',
277
+ 'anchor',
278
+ 'contextmenu',
279
+ 'popovertarget',
280
+ 'commandfor',
281
+ 'interestfor',
282
+ 'aria-activedescendant',
283
+ 'aria-actions',
284
+ 'aria-controls',
285
+ 'aria-describedby',
286
+ 'aria-details',
287
+ 'aria-errormessage',
288
+ 'aria-flowto',
289
+ 'aria-labelledby',
290
+ 'aria-owns',
291
+ ]);
292
+ const TARGET_KEYWORDS = new Set(['', '_blank', '_self', '_parent', '_top']);
293
+ const ALLOWED_COMMENT = /^(?: |\$|\/\$|\$!|\$\?|&|\/&|F!|F|)$/;
294
+ const ATTRIBUTE_NAME = /^[a-zA-Z_:][-a-zA-Z0-9_:.]*$/;
295
+ const SAFE_SCHEMES = new Set(['http', 'https', 'mailto', 'tel']);
296
+ export function decodeEntities(value) {
297
+ return decodeHTMLAttribute(value);
298
+ }
299
+ function escapeAttribute(value) {
300
+ return value
301
+ .replace(/&/g, '&')
302
+ .replace(/"/g, '"')
303
+ .replace(/'/g, ''')
304
+ .replace(/</g, '&lt;')
305
+ .replace(/>/g, '&gt;');
306
+ }
307
+ function escapeText(value) {
308
+ return value.replace(/</g, '&lt;').replace(/>/g, '&gt;');
309
+ }
310
+ function urlScheme(value) {
311
+ const cleaned = value.replace(/[\u0000- \u007f-\u009f]/g, '');
312
+ const m = /^([a-zA-Z][a-zA-Z0-9+.-]*):/.exec(cleaned);
313
+ return m ? m[1].toLowerCase() : undefined;
314
+ }
315
+ function isSafeUrl(value, opts) {
316
+ const scheme = urlScheme(value);
317
+ if (scheme === undefined)
318
+ return true;
319
+ if (SAFE_SCHEMES.has(scheme))
320
+ return true;
321
+ if (scheme === 'data' && opts.allowDataImage) {
322
+ const cleaned = value.replace(/[\u0000- ]/g, '').toLowerCase();
323
+ return (/^data:image\/(?:png|jpe?g|gif|webp|avif|bmp);/.test(cleaned) ||
324
+ /^data:image\/(?:png|jpe?g|gif|webp|avif|bmp),/.test(cleaned));
325
+ }
326
+ return false;
327
+ }
328
+ function stripCssComments(value) {
329
+ let out = '';
330
+ let at = 0;
331
+ for (;;) {
332
+ const open = value.indexOf('/*', at);
333
+ const close = open === -1 ? -1 : value.indexOf('*/', open + 2);
334
+ if (close === -1)
335
+ return out + value.slice(at);
336
+ out += value.slice(at, open);
337
+ at = close + 2;
338
+ }
339
+ }
340
+ function unescapeCss(value) {
341
+ return stripCssComments(value
342
+ .replace(/\\([0-9a-fA-F]{1,6})\s?/g, (_m, hex) => {
343
+ const code = parseInt(hex, 16);
344
+ return code > 0 && code <= 0x10ffff ? String.fromCodePoint(code) : '�';
345
+ })
346
+ .replace(/\\(.)/g, '$1'));
347
+ }
348
+ const DANGEROUS_CSS = /expression\s*\(|javascript\s*:|vbscript\s*:|-moz-binding|behavior\s*:|@import/i;
349
+ function asciiLower(value) {
350
+ return value.replace(/[A-Z]+/g, (m) => m.toLowerCase());
351
+ }
352
+ function ownsReference(value, prefix) {
353
+ if (!prefix)
354
+ return false;
355
+ return value.split(/\s+/).every((id) => id === '' || id.includes(prefix));
356
+ }
357
+ const URL_REFERENCE = /url\(\s*(['"]?)#([^'")\s]+)\1\s*\)/gi;
358
+ function renameReferences(attribute, value, renames) {
359
+ const rename = (id) => renames.get(id) ?? id;
360
+ if (attribute === 'id')
361
+ return rename(value);
362
+ if (ID_REFERENCE_ATTRIBUTES.has(attribute))
363
+ return value.replace(/\S+/g, rename);
364
+ if (URL_ATTRIBUTES.has(attribute)) {
365
+ const trimmed = value.trim();
366
+ return trimmed.startsWith('#') ? `#${rename(trimmed.slice(1))}` : value;
367
+ }
368
+ return value.replace(URL_REFERENCE, (match, quote, id) => renames.has(id) ? `url(${quote}#${rename(id)}${quote})` : match);
369
+ }
370
+ function sanitizeAttributes(tag, attrs, opts) {
371
+ const { prefix, renames, ids } = opts;
372
+ let out = '';
373
+ const seen = new Set();
374
+ for (const { name, value } of attrs) {
375
+ if (!ATTRIBUTE_NAME.test(name))
376
+ continue;
377
+ const lower = name.toLowerCase();
378
+ if (seen.has(lower))
379
+ continue;
380
+ seen.add(lower);
381
+ if (lower.startsWith('on') || DROPPED_ATTRIBUTES.has(lower))
382
+ continue;
383
+ const raw = value === undefined ? undefined : decodeEntities(value).replace(/\u0000/g, '�');
384
+ if (raw !== undefined && lower === 'id')
385
+ ids?.push(raw);
386
+ const decoded = raw === undefined || !renames?.size ? raw : renameReferences(lower, raw, renames);
387
+ if (decoded !== undefined) {
388
+ if (URL_ATTRIBUTES.has(lower)) {
389
+ if ((tag === 'use' || tag === 'feimage') && (lower === 'href' || lower === 'xlink:href')) {
390
+ if (!decoded.trim().startsWith('#'))
391
+ continue;
392
+ }
393
+ const allowDataImage = (tag === 'img' || tag === 'source' || tag === 'image') && lower !== 'xlink:href';
394
+ if (!isSafeUrl(decoded, { allowDataImage }))
395
+ continue;
396
+ }
397
+ else if (SRCSET_ATTRIBUTES.has(lower)) {
398
+ const candidates = decoded.split(',').map((c) => c.trim().split(/\s+/)[0] ?? '');
399
+ if (!candidates.every((url) => isSafeUrl(url, { allowDataImage: true })))
400
+ continue;
401
+ }
402
+ else if (lower === 'style') {
403
+ if (DANGEROUS_CSS.test(unescapeCss(decoded)))
404
+ continue;
405
+ }
406
+ else if (ID_REFERENCE_ATTRIBUTES.has(lower)) {
407
+ if (!ownsReference(decoded, prefix))
408
+ continue;
409
+ }
410
+ else if (lower === 'usemap') {
411
+ const hash = decoded.indexOf('#');
412
+ if (hash === -1 || !ownsReference(decoded.slice(hash + 1), prefix))
413
+ continue;
414
+ }
415
+ else if (lower === 'target') {
416
+ if (!TARGET_KEYWORDS.has(asciiLower(decoded)))
417
+ continue;
418
+ }
419
+ else if (lower === 'rel') {
420
+ if (asciiLower(decoded).split(/\s+/).includes('opener'))
421
+ continue;
422
+ }
423
+ }
424
+ out += decoded === undefined ? ` ${name}` : ` ${name}="${escapeAttribute(decoded)}"`;
425
+ }
426
+ return out;
427
+ }
428
+ const WHITESPACE = /[\t\n\f\r ]/;
429
+ const TAG_NAME_END = /[\t\n\f\r />]/;
430
+ function parseStartTag(input, start) {
431
+ let i = start + 1;
432
+ const n = input.length;
433
+ let name = '';
434
+ while (i < n && !TAG_NAME_END.test(input[i]))
435
+ name += input[i++];
436
+ const attrs = [];
437
+ let selfClosing = false;
438
+ while (i < n) {
439
+ const c = input[i];
440
+ if (WHITESPACE.test(c)) {
441
+ i++;
442
+ continue;
443
+ }
444
+ if (c === '>')
445
+ return { name, attrs, selfClosing, end: i + 1 };
446
+ if (c === '/') {
447
+ selfClosing = input[i + 1] === '>';
448
+ i++;
449
+ continue;
450
+ }
451
+ selfClosing = false;
452
+ let attrName = c;
453
+ i++;
454
+ while (i < n && !/[\t\n\f\r />=]/.test(input[i]))
455
+ attrName += input[i++];
456
+ while (i < n && WHITESPACE.test(input[i]))
457
+ i++;
458
+ let value;
459
+ if (input[i] === '=') {
460
+ i++;
461
+ while (i < n && WHITESPACE.test(input[i]))
462
+ i++;
463
+ const q = input[i];
464
+ if (q === '"' || q === "'") {
465
+ const close = input.indexOf(q, i + 1);
466
+ if (close === -1)
467
+ return undefined;
468
+ value = input.slice(i + 1, close);
469
+ i = close + 1;
470
+ }
471
+ else {
472
+ let v = '';
473
+ while (i < n && !/[\t\n\f\r >]/.test(input[i]))
474
+ v += input[i++];
475
+ value = v;
476
+ }
477
+ }
478
+ attrs.push({ name: attrName, value });
479
+ }
480
+ return undefined;
481
+ }
482
+ function findRawTextEnd(input, folded, from, name) {
483
+ let i = from;
484
+ for (;;) {
485
+ const idx = folded.indexOf(`</${name}`, i);
486
+ if (idx === -1)
487
+ return -1;
488
+ const after = input[idx + 2 + name.length];
489
+ if (after === undefined || TAG_NAME_END.test(after))
490
+ return idx;
491
+ i = idx + 1;
492
+ }
493
+ }
494
+ const COMMENT_END = /--!?>/g;
495
+ export function sanitizeHtml(input, prefix, renames) {
496
+ return sanitize(input, { prefix, renames });
497
+ }
498
+ function elementIds(html) {
499
+ const ids = [];
500
+ sanitize(html, { ids });
501
+ return ids;
502
+ }
503
+ export function stateIdRenames(first, second, prefix) {
504
+ const ids = elementIds(first);
505
+ const owned = (id) => id === '' || id.includes(prefix);
506
+ if (ids.every(owned))
507
+ return new Map();
508
+ const again = second === undefined ? [] : elementIds(second);
509
+ const stable = new Set(again);
510
+ const moved = ids.filter((id, i) => !owned(id) && (ids.length === again.length ? again[i] !== id : !stable.has(id)));
511
+ return new Map(moved.map((id) => [id, `${prefix}${id}`]));
512
+ }
513
+ function sanitize(input, opts) {
514
+ const src = input.replace(/\u0000/g, '');
515
+ const folded = asciiLower(src);
516
+ const n = src.length;
517
+ let out = '';
518
+ let i = 0;
519
+ let dropName;
520
+ let dropDepth = 0;
521
+ const emitText = (text) => {
522
+ if (dropName === undefined && text)
523
+ out += escapeText(text);
524
+ };
525
+ while (i < n) {
526
+ const lt = src.indexOf('<', i);
527
+ if (lt === -1) {
528
+ emitText(src.slice(i));
529
+ break;
530
+ }
531
+ if (lt > i)
532
+ emitText(src.slice(i, lt));
533
+ i = lt;
534
+ const next = src[i + 1];
535
+ if (src.startsWith('<!--', i)) {
536
+ let end;
537
+ let content;
538
+ if (src.startsWith('<!-->', i)) {
539
+ end = i + 5;
540
+ content = '';
541
+ }
542
+ else if (src.startsWith('<!--->', i)) {
543
+ end = i + 6;
544
+ content = '';
545
+ }
546
+ else {
547
+ COMMENT_END.lastIndex = i + 4;
548
+ const close = COMMENT_END.exec(src);
549
+ if (!close)
550
+ break;
551
+ content = src.slice(i + 4, close.index);
552
+ end = close.index + close[0].length;
553
+ }
554
+ if (dropName === undefined && ALLOWED_COMMENT.test(content))
555
+ out += `<!--${content}-->`;
556
+ i = end;
557
+ continue;
558
+ }
559
+ if (next === '!' || next === '?') {
560
+ const close = src.indexOf('>', i);
561
+ i = close === -1 ? n : close + 1;
562
+ continue;
563
+ }
564
+ if (next === '/') {
565
+ const first = src[i + 2];
566
+ if (first !== undefined && /[a-zA-Z]/.test(first)) {
567
+ let j = i + 2;
568
+ let name = '';
569
+ while (j < n && !TAG_NAME_END.test(src[j]))
570
+ name += src[j++];
571
+ const close = src.indexOf('>', j);
572
+ i = close === -1 ? n : close + 1;
573
+ const lower = name.toLowerCase();
574
+ if (dropName !== undefined) {
575
+ if (lower === dropName && --dropDepth === 0)
576
+ dropName = undefined;
577
+ continue;
578
+ }
579
+ if (ALLOWED_ELEMENTS.has(lower) && !VOID_ELEMENTS.has(lower))
580
+ out += `</${name}>`;
581
+ continue;
582
+ }
583
+ if (first === '>') {
584
+ i += 3;
585
+ continue;
586
+ }
587
+ const close = src.indexOf('>', i);
588
+ i = close === -1 ? n : close + 1;
589
+ continue;
590
+ }
591
+ if (next === undefined || !/[a-zA-Z]/.test(next)) {
592
+ emitText('<');
593
+ i++;
594
+ continue;
595
+ }
596
+ const tag = parseStartTag(src, i);
597
+ if (!tag)
598
+ break;
599
+ i = tag.end;
600
+ const lower = tag.name.toLowerCase();
601
+ if (lower === 'plaintext')
602
+ break;
603
+ if (RAW_TEXT.has(lower) && !tag.selfClosing) {
604
+ const endIdx = findRawTextEnd(src, folded, i, lower);
605
+ if (endIdx === -1)
606
+ break;
607
+ const close = src.indexOf('>', endIdx);
608
+ i = close === -1 ? n : close + 1;
609
+ continue;
610
+ }
611
+ if (dropName !== undefined) {
612
+ if (lower === dropName && !tag.selfClosing && !VOID_ELEMENTS.has(lower))
613
+ dropDepth++;
614
+ if (RCDATA.has(lower) && !tag.selfClosing) {
615
+ const endIdx = findRawTextEnd(src, folded, i, lower);
616
+ const close = endIdx === -1 ? -1 : src.indexOf('>', endIdx);
617
+ i = close === -1 ? n : close + 1;
618
+ }
619
+ continue;
620
+ }
621
+ if (DROP_WITH_CONTENT.has(lower)) {
622
+ if (!tag.selfClosing && !VOID_ELEMENTS.has(lower)) {
623
+ dropName = lower;
624
+ dropDepth = 1;
625
+ }
626
+ continue;
627
+ }
628
+ if (!ALLOWED_ELEMENTS.has(lower))
629
+ continue;
630
+ out += `<${tag.name}${sanitizeAttributes(lower, tag.attrs, opts)}${tag.selfClosing ? '/' : ''}>`;
631
+ if (RCDATA.has(lower) && !tag.selfClosing) {
632
+ const endIdx = findRawTextEnd(src, folded, i, lower);
633
+ const content = endIdx === -1 ? src.slice(i) : src.slice(i, endIdx);
634
+ out += escapeText(content);
635
+ out += `</${tag.name}>`;
636
+ if (endIdx === -1)
637
+ break;
638
+ const close = src.indexOf('>', endIdx);
639
+ i = close === -1 ? n : close + 1;
640
+ }
641
+ }
642
+ return out;
643
+ }
644
+ export function sanitizeIslandHtml(input, prefix, renames) {
645
+ const html = sanitizeHtml(input, prefix, renames);
646
+ const bytes = new TextEncoder().encode(html).byteLength;
647
+ if (bytes > MAX_ISLAND_HTML_BYTES)
648
+ return { tooLarge: true, bytes };
649
+ return { html, tooLarge: false, bytes };
650
+ }
@@ -0,0 +1,2 @@
1
+ export declare function majorOf(version: string): number | undefined;
2
+ export declare function satisfies(version: string, range: string): boolean | undefined;
package/dist/semver.js ADDED
@@ -0,0 +1,10 @@
1
+ import semver from 'semver';
2
+ export function majorOf(version) {
3
+ return semver.parse(version.trim(), { loose: true })?.major;
4
+ }
5
+ export function satisfies(version, range) {
6
+ const parsed = semver.parse(version.trim(), { loose: true });
7
+ if (!parsed || semver.validRange(range, { loose: true }) === null)
8
+ return undefined;
9
+ return semver.satisfies(parsed, range, { loose: true });
10
+ }