Compare commits
8 Commits
f31f1abaef
...
main
| Author | SHA1 | Date | |
|---|---|---|---|
| f31b2afcb1 | |||
| 8260aa197d | |||
| ff170ae2ce | |||
| fbb4882780 | |||
| dc039bfa16 | |||
| d6eb666a83 | |||
| 6eb7c1e07c | |||
| 515cd1d05e |
2
.env
2
.env
@@ -1,3 +1,3 @@
|
||||
PUBLIC_JUDGE0API_URL=https://judge0api.xuyue.cc
|
||||
PUBLIC_MAXKB_URL=https://maxkb.xuyue.cc/chat/api/embed?protocol=https&host=maxkb.xuyue.cc&token=2e801f7d6efdcc99
|
||||
PUBLIC_MAXKB_URL=https://maxkb.xuyue.cc/chat/api/embed?protocol=https&host=maxkb.xuyue.cc&token=dd37457027c40b39
|
||||
PUBLIC_CODEAPI_URL=http://localhost:8080
|
||||
@@ -1,3 +1,3 @@
|
||||
PUBLIC_JUDGE0API_URL=https://judge0api.xuyue.cc
|
||||
PUBLIC_MAXKB_URL=https://maxkb.xuyue.cc/chat/api/embed?protocol=https&host=maxkb.xuyue.cc&token=2e801f7d6efdcc99
|
||||
PUBLIC_MAXKB_URL=https://maxkb.xuyue.cc/chat/api/embed?protocol=https&host=maxkb.xuyue.cc&token=dd37457027c40b39
|
||||
PUBLIC_CODEAPI_URL=https://code.xuyue.cc/api
|
||||
@@ -9,11 +9,11 @@
|
||||
<script>
|
||||
window.localStorage.setItem("maxkbMaskTip", true)
|
||||
</script>
|
||||
<!-- <script
|
||||
<script
|
||||
async
|
||||
defer
|
||||
src="<%= import.meta.env.PUBLIC_MAXKB_URL %>"
|
||||
></script> -->
|
||||
></script>
|
||||
</head>
|
||||
<body>
|
||||
<div id="app"></div>
|
||||
|
||||
402
package-lock.json
generated
402
package-lock.json
generated
@@ -1,13 +1,14 @@
|
||||
{
|
||||
"name": "code-next",
|
||||
"version": "1.3.1",
|
||||
"version": "1.4.0",
|
||||
"lockfileVersion": 2,
|
||||
"requires": true,
|
||||
"packages": {
|
||||
"": {
|
||||
"name": "code-next",
|
||||
"version": "1.3.1",
|
||||
"version": "1.4.0",
|
||||
"dependencies": {
|
||||
"@codemirror/autocomplete": "^6.20.0",
|
||||
"@codemirror/lang-cpp": "^6.0.3",
|
||||
"@codemirror/lang-python": "^6.2.1",
|
||||
"@vueuse/core": "^14.1.0",
|
||||
@@ -27,7 +28,7 @@
|
||||
},
|
||||
"devDependencies": {
|
||||
"@iconify/vue": "^5.0.0",
|
||||
"@rsbuild/core": "^1.6.15",
|
||||
"@rsbuild/core": "^1.7.2",
|
||||
"@rsbuild/plugin-vue": "^1.2.2",
|
||||
"@types/file-saver": "^2.0.7",
|
||||
"prettier": "^3.7.4",
|
||||
@@ -81,20 +82,15 @@
|
||||
}
|
||||
},
|
||||
"node_modules/@codemirror/autocomplete": {
|
||||
"version": "6.12.0",
|
||||
"resolved": "https://registry.npmmirror.com/@codemirror/autocomplete/-/autocomplete-6.12.0.tgz",
|
||||
"integrity": "sha512-r4IjdYFthwbCQyvqnSlx0WBHRHi8nBvU+WjJxFUij81qsBfhNudf/XKKmmC2j3m0LaOYUQTf3qiEK1J8lO1sdg==",
|
||||
"version": "6.20.0",
|
||||
"resolved": "https://registry.npmmirror.com/@codemirror/autocomplete/-/autocomplete-6.20.0.tgz",
|
||||
"integrity": "sha512-bOwvTOIJcG5FVo5gUUupiwYh8MioPLQ4UcqbcRf7UQ98X90tCa9E1kZ3Z7tqwpZxYyOvh1YTYbmZE9RTfTp5hg==",
|
||||
"license": "MIT",
|
||||
"dependencies": {
|
||||
"@codemirror/language": "^6.0.0",
|
||||
"@codemirror/state": "^6.0.0",
|
||||
"@codemirror/view": "^6.17.0",
|
||||
"@lezer/common": "^1.0.0"
|
||||
},
|
||||
"peerDependencies": {
|
||||
"@codemirror/language": "^6.0.0",
|
||||
"@codemirror/state": "^6.0.0",
|
||||
"@codemirror/view": "^6.0.0",
|
||||
"@lezer/common": "^1.0.0"
|
||||
}
|
||||
},
|
||||
"node_modules/@codemirror/commands": {
|
||||
@@ -198,9 +194,9 @@
|
||||
}
|
||||
},
|
||||
"node_modules/@emnapi/core": {
|
||||
"version": "1.7.1",
|
||||
"resolved": "https://registry.npmjs.org/@emnapi/core/-/core-1.7.1.tgz",
|
||||
"integrity": "sha512-o1uhUASyo921r2XtHYOHy7gdkGLge8ghBEQHMWmyJFoXlpU58kIrhhN3w26lpQb6dspetweapMn2CSNwQ8I4wg==",
|
||||
"version": "1.8.1",
|
||||
"resolved": "https://registry.npmmirror.com/@emnapi/core/-/core-1.8.1.tgz",
|
||||
"integrity": "sha512-AvT9QFpxK0Zd8J0jopedNm+w/2fIzvtPKPjqyw9jwvBaReTTqPBk9Hixaz7KbjimP+QNz605/XnjFcDAL2pqBg==",
|
||||
"dev": true,
|
||||
"license": "MIT",
|
||||
"optional": true,
|
||||
@@ -210,9 +206,9 @@
|
||||
}
|
||||
},
|
||||
"node_modules/@emnapi/runtime": {
|
||||
"version": "1.7.1",
|
||||
"resolved": "https://registry.npmjs.org/@emnapi/runtime/-/runtime-1.7.1.tgz",
|
||||
"integrity": "sha512-PVtJr5CmLwYAU9PZDMITZoR5iAOShYREoR45EyyLrbntV50mdePTgUn4AmOw90Ifcj+x2kRjdzr1HP3RrNiHGA==",
|
||||
"version": "1.8.1",
|
||||
"resolved": "https://registry.npmmirror.com/@emnapi/runtime/-/runtime-1.8.1.tgz",
|
||||
"integrity": "sha512-mehfKSMWjjNol8659Z8KxEMrdSJDDot5SXMq00dM8BN4o+CLNXQ0xH2V7EchNHV4RmbZLmmPdEaXZc5H2FXmDg==",
|
||||
"dev": true,
|
||||
"license": "MIT",
|
||||
"optional": true,
|
||||
@@ -222,7 +218,7 @@
|
||||
},
|
||||
"node_modules/@emnapi/wasi-threads": {
|
||||
"version": "1.1.0",
|
||||
"resolved": "https://registry.npmjs.org/@emnapi/wasi-threads/-/wasi-threads-1.1.0.tgz",
|
||||
"resolved": "https://registry.npmmirror.com/@emnapi/wasi-threads/-/wasi-threads-1.1.0.tgz",
|
||||
"integrity": "sha512-WI0DdZ8xFSbgMjR1sFsKABJ/C5OnRrjT06JXbZKexJGrDuPTzZdDYfFlsgcCXCyf+suG5QU2e/y1Wo2V/OapLQ==",
|
||||
"dev": true,
|
||||
"license": "MIT",
|
||||
@@ -356,67 +352,67 @@
|
||||
}
|
||||
},
|
||||
"node_modules/@module-federation/error-codes": {
|
||||
"version": "0.21.6",
|
||||
"resolved": "https://registry.npmjs.org/@module-federation/error-codes/-/error-codes-0.21.6.tgz",
|
||||
"integrity": "sha512-MLJUCQ05KnoVl8xd6xs9a5g2/8U+eWmVxg7xiBMeR0+7OjdWUbHwcwgVFatRIwSZvFgKHfWEiI7wsU1q1XbTRQ==",
|
||||
"version": "0.22.0",
|
||||
"resolved": "https://registry.npmmirror.com/@module-federation/error-codes/-/error-codes-0.22.0.tgz",
|
||||
"integrity": "sha512-xF9SjnEy7vTdx+xekjPCV5cIHOGCkdn3pIxo9vU7gEZMIw0SvAEdsy6Uh17xaCpm8V0FWvR0SZoK9Ik6jGOaug==",
|
||||
"dev": true,
|
||||
"license": "MIT"
|
||||
},
|
||||
"node_modules/@module-federation/runtime": {
|
||||
"version": "0.21.6",
|
||||
"resolved": "https://registry.npmjs.org/@module-federation/runtime/-/runtime-0.21.6.tgz",
|
||||
"integrity": "sha512-+caXwaQqwTNh+CQqyb4mZmXq7iEemRDrTZQGD+zyeH454JAYnJ3s/3oDFizdH6245pk+NiqDyOOkHzzFQorKhQ==",
|
||||
"version": "0.22.0",
|
||||
"resolved": "https://registry.npmmirror.com/@module-federation/runtime/-/runtime-0.22.0.tgz",
|
||||
"integrity": "sha512-38g5iPju2tPC3KHMPxRKmy4k4onNp6ypFPS1eKGsNLUkXgHsPMBFqAjDw96iEcjri91BrahG4XcdyKi97xZzlA==",
|
||||
"dev": true,
|
||||
"license": "MIT",
|
||||
"dependencies": {
|
||||
"@module-federation/error-codes": "0.21.6",
|
||||
"@module-federation/runtime-core": "0.21.6",
|
||||
"@module-federation/sdk": "0.21.6"
|
||||
"@module-federation/error-codes": "0.22.0",
|
||||
"@module-federation/runtime-core": "0.22.0",
|
||||
"@module-federation/sdk": "0.22.0"
|
||||
}
|
||||
},
|
||||
"node_modules/@module-federation/runtime-core": {
|
||||
"version": "0.21.6",
|
||||
"resolved": "https://registry.npmjs.org/@module-federation/runtime-core/-/runtime-core-0.21.6.tgz",
|
||||
"integrity": "sha512-5Hd1Y5qp5lU/aTiK66lidMlM/4ji2gr3EXAtJdreJzkY+bKcI5+21GRcliZ4RAkICmvdxQU5PHPL71XmNc7Lsw==",
|
||||
"version": "0.22.0",
|
||||
"resolved": "https://registry.npmmirror.com/@module-federation/runtime-core/-/runtime-core-0.22.0.tgz",
|
||||
"integrity": "sha512-GR1TcD6/s7zqItfhC87zAp30PqzvceoeDGYTgF3Vx2TXvsfDrhP6Qw9T4vudDQL3uJRne6t7CzdT29YyVxlgIA==",
|
||||
"dev": true,
|
||||
"license": "MIT",
|
||||
"dependencies": {
|
||||
"@module-federation/error-codes": "0.21.6",
|
||||
"@module-federation/sdk": "0.21.6"
|
||||
"@module-federation/error-codes": "0.22.0",
|
||||
"@module-federation/sdk": "0.22.0"
|
||||
}
|
||||
},
|
||||
"node_modules/@module-federation/runtime-tools": {
|
||||
"version": "0.21.6",
|
||||
"resolved": "https://registry.npmjs.org/@module-federation/runtime-tools/-/runtime-tools-0.21.6.tgz",
|
||||
"integrity": "sha512-fnP+ZOZTFeBGiTAnxve+axGmiYn2D60h86nUISXjXClK3LUY1krUfPgf6MaD4YDJ4i51OGXZWPekeMe16pkd8Q==",
|
||||
"version": "0.22.0",
|
||||
"resolved": "https://registry.npmmirror.com/@module-federation/runtime-tools/-/runtime-tools-0.22.0.tgz",
|
||||
"integrity": "sha512-4ScUJ/aUfEernb+4PbLdhM/c60VHl698Gn1gY21m9vyC1Ucn69fPCA1y2EwcCB7IItseRMoNhdcWQnzt/OPCNA==",
|
||||
"dev": true,
|
||||
"license": "MIT",
|
||||
"dependencies": {
|
||||
"@module-federation/runtime": "0.21.6",
|
||||
"@module-federation/webpack-bundler-runtime": "0.21.6"
|
||||
"@module-federation/runtime": "0.22.0",
|
||||
"@module-federation/webpack-bundler-runtime": "0.22.0"
|
||||
}
|
||||
},
|
||||
"node_modules/@module-federation/sdk": {
|
||||
"version": "0.21.6",
|
||||
"resolved": "https://registry.npmjs.org/@module-federation/sdk/-/sdk-0.21.6.tgz",
|
||||
"integrity": "sha512-x6hARETb8iqHVhEsQBysuWpznNZViUh84qV2yE7AD+g7uIzHKiYdoWqj10posbo5XKf/147qgWDzKZoKoEP2dw==",
|
||||
"version": "0.22.0",
|
||||
"resolved": "https://registry.npmmirror.com/@module-federation/sdk/-/sdk-0.22.0.tgz",
|
||||
"integrity": "sha512-x4aFNBKn2KVQRuNVC5A7SnrSCSqyfIWmm1DvubjbO9iKFe7ith5niw8dqSFBekYBg2Fwy+eMg4sEFNVvCAdo6g==",
|
||||
"dev": true,
|
||||
"license": "MIT"
|
||||
},
|
||||
"node_modules/@module-federation/webpack-bundler-runtime": {
|
||||
"version": "0.21.6",
|
||||
"resolved": "https://registry.npmjs.org/@module-federation/webpack-bundler-runtime/-/webpack-bundler-runtime-0.21.6.tgz",
|
||||
"integrity": "sha512-7zIp3LrcWbhGuFDTUMLJ2FJvcwjlddqhWGxi/MW3ur1a+HaO8v5tF2nl+vElKmbG1DFLU/52l3PElVcWf/YcsQ==",
|
||||
"version": "0.22.0",
|
||||
"resolved": "https://registry.npmmirror.com/@module-federation/webpack-bundler-runtime/-/webpack-bundler-runtime-0.22.0.tgz",
|
||||
"integrity": "sha512-aM8gCqXu+/4wBmJtVeMeeMN5guw3chf+2i6HajKtQv7SJfxV/f4IyNQJUeUQu9HfiAZHjqtMV5Lvq/Lvh8LdyA==",
|
||||
"dev": true,
|
||||
"license": "MIT",
|
||||
"dependencies": {
|
||||
"@module-federation/runtime": "0.21.6",
|
||||
"@module-federation/sdk": "0.21.6"
|
||||
"@module-federation/runtime": "0.22.0",
|
||||
"@module-federation/sdk": "0.22.0"
|
||||
}
|
||||
},
|
||||
"node_modules/@napi-rs/wasm-runtime": {
|
||||
"version": "1.0.7",
|
||||
"resolved": "https://registry.npmjs.org/@napi-rs/wasm-runtime/-/wasm-runtime-1.0.7.tgz",
|
||||
"resolved": "https://registry.npmmirror.com/@napi-rs/wasm-runtime/-/wasm-runtime-1.0.7.tgz",
|
||||
"integrity": "sha512-SeDnOO0Tk7Okiq6DbXmmBODgOAb9dp9gjlphokTUxmt8U3liIP1ZsozBahH69j/RJv+Rfs6IwUKHTgQYJ/HBAw==",
|
||||
"dev": true,
|
||||
"license": "MIT",
|
||||
@@ -428,16 +424,16 @@
|
||||
}
|
||||
},
|
||||
"node_modules/@rsbuild/core": {
|
||||
"version": "1.6.15",
|
||||
"resolved": "https://registry.npmjs.org/@rsbuild/core/-/core-1.6.15.tgz",
|
||||
"integrity": "sha512-LvoOF53PL6zXgdzEhgnnP51S4FseDFH1bHrobK4EK6zZX/tN8qgf5tdlmN7h4OkMv/Qs1oUfvj0QcLWSstnnvA==",
|
||||
"version": "1.7.2",
|
||||
"resolved": "https://registry.npmmirror.com/@rsbuild/core/-/core-1.7.2.tgz",
|
||||
"integrity": "sha512-VAFO6cM+cyg2ntxNW6g3tB2Jc5J5mpLjLluvm7VtW2uceNzyUlVv41o66Yp1t1ikxd3ljtqegViXem62JqzveA==",
|
||||
"dev": true,
|
||||
"license": "MIT",
|
||||
"peer": true,
|
||||
"dependencies": {
|
||||
"@rspack/core": "1.6.8",
|
||||
"@rspack/core": "~1.7.1",
|
||||
"@rspack/lite-tapable": "~1.1.0",
|
||||
"@swc/helpers": "^0.5.17",
|
||||
"@swc/helpers": "^0.5.18",
|
||||
"core-js": "~3.47.0",
|
||||
"jiti": "^2.6.1"
|
||||
},
|
||||
@@ -463,28 +459,28 @@
|
||||
}
|
||||
},
|
||||
"node_modules/@rspack/binding": {
|
||||
"version": "1.6.8",
|
||||
"resolved": "https://registry.npmjs.org/@rspack/binding/-/binding-1.6.8.tgz",
|
||||
"integrity": "sha512-lUeL4mbwGo+nqRKqFDCm9vH2jv9FNMVt1X8jqayWRcOCPlj/2UVMEFgqjR7Pp2vlvnTKq//31KbDBJmDZq31RQ==",
|
||||
"version": "1.7.1",
|
||||
"resolved": "https://registry.npmmirror.com/@rspack/binding/-/binding-1.7.1.tgz",
|
||||
"integrity": "sha512-qVTV1/UWpMSZktvK5A8+HolgR1Qf0nYR3Gg4Vax5x3/BcHDpwGZ0fbdFRUirGVWH/XwxZ81zoI6F2SZq7xbX+w==",
|
||||
"dev": true,
|
||||
"license": "MIT",
|
||||
"optionalDependencies": {
|
||||
"@rspack/binding-darwin-arm64": "1.6.8",
|
||||
"@rspack/binding-darwin-x64": "1.6.8",
|
||||
"@rspack/binding-linux-arm64-gnu": "1.6.8",
|
||||
"@rspack/binding-linux-arm64-musl": "1.6.8",
|
||||
"@rspack/binding-linux-x64-gnu": "1.6.8",
|
||||
"@rspack/binding-linux-x64-musl": "1.6.8",
|
||||
"@rspack/binding-wasm32-wasi": "1.6.8",
|
||||
"@rspack/binding-win32-arm64-msvc": "1.6.8",
|
||||
"@rspack/binding-win32-ia32-msvc": "1.6.8",
|
||||
"@rspack/binding-win32-x64-msvc": "1.6.8"
|
||||
"@rspack/binding-darwin-arm64": "1.7.1",
|
||||
"@rspack/binding-darwin-x64": "1.7.1",
|
||||
"@rspack/binding-linux-arm64-gnu": "1.7.1",
|
||||
"@rspack/binding-linux-arm64-musl": "1.7.1",
|
||||
"@rspack/binding-linux-x64-gnu": "1.7.1",
|
||||
"@rspack/binding-linux-x64-musl": "1.7.1",
|
||||
"@rspack/binding-wasm32-wasi": "1.7.1",
|
||||
"@rspack/binding-win32-arm64-msvc": "1.7.1",
|
||||
"@rspack/binding-win32-ia32-msvc": "1.7.1",
|
||||
"@rspack/binding-win32-x64-msvc": "1.7.1"
|
||||
}
|
||||
},
|
||||
"node_modules/@rspack/binding-darwin-arm64": {
|
||||
"version": "1.6.8",
|
||||
"resolved": "https://registry.npmjs.org/@rspack/binding-darwin-arm64/-/binding-darwin-arm64-1.6.8.tgz",
|
||||
"integrity": "sha512-e8CTQtzaeGnf+BIzR7wRMUwKfIg0jd/sxMRc1Vd0bCMHBhSN9EsGoMuJJaKeRrSmy2nwMCNWHIG+TvT1CEKg+A==",
|
||||
"version": "1.7.1",
|
||||
"resolved": "https://registry.npmmirror.com/@rspack/binding-darwin-arm64/-/binding-darwin-arm64-1.7.1.tgz",
|
||||
"integrity": "sha512-3C0w0kfCHfgOH+AP/Dx1bm/b3AR/or5CmU22Abevek0m95ndU3iT902eLcm9JNiMQnDQLBQbolfj5P591t0oPg==",
|
||||
"cpu": [
|
||||
"arm64"
|
||||
],
|
||||
@@ -496,9 +492,9 @@
|
||||
]
|
||||
},
|
||||
"node_modules/@rspack/binding-darwin-x64": {
|
||||
"version": "1.6.8",
|
||||
"resolved": "https://registry.npmjs.org/@rspack/binding-darwin-x64/-/binding-darwin-x64-1.6.8.tgz",
|
||||
"integrity": "sha512-ku1XpTEPt6Za11zhpFWhfwrTQogcgi9RJrOUVC4FESiPO9aKyd4hJ+JiPgLY0MZOqsptK6vEAgOip+uDVXrCpg==",
|
||||
"version": "1.7.1",
|
||||
"resolved": "https://registry.npmmirror.com/@rspack/binding-darwin-x64/-/binding-darwin-x64-1.7.1.tgz",
|
||||
"integrity": "sha512-HTrBpdw2gWwcpJ3c8h4JF8B1YRNvrFT+K620ycttrlu/HvI4/U770BBJ/ej36R/hdh59JvMCGe+w49FyXv6rzg==",
|
||||
"cpu": [
|
||||
"x64"
|
||||
],
|
||||
@@ -510,9 +506,9 @@
|
||||
]
|
||||
},
|
||||
"node_modules/@rspack/binding-linux-arm64-gnu": {
|
||||
"version": "1.6.8",
|
||||
"resolved": "https://registry.npmjs.org/@rspack/binding-linux-arm64-gnu/-/binding-linux-arm64-gnu-1.6.8.tgz",
|
||||
"integrity": "sha512-fvZX6xZPvBT8qipSpvkKMX5M7yd2BSpZNCZXcefw6gA3uC7LI3gu+er0LrDXY1PtPzVuHTyDx+abwWpagV3PiQ==",
|
||||
"version": "1.7.1",
|
||||
"resolved": "https://registry.npmmirror.com/@rspack/binding-linux-arm64-gnu/-/binding-linux-arm64-gnu-1.7.1.tgz",
|
||||
"integrity": "sha512-BX9yAPCO0WBFyOzKl9bSXT/cH27nnOJp02smIQMxfv7RNfwGkJg5GgakYcuYG+9U1HEFitBSzmwS2+dxDcAxlg==",
|
||||
"cpu": [
|
||||
"arm64"
|
||||
],
|
||||
@@ -524,9 +520,9 @@
|
||||
]
|
||||
},
|
||||
"node_modules/@rspack/binding-linux-arm64-musl": {
|
||||
"version": "1.6.8",
|
||||
"resolved": "https://registry.npmjs.org/@rspack/binding-linux-arm64-musl/-/binding-linux-arm64-musl-1.6.8.tgz",
|
||||
"integrity": "sha512-++XMKcMNrt59HcFBLnRaJcn70k3X0GwkAegZBVpel8xYIAgvoXT5+L8P1ExId/yTFxqedaz8DbcxQnNmMozviw==",
|
||||
"version": "1.7.1",
|
||||
"resolved": "https://registry.npmmirror.com/@rspack/binding-linux-arm64-musl/-/binding-linux-arm64-musl-1.7.1.tgz",
|
||||
"integrity": "sha512-maBX19XyiVkxzh/NA79ALetCobc4zUyoWkWLeCGyW5xKzhPVFatJp+qCiHqHkqUZcgRo+1i5ihoZ2bXmelIeZg==",
|
||||
"cpu": [
|
||||
"arm64"
|
||||
],
|
||||
@@ -538,9 +534,9 @@
|
||||
]
|
||||
},
|
||||
"node_modules/@rspack/binding-linux-x64-gnu": {
|
||||
"version": "1.6.8",
|
||||
"resolved": "https://registry.npmjs.org/@rspack/binding-linux-x64-gnu/-/binding-linux-x64-gnu-1.6.8.tgz",
|
||||
"integrity": "sha512-tv3BWkTE1TndfX+DsE1rSTg8fBevCxujNZ3MlfZ22Wfy9x1FMXTJlWG8VIOXmaaJ1wUHzv8S7cE2YUUJ2LuiCg==",
|
||||
"version": "1.7.1",
|
||||
"resolved": "https://registry.npmmirror.com/@rspack/binding-linux-x64-gnu/-/binding-linux-x64-gnu-1.7.1.tgz",
|
||||
"integrity": "sha512-8KJAeBLiWcN7zEc9aaS7LRJPZVtZuQU8mCsn+fRhdQDSc+a9FcTN8b6Lw29z8cejwbU6Gxr/8wk5XGexMWFaZA==",
|
||||
"cpu": [
|
||||
"x64"
|
||||
],
|
||||
@@ -552,9 +548,9 @@
|
||||
]
|
||||
},
|
||||
"node_modules/@rspack/binding-linux-x64-musl": {
|
||||
"version": "1.6.8",
|
||||
"resolved": "https://registry.npmjs.org/@rspack/binding-linux-x64-musl/-/binding-linux-x64-musl-1.6.8.tgz",
|
||||
"integrity": "sha512-DCGgZ5/in1O3FjHWqXnDsncRy+48cMhfuUAAUyl0yDj1NpsZu9pP+xfGLvGcQTiYrVl7IH9Aojf1eShP/77WGA==",
|
||||
"version": "1.7.1",
|
||||
"resolved": "https://registry.npmmirror.com/@rspack/binding-linux-x64-musl/-/binding-linux-x64-musl-1.7.1.tgz",
|
||||
"integrity": "sha512-Gn9x5vhKRELvSoZ3ZjquY8eWtCXur0OsYnZ2/ump8mofM6IDaL7Qqu3Hf4Kud31PDH0tfz0jWf9piX32HHPmgg==",
|
||||
"cpu": [
|
||||
"x64"
|
||||
],
|
||||
@@ -566,9 +562,9 @@
|
||||
]
|
||||
},
|
||||
"node_modules/@rspack/binding-wasm32-wasi": {
|
||||
"version": "1.6.8",
|
||||
"resolved": "https://registry.npmjs.org/@rspack/binding-wasm32-wasi/-/binding-wasm32-wasi-1.6.8.tgz",
|
||||
"integrity": "sha512-VUwdhl/lI4m6o1OGCZ9JwtMjTV/yLY5VZTQdEPKb40JMTlmZ5MBlr5xk7ByaXXYHr6I+qnqEm73iMKQvg6iknw==",
|
||||
"version": "1.7.1",
|
||||
"resolved": "https://registry.npmmirror.com/@rspack/binding-wasm32-wasi/-/binding-wasm32-wasi-1.7.1.tgz",
|
||||
"integrity": "sha512-2r9M5iVchmsFkp3sz7A5YnMm2TfpkB71LK3AoaRWKMfvf5oFky0GSGISYd2TCBASO+X2Qskaq+B24Szo8zH5FA==",
|
||||
"cpu": [
|
||||
"wasm32"
|
||||
],
|
||||
@@ -580,9 +576,9 @@
|
||||
}
|
||||
},
|
||||
"node_modules/@rspack/binding-win32-arm64-msvc": {
|
||||
"version": "1.6.8",
|
||||
"resolved": "https://registry.npmjs.org/@rspack/binding-win32-arm64-msvc/-/binding-win32-arm64-msvc-1.6.8.tgz",
|
||||
"integrity": "sha512-23YX7zlOZlub+nPGDBUzktb4D5D6ETUAluKjXEeHIZ9m7fSlEYBnGL66YE+3t1DHXGd0OqsdwlvrNGcyo6EXDQ==",
|
||||
"version": "1.7.1",
|
||||
"resolved": "https://registry.npmmirror.com/@rspack/binding-win32-arm64-msvc/-/binding-win32-arm64-msvc-1.7.1.tgz",
|
||||
"integrity": "sha512-/WIHp982yqqqAuiz2WLtf1ofo9d1lHDGZJ7flxFllb1iMgnUeSRyX6stxEi11K3Rg6pQa7FdCZGKX/engyj2bw==",
|
||||
"cpu": [
|
||||
"arm64"
|
||||
],
|
||||
@@ -594,9 +590,9 @@
|
||||
]
|
||||
},
|
||||
"node_modules/@rspack/binding-win32-ia32-msvc": {
|
||||
"version": "1.6.8",
|
||||
"resolved": "https://registry.npmjs.org/@rspack/binding-win32-ia32-msvc/-/binding-win32-ia32-msvc-1.6.8.tgz",
|
||||
"integrity": "sha512-cFgRE3APxrY4AEdooVk2LtipwNNT/9mrnjdC5lVbsIsz+SxvGbZR231bxDJEqP15+RJOaD07FO1sIjINFqXMEg==",
|
||||
"version": "1.7.1",
|
||||
"resolved": "https://registry.npmmirror.com/@rspack/binding-win32-ia32-msvc/-/binding-win32-ia32-msvc-1.7.1.tgz",
|
||||
"integrity": "sha512-Kpela29n+kDGGsss6q/3qTd6n9VW7TOQaiA7t1YLdCCl8qqcdKlz/vWjFMd2MqgcSGC/16PvChE4sgpUvryfCQ==",
|
||||
"cpu": [
|
||||
"ia32"
|
||||
],
|
||||
@@ -608,9 +604,9 @@
|
||||
]
|
||||
},
|
||||
"node_modules/@rspack/binding-win32-x64-msvc": {
|
||||
"version": "1.6.8",
|
||||
"resolved": "https://registry.npmjs.org/@rspack/binding-win32-x64-msvc/-/binding-win32-x64-msvc-1.6.8.tgz",
|
||||
"integrity": "sha512-cIuhVsZYd3o3Neo1JSAhJYw6BDvlxaBoqvgwRkG1rs0ExFmEmgYyG7ip9pFKnKNWph/tmW3rDYypmEfjs1is7g==",
|
||||
"version": "1.7.1",
|
||||
"resolved": "https://registry.npmmirror.com/@rspack/binding-win32-x64-msvc/-/binding-win32-x64-msvc-1.7.1.tgz",
|
||||
"integrity": "sha512-B/y4MWqP2Xeto1/HV0qtZNOMPSLrEVOqi2b7JSIXG/bhlf+3IAkDzEEoHs+ZikLR4C8hMaS0pVJsDGKFmGzC9A==",
|
||||
"cpu": [
|
||||
"x64"
|
||||
],
|
||||
@@ -622,14 +618,14 @@
|
||||
]
|
||||
},
|
||||
"node_modules/@rspack/core": {
|
||||
"version": "1.6.8",
|
||||
"resolved": "https://registry.npmjs.org/@rspack/core/-/core-1.6.8.tgz",
|
||||
"integrity": "sha512-FolcIAH5FW4J2FET+qwjd1kNeFbCkd0VLuIHO0thyolEjaPSxw5qxG67DA7BZGm6PVcoiSgPLks1DL6eZ8c+fA==",
|
||||
"version": "1.7.1",
|
||||
"resolved": "https://registry.npmmirror.com/@rspack/core/-/core-1.7.1.tgz",
|
||||
"integrity": "sha512-kRxfY8RRa6nU3/viDvAIP6CRpx+0rfXFRonPL0pHBx8u6HhV7m9rLEyaN6MWsLgNIAWkleFGb7tdo4ux2ljRJQ==",
|
||||
"dev": true,
|
||||
"license": "MIT",
|
||||
"dependencies": {
|
||||
"@module-federation/runtime-tools": "0.21.6",
|
||||
"@rspack/binding": "1.6.8",
|
||||
"@module-federation/runtime-tools": "0.22.0",
|
||||
"@rspack/binding": "1.7.1",
|
||||
"@rspack/lite-tapable": "1.1.0"
|
||||
},
|
||||
"engines": {
|
||||
@@ -646,15 +642,15 @@
|
||||
},
|
||||
"node_modules/@rspack/lite-tapable": {
|
||||
"version": "1.1.0",
|
||||
"resolved": "https://registry.npmjs.org/@rspack/lite-tapable/-/lite-tapable-1.1.0.tgz",
|
||||
"resolved": "https://registry.npmmirror.com/@rspack/lite-tapable/-/lite-tapable-1.1.0.tgz",
|
||||
"integrity": "sha512-E2B0JhYFmVAwdDiG14+DW0Di4Ze4Jg10Pc4/lILUrd5DRCaklduz2OvJ5HYQ6G+hd+WTzqQb3QnDNfK4yvAFYw==",
|
||||
"dev": true,
|
||||
"license": "MIT"
|
||||
},
|
||||
"node_modules/@swc/helpers": {
|
||||
"version": "0.5.17",
|
||||
"resolved": "https://registry.npmjs.org/@swc/helpers/-/helpers-0.5.17.tgz",
|
||||
"integrity": "sha512-5IKx/Y13RsYd+sauPb2x+U/xZikHjolzfuDgTAl/Tdf3Q8rslRvC19NKDLgAJQ6wsqADk10ntlv08nPFw/gO/A==",
|
||||
"version": "0.5.18",
|
||||
"resolved": "https://registry.npmmirror.com/@swc/helpers/-/helpers-0.5.18.tgz",
|
||||
"integrity": "sha512-TXTnIcNJQEKwThMMqBXsZ4VGAza6bvN4pa41Rkqoio6QBKMvo+5lexeTMScGCIxtzgQJzElcvIltani+adC5PQ==",
|
||||
"dev": true,
|
||||
"license": "Apache-2.0",
|
||||
"peer": true,
|
||||
@@ -664,7 +660,7 @@
|
||||
},
|
||||
"node_modules/@tybys/wasm-util": {
|
||||
"version": "0.10.1",
|
||||
"resolved": "https://registry.npmjs.org/@tybys/wasm-util/-/wasm-util-0.10.1.tgz",
|
||||
"resolved": "https://registry.npmmirror.com/@tybys/wasm-util/-/wasm-util-0.10.1.tgz",
|
||||
"integrity": "sha512-9tTaPJLSiejZKx+Bmog4uSubteqTvFrVrURwkmHixBo0G4seD0zUxp98E1DzUBJxLQ3NPwXrGKDiVjwx/DpPsg==",
|
||||
"dev": true,
|
||||
"license": "MIT",
|
||||
@@ -2347,7 +2343,7 @@
|
||||
},
|
||||
"node_modules/tslib": {
|
||||
"version": "2.8.1",
|
||||
"resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz",
|
||||
"resolved": "https://registry.npmmirror.com/tslib/-/tslib-2.8.1.tgz",
|
||||
"integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==",
|
||||
"dev": true,
|
||||
"license": "0BSD"
|
||||
@@ -2593,9 +2589,9 @@
|
||||
}
|
||||
},
|
||||
"@codemirror/autocomplete": {
|
||||
"version": "6.12.0",
|
||||
"resolved": "https://registry.npmmirror.com/@codemirror/autocomplete/-/autocomplete-6.12.0.tgz",
|
||||
"integrity": "sha512-r4IjdYFthwbCQyvqnSlx0WBHRHi8nBvU+WjJxFUij81qsBfhNudf/XKKmmC2j3m0LaOYUQTf3qiEK1J8lO1sdg==",
|
||||
"version": "6.20.0",
|
||||
"resolved": "https://registry.npmmirror.com/@codemirror/autocomplete/-/autocomplete-6.20.0.tgz",
|
||||
"integrity": "sha512-bOwvTOIJcG5FVo5gUUupiwYh8MioPLQ4UcqbcRf7UQ98X90tCa9E1kZ3Z7tqwpZxYyOvh1YTYbmZE9RTfTp5hg==",
|
||||
"requires": {
|
||||
"@codemirror/language": "^6.0.0",
|
||||
"@codemirror/state": "^6.0.0",
|
||||
@@ -2696,9 +2692,9 @@
|
||||
"requires": {}
|
||||
},
|
||||
"@emnapi/core": {
|
||||
"version": "1.7.1",
|
||||
"resolved": "https://registry.npmjs.org/@emnapi/core/-/core-1.7.1.tgz",
|
||||
"integrity": "sha512-o1uhUASyo921r2XtHYOHy7gdkGLge8ghBEQHMWmyJFoXlpU58kIrhhN3w26lpQb6dspetweapMn2CSNwQ8I4wg==",
|
||||
"version": "1.8.1",
|
||||
"resolved": "https://registry.npmmirror.com/@emnapi/core/-/core-1.8.1.tgz",
|
||||
"integrity": "sha512-AvT9QFpxK0Zd8J0jopedNm+w/2fIzvtPKPjqyw9jwvBaReTTqPBk9Hixaz7KbjimP+QNz605/XnjFcDAL2pqBg==",
|
||||
"dev": true,
|
||||
"optional": true,
|
||||
"requires": {
|
||||
@@ -2707,9 +2703,9 @@
|
||||
}
|
||||
},
|
||||
"@emnapi/runtime": {
|
||||
"version": "1.7.1",
|
||||
"resolved": "https://registry.npmjs.org/@emnapi/runtime/-/runtime-1.7.1.tgz",
|
||||
"integrity": "sha512-PVtJr5CmLwYAU9PZDMITZoR5iAOShYREoR45EyyLrbntV50mdePTgUn4AmOw90Ifcj+x2kRjdzr1HP3RrNiHGA==",
|
||||
"version": "1.8.1",
|
||||
"resolved": "https://registry.npmmirror.com/@emnapi/runtime/-/runtime-1.8.1.tgz",
|
||||
"integrity": "sha512-mehfKSMWjjNol8659Z8KxEMrdSJDDot5SXMq00dM8BN4o+CLNXQ0xH2V7EchNHV4RmbZLmmPdEaXZc5H2FXmDg==",
|
||||
"dev": true,
|
||||
"optional": true,
|
||||
"requires": {
|
||||
@@ -2718,7 +2714,7 @@
|
||||
},
|
||||
"@emnapi/wasi-threads": {
|
||||
"version": "1.1.0",
|
||||
"resolved": "https://registry.npmjs.org/@emnapi/wasi-threads/-/wasi-threads-1.1.0.tgz",
|
||||
"resolved": "https://registry.npmmirror.com/@emnapi/wasi-threads/-/wasi-threads-1.1.0.tgz",
|
||||
"integrity": "sha512-WI0DdZ8xFSbgMjR1sFsKABJ/C5OnRrjT06JXbZKexJGrDuPTzZdDYfFlsgcCXCyf+suG5QU2e/y1Wo2V/OapLQ==",
|
||||
"dev": true,
|
||||
"optional": true,
|
||||
@@ -2834,61 +2830,61 @@
|
||||
}
|
||||
},
|
||||
"@module-federation/error-codes": {
|
||||
"version": "0.21.6",
|
||||
"resolved": "https://registry.npmjs.org/@module-federation/error-codes/-/error-codes-0.21.6.tgz",
|
||||
"integrity": "sha512-MLJUCQ05KnoVl8xd6xs9a5g2/8U+eWmVxg7xiBMeR0+7OjdWUbHwcwgVFatRIwSZvFgKHfWEiI7wsU1q1XbTRQ==",
|
||||
"version": "0.22.0",
|
||||
"resolved": "https://registry.npmmirror.com/@module-federation/error-codes/-/error-codes-0.22.0.tgz",
|
||||
"integrity": "sha512-xF9SjnEy7vTdx+xekjPCV5cIHOGCkdn3pIxo9vU7gEZMIw0SvAEdsy6Uh17xaCpm8V0FWvR0SZoK9Ik6jGOaug==",
|
||||
"dev": true
|
||||
},
|
||||
"@module-federation/runtime": {
|
||||
"version": "0.21.6",
|
||||
"resolved": "https://registry.npmjs.org/@module-federation/runtime/-/runtime-0.21.6.tgz",
|
||||
"integrity": "sha512-+caXwaQqwTNh+CQqyb4mZmXq7iEemRDrTZQGD+zyeH454JAYnJ3s/3oDFizdH6245pk+NiqDyOOkHzzFQorKhQ==",
|
||||
"version": "0.22.0",
|
||||
"resolved": "https://registry.npmmirror.com/@module-federation/runtime/-/runtime-0.22.0.tgz",
|
||||
"integrity": "sha512-38g5iPju2tPC3KHMPxRKmy4k4onNp6ypFPS1eKGsNLUkXgHsPMBFqAjDw96iEcjri91BrahG4XcdyKi97xZzlA==",
|
||||
"dev": true,
|
||||
"requires": {
|
||||
"@module-federation/error-codes": "0.21.6",
|
||||
"@module-federation/runtime-core": "0.21.6",
|
||||
"@module-federation/sdk": "0.21.6"
|
||||
"@module-federation/error-codes": "0.22.0",
|
||||
"@module-federation/runtime-core": "0.22.0",
|
||||
"@module-federation/sdk": "0.22.0"
|
||||
}
|
||||
},
|
||||
"@module-federation/runtime-core": {
|
||||
"version": "0.21.6",
|
||||
"resolved": "https://registry.npmjs.org/@module-federation/runtime-core/-/runtime-core-0.21.6.tgz",
|
||||
"integrity": "sha512-5Hd1Y5qp5lU/aTiK66lidMlM/4ji2gr3EXAtJdreJzkY+bKcI5+21GRcliZ4RAkICmvdxQU5PHPL71XmNc7Lsw==",
|
||||
"version": "0.22.0",
|
||||
"resolved": "https://registry.npmmirror.com/@module-federation/runtime-core/-/runtime-core-0.22.0.tgz",
|
||||
"integrity": "sha512-GR1TcD6/s7zqItfhC87zAp30PqzvceoeDGYTgF3Vx2TXvsfDrhP6Qw9T4vudDQL3uJRne6t7CzdT29YyVxlgIA==",
|
||||
"dev": true,
|
||||
"requires": {
|
||||
"@module-federation/error-codes": "0.21.6",
|
||||
"@module-federation/sdk": "0.21.6"
|
||||
"@module-federation/error-codes": "0.22.0",
|
||||
"@module-federation/sdk": "0.22.0"
|
||||
}
|
||||
},
|
||||
"@module-federation/runtime-tools": {
|
||||
"version": "0.21.6",
|
||||
"resolved": "https://registry.npmjs.org/@module-federation/runtime-tools/-/runtime-tools-0.21.6.tgz",
|
||||
"integrity": "sha512-fnP+ZOZTFeBGiTAnxve+axGmiYn2D60h86nUISXjXClK3LUY1krUfPgf6MaD4YDJ4i51OGXZWPekeMe16pkd8Q==",
|
||||
"version": "0.22.0",
|
||||
"resolved": "https://registry.npmmirror.com/@module-federation/runtime-tools/-/runtime-tools-0.22.0.tgz",
|
||||
"integrity": "sha512-4ScUJ/aUfEernb+4PbLdhM/c60VHl698Gn1gY21m9vyC1Ucn69fPCA1y2EwcCB7IItseRMoNhdcWQnzt/OPCNA==",
|
||||
"dev": true,
|
||||
"requires": {
|
||||
"@module-federation/runtime": "0.21.6",
|
||||
"@module-federation/webpack-bundler-runtime": "0.21.6"
|
||||
"@module-federation/runtime": "0.22.0",
|
||||
"@module-federation/webpack-bundler-runtime": "0.22.0"
|
||||
}
|
||||
},
|
||||
"@module-federation/sdk": {
|
||||
"version": "0.21.6",
|
||||
"resolved": "https://registry.npmjs.org/@module-federation/sdk/-/sdk-0.21.6.tgz",
|
||||
"integrity": "sha512-x6hARETb8iqHVhEsQBysuWpznNZViUh84qV2yE7AD+g7uIzHKiYdoWqj10posbo5XKf/147qgWDzKZoKoEP2dw==",
|
||||
"version": "0.22.0",
|
||||
"resolved": "https://registry.npmmirror.com/@module-federation/sdk/-/sdk-0.22.0.tgz",
|
||||
"integrity": "sha512-x4aFNBKn2KVQRuNVC5A7SnrSCSqyfIWmm1DvubjbO9iKFe7ith5niw8dqSFBekYBg2Fwy+eMg4sEFNVvCAdo6g==",
|
||||
"dev": true
|
||||
},
|
||||
"@module-federation/webpack-bundler-runtime": {
|
||||
"version": "0.21.6",
|
||||
"resolved": "https://registry.npmjs.org/@module-federation/webpack-bundler-runtime/-/webpack-bundler-runtime-0.21.6.tgz",
|
||||
"integrity": "sha512-7zIp3LrcWbhGuFDTUMLJ2FJvcwjlddqhWGxi/MW3ur1a+HaO8v5tF2nl+vElKmbG1DFLU/52l3PElVcWf/YcsQ==",
|
||||
"version": "0.22.0",
|
||||
"resolved": "https://registry.npmmirror.com/@module-federation/webpack-bundler-runtime/-/webpack-bundler-runtime-0.22.0.tgz",
|
||||
"integrity": "sha512-aM8gCqXu+/4wBmJtVeMeeMN5guw3chf+2i6HajKtQv7SJfxV/f4IyNQJUeUQu9HfiAZHjqtMV5Lvq/Lvh8LdyA==",
|
||||
"dev": true,
|
||||
"requires": {
|
||||
"@module-federation/runtime": "0.21.6",
|
||||
"@module-federation/sdk": "0.21.6"
|
||||
"@module-federation/runtime": "0.22.0",
|
||||
"@module-federation/sdk": "0.22.0"
|
||||
}
|
||||
},
|
||||
"@napi-rs/wasm-runtime": {
|
||||
"version": "1.0.7",
|
||||
"resolved": "https://registry.npmjs.org/@napi-rs/wasm-runtime/-/wasm-runtime-1.0.7.tgz",
|
||||
"resolved": "https://registry.npmmirror.com/@napi-rs/wasm-runtime/-/wasm-runtime-1.0.7.tgz",
|
||||
"integrity": "sha512-SeDnOO0Tk7Okiq6DbXmmBODgOAb9dp9gjlphokTUxmt8U3liIP1ZsozBahH69j/RJv+Rfs6IwUKHTgQYJ/HBAw==",
|
||||
"dev": true,
|
||||
"optional": true,
|
||||
@@ -2899,15 +2895,15 @@
|
||||
}
|
||||
},
|
||||
"@rsbuild/core": {
|
||||
"version": "1.6.15",
|
||||
"resolved": "https://registry.npmjs.org/@rsbuild/core/-/core-1.6.15.tgz",
|
||||
"integrity": "sha512-LvoOF53PL6zXgdzEhgnnP51S4FseDFH1bHrobK4EK6zZX/tN8qgf5tdlmN7h4OkMv/Qs1oUfvj0QcLWSstnnvA==",
|
||||
"version": "1.7.2",
|
||||
"resolved": "https://registry.npmmirror.com/@rsbuild/core/-/core-1.7.2.tgz",
|
||||
"integrity": "sha512-VAFO6cM+cyg2ntxNW6g3tB2Jc5J5mpLjLluvm7VtW2uceNzyUlVv41o66Yp1t1ikxd3ljtqegViXem62JqzveA==",
|
||||
"dev": true,
|
||||
"peer": true,
|
||||
"requires": {
|
||||
"@rspack/core": "1.6.8",
|
||||
"@rspack/core": "~1.7.1",
|
||||
"@rspack/lite-tapable": "~1.1.0",
|
||||
"@swc/helpers": "^0.5.17",
|
||||
"@swc/helpers": "^0.5.18",
|
||||
"core-js": "~3.47.0",
|
||||
"jiti": "^2.6.1"
|
||||
}
|
||||
@@ -2923,69 +2919,69 @@
|
||||
}
|
||||
},
|
||||
"@rspack/binding": {
|
||||
"version": "1.6.8",
|
||||
"resolved": "https://registry.npmjs.org/@rspack/binding/-/binding-1.6.8.tgz",
|
||||
"integrity": "sha512-lUeL4mbwGo+nqRKqFDCm9vH2jv9FNMVt1X8jqayWRcOCPlj/2UVMEFgqjR7Pp2vlvnTKq//31KbDBJmDZq31RQ==",
|
||||
"version": "1.7.1",
|
||||
"resolved": "https://registry.npmmirror.com/@rspack/binding/-/binding-1.7.1.tgz",
|
||||
"integrity": "sha512-qVTV1/UWpMSZktvK5A8+HolgR1Qf0nYR3Gg4Vax5x3/BcHDpwGZ0fbdFRUirGVWH/XwxZ81zoI6F2SZq7xbX+w==",
|
||||
"dev": true,
|
||||
"requires": {
|
||||
"@rspack/binding-darwin-arm64": "1.6.8",
|
||||
"@rspack/binding-darwin-x64": "1.6.8",
|
||||
"@rspack/binding-linux-arm64-gnu": "1.6.8",
|
||||
"@rspack/binding-linux-arm64-musl": "1.6.8",
|
||||
"@rspack/binding-linux-x64-gnu": "1.6.8",
|
||||
"@rspack/binding-linux-x64-musl": "1.6.8",
|
||||
"@rspack/binding-wasm32-wasi": "1.6.8",
|
||||
"@rspack/binding-win32-arm64-msvc": "1.6.8",
|
||||
"@rspack/binding-win32-ia32-msvc": "1.6.8",
|
||||
"@rspack/binding-win32-x64-msvc": "1.6.8"
|
||||
"@rspack/binding-darwin-arm64": "1.7.1",
|
||||
"@rspack/binding-darwin-x64": "1.7.1",
|
||||
"@rspack/binding-linux-arm64-gnu": "1.7.1",
|
||||
"@rspack/binding-linux-arm64-musl": "1.7.1",
|
||||
"@rspack/binding-linux-x64-gnu": "1.7.1",
|
||||
"@rspack/binding-linux-x64-musl": "1.7.1",
|
||||
"@rspack/binding-wasm32-wasi": "1.7.1",
|
||||
"@rspack/binding-win32-arm64-msvc": "1.7.1",
|
||||
"@rspack/binding-win32-ia32-msvc": "1.7.1",
|
||||
"@rspack/binding-win32-x64-msvc": "1.7.1"
|
||||
}
|
||||
},
|
||||
"@rspack/binding-darwin-arm64": {
|
||||
"version": "1.6.8",
|
||||
"resolved": "https://registry.npmjs.org/@rspack/binding-darwin-arm64/-/binding-darwin-arm64-1.6.8.tgz",
|
||||
"integrity": "sha512-e8CTQtzaeGnf+BIzR7wRMUwKfIg0jd/sxMRc1Vd0bCMHBhSN9EsGoMuJJaKeRrSmy2nwMCNWHIG+TvT1CEKg+A==",
|
||||
"version": "1.7.1",
|
||||
"resolved": "https://registry.npmmirror.com/@rspack/binding-darwin-arm64/-/binding-darwin-arm64-1.7.1.tgz",
|
||||
"integrity": "sha512-3C0w0kfCHfgOH+AP/Dx1bm/b3AR/or5CmU22Abevek0m95ndU3iT902eLcm9JNiMQnDQLBQbolfj5P591t0oPg==",
|
||||
"dev": true,
|
||||
"optional": true
|
||||
},
|
||||
"@rspack/binding-darwin-x64": {
|
||||
"version": "1.6.8",
|
||||
"resolved": "https://registry.npmjs.org/@rspack/binding-darwin-x64/-/binding-darwin-x64-1.6.8.tgz",
|
||||
"integrity": "sha512-ku1XpTEPt6Za11zhpFWhfwrTQogcgi9RJrOUVC4FESiPO9aKyd4hJ+JiPgLY0MZOqsptK6vEAgOip+uDVXrCpg==",
|
||||
"version": "1.7.1",
|
||||
"resolved": "https://registry.npmmirror.com/@rspack/binding-darwin-x64/-/binding-darwin-x64-1.7.1.tgz",
|
||||
"integrity": "sha512-HTrBpdw2gWwcpJ3c8h4JF8B1YRNvrFT+K620ycttrlu/HvI4/U770BBJ/ej36R/hdh59JvMCGe+w49FyXv6rzg==",
|
||||
"dev": true,
|
||||
"optional": true
|
||||
},
|
||||
"@rspack/binding-linux-arm64-gnu": {
|
||||
"version": "1.6.8",
|
||||
"resolved": "https://registry.npmjs.org/@rspack/binding-linux-arm64-gnu/-/binding-linux-arm64-gnu-1.6.8.tgz",
|
||||
"integrity": "sha512-fvZX6xZPvBT8qipSpvkKMX5M7yd2BSpZNCZXcefw6gA3uC7LI3gu+er0LrDXY1PtPzVuHTyDx+abwWpagV3PiQ==",
|
||||
"version": "1.7.1",
|
||||
"resolved": "https://registry.npmmirror.com/@rspack/binding-linux-arm64-gnu/-/binding-linux-arm64-gnu-1.7.1.tgz",
|
||||
"integrity": "sha512-BX9yAPCO0WBFyOzKl9bSXT/cH27nnOJp02smIQMxfv7RNfwGkJg5GgakYcuYG+9U1HEFitBSzmwS2+dxDcAxlg==",
|
||||
"dev": true,
|
||||
"optional": true
|
||||
},
|
||||
"@rspack/binding-linux-arm64-musl": {
|
||||
"version": "1.6.8",
|
||||
"resolved": "https://registry.npmjs.org/@rspack/binding-linux-arm64-musl/-/binding-linux-arm64-musl-1.6.8.tgz",
|
||||
"integrity": "sha512-++XMKcMNrt59HcFBLnRaJcn70k3X0GwkAegZBVpel8xYIAgvoXT5+L8P1ExId/yTFxqedaz8DbcxQnNmMozviw==",
|
||||
"version": "1.7.1",
|
||||
"resolved": "https://registry.npmmirror.com/@rspack/binding-linux-arm64-musl/-/binding-linux-arm64-musl-1.7.1.tgz",
|
||||
"integrity": "sha512-maBX19XyiVkxzh/NA79ALetCobc4zUyoWkWLeCGyW5xKzhPVFatJp+qCiHqHkqUZcgRo+1i5ihoZ2bXmelIeZg==",
|
||||
"dev": true,
|
||||
"optional": true
|
||||
},
|
||||
"@rspack/binding-linux-x64-gnu": {
|
||||
"version": "1.6.8",
|
||||
"resolved": "https://registry.npmjs.org/@rspack/binding-linux-x64-gnu/-/binding-linux-x64-gnu-1.6.8.tgz",
|
||||
"integrity": "sha512-tv3BWkTE1TndfX+DsE1rSTg8fBevCxujNZ3MlfZ22Wfy9x1FMXTJlWG8VIOXmaaJ1wUHzv8S7cE2YUUJ2LuiCg==",
|
||||
"version": "1.7.1",
|
||||
"resolved": "https://registry.npmmirror.com/@rspack/binding-linux-x64-gnu/-/binding-linux-x64-gnu-1.7.1.tgz",
|
||||
"integrity": "sha512-8KJAeBLiWcN7zEc9aaS7LRJPZVtZuQU8mCsn+fRhdQDSc+a9FcTN8b6Lw29z8cejwbU6Gxr/8wk5XGexMWFaZA==",
|
||||
"dev": true,
|
||||
"optional": true
|
||||
},
|
||||
"@rspack/binding-linux-x64-musl": {
|
||||
"version": "1.6.8",
|
||||
"resolved": "https://registry.npmjs.org/@rspack/binding-linux-x64-musl/-/binding-linux-x64-musl-1.6.8.tgz",
|
||||
"integrity": "sha512-DCGgZ5/in1O3FjHWqXnDsncRy+48cMhfuUAAUyl0yDj1NpsZu9pP+xfGLvGcQTiYrVl7IH9Aojf1eShP/77WGA==",
|
||||
"version": "1.7.1",
|
||||
"resolved": "https://registry.npmmirror.com/@rspack/binding-linux-x64-musl/-/binding-linux-x64-musl-1.7.1.tgz",
|
||||
"integrity": "sha512-Gn9x5vhKRELvSoZ3ZjquY8eWtCXur0OsYnZ2/ump8mofM6IDaL7Qqu3Hf4Kud31PDH0tfz0jWf9piX32HHPmgg==",
|
||||
"dev": true,
|
||||
"optional": true
|
||||
},
|
||||
"@rspack/binding-wasm32-wasi": {
|
||||
"version": "1.6.8",
|
||||
"resolved": "https://registry.npmjs.org/@rspack/binding-wasm32-wasi/-/binding-wasm32-wasi-1.6.8.tgz",
|
||||
"integrity": "sha512-VUwdhl/lI4m6o1OGCZ9JwtMjTV/yLY5VZTQdEPKb40JMTlmZ5MBlr5xk7ByaXXYHr6I+qnqEm73iMKQvg6iknw==",
|
||||
"version": "1.7.1",
|
||||
"resolved": "https://registry.npmmirror.com/@rspack/binding-wasm32-wasi/-/binding-wasm32-wasi-1.7.1.tgz",
|
||||
"integrity": "sha512-2r9M5iVchmsFkp3sz7A5YnMm2TfpkB71LK3AoaRWKMfvf5oFky0GSGISYd2TCBASO+X2Qskaq+B24Szo8zH5FA==",
|
||||
"dev": true,
|
||||
"optional": true,
|
||||
"requires": {
|
||||
@@ -2993,47 +2989,47 @@
|
||||
}
|
||||
},
|
||||
"@rspack/binding-win32-arm64-msvc": {
|
||||
"version": "1.6.8",
|
||||
"resolved": "https://registry.npmjs.org/@rspack/binding-win32-arm64-msvc/-/binding-win32-arm64-msvc-1.6.8.tgz",
|
||||
"integrity": "sha512-23YX7zlOZlub+nPGDBUzktb4D5D6ETUAluKjXEeHIZ9m7fSlEYBnGL66YE+3t1DHXGd0OqsdwlvrNGcyo6EXDQ==",
|
||||
"version": "1.7.1",
|
||||
"resolved": "https://registry.npmmirror.com/@rspack/binding-win32-arm64-msvc/-/binding-win32-arm64-msvc-1.7.1.tgz",
|
||||
"integrity": "sha512-/WIHp982yqqqAuiz2WLtf1ofo9d1lHDGZJ7flxFllb1iMgnUeSRyX6stxEi11K3Rg6pQa7FdCZGKX/engyj2bw==",
|
||||
"dev": true,
|
||||
"optional": true
|
||||
},
|
||||
"@rspack/binding-win32-ia32-msvc": {
|
||||
"version": "1.6.8",
|
||||
"resolved": "https://registry.npmjs.org/@rspack/binding-win32-ia32-msvc/-/binding-win32-ia32-msvc-1.6.8.tgz",
|
||||
"integrity": "sha512-cFgRE3APxrY4AEdooVk2LtipwNNT/9mrnjdC5lVbsIsz+SxvGbZR231bxDJEqP15+RJOaD07FO1sIjINFqXMEg==",
|
||||
"version": "1.7.1",
|
||||
"resolved": "https://registry.npmmirror.com/@rspack/binding-win32-ia32-msvc/-/binding-win32-ia32-msvc-1.7.1.tgz",
|
||||
"integrity": "sha512-Kpela29n+kDGGsss6q/3qTd6n9VW7TOQaiA7t1YLdCCl8qqcdKlz/vWjFMd2MqgcSGC/16PvChE4sgpUvryfCQ==",
|
||||
"dev": true,
|
||||
"optional": true
|
||||
},
|
||||
"@rspack/binding-win32-x64-msvc": {
|
||||
"version": "1.6.8",
|
||||
"resolved": "https://registry.npmjs.org/@rspack/binding-win32-x64-msvc/-/binding-win32-x64-msvc-1.6.8.tgz",
|
||||
"integrity": "sha512-cIuhVsZYd3o3Neo1JSAhJYw6BDvlxaBoqvgwRkG1rs0ExFmEmgYyG7ip9pFKnKNWph/tmW3rDYypmEfjs1is7g==",
|
||||
"version": "1.7.1",
|
||||
"resolved": "https://registry.npmmirror.com/@rspack/binding-win32-x64-msvc/-/binding-win32-x64-msvc-1.7.1.tgz",
|
||||
"integrity": "sha512-B/y4MWqP2Xeto1/HV0qtZNOMPSLrEVOqi2b7JSIXG/bhlf+3IAkDzEEoHs+ZikLR4C8hMaS0pVJsDGKFmGzC9A==",
|
||||
"dev": true,
|
||||
"optional": true
|
||||
},
|
||||
"@rspack/core": {
|
||||
"version": "1.6.8",
|
||||
"resolved": "https://registry.npmjs.org/@rspack/core/-/core-1.6.8.tgz",
|
||||
"integrity": "sha512-FolcIAH5FW4J2FET+qwjd1kNeFbCkd0VLuIHO0thyolEjaPSxw5qxG67DA7BZGm6PVcoiSgPLks1DL6eZ8c+fA==",
|
||||
"version": "1.7.1",
|
||||
"resolved": "https://registry.npmmirror.com/@rspack/core/-/core-1.7.1.tgz",
|
||||
"integrity": "sha512-kRxfY8RRa6nU3/viDvAIP6CRpx+0rfXFRonPL0pHBx8u6HhV7m9rLEyaN6MWsLgNIAWkleFGb7tdo4ux2ljRJQ==",
|
||||
"dev": true,
|
||||
"requires": {
|
||||
"@module-federation/runtime-tools": "0.21.6",
|
||||
"@rspack/binding": "1.6.8",
|
||||
"@module-federation/runtime-tools": "0.22.0",
|
||||
"@rspack/binding": "1.7.1",
|
||||
"@rspack/lite-tapable": "1.1.0"
|
||||
}
|
||||
},
|
||||
"@rspack/lite-tapable": {
|
||||
"version": "1.1.0",
|
||||
"resolved": "https://registry.npmjs.org/@rspack/lite-tapable/-/lite-tapable-1.1.0.tgz",
|
||||
"resolved": "https://registry.npmmirror.com/@rspack/lite-tapable/-/lite-tapable-1.1.0.tgz",
|
||||
"integrity": "sha512-E2B0JhYFmVAwdDiG14+DW0Di4Ze4Jg10Pc4/lILUrd5DRCaklduz2OvJ5HYQ6G+hd+WTzqQb3QnDNfK4yvAFYw==",
|
||||
"dev": true
|
||||
},
|
||||
"@swc/helpers": {
|
||||
"version": "0.5.17",
|
||||
"resolved": "https://registry.npmjs.org/@swc/helpers/-/helpers-0.5.17.tgz",
|
||||
"integrity": "sha512-5IKx/Y13RsYd+sauPb2x+U/xZikHjolzfuDgTAl/Tdf3Q8rslRvC19NKDLgAJQ6wsqADk10ntlv08nPFw/gO/A==",
|
||||
"version": "0.5.18",
|
||||
"resolved": "https://registry.npmmirror.com/@swc/helpers/-/helpers-0.5.18.tgz",
|
||||
"integrity": "sha512-TXTnIcNJQEKwThMMqBXsZ4VGAza6bvN4pa41Rkqoio6QBKMvo+5lexeTMScGCIxtzgQJzElcvIltani+adC5PQ==",
|
||||
"dev": true,
|
||||
"peer": true,
|
||||
"requires": {
|
||||
@@ -3042,7 +3038,7 @@
|
||||
},
|
||||
"@tybys/wasm-util": {
|
||||
"version": "0.10.1",
|
||||
"resolved": "https://registry.npmjs.org/@tybys/wasm-util/-/wasm-util-0.10.1.tgz",
|
||||
"resolved": "https://registry.npmmirror.com/@tybys/wasm-util/-/wasm-util-0.10.1.tgz",
|
||||
"integrity": "sha512-9tTaPJLSiejZKx+Bmog4uSubteqTvFrVrURwkmHixBo0G4seD0zUxp98E1DzUBJxLQ3NPwXrGKDiVjwx/DpPsg==",
|
||||
"dev": true,
|
||||
"optional": true,
|
||||
@@ -4197,7 +4193,7 @@
|
||||
},
|
||||
"tslib": {
|
||||
"version": "2.8.1",
|
||||
"resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz",
|
||||
"resolved": "https://registry.npmmirror.com/tslib/-/tslib-2.8.1.tgz",
|
||||
"integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==",
|
||||
"dev": true
|
||||
},
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
{
|
||||
"name": "code-next",
|
||||
"private": true,
|
||||
"version": "1.3.1",
|
||||
"version": "1.4.0",
|
||||
"type": "module",
|
||||
"scripts": {
|
||||
"start": "rsbuild dev",
|
||||
@@ -10,6 +10,7 @@
|
||||
"fmt": "prettier --write src"
|
||||
},
|
||||
"dependencies": {
|
||||
"@codemirror/autocomplete": "^6.20.0",
|
||||
"@codemirror/lang-cpp": "^6.0.3",
|
||||
"@codemirror/lang-python": "^6.2.1",
|
||||
"@vueuse/core": "^14.1.0",
|
||||
@@ -29,7 +30,7 @@
|
||||
},
|
||||
"devDependencies": {
|
||||
"@iconify/vue": "^5.0.0",
|
||||
"@rsbuild/core": "^1.6.15",
|
||||
"@rsbuild/core": "^1.7.2",
|
||||
"@rsbuild/plugin-vue": "^1.2.2",
|
||||
"@types/file-saver": "^2.0.7",
|
||||
"prettier": "^3.7.4",
|
||||
|
||||
73
src/api.ts
73
src/api.ts
@@ -2,15 +2,6 @@ import axios from "axios"
|
||||
import { languageToId } from "./templates"
|
||||
import { Code, Submission } from "./types"
|
||||
|
||||
// function getChromeVersion() {
|
||||
// var raw = navigator.userAgent.match(/Chrom(e|ium)\/([0-9]+)\./)
|
||||
// return raw ? parseInt(raw[2], 10) : 0
|
||||
// }
|
||||
|
||||
// const isLowVersion = getChromeVersion() < 80
|
||||
|
||||
// const protocol = isLowVersion ? "http" : "https"
|
||||
|
||||
function encode(string?: string) {
|
||||
return btoa(String.fromCharCode(...new TextEncoder().encode(string ?? "")))
|
||||
}
|
||||
@@ -27,7 +18,71 @@ function decode(bytes?: string) {
|
||||
const judge = axios.create({ baseURL: import.meta.env.PUBLIC_JUDGE0API_URL })
|
||||
const api = axios.create({ baseURL: import.meta.env.PUBLIC_CODEAPI_URL })
|
||||
|
||||
type PythonWorkerRequest = {
|
||||
id: number
|
||||
source: string
|
||||
stdin: string
|
||||
timeoutMs: number
|
||||
}
|
||||
|
||||
type PythonWorkerResponse = {
|
||||
id: number
|
||||
status: number
|
||||
output: string
|
||||
}
|
||||
|
||||
let pythonWorker: Worker | null = null
|
||||
let pythonWorkerSeq = 0
|
||||
const pythonPending = new Map<
|
||||
number,
|
||||
{ resolve: (v: { status: number; output: string }) => void; timeout: number }
|
||||
>()
|
||||
|
||||
function getPythonWorker() {
|
||||
if (pythonWorker) return pythonWorker
|
||||
pythonWorker = new Worker(
|
||||
new URL("./workers/pythonSkulpt.worker.ts", import.meta.url),
|
||||
{ type: "module" },
|
||||
)
|
||||
pythonWorker.onmessage = (event: MessageEvent<PythonWorkerResponse>) => {
|
||||
const { id, status, output } = event.data ?? ({} as any)
|
||||
const pending = pythonPending.get(id)
|
||||
if (!pending) return
|
||||
clearTimeout(pending.timeout)
|
||||
pythonPending.delete(id)
|
||||
pending.resolve({ status, output })
|
||||
}
|
||||
return pythonWorker
|
||||
}
|
||||
|
||||
function restartPythonWorker() {
|
||||
if (pythonWorker) pythonWorker.terminate()
|
||||
pythonWorker = null
|
||||
pythonPending.clear()
|
||||
}
|
||||
|
||||
async function runPythonInWorker(source: string, stdin: string) {
|
||||
const worker = getPythonWorker()
|
||||
const id = ++pythonWorkerSeq
|
||||
const timeoutMs = 5000
|
||||
|
||||
return new Promise<{ status: number; output: string }>((resolve) => {
|
||||
const timeout = window.setTimeout(() => {
|
||||
restartPythonWorker()
|
||||
resolve({ status: 11, output: "运行超时" })
|
||||
}, timeoutMs + 250)
|
||||
|
||||
pythonPending.set(id, { resolve, timeout })
|
||||
const message: PythonWorkerRequest = { id, source, stdin, timeoutMs }
|
||||
worker.postMessage(message)
|
||||
})
|
||||
}
|
||||
|
||||
export async function submit(code: Code, input: string) {
|
||||
if (code.language === "python") {
|
||||
return runPythonInWorker(code.value, input)
|
||||
}
|
||||
|
||||
const encodedCode = encode(code.value)
|
||||
|
||||
const id = languageToId[code.language]
|
||||
|
||||
@@ -3,12 +3,14 @@ import { cpp } from "@codemirror/lang-cpp"
|
||||
import { python } from "@codemirror/lang-python"
|
||||
import { EditorState } from "@codemirror/state"
|
||||
import { EditorView } from "@codemirror/view"
|
||||
import { autocompletion, completeAnyWord } from "@codemirror/autocomplete"
|
||||
import { Icon } from "@iconify/vue"
|
||||
import { useDark } from "@vueuse/core"
|
||||
import { computed, ref, watch } from "vue"
|
||||
import { Codemirror } from "vue-codemirror"
|
||||
import { oneDark } from "../themes/oneDark"
|
||||
import { smoothy } from "../themes/smoothy"
|
||||
import { enhanceCompletion } from "../extensions/autocompletion"
|
||||
import { LANGUAGE } from "../types"
|
||||
|
||||
interface Props {
|
||||
@@ -51,13 +53,20 @@ watch(
|
||||
},
|
||||
)
|
||||
|
||||
const lang = computed(() => {
|
||||
const langExtension = computed(() => {
|
||||
if (props.language === "python" || props.language === "turtle") {
|
||||
return python()
|
||||
}
|
||||
return cpp()
|
||||
})
|
||||
|
||||
const enhanceAutoCompletion = computed(() => {
|
||||
console.log(props.language)
|
||||
return autocompletion({
|
||||
override: [enhanceCompletion(props.language), completeAnyWord],
|
||||
})
|
||||
})
|
||||
|
||||
function onChange(v: string) {
|
||||
emit("update:modelValue", v)
|
||||
}
|
||||
@@ -79,7 +88,12 @@ function onReady(payload: {
|
||||
<Codemirror
|
||||
v-model="code"
|
||||
indentWithTab
|
||||
:extensions="[styleTheme, lang, isDark ? oneDark : smoothy]"
|
||||
:extensions="[
|
||||
styleTheme,
|
||||
langExtension,
|
||||
enhanceAutoCompletion,
|
||||
isDark ? oneDark : smoothy,
|
||||
]"
|
||||
:disabled="props.readonly"
|
||||
:tabSize="4"
|
||||
:placeholder="props.placeholder"
|
||||
|
||||
@@ -453,7 +453,9 @@ function autoRun() {
|
||||
|
||||
<!-- 输出部分 -->
|
||||
<n-flex v-if="currentOutput" vertical>
|
||||
<n-text strong style="margin-bottom: 8px">输出({{ outputLines }}行)</n-text>
|
||||
<n-text strong style="margin-bottom: 8px">
|
||||
输出({{ outputLines }}行)
|
||||
</n-text>
|
||||
<n-card size="small" :bordered="true">
|
||||
<n-scrollbar style="max-height: 300px">
|
||||
<n-text code class="debug-text">
|
||||
|
||||
@@ -25,7 +25,10 @@ function copy() {
|
||||
/**
|
||||
* 检查调试数据是否需要输入但用户没有提供足够的输入
|
||||
*/
|
||||
function needsInputButNotProvided(debugData: any, providedInputs: string[]): boolean {
|
||||
function needsInputButNotProvided(
|
||||
debugData: any,
|
||||
providedInputs: string[],
|
||||
): boolean {
|
||||
if (!debugData?.trace || debugData.trace.length === 0) {
|
||||
return false
|
||||
}
|
||||
@@ -35,7 +38,7 @@ function needsInputButNotProvided(debugData: any, providedInputs: string[]): boo
|
||||
if (lastStep.event === "raw_input") {
|
||||
// 统计 trace 中所有的 raw_input 事件数量(程序需要的输入数量)
|
||||
const requiredInputCount = debugData.trace.filter(
|
||||
(step: any) => step.event === "raw_input"
|
||||
(step: any) => step.event === "raw_input",
|
||||
).length
|
||||
|
||||
// 如果用户提供的输入数量不足,返回 true
|
||||
@@ -93,7 +96,7 @@ async function handleDebug() {
|
||||
:mask-closable="false"
|
||||
:auto-focus="false"
|
||||
@close="closeDebug"
|
||||
style="width: 80vw; max-width: 1000px;"
|
||||
style="width: 80vw; max-width: 1000px"
|
||||
>
|
||||
<DebugPanel :initial-debug-data="debugData" @close="closeDebug" />
|
||||
</n-modal>
|
||||
|
||||
@@ -19,6 +19,10 @@ function runSkulptTurtle() {
|
||||
const canvas = turtleCanvas.value
|
||||
if (!canvas) return
|
||||
canvas.innerHTML = ""
|
||||
// Prevent UI from being stuck forever on infinite loops (still runs on main thread).
|
||||
// Skulpt checks this limit periodically and throws a timeout error.
|
||||
;(Sk as any).execLimit = 5000
|
||||
;(Sk as any).execStart = new Date()
|
||||
Sk.configure({
|
||||
output: console.log,
|
||||
read: builtinRead,
|
||||
|
||||
74
src/extensions/autocompletion.ts
Normal file
74
src/extensions/autocompletion.ts
Normal file
@@ -0,0 +1,74 @@
|
||||
import type {
|
||||
Completion,
|
||||
CompletionContext,
|
||||
CompletionResult,
|
||||
CompletionSource,
|
||||
} from "@codemirror/autocomplete"
|
||||
import type { EditorView } from "@codemirror/view"
|
||||
import { LANGUAGE } from "../types"
|
||||
import { cpp } from "./cpp"
|
||||
import { c } from "./c"
|
||||
import { python } from "./python"
|
||||
import { turtle } from "./turtle"
|
||||
|
||||
type ChineseCompletion = Pick<
|
||||
Completion,
|
||||
"label" | "detail" | "type" | "info" | "boost" | "apply"
|
||||
> & { apply?: string | Completion["apply"] }
|
||||
|
||||
// 中文注释提示
|
||||
const chineseAnnotations: Record<string, ChineseCompletion[]> = {
|
||||
python,
|
||||
turtle,
|
||||
c,
|
||||
cpp,
|
||||
}
|
||||
|
||||
export function enhanceCompletion(language: LANGUAGE): CompletionSource {
|
||||
return async function (
|
||||
context: CompletionContext,
|
||||
): Promise<CompletionResult | null> {
|
||||
const word = context.matchBefore(/\w+/)
|
||||
if (!word) return null
|
||||
|
||||
const completions: Completion[] = (chineseAnnotations[language] || []).map(
|
||||
(completion) => {
|
||||
const insertText =
|
||||
typeof completion.apply === "string"
|
||||
? completion.apply
|
||||
: completion.label
|
||||
const cursorOffset = insertText.includes("(")
|
||||
? insertText.indexOf("(") + 1
|
||||
: insertText.length
|
||||
|
||||
if (
|
||||
(completion.type === "function" || completion.type === "method") &&
|
||||
insertText.includes(")")
|
||||
) {
|
||||
return {
|
||||
...completion,
|
||||
apply: (
|
||||
view: EditorView,
|
||||
_c: Completion,
|
||||
from: number,
|
||||
to: number,
|
||||
) => {
|
||||
view.dispatch({
|
||||
changes: { from, to, insert: insertText },
|
||||
selection: { anchor: from + cursorOffset },
|
||||
})
|
||||
},
|
||||
}
|
||||
}
|
||||
|
||||
return completion
|
||||
},
|
||||
)
|
||||
|
||||
return {
|
||||
from: word.from,
|
||||
options: completions,
|
||||
validFor: /^\w+$/,
|
||||
}
|
||||
}
|
||||
}
|
||||
257
src/extensions/c.ts
Normal file
257
src/extensions/c.ts
Normal file
@@ -0,0 +1,257 @@
|
||||
export const c = [
|
||||
{
|
||||
label: "printf",
|
||||
detail: "格式化输出",
|
||||
type: "function",
|
||||
info: "标准输出函数,按格式打印,搭配 %d/%s 等占位符",
|
||||
boost: 90,
|
||||
apply: "printf();",
|
||||
},
|
||||
{
|
||||
label: "scanf",
|
||||
detail: "格式化输入",
|
||||
type: "function",
|
||||
info: "标准输入函数,按格式读取,用 & 取地址接收变量",
|
||||
boost: 88,
|
||||
apply: "scanf();",
|
||||
},
|
||||
{
|
||||
label: "puts",
|
||||
detail: "输出字符串",
|
||||
type: "function",
|
||||
info: "输出以 \\0 结尾的字符串并自动换行,比 printf 简洁",
|
||||
boost: 84,
|
||||
apply: "puts();",
|
||||
},
|
||||
{
|
||||
label: "gets",
|
||||
detail: "读取字符串",
|
||||
type: "function",
|
||||
info: "读取一行字符串到缓冲区(不安全,建议使用 fgets)",
|
||||
boost: 60,
|
||||
apply: "gets();",
|
||||
},
|
||||
{
|
||||
label: "fgets",
|
||||
detail: "安全读行",
|
||||
type: "function",
|
||||
info: "从文件流读取一行到缓冲区,限制长度,避免溢出",
|
||||
boost: 82,
|
||||
apply: "fgets();",
|
||||
},
|
||||
{
|
||||
label: "memset",
|
||||
detail: "内存填充",
|
||||
type: "function",
|
||||
info: "按字节把内存填为指定值,常用于初始化数组或结构体",
|
||||
boost: 80,
|
||||
apply: "memset();",
|
||||
},
|
||||
{
|
||||
label: "memcpy",
|
||||
detail: "内存拷贝",
|
||||
type: "function",
|
||||
info: "从源地址复制指定字节到目标地址,避免重叠",
|
||||
boost: 78,
|
||||
apply: "memcpy();",
|
||||
},
|
||||
{
|
||||
label: "strlen",
|
||||
detail: "字符串长度",
|
||||
type: "function",
|
||||
info: "计算以 \\0 结尾的字符串长度(不含终止符)",
|
||||
boost: 76,
|
||||
apply: "strlen();",
|
||||
},
|
||||
{
|
||||
label: "strcmp",
|
||||
detail: "字符串比较",
|
||||
type: "function",
|
||||
info: "按字典序比较两个字符串,相等为 0,小于返回负数",
|
||||
boost: 74,
|
||||
apply: "strcmp();",
|
||||
},
|
||||
{
|
||||
label: "strcpy",
|
||||
detail: "字符串拷贝",
|
||||
type: "function",
|
||||
info: "把源字符串复制到目标(含终止符),目标要有足够空间",
|
||||
boost: 72,
|
||||
apply: "strcpy();",
|
||||
},
|
||||
{
|
||||
label: "int main",
|
||||
detail: "程序入口",
|
||||
type: "keyword",
|
||||
info: "C 程序入口,通常返回 0 表示正常退出",
|
||||
boost: 70,
|
||||
},
|
||||
{
|
||||
label: "for",
|
||||
detail: "循环语句",
|
||||
type: "keyword",
|
||||
info: "for (init; condition; step) 结构,用于固定次数循环",
|
||||
boost: 68,
|
||||
},
|
||||
{
|
||||
label: "while",
|
||||
detail: "条件循环",
|
||||
type: "keyword",
|
||||
info: "while (condition) 条件循环,条件真则执行",
|
||||
boost: 66,
|
||||
},
|
||||
{
|
||||
label: "if",
|
||||
detail: "条件判断",
|
||||
type: "keyword",
|
||||
info: "if (condition) 条件分支,可配 else/else if",
|
||||
boost: 64,
|
||||
},
|
||||
{
|
||||
label: "struct",
|
||||
detail: "结构体定义",
|
||||
type: "keyword",
|
||||
info: "定义结构体,可组合不同类型的成员",
|
||||
boost: 62,
|
||||
},
|
||||
{
|
||||
label: "typedef",
|
||||
detail: "类型别名",
|
||||
type: "keyword",
|
||||
info: "为已有类型起别名,提升可读性",
|
||||
boost: 60,
|
||||
},
|
||||
{
|
||||
label: "const",
|
||||
detail: "只读限定",
|
||||
type: "keyword",
|
||||
info: "声明常量或只读指针,防止被修改",
|
||||
boost: 58,
|
||||
},
|
||||
{
|
||||
label: "return",
|
||||
detail: "返回值",
|
||||
type: "keyword",
|
||||
info: "结束函数并返回值,main 返回 0 表示成功",
|
||||
boost: 56,
|
||||
},
|
||||
{
|
||||
label: "break",
|
||||
detail: "终止循环",
|
||||
type: "keyword",
|
||||
info: "立即退出最近的 for/while/do 循环体",
|
||||
boost: 54,
|
||||
},
|
||||
{
|
||||
label: "continue",
|
||||
detail: "继续下一次循环",
|
||||
type: "keyword",
|
||||
info: "跳过当前循环余下语句,开始下一轮迭代",
|
||||
boost: 52,
|
||||
},
|
||||
{
|
||||
label: "do",
|
||||
detail: "do-while 循环",
|
||||
type: "keyword",
|
||||
info: "do { ... } while(condition); 后置条件循环,至少执行一次",
|
||||
boost: 50,
|
||||
},
|
||||
{
|
||||
label: "else",
|
||||
detail: "分支兜底",
|
||||
type: "keyword",
|
||||
info: "if/else if/else 结构中的兜底分支",
|
||||
boost: 48,
|
||||
},
|
||||
{
|
||||
label: "switch",
|
||||
detail: "多分支选择",
|
||||
type: "keyword",
|
||||
info: "switch (expr) { case ... } 多分支选择结构,常配合 break",
|
||||
boost: 46,
|
||||
},
|
||||
{
|
||||
label: "case",
|
||||
detail: "分支标签",
|
||||
type: "keyword",
|
||||
info: "switch 中的具体匹配分支,常在末尾使用 break",
|
||||
boost: 44,
|
||||
},
|
||||
{
|
||||
label: "default",
|
||||
detail: "默认分支",
|
||||
type: "keyword",
|
||||
info: "switch 中未匹配任何 case 时执行的分支",
|
||||
boost: 42,
|
||||
},
|
||||
{
|
||||
label: "goto",
|
||||
detail: "无条件跳转",
|
||||
type: "keyword",
|
||||
info: "跳转到指定标签位置,需谨慎使用以避免可读性问题",
|
||||
boost: 40,
|
||||
},
|
||||
{
|
||||
label: "sizeof",
|
||||
detail: "求字节大小",
|
||||
type: "keyword",
|
||||
info: "返回类型或表达式所占字节数,编译期求值",
|
||||
boost: 38,
|
||||
},
|
||||
{
|
||||
label: "int",
|
||||
detail: "整数类型",
|
||||
type: "keyword",
|
||||
info: "声明整型变量或返回值,通常占 4 字节",
|
||||
boost: 36,
|
||||
},
|
||||
{
|
||||
label: "char",
|
||||
detail: "字符类型",
|
||||
type: "keyword",
|
||||
info: "声明字符或字节型变量,通常占 1 字节",
|
||||
boost: 34,
|
||||
},
|
||||
{
|
||||
label: "double",
|
||||
detail: "双精度类型",
|
||||
type: "keyword",
|
||||
info: "声明双精度浮点变量,通常占 8 字节",
|
||||
boost: 32,
|
||||
},
|
||||
{
|
||||
label: "float",
|
||||
detail: "单精度类型",
|
||||
type: "keyword",
|
||||
info: "声明单精度浮点变量,通常占 4 字节",
|
||||
boost: 30,
|
||||
},
|
||||
{
|
||||
label: "void",
|
||||
detail: "空类型",
|
||||
type: "keyword",
|
||||
info: "表示无返回值或无类型指针(void*)",
|
||||
boost: 28,
|
||||
},
|
||||
{
|
||||
label: "unsigned",
|
||||
detail: "无符号修饰",
|
||||
type: "keyword",
|
||||
info: "与整型/字符型组合表示无符号数,扩大正数范围",
|
||||
boost: 26,
|
||||
},
|
||||
{
|
||||
label: "long",
|
||||
detail: "长整型修饰",
|
||||
type: "keyword",
|
||||
info: "与整型组合表示更大范围(long/long long)",
|
||||
boost: 24,
|
||||
},
|
||||
{
|
||||
label: "short",
|
||||
detail: "短整型修饰",
|
||||
type: "keyword",
|
||||
info: "与整型组合表示较小范围的整数类型",
|
||||
boost: 22,
|
||||
},
|
||||
]
|
||||
87
src/extensions/cpp.ts
Normal file
87
src/extensions/cpp.ts
Normal file
@@ -0,0 +1,87 @@
|
||||
export const cpp = [
|
||||
{
|
||||
label: "#include <bits/stdc++.h>",
|
||||
detail: "常用头文件合集",
|
||||
type: "keyword",
|
||||
info: "一次性引入常见 STL 头文件,竞赛常用写法",
|
||||
boost: 95,
|
||||
},
|
||||
{
|
||||
label: "#include <iostream>",
|
||||
detail: "标准输入输出",
|
||||
type: "keyword",
|
||||
info: "引入 iostream,提供 std::cin / std::cout 等流式 IO",
|
||||
boost: 93,
|
||||
},
|
||||
{
|
||||
label: "using namespace std;",
|
||||
detail: "使用 std 命名空间",
|
||||
type: "keyword",
|
||||
info: "简化 std 前缀的引用,头文件引入后常见写法",
|
||||
boost: 91,
|
||||
},
|
||||
{
|
||||
label: "std::cout",
|
||||
detail: "标准输出流",
|
||||
type: "variable",
|
||||
info: "搭配 << 输出数据,可用 std::endl 或 '\\n' 换行",
|
||||
boost: 90,
|
||||
apply: "std::cout << << std::endl;",
|
||||
},
|
||||
{
|
||||
label: "std::cin",
|
||||
detail: "标准输入流",
|
||||
type: "variable",
|
||||
info: "搭配 >> 读取输入,常与 std::cout 配合提示",
|
||||
boost: 88,
|
||||
apply: "std::cin >> ;",
|
||||
},
|
||||
{
|
||||
label: "std::vector",
|
||||
detail: "动态数组",
|
||||
type: "class",
|
||||
info: "可变长顺序容器,支持 push_back / size / iter 访问",
|
||||
boost: 86,
|
||||
apply: "std::vector<int> v;",
|
||||
},
|
||||
{
|
||||
label: "std::string",
|
||||
detail: "字符串类",
|
||||
type: "class",
|
||||
info: "可变长字符串,支持拼接、substr、find 等操作",
|
||||
boost: 84,
|
||||
apply: "std::string s;",
|
||||
},
|
||||
{
|
||||
label: "std::sort",
|
||||
detail: "排序算法",
|
||||
type: "function",
|
||||
info: "std::sort(begin, end, cmp):对区间排序,可自定义比较器",
|
||||
boost: 82,
|
||||
apply: "std::sort();",
|
||||
},
|
||||
{
|
||||
label: "std::pair",
|
||||
detail: "二元组",
|
||||
type: "class",
|
||||
info: "存储两个元素的容器,可通过 first/second 访问",
|
||||
boost: 80,
|
||||
apply: "std::pair<int, int> p;",
|
||||
},
|
||||
{
|
||||
label: "for(auto &x : container)",
|
||||
detail: "范围 for 循环",
|
||||
type: "keyword",
|
||||
info: "现代 C++ 遍历容器写法,可用 const auto& 避免拷贝",
|
||||
boost: 78,
|
||||
apply: "for (auto &x : ) {\n \n}",
|
||||
},
|
||||
{
|
||||
label: "int main",
|
||||
detail: "程序入口",
|
||||
type: "keyword",
|
||||
info: "C++ 程序主函数模板,返回 0 表示正常退出",
|
||||
boost: 76,
|
||||
apply: "int main() {\n \n return 0;\n}",
|
||||
},
|
||||
]
|
||||
608
src/extensions/python.ts
Normal file
608
src/extensions/python.ts
Normal file
@@ -0,0 +1,608 @@
|
||||
export const python = [
|
||||
{
|
||||
label: "print",
|
||||
detail: "打印输出",
|
||||
type: "function",
|
||||
info: "最常用的输出函数,把内容打印到屏幕;sep 控制分隔符,end 控制行尾。",
|
||||
boost: 100,
|
||||
apply: "print()",
|
||||
},
|
||||
{
|
||||
label: "input",
|
||||
detail: "读取输入",
|
||||
type: "function",
|
||||
info: "读取一行输入并返回字符串,可以传入提示文字。",
|
||||
boost: 99,
|
||||
apply: "input()",
|
||||
},
|
||||
{
|
||||
label: "len",
|
||||
detail: "获取长度",
|
||||
type: "function",
|
||||
info: "返回序列或集合的长度,常用来统计列表、字符串中有多少个元素。",
|
||||
boost: 90,
|
||||
apply: "len()",
|
||||
},
|
||||
{
|
||||
label: "range",
|
||||
detail: "生成整数序列",
|
||||
type: "function",
|
||||
info: "生成整数序列,支持起点、终点和步长,常配合 for 循环遍历次数。",
|
||||
boost: 85,
|
||||
apply: "range()",
|
||||
},
|
||||
{
|
||||
label: "enumerate",
|
||||
detail: "枚举索引与值",
|
||||
type: "function",
|
||||
info: "遍历时同时得到索引和值,可用 start 指定起始编号,适合需要编号输出的场景。",
|
||||
boost: 82,
|
||||
apply: "enumerate()",
|
||||
},
|
||||
{
|
||||
label: "zip",
|
||||
detail: "并行遍历",
|
||||
type: "function",
|
||||
info: "把多个可迭代对象按位置打包成元组并行遍历,长度取最短的序列。",
|
||||
boost: 80,
|
||||
apply: "zip()",
|
||||
},
|
||||
{
|
||||
label: "map",
|
||||
detail: "映射函数",
|
||||
type: "function",
|
||||
info: "把函数作用到序列每个元素,返回惰性迭代器,需要 list() 展开后才能看到结果。",
|
||||
boost: 78,
|
||||
apply: "map()",
|
||||
},
|
||||
{
|
||||
label: "filter",
|
||||
detail: "过滤元素",
|
||||
type: "function",
|
||||
info: "保留函数返回真值的元素,返回惰性迭代器,常用于筛选出符合条件的数据。",
|
||||
boost: 76,
|
||||
apply: "filter()",
|
||||
},
|
||||
{
|
||||
label: "sorted",
|
||||
detail: "排序",
|
||||
type: "function",
|
||||
info: "返回排好序的新列表,支持 key 排序函数和 reverse 逆序,不会修改原序列。",
|
||||
boost: 74,
|
||||
apply: "sorted()",
|
||||
},
|
||||
{
|
||||
label: "sum",
|
||||
detail: "求和",
|
||||
type: "function",
|
||||
info: "对可迭代对象求和,可设置初始值,常用于数字累计与前缀和。",
|
||||
boost: 72,
|
||||
apply: "sum()",
|
||||
},
|
||||
{
|
||||
label: "open",
|
||||
detail: "文件读写",
|
||||
type: "function",
|
||||
info: "打开文件获得文件对象,常配合 with 自动关闭,支持读写追加等多种模式。",
|
||||
boost: 70,
|
||||
apply: "open()",
|
||||
},
|
||||
{
|
||||
label: "abs",
|
||||
detail: "绝对值",
|
||||
type: "function",
|
||||
info: "返回数字的绝对值,把负数变成正数,常用于距离或差值计算。",
|
||||
boost: 68,
|
||||
apply: "abs()",
|
||||
},
|
||||
{
|
||||
label: "round",
|
||||
detail: "四舍五入",
|
||||
type: "function",
|
||||
info: "按指定小数位四舍五入,默认保留到整数,适合处理成绩或金额保留位数。",
|
||||
boost: 66,
|
||||
apply: "round()",
|
||||
},
|
||||
{
|
||||
label: "isinstance",
|
||||
detail: "类型检查",
|
||||
type: "function",
|
||||
info: "判断对象是否属于某个类型或类型元组,常用于分支处理不同数据。",
|
||||
boost: 64,
|
||||
apply: "isinstance()",
|
||||
},
|
||||
{
|
||||
label: "type",
|
||||
detail: "获取类型",
|
||||
type: "function",
|
||||
info: "返回对象的类型,或用三个参数动态创建类型,用来了解变量真实类型。",
|
||||
boost: 62,
|
||||
apply: "type()",
|
||||
},
|
||||
{
|
||||
label: "list",
|
||||
detail: "列表构造",
|
||||
type: "function",
|
||||
info: "把可迭代对象转换为列表,或创建空列表存放数据,支持列表推导式。",
|
||||
boost: 60,
|
||||
apply: "list()",
|
||||
},
|
||||
{
|
||||
label: "dict",
|
||||
detail: "字典构造",
|
||||
type: "function",
|
||||
info: "根据映射或键值对序列创建字典,用来存储键值对信息。",
|
||||
boost: 58,
|
||||
apply: "dict()",
|
||||
},
|
||||
{
|
||||
label: "set",
|
||||
detail: "集合构造",
|
||||
type: "function",
|
||||
info: "把可迭代对象转换为集合,自动去重,适合判重和集合运算。",
|
||||
boost: 56,
|
||||
apply: "set()",
|
||||
},
|
||||
{
|
||||
label: "tuple",
|
||||
detail: "元组构造",
|
||||
type: "function",
|
||||
info: "把可迭代对象转换为元组,或创建不可变的序列,用作安全的组合数据。",
|
||||
boost: 54,
|
||||
apply: "tuple()",
|
||||
},
|
||||
{
|
||||
label: "int",
|
||||
detail: "转整数",
|
||||
type: "function",
|
||||
info: "把参数转为整数,支持进制转换,如 int('101', 2) 表示二进制转十进制。",
|
||||
boost: 74,
|
||||
apply: "int()",
|
||||
},
|
||||
{
|
||||
label: "float",
|
||||
detail: "转浮点数",
|
||||
type: "function",
|
||||
info: "把参数转为浮点数,接受字符串或数字,常用于保留小数的计算。",
|
||||
boost: 72,
|
||||
apply: "float()",
|
||||
},
|
||||
{
|
||||
label: "str",
|
||||
detail: "转字符串",
|
||||
type: "function",
|
||||
info: "把对象转为字符串,常用于输出、拼接或写入文件。",
|
||||
boost: 70,
|
||||
apply: "str()",
|
||||
},
|
||||
{
|
||||
label: "bool",
|
||||
detail: "转布尔值",
|
||||
type: "function",
|
||||
info: "按真值规则转为 True/False,空对象一般为 False,常用于条件判断。",
|
||||
boost: 68,
|
||||
apply: "bool()",
|
||||
},
|
||||
{
|
||||
label: "def",
|
||||
detail: "定义函数",
|
||||
type: "keyword",
|
||||
info: "定义函数,可写位置参数、关键字参数和默认值,是封装和复用代码的基础。",
|
||||
boost: 52,
|
||||
},
|
||||
{
|
||||
label: "class",
|
||||
detail: "定义类",
|
||||
type: "keyword",
|
||||
info: "定义类,支持继承和魔术方法,用来创建自定义数据类型。",
|
||||
boost: 50,
|
||||
},
|
||||
{
|
||||
label: "with",
|
||||
detail: "上下文管理",
|
||||
type: "keyword",
|
||||
info: "进入上下文管理器,自动处理进入与退出,常用于文件、锁等需要收尾的资源。",
|
||||
boost: 48,
|
||||
},
|
||||
{
|
||||
label: "try",
|
||||
detail: "异常捕获",
|
||||
type: "keyword",
|
||||
info: "开始异常处理代码块,后面接 except/finally/else,防止程序因错误直接退出。",
|
||||
boost: 46,
|
||||
},
|
||||
{
|
||||
label: "except",
|
||||
detail: "处理异常",
|
||||
type: "keyword",
|
||||
info: "捕获并处理指定异常,与 try 连用,让程序能优雅处理输入或运行时错误。",
|
||||
boost: 44,
|
||||
},
|
||||
{
|
||||
label: "finally",
|
||||
detail: "收尾",
|
||||
type: "keyword",
|
||||
info: "无论是否出现异常都会执行的收尾代码块,常用于关闭文件或释放资源。",
|
||||
boost: 42,
|
||||
},
|
||||
{
|
||||
label: "import",
|
||||
detail: "导入模块",
|
||||
type: "keyword",
|
||||
info: "导入模块或包中的名称,可用 as 取别名,便于使用标准库或第三方库。",
|
||||
boost: 40,
|
||||
},
|
||||
{
|
||||
label: "from",
|
||||
detail: "按需导入",
|
||||
type: "keyword",
|
||||
info: "从模块中按名称导入对象,可与 import/as 组合,减少书写模块前缀。",
|
||||
boost: 38,
|
||||
},
|
||||
{
|
||||
label: "return",
|
||||
detail: "返回值",
|
||||
type: "keyword",
|
||||
info: "结束函数并返回一个值,不写时默认返回 None。",
|
||||
boost: 36,
|
||||
},
|
||||
{
|
||||
label: "for",
|
||||
detail: "for 循环",
|
||||
type: "keyword",
|
||||
info: "逐项遍历,可以配合 range 使用。",
|
||||
boost: 45,
|
||||
},
|
||||
{
|
||||
label: "while",
|
||||
detail: "while 循环",
|
||||
type: "keyword",
|
||||
info: "条件循环,条件为真时执行,支持 break/continue 和 else 分支。",
|
||||
boost: 43,
|
||||
},
|
||||
{
|
||||
label: "if",
|
||||
detail: "条件分支",
|
||||
type: "keyword",
|
||||
info: "if 判断,条件成立执行对应语句,可与 elif/else 组成多分支。",
|
||||
boost: 41,
|
||||
apply: "if ",
|
||||
},
|
||||
{
|
||||
label: "elif",
|
||||
detail: "多分支判断",
|
||||
type: "keyword",
|
||||
info: "否则如果,用来依次判断多个条件,让逻辑更清晰。",
|
||||
boost: 39,
|
||||
apply: "elif ",
|
||||
},
|
||||
{
|
||||
label: "else",
|
||||
detail: "否则",
|
||||
type: "keyword",
|
||||
info: "否则,在前面条件不满足或循环未提前退出时执行。",
|
||||
boost: 37,
|
||||
apply: "else:",
|
||||
},
|
||||
{
|
||||
label: "break",
|
||||
detail: "退出循环",
|
||||
type: "keyword",
|
||||
info: "立即终止最近的循环(for 或 while),跳出当前循环体。",
|
||||
boost: 35,
|
||||
},
|
||||
{
|
||||
label: "continue",
|
||||
detail: "跳过本次",
|
||||
type: "keyword",
|
||||
info: "结束本轮循环迭代,直接开始下一轮条件判断。",
|
||||
boost: 33,
|
||||
},
|
||||
{
|
||||
label: "pass",
|
||||
detail: "空操作占位",
|
||||
type: "keyword",
|
||||
info: "占位语句,不执行任何操作,常用于占位或编写空的函数/类体。",
|
||||
boost: 31,
|
||||
},
|
||||
{
|
||||
label: "lambda",
|
||||
detail: "匿名函数",
|
||||
type: "keyword",
|
||||
info: "定义轻量级匿名函数,语法 lambda 参数: 表达式,返回表达式结果,适合简短逻辑。",
|
||||
boost: 29,
|
||||
},
|
||||
{
|
||||
label: "yield",
|
||||
detail: "生成器产出",
|
||||
type: "keyword",
|
||||
info: "在函数中产出一个值并暂停状态,把函数变成生成器,可配合 yield from 继续产出。",
|
||||
boost: 27,
|
||||
},
|
||||
{
|
||||
label: "global",
|
||||
detail: "声明全局变量",
|
||||
type: "keyword",
|
||||
info: "在函数内部声明写入模块级变量的权限,用于修改外层的全局变量。",
|
||||
boost: 25,
|
||||
},
|
||||
{
|
||||
label: "nonlocal",
|
||||
detail: "声明外层变量",
|
||||
type: "keyword",
|
||||
info: "在嵌套函数中声明使用最近外层作用域的变量,便于修改闭包变量。",
|
||||
boost: 23,
|
||||
},
|
||||
{
|
||||
label: "True",
|
||||
detail: "布尔真",
|
||||
type: "keyword",
|
||||
info: "布尔常量 True,与 False/None 一起常用于条件表达式和逻辑判断。",
|
||||
boost: 21,
|
||||
},
|
||||
{
|
||||
label: "False",
|
||||
detail: "布尔假",
|
||||
type: "keyword",
|
||||
info: "布尔常量 False,在逻辑判断中表示假值,常作为条件的否定结果。",
|
||||
boost: 19,
|
||||
},
|
||||
{
|
||||
label: "None",
|
||||
detail: "空值对象",
|
||||
type: "keyword",
|
||||
info: "表示空值或缺失值的单例对象,常用于默认参数或占位。",
|
||||
boost: 17,
|
||||
},
|
||||
{
|
||||
label: "and",
|
||||
detail: "逻辑与",
|
||||
type: "keyword",
|
||||
info: "逻辑与运算符,短路求值,返回最后被求值的操作数,常用于多条件同时成立。",
|
||||
boost: 15,
|
||||
},
|
||||
{
|
||||
label: "or",
|
||||
detail: "逻辑或",
|
||||
type: "keyword",
|
||||
info: "逻辑或运算符,短路求值,返回第一个真值或最后一个操作数,常用于设默认值。",
|
||||
boost: 14,
|
||||
},
|
||||
{
|
||||
label: "not",
|
||||
detail: "逻辑非",
|
||||
type: "keyword",
|
||||
info: "逻辑非运算符,返回布尔取反结果,把真变假、假变真。",
|
||||
boost: 13,
|
||||
},
|
||||
{
|
||||
label: "in",
|
||||
detail: "成员测试",
|
||||
type: "keyword",
|
||||
info: "判断元素是否在序列、集合或字典中,返回布尔结果,常用于查找。",
|
||||
boost: 12,
|
||||
},
|
||||
{
|
||||
label: "is",
|
||||
detail: "身份比较",
|
||||
type: "keyword",
|
||||
info: "比较两个对象是否是同一个对象,常用于和 None 比较以避免误判。",
|
||||
boost: 11,
|
||||
},
|
||||
{
|
||||
label: "append",
|
||||
detail: "列表追加",
|
||||
type: "method",
|
||||
info: "在列表尾部添加一个新元素,等价于 list.append(value)。",
|
||||
boost: 48,
|
||||
apply: "append()",
|
||||
},
|
||||
{
|
||||
label: "insert",
|
||||
detail: "列表插入",
|
||||
type: "method",
|
||||
info: "在指定位置插入元素,语法 list.insert(index, value)。",
|
||||
boost: 46,
|
||||
apply: "insert()",
|
||||
},
|
||||
{
|
||||
label: "remove",
|
||||
detail: "删除匹配值",
|
||||
type: "method",
|
||||
info: "删除列表中第一次出现的指定值,不存在会抛出异常 ValueError。",
|
||||
boost: 44,
|
||||
apply: "remove()",
|
||||
},
|
||||
{
|
||||
label: "pop",
|
||||
detail: "弹出元素",
|
||||
type: "method",
|
||||
info: "移除并返回列表指定位置(默认尾部)的元素,用于栈或队列操作。",
|
||||
boost: 42,
|
||||
apply: "pop()",
|
||||
},
|
||||
{
|
||||
label: "count",
|
||||
detail: "统计次数",
|
||||
type: "method",
|
||||
info: "返回某个对象在列表中出现的次数,常用于频次统计。",
|
||||
boost: 40,
|
||||
apply: "count()",
|
||||
},
|
||||
{
|
||||
label: "reverse",
|
||||
detail: "反转列表",
|
||||
type: "method",
|
||||
info: "原地反转列表中元素的顺序,常与切片 [::-1] 效果类似。",
|
||||
boost: 38,
|
||||
apply: "reverse()",
|
||||
},
|
||||
{
|
||||
label: "sort",
|
||||
detail: "列表排序",
|
||||
type: "method",
|
||||
info: "对列表进行原地排序,可指定 key 排序函数和 reverse 是否倒序。",
|
||||
boost: 36,
|
||||
apply: "sort()",
|
||||
},
|
||||
{
|
||||
label: "add",
|
||||
detail: "集合添加",
|
||||
type: "method",
|
||||
info: "向集合添加单个元素,若元素已存在则忽略,保持集合去重特性。",
|
||||
boost: 50,
|
||||
apply: "add()",
|
||||
},
|
||||
{
|
||||
label: "clear",
|
||||
detail: "清空集合",
|
||||
type: "method",
|
||||
info: "移除集合中所有元素,变成一个空集合。",
|
||||
boost: 48,
|
||||
apply: "clear()",
|
||||
},
|
||||
{
|
||||
label: "keys",
|
||||
detail: "字典键",
|
||||
type: "method",
|
||||
info: "返回字典键的可迭代视图,用于遍历所有键。",
|
||||
boost: 42,
|
||||
apply: "keys()",
|
||||
},
|
||||
{
|
||||
label: "values",
|
||||
detail: "字典值",
|
||||
type: "method",
|
||||
info: "返回字典值的可迭代视图,用于遍历所有值。",
|
||||
boost: 40,
|
||||
apply: "values()",
|
||||
},
|
||||
{
|
||||
label: "split",
|
||||
detail: "字符串切分",
|
||||
type: "method",
|
||||
info: "按分隔符切分字符串,返回列表,默认按空白字符分割。",
|
||||
boost: 52,
|
||||
apply: "split()",
|
||||
},
|
||||
{
|
||||
label: "replace",
|
||||
detail: "字符串替换",
|
||||
type: "method",
|
||||
info: "把字符串中的子串替换为新内容,可限制替换次数。",
|
||||
boost: 50,
|
||||
apply: "replace()",
|
||||
},
|
||||
{
|
||||
label: "format",
|
||||
detail: "格式化字符串",
|
||||
type: "method",
|
||||
info: "使用占位符或命名参数进行字符串格式化,便于拼接变量输出。",
|
||||
boost: 48,
|
||||
apply: "format()",
|
||||
},
|
||||
{
|
||||
label: "strip",
|
||||
detail: "去首尾字符",
|
||||
type: "method",
|
||||
info: "移除字符串首尾指定字符,默认移除空白符,常用于清理输入。",
|
||||
boost: 46,
|
||||
apply: "strip()",
|
||||
},
|
||||
{
|
||||
label: "lower",
|
||||
detail: "转小写",
|
||||
type: "method",
|
||||
info: "把字符串中的字母转换为小写形式,常用于不区分大小写比较。",
|
||||
boost: 44,
|
||||
apply: "lower()",
|
||||
},
|
||||
{
|
||||
label: "upper",
|
||||
detail: "转大写",
|
||||
type: "method",
|
||||
info: "把字符串中的字母转换为大写形式。",
|
||||
boost: 42,
|
||||
apply: "upper()",
|
||||
},
|
||||
{
|
||||
label: "swapcase",
|
||||
detail: "大小写互换",
|
||||
type: "method",
|
||||
info: "把字符串中的大小写字母互换,便于切换展示风格。",
|
||||
boost: 40,
|
||||
apply: "swapcase()",
|
||||
},
|
||||
{
|
||||
label: "find",
|
||||
detail: "查找子串位置",
|
||||
type: "method",
|
||||
info: "返回子串首次出现的索引,未找到返回 -1,适合安全查找。",
|
||||
boost: 38,
|
||||
apply: "find()",
|
||||
},
|
||||
{
|
||||
label: "index",
|
||||
detail: "查找子串索引",
|
||||
type: "method",
|
||||
info: "返回子串首次出现的索引,未找到会抛出异常 ValueError。",
|
||||
boost: 36,
|
||||
apply: "index()",
|
||||
},
|
||||
{
|
||||
label: "startswith",
|
||||
detail: "前缀判断",
|
||||
type: "method",
|
||||
info: "判断字符串是否以指定前缀开头,可指定检查的范围切片。",
|
||||
boost: 34,
|
||||
apply: "startswith()",
|
||||
},
|
||||
{
|
||||
label: "endswith",
|
||||
detail: "后缀判断",
|
||||
type: "method",
|
||||
info: "判断字符串是否以指定后缀结尾,可指定范围,常用于文件名处理。",
|
||||
boost: 32,
|
||||
apply: "endswith()",
|
||||
},
|
||||
{
|
||||
label: "isalnum",
|
||||
detail: "是否字母数字",
|
||||
type: "method",
|
||||
info: "检测字符串是否只由字母和数字组成,常用于基础输入校验。",
|
||||
boost: 30,
|
||||
apply: "isalnum()",
|
||||
},
|
||||
{
|
||||
label: "isalpha",
|
||||
detail: "是否字母",
|
||||
type: "method",
|
||||
info: "检测字符串是否只由字母组成,用来判断名字等只含字母的场景。",
|
||||
boost: 28,
|
||||
apply: "isalpha()",
|
||||
},
|
||||
{
|
||||
label: "isdigit",
|
||||
detail: "是否数字",
|
||||
type: "method",
|
||||
info: "检测字符串是否只由数字组成,用来判断输入是否为纯数字。",
|
||||
boost: 26,
|
||||
apply: "isdigit()",
|
||||
},
|
||||
{
|
||||
label: "islower",
|
||||
detail: "是否全小写",
|
||||
type: "method",
|
||||
info: "检测字符串是否全部由小写字母组成且至少有一个字母。",
|
||||
boost: 24,
|
||||
apply: "islower()",
|
||||
},
|
||||
{
|
||||
label: "isupper",
|
||||
detail: "是否全大写",
|
||||
type: "method",
|
||||
info: "检测字符串中所有字母是否都是大写且至少有一个字母。",
|
||||
boost: 22,
|
||||
apply: "isupper()",
|
||||
},
|
||||
]
|
||||
194
src/extensions/turtle.ts
Normal file
194
src/extensions/turtle.ts
Normal file
@@ -0,0 +1,194 @@
|
||||
export const turtle = [
|
||||
{
|
||||
label: "forward",
|
||||
detail: "向前移动",
|
||||
type: "function",
|
||||
info: "让海龟沿当前朝向向前移动指定距离",
|
||||
boost: 90,
|
||||
apply: "forward()",
|
||||
},
|
||||
{
|
||||
label: "backward",
|
||||
detail: "向后移动",
|
||||
type: "function",
|
||||
info: "让海龟沿当前朝向向后移动指定距离",
|
||||
boost: 88,
|
||||
apply: "backward()",
|
||||
},
|
||||
{
|
||||
label: "left",
|
||||
detail: "左转",
|
||||
type: "function",
|
||||
info: "让海龟左转指定角度(度数)",
|
||||
boost: 86,
|
||||
apply: "left()",
|
||||
},
|
||||
{
|
||||
label: "right",
|
||||
detail: "右转",
|
||||
type: "function",
|
||||
info: "让海龟右转指定角度(度数)",
|
||||
boost: 84,
|
||||
apply: "right()",
|
||||
},
|
||||
{
|
||||
label: "penup",
|
||||
detail: "抬笔",
|
||||
type: "function",
|
||||
info: "抬起画笔移动,不留下轨迹(也叫 up)",
|
||||
boost: 82,
|
||||
apply: "penup()",
|
||||
},
|
||||
{
|
||||
label: "pendown",
|
||||
detail: "落笔",
|
||||
type: "function",
|
||||
info: "放下画笔继续绘制轨迹(也叫 down)",
|
||||
boost: 80,
|
||||
apply: "pendown()",
|
||||
},
|
||||
{
|
||||
label: "goto",
|
||||
detail: "移动到坐标",
|
||||
type: "function",
|
||||
info: "移动到指定坐标,若画笔放下则绘制路径",
|
||||
boost: 78,
|
||||
apply: "goto()",
|
||||
},
|
||||
{
|
||||
label: "circle",
|
||||
detail: "画圆/弧",
|
||||
type: "function",
|
||||
info: "以当前位置为起点绘制圆或弧",
|
||||
boost: 76,
|
||||
apply: "circle()",
|
||||
},
|
||||
{
|
||||
label: "begin_fill",
|
||||
detail: "开始填充",
|
||||
type: "function",
|
||||
info: "开启填充模式,绘制封闭图形后与 end_fill 配合使用",
|
||||
boost: 74,
|
||||
apply: "begin_fill()",
|
||||
},
|
||||
{
|
||||
label: "end_fill",
|
||||
detail: "结束填充",
|
||||
type: "function",
|
||||
info: "结束填充模式,自动填充自 begin_fill 以来的闭合轨迹",
|
||||
boost: 72,
|
||||
apply: "end_fill()",
|
||||
},
|
||||
{
|
||||
label: "color",
|
||||
detail: "设置颜色",
|
||||
type: "function",
|
||||
info: "设置画笔与填充颜色,可单独或同时指定",
|
||||
boost: 70,
|
||||
apply: "color()",
|
||||
},
|
||||
{
|
||||
label: "speed",
|
||||
detail: "设置速度",
|
||||
type: "function",
|
||||
info: "设置绘制速度,1 最慢,10 最快",
|
||||
boost: 68,
|
||||
apply: "speed()",
|
||||
},
|
||||
{
|
||||
label: "setheading",
|
||||
detail: "设置朝向",
|
||||
type: "function",
|
||||
info: "将海龟朝向设置为绝对角度,0 度向东,90 度向北",
|
||||
boost: 66,
|
||||
apply: "setheading()",
|
||||
},
|
||||
{
|
||||
label: "home",
|
||||
detail: "回到原点",
|
||||
type: "function",
|
||||
info: "将海龟移动回原点并面向东,保持画笔状态",
|
||||
boost: 64,
|
||||
apply: "home()",
|
||||
},
|
||||
{
|
||||
label: "clear",
|
||||
detail: "清空画布",
|
||||
type: "function",
|
||||
info: "清除轨迹但不移动海龟位置与状态",
|
||||
boost: 62,
|
||||
apply: "clear()",
|
||||
},
|
||||
{
|
||||
label: "reset",
|
||||
detail: "重置画布",
|
||||
type: "function",
|
||||
info: "重置画布并将海龟回到初始位置与方向",
|
||||
boost: 60,
|
||||
apply: "reset()",
|
||||
},
|
||||
{
|
||||
label: "hideturtle",
|
||||
detail: "隐藏海龟",
|
||||
type: "function",
|
||||
info: "隐藏光标形状,仅绘制轨迹",
|
||||
boost: 58,
|
||||
apply: "hideturtle()",
|
||||
},
|
||||
{
|
||||
label: "showturtle",
|
||||
detail: "显示海龟",
|
||||
type: "function",
|
||||
info: "显示光标形状,恢复可见",
|
||||
boost: 56,
|
||||
apply: "showturtle()",
|
||||
},
|
||||
{
|
||||
label: "write",
|
||||
detail: "写文本",
|
||||
type: "function",
|
||||
info: "在当前位置写入文本,可指定对齐和字体",
|
||||
boost: 54,
|
||||
apply: "write()",
|
||||
},
|
||||
{
|
||||
label: "dot",
|
||||
detail: "画点",
|
||||
type: "function",
|
||||
info: "绘制一个指定直径与颜色的圆点",
|
||||
boost: 52,
|
||||
apply: "dot()",
|
||||
},
|
||||
{
|
||||
label: "pensize",
|
||||
detail: "设置笔粗",
|
||||
type: "function",
|
||||
info: "设置或获取画笔粗细",
|
||||
boost: 50,
|
||||
apply: "pensize()",
|
||||
},
|
||||
{
|
||||
label: "pencolor",
|
||||
detail: "设置笔色",
|
||||
type: "function",
|
||||
info: "设置或获取画笔颜色",
|
||||
boost: 48,
|
||||
apply: "pencolor()",
|
||||
},
|
||||
{
|
||||
label: "fillcolor",
|
||||
detail: "设置填充色",
|
||||
type: "function",
|
||||
info: "设置或获取填充颜色",
|
||||
boost: 46,
|
||||
apply: "fillcolor()",
|
||||
},
|
||||
{
|
||||
label: "bgcolor",
|
||||
detail: "设置背景色",
|
||||
type: "function",
|
||||
info: "设置画布背景颜色",
|
||||
boost: 44,
|
||||
apply: "bgcolor()",
|
||||
},
|
||||
]
|
||||
122
src/workers/pythonSkulpt.worker.ts
Normal file
122
src/workers/pythonSkulpt.worker.ts
Normal file
@@ -0,0 +1,122 @@
|
||||
/// <reference lib="webworker" />
|
||||
|
||||
// @ts-ignore
|
||||
import * as Sk from "skulpt"
|
||||
|
||||
type RunRequest = {
|
||||
id: number
|
||||
source: string
|
||||
stdin: string
|
||||
timeoutMs: number
|
||||
}
|
||||
|
||||
type RunResponse = {
|
||||
id: number
|
||||
status: number
|
||||
output: string
|
||||
}
|
||||
|
||||
const exceptionNameToCn: Record<string, string> = {
|
||||
SyntaxError: "格式错误",
|
||||
IndentationError: "格式错误",
|
||||
TabError: "格式错误",
|
||||
NameError: "变量命名错误",
|
||||
TypeError: "类型错误",
|
||||
ValueError: "值错误",
|
||||
IndexError: "索引错误",
|
||||
KeyError: "键错误",
|
||||
ZeroDivisionError: "除零错误",
|
||||
AttributeError: "属性错误",
|
||||
ImportError: "导入错误",
|
||||
ModuleNotFoundError: "模块未找到",
|
||||
RuntimeError: "运行错误",
|
||||
}
|
||||
|
||||
function translateSkulptError(
|
||||
name: string,
|
||||
message: string,
|
||||
isCompileError: boolean,
|
||||
) {
|
||||
if (isCompileError) return "代码格式错误"
|
||||
if (/exceeded run time limit/i.test(message)) return "运行超时"
|
||||
|
||||
const cnName = exceptionNameToCn[name] ?? ""
|
||||
const translatedMessage = String(message ?? "")
|
||||
.replace(/No module named ([^\s]+)/gi, "没有名为 $1 的模块")
|
||||
.replace(/integer division or modulo by zero/gi, "不能除以零")
|
||||
.replace(/name '([^']+)' is not defined/gi, "变量 $1 未定义")
|
||||
.replace(/list index out of range/gi, "列表下标越界")
|
||||
.replace(/index out of range/gi, "索引越界")
|
||||
.trim()
|
||||
|
||||
if (cnName)
|
||||
return translatedMessage ? `${cnName}:${translatedMessage}` : cnName
|
||||
return translatedMessage || "运行错误"
|
||||
}
|
||||
|
||||
function skulptRead(path: string) {
|
||||
const builtinFiles = (Sk as any).builtinFiles
|
||||
const files = builtinFiles?.files ?? builtinFiles?.["files"]
|
||||
if (!files) throw new Error("skulpt-stdlib.js has not been loaded")
|
||||
if (files[path] === undefined) throw new Error(`File not found: '${path}'`)
|
||||
return files[path]
|
||||
}
|
||||
|
||||
async function runPythonWithSkulpt(
|
||||
source: string,
|
||||
stdin: string,
|
||||
timeoutMs: number,
|
||||
) {
|
||||
const stdout: string[] = []
|
||||
const inputLines = (stdin ?? "").split("\n")
|
||||
let inputIndex = 0
|
||||
const normalizedSource = String(source ?? "").replace(/\r\n/g, "\n")
|
||||
|
||||
;(Sk as any).configure({
|
||||
output: (text: string) => stdout.push(String(text)),
|
||||
read: skulptRead,
|
||||
inputfun: () => String(inputLines[inputIndex++] ?? ""),
|
||||
inputfunTakesPrompt: true,
|
||||
__future__: (Sk as any).python3,
|
||||
})
|
||||
;(Sk as any).execLimit = Math.max(1, Number(timeoutMs) || 1)
|
||||
;(Sk as any).execStart = new Date()
|
||||
|
||||
try {
|
||||
await (Sk as any).misceval.asyncToPromise(() =>
|
||||
(Sk as any).importMainWithBody("<stdin>", false, normalizedSource, true),
|
||||
)
|
||||
return { status: 3, output: stdout.join("").trimEnd() }
|
||||
} catch (err: any) {
|
||||
const name = String(err?.tp$name ?? err?.name ?? "")
|
||||
const message = String(
|
||||
err?.tp$str?.()?.v ?? err?.message ?? err?.toString?.() ?? err ?? "",
|
||||
)
|
||||
|
||||
const isCompileError =
|
||||
name === "SyntaxError" ||
|
||||
name === "IndentationError" ||
|
||||
name === "TabError" ||
|
||||
/SyntaxError|IndentationError|TabError/i.test(message)
|
||||
|
||||
const formattedError = translateSkulptError(name, message, isCompileError)
|
||||
|
||||
return {
|
||||
status: isCompileError ? 6 : 11,
|
||||
output: (stdout.join("") + (stdout.length ? "\n" : "") + formattedError)
|
||||
.trim()
|
||||
.replace(/\r\n/g, "\n"),
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
self.onmessage = async (event: MessageEvent<RunRequest>) => {
|
||||
const { id, source, stdin, timeoutMs } = event.data
|
||||
try {
|
||||
const result = await runPythonWithSkulpt(source, stdin, timeoutMs)
|
||||
;(self as any).postMessage({ id, ...result } satisfies RunResponse)
|
||||
} catch (err: any) {
|
||||
const output = String(err?.message ?? err?.toString?.() ?? err ?? "")
|
||||
;(self as any).postMessage({ id, status: 11, output } satisfies RunResponse)
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user