Full Code of MoOx/phenomic for AI

master cb8e94092073 cached
560 files
1.0 MB
292.0k tokens
83 symbols
2 requests
Download .txt
Showing preview only (1,157K chars total). Download the full file or copy to clipboard to get everything.
Repository: MoOx/phenomic
Branch: master
Commit: cb8e94092073
Files: 560
Total size: 1.0 MB

Directory structure:
gitextract_mjidpdl9/

├── .circleci/
│   └── config.yml
├── .editorconfig
├── .flowconfig
├── .github/
│   └── FUNDING.yml
├── .gitignore
├── .travis.yml
├── .vscode/
│   └── settings.json
├── CHANGELOG.md
├── CODE_OF_CONDUCT.md
├── CONTRIBUTING.md
├── LICENSE
├── README.md
├── appveyor.yml
├── babel-jest.upward.js
├── babel.config.js
├── examples/
│   ├── .eslintrc
│   ├── react-app-blog/
│   │   ├── App.js
│   │   ├── Html.js
│   │   ├── README.md
│   │   ├── __tests__/
│   │   │   ├── __snapshots__/
│   │   │   │   └── index.js.snap
│   │   │   └── index.js
│   │   ├── content/
│   │   │   ├── pages/
│   │   │   │   ├── about.md
│   │   │   │   └── index.md
│   │   │   └── posts/
│   │   │       ├── draft-post.md
│   │   │       ├── fifth-post.md
│   │   │       ├── first-post.md
│   │   │       ├── fourth-post.md
│   │   │       ├── second-post.md
│   │   │       └── third-post.md
│   │   ├── highlights-theme.css
│   │   ├── package.json
│   │   ├── public/
│   │   │   └── robots.txt
│   │   └── src/
│   │       ├── ActivityIndicator.js
│   │       ├── Footer.js
│   │       ├── Header.js
│   │       ├── LatestPosts.js
│   │       ├── Layout.js
│   │       ├── Page.js
│   │       ├── PageBlog.js
│   │       ├── PageBlogPost.js
│   │       ├── PageError.js
│   │       ├── PageRepositories.js
│   │       ├── PostLayoutDefault.js
│   │       └── PostLayoutNoHero.js
│   ├── react-app-getting-started/
│   │   ├── App.js
│   │   ├── Html.js
│   │   ├── README.md
│   │   ├── __tests__/
│   │   │   ├── __snapshots__/
│   │   │   │   └── index.js.snap
│   │   │   └── index.js
│   │   ├── content/
│   │   │   └── posts/
│   │   │       ├── fifth-post.md
│   │   │       ├── first-post.md
│   │   │       ├── fourth-post.md
│   │   │       ├── second-post.md
│   │   │       └── third-post.md
│   │   ├── package.json
│   │   └── public/
│   │       └── robots.txt
│   ├── react-app-markdown-with-custom-components/
│   │   ├── App.js
│   │   ├── README.md
│   │   ├── __tests__/
│   │   │   └── index.js
│   │   ├── content/
│   │   │   └── index.md
│   │   └── package.json
│   ├── react-app-minimal-hello-world/
│   │   ├── App.js
│   │   ├── __tests__/
│   │   │   ├── __snapshots__/
│   │   │   │   └── index.js.snap
│   │   │   └── index.js
│   │   └── package.json
│   ├── react-app-styles-with-aphrodite/
│   │   ├── App.js
│   │   ├── Html.js
│   │   ├── __tests__/
│   │   │   └── index.js
│   │   └── package.json
│   ├── react-app-styles-with-css/
│   │   ├── App.js
│   │   ├── __tests__/
│   │   │   ├── __snapshots__/
│   │   │   │   └── index.js.snap
│   │   │   └── index.js
│   │   ├── package.json
│   │   └── styles.css
│   ├── react-app-styles-with-css-inlined-in-head/
│   │   ├── App.js
│   │   ├── Html.js
│   │   ├── __tests__/
│   │   │   └── index.js
│   │   ├── package.json
│   │   └── styles.css
│   ├── react-app-styles-with-emotion/
│   │   ├── App.js
│   │   ├── Html.js
│   │   ├── __tests__/
│   │   │   └── index.js
│   │   └── package.json
│   ├── react-app-styles-with-glamor/
│   │   ├── App.js
│   │   ├── Html.js
│   │   ├── __tests__/
│   │   │   └── index.js
│   │   └── package.json
│   ├── react-app-styles-with-glamorous/
│   │   ├── App.js
│   │   ├── Html.js
│   │   ├── __tests__/
│   │   │   └── index.js
│   │   └── package.json
│   ├── react-app-styles-with-radium/
│   │   ├── App.js
│   │   ├── Html.js
│   │   ├── __tests__/
│   │   │   └── index.js
│   │   └── package.json
│   ├── react-app-styles-with-styled-components/
│   │   ├── App.js
│   │   ├── Html.js
│   │   ├── __tests__/
│   │   │   └── index.js
│   │   └── package.json
│   ├── react-app-with-basename/
│   │   ├── App.js
│   │   ├── __tests__/
│   │   │   └── index.js
│   │   ├── content/
│   │   │   └── test.md
│   │   └── package.json
│   ├── react-native-web-app/
│   │   ├── App.js
│   │   ├── Html.js
│   │   ├── __tests__/
│   │   │   └── index.js
│   │   └── package.json
│   └── reason-react-app/
│       ├── App.js
│       ├── README.md
│       ├── __tests__/
│       │   ├── __snapshots__/
│       │   │   └── index.js.snap
│       │   └── index.js
│       ├── bsconfig.json
│       ├── content/
│       │   └── posts/
│       │       ├── fifth-post.md
│       │       ├── first-post.md
│       │       ├── fourth-post.md
│       │       ├── second-post.md
│       │       └── third-post.md
│       ├── package.json
│       └── src/
│           ├── Helpers.re
│           ├── Types.re
│           └── components/
│               ├── ErrorPage.re
│               ├── Home.re
│               └── Post.re
├── flow-typed/
│   ├── .eslintrc
│   ├── handmade/
│   │   ├── cross-fetch_v2.x.x.js
│   │   ├── deepmerge.js
│   │   ├── fb-watchman.js
│   │   ├── find-cache-dir.js
│   │   ├── fs-extra.js
│   │   ├── fs-promise.js
│   │   ├── globby.js
│   │   ├── gray-matter.js
│   │   ├── js-beautify.js
│   │   ├── jsx-test-helpers-v1.x.x.js
│   │   ├── loader-utils.js
│   │   ├── log-symbols.js
│   │   ├── lru-memoize.js
│   │   ├── mkdirp.js
│   │   ├── multili.js
│   │   ├── node-object-hash.js
│   │   ├── ora.js
│   │   ├── pify.js
│   │   ├── react-helmet_v5.x.x.js
│   │   ├── react-router-scroll.js
│   │   ├── remark.js
│   │   ├── sane.js
│   │   ├── semver.js
│   │   ├── simple-json-fetch.js
│   │   ├── strip-markdown.js
│   │   ├── striptags.js
│   │   ├── url-join.js
│   │   ├── webpack-dev-middleware.js
│   │   ├── webpack-hot-middleware.js
│   │   ├── webpack-sources.js
│   │   ├── webpack.js
│   │   └── webpack_v4.x.x.js
│   ├── npm/
│   │   ├── aphrodite_vx.x.x.js
│   │   ├── asciidoctor.js_vx.x.x.js
│   │   ├── chalk_v1.x.x.js
│   │   ├── classnames_v2.x.x.js
│   │   ├── cosmiconfig_vx.x.x.js
│   │   ├── cross-env_vx.x.x.js
│   │   ├── cross-spawn_vx.x.x.js
│   │   ├── debug_v2.x.x.js
│   │   ├── deep-assign_vx.x.x.js
│   │   ├── deepmerge_v1.x.x.js
│   │   ├── dotenv-expand_vx.x.x.js
│   │   ├── dotenv_vx.x.x.js
│   │   ├── emotion-server_vx.x.x.js
│   │   ├── emotion_vx.x.x.js
│   │   ├── eslint-config-i-am-meticulous_vx.x.x.js
│   │   ├── eslint-import-resolver-webpack_vx.x.x.js
│   │   ├── eslint-plugin-flowtype_vx.x.x.js
│   │   ├── eslint-plugin-import_vx.x.x.js
│   │   ├── eslint-plugin-react-native_vx.x.x.js
│   │   ├── eslint-plugin-react_vx.x.x.js
│   │   ├── eslint_vx.x.x.js
│   │   ├── express_v4.x.x.js
│   │   ├── flow-bin_v0.x.x.js
│   │   ├── get-port_vx.x.x.js
│   │   ├── git-exec-and-restage_vx.x.x.js
│   │   ├── glamor_vx.x.x.js
│   │   ├── glamorous_vx.x.x.js
│   │   ├── globby_vx.x.x.js
│   │   ├── gray-matter_vx.x.x.js
│   │   ├── hast-util-sanitize_vx.x.x.js
│   │   ├── history_vx.x.x.js
│   │   ├── hoist-non-react-statics_v2.x.x.js
│   │   ├── husky_vx.x.x.js
│   │   ├── jest_v21.x.x.js
│   │   ├── jest_v22.x.x.js
│   │   ├── lerna_vx.x.x.js
│   │   ├── lint-staged_vx.x.x.js
│   │   ├── lodash.deburr_vx.x.x.js
│   │   ├── lodash.flatten_vx.x.x.js
│   │   ├── lodash.kebabcase_vx.x.x.js
│   │   ├── npm-run-all_vx.x.x.js
│   │   ├── p-map_vx.x.x.js
│   │   ├── prettier_v1.x.x.js
│   │   ├── prop-types_v15.x.x.js
│   │   ├── radium_vx.x.x.js
│   │   ├── react-dev-utils_vx.x.x.js
│   │   ├── react-emotion_vx.x.x.js
│   │   ├── react-router_vx.x.x.js
│   │   ├── react-topbar-progress-indicator_vx.x.x.js
│   │   ├── rehype-autolink-headings_vx.x.x.js
│   │   ├── rehype-highlight_vx.x.x.js
│   │   ├── rehype-parse_vx.x.x.js
│   │   ├── rehype-raw_vx.x.x.js
│   │   ├── rehype-react_vx.x.x.js
│   │   ├── rehype-slug_vx.x.x.js
│   │   ├── rehype-stringify_vx.x.x.js
│   │   ├── remark-highlights_vx.x.x.js
│   │   ├── remark-parse_vx.x.x.js
│   │   ├── remark-rehype_vx.x.x.js
│   │   ├── remark-toc_vx.x.x.js
│   │   ├── rimraf_v2.x.x.js
│   │   ├── rss_vx.x.x.js
│   │   ├── socket.io-client_vx.x.x.js
│   │   ├── socket.io_v1.x.x.js
│   │   ├── styled-components_v2.x.x.js
│   │   ├── supertest_vx.x.x.js
│   │   ├── trash-cli_vx.x.x.js
│   │   ├── unified_v6.x.x.js
│   │   └── yargs_v7.x.x.js
│   └── phenomic.js
├── jest-setup.js
├── lerna.json
├── logo/
│   ├── .gitignore
│   └── phenomic.sketch
├── netlify.toml
├── package.json
├── packages/
│   ├── api-client/
│   │   ├── README.md
│   │   ├── bsconfig.json
│   │   ├── docs/
│   │   │   └── README.md
│   │   ├── package.json
│   │   └── src/
│   │       ├── __tests__/
│   │       │   ├── __snapshots__/
│   │       │   │   └── url-test.js.snap
│   │       │   └── url-test.js
│   │       ├── fetch.js
│   │       ├── index.js
│   │       ├── phenomicApiClient.re
│   │       ├── query.js
│   │       └── url.js
│   ├── babel-preset/
│   │   ├── README.md
│   │   ├── bsconfig.json
│   │   ├── package.json
│   │   └── src/
│   │       └── index.js
│   ├── bs-platform/
│   │   ├── README.md
│   │   ├── bsconfig.json
│   │   ├── package.json
│   │   ├── src/
│   │   │   └── .gitkeep-because-i-am-too-lazy-too-make-lerna-commands-smarter
│   │   └── tweak
│   ├── cli/
│   │   ├── README.md
│   │   ├── bsconfig.json
│   │   ├── docs/
│   │   │   └── README.md
│   │   ├── index.js
│   │   ├── package.json
│   │   └── src/
│   │       ├── __tests__/
│   │       │   └── check-engine.js
│   │       ├── bin.js
│   │       ├── check-engine.js
│   │       └── commands.js
│   ├── core/
│   │   ├── README.md
│   │   ├── bsconfig.json
│   │   ├── docs/
│   │   │   ├── README.md
│   │   │   ├── api.md
│   │   │   ├── cli.md
│   │   │   ├── configuration.md
│   │   │   ├── faq.md
│   │   │   ├── how-phenomic-works.md
│   │   │   └── writing-plugins.md
│   │   ├── package.json
│   │   └── src/
│   │       ├── BsFindCacheDir.re
│   │       ├── Utils.re
│   │       ├── api/
│   │       │   ├── __tests__/
│   │       │   │   └── index.js
│   │       │   ├── helpers.js
│   │       │   └── index.js
│   │       ├── commands/
│   │       │   ├── build.js
│   │       │   └── start.js
│   │       ├── configuration/
│   │       │   ├── __tests__/
│   │       │   │   ├── __snapshots__/
│   │       │   │   │   ├── flattenConfiguration.js.snap
│   │       │   │   │   └── normalize-base-url.test.js.snap
│   │       │   │   ├── flattenConfiguration.js
│   │       │   │   └── normalize-base-url.test.js
│   │       │   ├── flattenConfiguration.js
│   │       │   ├── get-client-environment.js
│   │       │   └── normalize-base-url.js
│   │       ├── db/
│   │       │   ├── __tests__/
│   │       │   │   ├── __fixtures__/
│   │       │   │   │   └── index.js
│   │       │   │   ├── __snapshots__/
│   │       │   │   │   └── index-test.js.snap
│   │       │   │   └── index-test.js
│   │       │   └── index.js
│   │       ├── defaultConfig.js
│   │       ├── index.js
│   │       ├── logger/
│   │       │   ├── __tests__/
│   │       │   │   └── index.js
│   │       │   └── index.js
│   │       └── utils/
│   │           ├── __tests__/
│   │           │   ├── __snapshots__/
│   │           │   │   └── resolveAll-test.js.snap
│   │           │   ├── error-formatter-test.js
│   │           │   └── resolveAll-test.js
│   │           ├── error-formatter.js
│   │           ├── getPath.js
│   │           ├── log.js
│   │           ├── resolveAll.js
│   │           └── writeFile.js
│   ├── helpers-transform/
│   │   ├── README.md
│   │   ├── bsconfig.json
│   │   ├── docs/
│   │   │   ├── README.md
│   │   │   ├── extractMetaFromBodyNode.md
│   │   │   └── unifiedProcessor.md
│   │   ├── package.json
│   │   └── src/
│   │       ├── __tests__/
│   │       │   ├── __snapshots__/
│   │       │   │   ├── extractMetaFromBodyNode.js.snap
│   │       │   │   └── unifiedProcessor.js.snap
│   │       │   ├── extractMetaFromBodyNode.js
│   │       │   └── unifiedProcessor.js
│   │       ├── extractMetaFromBodyNode.js
│   │       └── unifiedProcessor.js
│   ├── plugin-api-related-content/
│   │   ├── README.md
│   │   ├── bsconfig.json
│   │   ├── docs/
│   │   │   └── README.md
│   │   ├── package.json
│   │   └── src/
│   │       └── index.js
│   ├── plugin-bundler-webpack/
│   │   ├── README.md
│   │   ├── bsconfig.json
│   │   ├── docs/
│   │   │   └── README.md
│   │   ├── package.json
│   │   └── src/
│   │       ├── WebpackConfigValidator.js
│   │       ├── WebpackGetConfig.js
│   │       ├── WebpackServerConfigModifier.js
│   │       ├── __tests__/
│   │       │   ├── __snapshots__/
│   │       │   │   └── index.js.snap
│   │       │   └── index.js
│   │       ├── index.js
│   │       ├── webpack-promise.js
│   │       └── webpack.config.js
│   ├── plugin-collector-files/
│   │   ├── README.md
│   │   ├── bsconfig.json
│   │   ├── package.json
│   │   └── src/
│   │       ├── __tests__/
│   │       │   ├── __fixtures__/
│   │       │   │   ├── authors/
│   │       │   │   │   ├── bloodyowl.json
│   │       │   │   │   └── moox.json
│   │       │   │   ├── news/
│   │       │   │   │   └── 2017/
│   │       │   │   │       └── 06/
│   │       │   │   │           └── introducing-1.0.0-alpha.json
│   │       │   │   ├── showcase/
│   │       │   │   │   ├── entry/
│   │       │   │   │   │   ├── acrowithbrian.com.json
│   │       │   │   │   │   ├── anthonydugois.com__polynomic.json
│   │       │   │   │   │   └── ced.photo.json
│   │       │   │   │   └── submit.json
│   │       │   │   └── showcaseTags/
│   │       │   │       ├── event.json
│   │       │   │       └── open-source.json
│   │       │   ├── __snapshots__/
│   │       │   │   └── collect.js.snap
│   │       │   ├── collect.js
│   │       │   └── index.js
│   │       ├── index.js
│   │       └── watch.js
│   ├── plugin-public-assets/
│   │   ├── README.md
│   │   ├── bsconfig.json
│   │   ├── docs/
│   │   │   └── README.md
│   │   ├── package.json
│   │   └── src/
│   │       └── index.js
│   ├── plugin-renderer-react/
│   │   ├── README.md
│   │   ├── bsconfig.json
│   │   ├── docs/
│   │   │   └── README.md
│   │   ├── package.json
│   │   └── src/
│   │       ├── __tests__/
│   │       │   ├── __snapshots__/
│   │       │   │   ├── resolveURLs-list.js.snap
│   │       │   │   └── resolveURLs.js.snap
│   │       │   ├── resolveURLs-list.js
│   │       │   └── resolveURLs.js
│   │       ├── bodyRenderer.re
│   │       ├── client.js
│   │       ├── components/
│   │       │   ├── BodyRenderer.js
│   │       │   ├── HTML.js
│   │       │   ├── Link.hash.js
│   │       │   ├── Link.js
│   │       │   ├── Provider.js
│   │       │   ├── __tests__/
│   │       │   │   ├── BodyRenderer.js
│   │       │   │   ├── Html.js
│   │       │   │   ├── Link.js
│   │       │   │   ├── __snapshots__/
│   │       │   │   │   ├── BodyRenderer.js.snap
│   │       │   │   │   ├── Html.js.snap
│   │       │   │   │   ├── Link.js.snap
│   │       │   │   │   └── textRenderer.js.snap
│   │       │   │   └── textRenderer.js
│   │       │   └── textRenderer.js
│   │       ├── createApp.js
│   │       ├── deprecated-createContainer.js
│   │       ├── index.js
│   │       ├── link.re
│   │       ├── phenomicRendererReactClient.re
│   │       ├── renderHTML.js
│   │       ├── resolveURLs.js
│   │       ├── resolveUrlsFromPhenomicApi.js
│   │       ├── server/
│   │       │   ├── __tests__/
│   │       │   │   ├── __snapshots__/
│   │       │   │   │   └── getRoutes.js.snap
│   │       │   │   └── getRoutes.js
│   │       │   ├── dev-server.js
│   │       │   ├── getRoutes.js
│   │       │   └── static.js
│   │       ├── shared/
│   │       │   ├── QueryString.js
│   │       │   ├── __tests__/
│   │       │   │   ├── QueryString-test.js
│   │       │   │   ├── __snapshots__/
│   │       │   │   │   ├── QueryString-test.js.snap
│   │       │   │   │   └── mapValues-test.js.snap
│   │       │   │   └── mapValues-test.js
│   │       │   ├── mapValues.js
│   │       │   ├── performQuery.js
│   │       │   └── store/
│   │       │       ├── __tests__/
│   │       │       │   ├── __snapshots__/
│   │       │       │   │   └── index-test.js.snap
│   │       │       │   └── index-test.js
│   │       │       └── index.js
│   │       ├── utils.js
│   │       ├── withInitialProps.js
│   │       └── withPhenomicApi.js
│   ├── plugin-rss-feed/
│   │   ├── README.md
│   │   ├── bsconfig.json
│   │   ├── docs/
│   │   │   └── README.md
│   │   ├── package.json
│   │   └── src/
│   │       └── index.js
│   ├── plugin-sitemap/
│   │   ├── README.md
│   │   ├── bsconfig.json
│   │   ├── package.json
│   │   └── src/
│   │       └── index.js
│   ├── plugin-transform-asciidoc/
│   │   ├── README.md
│   │   ├── bsconfig.json
│   │   ├── docs/
│   │   │   └── README.md
│   │   ├── package.json
│   │   └── src/
│   │       ├── __tests__/
│   │       │   ├── __snapshots__/
│   │       │   │   └── index.js.snap
│   │       │   └── index.js
│   │       ├── default-options.js
│   │       └── index.js
│   ├── plugin-transform-json/
│   │   ├── README.md
│   │   ├── bsconfig.json
│   │   ├── docs/
│   │   │   └── README.md
│   │   ├── package.json
│   │   └── src/
│   │       ├── __tests__/
│   │       │   ├── __snapshots__/
│   │       │   │   └── index.js.snap
│   │       │   └── index.js
│   │       └── index.js
│   ├── plugin-transform-markdown/
│   │   ├── README.md
│   │   ├── bsconfig.json
│   │   ├── docs/
│   │   │   └── README.md
│   │   ├── package.json
│   │   └── src/
│   │       ├── __tests__/
│   │       │   ├── __snapshots__/
│   │       │   │   └── index.js.snap
│   │       │   └── index.js
│   │       ├── default-options.js
│   │       └── index.js
│   └── preset-react-app/
│       ├── README.md
│       ├── bsconfig.json
│       ├── docs/
│       │   ├── README.md
│       │   └── getting-started/
│       │       ├── 01.md
│       │       ├── 02.md
│       │       ├── 03.md
│       │       ├── 04.md
│       │       ├── 05.md
│       │       ├── 06.md
│       │       ├── 07.md
│       │       ├── 08.md
│       │       ├── 09.md
│       │       ├── 10.md
│       │       └── README.md
│       ├── package.json
│       └── src/
│           ├── client.js
│           ├── index.js
│           └── phenomicPresetReactApp.re
├── scripts/
│   ├── examples.js
│   └── utils.js
└── website/
    ├── .gitignore
    ├── App.js
    ├── Html.js
    ├── __tests__/
    │   └── index.js
    ├── components/
    │   ├── ActivityIndicator.js
    │   ├── BackgroundGradient.web.js
    │   ├── BlogItem.js
    │   ├── BlogList.js
    │   ├── BlogListItem.js
    │   ├── BodyContainer.js
    │   ├── BodySmallContainer.js
    │   ├── Browser.js
    │   ├── DocSearch.js
    │   ├── Editor.js
    │   ├── Flex.js
    │   ├── Footer.js
    │   ├── FooterNavBar.js
    │   ├── Header.js
    │   ├── HeaderNavBar.js
    │   ├── Home.js
    │   ├── HomeCodeExample.js
    │   ├── Link.web.js
    │   ├── MarkdownGenerated.js
    │   ├── MarkdownHeading.js
    │   ├── PackageListItem.js
    │   ├── Page.js
    │   ├── PageDoc.js
    │   ├── PageError.js
    │   ├── PagePackageList.js
    │   ├── PageShowcase.js
    │   ├── PhenomicLogo.js
    │   ├── Plugins.js
    │   ├── ShowcaseList.js
    │   ├── Spacer.js
    │   ├── Spinner.js
    │   ├── Tutorials.js
    │   ├── Wrapper.js
    │   └── react-stylable/
    │       ├── focusable.js
    │       ├── hoverable.js
    │       ├── index.js
    │       ├── touchable-mouse.js
    │       └── touchable.js
    ├── content/
    │   ├── blog/
    │   │   ├── 2017-06-02-introducing-1.0.0-alpha.md
    │   │   ├── 2017-06-10-v1.0.0-alpha.3.md
    │   │   ├── 2017-07-11-v1.0.0-alpha.4.md
    │   │   ├── 2017-08-09-v1.0.0-alpha.5.md
    │   │   ├── 2017-09-08-v1.0.0-alpha.6.md
    │   │   ├── 2017-09-15-v1.0.0-alpha.7.md
    │   │   ├── 2017-09-16-v1.0.0-alpha.8.md
    │   │   ├── 2017-09-27-v1.0.0-alpha.10.md
    │   │   ├── 2017-09-30-v1.0.0-alpha.11.md
    │   │   ├── 2017-10-11-v1.0.0-alpha.12.md
    │   │   ├── 2017-10-19-v1.0.0-alpha.13.md
    │   │   ├── 2017-12-04-v1.0.0-alpha.14.md
    │   │   ├── 2017-12-04-v1.0.0-alpha.15.md
    │   │   ├── 2017-12-06-v1.0.0-alpha.16.md
    │   │   ├── 2017-12-06-v1.0.0-alpha.17.md
    │   │   ├── 2017-12-20-v1.0.0-alpha.18.md
    │   │   ├── 2018-01-11-v1.0.0-alpha.19.md
    │   │   ├── 2018-01-24-v1.0.0-alpha.20.md
    │   │   ├── 2018-03-08-v1.0.0-beta.0.md
    │   │   ├── 2018-03-30-v1.0.0-beta.1.md
    │   │   ├── 2018-04-07-v1.0.0-beta.2.md
    │   │   ├── 2018-05-22-v1.0.0-beta.3.md
    │   │   ├── 2018-10-27-v1.0.0-beta.4.md
    │   │   ├── 2018-11-26-v1.0.0-beta.5.md
    │   │   ├── 2018-12-08-v1.0.0-beta.6.md
    │   │   ├── 2018-12-09-v1.0.0-beta.7.md
    │   │   ├── 2018-12-20-v1.0.0-beta.8.md
    │   │   ├── 2019-01-18-v10.0-beta.9.md
    │   │   ├── 2019-03-15-v1.0.0-beta.10.md
    │   │   ├── 2019-03-24-v1.0.0-beta.11.md
    │   │   └── 2019-05-28-v1.0.0
    │   └── showcase/
    │       ├── entry/
    │       │   ├── anthonydugois.com__polynomic.md
    │       │   ├── ced.photo.md
    │       │   ├── cpp.daynhauhoc.com.md
    │       │   ├── cssnano.co.md
    │       │   ├── duxxie.nl.md
    │       │   ├── haywirez.com.md
    │       │   ├── istanbul.js.org.md
    │       │   ├── kevin940726.github.io.md
    │       │   ├── khoanguyen.me.md
    │       │   ├── meetfranz.com.md
    │       │   ├── nhakhoaphuocbinh.com.md
    │       │   ├── postcss.org.md
    │       │   ├── putaindecode.io.md
    │       │   ├── slashgear.github.io.md
    │       │   ├── stylelint.io.md
    │       │   ├── www.acrowithbrian.com.md
    │       │   ├── www.asimkt.com.md
    │       │   ├── www.boscnegre-vacances.com.md
    │       │   └── www.codepreneur.io.md
    │       └── submit.md
    ├── defaults.css
    ├── highlights-theme.css
    ├── modules/
    │   └── url-to-slug.js
    ├── package.json
    ├── phenomic.config.js
    ├── public/
    │   ├── .nojekyll
    │   ├── CNAME
    │   ├── browserconfig.xml
    │   └── site.webmanifest
    ├── scripts/
    │   ├── deploy.sh
    │   ├── releases-as-markdown.js
    │   └── showcase-screenshots.js
    └── webpack.config.js

================================================
FILE CONTENTS
================================================

================================================
FILE: .circleci/config.yml
================================================
version: 2
jobs:
  test:
    docker:
      - image: circleci/node:8
    steps:
      - checkout
      - restore_cache:
          key: dependency-cache
      - restore_cache:
          key: website-cache
      - run:
          name: install deps
          command: yarn
      - run:
          name: tests
          command: |
            echo 'export DEBUG=phenomic:*' >> $BASH_ENV
            yarn test
      - save_cache:
          key: dependency-cache
          paths:
            - ~/.cache/yarn
            - ./node_modules
      - save_cache:
          key: website-cache
          paths:
            - website/.screenshots
            - website/public/showcase/entry
workflows:
  version: 2
  test:
    jobs:
      - test


================================================
FILE: .editorconfig
================================================
# editorconfig.org
root = true

[*]
end_of_line = lf
charset = utf-8
trim_trailing_whitespace = true
insert_final_newline = true
indent_style = space
indent_size = 2

[*.md]
# Allow <br/> from Markdown
trim_trailing_whitespace = false


================================================
FILE: .flowconfig
================================================
[version]
^0.87.0

[ignore]
.*/__tests__/_output/.*
.*/dist/.*
# for CI
.*/watchman/.*

<PROJECT_ROOT>/coverage/.*
<PROJECT_ROOT>/benchmarks/.*/dist/.*
<PROJECT_ROOT>/benchmarks/.*/lib/.*
<PROJECT_ROOT>/examples/.*/dist/.*
<PROJECT_ROOT>/examples/.*/lib/.*
<PROJECT_ROOT>/packages/.*/dist/.*
<PROJECT_ROOT>/packages/.*/lib/.*
; please remove me when you have time to kill
<PROJECT_ROOT>/website/.*

# flow & js generated by reasonml doesn't play nice
<PROJECT_ROOT>/examples/reason-react-app/.*

; broken json
.*/node_modules/config-chain/test/.*

[options]
esproposal.class_instance_fields=enable
esproposal.class_static_fields=enable
# for Windows compat with json files
module.file_ext=.web.js
module.file_ext=.js
module.file_ext=.json

# packages/*
module.name_mapper='^@phenomic\/\([a-z0-9-]+\)\/lib\/\(.*\)$' -> '<PROJECT_ROOT>/packages/\1/src/\2'
module.name_mapper='^@phenomic\/\([a-z0-9-]+\)\/\(.*\)$' -> '<PROJECT_ROOT>/packages/\1/\2'
module.name_mapper='^@phenomic\/\([a-z0-9-]+\)$' -> '<PROJECT_ROOT>/packages/\1/src'

# fixup some node_modules to get proper flow types
module.name_mapper='^react-native-web$' -> 'react-native-web/src'


================================================
FILE: .github/FUNDING.yml
================================================
open_collective: phenomic
ko_fi: moox__
custom: https://www.paypal.me/MoOx


================================================
FILE: .gitignore
================================================
*.log

# macOS crap
.DS_Store

# Node.js / npm
node_modules
# we rely on yarn.lock
package-lock.json

# code coverage
coverage

# build
**/lib/**/*.js
**/lib/bs/**/*
**/lib/ocaml/**/*
**/dist

# tests results
**/__tests__/_output*

# website
**/website/**/*.mov
**/website/**/*.pxm
**/website/public/showcases/entry/*
**/website/svgs/*.js

# reason stuff
.merlin
.bsb.lock
*.bs.js

================================================
FILE: .travis.yml
================================================
language: node_js
node_js: 8

env:
  global:
  - DEBUG: phenomic:*

before_install:
  # Install Yarn
  - curl -o- -L https://yarnpkg.com/install.sh | bash
  - export PATH=$HOME/.yarn/bin:$PATH
  # Install Watchman dependency
  - git clone --depth=1 --branch=v4.7.0 https://github.com/facebook/watchman.git
  - pushd watchman && ./autogen.sh && ./configure --without-python && make && sudo make install && popd

cache:
  yarn: true
  directories:
    - node_modules
    - website/.screenshots
    - website/public/showcase/entry

script:
  - yarn run test-without-lint


================================================
FILE: .vscode/settings.json
================================================
{
  "javascript.validate.enable": false
}


================================================
FILE: CHANGELOG.md
================================================
# For pre-releases notes [see GitHub releases](https://github.com/phenomic/phenomic/releases)

# [0.x releases notes](https://github.com/phenomic/phenomic/blob/0.x/CHANGELOG.md)


================================================
FILE: CODE_OF_CONDUCT.md
================================================
# Code of Conduct

## 1. Purpose

A primary goal of Phenomic is to be inclusive to the largest number of
contributors, with the most varied and diverse backgrounds possible. As such, we
are committed to providing a friendly, safe and welcoming environment for all,
regardless of gender, sexual orientation, ability, ethnicity, socioeconomic
status, and religion (or lack thereof).

This code of conduct outlines our expectations for all those who participate in
our community, as well as the consequences for unacceptable behavior.

We invite all those who participate in Phenomic to help us create safe and
positive experiences for everyone.

## 2. Open Source Citizenship

A supplemental goal of this Code of Conduct is to increase open source
citizenship by encouraging participants to recognize and strengthen the
relationships between our actions and their effects on our community.

Communities mirror the societies in which they exist and positive action is
essential to counteract the many forms of inequality and abuses of power that
exist in society.

If you see someone who is making an extra effort to ensure our community is
welcoming, friendly, and encourages all participants to contribute to the
fullest extent, we want to know.

## 3. Expected Behavior

The following behaviors are expected and requested of all community members:

- Participate in an authentic and active way. In doing so, you contribute to the
  health and longevity of this community.
- Exercise consideration and respect in your speech and actions.
- Attempt collaboration before conflict.
- Refrain from demeaning, discriminatory, or harassing behavior and speech.
- Be mindful of your surroundings and of your fellow participants. Alert
  community leaders if you notice a dangerous situation, someone in distress, or
  violations of this Code of Conduct, even if they seem inconsequential.
- Remember that community event venues may be shared with members of the public;
  please be respectful to all patrons of these locations.

## 4. Unacceptable Behavior

The following behaviors are considered harassment and are unacceptable within
our community:

- Violence, threats of violence or violent language directed against another
  person.
- Sexist, racist, homophobic, transphobic, ableist or otherwise discriminatory
  jokes and language.
- Posting or displaying sexually explicit or violent material.
- Posting or threatening to post other people’s personally identifying
  information ("doxing").
- Personal insults, particularly those related to gender, sexual orientation,
  race, religion, or disability.
- Inappropriate photography or recording.
- Inappropriate physical contact. You should have someone’s consent before
  touching them.
- Unwelcome sexual attention. This includes, sexualized comments or jokes;
  inappropriate touching, groping, and unwelcomed sexual advances.
- Deliberate intimidation, stalking or following (online or in person).
- Advocating for, or encouraging, any of the above behavior.
- Sustained disruption of community events, including talks and presentations.

## 5. Consequences of Unacceptable Behavior

Unacceptable behavior from any community member, including sponsors and those
with decision-making authority, will not be tolerated.

Anyone asked to stop unacceptable behavior is expected to comply immediately.

If a community member engages in unacceptable behavior, the community organizers
may take any action they deem appropriate, up to and including a temporary ban
or permanent expulsion from the community without warning (and without refund in
the case of a paid event).

## 6. Reporting Guidelines

If you are subject to or witness unacceptable behavior, or have any other
concerns, please notify a community organizer as soon as possible.
contact@phenomic.io.

Additionally, community organizers are available to help community members
engage with local law enforcement or to otherwise help those experiencing
unacceptable behavior feel safe. In the context of in-person events, organizers
will also provide escorts as desired by the person experiencing distress.

## 7. Addressing Grievances

If you feel you have been falsely or unfairly accused of violating this Code of
Conduct, you should notify Phenomic with a concise description of your
grievance. Your grievance will be handled in accordance with our existing
governing policies.

## 8. Scope

We expect all community participants (contributors, paid or otherwise; sponsors;
and other guests) to abide by this Code of Conduct in all community
venues–online and in-person–as well as in all one-on-one communications
pertaining to community business.

This code of conduct and its related procedures also applies to unacceptable
behavior occurring outside the scope of community activities when such behavior
has the potential to adversely affect the safety and well-being of community
members.

## 9. Contact info

contact@phenomic.io

## 10. License and attribution

This Code of Conduct is distributed under a
[Creative Commons Attribution-ShareAlike license](http://creativecommons.org/licenses/by-sa/3.0/).

Portions of text derived from the
[Django Code of Conduct](https://www.djangoproject.com/conduct/) and the
[Geek Feminism Anti-Harassment Policy](http://geekfeminism.wikia.com/wiki/Conference_anti-harassment/Policy).

Retrieved on November 22, 2016 from
[http://citizencodeofconduct.org/](http://citizencodeofconduct.org/)


================================================
FILE: CONTRIBUTING.md
================================================
# Contributing to Phenomic

> ⚠️ wip

From opening a bug report to creating a pull request: every contribution is
appreciated and welcome. This document is here to answer most questions when it
comes to contribute to this project.

If you have any questions not answered by this document,
[contact us on our chat](https://gitter.im/MoOx/phenomic) or
[open an issue](https://github.com/phenomic/phenomic/issues/new)

---

## [Code of Conduct](CODE_OF_CONDUCT.md)

Phenomic has adopted a Code of Conduct that we expect project participants to
adhere to. Please read [the full text](CODE_OF_CONDUCT.md) so that you can
understand what actions will and will not be tolerated.

---

## Financial contributions

We also welcome financial contributions in full transparency on our
[open collective](https://opencollective.com/phenomic). Anyone can file an
expense. If the expense makes sense for the development of the community, it
will be "merged" in the ledger of our open collective by the core contributors
and the person who filed the expense will be reimbursed.

➡️ [opencollective.com/phenomic](https://opencollective.com/phenomic)

### Credits

#### Contributors

Thank you to all the people who have already contributed to phenomic!
<a href="graphs/contributors"><img src="https://opencollective.com/phenomic/contributors.svg?width=890" /></a>

#### Backers

Thank you to all our backers!
[[Become a backer](https://opencollective.com/phenomic#backer)]

<a href="https://opencollective.com/phenomic#backers" target="_blank"><img src="https://opencollective.com/phenomic/backers.svg?width=890"></a>

#### Sponsors

Thank you to all our sponsors! (please ask your company to also support this
open source project by
[becoming a sponsor](https://opencollective.com/phenomic#sponsor))

<a href="https://opencollective.com/phenomic/sponsor/0/website" target="_blank"><img src="https://opencollective.com/phenomic/sponsor/0/avatar.svg"></a>
<a href="https://opencollective.com/phenomic/sponsor/1/website" target="_blank"><img src="https://opencollective.com/phenomic/sponsor/1/avatar.svg"></a>
<a href="https://opencollective.com/phenomic/sponsor/2/website" target="_blank"><img src="https://opencollective.com/phenomic/sponsor/2/avatar.svg"></a>
<a href="https://opencollective.com/phenomic/sponsor/3/website" target="_blank"><img src="https://opencollective.com/phenomic/sponsor/3/avatar.svg"></a>
<a href="https://opencollective.com/phenomic/sponsor/4/website" target="_blank"><img src="https://opencollective.com/phenomic/sponsor/4/avatar.svg"></a>
<a href="https://opencollective.com/phenomic/sponsor/5/website" target="_blank"><img src="https://opencollective.com/phenomic/sponsor/5/avatar.svg"></a>
<a href="https://opencollective.com/phenomic/sponsor/6/website" target="_blank"><img src="https://opencollective.com/phenomic/sponsor/6/avatar.svg"></a>
<a href="https://opencollective.com/phenomic/sponsor/7/website" target="_blank"><img src="https://opencollective.com/phenomic/sponsor/7/avatar.svg"></a>
<a href="https://opencollective.com/phenomic/sponsor/8/website" target="_blank"><img src="https://opencollective.com/phenomic/sponsor/8/avatar.svg"></a>
<a href="https://opencollective.com/phenomic/sponsor/9/website" target="_blank"><img src="https://opencollective.com/phenomic/sponsor/9/avatar.svg"></a>

---

### Workflow and Pull Requests

The core team will be monitoring for pull requests and reviewing changes.

_Before_ submitting a pull request, please make sure the following is done…

1. Fork the repo and create your branch from `master`. A guide on how to fork a
   repository: https://help.github.com/articles/fork-a-repo/

   Open your terminal (e.g. Terminal, Git Bash or Git Shell) and type:

   ```sh
   git clone https://github.com/<your_username>/phenomic
   cd phenomic
   git checkout -b my_branch
   ```

   Note: Replace `<your_username>` with your GitHub username

2. Phenomic uses [Yarn](https://yarnpkg.com/) for running development scripts.
   If you haven't already done so, please
   [install yarn](https://yarnpkg.com/en/docs/install).

   To check your version of Yarn and ensure it's installed you can type:

   ```sh
   yarn --version
   ```

   ⚠️ **We currently require yarn >= v1.0.0**

3. Run `yarn`. This will install all dependencies and prepare the repository to
   be ready for serious shit.

   ```sh
   yarn
   ```

4. If you've added code that should be tested, add tests.

5. If you've added/changed APIs, update the documentation accordingly.

6. Ensure the entire test suite passes via `yarn test`.

#### Additional Workflow for any changes made to website or docs

If you are making changes to the website or documentation, test the `website`
folder and run the server to check if your changes are being displayed
accurately.

You can run a development server to check if the changes you made are being
displayed accurately by running `yarn website:start`.

You can modify `website/*` code and get real times update in your browser.

**Keep in mind that whenever you modify Phenomic core/plugins you might need to
restart the dev server.** If you are doing change to Phenomic using the website
as a playground, you may need to transpile sources. See below for more
informations.

## How to try a development build of Phenomic in another project

### Transpiling sources

Phenomic is written with ES2015+ and is using [babel](http://babeljs.io) for
transpilation. In order to have up to date code for real world usage, you need
to start a watcher from the root of the project

```console
yarn watch
```

This will update transpilated files as soon as you modify one.

### Use a local Phenomic version your own project

From Phenomic git repo

```console
yarn links
```

This should create local links for each packages.

Then, in your project:

```console
yarn link @phenomic/core @phenomic/preset-react-app ...
```

**You should probably add all others direct `@phenomic/*` deps from your
`package.json` if necessary.**

Then run your project via `yarn start`, and don't forget to restart dev server
if necessary (if you change the code of Phenomic itself).

---

## Bugs

### Where to Find Known Issues

We are using [GitHub Issues](https://github.com/phenomic/phenomic/issues) for
our public bugs. We will keep a close eye on this and try to make it clear when
we have a work in progress. **Before filing a new issue, try to make sure your
problem doesn't already exist.**

### Reporting New Issues

The best way to get your bug fixed is to provide a reduced test case. Please
provide a public repository with a runnable example. Then feel free to
[open an issue](https://github.com/phenomic/phenomic/issues/new).

#### Security Bugs

If you find a security issue, please first contact us directly before opening a
public issue.

---

## Releasing

Update necessary `bsconfig.json` (eg: `packages/reason/bsconfig.json`) version
number and stage the file in git (so release script gets it).

```
yarn release
```

The command will guide you.

Once it's done, go to https://github.com/phenomic/phenomic/releases. Click on
the new created tag and `Edit tag` to create release notes.

The way to create notes is easy. Just go to
https://github.com/phenomic/phenomic/commits/master and sort interesting commits
(since last release) in the template below that you will use as notes:

```
# 🎉 No breaking changes 🎉
or
# 💥 Includes _Breaking changes_

Blah blah

## 💥 Breaking changes

* [`@phenomic/PLUGIN_NAMEEEE`: AWESOME_MESSAGE](https://github.com/phenomic/phenomic/commit/HASSSSHHHHHHHHHHH),
  by @DOERRRRR, reported|requested by @REPORTERRRRR (in [#XXXXXXX](https://github.com/phenomic/phenomic/issues/XXXXXXX))


## 🐛 Bugfixes

...

##  👍 Improvements

...

## 🔥 New plugins

...

## ✨ New features

...

## 🌟 New Examples

...
```

---

## How to Get in Touch

- Chat - [#phenomic](https://gitter.im/phenomic/phenomic) on Gitter.
- Email - contact (at) phenomic (dot) io

## Code Conventions

- [Prettier](https://prettier.io) is used to avoid bikeshedding on quotes or
  semicolons.
- [Eslint](http://eslint.org) is used to help to keep the codebase clean, with a
  [strong config](https://github.com/MoOx/eslint-config-i-am-meticulous).
- Prefer ES6 syntax when possible.
- Use [Flow types](http://flowtype.org/).

## License

By contributing to Phenomic, you agree that your contributions will be licensed
under its MIT license.


================================================
FILE: LICENSE
================================================
The MIT License (MIT)

Copyright (c) 2015 Maxime Thirouin

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.


================================================
FILE: README.md
================================================
# DEPRECATED. Please use [Next.js](https://nextjs.org) instead

[![Phenomic](https://raw.githubusercontent.com/phenomic/phenomic/master/logo/phenomic-cover-transparent.png)](https://phenomic.io)

> Modular website compiler (React, Webpack, Reason and whatever you want)

✅ **Status**

[![Travis CI Build status](https://img.shields.io/travis/phenomic/phenomic/master.svg?label=unix%2Ftravis-ci%20build)](https://travis-ci.org/phenomic/phenomic)
[![circle Build status](https://img.shields.io/circleci/project/github/phenomic/phenomic/master.svg?label=unix%2Fcircle-ci%20build)](https://circleci.com/gh/phenomic/phenomic)
[![Windows Build status](https://img.shields.io/appveyor/ci/MoOx/phenomic/master.svg?label=window%20build)](https://ci.appveyor.com/project/MoOx/phenomic/branch/master)
[![Version](https://img.shields.io/npm/v/@phenomic/core.svg)](https://github.com/phenomic/phenomic/blob/master/CHANGELOG.md)

💬 **Want to discuss or ask a question?**

[![Join the community on Spectrum](https://withspectrum.github.io/badge/badge.svg)](https://spectrum.chat/phenomic)
[![Gitter](https://badges.gitter.im/phenomic/phenomic.svg)](https://gitter.im/phenomic/phenomic)
[![Follow Phenomic on Twitter](https://img.shields.io/twitter/follow/Phenomic_app.svg?style=social&logo=twitter&label=Follow+Phenomic_app)](http://twitter.com/Phenomic_app)

📦 **Git Mirrors**

[GitHub](https://github.com/phenomic/phenomic) |
[GitLab](https://gitlab.com/MoOx/phenomic) |
[BitBucket](https://bitbucket.org/MoOx/phenomic)

---

## [Documentation](https://phenomic.io/en/packages/core/docs/)

## [Tutorials](https://phenomic.io/en/tutorials/)

## Examples

There are plenty of
[examples](https://github.com/phenomic/phenomic/tree/master/examples) available.
Just take a look!

---

## [CONTRIBUTING](https://github.com/phenomic/phenomic/blob/master/CONTRIBUTING.md)

✨ Check out our
[CONTRIBUTING](https://github.com/phenomic/phenomic/blob/master/CONTRIBUTING.md)
guide to get started.

- ⇄ Pull/Merge requests and ★ Stars are always welcome.
- For bugs and feature requests, please
  [create an issue](https://github.com/phenomic/phenomic/issues/new).
- Pull requests must be accompanied by passing automated tests. See
  [CONTRIBUTING](https://github.com/phenomic/phenomic/blob/master/CONTRIBUTING.md)
  for more information.
- Donation is a way to contribute.
  [You can help us via our OpenCollective page](https://opencollective.com/phenomic).

### Contributors

Thank you to all the people who have already contributed to phenomic!
<a href="https://github.com/phenomic/phenomic/graphs/contributors"><img src="https://opencollective.com/phenomic/contributors.svg?width=890" /></a>

### Backers

Thank you to all our backers!
[[Become a backer](https://opencollective.com/phenomic#backer)]

<a href="https://opencollective.com/phenomic#backers" target="_blank"><img src="https://opencollective.com/phenomic/backers.svg?width=890"></a>

### Sponsors

Thank you to all our sponsors! (please ask your company to also support this
open source project by
[becoming a sponsor](https://opencollective.com/phenomic#sponsor))

<a href="https://opencollective.com/phenomic/sponsor/0/website" target="_blank"><img src="https://opencollective.com/phenomic/sponsor/0/avatar.svg"></a>
<a href="https://opencollective.com/phenomic/sponsor/1/website" target="_blank"><img src="https://opencollective.com/phenomic/sponsor/1/avatar.svg"></a>
<a href="https://opencollective.com/phenomic/sponsor/2/website" target="_blank"><img src="https://opencollective.com/phenomic/sponsor/2/avatar.svg"></a>
<a href="https://opencollective.com/phenomic/sponsor/3/website" target="_blank"><img src="https://opencollective.com/phenomic/sponsor/3/avatar.svg"></a>
<a href="https://opencollective.com/phenomic/sponsor/4/website" target="_blank"><img src="https://opencollective.com/phenomic/sponsor/4/avatar.svg"></a>
<a href="https://opencollective.com/phenomic/sponsor/5/website" target="_blank"><img src="https://opencollective.com/phenomic/sponsor/5/avatar.svg"></a>
<a href="https://opencollective.com/phenomic/sponsor/6/website" target="_blank"><img src="https://opencollective.com/phenomic/sponsor/6/avatar.svg"></a>
<a href="https://opencollective.com/phenomic/sponsor/7/website" target="_blank"><img src="https://opencollective.com/phenomic/sponsor/7/avatar.svg"></a>
<a href="https://opencollective.com/phenomic/sponsor/8/website" target="_blank"><img src="https://opencollective.com/phenomic/sponsor/8/avatar.svg"></a>
<a href="https://opencollective.com/phenomic/sponsor/9/website" target="_blank"><img src="https://opencollective.com/phenomic/sponsor/9/avatar.svg"></a>

---

## [CHANGELOG](CHANGELOG.md)

## [Code of Conduct](CODE_OF_CONDUCT.md)

## [LICENSE](LICENSE)


================================================
FILE: appveyor.yml
================================================
# http://www.appveyor.com/docs/appveyor-yml
environment:
  matrix:
    - nodejs_version: '8'

  DEBUG: phenomic:*

install:
  - ps: Install-Product node $env:nodejs_version x64
  - node --version
  - yarn --version
  - yarn

test_script:
  - yarn test-without-lint
  - yarn posttest

cache:
  - "%LOCALAPPDATA%\\Yarn"
  - node_modules -> package.json
  - website/.screenshots -> website/content/showcase/entry
  - website/public/showcase/entry -> website/content/showcase/entry

version: "{build}"
build: off
deploy: off
matrix:
  fast_finish: true

init:
  # debugging Appveyor build. More info:
  # https://www.appveyor.com/docs/how-to/rdp-to-build-worker/
  - ps: iex ((new-object net.webclient).DownloadString('https://raw.githubusercontent.com/appveyor/ci/master/scripts/enable-rdp.ps1'))


================================================
FILE: babel-jest.upward.js
================================================
module.exports = require("babel-jest").createTransformer({
  rootMode: "upward",
});


================================================
FILE: babel.config.js
================================================
module.exports = {
  presets: [
    [
      "@babel/preset-env",
      {
        targets: {
          node: "current",
        },
      },
    ],
    "@babel/preset-react",
    "@babel/preset-flow",
  ],
  plugins: [
    "@babel/plugin-proposal-class-properties",
    "@babel/plugin-proposal-object-rest-spread",
    [
      "@babel/plugin-transform-runtime",
      {
        helpers: true,
        regenerator: true,
      },
    ],
  ],
};


================================================
FILE: examples/.eslintrc
================================================
{
  "rules": {
    "import/no-extraneous-dependencies": 0,
    "react/no-multi-comp": 0,
    "react/prop-types": 0,
    "react/jsx-no-bind": 0,
    "react/jsx-no-literals": 0,
    "react-native/no-inline-styles": 0
  }
}


================================================
FILE: examples/react-app-blog/App.js
================================================
// @flow

import * as React from "react";
import { Router, Route, browserHistory } from "react-router";
import { createApp, renderApp } from "@phenomic/preset-react-app/lib/client";

import "./highlights-theme.css";

import Page from "./src/Page";
import PageBlog from "./src/PageBlog";
import PageBlogPost from "./src/PageBlogPost";
import PageRepositories from "./src/PageRepositories";
import PageError from "./src/PageError";

const routes = () => (
  <Router history={browserHistory}>
    <Route path="/" component={Page} />
    <Route path="/blog/" component={PageBlog} />
    <Route path="/blog/after/:after" component={PageBlog} />
    <Route path="/blog/*" component={PageBlogPost} />
    <Route path="/repositories/" component={PageRepositories} />
    <Route path="/repositories/page/:page" component={PageRepositories} />
    {/* for static hosting, we often need an explicit 404.html */}
    <Route path="404.html" component={PageError} />
    <Route path="*" component={Page} />
  </Router>
);

export default createApp(routes);

if (module.hot) {
  module.hot.accept(() => renderApp(routes));
}


================================================
FILE: examples/react-app-blog/Html.js
================================================
// @flow

import * as React from "react";
import Head from "react-helmet";

export default ({ App, render }: PhenomicHtmlPropsType) => {
  // if needed, you can know if you are in development or in static rendering
  // const isDev = process.env.PHENOMIC_ENV === "development"
  const { Main, State, Script, Style } = render(<App />);
  const helmet = Head.renderStatic();
  return (
    // $FlowFixMe helmet is fine
    <html {...helmet.htmlAttributes.toComponent()}>
      <head>
        {helmet.meta.toComponent()}
        {helmet.title.toComponent()}
        {helmet.base.toComponent()}
        <Style />
        {helmet.link.toComponent()}
        {helmet.style.toComponent()}
        {helmet.script.toComponent()}
        {helmet.noscript.toComponent()}
      </head>
      {/* // $FlowFixMe it works on my machine */}
      <body {...helmet.bodyAttributes.toComponent()}>
        <Main />
        <State />
        <Script />
      </body>
    </html>
  );
};


================================================
FILE: examples/react-app-blog/README.md
================================================
# Blog with Phenomic + React preset

Simple blog template that includes:

- some pages (home, about, 404.html for static hosting)
- a paginated list of posts
- some articles
- a component to display latest posts
- a loading indicator that is pretty sweet (and only appear when connection is
  "slow")
- a way to use different layout from markdown file (via front-matter
  `layout: {name}`)

Inspired by the Getting Started guide with a bit of CSS.

![Preview](./preview.jpg)


================================================
FILE: examples/react-app-blog/__tests__/__snapshots__/index.js.snap
================================================
// Jest Snapshot v1, https://goo.gl/fbAQLP

exports[`should build example correctly 1`] = `
Array [
  "404.html",
  "about/index.html",
  "blog/after/c2Vjb25kLXBvc3Q=/index.html",
  "blog/after/dGhpcmQtcG9zdA==/index.html",
  "blog/after/Zm91cnRoLXBvc3Q=/index.html",
  "blog/after/ZmlmdGgtcG9zdA==/index.html",
  "blog/after/Zmlyc3QtcG9zdA==/index.html",
  "blog/fifth-post/index.html",
  "blog/first-post/index.html",
  "blog/fourth-post/index.html",
  "blog/index.html",
  "blog/second-post/index.html",
  "blog/third-post/index.html",
  "index.html",
  "repositories/index.html",
  "repositories/page/2/index.html",
  "repositories/page/3/index.html",
  "repositories/page/4/index.html",
]
`;

exports[`should build example correctly 2`] = `
Array [
  "phenomic/content/pages/item/.json",
  "phenomic/content/pages/item/about.json",
  "phenomic/content/posts/by-default/1/desc/date/limit-4.json",
  "phenomic/content/posts/by-default/1/desc/date/limit-6.json",
  "phenomic/content/posts/by-default/1/desc/date/limit-6/after-c2Vjb25kLXBvc3Q=.json",
  "phenomic/content/posts/by-default/1/desc/date/limit-6/after-dGhpcmQtcG9zdA==.json",
  "phenomic/content/posts/by-default/1/desc/date/limit-6/after-Zm91cnRoLXBvc3Q=.json",
  "phenomic/content/posts/by-default/1/desc/date/limit-6/after-ZmlmdGgtcG9zdA==.json",
  "phenomic/content/posts/by-default/1/desc/date/limit-6/after-Zmlyc3QtcG9zdA==.json",
  "phenomic/content/posts/item/fifth-post.json",
  "phenomic/content/posts/item/first-post.json",
  "phenomic/content/posts/item/fourth-post.json",
  "phenomic/content/posts/item/second-post.json",
  "phenomic/content/posts/item/third-post.json",
]
`;

exports[`should build example correctly 3`] = `
Array [
  "favicon.ico",
  "robots.txt",
]
`;


================================================
FILE: examples/react-app-blog/__tests__/index.js
================================================
// @flow

/* eslint-disable import/no-extraneous-dependencies */
import fs from "fs";
import path from "path";

import globby from "globby";

it("should build example correctly", () => {
  const testFolder = __dirname + "/../dist";
  const files = globby.sync("**/*", {
    cwd: testFolder,
    nodir: true,
    dot: true,
  });

  // should have html files
  const htmlFiles = files.filter(file => file.endsWith(".html"));
  expect(htmlFiles).toMatchSnapshot();

  const jsonApiFiles = files.filter(
    file => file.startsWith("phenomic") && file.endsWith(".json"),
  );
  // should have matching json files
  expect(jsonApiFiles).toMatchSnapshot();

  // should have assets
  const assetsBundlerFiles = files.filter(
    file =>
      !htmlFiles.includes(file) &&
      !jsonApiFiles.includes(file) &&
      file.startsWith("phenomic"),
  );
  expect(assetsBundlerFiles.length).toBe(2);
  expect(
    files.filter(
      file =>
        !htmlFiles.includes(file) &&
        !jsonApiFiles.includes(file) &&
        !assetsBundlerFiles.includes(file),
    ),
  ).toMatchSnapshot();
});

it("should make dynamic pages with pagination", () => {
  const file1 = fs.readFileSync(
    path.join(__dirname, "..", "dist", "repositories", "index.html"),
    { encoding: "utf8" },
  );
  expect(file1).toContain('<div class="PageRepositories-repo">');
  expect(file1).not.toContain("ActivityIndicator");

  const file2 = fs.readFileSync(
    path.join(
      __dirname,
      "..",
      "dist",
      "repositories",
      "page",
      "2",
      "index.html",
    ),
    { encoding: "utf8" },
  );
  expect(file2).toContain('<div class="PageRepositories-repo">');
  expect(file2).not.toContain("ActivityIndicator");
});


================================================
FILE: examples/react-app-blog/content/pages/about.md
================================================
---
title: About me
image: https://images.unsplash.com/photo-1495681803763-410ec9ff583d?ixlib=rb-0.3.5&ixid=eyJhcHBfaWQiOjEyMDd9&s=ba41fd89a4d5dd9008d04ccea959c072&auto=format&fit=crop&w=900&q=60
---

Ahh. Hey, Doc, we better back up, we don't have enough roads to get up to 88.
Hi. Where were we. In that case, I'll tell you strait out.

Thank you, don't forget to take a flyer. Look, I'm just not ready to ask
Lorraine out to the dance, and not you, nor anybody else on this planet is gonna
make me change my mind. Over there, on my hope chest. I've never seen purple
underwear before, Calvin. What's with the life preserver? Working.

I still don't understand, how am I supposed to go to the dance with her, if
she's already going to the dance with you. Our first television set, Dad just
picked it up today. Do you have a television? I hope so. Uh, look me up when you
get there. Stand tall, boy, have some respect for yourself. Don't you know that
if you let people walk all over you know, they'll be walking all over you for
the rest of your life? Listen to me, do you think I'm gonna spend the rest of my
life in this slop house?

Where were we. That's for messing up my hair. I'm sure that in 1985, plutonium
is available at every corner drug store, but in 1955, it's a little hard to come
by. Marty, I'm sorry, but I'm afraid you're stuck here. Where's Einstein, is he
with you? Listen, this is very important, I forgot my video camera, could you
stop by my place and pick it up on your way to the mall?

Hi. Now Biff, don't con me. Of course I do. Just a second, let's see if I could
find it. George, buddy. remember that girl I introduced you to, Lorraine. What
are you writing? Let's go.


================================================
FILE: examples/react-app-blog/content/pages/index.md
================================================
---
image: https://images.unsplash.com/photo-1495287949939-c5d3daf1cab4?ixlib=rb-0.3.5&ixid=eyJhcHBfaWQiOjEyMDd9&s=8969aebe524921f79c88b9ba605da6c2&auto=format&fit=crop&w=900&q=60
---

Hi there. Here is a good sample for you if you are starting with Phenomic and
React. It provides a simple but powerful codebase that you will be able to
adjust as you wish pretty easily. Be sure to check out the
[source code of this theme](https://github.com/phenomic/phenomic/tree/master/examples/react-app-blog).

Before asking any question about Phenomic, be sure to read the documentation :

- [Getting Started with Phenomic](https://phenomic.io/en/tutorials/)
- [Documentation](https://phenomic.io/en/packages/core/docs/)

Also take a look at
[existing websites that use Phenomic](https://phenomic.io/en/showcase/), some
projects share their source code!

---

You may want to take a look at the [404.html](/404.html) and tweak the render.

---

_You feel like the base theme is not enough or you just saw something wrong?_
[Please help us make Phenomic better!](https://github.com/phenomic/phenomic/blob/master/CONTRIBUTING.md)


================================================
FILE: examples/react-app-blog/content/posts/draft-post.md
================================================
---
title: "I won't be there in production"
date: "2017-01-06"
draft: true
---

You can see me in dev mode, but I will be skipped in production


================================================
FILE: examples/react-app-blog/content/posts/fifth-post.md
================================================
---
title: "I wrote my fifth post and you won't believe what happen next"
date: "2017-01-05"
layout: light
---

This post is using the `light` layout, defined from markdown front-matter. How
cool?

Another post that have a [link to the first one](../first-post/).

An wrong link to [a post that does not exist](../unknown-post/) and another one
to [a page that does not exist](/unknown-page/).

Here is an [external link](http://phenomic.io).

```md
# Some markdown...

...in a markdown file. **Markdownception?**.
```

```js
import unifiedProcessor from "./unifiedProcessor";
import type { plugin } from "./unifiedProcessor";
import defaultOptions from "./default-options";

// eslint-disable-next-line
const debug = require("debug")("phenomic:plugin:transform-markdown");
```


================================================
FILE: examples/react-app-blog/content/posts/first-post.md
================================================
---
title: "This is a first post"
date: "2017-01-01"
---

# This is a [Markdown](https://en.wikipedia.org/wiki/Markdown#Example) file

If you are new to Markdown, you might want to check those links:

- [What is Markdown?](http://whatismarkdown.com/)
- [Mastering Markdown, a GitHub guide](https://guides.github.com/features/mastering-markdown/)
- [wikipedia.org/wiki/Markdown](https://en.wikipedia.org/wiki/Markdown#Example)
- [masteringmarkdown.com](http://masteringmarkdown.com/)

Code is highlighted by default.

```js
const StatelessComponent = props => {
  return (
    <div>
      I‘m a stateless component that accepts children
      {props.children}
    </div>
  );
};

// ...

return <StatelessComponent>Example of child</StatelessComponent>;
```


================================================
FILE: examples/react-app-blog/content/posts/fourth-post.md
================================================
---
title: "Fourth post, I can't believe I did it"
date: "2017-01-04"
---

Another post


================================================
FILE: examples/react-app-blog/content/posts/second-post.md
================================================
---
title: "Second post, wow, I did it"
date: "2017-01-02"
---

Another post


================================================
FILE: examples/react-app-blog/content/posts/third-post.md
================================================
---
title: "A third post means I am really going to write a serious blog"
date: "2017-01-03"
---

Another post


================================================
FILE: examples/react-app-blog/highlights-theme.css
================================================
.editor {
  padding: 1em;
  border: 1px solid #11171c;
  border-radius: 3px;
}

/*
  Code below has been generated with the following command:

  npx atom-syntax-theme-to-highlights-css --clipboard https://github.com/simurai/duotone-dark-sea-syntax

  More details at https://github.com/MoOx/atom-syntax-theme-to-highlights-css
*/

.editor {
  color: #88b4e7;
  background-color: #1d262f;
}
.editor .line.cursor-line {
  background-color: rgba(52, 68, 85, 0.26);
}
.editor .invisible {
  color: #88b4e7;
}
.editor .cursor {
  border-color: #52ffc5;
  border-left-width: 2px;
}
.editor .selection .region {
  background-color: #344455;
}
.editor .bracket-matcher .region {
  border-bottom: 1px solid #52ffc5;
}
.editor .invisible-character {
  color: #303f4f;
  -webkit-font-smoothing: antialiased;
}
.editor .indent-guide {
  color: #303f4f;
}
.editor .wrap-guide {
  background-color: #303f4f;
}
.editor .find-result .region.region.region,
.editor .current-result .region.region.region {
  border-radius: 0px;
  background-color: rgba(82, 255, 197, 0.16);
  transition: border-color 0.4s;
}
.editor .find-result .region.region.region {
  border: 2px solid transparent;
}
.editor .current-result .region.region.region {
  border: 2px solid #52ffc5;
  transition-duration: 0.1s;
}
.editor .gutter .line-number {
  color: #586f89;
  -webkit-font-smoothing: antialiased;
}
.editor .gutter .line-number.git-line-removed:before {
  bottom: -3px;
}
.editor .gutter .line-number.git-line-removed:after {
  content: "";
  position: absolute;
  left: 0px;
  bottom: 0px;
  width: 25px;
  border-bottom: 1px dotted rgba(224, 82, 82, 0.5);
  pointer-events: none;
}
.editor .gutter .line-number.cursor-line {
  color: #88b4e7;
  background-color: #232d39;
}
.editor .gutter .line-number.cursor-line-no-selection {
  background-color: transparent;
}
.editor .gutter .line-number .icon-right {
  color: #88b4e7;
}
.editor .gutter .line-number.folded,
.editor .gutter .line-number:after,
.editor .fold-marker:after {
  color: #88b4e7;
}
.uno-1 {
  color: #d6e9ff;
}
.uno-2 {
  color: #88b4e7;
}
.uno-3 {
  color: #5d8cc0;
}
.uno-4 {
  color: #586f89;
}
.uno-5 {
  color: #444c55;
}
.duo-1 {
  color: #34febb;
}
.duo-2 {
  color: #32ae85;
}
.duo-3 {
  color: #42675a;
}
.syntax--source {
  color: #88b4e7;
}
.syntax--html.syntax--elements,
.syntax--entity,
.syntax--tag,
.syntax--function-call {
  color: #d6e9ff;
}
.syntax--attribute-name,
.syntax--character.syntax--escape {
  color: #5d8cc0;
}
.syntax--support {
  color: #586f89;
}
.syntax--variable {
  color: #5d8cc0;
}
.syntax--string,
.syntax--constant,
.syntax--storage.syntax--type {
  color: #34febb;
}
.syntax--keyword,
.syntax--storage {
  color: #32ae85;
}
.syntax--punctuation,
.syntax--bracket,
.syntax--brace {
  color: #444c55;
}
.syntax--string .syntax--punctuation {
  color: #42675a;
}
.syntax--comment {
  color: #586f89;
  font-style: italic;
}
.syntax--bold {
  font-weight: bold;
}
.syntax--italic {
  font-style: italic;
}
.syntax--c .syntax--parens,
.syntax--c .syntax--block {
  color: #88b4e7;
}
.syntax--c .syntax--parens .syntax--punctuation,
.syntax--c .syntax--block .syntax--punctuation,
.syntax--c .syntax--parens .syntax--bracket,
.syntax--c .syntax--block .syntax--bracket,
.syntax--c .syntax--parens .syntax--brace,
.syntax--c .syntax--block .syntax--brace {
  color: #444c55;
}
.syntax--c .syntax--parens .syntax--string .syntax--punctuation,
.syntax--c .syntax--block .syntax--string .syntax--punctuation {
  color: #42675a;
}
.syntax--c .syntax--comment {
  color: #42675a;
}
.syntax--source.syntax--clojure .syntax--expression {
  color: #34febb;
}
.syntax--source.syntax--clojure .syntax--expression .syntax--punctuation {
  color: #444c55;
}
.syntax--source.syntax--clojure .syntax--symbol {
  color: #88b4e7;
}
.syntax--source.syntax--clojure .syntax--vector {
  color: #586f89;
}
.syntax--coffee.syntax--source {
  color: #586f89;
}
.syntax--source.syntax--cs .syntax--meta {
  color: #586f89;
}
.syntax--source.syntax--cs .syntax--method {
  color: #88b4e7;
}
.syntax--css.syntax--source {
  color: #444c55;
}
.syntax--css.syntax--support.syntax--property-name {
  color: #5d8cc0;
}
.syntax--css.syntax--attribute-name.syntax--id,
.syntax--css.syntax--attribute-name.syntax--class,
.syntax--css.syntax--attribute-name.syntax--parent-selector {
  color: #d6e9ff;
}
.syntax--css.syntax--unit {
  color: #32ae85;
}
.syntax--css.syntax--function {
  color: #42675a;
}
.syntax--css.syntax--punctuation.syntax--terminator {
  color: #42675a;
}
.syntax--css.syntax--at-rule {
  color: #d6e9ff;
}
.syntax--css.syntax--at-rule .syntax--keyword.syntax--punctuation {
  color: inherit;
}
.syntax--gfm {
  color: #d6e9ff;
}
.syntax--gfm .syntax--punctuation,
.syntax--gfm .syntax--bracket,
.syntax--gfm .syntax--brace {
  color: #444c55;
}
.syntax--gfm .syntax--string .syntax--punctuation {
  color: #42675a;
}
.syntax--gfm .syntax--link {
  color: #88b4e7;
}
.syntax--gfm.syntax--markup {
  color: #88b4e7;
}
.syntax--gfm.syntax--markup.syntax--bold {
  font-weight: bold;
}
.syntax--gfm.syntax--markup.syntax--italic {
  font-style: italic;
}
.syntax--gfm.syntax--markup.syntax--strike {
  color: #444c55;
  text-decoration: line-through;
}
.syntax--gfm.syntax--markup.syntax--raw {
  color: #34febb;
}
.syntax--gfm.syntax--markup.syntax--raw .syntax--support,
.syntax--gfm.syntax--markup.syntax--code .syntax--support {
  color: #586f89;
}
.syntax--gfm.syntax--comment {
  color: #586f89;
}
.syntax--gfm.syntax--comment.syntax--quote {
  color: #88b4e7;
}
.syntax--gfm.syntax--table {
  color: #34febb;
}
.syntax--gfm.syntax--table .syntax--border,
.syntax--gfm.syntax--table .syntax--pipe {
  color: #444c55;
}
.syntax--gfm.syntax--variable,
.syntax--gfm.syntax--entity {
  color: #34febb;
}
.syntax--gfm.syntax--support {
  color: #32ae85;
}
.syntax--gfm.syntax--heading-1,
.syntax--gfm.syntax--heading-2,
.syntax--gfm.syntax--heading-3 {
  color: #34febb;
}
.syntax--gfm.syntax--heading-4,
.syntax--gfm.syntax--heading-5,
.syntax--gfm.syntax--heading-6 {
  color: #32ae85;
}
.syntax--haskell.syntax--source {
  color: #88b4e7;
}
.syntax--haskell.syntax--source .syntax--punctuation,
.syntax--haskell.syntax--source .syntax--bracket,
.syntax--haskell.syntax--source .syntax--brace {
  color: #444c55;
}
.syntax--haskell.syntax--source .syntax--string .syntax--punctuation {
  color: #42675a;
}
.syntax--html.syntax--meta {
  color: #444c55;
}
.syntax--html.syntax--embedded .syntax--meta,
.syntax--html.syntax--doctype,
.syntax--html.syntax--text {
  color: #586f89;
}
.syntax--html .syntax--string .syntax--id {
  color: #34febb;
}
.syntax--jade.syntax--text,
.syntax--jade .syntax--constant.syntax--name.syntax--attribute.syntax--tag {
  color: #586f89;
}
.syntax--jade .syntax--meta.syntax--control.syntax--flow {
  color: #88b4e7;
}
.syntax--jade .syntax--attribute-name.syntax--id {
  color: #34febb;
}
.syntax--java .syntax--method {
  color: #88b4e7;
}
.syntax--java .syntax--method .syntax--punctuation,
.syntax--java .syntax--method .syntax--bracket,
.syntax--java .syntax--method .syntax--brace {
  color: #444c55;
}
.syntax--java .syntax--method .syntax--string .syntax--punctuation {
  color: #42675a;
}
.syntax--java .syntax--dereference {
  color: #586f89;
}
.syntax--js.syntax--delimiter {
  color: #444c55;
}
.syntax--js.syntax--source {
  color: #88b4e7;
}
.syntax--js.syntax--source .syntax--punctuation,
.syntax--js.syntax--source .syntax--bracket,
.syntax--js.syntax--source .syntax--brace {
  color: #444c55;
}
.syntax--js.syntax--source .syntax--string .syntax--punctuation {
  color: #42675a;
}
.syntax--json .syntax--string {
  color: #88b4e7;
}
.syntax--json .syntax--string .syntax--punctuation {
  color: #444c55;
}
.syntax--json .syntax--value > .syntax--string {
  color: #34febb;
}
.syntax--json .syntax--value > .syntax--string .syntax--punctuation {
  color: #444c55;
}
.syntax--json .syntax--value .syntax--constant {
  color: #32ae85;
}
.syntax--less.syntax--variable:first-child {
  color: #88b4e7;
}
.syntax--less .syntax--mixin {
  color: #32ae85;
}
.syntax--mediawiki {
  color: #d6e9ff;
}
.syntax--mediawiki .syntax--punctuation,
.syntax--mediawiki .syntax--bracket,
.syntax--mediawiki .syntax--brace {
  color: #444c55;
}
.syntax--mediawiki .syntax--string .syntax--punctuation {
  color: #42675a;
}
.syntax--mediawiki .syntax--wiki-link {
  color: #88b4e7;
}
.syntax--mediawiki .syntax--heading {
  color: #34febb;
}
.syntax--mediawiki .syntax--function-call {
  color: #32ae85;
}
.syntax--mediawiki .syntax--value {
  color: #34febb;
}
.syntax--mediawiki .syntax--fix_this_later {
  color: #88b4e7;
}
.syntax--mediawiki .syntax--pipe,
.syntax--mediawiki .syntax--link,
.syntax--mediawiki .syntax--tag {
  color: #444c55;
}
.syntax--php .syntax--string-contents {
  color: #34febb;
}
.syntax--sass .syntax--at-rule .syntax--at-rule,
.syntax--sass .syntax--at-rule .syntax--at-rule > .syntax--punctuation {
  color: #d6e9ff;
}
.syntax--sass .syntax--mixin + .syntax--function,
.syntax--sass .syntax--include + .syntax--function {
  color: #32ae85;
}
.syntax--sass.syntax--property-value {
  color: #34febb;
}
.syntax--sass.syntax--property-value .syntax--function {
  color: #88b4e7;
}
.syntax--sass.syntax--property-value .syntax--punctuation {
  color: #444c55;
}
.syntax--sass.syntax--variable.syntax--parameter.syntax--url {
  color: #34febb;
}
.syntax--sass.syntax--class,
.syntax--sass.syntax--parent-selector-suffix {
  color: #d6e9ff;
}
.syntax--scss .syntax--at-rule .syntax--at-rule,
.syntax--scss .syntax--at-rule .syntax--at-rule > .syntax--punctuation {
  color: #d6e9ff;
}
.syntax--scss .syntax--mixin + .syntax--function,
.syntax--scss .syntax--include + .syntax--function {
  color: #32ae85;
}
.syntax--scss.syntax--property-value {
  color: #34febb;
}
.syntax--scss.syntax--property-value .syntax--function {
  color: #88b4e7;
}
.syntax--scss.syntax--property-value .syntax--punctuation {
  color: #444c55;
}
.syntax--scss.syntax--variable.syntax--parameter.syntax--url {
  color: #34febb;
}
.syntax--scss.syntax--class,
.syntax--scss.syntax--parent-selector-suffix {
  color: #d6e9ff;
}
.syntax--slim.syntax--meta {
  color: #444c55;
}
.syntax--slim.syntax--text {
  color: #586f89;
}
.syntax--slim .syntax--string .syntax--id {
  color: #34febb;
}
.syntax--stylus .syntax--function .syntax--name {
  color: #32ae85;
}
.syntax--tex .syntax--other {
  color: #32ae85;
}
.syntax--tex .syntax--reference {
  color: #88b4e7;
}
.syntax--plain .syntax--text {
  color: #d6e9ff;
}
.syntax--yaml .syntax--tag {
  color: #88b4e7;
}
.syntax--yaml .syntax--constant {
  color: #32ae85;
}
.syntax--yaml .syntax--punctuation {
  color: #444c55;
}


================================================
FILE: examples/react-app-blog/package.json
================================================
{
  "private": true,
  "name": "@phenomic/example-react-app-blog",
  "version": "1.0.0",
  "devDependencies": {
    "@phenomic/cli": "^1.0.0",
    "@phenomic/core": "^1.0.0",
    "@phenomic/preset-react-app": "^1.0.0",
    "react": "^16.8.0",
    "react-dom": "^16.8.0",
    "react-helmet": "^5.0.0",
    "react-router": "^3.2.0",
    "react-topbar-progress-indicator": "^2.0.0",
    "simple-json-fetch": "^1.0.1"
  },
  "scripts": {
    "start": "phenomic start",
    "build": "phenomic build"
  },
  "phenomic": {
    "presets": [
      "@phenomic/preset-react-app"
    ]
  },
  "title": "A random blog",
  "twitter": "Phenomic_app",
  "github": "http://github.com/phenomic/phenomic"
}


================================================
FILE: examples/react-app-blog/public/robots.txt
================================================
User-agent: *
Disallow:


================================================
FILE: examples/react-app-blog/src/ActivityIndicator.js
================================================
// @flow

import * as React from "react";
import TopBarProgressIndicator from "react-topbar-progress-indicator";

TopBarProgressIndicator.config({
  barThickness: 4,
  barColors: {
    "0": "#fff",
    "1.0": "#fff",
  },
  shadowBlur: 5,
});

class ActivityIndicator extends React.PureComponent<{}, { visible: boolean }> {
  state = {
    visible: false,
  };

  _timeout: TimeoutID;

  componentDidMount() {
    this._timeout = setTimeout(() => this.setState({ visible: true }), 250);
  }
  componentWillUnmount() {
    clearTimeout(this._timeout);
  }

  render() {
    return (
      <React.Fragment>
        <TopBarProgressIndicator />
        <style
          dangerouslySetInnerHTML={{
            __html: `
          .ActivityIndicator-loader {
            display: flex;
            height: 25vh;
            justify-content: center;
            align-items: center;
          }

          .ActivityIndicator-spinner {
            height: 5vh;
            min-height: 5rem;
            width: 5vh;
            min-width: 5rem;
            border: 10px solid rgba(0,0,0,0.2);
            border-top-color: rgba(0,0,0,0.8);
            border-radius: 100%;
            animation: ActivityIndicator-rotation 0.8s infinite linear;
            transition: opacity 4s;
          }

          @keyframes ActivityIndicator-rotation {
            from { transform: rotate(0); }
            to { transform: rotate(359deg); }
          }
        `,
          }}
        />
        <div className="ActivityIndicator-loader">
          <div
            className="ActivityIndicator-spinner"
            style={{ opacity: this.state.visible ? 1 : 0 }}
          />
        </div>
      </React.Fragment>
    );
  }
}

export default ActivityIndicator;


================================================
FILE: examples/react-app-blog/src/Footer.js
================================================
// @flow

import * as React from "react";
import { Link } from "@phenomic/preset-react-app/lib/client";

import pkg from "../package.json";

const Footer = () => (
  <React.Fragment>
    <style
      dangerouslySetInnerHTML={{
        __html: `
        .Footer {
          padding: 40px;
          color: #fff;
          background: #2c2c2c;
          font-size: 12px;
        }
        .Footer-content {
          display: flex;
          flex-direction: row;
          justify-content: space-between;
          max-width: 1000px;
          margin: auto;
        }

        .Footer-link {
          color: #fff;
          padding: 10px;
        }

        .Footer-link:hover,
        .Footer-link:focus {
          color: inherit;
        }
        `,
      }}
    />
    <footer className="Footer">
      <div className="Footer-content">
        <nav className="Footer-part">
          <Link className="Footer-link" to="/">
            Home
          </Link>
          <Link className="Footer-link" to="/blog/">
            Blog
          </Link>
          <Link className="Footer-link" to="/repositories/">
            Repositories
          </Link>
          <Link className="Footer-link" to="/about/">
            About
          </Link>
        </nav>
        <div className="Footer-part">
          © {new Date().getFullYear()}, {pkg.title}
        </div>
      </div>
    </footer>
  </React.Fragment>
);

export default Footer;


================================================
FILE: examples/react-app-blog/src/Header.js
================================================
// @flow

import * as React from "react";
import { Link } from "@phenomic/preset-react-app/lib/client";

import pkg from "../package.json";

const Header = (
  {
    title,
    image,
    light,
  } /*: {
    title?: React.Node,
    image?: string,
    light?: boolean
  } */,
) => (
  <React.Fragment>
    <style
      dangerouslySetInnerHTML={{
        __html: `
        .Header {
          position: relative;
        }

        .Header-nav {
          display: flex;
          flex-direction: row;
          justify-content: space-between;
          margin: 0 auto;
          padding: 0;
          line-height: 3rem;
          background: #fff;
          border-top: 4px solid  #444444;
        }

        .Header-navPart1,
        .Header-navPart2 {
          display: flex;
          flex-direction: row;
        }

        .Header-link {
          display: flex;
          align-items: center;
          padding: 0 1rem;
          color: inherit;
          text-decoration: none !important;
          transition: 0.25s all;
          border-bottom: 4px solid transparent;
        }

        .Header-link:hover,
        .Header-link:focus {
          color: inherit;
          border-bottom-color: #3E85D2;
        }

        .Header-hero {
          position: relative;
          overflow: hidden;
          display: flex;
          flex-direction: column;
          justify-content: center;
          min-height: 400px;
          padding: 3rem;
          color: #fff;
          background: #323232;
        }

        .Header-hero-background {
          position: absolute;
          top: 0;
          right: 0;
          bottom: 0;
          left: 0;
          background-size: cover;
          background-position: 50% 50%;
          filter: blur(10px);
        }

        .Header-hero-title {
          position: absolute;
          top: 0;
          right: 0;
          bottom: 0;
          left: 0;
          margin: 0;
          padding-bottom: 40px;
          display: flex;
          flex-direction: column;
          justify-content: center;
          font-size: 52px;
          font-weight: 300;
          color: #fff;
          text-shadow: 0 3px 4px rgba(0,0,0,0.6);
          text-align: center;
          box-shadow: inset 0 0 20px rgba(0,0,0,0.2);
        }

        .Header-light {
          position: relative;
          padding: 3rem;
          text-align: center;
        }

        .Header-light-title {
          font-size: 48px;
          font-weight: 800;
          margin: 40px 0;
        }
      `,
      }}
    />
    <header className="Header">
      <nav className="Header-nav">
        <div className="Header-navPart1">
          <Link className="Header-link" to="/">
            Home
          </Link>
          <Link className="Header-link" to="/blog/">
            Blog
          </Link>
          <Link className="Header-link" to="/repositories/">
            Repositories
          </Link>
          <Link className="Header-link" to="/about/">
            About
          </Link>
        </div>
        <div className="Header-navPart2">
          {pkg.twitter && (
            <a
              href={`https://twitter.com/${pkg.twitter}`}
              className="Header-link"
            >
              Twitter
            </a>
          )}
          {pkg.github && (
            <a href={pkg.github} className="Header-link">
              GitHub
            </a>
          )}
        </div>
      </nav>
      {light ? (
        <div className="Header-light">
          {title && <h1 className="Header-light-title">{title}</h1>}
        </div>
      ) : (
        <div className="Header-hero">
          {image && (
            <div
              className="Header-hero-background"
              style={{ backgroundImage: `url(${image})` }}
            />
          )}
          {title && <h1 className="Header-hero-title">{title}</h1>}
        </div>
      )}
    </header>
  </React.Fragment>
);

export default Header;


================================================
FILE: examples/react-app-blog/src/LatestPosts.js
================================================
// @flow

import * as React from "react";
import { Link } from "@phenomic/preset-react-app/lib/client";

const LatestPosts = (
  { node, error } /*: { node?: Object, error?: Object } */,
) => (
  <React.Fragment>
    <style
      dangerouslySetInnerHTML={{
        __html: `
        .LatestPosts {
          margin-bottom: 20px;
        }

        .LatestPosts h2 {
          text-align: center;
          margin: 0;
          padding: 20px;
          color: #323232;
        }

        .LatestPosts-list {
          max-width: 600px;
          margin: auto;
          padding: 0;
        }

        .LatestPosts-list-item {

        }

        .LatestPosts-list-item-link {
          display: block;
          color: #323232 !important;
          font-size: 18px;
          padding: 5px;
        }

        .LatestPosts-nav {
          font-size: 14px;
          margin-top: 40px;
          text-align: center;
        }

        .LatestPosts-nav a {
          color: #0067b9;
        }
        `,
      }}
    />
    <div className="LatestPosts">
      <h2>Latests Post</h2>
      {error && <div className="error">{error.statusText}</div>}
      {node &&
        node.list && (
          <React.Fragment>
            <ul className="LatestPosts-list">
              {node.list.map(post => (
                <li key={post.id} className="LatestPosts-list-item">
                  <Link
                    to={`/blog/${post.id}/`}
                    className="LatestPosts-list-item-link"
                  >
                    {post.title || post.id}
                  </Link>
                </li>
              ))}
            </ul>
            <div className="LatestPosts-nav">
              {node &&
                node.previous && (
                  <Link
                    to={
                      node.previousPageIsFirst
                        ? `/blog/`
                        : `/blog/after/${node.previous}/`
                    }
                  >
                    Newer posts
                  </Link>
                )}{" "}
              {node &&
                node.next && (
                  <Link to={`/blog/after/${node.next}/`}>Older posts</Link>
                )}
            </div>
          </React.Fragment>
        )}
    </div>
  </React.Fragment>
);

export default LatestPosts;


================================================
FILE: examples/react-app-blog/src/Layout.js
================================================
// @flow

import * as React from "react";
import Head from "react-helmet";

import Header from "./Header.js";
import Footer from "./Footer.js";

const Layout = (
  {
    title,
    image,
    noHero,
    children,
  } /*: {
    title?: React.Node,
    image?: string,
    noHero?: boolean,
    children: React.Node
  } */,
) => (
  <div className="Layout">
    <style
      dangerouslySetInnerHTML={{
        __html: `
        html { box-sizing: border-box; }
        *, *::before, *::after { box-sizing: inherit; }

        html, body {
          margin: 0;
          padding: 0;

          /* system font https://medium.com/designing-medium/system-shock-6b1dc6d6596f */
          font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Oxygen, Ubuntu, Cantarell, "Fira Sans", "Droid Sans", "Helvetica Neue", sans-serif;
          color: #212529;
        }

        .Layout {
          display: flex;
          flex-direction: column;
          justify-content: center;
          min-height: 100vh;
        }

        .Layout-body {
          flex: 1 0;
        }

        .Layout-children {
          position: relative;
          max-width: 1000px;
          margin: auto;
          margin-top: -40px;
          padding: 20px 40px;
          background: #fff;
          border-radius: 3px;
          font-size: 18px;
          line-height: 2;
        }

        .Layout-children a {
          color: #69BF55;
        }

        .Layout-children p,
        .Layout-children ul,
        .Layout-children ol {
          margin-bottom: 40px;
        }

        .Layout hr {
          border: 0;
          height: 0;
          border-top: 1px solid rgba(0, 0, 0, 0.1);
          border-bottom: 1px solid rgba(255, 255, 255, 0.3);
          margin: 40px;
        }
      `,
      }}
    />
    <Head>
      <html lang="en" />
      <meta charSet="utf-8" />
      <meta name="viewport" content="width=device-width, initial-scale=1" />
      <title>{title}</title>
    </Head>
    <Header title={title} image={image} light={noHero} />
    <div className="Layout-body">
      <div className="Layout-children">{children}</div>
    </div>
    <Footer />
  </div>
);

export default Layout;


================================================
FILE: examples/react-app-blog/src/Page.js
================================================
// @flow

import * as React from "react";
import {
  withPhenomicApi,
  query,
  BodyRenderer,
} from "@phenomic/preset-react-app/lib/client";

import pkg from "../package.json";

import Layout from "./Layout";
import PageError from "./PageError";
import ActivityIndicator from "./ActivityIndicator";
import LatestPosts from "./LatestPosts";

const Page = ({ hasError, isLoading, page, posts }) =>
  hasError ? (
    <PageError error={page.error} />
  ) : (
    <React.Fragment>
      <style
        dangerouslySetInnerHTML={{
          __html: `
        .Page {
          position: relative;
        }

        .Page-content {
          margin-bottom: 40px;
        }
        `,
        }}
      />
      <Layout
        title={(page && page.node && page.node.title) || pkg.title}
        image={page && page.node && page.node.image}
      >
        {isLoading && <ActivityIndicator />}
        {!isLoading && (
          <React.Fragment>
            <div className="Page-content">
              {page &&
                page.node &&
                page.node.body && <BodyRenderer>{page.node.body}</BodyRenderer>}
            </div>
            <hr />
            <LatestPosts node={posts.node} error={posts.error} />
          </React.Fragment>
        )}
      </Layout>
    </React.Fragment>
  );

export default withPhenomicApi(Page, props => ({
  page: query({
    path: "content/pages",
    id: props.params.splat || "",
  }),
  posts: query({
    path: "content/posts",
    limit: 4,
    after: props.params.after,
  }),
}));


================================================
FILE: examples/react-app-blog/src/PageBlog.js
================================================
// @flow

import * as React from "react";
import { withPhenomicApi, query } from "@phenomic/preset-react-app/lib/client";

import pkg from "../package.json";

import Layout from "./Layout";
import PageError from "./PageError";
import ActivityIndicator from "./ActivityIndicator";
import LatestPosts from "./LatestPosts";

const PageBlog = ({ hasError, isLoading, posts }) =>
  hasError ? (
    <PageError error={posts.error} />
  ) : (
    <React.Fragment>
      <style
        dangerouslySetInnerHTML={{
          __html: `
        .PageBlog {
          position: relative;
        }

        .PageBlog-content {
          margin-bottom: 40px;
        }
        `,
        }}
      />
      <Layout
        title={pkg.title}
        image="https://images.unsplash.com/photo-1450566841345-741bf07d3278?ixlib=rb-0.3.5&ixid=eyJhcHBfaWQiOjEyMDd9&s=2bfe51ede682d3c902bee4ecf868af22&auto=format&fit=crop&w=900&q=60"
      >
        {isLoading && <ActivityIndicator />}
        {!isLoading && <LatestPosts node={posts.node} />}
      </Layout>
    </React.Fragment>
  );

export default withPhenomicApi(PageBlog, props => ({
  posts: query({
    path: "content/posts",
    limit: 6,
    after: props.params.after,
  }),
}));


================================================
FILE: examples/react-app-blog/src/PageBlogPost.js
================================================
// @flow

import * as React from "react";
import { withPhenomicApi, query } from "@phenomic/preset-react-app/lib/client";

import PageError from "./PageError";
import PostLayoutDefault from "./PostLayoutDefault";
import PostLayoutNoHero from "./PostLayoutNoHero";

const layouts = {
  default: PostLayoutDefault,
  light: PostLayoutNoHero,
};

const PageBlogPost = ({ hasError, isLoading, post }) => {
  if (hasError) {
    return <PageError error={post.error} />;
  }

  const PostLayout =
    (post.node && layouts[post.node.layout]) || layouts.default;
  return <PostLayout isLoading={isLoading} post={post} />;
};

export default withPhenomicApi(PageBlogPost, props => ({
  post: query({ path: "content/posts", id: props.params.splat }),
}));


================================================
FILE: examples/react-app-blog/src/PageError.js
================================================
// @flow

import * as React from "react";

import Layout from "./Layout";

const PageError = ({ error } /*: { error?: Object } */) => {
  const status = (error && error.status) || 404;
  const message = error && status !== 404 ? error.statusText : "Page not found";
  const more =
    error && typeof error.json === "object"
      ? error.json.message
      : status === 404 && (
          <React.Fragment>
            {"It seems you found a broken link. "}
            {"Sorry about that. "}
            <br />
            {"Do not hesitate to report this page."}
          </React.Fragment>
        );

  return (
    <React.Fragment>
      {/* <TopBarProgressIndicator /> */}
      <style
        dangerouslySetInnerHTML={{
          __html: `
        .PageError {
          display: flex;
          flex-direction: column;
          justify-content: center;
          align-items: center;
          min-height: 50vh;
          padding: 1rem 0;
        }

        .PageError-oops {
          font-size: 4rem;
          line-height: 4rem;
          color: #ddd;
        }

        .PageError-title {
          margin: 4rem 0;
          font-size: 2rem;
          line-height: 3rem;
          text-align: center;
        }
      `,
        }}
      />
      <Layout title={message}>
        <div className="PageError">
          <div className="PageError-oops">{"😱 Oooops!"}</div>
          <div>
            <p className="PageError-title">
              <strong>{status}</strong> {message}
            </p>
            <div>{more}</div>
          </div>
        </div>
      </Layout>
    </React.Fragment>
  );
};

export default PageError;


================================================
FILE: examples/react-app-blog/src/PageRepositories.js
================================================
// @flow

import * as React from "react";
import jsonFetch from "simple-json-fetch";
import { withInitialProps, Link } from "@phenomic/preset-react-app/lib/client";

import Layout from "./Layout";
import PageError from "./PageError";
import ActivityIndicator from "./ActivityIndicator";

type props = {|
  status: "loading" | "ready" | "error",
  error?: any,
  repos?: $ReadOnlyArray<Object>,
  prev?: number,
  next?: number,
  first?: number,
  // last?: number,
|};

const endpoint =
  "https://api.github.com/users/MoOx/repos?type=owner&sort=updated&per_page=5";

class PageRepositories extends React.PureComponent<props, void> {
  // SSR and CSR
  static async getInitialProps({ params }) {
    const res = await jsonFetch(endpoint + "&page=" + (params.page || "1"));
    return {
      repos: res.json,
      ...getPagesProps(res),
    };
  }

  // SSR only
  static async getAllPossibleUrls({ path }) {
    if (!path.includes(":page")) return [path];
    const res = await jsonFetch(endpoint);
    return (
      [...Array(getPagesProps(res).last + 1).keys()]
        .slice(2) // skip 0 (useless) & 1 (as 1 is the root)
        .map(page => path.replace(":page", page))
        // just for the demo, github api is limited to 60 call per hour without auth
        // so we just pre-render 3 pages
        .slice(0, 3)
    );
  }

  render() {
    const { status } = this.props;
    return status === "error" ? (
      <PageError error={this.props.error} />
    ) : (
      <React.Fragment>
        <style
          dangerouslySetInnerHTML={{
            __html: `
        .PageRepositories {
          position: relative;
        }

        .PageRepositories-content {
          margin-bottom: 40px;
        }

        .PageRepositories-repo {
          position: relative;
        }

        .PageRepositories-repo-date {
          color: #bbb;
          font-size: 10px;
        }

        .PageRepositories-repo-star {
          position: absolute;
          top: 0;
          right: 0;
        }

        .PageRepositories-nav {
          display: flex;
          flex-direction: row;
          justify-content: space-between;
        }
        `,
          }}
        />
        <Layout
          title={"My repositories"}
          image="https://images.unsplash.com/photo-1454165205744-3b78555e5572?ixlib=rb-0.3.5&ixid=eyJhcHBfaWQiOjEyMDd9&s=863ffeea823f0ffb0885fe1a5e77e645&auto=format&fit=crop&w=900&q=60"
        >
          {status === "loading" && <ActivityIndicator />}
          {status === "ready" &&
            this.props.repos && (
              <React.Fragment>
                <div className="PageRepositories-content">
                  {this.props.repos.map(repo => (
                    <React.Fragment key={repo.name}>
                      <div className="PageRepositories-repo">
                        <a href={repo.html_url}>
                          <strong>{repo.name}</strong>
                        </a>
                        <div>{repo.description}</div>
                        <div className="PageRepositories-repo-date">
                          Updated: {new Date(repo.updated_at).toUTCString()}
                        </div>
                        <div className="PageRepositories-repo-star">
                          ★ {repo.stargazers_count}
                        </div>
                      </div>
                      <hr />
                    </React.Fragment>
                  ))}
                </div>
                <div className="PageRepositories-nav">
                  <div className="PageRepositories-nav-item">
                    {this.props.prev && (
                      <Link
                        to={
                          this.props.prev === this.props.first
                            ? `/repositories/`
                            : `/repositories/page/${this.props.prev}/`
                        }
                      >
                        Previous repositories
                      </Link>
                    )}
                  </div>
                  <div className="PageRepositories-nav-item">
                    {this.props.next && (
                      <Link to={`/repositories/page/${this.props.next}/`}>
                        More repositories
                      </Link>
                    )}
                  </div>
                </div>
              </React.Fragment>
            )}
        </Layout>
      </React.Fragment>
    );
  }
}

export default withInitialProps(PageRepositories);

/* Transform GitHub HTTP `Link` header to an object

  '<https://api.github.com/search/code?q=addClass+user%3Amozilla&page=15>; rel="next",
  <https://api.github.com/search/code?q=addClass+user%3Amozilla&page=34>; rel="last",
  <https://api.github.com/search/code?q=addClass+user%3Amozilla&page=1>; rel="first",
  <https://api.github.com/search/code?q=addClass+user%3Amozilla&page=13>; rel="prev"'

  becomes

  {
    next: 15,
    last: 34,
    first: 1,
    prev: 13,
  }
*/
function getPagesProps(
  res: Response,
): {|
  prev?: number,
  next?: number,
  first?: number,
  last: number,
|} {
  const link = res.headers.get("Link") || res.headers.get("link") || "";
  const almostParams = link.split(/(page=\d+>; rel="[a-z]+)"/);
  const pages = {};
  for (let i = 1; i < almostParams.length; i = i + 2) {
    const page = almostParams[i]
      .replace("page=", "")
      .replace('; rel="', "")
      .split(">");
    pages[page[1]] = parseInt(page[0], 10);
  }
  // $FlowFixMe we know what we receive :)
  return pages;
}


================================================
FILE: examples/react-app-blog/src/PostLayoutDefault.js
================================================
// @flow

import * as React from "react";
import Head from "react-helmet";
import {
  BodyRenderer,
  textRenderer,
} from "@phenomic/preset-react-app/lib/client";

import Layout from "./Layout";
import ActivityIndicator from "./ActivityIndicator";

const PostLayoutDefault = (
  { isLoading, post } /*: { isLoading: boolean, post: Object }*/,
) => (
  <Layout title={post && post.node && post.node.title}>
    {isLoading && <ActivityIndicator />}
    {!isLoading &&
      post.node && (
        <React.Fragment>
          <Head>
            <meta
              name="description"
              content={textRenderer(post.node.body).slice(0, 150) + "…"}
            />
          </Head>
          <BodyRenderer>{post.node.body}</BodyRenderer>
        </React.Fragment>
      )}
  </Layout>
);

export default PostLayoutDefault;


================================================
FILE: examples/react-app-blog/src/PostLayoutNoHero.js
================================================
// @flow

import * as React from "react";
import Head from "react-helmet";
import {
  BodyRenderer,
  textRenderer,
} from "@phenomic/preset-react-app/lib/client";

import Layout from "./Layout";
import ActivityIndicator from "./ActivityIndicator";

const PostLayoutNoHero = (
  { isLoading, post } /*: { isLoading: boolean, post: Object }*/,
) => (
  <Layout title={post && post.node && post.node.title} noHero={true}>
    {isLoading && <ActivityIndicator />}
    {!isLoading &&
      post.node && (
        <React.Fragment>
          <Head>
            <meta
              name="description"
              content={textRenderer(post.node.body).slice(0, 150) + "…"}
            />
          </Head>
          <BodyRenderer>{post.node.body}</BodyRenderer>
        </React.Fragment>
      )}
  </Layout>
);

export default PostLayoutNoHero;


================================================
FILE: examples/react-app-getting-started/App.js
================================================
// @flow

import * as React from "react";
import Head from "react-helmet";
import { Router, Route, browserHistory, Link } from "react-router";
import {
  createApp,
  renderApp,
  withPhenomicApi,
  query,
  BodyRenderer,
  textRenderer,
} from "@phenomic/preset-react-app/lib/client";

const Home = ({ isLoading, posts }) => (
  <Layout>
    <Head>
      <title>Hello world</title>
      <meta name="description" content="Everything is awesome!" />
    </Head>
    <h1>Home</h1>
    {isLoading && "Loading..."}
    {!isLoading && (
      <ul>
        {posts &&
          posts.node &&
          posts.node.list &&
          posts.node.list.map(post => (
            <li key={post.id}>
              <Link to={`/blog/${post.id}/`}>{post.title || post.id}</Link>
            </li>
          ))}
      </ul>
    )}
    <div>
      {posts.node &&
        posts.node.previous && (
          <Link
            to={
              posts.node.previousPageIsFirst
                ? `/`
                : `/after/${posts.node.previous}/`
            }
          >
            Newer posts
          </Link>
        )}{" "}
      {posts.node &&
        posts.node.next && (
          <Link to={`/after/${posts.node.next}/`}>Older posts</Link>
        )}
    </div>
  </Layout>
);

const HomeContainer = withPhenomicApi(Home, props => ({
  posts: query({
    path: "content/posts",
    limit: 2,
    after: props.params.after,
  }),
}));

const DefaultPostLayout = ({ title, body }) => (
  <article>
    <Head>
      <title>{title}</title>
      <meta
        name="description"
        content={textRenderer(body).slice(0, 150) + "…"}
      />
    </Head>
    <h1>{title}</h1>
    <BodyRenderer>{body}</BodyRenderer>
  </article>
);

const HeroPostLayout = ({ title, body }) => (
  <article>
    <Head>
      <title>{title}</title>
      <meta
        name="description"
        content={textRenderer(body).slice(0, 150) + "…"}
      />
    </Head>
    <div style={{ padding: "4rem", background: "pink", color: "#fff" }}>
      <h1>{title}</h1>
    </div>
    <BodyRenderer>{body}</BodyRenderer>
  </article>
);

const PostLayouts = {
  default: DefaultPostLayout,
  hero: HeroPostLayout,
};

const BlogPost = ({ hasError, isLoading, page }) => {
  if (hasError) {
    return <PageError error={page.error} />;
  }

  const PostLayout =
    (page.node && PostLayouts[page.node.layout]) || PostLayouts.default;
  return (
    <Layout>
      {isLoading && "Loading..."}
      {!isLoading && page.node && <PostLayout {...page.node} />}
      <footer>
        <Link to="/">Go to home</Link>
      </footer>
    </Layout>
  );
};

const BlogPostContainer = withPhenomicApi(BlogPost, props => ({
  page: query({ path: "content/posts", id: props.params.splat }),
}));

const PageError = ({ error }) => {
  const status = (error && error.status) || 404;
  const message = error && status !== 404 ? error.statusText : "Page not found";

  return (
    <div>
      <Head>
        <title>{message}</title>
      </Head>
      <h1>{message}</h1>
    </div>
  );
};

const Layout = ({ children }) => (
  <div>
    <Head>
      <html lang="en" />
      <meta charSet="utf-8" />
      <meta name="viewport" content="width=device-width, initial-scale=1" />
    </Head>
    <header>{/* ... */}</header>
    <div>{children}</div>
    <footer>{/* ... */}</footer>
  </div>
);

const routes = () => (
  <Router history={browserHistory}>
    <Route path="/" component={HomeContainer} />
    <Route path="/after/:after" component={HomeContainer} />
    <Route path="/blog/*" component={BlogPostContainer} />
    <Route path="*" component={PageError} />
  </Router>
);

export default createApp(routes);

if (module.hot) {
  module.hot.accept(() => renderApp(routes));
}


================================================
FILE: examples/react-app-getting-started/Html.js
================================================
// @flow

import * as React from "react";
import Head from "react-helmet";

export default ({ App, render }: PhenomicHtmlPropsType) => {
  // if needed, you can know if you are in development or in static rendering
  // const isDev = process.env.PHENOMIC_ENV === "development"
  const { Main, State, Script, Style } = render(<App />);
  const helmet = Head.renderStatic();
  return (
    // $FlowFixMe helmet is fine
    <html {...helmet.htmlAttributes.toComponent()}>
      <head>
        {helmet.meta.toComponent()}
        {helmet.title.toComponent()}
        {helmet.base.toComponent()}
        <Style />
        {helmet.link.toComponent()}
        {helmet.style.toComponent()}
        {helmet.script.toComponent()}
        {helmet.noscript.toComponent()}
      </head>
      {/* // $FlowFixMe it works on my machine */}
      <body {...helmet.bodyAttributes.toComponent()}>
        <Main />
        <State />
        <Script />
      </body>
    </html>
  );
};


================================================
FILE: examples/react-app-getting-started/README.md
================================================
# Getting Started with Phenomic + React preset

You can find the complete tutorial of this example in
[phenomic/packages/preset-react-app/docs/getting-started](https://github.com/phenomic/phenomic/blob/master/packages/preset-react-app/docs/getting-started/README.md)


================================================
FILE: examples/react-app-getting-started/__tests__/__snapshots__/index.js.snap
================================================
// Jest Snapshot v1, https://goo.gl/fbAQLP

exports[`should build example correctly 1`] = `
Array [
  "after/c2Vjb25kLXBvc3Q=/index.html",
  "after/dGhpcmQtcG9zdA==/index.html",
  "after/Zm91cnRoLXBvc3Q=/index.html",
  "after/ZmlmdGgtcG9zdA==/index.html",
  "after/Zmlyc3QtcG9zdA==/index.html",
  "blog/fifth-post/index.html",
  "blog/first-post/index.html",
  "blog/fourth-post/index.html",
  "blog/second-post/index.html",
  "blog/third-post/index.html",
  "index.html",
]
`;

exports[`should build example correctly 2`] = `
Array [
  "phenomic/content/posts/by-default/1/desc/date/limit-2.json",
  "phenomic/content/posts/by-default/1/desc/date/limit-2/after-c2Vjb25kLXBvc3Q=.json",
  "phenomic/content/posts/by-default/1/desc/date/limit-2/after-dGhpcmQtcG9zdA==.json",
  "phenomic/content/posts/by-default/1/desc/date/limit-2/after-Zm91cnRoLXBvc3Q=.json",
  "phenomic/content/posts/by-default/1/desc/date/limit-2/after-ZmlmdGgtcG9zdA==.json",
  "phenomic/content/posts/by-default/1/desc/date/limit-2/after-Zmlyc3QtcG9zdA==.json",
  "phenomic/content/posts/item/fifth-post.json",
  "phenomic/content/posts/item/first-post.json",
  "phenomic/content/posts/item/fourth-post.json",
  "phenomic/content/posts/item/second-post.json",
  "phenomic/content/posts/item/third-post.json",
]
`;

exports[`should build example correctly 3`] = `
Array [
  "favicon.ico",
  "robots.txt",
]
`;


================================================
FILE: examples/react-app-getting-started/__tests__/index.js
================================================
// @flow

/* eslint-disable import/no-extraneous-dependencies */
import path from "path";
import fs from "fs";

import globby from "globby";

it("should build example correctly", () => {
  const testFolder = __dirname + "/../dist";
  const files = globby.sync("**/*", {
    cwd: testFolder,
    nodir: true,
    dot: true,
  });

  // should have html files
  const htmlFiles = files.filter(file => file.endsWith(".html"));
  expect(htmlFiles).toMatchSnapshot();

  const jsonApiFiles = files.filter(
    file => file.startsWith("phenomic") && file.endsWith(".json"),
  );
  // should have matching json files
  expect(jsonApiFiles).toMatchSnapshot();

  // should have assets
  const assetsBundlerFiles = files.filter(
    file =>
      !htmlFiles.includes(file) &&
      !jsonApiFiles.includes(file) &&
      file.startsWith("phenomic"),
  );
  expect(assetsBundlerFiles.length).toBe(1);
  expect(
    files.filter(
      file =>
        !htmlFiles.includes(file) &&
        !jsonApiFiles.includes(file) &&
        !assetsBundlerFiles.includes(file),
    ),
  ).toMatchSnapshot();

  const file1 = fs.readFileSync(
    path.join(__dirname, "..", "dist", "index.html"),
    { encoding: "utf8" },
  );
  expect(file1).toContain("Fifth post");
  expect(file1).toContain('<title data-react-helmet="true">Hello world');
  const file2 = fs.readFileSync(
    path.join(
      __dirname,
      "..",
      "dist",
      "after",
      "dGhpcmQtcG9zdA==",
      "index.html",
    ),
    { encoding: "utf8" },
  );
  expect(file2).toContain("Third post");
});


================================================
FILE: examples/react-app-getting-started/content/posts/fifth-post.md
================================================
---
title: "Fifth post"
date: "2017-01-05"
layout: hero
---

Another post that have a [link to the first one](../first-post/).

An wrong link to [a post that does not exist](../unknown-post/) and another one
to [a page that does not exist](/unknown-page/).

Here is an [external link](http://phenomic.io).


================================================
FILE: examples/react-app-getting-started/content/posts/first-post.md
================================================
---
title: "First post"
date: "2017-01-01"
---

# This is a [Markdown](https://en.wikipedia.org/wiki/Markdown#Example) file

If you are new to Markdown, you might want to check those links:

- [What is Markdown?](http://whatismarkdown.com/)
- [Mastering Markdown, a GitHub guide](https://guides.github.com/features/mastering-markdown/)
- [wikipedia.org/wiki/Markdown](https://en.wikipedia.org/wiki/Markdown#Example)
- [masteringmarkdown.com](http://masteringmarkdown.com/)


================================================
FILE: examples/react-app-getting-started/content/posts/fourth-post.md
================================================
---
title: "Fourth post"
date: "2017-01-04"
---

Another post


================================================
FILE: examples/react-app-getting-started/content/posts/second-post.md
================================================
---
title: "Second post"
date: "2017-01-02"
---

Another post


================================================
FILE: examples/react-app-getting-started/content/posts/third-post.md
================================================
---
title: "Third post"
date: "2017-01-03"
---

Another post


================================================
FILE: examples/react-app-getting-started/package.json
================================================
{
  "private": true,
  "name": "@phenomic/example-react-app-getting-started",
  "version": "1.0.0",
  "devDependencies": {
    "@phenomic/cli": "^1.0.0",
    "@phenomic/core": "^1.0.0",
    "@phenomic/preset-react-app": "^1.0.0",
    "react": "^16.8.0",
    "react-dom": "^16.8.0",
    "react-helmet": "^5.0.0",
    "react-router": "^3.2.0"
  },
  "scripts": {
    "start": "phenomic start",
    "build": "phenomic build"
  },
  "phenomic": {
    "presets": [
      "@phenomic/preset-react-app"
    ]
  }
}


================================================
FILE: examples/react-app-getting-started/public/robots.txt
================================================
User-agent: *
Disallow:


================================================
FILE: examples/react-app-markdown-with-custom-components/App.js
================================================
// @noflow

import * as React from "react";
import { Router, Route, browserHistory } from "react-router";
import {
  createApp,
  withPhenomicApi,
  query,
  BodyRenderer,
} from "@phenomic/preset-react-app/lib/client";

const componentsMap = {
  uppercase: props => props.children.map(child => child.toUpperCase()),
  expand: class Expand extends React.Component<
    { children: React.Node },
    { isExpanded: boolean },
  > {
    state = {
      isExpanded: false,
    };
    filterChild = child =>
      typeof child !== "string" || child.replace(/\s/g, "") !== "";
    filterChildren = (children: React.Node) =>
      Array.isArray(children)
        ? children.filter(this.filterChild)
        : this.filterChild(children)
          ? [children]
          : [];

    handleClick = () => {
      this.setState(prevState => ({ isExpanded: !prevState.isExpanded }));
    };
    render() {
      const children = this.filterChildren(this.props.children);
      return (
        <div>
          <div onClick={this.handleClick}>{children[0]}</div>
          {this.state.isExpanded && <div>{children.slice(1)}</div>}
        </div>
      );
    }
  },
  title: props => (
    <div style={{ border: "1px solid blue", padding: "10px " }}>
      {props.children}
    </div>
  ),
  content: props => (
    <div style={{ border: "1px solid red", padding: "10px" }}>
      {props.children}
    </div>
  ),
  draft: props =>
    process.env.NODE_ENV !== "production" && (
      <div style={{ opacity: 0.5 }}>{props.children}</div>
    ),
};

const Content = ({ hasError, isLoading, page }) => {
  if (hasError) {
    return "Error!";
  }

  return (
    <div>
      {isLoading && "Loading..."}
      {!isLoading &&
        page.node && (
          <div>
            <h1>{page.node.title}</h1>
            <BodyRenderer components={componentsMap}>
              {page.node.body}
            </BodyRenderer>
          </div>
        )}
    </div>
  );
};

const ContentContainer = withPhenomicApi(Content, () => ({
  page: query({ id: "content" }),
}));

export default createApp(() => (
  <Router history={browserHistory}>
    <Route path="/" component={ContentContainer} />
  </Router>
));


================================================
FILE: examples/react-app-markdown-with-custom-components/README.md
================================================
# React app: markdown with custom components

This example show you own to render normal and custom html tags as your own
React components.

_In short, you can replace `<sometag>` by a react component `SomeTag` and get
children nodes (text or other nodes) as objects (not just raw html) to render
those as you like._

🚀 **So wow, such power!**

---

See
[the raw markdown file](https://raw.githubusercontent.com/phenomic/phenomic/master/examples/react-app-markdown-with-custom-components/content/index.md)
and the
[components map](https://github.com/phenomic/phenomic/blob/master/examples/react-app-markdown-with-custom-components/App.js)
to get an idea of the power this feature unlocks.


================================================
FILE: examples/react-app-markdown-with-custom-components/__tests__/index.js
================================================
// @flow

/* eslint-disable import/no-extraneous-dependencies */
import path from "path";
import fs from "fs";

it("should build example correctly", () => {
  const file1 = fs.readFileSync(
    path.join(__dirname, "..", "dist", "index.html"),
    { encoding: "utf8" },
  );
  expect(file1).toContain("This is a Markdown file");
  expect(file1).not.toContain(
    ">This is some content visible during development only",
    // - ">" is important in this test as we test it's not in the html
    // but it's in the json as in this example we filter during rendering
    // - well it's bad, isn't it?
    // - not sure as you can imagine a toggle to enable draft doc!
  );
});


================================================
FILE: examples/react-app-markdown-with-custom-components/content/index.md
================================================
---
title: "This is a Markdown file"
---

But with some <strong>custom html tags</strong>. <Strong>But be careful, all
tags ends-up are lowercase!</Strong>. This is because old school HTML IN
UPPERCASE LIKE <BUTTON>BUTTON</BUTTON> works like a <button>button</button>.

Note that you can create <uppercase>CustomTag that can just uppercase
stings</uppercase>.

You can even leverage children to make dynamic stuff.

<expand>
  <title>Click me!</title>
  <content>
    This is some content!
  </content>
</expand>

You can even hide some parts that are not ready yet!

<draft>
This is some content visible during development only
</draft>


================================================
FILE: examples/react-app-markdown-with-custom-components/package.json
================================================
{
  "private": true,
  "name": "@phenomic/example-react-app-markdown-with-custom-components",
  "version": "1.0.0",
  "devDependencies": {
    "@phenomic/cli": "^1.0.0",
    "@phenomic/core": "^1.0.0",
    "@phenomic/preset-react-app": "^1.0.0",
    "react": "^16.8.0",
    "react-dom": "^16.8.0",
    "react-router": "^3.2.0"
  },
  "scripts": {
    "start": "phenomic start",
    "build": "phenomic build"
  },
  "phenomic": {
    "presets": [
      "@phenomic/preset-react-app"
    ]
  }
}


================================================
FILE: examples/react-app-minimal-hello-world/App.js
================================================
// @flow

import * as React from "react";
import { Router, Route, browserHistory } from "react-router";
import { createApp } from "@phenomic/preset-react-app/lib/client";
// import { createApp, renderApp } from "@phenomic/preset-react-app/lib/client";

export default createApp(() => (
  <Router history={browserHistory}>
    <Route path="/" component={() => <div>Hello world!</div>} />
  </Router>
));

// uncommment to get hot loading
// if (module.hot) {
//   module.hot.accept(() => renderApp(routes));
// }


================================================
FILE: examples/react-app-minimal-hello-world/__tests__/__snapshots__/index.js.snap
================================================
// Jest Snapshot v1, https://goo.gl/fbAQLP

exports[`should build example correctly 1`] = `
Array [
  "index.html",
]
`;

exports[`should build example correctly 2`] = `Array []`;

exports[`should build example correctly 3`] = `Array []`;


================================================
FILE: examples/react-app-minimal-hello-world/__tests__/index.js
================================================
// @flow

/* eslint-disable import/no-extraneous-dependencies */
import globby from "globby";

it("should build example correctly", () => {
  const testFolder = __dirname + "/../dist";
  const files = globby.sync("**/*", {
    cwd: testFolder,
    nodir: true,
    dot: true,
  });

  // should have html files
  const htmlFiles = files.filter(file => file.endsWith(".html"));
  expect(htmlFiles).toMatchSnapshot();

  const jsonApiFiles = files.filter(
    file => file.startsWith("phenomic") && file.endsWith(".json"),
  );
  // should have matching json files
  expect(jsonApiFiles).toMatchSnapshot();

  // should have assets
  const assetsBundlerFiles = files.filter(
    file =>
      !htmlFiles.includes(file) &&
      !jsonApiFiles.includes(file) &&
      file.startsWith("phenomic"),
  );
  expect(assetsBundlerFiles.length).toBe(1);
  expect(
    files.filter(
      file =>
        !htmlFiles.includes(file) &&
        !jsonApiFiles.includes(file) &&
        !assetsBundlerFiles.includes(file),
    ),
  ).toMatchSnapshot();
});


================================================
FILE: examples/react-app-minimal-hello-world/package.json
================================================
{
  "private": true,
  "name": "@phenomic/example-react-app-minimal-hello-world",
  "version": "1.0.0",
  "devDependencies": {
    "@phenomic/cli": "^1.0.0",
    "@phenomic/core": "^1.0.0",
    "@phenomic/preset-react-app": "^1.0.0",
    "react": "^16.8.0",
    "react-dom": "^16.8.0",
    "react-router": "^3.2.0"
  },
  "scripts": {
    "start": "phenomic start",
    "build": "phenomic build"
  },
  "phenomic": {
    "presets": [
      "@phenomic/preset-react-app"
    ]
  }
}


================================================
FILE: examples/react-app-styles-with-aphrodite/App.js
================================================
// @flow

import * as React from "react";
import { Router, Route, browserHistory } from "react-router";
import { createApp } from "@phenomic/preset-react-app/lib/client";
import { StyleSheet, css } from "aphrodite/no-important";

if (typeof window !== "undefined" && window._aphrodite) {
  StyleSheet.rehydrate(window._aphrodite);
}

const styles = StyleSheet.create({
  title: {
    fontSize: "1.5em",
    textAlign: "center",
    color: "palevioletred",
  },
  title2: {
    fontSize: "2em",
    textAlign: "right",
    color: "blue",
  },
});

export default createApp(() => (
  <Router history={browserHistory}>
    <Route
      path="/"
      component={() => <h1 className={css(styles.title)}>Hello World!</h1>}
    />
    <Route
      path="/2"
      component={() => <h1 className={css(styles.title2)}>Hello again!</h1>}
    />
  </Router>
));


================================================
FILE: examples/react-app-styles-with-aphrodite/Html.js
================================================
// @flow

import * as React from "react";
import { StyleSheetServer } from "aphrodite/no-important";

export default ({ App, render }: PhenomicHtmlPropsType) => {
  const {
    html: { Main, State, Script },
    css,
  } = StyleSheetServer.renderStatic(() => render(<App />));

  return (
    <html>
      <head>
        <style data-aphrodite={true}>{css.content}</style>
      </head>
      <body>
        <Main />
        <State />
        <script
          dangerouslySetInnerHTML={{
            __html: `window._aphrodite = ${JSON.stringify(
              css.renderedClassNames,
            )}`,
          }}
        />
        <Script />
      </body>
    </html>
  );
};


================================================
FILE: examples/react-app-styles-with-aphrodite/__tests__/index.js
================================================
// @flow

/* eslint-disable import/no-extraneous-dependencies */
import path from "path";
import fs from "fs";

it("should build example correctly", () => {
  const file1 = fs.readFileSync(
    path.join(__dirname, "..", "dist", "index.html"),
    { encoding: "utf8" },
  );
  expect(file1).toContain("Hello World!");
  expect(file1).toContain(
    "font-size:1.5em;text-align:center;color:palevioletred",
  );

  const file2 = fs.readFileSync(
    path.join(__dirname, "..", "dist", "2", "index.html"),
    { encoding: "utf8" },
  );
  expect(file2).toContain("Hello again!");
  expect(file2).toContain("font-size:2em;text-align:right;color:blue");
});


================================================
FILE: examples/react-app-styles-with-aphrodite/package.json
================================================
{
  "private": true,
  "name": "@phenomic/example-react-app-styles-with-aphrodite",
  "version": "1.0.0",
  "devDependencies": {
    "@phenomic/cli": "^1.0.0",
    "@phenomic/core": "^1.0.0",
    "@phenomic/preset-react-app": "^1.0.0",
    "aphrodite": "^1.0.0",
    "react": "^16.8.0",
    "react-dom": "^16.8.0",
    "react-router": "^3.2.0"
  },
  "scripts": {
    "start": "phenomic start",
    "build": "phenomic build"
  },
  "phenomic": {
    "presets": [
      "@phenomic/preset-react-app"
    ]
  }
}


================================================
FILE: examples/react-app-styles-with-css/App.js
================================================
// @flow

import * as React from "react";
import { Router, Route, browserHistory } from "react-router";
import { createApp } from "@phenomic/preset-react-app/lib/client";

import "./styles.css";

export default createApp(() => (
  <Router history={browserHistory}>
    <Route
      path="/"
      component={() => <div className="helloWorld">Hello World!</div>}
    />
  </Router>
));


================================================
FILE: examples/react-app-styles-with-css/__tests__/__snapshots__/index.js.snap
================================================
// Jest Snapshot v1, https://goo.gl/fbAQLP

exports[`should build example correctly 1`] = `
".helloWorld {
  font-size: 40rem;
}

"
`;


================================================
FILE: examples/react-app-styles-with-css/__tests__/index.js
================================================
// @flow

import fs from "fs";
import path from "path";

/* eslint-disable import/no-extraneous-dependencies */
import globby from "globby";

it("should build example correctly", () => {
  const testFolder = __dirname + "/../dist";
  const files = globby.sync("**/*", {
    cwd: testFolder,
    nodir: true,
    dot: true,
  });

  const assetsBundlerFiles = files.filter(file => file.startsWith("phenomic"));
  expect(assetsBundlerFiles.length).toBe(2);
  expect(
    fs.readFileSync(
      path.join(
        __dirname,
        "..",
        "dist",
        assetsBundlerFiles.filter(file => file.endsWith(".css")).shift(),
      ),
      { encoding: "utf8" },
    ),
  ).toMatchSnapshot();
});


================================================
FILE: examples/react-app-styles-with-css/package.json
================================================
{
  "private": true,
  "name": "@phenomic/example-react-app-styles-with-css",
  "version": "1.0.0",
  "devDependencies": {
    "@phenomic/cli": "^1.0.0",
    "@phenomic/core": "^1.0.0",
    "@phenomic/preset-react-app": "^1.0.0",
    "react": "^16.8.0",
    "react-dom": "^16.8.0",
    "react-router": "^3.2.0"
  },
  "scripts": {
    "start": "phenomic start",
    "build": "phenomic build"
  },
  "phenomic": {
    "presets": [
      "@phenomic/preset-react-app"
    ]
  }
}


================================================
FILE: examples/react-app-styles-with-css/styles.css
================================================
.helloWorld {
  font-size: 40rem;
}


================================================
FILE: examples/react-app-styles-with-css-inlined-in-head/App.js
================================================
// @flow

import * as React from "react";
import { Router, Route, browserHistory } from "react-router";
import { createApp } from "@phenomic/preset-react-app/lib/client";

import "./styles.css";

export default createApp(() => (
  <Router history={browserHistory}>
    <Route
      path="/"
      component={() => <div className="helloWorld">Hello World!</div>}
    />
  </Router>
));


================================================
FILE: examples/react-app-styles-with-css-inlined-in-head/Html.js
================================================
// @flow

import fs from "fs";

import * as React from "react";

// memory to avoid reading a css file already read
// @todo try to get ./dist/ from config somehow
const stylesMemory = {};
const readCssFile = css => {
  if (!stylesMemory[css])
    stylesMemory[css] = fs.readFileSync("./dist/" + css, { encoding: "utf8" });
  return stylesMemory[css];
};

export default ({ App, render }: PhenomicHtmlPropsType) => {
  const { html, Main, State, Script, Style, assets } = render(<App />);

  return (
    <html>
      <head>
        {process.env.PHENOMIC_ENV !== "static" ? (
          <Style />
        ) : (
          <style
            // @idea use https://github.com/addyosmani/critical
            dangerouslySetInnerHTML={{
              __html: Object.keys(assets)
                .reduce((acc, name) => acc.concat(assets[name]), [])
                .filter(asset => asset.endsWith(".css"))
                .map(css => readCssFile(css))
                .join(""),
            }}
          />
        )}
      </head>
      <body>
        <Main />
        <State />
        <Script />
      </body>
    </html>
  );
};


================================================
FILE: examples/react-app-styles-with-css-inlined-in-head/__tests__/index.js
================================================
// @flow

/* eslint-disable import/no-extraneous-dependencies */
import path from "path";
import fs from "fs";

it("should build example correctly", () => {
  const file1 = fs.readFileSync(
    path.join(__dirname, "..", "dist", "index.html"),
    { encoding: "utf8" },
  );
  expect(file1).toContain("Hello World!");
  expect(file1).toContain("font-size: 40rem;");
});


================================================
FILE: examples/react-app-styles-with-css-inlined-in-head/package.json
================================================
{
  "private": true,
  "name": "@phenomic/example-react-app-styles-with-css-inlined-in-head",
  "version": "1.0.0",
  "devDependencies": {
    "@phenomic/cli": "^1.0.0",
    "@phenomic/core": "^1.0.0",
    "@phenomic/preset-react-app": "^1.0.0",
    "react": "^16.8.0",
    "react-dom": "^16.8.0",
    "react-router": "^3.2.0"
  },
  "scripts": {
    "start": "phenomic start",
    "build": "phenomic build"
  },
  "phenomic": {
    "presets": [
      "@phenomic/preset-react-app"
    ]
  }
}


================================================
FILE: examples/react-app-styles-with-css-inlined-in-head/styles.css
================================================
.helloWorld {
  font-size: 40rem;
}


================================================
FILE: examples/react-app-styles-with-emotion/App.js
================================================
// @flow

import React from "react";
import { Router, Route, browserHistory } from "react-router";
import { createApp } from "@phenomic/preset-react-app/lib/client";
import { hydrate } from "emotion";
import styled from "react-emotion";

// window._emotion is set inside html.js and caches emotion styles
if (typeof window !== "undefined" && window._emotion) {
  hydrate(window._emotion);
}

const Title = styled("h1")`
  font-size: 1.5em;
  text-align: center;
  color: palevioletred;
`;

const Title2 = styled("h1")`
  font-size: 2em;
  text-align: right;
  color: blue;
`;

export default createApp(() => (
  <Router history={browserHistory}>
    <Route path="/" component={() => <Title>Hello World!</Title>} />
    <Route path="/2" component={() => <Title2>Hello again!</Title2>} />
  </Router>
));


================================================
FILE: examples/react-app-styles-with-emotion/Html.js
================================================
// @flow

import * as React from "react";
import { extractCritical } from "emotion-server";

export default ({ App, render }: PhenomicHtmlPropsType) => {
  const { html, Main, State, Script } = render(<App />);
  const { css, ids } = extractCritical(html);

  return (
    <html>
      <head>
        <style dangerouslySetInnerHTML={{ __html: css }} />
      </head>
      <body>
        <Main />
        <State />
        <script
          dangerouslySetInnerHTML={{
            __html: `window._emotion = ${JSON.stringify(ids)}`,
          }}
        />
        <Script />
      </body>
    </html>
  );
};


================================================
FILE: examples/react-app-styles-with-emotion/__tests__/index.js
================================================
// @flow

/* eslint-disable import/no-extraneous-dependencies */
import path from "path";
import fs from "fs";

it("should build example correctly", () => {
  const file1 = fs.readFileSync(
    path.join(__dirname, "..", "dist", "index.html"),
    { encoding: "utf8" },
  );
  expect(file1).toContain("Hello World!");
  expect(file1).toContain(
    "font-size:1.5em;text-align:center;color:palevioletred",
  );

  const file2 = fs.readFileSync(
    path.join(__dirname, "..", "dist", "2", "index.html"),
    { encoding: "utf8" },
  );
  expect(file2).toContain("Hello again!");
  expect(file2).toContain("font-size:2em;text-align:right;color:blue");
});


================================================
FILE: examples/react-app-styles-with-emotion/package.json
================================================
{
  "private": true,
  "name": "@phenomic/example-react-app-styles-with-emotion",
  "version": "1.0.0",
  "devDependencies": {
    "@phenomic/cli": "^1.0.0",
    "@phenomic/core": "^1.0.0",
    "@phenomic/preset-react-app": "^1.0.0",
    "emotion": "^8.0.0",
    "emotion-server": "^8.0.0",
    "react": "^16.8.0",
    "react-dom": "^16.8.0",
    "react-emotion": "^8.0.0",
    "react-router": "^3.2.0"
  },
  "scripts": {
    "start": "phenomic start",
    "build": "phenomic build"
  },
  "phenomic": {
    "presets": [
      "@phenomic/preset-react-app"
    ]
  }
}


================================================
FILE: examples/react-app-styles-with-glamor/App.js
================================================
// @flow

import * as React from "react";
import { Router, Route, browserHistory } from "react-router";
import { createApp } from "@phenomic/preset-react-app/lib/client";
import { css, rehydrate } from "glamor";

if (typeof window !== "undefined" && window._glam) {
  rehydrate(window._glam);
}

const title = css({
  fontSize: "1.5em",
  textAlign: "center",
  color: "palevioletred",
});

const title2 = css({
  fontSize: "2em",
  textAlign: "right",
  color: "blue",
});

export default createApp(() => (
  <Router history={browserHistory}>
    <Route path="/" component={() => <h1 {...title}>Hello World!</h1>} />
    <Route path="/2" component={() => <h1 {...title2}>Hello again!</h1>} />
  </Router>
));


================================================
FILE: examples/react-app-styles-with-glamor/Html.js
================================================
// @flow

import * as React from "react";
import { renderStaticOptimized } from "glamor/server";

export default ({ App, render }: PhenomicHtmlPropsType) => {
  const { html, Main, State, Script } = render(<App />);
  const { css, ids } = renderStaticOptimized(() => html);

  return (
    <html>
      <head>
        <style dangerouslySetInnerHTML={{ __html: css }} />
      </head>
      <body>
        <Main />
        <State />
        <script
          dangerouslySetInnerHTML={{
            __html: `window._glam = ${JSON.stringify(ids)}`,
          }}
        />
        <Script />
      </body>
    </html>
  );
};


================================================
FILE: examples/react-app-styles-with-glamor/__tests__/index.js
================================================
// @flow

/* eslint-disable import/no-extraneous-dependencies */
import path from "path";
import fs from "fs";

it("should build example correctly", () => {
  const file1 = fs.readFileSync(
    path.join(__dirname, "..", "dist", "index.html"),
    { encoding: "utf8" },
  );
  expect(file1).toContain("Hello World!");
  expect(file1).toContain(
    "font-size:1.5em;text-align:center;color:palevioletred",
  );

  const file2 = fs.readFileSync(
    path.join(__dirname, "..", "dist", "2", "index.html"),
    { encoding: "utf8" },
  );
  expect(file2).toContain("Hello again!");
  expect(file2).toContain("font-size:2em;text-align:right;color:blue");
});


================================================
FILE: examples/react-app-styles-with-glamor/package.json
================================================
{
  "private": true,
  "name": "@phenomic/example-react-app-styles-with-glamor",
  "version": "1.0.0",
  "devDependencies": {
    "@phenomic/cli": "^1.0.0",
    "@phenomic/core": "^1.0.0",
    "@phenomic/preset-react-app": "^1.0.0",
    "glamor": "^2.0.0",
    "react": "^16.8.0",
    "react-dom": "^16.8.0",
    "react-router": "^3.2.0"
  },
  "scripts": {
    "start": "phenomic start",
    "build": "phenomic build"
  },
  "phenomic": {
    "presets": [
      "@phenomic/preset-react-app"
    ]
  }
}


================================================
FILE: examples/react-app-styles-with-glamorous/App.js
================================================
// @flow

import * as React from "react";
import { Router, Route, browserHistory } from "react-router";
import { createApp } from "@phenomic/preset-react-app/lib/client";
import glamorous from "glamorous";
import { rehydrate } from "glamor";

if (typeof window !== "undefined" && window._glam) {
  rehydrate(window._glam);
}

const Title = glamorous.h1({
  fontSize: "1.5em",
  textAlign: "center",
  color: "palevioletred",
});

const Title2 = glamorous.h1({
  fontSize: "2em",
  textAlign: "right",
  color: "blue",
});

export default createApp(() => (
  <Router history={browserHistory}>
    <Route path="/" component={() => <Title>Hello World!</Title>} />
    <Route path="/2" component={() => <Title2>Hello again!</Title2>} />
  </Router>
));


================================================
FILE: examples/react-app-styles-with-glamorous/Html.js
================================================
// @flow

import * as React from "react";
import { renderStaticOptimized } from "glamor/server";

export default ({ App, render }: PhenomicHtmlPropsType) => {
  const { html, Main, State, Script } = render(<App />);
  const { css, ids } = renderStaticOptimized(() => html);

  return (
    <html>
      <head>
        <style dangerouslySetInnerHTML={{ __html: css }} />
      </head>
      <body>
        <Main />
        <State />
        <script
          dangerouslySetInnerHTML={{
            __html: `window._glam = ${JSON.stringify(ids)}`,
          }}
        />
        <Script />
      </body>
    </html>
  );
};


================================================
FILE: examples/react-app-styles-with-glamorous/__tests__/index.js
================================================
// @flow

/* eslint-disable import/no-extraneous-dependencies */
import path from "path";
import fs from "fs";

it("should build example correctly", () => {
  const file1 = fs.readFileSync(
    path.join(__dirname, "..", "dist", "index.html"),
    { encoding: "utf8" },
  );
  expect(file1).toContain("Hello World!");
  expect(file1).toContain(
    "font-size:1.5em;text-align:center;color:palevioletred",
  );

  const file2 = fs.readFileSync(
    path.join(__dirname, "..", "dist", "2", "index.html"),
    { encoding: "utf8" },
  );
  expect(file2).toContain("Hello again!");
  expect(file2).toContain("font-size:2em;text-align:right;color:blue");
});


================================================
FILE: examples/react-app-styles-with-glamorous/package.json
================================================
{
  "private": true,
  "name": "@phenomic/example-react-app-styles-with-glamorous",
  "version": "1.0.0",
  "devDependencies": {
    "@phenomic/cli": "^1.0.0",
    "@phenomic/core": "^1.0.0",
    "@phenomic/preset-react-app": "^1.0.0",
    "glamor": "^2.0.0",
    "glamorous": "^4.0.0",
    "react": "^16.8.0",
    "react-dom": "^16.8.0",
    "react-router": "^3.2.0"
  },
  "scripts": {
    "start": "phenomic start",
    "build": "phenomic build"
  },
  "phenomic": {
    "presets": [
      "@phenomic/preset-react-app"
    ]
  }
}


================================================
FILE: examples/react-app-styles-with-radium/App.js
================================================
// @flow

import * as React from "react";
import { Router, Route, browserHistory } from "react-router";
import { createApp } from "@phenomic/preset-react-app/lib/client";
import Radium from "radium";

const styles = {
  title: {
    fontSize: "1.5em",
    textAlign: "center",
    color: "palevioletred",
    ":hover": {
      color: "red",
    },
    "@media (max-width: 1000px)": {
      color: "orange",
    },
  },
  title2: {
    fontSize: "2em",
    textAlign: "right",
    color: "blue",
  },
};

export default createApp(() => (
  <Router history={browserHistory}>
    <Route
      path="/"
      component={Radium(() => (
        <h1 style={styles.title}>Hello World!</h1>
      ))}
    />
    <Route
      path="/2"
      component={Radium(() => (
        <h1 style={styles.title2}>Hello again!</h1>
      ))}
    />
  </Router>
));


================================================
FILE: examples/react-app-styles-with-radium/Html.js
================================================
// @flow

import * as React from "react";
import { StyleRoot } from "radium";

export default ({ App, render }: PhenomicHtmlPropsType) => {
  const { Main, State, Script } = render(
    <StyleRoot>
      <App />
    </StyleRoot>,
  );

  return (
    <html>
      <body>
        <Main />
        <State />
        <Script />
      </body>
    </html>
  );
};


================================================
FILE: examples/react-app-styles-with-radium/__tests__/index.js
================================================
// @flow

/* eslint-disable import/no-extraneous-dependencies */
import path from "path";
import fs from "fs";

it("should build example correctly", () => {
  const file1 = fs.readFileSync(
    path.join(__dirname, "..", "dist", "index.html"),
    { encoding: "utf8" },
  );
  expect(file1).toContain("Hello World!");
  expect(file1).toContain(
    "font-size:1.5em;text-align:center;color:palevioletred",
  );

  const file2 = fs.readFileSync(
    path.join(__dirname, "..", "dist", "2", "index.html"),
    { encoding: "utf8" },
  );
  expect(file2).toContain("Hello again!");
  expect(file2).toContain("font-size:2em;text-align:right;color:blue");
});


================================================
FILE: examples/react-app-styles-with-radium/package.json
================================================
{
  "private": true,
  "name": "@phenomic/example-react-app-styles-with-radium",
  "version": "1.0.0",
  "devDependencies": {
    "@phenomic/cli": "^1.0.0",
    "@phenomic/core": "^1.0.0",
    "@phenomic/preset-react-app": "^1.0.0",
    "radium": "^0.19.0",
    "react": "^16.8.0",
    "react-dom": "^16.8.0",
    "react-router": "^3.2.0"
  },
  "scripts": {
    "start": "phenomic start",
    "build": "phenomic build"
  },
  "phenomic": {
    "presets": [
      "@phenomic/preset-react-app"
    ]
  }
}


================================================
FILE: examples/react-app-styles-with-styled-components/App.js
================================================
// @flow

import * as React from "react";
import { Router, Route, browserHistory } from "react-router";
import { createApp } from "@phenomic/preset-react-app/lib/client";
import styled from "styled-components";

const Title = styled.h1`
  font-size: 1.5em;
  text-align: center;
  color: palevioletred;
`;

const Title2 = styled.h1`
  font-size: 2em;
  text-align: right;
  color: blue;
`;

export default createApp(() => (
  <Router history={browserHistory}>
    <Route path="/" component={() => <Title>Hello World!</Title>} />
    <Route path="/2" component={() => <Title2>Hello again!</Title2>} />
  </Router>
));


================================================
FILE: examples/react-app-styles-with-styled-components/Html.js
================================================
// @flow

import * as React from "react";
import { ServerStyleSheet } from "styled-components";

export default ({ App, render }: PhenomicHtmlPropsType) => {
  const sheet = new ServerStyleSheet();
  const { Main, State, Script } = render(sheet.collectStyles(<App />));

  return (
    <html>
      <head>{sheet.getStyleElement()}</head>
      <body>
        <Main />
        <State />
        <Script />
      </body>
    </html>
  );
};


================================================
FILE: examples/react-app-styles-with-styled-components/__tests__/index.js
================================================
// @flow

/* eslint-disable import/no-extraneous-dependencies */
import path from "path";
import fs from "fs";

it("should build example correctly", () => {
  const file1 = fs.readFileSync(
    path.join(__dirname, "..", "dist", "index.html"),
    { encoding: "utf8" },
  );
  expect(file1).toContain("Hello World!");
  expect(file1).toContain(
    "font-size:1.5em;text-align:center;color:palevioletred",
  );

  const file2 = fs.readFileSync(
    path.join(__dirname, "..", "dist", "2", "index.html"),
    { encoding: "utf8" },
  );
  expect(file2).toContain("Hello again!");
  expect(file2).toContain("font-size:2em;text-align:right;color:blue");
});


================================================
FILE: examples/react-app-styles-with-styled-components/package.json
================================================
{
  "private": true,
  "name": "@phenomic/example-react-app-styles-with-styled-components",
  "version": "1.0.0",
  "devDependencies": {
    "@phenomic/cli": "^1.0.0",
    "@phenomic/core": "^1.0.0",
    "@phenomic/preset-react-app": "^1.0.0",
    "react": "^16.8.0",
    "react-dom": "^16.8.0",
    "react-router": "^3.2.0",
    "styled-components": "^4.0.0"
  },
  "scripts": {
    "start": "phenomic start",
    "build": "phenomic build"
  },
  "phenomic": {
    "presets": [
      "@phenomic/preset-react-app"
    ]
  }
}


================================================
FILE: examples/react-app-with-basename/App.js
================================================
// @flow

import * as React from "react";
import { Router, Route, useRouterHistory } from "react-router";
// default (browser) history needs a DOM, so memory history is used for static rendering
import { createHistory, createMemoryHistory } from "history";
import {
  createApp,
  Link,
  withPhenomicApi,
  query,
} from "@phenomic/preset-react-app/lib/client";

const history = useRouterHistory(
  typeof window !== "undefined" ? createHistory : createMemoryHistory,
)({ basename: process.env.PHENOMIC_APP_BASENAME });

const Hello = () => (
  <div>
    Hello world! <Link to="/test">Test me!</Link>
  </div>
);

const GoBack = ({ hasError, isLoading, testList }) => (
  <div>
    Bye world! <Link to="/">Go back!</Link>
    <p>
      {hasError && "Oops"}
      {isLoading && "Loading..."}
    </p>
    {testList &&
      testList.node &&
      testList.node.list && <ul>{testList.node.list.map(item => item.id)}</ul>}
  </div>
);

const GoBackContainer = withPhenomicApi(GoBack, () => ({
  testList: query({}),
}));

export default createApp(() => (
  <Router history={history}>
    <Route path="/" component={Hello} />
    <Route path="/test" component={GoBackContainer} />
  </Router>
));


================================================
FILE: examples/react-app-with-basename/__tests__/index.js
================================================
// @flow

/* eslint-disable import/no-extraneous-dependencies */
import path from "path";
import fs from "fs";

it("should build example correctly", () => {
  const file1 = fs.readFileSync(
    path.join(__dirname, "..", "dist", "index.html"),
    { encoding: "utf8" },
  );
  expect(file1).toContain('<a href="/website/base/test"');
  expect(file1).toContain('script src="/website/base/phenomic/phenomic.main');

  const file2 = fs.readFileSync(
    path.join(__dirname, "..", "dist", "test", "index.html"),
    { encoding: "utf8" },
  );
  expect(file2).toContain('<a href="/website/base/"');
});


================================================
FILE: examples/react-app-with-basename/content/test.md
================================================
I am a test!


================================================
FILE: examples/react-app-with-basename/package.json
================================================
{
  "private": true,
  "name": "@phenomic/example-react-app-with-basename",
  "version": "1.0.0",
  "devDependencies": {
    "@phenomic/cli": "^1.0.0",
    "@phenomic/core": "^1.0.0",
    "@phenomic/preset-react-app": "^1.0.0",
    "react": "^16.8.0",
    "react-dom": "^16.8.0",
    "react-router": "^3.2.0"
  },
  "scripts": {
    "start": "phenomic start",
    "build": "phenomic build"
  },
  "phenomic": {
    "baseUrl": "http://test.com/website/base",
    "presets": [
      "@phenomic/preset-react-app"
    ]
  }
}


================================================
FILE: examples/react-native-web-app/App.js
================================================
// @flow

import * as React from "react";
import { Router, Route, browserHistory } from "react-router";
import { createApp } from "@phenomic/preset-react-app/lib/client";
import { AppRegistry, Text } from "react-native-web";

const Title = props => (
  <Text
    {...props}
    style={{
      fontSize: "1.5em",
      textAlign: "center",
      color: "palevioletred",
    }}
  />
);

const Title2 = props => (
  <Text
    {...props}
    style={{
      fontSize: "2em",
      textAlign: "right",
      color: "blue",
    }}
  />
);

const routes = () => (
  <Router history={browserHistory}>
    <Route path="/" component={() => <Title>Hello World!</Title>} />
    <Route path="/2" component={() => <Title2>Hello again!</Title2>} />
  </Router>
);

const render = (rootComponent, rootTag) => {
  AppRegistry.registerComponent("App", () => () => rootComponent);
  AppRegistry.runApplication("App", { rootTag });
};

export default createApp(routes, render);


================================================
FILE: examples/react-native-web-app/Html.js
================================================
// @flow

import * as React from "react";
import Head from "react-helmet";
import { AppRegistry } from "react-native-web";

const Html = ({ App, render }: PhenomicHtmlPropsType) => {
  AppRegistry.registerComponent("App", () => App);
  const app = AppRegistry.getApplication("App");
  const { Main, State, Script, Style } = render(app.element);

  const helmet = Head.renderStatic();
  return (
    <html {...helmet.htmlAttributes.toComponent()}>
      <head>
        {helmet.meta.toComponent()}
        {helmet.title.toComponent()}
        {helmet.base.toComponent()}
        {app.getStyleElement()}
        <Style />
        {helmet.link.toComponent()}
        {helmet.style.toComponent()}
        {helmet.script.toComponent()}
        {helmet.noscript.toComponent()}
      </head>
      <body {...helmet.bodyAttributes.toComponent()}>
        <Main />
        <State />
        <Script />
      </body>
    </html>
  );
};

export default Html;


================================================
FILE: examples/react-native-web-app/__tests__/index.js
================================================
// @flow

/* eslint-disable import/no-extraneous-dependencies */
import path from "path";
import fs from "fs";

it("should build example correctly", () => {
  const file1 = fs.readFileSync(
    path.join(__dirname, "..", "dist", "index.html"),
    { encoding: "utf8" },
  );
  const file2 = fs.readFileSync(
    path.join(__dirname, "..", "dist", "2", "index.html"),
    { encoding: "utf8" },
  );

  expect(file1).toContain("Hello World!");
  expect(file1).toContain("font-size:1.5em");
  expect(file1).toContain("text-align:center");
  // expect(file1).toContain("color:palevioletred");
  expect(file1).toContain("color:rgba(219,112,147,1.00)");
  expect(file1).not.toContain("Hello again!");
  expect(file1).not.toContain("font-size:2em");
  expect(file1).not.toContain("text-align:right");
  // expect(file1).not.toContain("color:blue");
  expect(file1).not.toContain("color:rgba(0,0,255,1.00)");

  expect(file2).not.toContain("Hello World!");
  expect(file2).not.toContain("font-size:1.5em");
  expect(file2).not.toContain("text-align:center");
  // expect(file2).not.toContain("color:palevioletred");
  expect(file2).not.toContain("color:rgba(219,112,147,1.00)");
  expect(file2).toContain("Hello again!");
  expect(file2).toContain("font-size:2em");
  expect(file2).toContain("text-align:right");
  // expect(file2).toContain("color:blue");
  expect(file2).toContain("color:rgba(0,0,255,1.00)");
});


================================================
FILE: examples/react-native-web-app/package.json
================================================
{
  "private": true,
  "name": "@phenomic/example-react-native-app",
  "version": "1.0.0",
  "devDependencies": {
    "@phenomic/cli": "^1.0.0",
    "@phenomic/core": "^1.0.0",
    "@phenomic/preset-react-app": "^1.0.0",
    "react": "^16.8.0",
    "react-art": "^16.5.2",
    "react-dom": "^16.8.0",
    "react-native-web": "^0.9.0",
    "react-router": "^3.2.0"
  },
  "scripts": {
    "start": "phenomic start",
    "build": "phenomic build"
  },
  "phenomic": {
    "presets": [
      "@phenomic/preset-react-app"
    ]
  }
}


================================================
FILE: examples/reason-react-app/App.js
================================================
// @flow

import * as React from "react";
import { Router, Route, browserHistory } from "react-router";
import { createApp, renderApp } from "@phenomic/preset-react-app/lib/client";
import { withPhenomicApi } from "@phenomic/preset-react-app/lib/es6/src/phenomicPresetReactApp.bs.js";

import * as Home from "./lib/es6/src/components/Home.bs.js";
import * as Post from "./lib/es6/src/components/Post.bs.js";
import ErrorPage from "./lib/es6/src/components/ErrorPage.bs.js";

const routes = () => (
  <Router history={browserHistory}>
    <Route path="/" component={withPhenomicApi(Home.make, Home.queries)} />
    <Route
      path="/after/:after"
      component={withPhenomicApi(Home.make, Home.queries)}
    />
    <Route path="blog/*" component={withPhenomicApi(Post.make, Post.queries)} />
    <Route path="*" component={ErrorPage} />
    <Route path="404.html" component={ErrorPage} />
  </Router>
);

export default createApp(routes);

if (module.hot) {
  module.hot.accept(() => renderApp(routes));
}


================================================
FILE: examples/reason-react-app/README.md
================================================
# Getting Started with Phenomic + React preset + ReasonML

⚠️ _WIP, but totally usable._

To run this example, just copy it out of the repo, then

```console
npm install
npm run start
```

Note: `yarn` is preferred.

To build the static version

```console
npm run build
```

Then publish `dist`.

For more information, please refer to
[JavaScript version (for now)](https://github.com/phenomic/phenomic/blob/master/packages/preset-react-app/docs/getting-started/README.md).


================================================
FILE: examples/reason-react-app/__tests__/__snapshots__/index.js.snap
================================================
// Jest Snapshot v1, https://goo.gl/fbAQLP

exports[`should build example correctly 1`] = `
Array [
  "404.html",
  "after/c2Vjb25kLXBvc3Q=/index.html",
  "after/dGhpcmQtcG9zdA==/index.html",
  "after/Zm91cnRoLXBvc3Q=/index.html",
  "after/ZmlmdGgtcG9zdA==/index.html",
  "after/Zmlyc3QtcG9zdA==/index.html",
  "blog/fifth-post/index.html",
  "blog/first-post/index.html",
  "blog/fourth-post/index.html",
  "blog/second-post/index.html",
  "blog/third-post/index.html",
  "index.html",
]
`;

exports[`should build example correctly 2`] = `
Array [
  "phenomic/content/posts/by-default/1/desc/date/limit-2.json",
  "phenomic/content/posts/by-default/1/desc/date/limit-2/after-c2Vjb25kLXBvc3Q=.json",
  "phenomic/content/posts/by-default/1/desc/date/limit-2/after-dGhpcmQtcG9zdA==.json",
  "phenomic/content/posts/by-default/1/desc/date/limit-2/after-Zm91cnRoLXBvc3Q=.json",
  "phenomic/content/posts/by-default/1/desc/date/limit-2/after-ZmlmdGgtcG9zdA==.json",
  "phenomic/content/posts/by-default/1/desc/date/limit-2/after-Zmlyc3QtcG9zdA==.json",
  "phenomic/content/posts/item/fifth-post.json",
  "phenomic/content/posts/item/first-post.json",
  "phenomic/content/posts/item/fourth-post.json",
  "phenomic/content/posts/item/second-post.json",
  "phenomic/content/posts/item/third-post.json",
]
`;

exports[`should build example correctly 3`] = `Array []`;


================================================
FILE: examples/reason-react-app/__tests__/index.js
================================================
// @flow

/* eslint-disable import/no-extraneous-dependencies */
import globby from "globby";

it("should build example correctly", () => {
  const testFolder = __dirname + "/../dist";
  const files = globby.sync("**/*", {
    cwd: testFolder,
    nodir: true,
    dot: true,
  });

  // should have html files
  const htmlFiles = files.filter(file => file.endsWith(".html"));
  expect(htmlFiles).toMatchSnapshot();

  const jsonApiFiles = files.filter(
    file => file.startsWith("phenomic") && file.endsWith(".json"),
  );
  // should have matching json files
  expect(jsonApiFiles).toMatchSnapshot();

  // should have assets
  const assetsBundlerFiles = files.filter(
    file =>
      !htmlFiles.includes(file) &&
      !jsonApiFiles.includes(file) &&
      file.startsWith("phenomic"),
  );
  expect(assetsBundlerFiles.length).toBe(1);
  expect(
    files.filter(
      file =>
        !htmlFiles.includes(file) &&
        !jsonApiFiles.includes(file) &&
        !assetsBundlerFiles.includes(file),
    ),
  ).toMatchSnapshot();
});


================================================
FILE: examples/reason-react-app/bsconfig.json
================================================
{
  "name": "@phenomic/example-reason-react-app",
  "refmt": 3,
  "reason": {
    "react-jsx": 3
  },
  "suffix": ".bs.js",
  "package-specs": {
    "module": "es6"
  },
  "sources": [
    {
      "dir": "src",
      "subdirs": true
    }
  ],
  "bs-dependencies": [
    "reason-react",
    "@moox/bs-react-helmet",
    "@phenomic/preset-react-app",
    "@phenomic/plugin-renderer-react",
    "@phenomic/api-client"
  ]
}


================================================
FILE: examples/reason-react-app/content/posts/fifth-post.md
================================================
---
title: "Fifth post"
date: "2017-01-05"
layout: hero
---

Another post that have a [link to the first one](../first-post/).

An wrong link to [a post that does not exist](../unknown-post/) and another one
to [a page that does not exist](/unknown-page/).

Here is an [external link](http://phenomic.io).


================================================
FILE: examples/reason-react-app/content/posts/first-post.md
================================================
---
title: "First post"
date: "2017-01-01"
---

# This is a [Markdown](https://en.wikipedia.org/wiki/Markdown#Example) file

If you are new to Markdown, you might want to check those links:

- [What is Markdown?](http://whatismarkdown.com/)
- [Mastering Markdown, a GitHub guide](https://guides.github.com/features/mastering-markdown/)
- [wikipedia.org/wiki/Markdown](https://en.wikipedia.org/wiki/Markdown#Example)
- [masteringmarkdown.com](http://masteringmarkdown.com/)


================================================
FILE: examples/reason-react-app/content/posts/fourth-post.md
================================================
---
title: "Fourth post"
date: "2017-01-04"
---

Another post


================================================
FILE: examples/reason-react-app/content/posts/second-post.md
================================================
---
title: "Second post"
date: "2017-01-02"
---

Another post


================================================
FILE: examples/reason-react-app/content/posts/third-post.md
================================================
---
title: "Third post"
date: "2017-01-03"
---

Another post


================================================
FILE: examples/reason-react-app/package.json
================================================
{
  "private": true,
  "name": "@phenomic/example-reason-react-app",
  "devDependencies": {
    "@moox/bs-react-helmet": "^2.0.0",
    "@phenomic/cli": "^1.0.0",
    "@phenomic/core": "^1.0.0",
    "@phenomic/preset-react-app": "^1.0.0",
    "bs-platform": "^5.0.4",
    "npm-run-all": "^4.0.2",
    "react": "^16.8.0",
    "react-dom": "^16.8.0",
    "react-helmet": "^5.2.0",
    "react-router": "^3.2.0",
    "reason-react": "^0.7.0"
  },
  "scripts": {
    "reason:cleanup": "bsb -clean-world",
    "reason:compile": "bsb -make-world",
    "prepare": "yarn reason:cleanup && yarn reason:compile",
    "start": "yarn reason:cleanup && npm-run-all --parallel start:*",
    "start:js": "phenomic start",
    "start:reason": "yarn reason:compile -w",
    "build": "yarn reason:compile && phenomic build"
  },
  "phenomic": {
    "presets": [
      "@phenomic/preset-react-app"
    ]
  },
  "version": "1.0.0"
}


================================================
FILE: examples/reason-react-app/src/Helpers.re
================================================
let nothing = React.null;

let text = React.string;

let list = list => list |> Array.of_list |> React.array;

let nodeList = node => node##list |> Array.to_list;


================================================
FILE: examples/reason-react-app/src/Types.re
================================================
type partialPost = {
  .
  "id": string,
  "title": string,
};

type posts =
  PhenomicPresetReactApp.edge(
    PhenomicPresetReactApp.jsNodeList(partialPost),
  );

type post = {
  .
  "id": string,
  "title": string,
  "body": PhenomicPresetReactApp.BodyRenderer.jsBody,
};

type postNode = PhenomicPresetReactApp.edge(post);


================================================
FILE: examples/reason-react-app/src/components/ErrorPage.re
================================================
open Helpers;

[@react.component]
let make = (~message: option(string)=?, _) => {
  <div style={ReactDOMRe.Style.make(~fontSize="80px", ())}>
    {switch (message) {
     | None => "An error occured" |> text
     | Some(msg) => msg |> text
     }}
  </div>;
};

let default = make;


================================================
FILE: examples/reason-react-app/src/components/Home.re
================================================
open Helpers;

[@react.component]
let make = (~posts) => {
  let posts' = PhenomicPresetReactApp.jsEdge(posts);
  <div>
    <BsReactHelmet>
      <title> {"Hello world" |> text} </title>
      <meta name="description" content="Everything is awesome!" />
    </BsReactHelmet>
    <h1> {"Home" |> text} </h1>
    {switch ((posts': Types.posts)) {
     | Inactive
     | Loading => "Loading ..." |> text
     | Errored => "An error occured" |> text
     | Idle(posts) =>
       let postsList = posts##list |> Array.to_list;
       <div>
         <ul>
           {postsList
            |> List.map(item =>
                 <li key=item##id>
                   <PhenomicPresetReactApp.Link
                     href={"/blog/" ++ item##id ++ "/"}>
                     {item##title |> text}
                   </PhenomicPresetReactApp.Link>
                 </li>
               )
            |> list}
         </ul>
         <div>
           {switch (posts##previous |> Js.toOption) {
            | Some(previous) =>
              <PhenomicPresetReactApp.Link
                href={
                  posts##previousPageIsFirst
                    ? "/" : "/after/" ++ previous ++ "/"
                }>
                {"Newer posts" |> text}
              </PhenomicPresetReactApp.Link>
            | None => nothing
            }}
           {" " |> text}
           {switch (posts##next |> Js.toOption) {
            | Some(next) =>
              <PhenomicPresetReactApp.Link href={"/after/" ++ next ++ "/"}>
                {"Older posts" |> text}
              </PhenomicPresetReactApp.Link>
            | None => nothing
            }}
         </div>
       </div>;
     }}
  </div>;
};

let queries = props => {
  let posts =
    PhenomicPresetReactApp.query(
      PaginatedList({
        path: "content/posts",
        by: Some("default"),
        value: None,
        order: None,
        sort: None,
        limit: Some(2),
        after: Some(props##params##after),
      }),
    );
  {"posts": posts};
};


================================================
FILE: examples/reason-react-app/src/components/Post.re
================================================
open Helpers;

[@react.component]
let make = (~post) => {
  let post' = PhenomicPresetReactApp.jsEdge(post);
  <div>
    {switch ((post': Types.postNode)) {
     | Inactive
     | Loading => "Loading ..." |> text
     | Errored => <ErrorPage />
     | Idle(post) =>
       <div>
         <BsReactHelmet>
           <title> {post##title |> text} </title>
         </BsReactHelmet>
         <h1> {post##title |> text} </h1>
         <PhenomicPresetReactApp.BodyRenderer body=post##body />
       </div>
     }}
  </div>;
};

let queries = props => {
  let post =
    PhenomicPresetReactApp.query(
      Item({path: "content/posts", id: props##params##splat}),
    );
  {"post": post};
};


================================================
FILE: flow-typed/.eslintrc
================================================
{
  "rules": {
    "flowtype/require-valid-file-annotation": 0,
    "flowtype/require-exact-type": 0,
    "flowtype/no-mutable-array": 0
  }
}


================================================
FILE: flow-typed/handmade/cross-fetch_v2.x.x.js
================================================
declare module "cross-fetch" {
  declare module.exports: (
    input: string | Request | URL,
    init?: RequestOptions,
  ) => Promise<Response>;
}

declare module "cross-fetch/polyfill" {
  declare module.exports: void;
}


================================================
FILE: flow-typed/handmade/deepmerge.js
================================================
declare module "deepmerge" {
  declare module.exports: (obj: Object, obj2: Object) => Object;
}


================================================
FILE: flow-typed/handmade/fb-watchman.js
================================================
export type Watch = {};

export type CommandResponse = {
  watch: Watch,
  relative_path: string,
};

export type Subscription = {
  expression: Array<string | [string, string]>,
  fields: Array<string>,
  relative_root: string,
};

export type WatchEvent = {
  files: Array<Object>,
};

declare module "fb-watchman" {
  declare class Client {
    capabilityCheck(config: Object, callback: (error: any) => void): void;
    command(
      config: ["watch-project", string],
      callback: (error: any, response: CommandResponse) => void,
    ): void;
    command(
      config: ["subscribe", Watch, "files", Subscription],
      callback: (error: any) => void,
    ): void;
    on(eventName: string, callback: (event: WatchEvent) => void): void;
    end(): void;
  }
}


================================================
FILE: flow-typed/handmade/find-cache-dir.js
================================================
type findCacheDirOptions = {|
  name?: string,
  files?: Array<string>,
  cwd?: string,
  create?: boolean,
  thunk?: boolean,
|};

declare module "find-cache-dir" {
  declare function findCacheDir(options: findCacheDirOptions): string;
  declare module.exports: typeof findCacheDir;
}


================================================
FILE: flow-typed/handmade/fs-extra.js
================================================
declare module "fs-extra" {
  declare interface fsExtra {
    emptyDirSync: (from: string, to: string) => void;
    copySync: (from: string, to: string) => void;
    copy: (from: string, to: string, callback: (err: Error) => void) => void;
  }
  declare module.exports: fsExtra;
}


================================================
FILE: flow-typed/handmade/fs-promise.js
================================================
declare module "fs-promise" {
  declare function writeFile(to: string, content: string): Promise<any>;
  declare function mkdirs(path: string): Promise<any>;

  declare interface fsPromise {
    writeFile: typeof writeFile;
    mkdirs: typeof mkdirs;
  }
  declare module.exports: fsPromise;
}


================================================
FILE: flow-typed/handmade/globby.js
================================================
declare module "globby" {
  declare type pattern = string | Array<string>;
  declare type async = (
    pattern: pattern,
    options: Object,
  ) => Promise<Array<string>>;
  declare module.exports: {
    (): async,
    sync: (pattern: pattern, options: Object) => Array<string>,
  };
}


================================================
FILE: flow-typed/handmade/gray-matter.js
================================================
type GrayMatterResult = {
  orig: string,
  data: Object,
  content: string,
};

declare module "gray-matter" {
  declare module.exports: (string: string) => GrayMatterResult;
}


================================================
FILE: flow-typed/handmade/js-beautify.js
================================================
type Options = {
  indent_size: number,
  indent_char: string,
  eol: string,
  indent_level: number,
  indent_with_tabs: boolean,
  preserve_newlines: boolean,
  max_preserve_newlines: number,
  jslint_happy: boolean,
  space_after_anon_function: boolean,
  brace_style: "collapse",
  keep_array_indentation: boolean,
  keep_function_indentation: boolean,
  space_before_conditional: boolean,
  break_chained_methods: boolean,
  eval_code: boolean,
  unescape_strings: boolean,
  wrap_line_length: number,
  wrap_attributes: string,
  wrap_attributes_indent_size: number,
  end_with_newline: boolean,
};

declare module "js-beautify" {
  declare var default_options: Options;
  declare function html(htmlString: string, options: Options): string;
}


================================================
FILE: flow-typed/handmade/jsx-test-helpers-v1.x.x.js
================================================
/* eslint-disable */
declare module "jsx-test-helpers" {
  declare module.exports: {
    concatPath: (dirA: string, dirB: string) => string,
    noop: () => void,
    JSX: (jsx: React$Node) => string,
    renderJSX: (jsx: React$Node, cb?: any, context?: any) => string,
    render: (jsx: React$Node, cb?: any, context?: any) => Object,
  };
}


================================================
FILE: flow-typed/handmade/loader-utils.js
================================================
declare module "loader-utils" {
  declare interface LoaderUtils {
    getOptions: Function;
    getHashDigest: Function;
  }
  declare module.exports: LoaderUtils;
}


================================================
FILE: flow-typed/handmade/log-symbols.js
================================================
declare module "log-symbols" {
  declare module.exports: {
    info: string,
    success: string,
    warning: string,
    error: string,
  };
}


================================================
FILE: flow-typed/handmade/lru-memoize.js
================================================
declare module "lru-memoize" {
  declare function memoizeInstance(func: Function): Function;
  declare function memoize(num: number): typeof memoizeInstance;
  declare module.exports: typeof memoize;
}


================================================
FILE: flow-typed/handmade/mkdirp.js
================================================
declare module "mkdirp" {
  declare module.exports: (path: string, callback: (err: any) => void) => void;
}


================================================
FILE: flow-typed/handmade/multili.js
================================================
declare module "multili" {
  declare module.exports: string => string;
}


================================================
FILE: flow-typed/handmade/node-object-hash.js
================================================
type NodeObjectHashConfig = {
  coerce?: string,
  sort?: boolean,
  alg?: string,
  enc?: string,
};

declare function hash(obj: Object): string;

type NodeObjectHashInstance = {
  hash: typeof hash,
};

declare module "node-object-hash" {
  declare module.exports: (
    config?: NodeObjectHashConfig,
  ) => NodeObjectHashInstance;
}


================================================
FILE: flow-typed/handmade/ora.js
================================================
type oraColors =
  | "black"
  | "red"
  | "green"
  | "yellow"
  | "blue"
  | "magenta"
  | "cyan"
  | "white"
  | "gray";

type oraOptions =
  | string
  | {
      text: string,
      spinner: string | Object,
      color: oraColors,
      interval: number,
      stream: Object,
      enabled: boolean,
    };

type oraInstance = {
  start: () => oraInstance,
  stop: () => oraInstance,
  succeed: () => oraInstance,
  fail: () => oraInstance,
  stopAndPersist: (symbol: string) => oraInstance,
  clear: () => oraInstance,
  render: () => oraInstance,
  frame: () => oraInstance,
  text: string,
  color: string,
  stream: {
    // @todo add more about WritableStream
    write: Function,
  },
};
declare module "ora" {
  declare module.exports: (options?: oraOptions) => oraInstance;
}


================================================
FILE: flow-typed/handmade/pify.js
================================================
declare module "pify" {
  declare class Pify {
    (callback: Function | Object): any;
  }
  declare module.exports: Pify;
}


================================================
FILE: flow-typed/handmade/react-helmet_v5.x.x.js
================================================
declare module "react-helmet" {
  declare type Props = {
    base?: Object,
    bodyAttributes?: Object,
    children?: React$Node,
    defaultTitle?: string,
    defer?: boolean,
    encodeSpecialCharacters?: boolean,
    htmlAttributes?: Object,
    link?: Array<Object>,
    meta?: Array<Object>,
    noscript?: Array<Object>,
    onChangeClientState?: (
      newState?: Object,
      addedTags?: Object,
      removeTags?: Object,
    ) => any,
    script?: Array<Object>,
    style?: Array<Object>,
    title?: string,
    titleAttributes?: Object,
    titleTemplate?: string,
  };

  declare interface AttributesMethods {
    toString(): string;
    toComponent(): Object;
  }

  declare interface TagMethods {
    toString(): string;
    toComponent(): [React$Element<*>] | React$Element<*> | Array<Object>;
  }

  declare interface StateOnServer {
    base: TagMethods;
    bodyAttributes: AttributesMethods;
    htmlAttributes: AttributesMethods;
    link: TagMethods;
    meta: TagMethods;
    noscript: TagMethods;
    script: TagMethods;
    style: TagMethods;
    title: TagMethods;
  }

  declare class Helmet extends React$Component<Props> {
    static rewind(): StateOnServer;
    static renderStatic(): StateOnServer;
    static canUseDom(canUseDOM: boolean): void;
  }

  declare export default typeof Helmet;
  declare export var Helmet: typeof Helmet;
}


================================================
FILE: flow-typed/handmade/react-router-scroll.js
================================================
type useScroll = (
  shouldUpdateScroll?: (
    prevRouterProps: Object | null,
    routerProps: Object,
  ) => boolean | Array<number>,
) => Function;

declare module "react-router-scroll" {
  declare module.exports: useScroll;
}
declare module "react-router-scroll/lib/useScroll" {
  declare module.exports: useScroll;
}


================================================
FILE: flow-typed/handmade/remark.js
================================================
declare module "remark" {
  declare interface remarkInstance {
    use: (plugin: Function, options?: Object) => remarkInstance;
    process: (s: string, options?: Object) => remarkResult;
    processSync: (s: string, options?: Object) => Object;
  }
  declare interface remarkResult {
    toString: () => string;
  }
  declare class remark {
    (): remarkInstance;
  }
  declare module.exports: remark;
}


================================================
FILE: flow-typed/handmade/sane.js
================================================
declare module "sane" {
  declare type SaneCallbackType = (
    filepath: string,
    root: string,
    stat: Object,
  ) => void | Promise<void>;
  declare type SaneOptionsType = {
    watchman: boolean,
    glob: $ReadOnlyArray<string>,
  };
  declare type Watcher = {
    on: (string, SaneCallbackType) => void,
    close: () => void,
  };
  declare module.exports: (path: string, options: SaneOptionsType) => Watcher;
}


================================================
FILE: flow-typed/handmade/semver.js
================================================
declare module "semver" {
  declare interface Semver {
    satisfies: (requirement?: string, version: string) => boolean;
  }

  declare module.exports: Semver;
}


================================================
FILE: flow-typed/handmade/simple-json-fetch.js
================================================
declare module "simple-json-fetch" {
  declare class SimpleJsonFetch {
    (uri: string): Promise<any>;
  }
  declare module.exports: SimpleJsonFetch;
}


================================================
FILE: flow-typed/handmade/strip-markdown.js
================================================
declare module "strip-markdown" {
  declare module.exports: () => void;
}


================================================
FILE: flow-typed/handmade/striptags.js
================================================
declare module "striptags" {
  declare module.exports: string => string;
}


================================================
FILE: flow-typed/handmade/url-join.js
================================================
declare module "url-join" {
  declare module.exports: // @todo can we defined unlimited arguments? Didn't find how to in the doc
  (arg1: string, arg2: string, arg3?: string, arg4?: string) => string;
}


================================================
FILE: flow-typed/handmade/webpack-dev-middleware.js
================================================
declare module "webpack-dev-middleware" {
  declare module.exports: (
    compiler: Object,
    options: Object,
  ) => express$Middleware;
}


================================================
FILE: flow-typed/handmade/webpack-hot-middleware.js
================================================
declare module "webpack-hot-middleware" {
  declare module.exports: (
    compiler: Object,
    options: Object,
  ) => express$Middleware;
}


================================================
FILE: flow-typed/handmade/webpack-sources.js
================================================
/* eslint-disable no-unused-vars */
type SourceType = Object;

type RawSourceType = (s: string) => SourceType;

declare module "webpack-sources" {
  declare var RawSource: RawSourceType;
}


================================================
FILE: flow-typed/handmade/webpack.js
================================================
/* eslint-disable */

declare var module: {
  hot: {
    accept(arg1: string | (() => void), arg2?: () => void): void,
  },
};


================================================
FILE: flow-typed/handmade/webpack_v4.x.x.js
================================================
declare module "webpack" {
  declare class WebpackError extends Error {
    constructor(message: string): WebpackError;
    inspect(): string;
  }

  declare type WebpackCompiler = {
    // <...>
  };

  declare type WebpackMultiCompiler = {
    // <...>
  };

  declare class WebpackCompilation {
    constructor(compiler: WebpackCompiler): WebpackCompilation;
    // <...>
  }

  declare class WebpackStats {
    constructor(compilation: WebpackCompilation): WebpackStats;
    // <...>
  }

  declare type NonEmptyArrayOfUniqueStringValues = Array<string>;

  declare type EntryObject = {
    [k: string]: string | NonEmptyArrayOfUniqueStringValues,
  };

  declare type EntryItem = string | NonEmptyArrayOfUniqueStringValues;

  declare type EntryStatic = EntryObject | EntryItem;

  declare type EntryDynamic = () => EntryStatic | Promise<EntryStatic>;

  declare type Entry = EntryDynamic | EntryStatic;

  declare type ArrayOfStringValues = Array<string>;

  declare type ExternalItem =
    | string
    | {
        [k: string]:
          | string
          | {
              [k: string]: any,
            }
          | ArrayOfStringValues
          | boolean,
      }
    | RegExp;

  declare type Externals =
    | ((
        context: string,
        request: string,
        callback: (err?: Error, result?: string) => void,
      ) => void)
    | ExternalItem
    | Array<
        | ((
            context: string,
            request: string,
            callback: (err?: Error, result?: string) => void,
          ) => void)
        | ExternalItem,
      >;

  declare type RuleSetCondition =
    | RegExp
    | string
    | ((value: string) => boolean)
    | RuleSetConditions
    | {
        and?: RuleSetConditions,
        exclude?: RuleSetConditionOrConditions,
        include?: RuleSetConditionOrConditions,
        not?: RuleSetConditions,
        or?: RuleSetConditions,
        test?: RuleSetConditionOrConditions,
      };

  declare type RuleSetConditions = Array<RuleSetCondition>;

  declare type RuleSetConditionOrConditions =
    | RuleSetCondition
    | RuleSetConditions;

  declare type RuleSetLoader = string;

  declare type RuleSetQuery = { [k: string]: any } | string;

  declare type RuleSetUseItem =
    | RuleSetLoader
    | Function
    | {
        ident?: string,
        loader?: RuleSetLoader,
        options?: RuleSetQuery,
        query?: RuleSetQuery,
      };

  declare type RuleSetUse = RuleSetUseItem | Function | Array<RuleSetUseItem>;

  declare type RuleSetRule = {
    compiler?: RuleSetConditionOrConditions,
    enforce?: "pre" | "post",
    exclude?: RuleSetConditionOrConditions,
    include?: RuleSetConditionOrConditions,
    issuer?: RuleSetConditionOrConditions,
    loader?: RuleSetLoader | RuleSetUse,
    loaders?: RuleSetUse,
    oneOf?: RuleSetRules,
    options?: RuleSetQuery,
    parser?: {
      [k: string]: any,
    },
    query?: RuleSetQuery,
    resolve?: ResolveOptions,
    resource?: RuleSetConditionOrConditions,
    resourceQuery?: RuleSetConditionOrConditions,
    rules?: RuleSetRules,
    sideEffects?: boolean,
    test?: RuleSetConditionOrConditions,
    type?:
      | "javascript/auto"
      | "javascript/dynamic"
      | "javascript/esm"
      | "json"
      | "webassembly/experimental",
    use?: RuleSetUse,
  };

  declare type RuleSetRules = Array<RuleSetRule>;

  declare type ModuleOptions = {
    defaultRules?: RuleSetRules,
    exprContextCritical?: boolean,
    exprContextRecursive?: boolean,
    exprContextRegExp?: boolean | RegExp,
    exprContextRequest?: string,
    noParse?: Array<RegExp> | RegExp | Function | Array<string> | string,
    rules?: RuleSetRules,
    strictExportPresence?: boolean,
    strictThisContextOnImports?: boolean,
    unknownContextCritical?: boolean,
    unknownContextRecursive?: boolean,
    unknownContextRegExp?: boolean | RegExp,
    unknownContextRequest?: string,
    unsafeCache?: boolean | Function,
    wrappedContextCritical?: boolean,
    wrappedContextRecursive?: boolean,
    wrappedContextRegExp?: RegExp,
  };

  declare type NodeOptions = {
    Buffer?: false | true | "mock",
    __dirname?: false | true | "mock",
    __filename?: false | true | "mock",
    console?: false | true | "mock",
    global?: boolean,
    process?: false | true | "mock",
    [k: string]: false | true | "mock" | "empty",
  };

  declare type WebpackPluginFunction = (compiler: WebpackCompiler) => void;

  declare type WebpackPluginInstance = {
    apply: WebpackPluginFunction,
    [k: string]: any,
  };

  declare type OptimizationSplitChunksOptions = {
    automaticNameDelimiter?: string,
    cacheGroups?: {
      [k: string]:
        | false
        | Function
        | string
        | RegExp
        | {
            automaticNameDelimiter?: string,
            automaticNamePrefix?: string,
            chunks?: ("initial" | "async" | "all") | Function,
            enforce?: boolean,
            filename?: string,
            maxAsyncRequests?: number,
            maxInitialRequests?: number,
            maxSize?: number,
            minChunks?: number,
            minSize?: number,
            name?: boolean | Function | string,
            priority?: number,
            reuseExistingChunk?: boolean,
            test?: Function | string | RegExp,
          },
    },
    chunks?: ("initial" | "async" | "all") | Function,
    fallbackCacheGroup?: {
      automaticNameDelimiter?: string,
      maxSize?: number,
      minSize?: number,
    },
    filename?: string,
    hidePathInfo?: boolean,
    maxAsyncRequests?: number,
    maxInitialRequests?: number,
    maxSize?: number,
    minChunks?: number,
    minSize?: number,
    name?: boolean | Function | string,
  };

  declare type OptimizationOptions = {
    checkWasmTypes?: boolean,
    chunkIds?: "natural" | "named" | "size" | "total-size" | false,
    concatenateModules?: boolean,
    flagIncludedChunks?: boolean,
    hashedModuleIds?: boolean,
    mangleWasmImports?: boolean,
    mergeDuplicateChunks?: boolean,
    minimize?: boolean,
    minimizer?: Array<WebpackPluginInstance | WebpackPluginFunction>,
    moduleIds?: "natural" | "named" | "hashed" | "size" | "total-size" | false,
    namedChunks?: boolean,
    namedModules?: boolean,
    noEmitOnErrors?: boolean,
    nodeEnv?: false | string,
    occurrenceOrder?: boolean,
    portableRecords?: boolean,
    providedExports?: boolean,
    removeAvailableModules?: boolean,
    removeEmptyChunks?: boolean,
    runtimeChunk?:
      | boolean
      | ("single" | "multiple")
      | {
          name?: string | Function,
        },
    sideEffects?: boolean,
    splitChunks?: false | OptimizationSplitChunksOptions,
    usedExports?: boolean,
  };

  declare type LibraryCustomUmdObject = {
    amd?: string,
    commonjs?: string,
    root?: string | ArrayOfStringValues,
  };

  declare type OutputOptions = {
    auxiliaryComment?:
      | string
      | {
          amd?: string,
          commonjs?: string,
          commonjs2?: string,
          root?: string,
        },
    chunkCallbackName?: string,
    chunkFilename?: string,
    chunkLoadTimeout?: number,
    crossOriginLoading?: false | "anonymous" | "use-credentials",
    devtoolFallbackModuleFilenameTemplate?: string | Function,
    devtoolLineToLine?: boolean | { [k: string]: any },
    devtoolModuleFilenameTemplate?: string | Function,
    devtoolNamespace?: string,
    filename?: string | Function,
    globalObject?: string,
    hashDigest?: string,
    hashDigestLength?: number,
    hashFunction?: string | Function,
    hashSalt?: string,
    hotUpdateChunkFilename?: string | Function,
    hotUpdateFunction?: string,
    hotUpdateMainFilename?: string | Function,
    jsonpFunction?: string,
    jsonpScriptType?: false | "text/javascript" | "module",
    library?: string | Array<string> | LibraryCustomUmdObject,
    libraryExport?: string | ArrayOfStringValues,
    libraryTarget?:
      | "var"
      | "assign"
      | "this"
      | "window"
      | "self"
      | "global"
      | "commonjs"
      | "commonjs2"
      | "commonjs-module"
      | "amd"
      | "amd-require"
      | "umd"
      | "umd2"
      | "jsonp",
    path?: string,
    pathinfo?: boolean,
    publicPath?: string | Function,
    sourceMapFilename?: string,
    sourcePrefix?: string,
    strictModuleExceptionHandling?: boolean,
    umdNamedDefine?: boolean,
    webassemblyModuleFilename?: string,
  };

  declare type PerformanceOptions = {
    assetFilter?: Function,
    hints?: false | "warning" | "error",
    maxAssetSize?: number,
    maxEntrypointSize?: number,
  };

  declare type ArrayOfStringOrStringArrayValues = Array<string | Array<string>>;

  declare type ResolveOptions = {
    alias?:
      | { [k: string]: string }
      | Array<{
          alias?: string,
          name?: string,
          onlyModule?: boolean,
        }>,
    aliasFields?: ArrayOfStringOrStringArrayValues,
    cachePredicate?: Function,
    cacheWithContext?: boolean,
    concord?: boolean,
    descriptionFiles?: ArrayOfStringValues,
    enforceExtension?: boolean,
    enforceModuleExtension?: boolean,
    extensions?: ArrayOfStringValues,
    fileSystem?: { [k: string]: any },
    mainFields?: ArrayOfStringOrStringArrayValues,
    mainFiles?: ArrayOfStringValues,
    moduleExtensions?: ArrayOfStringValues,
    modules?: ArrayOfStringValues,
    plugins?: Array<WebpackPluginInstance | WebpackPluginFunction>,
    resolver?: { [k: string]: any },
    symlinks?: boolean,
    unsafeCache?: boolean | { [k: string]: any },
    useSyncFileSystemCalls?: boolean,
  };

  declare type FilterItemTypes = RegExp | string | Function;

  declare type FilterTypes = FilterItemTypes | Array<FilterItemTypes>;

  declare type StatsOptions = {
    all?: boolean,
    assets?: boolean,
    assetsSort?: string,
    builtAt?: boolean,
    cached?: boolean,
    cachedAssets?: boolean,
    children?: boolean,
    chunkGroups?: boolean,
    chunkModules?: boolean,
    chunkOrigins?: boolean,
    chunks?: boolean,
    chunksSort?: string,
    colors?:
      | boolean
      | {
          bold?: string,
          cyan?: string,
          green?: string,
          magenta?: string,
          red?: string,
          yellow?: string,
        },
    context?: string,
    depth?: boolean,
    entrypoints?: boolean,
    env?: boolean,
    errorDetails?: boolean,
    errors?: boolean,
    exclude?: FilterTypes | boolean,
    excludeAssets?: FilterTypes,
    excludeModules?: FilterTypes | boolean,
    hash?: boolean,
    maxModules?: number,
    moduleAssets?: boolean,
    moduleTrace?: boolean,
    modules?: boolean,
    modulesSort?: string,
    nestedModules?: boolean,
    optimizationBailout?: boolean,
    outputPath?: boolean,
    performance?: boolean,
    providedExports?: boolean,
    publicPath?: boolean,
    reasons?: boolean,
    source?: boolean,
    timings?: boolean,
    usedExports?: boolean,
    version?: boolean,
    warnings?: boolean,
    warningsFilter?: FilterTypes,
  };

  declare type WebpackOptions = {
    amd?: { [k: string]: any },
    bail?: boolean,
    cache?: boolean | { [k: string]: any },
    context?: string,
    dependencies?: Array<string>,
    devServer?: { [k: string]: any },
    devtool?: string | false,
    entry?: Entry,
    externals?: Externals,
    loader?: { [k: string]: any },
    mode?: "development" | "production" | "none",
    module?: ModuleOptions,
    name?: string,
    node?: false | NodeOptions,
    optimization?: OptimizationOptions,
    output?: OutputOptions,
    parallelism?: number,
    performance?: false | PerformanceOptions,
    plugins?: Array<WebpackPluginInstance | WebpackPluginFunction>,
    profile?: boolean,
    recordsInputPath?: string,
    recordsOutputPath?: string,
    recordsPath?: string,
    resolve?: ResolveOptions,
    resolveLoader?: ResolveOptions,
    serve?: { [k: string]: any },
    stats?:
      | StatsOptions
      | boolean
      | (
          | "none"
          | "errors-only"
          | "minimal"
          | "normal"
          | "detailed"
          | "verbose"
        ),
    target?:
      | "web"
      | "webworker"
      | "node"
      | "async-node"
      | "node-webkit"
      | "electron-main"
      | "electron-renderer"
      | ((compiler: WebpackCompiler) => void),
    watch?: boolean,
    watchOptions?: {
      aggregateTimeout?: number,
      ignored?: { [k: string]: any },
      poll?: boolean | number,
      stdin?: boolean,
    },
  };

  declare module.exports: (
    options: WebpackOptions,
    callback: (error: WebpackError, stats: WebpackStats) => void,
  ) => WebpackCompiler | WebpackMultiCompiler;
}


================================================
FILE: flow-typed/npm/aphrodite_vx.x.x.js
================================================
// flow-typed signature: 89f8074b9679446826e4641701539150
// flow-typed version: <<STUB>>/aphrodite_v1/flow_v0.68.0

/**
 * This is an autogenerated libdef stub for:
 *
 *   'aphrodite'
 *
 * Fill this stub out by replacing all the `any` types.
 *
 * Once filled out, we encourage you to share your work with the
 * community by sending a pull request to:
 * https://github.com/flowtype/flow-typed
 */

declare module "aphrodite" {
  declare module.exports: any;
}

/**
 * We include stubs for each file inside this npm package in case you need to
 * require those files directly. Feel free to delete any files that aren't
 * needed.
 */
declare module "aphrodite/coverage/prettify" {
  declare module.exports: any;
}

declare module "aphrodite/coverage/sorter" {
  declare module.exports: any;
}

declare module "aphrodite/dist/aphrodite" {
  declare module.exports: any;
}

declare module "aphrodite/dist/aphrodite.umd" {
  declare module.exports: any;
}

declare module "aphrodite/dist/aphrodite.umd.min" {
  declare module.exports: any;
}

declare module "aphrodite/examples/runkit" {
  declare module.exports: any;
}

declare module "aphrodite/examples/server" {
  declare module.exports: any;
}

declare module "aphrodite/examples/src/examples-ssr" {
  declare module.exports: any;
}

declare module "aphrodite/examples/src/examples" {
  declare module.exports: any;
}

declare module "aphrodite/examples/src/StyleTester" {
  declare module.exports: any;
}

declare module "aphrodite/examples/webpack.config" {
  declare module.exports: any;
}

declare module "aphrodite/lib/exports" {
  declare module.exports: any;
}

declare module "aphrodite/lib/generate" {
  declare module.exports: any;
}

declare module "aphrodite/lib/index" {
  declare module.exports: any;
}

declare module "aphrodite/lib/inject" {
  declare module.exports: any;
}

declare module "aphrodite/lib/no-important" {
  declare module.exports: any;
}

declare module "aphrodite/lib/ordered-elements" {
  declare module.exports: any;
}

declare module "aphrodite/lib/staticPrefixData" {
  declare module.exports: any;
}

declare module "aphrodite/lib/util" {
  declare module.exports: any;
}

declare module "aphrodite/no-important" {
  declare module.exports: any;
}

declare module "aphrodite/src/exports" {
  declare module.exports: any;
}

declare module "aphrodite/src/generate" {
  declare module.exports: any;
}

declare module "aphrodite/src/index" {
  declare module.exports: any;
}

declare module "aphrodite/src/inject" {
  declare module.exports: any;
}

declare module "aphrodite/src/no-important" {
  declare module.exports: any;
}

declare module "aphrodite/src/ordered-elements" {
  declare module.exports: any;
}

declare module "aphrodite/src/util" {
  declare module.exports: any;
}

declare module "aphrodite/tests/generate_test" {
  declare module.exports: any;
}

declare module "aphrodite/tests/index_test" {
  declare module.exports: any;
}

declare module "aphrodite/tests/inject_test" {
  declare module.exports: any;
}

declare module "aphrodite/tests/no-important_test" {
  declare module.exports: any;
}

declare module "aphrodite/tests/ordered-elements_test" {
  declare module.exports: any;
}

declare module "aphrodite/tests/util_test" {
  declare module.exports: any;
}

declare module "aphrodite/tools/generate_prefixer_data" {
  declare module.exports: any;
}

declare module "aphrodite/webpack.config" {
  declare module.exports: any;
}

// Filename aliases
declare module "aphrodite/coverage/prettify.js" {
  declare module.exports: $Exports<"aphrodite/coverage/prettify">;
}
declare module "aphrodite/coverage/sorter.js" {
  declare module.exports: $Exports<"aphrodite/coverage/sorter">;
}
declare module "aphrodite/dist/aphrodite.js" {
  declare module.exports: $Exports<"aphrodite/dist/aphrodite">;
}
declare module "aphrodite/dist/aphrodite.umd.js" {
  declare module.exports: $Exports<"aphrodite/dist/aphrodite.umd">;
}
declare module "aphrodite/dist/aphrodite.umd.min.js" {
  declare module.exports: $Exports<"aphrodite/dist/aphrodite.umd.min">;
}
declare module "aphrodite/examples/runkit.js" {
  declare module.exports: $Exports<"aphrodite/examples/runkit">;
}
declare module "aphrodite/examples/server.js" {
  declare module.exports: $Exports<"aphrodite/examples/server">;
}
declare module "aphrodite/examples/src/examples-ssr.js" {
  declare module.exports: $Exports<"aphrodite/examples/src/examples-ssr">;
}
declare module "aphrodite/examples/src/examples.js" {
  declare module.exports: $Exports<"aphrodite/examples/src/examples">;
}
declare module "aphrodite/examples/src/StyleTester.js" {
  declare module.exports: $Exports<"aphrodite/examples/src/StyleTester">;
}
declare module "aphrodite/examples/webpack.config.js" {
  declare module.exports: $Exports<"aphrodite/examples/webpack.config">;
}
declare module "aphrodite/lib/exports.js" {
  declare module.exports: $Exports<"aphrodite/lib/exports">;
}
declare module "aphrodite/lib/generate.js" {
  declare module.exports: $Exports<"aphrodite/lib/generate">;
}
declare module "aphrodite/lib/index.js" {
  declare module.exports: $Exports<"aphrodite/lib/index">;
}
declare module "aphrodite/lib/inject.js" {
  declare module.exports: $Exports<"aphrodite/lib/inject">;
}
declare module "aphrodite/lib/no-important.js" {
  declare module.exports: $Exports<"aphrodite/lib/no-important">;
}
declare module "aphrodite/lib/ordered-elements.js" {
  declare module.exports: $Exports<"aphrodite/lib/ordered-elements">;
}
declare module "aphrodite/lib/staticPrefixData.js" {
  declare module.exports: $Exports<"aphrodite/lib/staticPrefixData">;
}
declare module "aphrodite/lib/util.js" {
  declare module.exports: $Exports<"aphrodite/lib/util">;
}
declare module "aphrodite/no-important.js" {
  declare module.exports: $Exports<"aphrodite/no-important">;
}
declare module "aphrodite/src/exports.js" {
  declare module.exports: $Exports<"aphrodite/src/exports">;
}
declare module "aphrodite/src/generate.js" {
  declare module.exports: $Exports<"aphrodite/src/generate">;
}
declare module "aphrodite/src/index.js" {
  declare module.exports: $Exports<"aphrodite/src/index">;
}
declare module "aphrodite/src/inject.js" {
  declare module.exports: $Exports<"aphrodite/src/inject">;
}
declare module "aphrodite/src/no-important.js" {
  declare module.exports: $Exports<"aphrodite/src/no-important">;
}
declare module "aphrodite/src/ordered-elements.js" {
  declare module.exports: $Exports<"aphrodite/src/ordered-elements">;
}
declare module "aphrodite/src/util.js" {
  declare module.exports: $Exports<"aphrodite/src/util">;
}
declare module "aphrodite/tests/generate_test.js" {
  declare module.exports: $Exports<"aphrodite/tests/generate_test">;
}
declare module "aphrodite/tests/index_test.js" {
  declare module.exports: $Exports<"aphrodite/tests/index_test">;
}
declare module "aphrodite/tests/inject_test.js" {
  declare module.exports: $Exports<"aphrodite/tests/inject_test">;
}
declare module "aphrodite/tests/no-important_test.js" {
  declare module.exports: $Exports<"aphrodite/tests/no-important_test">;
}
declare module "aphrodite/tests/ordered-elements_test.js" {
  declare module.exports: $Exports<"aphrodite/tests/ordered-elements_test">;
}
declare module "aphrodite/tests/util_test.js" {
  declare module.exports: $Exports<"aphrodite/tests/util_test">;
}
declare module "aphrodite/tools/generate_prefixer_data.js" {
  declare module.exports: $Exports<"aphrodite/tools/generate_prefixer_data">;
}
declare module "aphrodite/webpack.config.js" {
  declare module.exports: $Exports<"aphrodite/webpack.config">;
}


================================================
FILE: flow-typed/npm/asciidoctor.js_vx.x.x.js
================================================
// flow-typed signature: 2c8f0b37c34ec9310b26eae1f00ab18c
// flow-typed version: <<STUB>>/asciidoctor.js_v1/flow_v0.68.0

/**
 * This is an autogenerated libdef stub for:
 *
 *   'asciidoctor.js'
 *
 * Fill this stub out by replacing all the `any` types.
 *
 * Once filled out, we encourage you to share your work with the
 * community by sending a pull request to:
 * https://github.com/flowtype/flow-typed
 */

declare module "asciidoctor.js" {
  declare module.exports: any;
}

/**
 * We include stubs for each file inside this npm package in case you need to
 * require those files directly. Feel free to delete any files that aren't
 * needed.
 */
declare module "asciidoctor.js/dist/asciidoctor" {
  declare module.exports: any;
}

// Filename aliases
declare module "asciidoctor.js/dist/asciidoctor.js" {
  declare module.exports: $Exports<"asciidoctor.js/dist/asciidoctor">;
}


================================================
FILE: flow-typed/npm/chalk_v1.x.x.js
================================================
// flow-typed signature: f965116cdb881170be8c42b10554e195
// flow-typed version: da30fe6876/chalk_v1.x.x/flow_>=v0.25.x

type $npm$chalk$StyleElement = {
  open: string,
  close: string,
};

type $npm$chalk$Chain = $npm$chalk$Style & ((...text: any[]) => string);

type $npm$chalk$Style = {
  // General
  reset: $npm$chalk$Chain,
  bold: $npm$chalk$Chain,
  dim: $npm$chalk$Chain,
  italic: $npm$chalk$Chain,
  underline: $npm$chalk$Chain,
  inverse: $npm$chalk$Chain,
  strikethrough: $npm$chalk$Chain,

  // Text colors
  black: $npm$chalk$Chain,
  red: $npm$chalk$Chain,
  green: $npm$chalk$Chain,
  yellow: $npm$chalk$Chain,
  blue: $npm$chalk$Chain,
  magenta: $npm$chalk$Chain,
  cyan: $npm$chalk$Chain,
  white: $npm$chalk$Chain,
  gray: $npm$chalk$Chain,
  grey: $npm$chalk$Chain,

  // Background colors
  bgBlack: $npm$chalk$Chain,
  bgRed: $npm$chalk$Chain,
  bgGreen: $npm$chalk$Chain,
  bgYellow: $npm$chalk$Chain,
  bgBlue: $npm$chalk$Chain,
  bgMagenta: $npm$chalk$Chain,
  bgCyan: $npm$chalk$Chain,
  bgWhite: $npm$chalk$Chain,
};

type $npm$chalk$StyleMap = {
  // General
  reset: $npm$chalk$StyleElement,
  bold: $npm$chalk$StyleElement,
  dim: $npm$chalk$StyleElement,
  italic: $npm$chalk$StyleElement,
  underline: $npm$chalk$StyleElement,
  inverse: $npm$chalk$StyleElement,
  strikethrough: $npm$chalk$StyleElement,

  // Text colors
  black: $npm$chalk$StyleElement,
  red: $npm$chalk$StyleElement,
  green: $npm$chalk$StyleElement,
  yellow: $npm$chalk$StyleElement,
  blue: $npm$chalk$StyleElement,
  magenta: $npm$chalk$StyleElement,
  cyan: $npm$chalk$StyleElement,
  white: $npm$chalk$StyleElement,
  gray: $npm$chalk$StyleElement,

  // Background colors
  bgBlack: $npm$chalk$StyleElement,
  bgRed: $npm$chalk$StyleElement,
  bgGreen: $npm$chalk$StyleElement,
  bgYellow: $npm$chalk$StyleElement,
  bgBlue: $npm$chalk$StyleElement,
  bgMagenta: $npm$chalk$StyleElement,
  bgCyan: $npm$chalk$StyleElement,
  bgWhite: $npm$chalk$StyleElement,
};

declare module "chalk" {
  declare var enabled: boolean;
  declare var supportsColor: boolean;
  declare var styles: $npm$chalk$StyleMap;

  declare function stripColor(value: string): any;
  declare function hasColor(str: string): boolean;

  // General
  declare var reset: $npm$chalk$Chain;
  declare var bold: $npm$chalk$Chain;
  declare var dim: $npm$chalk$Chain;
  declare var italic: $npm$chalk$Chain;
  declare var underline: $npm$chalk$Chain;
  declare var inverse: $npm$chalk$Chain;
  declare var strikethrough: $npm$chalk$Chain;

  // Text colors
  declare var black: $npm$chalk$Chain;
  declare var red: $npm$chalk$Chain;
  declare var green: $npm$chalk$Chain;
  declare var yellow: $npm$chalk$Chain;
  declare var blue: $npm$chalk$Chain;
  declare var magenta: $npm$chalk$Chain;
  declare var cyan: $npm$chalk$Chain;
  declare var white: $npm$chalk$Chain;
  declare var gray: $npm$chalk$Chain;
  declare var grey: $npm$chalk$Chain;

  // Background colors
  declare var bgBlack: $npm$chalk$Chain;
  declare var bgRed: $npm$chalk$Chain;
  declare var bgGreen: $npm$chalk$Chain;
  declare var bgYellow: $npm$chalk$Chain;
  declare var bgBlue: $npm$chalk$Chain;
  declare var bgMagenta: $npm$chalk$Chain;
  declare var bgCyan: $npm$chalk$Chain;
  declare var bgWhite: $npm$chalk$Chain;
}


================================================
FILE: flow-typed/npm/classnames_v2.x.x.js
================================================
// flow-typed signature: cf86673cc32d185bdab1d2ea90578d37
// flow-typed version: 614bf49aa8/classnames_v2.x.x/flow_>=v0.25.x

type $npm$classnames$Classes =
  | string
  | { [className: string]: * }
  | false
  | void
  | null;

declare module "classnames" {
  declare module.exports: (
    ...classes: Array<$npm$classnames$Classes | $npm$classnames$Classes[]>
  ) => string;
}

declare module "classnames/bind" {
  declare module.exports: $Exports<"classnames">;
}

declare module "classnames/dedupe" {
  declare module.exports: $Exports<"classnames">;
}


================================================
FILE: flow-typed/npm/cosmiconfig_vx.x.x.js
================================================
// flow-typed signature: f920f3d9c66f46197d121928b5687b7f
// flow-typed version: <<STUB>>/cosmiconfig_v2/flow_v0.68.0

/**
 * This is an autogenerated libdef stub for:
 *
 *   'cosmiconfig'
 *
 * Fill this stub out by replacing all the `any` types.
 *
 * Once filled out, we encourage you to share your work with the
 * community by sending a pull request to:
 * https://github.com/flowtype/flow-typed
 */

declare module "cosmiconfig" {
  declare module.exports: any;
}

/**
 * We include stubs for each file inside this npm package in case you need to
 * require those files directly. Feel free to delete any files that aren't
 * needed.
 */
declare module "cosmiconfig/lib/loadDefinedFile" {
  declare module.exports: any;
}

declare module "cosmiconfig/lib/loadJs" {
  declare module.exports: any;
}

declare module "cosmiconfig/lib/loadPackageProp" {
  declare module.exports: any;
}

declare module "cosmiconfig/lib/loadRc" {
  declare module.exports: any;
}

// Filename aliases
declare module "cosmiconfig/index" {
  declare module.exports: $Exports<"cosmiconfig">;
}
declare module "cosmiconfig/index.js" {
  declare module.exports: $Exports<"cosmiconfig">;
}
declare module "cosmiconfig/lib/loadDefinedFile.js" {
  declare module.exports: $Exports<"cosmiconfig/lib/loadDefinedFile">;
}
declare module "cosmiconfig/lib/loadJs.js" {
  declare module.exports: $Exports<"cosmiconfig/lib/loadJs">;
}
declare module "cosmiconfig/lib/loadPackageProp.js" {
  declare module.exports: $Exports<"cosmiconfig/lib/loadPackageProp">;
}
declare module "cosmiconfig/lib/loadRc.js" {
  declare module.exports: $Exports<"cosmiconfig/lib/loadRc">;
}


================================================
FILE: flow-typed/npm/cross-env_vx.x.x.js
================================================
// flow-typed signature: 5592a3bd3fba4d66706ebee20bf1280d
// flow-typed version: <<STUB>>/cross-env_v^2.0.0/flow_v0.87.0

/**
 * This is an autogenerated libdef stub for:
 *
 *   'cross-env'
 *
 * Fill this stub out by replacing all the `any` types.
 *
 * Once filled out, we encourage you to share your work with the
 * community by sending a pull request to:
 * https://github.com/flowtype/flow-typed
 */

declare module "cross-env" {
  declare module.exports: any;
}

/**
 * We include stubs for each file inside this npm package in case you need to
 * require those files directly. Feel free to delete any files that aren't
 * needed.
 */
declare module "cross-env/bin/cross-env" {
  declare module.exports: any;
}

declare module "cross-env/dist/index" {
  declare module.exports: any;
}

declare module "cross-env/src/index" {
  declare module.exports: any;
}

declare module "cross-env/src/index.test" {
  declare module.exports: any;
}

// Filename aliases
declare module "cross-env/bin/cross-env.js" {
  declare module.exports: $Exports<"cross-env/bin/cross-env">;
}
declare module "cross-env/dist/index.js" {
  declare module.exports: $Exports<"cross-env/dist/index">;
}
declare module "cross-env/src/index.js" {
  declare module.exports: $Exports<"cross-env/src/index">;
}
declare module "cross-env/src/index.test.js" {
  declare module.exports: $Exports<"cross-env/src/index.test">;
}


================================================
FILE: flow-typed/npm/cross-spawn_vx.x.x.js
================================================
// flow-typed signature: 5ea03c16184806e3c98b03eed7c47337
// flow-typed version: <<STUB>>/cross-spawn_v^5.1.0/flow_v0.87.0

/**
 * This is an autogenerated libdef stub for:
 *
 *   'cross-spawn'
 *
 * Fill this stub out by replacing all the `any` types.
 *
 * Once filled out, we encourage you to share your work with the
 * community by sending a pull request to:
 * https://github.com/flowtype/flow-typed
 */

declare module "cross-spawn" {
  declare module.exports: any;
}

/**
 * We include stubs for each file inside this npm package in case you need to
 * require those files directly. Feel free to delete any files that aren't
 * needed.
 */
declare module "cross-spawn/lib/enoent" {
  declare module.exports: any;
}

declare module "cross-spawn/lib/parse" {
  declare module.exports: any;
}

declare module "cross-spawn/lib/util/escapeArgument" {
  declare module.exports: any;
}

declare module "cross-spawn/lib/util/escapeCommand" {
  declare module.exports: any;
}

declare module "cross-spawn/lib/util/hasEmptyArgumentBug" {
  declare module.exports: any;
}

declare module "cross-spawn/lib/util/readShebang" {
  declare module.exports: any;
}

declare module "cross-spawn/lib/util/resolveCommand" {
  declare module.exports: any;
}

// Filename aliases
declare module "cross-spawn/index" {
  declare module.exports: $Exports<"cross-spawn">;
}
declare module "cross-spawn/index.js" {
  declare module.exports: $Exports<"cross-spawn">;
}
declare module "cross-spawn/lib/enoent.js" {
  declare module.exports: $Exports<"cross-spawn/lib/enoent">;
}
declare module "cross-spawn/lib/parse.js" {
  declare module.exports: $Exports<"cross-spawn/lib/parse">;
}
declare module "cross-spawn/lib/util/escapeArgument.js" {
  declare module.exports: $Exports<"cross-spawn/lib/util/escapeArgument">;
}
declare module "cross-spawn/lib/util/escapeCommand.js" {
  declare module.exports: $Exports<"cross-spawn/lib/util/escapeCommand">;
}
declare module "cross-spawn/lib/util/hasEmptyArgumentBug.js" {
  declare module.exports: $Exports<"cross-spawn/lib/util/hasEmptyArgumentBug">;
}
declare module "cross-spawn/lib/util/readShebang.js" {
  declare module.exports: $Exports<"cross-spawn/lib/util/readShebang">;
}
declare module "cross-spawn/lib/util/resolveCommand.js" {
  declare module.exports: $Exports<"cross-spawn/lib/util/resolveCommand">;
}


================================================
FILE: flow-typed/npm/debug_v2.x.x.js
================================================
// flow-typed signature: c7b1e1d8d9c2230d131299ddc21dcb0e
// flow-typed version: da30fe6876/debug_v2.x.x/flow_>=v0.28.x

declare module "debug" {
  declare type Debugger = {
    (...args: Array<mixed>): void,
    (formatter: string, ...args: Array<mixed>): void,
    (err: Error, ...args: Array<mixed>): void,
    enabled: boolean,
    log: () => {},
    namespace: string,
  };

  declare module.exports: (namespace: string) => Debugger;

  declare var names: Array<string>;
  declare var skips: Array<string>;
  declare var colors: Array<number>;

  declare function disable(): void;
  declare function enable(namespaces: string): void;
  declare function enabled(name: string): boolean;
  declare function humanize(): void;
  declare function useColors(): boolean;
  declare function log(): void;

  declare var formatters: {
    [formatter: string]: () => {},
  };
}


================================================
FILE: flow-typed/npm/deep-assign_vx.x.x.js
================================================
// flow-typed signature: 56848df4dc23d9f45badc6098dd064d6
// flow-typed version: <<STUB>>/deep-assign_v2/flow_v0.68.0

/**
 * This is an autogenerated libdef stub for:
 *
 *   'deep-assign'
 *
 * Fill this stub out by replacing all the `any` types.
 *
 * Once filled out, we encourage you to share your work with the
 * community by sending a pull request to:
 * https://github.com/flowtype/flow-typed
 */

declare module "deep-assign" {
  declare module.exports: any;
}

/**
 * We include stubs for each file inside this npm package in case you need to
 * require those files directly. Feel free to delete any files that aren't
 * needed.
 */

// Filename aliases
declare module "deep-assign/index" {
  declare module.exports: $Exports<"deep-assign">;
}
declare module "deep-assign/index.js" {
  declare module.exports: $Exports<"deep-assign">;
}


================================================
FILE: flow-typed/npm/deepmerge_v1.x.x.js
================================================
// flow-typed signature: 53efc5e11191657e0f219f18bbef00b0
// flow-typed version: 498f273a60/deepmerge_v1.x.x/flow_>=v0.25.x

type DeepMergeOptionsType = {
  arrayMerge?: (
    dest: Array<*>,
    source: Array<*>,
    options?: DeepMergeOptionsType,
  ) => Array<*>,
  clone?: boolean,
};

type DeepMergeObjects = {
  (a: Object, b: Object, options?: DeepMergeOptionsType): Object,
  all: (objects: Array<Object>, options?: DeepMergeOptionsType) => Object,
};

type DeepMergeArrays = {
  (a: Array<*>, b: Array<*>, options?: DeepMergeOptionsType): Array<*>,
  all: (objects: Array<Array<*>>, options?: DeepMergeOptionsType) => Array<*>,
};

declare module "deepmerge" {
  declare module.exports: DeepMergeObjects & DeepMergeArrays;
}


================================================
FILE: flow-typed/npm/dotenv-expand_vx.x.x.js
================================================
// flow-typed signature: cd4c691226d8e9c1a0f86fb74504ac5f
// flow-typed version: <<STUB>>/dotenv-expand_v4/flow_v0.68.0

/**
 * This is an autogenerated libdef stub for:
 *
 *   'dotenv-expand'
 *
 * Fill this stub out by replacing all the `any` types.
 *
 * Once filled out, we encourage you to share your work with the
 * community by sending a pull request to:
 * https://github.com/flowtype/flow-typed
 */

declare module "dotenv-expand" {
  declare module.exports: any;
}

/**
 * We include stubs for each file inside this npm package in case you need to
 * require those files directly. Feel free to delete any files that aren't
 * needed.
 */
declare module "dotenv-expand/lib/main" {
  declare module.exports: any;
}

// Filename aliases
declare module "dotenv-expand/lib/main.js" {
  declare module.exports: $Exports<"dotenv-expand/lib/main">;
}


================================================
FILE: flow-typed/npm/dotenv_vx.x.x.js
================================================
// flow-typed signature: f8fcb1a175e52bcb883a8110dd6de9fd
// flow-typed version: <<STUB>>/dotenv_v5/flow_v0.68.0

/**
 * This is an autogenerated libdef stub for:
 *
 *   'dotenv'
 *
 * Fill this stub out by replacing all the `any` types.
 *
 * Once filled out, we encourage you to share your work with the
 * community by sending a pull request to:
 * https://github.com/flowtype/flow-typed
 */

declare module "dotenv" {
  declare module.exports: any;
}

/**
 * We include stubs for each file inside this npm package in case you need to
 * require those files directly. Feel free to delete any files that aren't
 * needed.
 */
declare module "dotenv/config" {
  declare module.exports: any;
}

declare module "dotenv/lib/main" {
  declare module.exports: any;
}

// Filename aliases
declare module "dotenv/config.js" {
  declare module.exports: $Exports<"dotenv/config">;
}
declare module "dotenv/lib/main.js" {
  declare module.exports: $Exports<"dotenv/lib/main">;
}


================================================
FILE: flow-typed/npm/emotion-server_vx.x.x.js
================================================
// flow-typed signature: a781c6219ddaa0af4db7a583c351bacc
// flow-typed version: <<STUB>>/emotion-server_v8/flow_v0.68.0

/**
 * This is an autogenerated libdef stub for:
 *
 *   'emotion-server'
 *
 * Fill this stub out by replacing all the `any` types.
 *
 * Once filled out, we encourage you to share your work with the
 * community by sending a pull request to:
 * https://github.com/flowtype/flow-typed
 */

declare module "emotion-server" {
  declare module.exports: any;
}

/**
 * We include stubs for each file inside this npm package in case you need to
 * require those files directly. Feel free to delete any files that aren't
 * needed.
 */
declare module "emotion-server/lib/index" {
  declare module.exports: any;
}

declare module "emotion-server/src/index" {
  declare module.exports: any;
}

// Filename aliases
declare module "emotion-server/lib/index.js" {
  declare module.exports: $Exports<"emotion-server/lib/index">;
}
declare module "emotion-server/src/index.js" {
  declare module.exports: $Exports<"emotion-server/src/index">;
}


================================================
FILE: flow-typed/npm/emotion_vx.x.x.js
================================================
// flow-typed signature: e4c6a1c8759d02fd57241bf07b66babe
// flow-typed version: <<STUB>>/emotion_v8/flow_v0.68.0

/**
 * This is an autogenerated libdef stub for:
 *
 *   'emotion'
 *
 * Fill this stub out by replacing all the `any` types.
 *
 * Once filled out, we encourage you to share your work with the
 * community by sending a pull request to:
 * https://github.com/flowtype/flow-typed
 */

declare module "emotion" {
  declare module.exports: any;
}

/**
 * We include stubs for each file inside this npm package in case you need to
 * require those files directly. Feel free to delete any files that aren't
 * needed.
 */
declare module "emotion/dist/DO-NOT-USE.min" {
  declare module.exports: any;
}

declare module "emotion/dist/index.cjs" {
  declare module.exports: any;
}

declare module "emotion/dist/index.es" {
  declare module.exports: any;
}

declare module "emotion/macro" {
  declare module.exports: any;
}

declare module "emotion/src/index" {
  declare module.exports: any;
}

declare module "emotion/src/sheet" {
  declare module.exports: any;
}

// Filename aliases
declare module "emotion/dist/DO-NOT-USE.min.js" {
  declare module.exports: $Exports<"emotion/dist/DO-NOT-USE.min">;
}
declare module "emotion/dist/index.cjs.js" {
  declare module.exports: $Exports<"emotion/dist/index.cjs">;
}
declare module "emotion/dist/index.es.js" {
  declare module.exports: $Exports<"emotion/dist/index.es">;
}
declare module "emotion/macro.js" {
  declare module.exports: $Exports<"emotion/macro">;
}
declare module "emotion/src/index.js" {
  declare module.exports: $Exports<"emotion/src/index">;
}
declare module "emotion/src/sheet.js" {
  declare module.exports: $Exports<"emotion/src/sheet">;
}


================================================
FILE: flow-typed/npm/eslint-config-i-am-meticulous_vx.x.x.js
================================================
// flow-typed signature: f1015b4058088a70464b6abe8b2ab82c
// flow-typed version: <<STUB>>/eslint-config-i-am-meticulous_v^11.0.0/flow_v0.87.0

/**
 * This is an autogenerated libdef stub for:
 *
 *   'eslint-config-i-am-meticulous'
 *
 * Fill this stub out by replacing all the `any` types.
 *
 * Once filled out, we encourage you to share your work with the
 * community by sending a pull request to:
 * https://github.com/flowtype/flow-typed
 */

declare module "eslint-config-i-am-meticulous" {
  declare module.exports: any;
}

/**
 * We include stubs for each file inside this npm package in case you need to
 * require those files directly. Feel free to delete any files that aren't
 * needed.
 */
declare module "eslint-config-i-am-meticulous/_flow-globals" {
  declare module.exports: any;
}

declare module "eslint-config-i-am-meticulous/ava" {
  declare module.exports: any;
}

declare module "eslint-config-i-am-meticulous/es5" {
  declare module.exports: any;
}

declare module "eslint-config-i-am-meticulous/flow" {
  declare module.exports: any;
}

declare module "eslint-config-i-am-meticulous/react-flow" {
  declare module.exports: any;
}

declare module "eslint-config-i-am-meticulous/react-native" {
  declare module.exports: any;
}

declare module "eslint-config-i-am-meticulous/react" {
  declare module.exports: any;
}

// Filename aliases
declare module "eslint-config-i-am-meticulous/_flow-globals.js" {
  declare module.exports: $Exports<
    "eslint-config-i-am-meticulous/_flow-globals",
  >;
}
declare module "eslint-config-i-am-meticulous/ava.js" {
  declare module.exports: $Exports<"eslint-config-i-am-meticulous/ava">;
}
declare module "eslint-config-i-am-meticulous/es5.js" {
  declare module.exports: $Exports<"eslint-config-i-am-meticulous/es5">;
}
declare module "eslint-config-i-am-meticulous/flow.js" {
  declare module.exports: $Exports<"eslint-config-i-am-meticulous/flow">;
}
declare module "eslint-config-i-am-meticulous/index" {
  declare module.exports: $Exports<"eslint-config-i-am-meticulous">;
}
declare module "eslint-config-i-am-meticulous/index.js" {
  declare module.exports: $Exports<"eslint-config-i-am-meticulous">;
}
declare module "eslint-config-i-am-meticulous/react-flow.js" {
  declare module.exports: $Exports<"eslint-config-i-am-meticulous/react-flow">;
}
declare module "eslint-config-i-am-meticulous/react-native.js" {
  declare module.exports: $Exports<
    "eslint-config-i-am-meticulous/react-native",
  >;
}
declare module "eslint-config-i-am-meticulous/react.js" {
  declare module.exports: $Exports<"eslint-config-i-am-meticulous/react">;
}


================================================
FILE: flow-typed/npm/eslint-import-resolver-webpack_vx.x.x.js
================================================
// flow-typed signature: 8ec014d2b5af0269c2437feb86644db4
// flow-typed version: <<STUB>>/eslint-import-resolver-webpack_v^0.10.0/flow_v0.87.0

/**
 * This is an autogenerated libdef stub for:
 *
 *   'eslint-import-resolver-webpack'
 *
 * Fill this stub out by replacing all the `any` types.
 *
 * Once filled out, we encourage you to share your work with the
 * community by sending a pull request to:
 * https://github.com/flowtype/flow-typed
 */

declare module "eslint-import-resolver-webpack" {
  declare module.exports: any;
}

/**
 * We include stubs for each file inside this npm package in case you need to
 * require those files directly. Feel free to delete any files that aren't
 * needed.
 */
declare module "eslint-import-resolver-webpack/config" {
  declare module.exports: any;
}

// Filename aliases
declare module "eslint-import-resolver-webpack/config.js" {
  declare module.exports: $Exports<"eslint-import-resolver-webpack/config">;
}
declare module "eslint-import-resolver-webpack/index" {
  declare module.exports: $Exports<"eslint-import-resolver-webpack">;
}
declare module "eslint-import-resolver-webpack/index.js" {
  declare module.exports: $Exports<"eslint-import-resolver-webpack">;
}


================================================
FILE: flow-typed/npm/eslint-plugin-flowtype_vx.x.x.js
================================================
// flow-typed signature: 597292a8691e14e15770175229d1cbfa
// flow-typed version: <<STUB>>/eslint-plugin-flowtype_v^3.0.0/flow_v0.87.0

/**
 * This is an autogenerated libdef stub for:
 *
 *   'eslint-plugin-flowtype'
 *
 * Fill this stub out by replacing all the `any` types.
 *
 * Once filled out, we encourage you to share your work with the
 * community by sending a pull request to:
 * https://github.com/flowtype/flow-typed
 */

declare module "eslint-plugin-flowtype" {
  declare module.exports: any;
}

/**
 * We include stubs for each file inside this npm package in case you need to
 * require those files directly. Feel free to delete any files that aren't
 * needed.
 */
declare module "eslint-plugin-flowtype/bin/readmeAssertions" {
  declare module.exports: any;
}

declare module "eslint-plugin-flowtype/dist/index" {
  declare module.exports: any;
}

declare module "eslint-plugin-flowtype/dist/rules/arrayStyle/index" {
  declare module.exports: any;
}

declare module "eslint-plugin-flowtype/dist/rules/arrayStyle/isSimpleType" {
  declare module.exports: any;
}

declare module "eslint-plugin-flowtype/dist/rules/arrayStyle/needWrap" {
  declare module.exports: any;
}

declare module "eslint-plugin-flowtype/dist/rules/arrayStyleComplexType" {
  declare module.exports: any;
}

declare module "eslint-plugin-flowtype/dist/rules/arrayStyleSimpleType" {
  declare module.exports: any;
}

declare module "eslint-plugin-flowtype/dist/rules/booleanStyle" {
  declare module.exports: any;
}
Download .txt
gitextract_mjidpdl9/

├── .circleci/
│   └── config.yml
├── .editorconfig
├── .flowconfig
├── .github/
│   └── FUNDING.yml
├── .gitignore
├── .travis.yml
├── .vscode/
│   └── settings.json
├── CHANGELOG.md
├── CODE_OF_CONDUCT.md
├── CONTRIBUTING.md
├── LICENSE
├── README.md
├── appveyor.yml
├── babel-jest.upward.js
├── babel.config.js
├── examples/
│   ├── .eslintrc
│   ├── react-app-blog/
│   │   ├── App.js
│   │   ├── Html.js
│   │   ├── README.md
│   │   ├── __tests__/
│   │   │   ├── __snapshots__/
│   │   │   │   └── index.js.snap
│   │   │   └── index.js
│   │   ├── content/
│   │   │   ├── pages/
│   │   │   │   ├── about.md
│   │   │   │   └── index.md
│   │   │   └── posts/
│   │   │       ├── draft-post.md
│   │   │       ├── fifth-post.md
│   │   │       ├── first-post.md
│   │   │       ├── fourth-post.md
│   │   │       ├── second-post.md
│   │   │       └── third-post.md
│   │   ├── highlights-theme.css
│   │   ├── package.json
│   │   ├── public/
│   │   │   └── robots.txt
│   │   └── src/
│   │       ├── ActivityIndicator.js
│   │       ├── Footer.js
│   │       ├── Header.js
│   │       ├── LatestPosts.js
│   │       ├── Layout.js
│   │       ├── Page.js
│   │       ├── PageBlog.js
│   │       ├── PageBlogPost.js
│   │       ├── PageError.js
│   │       ├── PageRepositories.js
│   │       ├── PostLayoutDefault.js
│   │       └── PostLayoutNoHero.js
│   ├── react-app-getting-started/
│   │   ├── App.js
│   │   ├── Html.js
│   │   ├── README.md
│   │   ├── __tests__/
│   │   │   ├── __snapshots__/
│   │   │   │   └── index.js.snap
│   │   │   └── index.js
│   │   ├── content/
│   │   │   └── posts/
│   │   │       ├── fifth-post.md
│   │   │       ├── first-post.md
│   │   │       ├── fourth-post.md
│   │   │       ├── second-post.md
│   │   │       └── third-post.md
│   │   ├── package.json
│   │   └── public/
│   │       └── robots.txt
│   ├── react-app-markdown-with-custom-components/
│   │   ├── App.js
│   │   ├── README.md
│   │   ├── __tests__/
│   │   │   └── index.js
│   │   ├── content/
│   │   │   └── index.md
│   │   └── package.json
│   ├── react-app-minimal-hello-world/
│   │   ├── App.js
│   │   ├── __tests__/
│   │   │   ├── __snapshots__/
│   │   │   │   └── index.js.snap
│   │   │   └── index.js
│   │   └── package.json
│   ├── react-app-styles-with-aphrodite/
│   │   ├── App.js
│   │   ├── Html.js
│   │   ├── __tests__/
│   │   │   └── index.js
│   │   └── package.json
│   ├── react-app-styles-with-css/
│   │   ├── App.js
│   │   ├── __tests__/
│   │   │   ├── __snapshots__/
│   │   │   │   └── index.js.snap
│   │   │   └── index.js
│   │   ├── package.json
│   │   └── styles.css
│   ├── react-app-styles-with-css-inlined-in-head/
│   │   ├── App.js
│   │   ├── Html.js
│   │   ├── __tests__/
│   │   │   └── index.js
│   │   ├── package.json
│   │   └── styles.css
│   ├── react-app-styles-with-emotion/
│   │   ├── App.js
│   │   ├── Html.js
│   │   ├── __tests__/
│   │   │   └── index.js
│   │   └── package.json
│   ├── react-app-styles-with-glamor/
│   │   ├── App.js
│   │   ├── Html.js
│   │   ├── __tests__/
│   │   │   └── index.js
│   │   └── package.json
│   ├── react-app-styles-with-glamorous/
│   │   ├── App.js
│   │   ├── Html.js
│   │   ├── __tests__/
│   │   │   └── index.js
│   │   └── package.json
│   ├── react-app-styles-with-radium/
│   │   ├── App.js
│   │   ├── Html.js
│   │   ├── __tests__/
│   │   │   └── index.js
│   │   └── package.json
│   ├── react-app-styles-with-styled-components/
│   │   ├── App.js
│   │   ├── Html.js
│   │   ├── __tests__/
│   │   │   └── index.js
│   │   └── package.json
│   ├── react-app-with-basename/
│   │   ├── App.js
│   │   ├── __tests__/
│   │   │   └── index.js
│   │   ├── content/
│   │   │   └── test.md
│   │   └── package.json
│   ├── react-native-web-app/
│   │   ├── App.js
│   │   ├── Html.js
│   │   ├── __tests__/
│   │   │   └── index.js
│   │   └── package.json
│   └── reason-react-app/
│       ├── App.js
│       ├── README.md
│       ├── __tests__/
│       │   ├── __snapshots__/
│       │   │   └── index.js.snap
│       │   └── index.js
│       ├── bsconfig.json
│       ├── content/
│       │   └── posts/
│       │       ├── fifth-post.md
│       │       ├── first-post.md
│       │       ├── fourth-post.md
│       │       ├── second-post.md
│       │       └── third-post.md
│       ├── package.json
│       └── src/
│           ├── Helpers.re
│           ├── Types.re
│           └── components/
│               ├── ErrorPage.re
│               ├── Home.re
│               └── Post.re
├── flow-typed/
│   ├── .eslintrc
│   ├── handmade/
│   │   ├── cross-fetch_v2.x.x.js
│   │   ├── deepmerge.js
│   │   ├── fb-watchman.js
│   │   ├── find-cache-dir.js
│   │   ├── fs-extra.js
│   │   ├── fs-promise.js
│   │   ├── globby.js
│   │   ├── gray-matter.js
│   │   ├── js-beautify.js
│   │   ├── jsx-test-helpers-v1.x.x.js
│   │   ├── loader-utils.js
│   │   ├── log-symbols.js
│   │   ├── lru-memoize.js
│   │   ├── mkdirp.js
│   │   ├── multili.js
│   │   ├── node-object-hash.js
│   │   ├── ora.js
│   │   ├── pify.js
│   │   ├── react-helmet_v5.x.x.js
│   │   ├── react-router-scroll.js
│   │   ├── remark.js
│   │   ├── sane.js
│   │   ├── semver.js
│   │   ├── simple-json-fetch.js
│   │   ├── strip-markdown.js
│   │   ├── striptags.js
│   │   ├── url-join.js
│   │   ├── webpack-dev-middleware.js
│   │   ├── webpack-hot-middleware.js
│   │   ├── webpack-sources.js
│   │   ├── webpack.js
│   │   └── webpack_v4.x.x.js
│   ├── npm/
│   │   ├── aphrodite_vx.x.x.js
│   │   ├── asciidoctor.js_vx.x.x.js
│   │   ├── chalk_v1.x.x.js
│   │   ├── classnames_v2.x.x.js
│   │   ├── cosmiconfig_vx.x.x.js
│   │   ├── cross-env_vx.x.x.js
│   │   ├── cross-spawn_vx.x.x.js
│   │   ├── debug_v2.x.x.js
│   │   ├── deep-assign_vx.x.x.js
│   │   ├── deepmerge_v1.x.x.js
│   │   ├── dotenv-expand_vx.x.x.js
│   │   ├── dotenv_vx.x.x.js
│   │   ├── emotion-server_vx.x.x.js
│   │   ├── emotion_vx.x.x.js
│   │   ├── eslint-config-i-am-meticulous_vx.x.x.js
│   │   ├── eslint-import-resolver-webpack_vx.x.x.js
│   │   ├── eslint-plugin-flowtype_vx.x.x.js
│   │   ├── eslint-plugin-import_vx.x.x.js
│   │   ├── eslint-plugin-react-native_vx.x.x.js
│   │   ├── eslint-plugin-react_vx.x.x.js
│   │   ├── eslint_vx.x.x.js
│   │   ├── express_v4.x.x.js
│   │   ├── flow-bin_v0.x.x.js
│   │   ├── get-port_vx.x.x.js
│   │   ├── git-exec-and-restage_vx.x.x.js
│   │   ├── glamor_vx.x.x.js
│   │   ├── glamorous_vx.x.x.js
│   │   ├── globby_vx.x.x.js
│   │   ├── gray-matter_vx.x.x.js
│   │   ├── hast-util-sanitize_vx.x.x.js
│   │   ├── history_vx.x.x.js
│   │   ├── hoist-non-react-statics_v2.x.x.js
│   │   ├── husky_vx.x.x.js
│   │   ├── jest_v21.x.x.js
│   │   ├── jest_v22.x.x.js
│   │   ├── lerna_vx.x.x.js
│   │   ├── lint-staged_vx.x.x.js
│   │   ├── lodash.deburr_vx.x.x.js
│   │   ├── lodash.flatten_vx.x.x.js
│   │   ├── lodash.kebabcase_vx.x.x.js
│   │   ├── npm-run-all_vx.x.x.js
│   │   ├── p-map_vx.x.x.js
│   │   ├── prettier_v1.x.x.js
│   │   ├── prop-types_v15.x.x.js
│   │   ├── radium_vx.x.x.js
│   │   ├── react-dev-utils_vx.x.x.js
│   │   ├── react-emotion_vx.x.x.js
│   │   ├── react-router_vx.x.x.js
│   │   ├── react-topbar-progress-indicator_vx.x.x.js
│   │   ├── rehype-autolink-headings_vx.x.x.js
│   │   ├── rehype-highlight_vx.x.x.js
│   │   ├── rehype-parse_vx.x.x.js
│   │   ├── rehype-raw_vx.x.x.js
│   │   ├── rehype-react_vx.x.x.js
│   │   ├── rehype-slug_vx.x.x.js
│   │   ├── rehype-stringify_vx.x.x.js
│   │   ├── remark-highlights_vx.x.x.js
│   │   ├── remark-parse_vx.x.x.js
│   │   ├── remark-rehype_vx.x.x.js
│   │   ├── remark-toc_vx.x.x.js
│   │   ├── rimraf_v2.x.x.js
│   │   ├── rss_vx.x.x.js
│   │   ├── socket.io-client_vx.x.x.js
│   │   ├── socket.io_v1.x.x.js
│   │   ├── styled-components_v2.x.x.js
│   │   ├── supertest_vx.x.x.js
│   │   ├── trash-cli_vx.x.x.js
│   │   ├── unified_v6.x.x.js
│   │   └── yargs_v7.x.x.js
│   └── phenomic.js
├── jest-setup.js
├── lerna.json
├── logo/
│   ├── .gitignore
│   └── phenomic.sketch
├── netlify.toml
├── package.json
├── packages/
│   ├── api-client/
│   │   ├── README.md
│   │   ├── bsconfig.json
│   │   ├── docs/
│   │   │   └── README.md
│   │   ├── package.json
│   │   └── src/
│   │       ├── __tests__/
│   │       │   ├── __snapshots__/
│   │       │   │   └── url-test.js.snap
│   │       │   └── url-test.js
│   │       ├── fetch.js
│   │       ├── index.js
│   │       ├── phenomicApiClient.re
│   │       ├── query.js
│   │       └── url.js
│   ├── babel-preset/
│   │   ├── README.md
│   │   ├── bsconfig.json
│   │   ├── package.json
│   │   └── src/
│   │       └── index.js
│   ├── bs-platform/
│   │   ├── README.md
│   │   ├── bsconfig.json
│   │   ├── package.json
│   │   ├── src/
│   │   │   └── .gitkeep-because-i-am-too-lazy-too-make-lerna-commands-smarter
│   │   └── tweak
│   ├── cli/
│   │   ├── README.md
│   │   ├── bsconfig.json
│   │   ├── docs/
│   │   │   └── README.md
│   │   ├── index.js
│   │   ├── package.json
│   │   └── src/
│   │       ├── __tests__/
│   │       │   └── check-engine.js
│   │       ├── bin.js
│   │       ├── check-engine.js
│   │       └── commands.js
│   ├── core/
│   │   ├── README.md
│   │   ├── bsconfig.json
│   │   ├── docs/
│   │   │   ├── README.md
│   │   │   ├── api.md
│   │   │   ├── cli.md
│   │   │   ├── configuration.md
│   │   │   ├── faq.md
│   │   │   ├── how-phenomic-works.md
│   │   │   └── writing-plugins.md
│   │   ├── package.json
│   │   └── src/
│   │       ├── BsFindCacheDir.re
│   │       ├── Utils.re
│   │       ├── api/
│   │       │   ├── __tests__/
│   │       │   │   └── index.js
│   │       │   ├── helpers.js
│   │       │   └── index.js
│   │       ├── commands/
│   │       │   ├── build.js
│   │       │   └── start.js
│   │       ├── configuration/
│   │       │   ├── __tests__/
│   │       │   │   ├── __snapshots__/
│   │       │   │   │   ├── flattenConfiguration.js.snap
│   │       │   │   │   └── normalize-base-url.test.js.snap
│   │       │   │   ├── flattenConfiguration.js
│   │       │   │   └── normalize-base-url.test.js
│   │       │   ├── flattenConfiguration.js
│   │       │   ├── get-client-environment.js
│   │       │   └── normalize-base-url.js
│   │       ├── db/
│   │       │   ├── __tests__/
│   │       │   │   ├── __fixtures__/
│   │       │   │   │   └── index.js
│   │       │   │   ├── __snapshots__/
│   │       │   │   │   └── index-test.js.snap
│   │       │   │   └── index-test.js
│   │       │   └── index.js
│   │       ├── defaultConfig.js
│   │       ├── index.js
│   │       ├── logger/
│   │       │   ├── __tests__/
│   │       │   │   └── index.js
│   │       │   └── index.js
│   │       └── utils/
│   │           ├── __tests__/
│   │           │   ├── __snapshots__/
│   │           │   │   └── resolveAll-test.js.snap
│   │           │   ├── error-formatter-test.js
│   │           │   └── resolveAll-test.js
│   │           ├── error-formatter.js
│   │           ├── getPath.js
│   │           ├── log.js
│   │           ├── resolveAll.js
│   │           └── writeFile.js
│   ├── helpers-transform/
│   │   ├── README.md
│   │   ├── bsconfig.json
│   │   ├── docs/
│   │   │   ├── README.md
│   │   │   ├── extractMetaFromBodyNode.md
│   │   │   └── unifiedProcessor.md
│   │   ├── package.json
│   │   └── src/
│   │       ├── __tests__/
│   │       │   ├── __snapshots__/
│   │       │   │   ├── extractMetaFromBodyNode.js.snap
│   │       │   │   └── unifiedProcessor.js.snap
│   │       │   ├── extractMetaFromBodyNode.js
│   │       │   └── unifiedProcessor.js
│   │       ├── extractMetaFromBodyNode.js
│   │       └── unifiedProcessor.js
│   ├── plugin-api-related-content/
│   │   ├── README.md
│   │   ├── bsconfig.json
│   │   ├── docs/
│   │   │   └── README.md
│   │   ├── package.json
│   │   └── src/
│   │       └── index.js
│   ├── plugin-bundler-webpack/
│   │   ├── README.md
│   │   ├── bsconfig.json
│   │   ├── docs/
│   │   │   └── README.md
│   │   ├── package.json
│   │   └── src/
│   │       ├── WebpackConfigValidator.js
│   │       ├── WebpackGetConfig.js
│   │       ├── WebpackServerConfigModifier.js
│   │       ├── __tests__/
│   │       │   ├── __snapshots__/
│   │       │   │   └── index.js.snap
│   │       │   └── index.js
│   │       ├── index.js
│   │       ├── webpack-promise.js
│   │       └── webpack.config.js
│   ├── plugin-collector-files/
│   │   ├── README.md
│   │   ├── bsconfig.json
│   │   ├── package.json
│   │   └── src/
│   │       ├── __tests__/
│   │       │   ├── __fixtures__/
│   │       │   │   ├── authors/
│   │       │   │   │   ├── bloodyowl.json
│   │       │   │   │   └── moox.json
│   │       │   │   ├── news/
│   │       │   │   │   └── 2017/
│   │       │   │   │       └── 06/
│   │       │   │   │           └── introducing-1.0.0-alpha.json
│   │       │   │   ├── showcase/
│   │       │   │   │   ├── entry/
│   │       │   │   │   │   ├── acrowithbrian.com.json
│   │       │   │   │   │   ├── anthonydugois.com__polynomic.json
│   │       │   │   │   │   └── ced.photo.json
│   │       │   │   │   └── submit.json
│   │       │   │   └── showcaseTags/
│   │       │   │       ├── event.json
│   │       │   │       └── open-source.json
│   │       │   ├── __snapshots__/
│   │       │   │   └── collect.js.snap
│   │       │   ├── collect.js
│   │       │   └── index.js
│   │       ├── index.js
│   │       └── watch.js
│   ├── plugin-public-assets/
│   │   ├── README.md
│   │   ├── bsconfig.json
│   │   ├── docs/
│   │   │   └── README.md
│   │   ├── package.json
│   │   └── src/
│   │       └── index.js
│   ├── plugin-renderer-react/
│   │   ├── README.md
│   │   ├── bsconfig.json
│   │   ├── docs/
│   │   │   └── README.md
│   │   ├── package.json
│   │   └── src/
│   │       ├── __tests__/
│   │       │   ├── __snapshots__/
│   │       │   │   ├── resolveURLs-list.js.snap
│   │       │   │   └── resolveURLs.js.snap
│   │       │   ├── resolveURLs-list.js
│   │       │   └── resolveURLs.js
│   │       ├── bodyRenderer.re
│   │       ├── client.js
│   │       ├── components/
│   │       │   ├── BodyRenderer.js
│   │       │   ├── HTML.js
│   │       │   ├── Link.hash.js
│   │       │   ├── Link.js
│   │       │   ├── Provider.js
│   │       │   ├── __tests__/
│   │       │   │   ├── BodyRenderer.js
│   │       │   │   ├── Html.js
│   │       │   │   ├── Link.js
│   │       │   │   ├── __snapshots__/
│   │       │   │   │   ├── BodyRenderer.js.snap
│   │       │   │   │   ├── Html.js.snap
│   │       │   │   │   ├── Link.js.snap
│   │       │   │   │   └── textRenderer.js.snap
│   │       │   │   └── textRenderer.js
│   │       │   └── textRenderer.js
│   │       ├── createApp.js
│   │       ├── deprecated-createContainer.js
│   │       ├── index.js
│   │       ├── link.re
│   │       ├── phenomicRendererReactClient.re
│   │       ├── renderHTML.js
│   │       ├── resolveURLs.js
│   │       ├── resolveUrlsFromPhenomicApi.js
│   │       ├── server/
│   │       │   ├── __tests__/
│   │       │   │   ├── __snapshots__/
│   │       │   │   │   └── getRoutes.js.snap
│   │       │   │   └── getRoutes.js
│   │       │   ├── dev-server.js
│   │       │   ├── getRoutes.js
│   │       │   └── static.js
│   │       ├── shared/
│   │       │   ├── QueryString.js
│   │       │   ├── __tests__/
│   │       │   │   ├── QueryString-test.js
│   │       │   │   ├── __snapshots__/
│   │       │   │   │   ├── QueryString-test.js.snap
│   │       │   │   │   └── mapValues-test.js.snap
│   │       │   │   └── mapValues-test.js
│   │       │   ├── mapValues.js
│   │       │   ├── performQuery.js
│   │       │   └── store/
│   │       │       ├── __tests__/
│   │       │       │   ├── __snapshots__/
│   │       │       │   │   └── index-test.js.snap
│   │       │       │   └── index-test.js
│   │       │       └── index.js
│   │       ├── utils.js
│   │       ├── withInitialProps.js
│   │       └── withPhenomicApi.js
│   ├── plugin-rss-feed/
│   │   ├── README.md
│   │   ├── bsconfig.json
│   │   ├── docs/
│   │   │   └── README.md
│   │   ├── package.json
│   │   └── src/
│   │       └── index.js
│   ├── plugin-sitemap/
│   │   ├── README.md
│   │   ├── bsconfig.json
│   │   ├── package.json
│   │   └── src/
│   │       └── index.js
│   ├── plugin-transform-asciidoc/
│   │   ├── README.md
│   │   ├── bsconfig.json
│   │   ├── docs/
│   │   │   └── README.md
│   │   ├── package.json
│   │   └── src/
│   │       ├── __tests__/
│   │       │   ├── __snapshots__/
│   │       │   │   └── index.js.snap
│   │       │   └── index.js
│   │       ├── default-options.js
│   │       └── index.js
│   ├── plugin-transform-json/
│   │   ├── README.md
│   │   ├── bsconfig.json
│   │   ├── docs/
│   │   │   └── README.md
│   │   ├── package.json
│   │   └── src/
│   │       ├── __tests__/
│   │       │   ├── __snapshots__/
│   │       │   │   └── index.js.snap
│   │       │   └── index.js
│   │       └── index.js
│   ├── plugin-transform-markdown/
│   │   ├── README.md
│   │   ├── bsconfig.json
│   │   ├── docs/
│   │   │   └── README.md
│   │   ├── package.json
│   │   └── src/
│   │       ├── __tests__/
│   │       │   ├── __snapshots__/
│   │       │   │   └── index.js.snap
│   │       │   └── index.js
│   │       ├── default-options.js
│   │       └── index.js
│   └── preset-react-app/
│       ├── README.md
│       ├── bsconfig.json
│       ├── docs/
│       │   ├── README.md
│       │   └── getting-started/
│       │       ├── 01.md
│       │       ├── 02.md
│       │       ├── 03.md
│       │       ├── 04.md
│       │       ├── 05.md
│       │       ├── 06.md
│       │       ├── 07.md
│       │       ├── 08.md
│       │       ├── 09.md
│       │       ├── 10.md
│       │       └── README.md
│       ├── package.json
│       └── src/
│           ├── client.js
│           ├── index.js
│           └── phenomicPresetReactApp.re
├── scripts/
│   ├── examples.js
│   └── utils.js
└── website/
    ├── .gitignore
    ├── App.js
    ├── Html.js
    ├── __tests__/
    │   └── index.js
    ├── components/
    │   ├── ActivityIndicator.js
    │   ├── BackgroundGradient.web.js
    │   ├── BlogItem.js
    │   ├── BlogList.js
    │   ├── BlogListItem.js
    │   ├── BodyContainer.js
    │   ├── BodySmallContainer.js
    │   ├── Browser.js
    │   ├── DocSearch.js
    │   ├── Editor.js
    │   ├── Flex.js
    │   ├── Footer.js
    │   ├── FooterNavBar.js
    │   ├── Header.js
    │   ├── HeaderNavBar.js
    │   ├── Home.js
    │   ├── HomeCodeExample.js
    │   ├── Link.web.js
    │   ├── MarkdownGenerated.js
    │   ├── MarkdownHeading.js
    │   ├── PackageListItem.js
    │   ├── Page.js
    │   ├── PageDoc.js
    │   ├── PageError.js
    │   ├── PagePackageList.js
    │   ├── PageShowcase.js
    │   ├── PhenomicLogo.js
    │   ├── Plugins.js
    │   ├── ShowcaseList.js
    │   ├── Spacer.js
    │   ├── Spinner.js
    │   ├── Tutorials.js
    │   ├── Wrapper.js
    │   └── react-stylable/
    │       ├── focusable.js
    │       ├── hoverable.js
    │       ├── index.js
    │       ├── touchable-mouse.js
    │       └── touchable.js
    ├── content/
    │   ├── blog/
    │   │   ├── 2017-06-02-introducing-1.0.0-alpha.md
    │   │   ├── 2017-06-10-v1.0.0-alpha.3.md
    │   │   ├── 2017-07-11-v1.0.0-alpha.4.md
    │   │   ├── 2017-08-09-v1.0.0-alpha.5.md
    │   │   ├── 2017-09-08-v1.0.0-alpha.6.md
    │   │   ├── 2017-09-15-v1.0.0-alpha.7.md
    │   │   ├── 2017-09-16-v1.0.0-alpha.8.md
    │   │   ├── 2017-09-27-v1.0.0-alpha.10.md
    │   │   ├── 2017-09-30-v1.0.0-alpha.11.md
    │   │   ├── 2017-10-11-v1.0.0-alpha.12.md
    │   │   ├── 2017-10-19-v1.0.0-alpha.13.md
    │   │   ├── 2017-12-04-v1.0.0-alpha.14.md
    │   │   ├── 2017-12-04-v1.0.0-alpha.15.md
    │   │   ├── 2017-12-06-v1.0.0-alpha.16.md
    │   │   ├── 2017-12-06-v1.0.0-alpha.17.md
    │   │   ├── 2017-12-20-v1.0.0-alpha.18.md
    │   │   ├── 2018-01-11-v1.0.0-alpha.19.md
    │   │   ├── 2018-01-24-v1.0.0-alpha.20.md
    │   │   ├── 2018-03-08-v1.0.0-beta.0.md
    │   │   ├── 2018-03-30-v1.0.0-beta.1.md
    │   │   ├── 2018-04-07-v1.0.0-beta.2.md
    │   │   ├── 2018-05-22-v1.0.0-beta.3.md
    │   │   ├── 2018-10-27-v1.0.0-beta.4.md
    │   │   ├── 2018-11-26-v1.0.0-beta.5.md
    │   │   ├── 2018-12-08-v1.0.0-beta.6.md
    │   │   ├── 2018-12-09-v1.0.0-beta.7.md
    │   │   ├── 2018-12-20-v1.0.0-beta.8.md
    │   │   ├── 2019-01-18-v10.0-beta.9.md
    │   │   ├── 2019-03-15-v1.0.0-beta.10.md
    │   │   ├── 2019-03-24-v1.0.0-beta.11.md
    │   │   └── 2019-05-28-v1.0.0
    │   └── showcase/
    │       ├── entry/
    │       │   ├── anthonydugois.com__polynomic.md
    │       │   ├── ced.photo.md
    │       │   ├── cpp.daynhauhoc.com.md
    │       │   ├── cssnano.co.md
    │       │   ├── duxxie.nl.md
    │       │   ├── haywirez.com.md
    │       │   ├── istanbul.js.org.md
    │       │   ├── kevin940726.github.io.md
    │       │   ├── khoanguyen.me.md
    │       │   ├── meetfranz.com.md
    │       │   ├── nhakhoaphuocbinh.com.md
    │       │   ├── postcss.org.md
    │       │   ├── putaindecode.io.md
    │       │   ├── slashgear.github.io.md
    │       │   ├── stylelint.io.md
    │       │   ├── www.acrowithbrian.com.md
    │       │   ├── www.asimkt.com.md
    │       │   ├── www.boscnegre-vacances.com.md
    │       │   └── www.codepreneur.io.md
    │       └── submit.md
    ├── defaults.css
    ├── highlights-theme.css
    ├── modules/
    │   └── url-to-slug.js
    ├── package.json
    ├── phenomic.config.js
    ├── public/
    │   ├── .nojekyll
    │   ├── CNAME
    │   ├── browserconfig.xml
    │   └── site.webmanifest
    ├── scripts/
    │   ├── deploy.sh
    │   ├── releases-as-markdown.js
    │   └── showcase-screenshots.js
    └── webpack.config.js
Download .txt
SYMBOL INDEX (83 symbols across 40 files)

FILE: examples/react-app-blog/src/ActivityIndicator.js
  class ActivityIndicator (line 15) | class ActivityIndicator extends React.PureComponent<{}, { visible: boole...

FILE: examples/react-app-blog/src/PageRepositories.js
  method getInitialProps (line 26) | static async getInitialProps({ params }) {
  method getAllPossibleUrls (line 35) | static async getAllPossibleUrls({ path }) {
  method render (line 48) | render() {

FILE: flow-typed/handmade/fb-watchman.js
  class Client (line 19) | class Client {

FILE: flow-typed/handmade/remark.js
  class remark (line 10) | class remark {

FILE: flow-typed/handmade/webpack_v4.x.x.js
  class WebpackError (line 2) | class WebpackError extends Error {
  class WebpackCompilation (line 15) | class WebpackCompilation {
  class WebpackStats (line 20) | class WebpackStats {

FILE: flow-typed/npm/express_v4.x.x.js
  class express$RequestResponseBase (line 10) | class express$RequestResponseBase {
  class express$Request (line 19) | class express$Request extends http$IncomingMessage

FILE: flow-typed/npm/unified_v6.x.x.js
  class Unified (line 26) | class Unified {

FILE: jest-setup.js
  function OnigRegExp (line 14) | function OnigRegExp(source) {
  method get (line 133) | get() {

FILE: packages/api-client/src/query.js
  function query (line 17) | function query(config: PhenomicQueryConfig): PhenomicQueryConfig {

FILE: packages/api-client/src/url.js
  function postfix (line 3) | function postfix(url) {

FILE: packages/core/src/api/index.js
  function createAPIServer (line 33) | function createAPIServer({

FILE: packages/core/src/commands/build.js
  function build (line 21) | async function build(config: PhenomicConfig) {

FILE: packages/core/src/commands/start.js
  function start (line 37) | async function start(config: PhenomicConfig) {

FILE: packages/core/src/configuration/__tests__/flattenConfiguration.js
  function a (line 5) | function a() {
  function b (line 8) | function b() {
  function c (line 11) | function c() {
  function d (line 14) | function d() {

FILE: packages/core/src/configuration/get-client-environment.js
  constant NODE_ENV (line 11) | const NODE_ENV = process.env.NODE_ENV || "development";
  constant RE_PHENOMIC (line 12) | const RE_PHENOMIC = /^PHENOMIC_/i;
  function getClientEnvironment (line 44) | function getClientEnvironment(config: PhenomicConfig) {

FILE: packages/core/src/db/index.js
  function defaultSort (line 13) | function defaultSort(sort = "date") {
  function getSublevel (line 35) | function getSublevel(
  function putToSublevel (line 55) | function putToSublevel(
  function updateToSublevel (line 72) | function updateToSublevel(
  class NotFoundError (line 90) | class NotFoundError extends Error {
    method constructor (line 91) | constructor(...args) {
  function getDataRelations (line 243) | function getDataRelations(fields) {

FILE: packages/core/src/index.js
  method start (line 40) | start(inputConfig?: PhenomicInputConfig) {

FILE: packages/core/src/logger/index.js
  constant INFO (line 6) | const INFO = "info";
  constant SUCCESS (line 7) | const SUCCESS = "success";
  constant WARN (line 8) | const WARN = "warning";
  constant ERROR (line 9) | const ERROR = "error";

FILE: packages/plugin-api-related-content/src/index.js
  method extendAPI (line 10) | extendAPI({ apiServer }) {

FILE: packages/plugin-bundler-webpack/src/index.js
  method addDevServerMiddlewares (line 25) | addDevServerMiddlewares() {
  method buildForPrerendering (line 65) | buildForPrerendering() {
  method build (line 72) | build() {

FILE: packages/plugin-collector-files/src/__tests__/collect.js
  method transform (line 27) | transform({ contents }) {

FILE: packages/plugin-collector-files/src/index.js
  function normalizeWindowsPath (line 19) | function normalizeWindowsPath(value: string): string {
  function glob (line 28) | function glob({
  function makeId (line 43) | function makeId(name: string, json: PhenomicTransformResult): string {
  function formatDate (line 60) | function formatDate(dateString: string) {
  function isLiteral (line 65) | function isLiteral(value) {
  function isArrayOfLiterals (line 70) | function isArrayOfLiterals(array) {
  function getFieldValue (line 74) | function getFieldValue(json: PhenomicTransformResult, id: string) {
  function injectData (line 85) | function injectData(
  function parsePath (line 109) | function parsePath(

FILE: packages/plugin-public-assets/src/index.js
  method addDevServerMiddlewares (line 34) | addDevServerMiddlewares() {
  method beforeBuild (line 43) | beforeBuild() {

FILE: packages/plugin-renderer-react/src/__tests__/resolveURLs.js
  function getAllPossibleUrls (line 47) | function getAllPossibleUrls({ path }) {

FILE: packages/plugin-renderer-react/src/components/Link.js
  constant BASENAME (line 8) | const BASENAME = process.env.PHENOMIC_APP_BASENAME || "/";

FILE: packages/plugin-renderer-react/src/components/textRenderer.js
  method if (line 38) | if (typeof tree === "undefined") {

FILE: packages/plugin-renderer-react/src/server/getRoutes.js
  function flattenRoutes (line 8) | function flattenRoutes(routes, path = "") {
  function getRoutes (line 29) | function getRoutes(app: PhenomicAppType) {

FILE: packages/plugin-renderer-react/src/server/static.js
  function getMatch (line 20) | function getMatch({ routes, location }) {
  function staticRenderToString (line 32) | function staticRenderToString(

FILE: packages/plugin-renderer-react/src/shared/QueryString.js
  function encode (line 3) | function encode(object: Object) {
  function decode (line 10) | function decode(string: string) {

FILE: packages/plugin-renderer-react/src/shared/performQuery.js
  function performQuery (line 8) | function performQuery(store: StoreType, queries: phenomic$Queries) {

FILE: packages/plugin-renderer-react/src/shared/store/index.js
  constant NO_VALUE_EDGE (line 6) | const NO_VALUE_EDGE = {
  function createStore (line 21) | function createStore(state: StateType = {}): StoreType {

FILE: packages/plugin-renderer-react/src/utils.js
  function getDisplayName (line 5) | function getDisplayName(Component: React.ComponentType<*>) {

FILE: packages/plugin-renderer-react/src/withInitialProps.js
  class PhenomicContainerWithInitialProps (line 29) | class PhenomicContainerWithInitialProps extends React.Component<
    method super (line 45) | super(props);

FILE: packages/plugin-renderer-react/src/withPhenomicApi.js
  class PhenomicContainerWithApi (line 22) | class PhenomicContainerWithApi extends React.Component<props, void> {
    method if (line 45) | if (!this.context.__prerendering) {
    method if (line 49) | if (process.env.NODE_ENV !== "production") {

FILE: packages/plugin-rss-feed/src/index.js
  method addDevServerMiddlewares (line 104) | addDevServerMiddlewares() {
  method resolveURLs (line 125) | resolveURLs() {

FILE: website/components/ActivityIndicator.js
  class ActivityIndicator (line 25) | class ActivityIndicator extends React.Component<Props> {

FILE: website/components/DocSearch.js
  class DocSearch (line 13) | class DocSearch extends Component {
    method componentDidMount (line 14) | componentDidMount() {
    method shouldComponentUpdate (line 38) | shouldComponentUpdate() {
    method render (line 42) | render() {

FILE: website/components/Link.web.js
  constant BASENAME (line 16) | const BASENAME = process.env.PHENOMIC_APP_BASENAME || "/";

FILE: website/components/Page.js
  function readPkgFromId (line 40) | function readPkgFromId(id: string) {

FILE: website/components/PhenomicLogo.js
  method componentDidMount (line 14) | componentDidMount() {
  method componentWillUnmount (line 20) | componentWillUnmount() {
Condensed preview — 560 files, each showing path, character count, and a content snippet. Download the .json file or copy for the full structured content (1,151K chars).
[
  {
    "path": ".circleci/config.yml",
    "chars": 729,
    "preview": "version: 2\njobs:\n  test:\n    docker:\n      - image: circleci/node:8\n    steps:\n      - checkout\n      - restore_cache:\n "
  },
  {
    "path": ".editorconfig",
    "chars": 235,
    "preview": "# editorconfig.org\nroot = true\n\n[*]\nend_of_line = lf\ncharset = utf-8\ntrim_trailing_whitespace = true\ninsert_final_newlin"
  },
  {
    "path": ".flowconfig",
    "chars": 1149,
    "preview": "[version]\n^0.87.0\n\n[ignore]\n.*/__tests__/_output/.*\n.*/dist/.*\n# for CI\n.*/watchman/.*\n\n<PROJECT_ROOT>/coverage/.*\n<PROJ"
  },
  {
    "path": ".github/FUNDING.yml",
    "chars": 75,
    "preview": "open_collective: phenomic\nko_fi: moox__\ncustom: https://www.paypal.me/MoOx\n"
  },
  {
    "path": ".gitignore",
    "chars": 380,
    "preview": "*.log\n\n# macOS crap\n.DS_Store\n\n# Node.js / npm\nnode_modules\n# we rely on yarn.lock\npackage-lock.json\n\n# code coverage\nco"
  },
  {
    "path": ".travis.yml",
    "chars": 568,
    "preview": "language: node_js\nnode_js: 8\n\nenv:\n  global:\n  - DEBUG: phenomic:*\n\nbefore_install:\n  # Install Yarn\n  - curl -o- -L htt"
  },
  {
    "path": ".vscode/settings.json",
    "chars": 42,
    "preview": "{\n  \"javascript.validate.enable\": false\n}\n"
  },
  {
    "path": "CHANGELOG.md",
    "chars": 178,
    "preview": "# For pre-releases notes [see GitHub releases](https://github.com/phenomic/phenomic/releases)\n\n# [0.x releases notes](ht"
  },
  {
    "path": "CODE_OF_CONDUCT.md",
    "chars": 5442,
    "preview": "# Code of Conduct\n\n## 1. Purpose\n\nA primary goal of Phenomic is to be inclusive to the largest number of\ncontributors, w"
  },
  {
    "path": "CONTRIBUTING.md",
    "chars": 8393,
    "preview": "# Contributing to Phenomic\n\n> ⚠️ wip\n\nFrom opening a bug report to creating a pull request: every contribution is\napprec"
  },
  {
    "path": "LICENSE",
    "chars": 1082,
    "preview": "The MIT License (MIT)\n\nCopyright (c) 2015 Maxime Thirouin\n\nPermission is hereby granted, free of charge, to any person o"
  },
  {
    "path": "README.md",
    "chars": 4736,
    "preview": "# DEPRECATED. Please use [Next.js](https://nextjs.org) instead\n\n[![Phenomic](https://raw.githubusercontent.com/phenomic/"
  },
  {
    "path": "appveyor.yml",
    "chars": 794,
    "preview": "# http://www.appveyor.com/docs/appveyor-yml\nenvironment:\n  matrix:\n    - nodejs_version: '8'\n\n  DEBUG: phenomic:*\n\ninsta"
  },
  {
    "path": "babel-jest.upward.js",
    "chars": 85,
    "preview": "module.exports = require(\"babel-jest\").createTransformer({\n  rootMode: \"upward\",\n});\n"
  },
  {
    "path": "babel.config.js",
    "chars": 442,
    "preview": "module.exports = {\n  presets: [\n    [\n      \"@babel/preset-env\",\n      {\n        targets: {\n          node: \"current\",\n "
  },
  {
    "path": "examples/.eslintrc",
    "chars": 221,
    "preview": "{\n  \"rules\": {\n    \"import/no-extraneous-dependencies\": 0,\n    \"react/no-multi-comp\": 0,\n    \"react/prop-types\": 0,\n    "
  },
  {
    "path": "examples/react-app-blog/App.js",
    "chars": 1110,
    "preview": "// @flow\n\nimport * as React from \"react\";\nimport { Router, Route, browserHistory } from \"react-router\";\nimport { createA"
  },
  {
    "path": "examples/react-app-blog/Html.js",
    "chars": 967,
    "preview": "// @flow\n\nimport * as React from \"react\";\nimport Head from \"react-helmet\";\n\nexport default ({ App, render }: PhenomicHtm"
  },
  {
    "path": "examples/react-app-blog/README.md",
    "chars": 475,
    "preview": "# Blog with Phenomic + React preset\n\nSimple blog template that includes:\n\n- some pages (home, about, 404.html for static"
  },
  {
    "path": "examples/react-app-blog/__tests__/__snapshots__/index.js.snap",
    "chars": 1747,
    "preview": "// Jest Snapshot v1, https://goo.gl/fbAQLP\n\nexports[`should build example correctly 1`] = `\nArray [\n  \"404.html\",\n  \"abo"
  },
  {
    "path": "examples/react-app-blog/__tests__/index.js",
    "chars": 1715,
    "preview": "// @flow\n\n/* eslint-disable import/no-extraneous-dependencies */\nimport fs from \"fs\";\nimport path from \"path\";\n\nimport g"
  },
  {
    "path": "examples/react-app-blog/content/pages/about.md",
    "chars": 1700,
    "preview": "---\ntitle: About me\nimage: https://images.unsplash.com/photo-1495681803763-410ec9ff583d?ixlib=rb-0.3.5&ixid=eyJhcHBfaWQi"
  },
  {
    "path": "examples/react-app-blog/content/pages/index.md",
    "chars": 1119,
    "preview": "---\nimage: https://images.unsplash.com/photo-1495287949939-c5d3daf1cab4?ixlib=rb-0.3.5&ixid=eyJhcHBfaWQiOjEyMDd9&s=8969a"
  },
  {
    "path": "examples/react-app-blog/content/posts/draft-post.md",
    "chars": 144,
    "preview": "---\ntitle: \"I won't be there in production\"\ndate: \"2017-01-06\"\ndraft: true\n---\n\nYou can see me in dev mode, but I will b"
  },
  {
    "path": "examples/react-app-blog/content/posts/fifth-post.md",
    "chars": 778,
    "preview": "---\ntitle: \"I wrote my fifth post and you won't believe what happen next\"\ndate: \"2017-01-05\"\nlayout: light\n---\n\nThis pos"
  },
  {
    "path": "examples/react-app-blog/content/posts/first-post.md",
    "chars": 757,
    "preview": "---\ntitle: \"This is a first post\"\ndate: \"2017-01-01\"\n---\n\n# This is a [Markdown](https://en.wikipedia.org/wiki/Markdown#"
  },
  {
    "path": "examples/react-app-blog/content/posts/fourth-post.md",
    "chars": 88,
    "preview": "---\ntitle: \"Fourth post, I can't believe I did it\"\ndate: \"2017-01-04\"\n---\n\nAnother post\n"
  },
  {
    "path": "examples/react-app-blog/content/posts/second-post.md",
    "chars": 77,
    "preview": "---\ntitle: \"Second post, wow, I did it\"\ndate: \"2017-01-02\"\n---\n\nAnother post\n"
  },
  {
    "path": "examples/react-app-blog/content/posts/third-post.md",
    "chars": 111,
    "preview": "---\ntitle: \"A third post means I am really going to write a serious blog\"\ndate: \"2017-01-03\"\n---\n\nAnother post\n"
  },
  {
    "path": "examples/react-app-blog/highlights-theme.css",
    "chars": 10668,
    "preview": ".editor {\n  padding: 1em;\n  border: 1px solid #11171c;\n  border-radius: 3px;\n}\n\n/*\n  Code below has been generated with "
  },
  {
    "path": "examples/react-app-blog/package.json",
    "chars": 688,
    "preview": "{\n  \"private\": true,\n  \"name\": \"@phenomic/example-react-app-blog\",\n  \"version\": \"1.0.0\",\n  \"devDependencies\": {\n    \"@ph"
  },
  {
    "path": "examples/react-app-blog/public/robots.txt",
    "chars": 24,
    "preview": "User-agent: *\nDisallow:\n"
  },
  {
    "path": "examples/react-app-blog/src/ActivityIndicator.js",
    "chars": 1747,
    "preview": "// @flow\n\nimport * as React from \"react\";\nimport TopBarProgressIndicator from \"react-topbar-progress-indicator\";\n\nTopBar"
  },
  {
    "path": "examples/react-app-blog/src/Footer.js",
    "chars": 1437,
    "preview": "// @flow\n\nimport * as React from \"react\";\nimport { Link } from \"@phenomic/preset-react-app/lib/client\";\n\nimport pkg from"
  },
  {
    "path": "examples/react-app-blog/src/Header.js",
    "chars": 3966,
    "preview": "// @flow\n\nimport * as React from \"react\";\nimport { Link } from \"@phenomic/preset-react-app/lib/client\";\n\nimport pkg from"
  },
  {
    "path": "examples/react-app-blog/src/LatestPosts.js",
    "chars": 2324,
    "preview": "// @flow\n\nimport * as React from \"react\";\nimport { Link } from \"@phenomic/preset-react-app/lib/client\";\n\nconst LatestPos"
  },
  {
    "path": "examples/react-app-blog/src/Layout.js",
    "chars": 2194,
    "preview": "// @flow\n\nimport * as React from \"react\";\nimport Head from \"react-helmet\";\n\nimport Header from \"./Header.js\";\nimport Foo"
  },
  {
    "path": "examples/react-app-blog/src/Page.js",
    "chars": 1535,
    "preview": "// @flow\n\nimport * as React from \"react\";\nimport {\n  withPhenomicApi,\n  query,\n  BodyRenderer,\n} from \"@phenomic/preset-"
  },
  {
    "path": "examples/react-app-blog/src/PageBlog.js",
    "chars": 1219,
    "preview": "// @flow\n\nimport * as React from \"react\";\nimport { withPhenomicApi, query } from \"@phenomic/preset-react-app/lib/client\""
  },
  {
    "path": "examples/react-app-blog/src/PageBlogPost.js",
    "chars": 747,
    "preview": "// @flow\n\nimport * as React from \"react\";\nimport { withPhenomicApi, query } from \"@phenomic/preset-react-app/lib/client\""
  },
  {
    "path": "examples/react-app-blog/src/PageError.js",
    "chars": 1644,
    "preview": "// @flow\n\nimport * as React from \"react\";\n\nimport Layout from \"./Layout\";\n\nconst PageError = ({ error } /*: { error?: Ob"
  },
  {
    "path": "examples/react-app-blog/src/PageRepositories.js",
    "chars": 5547,
    "preview": "// @flow\n\nimport * as React from \"react\";\nimport jsonFetch from \"simple-json-fetch\";\nimport { withInitialProps, Link } f"
  },
  {
    "path": "examples/react-app-blog/src/PostLayoutDefault.js",
    "chars": 828,
    "preview": "// @flow\n\nimport * as React from \"react\";\nimport Head from \"react-helmet\";\nimport {\n  BodyRenderer,\n  textRenderer,\n} fr"
  },
  {
    "path": "examples/react-app-blog/src/PostLayoutNoHero.js",
    "chars": 840,
    "preview": "// @flow\n\nimport * as React from \"react\";\nimport Head from \"react-helmet\";\nimport {\n  BodyRenderer,\n  textRenderer,\n} fr"
  },
  {
    "path": "examples/react-app-getting-started/App.js",
    "chars": 3735,
    "preview": "// @flow\n\nimport * as React from \"react\";\nimport Head from \"react-helmet\";\nimport { Router, Route, browserHistory, Link "
  },
  {
    "path": "examples/react-app-getting-started/Html.js",
    "chars": 967,
    "preview": "// @flow\n\nimport * as React from \"react\";\nimport Head from \"react-helmet\";\n\nexport default ({ App, render }: PhenomicHtm"
  },
  {
    "path": "examples/react-app-getting-started/README.md",
    "chars": 267,
    "preview": "# Getting Started with Phenomic + React preset\n\nYou can find the complete tutorial of this example in\n[phenomic/packages"
  },
  {
    "path": "examples/react-app-getting-started/__tests__/__snapshots__/index.js.snap",
    "chars": 1381,
    "preview": "// Jest Snapshot v1, https://goo.gl/fbAQLP\n\nexports[`should build example correctly 1`] = `\nArray [\n  \"after/c2Vjb25kLXB"
  },
  {
    "path": "examples/react-app-getting-started/__tests__/index.js",
    "chars": 1552,
    "preview": "// @flow\n\n/* eslint-disable import/no-extraneous-dependencies */\nimport path from \"path\";\nimport fs from \"fs\";\n\nimport g"
  },
  {
    "path": "examples/react-app-getting-started/content/posts/fifth-post.md",
    "chars": 306,
    "preview": "---\ntitle: \"Fifth post\"\ndate: \"2017-01-05\"\nlayout: hero\n---\n\nAnother post that have a [link to the first one](../first-p"
  },
  {
    "path": "examples/react-app-getting-started/content/posts/first-post.md",
    "chars": 473,
    "preview": "---\ntitle: \"First post\"\ndate: \"2017-01-01\"\n---\n\n# This is a [Markdown](https://en.wikipedia.org/wiki/Markdown#Example) f"
  },
  {
    "path": "examples/react-app-getting-started/content/posts/fourth-post.md",
    "chars": 62,
    "preview": "---\ntitle: \"Fourth post\"\ndate: \"2017-01-04\"\n---\n\nAnother post\n"
  },
  {
    "path": "examples/react-app-getting-started/content/posts/second-post.md",
    "chars": 62,
    "preview": "---\ntitle: \"Second post\"\ndate: \"2017-01-02\"\n---\n\nAnother post\n"
  },
  {
    "path": "examples/react-app-getting-started/content/posts/third-post.md",
    "chars": 61,
    "preview": "---\ntitle: \"Third post\"\ndate: \"2017-01-03\"\n---\n\nAnother post\n"
  },
  {
    "path": "examples/react-app-getting-started/package.json",
    "chars": 507,
    "preview": "{\n  \"private\": true,\n  \"name\": \"@phenomic/example-react-app-getting-started\",\n  \"version\": \"1.0.0\",\n  \"devDependencies\":"
  },
  {
    "path": "examples/react-app-getting-started/public/robots.txt",
    "chars": 24,
    "preview": "User-agent: *\nDisallow:\n"
  },
  {
    "path": "examples/react-app-markdown-with-custom-components/App.js",
    "chars": 2182,
    "preview": "// @noflow\n\nimport * as React from \"react\";\nimport { Router, Route, browserHistory } from \"react-router\";\nimport {\n  cre"
  },
  {
    "path": "examples/react-app-markdown-with-custom-components/README.md",
    "chars": 689,
    "preview": "# React app: markdown with custom components\n\nThis example show you own to render normal and custom html tags as your ow"
  },
  {
    "path": "examples/react-app-markdown-with-custom-components/__tests__/index.js",
    "chars": 676,
    "preview": "// @flow\n\n/* eslint-disable import/no-extraneous-dependencies */\nimport path from \"path\";\nimport fs from \"fs\";\n\nit(\"shou"
  },
  {
    "path": "examples/react-app-markdown-with-custom-components/content/index.md",
    "chars": 638,
    "preview": "---\ntitle: \"This is a Markdown file\"\n---\n\nBut with some <strong>custom html tags</strong>. <Strong>But be careful, all\nt"
  },
  {
    "path": "examples/react-app-markdown-with-custom-components/package.json",
    "chars": 493,
    "preview": "{\n  \"private\": true,\n  \"name\": \"@phenomic/example-react-app-markdown-with-custom-components\",\n  \"version\": \"1.0.0\",\n  \"d"
  },
  {
    "path": "examples/react-app-minimal-hello-world/App.js",
    "chars": 512,
    "preview": "// @flow\n\nimport * as React from \"react\";\nimport { Router, Route, browserHistory } from \"react-router\";\nimport { createA"
  },
  {
    "path": "examples/react-app-minimal-hello-world/__tests__/__snapshots__/index.js.snap",
    "chars": 239,
    "preview": "// Jest Snapshot v1, https://goo.gl/fbAQLP\n\nexports[`should build example correctly 1`] = `\nArray [\n  \"index.html\",\n]\n`;"
  },
  {
    "path": "examples/react-app-minimal-hello-world/__tests__/index.js",
    "chars": 1040,
    "preview": "// @flow\n\n/* eslint-disable import/no-extraneous-dependencies */\nimport globby from \"globby\";\n\nit(\"should build example "
  },
  {
    "path": "examples/react-app-minimal-hello-world/package.json",
    "chars": 481,
    "preview": "{\n  \"private\": true,\n  \"name\": \"@phenomic/example-react-app-minimal-hello-world\",\n  \"version\": \"1.0.0\",\n  \"devDependenci"
  },
  {
    "path": "examples/react-app-styles-with-aphrodite/App.js",
    "chars": 852,
    "preview": "// @flow\n\nimport * as React from \"react\";\nimport { Router, Route, browserHistory } from \"react-router\";\nimport { createA"
  },
  {
    "path": "examples/react-app-styles-with-aphrodite/Html.js",
    "chars": 678,
    "preview": "// @flow\n\nimport * as React from \"react\";\nimport { StyleSheetServer } from \"aphrodite/no-important\";\n\nexport default ({ "
  },
  {
    "path": "examples/react-app-styles-with-aphrodite/__tests__/index.js",
    "chars": 654,
    "preview": "// @flow\n\n/* eslint-disable import/no-extraneous-dependencies */\nimport path from \"path\";\nimport fs from \"fs\";\n\nit(\"shou"
  },
  {
    "path": "examples/react-app-styles-with-aphrodite/package.json",
    "chars": 510,
    "preview": "{\n  \"private\": true,\n  \"name\": \"@phenomic/example-react-app-styles-with-aphrodite\",\n  \"version\": \"1.0.0\",\n  \"devDependen"
  },
  {
    "path": "examples/react-app-styles-with-css/App.js",
    "chars": 385,
    "preview": "// @flow\n\nimport * as React from \"react\";\nimport { Router, Route, browserHistory } from \"react-router\";\nimport { createA"
  },
  {
    "path": "examples/react-app-styles-with-css/__tests__/__snapshots__/index.js.snap",
    "chars": 135,
    "preview": "// Jest Snapshot v1, https://goo.gl/fbAQLP\n\nexports[`should build example correctly 1`] = `\n\".helloWorld {\n  font-size: "
  },
  {
    "path": "examples/react-app-styles-with-css/__tests__/index.js",
    "chars": 697,
    "preview": "// @flow\n\nimport fs from \"fs\";\nimport path from \"path\";\n\n/* eslint-disable import/no-extraneous-dependencies */\nimport g"
  },
  {
    "path": "examples/react-app-styles-with-css/package.json",
    "chars": 477,
    "preview": "{\n  \"private\": true,\n  \"name\": \"@phenomic/example-react-app-styles-with-css\",\n  \"version\": \"1.0.0\",\n  \"devDependencies\":"
  },
  {
    "path": "examples/react-app-styles-with-css/styles.css",
    "chars": 36,
    "preview": ".helloWorld {\n  font-size: 40rem;\n}\n"
  },
  {
    "path": "examples/react-app-styles-with-css-inlined-in-head/App.js",
    "chars": 385,
    "preview": "// @flow\n\nimport * as React from \"react\";\nimport { Router, Route, browserHistory } from \"react-router\";\nimport { createA"
  },
  {
    "path": "examples/react-app-styles-with-css-inlined-in-head/Html.js",
    "chars": 1125,
    "preview": "// @flow\n\nimport fs from \"fs\";\n\nimport * as React from \"react\";\n\n// memory to avoid reading a css file already read\n// @"
  },
  {
    "path": "examples/react-app-styles-with-css-inlined-in-head/__tests__/index.js",
    "chars": 370,
    "preview": "// @flow\n\n/* eslint-disable import/no-extraneous-dependencies */\nimport path from \"path\";\nimport fs from \"fs\";\n\nit(\"shou"
  },
  {
    "path": "examples/react-app-styles-with-css-inlined-in-head/package.json",
    "chars": 493,
    "preview": "{\n  \"private\": true,\n  \"name\": \"@phenomic/example-react-app-styles-with-css-inlined-in-head\",\n  \"version\": \"1.0.0\",\n  \"d"
  },
  {
    "path": "examples/react-app-styles-with-css-inlined-in-head/styles.css",
    "chars": 36,
    "preview": ".helloWorld {\n  font-size: 40rem;\n}\n"
  },
  {
    "path": "examples/react-app-styles-with-emotion/App.js",
    "chars": 803,
    "preview": "// @flow\n\nimport React from \"react\";\nimport { Router, Route, browserHistory } from \"react-router\";\nimport { createApp } "
  },
  {
    "path": "examples/react-app-styles-with-emotion/Html.js",
    "chars": 609,
    "preview": "// @flow\n\nimport * as React from \"react\";\nimport { extractCritical } from \"emotion-server\";\n\nexport default ({ App, rend"
  },
  {
    "path": "examples/react-app-styles-with-emotion/__tests__/index.js",
    "chars": 654,
    "preview": "// @flow\n\n/* eslint-disable import/no-extraneous-dependencies */\nimport path from \"path\";\nimport fs from \"fs\";\n\nit(\"shou"
  },
  {
    "path": "examples/react-app-styles-with-emotion/package.json",
    "chars": 569,
    "preview": "{\n  \"private\": true,\n  \"name\": \"@phenomic/example-react-app-styles-with-emotion\",\n  \"version\": \"1.0.0\",\n  \"devDependenci"
  },
  {
    "path": "examples/react-app-styles-with-glamor/App.js",
    "chars": 710,
    "preview": "// @flow\n\nimport * as React from \"react\";\nimport { Router, Route, browserHistory } from \"react-router\";\nimport { createA"
  },
  {
    "path": "examples/react-app-styles-with-glamor/Html.js",
    "chars": 623,
    "preview": "// @flow\n\nimport * as React from \"react\";\nimport { renderStaticOptimized } from \"glamor/server\";\n\nexport default ({ App,"
  },
  {
    "path": "examples/react-app-styles-with-glamor/__tests__/index.js",
    "chars": 654,
    "preview": "// @flow\n\n/* eslint-disable import/no-extraneous-dependencies */\nimport path from \"path\";\nimport fs from \"fs\";\n\nit(\"shou"
  },
  {
    "path": "examples/react-app-styles-with-glamor/package.json",
    "chars": 504,
    "preview": "{\n  \"private\": true,\n  \"name\": \"@phenomic/example-react-app-styles-with-glamor\",\n  \"version\": \"1.0.0\",\n  \"devDependencie"
  },
  {
    "path": "examples/react-app-styles-with-glamorous/App.js",
    "chars": 749,
    "preview": "// @flow\n\nimport * as React from \"react\";\nimport { Router, Route, browserHistory } from \"react-router\";\nimport { createA"
  },
  {
    "path": "examples/react-app-styles-with-glamorous/Html.js",
    "chars": 623,
    "preview": "// @flow\n\nimport * as React from \"react\";\nimport { renderStaticOptimized } from \"glamor/server\";\n\nexport default ({ App,"
  },
  {
    "path": "examples/react-app-styles-with-glamorous/__tests__/index.js",
    "chars": 654,
    "preview": "// @flow\n\n/* eslint-disable import/no-extraneous-dependencies */\nimport path from \"path\";\nimport fs from \"fs\";\n\nit(\"shou"
  },
  {
    "path": "examples/react-app-styles-with-glamorous/package.json",
    "chars": 534,
    "preview": "{\n  \"private\": true,\n  \"name\": \"@phenomic/example-react-app-styles-with-glamorous\",\n  \"version\": \"1.0.0\",\n  \"devDependen"
  },
  {
    "path": "examples/react-app-styles-with-radium/App.js",
    "chars": 843,
    "preview": "// @flow\n\nimport * as React from \"react\";\nimport { Router, Route, browserHistory } from \"react-router\";\nimport { createA"
  },
  {
    "path": "examples/react-app-styles-with-radium/Html.js",
    "chars": 359,
    "preview": "// @flow\n\nimport * as React from \"react\";\nimport { StyleRoot } from \"radium\";\n\nexport default ({ App, render }: Phenomic"
  },
  {
    "path": "examples/react-app-styles-with-radium/__tests__/index.js",
    "chars": 654,
    "preview": "// @flow\n\n/* eslint-disable import/no-extraneous-dependencies */\nimport path from \"path\";\nimport fs from \"fs\";\n\nit(\"shou"
  },
  {
    "path": "examples/react-app-styles-with-radium/package.json",
    "chars": 505,
    "preview": "{\n  \"private\": true,\n  \"name\": \"@phenomic/example-react-app-styles-with-radium\",\n  \"version\": \"1.0.0\",\n  \"devDependencie"
  },
  {
    "path": "examples/react-app-styles-with-styled-components/App.js",
    "chars": 617,
    "preview": "// @flow\n\nimport * as React from \"react\";\nimport { Router, Route, browserHistory } from \"react-router\";\nimport { createA"
  },
  {
    "path": "examples/react-app-styles-with-styled-components/Html.js",
    "chars": 439,
    "preview": "// @flow\n\nimport * as React from \"react\";\nimport { ServerStyleSheet } from \"styled-components\";\n\nexport default ({ App, "
  },
  {
    "path": "examples/react-app-styles-with-styled-components/__tests__/index.js",
    "chars": 654,
    "preview": "// @flow\n\n/* eslint-disable import/no-extraneous-dependencies */\nimport path from \"path\";\nimport fs from \"fs\";\n\nit(\"shou"
  },
  {
    "path": "examples/react-app-styles-with-styled-components/package.json",
    "chars": 526,
    "preview": "{\n  \"private\": true,\n  \"name\": \"@phenomic/example-react-app-styles-with-styled-components\",\n  \"version\": \"1.0.0\",\n  \"dev"
  },
  {
    "path": "examples/react-app-with-basename/App.js",
    "chars": 1194,
    "preview": "// @flow\n\nimport * as React from \"react\";\nimport { Router, Route, useRouterHistory } from \"react-router\";\n// default (br"
  },
  {
    "path": "examples/react-app-with-basename/__tests__/index.js",
    "chars": 599,
    "preview": "// @flow\n\n/* eslint-disable import/no-extraneous-dependencies */\nimport path from \"path\";\nimport fs from \"fs\";\n\nit(\"shou"
  },
  {
    "path": "examples/react-app-with-basename/content/test.md",
    "chars": 13,
    "preview": "I am a test!\n"
  },
  {
    "path": "examples/react-app-with-basename/package.json",
    "chars": 522,
    "preview": "{\n  \"private\": true,\n  \"name\": \"@phenomic/example-react-app-with-basename\",\n  \"version\": \"1.0.0\",\n  \"devDependencies\": {"
  },
  {
    "path": "examples/react-native-web-app/App.js",
    "chars": 957,
    "preview": "// @flow\n\nimport * as React from \"react\";\nimport { Router, Route, browserHistory } from \"react-router\";\nimport { createA"
  },
  {
    "path": "examples/react-native-web-app/Html.js",
    "chars": 948,
    "preview": "// @flow\n\nimport * as React from \"react\";\nimport Head from \"react-helmet\";\nimport { AppRegistry } from \"react-native-web"
  },
  {
    "path": "examples/react-native-web-app/__tests__/index.js",
    "chars": 1408,
    "preview": "// @flow\n\n/* eslint-disable import/no-extraneous-dependencies */\nimport path from \"path\";\nimport fs from \"fs\";\n\nit(\"shou"
  },
  {
    "path": "examples/react-native-web-app/package.json",
    "chars": 530,
    "preview": "{\n  \"private\": true,\n  \"name\": \"@phenomic/example-react-native-app\",\n  \"version\": \"1.0.0\",\n  \"devDependencies\": {\n    \"@"
  },
  {
    "path": "examples/reason-react-app/App.js",
    "chars": 1009,
    "preview": "// @flow\n\nimport * as React from \"react\";\nimport { Router, Route, browserHistory } from \"react-router\";\nimport { createA"
  },
  {
    "path": "examples/reason-react-app/README.md",
    "chars": 475,
    "preview": "# Getting Started with Phenomic + React preset + ReasonML\n\n⚠️ _WIP, but totally usable._\n\nTo run this example, just copy"
  },
  {
    "path": "examples/reason-react-app/__tests__/__snapshots__/index.js.snap",
    "chars": 1359,
    "preview": "// Jest Snapshot v1, https://goo.gl/fbAQLP\n\nexports[`should build example correctly 1`] = `\nArray [\n  \"404.html\",\n  \"aft"
  },
  {
    "path": "examples/reason-react-app/__tests__/index.js",
    "chars": 1040,
    "preview": "// @flow\n\n/* eslint-disable import/no-extraneous-dependencies */\nimport globby from \"globby\";\n\nit(\"should build example "
  },
  {
    "path": "examples/reason-react-app/bsconfig.json",
    "chars": 422,
    "preview": "{\n  \"name\": \"@phenomic/example-reason-react-app\",\n  \"refmt\": 3,\n  \"reason\": {\n    \"react-jsx\": 3\n  },\n  \"suffix\": \".bs.j"
  },
  {
    "path": "examples/reason-react-app/content/posts/fifth-post.md",
    "chars": 306,
    "preview": "---\ntitle: \"Fifth post\"\ndate: \"2017-01-05\"\nlayout: hero\n---\n\nAnother post that have a [link to the first one](../first-p"
  },
  {
    "path": "examples/reason-react-app/content/posts/first-post.md",
    "chars": 473,
    "preview": "---\ntitle: \"First post\"\ndate: \"2017-01-01\"\n---\n\n# This is a [Markdown](https://en.wikipedia.org/wiki/Markdown#Example) f"
  },
  {
    "path": "examples/reason-react-app/content/posts/fourth-post.md",
    "chars": 62,
    "preview": "---\ntitle: \"Fourth post\"\ndate: \"2017-01-04\"\n---\n\nAnother post\n"
  },
  {
    "path": "examples/reason-react-app/content/posts/second-post.md",
    "chars": 62,
    "preview": "---\ntitle: \"Second post\"\ndate: \"2017-01-02\"\n---\n\nAnother post\n"
  },
  {
    "path": "examples/reason-react-app/content/posts/third-post.md",
    "chars": 61,
    "preview": "---\ntitle: \"Third post\"\ndate: \"2017-01-03\"\n---\n\nAnother post\n"
  },
  {
    "path": "examples/reason-react-app/package.json",
    "chars": 911,
    "preview": "{\n  \"private\": true,\n  \"name\": \"@phenomic/example-reason-react-app\",\n  \"devDependencies\": {\n    \"@moox/bs-react-helmet\":"
  },
  {
    "path": "examples/reason-react-app/src/Helpers.re",
    "chars": 163,
    "preview": "let nothing = React.null;\n\nlet text = React.string;\n\nlet list = list => list |> Array.of_list |> React.array;\n\nlet nodeL"
  },
  {
    "path": "examples/reason-react-app/src/Types.re",
    "chars": 328,
    "preview": "type partialPost = {\n  .\n  \"id\": string,\n  \"title\": string,\n};\n\ntype posts =\n  PhenomicPresetReactApp.edge(\n    Phenomic"
  },
  {
    "path": "examples/reason-react-app/src/components/ErrorPage.re",
    "chars": 282,
    "preview": "open Helpers;\n\n[@react.component]\nlet make = (~message: option(string)=?, _) => {\n  <div style={ReactDOMRe.Style.make(~f"
  },
  {
    "path": "examples/reason-react-app/src/components/Home.re",
    "chars": 2015,
    "preview": "open Helpers;\n\n[@react.component]\nlet make = (~posts) => {\n  let posts' = PhenomicPresetReactApp.jsEdge(posts);\n  <div>\n"
  },
  {
    "path": "examples/reason-react-app/src/components/Post.re",
    "chars": 686,
    "preview": "open Helpers;\n\n[@react.component]\nlet make = (~post) => {\n  let post' = PhenomicPresetReactApp.jsEdge(post);\n  <div>\n   "
  },
  {
    "path": "flow-typed/.eslintrc",
    "chars": 143,
    "preview": "{\n  \"rules\": {\n    \"flowtype/require-valid-file-annotation\": 0,\n    \"flowtype/require-exact-type\": 0,\n    \"flowtype/no-m"
  },
  {
    "path": "flow-typed/handmade/cross-fetch_v2.x.x.js",
    "chars": 224,
    "preview": "declare module \"cross-fetch\" {\n  declare module.exports: (\n    input: string | Request | URL,\n    init?: RequestOptions,"
  },
  {
    "path": "flow-typed/handmade/deepmerge.js",
    "chars": 96,
    "preview": "declare module \"deepmerge\" {\n  declare module.exports: (obj: Object, obj2: Object) => Object;\n}\n"
  },
  {
    "path": "flow-typed/handmade/fb-watchman.js",
    "chars": 769,
    "preview": "export type Watch = {};\n\nexport type CommandResponse = {\n  watch: Watch,\n  relative_path: string,\n};\n\nexport type Subscr"
  },
  {
    "path": "flow-typed/handmade/find-cache-dir.js",
    "chars": 286,
    "preview": "type findCacheDirOptions = {|\n  name?: string,\n  files?: Array<string>,\n  cwd?: string,\n  create?: boolean,\n  thunk?: bo"
  },
  {
    "path": "flow-typed/handmade/fs-extra.js",
    "chars": 281,
    "preview": "declare module \"fs-extra\" {\n  declare interface fsExtra {\n    emptyDirSync: (from: string, to: string) => void;\n    copy"
  },
  {
    "path": "flow-typed/handmade/fs-promise.js",
    "chars": 294,
    "preview": "declare module \"fs-promise\" {\n  declare function writeFile(to: string, content: string): Promise<any>;\n  declare functio"
  },
  {
    "path": "flow-typed/handmade/globby.js",
    "chars": 288,
    "preview": "declare module \"globby\" {\n  declare type pattern = string | Array<string>;\n  declare type async = (\n    pattern: pattern"
  },
  {
    "path": "flow-typed/handmade/gray-matter.js",
    "chars": 178,
    "preview": "type GrayMatterResult = {\n  orig: string,\n  data: Object,\n  content: string,\n};\n\ndeclare module \"gray-matter\" {\n  declar"
  },
  {
    "path": "flow-typed/handmade/js-beautify.js",
    "chars": 750,
    "preview": "type Options = {\n  indent_size: number,\n  indent_char: string,\n  eol: string,\n  indent_level: number,\n  indent_with_tabs"
  },
  {
    "path": "flow-typed/handmade/jsx-test-helpers-v1.x.x.js",
    "chars": 343,
    "preview": "/* eslint-disable */\ndeclare module \"jsx-test-helpers\" {\n  declare module.exports: {\n    concatPath: (dirA: string, dirB"
  },
  {
    "path": "flow-typed/handmade/loader-utils.js",
    "chars": 166,
    "preview": "declare module \"loader-utils\" {\n  declare interface LoaderUtils {\n    getOptions: Function;\n    getHashDigest: Function;"
  },
  {
    "path": "flow-typed/handmade/log-symbols.js",
    "chars": 145,
    "preview": "declare module \"log-symbols\" {\n  declare module.exports: {\n    info: string,\n    success: string,\n    warning: string,\n "
  },
  {
    "path": "flow-typed/handmade/lru-memoize.js",
    "chars": 202,
    "preview": "declare module \"lru-memoize\" {\n  declare function memoizeInstance(func: Function): Function;\n  declare function memoize("
  },
  {
    "path": "flow-typed/handmade/mkdirp.js",
    "chars": 108,
    "preview": "declare module \"mkdirp\" {\n  declare module.exports: (path: string, callback: (err: any) => void) => void;\n}\n"
  },
  {
    "path": "flow-typed/handmade/multili.js",
    "chars": 73,
    "preview": "declare module \"multili\" {\n  declare module.exports: string => string;\n}\n"
  },
  {
    "path": "flow-typed/handmade/node-object-hash.js",
    "chars": 337,
    "preview": "type NodeObjectHashConfig = {\n  coerce?: string,\n  sort?: boolean,\n  alg?: string,\n  enc?: string,\n};\n\ndeclare function "
  },
  {
    "path": "flow-typed/handmade/ora.js",
    "chars": 790,
    "preview": "type oraColors =\n  | \"black\"\n  | \"red\"\n  | \"green\"\n  | \"yellow\"\n  | \"blue\"\n  | \"magenta\"\n  | \"cyan\"\n  | \"white\"\n  | \"gra"
  },
  {
    "path": "flow-typed/handmade/pify.js",
    "chars": 125,
    "preview": "declare module \"pify\" {\n  declare class Pify {\n    (callback: Function | Object): any;\n  }\n  declare module.exports: Pif"
  },
  {
    "path": "flow-typed/handmade/react-helmet_v5.x.x.js",
    "chars": 1375,
    "preview": "declare module \"react-helmet\" {\n  declare type Props = {\n    base?: Object,\n    bodyAttributes?: Object,\n    children?: "
  },
  {
    "path": "flow-typed/handmade/react-router-scroll.js",
    "chars": 323,
    "preview": "type useScroll = (\n  shouldUpdateScroll?: (\n    prevRouterProps: Object | null,\n    routerProps: Object,\n  ) => boolean "
  },
  {
    "path": "flow-typed/handmade/remark.js",
    "chars": 406,
    "preview": "declare module \"remark\" {\n  declare interface remarkInstance {\n    use: (plugin: Function, options?: Object) => remarkIn"
  },
  {
    "path": "flow-typed/handmade/sane.js",
    "chars": 424,
    "preview": "declare module \"sane\" {\n  declare type SaneCallbackType = (\n    filepath: string,\n    root: string,\n    stat: Object,\n  "
  },
  {
    "path": "flow-typed/handmade/semver.js",
    "chars": 163,
    "preview": "declare module \"semver\" {\n  declare interface Semver {\n    satisfies: (requirement?: string, version: string) => boolean"
  },
  {
    "path": "flow-typed/handmade/simple-json-fetch.js",
    "chars": 153,
    "preview": "declare module \"simple-json-fetch\" {\n  declare class SimpleJsonFetch {\n    (uri: string): Promise<any>;\n  }\n  declare mo"
  },
  {
    "path": "flow-typed/handmade/strip-markdown.js",
    "chars": 74,
    "preview": "declare module \"strip-markdown\" {\n  declare module.exports: () => void;\n}\n"
  },
  {
    "path": "flow-typed/handmade/striptags.js",
    "chars": 75,
    "preview": "declare module \"striptags\" {\n  declare module.exports: string => string;\n}\n"
  },
  {
    "path": "flow-typed/handmade/url-join.js",
    "chars": 203,
    "preview": "declare module \"url-join\" {\n  declare module.exports: // @todo can we defined unlimited arguments? Didn't find how to in"
  },
  {
    "path": "flow-typed/handmade/webpack-dev-middleware.js",
    "chars": 142,
    "preview": "declare module \"webpack-dev-middleware\" {\n  declare module.exports: (\n    compiler: Object,\n    options: Object,\n  ) => "
  },
  {
    "path": "flow-typed/handmade/webpack-hot-middleware.js",
    "chars": 142,
    "preview": "declare module \"webpack-hot-middleware\" {\n  declare module.exports: (\n    compiler: Object,\n    options: Object,\n  ) => "
  },
  {
    "path": "flow-typed/handmade/webpack-sources.js",
    "chars": 189,
    "preview": "/* eslint-disable no-unused-vars */\ntype SourceType = Object;\n\ntype RawSourceType = (s: string) => SourceType;\n\ndeclare "
  },
  {
    "path": "flow-typed/handmade/webpack.js",
    "chars": 127,
    "preview": "/* eslint-disable */\n\ndeclare var module: {\n  hot: {\n    accept(arg1: string | (() => void), arg2?: () => void): void,\n "
  },
  {
    "path": "flow-typed/handmade/webpack_v4.x.x.js",
    "chars": 12670,
    "preview": "declare module \"webpack\" {\n  declare class WebpackError extends Error {\n    constructor(message: string): WebpackError;\n"
  },
  {
    "path": "flow-typed/npm/aphrodite_vx.x.x.js",
    "chars": 7589,
    "preview": "// flow-typed signature: 89f8074b9679446826e4641701539150\n// flow-typed version: <<STUB>>/aphrodite_v1/flow_v0.68.0\n\n/**"
  },
  {
    "path": "flow-typed/npm/asciidoctor.js_vx.x.x.js",
    "chars": 885,
    "preview": "// flow-typed signature: 2c8f0b37c34ec9310b26eae1f00ab18c\n// flow-typed version: <<STUB>>/asciidoctor.js_v1/flow_v0.68.0"
  },
  {
    "path": "flow-typed/npm/chalk_v1.x.x.js",
    "chars": 3276,
    "preview": "// flow-typed signature: f965116cdb881170be8c42b10554e195\n// flow-typed version: da30fe6876/chalk_v1.x.x/flow_>=v0.25.x\n"
  },
  {
    "path": "flow-typed/npm/classnames_v2.x.x.js",
    "chars": 557,
    "preview": "// flow-typed signature: cf86673cc32d185bdab1d2ea90578d37\n// flow-typed version: 614bf49aa8/classnames_v2.x.x/flow_>=v0."
  },
  {
    "path": "flow-typed/npm/cosmiconfig_vx.x.x.js",
    "chars": 1641,
    "preview": "// flow-typed signature: f920f3d9c66f46197d121928b5687b7f\n// flow-typed version: <<STUB>>/cosmiconfig_v2/flow_v0.68.0\n\n/"
  },
  {
    "path": "flow-typed/npm/cross-env_vx.x.x.js",
    "chars": 1397,
    "preview": "// flow-typed signature: 5592a3bd3fba4d66706ebee20bf1280d\n// flow-typed version: <<STUB>>/cross-env_v^2.0.0/flow_v0.87.0"
  },
  {
    "path": "flow-typed/npm/cross-spawn_vx.x.x.js",
    "chars": 2342,
    "preview": "// flow-typed signature: 5ea03c16184806e3c98b03eed7c47337\n// flow-typed version: <<STUB>>/cross-spawn_v^5.1.0/flow_v0.87"
  },
  {
    "path": "flow-typed/npm/debug_v2.x.x.js",
    "chars": 871,
    "preview": "// flow-typed signature: c7b1e1d8d9c2230d131299ddc21dcb0e\n// flow-typed version: da30fe6876/debug_v2.x.x/flow_>=v0.28.x\n"
  },
  {
    "path": "flow-typed/npm/deep-assign_vx.x.x.js",
    "chars": 848,
    "preview": "// flow-typed signature: 56848df4dc23d9f45badc6098dd064d6\n// flow-typed version: <<STUB>>/deep-assign_v2/flow_v0.68.0\n\n/"
  },
  {
    "path": "flow-typed/npm/deepmerge_v1.x.x.js",
    "chars": 734,
    "preview": "// flow-typed signature: 53efc5e11191657e0f219f18bbef00b0\n// flow-typed version: 498f273a60/deepmerge_v1.x.x/flow_>=v0.2"
  },
  {
    "path": "flow-typed/npm/dotenv-expand_vx.x.x.js",
    "chars": 855,
    "preview": "// flow-typed signature: cd4c691226d8e9c1a0f86fb74504ac5f\n// flow-typed version: <<STUB>>/dotenv-expand_v4/flow_v0.68.0\n"
  },
  {
    "path": "flow-typed/npm/dotenv_vx.x.x.js",
    "chars": 971,
    "preview": "// flow-typed signature: f8fcb1a175e52bcb883a8110dd6de9fd\n// flow-typed version: <<STUB>>/dotenv_v5/flow_v0.68.0\n\n/**\n *"
  },
  {
    "path": "flow-typed/npm/emotion-server_vx.x.x.js",
    "chars": 1055,
    "preview": "// flow-typed signature: a781c6219ddaa0af4db7a583c351bacc\n// flow-typed version: <<STUB>>/emotion-server_v8/flow_v0.68.0"
  },
  {
    "path": "flow-typed/npm/emotion_vx.x.x.js",
    "chars": 1717,
    "preview": "// flow-typed signature: e4c6a1c8759d02fd57241bf07b66babe\n// flow-typed version: <<STUB>>/emotion_v8/flow_v0.68.0\n\n/**\n "
  },
  {
    "path": "flow-typed/npm/eslint-config-i-am-meticulous_vx.x.x.js",
    "chars": 2610,
    "preview": "// flow-typed signature: f1015b4058088a70464b6abe8b2ab82c\n// flow-typed version: <<STUB>>/eslint-config-i-am-meticulous_"
  },
  {
    "path": "flow-typed/npm/eslint-import-resolver-webpack_vx.x.x.js",
    "chars": 1216,
    "preview": "// flow-typed signature: 8ec014d2b5af0269c2437feb86644db4\n// flow-typed version: <<STUB>>/eslint-import-resolver-webpack"
  },
  {
    "path": "flow-typed/npm/eslint-plugin-flowtype_vx.x.x.js",
    "chars": 17214,
    "preview": "// flow-typed signature: 597292a8691e14e15770175229d1cbfa\n// flow-typed version: <<STUB>>/eslint-plugin-flowtype_v^3.0.0"
  },
  {
    "path": "flow-typed/npm/eslint-plugin-import_vx.x.x.js",
    "chars": 11863,
    "preview": "// flow-typed signature: ccc7ba0bf95d87710a29359bda9e3043\n// flow-typed version: <<STUB>>/eslint-plugin-import_v^2.7.0/f"
  },
  {
    "path": "flow-typed/npm/eslint-plugin-react-native_vx.x.x.js",
    "chars": 3199,
    "preview": "// flow-typed signature: 3616666ab5e73c1d0e5c267741973d59\n// flow-typed version: <<STUB>>/eslint-plugin-react-native_v^3"
  },
  {
    "path": "flow-typed/npm/eslint-plugin-react_vx.x.x.js",
    "chars": 24945,
    "preview": "// flow-typed signature: 971882a160035f67a36ed630fcc20ee2\n// flow-typed version: <<STUB>>/eslint-plugin-react_v^7.11.0/f"
  },
  {
    "path": "flow-typed/npm/eslint_vx.x.x.js",
    "chars": 76759,
    "preview": "// flow-typed signature: a730ec2f47b90952dbc5e118bb2105a3\n// flow-typed version: <<STUB>>/eslint_v^5.7.0/flow_v0.87.0\n\n/"
  },
  {
    "path": "flow-typed/npm/express_v4.x.x.js",
    "chars": 9483,
    "preview": "import * as http from \"http\";\nimport type { Socket } from \"net\";\n\ndeclare type express$RouterOptions = {\n  caseSensitive"
  },
  {
    "path": "flow-typed/npm/flow-bin_v0.x.x.js",
    "chars": 188,
    "preview": "// flow-typed signature: 6a5610678d4b01e13bbfbbc62bdaf583\n// flow-typed version: 3817bc6980/flow-bin_v0.x.x/flow_>=v0.25"
  },
  {
    "path": "flow-typed/npm/get-port_vx.x.x.js",
    "chars": 827,
    "preview": "// flow-typed signature: 786772ba7faa8bb08a34713f36b54613\n// flow-typed version: <<STUB>>/get-port_v2/flow_v0.68.0\n\n/**\n"
  },
  {
    "path": "flow-typed/npm/git-exec-and-restage_vx.x.x.js",
    "chars": 1574,
    "preview": "// flow-typed signature: 98a9fe7ccb051a9597b6ba2753e9d302\n// flow-typed version: <<STUB>>/git-exec-and-restage_v^1.0.1/f"
  },
  {
    "path": "flow-typed/npm/glamor_vx.x.x.js",
    "chars": 6791,
    "preview": "// flow-typed signature: 30f3e89638978a54c56f2c9e8f161531\n// flow-typed version: <<STUB>>/glamor_v2/flow_v0.68.0\n\n/**\n *"
  },
  {
    "path": "flow-typed/npm/glamorous_vx.x.x.js",
    "chars": 4251,
    "preview": "// flow-typed signature: 433dc714344b18148f9dc98a56d05807\n// flow-typed version: <<STUB>>/glamorous_v4/flow_v0.68.0\n\n/**"
  },
  {
    "path": "flow-typed/npm/globby_vx.x.x.js",
    "chars": 818,
    "preview": "// flow-typed signature: ef2ebb6ecf20c7017d6dc5068d4936d8\n// flow-typed version: <<STUB>>/globby_v^6.1.0/flow_v0.87.0\n\n/"
  },
  {
    "path": "flow-typed/npm/gray-matter_vx.x.x.js",
    "chars": 2345,
    "preview": "// flow-typed signature: 7df1c90ff653ead8008f05b6fa3272d1\n// flow-typed version: <<STUB>>/gray-matter_v3/flow_v0.68.0\n\n/"
  },
  {
    "path": "flow-typed/npm/hast-util-sanitize_vx.x.x.js",
    "chars": 1099,
    "preview": "// flow-typed signature: e6e4d3d9dfe291183010a2049960f362\n// flow-typed version: <<STUB>>/hast-util-sanitize_v1/flow_v0."
  },
  {
    "path": "flow-typed/npm/history_vx.x.x.js",
    "chars": 4714,
    "preview": "// flow-typed signature: a6928b7e0d8976c1c03b7a0bce3d7a64\n// flow-typed version: <<STUB>>/history_v2/flow_v0.68.0\n\n/**\n "
  },
  {
    "path": "flow-typed/npm/hoist-non-react-statics_v2.x.x.js",
    "chars": 375,
    "preview": "declare module \"hoist-non-react-statics\" {\n  /*\n    S - source component statics\n    TP - target component props\n    SP "
  },
  {
    "path": "flow-typed/npm/husky_vx.x.x.js",
    "chars": 1162,
    "preview": "// flow-typed signature: 227d9311f08d54bc586ec3d6310d1e93\n// flow-typed version: <<STUB>>/husky_v^0.13.3/flow_v0.87.0\n\n/"
  },
  {
    "path": "flow-typed/npm/jest_v21.x.x.js",
    "chars": 18353,
    "preview": "// flow-typed signature: 107cf7068b8835594e97f938e8848244\n// flow-typed version: 8b4dd96654/jest_v21.x.x/flow_>=v0.39.x\n"
  },
  {
    "path": "flow-typed/npm/jest_v22.x.x.js",
    "chars": 29554,
    "preview": "// flow-typed signature: 27b6ff5cf910473843da0caf82e362fe\n// flow-typed version: a3709d51ed/jest_v22.x.x/flow_>=v0.39.x\n"
  },
  {
    "path": "flow-typed/npm/lerna_vx.x.x.js",
    "chars": 956,
    "preview": "// flow-typed signature: dea8c2cdb570f5110a2f084f67700a40\n// flow-typed version: <<STUB>>/lerna_v^3.4.0/flow_v0.87.0\n\n/*"
  },
  {
    "path": "flow-typed/npm/lint-staged_vx.x.x.js",
    "chars": 4262,
    "preview": "// flow-typed signature: 52d11ac57e26bd759516e37fd05b87e9\n// flow-typed version: <<STUB>>/lint-staged_v^3.4.0/flow_v0.87"
  },
  {
    "path": "flow-typed/npm/lodash.deburr_vx.x.x.js",
    "chars": 862,
    "preview": "// flow-typed signature: 6c41a57b8e8e804d91fd3df79603ba04\n// flow-typed version: <<STUB>>/lodash.deburr_v4/flow_v0.68.0\n"
  },
  {
    "path": "flow-typed/npm/lodash.flatten_vx.x.x.js",
    "chars": 869,
    "preview": "// flow-typed signature: ee088e07465135c5ff23e4771049cfed\n// flow-typed version: <<STUB>>/lodash.flatten_v4/flow_v0.68.0"
  },
  {
    "path": "flow-typed/npm/lodash.kebabcase_vx.x.x.js",
    "chars": 883,
    "preview": "// flow-typed signature: d4169c8eec47d24767c5b2f549b16fe8\n// flow-typed version: <<STUB>>/lodash.kebabcase_v4/flow_v0.68"
  },
  {
    "path": "flow-typed/npm/npm-run-all_vx.x.x.js",
    "chars": 5688,
    "preview": "// flow-typed signature: 7428d43a1e98b019280134bdaf51cf41\n// flow-typed version: <<STUB>>/npm-run-all_v^3.0.0/flow_v0.87"
  },
  {
    "path": "flow-typed/npm/p-map_vx.x.x.js",
    "chars": 806,
    "preview": "// flow-typed signature: 24d1d061bb4cc7d3bbacacbd5e4aa07c\n// flow-typed version: <<STUB>>/p-map_v1/flow_v0.68.0\n\n/**\n * "
  },
  {
    "path": "flow-typed/npm/prettier_v1.x.x.js",
    "chars": 4944,
    "preview": "// flow-typed signature: 066c92e9ccb5f0711df8d73cbca837d6\n// flow-typed version: 9e32affdbd/prettier_v1.x.x/flow_>=v0.56"
  },
  {
    "path": "flow-typed/npm/prop-types_v15.x.x.js",
    "chars": 1374,
    "preview": "// flow-typed signature: d9a983bb1ac458a256c31c139047bdbb\n// flow-typed version: 927687984d/prop-types_v15.x.x/flow_>=v0"
  }
]

// ... and 360 more files (download for full content)

About this extraction

This page contains the full source code of the MoOx/phenomic GitHub repository, extracted and formatted as plain text for AI agents and large language models (LLMs). The extraction includes 560 files (1.0 MB), approximately 292.0k tokens, and a symbol index with 83 extracted functions, classes, methods, constants, and types. Use this with OpenClaw, Claude, ChatGPT, Cursor, Windsurf, or any other AI tool that accepts text input. You can copy the full output to your clipboard or download it as a .txt file.

Extracted by GitExtract — free GitHub repo to text converter for AI. Built by Nikandr Surkov.

Copied to clipboard!