diff --git a/.babelrc b/.babelrc index 4f117e8..31effbd 100644 --- a/.babelrc +++ b/.babelrc @@ -29,6 +29,7 @@ "rename": "./config/babel/getComponentName.babel.js" }], "@babel/plugin-transform-runtime", + "babel-plugin-flow-runtime", ["module-resolver", {"alias": {"": "./src"}}] ] } diff --git a/.flowconfig b/.flowconfig index a958eb5..e19645e 100644 --- a/.flowconfig +++ b/.flowconfig @@ -8,3 +8,4 @@ emoji=true module.name_mapper='^/\(.*\)$' -> '/src/\1' module.name_mapper.extension='css' -> '/flow-stub/CSSModule.js' +suppress_comment=\\(.\\|\n\\)*\\$ExpectError diff --git a/.nvmrc b/.nvmrc index ec63514..8148c55 100644 --- a/.nvmrc +++ b/.nvmrc @@ -1 +1 @@ -9 +9.4.0 diff --git a/flow-typed/type-defs.js b/flow-typed/type-defs.js index fc99f18..ae60b98 100644 --- a/flow-typed/type-defs.js +++ b/flow-typed/type-defs.js @@ -10,6 +10,13 @@ declare module 'react-dom' { ): React$ElementRef; } +declare module 'flow-runtime' { + declare type Type = { + assert: (input: any) => T, + }; + declare var reify: any; +} + /* note: this also needs to be added for ramda: declare function chain ( diff --git a/package-lock.json b/package-lock.json index a449ed6..e8ef064 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1372,6 +1372,31 @@ "babel-runtime": "6.26.0" } }, + "babel-plugin-flow-runtime": { + "version": "0.15.0", + "resolved": "https://registry.npmjs.org/babel-plugin-flow-runtime/-/babel-plugin-flow-runtime-0.15.0.tgz", + "integrity": "sha512-/7Nl5Ld+pDzRsY62pbob1J6+bHebLgYWXLxapJxrHEx3c6NIUn8fOtsoTcAV4omGpHRykyi31rIxgCyBCIhAng==", + "requires": { + "babel-generator": "6.26.0", + "babel-traverse": "6.26.0", + "babel-types": "6.26.0", + "babylon": "6.18.0", + "camelcase": "3.0.0", + "flow-config-parser": "0.3.0" + }, + "dependencies": { + "babylon": { + "version": "6.18.0", + "resolved": "https://registry.npmjs.org/babylon/-/babylon-6.18.0.tgz", + "integrity": "sha512-q/UEjfGJ2Cm3oKV71DJz9d25TPnq5rhBVL2Q4fA5wcC3jcrdn7+SssEybFIxwAvvP+YCsCYNKughoF33GxgycQ==" + }, + "camelcase": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-3.0.0.tgz", + "integrity": "sha1-MvxLn82vhF/N9+c7uXysImHwqwo=" + } + } + }, "babel-plugin-module-resolver": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/babel-plugin-module-resolver/-/babel-plugin-module-resolver-3.0.0.tgz", @@ -4820,11 +4845,21 @@ "integrity": "sha512-aWKHYs3UECgpwrIDVUiABjSC8dgaKmonymQDWO+6FhGcp9lnnxdDBE6Sfm3F7YaRPfLYsWAY4lndBrfrfyn+9g==", "dev": true }, + "flow-config-parser": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/flow-config-parser/-/flow-config-parser-0.3.0.tgz", + "integrity": "sha1-cEkW77qIzSUYq02PkzB5VxJ2E48=" + }, "flow-parser": { "version": "0.63.1", "resolved": "https://registry.npmjs.org/flow-parser/-/flow-parser-0.63.1.tgz", "integrity": "sha1-hP1ke1ijcML8BGKADiLtd8PN8kk=" }, + "flow-runtime": { + "version": "0.16.0", + "resolved": "https://registry.npmjs.org/flow-runtime/-/flow-runtime-0.16.0.tgz", + "integrity": "sha512-qkXktzx0fksnXsJbamz4PK5NaIrEax1HoKlSAVzN7VOVIM23293zdSFE3V40aSalvk+jKrYQHNA6FWLp5ACVog==" + }, "flush-write-stream": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/flush-write-stream/-/flush-write-stream-1.0.2.tgz", @@ -6226,6 +6261,11 @@ "integrity": "sha512-YGG3ejvBNHRqu0559EOxxNFihD0AjpvHlC/pdGKd3X3ofe+CoJkYazwNJYTNebqpPKN+VVQbh4ZFn1DivMNuHA==", "dev": true }, + "immutable": { + "version": "3.8.2", + "resolved": "https://registry.npmjs.org/immutable/-/immutable-3.8.2.tgz", + "integrity": "sha1-wkOZUUVbs5kT2vKBN28VMOEErfM=" + }, "import-file": { "version": "1.2.2", "resolved": "https://registry.npmjs.org/import-file/-/import-file-1.2.2.tgz", diff --git a/package.json b/package.json index 09ed1d7..f06363b 100644 --- a/package.json +++ b/package.json @@ -25,6 +25,7 @@ "@babel/runtime": "^7.0.0-beta.38", "autoprefixer": "^7.2.5", "babel-loader": "^8.0.0-beta.0", + "babel-plugin-flow-runtime": "^0.15.0", "babel-plugin-module-resolver": "^3.0.0", "babel-plugin-react-rename": "^0.1.0", "clean-webpack-plugin": "^0.1.17", @@ -33,7 +34,9 @@ "css-loader": "^0.28.9", "extract-css-chunks-webpack-plugin": "^2.0.18", "find-nearest-file": "^1.1.0", + "flow-runtime": "^0.16.0", "htmlescape": "^1.1.1", + "immutable": "^3.8.2", "midori": "^1.0.0", "pages-webpack-plugin": "^0.1.0", "postcss-loader": "^2.0.10", diff --git a/test/flow/reify.js b/test/flow/reify.js new file mode 100644 index 0000000..35713ea --- /dev/null +++ b/test/flow/reify.js @@ -0,0 +1,15 @@ +/* @flow */ + +import {reify} from 'flow-runtime'; +import type {Type} from 'flow-runtime'; + +type User = { + username: string, + age: number, +}; + +const json = {foo: 5}; +const user = (reify: Type).assert(json); + +// $ExpectError +user.x;