victor HF Staff commited on
Commit
5fc800e
·
1 Parent(s): 90ae269

test: Replace isomorphic-dompurify with custom DOMPurify wrapper

Browse files

Removed isomorphic-dompurify in favor of a local utility that provides DOMPurify for both browser and server environments using jsdom. Updated imports in CodeBlock.svelte and MarkdownRenderer.svelte, added src/lib/utils/dompurify.ts, switched dependency from isomorphic-dompurify to jsdom, and updated Vite config to mark jsdom as external.

package-lock.json CHANGED
@@ -21,7 +21,7 @@
21
  "highlight.js": "^11.7.0",
22
  "husky": "^9.0.11",
23
  "ip-address": "^9.0.5",
24
- "isomorphic-dompurify": "2.26.0",
25
  "json5": "^2.2.3",
26
  "katex": "^0.16.21",
27
  "lint-staged": "^15.2.7",
@@ -243,6 +243,56 @@
243
  "url": "https://github.com/sponsors/antfu"
244
  }
245
  },
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
246
  "node_modules/@babel/code-frame": {
247
  "version": "7.27.1",
248
  "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.27.1.tgz",
@@ -368,6 +418,28 @@
368
  "@csstools/css-tokenizer": "^3.0.4"
369
  }
370
  },
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
371
  "node_modules/@csstools/css-tokenizer": {
372
  "version": "3.0.4",
373
  "resolved": "https://registry.npmjs.org/@csstools/css-tokenizer/-/css-tokenizer-3.0.4.tgz",
@@ -2719,7 +2791,7 @@
2719
  "version": "2.0.7",
2720
  "resolved": "https://registry.npmjs.org/@types/trusted-types/-/trusted-types-2.0.7.tgz",
2721
  "integrity": "sha512-ScaPdn1dQczgbl0QFTeTOmVHFULt394XJgOQNoyVhZ6r2vLnMLJfBPd53SB52T/3G36VI1/g2MZaX0cwDuXsfw==",
2722
- "devOptional": true,
2723
  "license": "MIT"
2724
  },
2725
  "node_modules/@types/uuid": {
@@ -3433,6 +3505,15 @@
3433
  ],
3434
  "license": "MIT"
3435
  },
 
 
 
 
 
 
 
 
 
3436
  "node_modules/binary-extensions": {
3437
  "version": "2.3.0",
3438
  "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.3.0.tgz",
@@ -3905,6 +3986,19 @@
3905
  "postcss-value-parser": "^4.0.2"
3906
  }
3907
  },
 
 
 
 
 
 
 
 
 
 
 
 
 
3908
  "node_modules/cssesc": {
3909
  "version": "3.0.0",
3910
  "resolved": "https://registry.npmjs.org/cssesc/-/cssesc-3.0.0.tgz",
@@ -3917,6 +4011,33 @@
3917
  "node": ">=4"
3918
  }
3919
  },
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
3920
  "node_modules/date-fns": {
3921
  "version": "2.30.0",
3922
  "resolved": "https://registry.npmjs.org/date-fns/-/date-fns-2.30.0.tgz",
@@ -4075,6 +4196,7 @@
4075
  "version": "3.3.0",
4076
  "resolved": "https://registry.npmjs.org/dompurify/-/dompurify-3.3.0.tgz",
4077
  "integrity": "sha512-r+f6MYR1gGN1eJv0TVQbhA7if/U7P87cdPl3HN5rikqaBSBxLiCb/b9O+2eG0cxz0ghyU+mU1QkbsOwERMYlWQ==",
 
4078
  "license": "(MPL-2.0 OR Apache-2.0)",
4079
  "optionalDependencies": {
4080
  "@types/trusted-types": "^2.0.7"
@@ -5593,158 +5715,6 @@
5593
  "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==",
5594
  "license": "ISC"
5595
  },
5596
- "node_modules/isomorphic-dompurify": {
5597
- "version": "2.26.0",
5598
- "resolved": "https://registry.npmjs.org/isomorphic-dompurify/-/isomorphic-dompurify-2.26.0.tgz",
5599
- "integrity": "sha512-nZmoK4wKdzPs5USq4JHBiimjdKSVAOm2T1KyDoadtMPNXYHxiENd19ou4iU/V4juFM6LVgYQnpxCYmxqNP4Obw==",
5600
- "license": "MIT",
5601
- "dependencies": {
5602
- "dompurify": "^3.2.6",
5603
- "jsdom": "^26.1.0"
5604
- },
5605
- "engines": {
5606
- "node": ">=18"
5607
- }
5608
- },
5609
- "node_modules/isomorphic-dompurify/node_modules/@asamuzakjp/css-color": {
5610
- "version": "3.2.0",
5611
- "resolved": "https://registry.npmjs.org/@asamuzakjp/css-color/-/css-color-3.2.0.tgz",
5612
- "integrity": "sha512-K1A6z8tS3XsmCMM86xoWdn7Fkdn9m6RSVtocUrJYIwZnFVkng/PvkEoWtOWmP+Scc6saYWHWZYbndEEXxl24jw==",
5613
- "license": "MIT",
5614
- "dependencies": {
5615
- "@csstools/css-calc": "^2.1.3",
5616
- "@csstools/css-color-parser": "^3.0.9",
5617
- "@csstools/css-parser-algorithms": "^3.0.4",
5618
- "@csstools/css-tokenizer": "^3.0.3",
5619
- "lru-cache": "^10.4.3"
5620
- }
5621
- },
5622
- "node_modules/isomorphic-dompurify/node_modules/cssstyle": {
5623
- "version": "4.6.0",
5624
- "resolved": "https://registry.npmjs.org/cssstyle/-/cssstyle-4.6.0.tgz",
5625
- "integrity": "sha512-2z+rWdzbbSZv6/rhtvzvqeZQHrBaqgogqt85sqFNbabZOuFbCVFb8kPeEtZjiKkbrm395irpNKiYeFeLiQnFPg==",
5626
- "license": "MIT",
5627
- "dependencies": {
5628
- "@asamuzakjp/css-color": "^3.2.0",
5629
- "rrweb-cssom": "^0.8.0"
5630
- },
5631
- "engines": {
5632
- "node": ">=18"
5633
- }
5634
- },
5635
- "node_modules/isomorphic-dompurify/node_modules/data-urls": {
5636
- "version": "5.0.0",
5637
- "resolved": "https://registry.npmjs.org/data-urls/-/data-urls-5.0.0.tgz",
5638
- "integrity": "sha512-ZYP5VBHshaDAiVZxjbRVcFJpc+4xGgT0bK3vzy1HLN8jTO975HEbuYzZJcHoQEY5K1a0z8YayJkyVETa08eNTg==",
5639
- "license": "MIT",
5640
- "dependencies": {
5641
- "whatwg-mimetype": "^4.0.0",
5642
- "whatwg-url": "^14.0.0"
5643
- },
5644
- "engines": {
5645
- "node": ">=18"
5646
- }
5647
- },
5648
- "node_modules/isomorphic-dompurify/node_modules/jsdom": {
5649
- "version": "26.1.0",
5650
- "resolved": "https://registry.npmjs.org/jsdom/-/jsdom-26.1.0.tgz",
5651
- "integrity": "sha512-Cvc9WUhxSMEo4McES3P7oK3QaXldCfNWp7pl2NNeiIFlCoLr3kfq9kb1fxftiwk1FLV7CvpvDfonxtzUDeSOPg==",
5652
- "license": "MIT",
5653
- "dependencies": {
5654
- "cssstyle": "^4.2.1",
5655
- "data-urls": "^5.0.0",
5656
- "decimal.js": "^10.5.0",
5657
- "html-encoding-sniffer": "^4.0.0",
5658
- "http-proxy-agent": "^7.0.2",
5659
- "https-proxy-agent": "^7.0.6",
5660
- "is-potential-custom-element-name": "^1.0.1",
5661
- "nwsapi": "^2.2.16",
5662
- "parse5": "^7.2.1",
5663
- "rrweb-cssom": "^0.8.0",
5664
- "saxes": "^6.0.0",
5665
- "symbol-tree": "^3.2.4",
5666
- "tough-cookie": "^5.1.1",
5667
- "w3c-xmlserializer": "^5.0.0",
5668
- "webidl-conversions": "^7.0.0",
5669
- "whatwg-encoding": "^3.1.1",
5670
- "whatwg-mimetype": "^4.0.0",
5671
- "whatwg-url": "^14.1.1",
5672
- "ws": "^8.18.0",
5673
- "xml-name-validator": "^5.0.0"
5674
- },
5675
- "engines": {
5676
- "node": ">=18"
5677
- },
5678
- "peerDependencies": {
5679
- "canvas": "^3.0.0"
5680
- },
5681
- "peerDependenciesMeta": {
5682
- "canvas": {
5683
- "optional": true
5684
- }
5685
- }
5686
- },
5687
- "node_modules/isomorphic-dompurify/node_modules/lru-cache": {
5688
- "version": "10.4.3",
5689
- "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.4.3.tgz",
5690
- "integrity": "sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==",
5691
- "license": "ISC"
5692
- },
5693
- "node_modules/isomorphic-dompurify/node_modules/tldts": {
5694
- "version": "6.1.86",
5695
- "resolved": "https://registry.npmjs.org/tldts/-/tldts-6.1.86.tgz",
5696
- "integrity": "sha512-WMi/OQ2axVTf/ykqCQgXiIct+mSQDFdH2fkwhPwgEwvJ1kSzZRiinb0zF2Xb8u4+OqPChmyI6MEu4EezNJz+FQ==",
5697
- "license": "MIT",
5698
- "dependencies": {
5699
- "tldts-core": "^6.1.86"
5700
- },
5701
- "bin": {
5702
- "tldts": "bin/cli.js"
5703
- }
5704
- },
5705
- "node_modules/isomorphic-dompurify/node_modules/tldts-core": {
5706
- "version": "6.1.86",
5707
- "resolved": "https://registry.npmjs.org/tldts-core/-/tldts-core-6.1.86.tgz",
5708
- "integrity": "sha512-Je6p7pkk+KMzMv2XXKmAE3McmolOQFdxkKw0R8EYNr7sELW46JqnNeTX8ybPiQgvg1ymCoF8LXs5fzFaZvJPTA==",
5709
- "license": "MIT"
5710
- },
5711
- "node_modules/isomorphic-dompurify/node_modules/tough-cookie": {
5712
- "version": "5.1.2",
5713
- "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-5.1.2.tgz",
5714
- "integrity": "sha512-FVDYdxtnj0G6Qm/DhNPSb8Ju59ULcup3tuJxkFb5K8Bv2pUXILbf0xZWU8PX8Ov19OXljbUyveOFwRMwkXzO+A==",
5715
- "license": "BSD-3-Clause",
5716
- "dependencies": {
5717
- "tldts": "^6.1.32"
5718
- },
5719
- "engines": {
5720
- "node": ">=16"
5721
- }
5722
- },
5723
- "node_modules/isomorphic-dompurify/node_modules/tr46": {
5724
- "version": "5.1.1",
5725
- "resolved": "https://registry.npmjs.org/tr46/-/tr46-5.1.1.tgz",
5726
- "integrity": "sha512-hdF5ZgjTqgAntKkklYw0R03MG2x/bSzTtkxmIRw/sTNV8YXsCJ1tfLAX23lhxhHJlEf3CRCOCGGWw3vI3GaSPw==",
5727
- "license": "MIT",
5728
- "dependencies": {
5729
- "punycode": "^2.3.1"
5730
- },
5731
- "engines": {
5732
- "node": ">=18"
5733
- }
5734
- },
5735
- "node_modules/isomorphic-dompurify/node_modules/whatwg-url": {
5736
- "version": "14.2.0",
5737
- "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-14.2.0.tgz",
5738
- "integrity": "sha512-De72GdQZzNTUBBChsXueQUnPKDkg/5A5zp7pFDuQAj5UFoENpiACU0wlCvzpAGnTkj++ihpKwKyYewn/XNUbKw==",
5739
- "license": "MIT",
5740
- "dependencies": {
5741
- "tr46": "^5.1.0",
5742
- "webidl-conversions": "^7.0.0"
5743
- },
5744
- "engines": {
5745
- "node": ">=18"
5746
- }
5747
- },
5748
  "node_modules/jackspeak": {
5749
  "version": "3.4.3",
5750
  "resolved": "https://registry.npmjs.org/jackspeak/-/jackspeak-3.4.3.tgz",
@@ -5804,6 +5774,54 @@
5804
  "integrity": "sha512-4bYVV3aAMtDTTu4+xsDYa6sy9GyJ69/amsu9sYF2zqjiEoZA5xJi3BrfX3uY+/IekIu7MwdObdbDWpoZdBv3/A==",
5805
  "license": "MIT"
5806
  },
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
5807
  "node_modules/json-buffer": {
5808
  "version": "3.0.1",
5809
  "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.1.tgz",
@@ -6243,6 +6261,12 @@
6243
  "node": ">= 0.4"
6244
  }
6245
  },
 
 
 
 
 
 
6246
  "node_modules/memory-pager": {
6247
  "version": "1.5.0",
6248
  "resolved": "https://registry.npmjs.org/memory-pager/-/memory-pager-1.5.0.tgz",
@@ -6808,12 +6832,6 @@
6808
  "url": "https://github.com/sponsors/sindresorhus"
6809
  }
6810
  },
6811
- "node_modules/nwsapi": {
6812
- "version": "2.2.22",
6813
- "resolved": "https://registry.npmjs.org/nwsapi/-/nwsapi-2.2.22.tgz",
6814
- "integrity": "sha512-ujSMe1OWVn55euT1ihwCI1ZcAaAU3nxUiDwfDQldc51ZXaB9m2AyOn6/jh1BLe2t/G8xd6uKG1UBF2aZJeg2SQ==",
6815
- "license": "MIT"
6816
- },
6817
  "node_modules/object-assign": {
6818
  "version": "4.1.1",
6819
  "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz",
@@ -7964,6 +7982,15 @@
7964
  "node": ">= 12.13.0"
7965
  }
7966
  },
 
 
 
 
 
 
 
 
 
7967
  "node_modules/resolve": {
7968
  "version": "1.22.10",
7969
  "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.10.tgz",
@@ -9178,6 +9205,24 @@
9178
  "node": ">=14.0.0"
9179
  }
9180
  },
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
9181
  "node_modules/to-regex-range": {
9182
  "version": "5.0.1",
9183
  "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz",
@@ -9216,6 +9261,30 @@
9216
  "node": ">=6"
9217
  }
9218
  },
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
9219
  "node_modules/ts-api-utils": {
9220
  "version": "1.4.3",
9221
  "resolved": "https://registry.npmjs.org/ts-api-utils/-/ts-api-utils-1.4.3.tgz",
@@ -9745,6 +9814,28 @@
9745
  "node": ">=18"
9746
  }
9747
  },
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
9748
  "node_modules/which": {
9749
  "version": "2.0.2",
9750
  "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz",
 
21
  "highlight.js": "^11.7.0",
22
  "husky": "^9.0.11",
23
  "ip-address": "^9.0.5",
24
+ "jsdom": "^27.0.0",
25
  "json5": "^2.2.3",
26
  "katex": "^0.16.21",
27
  "lint-staged": "^15.2.7",
 
243
  "url": "https://github.com/sponsors/antfu"
244
  }
245
  },
246
+ "node_modules/@asamuzakjp/css-color": {
247
+ "version": "4.0.5",
248
+ "resolved": "https://registry.npmjs.org/@asamuzakjp/css-color/-/css-color-4.0.5.tgz",
249
+ "integrity": "sha512-lMrXidNhPGsDjytDy11Vwlb6OIGrT3CmLg3VWNFyWkLWtijKl7xjvForlh8vuj0SHGjgl4qZEQzUmYTeQA2JFQ==",
250
+ "license": "MIT",
251
+ "dependencies": {
252
+ "@csstools/css-calc": "^2.1.4",
253
+ "@csstools/css-color-parser": "^3.1.0",
254
+ "@csstools/css-parser-algorithms": "^3.0.5",
255
+ "@csstools/css-tokenizer": "^3.0.4",
256
+ "lru-cache": "^11.2.1"
257
+ }
258
+ },
259
+ "node_modules/@asamuzakjp/css-color/node_modules/lru-cache": {
260
+ "version": "11.2.2",
261
+ "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-11.2.2.tgz",
262
+ "integrity": "sha512-F9ODfyqML2coTIsQpSkRHnLSZMtkU8Q+mSfcaIyKwy58u+8k5nvAYeiNhsyMARvzNcXJ9QfWVrcPsC9e9rAxtg==",
263
+ "license": "ISC",
264
+ "engines": {
265
+ "node": "20 || >=22"
266
+ }
267
+ },
268
+ "node_modules/@asamuzakjp/dom-selector": {
269
+ "version": "6.6.2",
270
+ "resolved": "https://registry.npmjs.org/@asamuzakjp/dom-selector/-/dom-selector-6.6.2.tgz",
271
+ "integrity": "sha512-+AG0jN9HTwfDLBhjhX1FKi6zlIAc/YGgEHlN/OMaHD1pOPFsC5CpYQpLkPX0aFjyaVmoq9330cQDCU4qnSL1qA==",
272
+ "license": "MIT",
273
+ "dependencies": {
274
+ "@asamuzakjp/nwsapi": "^2.3.9",
275
+ "bidi-js": "^1.0.3",
276
+ "css-tree": "^3.1.0",
277
+ "is-potential-custom-element-name": "^1.0.1",
278
+ "lru-cache": "^11.2.2"
279
+ }
280
+ },
281
+ "node_modules/@asamuzakjp/dom-selector/node_modules/lru-cache": {
282
+ "version": "11.2.2",
283
+ "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-11.2.2.tgz",
284
+ "integrity": "sha512-F9ODfyqML2coTIsQpSkRHnLSZMtkU8Q+mSfcaIyKwy58u+8k5nvAYeiNhsyMARvzNcXJ9QfWVrcPsC9e9rAxtg==",
285
+ "license": "ISC",
286
+ "engines": {
287
+ "node": "20 || >=22"
288
+ }
289
+ },
290
+ "node_modules/@asamuzakjp/nwsapi": {
291
+ "version": "2.3.9",
292
+ "resolved": "https://registry.npmjs.org/@asamuzakjp/nwsapi/-/nwsapi-2.3.9.tgz",
293
+ "integrity": "sha512-n8GuYSrI9bF7FFZ/SjhwevlHc8xaVlb/7HmHelnc/PZXBD2ZR49NnN9sMMuDdEGPeeRQ5d0hqlSlEpgCX3Wl0Q==",
294
+ "license": "MIT"
295
+ },
296
  "node_modules/@babel/code-frame": {
297
  "version": "7.27.1",
298
  "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.27.1.tgz",
 
418
  "@csstools/css-tokenizer": "^3.0.4"
419
  }
420
  },
421
+ "node_modules/@csstools/css-syntax-patches-for-csstree": {
422
+ "version": "1.0.14",
423
+ "resolved": "https://registry.npmjs.org/@csstools/css-syntax-patches-for-csstree/-/css-syntax-patches-for-csstree-1.0.14.tgz",
424
+ "integrity": "sha512-zSlIxa20WvMojjpCSy8WrNpcZ61RqfTfX3XTaOeVlGJrt/8HF3YbzgFZa01yTbT4GWQLwfTcC3EB8i3XnB647Q==",
425
+ "funding": [
426
+ {
427
+ "type": "github",
428
+ "url": "https://github.com/sponsors/csstools"
429
+ },
430
+ {
431
+ "type": "opencollective",
432
+ "url": "https://opencollective.com/csstools"
433
+ }
434
+ ],
435
+ "license": "MIT-0",
436
+ "engines": {
437
+ "node": ">=18"
438
+ },
439
+ "peerDependencies": {
440
+ "postcss": "^8.4"
441
+ }
442
+ },
443
  "node_modules/@csstools/css-tokenizer": {
444
  "version": "3.0.4",
445
  "resolved": "https://registry.npmjs.org/@csstools/css-tokenizer/-/css-tokenizer-3.0.4.tgz",
 
2791
  "version": "2.0.7",
2792
  "resolved": "https://registry.npmjs.org/@types/trusted-types/-/trusted-types-2.0.7.tgz",
2793
  "integrity": "sha512-ScaPdn1dQczgbl0QFTeTOmVHFULt394XJgOQNoyVhZ6r2vLnMLJfBPd53SB52T/3G36VI1/g2MZaX0cwDuXsfw==",
2794
+ "dev": true,
2795
  "license": "MIT"
2796
  },
2797
  "node_modules/@types/uuid": {
 
3505
  ],
3506
  "license": "MIT"
3507
  },
3508
+ "node_modules/bidi-js": {
3509
+ "version": "1.0.3",
3510
+ "resolved": "https://registry.npmjs.org/bidi-js/-/bidi-js-1.0.3.tgz",
3511
+ "integrity": "sha512-RKshQI1R3YQ+n9YJz2QQ147P66ELpa1FQEg20Dk8oW9t2KgLbpDLLp9aGZ7y8WHSshDknG0bknqGw5/tyCs5tw==",
3512
+ "license": "MIT",
3513
+ "dependencies": {
3514
+ "require-from-string": "^2.0.2"
3515
+ }
3516
+ },
3517
  "node_modules/binary-extensions": {
3518
  "version": "2.3.0",
3519
  "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.3.0.tgz",
 
3986
  "postcss-value-parser": "^4.0.2"
3987
  }
3988
  },
3989
+ "node_modules/css-tree": {
3990
+ "version": "3.1.0",
3991
+ "resolved": "https://registry.npmjs.org/css-tree/-/css-tree-3.1.0.tgz",
3992
+ "integrity": "sha512-0eW44TGN5SQXU1mWSkKwFstI/22X2bG1nYzZTYMAWjylYURhse752YgbE4Cx46AC+bAvI+/dYTPRk1LqSUnu6w==",
3993
+ "license": "MIT",
3994
+ "dependencies": {
3995
+ "mdn-data": "2.12.2",
3996
+ "source-map-js": "^1.0.1"
3997
+ },
3998
+ "engines": {
3999
+ "node": "^10 || ^12.20.0 || ^14.13.0 || >=15.0.0"
4000
+ }
4001
+ },
4002
  "node_modules/cssesc": {
4003
  "version": "3.0.0",
4004
  "resolved": "https://registry.npmjs.org/cssesc/-/cssesc-3.0.0.tgz",
 
4011
  "node": ">=4"
4012
  }
4013
  },
4014
+ "node_modules/cssstyle": {
4015
+ "version": "5.3.1",
4016
+ "resolved": "https://registry.npmjs.org/cssstyle/-/cssstyle-5.3.1.tgz",
4017
+ "integrity": "sha512-g5PC9Aiph9eiczFpcgUhd9S4UUO3F+LHGRIi5NUMZ+4xtoIYbHNZwZnWA2JsFGe8OU8nl4WyaEFiZuGuxlutJQ==",
4018
+ "license": "MIT",
4019
+ "dependencies": {
4020
+ "@asamuzakjp/css-color": "^4.0.3",
4021
+ "@csstools/css-syntax-patches-for-csstree": "^1.0.14",
4022
+ "css-tree": "^3.1.0"
4023
+ },
4024
+ "engines": {
4025
+ "node": ">=20"
4026
+ }
4027
+ },
4028
+ "node_modules/data-urls": {
4029
+ "version": "6.0.0",
4030
+ "resolved": "https://registry.npmjs.org/data-urls/-/data-urls-6.0.0.tgz",
4031
+ "integrity": "sha512-BnBS08aLUM+DKamupXs3w2tJJoqU+AkaE/+6vQxi/G/DPmIZFJJp9Dkb1kM03AZx8ADehDUZgsNxju3mPXZYIA==",
4032
+ "license": "MIT",
4033
+ "dependencies": {
4034
+ "whatwg-mimetype": "^4.0.0",
4035
+ "whatwg-url": "^15.0.0"
4036
+ },
4037
+ "engines": {
4038
+ "node": ">=20"
4039
+ }
4040
+ },
4041
  "node_modules/date-fns": {
4042
  "version": "2.30.0",
4043
  "resolved": "https://registry.npmjs.org/date-fns/-/date-fns-2.30.0.tgz",
 
4196
  "version": "3.3.0",
4197
  "resolved": "https://registry.npmjs.org/dompurify/-/dompurify-3.3.0.tgz",
4198
  "integrity": "sha512-r+f6MYR1gGN1eJv0TVQbhA7if/U7P87cdPl3HN5rikqaBSBxLiCb/b9O+2eG0cxz0ghyU+mU1QkbsOwERMYlWQ==",
4199
+ "dev": true,
4200
  "license": "(MPL-2.0 OR Apache-2.0)",
4201
  "optionalDependencies": {
4202
  "@types/trusted-types": "^2.0.7"
 
5715
  "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==",
5716
  "license": "ISC"
5717
  },
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
5718
  "node_modules/jackspeak": {
5719
  "version": "3.4.3",
5720
  "resolved": "https://registry.npmjs.org/jackspeak/-/jackspeak-3.4.3.tgz",
 
5774
  "integrity": "sha512-4bYVV3aAMtDTTu4+xsDYa6sy9GyJ69/amsu9sYF2zqjiEoZA5xJi3BrfX3uY+/IekIu7MwdObdbDWpoZdBv3/A==",
5775
  "license": "MIT"
5776
  },
5777
+ "node_modules/jsdom": {
5778
+ "version": "27.0.0",
5779
+ "resolved": "https://registry.npmjs.org/jsdom/-/jsdom-27.0.0.tgz",
5780
+ "integrity": "sha512-lIHeR1qlIRrIN5VMccd8tI2Sgw6ieYXSVktcSHaNe3Z5nE/tcPQYQWOq00wxMvYOsz+73eAkNenVvmPC6bba9A==",
5781
+ "license": "MIT",
5782
+ "dependencies": {
5783
+ "@asamuzakjp/dom-selector": "^6.5.4",
5784
+ "cssstyle": "^5.3.0",
5785
+ "data-urls": "^6.0.0",
5786
+ "decimal.js": "^10.5.0",
5787
+ "html-encoding-sniffer": "^4.0.0",
5788
+ "http-proxy-agent": "^7.0.2",
5789
+ "https-proxy-agent": "^7.0.6",
5790
+ "is-potential-custom-element-name": "^1.0.1",
5791
+ "parse5": "^7.3.0",
5792
+ "rrweb-cssom": "^0.8.0",
5793
+ "saxes": "^6.0.0",
5794
+ "symbol-tree": "^3.2.4",
5795
+ "tough-cookie": "^6.0.0",
5796
+ "w3c-xmlserializer": "^5.0.0",
5797
+ "webidl-conversions": "^8.0.0",
5798
+ "whatwg-encoding": "^3.1.1",
5799
+ "whatwg-mimetype": "^4.0.0",
5800
+ "whatwg-url": "^15.0.0",
5801
+ "ws": "^8.18.2",
5802
+ "xml-name-validator": "^5.0.0"
5803
+ },
5804
+ "engines": {
5805
+ "node": ">=20"
5806
+ },
5807
+ "peerDependencies": {
5808
+ "canvas": "^3.0.0"
5809
+ },
5810
+ "peerDependenciesMeta": {
5811
+ "canvas": {
5812
+ "optional": true
5813
+ }
5814
+ }
5815
+ },
5816
+ "node_modules/jsdom/node_modules/webidl-conversions": {
5817
+ "version": "8.0.0",
5818
+ "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-8.0.0.tgz",
5819
+ "integrity": "sha512-n4W4YFyz5JzOfQeA8oN7dUYpR+MBP3PIUsn2jLjWXwK5ASUzt0Jc/A5sAUZoCYFJRGF0FBKJ+1JjN43rNdsQzA==",
5820
+ "license": "BSD-2-Clause",
5821
+ "engines": {
5822
+ "node": ">=20"
5823
+ }
5824
+ },
5825
  "node_modules/json-buffer": {
5826
  "version": "3.0.1",
5827
  "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.1.tgz",
 
6261
  "node": ">= 0.4"
6262
  }
6263
  },
6264
+ "node_modules/mdn-data": {
6265
+ "version": "2.12.2",
6266
+ "resolved": "https://registry.npmjs.org/mdn-data/-/mdn-data-2.12.2.tgz",
6267
+ "integrity": "sha512-IEn+pegP1aManZuckezWCO+XZQDplx1366JoVhTpMpBB1sPey/SbveZQUosKiKiGYjg1wH4pMlNgXbCiYgihQA==",
6268
+ "license": "CC0-1.0"
6269
+ },
6270
  "node_modules/memory-pager": {
6271
  "version": "1.5.0",
6272
  "resolved": "https://registry.npmjs.org/memory-pager/-/memory-pager-1.5.0.tgz",
 
6832
  "url": "https://github.com/sponsors/sindresorhus"
6833
  }
6834
  },
 
 
 
 
 
 
6835
  "node_modules/object-assign": {
6836
  "version": "4.1.1",
6837
  "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz",
 
7982
  "node": ">= 12.13.0"
7983
  }
7984
  },
7985
+ "node_modules/require-from-string": {
7986
+ "version": "2.0.2",
7987
+ "resolved": "https://registry.npmjs.org/require-from-string/-/require-from-string-2.0.2.tgz",
7988
+ "integrity": "sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==",
7989
+ "license": "MIT",
7990
+ "engines": {
7991
+ "node": ">=0.10.0"
7992
+ }
7993
+ },
7994
  "node_modules/resolve": {
7995
  "version": "1.22.10",
7996
  "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.10.tgz",
 
9205
  "node": ">=14.0.0"
9206
  }
9207
  },
9208
+ "node_modules/tldts": {
9209
+ "version": "7.0.17",
9210
+ "resolved": "https://registry.npmjs.org/tldts/-/tldts-7.0.17.tgz",
9211
+ "integrity": "sha512-Y1KQBgDd/NUc+LfOtKS6mNsC9CCaH+m2P1RoIZy7RAPo3C3/t8X45+zgut31cRZtZ3xKPjfn3TkGTrctC2TQIQ==",
9212
+ "license": "MIT",
9213
+ "dependencies": {
9214
+ "tldts-core": "^7.0.17"
9215
+ },
9216
+ "bin": {
9217
+ "tldts": "bin/cli.js"
9218
+ }
9219
+ },
9220
+ "node_modules/tldts-core": {
9221
+ "version": "7.0.17",
9222
+ "resolved": "https://registry.npmjs.org/tldts-core/-/tldts-core-7.0.17.tgz",
9223
+ "integrity": "sha512-DieYoGrP78PWKsrXr8MZwtQ7GLCUeLxihtjC1jZsW1DnvSMdKPitJSe8OSYDM2u5H6g3kWJZpePqkp43TfLh0g==",
9224
+ "license": "MIT"
9225
+ },
9226
  "node_modules/to-regex-range": {
9227
  "version": "5.0.1",
9228
  "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz",
 
9261
  "node": ">=6"
9262
  }
9263
  },
9264
+ "node_modules/tough-cookie": {
9265
+ "version": "6.0.0",
9266
+ "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-6.0.0.tgz",
9267
+ "integrity": "sha512-kXuRi1mtaKMrsLUxz3sQYvVl37B0Ns6MzfrtV5DvJceE9bPyspOqk9xxv7XbZWcfLWbFmm997vl83qUWVJA64w==",
9268
+ "license": "BSD-3-Clause",
9269
+ "dependencies": {
9270
+ "tldts": "^7.0.5"
9271
+ },
9272
+ "engines": {
9273
+ "node": ">=16"
9274
+ }
9275
+ },
9276
+ "node_modules/tr46": {
9277
+ "version": "6.0.0",
9278
+ "resolved": "https://registry.npmjs.org/tr46/-/tr46-6.0.0.tgz",
9279
+ "integrity": "sha512-bLVMLPtstlZ4iMQHpFHTR7GAGj2jxi8Dg0s2h2MafAE4uSWF98FC/3MomU51iQAMf8/qDUbKWf5GxuvvVcXEhw==",
9280
+ "license": "MIT",
9281
+ "dependencies": {
9282
+ "punycode": "^2.3.1"
9283
+ },
9284
+ "engines": {
9285
+ "node": ">=20"
9286
+ }
9287
+ },
9288
  "node_modules/ts-api-utils": {
9289
  "version": "1.4.3",
9290
  "resolved": "https://registry.npmjs.org/ts-api-utils/-/ts-api-utils-1.4.3.tgz",
 
9814
  "node": ">=18"
9815
  }
9816
  },
9817
+ "node_modules/whatwg-url": {
9818
+ "version": "15.1.0",
9819
+ "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-15.1.0.tgz",
9820
+ "integrity": "sha512-2ytDk0kiEj/yu90JOAp44PVPUkO9+jVhyf+SybKlRHSDlvOOZhdPIrr7xTH64l4WixO2cP+wQIcgujkGBPPz6g==",
9821
+ "license": "MIT",
9822
+ "dependencies": {
9823
+ "tr46": "^6.0.0",
9824
+ "webidl-conversions": "^8.0.0"
9825
+ },
9826
+ "engines": {
9827
+ "node": ">=20"
9828
+ }
9829
+ },
9830
+ "node_modules/whatwg-url/node_modules/webidl-conversions": {
9831
+ "version": "8.0.0",
9832
+ "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-8.0.0.tgz",
9833
+ "integrity": "sha512-n4W4YFyz5JzOfQeA8oN7dUYpR+MBP3PIUsn2jLjWXwK5ASUzt0Jc/A5sAUZoCYFJRGF0FBKJ+1JjN43rNdsQzA==",
9834
+ "license": "BSD-2-Clause",
9835
+ "engines": {
9836
+ "node": ">=20"
9837
+ }
9838
+ },
9839
  "node_modules/which": {
9840
  "version": "2.0.2",
9841
  "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz",
package.json CHANGED
@@ -78,7 +78,7 @@
78
  "highlight.js": "^11.7.0",
79
  "husky": "^9.0.11",
80
  "ip-address": "^9.0.5",
81
- "isomorphic-dompurify": "2.26.0",
82
  "json5": "^2.2.3",
83
  "katex": "^0.16.21",
84
  "lint-staged": "^15.2.7",
 
78
  "highlight.js": "^11.7.0",
79
  "husky": "^9.0.11",
80
  "ip-address": "^9.0.5",
81
+ "jsdom": "^27.0.0",
82
  "json5": "^2.2.3",
83
  "katex": "^0.16.21",
84
  "lint-staged": "^15.2.7",
src/lib/components/CodeBlock.svelte CHANGED
@@ -1,6 +1,6 @@
1
  <script lang="ts">
2
  import CopyToClipBoardBtn from "./CopyToClipBoardBtn.svelte";
3
- import DOMPurify from "isomorphic-dompurify";
4
  import HtmlPreviewModal from "./HtmlPreviewModal.svelte";
5
  import PlayFilledAlt from "~icons/carbon/play-filled-alt";
6
  import EosIconsLoading from "~icons/eos-icons/loading";
 
1
  <script lang="ts">
2
  import CopyToClipBoardBtn from "./CopyToClipBoardBtn.svelte";
3
+ import DOMPurify from "$lib/utils/dompurify";
4
  import HtmlPreviewModal from "./HtmlPreviewModal.svelte";
5
  import PlayFilledAlt from "~icons/carbon/play-filled-alt";
6
  import EosIconsLoading from "~icons/eos-icons/loading";
src/lib/components/chat/MarkdownRenderer.svelte CHANGED
@@ -5,7 +5,7 @@
5
  import type { IncomingMessage, OutgoingMessage } from "$lib/workers/markdownWorker";
6
  import { browser } from "$app/environment";
7
 
8
- import DOMPurify from "isomorphic-dompurify";
9
  import { onMount } from "svelte";
10
  import { updateDebouncer } from "$lib/utils/updates";
11
 
 
5
  import type { IncomingMessage, OutgoingMessage } from "$lib/workers/markdownWorker";
6
  import { browser } from "$app/environment";
7
 
8
+ import DOMPurify from "$lib/utils/dompurify";
9
  import { onMount } from "svelte";
10
  import { updateDebouncer } from "$lib/utils/updates";
11
 
src/lib/utils/dompurify.ts ADDED
@@ -0,0 +1,20 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ // This file provides DOMPurify for both browser and server environments
2
+ // In browser: uses dompurify directly
3
+ // In server: creates a jsdom window and initializes dompurify with it
4
+
5
+ import { browser } from "$app/environment";
6
+ import dompurify from "dompurify";
7
+ import { JSDOM } from "jsdom";
8
+
9
+ let DOMPurifyInstance: ReturnType<typeof dompurify>;
10
+
11
+ if (browser) {
12
+ // Browser: use dompurify directly
13
+ DOMPurifyInstance = dompurify;
14
+ } else {
15
+ // Server: create jsdom window and initialize dompurify
16
+ const window = new JSDOM("<!DOCTYPE html>").window;
17
+ DOMPurifyInstance = dompurify(window as unknown as Window);
18
+ }
19
+
20
+ export default DOMPurifyInstance;
vite.config.ts CHANGED
@@ -37,7 +37,7 @@ export default defineConfig({
37
  },
38
  build: {
39
  rollupOptions: {
40
- external: ["isomorphic-dompurify"],
41
  },
42
  },
43
  optimizeDeps: {
 
37
  },
38
  build: {
39
  rollupOptions: {
40
+ external: ["jsdom"],
41
  },
42
  },
43
  optimizeDeps: {