From 6b7ba0558328213d4c66784cd7b95c93a5819293 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Albert=20N=C4=9Bmec?= Date: Wed, 29 Mar 2017 11:24:51 +0200 Subject: [PATCH 1/3] add flow-type and configurate it --- .babelrc | 2 +- .flowconfig | 16 ++++ flow-typed/modules.js | 8 ++ package.json | 3 + src/browser/App.react.js | 3 +- yarn.lock | 176 +++++++++++++++++++++++++++++++++++++-- 6 files changed, 198 insertions(+), 10 deletions(-) create mode 100644 .flowconfig create mode 100644 flow-typed/modules.js diff --git a/.babelrc b/.babelrc index fe16857..6d0a1fb 100644 --- a/.babelrc +++ b/.babelrc @@ -1,5 +1,5 @@ { - "presets": ["es2015-node6", "stage-1", "react"], + "presets": ["es2015-node6", "stage-1", "react", "flow"], "plugins": [ "transform-decorators-legacy", "add-module-exports", diff --git a/.flowconfig b/.flowconfig new file mode 100644 index 0000000..547bb83 --- /dev/null +++ b/.flowconfig @@ -0,0 +1,16 @@ +[ignore] +.*/node_modules/fbjs/* + + +[include] +./src/browser/App.react.js + +[libs] + +[options] +module.ignore_non_literal_requires=true +esproposal.class_instance_fields=enable +esproposal.class_static_fields=enable +esproposal.decorators=ignore +esproposal.export_star_as=enable +strip_root=true diff --git a/flow-typed/modules.js b/flow-typed/modules.js new file mode 100644 index 0000000..618a542 --- /dev/null +++ b/flow-typed/modules.js @@ -0,0 +1,8 @@ +/* + If Flow throws "Required module not found", altough module is not missing, + add new "declare module" statement here for that library. +*/ + +declare module 'react-helmet' { + declare module.exports: any; +} diff --git a/package.json b/package.json index 04afff5..4956925 100644 --- a/package.json +++ b/package.json @@ -29,7 +29,9 @@ "TondaHack" ], "devDependencies": { + "babel-cli": "^6.24.0", "babel-eslint": "^7.1.1", + "babel-preset-flow": "^6.23.0", "chokidar": "^1.6.1", "enzyme": "^2.7.0", "enzyme-to-json": "^1.4.5", @@ -38,6 +40,7 @@ "eslint-plugin-import": "^2.2.0", "eslint-plugin-jsx-a11y": "^3.0.2", "eslint-plugin-react": "^6.9.0", + "flow-bin": "^0.42.0", "jest": "^18.1.0", "react-addons-test-utils": "^15.4.2" }, diff --git a/src/browser/App.react.js b/src/browser/App.react.js index 04b1924..057685a 100644 --- a/src/browser/App.react.js +++ b/src/browser/App.react.js @@ -1,3 +1,4 @@ +// @flow import Helmet from 'react-helmet'; import React from 'react'; import logo from '../../assets/images/haystack_logo.png'; @@ -5,7 +6,7 @@ import logo from '../../assets/images/haystack_logo.png'; const App = () => (
- diff --git a/yarn.lock b/yarn.lock index 4f8a85d..b9c3c27 100644 --- a/yarn.lock +++ b/yarn.lock @@ -231,6 +231,27 @@ aws4@^1.2.1: version "1.5.0" resolved "https://registry.yarnpkg.com/aws4/-/aws4-1.5.0.tgz#0a29ffb79c31c9e712eeb087e8e7a64b4a56d755" +babel-cli@^6.24.0: + version "6.24.0" + resolved "https://registry.yarnpkg.com/babel-cli/-/babel-cli-6.24.0.tgz#a05ffd210dca0c288a26d5319c5ac8669a265ad0" + dependencies: + babel-core "^6.24.0" + babel-polyfill "^6.23.0" + babel-register "^6.24.0" + babel-runtime "^6.22.0" + commander "^2.8.1" + convert-source-map "^1.1.0" + fs-readdir-recursive "^1.0.0" + glob "^7.0.0" + lodash "^4.2.0" + output-file-sync "^1.1.0" + path-is-absolute "^1.0.0" + slash "^1.0.0" + source-map "^0.5.0" + v8flags "^2.0.10" + optionalDependencies: + chokidar "^1.6.1" + babel-code-frame@^6.16.0, babel-code-frame@^6.22.0: version "6.22.0" resolved "https://registry.yarnpkg.com/babel-code-frame/-/babel-code-frame-6.22.0.tgz#027620bee567a88c32561574e7fd0801d33118e4" @@ -239,7 +260,31 @@ babel-code-frame@^6.16.0, babel-code-frame@^6.22.0: esutils "^2.0.2" js-tokens "^3.0.0" -babel-core@^6.0.0, babel-core@^6.22.0: +babel-core@^6.0.0, babel-core@^6.24.0: + version "6.24.0" + resolved "https://registry.yarnpkg.com/babel-core/-/babel-core-6.24.0.tgz#8f36a0a77f5c155aed6f920b844d23ba56742a02" + dependencies: + babel-code-frame "^6.22.0" + babel-generator "^6.24.0" + babel-helpers "^6.23.0" + babel-messages "^6.23.0" + babel-register "^6.24.0" + babel-runtime "^6.22.0" + babel-template "^6.23.0" + babel-traverse "^6.23.1" + babel-types "^6.23.0" + babylon "^6.11.0" + convert-source-map "^1.1.0" + debug "^2.1.1" + json5 "^0.5.0" + lodash "^4.2.0" + minimatch "^3.0.2" + path-is-absolute "^1.0.0" + private "^0.1.6" + slash "^1.0.0" + source-map "^0.5.0" + +babel-core@^6.22.0: version "6.22.1" resolved "https://registry.yarnpkg.com/babel-core/-/babel-core-6.22.1.tgz#9c5fd658ba1772d28d721f6d25d968fc7ae21648" dependencies: @@ -273,7 +318,20 @@ babel-eslint@^7.1.1: babylon "^6.13.0" lodash.pickby "^4.6.0" -babel-generator@^6.18.0, babel-generator@^6.22.0: +babel-generator@^6.18.0, babel-generator@^6.24.0: + version "6.24.0" + resolved "https://registry.yarnpkg.com/babel-generator/-/babel-generator-6.24.0.tgz#eba270a8cc4ce6e09a61be43465d7c62c1f87c56" + dependencies: + babel-messages "^6.23.0" + babel-runtime "^6.22.0" + babel-types "^6.23.0" + detect-indent "^4.0.0" + jsesc "^1.3.0" + lodash "^4.2.0" + source-map "^0.5.0" + trim-right "^1.0.1" + +babel-generator@^6.22.0: version "6.22.0" resolved "https://registry.yarnpkg.com/babel-generator/-/babel-generator-6.22.0.tgz#d642bf4961911a8adc7c692b0c9297f325cda805" dependencies: @@ -412,6 +470,13 @@ babel-helpers@^6.22.0: babel-runtime "^6.22.0" babel-template "^6.22.0" +babel-helpers@^6.23.0: + version "6.23.0" + resolved "https://registry.yarnpkg.com/babel-helpers/-/babel-helpers-6.23.0.tgz#4f8f2e092d0b6a8808a4bde79c27f1e2ecf0d992" + dependencies: + babel-runtime "^6.22.0" + babel-template "^6.23.0" + babel-jest@^18.0.0: version "18.0.0" resolved "https://registry.yarnpkg.com/babel-jest/-/babel-jest-18.0.0.tgz#17ebba8cb3285c906d859e8707e4e79795fb65e3" @@ -435,6 +500,12 @@ babel-messages@^6.22.0: dependencies: babel-runtime "^6.22.0" +babel-messages@^6.23.0: + version "6.23.0" + resolved "https://registry.yarnpkg.com/babel-messages/-/babel-messages-6.23.0.tgz#f3cdf4703858035b2a2951c6ec5edf6c62f2630e" + dependencies: + babel-runtime "^6.22.0" + babel-plugin-add-module-exports@^0.2.1: version "0.2.1" resolved "https://registry.yarnpkg.com/babel-plugin-add-module-exports/-/babel-plugin-add-module-exports-0.2.1.tgz#9ae9a1f4a8dc67f0cdec4f4aeda1e43a5ff65e25" @@ -825,6 +896,14 @@ babel-polyfill@^6.20.0: core-js "^2.4.0" regenerator-runtime "^0.10.0" +babel-polyfill@^6.23.0: + version "6.23.0" + resolved "https://registry.yarnpkg.com/babel-polyfill/-/babel-polyfill-6.23.0.tgz#8364ca62df8eafb830499f699177466c3b03499d" + dependencies: + babel-runtime "^6.22.0" + core-js "^2.4.0" + regenerator-runtime "^0.10.0" + babel-preset-es2015-node6@^0.4.0: version "0.4.0" resolved "https://registry.yarnpkg.com/babel-preset-es2015-node6/-/babel-preset-es2015-node6-0.4.0.tgz#f8893f81b6533747924c657348867bd63b4f9dc2" @@ -863,6 +942,12 @@ babel-preset-es2015@^6.18.0: babel-plugin-transform-es2015-unicode-regex "^6.22.0" babel-plugin-transform-regenerator "^6.22.0" +babel-preset-flow@^6.23.0: + version "6.23.0" + resolved "https://registry.yarnpkg.com/babel-preset-flow/-/babel-preset-flow-6.23.0.tgz#e71218887085ae9a24b5be4169affb599816c49d" + dependencies: + babel-plugin-transform-flow-strip-types "^6.22.0" + babel-preset-jest@^18.0.0: version "18.0.0" resolved "https://registry.yarnpkg.com/babel-preset-jest/-/babel-preset-jest-18.0.0.tgz#84faf8ca3ec65aba7d5e3f59bbaed935ab24049e" @@ -908,7 +993,7 @@ babel-preset-stage-3@^6.22.0: babel-plugin-transform-exponentiation-operator "^6.22.0" babel-plugin-transform-object-rest-spread "^6.22.0" -babel-register@^6.18.0, babel-register@^6.22.0: +babel-register@^6.18.0: version "6.22.0" resolved "https://registry.yarnpkg.com/babel-register/-/babel-register-6.22.0.tgz#a61dd83975f9ca4a9e7d6eff3059494cd5ea4c63" dependencies: @@ -920,6 +1005,18 @@ babel-register@^6.18.0, babel-register@^6.22.0: mkdirp "^0.5.1" source-map-support "^0.4.2" +babel-register@^6.22.0, babel-register@^6.24.0: + version "6.24.0" + resolved "https://registry.yarnpkg.com/babel-register/-/babel-register-6.24.0.tgz#5e89f8463ba9970356d02eb07dabe3308b080cfd" + dependencies: + babel-core "^6.24.0" + babel-runtime "^6.22.0" + core-js "^2.4.0" + home-or-tmp "^2.0.0" + lodash "^4.2.0" + mkdirp "^0.5.1" + source-map-support "^0.4.2" + babel-runtime@^6.18.0, babel-runtime@^6.2.0, babel-runtime@^6.22.0, babel-runtime@^6.6.1: version "6.22.0" resolved "https://registry.yarnpkg.com/babel-runtime/-/babel-runtime-6.22.0.tgz#1cf8b4ac67c77a4ddb0db2ae1f74de52ac4ca611" @@ -927,7 +1024,17 @@ babel-runtime@^6.18.0, babel-runtime@^6.2.0, babel-runtime@^6.22.0, babel-runtim core-js "^2.4.0" regenerator-runtime "^0.10.0" -babel-template@^6.16.0, babel-template@^6.22.0, babel-template@^6.3.0: +babel-template@^6.16.0, babel-template@^6.23.0: + version "6.23.0" + resolved "https://registry.yarnpkg.com/babel-template/-/babel-template-6.23.0.tgz#04d4f270adbb3aa704a8143ae26faa529238e638" + dependencies: + babel-runtime "^6.22.0" + babel-traverse "^6.23.0" + babel-types "^6.23.0" + babylon "^6.11.0" + lodash "^4.2.0" + +babel-template@^6.22.0, babel-template@^6.3.0: version "6.22.0" resolved "https://registry.yarnpkg.com/babel-template/-/babel-template-6.22.0.tgz#403d110905a4626b317a2a1fcb8f3b73204b2edb" dependencies: @@ -937,7 +1044,7 @@ babel-template@^6.16.0, babel-template@^6.22.0, babel-template@^6.3.0: babylon "^6.11.0" lodash "^4.2.0" -babel-traverse@^6.15.0, babel-traverse@^6.18.0, babel-traverse@^6.22.0, babel-traverse@^6.22.1: +babel-traverse@^6.15.0, babel-traverse@^6.22.0, babel-traverse@^6.22.1: version "6.22.1" resolved "https://registry.yarnpkg.com/babel-traverse/-/babel-traverse-6.22.1.tgz#3b95cd6b7427d6f1f757704908f2fc9748a5f59f" dependencies: @@ -951,7 +1058,21 @@ babel-traverse@^6.15.0, babel-traverse@^6.18.0, babel-traverse@^6.22.0, babel-tr invariant "^2.2.0" lodash "^4.2.0" -babel-types@^6.15.0, babel-types@^6.18.0, babel-types@^6.19.0, babel-types@^6.22.0: +babel-traverse@^6.18.0, babel-traverse@^6.23.0, babel-traverse@^6.23.1: + version "6.23.1" + resolved "https://registry.yarnpkg.com/babel-traverse/-/babel-traverse-6.23.1.tgz#d3cb59010ecd06a97d81310065f966b699e14f48" + dependencies: + babel-code-frame "^6.22.0" + babel-messages "^6.23.0" + babel-runtime "^6.22.0" + babel-types "^6.23.0" + babylon "^6.15.0" + debug "^2.2.0" + globals "^9.0.0" + invariant "^2.2.0" + lodash "^4.2.0" + +babel-types@^6.15.0, babel-types@^6.22.0: version "6.22.0" resolved "https://registry.yarnpkg.com/babel-types/-/babel-types-6.22.0.tgz#2a447e8d0ea25d2512409e4175479fd78cc8b1db" dependencies: @@ -960,6 +1081,15 @@ babel-types@^6.15.0, babel-types@^6.18.0, babel-types@^6.19.0, babel-types@^6.22 lodash "^4.2.0" to-fast-properties "^1.0.1" +babel-types@^6.18.0, babel-types@^6.19.0, babel-types@^6.23.0: + version "6.23.0" + resolved "https://registry.yarnpkg.com/babel-types/-/babel-types-6.23.0.tgz#bb17179d7538bad38cd0c9e115d340f77e7e9acf" + dependencies: + babel-runtime "^6.22.0" + esutils "^2.0.2" + lodash "^4.2.0" + to-fast-properties "^1.0.1" + babylon@^6.11.0, babylon@^6.13.0, babylon@^6.15.0: version "6.15.0" resolved "https://registry.yarnpkg.com/babylon/-/babylon-6.15.0.tgz#ba65cfa1a80e1759b0e89fb562e27dccae70348e" @@ -1306,7 +1436,7 @@ combined-stream@^1.0.5, combined-stream@~1.0.5: dependencies: delayed-stream "~1.0.0" -commander@2.9.x, commander@^2.9.0: +commander@2.9.x, commander@^2.8.1, commander@^2.9.0: version "2.9.0" resolved "https://registry.yarnpkg.com/commander/-/commander-2.9.0.tgz#9c99094176e12240cb22d6c5146098400fe0f7d4" dependencies: @@ -2212,6 +2342,10 @@ flat-cache@^1.2.1: graceful-fs "^4.1.2" write "^0.2.1" +flow-bin@^0.42.0: + version "0.42.0" + resolved "https://registry.yarnpkg.com/flow-bin/-/flow-bin-0.42.0.tgz#05dd754b6b052de7b150f9210e2160746961e3cf" + for-in@^0.1.5: version "0.1.6" resolved "https://registry.yarnpkg.com/for-in/-/for-in-0.1.6.tgz#c9f96e89bfad18a545af5ec3ed352a1d9e5b4dc8" @@ -2260,6 +2394,10 @@ fs-extra@^0.30.0: path-is-absolute "^1.0.0" rimraf "^2.2.8" +fs-readdir-recursive@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/fs-readdir-recursive/-/fs-readdir-recursive-1.0.0.tgz#8cd1745c8b4f8a29c8caec392476921ba195f560" + fs.realpath@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/fs.realpath/-/fs.realpath-1.0.0.tgz#1504ad2523158caa40db4a2787cb01411994ea4f" @@ -2373,7 +2511,7 @@ globby@^5.0.0: pify "^2.0.0" pinkie-promise "^2.0.0" -graceful-fs@^4.1.2, graceful-fs@^4.1.6, graceful-fs@^4.1.9: +graceful-fs@^4.1.2, graceful-fs@^4.1.4, graceful-fs@^4.1.6, graceful-fs@^4.1.9: version "4.1.11" resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.1.11.tgz#0e8bdfe4d1ddb8854d64e04ea7c00e2a026e5658" @@ -3844,6 +3982,14 @@ os-tmpdir@^1.0.1: version "1.0.2" resolved "https://registry.yarnpkg.com/os-tmpdir/-/os-tmpdir-1.0.2.tgz#bbe67406c79aa85c5cfec766fe5734555dfa1274" +output-file-sync@^1.1.0: + version "1.1.2" + resolved "https://registry.yarnpkg.com/output-file-sync/-/output-file-sync-1.1.2.tgz#d0a33eefe61a205facb90092e826598d5245ce76" + dependencies: + graceful-fs "^4.1.4" + mkdirp "^0.5.1" + object-assign "^4.1.0" + pako@~0.2.0: version "0.2.9" resolved "https://registry.yarnpkg.com/pako/-/pako-0.2.9.tgz#f3f7522f4ef782348da8161bad9ecfd51bf83a75" @@ -4797,6 +4943,10 @@ traverse-chain@~0.1.0: version "0.1.0" resolved "https://registry.yarnpkg.com/traverse-chain/-/traverse-chain-0.1.0.tgz#61dbc2d53b69ff6091a12a168fd7d433107e40f1" +trim-right@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/trim-right/-/trim-right-1.0.1.tgz#cb2e1203067e0c8de1f614094b9fe45704ea6003" + tryit@^1.0.1: version "1.0.3" resolved "https://registry.yarnpkg.com/tryit/-/tryit-1.0.3.tgz#393be730a9446fd1ead6da59a014308f36c289cb" @@ -4887,6 +5037,10 @@ url@^0.11.0: punycode "1.3.2" querystring "0.2.0" +user-home@^1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/user-home/-/user-home-1.1.1.tgz#2b5be23a32b63a7c9deb8d0f28d485724a3df190" + user-home@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/user-home/-/user-home-2.0.0.tgz#9c70bfd8169bc1dcbf48604e0f04b8b49cde9e9f" @@ -4923,6 +5077,12 @@ uuid@^3.0.0, uuid@~3.0.0: version "3.0.1" resolved "https://registry.yarnpkg.com/uuid/-/uuid-3.0.1.tgz#6544bba2dfda8c1cf17e629a3a305e2bb1fee6c1" +v8flags@^2.0.10: + version "2.0.11" + resolved "https://registry.yarnpkg.com/v8flags/-/v8flags-2.0.11.tgz#bca8f30f0d6d60612cc2c00641e6962d42ae6881" + dependencies: + user-home "^1.1.1" + validate-npm-package-license@^3.0.1: version "3.0.1" resolved "https://registry.yarnpkg.com/validate-npm-package-license/-/validate-npm-package-license-3.0.1.tgz#2804babe712ad3379459acfbe24746ab2c303fbc" From 8d44cb5e49847044f93435bf33f3006182971c39 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Albert=20N=C4=9Bmec?= Date: Thu, 30 Mar 2017 02:30:05 +0200 Subject: [PATCH 2/3] Add more annotations --- flow-typed/{modules.js => declarations.js} | 2 ++ src/browser/BrowserProvider.react.js | 3 +- src/browser/main.js | 9 +++-- src/server/frontend/index.js | 2 ++ src/server/frontend/render.js | 4 ++- src/server/index.js | 41 ++++++++++++++++------ src/utils/timer.js | 2 ++ 7 files changed, 49 insertions(+), 14 deletions(-) rename flow-typed/{modules.js => declarations.js} (82%) diff --git a/flow-typed/modules.js b/flow-typed/declarations.js similarity index 82% rename from flow-typed/modules.js rename to flow-typed/declarations.js index 618a542..ec5af30 100644 --- a/flow-typed/modules.js +++ b/flow-typed/declarations.js @@ -6,3 +6,5 @@ declare module 'react-helmet' { declare module.exports: any; } + +declare var webpackIsomorphicTools: Object; diff --git a/src/browser/BrowserProvider.react.js b/src/browser/BrowserProvider.react.js index 1e02ada..e0f0f09 100644 --- a/src/browser/BrowserProvider.react.js +++ b/src/browser/BrowserProvider.react.js @@ -1,3 +1,4 @@ -const BrowserProvider = ({ children }) => children; +// @flow +const BrowserProvider = ({ children } : Object) : Object => children; export default BrowserProvider; diff --git a/src/browser/main.js b/src/browser/main.js index 4f36738..0f26a0a 100644 --- a/src/browser/main.js +++ b/src/browser/main.js @@ -1,19 +1,24 @@ +// @flow import React from 'react'; import ReactDOM from 'react-dom'; import App from './App.react'; import BrowserProvider from './BrowserProvider.react'; +type Module = { + hot: { accept: (Component: Function, callback: (updatedComponent: Function) => void) => void } + } | Object; + const renderApp = () => { ReactDOM.render( , - window.document.getElementById('app') + window.document.getElementById('app'), ); }; if (module && module.hot && module.hot.accept) { - module.hot.accept(App, renderApp); + (module: Module).hot.accept(App, renderApp); } renderApp(); diff --git a/src/server/frontend/index.js b/src/server/frontend/index.js index 55afa6f..f7a3020 100644 --- a/src/server/frontend/index.js +++ b/src/server/frontend/index.js @@ -1,3 +1,5 @@ +// @flow + import express from 'express'; import path from 'path'; import PrettyError from 'pretty-error'; diff --git a/src/server/frontend/render.js b/src/server/frontend/render.js index 95231d0..72b24ad 100644 --- a/src/server/frontend/render.js +++ b/src/server/frontend/render.js @@ -1,10 +1,12 @@ +// @flow + import Helmet from 'react-helmet'; import React from 'react'; import ReactDOMServer from 'react-dom/server'; import Html from './Html.react'; import ServerProvider from './ServerProvider.react'; -export default function render(app, options = {}) { +export default function render(app : Object, options : Object = {}) { const appHtml = ReactDOMServer.renderToString({app}); const { javascript: javascripts } = webpackIsomorphicTools.assets(); diff --git a/src/server/index.js b/src/server/index.js index e11ed30..d24578b 100644 --- a/src/server/index.js +++ b/src/server/index.js @@ -1,3 +1,5 @@ +//@flow + // Bootstrap environment require('../../env'); @@ -19,8 +21,27 @@ const express = require('express'); const fs = require('fs'); const path = require('path'); -const isInteractive = process.stdout.isTTY; -const rootDir = require('path').resolve(__dirname, '..', '..'); +type Process = { + stdout: Object +} + +type Watcher = { + watch: Function +} + +type IsomorphicTools = { + refresh: Function, + assets: Function +} + +type Config = { + output: { + publicPath: string + } +} + +const isInteractive : boolean = (process :Process).stdout.isTTY; +const rootDir : string = require('path').resolve(__dirname, '..', '..'); // HOT RELOAD: preload application so it will be loaded directly after removing cache // and it will not wait for user interacation :D @@ -41,9 +62,9 @@ const preloadApplication = () => { // HOT RELOAD: Reloading code in running node application without need of restart // https://medium.com/@kevinsimper/dont-use-nodemon-there-are-better-ways-fc016b50b45e#.gn0pnlbnb const watchChanges = () => { - const watcher = require('chokidar'); // eslint-disable-line import/no-extraneous-dependencies, global-require - const ignoreRegexp = /([/\\]\.)|(\.json$)/; - const sourceFilesRegexp = new RegExp(path.resolve(__dirname, '..')); + const watcher : Watcher = require('chokidar'); // eslint-disable-line import/no-extraneous-dependencies, global-require + const ignoreRegexp : RegExp = /([/\\]\.)|(\.json$)/; + const sourceFilesRegexp : RegExp = new RegExp(path.resolve(__dirname, '..')); // Chokidar is watching for file changes in src directory and ignoring dotfiles and *.json watcher.watch(path.join(__dirname, '..'), { ignored: ignoreRegexp }).on('all', (event, file) => { @@ -53,7 +74,7 @@ const watchChanges = () => { timer.start(); // remember cache size - const originalCacheSize = Object.keys(require.cache).length; + const originalCacheSize : number = Object.keys(require.cache).length; // remove all files from require cache which are in ./src/ directory // this will force next call of require to load files again @@ -85,13 +106,13 @@ const webpackHotMiddleware = require('webpack-hot-middleware'); const webpackIsomorphicAssets = require('../../webpack/assets'); const WebpackIsomorphicTools = require('webpack-isomorphic-tools'); const webpack = require('webpack'); -const config = require('../../webpack/webpack.config'); +const config : Config = require('../../webpack/webpack.config'); -global.webpackIsomorphicTools = new WebpackIsomorphicTools(webpackIsomorphicAssets) +const webpackIsomorphicTools : IsomorphicTools = new WebpackIsomorphicTools(webpackIsomorphicAssets) .server(rootDir, () => console.log('Webpack isomorphic tools started.')); - +global.webpackIsomorphicTools = webpackIsomorphicTools; // Make express to listen on port -const port = process.env.PORT || 8000; +const port : string = process.env.PORT || '8000'; if (process.env.NODE_ENV === 'development') { const options = { diff --git a/src/utils/timer.js b/src/utils/timer.js index 4532ef6..66f6979 100644 --- a/src/utils/timer.js +++ b/src/utils/timer.js @@ -1,3 +1,5 @@ +// @flow + let startTime; export function start() { From b0f9605ab2eb4d4c082fb42a5f75541d2787be6d Mon Sep 17 00:00:00 2001 From: zepod Date: Wed, 19 Apr 2017 12:23:49 +0200 Subject: [PATCH 3/3] add more flow types --- package.json | 4 +- src/browser/main.js | 2 +- src/server/frontend/Html.react.js | 23 ++- src/server/frontend/Script.react.js | 7 +- src/server/frontend/errors/NotFound.react.js | 5 +- src/server/frontend/index.js | 8 +- src/server/frontend/render.js | 4 +- src/server/index.js | 202 ++++++++----------- src/server/main.js | 4 +- src/server/middlewares/errorHandler.js | 4 +- src/utils/timer.js | 7 +- 11 files changed, 136 insertions(+), 134 deletions(-) diff --git a/package.json b/package.json index 4956925..8c5424b 100644 --- a/package.json +++ b/package.json @@ -1,7 +1,7 @@ { "name": "Haystack", "description": "Blueberry JS stack", - "version": "0.0.1", + "version": "0.0.2", "private": true, "engines": { "node": ">=6.9", @@ -16,7 +16,7 @@ "production": "yarn run production:build && yarn rollbar:sourcemaps:upload && yarn run production:server", "eslint": "eslint ./src", "jest": " jest", - "test": "jest", + "test": "flow && jest", "test:watch": "jest --watch", "webpack": "rimraf ./dist && webpack --config ./webpack/webpack.config.js", "rollbar:sourcemaps:upload": "node scripts/rollbarSourceMaps.js" diff --git a/src/browser/main.js b/src/browser/main.js index 0f26a0a..024ad35 100644 --- a/src/browser/main.js +++ b/src/browser/main.js @@ -5,7 +5,7 @@ import App from './App.react'; import BrowserProvider from './BrowserProvider.react'; type Module = { - hot: { accept: (Component: Function, callback: (updatedComponent: Function) => void) => void } + hot: { accept: (Component: Function, callback: (updatedComponent: Function) => void) => void } } | Object; const renderApp = () => { diff --git a/src/server/frontend/Html.react.js b/src/server/frontend/Html.react.js index 5b762d2..b3de14f 100644 --- a/src/server/frontend/Html.react.js +++ b/src/server/frontend/Html.react.js @@ -1,9 +1,28 @@ -/* eslint-disable react/no-danger */ +// @flow +/* eslint-disable react/no-danger */ +/* eslint-disable react/no-unused-prop-types */ import React, { PropTypes as RPT } from 'react'; +import type { Helmet } from 'react-helmet'; import Rollbar from './scripts/Rollbar'; import Script from './Script.react'; -const Html = ({ bodyHtml, javascripts = {}, helmet, options }) => ( +export type Options = { + disableJS?: boolean +} + +type Javascripts = { + vendor?: string, + app?: string +} + +type HtmlProps = { + bodyHtml: string, + javascripts: Javascripts, + helmet: Helmet, + options: Options +} + +const Html = ({ bodyHtml, javascripts = {}, helmet, options }: HtmlProps) => ( diff --git a/src/server/frontend/Script.react.js b/src/server/frontend/Script.react.js index fe33190..df6ac28 100644 --- a/src/server/frontend/Script.react.js +++ b/src/server/frontend/Script.react.js @@ -1,9 +1,12 @@ +// @flow import React, { PropTypes as RPT } from 'react'; -const Script = ({ src }) => (