fix(agent): replace jsdom with linkedom to fix Docker EISDIR error (#186)

jsdom relies on Node.js-specific APIs that Bun cannot properly resolve
when running a bundled artifact. This caused an EISDIR error in Docker
containers (Bun tried to read the jsdom directory as a file).

Replace jsdom with linkedom, a lightweight pure-JS DOM implementation
that is fully compatible with Bun and @mozilla/readability. Also remove
the --external jsdom build flag since linkedom bundles cleanly.

Closes #181
This commit is contained in:
BBQ
2026-03-04 22:11:08 +08:00
committed by GitHub
parent 9ceabf68c4
commit a8b960db80
5 changed files with 166 additions and 63 deletions
+2 -4
View File
@@ -7,17 +7,15 @@
"start": "pnpm run build && bun run dist/index.js"
},
"dependencies": {
"@memoh/config": "workspace:*",
"@memoh/agent": "workspace:*",
"@elysiajs/bearer": "^1.4.2",
"@elysiajs/cors": "^1.4.1",
"@memoh/agent": "workspace:*",
"@memoh/config": "workspace:*",
"@modelcontextprotocol/sdk": "^1.25.2",
"@mozilla/readability": "^0.6.0",
"@types/jsdom": "^27.0.0",
"@types/turndown": "^5.0.6",
"ai": "^6.0.25",
"elysia": "latest",
"jsdom": "^27.4.0",
"toml": "^3.0.0",
"turndown": "^7.2.2",
"zod": "^4.3.5"
+1 -1
View File
@@ -18,7 +18,7 @@ COPY packages/config/ ./packages/config/
COPY packages/agent/ ./packages/agent/
COPY agent/ ./agent/
RUN cd agent && bun run build --external jsdom
RUN cd agent && bun run build
FROM oven/bun:1-alpine
+1 -2
View File
@@ -17,10 +17,9 @@
"@ai-sdk/mcp": "^1.0.6",
"@ai-sdk/openai": "^3.0.7",
"@mozilla/readability": "^0.6.0",
"@types/jsdom": "^27.0.0",
"@types/turndown": "^5.0.6",
"ai": "^6.0.25",
"jsdom": "^27.4.0",
"linkedom": "^0.18.12",
"toml": "^3.0.0",
"turndown": "^7.2.2",
"yaml": "^2.8.2",
+3 -3
View File
@@ -1,7 +1,7 @@
import { tool } from 'ai'
import { z } from 'zod'
import { Readability } from '@mozilla/readability'
import { JSDOM } from 'jsdom'
import { parseHTML } from 'linkedom'
import TurndownService from 'turndown'
const turndownService = new TurndownService()
@@ -76,8 +76,8 @@ export const getWebTools = () => {
case 'markdown': {
try {
const dom = new JSDOM(content, { url })
const reader = new Readability(dom.window.document)
const { document } = parseHTML(content)
const reader = new Readability(document as unknown as Document)
const article = reader.parse()
if (!article || !article.content) {
+159 -53
View File
@@ -66,9 +66,6 @@ importers:
'@mozilla/readability':
specifier: ^0.6.0
version: 0.6.0
'@types/jsdom':
specifier: ^27.0.0
version: 27.0.0
'@types/turndown':
specifier: ^5.0.6
version: 5.0.6
@@ -78,9 +75,6 @@ importers:
elysia:
specifier: latest
version: 1.4.25(@sinclair/typebox@0.34.47)(@types/bun@1.3.9)(exact-mirror@0.2.6(@sinclair/typebox@0.34.47))(file-type@21.3.0)(openapi-types@12.1.3)(typescript@5.9.3)
jsdom:
specifier: ^27.4.0
version: 27.4.0
toml:
specifier: ^3.0.0
version: 3.0.0
@@ -121,18 +115,15 @@ importers:
'@mozilla/readability':
specifier: ^0.6.0
version: 0.6.0
'@types/jsdom':
specifier: ^27.0.0
version: 27.0.0
'@types/turndown':
specifier: ^5.0.6
version: 5.0.6
ai:
specifier: ^6.0.25
version: 6.0.25(zod@4.3.6)
jsdom:
specifier: ^27.4.0
version: 27.4.0
linkedom:
specifier: ^0.18.12
version: 0.18.12
toml:
specifier: ^3.0.0
version: 3.0.0
@@ -2217,9 +2208,6 @@ packages:
'@types/hast@3.0.4':
resolution: {integrity: sha512-WPs+bbQw5aCj+x6laNGWLH3wviHtoCv/P3+otBhbOhJgG8qtpdAMlTCxLtsTWA7LH1Oh/bFCHsBn0TPS5m30EQ==}
'@types/jsdom@27.0.0':
resolution: {integrity: sha512-NZyFl/PViwKzdEkQg96gtnB8wm+1ljhdDay9ahn4hgb+SfVtPCbm3TlmDUFXTA+MGN3CijicnMhG18SI5H3rFw==}
'@types/json-schema@7.0.15':
resolution: {integrity: sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==}
@@ -2244,9 +2232,6 @@ packages:
'@types/node@25.0.3':
resolution: {integrity: sha512-W609buLVRVmeW693xKfzHeIV6nJGGz98uCPfeXI1ELMLXVeKYZ9m15fAMSaUPBHYLGFsVRcMmSCksQOrZV9BYA==}
'@types/tough-cookie@4.0.5':
resolution: {integrity: sha512-/Ad8+nIOV7Rl++6f1BdKxFSMgmoqEoYbHRpPcx3JEfv8VRsQe9Z4mCXeJBzxs7mbHY/XOZZuXlRNfhpVPbs6ZA==}
'@types/trusted-types@2.0.7':
resolution: {integrity: sha512-ScaPdn1dQczgbl0QFTeTOmVHFULt394XJgOQNoyVhZ6r2vLnMLJfBPd53SB52T/3G36VI1/g2MZaX0cwDuXsfw==}
@@ -2886,15 +2871,25 @@ packages:
resolution: {integrity: sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==}
engines: {node: '>= 8'}
css-select@5.2.2:
resolution: {integrity: sha512-TizTzUddG/xYLA3NXodFM0fSbNizXjOKhqiQQwvhlspadZokn1KDy0NZFS0wuEubIYAV5/c1/lAr0TaaFXEXzw==}
css-tree@3.1.0:
resolution: {integrity: sha512-0eW44TGN5SQXU1mWSkKwFstI/22X2bG1nYzZTYMAWjylYURhse752YgbE4Cx46AC+bAvI+/dYTPRk1LqSUnu6w==}
engines: {node: ^10 || ^12.20.0 || ^14.13.0 || >=15.0.0}
css-what@6.2.2:
resolution: {integrity: sha512-u/O3vwbptzhMs3L1fQE82ZSLHQQfto5gyZzwteVIEyeaY5Fc7R4dapF/BvRoSYFeqfBk4m0V1Vafq5Pjv25wvA==}
engines: {node: '>= 6'}
cssesc@3.0.0:
resolution: {integrity: sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==}
engines: {node: '>=4'}
hasBin: true
cssom@0.5.0:
resolution: {integrity: sha512-iKuQcq+NdHqlAcwUY0o/HL69XQrUaQdMjmStJ8JFmUaiiQErlhrmuigkg/CU4E2J0IyUKUrMAgl36TvN67MqTw==}
cssstyle@5.3.7:
resolution: {integrity: sha512-7D2EPVltRrsTkhpQmksIu+LxeWAIEk6wRDMJ1qljlv+CKHJM+cJLlfhWIzNA44eAsHXSNe3+vO6DW1yCYx8SuQ==}
engines: {node: '>=20'}
@@ -3124,9 +3119,22 @@ packages:
resolution: {integrity: sha512-sSuxWU5j5SR9QQji/o2qMvqRNYRDOcBTgsJ/DeCf4iSN4gW+gNMXM7wFIP+fdXZxoNiAnHUTGjCr+TSWXdRDKg==}
engines: {node: '>=0.3.1'}
dom-serializer@2.0.0:
resolution: {integrity: sha512-wIkAryiqt/nV5EQKqQpo3SToSOV9J0DnbJqwK7Wv/Trc92zIAYZ4FlMu+JPFW1DfGFt81ZTCGgDEabffXeLyJg==}
domelementtype@2.3.0:
resolution: {integrity: sha512-OLETBj6w0OsagBwdXnPdN0cnMfF9opN69co+7ZrbfPGrdpPVNBUj02spi6B1N7wChLQiPn4CSH/zJvXw56gmHw==}
domhandler@5.0.3:
resolution: {integrity: sha512-cgwlv/1iFQiFnU96XXgROh8xTeetsnJiDsTc7TYCLFd9+/WNkIqPTxiM/8pSd8VIrhXGTf1Ny1q1hquVqDJB5w==}
engines: {node: '>= 4'}
dompurify@3.3.1:
resolution: {integrity: sha512-qkdCKzLNtrgPFP1Vo+98FRzJnBRGe4ffyCea9IwHB1fyxPOeNTHpLKYGd4Uk9xvNoH0ZoOjwZxNptyMwqrId1Q==}
domutils@3.2.2:
resolution: {integrity: sha512-6kZKyUajlDuqlHKVX1w7gyslj9MPIXzIFiz/rGu35uC1wMi+kMhQwGhl4lt9unC9Vb9INnY9Z3/ZA3+FhASLaw==}
dotenv@17.2.3:
resolution: {integrity: sha512-JVUnt+DUIzu87TABbhPmNfVdBDt18BLOWjMUFJMSi/Qqg7NTYtabbvSNJGOJ7afbRuv9D/lngizHtP7QyLQ+9w==}
engines: {node: '>=12'}
@@ -3192,6 +3200,10 @@ packages:
resolution: {integrity: sha512-FDWG5cmEYf2Z00IkYRhbFrwIwvdFKH07uV8dvNy0omp/Qb1xcyCWp2UDtcwJF4QZZvk0sLudP6/hAu42TaqVhQ==}
engines: {node: '>=0.12'}
entities@7.0.1:
resolution: {integrity: sha512-TWrgLOFUQTH994YUyl1yT4uyavY5nNB5muff+RtWaqNVCAK408b5ZnnbNAUEWLTCpum9w6arT70i1XdQ4UeOPA==}
engines: {node: '>=0.12'}
error-stack-parser-es@1.0.5:
resolution: {integrity: sha512-5qucVt2XcuGMcEGgWI7i+yZpmpByQ8J1lHhcL7PwqCwu9FPP3VUXzT4ltHe5i2z9dePwEHcDVOAfSnHsOlCXRA==}
@@ -3509,9 +3521,15 @@ packages:
resolution: {integrity: sha512-CV9TW3Y3f8/wT0BRFc1/KAVQ3TUHiXmaAb6VW9vtiMFf7SLoMd1PdAc4W3KFOFETBJUb90KatHqlsZMWV+R9Gg==}
engines: {node: ^20.19.0 || ^22.12.0 || >=24.0.0}
html-escaper@3.0.3:
resolution: {integrity: sha512-RuMffC89BOWQoY0WKGpIhn5gX3iI54O6nRA0yC124NYVtzjmFWBIiFd8M0x+ZdX0P9R4lADg1mgP8C7PxGOWuQ==}
html-void-elements@3.0.0:
resolution: {integrity: sha512-bEqo66MRXsUGxWHV5IP0PUiAWwoEjba4VCzg0LjFJBpchPaTfyfCKTG6bc5F8ucKec3q5y6qOdGyYTSBEvhCrg==}
htmlparser2@10.1.0:
resolution: {integrity: sha512-VTZkM9GWRAtEpveh7MSF6SjjrpNVNNVJfFup7xTY3UpFtm67foy9HDVXneLtFVt4pMz5kZtgNcvCniNFb1hlEQ==}
http-errors@2.0.1:
resolution: {integrity: sha512-4FbRdAX+bSdmo4AUFuS0WNiPz8NgFt+r8ThgNWmlrjQjt1Q7ZR9+zTlce2859x4KSXrwIsaeTqDoKQmtP8pLmQ==}
engines: {node: '>= 0.8'}
@@ -3822,6 +3840,15 @@ packages:
lines-and-columns@1.2.4:
resolution: {integrity: sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==}
linkedom@0.18.12:
resolution: {integrity: sha512-jalJsOwIKuQJSeTvsgzPe9iJzyfVaEJiEXl+25EkKevsULHvMJzpNqwvj1jOESWdmgKDiXObyjOYwlUqG7wo1Q==}
engines: {node: '>=16'}
peerDependencies:
canvas: '>= 2'
peerDependenciesMeta:
canvas:
optional: true
linkify-it@5.0.0:
resolution: {integrity: sha512-5aHCbzQRADcdP+ATqnDuhhJ/MRIqDkZX5pyjFHRRysS8vZ5AbqGEoFIb6pYHPZ+L/OC2Lc+xT8uHVVR5CAK/wQ==}
@@ -4155,9 +4182,6 @@ packages:
resolution: {integrity: sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==}
engines: {node: '>=6'}
parse5@7.3.0:
resolution: {integrity: sha512-IInvU7fabl34qmi9gY8XOVxhYyMyuH2xUNpb2q8/Y+7552KlejkRvqvD19nMoUW/uQGGbqNpA6Tufu5FL5BZgw==}
parse5@8.0.0:
resolution: {integrity: sha512-9m4m5GSgXjL4AjumKzq1Fgfp3Z8rsvjRNbnkVwfu2ImRqE5D0LnY2QfDen18FSY9C573YU5XxSapdHZTZ2WolA==}
@@ -4762,6 +4786,9 @@ packages:
ufo@1.6.2:
resolution: {integrity: sha512-heMioaxBcG9+Znsda5Q8sQbWnLJSl98AFDXTO80wELWEzX3hordXsTdxrIfMQoO9IY1MEnoGoPjpoKpMj+Yx0Q==}
uhyphen@0.2.0:
resolution: {integrity: sha512-qz3o9CHXmJJPGBdqzab7qAYuW8kQGKNEuoHFYrBwV6hWIMcpAmxDLXojcHfFr9US1Pe6zUswEIJIbLI610fuqA==}
uint8array-extras@1.5.0:
resolution: {integrity: sha512-rvKSBiC5zqCCiDZ9kAOszZcDvdAHwwIKJG33Ykj43OKcWsnmcBRL09YTU4nOeHZ8Y2a7l1MgTd08SBe9A8Qj6A==}
engines: {node: '>=18'}
@@ -5218,7 +5245,8 @@ packages:
snapshots:
'@acemir/cssom@0.9.31': {}
'@acemir/cssom@0.9.31':
optional: true
'@ai-sdk/anthropic@3.0.9(zod@4.3.6)':
dependencies:
@@ -5408,6 +5436,7 @@ snapshots:
'@csstools/css-parser-algorithms': 3.0.5(@csstools/css-tokenizer@3.0.4)
'@csstools/css-tokenizer': 3.0.4
lru-cache: 11.2.5
optional: true
'@asamuzakjp/dom-selector@6.7.6':
dependencies:
@@ -5416,8 +5445,10 @@ snapshots:
css-tree: 3.1.0
is-potential-custom-element-name: 1.0.1
lru-cache: 11.2.5
optional: true
'@asamuzakjp/nwsapi@2.3.9': {}
'@asamuzakjp/nwsapi@2.3.9':
optional: true
'@babel/code-frame@7.27.1':
dependencies:
@@ -5634,12 +5665,14 @@ snapshots:
'@chevrotain/utils@11.0.3': {}
'@csstools/color-helpers@5.1.0': {}
'@csstools/color-helpers@5.1.0':
optional: true
'@csstools/css-calc@2.1.4(@csstools/css-parser-algorithms@3.0.5(@csstools/css-tokenizer@3.0.4))(@csstools/css-tokenizer@3.0.4)':
dependencies:
'@csstools/css-parser-algorithms': 3.0.5(@csstools/css-tokenizer@3.0.4)
'@csstools/css-tokenizer': 3.0.4
optional: true
'@csstools/css-color-parser@3.1.0(@csstools/css-parser-algorithms@3.0.5(@csstools/css-tokenizer@3.0.4))(@csstools/css-tokenizer@3.0.4)':
dependencies:
@@ -5647,14 +5680,18 @@ snapshots:
'@csstools/css-calc': 2.1.4(@csstools/css-parser-algorithms@3.0.5(@csstools/css-tokenizer@3.0.4))(@csstools/css-tokenizer@3.0.4)
'@csstools/css-parser-algorithms': 3.0.5(@csstools/css-tokenizer@3.0.4)
'@csstools/css-tokenizer': 3.0.4
optional: true
'@csstools/css-parser-algorithms@3.0.5(@csstools/css-tokenizer@3.0.4)':
dependencies:
'@csstools/css-tokenizer': 3.0.4
optional: true
'@csstools/css-syntax-patches-for-csstree@1.0.26': {}
'@csstools/css-syntax-patches-for-csstree@1.0.26':
optional: true
'@csstools/css-tokenizer@3.0.4': {}
'@csstools/css-tokenizer@3.0.4':
optional: true
'@docsearch/css@3.8.2': {}
@@ -6037,7 +6074,8 @@ snapshots:
'@eslint/core': 0.17.0
levn: 0.4.1
'@exodus/bytes@1.10.0': {}
'@exodus/bytes@1.10.0':
optional: true
'@floating-ui/core@1.7.3':
dependencies:
@@ -6927,12 +6965,6 @@ snapshots:
dependencies:
'@types/unist': 3.0.3
'@types/jsdom@27.0.0':
dependencies:
'@types/node': 24.10.4
'@types/tough-cookie': 4.0.5
parse5: 7.3.0
'@types/json-schema@7.0.15': {}
'@types/linkify-it@5.0.0': {}
@@ -6960,8 +6992,6 @@ snapshots:
dependencies:
undici-types: 7.16.0
'@types/tough-cookie@4.0.5': {}
'@types/trusted-types@2.0.7':
optional: true
@@ -7340,7 +7370,8 @@ snapshots:
acorn@8.15.0: {}
agent-base@7.1.4: {}
agent-base@7.1.4:
optional: true
ai@6.0.25(zod@4.3.5):
dependencies:
@@ -7470,6 +7501,7 @@ snapshots:
bidi-js@1.0.3:
dependencies:
require-from-string: 2.0.2
optional: true
birpc@2.9.0: {}
@@ -7699,19 +7731,33 @@ snapshots:
shebang-command: 2.0.0
which: 2.0.2
css-select@5.2.2:
dependencies:
boolbase: 1.0.0
css-what: 6.2.2
domhandler: 5.0.3
domutils: 3.2.2
nth-check: 2.1.1
css-tree@3.1.0:
dependencies:
mdn-data: 2.12.2
source-map-js: 1.2.1
optional: true
css-what@6.2.2: {}
cssesc@3.0.0: {}
cssom@0.5.0: {}
cssstyle@5.3.7:
dependencies:
'@asamuzakjp/css-color': 4.1.1
'@csstools/css-syntax-patches-for-csstree': 1.0.26
css-tree: 3.1.0
lru-cache: 11.2.5
optional: true
csstype@3.2.3: {}
@@ -7903,6 +7949,7 @@ snapshots:
dependencies:
whatwg-mimetype: 5.0.0
whatwg-url: 15.1.0
optional: true
dayjs@1.11.19: {}
@@ -7910,7 +7957,8 @@ snapshots:
dependencies:
ms: 2.1.3
decimal.js@10.6.0: {}
decimal.js@10.6.0:
optional: true
deep-is@0.1.4: {}
@@ -7946,10 +7994,28 @@ snapshots:
diff@8.0.2: {}
dom-serializer@2.0.0:
dependencies:
domelementtype: 2.3.0
domhandler: 5.0.3
entities: 4.5.0
domelementtype@2.3.0: {}
domhandler@5.0.3:
dependencies:
domelementtype: 2.3.0
dompurify@3.3.1:
optionalDependencies:
'@types/trusted-types': 2.0.7
domutils@3.2.2:
dependencies:
dom-serializer: 2.0.0
domelementtype: 2.3.0
domhandler: 5.0.3
dotenv@17.2.3: {}
drizzle-kit@0.31.8:
@@ -8004,10 +8070,13 @@ snapshots:
entities@4.5.0: {}
entities@6.0.1: {}
entities@6.0.1:
optional: true
entities@7.0.0: {}
entities@7.0.1: {}
error-stack-parser-es@1.0.5: {}
es-define-property@1.0.1: {}
@@ -8464,9 +8533,19 @@ snapshots:
'@exodus/bytes': 1.10.0
transitivePeerDependencies:
- '@noble/hashes'
optional: true
html-escaper@3.0.3: {}
html-void-elements@3.0.0: {}
htmlparser2@10.1.0:
dependencies:
domelementtype: 2.3.0
domhandler: 5.0.3
domutils: 3.2.2
entities: 7.0.1
http-errors@2.0.1:
dependencies:
depd: 2.0.0
@@ -8481,6 +8560,7 @@ snapshots:
debug: 4.4.3
transitivePeerDependencies:
- supports-color
optional: true
https-proxy-agent@7.0.6:
dependencies:
@@ -8488,6 +8568,7 @@ snapshots:
debug: 4.4.3
transitivePeerDependencies:
- supports-color
optional: true
husky@9.1.7: {}
@@ -8556,7 +8637,8 @@ snapshots:
is-interactive@2.0.0: {}
is-potential-custom-element-name@1.0.1: {}
is-potential-custom-element-name@1.0.1:
optional: true
is-promise@4.0.0: {}
@@ -8615,6 +8697,7 @@ snapshots:
- bufferutil
- supports-color
- utf-8-validate
optional: true
jsesc@3.1.0: {}
@@ -8724,6 +8807,14 @@ snapshots:
lines-and-columns@1.2.4: {}
linkedom@0.18.12:
dependencies:
css-select: 5.2.2
cssom: 0.5.0
html-escaper: 3.0.3
htmlparser2: 10.1.0
uhyphen: 0.2.0
linkify-it@5.0.0:
dependencies:
uc.micro: 2.1.0
@@ -8757,7 +8848,8 @@ snapshots:
chalk: 5.6.2
is-unicode-supported: 1.3.0
lru-cache@11.2.5: {}
lru-cache@11.2.5:
optional: true
lru-cache@5.1.1:
dependencies:
@@ -8828,7 +8920,8 @@ snapshots:
unist-util-visit: 5.0.0
vfile: 6.0.3
mdn-data@2.12.2: {}
mdn-data@2.12.2:
optional: true
mdurl@2.0.0: {}
@@ -9059,13 +9152,10 @@ snapshots:
dependencies:
callsites: 3.1.0
parse5@7.3.0:
dependencies:
entities: 6.0.1
parse5@8.0.0:
dependencies:
entities: 6.0.1
optional: true
parseurl@1.3.3: {}
@@ -9308,6 +9398,7 @@ snapshots:
saxes@6.0.0:
dependencies:
xmlchars: 2.2.0
optional: true
search-insights@2.17.3: {}
@@ -9526,7 +9617,8 @@ snapshots:
supports-preserve-symlinks-flag@1.0.0: {}
symbol-tree@3.2.4: {}
symbol-tree@3.2.4:
optional: true
tabbable@6.4.0: {}
@@ -9565,11 +9657,13 @@ snapshots:
tinyrainbow@3.0.3: {}
tldts-core@7.0.19: {}
tldts-core@7.0.19:
optional: true
tldts@7.0.19:
dependencies:
tldts-core: 7.0.19
optional: true
toidentifier@1.0.1: {}
@@ -9586,10 +9680,12 @@ snapshots:
tough-cookie@6.0.0:
dependencies:
tldts: 7.0.19
optional: true
tr46@6.0.0:
dependencies:
punycode: 2.3.1
optional: true
tree-kill@1.2.2: {}
@@ -9680,6 +9776,8 @@ snapshots:
ufo@1.6.2: {}
uhyphen@0.2.0: {}
uint8array-extras@1.5.0: {}
undici-types@6.21.0: {}
@@ -10034,19 +10132,24 @@ snapshots:
w3c-xmlserializer@5.0.0:
dependencies:
xml-name-validator: 5.0.0
optional: true
webidl-conversions@8.0.1: {}
webidl-conversions@8.0.1:
optional: true
webpack-virtual-modules@0.6.2: {}
whatwg-mimetype@4.0.0: {}
whatwg-mimetype@4.0.0:
optional: true
whatwg-mimetype@5.0.0: {}
whatwg-mimetype@5.0.0:
optional: true
whatwg-url@15.1.0:
dependencies:
tr46: 6.0.0
webidl-conversions: 8.0.1
optional: true
which@2.0.2:
dependencies:
@@ -10071,7 +10174,8 @@ snapshots:
wrappy@1.0.2: {}
ws@8.19.0: {}
ws@8.19.0:
optional: true
wsl-utils@0.1.0:
dependencies:
@@ -10084,9 +10188,11 @@ snapshots:
xml-name-validator@4.0.0: {}
xml-name-validator@5.0.0: {}
xml-name-validator@5.0.0:
optional: true
xmlchars@2.2.0: {}
xmlchars@2.2.0:
optional: true
yallist@3.1.1: {}