├── .editorconfig ├── .gitignore ├── LICENSE ├── README.md ├── env.d.ts ├── index.html ├── package.json ├── pnpm-lock.yaml ├── postcss.config.js ├── public └── .keep ├── src ├── components │ ├── App.vue │ ├── BuildLogs.vue │ └── CodeMirror.vue ├── css │ ├── codemirror.css │ └── tailwind.css ├── hooks │ └── useEsbuild.ts ├── lib │ ├── builtin-modules.ts │ ├── constants.ts │ ├── editor.ts │ ├── esbuild.ts │ ├── path.ts │ ├── store.ts │ └── utils.ts └── main.ts ├── tailwind.config.js ├── tsconfig.json └── vite.config.ts /.editorconfig: -------------------------------------------------------------------------------- 1 | # EditorConfig is awesome: https://EditorConfig.org 2 | 3 | # top-most EditorConfig file 4 | root = true 5 | 6 | [*] 7 | indent_style = space 8 | indent_size = 2 9 | end_of_line = lf 10 | charset = utf-8 11 | trim_trailing_whitespace = false 12 | insert_final_newline = false -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | node_modules 2 | dist 3 | .DS_Store 4 | esbuild.wasm -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2021 EGOIST 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. -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # play-esbuild 2 | 3 | Try esbuild online: https://esbuild.egoist.dev 4 | 5 | ## Development 6 | 7 | Vite + Vue: 8 | 9 | ```bash 10 | pnpm i 11 | pnpm run dev 12 | ``` 13 | 14 | ## Sponsors 15 | 16 | [![sponsors](https://sponsors-images.egoist.dev/sponsors.svg)](https://github.com/sponsors/egoist) 17 | 18 | ## License 19 | 20 | MIT 21 | -------------------------------------------------------------------------------- /env.d.ts: -------------------------------------------------------------------------------- 1 | /// 2 | -------------------------------------------------------------------------------- /index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | esbuild playground 8 | 12 | 13 | 14 |
15 | 16 | 17 | 18 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "play-esbuild", 3 | "version": "1.0.0", 4 | "description": "", 5 | "main": "index.js", 6 | "scripts": { 7 | "test": "echo \"Error: no test specified\" && exit 1", 8 | "copy-esbuild": "cp node_modules/esbuild-wasm/esbuild.wasm public/esbuild.wasm", 9 | "dev": "npm run copy-esbuild && vite", 10 | "build": "npm run copy-esbuild && vite build" 11 | }, 12 | "keywords": [], 13 | "author": "", 14 | "license": "ISC", 15 | "devDependencies": { 16 | "@types/codemirror": "^5.60.5", 17 | "@types/ejs": "^3.1.0", 18 | "@types/parse-package-name": "^0.1.0", 19 | "@types/umami": "^2.10.0", 20 | "@vitejs/plugin-vue": "^5.2.1", 21 | "@vue/compiler-sfc": "^3.5.13", 22 | "codemirror": "^5.63.3", 23 | "ejs": "^3.1.6", 24 | "esbuild-wasm": "^0.24.2", 25 | "parse-package-name": "^1.0.0", 26 | "postcss": "^8.3.11", 27 | "resolve.exports": "^1.1.0", 28 | "tailwindcss": "^3.4.17", 29 | "typescript": "^4.4.4", 30 | "vite": "^6.0.5", 31 | "vue": "^3.5.13" 32 | } 33 | } 34 | -------------------------------------------------------------------------------- /pnpm-lock.yaml: -------------------------------------------------------------------------------- 1 | lockfileVersion: '9.0' 2 | 3 | settings: 4 | autoInstallPeers: true 5 | excludeLinksFromLockfile: false 6 | 7 | importers: 8 | 9 | .: 10 | devDependencies: 11 | '@types/codemirror': 12 | specifier: ^5.60.5 13 | version: 5.60.15 14 | '@types/ejs': 15 | specifier: ^3.1.0 16 | version: 3.1.5 17 | '@types/parse-package-name': 18 | specifier: ^0.1.0 19 | version: 0.1.3 20 | '@types/umami': 21 | specifier: ^2.10.0 22 | version: 2.10.0 23 | '@vitejs/plugin-vue': 24 | specifier: ^5.2.1 25 | version: 5.2.1(vite@6.0.5(jiti@1.21.7)(yaml@2.6.1))(vue@3.5.13(typescript@4.9.5)) 26 | '@vue/compiler-sfc': 27 | specifier: ^3.5.13 28 | version: 3.5.13 29 | codemirror: 30 | specifier: ^5.63.3 31 | version: 5.65.18 32 | ejs: 33 | specifier: ^3.1.6 34 | version: 3.1.10 35 | esbuild-wasm: 36 | specifier: ^0.24.2 37 | version: 0.24.2 38 | parse-package-name: 39 | specifier: ^1.0.0 40 | version: 1.0.0 41 | postcss: 42 | specifier: ^8.3.11 43 | version: 8.4.49 44 | resolve.exports: 45 | specifier: ^1.1.0 46 | version: 1.1.1 47 | tailwindcss: 48 | specifier: ^3.4.17 49 | version: 3.4.17 50 | typescript: 51 | specifier: ^4.4.4 52 | version: 4.9.5 53 | vite: 54 | specifier: ^6.0.5 55 | version: 6.0.5(jiti@1.21.7)(yaml@2.6.1) 56 | vue: 57 | specifier: ^3.5.13 58 | version: 3.5.13(typescript@4.9.5) 59 | 60 | packages: 61 | 62 | '@alloc/quick-lru@5.2.0': 63 | resolution: {integrity: sha512-UrcABB+4bUrFABwbluTIBErXwvbsU/V7TZWfmbgJfbkwiBuziS9gxdODUyuiecfdGQ85jglMW6juS3+z5TsKLw==} 64 | engines: {node: '>=10'} 65 | 66 | '@babel/helper-string-parser@7.25.9': 67 | resolution: {integrity: sha512-4A/SCr/2KLd5jrtOMFzaKjVtAei3+2r/NChoBNoZ3EyP/+GlhoaEGoWOZUmFmoITP7zOJyHIMm+DYRd8o3PvHA==} 68 | engines: {node: '>=6.9.0'} 69 | 70 | '@babel/helper-validator-identifier@7.25.9': 71 | resolution: {integrity: sha512-Ed61U6XJc3CVRfkERJWDz4dJwKe7iLmmJsbOGu9wSloNSFttHV0I8g6UAgb7qnK5ly5bGLPd4oXZlxCdANBOWQ==} 72 | engines: {node: '>=6.9.0'} 73 | 74 | '@babel/parser@7.26.3': 75 | resolution: {integrity: sha512-WJ/CvmY8Mea8iDXo6a7RK2wbmJITT5fN3BEkRuFlxVyNx8jOKIIhmC4fSkTcPcf8JyavbBwIe6OpiCOBXt/IcA==} 76 | engines: {node: '>=6.0.0'} 77 | hasBin: true 78 | 79 | '@babel/types@7.26.3': 80 | resolution: {integrity: sha512-vN5p+1kl59GVKMvTHt55NzzmYVxprfJD+ql7U9NFIfKCBkYE55LYtS+WtPlaYOyzydrKI8Nezd+aZextrd+FMA==} 81 | engines: {node: '>=6.9.0'} 82 | 83 | '@esbuild/aix-ppc64@0.24.0': 84 | resolution: {integrity: sha512-WtKdFM7ls47zkKHFVzMz8opM7LkcsIp9amDUBIAWirg70RM71WRSjdILPsY5Uv1D42ZpUfaPILDlfactHgsRkw==} 85 | engines: {node: '>=18'} 86 | cpu: [ppc64] 87 | os: [aix] 88 | 89 | '@esbuild/android-arm64@0.24.0': 90 | resolution: {integrity: sha512-Vsm497xFM7tTIPYK9bNTYJyF/lsP590Qc1WxJdlB6ljCbdZKU9SY8i7+Iin4kyhV/KV5J2rOKsBQbB77Ab7L/w==} 91 | engines: {node: '>=18'} 92 | cpu: [arm64] 93 | os: [android] 94 | 95 | '@esbuild/android-arm@0.24.0': 96 | resolution: {integrity: sha512-arAtTPo76fJ/ICkXWetLCc9EwEHKaeya4vMrReVlEIUCAUncH7M4bhMQ+M9Vf+FFOZJdTNMXNBrWwW+OXWpSew==} 97 | engines: {node: '>=18'} 98 | cpu: [arm] 99 | os: [android] 100 | 101 | '@esbuild/android-x64@0.24.0': 102 | resolution: {integrity: sha512-t8GrvnFkiIY7pa7mMgJd7p8p8qqYIz1NYiAoKc75Zyv73L3DZW++oYMSHPRarcotTKuSs6m3hTOa5CKHaS02TQ==} 103 | engines: {node: '>=18'} 104 | cpu: [x64] 105 | os: [android] 106 | 107 | '@esbuild/darwin-arm64@0.24.0': 108 | resolution: {integrity: sha512-CKyDpRbK1hXwv79soeTJNHb5EiG6ct3efd/FTPdzOWdbZZfGhpbcqIpiD0+vwmpu0wTIL97ZRPZu8vUt46nBSw==} 109 | engines: {node: '>=18'} 110 | cpu: [arm64] 111 | os: [darwin] 112 | 113 | '@esbuild/darwin-x64@0.24.0': 114 | resolution: {integrity: sha512-rgtz6flkVkh58od4PwTRqxbKH9cOjaXCMZgWD905JOzjFKW+7EiUObfd/Kav+A6Gyud6WZk9w+xu6QLytdi2OA==} 115 | engines: {node: '>=18'} 116 | cpu: [x64] 117 | os: [darwin] 118 | 119 | '@esbuild/freebsd-arm64@0.24.0': 120 | resolution: {integrity: sha512-6Mtdq5nHggwfDNLAHkPlyLBpE5L6hwsuXZX8XNmHno9JuL2+bg2BX5tRkwjyfn6sKbxZTq68suOjgWqCicvPXA==} 121 | engines: {node: '>=18'} 122 | cpu: [arm64] 123 | os: [freebsd] 124 | 125 | '@esbuild/freebsd-x64@0.24.0': 126 | resolution: {integrity: sha512-D3H+xh3/zphoX8ck4S2RxKR6gHlHDXXzOf6f/9dbFt/NRBDIE33+cVa49Kil4WUjxMGW0ZIYBYtaGCa2+OsQwQ==} 127 | engines: {node: '>=18'} 128 | cpu: [x64] 129 | os: [freebsd] 130 | 131 | '@esbuild/linux-arm64@0.24.0': 132 | resolution: {integrity: sha512-TDijPXTOeE3eaMkRYpcy3LarIg13dS9wWHRdwYRnzlwlA370rNdZqbcp0WTyyV/k2zSxfko52+C7jU5F9Tfj1g==} 133 | engines: {node: '>=18'} 134 | cpu: [arm64] 135 | os: [linux] 136 | 137 | '@esbuild/linux-arm@0.24.0': 138 | resolution: {integrity: sha512-gJKIi2IjRo5G6Glxb8d3DzYXlxdEj2NlkixPsqePSZMhLudqPhtZ4BUrpIuTjJYXxvF9njql+vRjB2oaC9XpBw==} 139 | engines: {node: '>=18'} 140 | cpu: [arm] 141 | os: [linux] 142 | 143 | '@esbuild/linux-ia32@0.24.0': 144 | resolution: {integrity: sha512-K40ip1LAcA0byL05TbCQ4yJ4swvnbzHscRmUilrmP9Am7//0UjPreh4lpYzvThT2Quw66MhjG//20mrufm40mA==} 145 | engines: {node: '>=18'} 146 | cpu: [ia32] 147 | os: [linux] 148 | 149 | '@esbuild/linux-loong64@0.24.0': 150 | resolution: {integrity: sha512-0mswrYP/9ai+CU0BzBfPMZ8RVm3RGAN/lmOMgW4aFUSOQBjA31UP8Mr6DDhWSuMwj7jaWOT0p0WoZ6jeHhrD7g==} 151 | engines: {node: '>=18'} 152 | cpu: [loong64] 153 | os: [linux] 154 | 155 | '@esbuild/linux-mips64el@0.24.0': 156 | resolution: {integrity: sha512-hIKvXm0/3w/5+RDtCJeXqMZGkI2s4oMUGj3/jM0QzhgIASWrGO5/RlzAzm5nNh/awHE0A19h/CvHQe6FaBNrRA==} 157 | engines: {node: '>=18'} 158 | cpu: [mips64el] 159 | os: [linux] 160 | 161 | '@esbuild/linux-ppc64@0.24.0': 162 | resolution: {integrity: sha512-HcZh5BNq0aC52UoocJxaKORfFODWXZxtBaaZNuN3PUX3MoDsChsZqopzi5UupRhPHSEHotoiptqikjN/B77mYQ==} 163 | engines: {node: '>=18'} 164 | cpu: [ppc64] 165 | os: [linux] 166 | 167 | '@esbuild/linux-riscv64@0.24.0': 168 | resolution: {integrity: sha512-bEh7dMn/h3QxeR2KTy1DUszQjUrIHPZKyO6aN1X4BCnhfYhuQqedHaa5MxSQA/06j3GpiIlFGSsy1c7Gf9padw==} 169 | engines: {node: '>=18'} 170 | cpu: [riscv64] 171 | os: [linux] 172 | 173 | '@esbuild/linux-s390x@0.24.0': 174 | resolution: {integrity: sha512-ZcQ6+qRkw1UcZGPyrCiHHkmBaj9SiCD8Oqd556HldP+QlpUIe2Wgn3ehQGVoPOvZvtHm8HPx+bH20c9pvbkX3g==} 175 | engines: {node: '>=18'} 176 | cpu: [s390x] 177 | os: [linux] 178 | 179 | '@esbuild/linux-x64@0.24.0': 180 | resolution: {integrity: sha512-vbutsFqQ+foy3wSSbmjBXXIJ6PL3scghJoM8zCL142cGaZKAdCZHyf+Bpu/MmX9zT9Q0zFBVKb36Ma5Fzfa8xA==} 181 | engines: {node: '>=18'} 182 | cpu: [x64] 183 | os: [linux] 184 | 185 | '@esbuild/netbsd-x64@0.24.0': 186 | resolution: {integrity: sha512-hjQ0R/ulkO8fCYFsG0FZoH+pWgTTDreqpqY7UnQntnaKv95uP5iW3+dChxnx7C3trQQU40S+OgWhUVwCjVFLvg==} 187 | engines: {node: '>=18'} 188 | cpu: [x64] 189 | os: [netbsd] 190 | 191 | '@esbuild/openbsd-arm64@0.24.0': 192 | resolution: {integrity: sha512-MD9uzzkPQbYehwcN583yx3Tu5M8EIoTD+tUgKF982WYL9Pf5rKy9ltgD0eUgs8pvKnmizxjXZyLt0z6DC3rRXg==} 193 | engines: {node: '>=18'} 194 | cpu: [arm64] 195 | os: [openbsd] 196 | 197 | '@esbuild/openbsd-x64@0.24.0': 198 | resolution: {integrity: sha512-4ir0aY1NGUhIC1hdoCzr1+5b43mw99uNwVzhIq1OY3QcEwPDO3B7WNXBzaKY5Nsf1+N11i1eOfFcq+D/gOS15Q==} 199 | engines: {node: '>=18'} 200 | cpu: [x64] 201 | os: [openbsd] 202 | 203 | '@esbuild/sunos-x64@0.24.0': 204 | resolution: {integrity: sha512-jVzdzsbM5xrotH+W5f1s+JtUy1UWgjU0Cf4wMvffTB8m6wP5/kx0KiaLHlbJO+dMgtxKV8RQ/JvtlFcdZ1zCPA==} 205 | engines: {node: '>=18'} 206 | cpu: [x64] 207 | os: [sunos] 208 | 209 | '@esbuild/win32-arm64@0.24.0': 210 | resolution: {integrity: sha512-iKc8GAslzRpBytO2/aN3d2yb2z8XTVfNV0PjGlCxKo5SgWmNXx82I/Q3aG1tFfS+A2igVCY97TJ8tnYwpUWLCA==} 211 | engines: {node: '>=18'} 212 | cpu: [arm64] 213 | os: [win32] 214 | 215 | '@esbuild/win32-ia32@0.24.0': 216 | resolution: {integrity: sha512-vQW36KZolfIudCcTnaTpmLQ24Ha1RjygBo39/aLkM2kmjkWmZGEJ5Gn9l5/7tzXA42QGIoWbICfg6KLLkIw6yw==} 217 | engines: {node: '>=18'} 218 | cpu: [ia32] 219 | os: [win32] 220 | 221 | '@esbuild/win32-x64@0.24.0': 222 | resolution: {integrity: sha512-7IAFPrjSQIJrGsK6flwg7NFmwBoSTyF3rl7If0hNUFQU4ilTsEPL6GuMuU9BfIWVVGuRnuIidkSMC+c0Otu8IA==} 223 | engines: {node: '>=18'} 224 | cpu: [x64] 225 | os: [win32] 226 | 227 | '@isaacs/cliui@8.0.2': 228 | resolution: {integrity: sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==} 229 | engines: {node: '>=12'} 230 | 231 | '@jridgewell/gen-mapping@0.3.8': 232 | resolution: {integrity: sha512-imAbBGkb+ebQyxKgzv5Hu2nmROxoDOXHh80evxdoXNOrvAnVx7zimzc1Oo5h9RlfV4vPXaE2iM5pOFbvOCClWA==} 233 | engines: {node: '>=6.0.0'} 234 | 235 | '@jridgewell/resolve-uri@3.1.2': 236 | resolution: {integrity: sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==} 237 | engines: {node: '>=6.0.0'} 238 | 239 | '@jridgewell/set-array@1.2.1': 240 | resolution: {integrity: sha512-R8gLRTZeyp03ymzP/6Lil/28tGeGEzhx1q2k703KGWRAI1VdvPIXdG70VJc2pAMw3NA6JKL5hhFu1sJX0Mnn/A==} 241 | engines: {node: '>=6.0.0'} 242 | 243 | '@jridgewell/sourcemap-codec@1.5.0': 244 | resolution: {integrity: sha512-gv3ZRaISU3fjPAgNsriBRqGWQL6quFx04YMPW/zD8XMLsU32mhCCbfbO6KZFLjvYpCZ8zyDEgqsgf+PwPaM7GQ==} 245 | 246 | '@jridgewell/trace-mapping@0.3.25': 247 | resolution: {integrity: sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ==} 248 | 249 | '@nodelib/fs.scandir@2.1.5': 250 | resolution: {integrity: sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==} 251 | engines: {node: '>= 8'} 252 | 253 | '@nodelib/fs.stat@2.0.5': 254 | resolution: {integrity: sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==} 255 | engines: {node: '>= 8'} 256 | 257 | '@nodelib/fs.walk@1.2.8': 258 | resolution: {integrity: sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==} 259 | engines: {node: '>= 8'} 260 | 261 | '@pkgjs/parseargs@0.11.0': 262 | resolution: {integrity: sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==} 263 | engines: {node: '>=14'} 264 | 265 | '@rollup/rollup-android-arm-eabi@4.29.0': 266 | resolution: {integrity: sha512-TnF0md3qWSRDlU96y9+0dd5RNrlXiQUp1K2pK1UpNmjeND+o9ts9Jxv3G6ntagkt8jVh0KAT1VYgU0nCz5gt2w==} 267 | cpu: [arm] 268 | os: [android] 269 | 270 | '@rollup/rollup-android-arm64@4.29.0': 271 | resolution: {integrity: sha512-L/7oX07eY6ACt2NXDrku1JIPdf9VGV/DI92EjAd8FRDzMMub5hXFpT1OegBqimJh9xy9Vv+nToaVtZp4Ku9SEA==} 272 | cpu: [arm64] 273 | os: [android] 274 | 275 | '@rollup/rollup-darwin-arm64@4.29.0': 276 | resolution: {integrity: sha512-I1ZucWPVS96hjAsMSJiGosHTqMulMynrmTN+Xde5OsLcU5SjE0xylBmQ/DbB2psJ+HasINrJYz8HQpojtAw2eA==} 277 | cpu: [arm64] 278 | os: [darwin] 279 | 280 | '@rollup/rollup-darwin-x64@4.29.0': 281 | resolution: {integrity: sha512-CTZ+lHMsTbH1q/XLKzmnJWxl2r/1xdv7cnjwbi5v+95nVA1syikxWLvqur4nDoGDHjC8oNMBGurnQptpuFJHXA==} 282 | cpu: [x64] 283 | os: [darwin] 284 | 285 | '@rollup/rollup-freebsd-arm64@4.29.0': 286 | resolution: {integrity: sha512-BB8+4OMzk2JiKL5+aK8A0pi9DPB5pkIBZWXr19+grdez9b0VKihvV432uSwuZLO0sI6zCyxak8NO3mZ1yjM1jA==} 287 | cpu: [arm64] 288 | os: [freebsd] 289 | 290 | '@rollup/rollup-freebsd-x64@4.29.0': 291 | resolution: {integrity: sha512-Udz9Uh26uEE6phGMG2++TfpsLK/z4cYJqrIOyVhig/PMoWiZLghpjZUQvsAylsoztbpg0/QmplkDAyyVq0x6Jg==} 292 | cpu: [x64] 293 | os: [freebsd] 294 | 295 | '@rollup/rollup-linux-arm-gnueabihf@4.29.0': 296 | resolution: {integrity: sha512-IPSCTzP8GRYzY+siSnggIKrckC2U+kVXoen6eSHRDgU9a4EZCHHWWOiKio1EkieOOk2j6EvZaaHfQUCmt8UJBg==} 297 | cpu: [arm] 298 | os: [linux] 299 | 300 | '@rollup/rollup-linux-arm-musleabihf@4.29.0': 301 | resolution: {integrity: sha512-GvHPu0UIDx+ohyS8vTYnwoSVMM5BH3NO+JwQs6GWNCuQVlC5rKxnH2WClTGu3NxiIfhKLai08IKUwn3QbzX1UQ==} 302 | cpu: [arm] 303 | os: [linux] 304 | 305 | '@rollup/rollup-linux-arm64-gnu@4.29.0': 306 | resolution: {integrity: sha512-Pnnn/2CAZWcH9GQoj1nnr85Ejh7aNDe5MsEV0xhuFNUPF0SdnutJ7b2muOI5Kx12T0/i2ol5B/tlhMviZQDL3g==} 307 | cpu: [arm64] 308 | os: [linux] 309 | 310 | '@rollup/rollup-linux-arm64-musl@4.29.0': 311 | resolution: {integrity: sha512-AP+DLj4q9FT22ZL43ssA3gizEn7/MfJcZ1BOuyEPqoriuH3a8VRuDddN0MtpUwEtiZL6jc1GY5/eL99hkloQ1Q==} 312 | cpu: [arm64] 313 | os: [linux] 314 | 315 | '@rollup/rollup-linux-loongarch64-gnu@4.29.0': 316 | resolution: {integrity: sha512-1+jPFClHmDATqbk0Cwi74KEOymVcs09Vbqe/CTKqLwCP0TeP2CACfnMnjYBs5CJgO20e/4bxFtmbR/9fKE1gug==} 317 | cpu: [loong64] 318 | os: [linux] 319 | 320 | '@rollup/rollup-linux-powerpc64le-gnu@4.29.0': 321 | resolution: {integrity: sha512-Nmt5Us5w2dL8eh7QVyAIDVVwBv4wk8ljrBQe7lWkLaOcwABDaFQ3K4sAAC6IsOdJwaXXW+d85zVaMN+Xl8Co2w==} 322 | cpu: [ppc64] 323 | os: [linux] 324 | 325 | '@rollup/rollup-linux-riscv64-gnu@4.29.0': 326 | resolution: {integrity: sha512-KGuQ8WGhnq09LR7eOru7P9jfBSYXTMhq6TyavWfmEo+TxvkvuRwOCee5lPIa6HYjblOuFr4GeOxSE0c8iyw2Fg==} 327 | cpu: [riscv64] 328 | os: [linux] 329 | 330 | '@rollup/rollup-linux-s390x-gnu@4.29.0': 331 | resolution: {integrity: sha512-lSQtvrYIONme7a4gbf4O9d3zbZat3/5covIeoqk27ZIkTgBeL/67x+wq2bZfpLjkqQQp5SjBPQ/n0sg8iArzTg==} 332 | cpu: [s390x] 333 | os: [linux] 334 | 335 | '@rollup/rollup-linux-x64-gnu@4.29.0': 336 | resolution: {integrity: sha512-qh0ussrXBwnF4L07M9t1+jpHRhiGSae+wpNQDbmlXHXciT7pqpZ5zpk4dyGZPtDGB2l2clDiufE16BufXPGRWQ==} 337 | cpu: [x64] 338 | os: [linux] 339 | 340 | '@rollup/rollup-linux-x64-musl@4.29.0': 341 | resolution: {integrity: sha512-YEABzSaRS7+v14yw6MVBZoMqLoUyTX1/sJoGeC0euvgMrzvw0i+jHo4keDZgYeOblfwdseVAf6ylxWSvcBAKTA==} 342 | cpu: [x64] 343 | os: [linux] 344 | 345 | '@rollup/rollup-win32-arm64-msvc@4.29.0': 346 | resolution: {integrity: sha512-jA4+oxG7QTTtSQxwSHzFVwShcppHO2DpkbAM59pfD5WMG/da79yQaeBtXAfGTI+ciUx8hqK3RF3H2KWByITXtQ==} 347 | cpu: [arm64] 348 | os: [win32] 349 | 350 | '@rollup/rollup-win32-ia32-msvc@4.29.0': 351 | resolution: {integrity: sha512-4TQbLoAQVu9uE+cvh47JnjRZylXVdRCoOkRSVF2Rr2T0U1YwphGRjR0sHyRPEt95y3ETT4YFTTzQPq1O4bcjmw==} 352 | cpu: [ia32] 353 | os: [win32] 354 | 355 | '@rollup/rollup-win32-x64-msvc@4.29.0': 356 | resolution: {integrity: sha512-GsFvcTZ7Yj9k94Qm0qgav7pxmQ7lQDR9NjoelRaxeV1UF6JSDfanR/2tHZ8hS7Ps4KPIVf5AElYPRPmN/Q0ZkQ==} 357 | cpu: [x64] 358 | os: [win32] 359 | 360 | '@types/codemirror@5.60.15': 361 | resolution: {integrity: sha512-dTOvwEQ+ouKJ/rE9LT1Ue2hmP6H1mZv5+CCnNWu2qtiOe2LQa9lCprEY20HxiDmV/Bxh+dXjywmy5aKvoGjULA==} 362 | 363 | '@types/ejs@3.1.5': 364 | resolution: {integrity: sha512-nv+GSx77ZtXiJzwKdsASqi+YQ5Z7vwHsTP0JY2SiQgjGckkBRKZnk8nIM+7oUZ1VCtuTz0+By4qVR7fqzp/Dfg==} 365 | 366 | '@types/estree@1.0.6': 367 | resolution: {integrity: sha512-AYnb1nQyY49te+VRAVgmzfcgjYS91mY5P0TKUDCLEM+gNnA+3T6rWITXRLYCpahpqSQbN5cE+gHpnPyXjHWxcw==} 368 | 369 | '@types/parse-package-name@0.1.3': 370 | resolution: {integrity: sha512-lWrVKSTl0+vN53rNh2OQMyQTFG6SMCUgBobtUBESdlWBHukhPrU/mbuLBJntDq6XnACBdjONxKwzx+HGBgNVQA==} 371 | 372 | '@types/tern@0.23.9': 373 | resolution: {integrity: sha512-ypzHFE/wBzh+BlH6rrBgS5I/Z7RD21pGhZ2rltb/+ZrVM1awdZwjx7hE5XfuYgHWk9uvV5HLZN3SloevCAp3Bw==} 374 | 375 | '@types/umami@2.10.0': 376 | resolution: {integrity: sha512-iWcs1KkcO3ooIi2rR9M5drmpQzlsT+sFiyWElIGmVwjdGlp+vQmy/VYIChYnF5ETqx7KrL80JfSkroS6dm37Hg==} 377 | 378 | '@vitejs/plugin-vue@5.2.1': 379 | resolution: {integrity: sha512-cxh314tzaWwOLqVes2gnnCtvBDcM1UMdn+iFR+UjAn411dPT3tOmqrJjbMd7koZpMAmBM/GqeV4n9ge7JSiJJQ==} 380 | engines: {node: ^18.0.0 || >=20.0.0} 381 | peerDependencies: 382 | vite: ^5.0.0 || ^6.0.0 383 | vue: ^3.2.25 384 | 385 | '@vue/compiler-core@3.5.13': 386 | resolution: {integrity: sha512-oOdAkwqUfW1WqpwSYJce06wvt6HljgY3fGeM9NcVA1HaYOij3mZG9Rkysn0OHuyUAGMbEbARIpsG+LPVlBJ5/Q==} 387 | 388 | '@vue/compiler-dom@3.5.13': 389 | resolution: {integrity: sha512-ZOJ46sMOKUjO3e94wPdCzQ6P1Lx/vhp2RSvfaab88Ajexs0AHeV0uasYhi99WPaogmBlRHNRuly8xV75cNTMDA==} 390 | 391 | '@vue/compiler-sfc@3.5.13': 392 | resolution: {integrity: sha512-6VdaljMpD82w6c2749Zhf5T9u5uLBWKnVue6XWxprDobftnletJ8+oel7sexFfM3qIxNmVE7LSFGTpv6obNyaQ==} 393 | 394 | '@vue/compiler-ssr@3.5.13': 395 | resolution: {integrity: sha512-wMH6vrYHxQl/IybKJagqbquvxpWCuVYpoUJfCqFZwa/JY1GdATAQ+TgVtgrwwMZ0D07QhA99rs/EAAWfvG6KpA==} 396 | 397 | '@vue/reactivity@3.5.13': 398 | resolution: {integrity: sha512-NaCwtw8o48B9I6L1zl2p41OHo/2Z4wqYGGIK1Khu5T7yxrn+ATOixn/Udn2m+6kZKB/J7cuT9DbWWhRxqixACg==} 399 | 400 | '@vue/runtime-core@3.5.13': 401 | resolution: {integrity: sha512-Fj4YRQ3Az0WTZw1sFe+QDb0aXCerigEpw418pw1HBUKFtnQHWzwojaukAs2X/c9DQz4MQ4bsXTGlcpGxU/RCIw==} 402 | 403 | '@vue/runtime-dom@3.5.13': 404 | resolution: {integrity: sha512-dLaj94s93NYLqjLiyFzVs9X6dWhTdAlEAciC3Moq7gzAc13VJUdCnjjRurNM6uTLFATRHexHCTu/Xp3eW6yoog==} 405 | 406 | '@vue/server-renderer@3.5.13': 407 | resolution: {integrity: sha512-wAi4IRJV/2SAW3htkTlB+dHeRmpTiVIK1OGLWV1yeStVSebSQQOwGwIq0D3ZIoBj2C2qpgz5+vX9iEBkTdk5YA==} 408 | peerDependencies: 409 | vue: 3.5.13 410 | 411 | '@vue/shared@3.5.13': 412 | resolution: {integrity: sha512-/hnE/qP5ZoGpol0a5mDi45bOd7t3tjYJBjsgCsivow7D48cJeV5l05RD82lPqi7gRiphZM37rnhW1l6ZoCNNnQ==} 413 | 414 | ansi-regex@5.0.1: 415 | resolution: {integrity: sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==} 416 | engines: {node: '>=8'} 417 | 418 | ansi-regex@6.1.0: 419 | resolution: {integrity: sha512-7HSX4QQb4CspciLpVFwyRe79O3xsIZDDLER21kERQ71oaPodF8jL725AgJMFAYbooIqolJoRLuM81SpeUkpkvA==} 420 | engines: {node: '>=12'} 421 | 422 | ansi-styles@4.3.0: 423 | resolution: {integrity: sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==} 424 | engines: {node: '>=8'} 425 | 426 | ansi-styles@6.2.1: 427 | resolution: {integrity: sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==} 428 | engines: {node: '>=12'} 429 | 430 | any-promise@1.3.0: 431 | resolution: {integrity: sha512-7UvmKalWRt1wgjL1RrGxoSJW/0QZFIegpeGvZG9kjp8vrRu55XTHbwnqq2GpXm9uLbcuhxm3IqX9OB4MZR1b2A==} 432 | 433 | anymatch@3.1.3: 434 | resolution: {integrity: sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==} 435 | engines: {node: '>= 8'} 436 | 437 | arg@5.0.2: 438 | resolution: {integrity: sha512-PYjyFOLKQ9y57JvQ6QLo8dAgNqswh8M1RMJYdQduT6xbWSgK36P/Z/v+p888pM69jMMfS8Xd8F6I1kQ/I9HUGg==} 439 | 440 | async@3.2.6: 441 | resolution: {integrity: sha512-htCUDlxyyCLMgaM3xXg0C0LW2xqfuQ6p05pCEIsXuyQ+a1koYKTuBMzRNwmybfLgvJDMd0r1LTn4+E0Ti6C2AA==} 442 | 443 | balanced-match@1.0.2: 444 | resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==} 445 | 446 | binary-extensions@2.3.0: 447 | resolution: {integrity: sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw==} 448 | engines: {node: '>=8'} 449 | 450 | brace-expansion@1.1.11: 451 | resolution: {integrity: sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==} 452 | 453 | brace-expansion@2.0.1: 454 | resolution: {integrity: sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==} 455 | 456 | braces@3.0.3: 457 | resolution: {integrity: sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==} 458 | engines: {node: '>=8'} 459 | 460 | camelcase-css@2.0.1: 461 | resolution: {integrity: sha512-QOSvevhslijgYwRx6Rv7zKdMF8lbRmx+uQGx2+vDc+KI/eBnsy9kit5aj23AgGu3pa4t9AgwbnXWqS+iOY+2aA==} 462 | engines: {node: '>= 6'} 463 | 464 | chalk@4.1.2: 465 | resolution: {integrity: sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==} 466 | engines: {node: '>=10'} 467 | 468 | chokidar@3.6.0: 469 | resolution: {integrity: sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==} 470 | engines: {node: '>= 8.10.0'} 471 | 472 | codemirror@5.65.18: 473 | resolution: {integrity: sha512-Gaz4gHnkbHMGgahNt3CA5HBk5lLQBqmD/pBgeB4kQU6OedZmqMBjlRF0LSrp2tJ4wlLNPm2FfaUd1pDy0mdlpA==} 474 | 475 | color-convert@2.0.1: 476 | resolution: {integrity: sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==} 477 | engines: {node: '>=7.0.0'} 478 | 479 | color-name@1.1.4: 480 | resolution: {integrity: sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==} 481 | 482 | commander@4.1.1: 483 | resolution: {integrity: sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA==} 484 | engines: {node: '>= 6'} 485 | 486 | concat-map@0.0.1: 487 | resolution: {integrity: sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==} 488 | 489 | cross-spawn@7.0.6: 490 | resolution: {integrity: sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==} 491 | engines: {node: '>= 8'} 492 | 493 | cssesc@3.0.0: 494 | resolution: {integrity: sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==} 495 | engines: {node: '>=4'} 496 | hasBin: true 497 | 498 | csstype@3.1.3: 499 | resolution: {integrity: sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw==} 500 | 501 | didyoumean@1.2.2: 502 | resolution: {integrity: sha512-gxtyfqMg7GKyhQmb056K7M3xszy/myH8w+B4RT+QXBQsvAOdc3XymqDDPHx1BgPgsdAA5SIifona89YtRATDzw==} 503 | 504 | dlv@1.1.3: 505 | resolution: {integrity: sha512-+HlytyjlPKnIG8XuRG8WvmBP8xs8P71y+SKKS6ZXWoEgLuePxtDoUEiH7WkdePWrQ5JBpE6aoVqfZfJUQkjXwA==} 506 | 507 | eastasianwidth@0.2.0: 508 | resolution: {integrity: sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==} 509 | 510 | ejs@3.1.10: 511 | resolution: {integrity: sha512-UeJmFfOrAQS8OJWPZ4qtgHyWExa088/MtK5UEyoJGFH67cDEXkZSviOiKRCZ4Xij0zxI3JECgYs3oKx+AizQBA==} 512 | engines: {node: '>=0.10.0'} 513 | hasBin: true 514 | 515 | emoji-regex@8.0.0: 516 | resolution: {integrity: sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==} 517 | 518 | emoji-regex@9.2.2: 519 | resolution: {integrity: sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==} 520 | 521 | entities@4.5.0: 522 | resolution: {integrity: sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==} 523 | engines: {node: '>=0.12'} 524 | 525 | esbuild-wasm@0.24.2: 526 | resolution: {integrity: sha512-03/7Z1gD+ohDnScFztvI4XddTAbKVmMEzCvvkBpQdWKEXJ+73dTyeNrmdxP1Q0zpDMFjzUJwtK4rLjqwiHbzkw==} 527 | engines: {node: '>=18'} 528 | hasBin: true 529 | 530 | esbuild@0.24.0: 531 | resolution: {integrity: sha512-FuLPevChGDshgSicjisSooU0cemp/sGXR841D5LHMB7mTVOmsEHcAxaH3irL53+8YDIeVNQEySh4DaYU/iuPqQ==} 532 | engines: {node: '>=18'} 533 | hasBin: true 534 | 535 | estree-walker@2.0.2: 536 | resolution: {integrity: sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==} 537 | 538 | fast-glob@3.3.2: 539 | resolution: {integrity: sha512-oX2ruAFQwf/Orj8m737Y5adxDQO0LAB7/S5MnxCdTNDd4p6BsyIVsv9JQsATbTSq8KHRpLwIHbVlUNatxd+1Ow==} 540 | engines: {node: '>=8.6.0'} 541 | 542 | fastq@1.17.1: 543 | resolution: {integrity: sha512-sRVD3lWVIXWg6By68ZN7vho9a1pQcN/WBFaAAsDDFzlJjvoGx0P8z7V1t72grFJfJhu3YPZBuu25f7Kaw2jN1w==} 544 | 545 | filelist@1.0.4: 546 | resolution: {integrity: sha512-w1cEuf3S+DrLCQL7ET6kz+gmlJdbq9J7yXCSjK/OZCPA+qEN1WyF4ZAf0YYJa4/shHJra2t/d/r8SV4Ji+x+8Q==} 547 | 548 | fill-range@7.1.1: 549 | resolution: {integrity: sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==} 550 | engines: {node: '>=8'} 551 | 552 | foreground-child@3.3.0: 553 | resolution: {integrity: sha512-Ld2g8rrAyMYFXBhEqMz8ZAHBi4J4uS1i/CxGMDnjyFWddMXLVcDp051DZfu+t7+ab7Wv6SMqpWmyFIj5UbfFvg==} 554 | engines: {node: '>=14'} 555 | 556 | fsevents@2.3.3: 557 | resolution: {integrity: sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==} 558 | engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0} 559 | os: [darwin] 560 | 561 | function-bind@1.1.2: 562 | resolution: {integrity: sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==} 563 | 564 | glob-parent@5.1.2: 565 | resolution: {integrity: sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==} 566 | engines: {node: '>= 6'} 567 | 568 | glob-parent@6.0.2: 569 | resolution: {integrity: sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==} 570 | engines: {node: '>=10.13.0'} 571 | 572 | glob@10.4.5: 573 | resolution: {integrity: sha512-7Bv8RF0k6xjo7d4A/PxYLbUCfb6c+Vpd2/mB2yRDlew7Jb5hEXiCD9ibfO7wpk8i4sevK6DFny9h7EYbM3/sHg==} 574 | hasBin: true 575 | 576 | has-flag@4.0.0: 577 | resolution: {integrity: sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==} 578 | engines: {node: '>=8'} 579 | 580 | hasown@2.0.2: 581 | resolution: {integrity: sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==} 582 | engines: {node: '>= 0.4'} 583 | 584 | is-binary-path@2.1.0: 585 | resolution: {integrity: sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==} 586 | engines: {node: '>=8'} 587 | 588 | is-core-module@2.16.0: 589 | resolution: {integrity: sha512-urTSINYfAYgcbLb0yDQ6egFm6h3Mo1DcF9EkyXSRjjzdHbsulg01qhwWuXdOoUBuTkbQ80KDboXa0vFJ+BDH+g==} 590 | engines: {node: '>= 0.4'} 591 | 592 | is-extglob@2.1.1: 593 | resolution: {integrity: sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==} 594 | engines: {node: '>=0.10.0'} 595 | 596 | is-fullwidth-code-point@3.0.0: 597 | resolution: {integrity: sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==} 598 | engines: {node: '>=8'} 599 | 600 | is-glob@4.0.3: 601 | resolution: {integrity: sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==} 602 | engines: {node: '>=0.10.0'} 603 | 604 | is-number@7.0.0: 605 | resolution: {integrity: sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==} 606 | engines: {node: '>=0.12.0'} 607 | 608 | isexe@2.0.0: 609 | resolution: {integrity: sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==} 610 | 611 | jackspeak@3.4.3: 612 | resolution: {integrity: sha512-OGlZQpz2yfahA/Rd1Y8Cd9SIEsqvXkLVoSw/cgwhnhFMDbsQFeZYoJJ7bIZBS9BcamUW96asq/npPWugM+RQBw==} 613 | 614 | jake@10.9.2: 615 | resolution: {integrity: sha512-2P4SQ0HrLQ+fw6llpLnOaGAvN2Zu6778SJMrCUwns4fOoG9ayrTiZk3VV8sCPkVZF8ab0zksVpS8FDY5pRCNBA==} 616 | engines: {node: '>=10'} 617 | hasBin: true 618 | 619 | jiti@1.21.7: 620 | resolution: {integrity: sha512-/imKNG4EbWNrVjoNC/1H5/9GFy+tqjGBHCaSsN+P2RnPqjsLmv6UD3Ej+Kj8nBWaRAwyk7kK5ZUc+OEatnTR3A==} 621 | hasBin: true 622 | 623 | lilconfig@3.1.3: 624 | resolution: {integrity: sha512-/vlFKAoH5Cgt3Ie+JLhRbwOsCQePABiU3tJ1egGvyQ+33R/vcwM2Zl2QR/LzjsBeItPt3oSVXapn+m4nQDvpzw==} 625 | engines: {node: '>=14'} 626 | 627 | lines-and-columns@1.2.4: 628 | resolution: {integrity: sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==} 629 | 630 | lru-cache@10.4.3: 631 | resolution: {integrity: sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==} 632 | 633 | magic-string@0.30.17: 634 | resolution: {integrity: sha512-sNPKHvyjVf7gyjwS4xGTaW/mCnF8wnjtifKBEhxfZ7E/S8tQ0rssrwGNn6q8JH/ohItJfSQp9mBtQYuTlH5QnA==} 635 | 636 | merge2@1.4.1: 637 | resolution: {integrity: sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==} 638 | engines: {node: '>= 8'} 639 | 640 | micromatch@4.0.8: 641 | resolution: {integrity: sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==} 642 | engines: {node: '>=8.6'} 643 | 644 | minimatch@3.1.2: 645 | resolution: {integrity: sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==} 646 | 647 | minimatch@5.1.6: 648 | resolution: {integrity: sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g==} 649 | engines: {node: '>=10'} 650 | 651 | minimatch@9.0.5: 652 | resolution: {integrity: sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==} 653 | engines: {node: '>=16 || 14 >=14.17'} 654 | 655 | minipass@7.1.2: 656 | resolution: {integrity: sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==} 657 | engines: {node: '>=16 || 14 >=14.17'} 658 | 659 | mz@2.7.0: 660 | resolution: {integrity: sha512-z81GNO7nnYMEhrGh9LeymoE4+Yr0Wn5McHIZMK5cfQCl+NDX08sCZgUc9/6MHni9IWuFLm1Z3HTCXu2z9fN62Q==} 661 | 662 | nanoid@3.3.8: 663 | resolution: {integrity: sha512-WNLf5Sd8oZxOm+TzppcYk8gVOgP+l58xNy58D0nbUnOxOWRWvlcCV4kUF7ltmI6PsrLl/BgKEyS4mqsGChFN0w==} 664 | engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1} 665 | hasBin: true 666 | 667 | normalize-path@3.0.0: 668 | resolution: {integrity: sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==} 669 | engines: {node: '>=0.10.0'} 670 | 671 | object-assign@4.1.1: 672 | resolution: {integrity: sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==} 673 | engines: {node: '>=0.10.0'} 674 | 675 | object-hash@3.0.0: 676 | resolution: {integrity: sha512-RSn9F68PjH9HqtltsSnqYC1XXoWe9Bju5+213R98cNGttag9q9yAOTzdbsqvIa7aNm5WffBZFpWYr2aWrklWAw==} 677 | engines: {node: '>= 6'} 678 | 679 | package-json-from-dist@1.0.1: 680 | resolution: {integrity: sha512-UEZIS3/by4OC8vL3P2dTXRETpebLI2NiI5vIrjaD/5UtrkFX/tNbwjTSRAGC/+7CAo2pIcBaRgWmcBBHcsaCIw==} 681 | 682 | parse-package-name@1.0.0: 683 | resolution: {integrity: sha512-kBeTUtcj+SkyfaW4+KBe0HtsloBJ/mKTPoxpVdA57GZiPerREsUWJOhVj9anXweFiJkm5y8FG1sxFZkZ0SN6wg==} 684 | 685 | path-key@3.1.1: 686 | resolution: {integrity: sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==} 687 | engines: {node: '>=8'} 688 | 689 | path-parse@1.0.7: 690 | resolution: {integrity: sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==} 691 | 692 | path-scurry@1.11.1: 693 | resolution: {integrity: sha512-Xa4Nw17FS9ApQFJ9umLiJS4orGjm7ZzwUrwamcGQuHSzDyth9boKDaycYdDcZDuqYATXw4HFXgaqWTctW/v1HA==} 694 | engines: {node: '>=16 || 14 >=14.18'} 695 | 696 | picocolors@1.1.1: 697 | resolution: {integrity: sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==} 698 | 699 | picomatch@2.3.1: 700 | resolution: {integrity: sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==} 701 | engines: {node: '>=8.6'} 702 | 703 | pify@2.3.0: 704 | resolution: {integrity: sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog==} 705 | engines: {node: '>=0.10.0'} 706 | 707 | pirates@4.0.6: 708 | resolution: {integrity: sha512-saLsH7WeYYPiD25LDuLRRY/i+6HaPYr6G1OUlN39otzkSTxKnubR9RTxS3/Kk50s1g2JTgFwWQDQyplC5/SHZg==} 709 | engines: {node: '>= 6'} 710 | 711 | postcss-import@15.1.0: 712 | resolution: {integrity: sha512-hpr+J05B2FVYUAXHeK1YyI267J/dDDhMU6B6civm8hSY1jYJnBXxzKDKDswzJmtLHryrjhnDjqqp/49t8FALew==} 713 | engines: {node: '>=14.0.0'} 714 | peerDependencies: 715 | postcss: ^8.0.0 716 | 717 | postcss-js@4.0.1: 718 | resolution: {integrity: sha512-dDLF8pEO191hJMtlHFPRa8xsizHaM82MLfNkUHdUtVEV3tgTp5oj+8qbEqYM57SLfc74KSbw//4SeJma2LRVIw==} 719 | engines: {node: ^12 || ^14 || >= 16} 720 | peerDependencies: 721 | postcss: ^8.4.21 722 | 723 | postcss-load-config@4.0.2: 724 | resolution: {integrity: sha512-bSVhyJGL00wMVoPUzAVAnbEoWyqRxkjv64tUl427SKnPrENtq6hJwUojroMz2VB+Q1edmi4IfrAPpami5VVgMQ==} 725 | engines: {node: '>= 14'} 726 | peerDependencies: 727 | postcss: '>=8.0.9' 728 | ts-node: '>=9.0.0' 729 | peerDependenciesMeta: 730 | postcss: 731 | optional: true 732 | ts-node: 733 | optional: true 734 | 735 | postcss-nested@6.2.0: 736 | resolution: {integrity: sha512-HQbt28KulC5AJzG+cZtj9kvKB93CFCdLvog1WFLf1D+xmMvPGlBstkpTEZfK5+AN9hfJocyBFCNiqyS48bpgzQ==} 737 | engines: {node: '>=12.0'} 738 | peerDependencies: 739 | postcss: ^8.2.14 740 | 741 | postcss-selector-parser@6.1.2: 742 | resolution: {integrity: sha512-Q8qQfPiZ+THO/3ZrOrO0cJJKfpYCagtMUkXbnEfmgUjwXg6z/WBeOyS9APBBPCTSiDV+s4SwQGu8yFsiMRIudg==} 743 | engines: {node: '>=4'} 744 | 745 | postcss-value-parser@4.2.0: 746 | resolution: {integrity: sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==} 747 | 748 | postcss@8.4.49: 749 | resolution: {integrity: sha512-OCVPnIObs4N29kxTjzLfUryOkvZEq+pf8jTF0lg8E7uETuWHA+v7j3c/xJmiqpX450191LlmZfUKkXxkTry7nA==} 750 | engines: {node: ^10 || ^12 || >=14} 751 | 752 | queue-microtask@1.2.3: 753 | resolution: {integrity: sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==} 754 | 755 | read-cache@1.0.0: 756 | resolution: {integrity: sha512-Owdv/Ft7IjOgm/i0xvNDZ1LrRANRfew4b2prF3OWMQLxLfu3bS8FVhCsrSCMK4lR56Y9ya+AThoTpDCTxCmpRA==} 757 | 758 | readdirp@3.6.0: 759 | resolution: {integrity: sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==} 760 | engines: {node: '>=8.10.0'} 761 | 762 | resolve.exports@1.1.1: 763 | resolution: {integrity: sha512-/NtpHNDN7jWhAaQ9BvBUYZ6YTXsRBgfqWFWP7BZBaoMJO/I3G5OFzvTuWNlZC3aPjins1F+TNrLKsGbH4rfsRQ==} 764 | engines: {node: '>=10'} 765 | 766 | resolve@1.22.10: 767 | resolution: {integrity: sha512-NPRy+/ncIMeDlTAsuqwKIiferiawhefFJtkNSW0qZJEqMEb+qBt/77B/jGeeek+F0uOeN05CDa6HXbbIgtVX4w==} 768 | engines: {node: '>= 0.4'} 769 | hasBin: true 770 | 771 | reusify@1.0.4: 772 | resolution: {integrity: sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==} 773 | engines: {iojs: '>=1.0.0', node: '>=0.10.0'} 774 | 775 | rollup@4.29.0: 776 | resolution: {integrity: sha512-pdftUn12oB9Qlka+Vpyc39R28D4NsP9Sz6neepSrekofJmWzPD1sxcSO9hEOxFF8+7Kz3sHvwSkkRREI28M1/w==} 777 | engines: {node: '>=18.0.0', npm: '>=8.0.0'} 778 | hasBin: true 779 | 780 | run-parallel@1.2.0: 781 | resolution: {integrity: sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==} 782 | 783 | shebang-command@2.0.0: 784 | resolution: {integrity: sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==} 785 | engines: {node: '>=8'} 786 | 787 | shebang-regex@3.0.0: 788 | resolution: {integrity: sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==} 789 | engines: {node: '>=8'} 790 | 791 | signal-exit@4.1.0: 792 | resolution: {integrity: sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==} 793 | engines: {node: '>=14'} 794 | 795 | source-map-js@1.2.1: 796 | resolution: {integrity: sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==} 797 | engines: {node: '>=0.10.0'} 798 | 799 | string-width@4.2.3: 800 | resolution: {integrity: sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==} 801 | engines: {node: '>=8'} 802 | 803 | string-width@5.1.2: 804 | resolution: {integrity: sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==} 805 | engines: {node: '>=12'} 806 | 807 | strip-ansi@6.0.1: 808 | resolution: {integrity: sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==} 809 | engines: {node: '>=8'} 810 | 811 | strip-ansi@7.1.0: 812 | resolution: {integrity: sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==} 813 | engines: {node: '>=12'} 814 | 815 | sucrase@3.35.0: 816 | resolution: {integrity: sha512-8EbVDiu9iN/nESwxeSxDKe0dunta1GOlHufmSSXxMD2z2/tMZpDMpvXQGsc+ajGo8y2uYUmixaSRUc/QPoQ0GA==} 817 | engines: {node: '>=16 || 14 >=14.17'} 818 | hasBin: true 819 | 820 | supports-color@7.2.0: 821 | resolution: {integrity: sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==} 822 | engines: {node: '>=8'} 823 | 824 | supports-preserve-symlinks-flag@1.0.0: 825 | resolution: {integrity: sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==} 826 | engines: {node: '>= 0.4'} 827 | 828 | tailwindcss@3.4.17: 829 | resolution: {integrity: sha512-w33E2aCvSDP0tW9RZuNXadXlkHXqFzSkQew/aIa2i/Sj8fThxwovwlXHSPXTbAHwEIhBFXAedUhP2tueAKP8Og==} 830 | engines: {node: '>=14.0.0'} 831 | hasBin: true 832 | 833 | thenify-all@1.6.0: 834 | resolution: {integrity: sha512-RNxQH/qI8/t3thXJDwcstUO4zeqo64+Uy/+sNVRBx4Xn2OX+OZ9oP+iJnNFqplFra2ZUVeKCSa2oVWi3T4uVmA==} 835 | engines: {node: '>=0.8'} 836 | 837 | thenify@3.3.1: 838 | resolution: {integrity: sha512-RVZSIV5IG10Hk3enotrhvz0T9em6cyHBLkH/YAZuKqd8hRkKhSfCGIcP2KUY0EPxndzANBmNllzWPwak+bheSw==} 839 | 840 | to-regex-range@5.0.1: 841 | resolution: {integrity: sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==} 842 | engines: {node: '>=8.0'} 843 | 844 | ts-interface-checker@0.1.13: 845 | resolution: {integrity: sha512-Y/arvbn+rrz3JCKl9C4kVNfTfSm2/mEp5FSz5EsZSANGPSlQrpRI5M4PKF+mJnE52jOO90PnPSc3Ur3bTQw0gA==} 846 | 847 | typescript@4.9.5: 848 | resolution: {integrity: sha512-1FXk9E2Hm+QzZQ7z+McJiHL4NW1F2EzMu9Nq9i3zAaGqibafqYwCVU6WyWAuyQRRzOlxou8xZSyXLEN8oKj24g==} 849 | engines: {node: '>=4.2.0'} 850 | hasBin: true 851 | 852 | util-deprecate@1.0.2: 853 | resolution: {integrity: sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==} 854 | 855 | vite@6.0.5: 856 | resolution: {integrity: sha512-akD5IAH/ID5imgue2DYhzsEwCi0/4VKY31uhMLEYJwPP4TiUp8pL5PIK+Wo7H8qT8JY9i+pVfPydcFPYD1EL7g==} 857 | engines: {node: ^18.0.0 || ^20.0.0 || >=22.0.0} 858 | hasBin: true 859 | peerDependencies: 860 | '@types/node': ^18.0.0 || ^20.0.0 || >=22.0.0 861 | jiti: '>=1.21.0' 862 | less: '*' 863 | lightningcss: ^1.21.0 864 | sass: '*' 865 | sass-embedded: '*' 866 | stylus: '*' 867 | sugarss: '*' 868 | terser: ^5.16.0 869 | tsx: ^4.8.1 870 | yaml: ^2.4.2 871 | peerDependenciesMeta: 872 | '@types/node': 873 | optional: true 874 | jiti: 875 | optional: true 876 | less: 877 | optional: true 878 | lightningcss: 879 | optional: true 880 | sass: 881 | optional: true 882 | sass-embedded: 883 | optional: true 884 | stylus: 885 | optional: true 886 | sugarss: 887 | optional: true 888 | terser: 889 | optional: true 890 | tsx: 891 | optional: true 892 | yaml: 893 | optional: true 894 | 895 | vue@3.5.13: 896 | resolution: {integrity: sha512-wmeiSMxkZCSc+PM2w2VRsOYAZC8GdipNFRTsLSfodVqI9mbejKeXEGr8SckuLnrQPGe3oJN5c3K0vpoU9q/wCQ==} 897 | peerDependencies: 898 | typescript: '*' 899 | peerDependenciesMeta: 900 | typescript: 901 | optional: true 902 | 903 | which@2.0.2: 904 | resolution: {integrity: sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==} 905 | engines: {node: '>= 8'} 906 | hasBin: true 907 | 908 | wrap-ansi@7.0.0: 909 | resolution: {integrity: sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==} 910 | engines: {node: '>=10'} 911 | 912 | wrap-ansi@8.1.0: 913 | resolution: {integrity: sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==} 914 | engines: {node: '>=12'} 915 | 916 | yaml@2.6.1: 917 | resolution: {integrity: sha512-7r0XPzioN/Q9kXBro/XPnA6kznR73DHq+GXh5ON7ZozRO6aMjbmiBuKste2wslTFkC5d1dw0GooOCepZXJ2SAg==} 918 | engines: {node: '>= 14'} 919 | hasBin: true 920 | 921 | snapshots: 922 | 923 | '@alloc/quick-lru@5.2.0': {} 924 | 925 | '@babel/helper-string-parser@7.25.9': {} 926 | 927 | '@babel/helper-validator-identifier@7.25.9': {} 928 | 929 | '@babel/parser@7.26.3': 930 | dependencies: 931 | '@babel/types': 7.26.3 932 | 933 | '@babel/types@7.26.3': 934 | dependencies: 935 | '@babel/helper-string-parser': 7.25.9 936 | '@babel/helper-validator-identifier': 7.25.9 937 | 938 | '@esbuild/aix-ppc64@0.24.0': 939 | optional: true 940 | 941 | '@esbuild/android-arm64@0.24.0': 942 | optional: true 943 | 944 | '@esbuild/android-arm@0.24.0': 945 | optional: true 946 | 947 | '@esbuild/android-x64@0.24.0': 948 | optional: true 949 | 950 | '@esbuild/darwin-arm64@0.24.0': 951 | optional: true 952 | 953 | '@esbuild/darwin-x64@0.24.0': 954 | optional: true 955 | 956 | '@esbuild/freebsd-arm64@0.24.0': 957 | optional: true 958 | 959 | '@esbuild/freebsd-x64@0.24.0': 960 | optional: true 961 | 962 | '@esbuild/linux-arm64@0.24.0': 963 | optional: true 964 | 965 | '@esbuild/linux-arm@0.24.0': 966 | optional: true 967 | 968 | '@esbuild/linux-ia32@0.24.0': 969 | optional: true 970 | 971 | '@esbuild/linux-loong64@0.24.0': 972 | optional: true 973 | 974 | '@esbuild/linux-mips64el@0.24.0': 975 | optional: true 976 | 977 | '@esbuild/linux-ppc64@0.24.0': 978 | optional: true 979 | 980 | '@esbuild/linux-riscv64@0.24.0': 981 | optional: true 982 | 983 | '@esbuild/linux-s390x@0.24.0': 984 | optional: true 985 | 986 | '@esbuild/linux-x64@0.24.0': 987 | optional: true 988 | 989 | '@esbuild/netbsd-x64@0.24.0': 990 | optional: true 991 | 992 | '@esbuild/openbsd-arm64@0.24.0': 993 | optional: true 994 | 995 | '@esbuild/openbsd-x64@0.24.0': 996 | optional: true 997 | 998 | '@esbuild/sunos-x64@0.24.0': 999 | optional: true 1000 | 1001 | '@esbuild/win32-arm64@0.24.0': 1002 | optional: true 1003 | 1004 | '@esbuild/win32-ia32@0.24.0': 1005 | optional: true 1006 | 1007 | '@esbuild/win32-x64@0.24.0': 1008 | optional: true 1009 | 1010 | '@isaacs/cliui@8.0.2': 1011 | dependencies: 1012 | string-width: 5.1.2 1013 | string-width-cjs: string-width@4.2.3 1014 | strip-ansi: 7.1.0 1015 | strip-ansi-cjs: strip-ansi@6.0.1 1016 | wrap-ansi: 8.1.0 1017 | wrap-ansi-cjs: wrap-ansi@7.0.0 1018 | 1019 | '@jridgewell/gen-mapping@0.3.8': 1020 | dependencies: 1021 | '@jridgewell/set-array': 1.2.1 1022 | '@jridgewell/sourcemap-codec': 1.5.0 1023 | '@jridgewell/trace-mapping': 0.3.25 1024 | 1025 | '@jridgewell/resolve-uri@3.1.2': {} 1026 | 1027 | '@jridgewell/set-array@1.2.1': {} 1028 | 1029 | '@jridgewell/sourcemap-codec@1.5.0': {} 1030 | 1031 | '@jridgewell/trace-mapping@0.3.25': 1032 | dependencies: 1033 | '@jridgewell/resolve-uri': 3.1.2 1034 | '@jridgewell/sourcemap-codec': 1.5.0 1035 | 1036 | '@nodelib/fs.scandir@2.1.5': 1037 | dependencies: 1038 | '@nodelib/fs.stat': 2.0.5 1039 | run-parallel: 1.2.0 1040 | 1041 | '@nodelib/fs.stat@2.0.5': {} 1042 | 1043 | '@nodelib/fs.walk@1.2.8': 1044 | dependencies: 1045 | '@nodelib/fs.scandir': 2.1.5 1046 | fastq: 1.17.1 1047 | 1048 | '@pkgjs/parseargs@0.11.0': 1049 | optional: true 1050 | 1051 | '@rollup/rollup-android-arm-eabi@4.29.0': 1052 | optional: true 1053 | 1054 | '@rollup/rollup-android-arm64@4.29.0': 1055 | optional: true 1056 | 1057 | '@rollup/rollup-darwin-arm64@4.29.0': 1058 | optional: true 1059 | 1060 | '@rollup/rollup-darwin-x64@4.29.0': 1061 | optional: true 1062 | 1063 | '@rollup/rollup-freebsd-arm64@4.29.0': 1064 | optional: true 1065 | 1066 | '@rollup/rollup-freebsd-x64@4.29.0': 1067 | optional: true 1068 | 1069 | '@rollup/rollup-linux-arm-gnueabihf@4.29.0': 1070 | optional: true 1071 | 1072 | '@rollup/rollup-linux-arm-musleabihf@4.29.0': 1073 | optional: true 1074 | 1075 | '@rollup/rollup-linux-arm64-gnu@4.29.0': 1076 | optional: true 1077 | 1078 | '@rollup/rollup-linux-arm64-musl@4.29.0': 1079 | optional: true 1080 | 1081 | '@rollup/rollup-linux-loongarch64-gnu@4.29.0': 1082 | optional: true 1083 | 1084 | '@rollup/rollup-linux-powerpc64le-gnu@4.29.0': 1085 | optional: true 1086 | 1087 | '@rollup/rollup-linux-riscv64-gnu@4.29.0': 1088 | optional: true 1089 | 1090 | '@rollup/rollup-linux-s390x-gnu@4.29.0': 1091 | optional: true 1092 | 1093 | '@rollup/rollup-linux-x64-gnu@4.29.0': 1094 | optional: true 1095 | 1096 | '@rollup/rollup-linux-x64-musl@4.29.0': 1097 | optional: true 1098 | 1099 | '@rollup/rollup-win32-arm64-msvc@4.29.0': 1100 | optional: true 1101 | 1102 | '@rollup/rollup-win32-ia32-msvc@4.29.0': 1103 | optional: true 1104 | 1105 | '@rollup/rollup-win32-x64-msvc@4.29.0': 1106 | optional: true 1107 | 1108 | '@types/codemirror@5.60.15': 1109 | dependencies: 1110 | '@types/tern': 0.23.9 1111 | 1112 | '@types/ejs@3.1.5': {} 1113 | 1114 | '@types/estree@1.0.6': {} 1115 | 1116 | '@types/parse-package-name@0.1.3': {} 1117 | 1118 | '@types/tern@0.23.9': 1119 | dependencies: 1120 | '@types/estree': 1.0.6 1121 | 1122 | '@types/umami@2.10.0': {} 1123 | 1124 | '@vitejs/plugin-vue@5.2.1(vite@6.0.5(jiti@1.21.7)(yaml@2.6.1))(vue@3.5.13(typescript@4.9.5))': 1125 | dependencies: 1126 | vite: 6.0.5(jiti@1.21.7)(yaml@2.6.1) 1127 | vue: 3.5.13(typescript@4.9.5) 1128 | 1129 | '@vue/compiler-core@3.5.13': 1130 | dependencies: 1131 | '@babel/parser': 7.26.3 1132 | '@vue/shared': 3.5.13 1133 | entities: 4.5.0 1134 | estree-walker: 2.0.2 1135 | source-map-js: 1.2.1 1136 | 1137 | '@vue/compiler-dom@3.5.13': 1138 | dependencies: 1139 | '@vue/compiler-core': 3.5.13 1140 | '@vue/shared': 3.5.13 1141 | 1142 | '@vue/compiler-sfc@3.5.13': 1143 | dependencies: 1144 | '@babel/parser': 7.26.3 1145 | '@vue/compiler-core': 3.5.13 1146 | '@vue/compiler-dom': 3.5.13 1147 | '@vue/compiler-ssr': 3.5.13 1148 | '@vue/shared': 3.5.13 1149 | estree-walker: 2.0.2 1150 | magic-string: 0.30.17 1151 | postcss: 8.4.49 1152 | source-map-js: 1.2.1 1153 | 1154 | '@vue/compiler-ssr@3.5.13': 1155 | dependencies: 1156 | '@vue/compiler-dom': 3.5.13 1157 | '@vue/shared': 3.5.13 1158 | 1159 | '@vue/reactivity@3.5.13': 1160 | dependencies: 1161 | '@vue/shared': 3.5.13 1162 | 1163 | '@vue/runtime-core@3.5.13': 1164 | dependencies: 1165 | '@vue/reactivity': 3.5.13 1166 | '@vue/shared': 3.5.13 1167 | 1168 | '@vue/runtime-dom@3.5.13': 1169 | dependencies: 1170 | '@vue/reactivity': 3.5.13 1171 | '@vue/runtime-core': 3.5.13 1172 | '@vue/shared': 3.5.13 1173 | csstype: 3.1.3 1174 | 1175 | '@vue/server-renderer@3.5.13(vue@3.5.13(typescript@4.9.5))': 1176 | dependencies: 1177 | '@vue/compiler-ssr': 3.5.13 1178 | '@vue/shared': 3.5.13 1179 | vue: 3.5.13(typescript@4.9.5) 1180 | 1181 | '@vue/shared@3.5.13': {} 1182 | 1183 | ansi-regex@5.0.1: {} 1184 | 1185 | ansi-regex@6.1.0: {} 1186 | 1187 | ansi-styles@4.3.0: 1188 | dependencies: 1189 | color-convert: 2.0.1 1190 | 1191 | ansi-styles@6.2.1: {} 1192 | 1193 | any-promise@1.3.0: {} 1194 | 1195 | anymatch@3.1.3: 1196 | dependencies: 1197 | normalize-path: 3.0.0 1198 | picomatch: 2.3.1 1199 | 1200 | arg@5.0.2: {} 1201 | 1202 | async@3.2.6: {} 1203 | 1204 | balanced-match@1.0.2: {} 1205 | 1206 | binary-extensions@2.3.0: {} 1207 | 1208 | brace-expansion@1.1.11: 1209 | dependencies: 1210 | balanced-match: 1.0.2 1211 | concat-map: 0.0.1 1212 | 1213 | brace-expansion@2.0.1: 1214 | dependencies: 1215 | balanced-match: 1.0.2 1216 | 1217 | braces@3.0.3: 1218 | dependencies: 1219 | fill-range: 7.1.1 1220 | 1221 | camelcase-css@2.0.1: {} 1222 | 1223 | chalk@4.1.2: 1224 | dependencies: 1225 | ansi-styles: 4.3.0 1226 | supports-color: 7.2.0 1227 | 1228 | chokidar@3.6.0: 1229 | dependencies: 1230 | anymatch: 3.1.3 1231 | braces: 3.0.3 1232 | glob-parent: 5.1.2 1233 | is-binary-path: 2.1.0 1234 | is-glob: 4.0.3 1235 | normalize-path: 3.0.0 1236 | readdirp: 3.6.0 1237 | optionalDependencies: 1238 | fsevents: 2.3.3 1239 | 1240 | codemirror@5.65.18: {} 1241 | 1242 | color-convert@2.0.1: 1243 | dependencies: 1244 | color-name: 1.1.4 1245 | 1246 | color-name@1.1.4: {} 1247 | 1248 | commander@4.1.1: {} 1249 | 1250 | concat-map@0.0.1: {} 1251 | 1252 | cross-spawn@7.0.6: 1253 | dependencies: 1254 | path-key: 3.1.1 1255 | shebang-command: 2.0.0 1256 | which: 2.0.2 1257 | 1258 | cssesc@3.0.0: {} 1259 | 1260 | csstype@3.1.3: {} 1261 | 1262 | didyoumean@1.2.2: {} 1263 | 1264 | dlv@1.1.3: {} 1265 | 1266 | eastasianwidth@0.2.0: {} 1267 | 1268 | ejs@3.1.10: 1269 | dependencies: 1270 | jake: 10.9.2 1271 | 1272 | emoji-regex@8.0.0: {} 1273 | 1274 | emoji-regex@9.2.2: {} 1275 | 1276 | entities@4.5.0: {} 1277 | 1278 | esbuild-wasm@0.24.2: {} 1279 | 1280 | esbuild@0.24.0: 1281 | optionalDependencies: 1282 | '@esbuild/aix-ppc64': 0.24.0 1283 | '@esbuild/android-arm': 0.24.0 1284 | '@esbuild/android-arm64': 0.24.0 1285 | '@esbuild/android-x64': 0.24.0 1286 | '@esbuild/darwin-arm64': 0.24.0 1287 | '@esbuild/darwin-x64': 0.24.0 1288 | '@esbuild/freebsd-arm64': 0.24.0 1289 | '@esbuild/freebsd-x64': 0.24.0 1290 | '@esbuild/linux-arm': 0.24.0 1291 | '@esbuild/linux-arm64': 0.24.0 1292 | '@esbuild/linux-ia32': 0.24.0 1293 | '@esbuild/linux-loong64': 0.24.0 1294 | '@esbuild/linux-mips64el': 0.24.0 1295 | '@esbuild/linux-ppc64': 0.24.0 1296 | '@esbuild/linux-riscv64': 0.24.0 1297 | '@esbuild/linux-s390x': 0.24.0 1298 | '@esbuild/linux-x64': 0.24.0 1299 | '@esbuild/netbsd-x64': 0.24.0 1300 | '@esbuild/openbsd-arm64': 0.24.0 1301 | '@esbuild/openbsd-x64': 0.24.0 1302 | '@esbuild/sunos-x64': 0.24.0 1303 | '@esbuild/win32-arm64': 0.24.0 1304 | '@esbuild/win32-ia32': 0.24.0 1305 | '@esbuild/win32-x64': 0.24.0 1306 | 1307 | estree-walker@2.0.2: {} 1308 | 1309 | fast-glob@3.3.2: 1310 | dependencies: 1311 | '@nodelib/fs.stat': 2.0.5 1312 | '@nodelib/fs.walk': 1.2.8 1313 | glob-parent: 5.1.2 1314 | merge2: 1.4.1 1315 | micromatch: 4.0.8 1316 | 1317 | fastq@1.17.1: 1318 | dependencies: 1319 | reusify: 1.0.4 1320 | 1321 | filelist@1.0.4: 1322 | dependencies: 1323 | minimatch: 5.1.6 1324 | 1325 | fill-range@7.1.1: 1326 | dependencies: 1327 | to-regex-range: 5.0.1 1328 | 1329 | foreground-child@3.3.0: 1330 | dependencies: 1331 | cross-spawn: 7.0.6 1332 | signal-exit: 4.1.0 1333 | 1334 | fsevents@2.3.3: 1335 | optional: true 1336 | 1337 | function-bind@1.1.2: {} 1338 | 1339 | glob-parent@5.1.2: 1340 | dependencies: 1341 | is-glob: 4.0.3 1342 | 1343 | glob-parent@6.0.2: 1344 | dependencies: 1345 | is-glob: 4.0.3 1346 | 1347 | glob@10.4.5: 1348 | dependencies: 1349 | foreground-child: 3.3.0 1350 | jackspeak: 3.4.3 1351 | minimatch: 9.0.5 1352 | minipass: 7.1.2 1353 | package-json-from-dist: 1.0.1 1354 | path-scurry: 1.11.1 1355 | 1356 | has-flag@4.0.0: {} 1357 | 1358 | hasown@2.0.2: 1359 | dependencies: 1360 | function-bind: 1.1.2 1361 | 1362 | is-binary-path@2.1.0: 1363 | dependencies: 1364 | binary-extensions: 2.3.0 1365 | 1366 | is-core-module@2.16.0: 1367 | dependencies: 1368 | hasown: 2.0.2 1369 | 1370 | is-extglob@2.1.1: {} 1371 | 1372 | is-fullwidth-code-point@3.0.0: {} 1373 | 1374 | is-glob@4.0.3: 1375 | dependencies: 1376 | is-extglob: 2.1.1 1377 | 1378 | is-number@7.0.0: {} 1379 | 1380 | isexe@2.0.0: {} 1381 | 1382 | jackspeak@3.4.3: 1383 | dependencies: 1384 | '@isaacs/cliui': 8.0.2 1385 | optionalDependencies: 1386 | '@pkgjs/parseargs': 0.11.0 1387 | 1388 | jake@10.9.2: 1389 | dependencies: 1390 | async: 3.2.6 1391 | chalk: 4.1.2 1392 | filelist: 1.0.4 1393 | minimatch: 3.1.2 1394 | 1395 | jiti@1.21.7: {} 1396 | 1397 | lilconfig@3.1.3: {} 1398 | 1399 | lines-and-columns@1.2.4: {} 1400 | 1401 | lru-cache@10.4.3: {} 1402 | 1403 | magic-string@0.30.17: 1404 | dependencies: 1405 | '@jridgewell/sourcemap-codec': 1.5.0 1406 | 1407 | merge2@1.4.1: {} 1408 | 1409 | micromatch@4.0.8: 1410 | dependencies: 1411 | braces: 3.0.3 1412 | picomatch: 2.3.1 1413 | 1414 | minimatch@3.1.2: 1415 | dependencies: 1416 | brace-expansion: 1.1.11 1417 | 1418 | minimatch@5.1.6: 1419 | dependencies: 1420 | brace-expansion: 2.0.1 1421 | 1422 | minimatch@9.0.5: 1423 | dependencies: 1424 | brace-expansion: 2.0.1 1425 | 1426 | minipass@7.1.2: {} 1427 | 1428 | mz@2.7.0: 1429 | dependencies: 1430 | any-promise: 1.3.0 1431 | object-assign: 4.1.1 1432 | thenify-all: 1.6.0 1433 | 1434 | nanoid@3.3.8: {} 1435 | 1436 | normalize-path@3.0.0: {} 1437 | 1438 | object-assign@4.1.1: {} 1439 | 1440 | object-hash@3.0.0: {} 1441 | 1442 | package-json-from-dist@1.0.1: {} 1443 | 1444 | parse-package-name@1.0.0: {} 1445 | 1446 | path-key@3.1.1: {} 1447 | 1448 | path-parse@1.0.7: {} 1449 | 1450 | path-scurry@1.11.1: 1451 | dependencies: 1452 | lru-cache: 10.4.3 1453 | minipass: 7.1.2 1454 | 1455 | picocolors@1.1.1: {} 1456 | 1457 | picomatch@2.3.1: {} 1458 | 1459 | pify@2.3.0: {} 1460 | 1461 | pirates@4.0.6: {} 1462 | 1463 | postcss-import@15.1.0(postcss@8.4.49): 1464 | dependencies: 1465 | postcss: 8.4.49 1466 | postcss-value-parser: 4.2.0 1467 | read-cache: 1.0.0 1468 | resolve: 1.22.10 1469 | 1470 | postcss-js@4.0.1(postcss@8.4.49): 1471 | dependencies: 1472 | camelcase-css: 2.0.1 1473 | postcss: 8.4.49 1474 | 1475 | postcss-load-config@4.0.2(postcss@8.4.49): 1476 | dependencies: 1477 | lilconfig: 3.1.3 1478 | yaml: 2.6.1 1479 | optionalDependencies: 1480 | postcss: 8.4.49 1481 | 1482 | postcss-nested@6.2.0(postcss@8.4.49): 1483 | dependencies: 1484 | postcss: 8.4.49 1485 | postcss-selector-parser: 6.1.2 1486 | 1487 | postcss-selector-parser@6.1.2: 1488 | dependencies: 1489 | cssesc: 3.0.0 1490 | util-deprecate: 1.0.2 1491 | 1492 | postcss-value-parser@4.2.0: {} 1493 | 1494 | postcss@8.4.49: 1495 | dependencies: 1496 | nanoid: 3.3.8 1497 | picocolors: 1.1.1 1498 | source-map-js: 1.2.1 1499 | 1500 | queue-microtask@1.2.3: {} 1501 | 1502 | read-cache@1.0.0: 1503 | dependencies: 1504 | pify: 2.3.0 1505 | 1506 | readdirp@3.6.0: 1507 | dependencies: 1508 | picomatch: 2.3.1 1509 | 1510 | resolve.exports@1.1.1: {} 1511 | 1512 | resolve@1.22.10: 1513 | dependencies: 1514 | is-core-module: 2.16.0 1515 | path-parse: 1.0.7 1516 | supports-preserve-symlinks-flag: 1.0.0 1517 | 1518 | reusify@1.0.4: {} 1519 | 1520 | rollup@4.29.0: 1521 | dependencies: 1522 | '@types/estree': 1.0.6 1523 | optionalDependencies: 1524 | '@rollup/rollup-android-arm-eabi': 4.29.0 1525 | '@rollup/rollup-android-arm64': 4.29.0 1526 | '@rollup/rollup-darwin-arm64': 4.29.0 1527 | '@rollup/rollup-darwin-x64': 4.29.0 1528 | '@rollup/rollup-freebsd-arm64': 4.29.0 1529 | '@rollup/rollup-freebsd-x64': 4.29.0 1530 | '@rollup/rollup-linux-arm-gnueabihf': 4.29.0 1531 | '@rollup/rollup-linux-arm-musleabihf': 4.29.0 1532 | '@rollup/rollup-linux-arm64-gnu': 4.29.0 1533 | '@rollup/rollup-linux-arm64-musl': 4.29.0 1534 | '@rollup/rollup-linux-loongarch64-gnu': 4.29.0 1535 | '@rollup/rollup-linux-powerpc64le-gnu': 4.29.0 1536 | '@rollup/rollup-linux-riscv64-gnu': 4.29.0 1537 | '@rollup/rollup-linux-s390x-gnu': 4.29.0 1538 | '@rollup/rollup-linux-x64-gnu': 4.29.0 1539 | '@rollup/rollup-linux-x64-musl': 4.29.0 1540 | '@rollup/rollup-win32-arm64-msvc': 4.29.0 1541 | '@rollup/rollup-win32-ia32-msvc': 4.29.0 1542 | '@rollup/rollup-win32-x64-msvc': 4.29.0 1543 | fsevents: 2.3.3 1544 | 1545 | run-parallel@1.2.0: 1546 | dependencies: 1547 | queue-microtask: 1.2.3 1548 | 1549 | shebang-command@2.0.0: 1550 | dependencies: 1551 | shebang-regex: 3.0.0 1552 | 1553 | shebang-regex@3.0.0: {} 1554 | 1555 | signal-exit@4.1.0: {} 1556 | 1557 | source-map-js@1.2.1: {} 1558 | 1559 | string-width@4.2.3: 1560 | dependencies: 1561 | emoji-regex: 8.0.0 1562 | is-fullwidth-code-point: 3.0.0 1563 | strip-ansi: 6.0.1 1564 | 1565 | string-width@5.1.2: 1566 | dependencies: 1567 | eastasianwidth: 0.2.0 1568 | emoji-regex: 9.2.2 1569 | strip-ansi: 7.1.0 1570 | 1571 | strip-ansi@6.0.1: 1572 | dependencies: 1573 | ansi-regex: 5.0.1 1574 | 1575 | strip-ansi@7.1.0: 1576 | dependencies: 1577 | ansi-regex: 6.1.0 1578 | 1579 | sucrase@3.35.0: 1580 | dependencies: 1581 | '@jridgewell/gen-mapping': 0.3.8 1582 | commander: 4.1.1 1583 | glob: 10.4.5 1584 | lines-and-columns: 1.2.4 1585 | mz: 2.7.0 1586 | pirates: 4.0.6 1587 | ts-interface-checker: 0.1.13 1588 | 1589 | supports-color@7.2.0: 1590 | dependencies: 1591 | has-flag: 4.0.0 1592 | 1593 | supports-preserve-symlinks-flag@1.0.0: {} 1594 | 1595 | tailwindcss@3.4.17: 1596 | dependencies: 1597 | '@alloc/quick-lru': 5.2.0 1598 | arg: 5.0.2 1599 | chokidar: 3.6.0 1600 | didyoumean: 1.2.2 1601 | dlv: 1.1.3 1602 | fast-glob: 3.3.2 1603 | glob-parent: 6.0.2 1604 | is-glob: 4.0.3 1605 | jiti: 1.21.7 1606 | lilconfig: 3.1.3 1607 | micromatch: 4.0.8 1608 | normalize-path: 3.0.0 1609 | object-hash: 3.0.0 1610 | picocolors: 1.1.1 1611 | postcss: 8.4.49 1612 | postcss-import: 15.1.0(postcss@8.4.49) 1613 | postcss-js: 4.0.1(postcss@8.4.49) 1614 | postcss-load-config: 4.0.2(postcss@8.4.49) 1615 | postcss-nested: 6.2.0(postcss@8.4.49) 1616 | postcss-selector-parser: 6.1.2 1617 | resolve: 1.22.10 1618 | sucrase: 3.35.0 1619 | transitivePeerDependencies: 1620 | - ts-node 1621 | 1622 | thenify-all@1.6.0: 1623 | dependencies: 1624 | thenify: 3.3.1 1625 | 1626 | thenify@3.3.1: 1627 | dependencies: 1628 | any-promise: 1.3.0 1629 | 1630 | to-regex-range@5.0.1: 1631 | dependencies: 1632 | is-number: 7.0.0 1633 | 1634 | ts-interface-checker@0.1.13: {} 1635 | 1636 | typescript@4.9.5: {} 1637 | 1638 | util-deprecate@1.0.2: {} 1639 | 1640 | vite@6.0.5(jiti@1.21.7)(yaml@2.6.1): 1641 | dependencies: 1642 | esbuild: 0.24.0 1643 | postcss: 8.4.49 1644 | rollup: 4.29.0 1645 | optionalDependencies: 1646 | fsevents: 2.3.3 1647 | jiti: 1.21.7 1648 | yaml: 2.6.1 1649 | 1650 | vue@3.5.13(typescript@4.9.5): 1651 | dependencies: 1652 | '@vue/compiler-dom': 3.5.13 1653 | '@vue/compiler-sfc': 3.5.13 1654 | '@vue/runtime-dom': 3.5.13 1655 | '@vue/server-renderer': 3.5.13(vue@3.5.13(typescript@4.9.5)) 1656 | '@vue/shared': 3.5.13 1657 | optionalDependencies: 1658 | typescript: 4.9.5 1659 | 1660 | which@2.0.2: 1661 | dependencies: 1662 | isexe: 2.0.0 1663 | 1664 | wrap-ansi@7.0.0: 1665 | dependencies: 1666 | ansi-styles: 4.3.0 1667 | string-width: 4.2.3 1668 | strip-ansi: 6.0.1 1669 | 1670 | wrap-ansi@8.1.0: 1671 | dependencies: 1672 | ansi-styles: 6.2.1 1673 | string-width: 5.1.2 1674 | strip-ansi: 7.1.0 1675 | 1676 | yaml@2.6.1: {} 1677 | -------------------------------------------------------------------------------- /postcss.config.js: -------------------------------------------------------------------------------- 1 | module.exports = { 2 | plugins: { 3 | tailwindcss: {}, 4 | }, 5 | } 6 | -------------------------------------------------------------------------------- /public/.keep: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/egoist/play-esbuild/a27961c4af88709e0754beaf080194118754aa0b/public/.keep -------------------------------------------------------------------------------- /src/components/App.vue: -------------------------------------------------------------------------------- 1 | 133 | 134 | 289 | -------------------------------------------------------------------------------- /src/components/BuildLogs.vue: -------------------------------------------------------------------------------- 1 | 4 | 5 | 13 | -------------------------------------------------------------------------------- /src/components/CodeMirror.vue: -------------------------------------------------------------------------------- 1 | 54 | 55 | 58 | -------------------------------------------------------------------------------- /src/css/codemirror.css: -------------------------------------------------------------------------------- 1 | /* BASICS */ 2 | 3 | .CodeMirror { 4 | /* Set height, width, borders, and global font properties here */ 5 | font-family: monaco, monospace; 6 | height: 100%; 7 | color: black; 8 | direction: ltr; 9 | } 10 | 11 | /* PADDING */ 12 | 13 | .CodeMirror-lines { 14 | padding: 4px 0; /* Vertical padding around content */ 15 | } 16 | .CodeMirror pre.CodeMirror-line, 17 | .CodeMirror pre.CodeMirror-line-like { 18 | padding: 0 4px; /* Horizontal padding of content */ 19 | } 20 | 21 | .CodeMirror-scrollbar-filler, 22 | .CodeMirror-gutter-filler { 23 | background-color: white; /* The little square between H and V scrollbars */ 24 | } 25 | 26 | /* GUTTER */ 27 | 28 | .CodeMirror-gutters { 29 | border-right: 1px solid #ddd; 30 | white-space: nowrap; 31 | background: white; 32 | } 33 | .CodeMirror-linenumbers { 34 | } 35 | .CodeMirror-linenumber { 36 | padding: 0 3px 0 5px; 37 | min-width: 20px; 38 | text-align: right; 39 | color: #999; 40 | white-space: nowrap; 41 | } 42 | 43 | .CodeMirror-guttermarker { 44 | color: black; 45 | } 46 | .CodeMirror-guttermarker-subtle { 47 | color: #999; 48 | } 49 | 50 | /* CURSOR */ 51 | 52 | .CodeMirror-cursor { 53 | border-left: 1px solid black; 54 | border-right: none; 55 | width: 0; 56 | } 57 | /* Shown when moving in bi-directional text */ 58 | .CodeMirror div.CodeMirror-secondarycursor { 59 | border-left: 1px solid silver; 60 | } 61 | .cm-fat-cursor .CodeMirror-cursor { 62 | width: auto; 63 | border: 0 !important; 64 | background: #7e7; 65 | } 66 | .cm-fat-cursor div.CodeMirror-cursors { 67 | z-index: 1; 68 | } 69 | .cm-fat-cursor-mark { 70 | background-color: rgba(20, 255, 20, 0.5); 71 | -webkit-animation: blink 1.06s steps(1) infinite; 72 | -moz-animation: blink 1.06s steps(1) infinite; 73 | animation: blink 1.06s steps(1) infinite; 74 | } 75 | .cm-animate-fat-cursor { 76 | width: auto; 77 | -webkit-animation: blink 1.06s steps(1) infinite; 78 | -moz-animation: blink 1.06s steps(1) infinite; 79 | animation: blink 1.06s steps(1) infinite; 80 | background-color: #7e7; 81 | } 82 | @-moz-keyframes blink { 83 | 0% { 84 | } 85 | 50% { 86 | background-color: transparent; 87 | } 88 | 100% { 89 | } 90 | } 91 | @-webkit-keyframes blink { 92 | 0% { 93 | } 94 | 50% { 95 | background-color: transparent; 96 | } 97 | 100% { 98 | } 99 | } 100 | @keyframes blink { 101 | 0% { 102 | } 103 | 50% { 104 | background-color: transparent; 105 | } 106 | 100% { 107 | } 108 | } 109 | 110 | /* Can style cursor different in overwrite (non-insert) mode */ 111 | .CodeMirror-overwrite .CodeMirror-cursor { 112 | } 113 | 114 | .cm-tab { 115 | display: inline-block; 116 | text-decoration: inherit; 117 | } 118 | 119 | .CodeMirror-rulers { 120 | position: absolute; 121 | left: 0; 122 | right: 0; 123 | top: -50px; 124 | bottom: 0; 125 | overflow: hidden; 126 | } 127 | .CodeMirror-ruler { 128 | border-left: 1px solid #ccc; 129 | top: 0; 130 | bottom: 0; 131 | position: absolute; 132 | } 133 | 134 | /* DEFAULT THEME */ 135 | 136 | .cm-s-default .cm-header { 137 | color: blue; 138 | } 139 | .cm-s-default .cm-quote { 140 | color: #090; 141 | } 142 | .cm-negative { 143 | color: #d44; 144 | } 145 | .cm-positive { 146 | color: #292; 147 | } 148 | .cm-header, 149 | .cm-strong { 150 | font-weight: bold; 151 | } 152 | .cm-em { 153 | font-style: italic; 154 | } 155 | .cm-link { 156 | text-decoration: underline; 157 | } 158 | .cm-strikethrough { 159 | text-decoration: line-through; 160 | } 161 | 162 | .cm-s-default .cm-keyword { 163 | color: #708; 164 | } 165 | .cm-s-default .cm-atom { 166 | color: #219; 167 | } 168 | .cm-s-default .cm-number { 169 | color: #164; 170 | } 171 | .cm-s-default .cm-def { 172 | color: #00f; 173 | } 174 | .cm-s-default .cm-variable, 175 | .cm-s-default .cm-punctuation, 176 | .cm-s-default .cm-property, 177 | .cm-s-default .cm-operator { 178 | } 179 | .cm-s-default .cm-variable-2 { 180 | color: #05a; 181 | } 182 | .cm-s-default .cm-variable-3, 183 | .cm-s-default .cm-type { 184 | color: #085; 185 | } 186 | .cm-s-default .cm-comment { 187 | color: #a50; 188 | } 189 | .cm-s-default .cm-string { 190 | color: #a11; 191 | } 192 | .cm-s-default .cm-string-2 { 193 | color: #f50; 194 | } 195 | .cm-s-default .cm-meta { 196 | color: #555; 197 | } 198 | .cm-s-default .cm-qualifier { 199 | color: #555; 200 | } 201 | .cm-s-default .cm-builtin { 202 | color: #30a; 203 | } 204 | .cm-s-default .cm-bracket { 205 | color: #997; 206 | } 207 | .cm-s-default .cm-tag { 208 | color: #170; 209 | } 210 | .cm-s-default .cm-attribute { 211 | color: #00c; 212 | } 213 | .cm-s-default .cm-hr { 214 | color: #999; 215 | } 216 | .cm-s-default .cm-link { 217 | color: #00c; 218 | } 219 | 220 | .cm-s-default .cm-error { 221 | color: #f00; 222 | } 223 | .cm-invalidchar { 224 | color: #f00; 225 | } 226 | 227 | .CodeMirror-composing { 228 | border-bottom: 2px solid; 229 | } 230 | 231 | /* Default styles for common addons */ 232 | 233 | div.CodeMirror span.CodeMirror-matchingbracket { 234 | color: #0b0; 235 | } 236 | div.CodeMirror span.CodeMirror-nonmatchingbracket { 237 | color: #a22; 238 | } 239 | .CodeMirror-matchingtag { 240 | background: rgba(255, 150, 0, 0.3); 241 | } 242 | .CodeMirror-activeline-background { 243 | background: #e8f2ff; 244 | } 245 | 246 | /* STOP */ 247 | 248 | /* The rest of this file contains styles related to the mechanics of 249 | the editor. You probably shouldn't touch them. */ 250 | 251 | .CodeMirror { 252 | position: relative; 253 | overflow: hidden; 254 | background: white; 255 | } 256 | 257 | .CodeMirror-scroll { 258 | overflow: scroll !important; /* Things will break if this is overridden */ 259 | /* 50px is the magic margin used to hide the element's real scrollbars */ 260 | /* See overflow: hidden in .CodeMirror */ 261 | margin-bottom: -50px; 262 | margin-right: -50px; 263 | padding-bottom: 50px; 264 | height: 100%; 265 | outline: none; /* Prevent dragging from highlighting the element */ 266 | position: relative; 267 | } 268 | .CodeMirror-sizer { 269 | position: relative; 270 | border-right: 50px solid transparent; 271 | } 272 | 273 | /* The fake, visible scrollbars. Used to force redraw during scrolling 274 | before actual scrolling happens, thus preventing shaking and 275 | flickering artifacts. */ 276 | .CodeMirror-vscrollbar, 277 | .CodeMirror-hscrollbar, 278 | .CodeMirror-scrollbar-filler, 279 | .CodeMirror-gutter-filler { 280 | position: absolute; 281 | z-index: 6; 282 | display: none; 283 | outline: none; 284 | } 285 | .CodeMirror-vscrollbar { 286 | right: 0; 287 | top: 0; 288 | overflow-x: hidden; 289 | overflow-y: scroll; 290 | } 291 | .CodeMirror-hscrollbar { 292 | bottom: 0; 293 | left: 0; 294 | overflow-y: hidden; 295 | overflow-x: scroll; 296 | } 297 | .CodeMirror-scrollbar-filler { 298 | right: 0; 299 | bottom: 0; 300 | } 301 | .CodeMirror-gutter-filler { 302 | left: 0; 303 | bottom: 0; 304 | } 305 | 306 | .CodeMirror-gutters { 307 | position: absolute; 308 | left: 0; 309 | top: 0; 310 | min-height: 100%; 311 | z-index: 3; 312 | } 313 | .CodeMirror-gutter { 314 | white-space: normal; 315 | height: 100%; 316 | display: inline-block; 317 | vertical-align: top; 318 | margin-bottom: -50px; 319 | } 320 | .CodeMirror-gutter-wrapper { 321 | position: absolute; 322 | z-index: 4; 323 | background: none !important; 324 | border: none !important; 325 | } 326 | .CodeMirror-gutter-background { 327 | position: absolute; 328 | top: 0; 329 | bottom: 0; 330 | z-index: 4; 331 | } 332 | .CodeMirror-gutter-elt { 333 | position: absolute; 334 | cursor: default; 335 | z-index: 4; 336 | } 337 | .CodeMirror-gutter-wrapper ::selection { 338 | background-color: transparent; 339 | } 340 | .CodeMirror-gutter-wrapper ::-moz-selection { 341 | background-color: transparent; 342 | } 343 | 344 | .CodeMirror-lines { 345 | cursor: text; 346 | min-height: 1px; /* prevents collapsing before first draw */ 347 | } 348 | .CodeMirror pre.CodeMirror-line, 349 | .CodeMirror pre.CodeMirror-line-like { 350 | /* Reset some styles that the rest of the page might have set */ 351 | -moz-border-radius: 0; 352 | -webkit-border-radius: 0; 353 | border-radius: 0; 354 | border-width: 0; 355 | background: transparent; 356 | font-family: inherit; 357 | font-size: inherit; 358 | margin: 0; 359 | white-space: pre; 360 | word-wrap: normal; 361 | line-height: inherit; 362 | color: inherit; 363 | z-index: 2; 364 | position: relative; 365 | overflow: visible; 366 | -webkit-tap-highlight-color: transparent; 367 | -webkit-font-variant-ligatures: contextual; 368 | font-variant-ligatures: contextual; 369 | } 370 | .CodeMirror-wrap pre.CodeMirror-line, 371 | .CodeMirror-wrap pre.CodeMirror-line-like { 372 | word-wrap: break-word; 373 | white-space: pre-wrap; 374 | word-break: normal; 375 | } 376 | 377 | .CodeMirror-linebackground { 378 | position: absolute; 379 | left: 0; 380 | right: 0; 381 | top: 0; 382 | bottom: 0; 383 | z-index: 0; 384 | } 385 | 386 | .CodeMirror-linewidget { 387 | position: relative; 388 | z-index: 2; 389 | padding: 0.1px; /* Force widget margins to stay inside of the container */ 390 | } 391 | 392 | .CodeMirror-widget { 393 | } 394 | 395 | .CodeMirror-rtl pre { 396 | direction: rtl; 397 | } 398 | 399 | .CodeMirror-code { 400 | outline: none; 401 | } 402 | 403 | /* Force content-box sizing for the elements where we expect it */ 404 | .CodeMirror-scroll, 405 | .CodeMirror-sizer, 406 | .CodeMirror-gutter, 407 | .CodeMirror-gutters, 408 | .CodeMirror-linenumber { 409 | -moz-box-sizing: content-box; 410 | box-sizing: content-box; 411 | } 412 | 413 | .CodeMirror-measure { 414 | position: absolute; 415 | width: 100%; 416 | height: 0; 417 | overflow: hidden; 418 | visibility: hidden; 419 | } 420 | 421 | .CodeMirror-cursor { 422 | position: absolute; 423 | pointer-events: none; 424 | } 425 | .CodeMirror-measure pre { 426 | position: static; 427 | } 428 | 429 | div.CodeMirror-cursors { 430 | visibility: hidden; 431 | position: relative; 432 | z-index: 3; 433 | } 434 | div.CodeMirror-dragcursors { 435 | visibility: visible; 436 | } 437 | 438 | .CodeMirror-focused div.CodeMirror-cursors { 439 | visibility: visible; 440 | } 441 | 442 | .CodeMirror-selected { 443 | background: #d9d9d9; 444 | } 445 | .CodeMirror-focused .CodeMirror-selected { 446 | background: #d7d4f0; 447 | } 448 | .CodeMirror-crosshair { 449 | cursor: crosshair; 450 | } 451 | .CodeMirror-line::selection, 452 | .CodeMirror-line > span::selection, 453 | .CodeMirror-line > span > span::selection { 454 | background: #d7d4f0; 455 | } 456 | .CodeMirror-line::-moz-selection, 457 | .CodeMirror-line > span::-moz-selection, 458 | .CodeMirror-line > span > span::-moz-selection { 459 | background: #d7d4f0; 460 | } 461 | 462 | .cm-searching { 463 | background-color: #ffa; 464 | background-color: rgba(255, 255, 0, 0.4); 465 | } 466 | 467 | /* Used to force a border model for a node */ 468 | .cm-force-border { 469 | padding-right: 0.1px; 470 | } 471 | 472 | @media print { 473 | /* Hide the cursor when printing */ 474 | .CodeMirror div.CodeMirror-cursors { 475 | visibility: hidden; 476 | } 477 | } 478 | 479 | /* See issue #2901 */ 480 | .cm-tab-wrap-hack:after { 481 | content: ""; 482 | } 483 | 484 | /* Help users use markselection to safely style text background */ 485 | span.CodeMirror-selectedtext { 486 | background: none; 487 | } 488 | -------------------------------------------------------------------------------- /src/css/tailwind.css: -------------------------------------------------------------------------------- 1 | @tailwind base; 2 | @tailwind components; 3 | @tailwind utilities; 4 | -------------------------------------------------------------------------------- /src/hooks/useEsbuild.ts: -------------------------------------------------------------------------------- 1 | import * as esbuild from "esbuild-wasm" 2 | import { onMounted, ref } from "vue" 3 | 4 | export function useEsbuild(onLoaded?: () => void) { 5 | const loading = ref(true) 6 | const error = ref(null) 7 | 8 | onMounted(() => { 9 | esbuild 10 | .initialize({ 11 | wasmURL: `/esbuild.wasm`, 12 | }) 13 | .then(() => { 14 | loading.value = false 15 | onLoaded && onLoaded() 16 | }) 17 | .catch((_error) => { 18 | error.value = _error 19 | }) 20 | .finally(() => { 21 | loading.value = false 22 | }) 23 | }) 24 | 25 | return { loading, error, esbuild } 26 | } 27 | -------------------------------------------------------------------------------- /src/lib/builtin-modules.ts: -------------------------------------------------------------------------------- 1 | export const builtinModules = [ 2 | "assert", 3 | "async_hooks", 4 | "buffer", 5 | "child_process", 6 | "cluster", 7 | "console", 8 | "constants", 9 | "crypto", 10 | "dgram", 11 | "dns", 12 | "domain", 13 | "events", 14 | "fs", 15 | "http", 16 | "http2", 17 | "https", 18 | "inspector", 19 | "module", 20 | "net", 21 | "os", 22 | "path", 23 | "perf_hooks", 24 | "process", 25 | "punycode", 26 | "querystring", 27 | "readline", 28 | "repl", 29 | "stream", 30 | "string_decoder", 31 | "timers", 32 | "tls", 33 | "trace_events", 34 | "tty", 35 | "url", 36 | "util", 37 | "v8", 38 | "vm", 39 | "wasi", 40 | "worker_threads", 41 | "zlib", 42 | ] 43 | -------------------------------------------------------------------------------- /src/lib/constants.ts: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/egoist/play-esbuild/a27961c4af88709e0754beaf080194118754aa0b/src/lib/constants.ts -------------------------------------------------------------------------------- /src/lib/editor.ts: -------------------------------------------------------------------------------- 1 | export const getMode = (filename: string) => { 2 | if (/\.(js|jsx|ts|tsx)$/.test(filename)) return "text/typescript-jsx" 3 | if (/\.json$/.test(filename)) return "application/json" 4 | if (/\.css$/.test(filename)) return "text/css" 5 | } 6 | -------------------------------------------------------------------------------- /src/lib/esbuild.ts: -------------------------------------------------------------------------------- 1 | import { Plugin, Loader, formatMessages, PartialMessage } from "esbuild-wasm" 2 | import { reactive } from "vue" 3 | import { resolve, legacy } from "resolve.exports" 4 | import { parse as parsePackageName } from "parse-package-name" 5 | import { extname, join, urlJoin } from "./path" 6 | import { state } from "./store" 7 | import { builtinModules } from "./builtin-modules" 8 | class Logger { 9 | lines: Set 10 | 11 | constructor() { 12 | this.lines = reactive(new Set()) 13 | } 14 | 15 | log(message: string) { 16 | this.lines.add(message) 17 | } 18 | 19 | clear() { 20 | this.lines.clear() 21 | } 22 | } 23 | 24 | export const logger = new Logger() 25 | 26 | export const PROJECT_ROOT = "/project/" 27 | 28 | const URL_RE = /^https?:\/\// 29 | 30 | // https://esbuild.github.io/api/#resolve-extensions 31 | const RESOLVE_EXTENSIONS = [".tsx", ".ts", ".jsx", ".js", ".css", ".json"] 32 | 33 | export function resolvePlugin({ 34 | cdnUrl = "https://unpkg.com", 35 | }: { 36 | cdnUrl: string 37 | }): Plugin { 38 | const makeCDNUrl = (p: string) => { 39 | return cdnUrl + "/" + p.replace(/^\//, "") 40 | } 41 | 42 | return { 43 | name: "resolve", 44 | setup(build) { 45 | // External modules 46 | const external = [ 47 | ...(build.initialOptions.external || []), 48 | ...builtinModules, 49 | ] 50 | 51 | const isExternal = (id: string) => { 52 | function match(it: string): boolean { 53 | if (it === id) return true // import 'foo' & external: ['foo'] 54 | if (id.startsWith(`${it}/`)) return true // import 'foo/bar.js' & external: ['foo'] 55 | return false 56 | } 57 | return external.find(match) 58 | } 59 | 60 | build.onStart(() => { 61 | logger.clear() 62 | }) 63 | 64 | build.onEnd(() => { 65 | logger.clear() 66 | }) 67 | 68 | // Intercept import paths starting with "http:" and "https:" so 69 | // esbuild doesn't attempt to map them to a file system location. 70 | // Tag them with the "http-url" namespace to associate them with 71 | // this plugin. 72 | build.onResolve({ filter: URL_RE }, (args) => ({ 73 | path: args.path, 74 | namespace: "http-url", 75 | })) 76 | 77 | // We also want to intercept all import paths inside downloaded 78 | // files and resolve them against the original URL. All of these 79 | // files will be in the "http-url" namespace. Make sure to keep 80 | // the newly resolved URL in the "http-url" namespace so imports 81 | // inside it will also be resolved as URLs recursively. 82 | build.onResolve({ filter: /.*/, namespace: "http-url" }, (args) => { 83 | if (isExternal(args.path)) return { external: true, path: args.path } 84 | 85 | if (!args.path.startsWith(".")) { 86 | return { 87 | path: makeCDNUrl(args.path), 88 | namespace: "http-url", 89 | } 90 | } 91 | return { 92 | path: urlJoin(args.pluginData.url, "../", args.path), 93 | namespace: "http-url", 94 | } 95 | }) 96 | 97 | build.onResolve({ filter: /.*/ }, async (args) => { 98 | if (args.path.startsWith(PROJECT_ROOT)) { 99 | return { 100 | path: args.path, 101 | } 102 | } 103 | 104 | // Relative path 105 | if (args.path[0] === ".") { 106 | const absPath = join(args.importer, "..", args.path) 107 | for (const ext of RESOLVE_EXTENSIONS) { 108 | const file = state.files.get( 109 | absPath.replace(PROJECT_ROOT, "") + ext 110 | ) 111 | if (file) { 112 | return { 113 | path: absPath + ext, 114 | } 115 | } 116 | } 117 | if (state.files.has(absPath.replace(PROJECT_ROOT, ""))) { 118 | return { 119 | path: absPath, 120 | } 121 | } 122 | throw new Error(`file not found`) 123 | } 124 | 125 | if (isExternal(args.path)) return { external: true, path: args.path } 126 | 127 | const parsed = parsePackageName(args.path) 128 | let subpath = parsed.path 129 | if (!subpath) { 130 | const pkg = await fetch( 131 | makeCDNUrl(`${parsed.name}@${parsed.version}/package.json`) 132 | ).then((res) => res.json()) 133 | const p = 134 | resolve(pkg, ".", { 135 | require: 136 | args.kind === "require-call" || args.kind === "require-resolve", 137 | }) || legacy(pkg) 138 | if (typeof p === "string") { 139 | subpath = p.replace(/^\.?\/?/, "/") 140 | } 141 | } 142 | 143 | if (subpath && subpath[0] !== "/") { 144 | subpath = `/${subpath}` 145 | } 146 | 147 | return { 148 | path: makeCDNUrl(`${parsed.name}@${parsed.version}${subpath}`), 149 | namespace: "http-url", 150 | } 151 | }) 152 | 153 | // Local files 154 | build.onLoad({ filter: /.*/ }, (args) => { 155 | if (args.path.startsWith(PROJECT_ROOT)) { 156 | const name = args.path.replace(PROJECT_ROOT, "") 157 | const file = state.files.get(name) 158 | if (file) { 159 | return { 160 | contents: file.content, 161 | loader: inferLoader(args.path), 162 | } 163 | } 164 | } 165 | }) 166 | 167 | build.onLoad({ filter: /.*/, namespace: "http-url" }, async (args) => { 168 | logger.log(`Fetching ${args.path}`) 169 | const res = await fetch(args.path) 170 | if (!res.ok) throw new Error(`failed to load ${res.url}: ${res.status}`) 171 | const loader = inferLoader(res.url) 172 | return { 173 | contents: new Uint8Array(await res.arrayBuffer()), 174 | loader: loader as Loader, 175 | pluginData: { 176 | url: res.url, 177 | }, 178 | } 179 | }) 180 | }, 181 | } 182 | } 183 | 184 | function inferLoader(p: string): Loader { 185 | const ext = extname(p) 186 | if (RESOLVE_EXTENSIONS.includes(ext)) { 187 | return ext.slice(1) as Loader 188 | } 189 | if (ext === ".mjs" || ext === ".cjs") { 190 | return "js" 191 | } 192 | return "text" 193 | } 194 | 195 | export function formatBuildErrors(errors: PartialMessage[]) { 196 | return formatMessages(errors, { kind: "error" }).then((res) => 197 | res.join("\n\n") 198 | ) 199 | } 200 | -------------------------------------------------------------------------------- /src/lib/path.ts: -------------------------------------------------------------------------------- 1 | function assertPath(path: string): void { 2 | if (typeof path !== "string") { 3 | throw new TypeError( 4 | `Path must be a string. Received ${JSON.stringify(path)}` 5 | ) 6 | } 7 | } 8 | 9 | const CHAR_DOT = 46 /* . */ 10 | const CHAR_FORWARD_SLASH = 47 /* / */ 11 | 12 | // Resolves . and .. elements in a path with directory names 13 | export function normalizeString( 14 | path: string, 15 | allowAboveRoot: boolean, 16 | separator: string, 17 | isPathSeparator: (code: number) => boolean 18 | ): string { 19 | let res = "" 20 | let lastSegmentLength = 0 21 | let lastSlash = -1 22 | let dots = 0 23 | let code: number | undefined 24 | for (let i = 0, len = path.length; i <= len; ++i) { 25 | if (i < len) code = path.charCodeAt(i) 26 | else if (isPathSeparator(code!)) break 27 | else code = CHAR_FORWARD_SLASH 28 | 29 | if (isPathSeparator(code!)) { 30 | if (lastSlash === i - 1 || dots === 1) { 31 | // NOOP 32 | } else if (lastSlash !== i - 1 && dots === 2) { 33 | if ( 34 | res.length < 2 || 35 | lastSegmentLength !== 2 || 36 | res.charCodeAt(res.length - 1) !== CHAR_DOT || 37 | res.charCodeAt(res.length - 2) !== CHAR_DOT 38 | ) { 39 | if (res.length > 2) { 40 | const lastSlashIndex = res.lastIndexOf(separator) 41 | if (lastSlashIndex === -1) { 42 | res = "" 43 | lastSegmentLength = 0 44 | } else { 45 | res = res.slice(0, lastSlashIndex) 46 | lastSegmentLength = res.length - 1 - res.lastIndexOf(separator) 47 | } 48 | lastSlash = i 49 | dots = 0 50 | continue 51 | } else if (res.length === 2 || res.length === 1) { 52 | res = "" 53 | lastSegmentLength = 0 54 | lastSlash = i 55 | dots = 0 56 | continue 57 | } 58 | } 59 | if (allowAboveRoot) { 60 | if (res.length > 0) res += `${separator}..` 61 | else res = ".." 62 | lastSegmentLength = 2 63 | } 64 | } else { 65 | if (res.length > 0) res += separator + path.slice(lastSlash + 1, i) 66 | else res = path.slice(lastSlash + 1, i) 67 | lastSegmentLength = i - lastSlash - 1 68 | } 69 | lastSlash = i 70 | dots = 0 71 | } else if (code === CHAR_DOT && dots !== -1) { 72 | ++dots 73 | } else { 74 | dots = -1 75 | } 76 | } 77 | return res 78 | } 79 | 80 | function isPosixPathSeparator(code: number): boolean { 81 | return code === CHAR_FORWARD_SLASH 82 | } 83 | 84 | function normalize(path: string): string { 85 | assertPath(path) 86 | 87 | if (path.length === 0) return "." 88 | 89 | const isAbsolute = path.charCodeAt(0) === CHAR_FORWARD_SLASH 90 | const trailingSeparator = 91 | path.charCodeAt(path.length - 1) === CHAR_FORWARD_SLASH 92 | 93 | // Normalize the path 94 | path = normalizeString(path, !isAbsolute, "/", isPosixPathSeparator) 95 | 96 | if (path.length === 0 && !isAbsolute) path = "." 97 | if (path.length > 0 && trailingSeparator) path += "/" 98 | 99 | if (isAbsolute) return `/${path}` 100 | return path 101 | } 102 | 103 | export function join(...paths: string[]): string { 104 | if (paths.length === 0) return "." 105 | let joined: string | undefined 106 | for (let i = 0, len = paths.length; i < len; ++i) { 107 | const path = paths[i] 108 | assertPath(path) 109 | if (path.length > 0) { 110 | if (!joined) joined = path 111 | else joined += `/${path}` 112 | } 113 | } 114 | if (!joined) return "." 115 | return normalize(joined) 116 | } 117 | 118 | export function extname(path: string): string { 119 | const m = /(\.[a-zA-Z0-9]+)$/.exec(path) 120 | return m ? m[1] : "" 121 | } 122 | 123 | export function urlJoin(url: string, ...args: string[]) { 124 | const u = new URL(url) 125 | u.pathname = join(u.pathname, ...args) 126 | return u.toString() 127 | } 128 | -------------------------------------------------------------------------------- /src/lib/store.ts: -------------------------------------------------------------------------------- 1 | import { reactive } from "vue" 2 | 3 | export const state = reactive({ 4 | files: new Map([ 5 | [ 6 | "index.ts", 7 | { 8 | content: ` 9 | import { pipe, string, email } from 'valibot' 10 | 11 | const schema = pipe(string(), email()) 12 | 13 | console.log(schema.parse('hi@exmaple.com')) 14 | `.trim(), 15 | }, 16 | ], 17 | [ 18 | "esbuild.config.json", 19 | { 20 | content: JSON.stringify( 21 | { format: "esm", cdnUrl: "https://esm.sh" }, 22 | null, 23 | 2 24 | ), 25 | }, 26 | ], 27 | ]), 28 | }) 29 | -------------------------------------------------------------------------------- /src/lib/utils.ts: -------------------------------------------------------------------------------- 1 | export function debounce(fn: Function, n = 100) { 2 | let handle: any 3 | return (...args: any[]) => { 4 | if (handle) clearTimeout(handle) 5 | handle = setTimeout(() => { 6 | fn(...args) 7 | }, n) 8 | } 9 | } 10 | 11 | // prefer old unicode hacks for backward compatibility 12 | // https://base64.guru/developers/javascript/examples/unicode-strings 13 | export function utoa(data: string): string { 14 | return btoa(unescape(encodeURIComponent(data))) 15 | } 16 | 17 | export function atou(base64: string): string { 18 | return decodeURIComponent(escape(atob(base64))) 19 | } 20 | -------------------------------------------------------------------------------- /src/main.ts: -------------------------------------------------------------------------------- 1 | import "./css/tailwind.css"; 2 | import "./css/codemirror.css"; 3 | import { createApp } from "vue"; 4 | import App from "./components/App.vue"; 5 | 6 | createApp(App).mount("#app"); 7 | 8 | if (import.meta.env.PROD) { 9 | const script = document.createElement("script"); 10 | script.src = "https://umami2.egoist.dev/script.js"; 11 | script.defer = true; 12 | script.setAttribute( 13 | "data-website-id", 14 | "fcfe4289-ab86-4d66-91b1-23eb307c25b1" 15 | ); 16 | script.setAttribute("data-auto-track", "false"); 17 | 18 | script.onload = () => { 19 | if (typeof umami === "undefined") return; 20 | 21 | umami.track((props) => ({ 22 | ...props, 23 | url: location.pathname + location.search, 24 | })); 25 | }; 26 | 27 | document.head.appendChild(script); 28 | } 29 | -------------------------------------------------------------------------------- /tailwind.config.js: -------------------------------------------------------------------------------- 1 | /** @type {import('tailwindcss').Config} */ 2 | module.exports = { 3 | darkMode: "class", // or 'media' or 'class' 4 | content: ["./src/**/*.vue"], 5 | theme: { 6 | extend: { 7 | height: { 8 | header: "44px", 9 | main: "calc(100vh - 44px)", 10 | }, 11 | }, 12 | }, 13 | variants: { 14 | extend: {}, 15 | }, 16 | plugins: [], 17 | } 18 | -------------------------------------------------------------------------------- /tsconfig.json: -------------------------------------------------------------------------------- 1 | { 2 | "compilerOptions": { 3 | /* Visit https://aka.ms/tsconfig.json to read more about this file */ 4 | 5 | /* Projects */ 6 | // "incremental": true, /* Enable incremental compilation */ 7 | // "composite": true, /* Enable constraints that allow a TypeScript project to be used with project references. */ 8 | // "tsBuildInfoFile": "./", /* Specify the folder for .tsbuildinfo incremental compilation files. */ 9 | // "disableSourceOfProjectReferenceRedirect": true, /* Disable preferring source files instead of declaration files when referencing composite projects */ 10 | // "disableSolutionSearching": true, /* Opt a project out of multi-project reference checking when editing. */ 11 | // "disableReferencedProjectLoad": true, /* Reduce the number of projects loaded automatically by TypeScript. */ 12 | 13 | /* Language and Environment */ 14 | "target": "esnext" /* Set the JavaScript language version for emitted JavaScript and include compatible library declarations. */, 15 | // "lib": [], /* Specify a set of bundled library declaration files that describe the target runtime environment. */ 16 | // "jsx": "preserve", /* Specify what JSX code is generated. */ 17 | // "experimentalDecorators": true, /* Enable experimental support for TC39 stage 2 draft decorators. */ 18 | // "emitDecoratorMetadata": true, /* Emit design-type metadata for decorated declarations in source files. */ 19 | // "jsxFactory": "", /* Specify the JSX factory function used when targeting React JSX emit, e.g. 'React.createElement' or 'h' */ 20 | // "jsxFragmentFactory": "", /* Specify the JSX Fragment reference used for fragments when targeting React JSX emit e.g. 'React.Fragment' or 'Fragment'. */ 21 | // "jsxImportSource": "", /* Specify module specifier used to import the JSX factory functions when using `jsx: react-jsx*`.` */ 22 | // "reactNamespace": "", /* Specify the object invoked for `createElement`. This only applies when targeting `react` JSX emit. */ 23 | // "noLib": true, /* Disable including any library files, including the default lib.d.ts. */ 24 | // "useDefineForClassFields": true, /* Emit ECMAScript-standard-compliant class fields. */ 25 | 26 | /* Modules */ 27 | "module": "esnext" /* Specify what module code is generated. */, 28 | // "rootDir": "./", /* Specify the root folder within your source files. */ 29 | "moduleResolution": "node" /* Specify how TypeScript looks up a file from a given module specifier. */, 30 | // "baseUrl": "./", /* Specify the base directory to resolve non-relative module names. */ 31 | // "paths": {}, /* Specify a set of entries that re-map imports to additional lookup locations. */ 32 | // "rootDirs": [], /* Allow multiple folders to be treated as one when resolving modules. */ 33 | // "typeRoots": [], /* Specify multiple folders that act like `./node_modules/@types`. */ 34 | // "types": [], /* Specify type package names to be included without being referenced in a source file. */ 35 | // "allowUmdGlobalAccess": true, /* Allow accessing UMD globals from modules. */ 36 | // "resolveJsonModule": true, /* Enable importing .json files */ 37 | // "noResolve": true, /* Disallow `import`s, `require`s or ``s from expanding the number of files TypeScript should add to a project. */ 38 | 39 | /* JavaScript Support */ 40 | // "allowJs": true, /* Allow JavaScript files to be a part of your program. Use the `checkJS` option to get errors from these files. */ 41 | // "checkJs": true, /* Enable error reporting in type-checked JavaScript files. */ 42 | // "maxNodeModuleJsDepth": 1, /* Specify the maximum folder depth used for checking JavaScript files from `node_modules`. Only applicable with `allowJs`. */ 43 | 44 | /* Emit */ 45 | // "declaration": true, /* Generate .d.ts files from TypeScript and JavaScript files in your project. */ 46 | // "declarationMap": true, /* Create sourcemaps for d.ts files. */ 47 | // "emitDeclarationOnly": true, /* Only output d.ts files and not JavaScript files. */ 48 | // "sourceMap": true, /* Create source map files for emitted JavaScript files. */ 49 | // "outFile": "./", /* Specify a file that bundles all outputs into one JavaScript file. If `declaration` is true, also designates a file that bundles all .d.ts output. */ 50 | // "outDir": "./", /* Specify an output folder for all emitted files. */ 51 | // "removeComments": true, /* Disable emitting comments. */ 52 | // "noEmit": true, /* Disable emitting files from a compilation. */ 53 | // "importHelpers": true, /* Allow importing helper functions from tslib once per project, instead of including them per-file. */ 54 | // "importsNotUsedAsValues": "remove", /* Specify emit/checking behavior for imports that are only used for types */ 55 | // "downlevelIteration": true, /* Emit more compliant, but verbose and less performant JavaScript for iteration. */ 56 | // "sourceRoot": "", /* Specify the root path for debuggers to find the reference source code. */ 57 | // "mapRoot": "", /* Specify the location where debugger should locate map files instead of generated locations. */ 58 | // "inlineSourceMap": true, /* Include sourcemap files inside the emitted JavaScript. */ 59 | // "inlineSources": true, /* Include source code in the sourcemaps inside the emitted JavaScript. */ 60 | // "emitBOM": true, /* Emit a UTF-8 Byte Order Mark (BOM) in the beginning of output files. */ 61 | // "newLine": "crlf", /* Set the newline character for emitting files. */ 62 | // "stripInternal": true, /* Disable emitting declarations that have `@internal` in their JSDoc comments. */ 63 | // "noEmitHelpers": true, /* Disable generating custom helper functions like `__extends` in compiled output. */ 64 | // "noEmitOnError": true, /* Disable emitting files if any type checking errors are reported. */ 65 | // "preserveConstEnums": true, /* Disable erasing `const enum` declarations in generated code. */ 66 | // "declarationDir": "./", /* Specify the output directory for generated declaration files. */ 67 | 68 | /* Interop Constraints */ 69 | // "isolatedModules": true, /* Ensure that each file can be safely transpiled without relying on other imports. */ 70 | // "allowSyntheticDefaultImports": true, /* Allow 'import x from y' when a module doesn't have a default export. */ 71 | "esModuleInterop": true /* Emit additional JavaScript to ease support for importing CommonJS modules. This enables `allowSyntheticDefaultImports` for type compatibility. */, 72 | // "preserveSymlinks": true, /* Disable resolving symlinks to their realpath. This correlates to the same flag in node. */ 73 | "forceConsistentCasingInFileNames": true /* Ensure that casing is correct in imports. */, 74 | 75 | /* Type Checking */ 76 | "strict": true /* Enable all strict type-checking options. */, 77 | // "noImplicitAny": true, /* Enable error reporting for expressions and declarations with an implied `any` type.. */ 78 | // "strictNullChecks": true, /* When type checking, take into account `null` and `undefined`. */ 79 | // "strictFunctionTypes": true, /* When assigning functions, check to ensure parameters and the return values are subtype-compatible. */ 80 | // "strictBindCallApply": true, /* Check that the arguments for `bind`, `call`, and `apply` methods match the original function. */ 81 | // "strictPropertyInitialization": true, /* Check for class properties that are declared but not set in the constructor. */ 82 | // "noImplicitThis": true, /* Enable error reporting when `this` is given the type `any`. */ 83 | // "useUnknownInCatchVariables": true, /* Type catch clause variables as 'unknown' instead of 'any'. */ 84 | // "alwaysStrict": true, /* Ensure 'use strict' is always emitted. */ 85 | // "noUnusedLocals": true, /* Enable error reporting when a local variables aren't read. */ 86 | // "noUnusedParameters": true, /* Raise an error when a function parameter isn't read */ 87 | // "exactOptionalPropertyTypes": true, /* Interpret optional property types as written, rather than adding 'undefined'. */ 88 | // "noImplicitReturns": true, /* Enable error reporting for codepaths that do not explicitly return in a function. */ 89 | // "noFallthroughCasesInSwitch": true, /* Enable error reporting for fallthrough cases in switch statements. */ 90 | // "noUncheckedIndexedAccess": true, /* Include 'undefined' in index signature results */ 91 | // "noImplicitOverride": true, /* Ensure overriding members in derived classes are marked with an override modifier. */ 92 | // "noPropertyAccessFromIndexSignature": true, /* Enforces using indexed accessors for keys declared using an indexed type */ 93 | // "allowUnusedLabels": true, /* Disable error reporting for unused labels. */ 94 | // "allowUnreachableCode": true, /* Disable error reporting for unreachable code. */ 95 | 96 | /* Completeness */ 97 | // "skipDefaultLibCheck": true, /* Skip type checking .d.ts files that are included with TypeScript. */ 98 | "skipLibCheck": true /* Skip type checking all .d.ts files. */ 99 | } 100 | } 101 | -------------------------------------------------------------------------------- /vite.config.ts: -------------------------------------------------------------------------------- 1 | import { defineConfig } from "vite" 2 | import vue from "@vitejs/plugin-vue" 3 | import ejs from "ejs" 4 | 5 | export default defineConfig((ctx) => { 6 | return { 7 | plugins: [ 8 | vue(), 9 | { 10 | name: "ejs-html", 11 | transformIndexHtml: { 12 | order: "pre", 13 | handler(html) { 14 | return ejs.render(html, { prod: ctx.mode === "production" }) 15 | }, 16 | }, 17 | }, 18 | ], 19 | } 20 | }) 21 | --------------------------------------------------------------------------------