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/declarations.js b/flow-typed/declarations.js new file mode 100644 index 0000000..ec5af30 --- /dev/null +++ b/flow-typed/declarations.js @@ -0,0 +1,10 @@ +/* + 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; +} + +declare var webpackIsomorphicTools: Object; diff --git a/package.json b/package.json index 04afff5..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" @@ -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/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..024ad35 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/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 }) => (