diff --git a/.github/workflows/main.yml b/.github/workflows/main.yml deleted file mode 100644 index 51074a9..0000000 --- a/.github/workflows/main.yml +++ /dev/null @@ -1,23 +0,0 @@ -name: Github Pages -on: - push: - branches: - - master -jobs: - Deploy-Pages: - runs-on: ubuntu-18.04 - steps: - - name: Checkout - uses: actions/checkout@v2.3.4 - - - name: Install Deps - run: yarn install - - - name: Build App - run: yarn build - - - name: Deploy - uses: peaceiris/actions-gh-pages@v3 - with: - github_token: ${{ secrets.GITHUB_TOKEN }} - publish_dir: ./build diff --git a/.gitignore b/.gitignore deleted file mode 100644 index 4f49ce4..0000000 --- a/.gitignore +++ /dev/null @@ -1,5 +0,0 @@ -node_modules/ -package-lock.json -.vscode/ -lib/ -build \ No newline at end of file diff --git a/.nojekyll b/.nojekyll new file mode 100644 index 0000000..e69de29 diff --git a/LICENSE b/LICENSE deleted file mode 100644 index 06579ea..0000000 --- a/LICENSE +++ /dev/null @@ -1,21 +0,0 @@ -MIT License - -Copyright (c) 2019 saber2pr - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -SOFTWARE. diff --git a/README.md b/README.md deleted file mode 100644 index 5f12186..0000000 --- a/README.md +++ /dev/null @@ -1,129 +0,0 @@ -# @saber2pr/react - -> react in typescript. - -```bash -yarn add @saber2pr/react -``` - -## Examples - -1. CSR - -render Component to DOM in browser. - -```tsx -import React, { - useCallBack, - useMemo, - useReducer, - useRef, - useState -} from "@saber2pr/react" -import ReactDOM from "@saber2pr/react/lib/client" - -function HelloMessage({ name }: { name: string }) { - return
Hello {name}
-} - -ReactDOM.render( - , - document.getElementById("container") -) -``` - -[examples](https://saber2pr.top/react/) - -2. SSR - -render Component to string. - -```tsx -import React from "@saber2pr/react" -import ReactDOMServer from "@saber2pr/react/lib/server" - -const Content = ({ content }: { content: string }) => ( -
-
{content}
- -
-) - -const App = () => { - return ( -
-
This is a SSR Demo
- -
- ) -} - -console.log(ReactDOMServer.renderToString()) -``` - -3. Custom Render - -create a custom renderer. - -```tsx -import React from "@saber2pr/react" -import ReactFiberReconciler from "@saber2pr/react/lib/reconciler" - -// use your host config. -const Renderer = ReactFiberReconciler(HostConfig) - -const Store = { - state: 0 -} - -const TestCreateRenderer = () => { - const state = Store.state - return ( -
-
-
This is a UpdateContainer Test
-
{state}
- -
- ) -} - -// init render -Renderer.createContainer( - , - document.getElementById("container") -) -``` - ---- - -### Dev - -```bash -yarn install - -yarn start - -yarn dev -``` - -## License - -MIT - -> Author: saber2pr - -## Reference - -[facebook/react](https://github.com/facebook/react) - -> 项目仅用于理解和学习react原理,不可用于生产实践 - diff --git a/bundle.1624718178905.js b/bundle.1624718178905.js new file mode 100644 index 0000000..b8b5b25 --- /dev/null +++ b/bundle.1624718178905.js @@ -0,0 +1 @@ +var react=function(e){"use strict";var C="undefined"!=typeof globalThis?globalThis:"undefined"!=typeof window?window:"undefined"!=typeof global?global:"undefined"!=typeof self?self:{};function t(e){return e&&e.__esModule&&Object.prototype.hasOwnProperty.call(e,"default")?e.default:e}function n(e,t){return e(t={exports:{}},t.exports),t.exports}var O=n(function(e,t){var n,r,a,l;Object.defineProperty(t,"__esModule",{value:!0}),(r=n=n||{}).Text=Symbol("Text"),r.Fragment=Symbol("DocumentFragment"),r.Root=Symbol("Container"),r.Hook=Symbol("Hook"),r.Host=Symbol("Host"),r.Unknown=Symbol("Unknown"),t.NodeType=n,(l=a=a||{}).Place=Symbol("Place"),l.Update=Symbol("Update"),l.Delete=Symbol("Delete"),l.Create=Symbol("Create"),l.getEffectLevel=function(e){switch(e){case l.Create:return 4;case l.Update:return 3;case l.Place:return 2;case l.Delete:return 1;default:return 0}},t.EffectType=a});t(O);O.NodeType,O.EffectType;var f=n(function(e,t){var n,r;Object.defineProperty(t,"__esModule",{value:!0}),n=t.Reflection||(t.Reflection={}),r=new WeakMap,n.setInternalFiber=function(e){var t=e.tag;r.set(t,e)},n.getInternalFiber=function(e){var t=e.tag;return r.get(t)},n.setContainerFiber=function(e){var t=e.stateNode;r.set(t,e)},n.getContainerFiber=function(e){var t=e.stateNode;return r.get(t)},n.hasContainerFiber=function(e){return r.has(e)}});t(f);f.Reflection;var P=n(function(e,t){Object.defineProperty(t,"__esModule",{value:!0});function n(e){return{tag:"#text",$$typeof:O.NodeType.Text,props:{nodeValue:e}}}function r(e){var t;return(t=Array.prototype).concat.apply(t,e)}var a;(a||(a={})).toArray=function(){for(var e=[],t=0;tr)throw new Error("STACK SIZE OVERFLOW: "+t+", try to reset the MAX_STACK_SIZE("+r+");\n method: React.Stack.setMaxStackSize()");u&&u.forEach(function(e){return e({id:t,size:n[t]},n)})};t.TestStackSize=o});t(M);M.setMaxStackSize,M.resetStackSize,M.resetStack,M.watchStackSize,M.TestStackSize;var c=n(function(e,t){var d=C&&C.__assign||function(){return(d=Object.assign||function(e){for(var t,n=1,r=arguments.length;n\n from dangerouslySetInnerHTML\n "}}))}});t(N);N.TestSetInnerHTML;var D=n(function(e,t){var n=C&&C.__importStar||function(e){if(e&&e.__esModule)return e;var t={};if(null!=e)for(var n in e)Object.hasOwnProperty.call(e,n)&&(t[n]=e[n]);return t.default=e,t};Object.defineProperty(t,"__esModule",{value:!0});function r(){var e=a.useState(0),t=e[0],n=e[1];return a.default.createElement(a.default.Fragment,null,a.default.createElement("p",null,"in fragment1"),a.default.createElement("p",null,"in fragment2"),a.default.createElement(a.default.Fragment,null,a.default.createElement("div",null,"fragment in fragment"),t,a.default.createElement("button",{onclick:function(){return n(t+1)}},"add")))}var a=n(p);t.TestFragment=function(){return a.default.createElement("div",null,a.default.createElement("div",null,"TestFragment Demo"),a.default.createElement("div",null,a.default.createElement(r,null)))}});t(D);D.TestFragment;var L=n(function(e,t){var n=C&&C.__importStar||function(e){if(e&&e.__esModule)return e;var t={};if(null!=e)for(var n in e)Object.hasOwnProperty.call(e,n)&&(t[n]=e[n]);return t.default=e,t};Object.defineProperty(t,"__esModule",{value:!0});function r(){a.useEffect(function(){return l.push("A"),console.log("mount",l),function(){l.pop(),console.log("unmount",l)}});var e=a.useState(0),t=e[0],n=e[1];return a.default.createElement("div",null,a.default.createElement("p",null,"I'm a subscriber"),t,a.default.createElement("button",{onclick:function(){return n(t+1)}},"update hook"))}var a=n(p),l=[];t.TestUseEffect=function(){var e=a.useState(!0),t=e[0],n=e[1];return a.useEffect(function(){return console.log("willUpdate"),function(){console.log("didupdate")}}),a.default.createElement("div",null,a.default.createElement("div",null,"TestUseEffect Demo"),a.default.createElement("div",null,t?a.default.createElement(r,null):a.default.createElement("div",null,a.default.createElement("div",null,"cleaned"),a.default.createElement("p",null,"cleaned2"))),a.default.createElement("button",{onclick:function(){return n(!t)}},"place hook by host"))}});t(L);L.TestUseEffect;var U=n(function(e,t){var n=C&&C.__importStar||function(e){if(e&&e.__esModule)return e;var t={};if(null!=e)for(var n in e)Object.hasOwnProperty.call(e,n)&&(t[n]=e[n]);return t.default=e,t};Object.defineProperty(t,"__esModule",{value:!0});var r=n(p),a=r.forwardRef(function(e,t){var n=r.useRef();return r.useImperativeHandle(t,function(){return{focus:function(){console.log("input focus!"),n.current.focus()}}}),r.default.createElement("input",{type:"text",ref:n})});t.TestForwardRef=function(){var e=r.useRef();return r.default.createElement("div",null,r.default.createElement("div",null,"TestForwardRef Demo"),r.default.createElement("div",null,r.default.createElement(a,{ref:e})),r.default.createElement("button",{onclick:function(){return e.current.focus()}},"focus the input"))}});t(U);U.TestForwardRef;var $=n(function(e,t){var n=C&&C.__importDefault||function(e){return e&&e.__esModule?e:{default:e}};Object.defineProperty(t,"__esModule",{value:!0});function r(e){var t=e.children;return l.default.createElement(u.Provider,{value:{name:"qwq"}},t)}function a(){return l.default.createElement(u.Consumer,null,function(e){var t=e.name;return l.default.createElement("p",null,t)})}var l=n(p),u=l.default.createContext({name:""});t.TestContext=function(){return l.default.createElement("div",null,l.default.createElement("div",null,"TestContext Demo"),l.default.createElement("div",null,l.default.createElement(r,null,l.default.createElement("div",null,l.default.createElement(a,null)))))}});t($);$.TestContext;var A=n(function(e,t){var n=C&&C.__awaiter||function(e,u,o,c){return new(o=o||Promise)(function(n,t){function r(e){try{l(c.next(e))}catch(e){t(e)}}function a(e){try{l(c.throw(e))}catch(e){t(e)}}function l(e){var t;e.done?n(e.value):((t=e.value)instanceof o?t:new o(function(e){e(t)})).then(r,a)}l((c=c.apply(e,u||[])).next())})},r=C&&C.__generator||function(n,r){var a,l,u,e,o={label:0,sent:function(){if(1&u[0])throw u[1];return u[1]},trys:[],ops:[]};return e={next:t(0),throw:t(1),return:t(2)},"function"==typeof Symbol&&(e[Symbol.iterator]=function(){return this}),e;function t(t){return function(e){return function(t){if(a)throw new TypeError("Generator is already executing.");for(;o;)try{if(a=1,l&&(u=2&t[0]?l.return:t[0]?l.throw||((u=l.return)&&u.call(l),0):l.next)&&!(u=u.call(l,t[1])).done)return u;switch(l=0,u&&(t=[2&t[0],u.value]),t[0]){case 0:case 1:u=t;break;case 4:return o.label++,{value:t[1],done:!1};case 5:o.label++,l=t[1],t=[0];continue;case 7:t=o.ops.pop(),o.trys.pop();continue;default:if(!(u=0<(u=o.trys).length&&u[u.length-1])&&(6===t[0]||2===t[0])){o=0;continue}if(3===t[0]&&(!u||t[1]>u[0]&&t[1] + + + @saber2pr/react + + +
+ + + \ No newline at end of file diff --git a/package.json b/package.json deleted file mode 100644 index ad9b251..0000000 --- a/package.json +++ /dev/null @@ -1,39 +0,0 @@ -{ - "name": "@saber2pr/react", - "version": "0.3.3", - "description": "react in Typescript.", - "repository": { - "type": "git", - "url": "git+https://github.com/Saber2pr/react.git" - }, - "author": "saber2pr", - "license": "MIT", - "files": [ - "lib/core/*", - "lib/index.*", - "lib/client.*", - "lib/server.*", - "lib/reconciler.*" - ], - "main": "./lib/index.js", - "scripts": { - "start": "tsc --watch", - "dev": "rollup -c --watch", - "test": "node ./lib/__test__/TestSSR", - "build": "tsc && cross-env NODE_ENV=production rollup -c" - }, - "keywords": [ - "react-like", - "react-hooks", - "typescript" - ], - "devDependencies": { - "@rollup/plugin-html": "^0.2.3", - "cross-env": "^7.0.3", - "rollup": "^1.27.8", - "rollup-plugin-commonjs": "^9.2.0", - "rollup-plugin-node-resolve": "^5.2.0", - "rollup-plugin-uglify": "^6.0.3", - "typescript": "^3.4.3" - } -} \ No newline at end of file diff --git a/rollup.config.js b/rollup.config.js deleted file mode 100644 index 09eb868..0000000 --- a/rollup.config.js +++ /dev/null @@ -1,40 +0,0 @@ -import resolve from "rollup-plugin-node-resolve" -import commonjs from "rollup-plugin-commonjs" -import { uglify } from "rollup-plugin-uglify" -import html from '@rollup/plugin-html' - -const cdn = '//cdn.jsdelivr.net/gh' -const username = 'saber2pr' -const repo = 'react' -const pages_branch = 'gh-pages' - -const publicPath = process.env.NODE_ENV === 'production' - ? `${cdn}/${username}/${repo}@${pages_branch}/` - : './' - -const fileName = `bundle.${Date.now()}.js` - -export default { - input: "./lib/__test__/Test.js", - output: { - file: `./build/${fileName}`, - format: "iife", - name: "react", - exports: "named" - }, - watch: { - include: "lib/**" - }, - plugins: [commonjs(), resolve(), uglify(), html({ - template: () => ` - - - @saber2pr/react - - -
- - - ` - })] -} diff --git a/src/__test__/Test.tsx b/src/__test__/Test.tsx deleted file mode 100644 index 06388b3..0000000 --- a/src/__test__/Test.tsx +++ /dev/null @@ -1,117 +0,0 @@ -/* - * @Author: saber2pr - * @Date: 2019-12-06 17:41:19 - * @Last Modified by: saber2pr - * @Last Modified time: 2019-12-13 16:38:54 - */ -import React, { useState, useEffect, useRef } from ".." -import ReactDOM from "../client" -import { TestIf } from "./TestIF" -import { TestList } from "./TestList" -import { TestPlace } from "./TestPlace" -import { TestUseMemo } from "./TestUseMemo" -import { TestUseReducer } from "./TestUseReducer" -import { TestChildren } from "./TestChildren" -import { TestStyle } from "./TestStyle" -import "./TestCreateRenderer" -import { TestSetInnerHTML } from "./TestSetInnerHTML" -import { TestFragment } from "./TestFragment" -import { TestUseEffect } from "./TestUseEffect" -import { TestForwardRef } from "./TestForwardRef" -import { TestContext } from "./TestContext" -import { TestLazy } from "./TestLazy" -import { TestMemo } from "./TestMemo" - -const Store = { - state: 0 -} - -const TestRerenderRoot = () => { - const state = Store.state - return ( -
-
This is a RerenderRoot Test
-
{state}
- -
- ) -} - -const Tests = [ - TestRerenderRoot, - TestIf, - TestList, - TestPlace, - TestUseMemo, - TestUseReducer, - TestChildren, - TestStyle, - TestSetInnerHTML, - TestFragment, - TestUseEffect, - TestForwardRef, - TestContext, - TestLazy, - TestMemo -] - -const App = () => { - const [state, setState] = useState(false) - useWatchStack(state) - return ( -
-
-

React Features Tests

-
-
-
- performance analysis: - setState(event.target["checked"])} - /> -
-
-
    - {Tests.map((Test, i) => ( -
  1. - {i !== 0 &&
    } - -
  2. - ))} -
-
-
- -
- ) -} - -// if need analysis the performance. -const useWatchStack = (shouldWatchStack = false) => { - const cancel = useRef() - useEffect(() => { - if (shouldWatchStack) { - cancel.current = React.Stack.watchStackSize(console.log) - } else { - if (cancel.current) { - cancel.current() - cancel.current = null - } - } - }, [shouldWatchStack]) -} - -// open '../../index.html' in browser. -ReactDOM.render(, document.getElementById("root")) diff --git a/src/__test__/TestChildren.tsx b/src/__test__/TestChildren.tsx deleted file mode 100644 index c8f434f..0000000 --- a/src/__test__/TestChildren.tsx +++ /dev/null @@ -1,38 +0,0 @@ -/* - * @Author: saber2pr - * @Date: 2019-12-06 17:32:18 - * @Last Modified by: saber2pr - * @Last Modified time: 2019-12-07 23:29:26 - */ -import React from ".." - -const ListFromProps = ({ list }: { list: number[] }) => ( -
    - {list.map(l => ( -
  • {l}
  • - ))} -
-) - -const ListFromChildren = ({ children }: { children: number[] }) => ( -
    - {children.map(l => ( -
  • {l}
  • - ))} -
-) - -const UseChildren = ({ children }: React.Props) => { - return
{children}
-} - -export const TestChildren = () => { - return ( -
-
TestChildren
- - {[4, 5, 6]} - this is a single string child -
- ) -} diff --git a/src/__test__/TestContext.tsx b/src/__test__/TestContext.tsx deleted file mode 100644 index 35a8455..0000000 --- a/src/__test__/TestContext.tsx +++ /dev/null @@ -1,40 +0,0 @@ -/* - * @Author: saber2pr - * @Date: 2019-12-10 20:27:38 - * @Last Modified by: saber2pr - * @Last Modified time: 2019-12-10 20:37:35 - */ -import React from ".." - -const Context = React.createContext({ name: "" }) - -const Parent = ({ children }: { children: JSX.Element }) => { - return {children} -} - -const Child = () => { - return ( - - {({ name }) => { - return

{name}

- }} -
- ) -} - -const TestContext = () => { - return ( -
-
TestContext Demo
-
- -
- -
-
-
-
- ) -} - -export { TestContext } diff --git a/src/__test__/TestCreateRenderer.tsx b/src/__test__/TestCreateRenderer.tsx deleted file mode 100644 index 7c25805..0000000 --- a/src/__test__/TestCreateRenderer.tsx +++ /dev/null @@ -1,44 +0,0 @@ -/* - * @Author: saber2pr - * @Date: 2019-12-06 20:38:27 - * @Last Modified by: saber2pr - * @Last Modified time: 2019-12-13 12:57:50 - */ -import React from ".." -import ReactFiberReconciler from "../reconciler" -import { HostConfig } from "../client" - -// use your host config. -const Renderer = ReactFiberReconciler(HostConfig) - -const Store = { - state: 0 -} - -const TestCreateRenderer = () => { - const state = Store.state - return ( -
-
-
This is a UpdateContainer Test
-
{state}
- -
- ) -} - -const container = document.createElement("div") -document.body.append(container) - -// init render -Renderer.createContainer(, container) diff --git a/src/__test__/TestForwardRef.tsx b/src/__test__/TestForwardRef.tsx deleted file mode 100644 index d08a692..0000000 --- a/src/__test__/TestForwardRef.tsx +++ /dev/null @@ -1,33 +0,0 @@ -/* - * @Author: saber2pr - * @Date: 2019-12-10 17:13:15 - * @Last Modified by: saber2pr - * @Last Modified time: 2019-12-10 17:59:23 - */ -import React, { useRef, forwardRef, useImperativeHandle } from ".." - -const Input = forwardRef<{ focus: Function }>(({}, ref) => { - const input_ref = useRef() - - useImperativeHandle(ref, () => ({ - focus: () => { - console.log("input focus!") - input_ref.current.focus() - } - })) - - return -}) - -export const TestForwardRef = () => { - const ref = useRef() - return ( -
-
TestForwardRef Demo
-
- -
- -
- ) -} diff --git a/src/__test__/TestFragment.tsx b/src/__test__/TestFragment.tsx deleted file mode 100644 index 544abec..0000000 --- a/src/__test__/TestFragment.tsx +++ /dev/null @@ -1,33 +0,0 @@ -/* - * @Author: saber2pr - * @Date: 2019-12-08 11:09:47 - * @Last Modified by: saber2pr - * @Last Modified time: 2019-12-08 11:24:14 - */ -import React, { useState } from ".." - -const Content = () => { - const [state, setState] = useState(0) - return ( - <> -

in fragment1

-

in fragment2

- <> -
fragment in fragment
- {state} - - - - ) -} - -export const TestFragment = () => { - return ( -
-
TestFragment Demo
-
- -
-
- ) -} diff --git a/src/__test__/TestIF.tsx b/src/__test__/TestIF.tsx deleted file mode 100644 index d584e84..0000000 --- a/src/__test__/TestIF.tsx +++ /dev/null @@ -1,27 +0,0 @@ -/* - * @Author: saber2pr - * @Date: 2019-12-06 15:28:47 - * @Last Modified by: saber2pr - * @Last Modified time: 2019-12-06 17:28:45 - */ -import React, { useCallBack, useState } from ".." - -export const TestIf = () => { - const [isShow, setState] = useState(true) - const clickWithDeps = useCallBack(() => setState(!isShow), [isShow]) - const clickWithNullDes = useCallBack(() => setState(!isShow), []) - return ( -
-
TestIf Demo
- {isShow && ( -
    -
  1. apple
  2. -
  3. banana
  4. -
  5. orange
  6. -
- )} - - -
- ) -} diff --git a/src/__test__/TestLazy.tsx b/src/__test__/TestLazy.tsx deleted file mode 100644 index 4d06be8..0000000 --- a/src/__test__/TestLazy.tsx +++ /dev/null @@ -1,45 +0,0 @@ -/* - * @Author: saber2pr - * @Date: 2019-12-11 16:22:14 - * @Last Modified by: saber2pr - * @Last Modified time: 2019-12-11 16:22:14 - */ -import React, { Suspense, lazy, useState } from ".." - -const timeout = (delta = 1000) => - new Promise(resolve => setTimeout(resolve, delta)) - -const Content = lazy(async () => { - await timeout(2000) - console.log("lazy-component loaded.") - return { - default: () => ( -
-

lazy content

-
- ) - } -}) - -const TestLazy = () => { - const [state, setState] = useState(true) - return ( -
-
TestLazy Demo
-
- {state ? ( - loading...

}> - -
- ) : ( -

lazy is unmount

- )} -
- -
- ) -} - -export { TestLazy } diff --git a/src/__test__/TestList.tsx b/src/__test__/TestList.tsx deleted file mode 100644 index 672b060..0000000 --- a/src/__test__/TestList.tsx +++ /dev/null @@ -1,24 +0,0 @@ -/* - * @Author: saber2pr - * @Date: 2019-12-06 15:28:50 - * @Last Modified by: saber2pr - * @Last Modified time: 2019-12-06 16:29:05 - */ -import React, { useState } from ".." - -export const TestList = () => { - const [list, setList] = useState([1, 2, 3]) - return ( -
-
TestList Demo
-
    - {list.map(l => ( -
  • {l}
  • - ))} -
- - - -
- ) -} diff --git a/src/__test__/TestMemo.tsx b/src/__test__/TestMemo.tsx deleted file mode 100644 index 93fabc5..0000000 --- a/src/__test__/TestMemo.tsx +++ /dev/null @@ -1,39 +0,0 @@ -/* - * @Author: saber2pr - * @Date: 2019-12-13 16:38:42 - * @Last Modified by: saber2pr - * @Last Modified time: 2019-12-13 16:55:19 - */ -import React, { useEffect, useState } from ".." - -const Content = React.memo(({ content }: { content: string }) => { - useEffect(() => { - console.log("memo") - }) - return
{content}
-}) - -const useForceUpdate = () => { - const [tick, setTick] = useState(0) - return () => setTick(tick + 1) -} - -const TestMemo = () => { - const [text, setText] = useState("awsl") - const forceUpdate = useForceUpdate() - return ( -
-
TestMemo Demo
-
- -
-
- - -
- -
- ) -} - -export { TestMemo } diff --git a/src/__test__/TestPlace.tsx b/src/__test__/TestPlace.tsx deleted file mode 100644 index 29b1da3..0000000 --- a/src/__test__/TestPlace.tsx +++ /dev/null @@ -1,41 +0,0 @@ -/* - * @Author: saber2pr - * @Date: 2019-12-06 15:28:44 - * @Last Modified by: saber2pr - * @Last Modified time: 2019-12-06 16:41:58 - */ -import React, { useState, useRef } from ".." - -export const TestPlace = () => { - const [state, setState] = useState(

to be placed

) - const flag = useRef(true) - const ref = useRef() - return ( -
-
TestPlace Demo
- {state} - - -
- ) -} diff --git a/src/__test__/TestSSR.tsx b/src/__test__/TestSSR.tsx deleted file mode 100644 index b555882..0000000 --- a/src/__test__/TestSSR.tsx +++ /dev/null @@ -1,31 +0,0 @@ -/* - * @Author: saber2pr - * @Date: 2019-12-07 23:12:18 - * @Last Modified by: saber2pr - * @Last Modified time: 2019-12-08 11:46:08 - */ -import React from ".." -import ReactDOMServer from "../server" - -const Content = ({ content }: { content: string }) => ( -
-
{content}
- <> -

fragment1

-

fragment2

- - -
-) - -const App = () => { - return ( -
-
This is a SSR Demo
- -
- ) -} - -// run script: `yarn test`, then output the HTMLString -console.log(ReactDOMServer.renderToString()) diff --git a/src/__test__/TestSetInnerHTML.tsx b/src/__test__/TestSetInnerHTML.tsx deleted file mode 100644 index 22a169e..0000000 --- a/src/__test__/TestSetInnerHTML.tsx +++ /dev/null @@ -1,22 +0,0 @@ -/* - * @Author: saber2pr - * @Date: 2019-12-07 23:12:34 - * @Last Modified by: saber2pr - * @Last Modified time: 2019-12-07 23:12:34 - */ -import React from ".." - -export const TestSetInnerHTML = () => { - return ( -
-
TestSetInnerHTML Demo
-
- from dangerouslySetInnerHTML -
` - }} - /> -
- ) -} diff --git a/src/__test__/TestStyle.tsx b/src/__test__/TestStyle.tsx deleted file mode 100644 index 25bbc53..0000000 --- a/src/__test__/TestStyle.tsx +++ /dev/null @@ -1,18 +0,0 @@ -/* - * @Author: saber2pr - * @Date: 2019-12-06 19:52:53 - * @Last Modified by: saber2pr - * @Last Modified time: 2019-12-07 22:43:24 - */ -import React, { useState } from ".." - -export const TestStyle = () => { - const [state, setState] = useState("red") - return ( -
-
TestStyle Demo
-
what color it is now?
- -
- ) -} diff --git a/src/__test__/TestUseCallback.ts b/src/__test__/TestUseCallback.ts deleted file mode 100644 index 8e0ab8e..0000000 --- a/src/__test__/TestUseCallback.ts +++ /dev/null @@ -1,9 +0,0 @@ -/* - * @Author: saber2pr - * @Date: 2019-12-06 15:28:54 - * @Last Modified by: saber2pr - * @Last Modified time: 2019-12-06 16:02:38 - */ -import { TestIf } from "./TestIF" - -export const TestUseCallback = TestIf diff --git a/src/__test__/TestUseEffect.tsx b/src/__test__/TestUseEffect.tsx deleted file mode 100644 index 889a021..0000000 --- a/src/__test__/TestUseEffect.tsx +++ /dev/null @@ -1,55 +0,0 @@ -/* - * @Author: saber2pr - * @Date: 2019-12-09 16:16:29 - * @Last Modified by: saber2pr - * @Last Modified time: 2019-12-09 16:43:52 - */ -import React, { useEffect, useState } from ".." - -const listeners = [] - -const Subscription = () => { - useEffect(() => { - listeners.push("A") - console.log("mount", listeners) - return () => { - listeners.pop() - console.log("unmount", listeners) - } - }) - const [state, setState] = useState(0) - - return ( -
-

I'm a subscriber

- {state} - -
- ) -} - -export const TestUseEffect = () => { - const [state, setState] = useState(true) - useEffect(() => { - console.log("willUpdate") - return () => { - console.log("didupdate") - } - }) - return ( -
-
TestUseEffect Demo
-
- {state ? ( - - ) : ( -
-
cleaned
-

cleaned2

-
- )} -
- -
- ) -} diff --git a/src/__test__/TestUseMemo.tsx b/src/__test__/TestUseMemo.tsx deleted file mode 100644 index 2313e0b..0000000 --- a/src/__test__/TestUseMemo.tsx +++ /dev/null @@ -1,33 +0,0 @@ -/* - * @Author: saber2pr - * @Date: 2019-12-06 15:39:28 - * @Last Modified by: saber2pr - * @Last Modified time: 2019-12-10 21:16:35 - */ -import React, { useState, useMemo } from ".." - -export const TestUseMemo = () => { - const [state, setState] = useState(0) - - const expression = () => { - return state + 1 - } - - const resultMemo = useMemo(expression, []) - - const result = expression() - - return ( -
-
TestUseMemo Demo
-
-
    -
  • state:{state}
  • -
  • memoState:{resultMemo}
  • -
  • no memoState:{result}
  • -
- -
-
- ) -} diff --git a/src/__test__/TestUseReducer.tsx b/src/__test__/TestUseReducer.tsx deleted file mode 100644 index d74ab5a..0000000 --- a/src/__test__/TestUseReducer.tsx +++ /dev/null @@ -1,38 +0,0 @@ -/* - * @Author: saber2pr - * @Date: 2019-12-06 15:39:28 - * @Last Modified by: saber2pr - * @Last Modified time: 2019-12-06 16:29:24 - */ -import React, { useReducer } from ".." - -export const TestUseReducer = () => { - const [state, dispatch] = useReducer< - { count: number }, - { type: "add" | "sub" } - >( - (state, action) => { - switch (action.type) { - case "add": - return { count: state.count + 1 } - case "sub": - return { count: state.count - 1 } - default: - return state - } - }, - { count: 0 }, - { type: "add" } - ) - - return ( -
-
TestUseReducer Demo
-
-
state:{state.count}
- - -
-
- ) -} diff --git a/src/__test__/TestUseRef.ts b/src/__test__/TestUseRef.ts deleted file mode 100644 index 68202fb..0000000 --- a/src/__test__/TestUseRef.ts +++ /dev/null @@ -1,15 +0,0 @@ -/* - * @Author: saber2pr - * @Date: 2019-12-07 23:12:25 - * @Last Modified by: saber2pr - * @Last Modified time: 2019-12-07 23:12:25 - */ -/* - * @Author: saber2pr - * @Date: 2019-12-06 15:28:57 - * @Last Modified by: saber2pr - * @Last Modified time: 2019-12-06 15:29:30 - */ -import { TestPlace } from "./TestPlace" - -export const TestUseState = TestPlace diff --git a/src/__test__/TestUseState.ts b/src/__test__/TestUseState.ts deleted file mode 100644 index 9e514b5..0000000 --- a/src/__test__/TestUseState.ts +++ /dev/null @@ -1,9 +0,0 @@ -/* - * @Author: saber2pr - * @Date: 2019-12-06 15:28:57 - * @Last Modified by: saber2pr - * @Last Modified time: 2019-12-06 15:28:57 - */ -import { TestIf } from "./TestIF" - -export const TestUseState = TestIf diff --git a/src/client.ts b/src/client.ts deleted file mode 100644 index 0d57f02..0000000 --- a/src/client.ts +++ /dev/null @@ -1,8 +0,0 @@ -/* - * @Author: saber2pr - * @Date: 2019-12-07 22:41:45 - * @Last Modified by: saber2pr - * @Last Modified time: 2019-12-07 22:41:45 - */ -export * from "./core/react-dom/client/ReactDOM" -export { default } from "./core/react-dom/client/ReactDOM" diff --git a/src/core/react-dom/client/ReactDOM.ts b/src/core/react-dom/client/ReactDOM.ts deleted file mode 100644 index ac83b08..0000000 --- a/src/core/react-dom/client/ReactDOM.ts +++ /dev/null @@ -1,32 +0,0 @@ -/* - * @Author: saber2pr - * @Date: 2019-12-06 16:44:19 - * @Last Modified by: saber2pr - * @Last Modified time: 2019-12-07 22:41:29 - */ -import { HostConfig } from "./ReactDOMHostConfig" -import ReactFiberReconciler from "../../react-reconciler/ReactFiberReconciler" - -const renderer = ReactFiberReconciler(HostConfig) - -namespace ReactDOM { - export const render = ( - component: JSX.Element, - container: HTMLElement, - callback?: Function - ) => { - if (container === null) { - throw new Error("Target container is not a DOM element.") - } else { - const isContainer = renderer.isContainer(container) - if (isContainer) { - renderer.updateContainer(component, container, callback) - } else { - renderer.createContainer(component, container, callback) - } - } - } -} - -export { ReactDOM, HostConfig } -export default ReactDOM diff --git a/src/core/react-dom/client/ReactDOMHostConfig.ts b/src/core/react-dom/client/ReactDOMHostConfig.ts deleted file mode 100644 index fbdcc38..0000000 --- a/src/core/react-dom/client/ReactDOMHostConfig.ts +++ /dev/null @@ -1,75 +0,0 @@ -/* - * @Author: saber2pr - * @Date: 2019-12-06 19:30:24 - * @Last Modified by: saber2pr - * @Last Modified time: 2019-12-10 17:10:12 - */ -namespace HostConfig { - export function createElement(tag: string) { - return document.createElement(tag) - } - - export function createDocumentFragment() { - return document.createDocumentFragment() - } - - export function createTextNode(data: string | number) { - return document.createTextNode(String(data)) - } - - export function insertBefore( - parent: HTMLElement, - newChild: HTMLElement, - refChild: Node - ) { - parent.insertBefore(newChild, refChild) - } - - export function appendChild( - parent: HTMLElement, - ...nodes: (string | Node)[] - ) { - parent.append(...nodes) - } - - export function removeSelf(node: HTMLElement) { - node.remove() - } - - export function removeAllChild(node: HTMLElement) { - node.innerHTML = "" - } - - export function updateProps( - node: HTMLElement, - newProps: object, - oldProps: object - ) { - Object.entries(newProps).forEach(([k, v]) => { - if (k === "style") return - if (oldProps[k] === v) return - - if (k.startsWith("on")) { - k = k.toLowerCase() - } - - if (k === "dangerouslySetInnerHTML") { - k = "innerHTML" - v = v.__html - } - - node[k] = v - }) - - if (newProps["style"]) { - const newStyle = newProps["style"] - const oldStyle = oldProps["style"] || {} - Object.entries(newStyle).forEach(([k, v]) => { - if (oldStyle[k] === v) return - node.style[k] = v - }) - } - } -} - -export { HostConfig } diff --git a/src/core/react-dom/server/ReactDOMServer.ts b/src/core/react-dom/server/ReactDOMServer.ts deleted file mode 100644 index b2de5ba..0000000 --- a/src/core/react-dom/server/ReactDOMServer.ts +++ /dev/null @@ -1,16 +0,0 @@ -/* - * @Author: saber2pr - * @Date: 2019-12-07 22:37:31 - * @Last Modified by: saber2pr - * @Last Modified time: 2019-12-07 22:41:21 - */ -import * as ReactDOMStringRenderer from "./ReactDOMStringRenderer" - -namespace ReactDOMServer { - export const renderToString = ReactDOMStringRenderer.renderToString -} - -const renderToString = ReactDOMStringRenderer.renderToString - -export { ReactDOMServer, renderToString } -export default ReactDOMServer diff --git a/src/core/react-dom/server/ReactDOMStringRenderer.ts b/src/core/react-dom/server/ReactDOMStringRenderer.ts deleted file mode 100644 index edd3f97..0000000 --- a/src/core/react-dom/server/ReactDOMStringRenderer.ts +++ /dev/null @@ -1,71 +0,0 @@ -/* - * @Author: saber2pr - * @Date: 2019-12-07 22:09:45 - * @Last Modified by: saber2pr - * @Last Modified time: 2019-12-08 12:17:36 - */ -import { - isTextFiber, - isHookFiber, - isHostFiber, - isFragmentFiber -} from "../../react-is/ReactIs" -import { Children } from "../../react/ReactChildren" - -const toLowerCase = (value: string) => - value.replace(/\B([A-Z])/g, "-$1").toLowerCase() - -const toArray = (element: any) => Children.toArray(element) - -function createNode(element: JSX.Element): JSX.Element { - const { props } = element - - const style = props.style - if (style) { - props.style = Object.entries(style).reduce( - (receiver, [k, v]) => receiver.concat(`${toLowerCase(k)}:${v};`), - "" - ) - } - - return { ...element, props } -} - -function renderToString(element: JSX.Element): string { - if (isTextFiber(element)) { - const { nodeValue } = element.props - return nodeValue - } - - if (isHostFiber(element)) { - const { tag, props } = createNode(element) - const attr = Object.entries(props).reduce((receiver, [k, v]) => { - if (typeof v !== "string") { - return receiver - } - - if (k === "className") { - k = "class" - } - - return receiver.concat(` ${k}="${v}"`) - }, "") - - const children = toArray(props.children) - return `<${tag}${attr}>${children.map(renderToString).join("")}` - } - - if (isFragmentFiber(element)) { - const { props } = element - const children = toArray(props.children) - return children.map(renderToString).join("") - } - - if (isHookFiber(element)) { - const { tag: constructor, props } = element - const children = toArray(constructor(props)) - return children.map(renderToString).join("") - } -} - -export { renderToString } diff --git a/src/core/react-is/ReactIs.ts b/src/core/react-is/ReactIs.ts deleted file mode 100644 index df54273..0000000 --- a/src/core/react-is/ReactIs.ts +++ /dev/null @@ -1,41 +0,0 @@ -/* - * @Author: saber2pr - * @Date: 2019-12-06 17:13:21 - * @Last Modified by: saber2pr - * @Last Modified time: 2019-12-08 14:30:34 - */ -import { Fiber, NodeType } from "../shared/ReactTypes" - -const isSameTag = (element: Fiber, oldFiber: Fiber) => - element.tag === oldFiber.tag - -const isHookFiber = (fiber: Fiber): boolean => fiber.$$typeof === NodeType.Hook - -const isRootFiber = (fiber: Fiber): fiber is Fiber => - fiber.$$typeof === NodeType.Root - -const isHostFiber = (fiber: Fiber): fiber is Fiber => - fiber.$$typeof === NodeType.Host - -const isTextFiber = (fiber: Fiber): fiber is Fiber => - fiber.$$typeof === NodeType.Text - -const isFragmentFiber = (fiber: Fiber): fiber is Fiber => - fiber.$$typeof === NodeType.Fragment - -const isHostParentFiber = (fiber: Fiber): boolean => - isHostFiber(fiber) || isRootFiber(fiber) - -const isHostChildFiber = (fiber: Fiber): boolean => - isHostFiber(fiber) || isTextFiber(fiber) - -export { - isSameTag, - isHostParentFiber, - isHostChildFiber, - isHookFiber, - isRootFiber, - isHostFiber, - isTextFiber, - isFragmentFiber -} diff --git a/src/core/react-reconciler/ReactChildFiber.ts b/src/core/react-reconciler/ReactChildFiber.ts deleted file mode 100644 index 01fea5e..0000000 --- a/src/core/react-reconciler/ReactChildFiber.ts +++ /dev/null @@ -1,142 +0,0 @@ -/* - * @Author: saber2pr - * @Date: 2019-12-06 17:08:56 - * @Last Modified by: saber2pr - * @Last Modified time: 2019-12-13 19:03:54 - */ -import { Fiber, EffectType } from "../shared/ReactTypes" -import { Children } from "../react/ReactChildren" -import { isSameTag, isHookFiber } from "../react-is/ReactIs" -import { TestStackSize } from "../shared/testStackSize" - -function reconcileChildren(fiber: Fiber, children: Fiber[]) { - if (isHookFiber(fiber)) { - reconcileHookRetFiber(fiber) - } - - children = Children.toArray(children) - - const alternate = fiber.alternate - let nextOldFiber = alternate ? alternate.child : null - - let newFiber: Fiber = null - let index = 0 - - while (index < children.length || nextOldFiber) { - TestStackSize("reconcileChildren") - - const prevChild = newFiber - let oldFiber = nextOldFiber - - if (oldFiber) { - if (oldFiber.effectType === EffectType.Delete) { - oldFiber = null - } - } - - const element = index < children.length && children[index] - - // update - if (oldFiber && element && isSameTag(element, oldFiber)) { - newFiber = updateSlot(element, oldFiber, fiber) - } - - // place - else if (oldFiber && element && !isSameTag(element, oldFiber)) { - newFiber = placeChild(element, oldFiber, fiber) - } - - // create - else if (!oldFiber && element) { - newFiber = createChild(element, fiber) - } - - // delete - else if (oldFiber && !element) { - deleteChild(fiber, oldFiber) - } - - // next alternate - if (nextOldFiber) nextOldFiber = nextOldFiber.sibling - - if (index === 0 || !fiber.child) { - fiber.child = newFiber // link: fiber->child - } else if (prevChild) { - if (element) { - prevChild.sibling = newFiber // link: fiber.sibling->fiber - } else { - prevChild.sibling = null // unlink: fiber.sibling - delete prevChild.sibling - } - } - index++ - } - - return fiber.child -} - -function reconcileHookRetFiber(hookFiber: Fiber) { - const alternate = hookFiber.alternate - //update hook effect - if (alternate) { - if (isSameTag(alternate, hookFiber)) { - // update - hookFiber.effectType = EffectType.Update - } else { - // place - hookFiber.effectType = EffectType.Place - alternate.effectType = EffectType.Delete - } - } else { - // create - hookFiber.effectType = EffectType.Create - } -} - -function createChild(element: Fiber, returnFiber: Fiber) { - const newFiber: Fiber = { - ...element, - return: returnFiber, - effectType: EffectType.Create - } - return newFiber -} - -function updateSlot(element: Fiber, oldFiber: Fiber, returnFiber: Fiber) { - const newFiber: Fiber = { - ...oldFiber, - ...element, - return: returnFiber, - effectType: EffectType.Update, - alternate: oldFiber - } - oldFiber.alternate = null - return newFiber -} - -function placeChild(element: Fiber, childToPlace: Fiber, returnFiber: Fiber) { - const newFiber: Fiber = { - ...element, - return: returnFiber, - effectType: EffectType.Place, - alternate: childToPlace - } - - deleteChild(returnFiber, childToPlace) - return newFiber -} - -function deleteChild(returnFiber: Fiber, childToDelete: Fiber) { - childToDelete.effectType = EffectType.Delete - const effectList = returnFiber.effectList || [] - effectList.push(childToDelete) - returnFiber.effectList = effectList - - // delete child - const child = childToDelete.child - if (child) { - child.effectType = EffectType.Delete - } -} - -export { reconcileChildren } diff --git a/src/core/react-reconciler/ReactFiberCommitWork.ts b/src/core/react-reconciler/ReactFiberCommitWork.ts deleted file mode 100644 index 78ead2f..0000000 --- a/src/core/react-reconciler/ReactFiberCommitWork.ts +++ /dev/null @@ -1,280 +0,0 @@ -/* - * @Author: saber2pr - * @Date: 2019-12-06 17:09:07 - * @Last Modified by: saber2pr - * @Last Modified time: 2019-12-13 19:12:55 - */ -import { Fiber, EffectType, NodeType, Effect } from "../shared/ReactTypes" -import { HostConfig } from "./ReactFiberHostConfig" -import { - getHostParentFiber, - getHostSiblingFiber, - getHostChildFiber -} from "./ReactFiberTraverse" -import { Reflection } from "./ReactFiberReflection" -import { - isRootFiber, - isHookFiber, - isTextFiber, - isHostFiber, - isFragmentFiber -} from "../react-is/ReactIs" -import { TestStackSize, resetStack } from "../shared/testStackSize" - -function createStateNode(hostFiber: Fiber) { - const { tag, props } = hostFiber - let stateNode = null - - if (isTextFiber(hostFiber)) { - stateNode = HostConfig.createTextNode(props.nodeValue) - } - - if (isRootFiber(hostFiber)) { - stateNode = hostFiber.stateNode - } - - if (isHostFiber(hostFiber)) { - stateNode = HostConfig.createElement(tag) - } - - if (isFragmentFiber(hostFiber)) { - stateNode = HostConfig.createDocumentFragment() - } - - if (props.ref) { - const ref = props.ref - if (typeof ref === "function") { - ref(stateNode) - } else { - ref.current = stateNode - } - } - - return stateNode -} - -function commitWork(fiber: Fiber) { - const effectList = sortEffectList(fiber) - effectList.forEach(commitUnitOfWork) - - // set root alternate - if (isRootFiber(fiber)) { - Reflection.setContainerFiber(fiber) - } - - // set hook alternate - if (isHookFiber(fiber)) { - Reflection.setInternalFiber(fiber) - } - - resetStack() - const callback = fiber.callback - if (callback) callback(fiber) -} - -function sortEffectList(fiber: Fiber) { - const effectList = fiber.effectList || [] - - type NextEffect = { level: number; effect: Fiber } - const nextEffects: Array = [] - for (const effect of effectList) { - if (nextEffects.find(nextEffect => nextEffect.effect === effect)) { - continue - } - const nextEffect = { - level: EffectType.getEffectLevel(effect.effectType), - effect - } - nextEffects.push(nextEffect) - } - - fiber.effectList = nextEffects - .sort((a, b) => b.level - a.level) - .map(({ effect }) => effect) - - return fiber.effectList -} - -function commitUnitOfWork(fiber: Fiber) { - const { effectType } = fiber - if (isHookFiber(fiber)) { - switch (effectType) { - case EffectType.Create: - commitHookMount(fiber) - break - case EffectType.Update: - commitHookUpdate(fiber) - break - case EffectType.Place: - commitHookMount(fiber) - commitPlace(fiber) - break - case EffectType.Delete: - commitHookUnMount(fiber) - commitDelete(fiber) - break - default: - break - } - Reflection.setInternalFiber(fiber) - } else { - switch (effectType) { - case EffectType.Create: - commitCreate(fiber) - break - case EffectType.Update: - commitUpdate(fiber) - break - case EffectType.Place: - commitPlace(fiber) - break - case EffectType.Delete: - commitDelete(fiber) - break - default: - break - } - } -} - -function commitHookMount(hookFiber: Fiber) { - const effect = hookFiber.memoizedState - if (!effect) { - return - } - const creators = effect.in - if (creators) { - const nextEffects: Effect[] = [] - while (creators.length) { - TestStackSize("commitHookEffectList") - const current = creators.pop() - const nextEffect = current() - if (nextEffect) { - nextEffects.push(nextEffect) - } - } - effect.out = nextEffects - } -} - -function commitHookUnMount(hookFiber: Fiber) { - const effect = hookFiber.memoizedState - if (!effect) { - return - } - const destroys = effect.out - if (destroys) { - while (destroys.length) { - TestStackSize("commitHookEffectList:1") - const current = destroys.pop() - current() - } - } -} - -// update = unmount -> mount -function commitHookUpdate(hookFiber: Fiber) { - commitHookUnMount(hookFiber) - commitHookMount(hookFiber) -} - -function commitCreate(hostFiber: Fiber) { - const HostParent = getHostParentFiber(hostFiber) - const parent = HostParent.stateNode - const node = hostFiber.stateNode - HostConfig.appendChild(parent, node) -} - -function commitPlace(finishedWork: Fiber): void { - const parentFiber = getHostParentFiber(finishedWork) - if (!parentFiber) { - // when parent had been removed, ignore this effect. - return - } - - const parent = parentFiber.stateNode - - const before = getHostSiblingFiber(finishedWork) - let node = finishedWork - while (true) { - TestStackSize("commitPlace") - const isHost = - node.$$typeof === NodeType.Host || node.$$typeof === NodeType.Text - if (isHost) { - const stateNode = node.stateNode - if (before) { - HostConfig.insertBefore(parent, stateNode, before.stateNode) - } else { - HostConfig.appendChild(parent, stateNode) - } - } else if (node.child) { - node.child.return = node - node = node.child - continue - } - if (node === finishedWork) { - return - } - while (!node.sibling) { - TestStackSize("commitPlace:1") - if (!node.return || node.return === finishedWork) { - return - } - node = node.return - } - node.sibling.return = node.return - node = node.sibling - } -} - -function commitUpdate(hostFiber: Fiber) { - const alternate = hostFiber.alternate - const newProps = hostFiber.props - const node = hostFiber.stateNode - const oldProps = alternate ? alternate.props : {} - - const newPropsToUpdate = Object.fromEntries( - Object.entries(newProps).filter(([k]) => !["ref", "children"].includes(k)) - ) - HostConfig.updateProps(node, newPropsToUpdate, oldProps) -} - -function commitDelete(finishedWork: Fiber) { - const current = finishedWork - - if (isHookFiber(current)) { - const HostChildFiber = getHostChildFiber(current) - if (HostChildFiber) { - const stateNode = HostChildFiber.stateNode - HostConfig.removeSelf(stateNode) - datchFiber(HostChildFiber) - } - } else { - const stateNode = current.stateNode - HostConfig.removeSelf(stateNode) - } - - datchFiber(current) -} - -function datchFiber(fiber: Fiber) { - fiber.return = null - fiber.child = null - fiber.sibling = null - const alternate = fiber.alternate - if (alternate) { - alternate.return = null - alternate.child = null - alternate.sibling = null - } - fiber.alternate = null -} - -export { - commitWork, - commitCreate, - commitUpdate, - commitPlace, - commitDelete, - createStateNode -} diff --git a/src/core/react-reconciler/ReactFiberHooks.ts b/src/core/react-reconciler/ReactFiberHooks.ts deleted file mode 100644 index 785ff41..0000000 --- a/src/core/react-reconciler/ReactFiberHooks.ts +++ /dev/null @@ -1,145 +0,0 @@ -/* - * @Author: saber2pr - * @Date: 2019-12-06 17:11:09 - * @Last Modified by: saber2pr - * @Last Modified time: 2019-12-10 21:01:24 - */ -import { getCurrentWorkInProgress } from "./ReactFiberWorkLoop" -import { scheduleWork } from "./ReactFiberReconciler" -import { getIndex } from "./ReactFiberStack" -import { is } from "../shared/objectIs" -import { Effect, MemoizedState } from "../shared/ReactTypes" -import { MutableRefObject, ReactContext, RefObject } from "../shared/ReactElementType" - -const areHookInputsEqual = ( - nextDeps: readonly any[], - prevDeps: readonly any[] | null -) => { - if (prevDeps === null) { - return false - } - for (let i = 0; i < prevDeps.length && i < nextDeps.length; i++) { - if (is(nextDeps[i], prevDeps[i])) { - continue - } - return false - } - return true -} - -const useState = (initialState: T): [T, (state: T) => void] => { - const id = getIndex() - const fiber = getCurrentWorkInProgress() - - const memoizedState: MemoizedState = fiber.memoizedState || {} - if (!(id in memoizedState)) { - memoizedState[id] = initialState - fiber.memoizedState = memoizedState - } - - const setState = (state: T) => { - if (state === memoizedState[id]) return - memoizedState[id] = state - scheduleWork(fiber) - } - - return [memoizedState[id], setState] -} - -const useReducer = ( - initReducer: (state: S, action: A) => S, - initialState: S, - initAction?: A -): [S, (action: A) => void] => { - const reducer = useCallBack(initReducer) - const initState = initAction - ? reducer(initialState, initAction) - : initialState - const [state, setState] = useState(initState) - const dispatch = (action: A) => setState(reducer(state, action)) - return [state, dispatch] -} - -const useRef = (value?: T): MutableRefObject => { - const [state] = useState({ current: value }) - return state -} - -const useCallBack = ( - callback: T, - deps?: readonly any[] -) => { - const ref = useRef(callback) - const prevDepsRef = useRef(null) - if (deps && areHookInputsEqual(deps, prevDepsRef.current)) { - return ref.current - } else { - ref.current = callback - prevDepsRef.current = deps - return callback - } -} - -const useMemo = (memoFunc: () => T, deps?: readonly any[]) => { - const ref = useRef(null) - const prevDepsRef = useRef(null) - if (deps && areHookInputsEqual(deps, prevDepsRef.current)) { - return ref.current - } else { - ref.current = memoFunc() - prevDepsRef.current = deps - return ref.current - } -} - -const pushEffect = (effect: MemoizedState | null, create: Effect) => { - const sideEffect = effect || {} - const updateQueue = sideEffect.in || [] - updateQueue.push(create) - sideEffect.in = updateQueue - return sideEffect -} - -const useEffect = (create: Effect, deps?: readonly any[]) => { - const fiber = getCurrentWorkInProgress() - const effect = fiber.memoizedState - const prevDepsRef = useRef(null) - if (deps && areHookInputsEqual(deps, prevDepsRef.current)) { - return - } else { - prevDepsRef.current = deps - fiber.memoizedState = pushEffect(effect, create) - } -} - -const useImperativeHandle = ( - ref: RefObject, - creator: () => R, - deps?: readonly any[] -) => { - const prevDepsRef = useRef(null) - if (deps && areHookInputsEqual(deps, prevDepsRef.current)) { - return - } else { - prevDepsRef.current = deps - const ret = creator() - if (typeof ref === "function") { - ref(ret) - } else { - ref.current = ret - } - } -} - -const useContext = (context: ReactContext): T => context.value - -export { - useCallBack, - useMemo, - useReducer, - useRef, - useState, - useEffect, - useImperativeHandle, - useContext -} diff --git a/src/core/react-reconciler/ReactFiberHostConfig.ts b/src/core/react-reconciler/ReactFiberHostConfig.ts deleted file mode 100644 index 78b98c0..0000000 --- a/src/core/react-reconciler/ReactFiberHostConfig.ts +++ /dev/null @@ -1,25 +0,0 @@ -/* - * @Author: saber2pr - * @Date: 2019-12-06 16:44:01 - * @Last Modified by: saber2pr - * @Last Modified time: 2019-12-10 17:09:10 - */ -import { Instance, FragmentInstance, TextInstance } from "../shared/ReactTypes" -const HostConfig = {} as HostConfigType - -type HostConfigType = { - createElement(tag: string): Instance - createDocumentFragment(): FragmentInstance - createTextNode(data: string | number): TextInstance - insertBefore(parent: Instance, newChild: Instance, refChild: Instance): void - appendChild(parent: Instance, ...nodes: (string | Instance)[]): void - removeSelf(node: Instance): void - removeAllChild(node: Instance): void - updateProps(node: Instance, newProps: object, oldProps: object): void -} - -function setHostConfig(config: HostConfigType) { - Object.assign(HostConfig, config) -} - -export { HostConfig, setHostConfig, HostConfigType } diff --git a/src/core/react-reconciler/ReactFiberReconciler.ts b/src/core/react-reconciler/ReactFiberReconciler.ts deleted file mode 100644 index 86b8ae7..0000000 --- a/src/core/react-reconciler/ReactFiberReconciler.ts +++ /dev/null @@ -1,134 +0,0 @@ -/* - * @Author: saber2pr - * @Date: 2019-12-06 19:07:32 - * @Last Modified by: saber2pr - * @Last Modified time: 2019-12-08 12:31:52 - */ -import { renderRoot } from "./ReactFiberWorkLoop" -import { Fiber, NodeType, Instance } from "../shared/ReactTypes" -import { setHostConfig, HostConfigType } from "./ReactFiberHostConfig" -import { Reflection } from "./ReactFiberReflection" -import { TestStackSize } from "../shared/testStackSize" - -declare interface IdleDeadline { - readonly didTimeout: boolean - timeRemaining(): number -} - -declare type IdleOptions = { - timeout: number -} - -declare type IdleCallback = (deadline: IdleDeadline) => void - -declare function requestIdleCallback(callback: IdleCallback): number -declare function requestIdleCallback( - callback: IdleCallback, - options: IdleOptions -): number - -const updateQueue: Fiber[] = [] -let lastTime = 0 - -function pushEffect(callback: VoidFunction) { - if (requestIdleCallback) { - requestIdleCallback(callback) - } else { - setTimeout(callback) - } -} - -function pushLayoutEffect(callback: (...args: any) => void) { - if (requestAnimationFrame) { - requestAnimationFrame(callback) - } else { - const now = Date.now() - const nextTime = Math.max(lastTime + 16, now) - - return setTimeout(() => callback((lastTime = nextTime)), nextTime - now) - } -} - -type ScheduleWorkMode = "normal" | "layout" - -function scheduleWork(fiber: Fiber, mode: ScheduleWorkMode = "normal") { - updateQueue.push(fiber) - switch (mode) { - case "normal": - pushEffect(scheduleUnitOfWorkNormalMode) - break - case "layout": - pushLayoutEffect(scheduleUnitOfWorkLayoutMode) - break - default: - pushEffect(scheduleUnitOfWorkNormalMode) - } -} - -function scheduleUnitOfWorkNormalMode() { - TestStackSize("scheduleUnitOfWorkNormalMode") - const update = updateQueue.pop() - if (update) renderRoot(update) - - if (updateQueue.length) { - pushEffect(scheduleUnitOfWorkNormalMode) - } -} - -function scheduleUnitOfWorkLayoutMode() { - TestStackSize("scheduleUnitOfWorkLayoutMode") - const update = updateQueue.pop() - if (update) renderRoot(update) - - if (updateQueue.length) { - pushLayoutEffect(scheduleUnitOfWorkLayoutMode) - } -} - -function createRenderer(HostConfig: HostConfigType) { - setHostConfig(HostConfig) - - const createContainer = ( - component: Fiber, - container: Instance, - callback?: Function - ) => { - const rootFiber: Fiber = { - $$typeof: NodeType.Root, - props: { children: [component] }, - stateNode: container, - callback - } - HostConfig.removeAllChild(container) - scheduleWork(rootFiber) - } - - const updateContainer = ( - component: Fiber, - container: Instance, - callback?: Function - ) => { - const rootFiber: Fiber = { - $$typeof: NodeType.Root, - props: { children: [component] }, - stateNode: container, - callback - } - const containerFiber = Reflection.getContainerFiber(rootFiber) - containerFiber.alternate = null - rootFiber.alternate = containerFiber - scheduleWork(rootFiber) - } - - const isContainer = (container: Instance) => - Reflection.hasContainerFiber(container) - - return { - createContainer, - updateContainer, - isContainer - } -} - -export { scheduleWork, createRenderer } -export default createRenderer diff --git a/src/core/react-reconciler/ReactFiberReflection.ts b/src/core/react-reconciler/ReactFiberReflection.ts deleted file mode 100644 index bdd9856..0000000 --- a/src/core/react-reconciler/ReactFiberReflection.ts +++ /dev/null @@ -1,35 +0,0 @@ -/* - * @Author: saber2pr - * @Date: 2019-12-06 17:11:47 - * @Last Modified by: saber2pr - * @Last Modified time: 2019-12-08 12:32:05 - */ -import { Fiber, Instance } from "../shared/ReactTypes" - -export namespace Reflection { - const combiner = new WeakMap() - - export function setInternalFiber(hookFiber: Fiber) { - const { tag: constructor } = hookFiber - combiner.set(constructor, hookFiber) - } - - export function getInternalFiber(hookFiber: Fiber) { - const { tag: constructor } = hookFiber - return combiner.get(constructor) - } - - export function setContainerFiber(rootFiber: Fiber) { - const { stateNode: container } = rootFiber - combiner.set(container, rootFiber) - } - - export function getContainerFiber(rootFiber: Fiber) { - const { stateNode: container } = rootFiber - return combiner.get(container) - } - - export function hasContainerFiber(container: Instance) { - return combiner.has(container) - } -} diff --git a/src/core/react-reconciler/ReactFiberStack.ts b/src/core/react-reconciler/ReactFiberStack.ts deleted file mode 100644 index 069ceb0..0000000 --- a/src/core/react-reconciler/ReactFiberStack.ts +++ /dev/null @@ -1,19 +0,0 @@ -/* - * @Author: saber2pr - * @Date: 2019-12-07 15:15:13 - * @Last Modified by: saber2pr - * @Last Modified time: 2019-12-07 15:15:13 - */ -let index = 0 - -const getIndex = () => { - const currentIndex = index - index++ - return currentIndex -} - -const resetIndex = () => { - index = 0 -} - -export { getIndex, resetIndex } diff --git a/src/core/react-reconciler/ReactFiberTraverse.ts b/src/core/react-reconciler/ReactFiberTraverse.ts deleted file mode 100644 index 9b2717a..0000000 --- a/src/core/react-reconciler/ReactFiberTraverse.ts +++ /dev/null @@ -1,62 +0,0 @@ -/* - * @Author: saber2pr - * @Date: 2019-12-06 17:11:57 - * @Last Modified by: saber2pr - * @Last Modified time: 2019-12-07 16:09:22 - */ -import { Fiber, EffectType } from "../shared/ReactTypes" -import { isHostParentFiber, isHostChildFiber } from "../react-is/ReactIs" -import { TestStackSize } from "../shared/testStackSize" - -function getHostSiblingFiber(fiber: Fiber): Fiber { - let node: Fiber = fiber - siblings: while (true) { - TestStackSize("getHostSiblingFiber") - while (!node.sibling) { - if (!node.return || isHostParentFiber(node.return)) { - return null - } - node = node.return - } - node.sibling.return = node.return - node = node.sibling - while (!isHostChildFiber(node)) { - if (node.effectType === EffectType.Place) { - continue siblings - } - if (!node.child) { - continue siblings - } else { - node.child.return = node - node = node.child - } - } - if (!(node.effectType === EffectType.Place)) { - return node - } - } -} - -function getHostParentFiber(fiber: Fiber): Fiber { - let parent = fiber.return - while (parent) { - TestStackSize("getHostParentFiber") - if (isHostParentFiber(parent)) { - return parent - } - parent = parent.return - } -} - -function getHostChildFiber(fiber: Fiber): Fiber { - let child = fiber.child - while (child) { - TestStackSize("getHostChildFiber") - if (isHostChildFiber(child)) { - return child - } - child = child.child - } -} - -export { getHostChildFiber, getHostParentFiber, getHostSiblingFiber } diff --git a/src/core/react-reconciler/ReactFiberWorkLoop.ts b/src/core/react-reconciler/ReactFiberWorkLoop.ts deleted file mode 100644 index b304969..0000000 --- a/src/core/react-reconciler/ReactFiberWorkLoop.ts +++ /dev/null @@ -1,146 +0,0 @@ -/* - * @Author: saber2pr - * @Date: 2019-12-06 17:12:44 - * @Last Modified by: saber2pr - * @Last Modified time: 2019-12-10 16:46:47 - */ -import { Fiber, EffectType } from "../shared/ReactTypes" -import { Reflection } from "./ReactFiberReflection" -import { reconcileChildren } from "./ReactChildFiber" -import { - commitWork, - commitUpdate, - createStateNode -} from "./ReactFiberCommitWork" -import { - isSameTag, - isHookFiber, - isRootFiber, - isTextFiber, - isHostFiber, - isFragmentFiber -} from "../react-is/ReactIs" -import { resetIndex } from "./ReactFiberStack" -import { TestStackSize } from "../shared/testStackSize" - -let workInProgress: Fiber = null -let pendingCommit: Fiber = null - -const getCurrentWorkInProgress = () => workInProgress - -function renderRoot(root: Fiber) { - if (!workInProgress) workInProgress = createWorkInProgress(root) - - while (workInProgress) { - workInProgress = performUnitOfWork(workInProgress, root) - if (workInProgress === root) break - TestStackSize("renderRoot") - } - - if (pendingCommit) { - commitWork(pendingCommit) - workInProgress = null - pendingCommit = null - } -} - -function createWorkInProgress(fiber: Fiber) { - workInProgress = fiber - workInProgress.effectList = null - return workInProgress -} - -function performUnitOfWork(fiber: Fiber, top: Fiber) { - const next = beginWork(fiber) - if (next) return next - let current = fiber - while (current) { - if (current === top) return current - completeWork(current, top) - if (current.sibling) return current.sibling - current = current.return - TestStackSize("performUnitOfWork") - } -} - -function completeWork(fiber: Fiber, top: Fiber) { - const parent = fiber.return - if (parent) { - const parentEffectList = parent.effectList || [] - const fiberEffectList = fiber.effectList || [] - parentEffectList.push(...fiberEffectList, fiber) - fiber.effectList = [] - delete fiber.effectList - - // update effect. - if (isHookFiber(parent) && parent.effectType === EffectType.Update) { - parentEffectList.push(parent) - } - - parent.effectList = parentEffectList - - if (parent === top) { - pendingCommit = parent - } - } -} - -function beginWork(fiber: Fiber) { - if (isHookFiber(fiber)) { - return updateHOOKComponent(fiber) - } - if (isRootFiber(fiber)) { - return updateHostComponent(fiber) - } - if (isTextFiber(fiber)) { - return updateHostComponent(fiber) - } - if (isHostFiber(fiber)) { - return updateHostComponent(fiber) - } - if (isFragmentFiber(fiber)) { - return updateHostComponent(fiber) - } -} - -function updateHOOKComponent(hookFiber: Fiber) { - const { tag: constructor, props } = hookFiber - hookFiber.alternate = Reflection.getInternalFiber(hookFiber) - - if (props.children && props.children.length === 1) { - let singleChild = props.children[0] - - if (isTextFiber(singleChild)) { - const { props } = singleChild - singleChild = props.nodeValue - } - - props.children = singleChild - } - - resetIndex() - const children = constructor(props) - const child = reconcileChildren(hookFiber, children) - - hookFiber.child = child - return child -} - -function updateHostComponent(hostFiber: Fiber) { - const { - props: { children }, - stateNode, - alternate - } = hostFiber - const isSame = alternate ? isSameTag(hostFiber, alternate) : false - if (!stateNode || !isSame) { - hostFiber.stateNode = createStateNode(hostFiber) - commitUpdate(hostFiber) - } - - const child = reconcileChildren(hostFiber, children) - hostFiber.child = child - return child -} - -export { getCurrentWorkInProgress, renderRoot } diff --git a/src/core/react/React.ts b/src/core/react/React.ts deleted file mode 100644 index b0ec822..0000000 --- a/src/core/react/React.ts +++ /dev/null @@ -1,150 +0,0 @@ -/* - * @Author: saber2pr - * @Date: 2019-12-07 22:31:48 - * @Last Modified by: saber2pr - * @Last Modified time: 2019-12-13 16:37:31 - */ -import * as ReactFiberHooks from "../react-reconciler/ReactFiberHooks" -import { createRenderer } from "../react-reconciler/ReactFiberReconciler" -import { Children as ReactChildren } from "./ReactChildren" -import * as ReactElementType from "../shared/ReactElementType" -import * as ReactElement from "./ReactElement" -import { NodeType } from "../shared/ReactTypes" -import { forwardRef as ReactForwardRef } from "./forwardRef" -import * as ReactLazy from "./ReactLazy" -import * as ReactContext from "./ReactContext" -import * as ReactStack from "../shared/testStackSize" -import * as ReactMemo from "./memo" - -namespace React { - // hooks - export const useCallBack = ReactFiberHooks.useCallBack - export const useMemo = ReactFiberHooks.useMemo - export const useReducer = ReactFiberHooks.useReducer - export const useRef = ReactFiberHooks.useRef - export const useState = ReactFiberHooks.useState - export const useEffect = ReactFiberHooks.useEffect - export const useImperativeHandle = ReactFiberHooks.useImperativeHandle - // component - export const createElement = ReactElement.createElement - export const Children = ReactChildren - export const Fragment = NodeType.Fragment - export const forwardRef = ReactForwardRef - export const lazy = ReactLazy.lazy - export const Suspense = ReactLazy.Suspense - export const memo = ReactMemo.memo - // context - export const createContext = ReactContext.createContext - // options - export const Stack = ReactStack -} - -// TSX Typings - -type Override = { - [P in keyof T]: P extends K ? V : T[P] -} - -namespace React { - export type MutableRefObject = ReactElementType.MutableRefObject - export type Props = ReactElementType.Props - - type ExAttributes = { - dangerouslySetInnerHTML?: { __html: string } - } & Props - - export type HTMLAttributes = Override< - T, - "style", - CSSProperties - > & - ExAttributes - - export type IntrinsicAttributes = Partial< - HTMLAttributes - > - export type CSSProperties = Partial - - // Element Type - export type FC = ReactElementType.FC - export type ComponentType = FC - export type ReactElement = ReactElementType.ReactElement - export type RefForwardingComponent< - T, - P - > = ReactElementType.RefForwardingComponent - - // context type - export type Consumer = ReactElementType.Consumer - export type Provider = ReactElementType.Provider - export type ReactContext = ReactElementType.ReactContext -} - -declare global { - namespace JSX { - type IntrinsicElements = { - [K in keyof HTMLElementTagNameMap]: React.IntrinsicAttributes< - HTMLElementTagNameMap[K] - > - } - interface Element extends React.ReactElement {} - interface ElementChildrenAttribute { - children: {} - } - export import RefAttributes = React.MutableRefObject - } -} - -// hooks -const useCallBack = ReactFiberHooks.useCallBack -const useMemo = ReactFiberHooks.useMemo -const useReducer = ReactFiberHooks.useReducer -const useRef = ReactFiberHooks.useRef -const useState = ReactFiberHooks.useState -const useEffect = ReactFiberHooks.useEffect -const useImperativeHandle = ReactFiberHooks.useImperativeHandle - -// TSX Types -type CSSProperties = React.CSSProperties -type Props = React.Props - -// ReactElement -const Fragment = NodeType.Fragment -const forwardRef = ReactForwardRef -const lazy = ReactLazy.lazy -const Suspense = ReactLazy.Suspense -const memo = ReactMemo.memo - -// context -const createContext = ReactContext.createContext - -// options -const Stack = ReactStack - -export default React -export { - React, - // hooks - useCallBack, - useMemo, - useReducer, - useRef, - useState, - useEffect, - useImperativeHandle, - // reconciler creator - createRenderer, - // TSX Types - CSSProperties, - Props, - // ReactElement - Fragment, - forwardRef, - lazy, - Suspense, - memo, - // context - createContext, - // options - Stack -} diff --git a/src/core/react/ReactChildren.ts b/src/core/react/ReactChildren.ts deleted file mode 100644 index 8b151db..0000000 --- a/src/core/react/ReactChildren.ts +++ /dev/null @@ -1,42 +0,0 @@ -/* - * @Author: saber2pr - * @Date: 2019-12-07 15:25:38 - * @Last Modified by: saber2pr - * @Last Modified time: 2019-12-08 11:01:04 - */ -import { Fiber, NodeType } from "../shared/ReactTypes" - -const toTextFiber = (nodeValue: string | number): Fiber => ({ - tag: "#text", - $$typeof: NodeType.Text, - props: { nodeValue } -}) - -// flat polyfill -const flat = (arr: T[]) => Array.prototype.concat(...arr) -const flat2 = (arr: T[]) => flat(flat(arr)) - -namespace Children { - export const toArray = (...children: any[]): Fiber[] => { - return flat2(children).reduce( - (acc, ch) => { - // `if render` get false or undefind, ignore it - if (ch === false || ch === undefined) return acc - - // to text node - if (typeof ch === "number") { - return acc.concat(toTextFiber(ch)) - } - if (typeof ch === "string") { - return acc.concat(toTextFiber(ch)) - } - - // collect object - return acc.concat(ch) - }, - [] as Fiber[] - ) - } -} - -export { Children } diff --git a/src/core/react/ReactContext.ts b/src/core/react/ReactContext.ts deleted file mode 100644 index db2ed77..0000000 --- a/src/core/react/ReactContext.ts +++ /dev/null @@ -1,24 +0,0 @@ -/* - * @Author: saber2pr - * @Date: 2019-12-10 20:16:31 - * @Last Modified by: saber2pr - * @Last Modified time: 2019-12-10 20:19:33 - */ -import { ReactContext, Provider, Consumer } from "../shared/ReactElementType" - -function createContext(context: T): ReactContext { - const Provider: Provider = ({ children, value }) => { - context = value - return children - } - const Consumer: Consumer = ({ children }) => { - return children(context) - } - return { - Provider, - Consumer, - value: context - } -} - -export { createContext } diff --git a/src/core/react/ReactElement.ts b/src/core/react/ReactElement.ts deleted file mode 100644 index 77d3df1..0000000 --- a/src/core/react/ReactElement.ts +++ /dev/null @@ -1,32 +0,0 @@ -/* - * @Author: saber2pr - * @Date: 2019-12-07 22:30:12 - * @Last Modified by: saber2pr - * @Last Modified time: 2019-12-08 11:18:18 - */ -import { Fiber, NodeType } from "../shared/ReactTypes" -import { Children } from "./ReactChildren" - -const createTextElement = (nodeValue: string | number): Fiber => ({ - tag: "#text", - $$typeof: NodeType.Text, - props: { nodeValue } -}) - -const createElement = (tag: any, props: object, ...children: any[]): Fiber => { - props = { ...props, children: Children.toArray(...children) } - - if (typeof tag === "string") { - return { $$typeof: NodeType.Host, tag, props } - } - if (typeof tag === "function") { - return { $$typeof: NodeType.Hook, tag, props } - } - if (tag === NodeType.Fragment) { - return { $$typeof: NodeType.Fragment, tag: "#fragment", props } - } - - return { $$typeof: NodeType.Unknown, tag, props } -} - -export { createElement, createTextElement } diff --git a/src/core/react/ReactLazy.ts b/src/core/react/ReactLazy.ts deleted file mode 100644 index 7f88629..0000000 --- a/src/core/react/ReactLazy.ts +++ /dev/null @@ -1,56 +0,0 @@ -/* - * @Author: saber2pr - * @Date: 2019-12-10 20:01:34 - * @Last Modified by: saber2pr - * @Last Modified time: 2019-12-10 22:00:33 - */ -import { - useState, - useContext, - useEffect -} from "../react-reconciler/ReactFiberHooks" -import { createContext } from "./ReactContext" -import { LazyComponent } from "../shared/ReactElementType" - -const SuspenseContext = createContext<{ - fallback?: JSX.Element - result?: JSX.Element -}>({}) - -const lazy = (lazyComponent: LazyComponent) => ( - props: T -) => { - const Context = useContext(SuspenseContext) - const { fallback, result } = Context - - const [state, setState] = useState(fallback) - - useEffect(() => { - //TODO: when it will unmount, cancel the render. - if (result) { - setState(result) - } else { - lazyComponent(props).then(({ default: render }) => { - const result = render() - setState(result) - Context.result = result - }) - } - }, [Context.fallback]) - - return state -} - -const Suspense = ({ - fallback, - children -}: { - fallback: JSX.Element - children?: JSX.Element -}) => { - const Context = useContext(SuspenseContext) - Context.fallback = fallback - return children -} - -export { Suspense, lazy } diff --git a/src/core/react/forwardRef.ts b/src/core/react/forwardRef.ts deleted file mode 100644 index ad2447e..0000000 --- a/src/core/react/forwardRef.ts +++ /dev/null @@ -1,13 +0,0 @@ -/* - * @Author: saber2pr - * @Date: 2019-12-10 17:42:24 - * @Last Modified by: saber2pr - * @Last Modified time: 2019-12-10 18:00:46 - */ -import { MutableRefObject, RefForwardingComponent } from "../shared/ReactElementType" - -const forwardRef = ( - FC: RefForwardingComponent -) => ({ ref, ...props }: { ref: MutableRefObject } & P) => FC(props as any, ref) - -export { forwardRef } diff --git a/src/core/react/memo.ts b/src/core/react/memo.ts deleted file mode 100644 index bff7031..0000000 --- a/src/core/react/memo.ts +++ /dev/null @@ -1,42 +0,0 @@ -/* - * @Author: saber2pr - * @Date: 2019-12-13 16:35:23 - * @Last Modified by: saber2pr - * @Last Modified time: 2019-12-13 16:57:09 - */ -import React from "./React" -import { shallowEqual } from "../shared/shallowEqual" -import { useRef } from "../react-reconciler/ReactFiberHooks" - -// omit key `children` in props compared. -const pickProps = (props: Object) => - Object.fromEntries(Object.entries(props).filter(([k]) => k !== "children")) - -function memo

( - component: React.FC

, - compare?: (oldProps: P, newProps: P) => boolean -) { - const Component = (props: P) => { - const newProps = pickProps(props) as P - const prevProps = useRef

(null) - const result = useRef(null) - - if (compare) { - if (compare(prevProps.current, newProps)) { - return result.current - } - } else { - if (shallowEqual(prevProps.current, newProps)) { - return result.current - } - } - - prevProps.current = newProps - result.current = component(props) - return result.current - } - - return Component -} - -export { memo } diff --git a/src/core/shared/ReactElementType.ts b/src/core/shared/ReactElementType.ts deleted file mode 100644 index 620fe6e..0000000 --- a/src/core/shared/ReactElementType.ts +++ /dev/null @@ -1,56 +0,0 @@ -/* - * @Last Modified by: saber2pr - * @Last Modified time: 2019-12-08 12:32:58 - * @Last Modified by: saber2pr - * @Last Modified time: 2019-12-10 20:35:19 - */ -interface MutableRefObject { - current: T; -} - -type RefObject = MutableRefObject | ((value: T) => void) - -interface Props { - ref?: RefObject - children?: any - [compatibleProps: string]: any -} - -type ReactElement = { - $$typeof: symbol - props: Props - tag: any -} - -type FC = (props: T, ...params: any[]) => ReactElement -type RefForwardingComponent = (props: P, ref: MutableRefObject) => ReactElement - -type Provider = (props: { - value?: T - children?: ReactElement -}) => ReactElement - -type Consumer = (props: { - children?: (context: T) => ReactElement -}) => ReactElement - -type ReactContext = { - Provider: Provider - Consumer: Consumer - value: T -} - -type LazyComponent = (props: T) => Promise<{ default: () => JSX.Element }> - -export { - ReactElement, - MutableRefObject, - RefObject, - Props, - FC, - RefForwardingComponent, - Provider, - Consumer, - ReactContext, - LazyComponent -} diff --git a/src/core/shared/ReactTypes.ts b/src/core/shared/ReactTypes.ts deleted file mode 100644 index 671cd34..0000000 --- a/src/core/shared/ReactTypes.ts +++ /dev/null @@ -1,77 +0,0 @@ -/* - * @Author: saber2pr - * @Date: 2019-12-06 16:47:37 - * @Last Modified by: saber2pr - * @Last Modified time: 2019-12-10 17:24:55 - */ -import { Props } from "./ReactElementType" - -namespace NodeType { - export const Text = Symbol("Text") - export const Fragment = Symbol("DocumentFragment") - export const Root = Symbol("Container") - export const Hook = Symbol("Hook") - export const Host = Symbol("Host") - export const Unknown = Symbol("Unknown") -} - -namespace EffectType { - export const Place = Symbol("Place") - export const Update = Symbol("Update") - export const Delete = Symbol("Delete") - export const Create = Symbol("Create") - - export const getEffectLevel = (effectType: symbol): number => { - switch (effectType) { - case Create: - return 4 - case Update: - return 3 - case Place: - return 2 - case Delete: - return 1 - default: - return 0 - } - } -} - -interface Instance {} -interface TextInstance {} -interface FragmentInstance {} - -type Effect = () => (() => void) | void - -interface MemoizedState { - in?: Effect[] - out?: Effect[] - [id: number]: any -} - -type Fiber = { - tag?: any - $$typeof?: symbol - props?: Props - memoizedState?: MemoizedState - stateNode?: Instance | TextInstance | FragmentInstance - return?: Fiber - child?: Fiber - sibling?: Fiber - alternate?: Fiber - effectType?: symbol - effectList?: Fiber[] - callback?: Function - [key: string]: any -} - -export { - NodeType, - EffectType, - Instance, - TextInstance, - FragmentInstance, - Effect, - MemoizedState, - Fiber -} diff --git a/src/core/shared/objectIs.ts b/src/core/shared/objectIs.ts deleted file mode 100644 index 283cf6a..0000000 --- a/src/core/shared/objectIs.ts +++ /dev/null @@ -1,8 +0,0 @@ -/* - * @Author: saber2pr - * @Date: 2019-12-07 15:21:04 - * @Last Modified by: saber2pr - * @Last Modified time: 2019-12-07 15:21:04 - */ -export const is = (x: any, y: any) => - (x === y && (x !== 0 || 1 / x === 1 / y)) || (x !== x && y !== y) diff --git a/src/core/shared/shallowEqual.ts b/src/core/shared/shallowEqual.ts deleted file mode 100644 index e69fd55..0000000 --- a/src/core/shared/shallowEqual.ts +++ /dev/null @@ -1,44 +0,0 @@ -/* - * @Author: saber2pr - * @Date: 2019-12-13 16:26:00 - * @Last Modified by: saber2pr - * @Last Modified time: 2019-12-13 16:26:00 - */ -import { is } from "./objectIs" - -const hasOwnProperty = Object.prototype.hasOwnProperty - -function shallowEqual(objA: object, objB: object): boolean { - if (is(objA, objB)) { - return true - } - - if ( - typeof objA !== "object" || - objA === null || - typeof objB !== "object" || - objB === null - ) { - return false - } - - const keysA = Object.keys(objA) - const keysB = Object.keys(objB) - - if (keysA.length !== keysB.length) { - return false - } - - for (let i = 0; i < keysA.length; i++) { - if ( - !hasOwnProperty.call(objB, keysA[i]) || - !is(objA[keysA[i]], objB[keysA[i]]) - ) { - return false - } - } - - return true -} - -export { shallowEqual } diff --git a/src/core/shared/testStackSize.ts b/src/core/shared/testStackSize.ts deleted file mode 100644 index dbf0ca5..0000000 --- a/src/core/shared/testStackSize.ts +++ /dev/null @@ -1,73 +0,0 @@ -/* - * @Author: saber2pr - * @Date: 2019-12-07 15:20:04 - * @Last Modified by: saber2pr - * @Last Modified time: 2019-12-11 20:51:02 - */ -let MAX_STACK_SIZE = 10000 -const MAX_STACK_ID = Symbol("MAX_STACK_ID") - -const setMaxStackSize = (size: number) => { - MAX_STACK_SIZE = size -} - -const resetStackSize = (id = "default") => { - const size = TestStackSize[MAX_STACK_ID] - if (size) { - size[id] = 0 - } -} - -const resetStack = () => { - TestStackSize[MAX_STACK_ID] = {} -} - -type StackSizeMap = { [id: string]: number } -type StackListener = ( - stackSize: { id: string; size: number }, - stackSizeMap: StackSizeMap -) => void -let listeners: StackListener[] - -const watchStackSize = (callback: StackListener) => { - if (!listeners) { - listeners = [] - } - - listeners.push(callback) - return () => { - listeners.splice(listeners.indexOf(callback), 1) - } -} - -const TestStackSize = (id = "default") => { - if (!TestStackSize[MAX_STACK_ID]) { - resetStack() - } - const size = TestStackSize[MAX_STACK_ID] - - if (id in size) { - size[id]++ - } else { - size[id] = 1 - } - - if (size[id] > MAX_STACK_SIZE) { - throw new Error( - `STACK SIZE OVERFLOW: ${id}, try to reset the MAX_STACK_SIZE(${MAX_STACK_SIZE}); - method: React.Stack.setMaxStackSize()` - ) - } - - if (listeners) { - listeners.forEach(listener => listener({ id, size: size[id] }, size)) - } -} - -export { - setMaxStackSize, - TestStackSize, - resetStackSize, - watchStackSize, - resetStack -} diff --git a/src/index.ts b/src/index.ts deleted file mode 100644 index f894ca0..0000000 --- a/src/index.ts +++ /dev/null @@ -1,8 +0,0 @@ -/* - * @Author: saber2pr - * @Date: 2019-12-07 22:41:51 - * @Last Modified by: saber2pr - * @Last Modified time: 2019-12-07 22:41:51 - */ -export * from "./core/react/React" -export { default } from "./core/react/React" diff --git a/src/reconciler.ts b/src/reconciler.ts deleted file mode 100644 index 405b322..0000000 --- a/src/reconciler.ts +++ /dev/null @@ -1,8 +0,0 @@ -/* - * @Author: saber2pr - * @Date: 2019-12-13 12:51:51 - * @Last Modified by: saber2pr - * @Last Modified time: 2019-12-13 12:51:51 - */ -export * from "./core/react-reconciler/ReactFiberReconciler" -export { default } from "./core/react-reconciler/ReactFiberReconciler" diff --git a/src/server.ts b/src/server.ts deleted file mode 100644 index 3f702dc..0000000 --- a/src/server.ts +++ /dev/null @@ -1,8 +0,0 @@ -/* - * @Author: saber2pr - * @Date: 2019-12-07 22:41:48 - * @Last Modified by: saber2pr - * @Last Modified time: 2019-12-07 22:41:48 - */ -export * from "./core/react-dom/server/ReactDOMServer" -export { default } from "./core/react-dom/server/ReactDOMServer" diff --git a/tsconfig.json b/tsconfig.json deleted file mode 100644 index 00ddefd..0000000 --- a/tsconfig.json +++ /dev/null @@ -1,13 +0,0 @@ -{ - "compilerOptions": { - "target": "es5", - "module": "commonjs", - "declaration": true, - "outDir": "./lib", - "esModuleInterop": true, - "jsx": "react", - "lib": ["dom", "es2015", "esnext"] - }, - "include": ["src"], - "exclude": ["node_modules", "lib"] -} diff --git a/yarn.lock b/yarn.lock deleted file mode 100644 index c31f00e..0000000 --- a/yarn.lock +++ /dev/null @@ -1,280 +0,0 @@ -# THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY. -# yarn lockfile v1 - - -"@babel/code-frame@^7.0.0": - version "7.5.5" - resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.5.5.tgz#bc0782f6d69f7b7d49531219699b988f669a8f9d" - integrity sha512-27d4lZoomVyo51VegxI20xZPuSHusqbQag/ztrBC7wegWoQ1nLREPVSKSW8byhTlzTKyNE4ifaTA6lCp7JjpFw== - dependencies: - "@babel/highlight" "^7.0.0" - -"@babel/highlight@^7.0.0": - version "7.5.0" - resolved "https://registry.yarnpkg.com/@babel/highlight/-/highlight-7.5.0.tgz#56d11312bd9248fa619591d02472be6e8cb32540" - integrity sha512-7dV4eu9gBxoM0dAnj/BCFDW9LFU0zvTrkq0ugM7pnHEgguOEeOz1so2ZghEdzviYzQEED0r4EAgpsBChKy1TRQ== - dependencies: - chalk "^2.0.0" - esutils "^2.0.2" - js-tokens "^4.0.0" - -"@rollup/plugin-html@^0.2.3": - version "0.2.3" - resolved "https://registry.npm.taobao.org/@rollup/plugin-html/download/@rollup/plugin-html-0.2.3.tgz#bed48fc18dbde345c0ef09b0b53a165d7bd3b7cd" - integrity sha1-vtSPwY2940XA7wmwtToWXXvTt80= - -"@types/estree@*": - version "0.0.40" - resolved "https://registry.yarnpkg.com/@types/estree/-/estree-0.0.40.tgz#0e6cb9b9bbd098031fa19e4b4e8131bc70e5de13" - integrity sha512-p3KZgMto/JyxosKGmnLDJ/dG5wf+qTRMUjHJcspC2oQKa4jP7mz+tv0ND56lLBu3ojHlhzY33Ol+khLyNmilkA== - -"@types/node@*": - version "12.12.14" - resolved "https://registry.yarnpkg.com/@types/node/-/node-12.12.14.tgz#1c1d6e3c75dba466e0326948d56e8bd72a1903d2" - integrity sha512-u/SJDyXwuihpwjXy7hOOghagLEV1KdAST6syfnOk6QZAMzZuWZqXy5aYYZbh8Jdpd4escVFP0MvftHNDb9pruA== - -"@types/resolve@0.0.8": - version "0.0.8" - resolved "https://registry.yarnpkg.com/@types/resolve/-/resolve-0.0.8.tgz#f26074d238e02659e323ce1a13d041eee280e194" - integrity sha512-auApPaJf3NPfe18hSoJkp8EbZzer2ISk7o8mCC3M9he/a04+gbMF97NkpD2S8riMGvm4BMRI59/SZQSaLTKpsQ== - dependencies: - "@types/node" "*" - -acorn@^7.1.0: - version "7.1.1" - resolved "https://registry.yarnpkg.com/acorn/-/acorn-7.1.1.tgz#e35668de0b402f359de515c5482a1ab9f89a69bf" - integrity sha512-add7dgA5ppRPxCFJoAGfMDi7PIBXq1RtGo7BhbLaxwrXPOmw8gq48Y9ozT01hUKy9byMjlR20EJhu5zlkErEkg== - -ansi-styles@^3.2.1: - version "3.2.1" - resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-3.2.1.tgz#41fbb20243e50b12be0f04b8dedbf07520ce841d" - integrity sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA== - dependencies: - color-convert "^1.9.0" - -builtin-modules@^3.1.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/builtin-modules/-/builtin-modules-3.1.0.tgz#aad97c15131eb76b65b50ef208e7584cd76a7484" - integrity sha512-k0KL0aWZuBt2lrxrcASWDfwOLMnodeQjodT/1SxEQAXsHANgo6ZC/VEaSEHCXt7aSTZ4/4H5LKa+tBXmW7Vtvw== - -chalk@^2.0.0: - version "2.4.2" - resolved "https://registry.yarnpkg.com/chalk/-/chalk-2.4.2.tgz#cd42541677a54333cf541a49108c1432b44c9424" - integrity sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ== - dependencies: - ansi-styles "^3.2.1" - escape-string-regexp "^1.0.5" - supports-color "^5.3.0" - -color-convert@^1.9.0: - version "1.9.3" - resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-1.9.3.tgz#bb71850690e1f136567de629d2d5471deda4c1e8" - integrity sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg== - dependencies: - color-name "1.1.3" - -color-name@1.1.3: - version "1.1.3" - resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.3.tgz#a7d0558bd89c42f795dd42328f740831ca53bc25" - integrity sha1-p9BVi9icQveV3UIyj3QIMcpTvCU= - -commander@~2.20.3: - version "2.20.3" - resolved "https://registry.yarnpkg.com/commander/-/commander-2.20.3.tgz#fd485e84c03eb4881c20722ba48035e8531aeb33" - integrity sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ== - -cross-env@^7.0.3: - version "7.0.3" - resolved "https://registry.nlark.com/cross-env/download/cross-env-7.0.3.tgz#865264b29677dc015ba8418918965dd232fc54cf" - integrity sha1-hlJkspZ33AFbqEGJGJZd0jL8VM8= - dependencies: - cross-spawn "^7.0.1" - -cross-spawn@^7.0.1: - version "7.0.3" - resolved "https://registry.nlark.com/cross-spawn/download/cross-spawn-7.0.3.tgz#f73a85b9d5d41d045551c177e2882d4ac85728a6" - integrity sha1-9zqFudXUHQRVUcF34ogtSshXKKY= - dependencies: - path-key "^3.1.0" - shebang-command "^2.0.0" - which "^2.0.1" - -escape-string-regexp@^1.0.5: - version "1.0.5" - resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz#1b61c0562190a8dff6ae3bb2cf0200ca130b86d4" - integrity sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ= - -estree-walker@^0.6.0, estree-walker@^0.6.1: - version "0.6.1" - resolved "https://registry.yarnpkg.com/estree-walker/-/estree-walker-0.6.1.tgz#53049143f40c6eb918b23671d1fe3219f3a1b362" - integrity sha512-SqmZANLWS0mnatqbSfRP5g8OXZC12Fgg1IwNtLsyHDzJizORW4khDfjPqJZsemPWBB2uqykUah5YpQ6epsqC/w== - -esutils@^2.0.2: - version "2.0.3" - resolved "https://registry.yarnpkg.com/esutils/-/esutils-2.0.3.tgz#74d2eb4de0b8da1293711910d50775b9b710ef64" - integrity sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g== - -has-flag@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-3.0.0.tgz#b5d454dc2199ae225699f3467e5a07f3b955bafd" - integrity sha1-tdRU3CGZriJWmfNGfloH87lVuv0= - -is-module@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/is-module/-/is-module-1.0.0.tgz#3258fb69f78c14d5b815d664336b4cffb6441591" - integrity sha1-Mlj7afeMFNW4FdZkM2tM/7ZEFZE= - -isexe@^2.0.0: - version "2.0.0" - resolved "https://registry.npm.taobao.org/isexe/download/isexe-2.0.0.tgz#e8fbf374dc556ff8947a10dcb0572d633f2cfa10" - integrity sha1-6PvzdNxVb/iUehDcsFctYz8s+hA= - -jest-worker@^24.0.0: - version "24.9.0" - resolved "https://registry.yarnpkg.com/jest-worker/-/jest-worker-24.9.0.tgz#5dbfdb5b2d322e98567898238a9697bcce67b3e5" - integrity sha512-51PE4haMSXcHohnSMdM42anbvZANYTqMrr52tVKPqqsPJMzoP6FYYDVqahX/HrAoKEKz3uUPzSvKs9A3qR4iVw== - dependencies: - merge-stream "^2.0.0" - supports-color "^6.1.0" - -js-tokens@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/js-tokens/-/js-tokens-4.0.0.tgz#19203fb59991df98e3a287050d4647cdeaf32499" - integrity sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ== - -magic-string@^0.25.2: - version "0.25.4" - resolved "https://registry.yarnpkg.com/magic-string/-/magic-string-0.25.4.tgz#325b8a0a79fc423db109b77fd5a19183b7ba5143" - integrity sha512-oycWO9nEVAP2RVPbIoDoA4Y7LFIJ3xRYov93gAyJhZkET1tNuB0u7uWkZS2LpBWTJUWnmau/To8ECWRC+jKNfw== - dependencies: - sourcemap-codec "^1.4.4" - -merge-stream@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/merge-stream/-/merge-stream-2.0.0.tgz#52823629a14dd00c9770fb6ad47dc6310f2c1f60" - integrity sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w== - -path-key@^3.1.0: - version "3.1.1" - resolved "https://registry.nlark.com/path-key/download/path-key-3.1.1.tgz#581f6ade658cbba65a0d3380de7753295054f375" - integrity sha1-WB9q3mWMu6ZaDTOA3ndTKVBU83U= - -path-parse@^1.0.6: - version "1.0.6" - resolved "https://registry.yarnpkg.com/path-parse/-/path-parse-1.0.6.tgz#d62dbb5679405d72c4737ec58600e9ddcf06d24c" - integrity sha512-GSmOT2EbHrINBf9SR7CDELwlJ8AENk3Qn7OikK4nFYAu3Ote2+JYNVvkpAEQm3/TLNEJFD/xZJjzyxg3KBWOzw== - -resolve@^1.10.0, resolve@^1.11.1: - version "1.13.1" - resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.13.1.tgz#be0aa4c06acd53083505abb35f4d66932ab35d16" - integrity sha512-CxqObCX8K8YtAhOBRg+lrcdn+LK+WYOS8tSjqSFbjtrI5PnS63QPhZl4+yKfrU9tdsbMu9Anr/amegT87M9Z6w== - dependencies: - path-parse "^1.0.6" - -rollup-plugin-commonjs@^9.2.0: - version "9.3.4" - resolved "https://registry.yarnpkg.com/rollup-plugin-commonjs/-/rollup-plugin-commonjs-9.3.4.tgz#2b3dddbbbded83d45c36ff101cdd29e924fd23bc" - integrity sha512-DTZOvRoiVIHHLFBCL4pFxOaJt8pagxsVldEXBOn6wl3/V21wVaj17HFfyzTsQUuou3sZL3lEJZVWKPFblJfI6w== - dependencies: - estree-walker "^0.6.0" - magic-string "^0.25.2" - resolve "^1.10.0" - rollup-pluginutils "^2.6.0" - -rollup-plugin-node-resolve@^5.2.0: - version "5.2.0" - resolved "https://registry.yarnpkg.com/rollup-plugin-node-resolve/-/rollup-plugin-node-resolve-5.2.0.tgz#730f93d10ed202473b1fb54a5997a7db8c6d8523" - integrity sha512-jUlyaDXts7TW2CqQ4GaO5VJ4PwwaV8VUGA7+km3n6k6xtOEacf61u0VXwN80phY/evMcaS+9eIeJ9MOyDxt5Zw== - dependencies: - "@types/resolve" "0.0.8" - builtin-modules "^3.1.0" - is-module "^1.0.0" - resolve "^1.11.1" - rollup-pluginutils "^2.8.1" - -rollup-plugin-uglify@^6.0.3: - version "6.0.3" - resolved "https://registry.yarnpkg.com/rollup-plugin-uglify/-/rollup-plugin-uglify-6.0.3.tgz#e3f776171344b580bec6c6ab8888622b67099457" - integrity sha512-PIv3CfhZJlOG8C85N0GX+uK09TPggmAS6Nk6fpp2ELzDAV5VUhNzOURDU2j7+MwuRr0zq9IZttUTADc/jH8Gkg== - dependencies: - "@babel/code-frame" "^7.0.0" - jest-worker "^24.0.0" - serialize-javascript "^1.9.0" - uglify-js "^3.4.9" - -rollup-pluginutils@^2.6.0, rollup-pluginutils@^2.8.1: - version "2.8.2" - resolved "https://registry.yarnpkg.com/rollup-pluginutils/-/rollup-pluginutils-2.8.2.tgz#72f2af0748b592364dbd3389e600e5a9444a351e" - integrity sha512-EEp9NhnUkwY8aif6bxgovPHMoMoNr2FulJziTndpt5H9RdwC47GSGuII9XxpSdzVGM0GWrNPHV6ie1LTNJPaLQ== - dependencies: - estree-walker "^0.6.1" - -rollup@^1.27.8: - version "1.27.8" - resolved "https://registry.yarnpkg.com/rollup/-/rollup-1.27.8.tgz#94288a957af9f4c2380b73a17494d87705997d0f" - integrity sha512-EVoEV5rAWl+5clnGznt1KY8PeVkzVQh/R0d2s3gHEkN7gfoyC4JmvIVuCtPbYE8NM5Ep/g+nAmvKXBjzaqTsHA== - dependencies: - "@types/estree" "*" - "@types/node" "*" - acorn "^7.1.0" - -serialize-javascript@^1.9.0: - version "1.9.1" - resolved "https://registry.yarnpkg.com/serialize-javascript/-/serialize-javascript-1.9.1.tgz#cfc200aef77b600c47da9bb8149c943e798c2fdb" - integrity sha512-0Vb/54WJ6k5v8sSWN09S0ora+Hnr+cX40r9F170nT+mSkaxltoE/7R3OrIdBSUv1OoiobH1QoWQbCnAO+e8J1A== - -shebang-command@^2.0.0: - version "2.0.0" - resolved "https://registry.nlark.com/shebang-command/download/shebang-command-2.0.0.tgz#ccd0af4f8835fbdc265b82461aaf0c36663f34ea" - integrity sha1-zNCvT4g1+9wmW4JGGq8MNmY/NOo= - dependencies: - shebang-regex "^3.0.0" - -shebang-regex@^3.0.0: - version "3.0.0" - resolved "https://registry.npm.taobao.org/shebang-regex/download/shebang-regex-3.0.0.tgz#ae16f1644d873ecad843b0307b143362d4c42172" - integrity sha1-rhbxZE2HPsrYQ7AwexQzYtTEIXI= - -source-map@~0.6.1: - version "0.6.1" - resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.6.1.tgz#74722af32e9614e9c287a8d0bbde48b5e2f1a263" - integrity sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g== - -sourcemap-codec@^1.4.4: - version "1.4.6" - resolved "https://registry.yarnpkg.com/sourcemap-codec/-/sourcemap-codec-1.4.6.tgz#e30a74f0402bad09807640d39e971090a08ce1e9" - integrity sha512-1ZooVLYFxC448piVLBbtOxFcXwnymH9oUF8nRd3CuYDVvkRBxRl6pB4Mtas5a4drtL+E8LDgFkQNcgIw6tc8Hg== - -supports-color@^5.3.0: - version "5.5.0" - resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-5.5.0.tgz#e2e69a44ac8772f78a1ec0b35b689df6530efc8f" - integrity sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow== - dependencies: - has-flag "^3.0.0" - -supports-color@^6.1.0: - version "6.1.0" - resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-6.1.0.tgz#0764abc69c63d5ac842dd4867e8d025e880df8f3" - integrity sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ== - dependencies: - has-flag "^3.0.0" - -typescript@^3.4.3: - version "3.7.2" - resolved "https://registry.yarnpkg.com/typescript/-/typescript-3.7.2.tgz#27e489b95fa5909445e9fef5ee48d81697ad18fb" - integrity sha512-ml7V7JfiN2Xwvcer+XAf2csGO1bPBdRbFCkYBczNZggrBZ9c7G3riSUeJmqEU5uOtXNPMhE3n+R4FA/3YOAWOQ== - -uglify-js@^3.4.9: - version "3.7.1" - resolved "https://registry.yarnpkg.com/uglify-js/-/uglify-js-3.7.1.tgz#35c7de17971a4aa7689cd2eae0a5b39bb838c0c5" - integrity sha512-pnOF7jY82wdIhATVn87uUY/FHU+MDUdPLkmGFvGoclQmeu229eTkbG5gjGGBi3R7UuYYSEeYXY/TTY5j2aym2g== - dependencies: - commander "~2.20.3" - source-map "~0.6.1" - -which@^2.0.1: - version "2.0.2" - resolved "https://registry.nlark.com/which/download/which-2.0.2.tgz#7c6a8dd0a636a0327e10b59c9286eee93f3f51b1" - integrity sha1-fGqN0KY2oDJ+ELWckobu6T8/UbE= - dependencies: - isexe "^2.0.0"