diff --git a/.gitignore b/.gitignore index a0f5a98..68c8c9a 100644 --- a/.gitignore +++ b/.gitignore @@ -1,3 +1,4 @@ node_modules/ build/ lib/ +test/react-test-suite/ \ No newline at end of file diff --git a/package.json b/package.json index 1bcdf6c..2958b04 100644 --- a/package.json +++ b/package.json @@ -12,7 +12,9 @@ "pretest": "npm run flow && eslint src test", "test": "jest", "tdd": "jest --watch", - "flow": "flow" + "flow": "flow", + "test:react-dom": + "jest --config ./scripts/jest/config.react-dom-test-suite.js" }, "lint-staged": { "src/**/*.{js}": ["eslint"], diff --git a/scripts/clone-react-dom-test-suite/index.js b/scripts/clone-react-dom-test-suite/index.js new file mode 100644 index 0000000..723edc9 --- /dev/null +++ b/scripts/clone-react-dom-test-suite/index.js @@ -0,0 +1,12 @@ +const { clone } = require('./utils'); + +const repoURL = 'git@github.com:facebook/react.git'; +const clonePath = './test/react-test-suite'; +console.log('Cloning...'); +clone(repoURL, clonePath) + .then(() => { + console.log('cloned'); + }) + .catch(e => { + console.log('Cloning failed'); + }); diff --git a/scripts/clone-react-dom-test-suite/utils.js b/scripts/clone-react-dom-test-suite/utils.js new file mode 100644 index 0000000..72e06d9 --- /dev/null +++ b/scripts/clone-react-dom-test-suite/utils.js @@ -0,0 +1,18 @@ +const { exec } = require('child_process'); +const { transform } = require('babel-core'); + +module.exports.clone = function(url, dirname) { + return new Promise((resolve, reject) => { + exec(`git clone --depth 1 ${url} ${dirname}`, error => { + if (error) { + reject(error); + } else { + resolve(error); + } + }); + }); +}; + +module.exports.silenceTests = filter => { + babel; +}; diff --git a/scripts/jest/config.react-dom-test-suite.js b/scripts/jest/config.react-dom-test-suite.js new file mode 100644 index 0000000..5c591b0 --- /dev/null +++ b/scripts/jest/config.react-dom-test-suite.js @@ -0,0 +1,23 @@ +const moduleNameMapper = { + '^react-dom$': '/lib/index.js', + '^react$': '/node_modules/react/', + '^react-reconciler$': '/node_modules/react-reconciler', + '^react-dom/test-utils$': '/node_modules/react-dom/test-utils', +}; + +module.exports = Object.assign( + {}, + { + rootDir: process.cwd(), + roots: [''], + moduleNameMapper, + testRegex: + 'test/react-test-suite/packages/react-dom/src/__tests__/.*\\.js$', + testPathIgnorePatterns: [ + '/node_modules/', + '-test.internal.js$', + '[Ss]erver', + ], + transformIgnorePatterns: ['/node_modules/', '/lib/'], + }, +); diff --git a/scripts/jest/preprocess.react-test-suite.js b/scripts/jest/preprocess.react-test-suite.js new file mode 100644 index 0000000..b2fbdc4 --- /dev/null +++ b/scripts/jest/preprocess.react-test-suite.js @@ -0,0 +1,25 @@ +const babel = require('babel-core'); +const path = require('path'); + +const babelOptions = { + plugins: [ + // For Node environment only. For builds, Rollup takes care of ESM. + require.resolve('babel-plugin-transform-es2015-modules-commonjs'), + require.resolve('babel-plugin-transform-react-jsx-source'), + require.resolve('babel-plugin-transform-async-to-generator'), + ], + retainLines: true, +}; + +module.exports = { + process: function(src, filePath) { + const isTestFile = !!filePath.match(/\/__tests__\//); + return babel.transform( + src, + Object.assign( + { filename: path.relative(process.cwd(), filePath) }, + babelOptions, + ), + ).code; + }, +}; diff --git a/src/Reconciler.js b/src/Reconciler.js index b6c1bd1..e76f6a5 100644 --- a/src/Reconciler.js +++ b/src/Reconciler.js @@ -115,8 +115,10 @@ const hostConfig: HostConfig< }, useSyncScheduling: true, - scheduleDeferredCallback: window.requestIdleCallback, - cancelDeferredCallback: window.cancelIdleCallback, + scheduleDeferredCallback: + typeof window === 'undefined' ? () => {} : window.requestIdleCallback, + cancelDeferredCallback: + typeof window === 'undefined' ? () => {} : window.cancelIdleCallback, shouldDeprioritizeSubtree: (type: string, props: Props) => !!props.hidden, mutation: {