diff --git a/crates/loro-wasm/web-test/.gitignore b/crates/loro-wasm/web-test/.gitignore
new file mode 100644
index 00000000..a547bf36
--- /dev/null
+++ b/crates/loro-wasm/web-test/.gitignore
@@ -0,0 +1,24 @@
+# Logs
+logs
+*.log
+npm-debug.log*
+yarn-debug.log*
+yarn-error.log*
+pnpm-debug.log*
+lerna-debug.log*
+
+node_modules
+dist
+dist-ssr
+*.local
+
+# Editor directories and files
+.vscode/*
+!.vscode/extensions.json
+.idea
+.DS_Store
+*.suo
+*.ntvs*
+*.njsproj
+*.sln
+*.sw?
diff --git a/crates/loro-wasm/web-test/index.html b/crates/loro-wasm/web-test/index.html
new file mode 100644
index 00000000..ed0f5bbd
--- /dev/null
+++ b/crates/loro-wasm/web-test/index.html
@@ -0,0 +1,13 @@
+
+
+
+
+
+
+ Vite + Preact + TS
+
+
+
+
+
+
diff --git a/crates/loro-wasm/web-test/package.json b/crates/loro-wasm/web-test/package.json
new file mode 100644
index 00000000..83fd40e1
--- /dev/null
+++ b/crates/loro-wasm/web-test/package.json
@@ -0,0 +1,22 @@
+{
+ "name": "web-test",
+ "private": true,
+ "version": "0.0.0",
+ "type": "module",
+ "scripts": {
+ "dev": "vite",
+ "build": "tsc && vite build",
+ "preview": "vite preview"
+ },
+ "dependencies": {
+ "loro-wasm": "../pkg",
+ "preact": "^10.11.2"
+ },
+ "devDependencies": {
+ "@preact/preset-vite": "^2.4.0",
+ "@types/node": "^18.11.9",
+ "typescript": "^4.6.4",
+ "vite": "^3.2.3",
+ "vitest": "^0.24.5"
+ }
+}
diff --git a/crates/loro-wasm/web-test/pnpm-lock.yaml b/crates/loro-wasm/web-test/pnpm-lock.yaml
new file mode 100644
index 00000000..378c271e
--- /dev/null
+++ b/crates/loro-wasm/web-test/pnpm-lock.yaml
@@ -0,0 +1,1263 @@
+lockfileVersion: 5.4
+
+specifiers:
+ '@preact/preset-vite': ^2.4.0
+ '@types/node': ^18.11.9
+ loro-wasm: ../pkg
+ preact: ^10.11.2
+ typescript: ^4.6.4
+ vite: ^3.2.3
+ vitest: ^0.24.5
+
+dependencies:
+ loro-wasm: link:../pkg
+ preact: registry.npmmirror.com/preact/10.11.2
+
+devDependencies:
+ '@preact/preset-vite': registry.npmmirror.com/@preact/preset-vite/2.4.0_zqniugonpg623im3maiqdh2nfe
+ '@types/node': registry.npmmirror.com/@types/node/18.11.9
+ typescript: registry.npmmirror.com/typescript/4.8.4
+ vite: registry.npmmirror.com/vite/3.2.3_@types+node@18.11.9
+ vitest: registry.npmmirror.com/vitest/0.24.5
+
+packages:
+
+ registry.npmmirror.com/@ampproject/remapping/2.2.0:
+ resolution: {integrity: sha512-qRmjj8nj9qmLTQXXmaR1cck3UXSRMPrbsLJAasZpF+t3riI71BXed5ebIOYwQntykeZuhjsdweEc9BxH5Jc26w==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/@ampproject/remapping/-/remapping-2.2.0.tgz}
+ name: '@ampproject/remapping'
+ version: 2.2.0
+ engines: {node: '>=6.0.0'}
+ dependencies:
+ '@jridgewell/gen-mapping': registry.npmmirror.com/@jridgewell/gen-mapping/0.1.1
+ '@jridgewell/trace-mapping': registry.npmmirror.com/@jridgewell/trace-mapping/0.3.17
+ dev: true
+
+ registry.npmmirror.com/@babel/code-frame/7.18.6:
+ resolution: {integrity: sha512-TDCmlK5eOvH+eH7cdAFlNXeVJqWIQ7gW9tY1GJIpUtFb6CmjVyq2VM3u71bOyR8CRihcCgMUYoDNyLXao3+70Q==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/@babel/code-frame/-/code-frame-7.18.6.tgz}
+ name: '@babel/code-frame'
+ version: 7.18.6
+ engines: {node: '>=6.9.0'}
+ dependencies:
+ '@babel/highlight': registry.npmmirror.com/@babel/highlight/7.18.6
+ dev: true
+
+ registry.npmmirror.com/@babel/compat-data/7.20.1:
+ resolution: {integrity: sha512-EWZ4mE2diW3QALKvDMiXnbZpRvlj+nayZ112nK93SnhqOtpdsbVD4W+2tEoT3YNBAG9RBR0ISY758ZkOgsn6pQ==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/@babel/compat-data/-/compat-data-7.20.1.tgz}
+ name: '@babel/compat-data'
+ version: 7.20.1
+ engines: {node: '>=6.9.0'}
+ dev: true
+
+ registry.npmmirror.com/@babel/core/7.20.2:
+ resolution: {integrity: sha512-w7DbG8DtMrJcFOi4VrLm+8QM4az8Mo+PuLBKLp2zrYRCow8W/f9xiXm5sN53C8HksCyDQwCKha9JiDoIyPjT2g==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/@babel/core/-/core-7.20.2.tgz}
+ name: '@babel/core'
+ version: 7.20.2
+ engines: {node: '>=6.9.0'}
+ dependencies:
+ '@ampproject/remapping': registry.npmmirror.com/@ampproject/remapping/2.2.0
+ '@babel/code-frame': registry.npmmirror.com/@babel/code-frame/7.18.6
+ '@babel/generator': registry.npmmirror.com/@babel/generator/7.20.3
+ '@babel/helper-compilation-targets': registry.npmmirror.com/@babel/helper-compilation-targets/7.20.0_@babel+core@7.20.2
+ '@babel/helper-module-transforms': registry.npmmirror.com/@babel/helper-module-transforms/7.20.2
+ '@babel/helpers': registry.npmmirror.com/@babel/helpers/7.20.1
+ '@babel/parser': registry.npmmirror.com/@babel/parser/7.20.3
+ '@babel/template': registry.npmmirror.com/@babel/template/7.18.10
+ '@babel/traverse': registry.npmmirror.com/@babel/traverse/7.20.1
+ '@babel/types': registry.npmmirror.com/@babel/types/7.20.2
+ convert-source-map: registry.npmmirror.com/convert-source-map/1.9.0
+ debug: registry.npmmirror.com/debug/4.3.4
+ gensync: registry.npmmirror.com/gensync/1.0.0-beta.2
+ json5: registry.npmmirror.com/json5/2.2.1
+ semver: registry.npmmirror.com/semver/6.3.0
+ transitivePeerDependencies:
+ - supports-color
+ dev: true
+
+ registry.npmmirror.com/@babel/generator/7.20.3:
+ resolution: {integrity: sha512-Wl5ilw2UD1+ZYprHVprxHZJCFeBWlzZYOovE4SDYLZnqCOD11j+0QzNeEWKLLTWM7nixrZEh7vNIyb76MyJg3A==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/@babel/generator/-/generator-7.20.3.tgz}
+ name: '@babel/generator'
+ version: 7.20.3
+ engines: {node: '>=6.9.0'}
+ dependencies:
+ '@babel/types': registry.npmmirror.com/@babel/types/7.20.2
+ '@jridgewell/gen-mapping': registry.npmmirror.com/@jridgewell/gen-mapping/0.3.2
+ jsesc: registry.npmmirror.com/jsesc/2.5.2
+ dev: true
+
+ registry.npmmirror.com/@babel/helper-annotate-as-pure/7.18.6:
+ resolution: {integrity: sha512-duORpUiYrEpzKIop6iNbjnwKLAKnJ47csTyRACyEmWj0QdUrm5aqNJGHSSEQSUAvNW0ojX0dOmK9dZduvkfeXA==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.18.6.tgz}
+ name: '@babel/helper-annotate-as-pure'
+ version: 7.18.6
+ engines: {node: '>=6.9.0'}
+ dependencies:
+ '@babel/types': registry.npmmirror.com/@babel/types/7.20.2
+ dev: true
+
+ registry.npmmirror.com/@babel/helper-compilation-targets/7.20.0_@babel+core@7.20.2:
+ resolution: {integrity: sha512-0jp//vDGp9e8hZzBc6N/KwA5ZK3Wsm/pfm4CrY7vzegkVxc65SgSn6wYOnwHe9Js9HRQ1YTCKLGPzDtaS3RoLQ==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/@babel/helper-compilation-targets/-/helper-compilation-targets-7.20.0.tgz}
+ id: registry.npmmirror.com/@babel/helper-compilation-targets/7.20.0
+ name: '@babel/helper-compilation-targets'
+ version: 7.20.0
+ engines: {node: '>=6.9.0'}
+ peerDependencies:
+ '@babel/core': ^7.0.0
+ dependencies:
+ '@babel/compat-data': registry.npmmirror.com/@babel/compat-data/7.20.1
+ '@babel/core': registry.npmmirror.com/@babel/core/7.20.2
+ '@babel/helper-validator-option': registry.npmmirror.com/@babel/helper-validator-option/7.18.6
+ browserslist: registry.npmmirror.com/browserslist/4.21.4
+ semver: registry.npmmirror.com/semver/6.3.0
+ dev: true
+
+ registry.npmmirror.com/@babel/helper-environment-visitor/7.18.9:
+ resolution: {integrity: sha512-3r/aACDJ3fhQ/EVgFy0hpj8oHyHpQc+LPtJoY9SzTThAsStm4Ptegq92vqKoE3vD706ZVFWITnMnxucw+S9Ipg==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/@babel/helper-environment-visitor/-/helper-environment-visitor-7.18.9.tgz}
+ name: '@babel/helper-environment-visitor'
+ version: 7.18.9
+ engines: {node: '>=6.9.0'}
+ dev: true
+
+ registry.npmmirror.com/@babel/helper-function-name/7.19.0:
+ resolution: {integrity: sha512-WAwHBINyrpqywkUH0nTnNgI5ina5TFn85HKS0pbPDfxFfhyR/aNQEn4hGi1P1JyT//I0t4OgXUlofzWILRvS5w==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/@babel/helper-function-name/-/helper-function-name-7.19.0.tgz}
+ name: '@babel/helper-function-name'
+ version: 7.19.0
+ engines: {node: '>=6.9.0'}
+ dependencies:
+ '@babel/template': registry.npmmirror.com/@babel/template/7.18.10
+ '@babel/types': registry.npmmirror.com/@babel/types/7.20.2
+ dev: true
+
+ registry.npmmirror.com/@babel/helper-hoist-variables/7.18.6:
+ resolution: {integrity: sha512-UlJQPkFqFULIcyW5sbzgbkxn2FKRgwWiRexcuaR8RNJRy8+LLveqPjwZV/bwrLZCN0eUHD/x8D0heK1ozuoo6Q==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/@babel/helper-hoist-variables/-/helper-hoist-variables-7.18.6.tgz}
+ name: '@babel/helper-hoist-variables'
+ version: 7.18.6
+ engines: {node: '>=6.9.0'}
+ dependencies:
+ '@babel/types': registry.npmmirror.com/@babel/types/7.20.2
+ dev: true
+
+ registry.npmmirror.com/@babel/helper-module-imports/7.18.6:
+ resolution: {integrity: sha512-0NFvs3VkuSYbFi1x2Vd6tKrywq+z/cLeYC/RJNFrIX/30Bf5aiGYbtvGXolEktzJH8o5E5KJ3tT+nkxuuZFVlA==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/@babel/helper-module-imports/-/helper-module-imports-7.18.6.tgz}
+ name: '@babel/helper-module-imports'
+ version: 7.18.6
+ engines: {node: '>=6.9.0'}
+ dependencies:
+ '@babel/types': registry.npmmirror.com/@babel/types/7.20.2
+ dev: true
+
+ registry.npmmirror.com/@babel/helper-module-transforms/7.20.2:
+ resolution: {integrity: sha512-zvBKyJXRbmK07XhMuujYoJ48B5yvvmM6+wcpv6Ivj4Yg6qO7NOZOSnvZN9CRl1zz1Z4cKf8YejmCMh8clOoOeA==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/@babel/helper-module-transforms/-/helper-module-transforms-7.20.2.tgz}
+ name: '@babel/helper-module-transforms'
+ version: 7.20.2
+ engines: {node: '>=6.9.0'}
+ dependencies:
+ '@babel/helper-environment-visitor': registry.npmmirror.com/@babel/helper-environment-visitor/7.18.9
+ '@babel/helper-module-imports': registry.npmmirror.com/@babel/helper-module-imports/7.18.6
+ '@babel/helper-simple-access': registry.npmmirror.com/@babel/helper-simple-access/7.20.2
+ '@babel/helper-split-export-declaration': registry.npmmirror.com/@babel/helper-split-export-declaration/7.18.6
+ '@babel/helper-validator-identifier': registry.npmmirror.com/@babel/helper-validator-identifier/7.19.1
+ '@babel/template': registry.npmmirror.com/@babel/template/7.18.10
+ '@babel/traverse': registry.npmmirror.com/@babel/traverse/7.20.1
+ '@babel/types': registry.npmmirror.com/@babel/types/7.20.2
+ transitivePeerDependencies:
+ - supports-color
+ dev: true
+
+ registry.npmmirror.com/@babel/helper-plugin-utils/7.20.2:
+ resolution: {integrity: sha512-8RvlJG2mj4huQ4pZ+rU9lqKi9ZKiRmuvGuM2HlWmkmgOhbs6zEAw6IEiJ5cQqGbDzGZOhwuOQNtZMi/ENLjZoQ==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/@babel/helper-plugin-utils/-/helper-plugin-utils-7.20.2.tgz}
+ name: '@babel/helper-plugin-utils'
+ version: 7.20.2
+ engines: {node: '>=6.9.0'}
+ dev: true
+
+ registry.npmmirror.com/@babel/helper-simple-access/7.20.2:
+ resolution: {integrity: sha512-+0woI/WPq59IrqDYbVGfshjT5Dmk/nnbdpcF8SnMhhXObpTq2KNBdLFRFrkVdbDOyUmHBCxzm5FHV1rACIkIbA==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/@babel/helper-simple-access/-/helper-simple-access-7.20.2.tgz}
+ name: '@babel/helper-simple-access'
+ version: 7.20.2
+ engines: {node: '>=6.9.0'}
+ dependencies:
+ '@babel/types': registry.npmmirror.com/@babel/types/7.20.2
+ dev: true
+
+ registry.npmmirror.com/@babel/helper-split-export-declaration/7.18.6:
+ resolution: {integrity: sha512-bde1etTx6ZyTmobl9LLMMQsaizFVZrquTEHOqKeQESMKo4PlObf+8+JA25ZsIpZhT/WEd39+vOdLXAFG/nELpA==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.18.6.tgz}
+ name: '@babel/helper-split-export-declaration'
+ version: 7.18.6
+ engines: {node: '>=6.9.0'}
+ dependencies:
+ '@babel/types': registry.npmmirror.com/@babel/types/7.20.2
+ dev: true
+
+ registry.npmmirror.com/@babel/helper-string-parser/7.19.4:
+ resolution: {integrity: sha512-nHtDoQcuqFmwYNYPz3Rah5ph2p8PFeFCsZk9A/48dPc/rGocJ5J3hAAZ7pb76VWX3fZKu+uEr/FhH5jLx7umrw==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/@babel/helper-string-parser/-/helper-string-parser-7.19.4.tgz}
+ name: '@babel/helper-string-parser'
+ version: 7.19.4
+ engines: {node: '>=6.9.0'}
+ dev: true
+
+ registry.npmmirror.com/@babel/helper-validator-identifier/7.19.1:
+ resolution: {integrity: sha512-awrNfaMtnHUr653GgGEs++LlAvW6w+DcPrOliSMXWCKo597CwL5Acf/wWdNkf/tfEQE3mjkeD1YOVZOUV/od1w==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.19.1.tgz}
+ name: '@babel/helper-validator-identifier'
+ version: 7.19.1
+ engines: {node: '>=6.9.0'}
+ dev: true
+
+ registry.npmmirror.com/@babel/helper-validator-option/7.18.6:
+ resolution: {integrity: sha512-XO7gESt5ouv/LRJdrVjkShckw6STTaB7l9BrpBaAHDeF5YZT+01PCwmR0SJHnkW6i8OwW/EVWRShfi4j2x+KQw==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/@babel/helper-validator-option/-/helper-validator-option-7.18.6.tgz}
+ name: '@babel/helper-validator-option'
+ version: 7.18.6
+ engines: {node: '>=6.9.0'}
+ dev: true
+
+ registry.npmmirror.com/@babel/helpers/7.20.1:
+ resolution: {integrity: sha512-J77mUVaDTUJFZ5BpP6mMn6OIl3rEWymk2ZxDBQJUG3P+PbmyMcF3bYWvz0ma69Af1oobDqT/iAsvzhB58xhQUg==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/@babel/helpers/-/helpers-7.20.1.tgz}
+ name: '@babel/helpers'
+ version: 7.20.1
+ engines: {node: '>=6.9.0'}
+ dependencies:
+ '@babel/template': registry.npmmirror.com/@babel/template/7.18.10
+ '@babel/traverse': registry.npmmirror.com/@babel/traverse/7.20.1
+ '@babel/types': registry.npmmirror.com/@babel/types/7.20.2
+ transitivePeerDependencies:
+ - supports-color
+ dev: true
+
+ registry.npmmirror.com/@babel/highlight/7.18.6:
+ resolution: {integrity: sha512-u7stbOuYjaPezCuLj29hNW1v64M2Md2qupEKP1fHc7WdOA3DgLh37suiSrZYY7haUB7iBeQZ9P1uiRF359do3g==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/@babel/highlight/-/highlight-7.18.6.tgz}
+ name: '@babel/highlight'
+ version: 7.18.6
+ engines: {node: '>=6.9.0'}
+ dependencies:
+ '@babel/helper-validator-identifier': registry.npmmirror.com/@babel/helper-validator-identifier/7.19.1
+ chalk: registry.npmmirror.com/chalk/2.4.2
+ js-tokens: registry.npmmirror.com/js-tokens/4.0.0
+ dev: true
+
+ registry.npmmirror.com/@babel/parser/7.20.3:
+ resolution: {integrity: sha512-OP/s5a94frIPXwjzEcv5S/tpQfc6XhxYUnmWpgdqMWGgYCuErA3SzozaRAMQgSZWKeTJxht9aWAkUY+0UzvOFg==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/@babel/parser/-/parser-7.20.3.tgz}
+ name: '@babel/parser'
+ version: 7.20.3
+ engines: {node: '>=6.0.0'}
+ hasBin: true
+ dependencies:
+ '@babel/types': registry.npmmirror.com/@babel/types/7.20.2
+ dev: true
+
+ registry.npmmirror.com/@babel/plugin-syntax-jsx/7.18.6_@babel+core@7.20.2:
+ resolution: {integrity: sha512-6mmljtAedFGTWu2p/8WIORGwy+61PLgOMPOdazc7YoJ9ZCWUyFy3A6CpPkRKLKD1ToAesxX8KGEViAiLo9N+7Q==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.18.6.tgz}
+ id: registry.npmmirror.com/@babel/plugin-syntax-jsx/7.18.6
+ name: '@babel/plugin-syntax-jsx'
+ version: 7.18.6
+ engines: {node: '>=6.9.0'}
+ peerDependencies:
+ '@babel/core': ^7.0.0-0
+ dependencies:
+ '@babel/core': registry.npmmirror.com/@babel/core/7.20.2
+ '@babel/helper-plugin-utils': registry.npmmirror.com/@babel/helper-plugin-utils/7.20.2
+ dev: true
+
+ registry.npmmirror.com/@babel/plugin-transform-react-jsx-development/7.18.6_@babel+core@7.20.2:
+ resolution: {integrity: sha512-SA6HEjwYFKF7WDjWcMcMGUimmw/nhNRDWxr+KaLSCrkD/LMDBvWRmHAYgE1HDeF8KUuI8OAu+RT6EOtKxSW2qA==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/@babel/plugin-transform-react-jsx-development/-/plugin-transform-react-jsx-development-7.18.6.tgz}
+ id: registry.npmmirror.com/@babel/plugin-transform-react-jsx-development/7.18.6
+ name: '@babel/plugin-transform-react-jsx-development'
+ version: 7.18.6
+ engines: {node: '>=6.9.0'}
+ peerDependencies:
+ '@babel/core': ^7.0.0-0
+ dependencies:
+ '@babel/core': registry.npmmirror.com/@babel/core/7.20.2
+ '@babel/plugin-transform-react-jsx': registry.npmmirror.com/@babel/plugin-transform-react-jsx/7.19.0_@babel+core@7.20.2
+ dev: true
+
+ registry.npmmirror.com/@babel/plugin-transform-react-jsx/7.19.0_@babel+core@7.20.2:
+ resolution: {integrity: sha512-UVEvX3tXie3Szm3emi1+G63jyw1w5IcMY0FSKM+CRnKRI5Mr1YbCNgsSTwoTwKphQEG9P+QqmuRFneJPZuHNhg==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/@babel/plugin-transform-react-jsx/-/plugin-transform-react-jsx-7.19.0.tgz}
+ id: registry.npmmirror.com/@babel/plugin-transform-react-jsx/7.19.0
+ name: '@babel/plugin-transform-react-jsx'
+ version: 7.19.0
+ engines: {node: '>=6.9.0'}
+ peerDependencies:
+ '@babel/core': ^7.0.0-0
+ dependencies:
+ '@babel/core': registry.npmmirror.com/@babel/core/7.20.2
+ '@babel/helper-annotate-as-pure': registry.npmmirror.com/@babel/helper-annotate-as-pure/7.18.6
+ '@babel/helper-module-imports': registry.npmmirror.com/@babel/helper-module-imports/7.18.6
+ '@babel/helper-plugin-utils': registry.npmmirror.com/@babel/helper-plugin-utils/7.20.2
+ '@babel/plugin-syntax-jsx': registry.npmmirror.com/@babel/plugin-syntax-jsx/7.18.6_@babel+core@7.20.2
+ '@babel/types': registry.npmmirror.com/@babel/types/7.20.2
+ dev: true
+
+ registry.npmmirror.com/@babel/template/7.18.10:
+ resolution: {integrity: sha512-TI+rCtooWHr3QJ27kJxfjutghu44DLnasDMwpDqCXVTal9RLp3RSYNh4NdBrRP2cQAoG9A8juOQl6P6oZG4JxA==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/@babel/template/-/template-7.18.10.tgz}
+ name: '@babel/template'
+ version: 7.18.10
+ engines: {node: '>=6.9.0'}
+ dependencies:
+ '@babel/code-frame': registry.npmmirror.com/@babel/code-frame/7.18.6
+ '@babel/parser': registry.npmmirror.com/@babel/parser/7.20.3
+ '@babel/types': registry.npmmirror.com/@babel/types/7.20.2
+ dev: true
+
+ registry.npmmirror.com/@babel/traverse/7.20.1:
+ resolution: {integrity: sha512-d3tN8fkVJwFLkHkBN479SOsw4DMZnz8cdbL/gvuDuzy3TS6Nfw80HuQqhw1pITbIruHyh7d1fMA47kWzmcUEGA==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/@babel/traverse/-/traverse-7.20.1.tgz}
+ name: '@babel/traverse'
+ version: 7.20.1
+ engines: {node: '>=6.9.0'}
+ dependencies:
+ '@babel/code-frame': registry.npmmirror.com/@babel/code-frame/7.18.6
+ '@babel/generator': registry.npmmirror.com/@babel/generator/7.20.3
+ '@babel/helper-environment-visitor': registry.npmmirror.com/@babel/helper-environment-visitor/7.18.9
+ '@babel/helper-function-name': registry.npmmirror.com/@babel/helper-function-name/7.19.0
+ '@babel/helper-hoist-variables': registry.npmmirror.com/@babel/helper-hoist-variables/7.18.6
+ '@babel/helper-split-export-declaration': registry.npmmirror.com/@babel/helper-split-export-declaration/7.18.6
+ '@babel/parser': registry.npmmirror.com/@babel/parser/7.20.3
+ '@babel/types': registry.npmmirror.com/@babel/types/7.20.2
+ debug: registry.npmmirror.com/debug/4.3.4
+ globals: registry.npmmirror.com/globals/11.12.0
+ transitivePeerDependencies:
+ - supports-color
+ dev: true
+
+ registry.npmmirror.com/@babel/types/7.20.2:
+ resolution: {integrity: sha512-FnnvsNWgZCr232sqtXggapvlkk/tuwR/qhGzcmxI0GXLCjmPYQPzio2FbdlWuY6y1sHFfQKk+rRbUZ9VStQMog==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/@babel/types/-/types-7.20.2.tgz}
+ name: '@babel/types'
+ version: 7.20.2
+ engines: {node: '>=6.9.0'}
+ dependencies:
+ '@babel/helper-string-parser': registry.npmmirror.com/@babel/helper-string-parser/7.19.4
+ '@babel/helper-validator-identifier': registry.npmmirror.com/@babel/helper-validator-identifier/7.19.1
+ to-fast-properties: registry.npmmirror.com/to-fast-properties/2.0.0
+ dev: true
+
+ registry.npmmirror.com/@esbuild/android-arm/0.15.13:
+ resolution: {integrity: sha512-RY2fVI8O0iFUNvZirXaQ1vMvK0xhCcl0gqRj74Z6yEiO1zAUa7hbsdwZM1kzqbxHK7LFyMizipfXT3JME+12Hw==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/@esbuild/android-arm/-/android-arm-0.15.13.tgz}
+ name: '@esbuild/android-arm'
+ version: 0.15.13
+ engines: {node: '>=12'}
+ cpu: [arm]
+ os: [android]
+ requiresBuild: true
+ dev: true
+ optional: true
+
+ registry.npmmirror.com/@esbuild/linux-loong64/0.15.13:
+ resolution: {integrity: sha512-+BoyIm4I8uJmH/QDIH0fu7MG0AEx9OXEDXnqptXCwKOlOqZiS4iraH1Nr7/ObLMokW3sOCeBNyD68ATcV9b9Ag==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/@esbuild/linux-loong64/-/linux-loong64-0.15.13.tgz}
+ name: '@esbuild/linux-loong64'
+ version: 0.15.13
+ engines: {node: '>=12'}
+ cpu: [loong64]
+ os: [linux]
+ requiresBuild: true
+ dev: true
+ optional: true
+
+ registry.npmmirror.com/@jridgewell/gen-mapping/0.1.1:
+ resolution: {integrity: sha512-sQXCasFk+U8lWYEe66WxRDOE9PjVz4vSM51fTu3Hw+ClTpUSQb718772vH3pyS5pShp6lvQM7SxgIDXXXmOX7w==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/@jridgewell/gen-mapping/-/gen-mapping-0.1.1.tgz}
+ name: '@jridgewell/gen-mapping'
+ version: 0.1.1
+ engines: {node: '>=6.0.0'}
+ dependencies:
+ '@jridgewell/set-array': registry.npmmirror.com/@jridgewell/set-array/1.1.2
+ '@jridgewell/sourcemap-codec': registry.npmmirror.com/@jridgewell/sourcemap-codec/1.4.14
+ dev: true
+
+ registry.npmmirror.com/@jridgewell/gen-mapping/0.3.2:
+ resolution: {integrity: sha512-mh65xKQAzI6iBcFzwv28KVWSmCkdRBWoOh+bYQGW3+6OZvbbN3TqMGo5hqYxQniRcH9F2VZIoJCm4pa3BPDK/A==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/@jridgewell/gen-mapping/-/gen-mapping-0.3.2.tgz}
+ name: '@jridgewell/gen-mapping'
+ version: 0.3.2
+ engines: {node: '>=6.0.0'}
+ dependencies:
+ '@jridgewell/set-array': registry.npmmirror.com/@jridgewell/set-array/1.1.2
+ '@jridgewell/sourcemap-codec': registry.npmmirror.com/@jridgewell/sourcemap-codec/1.4.14
+ '@jridgewell/trace-mapping': registry.npmmirror.com/@jridgewell/trace-mapping/0.3.17
+ dev: true
+
+ registry.npmmirror.com/@jridgewell/resolve-uri/3.1.0:
+ resolution: {integrity: sha512-F2msla3tad+Mfht5cJq7LSXcdudKTWCVYUgw6pLFOOHSTtZlj6SWNYAp+AhuqLmWdBO2X5hPrLcu8cVP8fy28w==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/@jridgewell/resolve-uri/-/resolve-uri-3.1.0.tgz}
+ name: '@jridgewell/resolve-uri'
+ version: 3.1.0
+ engines: {node: '>=6.0.0'}
+ dev: true
+
+ registry.npmmirror.com/@jridgewell/set-array/1.1.2:
+ resolution: {integrity: sha512-xnkseuNADM0gt2bs+BvhO0p78Mk762YnZdsuzFV018NoG1Sj1SCQvpSqa7XUaTam5vAGasABV9qXASMKnFMwMw==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/@jridgewell/set-array/-/set-array-1.1.2.tgz}
+ name: '@jridgewell/set-array'
+ version: 1.1.2
+ engines: {node: '>=6.0.0'}
+ dev: true
+
+ registry.npmmirror.com/@jridgewell/sourcemap-codec/1.4.14:
+ resolution: {integrity: sha512-XPSJHWmi394fuUuzDnGz1wiKqWfo1yXecHQMRf2l6hztTO+nPru658AyDngaBe7isIxEkRsPR3FZh+s7iVa4Uw==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.14.tgz}
+ name: '@jridgewell/sourcemap-codec'
+ version: 1.4.14
+ dev: true
+
+ registry.npmmirror.com/@jridgewell/trace-mapping/0.3.17:
+ resolution: {integrity: sha512-MCNzAp77qzKca9+W/+I0+sEpaUnZoeasnghNeVc41VZCEKaCH73Vq3BZZ/SzWIgrqE4H4ceI+p+b6C0mHf9T4g==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/@jridgewell/trace-mapping/-/trace-mapping-0.3.17.tgz}
+ name: '@jridgewell/trace-mapping'
+ version: 0.3.17
+ dependencies:
+ '@jridgewell/resolve-uri': registry.npmmirror.com/@jridgewell/resolve-uri/3.1.0
+ '@jridgewell/sourcemap-codec': registry.npmmirror.com/@jridgewell/sourcemap-codec/1.4.14
+ dev: true
+
+ registry.npmmirror.com/@preact/preset-vite/2.4.0_zqniugonpg623im3maiqdh2nfe:
+ resolution: {integrity: sha512-EiUMHuiCThuTuK+eH2r5uDg+CJbbt4aWJGePuszrHuXUpRv6WAeO4S+/DTJsEHtPtGmPRR3cLQ68N5097eOSRA==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/@preact/preset-vite/-/preset-vite-2.4.0.tgz}
+ id: registry.npmmirror.com/@preact/preset-vite/2.4.0
+ name: '@preact/preset-vite'
+ version: 2.4.0
+ peerDependencies:
+ '@babel/core': 7.x
+ vite: 2.x || 3.x
+ dependencies:
+ '@babel/core': registry.npmmirror.com/@babel/core/7.20.2
+ '@babel/plugin-transform-react-jsx': registry.npmmirror.com/@babel/plugin-transform-react-jsx/7.19.0_@babel+core@7.20.2
+ '@babel/plugin-transform-react-jsx-development': registry.npmmirror.com/@babel/plugin-transform-react-jsx-development/7.18.6_@babel+core@7.20.2
+ '@prefresh/vite': registry.npmmirror.com/@prefresh/vite/2.2.8_preact@10.11.2+vite@3.2.3
+ '@rollup/pluginutils': registry.npmmirror.com/@rollup/pluginutils/4.2.1
+ babel-plugin-transform-hook-names: registry.npmmirror.com/babel-plugin-transform-hook-names/1.0.2_@babel+core@7.20.2
+ debug: registry.npmmirror.com/debug/4.3.4
+ kolorist: registry.npmmirror.com/kolorist/1.6.0
+ resolve: registry.npmmirror.com/resolve/1.22.1
+ vite: registry.npmmirror.com/vite/3.2.3_@types+node@18.11.9
+ transitivePeerDependencies:
+ - preact
+ - supports-color
+ dev: true
+
+ registry.npmmirror.com/@prefresh/babel-plugin/0.4.3:
+ resolution: {integrity: sha512-fYAWbU1WDSLn108kKY4eDaaeUcnszFqXjgaGKYXNZ5NLulpRTpsrY+Sbfo9q8LDpWrBpqIgzjrwNnvglWI1xNQ==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/@prefresh/babel-plugin/-/babel-plugin-0.4.3.tgz}
+ name: '@prefresh/babel-plugin'
+ version: 0.4.3
+ dev: true
+
+ registry.npmmirror.com/@prefresh/core/1.4.1_preact@10.11.2:
+ resolution: {integrity: sha512-og1vaBj3LMJagVncNrDb37Gqc0cWaUcDbpVt5hZtsN4i2Iwzd/5hyTsDHvlMirhSym3wL9ihU0Xa2VhSaOue7g==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/@prefresh/core/-/core-1.4.1.tgz}
+ id: registry.npmmirror.com/@prefresh/core/1.4.1
+ name: '@prefresh/core'
+ version: 1.4.1
+ peerDependencies:
+ preact: ^10.0.0
+ dependencies:
+ preact: registry.npmmirror.com/preact/10.11.2
+ dev: true
+
+ registry.npmmirror.com/@prefresh/utils/1.1.3:
+ resolution: {integrity: sha512-Mb9abhJTOV4yCfkXrMrcgFiFT7MfNOw8sDa+XyZBdq/Ai2p4Zyxqsb3EgHLOEdHpMj6J9aiZ54W8H6FTam1u+A==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/@prefresh/utils/-/utils-1.1.3.tgz}
+ name: '@prefresh/utils'
+ version: 1.1.3
+ dev: true
+
+ registry.npmmirror.com/@prefresh/vite/2.2.8_preact@10.11.2+vite@3.2.3:
+ resolution: {integrity: sha512-yGGa+PKPYPTzMlxgQ8aBgxw9K69I8X4iQ0E6KOcIvls96WKqKLLOYZW9SUgCve446jpUXvc9udviPBZjCeZIIQ==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/@prefresh/vite/-/vite-2.2.8.tgz}
+ id: registry.npmmirror.com/@prefresh/vite/2.2.8
+ name: '@prefresh/vite'
+ version: 2.2.8
+ peerDependencies:
+ preact: ^10.4.0
+ vite: '>=2.0.0-beta.3'
+ dependencies:
+ '@babel/core': registry.npmmirror.com/@babel/core/7.20.2
+ '@prefresh/babel-plugin': registry.npmmirror.com/@prefresh/babel-plugin/0.4.3
+ '@prefresh/core': registry.npmmirror.com/@prefresh/core/1.4.1_preact@10.11.2
+ '@prefresh/utils': registry.npmmirror.com/@prefresh/utils/1.1.3
+ '@rollup/pluginutils': registry.npmmirror.com/@rollup/pluginutils/4.2.1
+ preact: registry.npmmirror.com/preact/10.11.2
+ vite: registry.npmmirror.com/vite/3.2.3_@types+node@18.11.9
+ transitivePeerDependencies:
+ - supports-color
+ dev: true
+
+ registry.npmmirror.com/@rollup/pluginutils/4.2.1:
+ resolution: {integrity: sha512-iKnFXr7NkdZAIHiIWE+BX5ULi/ucVFYWD6TbAV+rZctiRTY2PL6tsIKhoIOaoskiWAkgu+VsbXgUVDNLHf+InQ==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/@rollup/pluginutils/-/pluginutils-4.2.1.tgz}
+ name: '@rollup/pluginutils'
+ version: 4.2.1
+ engines: {node: '>= 8.0.0'}
+ dependencies:
+ estree-walker: registry.npmmirror.com/estree-walker/2.0.2
+ picomatch: registry.npmmirror.com/picomatch/2.3.1
+ dev: true
+
+ registry.npmmirror.com/@types/chai-subset/1.3.3:
+ resolution: {integrity: sha512-frBecisrNGz+F4T6bcc+NLeolfiojh5FxW2klu669+8BARtyQv2C/GkNW6FUodVe4BroGMP/wER/YDGc7rEllw==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/@types/chai-subset/-/chai-subset-1.3.3.tgz}
+ name: '@types/chai-subset'
+ version: 1.3.3
+ dependencies:
+ '@types/chai': registry.npmmirror.com/@types/chai/4.3.3
+ dev: true
+
+ registry.npmmirror.com/@types/chai/4.3.3:
+ resolution: {integrity: sha512-hC7OMnszpxhZPduX+m+nrx+uFoLkWOMiR4oa/AZF3MuSETYTZmFfJAHqZEM8MVlvfG7BEUcgvtwoCTxBp6hm3g==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/@types/chai/-/chai-4.3.3.tgz}
+ name: '@types/chai'
+ version: 4.3.3
+ dev: true
+
+ registry.npmmirror.com/@types/node/18.11.9:
+ resolution: {integrity: sha512-CRpX21/kGdzjOpFsZSkcrXMGIBWMGNIHXXBVFSH+ggkftxg+XYP20TESbh+zFvFj3EQOl5byk0HTRn1IL6hbqg==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/@types/node/-/node-18.11.9.tgz}
+ name: '@types/node'
+ version: 18.11.9
+ dev: true
+
+ registry.npmmirror.com/acorn/8.8.1:
+ resolution: {integrity: sha512-7zFpHzhnqYKrkYdUjF1HI1bzd0VygEGX8lFk4k5zVMqHEoES+P+7TKI+EvLO9WVMJ8eekdO0aDEK044xTXwPPA==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/acorn/-/acorn-8.8.1.tgz}
+ name: acorn
+ version: 8.8.1
+ engines: {node: '>=0.4.0'}
+ hasBin: true
+ dev: true
+
+ registry.npmmirror.com/ansi-styles/3.2.1:
+ resolution: {integrity: sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/ansi-styles/-/ansi-styles-3.2.1.tgz}
+ name: ansi-styles
+ version: 3.2.1
+ engines: {node: '>=4'}
+ dependencies:
+ color-convert: registry.npmmirror.com/color-convert/1.9.3
+ dev: true
+
+ registry.npmmirror.com/assertion-error/1.1.0:
+ resolution: {integrity: sha512-jgsaNduz+ndvGyFt3uSuWqvy4lCnIJiovtouQN5JZHOKCS2QuhEdbcQHFhVksz2N2U9hXJo8odG7ETyWlEeuDw==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/assertion-error/-/assertion-error-1.1.0.tgz}
+ name: assertion-error
+ version: 1.1.0
+ dev: true
+
+ registry.npmmirror.com/babel-plugin-transform-hook-names/1.0.2_@babel+core@7.20.2:
+ resolution: {integrity: sha512-5gafyjyyBTTdX/tQQ0hRgu4AhNHG/hqWi0ZZmg2xvs2FgRkJXzDNKBZCyoYqgFkovfDrgM8OoKg8karoUvWeCw==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/babel-plugin-transform-hook-names/-/babel-plugin-transform-hook-names-1.0.2.tgz}
+ id: registry.npmmirror.com/babel-plugin-transform-hook-names/1.0.2
+ name: babel-plugin-transform-hook-names
+ version: 1.0.2
+ peerDependencies:
+ '@babel/core': ^7.12.10
+ dependencies:
+ '@babel/core': registry.npmmirror.com/@babel/core/7.20.2
+ dev: true
+
+ registry.npmmirror.com/browserslist/4.21.4:
+ resolution: {integrity: sha512-CBHJJdDmgjl3daYjN5Cp5kbTf1mUhZoS+beLklHIvkOWscs83YAhLlF3Wsh/lciQYAcbBJgTOD44VtG31ZM4Hw==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/browserslist/-/browserslist-4.21.4.tgz}
+ name: browserslist
+ version: 4.21.4
+ engines: {node: ^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7}
+ hasBin: true
+ dependencies:
+ caniuse-lite: registry.npmmirror.com/caniuse-lite/1.0.30001431
+ electron-to-chromium: registry.npmmirror.com/electron-to-chromium/1.4.284
+ node-releases: registry.npmmirror.com/node-releases/2.0.6
+ update-browserslist-db: registry.npmmirror.com/update-browserslist-db/1.0.10_browserslist@4.21.4
+ dev: true
+
+ registry.npmmirror.com/caniuse-lite/1.0.30001431:
+ resolution: {integrity: sha512-zBUoFU0ZcxpvSt9IU66dXVT/3ctO1cy4y9cscs1szkPlcWb6pasYM144GqrUygUbT+k7cmUCW61cvskjcv0enQ==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/caniuse-lite/-/caniuse-lite-1.0.30001431.tgz}
+ name: caniuse-lite
+ version: 1.0.30001431
+ dev: true
+
+ registry.npmmirror.com/chai/4.3.6:
+ resolution: {integrity: sha512-bbcp3YfHCUzMOvKqsztczerVgBKSsEijCySNlHHbX3VG1nskvqjz5Rfso1gGwD6w6oOV3eI60pKuMOV5MV7p3Q==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/chai/-/chai-4.3.6.tgz}
+ name: chai
+ version: 4.3.6
+ engines: {node: '>=4'}
+ dependencies:
+ assertion-error: registry.npmmirror.com/assertion-error/1.1.0
+ check-error: registry.npmmirror.com/check-error/1.0.2
+ deep-eql: registry.npmmirror.com/deep-eql/3.0.1
+ get-func-name: registry.npmmirror.com/get-func-name/2.0.0
+ loupe: registry.npmmirror.com/loupe/2.3.6
+ pathval: registry.npmmirror.com/pathval/1.1.1
+ type-detect: registry.npmmirror.com/type-detect/4.0.8
+ dev: true
+
+ registry.npmmirror.com/chalk/2.4.2:
+ resolution: {integrity: sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/chalk/-/chalk-2.4.2.tgz}
+ name: chalk
+ version: 2.4.2
+ engines: {node: '>=4'}
+ dependencies:
+ ansi-styles: registry.npmmirror.com/ansi-styles/3.2.1
+ escape-string-regexp: registry.npmmirror.com/escape-string-regexp/1.0.5
+ supports-color: registry.npmmirror.com/supports-color/5.5.0
+ dev: true
+
+ registry.npmmirror.com/check-error/1.0.2:
+ resolution: {integrity: sha512-BrgHpW9NURQgzoNyjfq0Wu6VFO6D7IZEmJNdtgNqpzGG8RuNFHt2jQxWlAs4HMe119chBnv+34syEZtc6IhLtA==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/check-error/-/check-error-1.0.2.tgz}
+ name: check-error
+ version: 1.0.2
+ dev: true
+
+ registry.npmmirror.com/color-convert/1.9.3:
+ resolution: {integrity: sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/color-convert/-/color-convert-1.9.3.tgz}
+ name: color-convert
+ version: 1.9.3
+ dependencies:
+ color-name: registry.npmmirror.com/color-name/1.1.3
+ dev: true
+
+ registry.npmmirror.com/color-name/1.1.3:
+ resolution: {integrity: sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/color-name/-/color-name-1.1.3.tgz}
+ name: color-name
+ version: 1.1.3
+ dev: true
+
+ registry.npmmirror.com/convert-source-map/1.9.0:
+ resolution: {integrity: sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/convert-source-map/-/convert-source-map-1.9.0.tgz}
+ name: convert-source-map
+ version: 1.9.0
+ dev: true
+
+ registry.npmmirror.com/debug/4.3.4:
+ resolution: {integrity: sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/debug/-/debug-4.3.4.tgz}
+ name: debug
+ version: 4.3.4
+ engines: {node: '>=6.0'}
+ peerDependencies:
+ supports-color: '*'
+ peerDependenciesMeta:
+ supports-color:
+ optional: true
+ dependencies:
+ ms: registry.npmmirror.com/ms/2.1.2
+ dev: true
+
+ registry.npmmirror.com/deep-eql/3.0.1:
+ resolution: {integrity: sha512-+QeIQyN5ZuO+3Uk5DYh6/1eKO0m0YmJFGNmFHGACpf1ClL1nmlV/p4gNgbl2pJGxgXb4faqo6UE+M5ACEMyVcw==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/deep-eql/-/deep-eql-3.0.1.tgz}
+ name: deep-eql
+ version: 3.0.1
+ engines: {node: '>=0.12'}
+ dependencies:
+ type-detect: registry.npmmirror.com/type-detect/4.0.8
+ dev: true
+
+ registry.npmmirror.com/electron-to-chromium/1.4.284:
+ resolution: {integrity: sha512-M8WEXFuKXMYMVr45fo8mq0wUrrJHheiKZf6BArTKk9ZBYCKJEOU5H8cdWgDT+qCVZf7Na4lVUaZsA+h6uA9+PA==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/electron-to-chromium/-/electron-to-chromium-1.4.284.tgz}
+ name: electron-to-chromium
+ version: 1.4.284
+ dev: true
+
+ registry.npmmirror.com/esbuild-android-64/0.15.13:
+ resolution: {integrity: sha512-yRorukXBlokwTip+Sy4MYskLhJsO0Kn0/Fj43s1krVblfwP+hMD37a4Wmg139GEsMLl+vh8WXp2mq/cTA9J97g==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/esbuild-android-64/-/esbuild-android-64-0.15.13.tgz}
+ name: esbuild-android-64
+ version: 0.15.13
+ engines: {node: '>=12'}
+ cpu: [x64]
+ os: [android]
+ requiresBuild: true
+ dev: true
+ optional: true
+
+ registry.npmmirror.com/esbuild-android-arm64/0.15.13:
+ resolution: {integrity: sha512-TKzyymLD6PiVeyYa4c5wdPw87BeAiTXNtK6amWUcXZxkV51gOk5u5qzmDaYSwiWeecSNHamFsaFjLoi32QR5/w==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/esbuild-android-arm64/-/esbuild-android-arm64-0.15.13.tgz}
+ name: esbuild-android-arm64
+ version: 0.15.13
+ engines: {node: '>=12'}
+ cpu: [arm64]
+ os: [android]
+ requiresBuild: true
+ dev: true
+ optional: true
+
+ registry.npmmirror.com/esbuild-darwin-64/0.15.13:
+ resolution: {integrity: sha512-WAx7c2DaOS6CrRcoYCgXgkXDliLnFv3pQLV6GeW1YcGEZq2Gnl8s9Pg7ahValZkpOa0iE/ojRVQ87sbUhF1Cbg==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/esbuild-darwin-64/-/esbuild-darwin-64-0.15.13.tgz}
+ name: esbuild-darwin-64
+ version: 0.15.13
+ engines: {node: '>=12'}
+ cpu: [x64]
+ os: [darwin]
+ requiresBuild: true
+ dev: true
+ optional: true
+
+ registry.npmmirror.com/esbuild-darwin-arm64/0.15.13:
+ resolution: {integrity: sha512-U6jFsPfSSxC3V1CLiQqwvDuj3GGrtQNB3P3nNC3+q99EKf94UGpsG9l4CQ83zBs1NHrk1rtCSYT0+KfK5LsD8A==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/esbuild-darwin-arm64/-/esbuild-darwin-arm64-0.15.13.tgz}
+ name: esbuild-darwin-arm64
+ version: 0.15.13
+ engines: {node: '>=12'}
+ cpu: [arm64]
+ os: [darwin]
+ requiresBuild: true
+ dev: true
+ optional: true
+
+ registry.npmmirror.com/esbuild-freebsd-64/0.15.13:
+ resolution: {integrity: sha512-whItJgDiOXaDG/idy75qqevIpZjnReZkMGCgQaBWZuKHoElDJC1rh7MpoUgupMcdfOd+PgdEwNQW9DAE6i8wyA==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/esbuild-freebsd-64/-/esbuild-freebsd-64-0.15.13.tgz}
+ name: esbuild-freebsd-64
+ version: 0.15.13
+ engines: {node: '>=12'}
+ cpu: [x64]
+ os: [freebsd]
+ requiresBuild: true
+ dev: true
+ optional: true
+
+ registry.npmmirror.com/esbuild-freebsd-arm64/0.15.13:
+ resolution: {integrity: sha512-6pCSWt8mLUbPtygv7cufV0sZLeylaMwS5Fznj6Rsx9G2AJJsAjQ9ifA+0rQEIg7DwJmi9it+WjzNTEAzzdoM3Q==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/esbuild-freebsd-arm64/-/esbuild-freebsd-arm64-0.15.13.tgz}
+ name: esbuild-freebsd-arm64
+ version: 0.15.13
+ engines: {node: '>=12'}
+ cpu: [arm64]
+ os: [freebsd]
+ requiresBuild: true
+ dev: true
+ optional: true
+
+ registry.npmmirror.com/esbuild-linux-32/0.15.13:
+ resolution: {integrity: sha512-VbZdWOEdrJiYApm2kkxoTOgsoCO1krBZ3quHdYk3g3ivWaMwNIVPIfEE0f0XQQ0u5pJtBsnk2/7OPiCFIPOe/w==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/esbuild-linux-32/-/esbuild-linux-32-0.15.13.tgz}
+ name: esbuild-linux-32
+ version: 0.15.13
+ engines: {node: '>=12'}
+ cpu: [ia32]
+ os: [linux]
+ requiresBuild: true
+ dev: true
+ optional: true
+
+ registry.npmmirror.com/esbuild-linux-64/0.15.13:
+ resolution: {integrity: sha512-rXmnArVNio6yANSqDQlIO4WiP+Cv7+9EuAHNnag7rByAqFVuRusLbGi2697A5dFPNXoO//IiogVwi3AdcfPC6A==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/esbuild-linux-64/-/esbuild-linux-64-0.15.13.tgz}
+ name: esbuild-linux-64
+ version: 0.15.13
+ engines: {node: '>=12'}
+ cpu: [x64]
+ os: [linux]
+ requiresBuild: true
+ dev: true
+ optional: true
+
+ registry.npmmirror.com/esbuild-linux-arm/0.15.13:
+ resolution: {integrity: sha512-Ac6LpfmJO8WhCMQmO253xX2IU2B3wPDbl4IvR0hnqcPrdfCaUa2j/lLMGTjmQ4W5JsJIdHEdW12dG8lFS0MbxQ==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/esbuild-linux-arm/-/esbuild-linux-arm-0.15.13.tgz}
+ name: esbuild-linux-arm
+ version: 0.15.13
+ engines: {node: '>=12'}
+ cpu: [arm]
+ os: [linux]
+ requiresBuild: true
+ dev: true
+ optional: true
+
+ registry.npmmirror.com/esbuild-linux-arm64/0.15.13:
+ resolution: {integrity: sha512-alEMGU4Z+d17U7KQQw2IV8tQycO6T+rOrgW8OS22Ua25x6kHxoG6Ngry6Aq6uranC+pNWNMB6aHFPh7aTQdORQ==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/esbuild-linux-arm64/-/esbuild-linux-arm64-0.15.13.tgz}
+ name: esbuild-linux-arm64
+ version: 0.15.13
+ engines: {node: '>=12'}
+ cpu: [arm64]
+ os: [linux]
+ requiresBuild: true
+ dev: true
+ optional: true
+
+ registry.npmmirror.com/esbuild-linux-mips64le/0.15.13:
+ resolution: {integrity: sha512-47PgmyYEu+yN5rD/MbwS6DxP2FSGPo4Uxg5LwIdxTiyGC2XKwHhHyW7YYEDlSuXLQXEdTO7mYe8zQ74czP7W8A==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/esbuild-linux-mips64le/-/esbuild-linux-mips64le-0.15.13.tgz}
+ name: esbuild-linux-mips64le
+ version: 0.15.13
+ engines: {node: '>=12'}
+ cpu: [mips64el]
+ os: [linux]
+ requiresBuild: true
+ dev: true
+ optional: true
+
+ registry.npmmirror.com/esbuild-linux-ppc64le/0.15.13:
+ resolution: {integrity: sha512-z6n28h2+PC1Ayle9DjKoBRcx/4cxHoOa2e689e2aDJSaKug3jXcQw7mM+GLg+9ydYoNzj8QxNL8ihOv/OnezhA==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/esbuild-linux-ppc64le/-/esbuild-linux-ppc64le-0.15.13.tgz}
+ name: esbuild-linux-ppc64le
+ version: 0.15.13
+ engines: {node: '>=12'}
+ cpu: [ppc64]
+ os: [linux]
+ requiresBuild: true
+ dev: true
+ optional: true
+
+ registry.npmmirror.com/esbuild-linux-riscv64/0.15.13:
+ resolution: {integrity: sha512-+Lu4zuuXuQhgLUGyZloWCqTslcCAjMZH1k3Xc9MSEJEpEFdpsSU0sRDXAnk18FKOfEjhu4YMGaykx9xjtpA6ow==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/esbuild-linux-riscv64/-/esbuild-linux-riscv64-0.15.13.tgz}
+ name: esbuild-linux-riscv64
+ version: 0.15.13
+ engines: {node: '>=12'}
+ cpu: [riscv64]
+ os: [linux]
+ requiresBuild: true
+ dev: true
+ optional: true
+
+ registry.npmmirror.com/esbuild-linux-s390x/0.15.13:
+ resolution: {integrity: sha512-BMeXRljruf7J0TMxD5CIXS65y7puiZkAh+s4XFV9qy16SxOuMhxhVIXYLnbdfLrsYGFzx7U9mcdpFWkkvy/Uag==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/esbuild-linux-s390x/-/esbuild-linux-s390x-0.15.13.tgz}
+ name: esbuild-linux-s390x
+ version: 0.15.13
+ engines: {node: '>=12'}
+ cpu: [s390x]
+ os: [linux]
+ requiresBuild: true
+ dev: true
+ optional: true
+
+ registry.npmmirror.com/esbuild-netbsd-64/0.15.13:
+ resolution: {integrity: sha512-EHj9QZOTel581JPj7UO3xYbltFTYnHy+SIqJVq6yd3KkCrsHRbapiPb0Lx3EOOtybBEE9EyqbmfW1NlSDsSzvQ==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/esbuild-netbsd-64/-/esbuild-netbsd-64-0.15.13.tgz}
+ name: esbuild-netbsd-64
+ version: 0.15.13
+ engines: {node: '>=12'}
+ cpu: [x64]
+ os: [netbsd]
+ requiresBuild: true
+ dev: true
+ optional: true
+
+ registry.npmmirror.com/esbuild-openbsd-64/0.15.13:
+ resolution: {integrity: sha512-nkuDlIjF/sfUhfx8SKq0+U+Fgx5K9JcPq1mUodnxI0x4kBdCv46rOGWbuJ6eof2n3wdoCLccOoJAbg9ba/bT2w==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/esbuild-openbsd-64/-/esbuild-openbsd-64-0.15.13.tgz}
+ name: esbuild-openbsd-64
+ version: 0.15.13
+ engines: {node: '>=12'}
+ cpu: [x64]
+ os: [openbsd]
+ requiresBuild: true
+ dev: true
+ optional: true
+
+ registry.npmmirror.com/esbuild-sunos-64/0.15.13:
+ resolution: {integrity: sha512-jVeu2GfxZQ++6lRdY43CS0Tm/r4WuQQ0Pdsrxbw+aOrHQPHV0+LNOLnvbN28M7BSUGnJnHkHm2HozGgNGyeIRw==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/esbuild-sunos-64/-/esbuild-sunos-64-0.15.13.tgz}
+ name: esbuild-sunos-64
+ version: 0.15.13
+ engines: {node: '>=12'}
+ cpu: [x64]
+ os: [sunos]
+ requiresBuild: true
+ dev: true
+ optional: true
+
+ registry.npmmirror.com/esbuild-windows-32/0.15.13:
+ resolution: {integrity: sha512-XoF2iBf0wnqo16SDq+aDGi/+QbaLFpkiRarPVssMh9KYbFNCqPLlGAWwDvxEVz+ywX6Si37J2AKm+AXq1kC0JA==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/esbuild-windows-32/-/esbuild-windows-32-0.15.13.tgz}
+ name: esbuild-windows-32
+ version: 0.15.13
+ engines: {node: '>=12'}
+ cpu: [ia32]
+ os: [win32]
+ requiresBuild: true
+ dev: true
+ optional: true
+
+ registry.npmmirror.com/esbuild-windows-64/0.15.13:
+ resolution: {integrity: sha512-Et6htEfGycjDrtqb2ng6nT+baesZPYQIW+HUEHK4D1ncggNrDNk3yoboYQ5KtiVrw/JaDMNttz8rrPubV/fvPQ==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/esbuild-windows-64/-/esbuild-windows-64-0.15.13.tgz}
+ name: esbuild-windows-64
+ version: 0.15.13
+ engines: {node: '>=12'}
+ cpu: [x64]
+ os: [win32]
+ requiresBuild: true
+ dev: true
+ optional: true
+
+ registry.npmmirror.com/esbuild-windows-arm64/0.15.13:
+ resolution: {integrity: sha512-3bv7tqntThQC9SWLRouMDmZnlOukBhOCTlkzNqzGCmrkCJI7io5LLjwJBOVY6kOUlIvdxbooNZwjtBvj+7uuVg==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/esbuild-windows-arm64/-/esbuild-windows-arm64-0.15.13.tgz}
+ name: esbuild-windows-arm64
+ version: 0.15.13
+ engines: {node: '>=12'}
+ cpu: [arm64]
+ os: [win32]
+ requiresBuild: true
+ dev: true
+ optional: true
+
+ registry.npmmirror.com/esbuild/0.15.13:
+ resolution: {integrity: sha512-Cu3SC84oyzzhrK/YyN4iEVy2jZu5t2fz66HEOShHURcjSkOSAVL8C/gfUT+lDJxkVHpg8GZ10DD0rMHRPqMFaQ==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/esbuild/-/esbuild-0.15.13.tgz}
+ name: esbuild
+ version: 0.15.13
+ engines: {node: '>=12'}
+ hasBin: true
+ requiresBuild: true
+ optionalDependencies:
+ '@esbuild/android-arm': registry.npmmirror.com/@esbuild/android-arm/0.15.13
+ '@esbuild/linux-loong64': registry.npmmirror.com/@esbuild/linux-loong64/0.15.13
+ esbuild-android-64: registry.npmmirror.com/esbuild-android-64/0.15.13
+ esbuild-android-arm64: registry.npmmirror.com/esbuild-android-arm64/0.15.13
+ esbuild-darwin-64: registry.npmmirror.com/esbuild-darwin-64/0.15.13
+ esbuild-darwin-arm64: registry.npmmirror.com/esbuild-darwin-arm64/0.15.13
+ esbuild-freebsd-64: registry.npmmirror.com/esbuild-freebsd-64/0.15.13
+ esbuild-freebsd-arm64: registry.npmmirror.com/esbuild-freebsd-arm64/0.15.13
+ esbuild-linux-32: registry.npmmirror.com/esbuild-linux-32/0.15.13
+ esbuild-linux-64: registry.npmmirror.com/esbuild-linux-64/0.15.13
+ esbuild-linux-arm: registry.npmmirror.com/esbuild-linux-arm/0.15.13
+ esbuild-linux-arm64: registry.npmmirror.com/esbuild-linux-arm64/0.15.13
+ esbuild-linux-mips64le: registry.npmmirror.com/esbuild-linux-mips64le/0.15.13
+ esbuild-linux-ppc64le: registry.npmmirror.com/esbuild-linux-ppc64le/0.15.13
+ esbuild-linux-riscv64: registry.npmmirror.com/esbuild-linux-riscv64/0.15.13
+ esbuild-linux-s390x: registry.npmmirror.com/esbuild-linux-s390x/0.15.13
+ esbuild-netbsd-64: registry.npmmirror.com/esbuild-netbsd-64/0.15.13
+ esbuild-openbsd-64: registry.npmmirror.com/esbuild-openbsd-64/0.15.13
+ esbuild-sunos-64: registry.npmmirror.com/esbuild-sunos-64/0.15.13
+ esbuild-windows-32: registry.npmmirror.com/esbuild-windows-32/0.15.13
+ esbuild-windows-64: registry.npmmirror.com/esbuild-windows-64/0.15.13
+ esbuild-windows-arm64: registry.npmmirror.com/esbuild-windows-arm64/0.15.13
+ dev: true
+
+ registry.npmmirror.com/escalade/3.1.1:
+ resolution: {integrity: sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/escalade/-/escalade-3.1.1.tgz}
+ name: escalade
+ version: 3.1.1
+ engines: {node: '>=6'}
+ dev: true
+
+ registry.npmmirror.com/escape-string-regexp/1.0.5:
+ resolution: {integrity: sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz}
+ name: escape-string-regexp
+ version: 1.0.5
+ engines: {node: '>=0.8.0'}
+ dev: true
+
+ registry.npmmirror.com/estree-walker/2.0.2:
+ resolution: {integrity: sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/estree-walker/-/estree-walker-2.0.2.tgz}
+ name: estree-walker
+ version: 2.0.2
+ dev: true
+
+ registry.npmmirror.com/fsevents/2.3.2:
+ resolution: {integrity: sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/fsevents/-/fsevents-2.3.2.tgz}
+ name: fsevents
+ version: 2.3.2
+ engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0}
+ os: [darwin]
+ requiresBuild: true
+ dev: true
+ optional: true
+
+ registry.npmmirror.com/function-bind/1.1.1:
+ resolution: {integrity: sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/function-bind/-/function-bind-1.1.1.tgz}
+ name: function-bind
+ version: 1.1.1
+ dev: true
+
+ registry.npmmirror.com/gensync/1.0.0-beta.2:
+ resolution: {integrity: sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/gensync/-/gensync-1.0.0-beta.2.tgz}
+ name: gensync
+ version: 1.0.0-beta.2
+ engines: {node: '>=6.9.0'}
+ dev: true
+
+ registry.npmmirror.com/get-func-name/2.0.0:
+ resolution: {integrity: sha512-Hm0ixYtaSZ/V7C8FJrtZIuBBI+iSgL+1Aq82zSu8VQNB4S3Gk8e7Qs3VwBDJAhmRZcFqkl3tQu36g/Foh5I5ig==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/get-func-name/-/get-func-name-2.0.0.tgz}
+ name: get-func-name
+ version: 2.0.0
+ dev: true
+
+ registry.npmmirror.com/globals/11.12.0:
+ resolution: {integrity: sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/globals/-/globals-11.12.0.tgz}
+ name: globals
+ version: 11.12.0
+ engines: {node: '>=4'}
+ dev: true
+
+ registry.npmmirror.com/has-flag/3.0.0:
+ resolution: {integrity: sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/has-flag/-/has-flag-3.0.0.tgz}
+ name: has-flag
+ version: 3.0.0
+ engines: {node: '>=4'}
+ dev: true
+
+ registry.npmmirror.com/has/1.0.3:
+ resolution: {integrity: sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/has/-/has-1.0.3.tgz}
+ name: has
+ version: 1.0.3
+ engines: {node: '>= 0.4.0'}
+ dependencies:
+ function-bind: registry.npmmirror.com/function-bind/1.1.1
+ dev: true
+
+ registry.npmmirror.com/is-core-module/2.11.0:
+ resolution: {integrity: sha512-RRjxlvLDkD1YJwDbroBHMb+cukurkDWNyHx7D3oNB5x9rb5ogcksMC5wHCadcXoo67gVr/+3GFySh3134zi6rw==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/is-core-module/-/is-core-module-2.11.0.tgz}
+ name: is-core-module
+ version: 2.11.0
+ dependencies:
+ has: registry.npmmirror.com/has/1.0.3
+ dev: true
+
+ registry.npmmirror.com/js-tokens/4.0.0:
+ resolution: {integrity: sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/js-tokens/-/js-tokens-4.0.0.tgz}
+ name: js-tokens
+ version: 4.0.0
+ dev: true
+
+ registry.npmmirror.com/jsesc/2.5.2:
+ resolution: {integrity: sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/jsesc/-/jsesc-2.5.2.tgz}
+ name: jsesc
+ version: 2.5.2
+ engines: {node: '>=4'}
+ hasBin: true
+ dev: true
+
+ registry.npmmirror.com/json5/2.2.1:
+ resolution: {integrity: sha512-1hqLFMSrGHRHxav9q9gNjJ5EXznIxGVO09xQRrwplcS8qs28pZ8s8hupZAmqDwZUmVZ2Qb2jnyPOWcDH8m8dlA==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/json5/-/json5-2.2.1.tgz}
+ name: json5
+ version: 2.2.1
+ engines: {node: '>=6'}
+ hasBin: true
+ dev: true
+
+ registry.npmmirror.com/kolorist/1.6.0:
+ resolution: {integrity: sha512-dLkz37Ab97HWMx9KTes3Tbi3D1ln9fCAy2zr2YVExJasDRPGRaKcoE4fycWNtnCAJfjFqe0cnY+f8KT2JePEXQ==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/kolorist/-/kolorist-1.6.0.tgz}
+ name: kolorist
+ version: 1.6.0
+ dev: true
+
+ registry.npmmirror.com/local-pkg/0.4.2:
+ resolution: {integrity: sha512-mlERgSPrbxU3BP4qBqAvvwlgW4MTg78iwJdGGnv7kibKjWcJksrG3t6LB5lXI93wXRDvG4NpUgJFmTG4T6rdrg==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/local-pkg/-/local-pkg-0.4.2.tgz}
+ name: local-pkg
+ version: 0.4.2
+ engines: {node: '>=14'}
+ dev: true
+
+ registry.npmmirror.com/loupe/2.3.6:
+ resolution: {integrity: sha512-RaPMZKiMy8/JruncMU5Bt6na1eftNoo++R4Y+N2FrxkDVTrGvcyzFTsaGif4QTeKESheMGegbhw6iUAq+5A8zA==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/loupe/-/loupe-2.3.6.tgz}
+ name: loupe
+ version: 2.3.6
+ dependencies:
+ get-func-name: registry.npmmirror.com/get-func-name/2.0.0
+ dev: true
+
+ registry.npmmirror.com/ms/2.1.2:
+ resolution: {integrity: sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/ms/-/ms-2.1.2.tgz}
+ name: ms
+ version: 2.1.2
+ dev: true
+
+ registry.npmmirror.com/nanoid/3.3.4:
+ resolution: {integrity: sha512-MqBkQh/OHTS2egovRtLk45wEyNXwF+cokD+1YPf9u5VfJiRdAiRwB2froX5Co9Rh20xs4siNPm8naNotSD6RBw==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/nanoid/-/nanoid-3.3.4.tgz}
+ name: nanoid
+ version: 3.3.4
+ engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1}
+ hasBin: true
+ dev: true
+
+ registry.npmmirror.com/node-releases/2.0.6:
+ resolution: {integrity: sha512-PiVXnNuFm5+iYkLBNeq5211hvO38y63T0i2KKh2KnUs3RpzJ+JtODFjkD8yjLwnDkTYF1eKXheUwdssR+NRZdg==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/node-releases/-/node-releases-2.0.6.tgz}
+ name: node-releases
+ version: 2.0.6
+ dev: true
+
+ registry.npmmirror.com/path-parse/1.0.7:
+ resolution: {integrity: sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/path-parse/-/path-parse-1.0.7.tgz}
+ name: path-parse
+ version: 1.0.7
+ dev: true
+
+ registry.npmmirror.com/pathval/1.1.1:
+ resolution: {integrity: sha512-Dp6zGqpTdETdR63lehJYPeIOqpiNBNtc7BpWSLrOje7UaIsE5aY92r/AunQA7rsXvet3lrJ3JnZX29UPTKXyKQ==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/pathval/-/pathval-1.1.1.tgz}
+ name: pathval
+ version: 1.1.1
+ dev: true
+
+ registry.npmmirror.com/picocolors/1.0.0:
+ resolution: {integrity: sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/picocolors/-/picocolors-1.0.0.tgz}
+ name: picocolors
+ version: 1.0.0
+ dev: true
+
+ registry.npmmirror.com/picomatch/2.3.1:
+ resolution: {integrity: sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/picomatch/-/picomatch-2.3.1.tgz}
+ name: picomatch
+ version: 2.3.1
+ engines: {node: '>=8.6'}
+ dev: true
+
+ registry.npmmirror.com/postcss/8.4.18:
+ resolution: {integrity: sha512-Wi8mWhncLJm11GATDaQKobXSNEYGUHeQLiQqDFG1qQ5UTDPTEvKw0Xt5NsTpktGTwLps3ByrWsBrG0rB8YQ9oA==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/postcss/-/postcss-8.4.18.tgz}
+ name: postcss
+ version: 8.4.18
+ engines: {node: ^10 || ^12 || >=14}
+ dependencies:
+ nanoid: registry.npmmirror.com/nanoid/3.3.4
+ picocolors: registry.npmmirror.com/picocolors/1.0.0
+ source-map-js: registry.npmmirror.com/source-map-js/1.0.2
+ dev: true
+
+ registry.npmmirror.com/preact/10.11.2:
+ resolution: {integrity: sha512-skAwGDFmgxhq1DCBHke/9e12ewkhc7WYwjuhHB8HHS8zkdtITXLRmUMTeol2ldxvLwYtwbFeifZ9uDDWuyL4Iw==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/preact/-/preact-10.11.2.tgz}
+ name: preact
+ version: 10.11.2
+
+ registry.npmmirror.com/resolve/1.22.1:
+ resolution: {integrity: sha512-nBpuuYuY5jFsli/JIs1oldw6fOQCBioohqWZg/2hiaOybXOft4lonv85uDOKXdf8rhyK159cxU5cDcK/NKk8zw==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/resolve/-/resolve-1.22.1.tgz}
+ name: resolve
+ version: 1.22.1
+ hasBin: true
+ dependencies:
+ is-core-module: registry.npmmirror.com/is-core-module/2.11.0
+ path-parse: registry.npmmirror.com/path-parse/1.0.7
+ supports-preserve-symlinks-flag: registry.npmmirror.com/supports-preserve-symlinks-flag/1.0.0
+ dev: true
+
+ registry.npmmirror.com/rollup/2.79.1:
+ resolution: {integrity: sha512-uKxbd0IhMZOhjAiD5oAFp7BqvkA4Dv47qpOCtaNvng4HBwdbWtdOh8f5nZNuk2rp51PMGk3bzfWu5oayNEuYnw==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/rollup/-/rollup-2.79.1.tgz}
+ name: rollup
+ version: 2.79.1
+ engines: {node: '>=10.0.0'}
+ hasBin: true
+ optionalDependencies:
+ fsevents: registry.npmmirror.com/fsevents/2.3.2
+ dev: true
+
+ registry.npmmirror.com/semver/6.3.0:
+ resolution: {integrity: sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/semver/-/semver-6.3.0.tgz}
+ name: semver
+ version: 6.3.0
+ hasBin: true
+ dev: true
+
+ registry.npmmirror.com/source-map-js/1.0.2:
+ resolution: {integrity: sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/source-map-js/-/source-map-js-1.0.2.tgz}
+ name: source-map-js
+ version: 1.0.2
+ engines: {node: '>=0.10.0'}
+ dev: true
+
+ registry.npmmirror.com/strip-literal/0.4.2:
+ resolution: {integrity: sha512-pv48ybn4iE1O9RLgCAN0iU4Xv7RlBTiit6DKmMiErbs9x1wH6vXBs45tWc0H5wUIF6TLTrKweqkmYF/iraQKNw==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/strip-literal/-/strip-literal-0.4.2.tgz}
+ name: strip-literal
+ version: 0.4.2
+ dependencies:
+ acorn: registry.npmmirror.com/acorn/8.8.1
+ dev: true
+
+ registry.npmmirror.com/supports-color/5.5.0:
+ resolution: {integrity: sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/supports-color/-/supports-color-5.5.0.tgz}
+ name: supports-color
+ version: 5.5.0
+ engines: {node: '>=4'}
+ dependencies:
+ has-flag: registry.npmmirror.com/has-flag/3.0.0
+ dev: true
+
+ registry.npmmirror.com/supports-preserve-symlinks-flag/1.0.0:
+ resolution: {integrity: sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz}
+ name: supports-preserve-symlinks-flag
+ version: 1.0.0
+ engines: {node: '>= 0.4'}
+ dev: true
+
+ registry.npmmirror.com/tinybench/2.3.1:
+ resolution: {integrity: sha512-hGYWYBMPr7p4g5IarQE7XhlyWveh1EKhy4wUBS1LrHXCKYgvz+4/jCqgmJqZxxldesn05vccrtME2RLLZNW7iA==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/tinybench/-/tinybench-2.3.1.tgz}
+ name: tinybench
+ version: 2.3.1
+ dev: true
+
+ registry.npmmirror.com/tinypool/0.3.0:
+ resolution: {integrity: sha512-NX5KeqHOBZU6Bc0xj9Vr5Szbb1j8tUHIeD18s41aDJaPeC5QTdEhK0SpdpUrZlj2nv5cctNcSjaKNanXlfcVEQ==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/tinypool/-/tinypool-0.3.0.tgz}
+ name: tinypool
+ version: 0.3.0
+ engines: {node: '>=14.0.0'}
+ dev: true
+
+ registry.npmmirror.com/tinyspy/1.0.2:
+ resolution: {integrity: sha512-bSGlgwLBYf7PnUsQ6WOc6SJ3pGOcd+d8AA6EUnLDDM0kWEstC1JIlSZA3UNliDXhd9ABoS7hiRBDCu+XP/sf1Q==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/tinyspy/-/tinyspy-1.0.2.tgz}
+ name: tinyspy
+ version: 1.0.2
+ engines: {node: '>=14.0.0'}
+ dev: true
+
+ registry.npmmirror.com/to-fast-properties/2.0.0:
+ resolution: {integrity: sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/to-fast-properties/-/to-fast-properties-2.0.0.tgz}
+ name: to-fast-properties
+ version: 2.0.0
+ engines: {node: '>=4'}
+ dev: true
+
+ registry.npmmirror.com/type-detect/4.0.8:
+ resolution: {integrity: sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/type-detect/-/type-detect-4.0.8.tgz}
+ name: type-detect
+ version: 4.0.8
+ engines: {node: '>=4'}
+ dev: true
+
+ registry.npmmirror.com/typescript/4.8.4:
+ resolution: {integrity: sha512-QCh+85mCy+h0IGff8r5XWzOVSbBO+KfeYrMQh7NJ58QujwcE22u+NUSmUxqF+un70P9GXKxa2HCNiTTMJknyjQ==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/typescript/-/typescript-4.8.4.tgz}
+ name: typescript
+ version: 4.8.4
+ engines: {node: '>=4.2.0'}
+ hasBin: true
+ dev: true
+
+ registry.npmmirror.com/update-browserslist-db/1.0.10_browserslist@4.21.4:
+ resolution: {integrity: sha512-OztqDenkfFkbSG+tRxBeAnCVPckDBcvibKd35yDONx6OU8N7sqgwc7rCbkJ/WcYtVRZ4ba68d6byhC21GFh7sQ==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/update-browserslist-db/-/update-browserslist-db-1.0.10.tgz}
+ id: registry.npmmirror.com/update-browserslist-db/1.0.10
+ name: update-browserslist-db
+ version: 1.0.10
+ hasBin: true
+ peerDependencies:
+ browserslist: '>= 4.21.0'
+ dependencies:
+ browserslist: registry.npmmirror.com/browserslist/4.21.4
+ escalade: registry.npmmirror.com/escalade/3.1.1
+ picocolors: registry.npmmirror.com/picocolors/1.0.0
+ dev: true
+
+ registry.npmmirror.com/vite/3.2.3_@types+node@18.11.9:
+ resolution: {integrity: sha512-h8jl1TZ76eGs3o2dIBSsvXDLb1m/Ec1iej8ZMdz+PsaFUsftZeWe2CZOI3qogEsMNaywc17gu0q6cQDzh/weCQ==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/vite/-/vite-3.2.3.tgz}
+ id: registry.npmmirror.com/vite/3.2.3
+ name: vite
+ version: 3.2.3
+ engines: {node: ^14.18.0 || >=16.0.0}
+ hasBin: true
+ peerDependencies:
+ '@types/node': '>= 14'
+ less: '*'
+ sass: '*'
+ stylus: '*'
+ sugarss: '*'
+ terser: ^5.4.0
+ peerDependenciesMeta:
+ '@types/node':
+ optional: true
+ less:
+ optional: true
+ sass:
+ optional: true
+ stylus:
+ optional: true
+ sugarss:
+ optional: true
+ terser:
+ optional: true
+ dependencies:
+ '@types/node': registry.npmmirror.com/@types/node/18.11.9
+ esbuild: registry.npmmirror.com/esbuild/0.15.13
+ postcss: registry.npmmirror.com/postcss/8.4.18
+ resolve: registry.npmmirror.com/resolve/1.22.1
+ rollup: registry.npmmirror.com/rollup/2.79.1
+ optionalDependencies:
+ fsevents: registry.npmmirror.com/fsevents/2.3.2
+ dev: true
+
+ registry.npmmirror.com/vitest/0.24.5:
+ resolution: {integrity: sha512-zw6JhPUHtLILQDe5Q39b/SzoITkG+R7hcFjuthp4xsi6zpmfQPOZcHodZ+3bqoWl4EdGK/p1fuMiEwdxgbGLOA==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/vitest/-/vitest-0.24.5.tgz}
+ name: vitest
+ version: 0.24.5
+ engines: {node: '>=v14.16.0'}
+ hasBin: true
+ peerDependencies:
+ '@edge-runtime/vm': '*'
+ '@vitest/browser': '*'
+ '@vitest/ui': '*'
+ happy-dom: '*'
+ jsdom: '*'
+ peerDependenciesMeta:
+ '@edge-runtime/vm':
+ optional: true
+ '@vitest/browser':
+ optional: true
+ '@vitest/ui':
+ optional: true
+ happy-dom:
+ optional: true
+ jsdom:
+ optional: true
+ dependencies:
+ '@types/chai': registry.npmmirror.com/@types/chai/4.3.3
+ '@types/chai-subset': registry.npmmirror.com/@types/chai-subset/1.3.3
+ '@types/node': registry.npmmirror.com/@types/node/18.11.9
+ chai: registry.npmmirror.com/chai/4.3.6
+ debug: registry.npmmirror.com/debug/4.3.4
+ local-pkg: registry.npmmirror.com/local-pkg/0.4.2
+ strip-literal: registry.npmmirror.com/strip-literal/0.4.2
+ tinybench: registry.npmmirror.com/tinybench/2.3.1
+ tinypool: registry.npmmirror.com/tinypool/0.3.0
+ tinyspy: registry.npmmirror.com/tinyspy/1.0.2
+ vite: registry.npmmirror.com/vite/3.2.3_@types+node@18.11.9
+ transitivePeerDependencies:
+ - less
+ - sass
+ - stylus
+ - sugarss
+ - supports-color
+ - terser
+ dev: true
diff --git a/crates/loro-wasm/web-test/public/vite.svg b/crates/loro-wasm/web-test/public/vite.svg
new file mode 100644
index 00000000..e7b8dfb1
--- /dev/null
+++ b/crates/loro-wasm/web-test/public/vite.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/crates/loro-wasm/web-test/src/app.css b/crates/loro-wasm/web-test/src/app.css
new file mode 100644
index 00000000..088ed3ac
--- /dev/null
+++ b/crates/loro-wasm/web-test/src/app.css
@@ -0,0 +1,25 @@
+#app {
+ max-width: 1280px;
+ margin: 0 auto;
+ padding: 2rem;
+ text-align: center;
+}
+
+.logo {
+ height: 6em;
+ padding: 1.5em;
+}
+.logo:hover {
+ filter: drop-shadow(0 0 2em #646cffaa);
+}
+.logo.preact:hover {
+ filter: drop-shadow(0 0 2em #673ab8aa);
+}
+
+.card {
+ padding: 2em;
+}
+
+.read-the-docs {
+ color: #888;
+}
diff --git a/crates/loro-wasm/web-test/src/app.tsx b/crates/loro-wasm/web-test/src/app.tsx
new file mode 100644
index 00000000..481608e6
--- /dev/null
+++ b/crates/loro-wasm/web-test/src/app.tsx
@@ -0,0 +1,49 @@
+import { useState, useEffect } from "preact/hooks";
+import preactLogo from "./assets/preact.svg";
+import init, { Loro } from "loro-wasm";
+import "./app.css";
+
+init();
+export function App() {
+ const [count, setCount] = useState(0);
+ useEffect(() => {
+ (async () => {
+ await init();
+ const loro = new Loro();
+ const a = loro.get_text_container("ha");
+ a.insert(0, "hello world");
+ a.delete(6, 5);
+ a.insert(6, "everyone");
+ console.log(a.get_value());
+ const b = loro.get_map_container("ha");
+ b.set("ab", 123);
+ console.log(b.get_value());
+ console.log(a.get_value());
+ })();
+ }, []);
+
+ return (
+ <>
+
+ Vite + Preact
+
+
+
+ Edit src/app.tsx
and save to test HMR
+
+
+
+ Click on the Vite and Preact logos to learn more
+
+ >
+ );
+}
diff --git a/crates/loro-wasm/web-test/src/assets/preact.svg b/crates/loro-wasm/web-test/src/assets/preact.svg
new file mode 100644
index 00000000..908f17de
--- /dev/null
+++ b/crates/loro-wasm/web-test/src/assets/preact.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/crates/loro-wasm/web-test/src/index.css b/crates/loro-wasm/web-test/src/index.css
new file mode 100644
index 00000000..917888c1
--- /dev/null
+++ b/crates/loro-wasm/web-test/src/index.css
@@ -0,0 +1,70 @@
+:root {
+ font-family: Inter, Avenir, Helvetica, Arial, sans-serif;
+ font-size: 16px;
+ line-height: 24px;
+ font-weight: 400;
+
+ color-scheme: light dark;
+ color: rgba(255, 255, 255, 0.87);
+ background-color: #242424;
+
+ font-synthesis: none;
+ text-rendering: optimizeLegibility;
+ -webkit-font-smoothing: antialiased;
+ -moz-osx-font-smoothing: grayscale;
+ -webkit-text-size-adjust: 100%;
+}
+
+a {
+ font-weight: 500;
+ color: #646cff;
+ text-decoration: inherit;
+}
+a:hover {
+ color: #535bf2;
+}
+
+body {
+ margin: 0;
+ display: flex;
+ place-items: center;
+ min-width: 320px;
+ min-height: 100vh;
+}
+
+h1 {
+ font-size: 3.2em;
+ line-height: 1.1;
+}
+
+button {
+ border-radius: 8px;
+ border: 1px solid transparent;
+ padding: 0.6em 1.2em;
+ font-size: 1em;
+ font-weight: 500;
+ font-family: inherit;
+ background-color: #1a1a1a;
+ cursor: pointer;
+ transition: border-color 0.25s;
+}
+button:hover {
+ border-color: #646cff;
+}
+button:focus,
+button:focus-visible {
+ outline: 4px auto -webkit-focus-ring-color;
+}
+
+@media (prefers-color-scheme: light) {
+ :root {
+ color: #213547;
+ background-color: #ffffff;
+ }
+ a:hover {
+ color: #747bff;
+ }
+ button {
+ background-color: #f9f9f9;
+ }
+}
diff --git a/crates/loro-wasm/web-test/src/main.tsx b/crates/loro-wasm/web-test/src/main.tsx
new file mode 100644
index 00000000..e0ce3e99
--- /dev/null
+++ b/crates/loro-wasm/web-test/src/main.tsx
@@ -0,0 +1,5 @@
+import { render } from 'preact'
+import { App } from './app'
+import './index.css'
+
+render(, document.getElementById('app') as HTMLElement)
diff --git a/crates/loro-wasm/web-test/src/vite-env.d.ts b/crates/loro-wasm/web-test/src/vite-env.d.ts
new file mode 100644
index 00000000..11f02fe2
--- /dev/null
+++ b/crates/loro-wasm/web-test/src/vite-env.d.ts
@@ -0,0 +1 @@
+///
diff --git a/crates/loro-wasm/web-test/tsconfig.json b/crates/loro-wasm/web-test/tsconfig.json
new file mode 100644
index 00000000..9c1b1e0a
--- /dev/null
+++ b/crates/loro-wasm/web-test/tsconfig.json
@@ -0,0 +1,22 @@
+{
+ "compilerOptions": {
+ "target": "ESNext",
+ "useDefineForClassFields": true,
+ "lib": ["DOM", "DOM.Iterable", "ESNext"],
+ "allowJs": false,
+ "skipLibCheck": true,
+ "esModuleInterop": false,
+ "allowSyntheticDefaultImports": true,
+ "strict": true,
+ "forceConsistentCasingInFileNames": true,
+ "module": "ESNext",
+ "moduleResolution": "Node",
+ "resolveJsonModule": true,
+ "isolatedModules": true,
+ "noEmit": true,
+ "jsx": "react-jsx",
+ "jsxImportSource": "preact"
+ },
+ "include": ["src"],
+ "references": [{ "path": "./tsconfig.node.json" }]
+}
diff --git a/crates/loro-wasm/web-test/tsconfig.node.json b/crates/loro-wasm/web-test/tsconfig.node.json
new file mode 100644
index 00000000..9d31e2ae
--- /dev/null
+++ b/crates/loro-wasm/web-test/tsconfig.node.json
@@ -0,0 +1,9 @@
+{
+ "compilerOptions": {
+ "composite": true,
+ "module": "ESNext",
+ "moduleResolution": "Node",
+ "allowSyntheticDefaultImports": true
+ },
+ "include": ["vite.config.ts"]
+}
diff --git a/crates/loro-wasm/web-test/vite.config.ts b/crates/loro-wasm/web-test/vite.config.ts
new file mode 100644
index 00000000..4b8cdcd8
--- /dev/null
+++ b/crates/loro-wasm/web-test/vite.config.ts
@@ -0,0 +1,14 @@
+import { defineConfig } from "vite";
+import preact from "@preact/preset-vite";
+import path from "path";
+
+// https://vitejs.dev/config/
+export default defineConfig({
+ plugins: [preact()],
+ server: {
+ fs: {
+ // Allow serving files from one level up to the project root
+ allow: [".."],
+ },
+ },
+});