├── core
├── ReactDom.js
└── React.js
├── package.json
├── index.html
├── main.jsx
├── javascript.svg
├── Tapp.jsx
├── App.jsx
├── public
└── vite.svg
├── One.jsx
├── style.css
├── .gitignore
└── pnpm-lock.yaml
/core/ReactDom.js:
--------------------------------------------------------------------------------
1 | import React from "./React.js";
2 | const ReactDOM = {
3 | createRoot(container) {
4 | return {
5 | render(App) {
6 | React.render(App, container);
7 | },
8 | };
9 | },
10 | };
11 |
12 | export default ReactDOM;
13 |
--------------------------------------------------------------------------------
/package.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "vite-runner",
3 | "private": true,
4 | "version": "0.0.0",
5 | "type": "module",
6 | "scripts": {
7 | "dev": "vite",
8 | "build": "vite build",
9 | "preview": "vite preview"
10 | },
11 | "devDependencies": {
12 | "vite": "^5.0.8"
13 | }
14 | }
15 |
--------------------------------------------------------------------------------
/index.html:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 | Vite App
8 |
9 |
10 |
11 |
12 |
13 |
14 |
--------------------------------------------------------------------------------
/main.jsx:
--------------------------------------------------------------------------------
1 | import React from './core/React.js';
2 | import ReactDOM from "./core/ReactDom.js";
3 | import App from "./App.jsx";
4 | import Tapp from './Tapp.jsx';
5 | import One from './One.jsx';
6 |
7 | // ReactDOM.createRoot(document.querySelector("#root")).render();
8 | // ReactDOM.createRoot(document.querySelector("#root")).render();
9 | ReactDOM.createRoot(document.querySelector("#root")).render();
10 |
--------------------------------------------------------------------------------
/javascript.svg:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/Tapp.jsx:
--------------------------------------------------------------------------------
1 | import React from "./core/React.js";
2 |
3 | function Foo() {
4 | console.log("foo rerun");
5 | const [count, setCount] = React.useState(0);
6 | function handleClickFoo() {
7 | setCount((c) => c + 1);
8 | }
9 |
10 | return (
11 |
12 |
foo
13 | {count}
14 |
15 |
16 | );
17 | }
18 |
19 | function Bar() {
20 | console.log("bar rerun");
21 | const [count, setCount] = React.useState(0);
22 | function handleClickBar() {
23 | setCount((c) => c + 1);
24 | update();
25 | }
26 |
27 | return (
28 |
29 |
bar
30 | {count}
31 |
32 |
33 | );
34 | }
35 |
36 | function App() {
37 | console.log("app rerun");
38 | const [count, setCount] = React.useState(0);
39 | function handleClickApp() {
40 | setCount((c) => c + 1);
41 | }
42 |
43 | return (
44 |
45 | hi-mini-react count: {count}
46 |
47 |
48 |
49 |
50 | );
51 | }
52 |
53 | export default App;
54 |
--------------------------------------------------------------------------------
/App.jsx:
--------------------------------------------------------------------------------
1 | import React from "./core/React.js";
2 |
3 | // useEffect
4 | // 调用时机是在 React 完成对 DOM 的渲染之后,并且浏览器完成绘制之前。
5 | // cleanup 在调用 useEffect 之前进行调用, 当 deps 为空的时候不会调用返回的 cleanup
6 |
7 | function Foo() {
8 | console.log("re foo");
9 | const [count, setCount] = React.useState(10);
10 | const [bar, setBar] = React.useState("bar");
11 | function handleClick() {
12 | setCount((c) => c + 1);
13 | setBar(() => "bar");
14 | }
15 |
16 | React.useEffect(() => {
17 | console.log("init");
18 | return () => {
19 | console.log("cleanup 0");
20 | };
21 | }, []);
22 |
23 | React.useEffect(() => {
24 | console.log("update", count);
25 | // cleanup
26 | return () => {
27 | console.log("cleanup 1");
28 | };
29 | }, [count]);
30 |
31 | React.useEffect(() => {
32 | console.log("update", count);
33 | // cleanup
34 | return () => {
35 | console.log("cleanup 2");
36 | };
37 | }, [count]);
38 |
39 | // useEffect(() => {
40 | // console.log("update");
41 | // }, [count]);
42 |
43 | return (
44 |
45 |
foo
46 | {count}
47 |
{bar}
48 |
49 |
50 | );
51 | }
52 |
53 | function App() {
54 | return (
55 |
56 | hi-mini-react
57 |
58 |
59 | );
60 | }
61 |
62 | export default App;
63 |
--------------------------------------------------------------------------------
/public/vite.svg:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/One.jsx:
--------------------------------------------------------------------------------
1 | import React from "./core/React.js";
2 |
3 | function Foo() {
4 | const [count, setCount] = React.useState(10);
5 | const [bar, setBar] = React.useState("bar");
6 | function handleClick() {
7 | setCount((c) => c + 1);
8 | setBar((s) => s + 1);
9 | }
10 |
11 | return (
12 |
13 |
14 |
15 | count: {count}
16 |
17 | bar: {bar}
18 |
19 | );
20 | }
21 |
22 | function Bar() {
23 | const [count, setCount] = React.useState(10);
24 | function handleClick() {
25 | setCount((c) => c + 1);
26 | // setCount((c) => c + 1);
27 | }
28 |
29 | return (
30 |
31 |
32 | count: {count}
33 |
34 | );
35 | }
36 |
37 | function App() {
38 | const [count, setCount] = React.useState(10);
39 | const [attribute, setAttribute] = React.useState({ id: "app" });
40 | function handleClick() {
41 | setCount((c) => c + 1);
42 | // setAttribute(a => {
43 | // a.id += 1
44 | // return a
45 | // })
46 |
47 | setAttribute((o) => {
48 | return {
49 | ...o,
50 | id: o.id + 1,
51 | };
52 | });
53 | }
54 |
55 | return (
56 |
57 | hi-mini-react
58 |
59 | count: {count}
60 |
61 |
62 |
63 | );
64 | }
65 |
66 | export default App;
67 |
--------------------------------------------------------------------------------
/style.css:
--------------------------------------------------------------------------------
1 | :root {
2 | font-family: Inter, system-ui, Avenir, Helvetica, Arial, sans-serif;
3 | line-height: 1.5;
4 | font-weight: 400;
5 |
6 | color-scheme: light dark;
7 | color: rgba(255, 255, 255, 0.87);
8 | background-color: #242424;
9 |
10 | font-synthesis: none;
11 | text-rendering: optimizeLegibility;
12 | -webkit-font-smoothing: antialiased;
13 | -moz-osx-font-smoothing: grayscale;
14 | }
15 |
16 | a {
17 | font-weight: 500;
18 | color: #646cff;
19 | text-decoration: inherit;
20 | }
21 | a:hover {
22 | color: #535bf2;
23 | }
24 |
25 | body {
26 | margin: 0;
27 | display: flex;
28 | place-items: center;
29 | min-width: 320px;
30 | min-height: 100vh;
31 | }
32 |
33 | h1 {
34 | font-size: 3.2em;
35 | line-height: 1.1;
36 | }
37 |
38 | #app {
39 | max-width: 1280px;
40 | margin: 0 auto;
41 | padding: 2rem;
42 | text-align: center;
43 | }
44 |
45 | .logo {
46 | height: 6em;
47 | padding: 1.5em;
48 | will-change: filter;
49 | transition: filter 300ms;
50 | }
51 | .logo:hover {
52 | filter: drop-shadow(0 0 2em #646cffaa);
53 | }
54 | .logo.vanilla:hover {
55 | filter: drop-shadow(0 0 2em #f7df1eaa);
56 | }
57 |
58 | .card {
59 | padding: 2em;
60 | }
61 |
62 | .read-the-docs {
63 | color: #888;
64 | }
65 |
66 | button {
67 | border-radius: 8px;
68 | border: 1px solid transparent;
69 | padding: 0.6em 1.2em;
70 | font-size: 1em;
71 | font-weight: 500;
72 | font-family: inherit;
73 | background-color: #1a1a1a;
74 | cursor: pointer;
75 | transition: border-color 0.25s;
76 | }
77 | button:hover {
78 | border-color: #646cff;
79 | }
80 | button:focus,
81 | button:focus-visible {
82 | outline: 4px auto -webkit-focus-ring-color;
83 | }
84 |
85 | @media (prefers-color-scheme: light) {
86 | :root {
87 | color: #213547;
88 | background-color: #ffffff;
89 | }
90 | a:hover {
91 | color: #747bff;
92 | }
93 | button {
94 | background-color: #f9f9f9;
95 | }
96 | }
97 |
--------------------------------------------------------------------------------
/.gitignore:
--------------------------------------------------------------------------------
1 | # Logs
2 | logs
3 | *.log
4 | npm-debug.log*
5 | yarn-debug.log*
6 | yarn-error.log*
7 | lerna-debug.log*
8 | .pnpm-debug.log*
9 |
10 | # Diagnostic reports (https://nodejs.org/api/report.html)
11 | report.[0-9]*.[0-9]*.[0-9]*.[0-9]*.json
12 |
13 | # Runtime data
14 | pids
15 | *.pid
16 | *.seed
17 | *.pid.lock
18 |
19 | # Directory for instrumented libs generated by jscoverage/JSCover
20 | lib-cov
21 |
22 | # Coverage directory used by tools like istanbul
23 | coverage
24 | *.lcov
25 |
26 | # nyc test coverage
27 | .nyc_output
28 |
29 | # Grunt intermediate storage (https://gruntjs.com/creating-plugins#storing-task-files)
30 | .grunt
31 |
32 | # Bower dependency directory (https://bower.io/)
33 | bower_components
34 |
35 | # node-waf configuration
36 | .lock-wscript
37 |
38 | # Compiled binary addons (https://nodejs.org/api/addons.html)
39 | build/Release
40 |
41 | # Dependency directories
42 | node_modules/
43 | jspm_packages/
44 |
45 | # Snowpack dependency directory (https://snowpack.dev/)
46 | web_modules/
47 |
48 | # TypeScript cache
49 | *.tsbuildinfo
50 |
51 | # Optional npm cache directory
52 | .npm
53 |
54 | # Optional eslint cache
55 | .eslintcache
56 |
57 | # Optional stylelint cache
58 | .stylelintcache
59 |
60 | # Microbundle cache
61 | .rpt2_cache/
62 | .rts2_cache_cjs/
63 | .rts2_cache_es/
64 | .rts2_cache_umd/
65 |
66 | # Optional REPL history
67 | .node_repl_history
68 |
69 | # Output of 'npm pack'
70 | *.tgz
71 |
72 | # Yarn Integrity file
73 | .yarn-integrity
74 |
75 | # dotenv environment variable files
76 | .env
77 | .env.development.local
78 | .env.test.local
79 | .env.production.local
80 | .env.local
81 |
82 | # parcel-bundler cache (https://parceljs.org/)
83 | .cache
84 | .parcel-cache
85 |
86 | # Next.js build output
87 | .next
88 | out
89 |
90 | # Nuxt.js build / generate output
91 | .nuxt
92 | dist
93 |
94 | # Gatsby files
95 | .cache/
96 | # Comment in the public line in if your project uses Gatsby and not Next.js
97 | # https://nextjs.org/blog/next-9-1#public-directory-support
98 | # public
99 |
100 | # vuepress build output
101 | .vuepress/dist
102 |
103 | # vuepress v2.x temp and cache directory
104 | .temp
105 | .cache
106 |
107 | # Docusaurus cache and generated files
108 | .docusaurus
109 |
110 | # Serverless directories
111 | .serverless/
112 |
113 | # FuseBox cache
114 | .fusebox/
115 |
116 | # DynamoDB Local files
117 | .dynamodb/
118 |
119 | # TernJS port file
120 | .tern-port
121 |
122 | # Stores VSCode versions used for testing VSCode extensions
123 | .vscode-test
124 |
125 | # yarn v2
126 | .yarn/cache
127 | .yarn/unplugged
128 | .yarn/build-state.yml
129 | .yarn/install-state.gz
130 | .pnp.*
131 |
--------------------------------------------------------------------------------
/core/React.js:
--------------------------------------------------------------------------------
1 | function createTextNode(text) {
2 | return {
3 | type: "TEXT_ELEMENT",
4 | props: {
5 | nodeValue: text,
6 | children: [],
7 | },
8 | };
9 | }
10 |
11 | function createElement(type, props, ...children) {
12 | return {
13 | type,
14 | props: {
15 | ...props,
16 | children: children.map((child) => {
17 | // console.log(child, typeof child)
18 | const isTextNode =
19 | typeof child === "string" || typeof child === "number";
20 | return isTextNode ? createTextNode(child) : child;
21 | }),
22 | },
23 | };
24 | }
25 |
26 | function render(el, container) {
27 | wipRoot = {
28 | dom: container,
29 | props: {
30 | children: [el],
31 | },
32 | };
33 |
34 | nextWorkOfUnit = wipRoot;
35 | }
36 |
37 | let wipRoot = null;
38 | let currentRoot = null;
39 | let nextWorkOfUnit = null;
40 | let deletions = [];
41 | let wipFiber = null;
42 | function workLoop(deadline) {
43 | let shouldYield = false;
44 | while (!shouldYield && nextWorkOfUnit) {
45 | nextWorkOfUnit = performWorkOfUnit(nextWorkOfUnit);
46 |
47 | if (wipRoot?.sibling?.type === nextWorkOfUnit?.type) {
48 | nextWorkOfUnit = undefined;
49 | }
50 |
51 | shouldYield = deadline.timeRemaining() < 1;
52 | }
53 |
54 | if (!nextWorkOfUnit && wipRoot) {
55 | commitRoot();
56 | }
57 |
58 | requestIdleCallback(workLoop);
59 | }
60 |
61 | function commitRoot() {
62 | deletions.forEach(commitDeletion);
63 | commitWork(wipRoot.child);
64 | commitEffectHooks();
65 | currentRoot = wipRoot;
66 | wipRoot = null;
67 | deletions = [];
68 | }
69 |
70 | function commitEffectHooks() {
71 | function run(fiber) {
72 | if (!fiber) return;
73 |
74 | if (!fiber.alternate) {
75 | // init
76 | fiber.effectHooks?.forEach((hook) => {
77 | hook.cleanup = hook.callback();
78 | });
79 | } else {
80 | // update
81 | // deps 有没有发生改变
82 | fiber.effectHooks?.forEach((newHook, index) => {
83 | if (newHook.deps.length > 0) {
84 | const oldEffectHook = fiber.alternate?.effectHooks[index];
85 |
86 | // some
87 | const needUpdate = oldEffectHook?.deps.some((oldDep, i) => {
88 | return oldDep !== newHook.deps[i];
89 | });
90 |
91 | needUpdate && (newHook.cleanup = newHook.callback());
92 | }
93 | });
94 | }
95 |
96 | run(fiber.child);
97 | run(fiber.sibling);
98 | }
99 | function runCleanup(fiber) {
100 | if (!fiber) return;
101 |
102 | fiber.alternate?.effectHooks?.forEach((hook) => {
103 | if (hook.deps.length > 0) {
104 | hook.cleanup && hook.cleanup();
105 | }
106 | });
107 |
108 | runCleanup(fiber.child);
109 | runCleanup(fiber.sibling);
110 | }
111 |
112 | runCleanup(wipRoot);
113 | run(wipRoot);
114 | }
115 |
116 | function commitDeletion(fiber) {
117 | if (fiber.dom) {
118 | let fiberParent = fiber.parent;
119 | while (!fiberParent.dom) {
120 | fiberParent = fiberParent.parent;
121 | }
122 | fiberParent.dom.removeChild(fiber.dom);
123 | } else {
124 | commitDeletion(fiber.child);
125 | }
126 | }
127 |
128 | function commitWork(fiber) {
129 | if (!fiber) return;
130 |
131 | let fiberParent = fiber.parent;
132 | while (!fiberParent.dom) {
133 | fiberParent = fiberParent.parent;
134 | }
135 |
136 | if (fiber.effectTag === "update") {
137 | updateProps(fiber.dom, fiber.props, fiber.alternate?.props);
138 | } else if (fiber.effectTag === "placement") {
139 | if (fiber.dom) {
140 | fiberParent.dom.append(fiber.dom);
141 | }
142 | }
143 | commitWork(fiber.child);
144 | commitWork(fiber.sibling);
145 | }
146 |
147 | function createDom(type) {
148 | return type === "TEXT_ELEMENT"
149 | ? document.createTextNode("")
150 | : document.createElement(type);
151 | }
152 |
153 | let eventId = 1;
154 | function updateProps(dom, nextProps, prevProps) {
155 | // Object.keys(nextProps).forEach((key) => {
156 | // if (key !== "children") {
157 | // if (key.startsWith("on")) {
158 | // const eventType = key.slice(2).toLowerCase();
159 | // dom.addEventListener(eventType, nextProps[key]);
160 | // } else {
161 | // dom[key] = nextProps[key];
162 | // }
163 | // }
164 | // });
165 | // {id: "1"} {}
166 | // 1. old 有 new 没有 删除
167 | Object.keys(prevProps).forEach((key) => {
168 | if (key !== "children") {
169 | if (!(key in nextProps)) {
170 | dom.removeAttribute(key);
171 | }
172 | }
173 | });
174 | // 2. new 有 old 没有 添加
175 | // 3. new 有 old 有 修改
176 | Object.keys(nextProps).forEach((key) => {
177 | if (key !== "children") {
178 | if (nextProps[key] !== prevProps[key]) {
179 | if (key.startsWith("on")) {
180 | const eventType = key.slice(2).toLowerCase();
181 |
182 | if (prevProps[key] && prevProps[key].id) {
183 | console.log("prev eventId: ", prevProps[key].id);
184 | }
185 |
186 | dom.removeEventListener(eventType, prevProps[key]);
187 |
188 | if (!nextProps[key].id) {
189 | nextProps[key].id = eventId;
190 | console.log("current eventId: ", nextProps[key].id);
191 | eventId++;
192 | }
193 | dom.addEventListener(eventType, nextProps[key]);
194 | } else {
195 | dom[key] = nextProps[key];
196 | }
197 | }
198 | }
199 | });
200 | }
201 |
202 | function reconcileChildren(fiber, children) {
203 | let oldFiber = fiber.alternate?.child;
204 | let prevChild = null;
205 | children.forEach((child, index) => {
206 | // console.log(child)
207 | const isSameType = oldFiber && oldFiber.type === child.type;
208 | // console.log("isSameType", isSameType)
209 |
210 | let newFiber;
211 | if (isSameType) {
212 | // update
213 | newFiber = {
214 | type: child.type,
215 | props: child.props,
216 | child: null,
217 | parent: fiber,
218 | sibling: null,
219 | dom: oldFiber.dom,
220 | effectTag: "update",
221 | alternate: oldFiber,
222 | };
223 | } else {
224 | if (child) {
225 | newFiber = {
226 | type: child.type,
227 | props: child.props,
228 | child: null,
229 | parent: fiber,
230 | sibling: null,
231 | dom: null,
232 | effectTag: "placement",
233 | };
234 | }
235 |
236 | if (oldFiber) {
237 | deletions.push(oldFiber);
238 | }
239 | }
240 |
241 | if (oldFiber) {
242 | oldFiber = oldFiber.sibling;
243 | }
244 |
245 | if (index === 0) {
246 | fiber.child = newFiber;
247 | } else {
248 | prevChild.sibling = newFiber;
249 | }
250 |
251 | if (newFiber) {
252 | prevChild = newFiber;
253 | }
254 | });
255 |
256 | while (oldFiber) {
257 | deletions.push(oldFiber);
258 |
259 | oldFiber = oldFiber.sibling;
260 | }
261 | }
262 |
263 | function updateFunctionComponent(fiber) {
264 | stateHookIndex = 0;
265 | effectHooks = [];
266 | wipFiber = fiber;
267 |
268 | const children = [fiber.type(fiber.props)];
269 |
270 | reconcileChildren(fiber, children);
271 | }
272 |
273 | function updateHostComponent(fiber) {
274 | if (!fiber.dom) {
275 | const dom = (fiber.dom = createDom(fiber.type));
276 |
277 | updateProps(dom, fiber.props, {});
278 | }
279 |
280 | const children = fiber.props.children;
281 | reconcileChildren(fiber, children);
282 | }
283 |
284 | function performWorkOfUnit(fiber) {
285 | const isFunctionComponent = typeof fiber.type === "function";
286 |
287 | if (isFunctionComponent) {
288 | updateFunctionComponent(fiber);
289 | } else {
290 | updateHostComponent(fiber);
291 | }
292 |
293 | // 4. 返回下一个要执行的任务
294 | if (fiber.child) {
295 | return fiber.child;
296 | }
297 |
298 | let nextFiber = fiber;
299 | while (nextFiber) {
300 | if (nextFiber.sibling) return nextFiber.sibling;
301 | nextFiber = nextFiber.parent;
302 | }
303 | }
304 |
305 | requestIdleCallback(workLoop);
306 |
307 | function update() {
308 | let currentFiber = wipFiber;
309 |
310 | return () => {
311 | wipRoot = {
312 | ...currentFiber,
313 | alternate: currentFiber,
314 | };
315 |
316 | // wipRoot = {
317 | // dom: currentRoot.dom,
318 | // props: currentRoot.props,
319 | // alternate: currentRoot,
320 | // };
321 |
322 | nextWorkOfUnit = wipRoot;
323 | };
324 | }
325 |
326 | let stateHookIndex;
327 | function useState(initial) {
328 | let currentFiber = wipFiber;
329 | const oldHook = currentFiber.alternate?.stateHooks[stateHookIndex];
330 | const stateHook = {
331 | state: oldHook ? oldHook.state : initial,
332 | queue: oldHook ? oldHook.queue : [],
333 | };
334 |
335 | stateHook.queue.forEach((action) => {
336 | stateHook.state = action(stateHook.state);
337 | });
338 |
339 | stateHook.queue = [];
340 |
341 | if (!currentFiber.stateHooks) {
342 | currentFiber.stateHooks = [];
343 | }
344 |
345 | currentFiber.stateHooks[stateHookIndex] = stateHook
346 |
347 | stateHookIndex++;
348 |
349 |
350 | function setState(action) {
351 | console.log(stateHook.fiber);
352 | const eagerState =
353 | typeof action === "function" ? action(stateHook.state) : action;
354 |
355 | if (eagerState === stateHook.state) return;
356 |
357 | stateHook.queue.push(typeof action === "function" ? action : () => action);
358 |
359 | // wipRoot = {
360 | // ...stateHook.fiber,
361 | // alternate: stateHook.fiber
362 | // }
363 |
364 | // wipRoot = {
365 | // ...currentFiber,
366 | // alternate: currentFiber,
367 | // };
368 | wipRoot = currentFiber;
369 | wipRoot.alternate = currentFiber;
370 |
371 | // wipRoot = currentFiber;
372 | // wipRoot.alternate = currentFiber
373 |
374 | nextWorkOfUnit = wipRoot;
375 | }
376 |
377 | return [stateHook.state, setState];
378 | }
379 |
380 | let effectHooks;
381 | function useEffect(callback, deps) {
382 | const effectHook = {
383 | callback,
384 | deps,
385 | cleanup: undefined,
386 | };
387 | effectHooks.push(effectHook);
388 |
389 | wipFiber.effectHooks = effectHooks;
390 | }
391 |
392 | const React = {
393 | update,
394 | useEffect,
395 | useState,
396 | render,
397 | createElement,
398 | };
399 |
400 | export default React;
401 |
--------------------------------------------------------------------------------
/pnpm-lock.yaml:
--------------------------------------------------------------------------------
1 | lockfileVersion: '6.0'
2 |
3 | settings:
4 | autoInstallPeers: true
5 | excludeLinksFromLockfile: false
6 |
7 | devDependencies:
8 | vite:
9 | specifier: ^5.0.8
10 | version: registry.npmmirror.com/vite@5.0.11
11 |
12 | packages:
13 |
14 | registry.npmmirror.com/@esbuild/aix-ppc64@0.19.11:
15 | resolution: {integrity: sha512-FnzU0LyE3ySQk7UntJO4+qIiQgI7KoODnZg5xzXIrFJlKd2P2gwHsHY4927xj9y5PJmJSzULiUCWmv7iWnNa7g==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/@esbuild/aix-ppc64/-/aix-ppc64-0.19.11.tgz}
16 | name: '@esbuild/aix-ppc64'
17 | version: 0.19.11
18 | engines: {node: '>=12'}
19 | cpu: [ppc64]
20 | os: [aix]
21 | requiresBuild: true
22 | dev: true
23 | optional: true
24 |
25 | registry.npmmirror.com/@esbuild/android-arm64@0.19.11:
26 | resolution: {integrity: sha512-aiu7K/5JnLj//KOnOfEZ0D90obUkRzDMyqd/wNAUQ34m4YUPVhRZpnqKV9uqDGxT7cToSDnIHsGooyIczu9T+Q==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/@esbuild/android-arm64/-/android-arm64-0.19.11.tgz}
27 | name: '@esbuild/android-arm64'
28 | version: 0.19.11
29 | engines: {node: '>=12'}
30 | cpu: [arm64]
31 | os: [android]
32 | requiresBuild: true
33 | dev: true
34 | optional: true
35 |
36 | registry.npmmirror.com/@esbuild/android-arm@0.19.11:
37 | resolution: {integrity: sha512-5OVapq0ClabvKvQ58Bws8+wkLCV+Rxg7tUVbo9xu034Nm536QTII4YzhaFriQ7rMrorfnFKUsArD2lqKbFY4vw==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/@esbuild/android-arm/-/android-arm-0.19.11.tgz}
38 | name: '@esbuild/android-arm'
39 | version: 0.19.11
40 | engines: {node: '>=12'}
41 | cpu: [arm]
42 | os: [android]
43 | requiresBuild: true
44 | dev: true
45 | optional: true
46 |
47 | registry.npmmirror.com/@esbuild/android-x64@0.19.11:
48 | resolution: {integrity: sha512-eccxjlfGw43WYoY9QgB82SgGgDbibcqyDTlk3l3C0jOVHKxrjdc9CTwDUQd0vkvYg5um0OH+GpxYvp39r+IPOg==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/@esbuild/android-x64/-/android-x64-0.19.11.tgz}
49 | name: '@esbuild/android-x64'
50 | version: 0.19.11
51 | engines: {node: '>=12'}
52 | cpu: [x64]
53 | os: [android]
54 | requiresBuild: true
55 | dev: true
56 | optional: true
57 |
58 | registry.npmmirror.com/@esbuild/darwin-arm64@0.19.11:
59 | resolution: {integrity: sha512-ETp87DRWuSt9KdDVkqSoKoLFHYTrkyz2+65fj9nfXsaV3bMhTCjtQfw3y+um88vGRKRiF7erPrh/ZuIdLUIVxQ==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/@esbuild/darwin-arm64/-/darwin-arm64-0.19.11.tgz}
60 | name: '@esbuild/darwin-arm64'
61 | version: 0.19.11
62 | engines: {node: '>=12'}
63 | cpu: [arm64]
64 | os: [darwin]
65 | requiresBuild: true
66 | dev: true
67 | optional: true
68 |
69 | registry.npmmirror.com/@esbuild/darwin-x64@0.19.11:
70 | resolution: {integrity: sha512-fkFUiS6IUK9WYUO/+22omwetaSNl5/A8giXvQlcinLIjVkxwTLSktbF5f/kJMftM2MJp9+fXqZ5ezS7+SALp4g==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/@esbuild/darwin-x64/-/darwin-x64-0.19.11.tgz}
71 | name: '@esbuild/darwin-x64'
72 | version: 0.19.11
73 | engines: {node: '>=12'}
74 | cpu: [x64]
75 | os: [darwin]
76 | requiresBuild: true
77 | dev: true
78 | optional: true
79 |
80 | registry.npmmirror.com/@esbuild/freebsd-arm64@0.19.11:
81 | resolution: {integrity: sha512-lhoSp5K6bxKRNdXUtHoNc5HhbXVCS8V0iZmDvyWvYq9S5WSfTIHU2UGjcGt7UeS6iEYp9eeymIl5mJBn0yiuxA==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/@esbuild/freebsd-arm64/-/freebsd-arm64-0.19.11.tgz}
82 | name: '@esbuild/freebsd-arm64'
83 | version: 0.19.11
84 | engines: {node: '>=12'}
85 | cpu: [arm64]
86 | os: [freebsd]
87 | requiresBuild: true
88 | dev: true
89 | optional: true
90 |
91 | registry.npmmirror.com/@esbuild/freebsd-x64@0.19.11:
92 | resolution: {integrity: sha512-JkUqn44AffGXitVI6/AbQdoYAq0TEullFdqcMY/PCUZ36xJ9ZJRtQabzMA+Vi7r78+25ZIBosLTOKnUXBSi1Kw==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/@esbuild/freebsd-x64/-/freebsd-x64-0.19.11.tgz}
93 | name: '@esbuild/freebsd-x64'
94 | version: 0.19.11
95 | engines: {node: '>=12'}
96 | cpu: [x64]
97 | os: [freebsd]
98 | requiresBuild: true
99 | dev: true
100 | optional: true
101 |
102 | registry.npmmirror.com/@esbuild/linux-arm64@0.19.11:
103 | resolution: {integrity: sha512-LneLg3ypEeveBSMuoa0kwMpCGmpu8XQUh+mL8XXwoYZ6Be2qBnVtcDI5azSvh7vioMDhoJFZzp9GWp9IWpYoUg==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/@esbuild/linux-arm64/-/linux-arm64-0.19.11.tgz}
104 | name: '@esbuild/linux-arm64'
105 | version: 0.19.11
106 | engines: {node: '>=12'}
107 | cpu: [arm64]
108 | os: [linux]
109 | requiresBuild: true
110 | dev: true
111 | optional: true
112 |
113 | registry.npmmirror.com/@esbuild/linux-arm@0.19.11:
114 | resolution: {integrity: sha512-3CRkr9+vCV2XJbjwgzjPtO8T0SZUmRZla+UL1jw+XqHZPkPgZiyWvbDvl9rqAN8Zl7qJF0O/9ycMtjU67HN9/Q==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/@esbuild/linux-arm/-/linux-arm-0.19.11.tgz}
115 | name: '@esbuild/linux-arm'
116 | version: 0.19.11
117 | engines: {node: '>=12'}
118 | cpu: [arm]
119 | os: [linux]
120 | requiresBuild: true
121 | dev: true
122 | optional: true
123 |
124 | registry.npmmirror.com/@esbuild/linux-ia32@0.19.11:
125 | resolution: {integrity: sha512-caHy++CsD8Bgq2V5CodbJjFPEiDPq8JJmBdeyZ8GWVQMjRD0sU548nNdwPNvKjVpamYYVL40AORekgfIubwHoA==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/@esbuild/linux-ia32/-/linux-ia32-0.19.11.tgz}
126 | name: '@esbuild/linux-ia32'
127 | version: 0.19.11
128 | engines: {node: '>=12'}
129 | cpu: [ia32]
130 | os: [linux]
131 | requiresBuild: true
132 | dev: true
133 | optional: true
134 |
135 | registry.npmmirror.com/@esbuild/linux-loong64@0.19.11:
136 | resolution: {integrity: sha512-ppZSSLVpPrwHccvC6nQVZaSHlFsvCQyjnvirnVjbKSHuE5N24Yl8F3UwYUUR1UEPaFObGD2tSvVKbvR+uT1Nrg==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/@esbuild/linux-loong64/-/linux-loong64-0.19.11.tgz}
137 | name: '@esbuild/linux-loong64'
138 | version: 0.19.11
139 | engines: {node: '>=12'}
140 | cpu: [loong64]
141 | os: [linux]
142 | requiresBuild: true
143 | dev: true
144 | optional: true
145 |
146 | registry.npmmirror.com/@esbuild/linux-mips64el@0.19.11:
147 | resolution: {integrity: sha512-B5x9j0OgjG+v1dF2DkH34lr+7Gmv0kzX6/V0afF41FkPMMqaQ77pH7CrhWeR22aEeHKaeZVtZ6yFwlxOKPVFyg==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/@esbuild/linux-mips64el/-/linux-mips64el-0.19.11.tgz}
148 | name: '@esbuild/linux-mips64el'
149 | version: 0.19.11
150 | engines: {node: '>=12'}
151 | cpu: [mips64el]
152 | os: [linux]
153 | requiresBuild: true
154 | dev: true
155 | optional: true
156 |
157 | registry.npmmirror.com/@esbuild/linux-ppc64@0.19.11:
158 | resolution: {integrity: sha512-MHrZYLeCG8vXblMetWyttkdVRjQlQUb/oMgBNurVEnhj4YWOr4G5lmBfZjHYQHHN0g6yDmCAQRR8MUHldvvRDA==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/@esbuild/linux-ppc64/-/linux-ppc64-0.19.11.tgz}
159 | name: '@esbuild/linux-ppc64'
160 | version: 0.19.11
161 | engines: {node: '>=12'}
162 | cpu: [ppc64]
163 | os: [linux]
164 | requiresBuild: true
165 | dev: true
166 | optional: true
167 |
168 | registry.npmmirror.com/@esbuild/linux-riscv64@0.19.11:
169 | resolution: {integrity: sha512-f3DY++t94uVg141dozDu4CCUkYW+09rWtaWfnb3bqe4w5NqmZd6nPVBm+qbz7WaHZCoqXqHz5p6CM6qv3qnSSQ==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/@esbuild/linux-riscv64/-/linux-riscv64-0.19.11.tgz}
170 | name: '@esbuild/linux-riscv64'
171 | version: 0.19.11
172 | engines: {node: '>=12'}
173 | cpu: [riscv64]
174 | os: [linux]
175 | requiresBuild: true
176 | dev: true
177 | optional: true
178 |
179 | registry.npmmirror.com/@esbuild/linux-s390x@0.19.11:
180 | resolution: {integrity: sha512-A5xdUoyWJHMMlcSMcPGVLzYzpcY8QP1RtYzX5/bS4dvjBGVxdhuiYyFwp7z74ocV7WDc0n1harxmpq2ePOjI0Q==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/@esbuild/linux-s390x/-/linux-s390x-0.19.11.tgz}
181 | name: '@esbuild/linux-s390x'
182 | version: 0.19.11
183 | engines: {node: '>=12'}
184 | cpu: [s390x]
185 | os: [linux]
186 | requiresBuild: true
187 | dev: true
188 | optional: true
189 |
190 | registry.npmmirror.com/@esbuild/linux-x64@0.19.11:
191 | resolution: {integrity: sha512-grbyMlVCvJSfxFQUndw5mCtWs5LO1gUlwP4CDi4iJBbVpZcqLVT29FxgGuBJGSzyOxotFG4LoO5X+M1350zmPA==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/@esbuild/linux-x64/-/linux-x64-0.19.11.tgz}
192 | name: '@esbuild/linux-x64'
193 | version: 0.19.11
194 | engines: {node: '>=12'}
195 | cpu: [x64]
196 | os: [linux]
197 | requiresBuild: true
198 | dev: true
199 | optional: true
200 |
201 | registry.npmmirror.com/@esbuild/netbsd-x64@0.19.11:
202 | resolution: {integrity: sha512-13jvrQZJc3P230OhU8xgwUnDeuC/9egsjTkXN49b3GcS5BKvJqZn86aGM8W9pd14Kd+u7HuFBMVtrNGhh6fHEQ==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/@esbuild/netbsd-x64/-/netbsd-x64-0.19.11.tgz}
203 | name: '@esbuild/netbsd-x64'
204 | version: 0.19.11
205 | engines: {node: '>=12'}
206 | cpu: [x64]
207 | os: [netbsd]
208 | requiresBuild: true
209 | dev: true
210 | optional: true
211 |
212 | registry.npmmirror.com/@esbuild/openbsd-x64@0.19.11:
213 | resolution: {integrity: sha512-ysyOGZuTp6SNKPE11INDUeFVVQFrhcNDVUgSQVDzqsqX38DjhPEPATpid04LCoUr2WXhQTEZ8ct/EgJCUDpyNw==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/@esbuild/openbsd-x64/-/openbsd-x64-0.19.11.tgz}
214 | name: '@esbuild/openbsd-x64'
215 | version: 0.19.11
216 | engines: {node: '>=12'}
217 | cpu: [x64]
218 | os: [openbsd]
219 | requiresBuild: true
220 | dev: true
221 | optional: true
222 |
223 | registry.npmmirror.com/@esbuild/sunos-x64@0.19.11:
224 | resolution: {integrity: sha512-Hf+Sad9nVwvtxy4DXCZQqLpgmRTQqyFyhT3bZ4F2XlJCjxGmRFF0Shwn9rzhOYRB61w9VMXUkxlBy56dk9JJiQ==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/@esbuild/sunos-x64/-/sunos-x64-0.19.11.tgz}
225 | name: '@esbuild/sunos-x64'
226 | version: 0.19.11
227 | engines: {node: '>=12'}
228 | cpu: [x64]
229 | os: [sunos]
230 | requiresBuild: true
231 | dev: true
232 | optional: true
233 |
234 | registry.npmmirror.com/@esbuild/win32-arm64@0.19.11:
235 | resolution: {integrity: sha512-0P58Sbi0LctOMOQbpEOvOL44Ne0sqbS0XWHMvvrg6NE5jQ1xguCSSw9jQeUk2lfrXYsKDdOe6K+oZiwKPilYPQ==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/@esbuild/win32-arm64/-/win32-arm64-0.19.11.tgz}
236 | name: '@esbuild/win32-arm64'
237 | version: 0.19.11
238 | engines: {node: '>=12'}
239 | cpu: [arm64]
240 | os: [win32]
241 | requiresBuild: true
242 | dev: true
243 | optional: true
244 |
245 | registry.npmmirror.com/@esbuild/win32-ia32@0.19.11:
246 | resolution: {integrity: sha512-6YOrWS+sDJDmshdBIQU+Uoyh7pQKrdykdefC1avn76ss5c+RN6gut3LZA4E2cH5xUEp5/cA0+YxRaVtRAb0xBg==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/@esbuild/win32-ia32/-/win32-ia32-0.19.11.tgz}
247 | name: '@esbuild/win32-ia32'
248 | version: 0.19.11
249 | engines: {node: '>=12'}
250 | cpu: [ia32]
251 | os: [win32]
252 | requiresBuild: true
253 | dev: true
254 | optional: true
255 |
256 | registry.npmmirror.com/@esbuild/win32-x64@0.19.11:
257 | resolution: {integrity: sha512-vfkhltrjCAb603XaFhqhAF4LGDi2M4OrCRrFusyQ+iTLQ/o60QQXxc9cZC/FFpihBI9N1Grn6SMKVJ4KP7Fuiw==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/@esbuild/win32-x64/-/win32-x64-0.19.11.tgz}
258 | name: '@esbuild/win32-x64'
259 | version: 0.19.11
260 | engines: {node: '>=12'}
261 | cpu: [x64]
262 | os: [win32]
263 | requiresBuild: true
264 | dev: true
265 | optional: true
266 |
267 | registry.npmmirror.com/@rollup/rollup-android-arm-eabi@4.9.4:
268 | resolution: {integrity: sha512-ub/SN3yWqIv5CWiAZPHVS1DloyZsJbtXmX4HxUTIpS0BHm9pW5iYBo2mIZi+hE3AeiTzHz33blwSnhdUo+9NpA==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.9.4.tgz}
269 | name: '@rollup/rollup-android-arm-eabi'
270 | version: 4.9.4
271 | cpu: [arm]
272 | os: [android]
273 | requiresBuild: true
274 | dev: true
275 | optional: true
276 |
277 | registry.npmmirror.com/@rollup/rollup-android-arm64@4.9.4:
278 | resolution: {integrity: sha512-ehcBrOR5XTl0W0t2WxfTyHCR/3Cq2jfb+I4W+Ch8Y9b5G+vbAecVv0Fx/J1QKktOrgUYsIKxWAKgIpvw56IFNA==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.9.4.tgz}
279 | name: '@rollup/rollup-android-arm64'
280 | version: 4.9.4
281 | cpu: [arm64]
282 | os: [android]
283 | requiresBuild: true
284 | dev: true
285 | optional: true
286 |
287 | registry.npmmirror.com/@rollup/rollup-darwin-arm64@4.9.4:
288 | resolution: {integrity: sha512-1fzh1lWExwSTWy8vJPnNbNM02WZDS8AW3McEOb7wW+nPChLKf3WG2aG7fhaUmfX5FKw9zhsF5+MBwArGyNM7NA==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.9.4.tgz}
289 | name: '@rollup/rollup-darwin-arm64'
290 | version: 4.9.4
291 | cpu: [arm64]
292 | os: [darwin]
293 | requiresBuild: true
294 | dev: true
295 | optional: true
296 |
297 | registry.npmmirror.com/@rollup/rollup-darwin-x64@4.9.4:
298 | resolution: {integrity: sha512-Gc6cukkF38RcYQ6uPdiXi70JB0f29CwcQ7+r4QpfNpQFVHXRd0DfWFidoGxjSx1DwOETM97JPz1RXL5ISSB0pA==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.9.4.tgz}
299 | name: '@rollup/rollup-darwin-x64'
300 | version: 4.9.4
301 | cpu: [x64]
302 | os: [darwin]
303 | requiresBuild: true
304 | dev: true
305 | optional: true
306 |
307 | registry.npmmirror.com/@rollup/rollup-linux-arm-gnueabihf@4.9.4:
308 | resolution: {integrity: sha512-g21RTeFzoTl8GxosHbnQZ0/JkuFIB13C3T7Y0HtKzOXmoHhewLbVTFBQZu+z5m9STH6FZ7L/oPgU4Nm5ErN2fw==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.9.4.tgz}
309 | name: '@rollup/rollup-linux-arm-gnueabihf'
310 | version: 4.9.4
311 | cpu: [arm]
312 | os: [linux]
313 | requiresBuild: true
314 | dev: true
315 | optional: true
316 |
317 | registry.npmmirror.com/@rollup/rollup-linux-arm64-gnu@4.9.4:
318 | resolution: {integrity: sha512-TVYVWD/SYwWzGGnbfTkrNpdE4HON46orgMNHCivlXmlsSGQOx/OHHYiQcMIOx38/GWgwr/po2LBn7wypkWw/Mg==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.9.4.tgz}
319 | name: '@rollup/rollup-linux-arm64-gnu'
320 | version: 4.9.4
321 | cpu: [arm64]
322 | os: [linux]
323 | libc: [glibc]
324 | requiresBuild: true
325 | dev: true
326 | optional: true
327 |
328 | registry.npmmirror.com/@rollup/rollup-linux-arm64-musl@4.9.4:
329 | resolution: {integrity: sha512-XcKvuendwizYYhFxpvQ3xVpzje2HHImzg33wL9zvxtj77HvPStbSGI9czrdbfrf8DGMcNNReH9pVZv8qejAQ5A==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.9.4.tgz}
330 | name: '@rollup/rollup-linux-arm64-musl'
331 | version: 4.9.4
332 | cpu: [arm64]
333 | os: [linux]
334 | libc: [musl]
335 | requiresBuild: true
336 | dev: true
337 | optional: true
338 |
339 | registry.npmmirror.com/@rollup/rollup-linux-riscv64-gnu@4.9.4:
340 | resolution: {integrity: sha512-LFHS/8Q+I9YA0yVETyjonMJ3UA+DczeBd/MqNEzsGSTdNvSJa1OJZcSH8GiXLvcizgp9AlHs2walqRcqzjOi3A==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.9.4.tgz}
341 | name: '@rollup/rollup-linux-riscv64-gnu'
342 | version: 4.9.4
343 | cpu: [riscv64]
344 | os: [linux]
345 | libc: [glibc]
346 | requiresBuild: true
347 | dev: true
348 | optional: true
349 |
350 | registry.npmmirror.com/@rollup/rollup-linux-x64-gnu@4.9.4:
351 | resolution: {integrity: sha512-dIYgo+j1+yfy81i0YVU5KnQrIJZE8ERomx17ReU4GREjGtDW4X+nvkBak2xAUpyqLs4eleDSj3RrV72fQos7zw==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.9.4.tgz}
352 | name: '@rollup/rollup-linux-x64-gnu'
353 | version: 4.9.4
354 | cpu: [x64]
355 | os: [linux]
356 | libc: [glibc]
357 | requiresBuild: true
358 | dev: true
359 | optional: true
360 |
361 | registry.npmmirror.com/@rollup/rollup-linux-x64-musl@4.9.4:
362 | resolution: {integrity: sha512-RoaYxjdHQ5TPjaPrLsfKqR3pakMr3JGqZ+jZM0zP2IkDtsGa4CqYaWSfQmZVgFUCgLrTnzX+cnHS3nfl+kB6ZQ==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.9.4.tgz}
363 | name: '@rollup/rollup-linux-x64-musl'
364 | version: 4.9.4
365 | cpu: [x64]
366 | os: [linux]
367 | libc: [musl]
368 | requiresBuild: true
369 | dev: true
370 | optional: true
371 |
372 | registry.npmmirror.com/@rollup/rollup-win32-arm64-msvc@4.9.4:
373 | resolution: {integrity: sha512-T8Q3XHV+Jjf5e49B4EAaLKV74BbX7/qYBRQ8Wop/+TyyU0k+vSjiLVSHNWdVd1goMjZcbhDmYZUYW5RFqkBNHQ==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.9.4.tgz}
374 | name: '@rollup/rollup-win32-arm64-msvc'
375 | version: 4.9.4
376 | cpu: [arm64]
377 | os: [win32]
378 | requiresBuild: true
379 | dev: true
380 | optional: true
381 |
382 | registry.npmmirror.com/@rollup/rollup-win32-ia32-msvc@4.9.4:
383 | resolution: {integrity: sha512-z+JQ7JirDUHAsMecVydnBPWLwJjbppU+7LZjffGf+Jvrxq+dVjIE7By163Sc9DKc3ADSU50qPVw0KonBS+a+HQ==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.9.4.tgz}
384 | name: '@rollup/rollup-win32-ia32-msvc'
385 | version: 4.9.4
386 | cpu: [ia32]
387 | os: [win32]
388 | requiresBuild: true
389 | dev: true
390 | optional: true
391 |
392 | registry.npmmirror.com/@rollup/rollup-win32-x64-msvc@4.9.4:
393 | resolution: {integrity: sha512-LfdGXCV9rdEify1oxlN9eamvDSjv9md9ZVMAbNHA87xqIfFCxImxan9qZ8+Un54iK2nnqPlbnSi4R54ONtbWBw==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.9.4.tgz}
394 | name: '@rollup/rollup-win32-x64-msvc'
395 | version: 4.9.4
396 | cpu: [x64]
397 | os: [win32]
398 | requiresBuild: true
399 | dev: true
400 | optional: true
401 |
402 | registry.npmmirror.com/@types/estree@1.0.5:
403 | resolution: {integrity: sha512-/kYRxGDLWzHOB7q+wtSUQlFrtcdUccpfy+X+9iMBpHK8QLLhx2wIPYuS5DYtR9Wa/YlZAbIovy7qVdB1Aq6Lyw==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/@types/estree/-/estree-1.0.5.tgz}
404 | name: '@types/estree'
405 | version: 1.0.5
406 | dev: true
407 |
408 | registry.npmmirror.com/esbuild@0.19.11:
409 | resolution: {integrity: sha512-HJ96Hev2hX/6i5cDVwcqiJBBtuo9+FeIJOtZ9W1kA5M6AMJRHUZlpYZ1/SbEwtO0ioNAW8rUooVpC/WehY2SfA==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/esbuild/-/esbuild-0.19.11.tgz}
410 | name: esbuild
411 | version: 0.19.11
412 | engines: {node: '>=12'}
413 | hasBin: true
414 | requiresBuild: true
415 | optionalDependencies:
416 | '@esbuild/aix-ppc64': registry.npmmirror.com/@esbuild/aix-ppc64@0.19.11
417 | '@esbuild/android-arm': registry.npmmirror.com/@esbuild/android-arm@0.19.11
418 | '@esbuild/android-arm64': registry.npmmirror.com/@esbuild/android-arm64@0.19.11
419 | '@esbuild/android-x64': registry.npmmirror.com/@esbuild/android-x64@0.19.11
420 | '@esbuild/darwin-arm64': registry.npmmirror.com/@esbuild/darwin-arm64@0.19.11
421 | '@esbuild/darwin-x64': registry.npmmirror.com/@esbuild/darwin-x64@0.19.11
422 | '@esbuild/freebsd-arm64': registry.npmmirror.com/@esbuild/freebsd-arm64@0.19.11
423 | '@esbuild/freebsd-x64': registry.npmmirror.com/@esbuild/freebsd-x64@0.19.11
424 | '@esbuild/linux-arm': registry.npmmirror.com/@esbuild/linux-arm@0.19.11
425 | '@esbuild/linux-arm64': registry.npmmirror.com/@esbuild/linux-arm64@0.19.11
426 | '@esbuild/linux-ia32': registry.npmmirror.com/@esbuild/linux-ia32@0.19.11
427 | '@esbuild/linux-loong64': registry.npmmirror.com/@esbuild/linux-loong64@0.19.11
428 | '@esbuild/linux-mips64el': registry.npmmirror.com/@esbuild/linux-mips64el@0.19.11
429 | '@esbuild/linux-ppc64': registry.npmmirror.com/@esbuild/linux-ppc64@0.19.11
430 | '@esbuild/linux-riscv64': registry.npmmirror.com/@esbuild/linux-riscv64@0.19.11
431 | '@esbuild/linux-s390x': registry.npmmirror.com/@esbuild/linux-s390x@0.19.11
432 | '@esbuild/linux-x64': registry.npmmirror.com/@esbuild/linux-x64@0.19.11
433 | '@esbuild/netbsd-x64': registry.npmmirror.com/@esbuild/netbsd-x64@0.19.11
434 | '@esbuild/openbsd-x64': registry.npmmirror.com/@esbuild/openbsd-x64@0.19.11
435 | '@esbuild/sunos-x64': registry.npmmirror.com/@esbuild/sunos-x64@0.19.11
436 | '@esbuild/win32-arm64': registry.npmmirror.com/@esbuild/win32-arm64@0.19.11
437 | '@esbuild/win32-ia32': registry.npmmirror.com/@esbuild/win32-ia32@0.19.11
438 | '@esbuild/win32-x64': registry.npmmirror.com/@esbuild/win32-x64@0.19.11
439 | dev: true
440 |
441 | registry.npmmirror.com/fsevents@2.3.3:
442 | resolution: {integrity: sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/fsevents/-/fsevents-2.3.3.tgz}
443 | name: fsevents
444 | version: 2.3.3
445 | engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0}
446 | os: [darwin]
447 | requiresBuild: true
448 | dev: true
449 | optional: true
450 |
451 | registry.npmmirror.com/nanoid@3.3.7:
452 | resolution: {integrity: sha512-eSRppjcPIatRIMC1U6UngP8XFcz8MQWGQdt1MTBQ7NaAmvXDfvNxbvWV3x2y6CdEUciCSsDHDQZbhYaB8QEo2g==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/nanoid/-/nanoid-3.3.7.tgz}
453 | name: nanoid
454 | version: 3.3.7
455 | engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1}
456 | hasBin: true
457 | dev: true
458 |
459 | registry.npmmirror.com/picocolors@1.0.0:
460 | resolution: {integrity: sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/picocolors/-/picocolors-1.0.0.tgz}
461 | name: picocolors
462 | version: 1.0.0
463 | dev: true
464 |
465 | registry.npmmirror.com/postcss@8.4.33:
466 | resolution: {integrity: sha512-Kkpbhhdjw2qQs2O2DGX+8m5OVqEcbB9HRBvuYM9pgrjEFUg30A9LmXNlTAUj4S9kgtGyrMbTzVjH7E+s5Re2yg==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/postcss/-/postcss-8.4.33.tgz}
467 | name: postcss
468 | version: 8.4.33
469 | engines: {node: ^10 || ^12 || >=14}
470 | dependencies:
471 | nanoid: registry.npmmirror.com/nanoid@3.3.7
472 | picocolors: registry.npmmirror.com/picocolors@1.0.0
473 | source-map-js: registry.npmmirror.com/source-map-js@1.0.2
474 | dev: true
475 |
476 | registry.npmmirror.com/rollup@4.9.4:
477 | resolution: {integrity: sha512-2ztU7pY/lrQyXSCnnoU4ICjT/tCG9cdH3/G25ERqE3Lst6vl2BCM5hL2Nw+sslAvAf+ccKsAq1SkKQALyqhR7g==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/rollup/-/rollup-4.9.4.tgz}
478 | name: rollup
479 | version: 4.9.4
480 | engines: {node: '>=18.0.0', npm: '>=8.0.0'}
481 | hasBin: true
482 | dependencies:
483 | '@types/estree': registry.npmmirror.com/@types/estree@1.0.5
484 | optionalDependencies:
485 | '@rollup/rollup-android-arm-eabi': registry.npmmirror.com/@rollup/rollup-android-arm-eabi@4.9.4
486 | '@rollup/rollup-android-arm64': registry.npmmirror.com/@rollup/rollup-android-arm64@4.9.4
487 | '@rollup/rollup-darwin-arm64': registry.npmmirror.com/@rollup/rollup-darwin-arm64@4.9.4
488 | '@rollup/rollup-darwin-x64': registry.npmmirror.com/@rollup/rollup-darwin-x64@4.9.4
489 | '@rollup/rollup-linux-arm-gnueabihf': registry.npmmirror.com/@rollup/rollup-linux-arm-gnueabihf@4.9.4
490 | '@rollup/rollup-linux-arm64-gnu': registry.npmmirror.com/@rollup/rollup-linux-arm64-gnu@4.9.4
491 | '@rollup/rollup-linux-arm64-musl': registry.npmmirror.com/@rollup/rollup-linux-arm64-musl@4.9.4
492 | '@rollup/rollup-linux-riscv64-gnu': registry.npmmirror.com/@rollup/rollup-linux-riscv64-gnu@4.9.4
493 | '@rollup/rollup-linux-x64-gnu': registry.npmmirror.com/@rollup/rollup-linux-x64-gnu@4.9.4
494 | '@rollup/rollup-linux-x64-musl': registry.npmmirror.com/@rollup/rollup-linux-x64-musl@4.9.4
495 | '@rollup/rollup-win32-arm64-msvc': registry.npmmirror.com/@rollup/rollup-win32-arm64-msvc@4.9.4
496 | '@rollup/rollup-win32-ia32-msvc': registry.npmmirror.com/@rollup/rollup-win32-ia32-msvc@4.9.4
497 | '@rollup/rollup-win32-x64-msvc': registry.npmmirror.com/@rollup/rollup-win32-x64-msvc@4.9.4
498 | fsevents: registry.npmmirror.com/fsevents@2.3.3
499 | dev: true
500 |
501 | registry.npmmirror.com/source-map-js@1.0.2:
502 | 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}
503 | name: source-map-js
504 | version: 1.0.2
505 | engines: {node: '>=0.10.0'}
506 | dev: true
507 |
508 | registry.npmmirror.com/vite@5.0.11:
509 | resolution: {integrity: sha512-XBMnDjZcNAw/G1gEiskiM1v6yzM4GE5aMGvhWTlHAYYhxb7S3/V1s3m2LDHa8Vh6yIWYYB0iJwsEaS523c4oYA==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/vite/-/vite-5.0.11.tgz}
510 | name: vite
511 | version: 5.0.11
512 | engines: {node: ^18.0.0 || >=20.0.0}
513 | hasBin: true
514 | peerDependencies:
515 | '@types/node': ^18.0.0 || >=20.0.0
516 | less: '*'
517 | lightningcss: ^1.21.0
518 | sass: '*'
519 | stylus: '*'
520 | sugarss: '*'
521 | terser: ^5.4.0
522 | peerDependenciesMeta:
523 | '@types/node':
524 | optional: true
525 | less:
526 | optional: true
527 | lightningcss:
528 | optional: true
529 | sass:
530 | optional: true
531 | stylus:
532 | optional: true
533 | sugarss:
534 | optional: true
535 | terser:
536 | optional: true
537 | dependencies:
538 | esbuild: registry.npmmirror.com/esbuild@0.19.11
539 | postcss: registry.npmmirror.com/postcss@8.4.33
540 | rollup: registry.npmmirror.com/rollup@4.9.4
541 | optionalDependencies:
542 | fsevents: registry.npmmirror.com/fsevents@2.3.3
543 | dev: true
544 |
--------------------------------------------------------------------------------