[
  {
    "path": ".circleci/config.yml",
    "content": "version: 2\njobs:\n  test:\n    docker:\n      - image: circleci/node:8\n    steps:\n      - checkout\n      - restore_cache:\n          key: dependency-cache\n      - restore_cache:\n          key: website-cache\n      - run:\n          name: install deps\n          command: yarn\n      - run:\n          name: tests\n          command: |\n            echo 'export DEBUG=phenomic:*' >> $BASH_ENV\n            yarn test\n      - save_cache:\n          key: dependency-cache\n          paths:\n            - ~/.cache/yarn\n            - ./node_modules\n      - save_cache:\n          key: website-cache\n          paths:\n            - website/.screenshots\n            - website/public/showcase/entry\nworkflows:\n  version: 2\n  test:\n    jobs:\n      - test\n"
  },
  {
    "path": ".editorconfig",
    "content": "# editorconfig.org\nroot = true\n\n[*]\nend_of_line = lf\ncharset = utf-8\ntrim_trailing_whitespace = true\ninsert_final_newline = true\nindent_style = space\nindent_size = 2\n\n[*.md]\n# Allow <br/> from Markdown\ntrim_trailing_whitespace = false\n"
  },
  {
    "path": ".flowconfig",
    "content": "[version]\n^0.87.0\n\n[ignore]\n.*/__tests__/_output/.*\n.*/dist/.*\n# for CI\n.*/watchman/.*\n\n<PROJECT_ROOT>/coverage/.*\n<PROJECT_ROOT>/benchmarks/.*/dist/.*\n<PROJECT_ROOT>/benchmarks/.*/lib/.*\n<PROJECT_ROOT>/examples/.*/dist/.*\n<PROJECT_ROOT>/examples/.*/lib/.*\n<PROJECT_ROOT>/packages/.*/dist/.*\n<PROJECT_ROOT>/packages/.*/lib/.*\n; please remove me when you have time to kill\n<PROJECT_ROOT>/website/.*\n\n# flow & js generated by reasonml doesn't play nice\n<PROJECT_ROOT>/examples/reason-react-app/.*\n\n; broken json\n.*/node_modules/config-chain/test/.*\n\n[options]\nesproposal.class_instance_fields=enable\nesproposal.class_static_fields=enable\n# for Windows compat with json files\nmodule.file_ext=.web.js\nmodule.file_ext=.js\nmodule.file_ext=.json\n\n# packages/*\nmodule.name_mapper='^@phenomic\\/\\([a-z0-9-]+\\)\\/lib\\/\\(.*\\)$' -> '<PROJECT_ROOT>/packages/\\1/src/\\2'\nmodule.name_mapper='^@phenomic\\/\\([a-z0-9-]+\\)\\/\\(.*\\)$' -> '<PROJECT_ROOT>/packages/\\1/\\2'\nmodule.name_mapper='^@phenomic\\/\\([a-z0-9-]+\\)$' -> '<PROJECT_ROOT>/packages/\\1/src'\n\n# fixup some node_modules to get proper flow types\nmodule.name_mapper='^react-native-web$' -> 'react-native-web/src'\n"
  },
  {
    "path": ".github/FUNDING.yml",
    "content": "open_collective: phenomic\nko_fi: moox__\ncustom: https://www.paypal.me/MoOx\n"
  },
  {
    "path": ".gitignore",
    "content": "*.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\ncoverage\n\n# build\n**/lib/**/*.js\n**/lib/bs/**/*\n**/lib/ocaml/**/*\n**/dist\n\n# tests results\n**/__tests__/_output*\n\n# website\n**/website/**/*.mov\n**/website/**/*.pxm\n**/website/public/showcases/entry/*\n**/website/svgs/*.js\n\n# reason stuff\n.merlin\n.bsb.lock\n*.bs.js"
  },
  {
    "path": ".travis.yml",
    "content": "language: node_js\nnode_js: 8\n\nenv:\n  global:\n  - DEBUG: phenomic:*\n\nbefore_install:\n  # Install Yarn\n  - curl -o- -L https://yarnpkg.com/install.sh | bash\n  - export PATH=$HOME/.yarn/bin:$PATH\n  # Install Watchman dependency\n  - git clone --depth=1 --branch=v4.7.0 https://github.com/facebook/watchman.git\n  - pushd watchman && ./autogen.sh && ./configure --without-python && make && sudo make install && popd\n\ncache:\n  yarn: true\n  directories:\n    - node_modules\n    - website/.screenshots\n    - website/public/showcase/entry\n\nscript:\n  - yarn run test-without-lint\n"
  },
  {
    "path": ".vscode/settings.json",
    "content": "{\n  \"javascript.validate.enable\": false\n}\n"
  },
  {
    "path": "CHANGELOG.md",
    "content": "# For pre-releases notes [see GitHub releases](https://github.com/phenomic/phenomic/releases)\n\n# [0.x releases notes](https://github.com/phenomic/phenomic/blob/0.x/CHANGELOG.md)\n"
  },
  {
    "path": "CODE_OF_CONDUCT.md",
    "content": "# Code of Conduct\n\n## 1. Purpose\n\nA primary goal of Phenomic is to be inclusive to the largest number of\ncontributors, with the most varied and diverse backgrounds possible. As such, we\nare committed to providing a friendly, safe and welcoming environment for all,\nregardless of gender, sexual orientation, ability, ethnicity, socioeconomic\nstatus, and religion (or lack thereof).\n\nThis code of conduct outlines our expectations for all those who participate in\nour community, as well as the consequences for unacceptable behavior.\n\nWe invite all those who participate in Phenomic to help us create safe and\npositive experiences for everyone.\n\n## 2. Open Source Citizenship\n\nA supplemental goal of this Code of Conduct is to increase open source\ncitizenship by encouraging participants to recognize and strengthen the\nrelationships between our actions and their effects on our community.\n\nCommunities mirror the societies in which they exist and positive action is\nessential to counteract the many forms of inequality and abuses of power that\nexist in society.\n\nIf you see someone who is making an extra effort to ensure our community is\nwelcoming, friendly, and encourages all participants to contribute to the\nfullest extent, we want to know.\n\n## 3. Expected Behavior\n\nThe following behaviors are expected and requested of all community members:\n\n- Participate in an authentic and active way. In doing so, you contribute to the\n  health and longevity of this community.\n- Exercise consideration and respect in your speech and actions.\n- Attempt collaboration before conflict.\n- Refrain from demeaning, discriminatory, or harassing behavior and speech.\n- Be mindful of your surroundings and of your fellow participants. Alert\n  community leaders if you notice a dangerous situation, someone in distress, or\n  violations of this Code of Conduct, even if they seem inconsequential.\n- Remember that community event venues may be shared with members of the public;\n  please be respectful to all patrons of these locations.\n\n## 4. Unacceptable Behavior\n\nThe following behaviors are considered harassment and are unacceptable within\nour community:\n\n- Violence, threats of violence or violent language directed against another\n  person.\n- Sexist, racist, homophobic, transphobic, ableist or otherwise discriminatory\n  jokes and language.\n- Posting or displaying sexually explicit or violent material.\n- Posting or threatening to post other people’s personally identifying\n  information (\"doxing\").\n- Personal insults, particularly those related to gender, sexual orientation,\n  race, religion, or disability.\n- Inappropriate photography or recording.\n- Inappropriate physical contact. You should have someone’s consent before\n  touching them.\n- Unwelcome sexual attention. This includes, sexualized comments or jokes;\n  inappropriate touching, groping, and unwelcomed sexual advances.\n- Deliberate intimidation, stalking or following (online or in person).\n- Advocating for, or encouraging, any of the above behavior.\n- Sustained disruption of community events, including talks and presentations.\n\n## 5. Consequences of Unacceptable Behavior\n\nUnacceptable behavior from any community member, including sponsors and those\nwith decision-making authority, will not be tolerated.\n\nAnyone asked to stop unacceptable behavior is expected to comply immediately.\n\nIf a community member engages in unacceptable behavior, the community organizers\nmay take any action they deem appropriate, up to and including a temporary ban\nor permanent expulsion from the community without warning (and without refund in\nthe case of a paid event).\n\n## 6. Reporting Guidelines\n\nIf you are subject to or witness unacceptable behavior, or have any other\nconcerns, please notify a community organizer as soon as possible.\ncontact@phenomic.io.\n\nAdditionally, community organizers are available to help community members\nengage with local law enforcement or to otherwise help those experiencing\nunacceptable behavior feel safe. In the context of in-person events, organizers\nwill also provide escorts as desired by the person experiencing distress.\n\n## 7. Addressing Grievances\n\nIf you feel you have been falsely or unfairly accused of violating this Code of\nConduct, you should notify Phenomic with a concise description of your\ngrievance. Your grievance will be handled in accordance with our existing\ngoverning policies.\n\n## 8. Scope\n\nWe expect all community participants (contributors, paid or otherwise; sponsors;\nand other guests) to abide by this Code of Conduct in all community\nvenues–online and in-person–as well as in all one-on-one communications\npertaining to community business.\n\nThis code of conduct and its related procedures also applies to unacceptable\nbehavior occurring outside the scope of community activities when such behavior\nhas the potential to adversely affect the safety and well-being of community\nmembers.\n\n## 9. Contact info\n\ncontact@phenomic.io\n\n## 10. License and attribution\n\nThis Code of Conduct is distributed under a\n[Creative Commons Attribution-ShareAlike license](http://creativecommons.org/licenses/by-sa/3.0/).\n\nPortions of text derived from the\n[Django Code of Conduct](https://www.djangoproject.com/conduct/) and the\n[Geek Feminism Anti-Harassment Policy](http://geekfeminism.wikia.com/wiki/Conference_anti-harassment/Policy).\n\nRetrieved on November 22, 2016 from\n[http://citizencodeofconduct.org/](http://citizencodeofconduct.org/)\n"
  },
  {
    "path": "CONTRIBUTING.md",
    "content": "# Contributing to Phenomic\n\n> ⚠️ wip\n\nFrom opening a bug report to creating a pull request: every contribution is\nappreciated and welcome. This document is here to answer most questions when it\ncomes to contribute to this project.\n\nIf you have any questions not answered by this document,\n[contact us on our chat](https://gitter.im/MoOx/phenomic) or\n[open an issue](https://github.com/phenomic/phenomic/issues/new)\n\n---\n\n## [Code of Conduct](CODE_OF_CONDUCT.md)\n\nPhenomic has adopted a Code of Conduct that we expect project participants to\nadhere to. Please read [the full text](CODE_OF_CONDUCT.md) so that you can\nunderstand what actions will and will not be tolerated.\n\n---\n\n## Financial contributions\n\nWe also welcome financial contributions in full transparency on our\n[open collective](https://opencollective.com/phenomic). Anyone can file an\nexpense. If the expense makes sense for the development of the community, it\nwill be \"merged\" in the ledger of our open collective by the core contributors\nand the person who filed the expense will be reimbursed.\n\n➡️ [opencollective.com/phenomic](https://opencollective.com/phenomic)\n\n### Credits\n\n#### Contributors\n\nThank you to all the people who have already contributed to phenomic!\n<a href=\"graphs/contributors\"><img src=\"https://opencollective.com/phenomic/contributors.svg?width=890\" /></a>\n\n#### Backers\n\nThank you to all our backers!\n[[Become a backer](https://opencollective.com/phenomic#backer)]\n\n<a href=\"https://opencollective.com/phenomic#backers\" target=\"_blank\"><img src=\"https://opencollective.com/phenomic/backers.svg?width=890\"></a>\n\n#### Sponsors\n\nThank you to all our sponsors! (please ask your company to also support this\nopen source project by\n[becoming a sponsor](https://opencollective.com/phenomic#sponsor))\n\n<a href=\"https://opencollective.com/phenomic/sponsor/0/website\" target=\"_blank\"><img src=\"https://opencollective.com/phenomic/sponsor/0/avatar.svg\"></a>\n<a href=\"https://opencollective.com/phenomic/sponsor/1/website\" target=\"_blank\"><img src=\"https://opencollective.com/phenomic/sponsor/1/avatar.svg\"></a>\n<a href=\"https://opencollective.com/phenomic/sponsor/2/website\" target=\"_blank\"><img src=\"https://opencollective.com/phenomic/sponsor/2/avatar.svg\"></a>\n<a href=\"https://opencollective.com/phenomic/sponsor/3/website\" target=\"_blank\"><img src=\"https://opencollective.com/phenomic/sponsor/3/avatar.svg\"></a>\n<a href=\"https://opencollective.com/phenomic/sponsor/4/website\" target=\"_blank\"><img src=\"https://opencollective.com/phenomic/sponsor/4/avatar.svg\"></a>\n<a href=\"https://opencollective.com/phenomic/sponsor/5/website\" target=\"_blank\"><img src=\"https://opencollective.com/phenomic/sponsor/5/avatar.svg\"></a>\n<a href=\"https://opencollective.com/phenomic/sponsor/6/website\" target=\"_blank\"><img src=\"https://opencollective.com/phenomic/sponsor/6/avatar.svg\"></a>\n<a href=\"https://opencollective.com/phenomic/sponsor/7/website\" target=\"_blank\"><img src=\"https://opencollective.com/phenomic/sponsor/7/avatar.svg\"></a>\n<a href=\"https://opencollective.com/phenomic/sponsor/8/website\" target=\"_blank\"><img src=\"https://opencollective.com/phenomic/sponsor/8/avatar.svg\"></a>\n<a href=\"https://opencollective.com/phenomic/sponsor/9/website\" target=\"_blank\"><img src=\"https://opencollective.com/phenomic/sponsor/9/avatar.svg\"></a>\n\n---\n\n### Workflow and Pull Requests\n\nThe core team will be monitoring for pull requests and reviewing changes.\n\n_Before_ submitting a pull request, please make sure the following is done…\n\n1. Fork the repo and create your branch from `master`. A guide on how to fork a\n   repository: https://help.github.com/articles/fork-a-repo/\n\n   Open your terminal (e.g. Terminal, Git Bash or Git Shell) and type:\n\n   ```sh\n   git clone https://github.com/<your_username>/phenomic\n   cd phenomic\n   git checkout -b my_branch\n   ```\n\n   Note: Replace `<your_username>` with your GitHub username\n\n2. Phenomic uses [Yarn](https://yarnpkg.com/) for running development scripts.\n   If you haven't already done so, please\n   [install yarn](https://yarnpkg.com/en/docs/install).\n\n   To check your version of Yarn and ensure it's installed you can type:\n\n   ```sh\n   yarn --version\n   ```\n\n   ⚠️ **We currently require yarn >= v1.0.0**\n\n3. Run `yarn`. This will install all dependencies and prepare the repository to\n   be ready for serious shit.\n\n   ```sh\n   yarn\n   ```\n\n4. If you've added code that should be tested, add tests.\n\n5. If you've added/changed APIs, update the documentation accordingly.\n\n6. Ensure the entire test suite passes via `yarn test`.\n\n#### Additional Workflow for any changes made to website or docs\n\nIf you are making changes to the website or documentation, test the `website`\nfolder and run the server to check if your changes are being displayed\naccurately.\n\nYou can run a development server to check if the changes you made are being\ndisplayed accurately by running `yarn website:start`.\n\nYou can modify `website/*` code and get real times update in your browser.\n\n**Keep in mind that whenever you modify Phenomic core/plugins you might need to\nrestart the dev server.** If you are doing change to Phenomic using the website\nas a playground, you may need to transpile sources. See below for more\ninformations.\n\n## How to try a development build of Phenomic in another project\n\n### Transpiling sources\n\nPhenomic is written with ES2015+ and is using [babel](http://babeljs.io) for\ntranspilation. In order to have up to date code for real world usage, you need\nto start a watcher from the root of the project\n\n```console\nyarn watch\n```\n\nThis will update transpilated files as soon as you modify one.\n\n### Use a local Phenomic version your own project\n\nFrom Phenomic git repo\n\n```console\nyarn links\n```\n\nThis should create local links for each packages.\n\nThen, in your project:\n\n```console\nyarn link @phenomic/core @phenomic/preset-react-app ...\n```\n\n**You should probably add all others direct `@phenomic/*` deps from your\n`package.json` if necessary.**\n\nThen run your project via `yarn start`, and don't forget to restart dev server\nif necessary (if you change the code of Phenomic itself).\n\n---\n\n## Bugs\n\n### Where to Find Known Issues\n\nWe are using [GitHub Issues](https://github.com/phenomic/phenomic/issues) for\nour public bugs. We will keep a close eye on this and try to make it clear when\nwe have a work in progress. **Before filing a new issue, try to make sure your\nproblem doesn't already exist.**\n\n### Reporting New Issues\n\nThe best way to get your bug fixed is to provide a reduced test case. Please\nprovide a public repository with a runnable example. Then feel free to\n[open an issue](https://github.com/phenomic/phenomic/issues/new).\n\n#### Security Bugs\n\nIf you find a security issue, please first contact us directly before opening a\npublic issue.\n\n---\n\n## Releasing\n\nUpdate necessary `bsconfig.json` (eg: `packages/reason/bsconfig.json`) version\nnumber and stage the file in git (so release script gets it).\n\n```\nyarn release\n```\n\nThe command will guide you.\n\nOnce it's done, go to https://github.com/phenomic/phenomic/releases. Click on\nthe new created tag and `Edit tag` to create release notes.\n\nThe way to create notes is easy. Just go to\nhttps://github.com/phenomic/phenomic/commits/master and sort interesting commits\n(since last release) in the template below that you will use as notes:\n\n```\n# 🎉 No breaking changes 🎉\nor\n# 💥 Includes _Breaking changes_\n\nBlah blah\n\n## 💥 Breaking changes\n\n* [`@phenomic/PLUGIN_NAMEEEE`: AWESOME_MESSAGE](https://github.com/phenomic/phenomic/commit/HASSSSHHHHHHHHHHH),\n  by @DOERRRRR, reported|requested by @REPORTERRRRR (in [#XXXXXXX](https://github.com/phenomic/phenomic/issues/XXXXXXX))\n\n\n## 🐛 Bugfixes\n\n...\n\n##  👍 Improvements\n\n...\n\n## 🔥 New plugins\n\n...\n\n## ✨ New features\n\n...\n\n## 🌟 New Examples\n\n...\n```\n\n---\n\n## How to Get in Touch\n\n- Chat - [#phenomic](https://gitter.im/phenomic/phenomic) on Gitter.\n- Email - contact (at) phenomic (dot) io\n\n## Code Conventions\n\n- [Prettier](https://prettier.io) is used to avoid bikeshedding on quotes or\n  semicolons.\n- [Eslint](http://eslint.org) is used to help to keep the codebase clean, with a\n  [strong config](https://github.com/MoOx/eslint-config-i-am-meticulous).\n- Prefer ES6 syntax when possible.\n- Use [Flow types](http://flowtype.org/).\n\n## License\n\nBy contributing to Phenomic, you agree that your contributions will be licensed\nunder its MIT license.\n"
  },
  {
    "path": "LICENSE",
    "content": "The MIT License (MIT)\n\nCopyright (c) 2015 Maxime Thirouin\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all\ncopies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\nSOFTWARE.\n"
  },
  {
    "path": "README.md",
    "content": "# DEPRECATED. Please use [Next.js](https://nextjs.org) instead\n\n[![Phenomic](https://raw.githubusercontent.com/phenomic/phenomic/master/logo/phenomic-cover-transparent.png)](https://phenomic.io)\n\n> Modular website compiler (React, Webpack, Reason and whatever you want)\n\n✅ **Status**\n\n[![Travis CI Build status](https://img.shields.io/travis/phenomic/phenomic/master.svg?label=unix%2Ftravis-ci%20build)](https://travis-ci.org/phenomic/phenomic)\n[![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)\n[![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)\n[![Version](https://img.shields.io/npm/v/@phenomic/core.svg)](https://github.com/phenomic/phenomic/blob/master/CHANGELOG.md)\n\n💬 **Want to discuss or ask a question?**\n\n[![Join the community on Spectrum](https://withspectrum.github.io/badge/badge.svg)](https://spectrum.chat/phenomic)\n[![Gitter](https://badges.gitter.im/phenomic/phenomic.svg)](https://gitter.im/phenomic/phenomic)\n[![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)\n\n📦 **Git Mirrors**\n\n[GitHub](https://github.com/phenomic/phenomic) |\n[GitLab](https://gitlab.com/MoOx/phenomic) |\n[BitBucket](https://bitbucket.org/MoOx/phenomic)\n\n---\n\n## [Documentation](https://phenomic.io/en/packages/core/docs/)\n\n## [Tutorials](https://phenomic.io/en/tutorials/)\n\n## Examples\n\nThere are plenty of\n[examples](https://github.com/phenomic/phenomic/tree/master/examples) available.\nJust take a look!\n\n---\n\n## [CONTRIBUTING](https://github.com/phenomic/phenomic/blob/master/CONTRIBUTING.md)\n\n✨ Check out our\n[CONTRIBUTING](https://github.com/phenomic/phenomic/blob/master/CONTRIBUTING.md)\nguide to get started.\n\n- ⇄ Pull/Merge requests and ★ Stars are always welcome.\n- For bugs and feature requests, please\n  [create an issue](https://github.com/phenomic/phenomic/issues/new).\n- Pull requests must be accompanied by passing automated tests. See\n  [CONTRIBUTING](https://github.com/phenomic/phenomic/blob/master/CONTRIBUTING.md)\n  for more information.\n- Donation is a way to contribute.\n  [You can help us via our OpenCollective page](https://opencollective.com/phenomic).\n\n### Contributors\n\nThank you to all the people who have already contributed to phenomic!\n<a href=\"https://github.com/phenomic/phenomic/graphs/contributors\"><img src=\"https://opencollective.com/phenomic/contributors.svg?width=890\" /></a>\n\n### Backers\n\nThank you to all our backers!\n[[Become a backer](https://opencollective.com/phenomic#backer)]\n\n<a href=\"https://opencollective.com/phenomic#backers\" target=\"_blank\"><img src=\"https://opencollective.com/phenomic/backers.svg?width=890\"></a>\n\n### Sponsors\n\nThank you to all our sponsors! (please ask your company to also support this\nopen source project by\n[becoming a sponsor](https://opencollective.com/phenomic#sponsor))\n\n<a href=\"https://opencollective.com/phenomic/sponsor/0/website\" target=\"_blank\"><img src=\"https://opencollective.com/phenomic/sponsor/0/avatar.svg\"></a>\n<a href=\"https://opencollective.com/phenomic/sponsor/1/website\" target=\"_blank\"><img src=\"https://opencollective.com/phenomic/sponsor/1/avatar.svg\"></a>\n<a href=\"https://opencollective.com/phenomic/sponsor/2/website\" target=\"_blank\"><img src=\"https://opencollective.com/phenomic/sponsor/2/avatar.svg\"></a>\n<a href=\"https://opencollective.com/phenomic/sponsor/3/website\" target=\"_blank\"><img src=\"https://opencollective.com/phenomic/sponsor/3/avatar.svg\"></a>\n<a href=\"https://opencollective.com/phenomic/sponsor/4/website\" target=\"_blank\"><img src=\"https://opencollective.com/phenomic/sponsor/4/avatar.svg\"></a>\n<a href=\"https://opencollective.com/phenomic/sponsor/5/website\" target=\"_blank\"><img src=\"https://opencollective.com/phenomic/sponsor/5/avatar.svg\"></a>\n<a href=\"https://opencollective.com/phenomic/sponsor/6/website\" target=\"_blank\"><img src=\"https://opencollective.com/phenomic/sponsor/6/avatar.svg\"></a>\n<a href=\"https://opencollective.com/phenomic/sponsor/7/website\" target=\"_blank\"><img src=\"https://opencollective.com/phenomic/sponsor/7/avatar.svg\"></a>\n<a href=\"https://opencollective.com/phenomic/sponsor/8/website\" target=\"_blank\"><img src=\"https://opencollective.com/phenomic/sponsor/8/avatar.svg\"></a>\n<a href=\"https://opencollective.com/phenomic/sponsor/9/website\" target=\"_blank\"><img src=\"https://opencollective.com/phenomic/sponsor/9/avatar.svg\"></a>\n\n---\n\n## [CHANGELOG](CHANGELOG.md)\n\n## [Code of Conduct](CODE_OF_CONDUCT.md)\n\n## [LICENSE](LICENSE)\n"
  },
  {
    "path": "appveyor.yml",
    "content": "# http://www.appveyor.com/docs/appveyor-yml\nenvironment:\n  matrix:\n    - nodejs_version: '8'\n\n  DEBUG: phenomic:*\n\ninstall:\n  - ps: Install-Product node $env:nodejs_version x64\n  - node --version\n  - yarn --version\n  - yarn\n\ntest_script:\n  - yarn test-without-lint\n  - yarn posttest\n\ncache:\n  - \"%LOCALAPPDATA%\\\\Yarn\"\n  - node_modules -> package.json\n  - website/.screenshots -> website/content/showcase/entry\n  - website/public/showcase/entry -> website/content/showcase/entry\n\nversion: \"{build}\"\nbuild: off\ndeploy: off\nmatrix:\n  fast_finish: true\n\ninit:\n  # debugging Appveyor build. More info:\n  # https://www.appveyor.com/docs/how-to/rdp-to-build-worker/\n  - ps: iex ((new-object net.webclient).DownloadString('https://raw.githubusercontent.com/appveyor/ci/master/scripts/enable-rdp.ps1'))\n"
  },
  {
    "path": "babel-jest.upward.js",
    "content": "module.exports = require(\"babel-jest\").createTransformer({\n  rootMode: \"upward\",\n});\n"
  },
  {
    "path": "babel.config.js",
    "content": "module.exports = {\n  presets: [\n    [\n      \"@babel/preset-env\",\n      {\n        targets: {\n          node: \"current\",\n        },\n      },\n    ],\n    \"@babel/preset-react\",\n    \"@babel/preset-flow\",\n  ],\n  plugins: [\n    \"@babel/plugin-proposal-class-properties\",\n    \"@babel/plugin-proposal-object-rest-spread\",\n    [\n      \"@babel/plugin-transform-runtime\",\n      {\n        helpers: true,\n        regenerator: true,\n      },\n    ],\n  ],\n};\n"
  },
  {
    "path": "examples/.eslintrc",
    "content": "{\n  \"rules\": {\n    \"import/no-extraneous-dependencies\": 0,\n    \"react/no-multi-comp\": 0,\n    \"react/prop-types\": 0,\n    \"react/jsx-no-bind\": 0,\n    \"react/jsx-no-literals\": 0,\n    \"react-native/no-inline-styles\": 0\n  }\n}\n"
  },
  {
    "path": "examples/react-app-blog/App.js",
    "content": "// @flow\n\nimport * as React from \"react\";\nimport { Router, Route, browserHistory } from \"react-router\";\nimport { createApp, renderApp } from \"@phenomic/preset-react-app/lib/client\";\n\nimport \"./highlights-theme.css\";\n\nimport Page from \"./src/Page\";\nimport PageBlog from \"./src/PageBlog\";\nimport PageBlogPost from \"./src/PageBlogPost\";\nimport PageRepositories from \"./src/PageRepositories\";\nimport PageError from \"./src/PageError\";\n\nconst routes = () => (\n  <Router history={browserHistory}>\n    <Route path=\"/\" component={Page} />\n    <Route path=\"/blog/\" component={PageBlog} />\n    <Route path=\"/blog/after/:after\" component={PageBlog} />\n    <Route path=\"/blog/*\" component={PageBlogPost} />\n    <Route path=\"/repositories/\" component={PageRepositories} />\n    <Route path=\"/repositories/page/:page\" component={PageRepositories} />\n    {/* for static hosting, we often need an explicit 404.html */}\n    <Route path=\"404.html\" component={PageError} />\n    <Route path=\"*\" component={Page} />\n  </Router>\n);\n\nexport default createApp(routes);\n\nif (module.hot) {\n  module.hot.accept(() => renderApp(routes));\n}\n"
  },
  {
    "path": "examples/react-app-blog/Html.js",
    "content": "// @flow\n\nimport * as React from \"react\";\nimport Head from \"react-helmet\";\n\nexport default ({ App, render }: PhenomicHtmlPropsType) => {\n  // if needed, you can know if you are in development or in static rendering\n  // const isDev = process.env.PHENOMIC_ENV === \"development\"\n  const { Main, State, Script, Style } = render(<App />);\n  const helmet = Head.renderStatic();\n  return (\n    // $FlowFixMe helmet is fine\n    <html {...helmet.htmlAttributes.toComponent()}>\n      <head>\n        {helmet.meta.toComponent()}\n        {helmet.title.toComponent()}\n        {helmet.base.toComponent()}\n        <Style />\n        {helmet.link.toComponent()}\n        {helmet.style.toComponent()}\n        {helmet.script.toComponent()}\n        {helmet.noscript.toComponent()}\n      </head>\n      {/* // $FlowFixMe it works on my machine */}\n      <body {...helmet.bodyAttributes.toComponent()}>\n        <Main />\n        <State />\n        <Script />\n      </body>\n    </html>\n  );\n};\n"
  },
  {
    "path": "examples/react-app-blog/README.md",
    "content": "# Blog with Phenomic + React preset\n\nSimple blog template that includes:\n\n- some pages (home, about, 404.html for static hosting)\n- a paginated list of posts\n- some articles\n- a component to display latest posts\n- a loading indicator that is pretty sweet (and only appear when connection is\n  \"slow\")\n- a way to use different layout from markdown file (via front-matter\n  `layout: {name}`)\n\nInspired by the Getting Started guide with a bit of CSS.\n\n![Preview](./preview.jpg)\n"
  },
  {
    "path": "examples/react-app-blog/__tests__/__snapshots__/index.js.snap",
    "content": "// Jest Snapshot v1, https://goo.gl/fbAQLP\n\nexports[`should build example correctly 1`] = `\nArray [\n  \"404.html\",\n  \"about/index.html\",\n  \"blog/after/c2Vjb25kLXBvc3Q=/index.html\",\n  \"blog/after/dGhpcmQtcG9zdA==/index.html\",\n  \"blog/after/Zm91cnRoLXBvc3Q=/index.html\",\n  \"blog/after/ZmlmdGgtcG9zdA==/index.html\",\n  \"blog/after/Zmlyc3QtcG9zdA==/index.html\",\n  \"blog/fifth-post/index.html\",\n  \"blog/first-post/index.html\",\n  \"blog/fourth-post/index.html\",\n  \"blog/index.html\",\n  \"blog/second-post/index.html\",\n  \"blog/third-post/index.html\",\n  \"index.html\",\n  \"repositories/index.html\",\n  \"repositories/page/2/index.html\",\n  \"repositories/page/3/index.html\",\n  \"repositories/page/4/index.html\",\n]\n`;\n\nexports[`should build example correctly 2`] = `\nArray [\n  \"phenomic/content/pages/item/.json\",\n  \"phenomic/content/pages/item/about.json\",\n  \"phenomic/content/posts/by-default/1/desc/date/limit-4.json\",\n  \"phenomic/content/posts/by-default/1/desc/date/limit-6.json\",\n  \"phenomic/content/posts/by-default/1/desc/date/limit-6/after-c2Vjb25kLXBvc3Q=.json\",\n  \"phenomic/content/posts/by-default/1/desc/date/limit-6/after-dGhpcmQtcG9zdA==.json\",\n  \"phenomic/content/posts/by-default/1/desc/date/limit-6/after-Zm91cnRoLXBvc3Q=.json\",\n  \"phenomic/content/posts/by-default/1/desc/date/limit-6/after-ZmlmdGgtcG9zdA==.json\",\n  \"phenomic/content/posts/by-default/1/desc/date/limit-6/after-Zmlyc3QtcG9zdA==.json\",\n  \"phenomic/content/posts/item/fifth-post.json\",\n  \"phenomic/content/posts/item/first-post.json\",\n  \"phenomic/content/posts/item/fourth-post.json\",\n  \"phenomic/content/posts/item/second-post.json\",\n  \"phenomic/content/posts/item/third-post.json\",\n]\n`;\n\nexports[`should build example correctly 3`] = `\nArray [\n  \"favicon.ico\",\n  \"robots.txt\",\n]\n`;\n"
  },
  {
    "path": "examples/react-app-blog/__tests__/index.js",
    "content": "// @flow\n\n/* eslint-disable import/no-extraneous-dependencies */\nimport fs from \"fs\";\nimport path from \"path\";\n\nimport globby from \"globby\";\n\nit(\"should build example correctly\", () => {\n  const testFolder = __dirname + \"/../dist\";\n  const files = globby.sync(\"**/*\", {\n    cwd: testFolder,\n    nodir: true,\n    dot: true,\n  });\n\n  // should have html files\n  const htmlFiles = files.filter(file => file.endsWith(\".html\"));\n  expect(htmlFiles).toMatchSnapshot();\n\n  const jsonApiFiles = files.filter(\n    file => file.startsWith(\"phenomic\") && file.endsWith(\".json\"),\n  );\n  // should have matching json files\n  expect(jsonApiFiles).toMatchSnapshot();\n\n  // should have assets\n  const assetsBundlerFiles = files.filter(\n    file =>\n      !htmlFiles.includes(file) &&\n      !jsonApiFiles.includes(file) &&\n      file.startsWith(\"phenomic\"),\n  );\n  expect(assetsBundlerFiles.length).toBe(2);\n  expect(\n    files.filter(\n      file =>\n        !htmlFiles.includes(file) &&\n        !jsonApiFiles.includes(file) &&\n        !assetsBundlerFiles.includes(file),\n    ),\n  ).toMatchSnapshot();\n});\n\nit(\"should make dynamic pages with pagination\", () => {\n  const file1 = fs.readFileSync(\n    path.join(__dirname, \"..\", \"dist\", \"repositories\", \"index.html\"),\n    { encoding: \"utf8\" },\n  );\n  expect(file1).toContain('<div class=\"PageRepositories-repo\">');\n  expect(file1).not.toContain(\"ActivityIndicator\");\n\n  const file2 = fs.readFileSync(\n    path.join(\n      __dirname,\n      \"..\",\n      \"dist\",\n      \"repositories\",\n      \"page\",\n      \"2\",\n      \"index.html\",\n    ),\n    { encoding: \"utf8\" },\n  );\n  expect(file2).toContain('<div class=\"PageRepositories-repo\">');\n  expect(file2).not.toContain(\"ActivityIndicator\");\n});\n"
  },
  {
    "path": "examples/react-app-blog/content/pages/about.md",
    "content": "---\ntitle: About me\nimage: https://images.unsplash.com/photo-1495681803763-410ec9ff583d?ixlib=rb-0.3.5&ixid=eyJhcHBfaWQiOjEyMDd9&s=ba41fd89a4d5dd9008d04ccea959c072&auto=format&fit=crop&w=900&q=60\n---\n\nAhh. Hey, Doc, we better back up, we don't have enough roads to get up to 88.\nHi. Where were we. In that case, I'll tell you strait out.\n\nThank you, don't forget to take a flyer. Look, I'm just not ready to ask\nLorraine out to the dance, and not you, nor anybody else on this planet is gonna\nmake me change my mind. Over there, on my hope chest. I've never seen purple\nunderwear before, Calvin. What's with the life preserver? Working.\n\nI still don't understand, how am I supposed to go to the dance with her, if\nshe's already going to the dance with you. Our first television set, Dad just\npicked it up today. Do you have a television? I hope so. Uh, look me up when you\nget there. Stand tall, boy, have some respect for yourself. Don't you know that\nif you let people walk all over you know, they'll be walking all over you for\nthe rest of your life? Listen to me, do you think I'm gonna spend the rest of my\nlife in this slop house?\n\nWhere were we. That's for messing up my hair. I'm sure that in 1985, plutonium\nis available at every corner drug store, but in 1955, it's a little hard to come\nby. Marty, I'm sorry, but I'm afraid you're stuck here. Where's Einstein, is he\nwith you? Listen, this is very important, I forgot my video camera, could you\nstop by my place and pick it up on your way to the mall?\n\nHi. Now Biff, don't con me. Of course I do. Just a second, let's see if I could\nfind it. George, buddy. remember that girl I introduced you to, Lorraine. What\nare you writing? Let's go.\n"
  },
  {
    "path": "examples/react-app-blog/content/pages/index.md",
    "content": "---\nimage: https://images.unsplash.com/photo-1495287949939-c5d3daf1cab4?ixlib=rb-0.3.5&ixid=eyJhcHBfaWQiOjEyMDd9&s=8969aebe524921f79c88b9ba605da6c2&auto=format&fit=crop&w=900&q=60\n---\n\nHi there. Here is a good sample for you if you are starting with Phenomic and\nReact. It provides a simple but powerful codebase that you will be able to\nadjust as you wish pretty easily. Be sure to check out the\n[source code of this theme](https://github.com/phenomic/phenomic/tree/master/examples/react-app-blog).\n\nBefore asking any question about Phenomic, be sure to read the documentation :\n\n- [Getting Started with Phenomic](https://phenomic.io/en/tutorials/)\n- [Documentation](https://phenomic.io/en/packages/core/docs/)\n\nAlso take a look at\n[existing websites that use Phenomic](https://phenomic.io/en/showcase/), some\nprojects share their source code!\n\n---\n\nYou may want to take a look at the [404.html](/404.html) and tweak the render.\n\n---\n\n_You feel like the base theme is not enough or you just saw something wrong?_\n[Please help us make Phenomic better!](https://github.com/phenomic/phenomic/blob/master/CONTRIBUTING.md)\n"
  },
  {
    "path": "examples/react-app-blog/content/posts/draft-post.md",
    "content": "---\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 be skipped in production\n"
  },
  {
    "path": "examples/react-app-blog/content/posts/fifth-post.md",
    "content": "---\ntitle: \"I wrote my fifth post and you won't believe what happen next\"\ndate: \"2017-01-05\"\nlayout: light\n---\n\nThis post is using the `light` layout, defined from markdown front-matter. How\ncool?\n\nAnother post that have a [link to the first one](../first-post/).\n\nAn wrong link to [a post that does not exist](../unknown-post/) and another one\nto [a page that does not exist](/unknown-page/).\n\nHere is an [external link](http://phenomic.io).\n\n```md\n# Some markdown...\n\n...in a markdown file. **Markdownception?**.\n```\n\n```js\nimport unifiedProcessor from \"./unifiedProcessor\";\nimport type { plugin } from \"./unifiedProcessor\";\nimport defaultOptions from \"./default-options\";\n\n// eslint-disable-next-line\nconst debug = require(\"debug\")(\"phenomic:plugin:transform-markdown\");\n```\n"
  },
  {
    "path": "examples/react-app-blog/content/posts/first-post.md",
    "content": "---\ntitle: \"This is a first post\"\ndate: \"2017-01-01\"\n---\n\n# This is a [Markdown](https://en.wikipedia.org/wiki/Markdown#Example) file\n\nIf you are new to Markdown, you might want to check those links:\n\n- [What is Markdown?](http://whatismarkdown.com/)\n- [Mastering Markdown, a GitHub guide](https://guides.github.com/features/mastering-markdown/)\n- [wikipedia.org/wiki/Markdown](https://en.wikipedia.org/wiki/Markdown#Example)\n- [masteringmarkdown.com](http://masteringmarkdown.com/)\n\nCode is highlighted by default.\n\n```js\nconst StatelessComponent = props => {\n  return (\n    <div>\n      I‘m a stateless component that accepts children\n      {props.children}\n    </div>\n  );\n};\n\n// ...\n\nreturn <StatelessComponent>Example of child</StatelessComponent>;\n```\n"
  },
  {
    "path": "examples/react-app-blog/content/posts/fourth-post.md",
    "content": "---\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",
    "content": "---\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",
    "content": "---\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",
    "content": ".editor {\n  padding: 1em;\n  border: 1px solid #11171c;\n  border-radius: 3px;\n}\n\n/*\n  Code below has been generated with the following command:\n\n  npx atom-syntax-theme-to-highlights-css --clipboard https://github.com/simurai/duotone-dark-sea-syntax\n\n  More details at https://github.com/MoOx/atom-syntax-theme-to-highlights-css\n*/\n\n.editor {\n  color: #88b4e7;\n  background-color: #1d262f;\n}\n.editor .line.cursor-line {\n  background-color: rgba(52, 68, 85, 0.26);\n}\n.editor .invisible {\n  color: #88b4e7;\n}\n.editor .cursor {\n  border-color: #52ffc5;\n  border-left-width: 2px;\n}\n.editor .selection .region {\n  background-color: #344455;\n}\n.editor .bracket-matcher .region {\n  border-bottom: 1px solid #52ffc5;\n}\n.editor .invisible-character {\n  color: #303f4f;\n  -webkit-font-smoothing: antialiased;\n}\n.editor .indent-guide {\n  color: #303f4f;\n}\n.editor .wrap-guide {\n  background-color: #303f4f;\n}\n.editor .find-result .region.region.region,\n.editor .current-result .region.region.region {\n  border-radius: 0px;\n  background-color: rgba(82, 255, 197, 0.16);\n  transition: border-color 0.4s;\n}\n.editor .find-result .region.region.region {\n  border: 2px solid transparent;\n}\n.editor .current-result .region.region.region {\n  border: 2px solid #52ffc5;\n  transition-duration: 0.1s;\n}\n.editor .gutter .line-number {\n  color: #586f89;\n  -webkit-font-smoothing: antialiased;\n}\n.editor .gutter .line-number.git-line-removed:before {\n  bottom: -3px;\n}\n.editor .gutter .line-number.git-line-removed:after {\n  content: \"\";\n  position: absolute;\n  left: 0px;\n  bottom: 0px;\n  width: 25px;\n  border-bottom: 1px dotted rgba(224, 82, 82, 0.5);\n  pointer-events: none;\n}\n.editor .gutter .line-number.cursor-line {\n  color: #88b4e7;\n  background-color: #232d39;\n}\n.editor .gutter .line-number.cursor-line-no-selection {\n  background-color: transparent;\n}\n.editor .gutter .line-number .icon-right {\n  color: #88b4e7;\n}\n.editor .gutter .line-number.folded,\n.editor .gutter .line-number:after,\n.editor .fold-marker:after {\n  color: #88b4e7;\n}\n.uno-1 {\n  color: #d6e9ff;\n}\n.uno-2 {\n  color: #88b4e7;\n}\n.uno-3 {\n  color: #5d8cc0;\n}\n.uno-4 {\n  color: #586f89;\n}\n.uno-5 {\n  color: #444c55;\n}\n.duo-1 {\n  color: #34febb;\n}\n.duo-2 {\n  color: #32ae85;\n}\n.duo-3 {\n  color: #42675a;\n}\n.syntax--source {\n  color: #88b4e7;\n}\n.syntax--html.syntax--elements,\n.syntax--entity,\n.syntax--tag,\n.syntax--function-call {\n  color: #d6e9ff;\n}\n.syntax--attribute-name,\n.syntax--character.syntax--escape {\n  color: #5d8cc0;\n}\n.syntax--support {\n  color: #586f89;\n}\n.syntax--variable {\n  color: #5d8cc0;\n}\n.syntax--string,\n.syntax--constant,\n.syntax--storage.syntax--type {\n  color: #34febb;\n}\n.syntax--keyword,\n.syntax--storage {\n  color: #32ae85;\n}\n.syntax--punctuation,\n.syntax--bracket,\n.syntax--brace {\n  color: #444c55;\n}\n.syntax--string .syntax--punctuation {\n  color: #42675a;\n}\n.syntax--comment {\n  color: #586f89;\n  font-style: italic;\n}\n.syntax--bold {\n  font-weight: bold;\n}\n.syntax--italic {\n  font-style: italic;\n}\n.syntax--c .syntax--parens,\n.syntax--c .syntax--block {\n  color: #88b4e7;\n}\n.syntax--c .syntax--parens .syntax--punctuation,\n.syntax--c .syntax--block .syntax--punctuation,\n.syntax--c .syntax--parens .syntax--bracket,\n.syntax--c .syntax--block .syntax--bracket,\n.syntax--c .syntax--parens .syntax--brace,\n.syntax--c .syntax--block .syntax--brace {\n  color: #444c55;\n}\n.syntax--c .syntax--parens .syntax--string .syntax--punctuation,\n.syntax--c .syntax--block .syntax--string .syntax--punctuation {\n  color: #42675a;\n}\n.syntax--c .syntax--comment {\n  color: #42675a;\n}\n.syntax--source.syntax--clojure .syntax--expression {\n  color: #34febb;\n}\n.syntax--source.syntax--clojure .syntax--expression .syntax--punctuation {\n  color: #444c55;\n}\n.syntax--source.syntax--clojure .syntax--symbol {\n  color: #88b4e7;\n}\n.syntax--source.syntax--clojure .syntax--vector {\n  color: #586f89;\n}\n.syntax--coffee.syntax--source {\n  color: #586f89;\n}\n.syntax--source.syntax--cs .syntax--meta {\n  color: #586f89;\n}\n.syntax--source.syntax--cs .syntax--method {\n  color: #88b4e7;\n}\n.syntax--css.syntax--source {\n  color: #444c55;\n}\n.syntax--css.syntax--support.syntax--property-name {\n  color: #5d8cc0;\n}\n.syntax--css.syntax--attribute-name.syntax--id,\n.syntax--css.syntax--attribute-name.syntax--class,\n.syntax--css.syntax--attribute-name.syntax--parent-selector {\n  color: #d6e9ff;\n}\n.syntax--css.syntax--unit {\n  color: #32ae85;\n}\n.syntax--css.syntax--function {\n  color: #42675a;\n}\n.syntax--css.syntax--punctuation.syntax--terminator {\n  color: #42675a;\n}\n.syntax--css.syntax--at-rule {\n  color: #d6e9ff;\n}\n.syntax--css.syntax--at-rule .syntax--keyword.syntax--punctuation {\n  color: inherit;\n}\n.syntax--gfm {\n  color: #d6e9ff;\n}\n.syntax--gfm .syntax--punctuation,\n.syntax--gfm .syntax--bracket,\n.syntax--gfm .syntax--brace {\n  color: #444c55;\n}\n.syntax--gfm .syntax--string .syntax--punctuation {\n  color: #42675a;\n}\n.syntax--gfm .syntax--link {\n  color: #88b4e7;\n}\n.syntax--gfm.syntax--markup {\n  color: #88b4e7;\n}\n.syntax--gfm.syntax--markup.syntax--bold {\n  font-weight: bold;\n}\n.syntax--gfm.syntax--markup.syntax--italic {\n  font-style: italic;\n}\n.syntax--gfm.syntax--markup.syntax--strike {\n  color: #444c55;\n  text-decoration: line-through;\n}\n.syntax--gfm.syntax--markup.syntax--raw {\n  color: #34febb;\n}\n.syntax--gfm.syntax--markup.syntax--raw .syntax--support,\n.syntax--gfm.syntax--markup.syntax--code .syntax--support {\n  color: #586f89;\n}\n.syntax--gfm.syntax--comment {\n  color: #586f89;\n}\n.syntax--gfm.syntax--comment.syntax--quote {\n  color: #88b4e7;\n}\n.syntax--gfm.syntax--table {\n  color: #34febb;\n}\n.syntax--gfm.syntax--table .syntax--border,\n.syntax--gfm.syntax--table .syntax--pipe {\n  color: #444c55;\n}\n.syntax--gfm.syntax--variable,\n.syntax--gfm.syntax--entity {\n  color: #34febb;\n}\n.syntax--gfm.syntax--support {\n  color: #32ae85;\n}\n.syntax--gfm.syntax--heading-1,\n.syntax--gfm.syntax--heading-2,\n.syntax--gfm.syntax--heading-3 {\n  color: #34febb;\n}\n.syntax--gfm.syntax--heading-4,\n.syntax--gfm.syntax--heading-5,\n.syntax--gfm.syntax--heading-6 {\n  color: #32ae85;\n}\n.syntax--haskell.syntax--source {\n  color: #88b4e7;\n}\n.syntax--haskell.syntax--source .syntax--punctuation,\n.syntax--haskell.syntax--source .syntax--bracket,\n.syntax--haskell.syntax--source .syntax--brace {\n  color: #444c55;\n}\n.syntax--haskell.syntax--source .syntax--string .syntax--punctuation {\n  color: #42675a;\n}\n.syntax--html.syntax--meta {\n  color: #444c55;\n}\n.syntax--html.syntax--embedded .syntax--meta,\n.syntax--html.syntax--doctype,\n.syntax--html.syntax--text {\n  color: #586f89;\n}\n.syntax--html .syntax--string .syntax--id {\n  color: #34febb;\n}\n.syntax--jade.syntax--text,\n.syntax--jade .syntax--constant.syntax--name.syntax--attribute.syntax--tag {\n  color: #586f89;\n}\n.syntax--jade .syntax--meta.syntax--control.syntax--flow {\n  color: #88b4e7;\n}\n.syntax--jade .syntax--attribute-name.syntax--id {\n  color: #34febb;\n}\n.syntax--java .syntax--method {\n  color: #88b4e7;\n}\n.syntax--java .syntax--method .syntax--punctuation,\n.syntax--java .syntax--method .syntax--bracket,\n.syntax--java .syntax--method .syntax--brace {\n  color: #444c55;\n}\n.syntax--java .syntax--method .syntax--string .syntax--punctuation {\n  color: #42675a;\n}\n.syntax--java .syntax--dereference {\n  color: #586f89;\n}\n.syntax--js.syntax--delimiter {\n  color: #444c55;\n}\n.syntax--js.syntax--source {\n  color: #88b4e7;\n}\n.syntax--js.syntax--source .syntax--punctuation,\n.syntax--js.syntax--source .syntax--bracket,\n.syntax--js.syntax--source .syntax--brace {\n  color: #444c55;\n}\n.syntax--js.syntax--source .syntax--string .syntax--punctuation {\n  color: #42675a;\n}\n.syntax--json .syntax--string {\n  color: #88b4e7;\n}\n.syntax--json .syntax--string .syntax--punctuation {\n  color: #444c55;\n}\n.syntax--json .syntax--value > .syntax--string {\n  color: #34febb;\n}\n.syntax--json .syntax--value > .syntax--string .syntax--punctuation {\n  color: #444c55;\n}\n.syntax--json .syntax--value .syntax--constant {\n  color: #32ae85;\n}\n.syntax--less.syntax--variable:first-child {\n  color: #88b4e7;\n}\n.syntax--less .syntax--mixin {\n  color: #32ae85;\n}\n.syntax--mediawiki {\n  color: #d6e9ff;\n}\n.syntax--mediawiki .syntax--punctuation,\n.syntax--mediawiki .syntax--bracket,\n.syntax--mediawiki .syntax--brace {\n  color: #444c55;\n}\n.syntax--mediawiki .syntax--string .syntax--punctuation {\n  color: #42675a;\n}\n.syntax--mediawiki .syntax--wiki-link {\n  color: #88b4e7;\n}\n.syntax--mediawiki .syntax--heading {\n  color: #34febb;\n}\n.syntax--mediawiki .syntax--function-call {\n  color: #32ae85;\n}\n.syntax--mediawiki .syntax--value {\n  color: #34febb;\n}\n.syntax--mediawiki .syntax--fix_this_later {\n  color: #88b4e7;\n}\n.syntax--mediawiki .syntax--pipe,\n.syntax--mediawiki .syntax--link,\n.syntax--mediawiki .syntax--tag {\n  color: #444c55;\n}\n.syntax--php .syntax--string-contents {\n  color: #34febb;\n}\n.syntax--sass .syntax--at-rule .syntax--at-rule,\n.syntax--sass .syntax--at-rule .syntax--at-rule > .syntax--punctuation {\n  color: #d6e9ff;\n}\n.syntax--sass .syntax--mixin + .syntax--function,\n.syntax--sass .syntax--include + .syntax--function {\n  color: #32ae85;\n}\n.syntax--sass.syntax--property-value {\n  color: #34febb;\n}\n.syntax--sass.syntax--property-value .syntax--function {\n  color: #88b4e7;\n}\n.syntax--sass.syntax--property-value .syntax--punctuation {\n  color: #444c55;\n}\n.syntax--sass.syntax--variable.syntax--parameter.syntax--url {\n  color: #34febb;\n}\n.syntax--sass.syntax--class,\n.syntax--sass.syntax--parent-selector-suffix {\n  color: #d6e9ff;\n}\n.syntax--scss .syntax--at-rule .syntax--at-rule,\n.syntax--scss .syntax--at-rule .syntax--at-rule > .syntax--punctuation {\n  color: #d6e9ff;\n}\n.syntax--scss .syntax--mixin + .syntax--function,\n.syntax--scss .syntax--include + .syntax--function {\n  color: #32ae85;\n}\n.syntax--scss.syntax--property-value {\n  color: #34febb;\n}\n.syntax--scss.syntax--property-value .syntax--function {\n  color: #88b4e7;\n}\n.syntax--scss.syntax--property-value .syntax--punctuation {\n  color: #444c55;\n}\n.syntax--scss.syntax--variable.syntax--parameter.syntax--url {\n  color: #34febb;\n}\n.syntax--scss.syntax--class,\n.syntax--scss.syntax--parent-selector-suffix {\n  color: #d6e9ff;\n}\n.syntax--slim.syntax--meta {\n  color: #444c55;\n}\n.syntax--slim.syntax--text {\n  color: #586f89;\n}\n.syntax--slim .syntax--string .syntax--id {\n  color: #34febb;\n}\n.syntax--stylus .syntax--function .syntax--name {\n  color: #32ae85;\n}\n.syntax--tex .syntax--other {\n  color: #32ae85;\n}\n.syntax--tex .syntax--reference {\n  color: #88b4e7;\n}\n.syntax--plain .syntax--text {\n  color: #d6e9ff;\n}\n.syntax--yaml .syntax--tag {\n  color: #88b4e7;\n}\n.syntax--yaml .syntax--constant {\n  color: #32ae85;\n}\n.syntax--yaml .syntax--punctuation {\n  color: #444c55;\n}\n"
  },
  {
    "path": "examples/react-app-blog/package.json",
    "content": "{\n  \"private\": true,\n  \"name\": \"@phenomic/example-react-app-blog\",\n  \"version\": \"1.0.0\",\n  \"devDependencies\": {\n    \"@phenomic/cli\": \"^1.0.0\",\n    \"@phenomic/core\": \"^1.0.0\",\n    \"@phenomic/preset-react-app\": \"^1.0.0\",\n    \"react\": \"^16.8.0\",\n    \"react-dom\": \"^16.8.0\",\n    \"react-helmet\": \"^5.0.0\",\n    \"react-router\": \"^3.2.0\",\n    \"react-topbar-progress-indicator\": \"^2.0.0\",\n    \"simple-json-fetch\": \"^1.0.1\"\n  },\n  \"scripts\": {\n    \"start\": \"phenomic start\",\n    \"build\": \"phenomic build\"\n  },\n  \"phenomic\": {\n    \"presets\": [\n      \"@phenomic/preset-react-app\"\n    ]\n  },\n  \"title\": \"A random blog\",\n  \"twitter\": \"Phenomic_app\",\n  \"github\": \"http://github.com/phenomic/phenomic\"\n}\n"
  },
  {
    "path": "examples/react-app-blog/public/robots.txt",
    "content": "User-agent: *\nDisallow:\n"
  },
  {
    "path": "examples/react-app-blog/src/ActivityIndicator.js",
    "content": "// @flow\n\nimport * as React from \"react\";\nimport TopBarProgressIndicator from \"react-topbar-progress-indicator\";\n\nTopBarProgressIndicator.config({\n  barThickness: 4,\n  barColors: {\n    \"0\": \"#fff\",\n    \"1.0\": \"#fff\",\n  },\n  shadowBlur: 5,\n});\n\nclass ActivityIndicator extends React.PureComponent<{}, { visible: boolean }> {\n  state = {\n    visible: false,\n  };\n\n  _timeout: TimeoutID;\n\n  componentDidMount() {\n    this._timeout = setTimeout(() => this.setState({ visible: true }), 250);\n  }\n  componentWillUnmount() {\n    clearTimeout(this._timeout);\n  }\n\n  render() {\n    return (\n      <React.Fragment>\n        <TopBarProgressIndicator />\n        <style\n          dangerouslySetInnerHTML={{\n            __html: `\n          .ActivityIndicator-loader {\n            display: flex;\n            height: 25vh;\n            justify-content: center;\n            align-items: center;\n          }\n\n          .ActivityIndicator-spinner {\n            height: 5vh;\n            min-height: 5rem;\n            width: 5vh;\n            min-width: 5rem;\n            border: 10px solid rgba(0,0,0,0.2);\n            border-top-color: rgba(0,0,0,0.8);\n            border-radius: 100%;\n            animation: ActivityIndicator-rotation 0.8s infinite linear;\n            transition: opacity 4s;\n          }\n\n          @keyframes ActivityIndicator-rotation {\n            from { transform: rotate(0); }\n            to { transform: rotate(359deg); }\n          }\n        `,\n          }}\n        />\n        <div className=\"ActivityIndicator-loader\">\n          <div\n            className=\"ActivityIndicator-spinner\"\n            style={{ opacity: this.state.visible ? 1 : 0 }}\n          />\n        </div>\n      </React.Fragment>\n    );\n  }\n}\n\nexport default ActivityIndicator;\n"
  },
  {
    "path": "examples/react-app-blog/src/Footer.js",
    "content": "// @flow\n\nimport * as React from \"react\";\nimport { Link } from \"@phenomic/preset-react-app/lib/client\";\n\nimport pkg from \"../package.json\";\n\nconst Footer = () => (\n  <React.Fragment>\n    <style\n      dangerouslySetInnerHTML={{\n        __html: `\n        .Footer {\n          padding: 40px;\n          color: #fff;\n          background: #2c2c2c;\n          font-size: 12px;\n        }\n        .Footer-content {\n          display: flex;\n          flex-direction: row;\n          justify-content: space-between;\n          max-width: 1000px;\n          margin: auto;\n        }\n\n        .Footer-link {\n          color: #fff;\n          padding: 10px;\n        }\n\n        .Footer-link:hover,\n        .Footer-link:focus {\n          color: inherit;\n        }\n        `,\n      }}\n    />\n    <footer className=\"Footer\">\n      <div className=\"Footer-content\">\n        <nav className=\"Footer-part\">\n          <Link className=\"Footer-link\" to=\"/\">\n            Home\n          </Link>\n          <Link className=\"Footer-link\" to=\"/blog/\">\n            Blog\n          </Link>\n          <Link className=\"Footer-link\" to=\"/repositories/\">\n            Repositories\n          </Link>\n          <Link className=\"Footer-link\" to=\"/about/\">\n            About\n          </Link>\n        </nav>\n        <div className=\"Footer-part\">\n          © {new Date().getFullYear()}, {pkg.title}\n        </div>\n      </div>\n    </footer>\n  </React.Fragment>\n);\n\nexport default Footer;\n"
  },
  {
    "path": "examples/react-app-blog/src/Header.js",
    "content": "// @flow\n\nimport * as React from \"react\";\nimport { Link } from \"@phenomic/preset-react-app/lib/client\";\n\nimport pkg from \"../package.json\";\n\nconst Header = (\n  {\n    title,\n    image,\n    light,\n  } /*: {\n    title?: React.Node,\n    image?: string,\n    light?: boolean\n  } */,\n) => (\n  <React.Fragment>\n    <style\n      dangerouslySetInnerHTML={{\n        __html: `\n        .Header {\n          position: relative;\n        }\n\n        .Header-nav {\n          display: flex;\n          flex-direction: row;\n          justify-content: space-between;\n          margin: 0 auto;\n          padding: 0;\n          line-height: 3rem;\n          background: #fff;\n          border-top: 4px solid  #444444;\n        }\n\n        .Header-navPart1,\n        .Header-navPart2 {\n          display: flex;\n          flex-direction: row;\n        }\n\n        .Header-link {\n          display: flex;\n          align-items: center;\n          padding: 0 1rem;\n          color: inherit;\n          text-decoration: none !important;\n          transition: 0.25s all;\n          border-bottom: 4px solid transparent;\n        }\n\n        .Header-link:hover,\n        .Header-link:focus {\n          color: inherit;\n          border-bottom-color: #3E85D2;\n        }\n\n        .Header-hero {\n          position: relative;\n          overflow: hidden;\n          display: flex;\n          flex-direction: column;\n          justify-content: center;\n          min-height: 400px;\n          padding: 3rem;\n          color: #fff;\n          background: #323232;\n        }\n\n        .Header-hero-background {\n          position: absolute;\n          top: 0;\n          right: 0;\n          bottom: 0;\n          left: 0;\n          background-size: cover;\n          background-position: 50% 50%;\n          filter: blur(10px);\n        }\n\n        .Header-hero-title {\n          position: absolute;\n          top: 0;\n          right: 0;\n          bottom: 0;\n          left: 0;\n          margin: 0;\n          padding-bottom: 40px;\n          display: flex;\n          flex-direction: column;\n          justify-content: center;\n          font-size: 52px;\n          font-weight: 300;\n          color: #fff;\n          text-shadow: 0 3px 4px rgba(0,0,0,0.6);\n          text-align: center;\n          box-shadow: inset 0 0 20px rgba(0,0,0,0.2);\n        }\n\n        .Header-light {\n          position: relative;\n          padding: 3rem;\n          text-align: center;\n        }\n\n        .Header-light-title {\n          font-size: 48px;\n          font-weight: 800;\n          margin: 40px 0;\n        }\n      `,\n      }}\n    />\n    <header className=\"Header\">\n      <nav className=\"Header-nav\">\n        <div className=\"Header-navPart1\">\n          <Link className=\"Header-link\" to=\"/\">\n            Home\n          </Link>\n          <Link className=\"Header-link\" to=\"/blog/\">\n            Blog\n          </Link>\n          <Link className=\"Header-link\" to=\"/repositories/\">\n            Repositories\n          </Link>\n          <Link className=\"Header-link\" to=\"/about/\">\n            About\n          </Link>\n        </div>\n        <div className=\"Header-navPart2\">\n          {pkg.twitter && (\n            <a\n              href={`https://twitter.com/${pkg.twitter}`}\n              className=\"Header-link\"\n            >\n              Twitter\n            </a>\n          )}\n          {pkg.github && (\n            <a href={pkg.github} className=\"Header-link\">\n              GitHub\n            </a>\n          )}\n        </div>\n      </nav>\n      {light ? (\n        <div className=\"Header-light\">\n          {title && <h1 className=\"Header-light-title\">{title}</h1>}\n        </div>\n      ) : (\n        <div className=\"Header-hero\">\n          {image && (\n            <div\n              className=\"Header-hero-background\"\n              style={{ backgroundImage: `url(${image})` }}\n            />\n          )}\n          {title && <h1 className=\"Header-hero-title\">{title}</h1>}\n        </div>\n      )}\n    </header>\n  </React.Fragment>\n);\n\nexport default Header;\n"
  },
  {
    "path": "examples/react-app-blog/src/LatestPosts.js",
    "content": "// @flow\n\nimport * as React from \"react\";\nimport { Link } from \"@phenomic/preset-react-app/lib/client\";\n\nconst LatestPosts = (\n  { node, error } /*: { node?: Object, error?: Object } */,\n) => (\n  <React.Fragment>\n    <style\n      dangerouslySetInnerHTML={{\n        __html: `\n        .LatestPosts {\n          margin-bottom: 20px;\n        }\n\n        .LatestPosts h2 {\n          text-align: center;\n          margin: 0;\n          padding: 20px;\n          color: #323232;\n        }\n\n        .LatestPosts-list {\n          max-width: 600px;\n          margin: auto;\n          padding: 0;\n        }\n\n        .LatestPosts-list-item {\n\n        }\n\n        .LatestPosts-list-item-link {\n          display: block;\n          color: #323232 !important;\n          font-size: 18px;\n          padding: 5px;\n        }\n\n        .LatestPosts-nav {\n          font-size: 14px;\n          margin-top: 40px;\n          text-align: center;\n        }\n\n        .LatestPosts-nav a {\n          color: #0067b9;\n        }\n        `,\n      }}\n    />\n    <div className=\"LatestPosts\">\n      <h2>Latests Post</h2>\n      {error && <div className=\"error\">{error.statusText}</div>}\n      {node &&\n        node.list && (\n          <React.Fragment>\n            <ul className=\"LatestPosts-list\">\n              {node.list.map(post => (\n                <li key={post.id} className=\"LatestPosts-list-item\">\n                  <Link\n                    to={`/blog/${post.id}/`}\n                    className=\"LatestPosts-list-item-link\"\n                  >\n                    {post.title || post.id}\n                  </Link>\n                </li>\n              ))}\n            </ul>\n            <div className=\"LatestPosts-nav\">\n              {node &&\n                node.previous && (\n                  <Link\n                    to={\n                      node.previousPageIsFirst\n                        ? `/blog/`\n                        : `/blog/after/${node.previous}/`\n                    }\n                  >\n                    Newer posts\n                  </Link>\n                )}{\" \"}\n              {node &&\n                node.next && (\n                  <Link to={`/blog/after/${node.next}/`}>Older posts</Link>\n                )}\n            </div>\n          </React.Fragment>\n        )}\n    </div>\n  </React.Fragment>\n);\n\nexport default LatestPosts;\n"
  },
  {
    "path": "examples/react-app-blog/src/Layout.js",
    "content": "// @flow\n\nimport * as React from \"react\";\nimport Head from \"react-helmet\";\n\nimport Header from \"./Header.js\";\nimport Footer from \"./Footer.js\";\n\nconst Layout = (\n  {\n    title,\n    image,\n    noHero,\n    children,\n  } /*: {\n    title?: React.Node,\n    image?: string,\n    noHero?: boolean,\n    children: React.Node\n  } */,\n) => (\n  <div className=\"Layout\">\n    <style\n      dangerouslySetInnerHTML={{\n        __html: `\n        html { box-sizing: border-box; }\n        *, *::before, *::after { box-sizing: inherit; }\n\n        html, body {\n          margin: 0;\n          padding: 0;\n\n          /* system font https://medium.com/designing-medium/system-shock-6b1dc6d6596f */\n          font-family: -apple-system, BlinkMacSystemFont, \"Segoe UI\", Roboto, Oxygen, Ubuntu, Cantarell, \"Fira Sans\", \"Droid Sans\", \"Helvetica Neue\", sans-serif;\n          color: #212529;\n        }\n\n        .Layout {\n          display: flex;\n          flex-direction: column;\n          justify-content: center;\n          min-height: 100vh;\n        }\n\n        .Layout-body {\n          flex: 1 0;\n        }\n\n        .Layout-children {\n          position: relative;\n          max-width: 1000px;\n          margin: auto;\n          margin-top: -40px;\n          padding: 20px 40px;\n          background: #fff;\n          border-radius: 3px;\n          font-size: 18px;\n          line-height: 2;\n        }\n\n        .Layout-children a {\n          color: #69BF55;\n        }\n\n        .Layout-children p,\n        .Layout-children ul,\n        .Layout-children ol {\n          margin-bottom: 40px;\n        }\n\n        .Layout hr {\n          border: 0;\n          height: 0;\n          border-top: 1px solid rgba(0, 0, 0, 0.1);\n          border-bottom: 1px solid rgba(255, 255, 255, 0.3);\n          margin: 40px;\n        }\n      `,\n      }}\n    />\n    <Head>\n      <html lang=\"en\" />\n      <meta charSet=\"utf-8\" />\n      <meta name=\"viewport\" content=\"width=device-width, initial-scale=1\" />\n      <title>{title}</title>\n    </Head>\n    <Header title={title} image={image} light={noHero} />\n    <div className=\"Layout-body\">\n      <div className=\"Layout-children\">{children}</div>\n    </div>\n    <Footer />\n  </div>\n);\n\nexport default Layout;\n"
  },
  {
    "path": "examples/react-app-blog/src/Page.js",
    "content": "// @flow\n\nimport * as React from \"react\";\nimport {\n  withPhenomicApi,\n  query,\n  BodyRenderer,\n} from \"@phenomic/preset-react-app/lib/client\";\n\nimport pkg from \"../package.json\";\n\nimport Layout from \"./Layout\";\nimport PageError from \"./PageError\";\nimport ActivityIndicator from \"./ActivityIndicator\";\nimport LatestPosts from \"./LatestPosts\";\n\nconst Page = ({ hasError, isLoading, page, posts }) =>\n  hasError ? (\n    <PageError error={page.error} />\n  ) : (\n    <React.Fragment>\n      <style\n        dangerouslySetInnerHTML={{\n          __html: `\n        .Page {\n          position: relative;\n        }\n\n        .Page-content {\n          margin-bottom: 40px;\n        }\n        `,\n        }}\n      />\n      <Layout\n        title={(page && page.node && page.node.title) || pkg.title}\n        image={page && page.node && page.node.image}\n      >\n        {isLoading && <ActivityIndicator />}\n        {!isLoading && (\n          <React.Fragment>\n            <div className=\"Page-content\">\n              {page &&\n                page.node &&\n                page.node.body && <BodyRenderer>{page.node.body}</BodyRenderer>}\n            </div>\n            <hr />\n            <LatestPosts node={posts.node} error={posts.error} />\n          </React.Fragment>\n        )}\n      </Layout>\n    </React.Fragment>\n  );\n\nexport default withPhenomicApi(Page, props => ({\n  page: query({\n    path: \"content/pages\",\n    id: props.params.splat || \"\",\n  }),\n  posts: query({\n    path: \"content/posts\",\n    limit: 4,\n    after: props.params.after,\n  }),\n}));\n"
  },
  {
    "path": "examples/react-app-blog/src/PageBlog.js",
    "content": "// @flow\n\nimport * as React from \"react\";\nimport { withPhenomicApi, query } from \"@phenomic/preset-react-app/lib/client\";\n\nimport pkg from \"../package.json\";\n\nimport Layout from \"./Layout\";\nimport PageError from \"./PageError\";\nimport ActivityIndicator from \"./ActivityIndicator\";\nimport LatestPosts from \"./LatestPosts\";\n\nconst PageBlog = ({ hasError, isLoading, posts }) =>\n  hasError ? (\n    <PageError error={posts.error} />\n  ) : (\n    <React.Fragment>\n      <style\n        dangerouslySetInnerHTML={{\n          __html: `\n        .PageBlog {\n          position: relative;\n        }\n\n        .PageBlog-content {\n          margin-bottom: 40px;\n        }\n        `,\n        }}\n      />\n      <Layout\n        title={pkg.title}\n        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\"\n      >\n        {isLoading && <ActivityIndicator />}\n        {!isLoading && <LatestPosts node={posts.node} />}\n      </Layout>\n    </React.Fragment>\n  );\n\nexport default withPhenomicApi(PageBlog, props => ({\n  posts: query({\n    path: \"content/posts\",\n    limit: 6,\n    after: props.params.after,\n  }),\n}));\n"
  },
  {
    "path": "examples/react-app-blog/src/PageBlogPost.js",
    "content": "// @flow\n\nimport * as React from \"react\";\nimport { withPhenomicApi, query } from \"@phenomic/preset-react-app/lib/client\";\n\nimport PageError from \"./PageError\";\nimport PostLayoutDefault from \"./PostLayoutDefault\";\nimport PostLayoutNoHero from \"./PostLayoutNoHero\";\n\nconst layouts = {\n  default: PostLayoutDefault,\n  light: PostLayoutNoHero,\n};\n\nconst PageBlogPost = ({ hasError, isLoading, post }) => {\n  if (hasError) {\n    return <PageError error={post.error} />;\n  }\n\n  const PostLayout =\n    (post.node && layouts[post.node.layout]) || layouts.default;\n  return <PostLayout isLoading={isLoading} post={post} />;\n};\n\nexport default withPhenomicApi(PageBlogPost, props => ({\n  post: query({ path: \"content/posts\", id: props.params.splat }),\n}));\n"
  },
  {
    "path": "examples/react-app-blog/src/PageError.js",
    "content": "// @flow\n\nimport * as React from \"react\";\n\nimport Layout from \"./Layout\";\n\nconst PageError = ({ error } /*: { error?: Object } */) => {\n  const status = (error && error.status) || 404;\n  const message = error && status !== 404 ? error.statusText : \"Page not found\";\n  const more =\n    error && typeof error.json === \"object\"\n      ? error.json.message\n      : status === 404 && (\n          <React.Fragment>\n            {\"It seems you found a broken link. \"}\n            {\"Sorry about that. \"}\n            <br />\n            {\"Do not hesitate to report this page.\"}\n          </React.Fragment>\n        );\n\n  return (\n    <React.Fragment>\n      {/* <TopBarProgressIndicator /> */}\n      <style\n        dangerouslySetInnerHTML={{\n          __html: `\n        .PageError {\n          display: flex;\n          flex-direction: column;\n          justify-content: center;\n          align-items: center;\n          min-height: 50vh;\n          padding: 1rem 0;\n        }\n\n        .PageError-oops {\n          font-size: 4rem;\n          line-height: 4rem;\n          color: #ddd;\n        }\n\n        .PageError-title {\n          margin: 4rem 0;\n          font-size: 2rem;\n          line-height: 3rem;\n          text-align: center;\n        }\n      `,\n        }}\n      />\n      <Layout title={message}>\n        <div className=\"PageError\">\n          <div className=\"PageError-oops\">{\"😱 Oooops!\"}</div>\n          <div>\n            <p className=\"PageError-title\">\n              <strong>{status}</strong> {message}\n            </p>\n            <div>{more}</div>\n          </div>\n        </div>\n      </Layout>\n    </React.Fragment>\n  );\n};\n\nexport default PageError;\n"
  },
  {
    "path": "examples/react-app-blog/src/PageRepositories.js",
    "content": "// @flow\n\nimport * as React from \"react\";\nimport jsonFetch from \"simple-json-fetch\";\nimport { withInitialProps, Link } from \"@phenomic/preset-react-app/lib/client\";\n\nimport Layout from \"./Layout\";\nimport PageError from \"./PageError\";\nimport ActivityIndicator from \"./ActivityIndicator\";\n\ntype props = {|\n  status: \"loading\" | \"ready\" | \"error\",\n  error?: any,\n  repos?: $ReadOnlyArray<Object>,\n  prev?: number,\n  next?: number,\n  first?: number,\n  // last?: number,\n|};\n\nconst endpoint =\n  \"https://api.github.com/users/MoOx/repos?type=owner&sort=updated&per_page=5\";\n\nclass PageRepositories extends React.PureComponent<props, void> {\n  // SSR and CSR\n  static async getInitialProps({ params }) {\n    const res = await jsonFetch(endpoint + \"&page=\" + (params.page || \"1\"));\n    return {\n      repos: res.json,\n      ...getPagesProps(res),\n    };\n  }\n\n  // SSR only\n  static async getAllPossibleUrls({ path }) {\n    if (!path.includes(\":page\")) return [path];\n    const res = await jsonFetch(endpoint);\n    return (\n      [...Array(getPagesProps(res).last + 1).keys()]\n        .slice(2) // skip 0 (useless) & 1 (as 1 is the root)\n        .map(page => path.replace(\":page\", page))\n        // just for the demo, github api is limited to 60 call per hour without auth\n        // so we just pre-render 3 pages\n        .slice(0, 3)\n    );\n  }\n\n  render() {\n    const { status } = this.props;\n    return status === \"error\" ? (\n      <PageError error={this.props.error} />\n    ) : (\n      <React.Fragment>\n        <style\n          dangerouslySetInnerHTML={{\n            __html: `\n        .PageRepositories {\n          position: relative;\n        }\n\n        .PageRepositories-content {\n          margin-bottom: 40px;\n        }\n\n        .PageRepositories-repo {\n          position: relative;\n        }\n\n        .PageRepositories-repo-date {\n          color: #bbb;\n          font-size: 10px;\n        }\n\n        .PageRepositories-repo-star {\n          position: absolute;\n          top: 0;\n          right: 0;\n        }\n\n        .PageRepositories-nav {\n          display: flex;\n          flex-direction: row;\n          justify-content: space-between;\n        }\n        `,\n          }}\n        />\n        <Layout\n          title={\"My repositories\"}\n          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\"\n        >\n          {status === \"loading\" && <ActivityIndicator />}\n          {status === \"ready\" &&\n            this.props.repos && (\n              <React.Fragment>\n                <div className=\"PageRepositories-content\">\n                  {this.props.repos.map(repo => (\n                    <React.Fragment key={repo.name}>\n                      <div className=\"PageRepositories-repo\">\n                        <a href={repo.html_url}>\n                          <strong>{repo.name}</strong>\n                        </a>\n                        <div>{repo.description}</div>\n                        <div className=\"PageRepositories-repo-date\">\n                          Updated: {new Date(repo.updated_at).toUTCString()}\n                        </div>\n                        <div className=\"PageRepositories-repo-star\">\n                          ★ {repo.stargazers_count}\n                        </div>\n                      </div>\n                      <hr />\n                    </React.Fragment>\n                  ))}\n                </div>\n                <div className=\"PageRepositories-nav\">\n                  <div className=\"PageRepositories-nav-item\">\n                    {this.props.prev && (\n                      <Link\n                        to={\n                          this.props.prev === this.props.first\n                            ? `/repositories/`\n                            : `/repositories/page/${this.props.prev}/`\n                        }\n                      >\n                        Previous repositories\n                      </Link>\n                    )}\n                  </div>\n                  <div className=\"PageRepositories-nav-item\">\n                    {this.props.next && (\n                      <Link to={`/repositories/page/${this.props.next}/`}>\n                        More repositories\n                      </Link>\n                    )}\n                  </div>\n                </div>\n              </React.Fragment>\n            )}\n        </Layout>\n      </React.Fragment>\n    );\n  }\n}\n\nexport default withInitialProps(PageRepositories);\n\n/* Transform GitHub HTTP `Link` header to an object\n\n  '<https://api.github.com/search/code?q=addClass+user%3Amozilla&page=15>; rel=\"next\",\n  <https://api.github.com/search/code?q=addClass+user%3Amozilla&page=34>; rel=\"last\",\n  <https://api.github.com/search/code?q=addClass+user%3Amozilla&page=1>; rel=\"first\",\n  <https://api.github.com/search/code?q=addClass+user%3Amozilla&page=13>; rel=\"prev\"'\n\n  becomes\n\n  {\n    next: 15,\n    last: 34,\n    first: 1,\n    prev: 13,\n  }\n*/\nfunction getPagesProps(\n  res: Response,\n): {|\n  prev?: number,\n  next?: number,\n  first?: number,\n  last: number,\n|} {\n  const link = res.headers.get(\"Link\") || res.headers.get(\"link\") || \"\";\n  const almostParams = link.split(/(page=\\d+>; rel=\"[a-z]+)\"/);\n  const pages = {};\n  for (let i = 1; i < almostParams.length; i = i + 2) {\n    const page = almostParams[i]\n      .replace(\"page=\", \"\")\n      .replace('; rel=\"', \"\")\n      .split(\">\");\n    pages[page[1]] = parseInt(page[0], 10);\n  }\n  // $FlowFixMe we know what we receive :)\n  return pages;\n}\n"
  },
  {
    "path": "examples/react-app-blog/src/PostLayoutDefault.js",
    "content": "// @flow\n\nimport * as React from \"react\";\nimport Head from \"react-helmet\";\nimport {\n  BodyRenderer,\n  textRenderer,\n} from \"@phenomic/preset-react-app/lib/client\";\n\nimport Layout from \"./Layout\";\nimport ActivityIndicator from \"./ActivityIndicator\";\n\nconst PostLayoutDefault = (\n  { isLoading, post } /*: { isLoading: boolean, post: Object }*/,\n) => (\n  <Layout title={post && post.node && post.node.title}>\n    {isLoading && <ActivityIndicator />}\n    {!isLoading &&\n      post.node && (\n        <React.Fragment>\n          <Head>\n            <meta\n              name=\"description\"\n              content={textRenderer(post.node.body).slice(0, 150) + \"…\"}\n            />\n          </Head>\n          <BodyRenderer>{post.node.body}</BodyRenderer>\n        </React.Fragment>\n      )}\n  </Layout>\n);\n\nexport default PostLayoutDefault;\n"
  },
  {
    "path": "examples/react-app-blog/src/PostLayoutNoHero.js",
    "content": "// @flow\n\nimport * as React from \"react\";\nimport Head from \"react-helmet\";\nimport {\n  BodyRenderer,\n  textRenderer,\n} from \"@phenomic/preset-react-app/lib/client\";\n\nimport Layout from \"./Layout\";\nimport ActivityIndicator from \"./ActivityIndicator\";\n\nconst PostLayoutNoHero = (\n  { isLoading, post } /*: { isLoading: boolean, post: Object }*/,\n) => (\n  <Layout title={post && post.node && post.node.title} noHero={true}>\n    {isLoading && <ActivityIndicator />}\n    {!isLoading &&\n      post.node && (\n        <React.Fragment>\n          <Head>\n            <meta\n              name=\"description\"\n              content={textRenderer(post.node.body).slice(0, 150) + \"…\"}\n            />\n          </Head>\n          <BodyRenderer>{post.node.body}</BodyRenderer>\n        </React.Fragment>\n      )}\n  </Layout>\n);\n\nexport default PostLayoutNoHero;\n"
  },
  {
    "path": "examples/react-app-getting-started/App.js",
    "content": "// @flow\n\nimport * as React from \"react\";\nimport Head from \"react-helmet\";\nimport { Router, Route, browserHistory, Link } from \"react-router\";\nimport {\n  createApp,\n  renderApp,\n  withPhenomicApi,\n  query,\n  BodyRenderer,\n  textRenderer,\n} from \"@phenomic/preset-react-app/lib/client\";\n\nconst Home = ({ isLoading, posts }) => (\n  <Layout>\n    <Head>\n      <title>Hello world</title>\n      <meta name=\"description\" content=\"Everything is awesome!\" />\n    </Head>\n    <h1>Home</h1>\n    {isLoading && \"Loading...\"}\n    {!isLoading && (\n      <ul>\n        {posts &&\n          posts.node &&\n          posts.node.list &&\n          posts.node.list.map(post => (\n            <li key={post.id}>\n              <Link to={`/blog/${post.id}/`}>{post.title || post.id}</Link>\n            </li>\n          ))}\n      </ul>\n    )}\n    <div>\n      {posts.node &&\n        posts.node.previous && (\n          <Link\n            to={\n              posts.node.previousPageIsFirst\n                ? `/`\n                : `/after/${posts.node.previous}/`\n            }\n          >\n            Newer posts\n          </Link>\n        )}{\" \"}\n      {posts.node &&\n        posts.node.next && (\n          <Link to={`/after/${posts.node.next}/`}>Older posts</Link>\n        )}\n    </div>\n  </Layout>\n);\n\nconst HomeContainer = withPhenomicApi(Home, props => ({\n  posts: query({\n    path: \"content/posts\",\n    limit: 2,\n    after: props.params.after,\n  }),\n}));\n\nconst DefaultPostLayout = ({ title, body }) => (\n  <article>\n    <Head>\n      <title>{title}</title>\n      <meta\n        name=\"description\"\n        content={textRenderer(body).slice(0, 150) + \"…\"}\n      />\n    </Head>\n    <h1>{title}</h1>\n    <BodyRenderer>{body}</BodyRenderer>\n  </article>\n);\n\nconst HeroPostLayout = ({ title, body }) => (\n  <article>\n    <Head>\n      <title>{title}</title>\n      <meta\n        name=\"description\"\n        content={textRenderer(body).slice(0, 150) + \"…\"}\n      />\n    </Head>\n    <div style={{ padding: \"4rem\", background: \"pink\", color: \"#fff\" }}>\n      <h1>{title}</h1>\n    </div>\n    <BodyRenderer>{body}</BodyRenderer>\n  </article>\n);\n\nconst PostLayouts = {\n  default: DefaultPostLayout,\n  hero: HeroPostLayout,\n};\n\nconst BlogPost = ({ hasError, isLoading, page }) => {\n  if (hasError) {\n    return <PageError error={page.error} />;\n  }\n\n  const PostLayout =\n    (page.node && PostLayouts[page.node.layout]) || PostLayouts.default;\n  return (\n    <Layout>\n      {isLoading && \"Loading...\"}\n      {!isLoading && page.node && <PostLayout {...page.node} />}\n      <footer>\n        <Link to=\"/\">Go to home</Link>\n      </footer>\n    </Layout>\n  );\n};\n\nconst BlogPostContainer = withPhenomicApi(BlogPost, props => ({\n  page: query({ path: \"content/posts\", id: props.params.splat }),\n}));\n\nconst PageError = ({ error }) => {\n  const status = (error && error.status) || 404;\n  const message = error && status !== 404 ? error.statusText : \"Page not found\";\n\n  return (\n    <div>\n      <Head>\n        <title>{message}</title>\n      </Head>\n      <h1>{message}</h1>\n    </div>\n  );\n};\n\nconst Layout = ({ children }) => (\n  <div>\n    <Head>\n      <html lang=\"en\" />\n      <meta charSet=\"utf-8\" />\n      <meta name=\"viewport\" content=\"width=device-width, initial-scale=1\" />\n    </Head>\n    <header>{/* ... */}</header>\n    <div>{children}</div>\n    <footer>{/* ... */}</footer>\n  </div>\n);\n\nconst routes = () => (\n  <Router history={browserHistory}>\n    <Route path=\"/\" component={HomeContainer} />\n    <Route path=\"/after/:after\" component={HomeContainer} />\n    <Route path=\"/blog/*\" component={BlogPostContainer} />\n    <Route path=\"*\" component={PageError} />\n  </Router>\n);\n\nexport default createApp(routes);\n\nif (module.hot) {\n  module.hot.accept(() => renderApp(routes));\n}\n"
  },
  {
    "path": "examples/react-app-getting-started/Html.js",
    "content": "// @flow\n\nimport * as React from \"react\";\nimport Head from \"react-helmet\";\n\nexport default ({ App, render }: PhenomicHtmlPropsType) => {\n  // if needed, you can know if you are in development or in static rendering\n  // const isDev = process.env.PHENOMIC_ENV === \"development\"\n  const { Main, State, Script, Style } = render(<App />);\n  const helmet = Head.renderStatic();\n  return (\n    // $FlowFixMe helmet is fine\n    <html {...helmet.htmlAttributes.toComponent()}>\n      <head>\n        {helmet.meta.toComponent()}\n        {helmet.title.toComponent()}\n        {helmet.base.toComponent()}\n        <Style />\n        {helmet.link.toComponent()}\n        {helmet.style.toComponent()}\n        {helmet.script.toComponent()}\n        {helmet.noscript.toComponent()}\n      </head>\n      {/* // $FlowFixMe it works on my machine */}\n      <body {...helmet.bodyAttributes.toComponent()}>\n        <Main />\n        <State />\n        <Script />\n      </body>\n    </html>\n  );\n};\n"
  },
  {
    "path": "examples/react-app-getting-started/README.md",
    "content": "# Getting Started with Phenomic + React preset\n\nYou can find the complete tutorial of this example in\n[phenomic/packages/preset-react-app/docs/getting-started](https://github.com/phenomic/phenomic/blob/master/packages/preset-react-app/docs/getting-started/README.md)\n"
  },
  {
    "path": "examples/react-app-getting-started/__tests__/__snapshots__/index.js.snap",
    "content": "// Jest Snapshot v1, https://goo.gl/fbAQLP\n\nexports[`should build example correctly 1`] = `\nArray [\n  \"after/c2Vjb25kLXBvc3Q=/index.html\",\n  \"after/dGhpcmQtcG9zdA==/index.html\",\n  \"after/Zm91cnRoLXBvc3Q=/index.html\",\n  \"after/ZmlmdGgtcG9zdA==/index.html\",\n  \"after/Zmlyc3QtcG9zdA==/index.html\",\n  \"blog/fifth-post/index.html\",\n  \"blog/first-post/index.html\",\n  \"blog/fourth-post/index.html\",\n  \"blog/second-post/index.html\",\n  \"blog/third-post/index.html\",\n  \"index.html\",\n]\n`;\n\nexports[`should build example correctly 2`] = `\nArray [\n  \"phenomic/content/posts/by-default/1/desc/date/limit-2.json\",\n  \"phenomic/content/posts/by-default/1/desc/date/limit-2/after-c2Vjb25kLXBvc3Q=.json\",\n  \"phenomic/content/posts/by-default/1/desc/date/limit-2/after-dGhpcmQtcG9zdA==.json\",\n  \"phenomic/content/posts/by-default/1/desc/date/limit-2/after-Zm91cnRoLXBvc3Q=.json\",\n  \"phenomic/content/posts/by-default/1/desc/date/limit-2/after-ZmlmdGgtcG9zdA==.json\",\n  \"phenomic/content/posts/by-default/1/desc/date/limit-2/after-Zmlyc3QtcG9zdA==.json\",\n  \"phenomic/content/posts/item/fifth-post.json\",\n  \"phenomic/content/posts/item/first-post.json\",\n  \"phenomic/content/posts/item/fourth-post.json\",\n  \"phenomic/content/posts/item/second-post.json\",\n  \"phenomic/content/posts/item/third-post.json\",\n]\n`;\n\nexports[`should build example correctly 3`] = `\nArray [\n  \"favicon.ico\",\n  \"robots.txt\",\n]\n`;\n"
  },
  {
    "path": "examples/react-app-getting-started/__tests__/index.js",
    "content": "// @flow\n\n/* eslint-disable import/no-extraneous-dependencies */\nimport path from \"path\";\nimport fs from \"fs\";\n\nimport globby from \"globby\";\n\nit(\"should build example correctly\", () => {\n  const testFolder = __dirname + \"/../dist\";\n  const files = globby.sync(\"**/*\", {\n    cwd: testFolder,\n    nodir: true,\n    dot: true,\n  });\n\n  // should have html files\n  const htmlFiles = files.filter(file => file.endsWith(\".html\"));\n  expect(htmlFiles).toMatchSnapshot();\n\n  const jsonApiFiles = files.filter(\n    file => file.startsWith(\"phenomic\") && file.endsWith(\".json\"),\n  );\n  // should have matching json files\n  expect(jsonApiFiles).toMatchSnapshot();\n\n  // should have assets\n  const assetsBundlerFiles = files.filter(\n    file =>\n      !htmlFiles.includes(file) &&\n      !jsonApiFiles.includes(file) &&\n      file.startsWith(\"phenomic\"),\n  );\n  expect(assetsBundlerFiles.length).toBe(1);\n  expect(\n    files.filter(\n      file =>\n        !htmlFiles.includes(file) &&\n        !jsonApiFiles.includes(file) &&\n        !assetsBundlerFiles.includes(file),\n    ),\n  ).toMatchSnapshot();\n\n  const file1 = fs.readFileSync(\n    path.join(__dirname, \"..\", \"dist\", \"index.html\"),\n    { encoding: \"utf8\" },\n  );\n  expect(file1).toContain(\"Fifth post\");\n  expect(file1).toContain('<title data-react-helmet=\"true\">Hello world');\n  const file2 = fs.readFileSync(\n    path.join(\n      __dirname,\n      \"..\",\n      \"dist\",\n      \"after\",\n      \"dGhpcmQtcG9zdA==\",\n      \"index.html\",\n    ),\n    { encoding: \"utf8\" },\n  );\n  expect(file2).toContain(\"Third post\");\n});\n"
  },
  {
    "path": "examples/react-app-getting-started/content/posts/fifth-post.md",
    "content": "---\ntitle: \"Fifth post\"\ndate: \"2017-01-05\"\nlayout: hero\n---\n\nAnother post that have a [link to the first one](../first-post/).\n\nAn wrong link to [a post that does not exist](../unknown-post/) and another one\nto [a page that does not exist](/unknown-page/).\n\nHere is an [external link](http://phenomic.io).\n"
  },
  {
    "path": "examples/react-app-getting-started/content/posts/first-post.md",
    "content": "---\ntitle: \"First post\"\ndate: \"2017-01-01\"\n---\n\n# This is a [Markdown](https://en.wikipedia.org/wiki/Markdown#Example) file\n\nIf you are new to Markdown, you might want to check those links:\n\n- [What is Markdown?](http://whatismarkdown.com/)\n- [Mastering Markdown, a GitHub guide](https://guides.github.com/features/mastering-markdown/)\n- [wikipedia.org/wiki/Markdown](https://en.wikipedia.org/wiki/Markdown#Example)\n- [masteringmarkdown.com](http://masteringmarkdown.com/)\n"
  },
  {
    "path": "examples/react-app-getting-started/content/posts/fourth-post.md",
    "content": "---\ntitle: \"Fourth post\"\ndate: \"2017-01-04\"\n---\n\nAnother post\n"
  },
  {
    "path": "examples/react-app-getting-started/content/posts/second-post.md",
    "content": "---\ntitle: \"Second post\"\ndate: \"2017-01-02\"\n---\n\nAnother post\n"
  },
  {
    "path": "examples/react-app-getting-started/content/posts/third-post.md",
    "content": "---\ntitle: \"Third post\"\ndate: \"2017-01-03\"\n---\n\nAnother post\n"
  },
  {
    "path": "examples/react-app-getting-started/package.json",
    "content": "{\n  \"private\": true,\n  \"name\": \"@phenomic/example-react-app-getting-started\",\n  \"version\": \"1.0.0\",\n  \"devDependencies\": {\n    \"@phenomic/cli\": \"^1.0.0\",\n    \"@phenomic/core\": \"^1.0.0\",\n    \"@phenomic/preset-react-app\": \"^1.0.0\",\n    \"react\": \"^16.8.0\",\n    \"react-dom\": \"^16.8.0\",\n    \"react-helmet\": \"^5.0.0\",\n    \"react-router\": \"^3.2.0\"\n  },\n  \"scripts\": {\n    \"start\": \"phenomic start\",\n    \"build\": \"phenomic build\"\n  },\n  \"phenomic\": {\n    \"presets\": [\n      \"@phenomic/preset-react-app\"\n    ]\n  }\n}\n"
  },
  {
    "path": "examples/react-app-getting-started/public/robots.txt",
    "content": "User-agent: *\nDisallow:\n"
  },
  {
    "path": "examples/react-app-markdown-with-custom-components/App.js",
    "content": "// @noflow\n\nimport * as React from \"react\";\nimport { Router, Route, browserHistory } from \"react-router\";\nimport {\n  createApp,\n  withPhenomicApi,\n  query,\n  BodyRenderer,\n} from \"@phenomic/preset-react-app/lib/client\";\n\nconst componentsMap = {\n  uppercase: props => props.children.map(child => child.toUpperCase()),\n  expand: class Expand extends React.Component<\n    { children: React.Node },\n    { isExpanded: boolean },\n  > {\n    state = {\n      isExpanded: false,\n    };\n    filterChild = child =>\n      typeof child !== \"string\" || child.replace(/\\s/g, \"\") !== \"\";\n    filterChildren = (children: React.Node) =>\n      Array.isArray(children)\n        ? children.filter(this.filterChild)\n        : this.filterChild(children)\n          ? [children]\n          : [];\n\n    handleClick = () => {\n      this.setState(prevState => ({ isExpanded: !prevState.isExpanded }));\n    };\n    render() {\n      const children = this.filterChildren(this.props.children);\n      return (\n        <div>\n          <div onClick={this.handleClick}>{children[0]}</div>\n          {this.state.isExpanded && <div>{children.slice(1)}</div>}\n        </div>\n      );\n    }\n  },\n  title: props => (\n    <div style={{ border: \"1px solid blue\", padding: \"10px \" }}>\n      {props.children}\n    </div>\n  ),\n  content: props => (\n    <div style={{ border: \"1px solid red\", padding: \"10px\" }}>\n      {props.children}\n    </div>\n  ),\n  draft: props =>\n    process.env.NODE_ENV !== \"production\" && (\n      <div style={{ opacity: 0.5 }}>{props.children}</div>\n    ),\n};\n\nconst Content = ({ hasError, isLoading, page }) => {\n  if (hasError) {\n    return \"Error!\";\n  }\n\n  return (\n    <div>\n      {isLoading && \"Loading...\"}\n      {!isLoading &&\n        page.node && (\n          <div>\n            <h1>{page.node.title}</h1>\n            <BodyRenderer components={componentsMap}>\n              {page.node.body}\n            </BodyRenderer>\n          </div>\n        )}\n    </div>\n  );\n};\n\nconst ContentContainer = withPhenomicApi(Content, () => ({\n  page: query({ id: \"content\" }),\n}));\n\nexport default createApp(() => (\n  <Router history={browserHistory}>\n    <Route path=\"/\" component={ContentContainer} />\n  </Router>\n));\n"
  },
  {
    "path": "examples/react-app-markdown-with-custom-components/README.md",
    "content": "# React app: markdown with custom components\n\nThis example show you own to render normal and custom html tags as your own\nReact components.\n\n_In short, you can replace `<sometag>` by a react component `SomeTag` and get\nchildren nodes (text or other nodes) as objects (not just raw html) to render\nthose as you like._\n\n🚀 **So wow, such power!**\n\n---\n\nSee\n[the raw markdown file](https://raw.githubusercontent.com/phenomic/phenomic/master/examples/react-app-markdown-with-custom-components/content/index.md)\nand the\n[components map](https://github.com/phenomic/phenomic/blob/master/examples/react-app-markdown-with-custom-components/App.js)\nto get an idea of the power this feature unlocks.\n"
  },
  {
    "path": "examples/react-app-markdown-with-custom-components/__tests__/index.js",
    "content": "// @flow\n\n/* eslint-disable import/no-extraneous-dependencies */\nimport path from \"path\";\nimport fs from \"fs\";\n\nit(\"should build example correctly\", () => {\n  const file1 = fs.readFileSync(\n    path.join(__dirname, \"..\", \"dist\", \"index.html\"),\n    { encoding: \"utf8\" },\n  );\n  expect(file1).toContain(\"This is a Markdown file\");\n  expect(file1).not.toContain(\n    \">This is some content visible during development only\",\n    // - \">\" is important in this test as we test it's not in the html\n    // but it's in the json as in this example we filter during rendering\n    // - well it's bad, isn't it?\n    // - not sure as you can imagine a toggle to enable draft doc!\n  );\n});\n"
  },
  {
    "path": "examples/react-app-markdown-with-custom-components/content/index.md",
    "content": "---\ntitle: \"This is a Markdown file\"\n---\n\nBut with some <strong>custom html tags</strong>. <Strong>But be careful, all\ntags ends-up are lowercase!</Strong>. This is because old school HTML IN\nUPPERCASE LIKE <BUTTON>BUTTON</BUTTON> works like a <button>button</button>.\n\nNote that you can create <uppercase>CustomTag that can just uppercase\nstings</uppercase>.\n\nYou can even leverage children to make dynamic stuff.\n\n<expand>\n  <title>Click me!</title>\n  <content>\n    This is some content!\n  </content>\n</expand>\n\nYou can even hide some parts that are not ready yet!\n\n<draft>\nThis is some content visible during development only\n</draft>\n"
  },
  {
    "path": "examples/react-app-markdown-with-custom-components/package.json",
    "content": "{\n  \"private\": true,\n  \"name\": \"@phenomic/example-react-app-markdown-with-custom-components\",\n  \"version\": \"1.0.0\",\n  \"devDependencies\": {\n    \"@phenomic/cli\": \"^1.0.0\",\n    \"@phenomic/core\": \"^1.0.0\",\n    \"@phenomic/preset-react-app\": \"^1.0.0\",\n    \"react\": \"^16.8.0\",\n    \"react-dom\": \"^16.8.0\",\n    \"react-router\": \"^3.2.0\"\n  },\n  \"scripts\": {\n    \"start\": \"phenomic start\",\n    \"build\": \"phenomic build\"\n  },\n  \"phenomic\": {\n    \"presets\": [\n      \"@phenomic/preset-react-app\"\n    ]\n  }\n}\n"
  },
  {
    "path": "examples/react-app-minimal-hello-world/App.js",
    "content": "// @flow\n\nimport * as React from \"react\";\nimport { Router, Route, browserHistory } from \"react-router\";\nimport { createApp } from \"@phenomic/preset-react-app/lib/client\";\n// import { createApp, renderApp } from \"@phenomic/preset-react-app/lib/client\";\n\nexport default createApp(() => (\n  <Router history={browserHistory}>\n    <Route path=\"/\" component={() => <div>Hello world!</div>} />\n  </Router>\n));\n\n// uncommment to get hot loading\n// if (module.hot) {\n//   module.hot.accept(() => renderApp(routes));\n// }\n"
  },
  {
    "path": "examples/react-app-minimal-hello-world/__tests__/__snapshots__/index.js.snap",
    "content": "// Jest Snapshot v1, https://goo.gl/fbAQLP\n\nexports[`should build example correctly 1`] = `\nArray [\n  \"index.html\",\n]\n`;\n\nexports[`should build example correctly 2`] = `Array []`;\n\nexports[`should build example correctly 3`] = `Array []`;\n"
  },
  {
    "path": "examples/react-app-minimal-hello-world/__tests__/index.js",
    "content": "// @flow\n\n/* eslint-disable import/no-extraneous-dependencies */\nimport globby from \"globby\";\n\nit(\"should build example correctly\", () => {\n  const testFolder = __dirname + \"/../dist\";\n  const files = globby.sync(\"**/*\", {\n    cwd: testFolder,\n    nodir: true,\n    dot: true,\n  });\n\n  // should have html files\n  const htmlFiles = files.filter(file => file.endsWith(\".html\"));\n  expect(htmlFiles).toMatchSnapshot();\n\n  const jsonApiFiles = files.filter(\n    file => file.startsWith(\"phenomic\") && file.endsWith(\".json\"),\n  );\n  // should have matching json files\n  expect(jsonApiFiles).toMatchSnapshot();\n\n  // should have assets\n  const assetsBundlerFiles = files.filter(\n    file =>\n      !htmlFiles.includes(file) &&\n      !jsonApiFiles.includes(file) &&\n      file.startsWith(\"phenomic\"),\n  );\n  expect(assetsBundlerFiles.length).toBe(1);\n  expect(\n    files.filter(\n      file =>\n        !htmlFiles.includes(file) &&\n        !jsonApiFiles.includes(file) &&\n        !assetsBundlerFiles.includes(file),\n    ),\n  ).toMatchSnapshot();\n});\n"
  },
  {
    "path": "examples/react-app-minimal-hello-world/package.json",
    "content": "{\n  \"private\": true,\n  \"name\": \"@phenomic/example-react-app-minimal-hello-world\",\n  \"version\": \"1.0.0\",\n  \"devDependencies\": {\n    \"@phenomic/cli\": \"^1.0.0\",\n    \"@phenomic/core\": \"^1.0.0\",\n    \"@phenomic/preset-react-app\": \"^1.0.0\",\n    \"react\": \"^16.8.0\",\n    \"react-dom\": \"^16.8.0\",\n    \"react-router\": \"^3.2.0\"\n  },\n  \"scripts\": {\n    \"start\": \"phenomic start\",\n    \"build\": \"phenomic build\"\n  },\n  \"phenomic\": {\n    \"presets\": [\n      \"@phenomic/preset-react-app\"\n    ]\n  }\n}\n"
  },
  {
    "path": "examples/react-app-styles-with-aphrodite/App.js",
    "content": "// @flow\n\nimport * as React from \"react\";\nimport { Router, Route, browserHistory } from \"react-router\";\nimport { createApp } from \"@phenomic/preset-react-app/lib/client\";\nimport { StyleSheet, css } from \"aphrodite/no-important\";\n\nif (typeof window !== \"undefined\" && window._aphrodite) {\n  StyleSheet.rehydrate(window._aphrodite);\n}\n\nconst styles = StyleSheet.create({\n  title: {\n    fontSize: \"1.5em\",\n    textAlign: \"center\",\n    color: \"palevioletred\",\n  },\n  title2: {\n    fontSize: \"2em\",\n    textAlign: \"right\",\n    color: \"blue\",\n  },\n});\n\nexport default createApp(() => (\n  <Router history={browserHistory}>\n    <Route\n      path=\"/\"\n      component={() => <h1 className={css(styles.title)}>Hello World!</h1>}\n    />\n    <Route\n      path=\"/2\"\n      component={() => <h1 className={css(styles.title2)}>Hello again!</h1>}\n    />\n  </Router>\n));\n"
  },
  {
    "path": "examples/react-app-styles-with-aphrodite/Html.js",
    "content": "// @flow\n\nimport * as React from \"react\";\nimport { StyleSheetServer } from \"aphrodite/no-important\";\n\nexport default ({ App, render }: PhenomicHtmlPropsType) => {\n  const {\n    html: { Main, State, Script },\n    css,\n  } = StyleSheetServer.renderStatic(() => render(<App />));\n\n  return (\n    <html>\n      <head>\n        <style data-aphrodite={true}>{css.content}</style>\n      </head>\n      <body>\n        <Main />\n        <State />\n        <script\n          dangerouslySetInnerHTML={{\n            __html: `window._aphrodite = ${JSON.stringify(\n              css.renderedClassNames,\n            )}`,\n          }}\n        />\n        <Script />\n      </body>\n    </html>\n  );\n};\n"
  },
  {
    "path": "examples/react-app-styles-with-aphrodite/__tests__/index.js",
    "content": "// @flow\n\n/* eslint-disable import/no-extraneous-dependencies */\nimport path from \"path\";\nimport fs from \"fs\";\n\nit(\"should build example correctly\", () => {\n  const file1 = fs.readFileSync(\n    path.join(__dirname, \"..\", \"dist\", \"index.html\"),\n    { encoding: \"utf8\" },\n  );\n  expect(file1).toContain(\"Hello World!\");\n  expect(file1).toContain(\n    \"font-size:1.5em;text-align:center;color:palevioletred\",\n  );\n\n  const file2 = fs.readFileSync(\n    path.join(__dirname, \"..\", \"dist\", \"2\", \"index.html\"),\n    { encoding: \"utf8\" },\n  );\n  expect(file2).toContain(\"Hello again!\");\n  expect(file2).toContain(\"font-size:2em;text-align:right;color:blue\");\n});\n"
  },
  {
    "path": "examples/react-app-styles-with-aphrodite/package.json",
    "content": "{\n  \"private\": true,\n  \"name\": \"@phenomic/example-react-app-styles-with-aphrodite\",\n  \"version\": \"1.0.0\",\n  \"devDependencies\": {\n    \"@phenomic/cli\": \"^1.0.0\",\n    \"@phenomic/core\": \"^1.0.0\",\n    \"@phenomic/preset-react-app\": \"^1.0.0\",\n    \"aphrodite\": \"^1.0.0\",\n    \"react\": \"^16.8.0\",\n    \"react-dom\": \"^16.8.0\",\n    \"react-router\": \"^3.2.0\"\n  },\n  \"scripts\": {\n    \"start\": \"phenomic start\",\n    \"build\": \"phenomic build\"\n  },\n  \"phenomic\": {\n    \"presets\": [\n      \"@phenomic/preset-react-app\"\n    ]\n  }\n}\n"
  },
  {
    "path": "examples/react-app-styles-with-css/App.js",
    "content": "// @flow\n\nimport * as React from \"react\";\nimport { Router, Route, browserHistory } from \"react-router\";\nimport { createApp } from \"@phenomic/preset-react-app/lib/client\";\n\nimport \"./styles.css\";\n\nexport default createApp(() => (\n  <Router history={browserHistory}>\n    <Route\n      path=\"/\"\n      component={() => <div className=\"helloWorld\">Hello World!</div>}\n    />\n  </Router>\n));\n"
  },
  {
    "path": "examples/react-app-styles-with-css/__tests__/__snapshots__/index.js.snap",
    "content": "// Jest Snapshot v1, https://goo.gl/fbAQLP\n\nexports[`should build example correctly 1`] = `\n\".helloWorld {\n  font-size: 40rem;\n}\n\n\"\n`;\n"
  },
  {
    "path": "examples/react-app-styles-with-css/__tests__/index.js",
    "content": "// @flow\n\nimport fs from \"fs\";\nimport path from \"path\";\n\n/* eslint-disable import/no-extraneous-dependencies */\nimport globby from \"globby\";\n\nit(\"should build example correctly\", () => {\n  const testFolder = __dirname + \"/../dist\";\n  const files = globby.sync(\"**/*\", {\n    cwd: testFolder,\n    nodir: true,\n    dot: true,\n  });\n\n  const assetsBundlerFiles = files.filter(file => file.startsWith(\"phenomic\"));\n  expect(assetsBundlerFiles.length).toBe(2);\n  expect(\n    fs.readFileSync(\n      path.join(\n        __dirname,\n        \"..\",\n        \"dist\",\n        assetsBundlerFiles.filter(file => file.endsWith(\".css\")).shift(),\n      ),\n      { encoding: \"utf8\" },\n    ),\n  ).toMatchSnapshot();\n});\n"
  },
  {
    "path": "examples/react-app-styles-with-css/package.json",
    "content": "{\n  \"private\": true,\n  \"name\": \"@phenomic/example-react-app-styles-with-css\",\n  \"version\": \"1.0.0\",\n  \"devDependencies\": {\n    \"@phenomic/cli\": \"^1.0.0\",\n    \"@phenomic/core\": \"^1.0.0\",\n    \"@phenomic/preset-react-app\": \"^1.0.0\",\n    \"react\": \"^16.8.0\",\n    \"react-dom\": \"^16.8.0\",\n    \"react-router\": \"^3.2.0\"\n  },\n  \"scripts\": {\n    \"start\": \"phenomic start\",\n    \"build\": \"phenomic build\"\n  },\n  \"phenomic\": {\n    \"presets\": [\n      \"@phenomic/preset-react-app\"\n    ]\n  }\n}\n"
  },
  {
    "path": "examples/react-app-styles-with-css/styles.css",
    "content": ".helloWorld {\n  font-size: 40rem;\n}\n"
  },
  {
    "path": "examples/react-app-styles-with-css-inlined-in-head/App.js",
    "content": "// @flow\n\nimport * as React from \"react\";\nimport { Router, Route, browserHistory } from \"react-router\";\nimport { createApp } from \"@phenomic/preset-react-app/lib/client\";\n\nimport \"./styles.css\";\n\nexport default createApp(() => (\n  <Router history={browserHistory}>\n    <Route\n      path=\"/\"\n      component={() => <div className=\"helloWorld\">Hello World!</div>}\n    />\n  </Router>\n));\n"
  },
  {
    "path": "examples/react-app-styles-with-css-inlined-in-head/Html.js",
    "content": "// @flow\n\nimport fs from \"fs\";\n\nimport * as React from \"react\";\n\n// memory to avoid reading a css file already read\n// @todo try to get ./dist/ from config somehow\nconst stylesMemory = {};\nconst readCssFile = css => {\n  if (!stylesMemory[css])\n    stylesMemory[css] = fs.readFileSync(\"./dist/\" + css, { encoding: \"utf8\" });\n  return stylesMemory[css];\n};\n\nexport default ({ App, render }: PhenomicHtmlPropsType) => {\n  const { html, Main, State, Script, Style, assets } = render(<App />);\n\n  return (\n    <html>\n      <head>\n        {process.env.PHENOMIC_ENV !== \"static\" ? (\n          <Style />\n        ) : (\n          <style\n            // @idea use https://github.com/addyosmani/critical\n            dangerouslySetInnerHTML={{\n              __html: Object.keys(assets)\n                .reduce((acc, name) => acc.concat(assets[name]), [])\n                .filter(asset => asset.endsWith(\".css\"))\n                .map(css => readCssFile(css))\n                .join(\"\"),\n            }}\n          />\n        )}\n      </head>\n      <body>\n        <Main />\n        <State />\n        <Script />\n      </body>\n    </html>\n  );\n};\n"
  },
  {
    "path": "examples/react-app-styles-with-css-inlined-in-head/__tests__/index.js",
    "content": "// @flow\n\n/* eslint-disable import/no-extraneous-dependencies */\nimport path from \"path\";\nimport fs from \"fs\";\n\nit(\"should build example correctly\", () => {\n  const file1 = fs.readFileSync(\n    path.join(__dirname, \"..\", \"dist\", \"index.html\"),\n    { encoding: \"utf8\" },\n  );\n  expect(file1).toContain(\"Hello World!\");\n  expect(file1).toContain(\"font-size: 40rem;\");\n});\n"
  },
  {
    "path": "examples/react-app-styles-with-css-inlined-in-head/package.json",
    "content": "{\n  \"private\": true,\n  \"name\": \"@phenomic/example-react-app-styles-with-css-inlined-in-head\",\n  \"version\": \"1.0.0\",\n  \"devDependencies\": {\n    \"@phenomic/cli\": \"^1.0.0\",\n    \"@phenomic/core\": \"^1.0.0\",\n    \"@phenomic/preset-react-app\": \"^1.0.0\",\n    \"react\": \"^16.8.0\",\n    \"react-dom\": \"^16.8.0\",\n    \"react-router\": \"^3.2.0\"\n  },\n  \"scripts\": {\n    \"start\": \"phenomic start\",\n    \"build\": \"phenomic build\"\n  },\n  \"phenomic\": {\n    \"presets\": [\n      \"@phenomic/preset-react-app\"\n    ]\n  }\n}\n"
  },
  {
    "path": "examples/react-app-styles-with-css-inlined-in-head/styles.css",
    "content": ".helloWorld {\n  font-size: 40rem;\n}\n"
  },
  {
    "path": "examples/react-app-styles-with-emotion/App.js",
    "content": "// @flow\n\nimport React from \"react\";\nimport { Router, Route, browserHistory } from \"react-router\";\nimport { createApp } from \"@phenomic/preset-react-app/lib/client\";\nimport { hydrate } from \"emotion\";\nimport styled from \"react-emotion\";\n\n// window._emotion is set inside html.js and caches emotion styles\nif (typeof window !== \"undefined\" && window._emotion) {\n  hydrate(window._emotion);\n}\n\nconst Title = styled(\"h1\")`\n  font-size: 1.5em;\n  text-align: center;\n  color: palevioletred;\n`;\n\nconst Title2 = styled(\"h1\")`\n  font-size: 2em;\n  text-align: right;\n  color: blue;\n`;\n\nexport default createApp(() => (\n  <Router history={browserHistory}>\n    <Route path=\"/\" component={() => <Title>Hello World!</Title>} />\n    <Route path=\"/2\" component={() => <Title2>Hello again!</Title2>} />\n  </Router>\n));\n"
  },
  {
    "path": "examples/react-app-styles-with-emotion/Html.js",
    "content": "// @flow\n\nimport * as React from \"react\";\nimport { extractCritical } from \"emotion-server\";\n\nexport default ({ App, render }: PhenomicHtmlPropsType) => {\n  const { html, Main, State, Script } = render(<App />);\n  const { css, ids } = extractCritical(html);\n\n  return (\n    <html>\n      <head>\n        <style dangerouslySetInnerHTML={{ __html: css }} />\n      </head>\n      <body>\n        <Main />\n        <State />\n        <script\n          dangerouslySetInnerHTML={{\n            __html: `window._emotion = ${JSON.stringify(ids)}`,\n          }}\n        />\n        <Script />\n      </body>\n    </html>\n  );\n};\n"
  },
  {
    "path": "examples/react-app-styles-with-emotion/__tests__/index.js",
    "content": "// @flow\n\n/* eslint-disable import/no-extraneous-dependencies */\nimport path from \"path\";\nimport fs from \"fs\";\n\nit(\"should build example correctly\", () => {\n  const file1 = fs.readFileSync(\n    path.join(__dirname, \"..\", \"dist\", \"index.html\"),\n    { encoding: \"utf8\" },\n  );\n  expect(file1).toContain(\"Hello World!\");\n  expect(file1).toContain(\n    \"font-size:1.5em;text-align:center;color:palevioletred\",\n  );\n\n  const file2 = fs.readFileSync(\n    path.join(__dirname, \"..\", \"dist\", \"2\", \"index.html\"),\n    { encoding: \"utf8\" },\n  );\n  expect(file2).toContain(\"Hello again!\");\n  expect(file2).toContain(\"font-size:2em;text-align:right;color:blue\");\n});\n"
  },
  {
    "path": "examples/react-app-styles-with-emotion/package.json",
    "content": "{\n  \"private\": true,\n  \"name\": \"@phenomic/example-react-app-styles-with-emotion\",\n  \"version\": \"1.0.0\",\n  \"devDependencies\": {\n    \"@phenomic/cli\": \"^1.0.0\",\n    \"@phenomic/core\": \"^1.0.0\",\n    \"@phenomic/preset-react-app\": \"^1.0.0\",\n    \"emotion\": \"^8.0.0\",\n    \"emotion-server\": \"^8.0.0\",\n    \"react\": \"^16.8.0\",\n    \"react-dom\": \"^16.8.0\",\n    \"react-emotion\": \"^8.0.0\",\n    \"react-router\": \"^3.2.0\"\n  },\n  \"scripts\": {\n    \"start\": \"phenomic start\",\n    \"build\": \"phenomic build\"\n  },\n  \"phenomic\": {\n    \"presets\": [\n      \"@phenomic/preset-react-app\"\n    ]\n  }\n}\n"
  },
  {
    "path": "examples/react-app-styles-with-glamor/App.js",
    "content": "// @flow\n\nimport * as React from \"react\";\nimport { Router, Route, browserHistory } from \"react-router\";\nimport { createApp } from \"@phenomic/preset-react-app/lib/client\";\nimport { css, rehydrate } from \"glamor\";\n\nif (typeof window !== \"undefined\" && window._glam) {\n  rehydrate(window._glam);\n}\n\nconst title = css({\n  fontSize: \"1.5em\",\n  textAlign: \"center\",\n  color: \"palevioletred\",\n});\n\nconst title2 = css({\n  fontSize: \"2em\",\n  textAlign: \"right\",\n  color: \"blue\",\n});\n\nexport default createApp(() => (\n  <Router history={browserHistory}>\n    <Route path=\"/\" component={() => <h1 {...title}>Hello World!</h1>} />\n    <Route path=\"/2\" component={() => <h1 {...title2}>Hello again!</h1>} />\n  </Router>\n));\n"
  },
  {
    "path": "examples/react-app-styles-with-glamor/Html.js",
    "content": "// @flow\n\nimport * as React from \"react\";\nimport { renderStaticOptimized } from \"glamor/server\";\n\nexport default ({ App, render }: PhenomicHtmlPropsType) => {\n  const { html, Main, State, Script } = render(<App />);\n  const { css, ids } = renderStaticOptimized(() => html);\n\n  return (\n    <html>\n      <head>\n        <style dangerouslySetInnerHTML={{ __html: css }} />\n      </head>\n      <body>\n        <Main />\n        <State />\n        <script\n          dangerouslySetInnerHTML={{\n            __html: `window._glam = ${JSON.stringify(ids)}`,\n          }}\n        />\n        <Script />\n      </body>\n    </html>\n  );\n};\n"
  },
  {
    "path": "examples/react-app-styles-with-glamor/__tests__/index.js",
    "content": "// @flow\n\n/* eslint-disable import/no-extraneous-dependencies */\nimport path from \"path\";\nimport fs from \"fs\";\n\nit(\"should build example correctly\", () => {\n  const file1 = fs.readFileSync(\n    path.join(__dirname, \"..\", \"dist\", \"index.html\"),\n    { encoding: \"utf8\" },\n  );\n  expect(file1).toContain(\"Hello World!\");\n  expect(file1).toContain(\n    \"font-size:1.5em;text-align:center;color:palevioletred\",\n  );\n\n  const file2 = fs.readFileSync(\n    path.join(__dirname, \"..\", \"dist\", \"2\", \"index.html\"),\n    { encoding: \"utf8\" },\n  );\n  expect(file2).toContain(\"Hello again!\");\n  expect(file2).toContain(\"font-size:2em;text-align:right;color:blue\");\n});\n"
  },
  {
    "path": "examples/react-app-styles-with-glamor/package.json",
    "content": "{\n  \"private\": true,\n  \"name\": \"@phenomic/example-react-app-styles-with-glamor\",\n  \"version\": \"1.0.0\",\n  \"devDependencies\": {\n    \"@phenomic/cli\": \"^1.0.0\",\n    \"@phenomic/core\": \"^1.0.0\",\n    \"@phenomic/preset-react-app\": \"^1.0.0\",\n    \"glamor\": \"^2.0.0\",\n    \"react\": \"^16.8.0\",\n    \"react-dom\": \"^16.8.0\",\n    \"react-router\": \"^3.2.0\"\n  },\n  \"scripts\": {\n    \"start\": \"phenomic start\",\n    \"build\": \"phenomic build\"\n  },\n  \"phenomic\": {\n    \"presets\": [\n      \"@phenomic/preset-react-app\"\n    ]\n  }\n}\n"
  },
  {
    "path": "examples/react-app-styles-with-glamorous/App.js",
    "content": "// @flow\n\nimport * as React from \"react\";\nimport { Router, Route, browserHistory } from \"react-router\";\nimport { createApp } from \"@phenomic/preset-react-app/lib/client\";\nimport glamorous from \"glamorous\";\nimport { rehydrate } from \"glamor\";\n\nif (typeof window !== \"undefined\" && window._glam) {\n  rehydrate(window._glam);\n}\n\nconst Title = glamorous.h1({\n  fontSize: \"1.5em\",\n  textAlign: \"center\",\n  color: \"palevioletred\",\n});\n\nconst Title2 = glamorous.h1({\n  fontSize: \"2em\",\n  textAlign: \"right\",\n  color: \"blue\",\n});\n\nexport default createApp(() => (\n  <Router history={browserHistory}>\n    <Route path=\"/\" component={() => <Title>Hello World!</Title>} />\n    <Route path=\"/2\" component={() => <Title2>Hello again!</Title2>} />\n  </Router>\n));\n"
  },
  {
    "path": "examples/react-app-styles-with-glamorous/Html.js",
    "content": "// @flow\n\nimport * as React from \"react\";\nimport { renderStaticOptimized } from \"glamor/server\";\n\nexport default ({ App, render }: PhenomicHtmlPropsType) => {\n  const { html, Main, State, Script } = render(<App />);\n  const { css, ids } = renderStaticOptimized(() => html);\n\n  return (\n    <html>\n      <head>\n        <style dangerouslySetInnerHTML={{ __html: css }} />\n      </head>\n      <body>\n        <Main />\n        <State />\n        <script\n          dangerouslySetInnerHTML={{\n            __html: `window._glam = ${JSON.stringify(ids)}`,\n          }}\n        />\n        <Script />\n      </body>\n    </html>\n  );\n};\n"
  },
  {
    "path": "examples/react-app-styles-with-glamorous/__tests__/index.js",
    "content": "// @flow\n\n/* eslint-disable import/no-extraneous-dependencies */\nimport path from \"path\";\nimport fs from \"fs\";\n\nit(\"should build example correctly\", () => {\n  const file1 = fs.readFileSync(\n    path.join(__dirname, \"..\", \"dist\", \"index.html\"),\n    { encoding: \"utf8\" },\n  );\n  expect(file1).toContain(\"Hello World!\");\n  expect(file1).toContain(\n    \"font-size:1.5em;text-align:center;color:palevioletred\",\n  );\n\n  const file2 = fs.readFileSync(\n    path.join(__dirname, \"..\", \"dist\", \"2\", \"index.html\"),\n    { encoding: \"utf8\" },\n  );\n  expect(file2).toContain(\"Hello again!\");\n  expect(file2).toContain(\"font-size:2em;text-align:right;color:blue\");\n});\n"
  },
  {
    "path": "examples/react-app-styles-with-glamorous/package.json",
    "content": "{\n  \"private\": true,\n  \"name\": \"@phenomic/example-react-app-styles-with-glamorous\",\n  \"version\": \"1.0.0\",\n  \"devDependencies\": {\n    \"@phenomic/cli\": \"^1.0.0\",\n    \"@phenomic/core\": \"^1.0.0\",\n    \"@phenomic/preset-react-app\": \"^1.0.0\",\n    \"glamor\": \"^2.0.0\",\n    \"glamorous\": \"^4.0.0\",\n    \"react\": \"^16.8.0\",\n    \"react-dom\": \"^16.8.0\",\n    \"react-router\": \"^3.2.0\"\n  },\n  \"scripts\": {\n    \"start\": \"phenomic start\",\n    \"build\": \"phenomic build\"\n  },\n  \"phenomic\": {\n    \"presets\": [\n      \"@phenomic/preset-react-app\"\n    ]\n  }\n}\n"
  },
  {
    "path": "examples/react-app-styles-with-radium/App.js",
    "content": "// @flow\n\nimport * as React from \"react\";\nimport { Router, Route, browserHistory } from \"react-router\";\nimport { createApp } from \"@phenomic/preset-react-app/lib/client\";\nimport Radium from \"radium\";\n\nconst styles = {\n  title: {\n    fontSize: \"1.5em\",\n    textAlign: \"center\",\n    color: \"palevioletred\",\n    \":hover\": {\n      color: \"red\",\n    },\n    \"@media (max-width: 1000px)\": {\n      color: \"orange\",\n    },\n  },\n  title2: {\n    fontSize: \"2em\",\n    textAlign: \"right\",\n    color: \"blue\",\n  },\n};\n\nexport default createApp(() => (\n  <Router history={browserHistory}>\n    <Route\n      path=\"/\"\n      component={Radium(() => (\n        <h1 style={styles.title}>Hello World!</h1>\n      ))}\n    />\n    <Route\n      path=\"/2\"\n      component={Radium(() => (\n        <h1 style={styles.title2}>Hello again!</h1>\n      ))}\n    />\n  </Router>\n));\n"
  },
  {
    "path": "examples/react-app-styles-with-radium/Html.js",
    "content": "// @flow\n\nimport * as React from \"react\";\nimport { StyleRoot } from \"radium\";\n\nexport default ({ App, render }: PhenomicHtmlPropsType) => {\n  const { Main, State, Script } = render(\n    <StyleRoot>\n      <App />\n    </StyleRoot>,\n  );\n\n  return (\n    <html>\n      <body>\n        <Main />\n        <State />\n        <Script />\n      </body>\n    </html>\n  );\n};\n"
  },
  {
    "path": "examples/react-app-styles-with-radium/__tests__/index.js",
    "content": "// @flow\n\n/* eslint-disable import/no-extraneous-dependencies */\nimport path from \"path\";\nimport fs from \"fs\";\n\nit(\"should build example correctly\", () => {\n  const file1 = fs.readFileSync(\n    path.join(__dirname, \"..\", \"dist\", \"index.html\"),\n    { encoding: \"utf8\" },\n  );\n  expect(file1).toContain(\"Hello World!\");\n  expect(file1).toContain(\n    \"font-size:1.5em;text-align:center;color:palevioletred\",\n  );\n\n  const file2 = fs.readFileSync(\n    path.join(__dirname, \"..\", \"dist\", \"2\", \"index.html\"),\n    { encoding: \"utf8\" },\n  );\n  expect(file2).toContain(\"Hello again!\");\n  expect(file2).toContain(\"font-size:2em;text-align:right;color:blue\");\n});\n"
  },
  {
    "path": "examples/react-app-styles-with-radium/package.json",
    "content": "{\n  \"private\": true,\n  \"name\": \"@phenomic/example-react-app-styles-with-radium\",\n  \"version\": \"1.0.0\",\n  \"devDependencies\": {\n    \"@phenomic/cli\": \"^1.0.0\",\n    \"@phenomic/core\": \"^1.0.0\",\n    \"@phenomic/preset-react-app\": \"^1.0.0\",\n    \"radium\": \"^0.19.0\",\n    \"react\": \"^16.8.0\",\n    \"react-dom\": \"^16.8.0\",\n    \"react-router\": \"^3.2.0\"\n  },\n  \"scripts\": {\n    \"start\": \"phenomic start\",\n    \"build\": \"phenomic build\"\n  },\n  \"phenomic\": {\n    \"presets\": [\n      \"@phenomic/preset-react-app\"\n    ]\n  }\n}\n"
  },
  {
    "path": "examples/react-app-styles-with-styled-components/App.js",
    "content": "// @flow\n\nimport * as React from \"react\";\nimport { Router, Route, browserHistory } from \"react-router\";\nimport { createApp } from \"@phenomic/preset-react-app/lib/client\";\nimport styled from \"styled-components\";\n\nconst Title = styled.h1`\n  font-size: 1.5em;\n  text-align: center;\n  color: palevioletred;\n`;\n\nconst Title2 = styled.h1`\n  font-size: 2em;\n  text-align: right;\n  color: blue;\n`;\n\nexport default createApp(() => (\n  <Router history={browserHistory}>\n    <Route path=\"/\" component={() => <Title>Hello World!</Title>} />\n    <Route path=\"/2\" component={() => <Title2>Hello again!</Title2>} />\n  </Router>\n));\n"
  },
  {
    "path": "examples/react-app-styles-with-styled-components/Html.js",
    "content": "// @flow\n\nimport * as React from \"react\";\nimport { ServerStyleSheet } from \"styled-components\";\n\nexport default ({ App, render }: PhenomicHtmlPropsType) => {\n  const sheet = new ServerStyleSheet();\n  const { Main, State, Script } = render(sheet.collectStyles(<App />));\n\n  return (\n    <html>\n      <head>{sheet.getStyleElement()}</head>\n      <body>\n        <Main />\n        <State />\n        <Script />\n      </body>\n    </html>\n  );\n};\n"
  },
  {
    "path": "examples/react-app-styles-with-styled-components/__tests__/index.js",
    "content": "// @flow\n\n/* eslint-disable import/no-extraneous-dependencies */\nimport path from \"path\";\nimport fs from \"fs\";\n\nit(\"should build example correctly\", () => {\n  const file1 = fs.readFileSync(\n    path.join(__dirname, \"..\", \"dist\", \"index.html\"),\n    { encoding: \"utf8\" },\n  );\n  expect(file1).toContain(\"Hello World!\");\n  expect(file1).toContain(\n    \"font-size:1.5em;text-align:center;color:palevioletred\",\n  );\n\n  const file2 = fs.readFileSync(\n    path.join(__dirname, \"..\", \"dist\", \"2\", \"index.html\"),\n    { encoding: \"utf8\" },\n  );\n  expect(file2).toContain(\"Hello again!\");\n  expect(file2).toContain(\"font-size:2em;text-align:right;color:blue\");\n});\n"
  },
  {
    "path": "examples/react-app-styles-with-styled-components/package.json",
    "content": "{\n  \"private\": true,\n  \"name\": \"@phenomic/example-react-app-styles-with-styled-components\",\n  \"version\": \"1.0.0\",\n  \"devDependencies\": {\n    \"@phenomic/cli\": \"^1.0.0\",\n    \"@phenomic/core\": \"^1.0.0\",\n    \"@phenomic/preset-react-app\": \"^1.0.0\",\n    \"react\": \"^16.8.0\",\n    \"react-dom\": \"^16.8.0\",\n    \"react-router\": \"^3.2.0\",\n    \"styled-components\": \"^4.0.0\"\n  },\n  \"scripts\": {\n    \"start\": \"phenomic start\",\n    \"build\": \"phenomic build\"\n  },\n  \"phenomic\": {\n    \"presets\": [\n      \"@phenomic/preset-react-app\"\n    ]\n  }\n}\n"
  },
  {
    "path": "examples/react-app-with-basename/App.js",
    "content": "// @flow\n\nimport * as React from \"react\";\nimport { Router, Route, useRouterHistory } from \"react-router\";\n// default (browser) history needs a DOM, so memory history is used for static rendering\nimport { createHistory, createMemoryHistory } from \"history\";\nimport {\n  createApp,\n  Link,\n  withPhenomicApi,\n  query,\n} from \"@phenomic/preset-react-app/lib/client\";\n\nconst history = useRouterHistory(\n  typeof window !== \"undefined\" ? createHistory : createMemoryHistory,\n)({ basename: process.env.PHENOMIC_APP_BASENAME });\n\nconst Hello = () => (\n  <div>\n    Hello world! <Link to=\"/test\">Test me!</Link>\n  </div>\n);\n\nconst GoBack = ({ hasError, isLoading, testList }) => (\n  <div>\n    Bye world! <Link to=\"/\">Go back!</Link>\n    <p>\n      {hasError && \"Oops\"}\n      {isLoading && \"Loading...\"}\n    </p>\n    {testList &&\n      testList.node &&\n      testList.node.list && <ul>{testList.node.list.map(item => item.id)}</ul>}\n  </div>\n);\n\nconst GoBackContainer = withPhenomicApi(GoBack, () => ({\n  testList: query({}),\n}));\n\nexport default createApp(() => (\n  <Router history={history}>\n    <Route path=\"/\" component={Hello} />\n    <Route path=\"/test\" component={GoBackContainer} />\n  </Router>\n));\n"
  },
  {
    "path": "examples/react-app-with-basename/__tests__/index.js",
    "content": "// @flow\n\n/* eslint-disable import/no-extraneous-dependencies */\nimport path from \"path\";\nimport fs from \"fs\";\n\nit(\"should build example correctly\", () => {\n  const file1 = fs.readFileSync(\n    path.join(__dirname, \"..\", \"dist\", \"index.html\"),\n    { encoding: \"utf8\" },\n  );\n  expect(file1).toContain('<a href=\"/website/base/test\"');\n  expect(file1).toContain('script src=\"/website/base/phenomic/phenomic.main');\n\n  const file2 = fs.readFileSync(\n    path.join(__dirname, \"..\", \"dist\", \"test\", \"index.html\"),\n    { encoding: \"utf8\" },\n  );\n  expect(file2).toContain('<a href=\"/website/base/\"');\n});\n"
  },
  {
    "path": "examples/react-app-with-basename/content/test.md",
    "content": "I am a test!\n"
  },
  {
    "path": "examples/react-app-with-basename/package.json",
    "content": "{\n  \"private\": true,\n  \"name\": \"@phenomic/example-react-app-with-basename\",\n  \"version\": \"1.0.0\",\n  \"devDependencies\": {\n    \"@phenomic/cli\": \"^1.0.0\",\n    \"@phenomic/core\": \"^1.0.0\",\n    \"@phenomic/preset-react-app\": \"^1.0.0\",\n    \"react\": \"^16.8.0\",\n    \"react-dom\": \"^16.8.0\",\n    \"react-router\": \"^3.2.0\"\n  },\n  \"scripts\": {\n    \"start\": \"phenomic start\",\n    \"build\": \"phenomic build\"\n  },\n  \"phenomic\": {\n    \"baseUrl\": \"http://test.com/website/base\",\n    \"presets\": [\n      \"@phenomic/preset-react-app\"\n    ]\n  }\n}\n"
  },
  {
    "path": "examples/react-native-web-app/App.js",
    "content": "// @flow\n\nimport * as React from \"react\";\nimport { Router, Route, browserHistory } from \"react-router\";\nimport { createApp } from \"@phenomic/preset-react-app/lib/client\";\nimport { AppRegistry, Text } from \"react-native-web\";\n\nconst Title = props => (\n  <Text\n    {...props}\n    style={{\n      fontSize: \"1.5em\",\n      textAlign: \"center\",\n      color: \"palevioletred\",\n    }}\n  />\n);\n\nconst Title2 = props => (\n  <Text\n    {...props}\n    style={{\n      fontSize: \"2em\",\n      textAlign: \"right\",\n      color: \"blue\",\n    }}\n  />\n);\n\nconst routes = () => (\n  <Router history={browserHistory}>\n    <Route path=\"/\" component={() => <Title>Hello World!</Title>} />\n    <Route path=\"/2\" component={() => <Title2>Hello again!</Title2>} />\n  </Router>\n);\n\nconst render = (rootComponent, rootTag) => {\n  AppRegistry.registerComponent(\"App\", () => () => rootComponent);\n  AppRegistry.runApplication(\"App\", { rootTag });\n};\n\nexport default createApp(routes, render);\n"
  },
  {
    "path": "examples/react-native-web-app/Html.js",
    "content": "// @flow\n\nimport * as React from \"react\";\nimport Head from \"react-helmet\";\nimport { AppRegistry } from \"react-native-web\";\n\nconst Html = ({ App, render }: PhenomicHtmlPropsType) => {\n  AppRegistry.registerComponent(\"App\", () => App);\n  const app = AppRegistry.getApplication(\"App\");\n  const { Main, State, Script, Style } = render(app.element);\n\n  const helmet = Head.renderStatic();\n  return (\n    <html {...helmet.htmlAttributes.toComponent()}>\n      <head>\n        {helmet.meta.toComponent()}\n        {helmet.title.toComponent()}\n        {helmet.base.toComponent()}\n        {app.getStyleElement()}\n        <Style />\n        {helmet.link.toComponent()}\n        {helmet.style.toComponent()}\n        {helmet.script.toComponent()}\n        {helmet.noscript.toComponent()}\n      </head>\n      <body {...helmet.bodyAttributes.toComponent()}>\n        <Main />\n        <State />\n        <Script />\n      </body>\n    </html>\n  );\n};\n\nexport default Html;\n"
  },
  {
    "path": "examples/react-native-web-app/__tests__/index.js",
    "content": "// @flow\n\n/* eslint-disable import/no-extraneous-dependencies */\nimport path from \"path\";\nimport fs from \"fs\";\n\nit(\"should build example correctly\", () => {\n  const file1 = fs.readFileSync(\n    path.join(__dirname, \"..\", \"dist\", \"index.html\"),\n    { encoding: \"utf8\" },\n  );\n  const file2 = fs.readFileSync(\n    path.join(__dirname, \"..\", \"dist\", \"2\", \"index.html\"),\n    { encoding: \"utf8\" },\n  );\n\n  expect(file1).toContain(\"Hello World!\");\n  expect(file1).toContain(\"font-size:1.5em\");\n  expect(file1).toContain(\"text-align:center\");\n  // expect(file1).toContain(\"color:palevioletred\");\n  expect(file1).toContain(\"color:rgba(219,112,147,1.00)\");\n  expect(file1).not.toContain(\"Hello again!\");\n  expect(file1).not.toContain(\"font-size:2em\");\n  expect(file1).not.toContain(\"text-align:right\");\n  // expect(file1).not.toContain(\"color:blue\");\n  expect(file1).not.toContain(\"color:rgba(0,0,255,1.00)\");\n\n  expect(file2).not.toContain(\"Hello World!\");\n  expect(file2).not.toContain(\"font-size:1.5em\");\n  expect(file2).not.toContain(\"text-align:center\");\n  // expect(file2).not.toContain(\"color:palevioletred\");\n  expect(file2).not.toContain(\"color:rgba(219,112,147,1.00)\");\n  expect(file2).toContain(\"Hello again!\");\n  expect(file2).toContain(\"font-size:2em\");\n  expect(file2).toContain(\"text-align:right\");\n  // expect(file2).toContain(\"color:blue\");\n  expect(file2).toContain(\"color:rgba(0,0,255,1.00)\");\n});\n"
  },
  {
    "path": "examples/react-native-web-app/package.json",
    "content": "{\n  \"private\": true,\n  \"name\": \"@phenomic/example-react-native-app\",\n  \"version\": \"1.0.0\",\n  \"devDependencies\": {\n    \"@phenomic/cli\": \"^1.0.0\",\n    \"@phenomic/core\": \"^1.0.0\",\n    \"@phenomic/preset-react-app\": \"^1.0.0\",\n    \"react\": \"^16.8.0\",\n    \"react-art\": \"^16.5.2\",\n    \"react-dom\": \"^16.8.0\",\n    \"react-native-web\": \"^0.9.0\",\n    \"react-router\": \"^3.2.0\"\n  },\n  \"scripts\": {\n    \"start\": \"phenomic start\",\n    \"build\": \"phenomic build\"\n  },\n  \"phenomic\": {\n    \"presets\": [\n      \"@phenomic/preset-react-app\"\n    ]\n  }\n}\n"
  },
  {
    "path": "examples/reason-react-app/App.js",
    "content": "// @flow\n\nimport * as React from \"react\";\nimport { Router, Route, browserHistory } from \"react-router\";\nimport { createApp, renderApp } from \"@phenomic/preset-react-app/lib/client\";\nimport { withPhenomicApi } from \"@phenomic/preset-react-app/lib/es6/src/phenomicPresetReactApp.bs.js\";\n\nimport * as Home from \"./lib/es6/src/components/Home.bs.js\";\nimport * as Post from \"./lib/es6/src/components/Post.bs.js\";\nimport ErrorPage from \"./lib/es6/src/components/ErrorPage.bs.js\";\n\nconst routes = () => (\n  <Router history={browserHistory}>\n    <Route path=\"/\" component={withPhenomicApi(Home.make, Home.queries)} />\n    <Route\n      path=\"/after/:after\"\n      component={withPhenomicApi(Home.make, Home.queries)}\n    />\n    <Route path=\"blog/*\" component={withPhenomicApi(Post.make, Post.queries)} />\n    <Route path=\"*\" component={ErrorPage} />\n    <Route path=\"404.html\" component={ErrorPage} />\n  </Router>\n);\n\nexport default createApp(routes);\n\nif (module.hot) {\n  module.hot.accept(() => renderApp(routes));\n}\n"
  },
  {
    "path": "examples/reason-react-app/README.md",
    "content": "# Getting Started with Phenomic + React preset + ReasonML\n\n⚠️ _WIP, but totally usable._\n\nTo run this example, just copy it out of the repo, then\n\n```console\nnpm install\nnpm run start\n```\n\nNote: `yarn` is preferred.\n\nTo build the static version\n\n```console\nnpm run build\n```\n\nThen publish `dist`.\n\nFor more information, please refer to\n[JavaScript version (for now)](https://github.com/phenomic/phenomic/blob/master/packages/preset-react-app/docs/getting-started/README.md).\n"
  },
  {
    "path": "examples/reason-react-app/__tests__/__snapshots__/index.js.snap",
    "content": "// Jest Snapshot v1, https://goo.gl/fbAQLP\n\nexports[`should build example correctly 1`] = `\nArray [\n  \"404.html\",\n  \"after/c2Vjb25kLXBvc3Q=/index.html\",\n  \"after/dGhpcmQtcG9zdA==/index.html\",\n  \"after/Zm91cnRoLXBvc3Q=/index.html\",\n  \"after/ZmlmdGgtcG9zdA==/index.html\",\n  \"after/Zmlyc3QtcG9zdA==/index.html\",\n  \"blog/fifth-post/index.html\",\n  \"blog/first-post/index.html\",\n  \"blog/fourth-post/index.html\",\n  \"blog/second-post/index.html\",\n  \"blog/third-post/index.html\",\n  \"index.html\",\n]\n`;\n\nexports[`should build example correctly 2`] = `\nArray [\n  \"phenomic/content/posts/by-default/1/desc/date/limit-2.json\",\n  \"phenomic/content/posts/by-default/1/desc/date/limit-2/after-c2Vjb25kLXBvc3Q=.json\",\n  \"phenomic/content/posts/by-default/1/desc/date/limit-2/after-dGhpcmQtcG9zdA==.json\",\n  \"phenomic/content/posts/by-default/1/desc/date/limit-2/after-Zm91cnRoLXBvc3Q=.json\",\n  \"phenomic/content/posts/by-default/1/desc/date/limit-2/after-ZmlmdGgtcG9zdA==.json\",\n  \"phenomic/content/posts/by-default/1/desc/date/limit-2/after-Zmlyc3QtcG9zdA==.json\",\n  \"phenomic/content/posts/item/fifth-post.json\",\n  \"phenomic/content/posts/item/first-post.json\",\n  \"phenomic/content/posts/item/fourth-post.json\",\n  \"phenomic/content/posts/item/second-post.json\",\n  \"phenomic/content/posts/item/third-post.json\",\n]\n`;\n\nexports[`should build example correctly 3`] = `Array []`;\n"
  },
  {
    "path": "examples/reason-react-app/__tests__/index.js",
    "content": "// @flow\n\n/* eslint-disable import/no-extraneous-dependencies */\nimport globby from \"globby\";\n\nit(\"should build example correctly\", () => {\n  const testFolder = __dirname + \"/../dist\";\n  const files = globby.sync(\"**/*\", {\n    cwd: testFolder,\n    nodir: true,\n    dot: true,\n  });\n\n  // should have html files\n  const htmlFiles = files.filter(file => file.endsWith(\".html\"));\n  expect(htmlFiles).toMatchSnapshot();\n\n  const jsonApiFiles = files.filter(\n    file => file.startsWith(\"phenomic\") && file.endsWith(\".json\"),\n  );\n  // should have matching json files\n  expect(jsonApiFiles).toMatchSnapshot();\n\n  // should have assets\n  const assetsBundlerFiles = files.filter(\n    file =>\n      !htmlFiles.includes(file) &&\n      !jsonApiFiles.includes(file) &&\n      file.startsWith(\"phenomic\"),\n  );\n  expect(assetsBundlerFiles.length).toBe(1);\n  expect(\n    files.filter(\n      file =>\n        !htmlFiles.includes(file) &&\n        !jsonApiFiles.includes(file) &&\n        !assetsBundlerFiles.includes(file),\n    ),\n  ).toMatchSnapshot();\n});\n"
  },
  {
    "path": "examples/reason-react-app/bsconfig.json",
    "content": "{\n  \"name\": \"@phenomic/example-reason-react-app\",\n  \"refmt\": 3,\n  \"reason\": {\n    \"react-jsx\": 3\n  },\n  \"suffix\": \".bs.js\",\n  \"package-specs\": {\n    \"module\": \"es6\"\n  },\n  \"sources\": [\n    {\n      \"dir\": \"src\",\n      \"subdirs\": true\n    }\n  ],\n  \"bs-dependencies\": [\n    \"reason-react\",\n    \"@moox/bs-react-helmet\",\n    \"@phenomic/preset-react-app\",\n    \"@phenomic/plugin-renderer-react\",\n    \"@phenomic/api-client\"\n  ]\n}\n"
  },
  {
    "path": "examples/reason-react-app/content/posts/fifth-post.md",
    "content": "---\ntitle: \"Fifth post\"\ndate: \"2017-01-05\"\nlayout: hero\n---\n\nAnother post that have a [link to the first one](../first-post/).\n\nAn wrong link to [a post that does not exist](../unknown-post/) and another one\nto [a page that does not exist](/unknown-page/).\n\nHere is an [external link](http://phenomic.io).\n"
  },
  {
    "path": "examples/reason-react-app/content/posts/first-post.md",
    "content": "---\ntitle: \"First post\"\ndate: \"2017-01-01\"\n---\n\n# This is a [Markdown](https://en.wikipedia.org/wiki/Markdown#Example) file\n\nIf you are new to Markdown, you might want to check those links:\n\n- [What is Markdown?](http://whatismarkdown.com/)\n- [Mastering Markdown, a GitHub guide](https://guides.github.com/features/mastering-markdown/)\n- [wikipedia.org/wiki/Markdown](https://en.wikipedia.org/wiki/Markdown#Example)\n- [masteringmarkdown.com](http://masteringmarkdown.com/)\n"
  },
  {
    "path": "examples/reason-react-app/content/posts/fourth-post.md",
    "content": "---\ntitle: \"Fourth post\"\ndate: \"2017-01-04\"\n---\n\nAnother post\n"
  },
  {
    "path": "examples/reason-react-app/content/posts/second-post.md",
    "content": "---\ntitle: \"Second post\"\ndate: \"2017-01-02\"\n---\n\nAnother post\n"
  },
  {
    "path": "examples/reason-react-app/content/posts/third-post.md",
    "content": "---\ntitle: \"Third post\"\ndate: \"2017-01-03\"\n---\n\nAnother post\n"
  },
  {
    "path": "examples/reason-react-app/package.json",
    "content": "{\n  \"private\": true,\n  \"name\": \"@phenomic/example-reason-react-app\",\n  \"devDependencies\": {\n    \"@moox/bs-react-helmet\": \"^2.0.0\",\n    \"@phenomic/cli\": \"^1.0.0\",\n    \"@phenomic/core\": \"^1.0.0\",\n    \"@phenomic/preset-react-app\": \"^1.0.0\",\n    \"bs-platform\": \"^5.0.4\",\n    \"npm-run-all\": \"^4.0.2\",\n    \"react\": \"^16.8.0\",\n    \"react-dom\": \"^16.8.0\",\n    \"react-helmet\": \"^5.2.0\",\n    \"react-router\": \"^3.2.0\",\n    \"reason-react\": \"^0.7.0\"\n  },\n  \"scripts\": {\n    \"reason:cleanup\": \"bsb -clean-world\",\n    \"reason:compile\": \"bsb -make-world\",\n    \"prepare\": \"yarn reason:cleanup && yarn reason:compile\",\n    \"start\": \"yarn reason:cleanup && npm-run-all --parallel start:*\",\n    \"start:js\": \"phenomic start\",\n    \"start:reason\": \"yarn reason:compile -w\",\n    \"build\": \"yarn reason:compile && phenomic build\"\n  },\n  \"phenomic\": {\n    \"presets\": [\n      \"@phenomic/preset-react-app\"\n    ]\n  },\n  \"version\": \"1.0.0\"\n}\n"
  },
  {
    "path": "examples/reason-react-app/src/Helpers.re",
    "content": "let nothing = React.null;\n\nlet text = React.string;\n\nlet list = list => list |> Array.of_list |> React.array;\n\nlet nodeList = node => node##list |> Array.to_list;\n"
  },
  {
    "path": "examples/reason-react-app/src/Types.re",
    "content": "type partialPost = {\n  .\n  \"id\": string,\n  \"title\": string,\n};\n\ntype posts =\n  PhenomicPresetReactApp.edge(\n    PhenomicPresetReactApp.jsNodeList(partialPost),\n  );\n\ntype post = {\n  .\n  \"id\": string,\n  \"title\": string,\n  \"body\": PhenomicPresetReactApp.BodyRenderer.jsBody,\n};\n\ntype postNode = PhenomicPresetReactApp.edge(post);\n"
  },
  {
    "path": "examples/reason-react-app/src/components/ErrorPage.re",
    "content": "open Helpers;\n\n[@react.component]\nlet make = (~message: option(string)=?, _) => {\n  <div style={ReactDOMRe.Style.make(~fontSize=\"80px\", ())}>\n    {switch (message) {\n     | None => \"An error occured\" |> text\n     | Some(msg) => msg |> text\n     }}\n  </div>;\n};\n\nlet default = make;\n"
  },
  {
    "path": "examples/reason-react-app/src/components/Home.re",
    "content": "open Helpers;\n\n[@react.component]\nlet make = (~posts) => {\n  let posts' = PhenomicPresetReactApp.jsEdge(posts);\n  <div>\n    <BsReactHelmet>\n      <title> {\"Hello world\" |> text} </title>\n      <meta name=\"description\" content=\"Everything is awesome!\" />\n    </BsReactHelmet>\n    <h1> {\"Home\" |> text} </h1>\n    {switch ((posts': Types.posts)) {\n     | Inactive\n     | Loading => \"Loading ...\" |> text\n     | Errored => \"An error occured\" |> text\n     | Idle(posts) =>\n       let postsList = posts##list |> Array.to_list;\n       <div>\n         <ul>\n           {postsList\n            |> List.map(item =>\n                 <li key=item##id>\n                   <PhenomicPresetReactApp.Link\n                     href={\"/blog/\" ++ item##id ++ \"/\"}>\n                     {item##title |> text}\n                   </PhenomicPresetReactApp.Link>\n                 </li>\n               )\n            |> list}\n         </ul>\n         <div>\n           {switch (posts##previous |> Js.toOption) {\n            | Some(previous) =>\n              <PhenomicPresetReactApp.Link\n                href={\n                  posts##previousPageIsFirst\n                    ? \"/\" : \"/after/\" ++ previous ++ \"/\"\n                }>\n                {\"Newer posts\" |> text}\n              </PhenomicPresetReactApp.Link>\n            | None => nothing\n            }}\n           {\" \" |> text}\n           {switch (posts##next |> Js.toOption) {\n            | Some(next) =>\n              <PhenomicPresetReactApp.Link href={\"/after/\" ++ next ++ \"/\"}>\n                {\"Older posts\" |> text}\n              </PhenomicPresetReactApp.Link>\n            | None => nothing\n            }}\n         </div>\n       </div>;\n     }}\n  </div>;\n};\n\nlet queries = props => {\n  let posts =\n    PhenomicPresetReactApp.query(\n      PaginatedList({\n        path: \"content/posts\",\n        by: Some(\"default\"),\n        value: None,\n        order: None,\n        sort: None,\n        limit: Some(2),\n        after: Some(props##params##after),\n      }),\n    );\n  {\"posts\": posts};\n};\n"
  },
  {
    "path": "examples/reason-react-app/src/components/Post.re",
    "content": "open Helpers;\n\n[@react.component]\nlet make = (~post) => {\n  let post' = PhenomicPresetReactApp.jsEdge(post);\n  <div>\n    {switch ((post': Types.postNode)) {\n     | Inactive\n     | Loading => \"Loading ...\" |> text\n     | Errored => <ErrorPage />\n     | Idle(post) =>\n       <div>\n         <BsReactHelmet>\n           <title> {post##title |> text} </title>\n         </BsReactHelmet>\n         <h1> {post##title |> text} </h1>\n         <PhenomicPresetReactApp.BodyRenderer body=post##body />\n       </div>\n     }}\n  </div>;\n};\n\nlet queries = props => {\n  let post =\n    PhenomicPresetReactApp.query(\n      Item({path: \"content/posts\", id: props##params##splat}),\n    );\n  {\"post\": post};\n};\n"
  },
  {
    "path": "flow-typed/.eslintrc",
    "content": "{\n  \"rules\": {\n    \"flowtype/require-valid-file-annotation\": 0,\n    \"flowtype/require-exact-type\": 0,\n    \"flowtype/no-mutable-array\": 0\n  }\n}\n"
  },
  {
    "path": "flow-typed/handmade/cross-fetch_v2.x.x.js",
    "content": "declare module \"cross-fetch\" {\n  declare module.exports: (\n    input: string | Request | URL,\n    init?: RequestOptions,\n  ) => Promise<Response>;\n}\n\ndeclare module \"cross-fetch/polyfill\" {\n  declare module.exports: void;\n}\n"
  },
  {
    "path": "flow-typed/handmade/deepmerge.js",
    "content": "declare module \"deepmerge\" {\n  declare module.exports: (obj: Object, obj2: Object) => Object;\n}\n"
  },
  {
    "path": "flow-typed/handmade/fb-watchman.js",
    "content": "export type Watch = {};\n\nexport type CommandResponse = {\n  watch: Watch,\n  relative_path: string,\n};\n\nexport type Subscription = {\n  expression: Array<string | [string, string]>,\n  fields: Array<string>,\n  relative_root: string,\n};\n\nexport type WatchEvent = {\n  files: Array<Object>,\n};\n\ndeclare module \"fb-watchman\" {\n  declare class Client {\n    capabilityCheck(config: Object, callback: (error: any) => void): void;\n    command(\n      config: [\"watch-project\", string],\n      callback: (error: any, response: CommandResponse) => void,\n    ): void;\n    command(\n      config: [\"subscribe\", Watch, \"files\", Subscription],\n      callback: (error: any) => void,\n    ): void;\n    on(eventName: string, callback: (event: WatchEvent) => void): void;\n    end(): void;\n  }\n}\n"
  },
  {
    "path": "flow-typed/handmade/find-cache-dir.js",
    "content": "type findCacheDirOptions = {|\n  name?: string,\n  files?: Array<string>,\n  cwd?: string,\n  create?: boolean,\n  thunk?: boolean,\n|};\n\ndeclare module \"find-cache-dir\" {\n  declare function findCacheDir(options: findCacheDirOptions): string;\n  declare module.exports: typeof findCacheDir;\n}\n"
  },
  {
    "path": "flow-typed/handmade/fs-extra.js",
    "content": "declare module \"fs-extra\" {\n  declare interface fsExtra {\n    emptyDirSync: (from: string, to: string) => void;\n    copySync: (from: string, to: string) => void;\n    copy: (from: string, to: string, callback: (err: Error) => void) => void;\n  }\n  declare module.exports: fsExtra;\n}\n"
  },
  {
    "path": "flow-typed/handmade/fs-promise.js",
    "content": "declare module \"fs-promise\" {\n  declare function writeFile(to: string, content: string): Promise<any>;\n  declare function mkdirs(path: string): Promise<any>;\n\n  declare interface fsPromise {\n    writeFile: typeof writeFile;\n    mkdirs: typeof mkdirs;\n  }\n  declare module.exports: fsPromise;\n}\n"
  },
  {
    "path": "flow-typed/handmade/globby.js",
    "content": "declare module \"globby\" {\n  declare type pattern = string | Array<string>;\n  declare type async = (\n    pattern: pattern,\n    options: Object,\n  ) => Promise<Array<string>>;\n  declare module.exports: {\n    (): async,\n    sync: (pattern: pattern, options: Object) => Array<string>,\n  };\n}\n"
  },
  {
    "path": "flow-typed/handmade/gray-matter.js",
    "content": "type GrayMatterResult = {\n  orig: string,\n  data: Object,\n  content: string,\n};\n\ndeclare module \"gray-matter\" {\n  declare module.exports: (string: string) => GrayMatterResult;\n}\n"
  },
  {
    "path": "flow-typed/handmade/js-beautify.js",
    "content": "type Options = {\n  indent_size: number,\n  indent_char: string,\n  eol: string,\n  indent_level: number,\n  indent_with_tabs: boolean,\n  preserve_newlines: boolean,\n  max_preserve_newlines: number,\n  jslint_happy: boolean,\n  space_after_anon_function: boolean,\n  brace_style: \"collapse\",\n  keep_array_indentation: boolean,\n  keep_function_indentation: boolean,\n  space_before_conditional: boolean,\n  break_chained_methods: boolean,\n  eval_code: boolean,\n  unescape_strings: boolean,\n  wrap_line_length: number,\n  wrap_attributes: string,\n  wrap_attributes_indent_size: number,\n  end_with_newline: boolean,\n};\n\ndeclare module \"js-beautify\" {\n  declare var default_options: Options;\n  declare function html(htmlString: string, options: Options): string;\n}\n"
  },
  {
    "path": "flow-typed/handmade/jsx-test-helpers-v1.x.x.js",
    "content": "/* eslint-disable */\ndeclare module \"jsx-test-helpers\" {\n  declare module.exports: {\n    concatPath: (dirA: string, dirB: string) => string,\n    noop: () => void,\n    JSX: (jsx: React$Node) => string,\n    renderJSX: (jsx: React$Node, cb?: any, context?: any) => string,\n    render: (jsx: React$Node, cb?: any, context?: any) => Object,\n  };\n}\n"
  },
  {
    "path": "flow-typed/handmade/loader-utils.js",
    "content": "declare module \"loader-utils\" {\n  declare interface LoaderUtils {\n    getOptions: Function;\n    getHashDigest: Function;\n  }\n  declare module.exports: LoaderUtils;\n}\n"
  },
  {
    "path": "flow-typed/handmade/log-symbols.js",
    "content": "declare module \"log-symbols\" {\n  declare module.exports: {\n    info: string,\n    success: string,\n    warning: string,\n    error: string,\n  };\n}\n"
  },
  {
    "path": "flow-typed/handmade/lru-memoize.js",
    "content": "declare module \"lru-memoize\" {\n  declare function memoizeInstance(func: Function): Function;\n  declare function memoize(num: number): typeof memoizeInstance;\n  declare module.exports: typeof memoize;\n}\n"
  },
  {
    "path": "flow-typed/handmade/mkdirp.js",
    "content": "declare module \"mkdirp\" {\n  declare module.exports: (path: string, callback: (err: any) => void) => void;\n}\n"
  },
  {
    "path": "flow-typed/handmade/multili.js",
    "content": "declare module \"multili\" {\n  declare module.exports: string => string;\n}\n"
  },
  {
    "path": "flow-typed/handmade/node-object-hash.js",
    "content": "type NodeObjectHashConfig = {\n  coerce?: string,\n  sort?: boolean,\n  alg?: string,\n  enc?: string,\n};\n\ndeclare function hash(obj: Object): string;\n\ntype NodeObjectHashInstance = {\n  hash: typeof hash,\n};\n\ndeclare module \"node-object-hash\" {\n  declare module.exports: (\n    config?: NodeObjectHashConfig,\n  ) => NodeObjectHashInstance;\n}\n"
  },
  {
    "path": "flow-typed/handmade/ora.js",
    "content": "type oraColors =\n  | \"black\"\n  | \"red\"\n  | \"green\"\n  | \"yellow\"\n  | \"blue\"\n  | \"magenta\"\n  | \"cyan\"\n  | \"white\"\n  | \"gray\";\n\ntype oraOptions =\n  | string\n  | {\n      text: string,\n      spinner: string | Object,\n      color: oraColors,\n      interval: number,\n      stream: Object,\n      enabled: boolean,\n    };\n\ntype oraInstance = {\n  start: () => oraInstance,\n  stop: () => oraInstance,\n  succeed: () => oraInstance,\n  fail: () => oraInstance,\n  stopAndPersist: (symbol: string) => oraInstance,\n  clear: () => oraInstance,\n  render: () => oraInstance,\n  frame: () => oraInstance,\n  text: string,\n  color: string,\n  stream: {\n    // @todo add more about WritableStream\n    write: Function,\n  },\n};\ndeclare module \"ora\" {\n  declare module.exports: (options?: oraOptions) => oraInstance;\n}\n"
  },
  {
    "path": "flow-typed/handmade/pify.js",
    "content": "declare module \"pify\" {\n  declare class Pify {\n    (callback: Function | Object): any;\n  }\n  declare module.exports: Pify;\n}\n"
  },
  {
    "path": "flow-typed/handmade/react-helmet_v5.x.x.js",
    "content": "declare module \"react-helmet\" {\n  declare type Props = {\n    base?: Object,\n    bodyAttributes?: Object,\n    children?: React$Node,\n    defaultTitle?: string,\n    defer?: boolean,\n    encodeSpecialCharacters?: boolean,\n    htmlAttributes?: Object,\n    link?: Array<Object>,\n    meta?: Array<Object>,\n    noscript?: Array<Object>,\n    onChangeClientState?: (\n      newState?: Object,\n      addedTags?: Object,\n      removeTags?: Object,\n    ) => any,\n    script?: Array<Object>,\n    style?: Array<Object>,\n    title?: string,\n    titleAttributes?: Object,\n    titleTemplate?: string,\n  };\n\n  declare interface AttributesMethods {\n    toString(): string;\n    toComponent(): Object;\n  }\n\n  declare interface TagMethods {\n    toString(): string;\n    toComponent(): [React$Element<*>] | React$Element<*> | Array<Object>;\n  }\n\n  declare interface StateOnServer {\n    base: TagMethods;\n    bodyAttributes: AttributesMethods;\n    htmlAttributes: AttributesMethods;\n    link: TagMethods;\n    meta: TagMethods;\n    noscript: TagMethods;\n    script: TagMethods;\n    style: TagMethods;\n    title: TagMethods;\n  }\n\n  declare class Helmet extends React$Component<Props> {\n    static rewind(): StateOnServer;\n    static renderStatic(): StateOnServer;\n    static canUseDom(canUseDOM: boolean): void;\n  }\n\n  declare export default typeof Helmet;\n  declare export var Helmet: typeof Helmet;\n}\n"
  },
  {
    "path": "flow-typed/handmade/react-router-scroll.js",
    "content": "type useScroll = (\n  shouldUpdateScroll?: (\n    prevRouterProps: Object | null,\n    routerProps: Object,\n  ) => boolean | Array<number>,\n) => Function;\n\ndeclare module \"react-router-scroll\" {\n  declare module.exports: useScroll;\n}\ndeclare module \"react-router-scroll/lib/useScroll\" {\n  declare module.exports: useScroll;\n}\n"
  },
  {
    "path": "flow-typed/handmade/remark.js",
    "content": "declare module \"remark\" {\n  declare interface remarkInstance {\n    use: (plugin: Function, options?: Object) => remarkInstance;\n    process: (s: string, options?: Object) => remarkResult;\n    processSync: (s: string, options?: Object) => Object;\n  }\n  declare interface remarkResult {\n    toString: () => string;\n  }\n  declare class remark {\n    (): remarkInstance;\n  }\n  declare module.exports: remark;\n}\n"
  },
  {
    "path": "flow-typed/handmade/sane.js",
    "content": "declare module \"sane\" {\n  declare type SaneCallbackType = (\n    filepath: string,\n    root: string,\n    stat: Object,\n  ) => void | Promise<void>;\n  declare type SaneOptionsType = {\n    watchman: boolean,\n    glob: $ReadOnlyArray<string>,\n  };\n  declare type Watcher = {\n    on: (string, SaneCallbackType) => void,\n    close: () => void,\n  };\n  declare module.exports: (path: string, options: SaneOptionsType) => Watcher;\n}\n"
  },
  {
    "path": "flow-typed/handmade/semver.js",
    "content": "declare module \"semver\" {\n  declare interface Semver {\n    satisfies: (requirement?: string, version: string) => boolean;\n  }\n\n  declare module.exports: Semver;\n}\n"
  },
  {
    "path": "flow-typed/handmade/simple-json-fetch.js",
    "content": "declare module \"simple-json-fetch\" {\n  declare class SimpleJsonFetch {\n    (uri: string): Promise<any>;\n  }\n  declare module.exports: SimpleJsonFetch;\n}\n"
  },
  {
    "path": "flow-typed/handmade/strip-markdown.js",
    "content": "declare module \"strip-markdown\" {\n  declare module.exports: () => void;\n}\n"
  },
  {
    "path": "flow-typed/handmade/striptags.js",
    "content": "declare module \"striptags\" {\n  declare module.exports: string => string;\n}\n"
  },
  {
    "path": "flow-typed/handmade/url-join.js",
    "content": "declare module \"url-join\" {\n  declare module.exports: // @todo can we defined unlimited arguments? Didn't find how to in the doc\n  (arg1: string, arg2: string, arg3?: string, arg4?: string) => string;\n}\n"
  },
  {
    "path": "flow-typed/handmade/webpack-dev-middleware.js",
    "content": "declare module \"webpack-dev-middleware\" {\n  declare module.exports: (\n    compiler: Object,\n    options: Object,\n  ) => express$Middleware;\n}\n"
  },
  {
    "path": "flow-typed/handmade/webpack-hot-middleware.js",
    "content": "declare module \"webpack-hot-middleware\" {\n  declare module.exports: (\n    compiler: Object,\n    options: Object,\n  ) => express$Middleware;\n}\n"
  },
  {
    "path": "flow-typed/handmade/webpack-sources.js",
    "content": "/* eslint-disable no-unused-vars */\ntype SourceType = Object;\n\ntype RawSourceType = (s: string) => SourceType;\n\ndeclare module \"webpack-sources\" {\n  declare var RawSource: RawSourceType;\n}\n"
  },
  {
    "path": "flow-typed/handmade/webpack.js",
    "content": "/* eslint-disable */\n\ndeclare var module: {\n  hot: {\n    accept(arg1: string | (() => void), arg2?: () => void): void,\n  },\n};\n"
  },
  {
    "path": "flow-typed/handmade/webpack_v4.x.x.js",
    "content": "declare module \"webpack\" {\n  declare class WebpackError extends Error {\n    constructor(message: string): WebpackError;\n    inspect(): string;\n  }\n\n  declare type WebpackCompiler = {\n    // <...>\n  };\n\n  declare type WebpackMultiCompiler = {\n    // <...>\n  };\n\n  declare class WebpackCompilation {\n    constructor(compiler: WebpackCompiler): WebpackCompilation;\n    // <...>\n  }\n\n  declare class WebpackStats {\n    constructor(compilation: WebpackCompilation): WebpackStats;\n    // <...>\n  }\n\n  declare type NonEmptyArrayOfUniqueStringValues = Array<string>;\n\n  declare type EntryObject = {\n    [k: string]: string | NonEmptyArrayOfUniqueStringValues,\n  };\n\n  declare type EntryItem = string | NonEmptyArrayOfUniqueStringValues;\n\n  declare type EntryStatic = EntryObject | EntryItem;\n\n  declare type EntryDynamic = () => EntryStatic | Promise<EntryStatic>;\n\n  declare type Entry = EntryDynamic | EntryStatic;\n\n  declare type ArrayOfStringValues = Array<string>;\n\n  declare type ExternalItem =\n    | string\n    | {\n        [k: string]:\n          | string\n          | {\n              [k: string]: any,\n            }\n          | ArrayOfStringValues\n          | boolean,\n      }\n    | RegExp;\n\n  declare type Externals =\n    | ((\n        context: string,\n        request: string,\n        callback: (err?: Error, result?: string) => void,\n      ) => void)\n    | ExternalItem\n    | Array<\n        | ((\n            context: string,\n            request: string,\n            callback: (err?: Error, result?: string) => void,\n          ) => void)\n        | ExternalItem,\n      >;\n\n  declare type RuleSetCondition =\n    | RegExp\n    | string\n    | ((value: string) => boolean)\n    | RuleSetConditions\n    | {\n        and?: RuleSetConditions,\n        exclude?: RuleSetConditionOrConditions,\n        include?: RuleSetConditionOrConditions,\n        not?: RuleSetConditions,\n        or?: RuleSetConditions,\n        test?: RuleSetConditionOrConditions,\n      };\n\n  declare type RuleSetConditions = Array<RuleSetCondition>;\n\n  declare type RuleSetConditionOrConditions =\n    | RuleSetCondition\n    | RuleSetConditions;\n\n  declare type RuleSetLoader = string;\n\n  declare type RuleSetQuery = { [k: string]: any } | string;\n\n  declare type RuleSetUseItem =\n    | RuleSetLoader\n    | Function\n    | {\n        ident?: string,\n        loader?: RuleSetLoader,\n        options?: RuleSetQuery,\n        query?: RuleSetQuery,\n      };\n\n  declare type RuleSetUse = RuleSetUseItem | Function | Array<RuleSetUseItem>;\n\n  declare type RuleSetRule = {\n    compiler?: RuleSetConditionOrConditions,\n    enforce?: \"pre\" | \"post\",\n    exclude?: RuleSetConditionOrConditions,\n    include?: RuleSetConditionOrConditions,\n    issuer?: RuleSetConditionOrConditions,\n    loader?: RuleSetLoader | RuleSetUse,\n    loaders?: RuleSetUse,\n    oneOf?: RuleSetRules,\n    options?: RuleSetQuery,\n    parser?: {\n      [k: string]: any,\n    },\n    query?: RuleSetQuery,\n    resolve?: ResolveOptions,\n    resource?: RuleSetConditionOrConditions,\n    resourceQuery?: RuleSetConditionOrConditions,\n    rules?: RuleSetRules,\n    sideEffects?: boolean,\n    test?: RuleSetConditionOrConditions,\n    type?:\n      | \"javascript/auto\"\n      | \"javascript/dynamic\"\n      | \"javascript/esm\"\n      | \"json\"\n      | \"webassembly/experimental\",\n    use?: RuleSetUse,\n  };\n\n  declare type RuleSetRules = Array<RuleSetRule>;\n\n  declare type ModuleOptions = {\n    defaultRules?: RuleSetRules,\n    exprContextCritical?: boolean,\n    exprContextRecursive?: boolean,\n    exprContextRegExp?: boolean | RegExp,\n    exprContextRequest?: string,\n    noParse?: Array<RegExp> | RegExp | Function | Array<string> | string,\n    rules?: RuleSetRules,\n    strictExportPresence?: boolean,\n    strictThisContextOnImports?: boolean,\n    unknownContextCritical?: boolean,\n    unknownContextRecursive?: boolean,\n    unknownContextRegExp?: boolean | RegExp,\n    unknownContextRequest?: string,\n    unsafeCache?: boolean | Function,\n    wrappedContextCritical?: boolean,\n    wrappedContextRecursive?: boolean,\n    wrappedContextRegExp?: RegExp,\n  };\n\n  declare type NodeOptions = {\n    Buffer?: false | true | \"mock\",\n    __dirname?: false | true | \"mock\",\n    __filename?: false | true | \"mock\",\n    console?: false | true | \"mock\",\n    global?: boolean,\n    process?: false | true | \"mock\",\n    [k: string]: false | true | \"mock\" | \"empty\",\n  };\n\n  declare type WebpackPluginFunction = (compiler: WebpackCompiler) => void;\n\n  declare type WebpackPluginInstance = {\n    apply: WebpackPluginFunction,\n    [k: string]: any,\n  };\n\n  declare type OptimizationSplitChunksOptions = {\n    automaticNameDelimiter?: string,\n    cacheGroups?: {\n      [k: string]:\n        | false\n        | Function\n        | string\n        | RegExp\n        | {\n            automaticNameDelimiter?: string,\n            automaticNamePrefix?: string,\n            chunks?: (\"initial\" | \"async\" | \"all\") | Function,\n            enforce?: boolean,\n            filename?: string,\n            maxAsyncRequests?: number,\n            maxInitialRequests?: number,\n            maxSize?: number,\n            minChunks?: number,\n            minSize?: number,\n            name?: boolean | Function | string,\n            priority?: number,\n            reuseExistingChunk?: boolean,\n            test?: Function | string | RegExp,\n          },\n    },\n    chunks?: (\"initial\" | \"async\" | \"all\") | Function,\n    fallbackCacheGroup?: {\n      automaticNameDelimiter?: string,\n      maxSize?: number,\n      minSize?: number,\n    },\n    filename?: string,\n    hidePathInfo?: boolean,\n    maxAsyncRequests?: number,\n    maxInitialRequests?: number,\n    maxSize?: number,\n    minChunks?: number,\n    minSize?: number,\n    name?: boolean | Function | string,\n  };\n\n  declare type OptimizationOptions = {\n    checkWasmTypes?: boolean,\n    chunkIds?: \"natural\" | \"named\" | \"size\" | \"total-size\" | false,\n    concatenateModules?: boolean,\n    flagIncludedChunks?: boolean,\n    hashedModuleIds?: boolean,\n    mangleWasmImports?: boolean,\n    mergeDuplicateChunks?: boolean,\n    minimize?: boolean,\n    minimizer?: Array<WebpackPluginInstance | WebpackPluginFunction>,\n    moduleIds?: \"natural\" | \"named\" | \"hashed\" | \"size\" | \"total-size\" | false,\n    namedChunks?: boolean,\n    namedModules?: boolean,\n    noEmitOnErrors?: boolean,\n    nodeEnv?: false | string,\n    occurrenceOrder?: boolean,\n    portableRecords?: boolean,\n    providedExports?: boolean,\n    removeAvailableModules?: boolean,\n    removeEmptyChunks?: boolean,\n    runtimeChunk?:\n      | boolean\n      | (\"single\" | \"multiple\")\n      | {\n          name?: string | Function,\n        },\n    sideEffects?: boolean,\n    splitChunks?: false | OptimizationSplitChunksOptions,\n    usedExports?: boolean,\n  };\n\n  declare type LibraryCustomUmdObject = {\n    amd?: string,\n    commonjs?: string,\n    root?: string | ArrayOfStringValues,\n  };\n\n  declare type OutputOptions = {\n    auxiliaryComment?:\n      | string\n      | {\n          amd?: string,\n          commonjs?: string,\n          commonjs2?: string,\n          root?: string,\n        },\n    chunkCallbackName?: string,\n    chunkFilename?: string,\n    chunkLoadTimeout?: number,\n    crossOriginLoading?: false | \"anonymous\" | \"use-credentials\",\n    devtoolFallbackModuleFilenameTemplate?: string | Function,\n    devtoolLineToLine?: boolean | { [k: string]: any },\n    devtoolModuleFilenameTemplate?: string | Function,\n    devtoolNamespace?: string,\n    filename?: string | Function,\n    globalObject?: string,\n    hashDigest?: string,\n    hashDigestLength?: number,\n    hashFunction?: string | Function,\n    hashSalt?: string,\n    hotUpdateChunkFilename?: string | Function,\n    hotUpdateFunction?: string,\n    hotUpdateMainFilename?: string | Function,\n    jsonpFunction?: string,\n    jsonpScriptType?: false | \"text/javascript\" | \"module\",\n    library?: string | Array<string> | LibraryCustomUmdObject,\n    libraryExport?: string | ArrayOfStringValues,\n    libraryTarget?:\n      | \"var\"\n      | \"assign\"\n      | \"this\"\n      | \"window\"\n      | \"self\"\n      | \"global\"\n      | \"commonjs\"\n      | \"commonjs2\"\n      | \"commonjs-module\"\n      | \"amd\"\n      | \"amd-require\"\n      | \"umd\"\n      | \"umd2\"\n      | \"jsonp\",\n    path?: string,\n    pathinfo?: boolean,\n    publicPath?: string | Function,\n    sourceMapFilename?: string,\n    sourcePrefix?: string,\n    strictModuleExceptionHandling?: boolean,\n    umdNamedDefine?: boolean,\n    webassemblyModuleFilename?: string,\n  };\n\n  declare type PerformanceOptions = {\n    assetFilter?: Function,\n    hints?: false | \"warning\" | \"error\",\n    maxAssetSize?: number,\n    maxEntrypointSize?: number,\n  };\n\n  declare type ArrayOfStringOrStringArrayValues = Array<string | Array<string>>;\n\n  declare type ResolveOptions = {\n    alias?:\n      | { [k: string]: string }\n      | Array<{\n          alias?: string,\n          name?: string,\n          onlyModule?: boolean,\n        }>,\n    aliasFields?: ArrayOfStringOrStringArrayValues,\n    cachePredicate?: Function,\n    cacheWithContext?: boolean,\n    concord?: boolean,\n    descriptionFiles?: ArrayOfStringValues,\n    enforceExtension?: boolean,\n    enforceModuleExtension?: boolean,\n    extensions?: ArrayOfStringValues,\n    fileSystem?: { [k: string]: any },\n    mainFields?: ArrayOfStringOrStringArrayValues,\n    mainFiles?: ArrayOfStringValues,\n    moduleExtensions?: ArrayOfStringValues,\n    modules?: ArrayOfStringValues,\n    plugins?: Array<WebpackPluginInstance | WebpackPluginFunction>,\n    resolver?: { [k: string]: any },\n    symlinks?: boolean,\n    unsafeCache?: boolean | { [k: string]: any },\n    useSyncFileSystemCalls?: boolean,\n  };\n\n  declare type FilterItemTypes = RegExp | string | Function;\n\n  declare type FilterTypes = FilterItemTypes | Array<FilterItemTypes>;\n\n  declare type StatsOptions = {\n    all?: boolean,\n    assets?: boolean,\n    assetsSort?: string,\n    builtAt?: boolean,\n    cached?: boolean,\n    cachedAssets?: boolean,\n    children?: boolean,\n    chunkGroups?: boolean,\n    chunkModules?: boolean,\n    chunkOrigins?: boolean,\n    chunks?: boolean,\n    chunksSort?: string,\n    colors?:\n      | boolean\n      | {\n          bold?: string,\n          cyan?: string,\n          green?: string,\n          magenta?: string,\n          red?: string,\n          yellow?: string,\n        },\n    context?: string,\n    depth?: boolean,\n    entrypoints?: boolean,\n    env?: boolean,\n    errorDetails?: boolean,\n    errors?: boolean,\n    exclude?: FilterTypes | boolean,\n    excludeAssets?: FilterTypes,\n    excludeModules?: FilterTypes | boolean,\n    hash?: boolean,\n    maxModules?: number,\n    moduleAssets?: boolean,\n    moduleTrace?: boolean,\n    modules?: boolean,\n    modulesSort?: string,\n    nestedModules?: boolean,\n    optimizationBailout?: boolean,\n    outputPath?: boolean,\n    performance?: boolean,\n    providedExports?: boolean,\n    publicPath?: boolean,\n    reasons?: boolean,\n    source?: boolean,\n    timings?: boolean,\n    usedExports?: boolean,\n    version?: boolean,\n    warnings?: boolean,\n    warningsFilter?: FilterTypes,\n  };\n\n  declare type WebpackOptions = {\n    amd?: { [k: string]: any },\n    bail?: boolean,\n    cache?: boolean | { [k: string]: any },\n    context?: string,\n    dependencies?: Array<string>,\n    devServer?: { [k: string]: any },\n    devtool?: string | false,\n    entry?: Entry,\n    externals?: Externals,\n    loader?: { [k: string]: any },\n    mode?: \"development\" | \"production\" | \"none\",\n    module?: ModuleOptions,\n    name?: string,\n    node?: false | NodeOptions,\n    optimization?: OptimizationOptions,\n    output?: OutputOptions,\n    parallelism?: number,\n    performance?: false | PerformanceOptions,\n    plugins?: Array<WebpackPluginInstance | WebpackPluginFunction>,\n    profile?: boolean,\n    recordsInputPath?: string,\n    recordsOutputPath?: string,\n    recordsPath?: string,\n    resolve?: ResolveOptions,\n    resolveLoader?: ResolveOptions,\n    serve?: { [k: string]: any },\n    stats?:\n      | StatsOptions\n      | boolean\n      | (\n          | \"none\"\n          | \"errors-only\"\n          | \"minimal\"\n          | \"normal\"\n          | \"detailed\"\n          | \"verbose\"\n        ),\n    target?:\n      | \"web\"\n      | \"webworker\"\n      | \"node\"\n      | \"async-node\"\n      | \"node-webkit\"\n      | \"electron-main\"\n      | \"electron-renderer\"\n      | ((compiler: WebpackCompiler) => void),\n    watch?: boolean,\n    watchOptions?: {\n      aggregateTimeout?: number,\n      ignored?: { [k: string]: any },\n      poll?: boolean | number,\n      stdin?: boolean,\n    },\n  };\n\n  declare module.exports: (\n    options: WebpackOptions,\n    callback: (error: WebpackError, stats: WebpackStats) => void,\n  ) => WebpackCompiler | WebpackMultiCompiler;\n}\n"
  },
  {
    "path": "flow-typed/npm/aphrodite_vx.x.x.js",
    "content": "// flow-typed signature: 89f8074b9679446826e4641701539150\n// flow-typed version: <<STUB>>/aphrodite_v1/flow_v0.68.0\n\n/**\n * This is an autogenerated libdef stub for:\n *\n *   'aphrodite'\n *\n * Fill this stub out by replacing all the `any` types.\n *\n * Once filled out, we encourage you to share your work with the\n * community by sending a pull request to:\n * https://github.com/flowtype/flow-typed\n */\n\ndeclare module \"aphrodite\" {\n  declare module.exports: any;\n}\n\n/**\n * We include stubs for each file inside this npm package in case you need to\n * require those files directly. Feel free to delete any files that aren't\n * needed.\n */\ndeclare module \"aphrodite/coverage/prettify\" {\n  declare module.exports: any;\n}\n\ndeclare module \"aphrodite/coverage/sorter\" {\n  declare module.exports: any;\n}\n\ndeclare module \"aphrodite/dist/aphrodite\" {\n  declare module.exports: any;\n}\n\ndeclare module \"aphrodite/dist/aphrodite.umd\" {\n  declare module.exports: any;\n}\n\ndeclare module \"aphrodite/dist/aphrodite.umd.min\" {\n  declare module.exports: any;\n}\n\ndeclare module \"aphrodite/examples/runkit\" {\n  declare module.exports: any;\n}\n\ndeclare module \"aphrodite/examples/server\" {\n  declare module.exports: any;\n}\n\ndeclare module \"aphrodite/examples/src/examples-ssr\" {\n  declare module.exports: any;\n}\n\ndeclare module \"aphrodite/examples/src/examples\" {\n  declare module.exports: any;\n}\n\ndeclare module \"aphrodite/examples/src/StyleTester\" {\n  declare module.exports: any;\n}\n\ndeclare module \"aphrodite/examples/webpack.config\" {\n  declare module.exports: any;\n}\n\ndeclare module \"aphrodite/lib/exports\" {\n  declare module.exports: any;\n}\n\ndeclare module \"aphrodite/lib/generate\" {\n  declare module.exports: any;\n}\n\ndeclare module \"aphrodite/lib/index\" {\n  declare module.exports: any;\n}\n\ndeclare module \"aphrodite/lib/inject\" {\n  declare module.exports: any;\n}\n\ndeclare module \"aphrodite/lib/no-important\" {\n  declare module.exports: any;\n}\n\ndeclare module \"aphrodite/lib/ordered-elements\" {\n  declare module.exports: any;\n}\n\ndeclare module \"aphrodite/lib/staticPrefixData\" {\n  declare module.exports: any;\n}\n\ndeclare module \"aphrodite/lib/util\" {\n  declare module.exports: any;\n}\n\ndeclare module \"aphrodite/no-important\" {\n  declare module.exports: any;\n}\n\ndeclare module \"aphrodite/src/exports\" {\n  declare module.exports: any;\n}\n\ndeclare module \"aphrodite/src/generate\" {\n  declare module.exports: any;\n}\n\ndeclare module \"aphrodite/src/index\" {\n  declare module.exports: any;\n}\n\ndeclare module \"aphrodite/src/inject\" {\n  declare module.exports: any;\n}\n\ndeclare module \"aphrodite/src/no-important\" {\n  declare module.exports: any;\n}\n\ndeclare module \"aphrodite/src/ordered-elements\" {\n  declare module.exports: any;\n}\n\ndeclare module \"aphrodite/src/util\" {\n  declare module.exports: any;\n}\n\ndeclare module \"aphrodite/tests/generate_test\" {\n  declare module.exports: any;\n}\n\ndeclare module \"aphrodite/tests/index_test\" {\n  declare module.exports: any;\n}\n\ndeclare module \"aphrodite/tests/inject_test\" {\n  declare module.exports: any;\n}\n\ndeclare module \"aphrodite/tests/no-important_test\" {\n  declare module.exports: any;\n}\n\ndeclare module \"aphrodite/tests/ordered-elements_test\" {\n  declare module.exports: any;\n}\n\ndeclare module \"aphrodite/tests/util_test\" {\n  declare module.exports: any;\n}\n\ndeclare module \"aphrodite/tools/generate_prefixer_data\" {\n  declare module.exports: any;\n}\n\ndeclare module \"aphrodite/webpack.config\" {\n  declare module.exports: any;\n}\n\n// Filename aliases\ndeclare module \"aphrodite/coverage/prettify.js\" {\n  declare module.exports: $Exports<\"aphrodite/coverage/prettify\">;\n}\ndeclare module \"aphrodite/coverage/sorter.js\" {\n  declare module.exports: $Exports<\"aphrodite/coverage/sorter\">;\n}\ndeclare module \"aphrodite/dist/aphrodite.js\" {\n  declare module.exports: $Exports<\"aphrodite/dist/aphrodite\">;\n}\ndeclare module \"aphrodite/dist/aphrodite.umd.js\" {\n  declare module.exports: $Exports<\"aphrodite/dist/aphrodite.umd\">;\n}\ndeclare module \"aphrodite/dist/aphrodite.umd.min.js\" {\n  declare module.exports: $Exports<\"aphrodite/dist/aphrodite.umd.min\">;\n}\ndeclare module \"aphrodite/examples/runkit.js\" {\n  declare module.exports: $Exports<\"aphrodite/examples/runkit\">;\n}\ndeclare module \"aphrodite/examples/server.js\" {\n  declare module.exports: $Exports<\"aphrodite/examples/server\">;\n}\ndeclare module \"aphrodite/examples/src/examples-ssr.js\" {\n  declare module.exports: $Exports<\"aphrodite/examples/src/examples-ssr\">;\n}\ndeclare module \"aphrodite/examples/src/examples.js\" {\n  declare module.exports: $Exports<\"aphrodite/examples/src/examples\">;\n}\ndeclare module \"aphrodite/examples/src/StyleTester.js\" {\n  declare module.exports: $Exports<\"aphrodite/examples/src/StyleTester\">;\n}\ndeclare module \"aphrodite/examples/webpack.config.js\" {\n  declare module.exports: $Exports<\"aphrodite/examples/webpack.config\">;\n}\ndeclare module \"aphrodite/lib/exports.js\" {\n  declare module.exports: $Exports<\"aphrodite/lib/exports\">;\n}\ndeclare module \"aphrodite/lib/generate.js\" {\n  declare module.exports: $Exports<\"aphrodite/lib/generate\">;\n}\ndeclare module \"aphrodite/lib/index.js\" {\n  declare module.exports: $Exports<\"aphrodite/lib/index\">;\n}\ndeclare module \"aphrodite/lib/inject.js\" {\n  declare module.exports: $Exports<\"aphrodite/lib/inject\">;\n}\ndeclare module \"aphrodite/lib/no-important.js\" {\n  declare module.exports: $Exports<\"aphrodite/lib/no-important\">;\n}\ndeclare module \"aphrodite/lib/ordered-elements.js\" {\n  declare module.exports: $Exports<\"aphrodite/lib/ordered-elements\">;\n}\ndeclare module \"aphrodite/lib/staticPrefixData.js\" {\n  declare module.exports: $Exports<\"aphrodite/lib/staticPrefixData\">;\n}\ndeclare module \"aphrodite/lib/util.js\" {\n  declare module.exports: $Exports<\"aphrodite/lib/util\">;\n}\ndeclare module \"aphrodite/no-important.js\" {\n  declare module.exports: $Exports<\"aphrodite/no-important\">;\n}\ndeclare module \"aphrodite/src/exports.js\" {\n  declare module.exports: $Exports<\"aphrodite/src/exports\">;\n}\ndeclare module \"aphrodite/src/generate.js\" {\n  declare module.exports: $Exports<\"aphrodite/src/generate\">;\n}\ndeclare module \"aphrodite/src/index.js\" {\n  declare module.exports: $Exports<\"aphrodite/src/index\">;\n}\ndeclare module \"aphrodite/src/inject.js\" {\n  declare module.exports: $Exports<\"aphrodite/src/inject\">;\n}\ndeclare module \"aphrodite/src/no-important.js\" {\n  declare module.exports: $Exports<\"aphrodite/src/no-important\">;\n}\ndeclare module \"aphrodite/src/ordered-elements.js\" {\n  declare module.exports: $Exports<\"aphrodite/src/ordered-elements\">;\n}\ndeclare module \"aphrodite/src/util.js\" {\n  declare module.exports: $Exports<\"aphrodite/src/util\">;\n}\ndeclare module \"aphrodite/tests/generate_test.js\" {\n  declare module.exports: $Exports<\"aphrodite/tests/generate_test\">;\n}\ndeclare module \"aphrodite/tests/index_test.js\" {\n  declare module.exports: $Exports<\"aphrodite/tests/index_test\">;\n}\ndeclare module \"aphrodite/tests/inject_test.js\" {\n  declare module.exports: $Exports<\"aphrodite/tests/inject_test\">;\n}\ndeclare module \"aphrodite/tests/no-important_test.js\" {\n  declare module.exports: $Exports<\"aphrodite/tests/no-important_test\">;\n}\ndeclare module \"aphrodite/tests/ordered-elements_test.js\" {\n  declare module.exports: $Exports<\"aphrodite/tests/ordered-elements_test\">;\n}\ndeclare module \"aphrodite/tests/util_test.js\" {\n  declare module.exports: $Exports<\"aphrodite/tests/util_test\">;\n}\ndeclare module \"aphrodite/tools/generate_prefixer_data.js\" {\n  declare module.exports: $Exports<\"aphrodite/tools/generate_prefixer_data\">;\n}\ndeclare module \"aphrodite/webpack.config.js\" {\n  declare module.exports: $Exports<\"aphrodite/webpack.config\">;\n}\n"
  },
  {
    "path": "flow-typed/npm/asciidoctor.js_vx.x.x.js",
    "content": "// flow-typed signature: 2c8f0b37c34ec9310b26eae1f00ab18c\n// flow-typed version: <<STUB>>/asciidoctor.js_v1/flow_v0.68.0\n\n/**\n * This is an autogenerated libdef stub for:\n *\n *   'asciidoctor.js'\n *\n * Fill this stub out by replacing all the `any` types.\n *\n * Once filled out, we encourage you to share your work with the\n * community by sending a pull request to:\n * https://github.com/flowtype/flow-typed\n */\n\ndeclare module \"asciidoctor.js\" {\n  declare module.exports: any;\n}\n\n/**\n * We include stubs for each file inside this npm package in case you need to\n * require those files directly. Feel free to delete any files that aren't\n * needed.\n */\ndeclare module \"asciidoctor.js/dist/asciidoctor\" {\n  declare module.exports: any;\n}\n\n// Filename aliases\ndeclare module \"asciidoctor.js/dist/asciidoctor.js\" {\n  declare module.exports: $Exports<\"asciidoctor.js/dist/asciidoctor\">;\n}\n"
  },
  {
    "path": "flow-typed/npm/chalk_v1.x.x.js",
    "content": "// flow-typed signature: f965116cdb881170be8c42b10554e195\n// flow-typed version: da30fe6876/chalk_v1.x.x/flow_>=v0.25.x\n\ntype $npm$chalk$StyleElement = {\n  open: string,\n  close: string,\n};\n\ntype $npm$chalk$Chain = $npm$chalk$Style & ((...text: any[]) => string);\n\ntype $npm$chalk$Style = {\n  // General\n  reset: $npm$chalk$Chain,\n  bold: $npm$chalk$Chain,\n  dim: $npm$chalk$Chain,\n  italic: $npm$chalk$Chain,\n  underline: $npm$chalk$Chain,\n  inverse: $npm$chalk$Chain,\n  strikethrough: $npm$chalk$Chain,\n\n  // Text colors\n  black: $npm$chalk$Chain,\n  red: $npm$chalk$Chain,\n  green: $npm$chalk$Chain,\n  yellow: $npm$chalk$Chain,\n  blue: $npm$chalk$Chain,\n  magenta: $npm$chalk$Chain,\n  cyan: $npm$chalk$Chain,\n  white: $npm$chalk$Chain,\n  gray: $npm$chalk$Chain,\n  grey: $npm$chalk$Chain,\n\n  // Background colors\n  bgBlack: $npm$chalk$Chain,\n  bgRed: $npm$chalk$Chain,\n  bgGreen: $npm$chalk$Chain,\n  bgYellow: $npm$chalk$Chain,\n  bgBlue: $npm$chalk$Chain,\n  bgMagenta: $npm$chalk$Chain,\n  bgCyan: $npm$chalk$Chain,\n  bgWhite: $npm$chalk$Chain,\n};\n\ntype $npm$chalk$StyleMap = {\n  // General\n  reset: $npm$chalk$StyleElement,\n  bold: $npm$chalk$StyleElement,\n  dim: $npm$chalk$StyleElement,\n  italic: $npm$chalk$StyleElement,\n  underline: $npm$chalk$StyleElement,\n  inverse: $npm$chalk$StyleElement,\n  strikethrough: $npm$chalk$StyleElement,\n\n  // Text colors\n  black: $npm$chalk$StyleElement,\n  red: $npm$chalk$StyleElement,\n  green: $npm$chalk$StyleElement,\n  yellow: $npm$chalk$StyleElement,\n  blue: $npm$chalk$StyleElement,\n  magenta: $npm$chalk$StyleElement,\n  cyan: $npm$chalk$StyleElement,\n  white: $npm$chalk$StyleElement,\n  gray: $npm$chalk$StyleElement,\n\n  // Background colors\n  bgBlack: $npm$chalk$StyleElement,\n  bgRed: $npm$chalk$StyleElement,\n  bgGreen: $npm$chalk$StyleElement,\n  bgYellow: $npm$chalk$StyleElement,\n  bgBlue: $npm$chalk$StyleElement,\n  bgMagenta: $npm$chalk$StyleElement,\n  bgCyan: $npm$chalk$StyleElement,\n  bgWhite: $npm$chalk$StyleElement,\n};\n\ndeclare module \"chalk\" {\n  declare var enabled: boolean;\n  declare var supportsColor: boolean;\n  declare var styles: $npm$chalk$StyleMap;\n\n  declare function stripColor(value: string): any;\n  declare function hasColor(str: string): boolean;\n\n  // General\n  declare var reset: $npm$chalk$Chain;\n  declare var bold: $npm$chalk$Chain;\n  declare var dim: $npm$chalk$Chain;\n  declare var italic: $npm$chalk$Chain;\n  declare var underline: $npm$chalk$Chain;\n  declare var inverse: $npm$chalk$Chain;\n  declare var strikethrough: $npm$chalk$Chain;\n\n  // Text colors\n  declare var black: $npm$chalk$Chain;\n  declare var red: $npm$chalk$Chain;\n  declare var green: $npm$chalk$Chain;\n  declare var yellow: $npm$chalk$Chain;\n  declare var blue: $npm$chalk$Chain;\n  declare var magenta: $npm$chalk$Chain;\n  declare var cyan: $npm$chalk$Chain;\n  declare var white: $npm$chalk$Chain;\n  declare var gray: $npm$chalk$Chain;\n  declare var grey: $npm$chalk$Chain;\n\n  // Background colors\n  declare var bgBlack: $npm$chalk$Chain;\n  declare var bgRed: $npm$chalk$Chain;\n  declare var bgGreen: $npm$chalk$Chain;\n  declare var bgYellow: $npm$chalk$Chain;\n  declare var bgBlue: $npm$chalk$Chain;\n  declare var bgMagenta: $npm$chalk$Chain;\n  declare var bgCyan: $npm$chalk$Chain;\n  declare var bgWhite: $npm$chalk$Chain;\n}\n"
  },
  {
    "path": "flow-typed/npm/classnames_v2.x.x.js",
    "content": "// flow-typed signature: cf86673cc32d185bdab1d2ea90578d37\n// flow-typed version: 614bf49aa8/classnames_v2.x.x/flow_>=v0.25.x\n\ntype $npm$classnames$Classes =\n  | string\n  | { [className: string]: * }\n  | false\n  | void\n  | null;\n\ndeclare module \"classnames\" {\n  declare module.exports: (\n    ...classes: Array<$npm$classnames$Classes | $npm$classnames$Classes[]>\n  ) => string;\n}\n\ndeclare module \"classnames/bind\" {\n  declare module.exports: $Exports<\"classnames\">;\n}\n\ndeclare module \"classnames/dedupe\" {\n  declare module.exports: $Exports<\"classnames\">;\n}\n"
  },
  {
    "path": "flow-typed/npm/cosmiconfig_vx.x.x.js",
    "content": "// flow-typed signature: f920f3d9c66f46197d121928b5687b7f\n// flow-typed version: <<STUB>>/cosmiconfig_v2/flow_v0.68.0\n\n/**\n * This is an autogenerated libdef stub for:\n *\n *   'cosmiconfig'\n *\n * Fill this stub out by replacing all the `any` types.\n *\n * Once filled out, we encourage you to share your work with the\n * community by sending a pull request to:\n * https://github.com/flowtype/flow-typed\n */\n\ndeclare module \"cosmiconfig\" {\n  declare module.exports: any;\n}\n\n/**\n * We include stubs for each file inside this npm package in case you need to\n * require those files directly. Feel free to delete any files that aren't\n * needed.\n */\ndeclare module \"cosmiconfig/lib/loadDefinedFile\" {\n  declare module.exports: any;\n}\n\ndeclare module \"cosmiconfig/lib/loadJs\" {\n  declare module.exports: any;\n}\n\ndeclare module \"cosmiconfig/lib/loadPackageProp\" {\n  declare module.exports: any;\n}\n\ndeclare module \"cosmiconfig/lib/loadRc\" {\n  declare module.exports: any;\n}\n\n// Filename aliases\ndeclare module \"cosmiconfig/index\" {\n  declare module.exports: $Exports<\"cosmiconfig\">;\n}\ndeclare module \"cosmiconfig/index.js\" {\n  declare module.exports: $Exports<\"cosmiconfig\">;\n}\ndeclare module \"cosmiconfig/lib/loadDefinedFile.js\" {\n  declare module.exports: $Exports<\"cosmiconfig/lib/loadDefinedFile\">;\n}\ndeclare module \"cosmiconfig/lib/loadJs.js\" {\n  declare module.exports: $Exports<\"cosmiconfig/lib/loadJs\">;\n}\ndeclare module \"cosmiconfig/lib/loadPackageProp.js\" {\n  declare module.exports: $Exports<\"cosmiconfig/lib/loadPackageProp\">;\n}\ndeclare module \"cosmiconfig/lib/loadRc.js\" {\n  declare module.exports: $Exports<\"cosmiconfig/lib/loadRc\">;\n}\n"
  },
  {
    "path": "flow-typed/npm/cross-env_vx.x.x.js",
    "content": "// flow-typed signature: 5592a3bd3fba4d66706ebee20bf1280d\n// flow-typed version: <<STUB>>/cross-env_v^2.0.0/flow_v0.87.0\n\n/**\n * This is an autogenerated libdef stub for:\n *\n *   'cross-env'\n *\n * Fill this stub out by replacing all the `any` types.\n *\n * Once filled out, we encourage you to share your work with the\n * community by sending a pull request to:\n * https://github.com/flowtype/flow-typed\n */\n\ndeclare module \"cross-env\" {\n  declare module.exports: any;\n}\n\n/**\n * We include stubs for each file inside this npm package in case you need to\n * require those files directly. Feel free to delete any files that aren't\n * needed.\n */\ndeclare module \"cross-env/bin/cross-env\" {\n  declare module.exports: any;\n}\n\ndeclare module \"cross-env/dist/index\" {\n  declare module.exports: any;\n}\n\ndeclare module \"cross-env/src/index\" {\n  declare module.exports: any;\n}\n\ndeclare module \"cross-env/src/index.test\" {\n  declare module.exports: any;\n}\n\n// Filename aliases\ndeclare module \"cross-env/bin/cross-env.js\" {\n  declare module.exports: $Exports<\"cross-env/bin/cross-env\">;\n}\ndeclare module \"cross-env/dist/index.js\" {\n  declare module.exports: $Exports<\"cross-env/dist/index\">;\n}\ndeclare module \"cross-env/src/index.js\" {\n  declare module.exports: $Exports<\"cross-env/src/index\">;\n}\ndeclare module \"cross-env/src/index.test.js\" {\n  declare module.exports: $Exports<\"cross-env/src/index.test\">;\n}\n"
  },
  {
    "path": "flow-typed/npm/cross-spawn_vx.x.x.js",
    "content": "// flow-typed signature: 5ea03c16184806e3c98b03eed7c47337\n// flow-typed version: <<STUB>>/cross-spawn_v^5.1.0/flow_v0.87.0\n\n/**\n * This is an autogenerated libdef stub for:\n *\n *   'cross-spawn'\n *\n * Fill this stub out by replacing all the `any` types.\n *\n * Once filled out, we encourage you to share your work with the\n * community by sending a pull request to:\n * https://github.com/flowtype/flow-typed\n */\n\ndeclare module \"cross-spawn\" {\n  declare module.exports: any;\n}\n\n/**\n * We include stubs for each file inside this npm package in case you need to\n * require those files directly. Feel free to delete any files that aren't\n * needed.\n */\ndeclare module \"cross-spawn/lib/enoent\" {\n  declare module.exports: any;\n}\n\ndeclare module \"cross-spawn/lib/parse\" {\n  declare module.exports: any;\n}\n\ndeclare module \"cross-spawn/lib/util/escapeArgument\" {\n  declare module.exports: any;\n}\n\ndeclare module \"cross-spawn/lib/util/escapeCommand\" {\n  declare module.exports: any;\n}\n\ndeclare module \"cross-spawn/lib/util/hasEmptyArgumentBug\" {\n  declare module.exports: any;\n}\n\ndeclare module \"cross-spawn/lib/util/readShebang\" {\n  declare module.exports: any;\n}\n\ndeclare module \"cross-spawn/lib/util/resolveCommand\" {\n  declare module.exports: any;\n}\n\n// Filename aliases\ndeclare module \"cross-spawn/index\" {\n  declare module.exports: $Exports<\"cross-spawn\">;\n}\ndeclare module \"cross-spawn/index.js\" {\n  declare module.exports: $Exports<\"cross-spawn\">;\n}\ndeclare module \"cross-spawn/lib/enoent.js\" {\n  declare module.exports: $Exports<\"cross-spawn/lib/enoent\">;\n}\ndeclare module \"cross-spawn/lib/parse.js\" {\n  declare module.exports: $Exports<\"cross-spawn/lib/parse\">;\n}\ndeclare module \"cross-spawn/lib/util/escapeArgument.js\" {\n  declare module.exports: $Exports<\"cross-spawn/lib/util/escapeArgument\">;\n}\ndeclare module \"cross-spawn/lib/util/escapeCommand.js\" {\n  declare module.exports: $Exports<\"cross-spawn/lib/util/escapeCommand\">;\n}\ndeclare module \"cross-spawn/lib/util/hasEmptyArgumentBug.js\" {\n  declare module.exports: $Exports<\"cross-spawn/lib/util/hasEmptyArgumentBug\">;\n}\ndeclare module \"cross-spawn/lib/util/readShebang.js\" {\n  declare module.exports: $Exports<\"cross-spawn/lib/util/readShebang\">;\n}\ndeclare module \"cross-spawn/lib/util/resolveCommand.js\" {\n  declare module.exports: $Exports<\"cross-spawn/lib/util/resolveCommand\">;\n}\n"
  },
  {
    "path": "flow-typed/npm/debug_v2.x.x.js",
    "content": "// flow-typed signature: c7b1e1d8d9c2230d131299ddc21dcb0e\n// flow-typed version: da30fe6876/debug_v2.x.x/flow_>=v0.28.x\n\ndeclare module \"debug\" {\n  declare type Debugger = {\n    (...args: Array<mixed>): void,\n    (formatter: string, ...args: Array<mixed>): void,\n    (err: Error, ...args: Array<mixed>): void,\n    enabled: boolean,\n    log: () => {},\n    namespace: string,\n  };\n\n  declare module.exports: (namespace: string) => Debugger;\n\n  declare var names: Array<string>;\n  declare var skips: Array<string>;\n  declare var colors: Array<number>;\n\n  declare function disable(): void;\n  declare function enable(namespaces: string): void;\n  declare function enabled(name: string): boolean;\n  declare function humanize(): void;\n  declare function useColors(): boolean;\n  declare function log(): void;\n\n  declare var formatters: {\n    [formatter: string]: () => {},\n  };\n}\n"
  },
  {
    "path": "flow-typed/npm/deep-assign_vx.x.x.js",
    "content": "// flow-typed signature: 56848df4dc23d9f45badc6098dd064d6\n// flow-typed version: <<STUB>>/deep-assign_v2/flow_v0.68.0\n\n/**\n * This is an autogenerated libdef stub for:\n *\n *   'deep-assign'\n *\n * Fill this stub out by replacing all the `any` types.\n *\n * Once filled out, we encourage you to share your work with the\n * community by sending a pull request to:\n * https://github.com/flowtype/flow-typed\n */\n\ndeclare module \"deep-assign\" {\n  declare module.exports: any;\n}\n\n/**\n * We include stubs for each file inside this npm package in case you need to\n * require those files directly. Feel free to delete any files that aren't\n * needed.\n */\n\n// Filename aliases\ndeclare module \"deep-assign/index\" {\n  declare module.exports: $Exports<\"deep-assign\">;\n}\ndeclare module \"deep-assign/index.js\" {\n  declare module.exports: $Exports<\"deep-assign\">;\n}\n"
  },
  {
    "path": "flow-typed/npm/deepmerge_v1.x.x.js",
    "content": "// flow-typed signature: 53efc5e11191657e0f219f18bbef00b0\n// flow-typed version: 498f273a60/deepmerge_v1.x.x/flow_>=v0.25.x\n\ntype DeepMergeOptionsType = {\n  arrayMerge?: (\n    dest: Array<*>,\n    source: Array<*>,\n    options?: DeepMergeOptionsType,\n  ) => Array<*>,\n  clone?: boolean,\n};\n\ntype DeepMergeObjects = {\n  (a: Object, b: Object, options?: DeepMergeOptionsType): Object,\n  all: (objects: Array<Object>, options?: DeepMergeOptionsType) => Object,\n};\n\ntype DeepMergeArrays = {\n  (a: Array<*>, b: Array<*>, options?: DeepMergeOptionsType): Array<*>,\n  all: (objects: Array<Array<*>>, options?: DeepMergeOptionsType) => Array<*>,\n};\n\ndeclare module \"deepmerge\" {\n  declare module.exports: DeepMergeObjects & DeepMergeArrays;\n}\n"
  },
  {
    "path": "flow-typed/npm/dotenv-expand_vx.x.x.js",
    "content": "// flow-typed signature: cd4c691226d8e9c1a0f86fb74504ac5f\n// flow-typed version: <<STUB>>/dotenv-expand_v4/flow_v0.68.0\n\n/**\n * This is an autogenerated libdef stub for:\n *\n *   'dotenv-expand'\n *\n * Fill this stub out by replacing all the `any` types.\n *\n * Once filled out, we encourage you to share your work with the\n * community by sending a pull request to:\n * https://github.com/flowtype/flow-typed\n */\n\ndeclare module \"dotenv-expand\" {\n  declare module.exports: any;\n}\n\n/**\n * We include stubs for each file inside this npm package in case you need to\n * require those files directly. Feel free to delete any files that aren't\n * needed.\n */\ndeclare module \"dotenv-expand/lib/main\" {\n  declare module.exports: any;\n}\n\n// Filename aliases\ndeclare module \"dotenv-expand/lib/main.js\" {\n  declare module.exports: $Exports<\"dotenv-expand/lib/main\">;\n}\n"
  },
  {
    "path": "flow-typed/npm/dotenv_vx.x.x.js",
    "content": "// flow-typed signature: f8fcb1a175e52bcb883a8110dd6de9fd\n// flow-typed version: <<STUB>>/dotenv_v5/flow_v0.68.0\n\n/**\n * This is an autogenerated libdef stub for:\n *\n *   'dotenv'\n *\n * Fill this stub out by replacing all the `any` types.\n *\n * Once filled out, we encourage you to share your work with the\n * community by sending a pull request to:\n * https://github.com/flowtype/flow-typed\n */\n\ndeclare module \"dotenv\" {\n  declare module.exports: any;\n}\n\n/**\n * We include stubs for each file inside this npm package in case you need to\n * require those files directly. Feel free to delete any files that aren't\n * needed.\n */\ndeclare module \"dotenv/config\" {\n  declare module.exports: any;\n}\n\ndeclare module \"dotenv/lib/main\" {\n  declare module.exports: any;\n}\n\n// Filename aliases\ndeclare module \"dotenv/config.js\" {\n  declare module.exports: $Exports<\"dotenv/config\">;\n}\ndeclare module \"dotenv/lib/main.js\" {\n  declare module.exports: $Exports<\"dotenv/lib/main\">;\n}\n"
  },
  {
    "path": "flow-typed/npm/emotion-server_vx.x.x.js",
    "content": "// flow-typed signature: a781c6219ddaa0af4db7a583c351bacc\n// flow-typed version: <<STUB>>/emotion-server_v8/flow_v0.68.0\n\n/**\n * This is an autogenerated libdef stub for:\n *\n *   'emotion-server'\n *\n * Fill this stub out by replacing all the `any` types.\n *\n * Once filled out, we encourage you to share your work with the\n * community by sending a pull request to:\n * https://github.com/flowtype/flow-typed\n */\n\ndeclare module \"emotion-server\" {\n  declare module.exports: any;\n}\n\n/**\n * We include stubs for each file inside this npm package in case you need to\n * require those files directly. Feel free to delete any files that aren't\n * needed.\n */\ndeclare module \"emotion-server/lib/index\" {\n  declare module.exports: any;\n}\n\ndeclare module \"emotion-server/src/index\" {\n  declare module.exports: any;\n}\n\n// Filename aliases\ndeclare module \"emotion-server/lib/index.js\" {\n  declare module.exports: $Exports<\"emotion-server/lib/index\">;\n}\ndeclare module \"emotion-server/src/index.js\" {\n  declare module.exports: $Exports<\"emotion-server/src/index\">;\n}\n"
  },
  {
    "path": "flow-typed/npm/emotion_vx.x.x.js",
    "content": "// flow-typed signature: e4c6a1c8759d02fd57241bf07b66babe\n// flow-typed version: <<STUB>>/emotion_v8/flow_v0.68.0\n\n/**\n * This is an autogenerated libdef stub for:\n *\n *   'emotion'\n *\n * Fill this stub out by replacing all the `any` types.\n *\n * Once filled out, we encourage you to share your work with the\n * community by sending a pull request to:\n * https://github.com/flowtype/flow-typed\n */\n\ndeclare module \"emotion\" {\n  declare module.exports: any;\n}\n\n/**\n * We include stubs for each file inside this npm package in case you need to\n * require those files directly. Feel free to delete any files that aren't\n * needed.\n */\ndeclare module \"emotion/dist/DO-NOT-USE.min\" {\n  declare module.exports: any;\n}\n\ndeclare module \"emotion/dist/index.cjs\" {\n  declare module.exports: any;\n}\n\ndeclare module \"emotion/dist/index.es\" {\n  declare module.exports: any;\n}\n\ndeclare module \"emotion/macro\" {\n  declare module.exports: any;\n}\n\ndeclare module \"emotion/src/index\" {\n  declare module.exports: any;\n}\n\ndeclare module \"emotion/src/sheet\" {\n  declare module.exports: any;\n}\n\n// Filename aliases\ndeclare module \"emotion/dist/DO-NOT-USE.min.js\" {\n  declare module.exports: $Exports<\"emotion/dist/DO-NOT-USE.min\">;\n}\ndeclare module \"emotion/dist/index.cjs.js\" {\n  declare module.exports: $Exports<\"emotion/dist/index.cjs\">;\n}\ndeclare module \"emotion/dist/index.es.js\" {\n  declare module.exports: $Exports<\"emotion/dist/index.es\">;\n}\ndeclare module \"emotion/macro.js\" {\n  declare module.exports: $Exports<\"emotion/macro\">;\n}\ndeclare module \"emotion/src/index.js\" {\n  declare module.exports: $Exports<\"emotion/src/index\">;\n}\ndeclare module \"emotion/src/sheet.js\" {\n  declare module.exports: $Exports<\"emotion/src/sheet\">;\n}\n"
  },
  {
    "path": "flow-typed/npm/eslint-config-i-am-meticulous_vx.x.x.js",
    "content": "// flow-typed signature: f1015b4058088a70464b6abe8b2ab82c\n// flow-typed version: <<STUB>>/eslint-config-i-am-meticulous_v^11.0.0/flow_v0.87.0\n\n/**\n * This is an autogenerated libdef stub for:\n *\n *   'eslint-config-i-am-meticulous'\n *\n * Fill this stub out by replacing all the `any` types.\n *\n * Once filled out, we encourage you to share your work with the\n * community by sending a pull request to:\n * https://github.com/flowtype/flow-typed\n */\n\ndeclare module \"eslint-config-i-am-meticulous\" {\n  declare module.exports: any;\n}\n\n/**\n * We include stubs for each file inside this npm package in case you need to\n * require those files directly. Feel free to delete any files that aren't\n * needed.\n */\ndeclare module \"eslint-config-i-am-meticulous/_flow-globals\" {\n  declare module.exports: any;\n}\n\ndeclare module \"eslint-config-i-am-meticulous/ava\" {\n  declare module.exports: any;\n}\n\ndeclare module \"eslint-config-i-am-meticulous/es5\" {\n  declare module.exports: any;\n}\n\ndeclare module \"eslint-config-i-am-meticulous/flow\" {\n  declare module.exports: any;\n}\n\ndeclare module \"eslint-config-i-am-meticulous/react-flow\" {\n  declare module.exports: any;\n}\n\ndeclare module \"eslint-config-i-am-meticulous/react-native\" {\n  declare module.exports: any;\n}\n\ndeclare module \"eslint-config-i-am-meticulous/react\" {\n  declare module.exports: any;\n}\n\n// Filename aliases\ndeclare module \"eslint-config-i-am-meticulous/_flow-globals.js\" {\n  declare module.exports: $Exports<\n    \"eslint-config-i-am-meticulous/_flow-globals\",\n  >;\n}\ndeclare module \"eslint-config-i-am-meticulous/ava.js\" {\n  declare module.exports: $Exports<\"eslint-config-i-am-meticulous/ava\">;\n}\ndeclare module \"eslint-config-i-am-meticulous/es5.js\" {\n  declare module.exports: $Exports<\"eslint-config-i-am-meticulous/es5\">;\n}\ndeclare module \"eslint-config-i-am-meticulous/flow.js\" {\n  declare module.exports: $Exports<\"eslint-config-i-am-meticulous/flow\">;\n}\ndeclare module \"eslint-config-i-am-meticulous/index\" {\n  declare module.exports: $Exports<\"eslint-config-i-am-meticulous\">;\n}\ndeclare module \"eslint-config-i-am-meticulous/index.js\" {\n  declare module.exports: $Exports<\"eslint-config-i-am-meticulous\">;\n}\ndeclare module \"eslint-config-i-am-meticulous/react-flow.js\" {\n  declare module.exports: $Exports<\"eslint-config-i-am-meticulous/react-flow\">;\n}\ndeclare module \"eslint-config-i-am-meticulous/react-native.js\" {\n  declare module.exports: $Exports<\n    \"eslint-config-i-am-meticulous/react-native\",\n  >;\n}\ndeclare module \"eslint-config-i-am-meticulous/react.js\" {\n  declare module.exports: $Exports<\"eslint-config-i-am-meticulous/react\">;\n}\n"
  },
  {
    "path": "flow-typed/npm/eslint-import-resolver-webpack_vx.x.x.js",
    "content": "// flow-typed signature: 8ec014d2b5af0269c2437feb86644db4\n// flow-typed version: <<STUB>>/eslint-import-resolver-webpack_v^0.10.0/flow_v0.87.0\n\n/**\n * This is an autogenerated libdef stub for:\n *\n *   'eslint-import-resolver-webpack'\n *\n * Fill this stub out by replacing all the `any` types.\n *\n * Once filled out, we encourage you to share your work with the\n * community by sending a pull request to:\n * https://github.com/flowtype/flow-typed\n */\n\ndeclare module \"eslint-import-resolver-webpack\" {\n  declare module.exports: any;\n}\n\n/**\n * We include stubs for each file inside this npm package in case you need to\n * require those files directly. Feel free to delete any files that aren't\n * needed.\n */\ndeclare module \"eslint-import-resolver-webpack/config\" {\n  declare module.exports: any;\n}\n\n// Filename aliases\ndeclare module \"eslint-import-resolver-webpack/config.js\" {\n  declare module.exports: $Exports<\"eslint-import-resolver-webpack/config\">;\n}\ndeclare module \"eslint-import-resolver-webpack/index\" {\n  declare module.exports: $Exports<\"eslint-import-resolver-webpack\">;\n}\ndeclare module \"eslint-import-resolver-webpack/index.js\" {\n  declare module.exports: $Exports<\"eslint-import-resolver-webpack\">;\n}\n"
  },
  {
    "path": "flow-typed/npm/eslint-plugin-flowtype_vx.x.x.js",
    "content": "// flow-typed signature: 597292a8691e14e15770175229d1cbfa\n// flow-typed version: <<STUB>>/eslint-plugin-flowtype_v^3.0.0/flow_v0.87.0\n\n/**\n * This is an autogenerated libdef stub for:\n *\n *   'eslint-plugin-flowtype'\n *\n * Fill this stub out by replacing all the `any` types.\n *\n * Once filled out, we encourage you to share your work with the\n * community by sending a pull request to:\n * https://github.com/flowtype/flow-typed\n */\n\ndeclare module \"eslint-plugin-flowtype\" {\n  declare module.exports: any;\n}\n\n/**\n * We include stubs for each file inside this npm package in case you need to\n * require those files directly. Feel free to delete any files that aren't\n * needed.\n */\ndeclare module \"eslint-plugin-flowtype/bin/readmeAssertions\" {\n  declare module.exports: any;\n}\n\ndeclare module \"eslint-plugin-flowtype/dist/index\" {\n  declare module.exports: any;\n}\n\ndeclare module \"eslint-plugin-flowtype/dist/rules/arrayStyle/index\" {\n  declare module.exports: any;\n}\n\ndeclare module \"eslint-plugin-flowtype/dist/rules/arrayStyle/isSimpleType\" {\n  declare module.exports: any;\n}\n\ndeclare module \"eslint-plugin-flowtype/dist/rules/arrayStyle/needWrap\" {\n  declare module.exports: any;\n}\n\ndeclare module \"eslint-plugin-flowtype/dist/rules/arrayStyleComplexType\" {\n  declare module.exports: any;\n}\n\ndeclare module \"eslint-plugin-flowtype/dist/rules/arrayStyleSimpleType\" {\n  declare module.exports: any;\n}\n\ndeclare module \"eslint-plugin-flowtype/dist/rules/booleanStyle\" {\n  declare module.exports: any;\n}\n\ndeclare module \"eslint-plugin-flowtype/dist/rules/defineFlowType\" {\n  declare module.exports: any;\n}\n\ndeclare module \"eslint-plugin-flowtype/dist/rules/delimiterDangle\" {\n  declare module.exports: any;\n}\n\ndeclare module \"eslint-plugin-flowtype/dist/rules/genericSpacing\" {\n  declare module.exports: any;\n}\n\ndeclare module \"eslint-plugin-flowtype/dist/rules/newlineAfterFlowAnnotation\" {\n  declare module.exports: any;\n}\n\ndeclare module \"eslint-plugin-flowtype/dist/rules/noDupeKeys\" {\n  declare module.exports: any;\n}\n\ndeclare module \"eslint-plugin-flowtype/dist/rules/noExistentialType\" {\n  declare module.exports: any;\n}\n\ndeclare module \"eslint-plugin-flowtype/dist/rules/noFlowFixMeComments\" {\n  declare module.exports: any;\n}\n\ndeclare module \"eslint-plugin-flowtype/dist/rules/noMutableArray\" {\n  declare module.exports: any;\n}\n\ndeclare module \"eslint-plugin-flowtype/dist/rules/noPrimitiveConstructorTypes\" {\n  declare module.exports: any;\n}\n\ndeclare module \"eslint-plugin-flowtype/dist/rules/noTypesMissingFileAnnotation\" {\n  declare module.exports: any;\n}\n\ndeclare module \"eslint-plugin-flowtype/dist/rules/noUnusedExpressions\" {\n  declare module.exports: any;\n}\n\ndeclare module \"eslint-plugin-flowtype/dist/rules/noWeakTypes\" {\n  declare module.exports: any;\n}\n\ndeclare module \"eslint-plugin-flowtype/dist/rules/objectTypeDelimiter\" {\n  declare module.exports: any;\n}\n\ndeclare module \"eslint-plugin-flowtype/dist/rules/requireExactType\" {\n  declare module.exports: any;\n}\n\ndeclare module \"eslint-plugin-flowtype/dist/rules/requireParameterType\" {\n  declare module.exports: any;\n}\n\ndeclare module \"eslint-plugin-flowtype/dist/rules/requireReturnType\" {\n  declare module.exports: any;\n}\n\ndeclare module \"eslint-plugin-flowtype/dist/rules/requireTypesAtTop\" {\n  declare module.exports: any;\n}\n\ndeclare module \"eslint-plugin-flowtype/dist/rules/requireValidFileAnnotation\" {\n  declare module.exports: any;\n}\n\ndeclare module \"eslint-plugin-flowtype/dist/rules/requireVariableType\" {\n  declare module.exports: any;\n}\n\ndeclare module \"eslint-plugin-flowtype/dist/rules/semi\" {\n  declare module.exports: any;\n}\n\ndeclare module \"eslint-plugin-flowtype/dist/rules/sortKeys\" {\n  declare module.exports: any;\n}\n\ndeclare module \"eslint-plugin-flowtype/dist/rules/spaceAfterTypeColon\" {\n  declare module.exports: any;\n}\n\ndeclare module \"eslint-plugin-flowtype/dist/rules/spaceBeforeGenericBracket\" {\n  declare module.exports: any;\n}\n\ndeclare module \"eslint-plugin-flowtype/dist/rules/spaceBeforeTypeColon\" {\n  declare module.exports: any;\n}\n\ndeclare module \"eslint-plugin-flowtype/dist/rules/typeColonSpacing/evaluateFunctions\" {\n  declare module.exports: any;\n}\n\ndeclare module \"eslint-plugin-flowtype/dist/rules/typeColonSpacing/evaluateObjectTypeIndexer\" {\n  declare module.exports: any;\n}\n\ndeclare module \"eslint-plugin-flowtype/dist/rules/typeColonSpacing/evaluateObjectTypeProperty\" {\n  declare module.exports: any;\n}\n\ndeclare module \"eslint-plugin-flowtype/dist/rules/typeColonSpacing/evaluateReturnType\" {\n  declare module.exports: any;\n}\n\ndeclare module \"eslint-plugin-flowtype/dist/rules/typeColonSpacing/evaluateTypeCastExpression\" {\n  declare module.exports: any;\n}\n\ndeclare module \"eslint-plugin-flowtype/dist/rules/typeColonSpacing/evaluateTypical\" {\n  declare module.exports: any;\n}\n\ndeclare module \"eslint-plugin-flowtype/dist/rules/typeColonSpacing/evaluateVariables\" {\n  declare module.exports: any;\n}\n\ndeclare module \"eslint-plugin-flowtype/dist/rules/typeColonSpacing/index\" {\n  declare module.exports: any;\n}\n\ndeclare module \"eslint-plugin-flowtype/dist/rules/typeColonSpacing/reporter\" {\n  declare module.exports: any;\n}\n\ndeclare module \"eslint-plugin-flowtype/dist/rules/typeIdMatch\" {\n  declare module.exports: any;\n}\n\ndeclare module \"eslint-plugin-flowtype/dist/rules/typeImportStyle\" {\n  declare module.exports: any;\n}\n\ndeclare module \"eslint-plugin-flowtype/dist/rules/unionIntersectionSpacing\" {\n  declare module.exports: any;\n}\n\ndeclare module \"eslint-plugin-flowtype/dist/rules/useFlowType\" {\n  declare module.exports: any;\n}\n\ndeclare module \"eslint-plugin-flowtype/dist/rules/validSyntax\" {\n  declare module.exports: any;\n}\n\ndeclare module \"eslint-plugin-flowtype/dist/utilities/checkFlowFileAnnotation\" {\n  declare module.exports: any;\n}\n\ndeclare module \"eslint-plugin-flowtype/dist/utilities/fuzzyStringMatch\" {\n  declare module.exports: any;\n}\n\ndeclare module \"eslint-plugin-flowtype/dist/utilities/getParameterName\" {\n  declare module.exports: any;\n}\n\ndeclare module \"eslint-plugin-flowtype/dist/utilities/getTokenAfterParens\" {\n  declare module.exports: any;\n}\n\ndeclare module \"eslint-plugin-flowtype/dist/utilities/getTokenBeforeParens\" {\n  declare module.exports: any;\n}\n\ndeclare module \"eslint-plugin-flowtype/dist/utilities/index\" {\n  declare module.exports: any;\n}\n\ndeclare module \"eslint-plugin-flowtype/dist/utilities/isFlowFile\" {\n  declare module.exports: any;\n}\n\ndeclare module \"eslint-plugin-flowtype/dist/utilities/isFlowFileAnnotation\" {\n  declare module.exports: any;\n}\n\ndeclare module \"eslint-plugin-flowtype/dist/utilities/iterateFunctionNodes\" {\n  declare module.exports: any;\n}\n\ndeclare module \"eslint-plugin-flowtype/dist/utilities/quoteName\" {\n  declare module.exports: any;\n}\n\ndeclare module \"eslint-plugin-flowtype/dist/utilities/spacingFixers\" {\n  declare module.exports: any;\n}\n\n// Filename aliases\ndeclare module \"eslint-plugin-flowtype/bin/readmeAssertions.js\" {\n  declare module.exports: $Exports<\n    \"eslint-plugin-flowtype/bin/readmeAssertions\",\n  >;\n}\ndeclare module \"eslint-plugin-flowtype/dist/index.js\" {\n  declare module.exports: $Exports<\"eslint-plugin-flowtype/dist/index\">;\n}\ndeclare module \"eslint-plugin-flowtype/dist/rules/arrayStyle/index.js\" {\n  declare module.exports: $Exports<\n    \"eslint-plugin-flowtype/dist/rules/arrayStyle/index\",\n  >;\n}\ndeclare module \"eslint-plugin-flowtype/dist/rules/arrayStyle/isSimpleType.js\" {\n  declare module.exports: $Exports<\n    \"eslint-plugin-flowtype/dist/rules/arrayStyle/isSimpleType\",\n  >;\n}\ndeclare module \"eslint-plugin-flowtype/dist/rules/arrayStyle/needWrap.js\" {\n  declare module.exports: $Exports<\n    \"eslint-plugin-flowtype/dist/rules/arrayStyle/needWrap\",\n  >;\n}\ndeclare module \"eslint-plugin-flowtype/dist/rules/arrayStyleComplexType.js\" {\n  declare module.exports: $Exports<\n    \"eslint-plugin-flowtype/dist/rules/arrayStyleComplexType\",\n  >;\n}\ndeclare module \"eslint-plugin-flowtype/dist/rules/arrayStyleSimpleType.js\" {\n  declare module.exports: $Exports<\n    \"eslint-plugin-flowtype/dist/rules/arrayStyleSimpleType\",\n  >;\n}\ndeclare module \"eslint-plugin-flowtype/dist/rules/booleanStyle.js\" {\n  declare module.exports: $Exports<\n    \"eslint-plugin-flowtype/dist/rules/booleanStyle\",\n  >;\n}\ndeclare module \"eslint-plugin-flowtype/dist/rules/defineFlowType.js\" {\n  declare module.exports: $Exports<\n    \"eslint-plugin-flowtype/dist/rules/defineFlowType\",\n  >;\n}\ndeclare module \"eslint-plugin-flowtype/dist/rules/delimiterDangle.js\" {\n  declare module.exports: $Exports<\n    \"eslint-plugin-flowtype/dist/rules/delimiterDangle\",\n  >;\n}\ndeclare module \"eslint-plugin-flowtype/dist/rules/genericSpacing.js\" {\n  declare module.exports: $Exports<\n    \"eslint-plugin-flowtype/dist/rules/genericSpacing\",\n  >;\n}\ndeclare module \"eslint-plugin-flowtype/dist/rules/newlineAfterFlowAnnotation.js\" {\n  declare module.exports: $Exports<\n    \"eslint-plugin-flowtype/dist/rules/newlineAfterFlowAnnotation\",\n  >;\n}\ndeclare module \"eslint-plugin-flowtype/dist/rules/noDupeKeys.js\" {\n  declare module.exports: $Exports<\n    \"eslint-plugin-flowtype/dist/rules/noDupeKeys\",\n  >;\n}\ndeclare module \"eslint-plugin-flowtype/dist/rules/noExistentialType.js\" {\n  declare module.exports: $Exports<\n    \"eslint-plugin-flowtype/dist/rules/noExistentialType\",\n  >;\n}\ndeclare module \"eslint-plugin-flowtype/dist/rules/noFlowFixMeComments.js\" {\n  declare module.exports: $Exports<\n    \"eslint-plugin-flowtype/dist/rules/noFlowFixMeComments\",\n  >;\n}\ndeclare module \"eslint-plugin-flowtype/dist/rules/noMutableArray.js\" {\n  declare module.exports: $Exports<\n    \"eslint-plugin-flowtype/dist/rules/noMutableArray\",\n  >;\n}\ndeclare module \"eslint-plugin-flowtype/dist/rules/noPrimitiveConstructorTypes.js\" {\n  declare module.exports: $Exports<\n    \"eslint-plugin-flowtype/dist/rules/noPrimitiveConstructorTypes\",\n  >;\n}\ndeclare module \"eslint-plugin-flowtype/dist/rules/noTypesMissingFileAnnotation.js\" {\n  declare module.exports: $Exports<\n    \"eslint-plugin-flowtype/dist/rules/noTypesMissingFileAnnotation\",\n  >;\n}\ndeclare module \"eslint-plugin-flowtype/dist/rules/noUnusedExpressions.js\" {\n  declare module.exports: $Exports<\n    \"eslint-plugin-flowtype/dist/rules/noUnusedExpressions\",\n  >;\n}\ndeclare module \"eslint-plugin-flowtype/dist/rules/noWeakTypes.js\" {\n  declare module.exports: $Exports<\n    \"eslint-plugin-flowtype/dist/rules/noWeakTypes\",\n  >;\n}\ndeclare module \"eslint-plugin-flowtype/dist/rules/objectTypeDelimiter.js\" {\n  declare module.exports: $Exports<\n    \"eslint-plugin-flowtype/dist/rules/objectTypeDelimiter\",\n  >;\n}\ndeclare module \"eslint-plugin-flowtype/dist/rules/requireExactType.js\" {\n  declare module.exports: $Exports<\n    \"eslint-plugin-flowtype/dist/rules/requireExactType\",\n  >;\n}\ndeclare module \"eslint-plugin-flowtype/dist/rules/requireParameterType.js\" {\n  declare module.exports: $Exports<\n    \"eslint-plugin-flowtype/dist/rules/requireParameterType\",\n  >;\n}\ndeclare module \"eslint-plugin-flowtype/dist/rules/requireReturnType.js\" {\n  declare module.exports: $Exports<\n    \"eslint-plugin-flowtype/dist/rules/requireReturnType\",\n  >;\n}\ndeclare module \"eslint-plugin-flowtype/dist/rules/requireTypesAtTop.js\" {\n  declare module.exports: $Exports<\n    \"eslint-plugin-flowtype/dist/rules/requireTypesAtTop\",\n  >;\n}\ndeclare module \"eslint-plugin-flowtype/dist/rules/requireValidFileAnnotation.js\" {\n  declare module.exports: $Exports<\n    \"eslint-plugin-flowtype/dist/rules/requireValidFileAnnotation\",\n  >;\n}\ndeclare module \"eslint-plugin-flowtype/dist/rules/requireVariableType.js\" {\n  declare module.exports: $Exports<\n    \"eslint-plugin-flowtype/dist/rules/requireVariableType\",\n  >;\n}\ndeclare module \"eslint-plugin-flowtype/dist/rules/semi.js\" {\n  declare module.exports: $Exports<\"eslint-plugin-flowtype/dist/rules/semi\">;\n}\ndeclare module \"eslint-plugin-flowtype/dist/rules/sortKeys.js\" {\n  declare module.exports: $Exports<\n    \"eslint-plugin-flowtype/dist/rules/sortKeys\",\n  >;\n}\ndeclare module \"eslint-plugin-flowtype/dist/rules/spaceAfterTypeColon.js\" {\n  declare module.exports: $Exports<\n    \"eslint-plugin-flowtype/dist/rules/spaceAfterTypeColon\",\n  >;\n}\ndeclare module \"eslint-plugin-flowtype/dist/rules/spaceBeforeGenericBracket.js\" {\n  declare module.exports: $Exports<\n    \"eslint-plugin-flowtype/dist/rules/spaceBeforeGenericBracket\",\n  >;\n}\ndeclare module \"eslint-plugin-flowtype/dist/rules/spaceBeforeTypeColon.js\" {\n  declare module.exports: $Exports<\n    \"eslint-plugin-flowtype/dist/rules/spaceBeforeTypeColon\",\n  >;\n}\ndeclare module \"eslint-plugin-flowtype/dist/rules/typeColonSpacing/evaluateFunctions.js\" {\n  declare module.exports: $Exports<\n    \"eslint-plugin-flowtype/dist/rules/typeColonSpacing/evaluateFunctions\",\n  >;\n}\ndeclare module \"eslint-plugin-flowtype/dist/rules/typeColonSpacing/evaluateObjectTypeIndexer.js\" {\n  declare module.exports: $Exports<\n    \"eslint-plugin-flowtype/dist/rules/typeColonSpacing/evaluateObjectTypeIndexer\",\n  >;\n}\ndeclare module \"eslint-plugin-flowtype/dist/rules/typeColonSpacing/evaluateObjectTypeProperty.js\" {\n  declare module.exports: $Exports<\n    \"eslint-plugin-flowtype/dist/rules/typeColonSpacing/evaluateObjectTypeProperty\",\n  >;\n}\ndeclare module \"eslint-plugin-flowtype/dist/rules/typeColonSpacing/evaluateReturnType.js\" {\n  declare module.exports: $Exports<\n    \"eslint-plugin-flowtype/dist/rules/typeColonSpacing/evaluateReturnType\",\n  >;\n}\ndeclare module \"eslint-plugin-flowtype/dist/rules/typeColonSpacing/evaluateTypeCastExpression.js\" {\n  declare module.exports: $Exports<\n    \"eslint-plugin-flowtype/dist/rules/typeColonSpacing/evaluateTypeCastExpression\",\n  >;\n}\ndeclare module \"eslint-plugin-flowtype/dist/rules/typeColonSpacing/evaluateTypical.js\" {\n  declare module.exports: $Exports<\n    \"eslint-plugin-flowtype/dist/rules/typeColonSpacing/evaluateTypical\",\n  >;\n}\ndeclare module \"eslint-plugin-flowtype/dist/rules/typeColonSpacing/evaluateVariables.js\" {\n  declare module.exports: $Exports<\n    \"eslint-plugin-flowtype/dist/rules/typeColonSpacing/evaluateVariables\",\n  >;\n}\ndeclare module \"eslint-plugin-flowtype/dist/rules/typeColonSpacing/index.js\" {\n  declare module.exports: $Exports<\n    \"eslint-plugin-flowtype/dist/rules/typeColonSpacing/index\",\n  >;\n}\ndeclare module \"eslint-plugin-flowtype/dist/rules/typeColonSpacing/reporter.js\" {\n  declare module.exports: $Exports<\n    \"eslint-plugin-flowtype/dist/rules/typeColonSpacing/reporter\",\n  >;\n}\ndeclare module \"eslint-plugin-flowtype/dist/rules/typeIdMatch.js\" {\n  declare module.exports: $Exports<\n    \"eslint-plugin-flowtype/dist/rules/typeIdMatch\",\n  >;\n}\ndeclare module \"eslint-plugin-flowtype/dist/rules/typeImportStyle.js\" {\n  declare module.exports: $Exports<\n    \"eslint-plugin-flowtype/dist/rules/typeImportStyle\",\n  >;\n}\ndeclare module \"eslint-plugin-flowtype/dist/rules/unionIntersectionSpacing.js\" {\n  declare module.exports: $Exports<\n    \"eslint-plugin-flowtype/dist/rules/unionIntersectionSpacing\",\n  >;\n}\ndeclare module \"eslint-plugin-flowtype/dist/rules/useFlowType.js\" {\n  declare module.exports: $Exports<\n    \"eslint-plugin-flowtype/dist/rules/useFlowType\",\n  >;\n}\ndeclare module \"eslint-plugin-flowtype/dist/rules/validSyntax.js\" {\n  declare module.exports: $Exports<\n    \"eslint-plugin-flowtype/dist/rules/validSyntax\",\n  >;\n}\ndeclare module \"eslint-plugin-flowtype/dist/utilities/checkFlowFileAnnotation.js\" {\n  declare module.exports: $Exports<\n    \"eslint-plugin-flowtype/dist/utilities/checkFlowFileAnnotation\",\n  >;\n}\ndeclare module \"eslint-plugin-flowtype/dist/utilities/fuzzyStringMatch.js\" {\n  declare module.exports: $Exports<\n    \"eslint-plugin-flowtype/dist/utilities/fuzzyStringMatch\",\n  >;\n}\ndeclare module \"eslint-plugin-flowtype/dist/utilities/getParameterName.js\" {\n  declare module.exports: $Exports<\n    \"eslint-plugin-flowtype/dist/utilities/getParameterName\",\n  >;\n}\ndeclare module \"eslint-plugin-flowtype/dist/utilities/getTokenAfterParens.js\" {\n  declare module.exports: $Exports<\n    \"eslint-plugin-flowtype/dist/utilities/getTokenAfterParens\",\n  >;\n}\ndeclare module \"eslint-plugin-flowtype/dist/utilities/getTokenBeforeParens.js\" {\n  declare module.exports: $Exports<\n    \"eslint-plugin-flowtype/dist/utilities/getTokenBeforeParens\",\n  >;\n}\ndeclare module \"eslint-plugin-flowtype/dist/utilities/index.js\" {\n  declare module.exports: $Exports<\n    \"eslint-plugin-flowtype/dist/utilities/index\",\n  >;\n}\ndeclare module \"eslint-plugin-flowtype/dist/utilities/isFlowFile.js\" {\n  declare module.exports: $Exports<\n    \"eslint-plugin-flowtype/dist/utilities/isFlowFile\",\n  >;\n}\ndeclare module \"eslint-plugin-flowtype/dist/utilities/isFlowFileAnnotation.js\" {\n  declare module.exports: $Exports<\n    \"eslint-plugin-flowtype/dist/utilities/isFlowFileAnnotation\",\n  >;\n}\ndeclare module \"eslint-plugin-flowtype/dist/utilities/iterateFunctionNodes.js\" {\n  declare module.exports: $Exports<\n    \"eslint-plugin-flowtype/dist/utilities/iterateFunctionNodes\",\n  >;\n}\ndeclare module \"eslint-plugin-flowtype/dist/utilities/quoteName.js\" {\n  declare module.exports: $Exports<\n    \"eslint-plugin-flowtype/dist/utilities/quoteName\",\n  >;\n}\ndeclare module \"eslint-plugin-flowtype/dist/utilities/spacingFixers.js\" {\n  declare module.exports: $Exports<\n    \"eslint-plugin-flowtype/dist/utilities/spacingFixers\",\n  >;\n}\n"
  },
  {
    "path": "flow-typed/npm/eslint-plugin-import_vx.x.x.js",
    "content": "// flow-typed signature: ccc7ba0bf95d87710a29359bda9e3043\n// flow-typed version: <<STUB>>/eslint-plugin-import_v^2.7.0/flow_v0.68.0\n\n/**\n * This is an autogenerated libdef stub for:\n *\n *   'eslint-plugin-import'\n *\n * Fill this stub out by replacing all the `any` types.\n *\n * Once filled out, we encourage you to share your work with the\n * community by sending a pull request to:\n * https://github.com/flowtype/flow-typed\n */\n\ndeclare module \"eslint-plugin-import\" {\n  declare module.exports: any;\n}\n\n/**\n * We include stubs for each file inside this npm package in case you need to\n * require those files directly. Feel free to delete any files that aren't\n * needed.\n */\ndeclare module \"eslint-plugin-import/config/electron\" {\n  declare module.exports: any;\n}\n\ndeclare module \"eslint-plugin-import/config/errors\" {\n  declare module.exports: any;\n}\n\ndeclare module \"eslint-plugin-import/config/react-native\" {\n  declare module.exports: any;\n}\n\ndeclare module \"eslint-plugin-import/config/react\" {\n  declare module.exports: any;\n}\n\ndeclare module \"eslint-plugin-import/config/recommended\" {\n  declare module.exports: any;\n}\n\ndeclare module \"eslint-plugin-import/config/stage-0\" {\n  declare module.exports: any;\n}\n\ndeclare module \"eslint-plugin-import/config/warnings\" {\n  declare module.exports: any;\n}\n\ndeclare module \"eslint-plugin-import/lib/core/importType\" {\n  declare module.exports: any;\n}\n\ndeclare module \"eslint-plugin-import/lib/core/staticRequire\" {\n  declare module.exports: any;\n}\n\ndeclare module \"eslint-plugin-import/lib/ExportMap\" {\n  declare module.exports: any;\n}\n\ndeclare module \"eslint-plugin-import/lib/importDeclaration\" {\n  declare module.exports: any;\n}\n\ndeclare module \"eslint-plugin-import/lib/index\" {\n  declare module.exports: any;\n}\n\ndeclare module \"eslint-plugin-import/lib/rules/default\" {\n  declare module.exports: any;\n}\n\ndeclare module \"eslint-plugin-import/lib/rules/export\" {\n  declare module.exports: any;\n}\n\ndeclare module \"eslint-plugin-import/lib/rules/extensions\" {\n  declare module.exports: any;\n}\n\ndeclare module \"eslint-plugin-import/lib/rules/first\" {\n  declare module.exports: any;\n}\n\ndeclare module \"eslint-plugin-import/lib/rules/imports-first\" {\n  declare module.exports: any;\n}\n\ndeclare module \"eslint-plugin-import/lib/rules/max-dependencies\" {\n  declare module.exports: any;\n}\n\ndeclare module \"eslint-plugin-import/lib/rules/named\" {\n  declare module.exports: any;\n}\n\ndeclare module \"eslint-plugin-import/lib/rules/namespace\" {\n  declare module.exports: any;\n}\n\ndeclare module \"eslint-plugin-import/lib/rules/newline-after-import\" {\n  declare module.exports: any;\n}\n\ndeclare module \"eslint-plugin-import/lib/rules/no-absolute-path\" {\n  declare module.exports: any;\n}\n\ndeclare module \"eslint-plugin-import/lib/rules/no-amd\" {\n  declare module.exports: any;\n}\n\ndeclare module \"eslint-plugin-import/lib/rules/no-anonymous-default-export\" {\n  declare module.exports: any;\n}\n\ndeclare module \"eslint-plugin-import/lib/rules/no-commonjs\" {\n  declare module.exports: any;\n}\n\ndeclare module \"eslint-plugin-import/lib/rules/no-deprecated\" {\n  declare module.exports: any;\n}\n\ndeclare module \"eslint-plugin-import/lib/rules/no-duplicates\" {\n  declare module.exports: any;\n}\n\ndeclare module \"eslint-plugin-import/lib/rules/no-dynamic-require\" {\n  declare module.exports: any;\n}\n\ndeclare module \"eslint-plugin-import/lib/rules/no-extraneous-dependencies\" {\n  declare module.exports: any;\n}\n\ndeclare module \"eslint-plugin-import/lib/rules/no-internal-modules\" {\n  declare module.exports: any;\n}\n\ndeclare module \"eslint-plugin-import/lib/rules/no-mutable-exports\" {\n  declare module.exports: any;\n}\n\ndeclare module \"eslint-plugin-import/lib/rules/no-named-as-default-member\" {\n  declare module.exports: any;\n}\n\ndeclare module \"eslint-plugin-import/lib/rules/no-named-as-default\" {\n  declare module.exports: any;\n}\n\ndeclare module \"eslint-plugin-import/lib/rules/no-named-default\" {\n  declare module.exports: any;\n}\n\ndeclare module \"eslint-plugin-import/lib/rules/no-namespace\" {\n  declare module.exports: any;\n}\n\ndeclare module \"eslint-plugin-import/lib/rules/no-nodejs-modules\" {\n  declare module.exports: any;\n}\n\ndeclare module \"eslint-plugin-import/lib/rules/no-restricted-paths\" {\n  declare module.exports: any;\n}\n\ndeclare module \"eslint-plugin-import/lib/rules/no-unassigned-import\" {\n  declare module.exports: any;\n}\n\ndeclare module \"eslint-plugin-import/lib/rules/no-unresolved\" {\n  declare module.exports: any;\n}\n\ndeclare module \"eslint-plugin-import/lib/rules/no-webpack-loader-syntax\" {\n  declare module.exports: any;\n}\n\ndeclare module \"eslint-plugin-import/lib/rules/order\" {\n  declare module.exports: any;\n}\n\ndeclare module \"eslint-plugin-import/lib/rules/prefer-default-export\" {\n  declare module.exports: any;\n}\n\ndeclare module \"eslint-plugin-import/lib/rules/unambiguous\" {\n  declare module.exports: any;\n}\n\ndeclare module \"eslint-plugin-import/memo-parser/index\" {\n  declare module.exports: any;\n}\n\n// Filename aliases\ndeclare module \"eslint-plugin-import/config/electron.js\" {\n  declare module.exports: $Exports<\"eslint-plugin-import/config/electron\">;\n}\ndeclare module \"eslint-plugin-import/config/errors.js\" {\n  declare module.exports: $Exports<\"eslint-plugin-import/config/errors\">;\n}\ndeclare module \"eslint-plugin-import/config/react-native.js\" {\n  declare module.exports: $Exports<\"eslint-plugin-import/config/react-native\">;\n}\ndeclare module \"eslint-plugin-import/config/react.js\" {\n  declare module.exports: $Exports<\"eslint-plugin-import/config/react\">;\n}\ndeclare module \"eslint-plugin-import/config/recommended.js\" {\n  declare module.exports: $Exports<\"eslint-plugin-import/config/recommended\">;\n}\ndeclare module \"eslint-plugin-import/config/stage-0.js\" {\n  declare module.exports: $Exports<\"eslint-plugin-import/config/stage-0\">;\n}\ndeclare module \"eslint-plugin-import/config/warnings.js\" {\n  declare module.exports: $Exports<\"eslint-plugin-import/config/warnings\">;\n}\ndeclare module \"eslint-plugin-import/lib/core/importType.js\" {\n  declare module.exports: $Exports<\"eslint-plugin-import/lib/core/importType\">;\n}\ndeclare module \"eslint-plugin-import/lib/core/staticRequire.js\" {\n  declare module.exports: $Exports<\n    \"eslint-plugin-import/lib/core/staticRequire\",\n  >;\n}\ndeclare module \"eslint-plugin-import/lib/ExportMap.js\" {\n  declare module.exports: $Exports<\"eslint-plugin-import/lib/ExportMap\">;\n}\ndeclare module \"eslint-plugin-import/lib/importDeclaration.js\" {\n  declare module.exports: $Exports<\n    \"eslint-plugin-import/lib/importDeclaration\",\n  >;\n}\ndeclare module \"eslint-plugin-import/lib/index.js\" {\n  declare module.exports: $Exports<\"eslint-plugin-import/lib/index\">;\n}\ndeclare module \"eslint-plugin-import/lib/rules/default.js\" {\n  declare module.exports: $Exports<\"eslint-plugin-import/lib/rules/default\">;\n}\ndeclare module \"eslint-plugin-import/lib/rules/export.js\" {\n  declare module.exports: $Exports<\"eslint-plugin-import/lib/rules/export\">;\n}\ndeclare module \"eslint-plugin-import/lib/rules/extensions.js\" {\n  declare module.exports: $Exports<\"eslint-plugin-import/lib/rules/extensions\">;\n}\ndeclare module \"eslint-plugin-import/lib/rules/first.js\" {\n  declare module.exports: $Exports<\"eslint-plugin-import/lib/rules/first\">;\n}\ndeclare module \"eslint-plugin-import/lib/rules/imports-first.js\" {\n  declare module.exports: $Exports<\n    \"eslint-plugin-import/lib/rules/imports-first\",\n  >;\n}\ndeclare module \"eslint-plugin-import/lib/rules/max-dependencies.js\" {\n  declare module.exports: $Exports<\n    \"eslint-plugin-import/lib/rules/max-dependencies\",\n  >;\n}\ndeclare module \"eslint-plugin-import/lib/rules/named.js\" {\n  declare module.exports: $Exports<\"eslint-plugin-import/lib/rules/named\">;\n}\ndeclare module \"eslint-plugin-import/lib/rules/namespace.js\" {\n  declare module.exports: $Exports<\"eslint-plugin-import/lib/rules/namespace\">;\n}\ndeclare module \"eslint-plugin-import/lib/rules/newline-after-import.js\" {\n  declare module.exports: $Exports<\n    \"eslint-plugin-import/lib/rules/newline-after-import\",\n  >;\n}\ndeclare module \"eslint-plugin-import/lib/rules/no-absolute-path.js\" {\n  declare module.exports: $Exports<\n    \"eslint-plugin-import/lib/rules/no-absolute-path\",\n  >;\n}\ndeclare module \"eslint-plugin-import/lib/rules/no-amd.js\" {\n  declare module.exports: $Exports<\"eslint-plugin-import/lib/rules/no-amd\">;\n}\ndeclare module \"eslint-plugin-import/lib/rules/no-anonymous-default-export.js\" {\n  declare module.exports: $Exports<\n    \"eslint-plugin-import/lib/rules/no-anonymous-default-export\",\n  >;\n}\ndeclare module \"eslint-plugin-import/lib/rules/no-commonjs.js\" {\n  declare module.exports: $Exports<\n    \"eslint-plugin-import/lib/rules/no-commonjs\",\n  >;\n}\ndeclare module \"eslint-plugin-import/lib/rules/no-deprecated.js\" {\n  declare module.exports: $Exports<\n    \"eslint-plugin-import/lib/rules/no-deprecated\",\n  >;\n}\ndeclare module \"eslint-plugin-import/lib/rules/no-duplicates.js\" {\n  declare module.exports: $Exports<\n    \"eslint-plugin-import/lib/rules/no-duplicates\",\n  >;\n}\ndeclare module \"eslint-plugin-import/lib/rules/no-dynamic-require.js\" {\n  declare module.exports: $Exports<\n    \"eslint-plugin-import/lib/rules/no-dynamic-require\",\n  >;\n}\ndeclare module \"eslint-plugin-import/lib/rules/no-extraneous-dependencies.js\" {\n  declare module.exports: $Exports<\n    \"eslint-plugin-import/lib/rules/no-extraneous-dependencies\",\n  >;\n}\ndeclare module \"eslint-plugin-import/lib/rules/no-internal-modules.js\" {\n  declare module.exports: $Exports<\n    \"eslint-plugin-import/lib/rules/no-internal-modules\",\n  >;\n}\ndeclare module \"eslint-plugin-import/lib/rules/no-mutable-exports.js\" {\n  declare module.exports: $Exports<\n    \"eslint-plugin-import/lib/rules/no-mutable-exports\",\n  >;\n}\ndeclare module \"eslint-plugin-import/lib/rules/no-named-as-default-member.js\" {\n  declare module.exports: $Exports<\n    \"eslint-plugin-import/lib/rules/no-named-as-default-member\",\n  >;\n}\ndeclare module \"eslint-plugin-import/lib/rules/no-named-as-default.js\" {\n  declare module.exports: $Exports<\n    \"eslint-plugin-import/lib/rules/no-named-as-default\",\n  >;\n}\ndeclare module \"eslint-plugin-import/lib/rules/no-named-default.js\" {\n  declare module.exports: $Exports<\n    \"eslint-plugin-import/lib/rules/no-named-default\",\n  >;\n}\ndeclare module \"eslint-plugin-import/lib/rules/no-namespace.js\" {\n  declare module.exports: $Exports<\n    \"eslint-plugin-import/lib/rules/no-namespace\",\n  >;\n}\ndeclare module \"eslint-plugin-import/lib/rules/no-nodejs-modules.js\" {\n  declare module.exports: $Exports<\n    \"eslint-plugin-import/lib/rules/no-nodejs-modules\",\n  >;\n}\ndeclare module \"eslint-plugin-import/lib/rules/no-restricted-paths.js\" {\n  declare module.exports: $Exports<\n    \"eslint-plugin-import/lib/rules/no-restricted-paths\",\n  >;\n}\ndeclare module \"eslint-plugin-import/lib/rules/no-unassigned-import.js\" {\n  declare module.exports: $Exports<\n    \"eslint-plugin-import/lib/rules/no-unassigned-import\",\n  >;\n}\ndeclare module \"eslint-plugin-import/lib/rules/no-unresolved.js\" {\n  declare module.exports: $Exports<\n    \"eslint-plugin-import/lib/rules/no-unresolved\",\n  >;\n}\ndeclare module \"eslint-plugin-import/lib/rules/no-webpack-loader-syntax.js\" {\n  declare module.exports: $Exports<\n    \"eslint-plugin-import/lib/rules/no-webpack-loader-syntax\",\n  >;\n}\ndeclare module \"eslint-plugin-import/lib/rules/order.js\" {\n  declare module.exports: $Exports<\"eslint-plugin-import/lib/rules/order\">;\n}\ndeclare module \"eslint-plugin-import/lib/rules/prefer-default-export.js\" {\n  declare module.exports: $Exports<\n    \"eslint-plugin-import/lib/rules/prefer-default-export\",\n  >;\n}\ndeclare module \"eslint-plugin-import/lib/rules/unambiguous.js\" {\n  declare module.exports: $Exports<\n    \"eslint-plugin-import/lib/rules/unambiguous\",\n  >;\n}\ndeclare module \"eslint-plugin-import/memo-parser/index.js\" {\n  declare module.exports: $Exports<\"eslint-plugin-import/memo-parser/index\">;\n}\n"
  },
  {
    "path": "flow-typed/npm/eslint-plugin-react-native_vx.x.x.js",
    "content": "// flow-typed signature: 3616666ab5e73c1d0e5c267741973d59\n// flow-typed version: <<STUB>>/eslint-plugin-react-native_v^3.5.0/flow_v0.87.0\n\n/**\n * This is an autogenerated libdef stub for:\n *\n *   'eslint-plugin-react-native'\n *\n * Fill this stub out by replacing all the `any` types.\n *\n * Once filled out, we encourage you to share your work with the\n * community by sending a pull request to:\n * https://github.com/flowtype/flow-typed\n */\n\ndeclare module \"eslint-plugin-react-native\" {\n  declare module.exports: any;\n}\n\n/**\n * We include stubs for each file inside this npm package in case you need to\n * require those files directly. Feel free to delete any files that aren't\n * needed.\n */\ndeclare module \"eslint-plugin-react-native/lib/rules/no-color-literals\" {\n  declare module.exports: any;\n}\n\ndeclare module \"eslint-plugin-react-native/lib/rules/no-inline-styles\" {\n  declare module.exports: any;\n}\n\ndeclare module \"eslint-plugin-react-native/lib/rules/no-raw-text\" {\n  declare module.exports: any;\n}\n\ndeclare module \"eslint-plugin-react-native/lib/rules/no-unused-styles\" {\n  declare module.exports: any;\n}\n\ndeclare module \"eslint-plugin-react-native/lib/rules/split-platform-components\" {\n  declare module.exports: any;\n}\n\ndeclare module \"eslint-plugin-react-native/lib/util/Components\" {\n  declare module.exports: any;\n}\n\ndeclare module \"eslint-plugin-react-native/lib/util/stylesheet\" {\n  declare module.exports: any;\n}\n\ndeclare module \"eslint-plugin-react-native/lib/util/variable\" {\n  declare module.exports: any;\n}\n\n// Filename aliases\ndeclare module \"eslint-plugin-react-native/index\" {\n  declare module.exports: $Exports<\"eslint-plugin-react-native\">;\n}\ndeclare module \"eslint-plugin-react-native/index.js\" {\n  declare module.exports: $Exports<\"eslint-plugin-react-native\">;\n}\ndeclare module \"eslint-plugin-react-native/lib/rules/no-color-literals.js\" {\n  declare module.exports: $Exports<\n    \"eslint-plugin-react-native/lib/rules/no-color-literals\",\n  >;\n}\ndeclare module \"eslint-plugin-react-native/lib/rules/no-inline-styles.js\" {\n  declare module.exports: $Exports<\n    \"eslint-plugin-react-native/lib/rules/no-inline-styles\",\n  >;\n}\ndeclare module \"eslint-plugin-react-native/lib/rules/no-raw-text.js\" {\n  declare module.exports: $Exports<\n    \"eslint-plugin-react-native/lib/rules/no-raw-text\",\n  >;\n}\ndeclare module \"eslint-plugin-react-native/lib/rules/no-unused-styles.js\" {\n  declare module.exports: $Exports<\n    \"eslint-plugin-react-native/lib/rules/no-unused-styles\",\n  >;\n}\ndeclare module \"eslint-plugin-react-native/lib/rules/split-platform-components.js\" {\n  declare module.exports: $Exports<\n    \"eslint-plugin-react-native/lib/rules/split-platform-components\",\n  >;\n}\ndeclare module \"eslint-plugin-react-native/lib/util/Components.js\" {\n  declare module.exports: $Exports<\n    \"eslint-plugin-react-native/lib/util/Components\",\n  >;\n}\ndeclare module \"eslint-plugin-react-native/lib/util/stylesheet.js\" {\n  declare module.exports: $Exports<\n    \"eslint-plugin-react-native/lib/util/stylesheet\",\n  >;\n}\ndeclare module \"eslint-plugin-react-native/lib/util/variable.js\" {\n  declare module.exports: $Exports<\n    \"eslint-plugin-react-native/lib/util/variable\",\n  >;\n}\n"
  },
  {
    "path": "flow-typed/npm/eslint-plugin-react_vx.x.x.js",
    "content": "// flow-typed signature: 971882a160035f67a36ed630fcc20ee2\n// flow-typed version: <<STUB>>/eslint-plugin-react_v^7.11.0/flow_v0.87.0\n\n/**\n * This is an autogenerated libdef stub for:\n *\n *   'eslint-plugin-react'\n *\n * Fill this stub out by replacing all the `any` types.\n *\n * Once filled out, we encourage you to share your work with the\n * community by sending a pull request to:\n * https://github.com/flowtype/flow-typed\n */\n\ndeclare module \"eslint-plugin-react\" {\n  declare module.exports: any;\n}\n\n/**\n * We include stubs for each file inside this npm package in case you need to\n * require those files directly. Feel free to delete any files that aren't\n * needed.\n */\ndeclare module \"eslint-plugin-react/lib/rules/boolean-prop-naming\" {\n  declare module.exports: any;\n}\n\ndeclare module \"eslint-plugin-react/lib/rules/button-has-type\" {\n  declare module.exports: any;\n}\n\ndeclare module \"eslint-plugin-react/lib/rules/default-props-match-prop-types\" {\n  declare module.exports: any;\n}\n\ndeclare module \"eslint-plugin-react/lib/rules/destructuring-assignment\" {\n  declare module.exports: any;\n}\n\ndeclare module \"eslint-plugin-react/lib/rules/display-name\" {\n  declare module.exports: any;\n}\n\ndeclare module \"eslint-plugin-react/lib/rules/forbid-component-props\" {\n  declare module.exports: any;\n}\n\ndeclare module \"eslint-plugin-react/lib/rules/forbid-dom-props\" {\n  declare module.exports: any;\n}\n\ndeclare module \"eslint-plugin-react/lib/rules/forbid-elements\" {\n  declare module.exports: any;\n}\n\ndeclare module \"eslint-plugin-react/lib/rules/forbid-foreign-prop-types\" {\n  declare module.exports: any;\n}\n\ndeclare module \"eslint-plugin-react/lib/rules/forbid-prop-types\" {\n  declare module.exports: any;\n}\n\ndeclare module \"eslint-plugin-react/lib/rules/jsx-boolean-value\" {\n  declare module.exports: any;\n}\n\ndeclare module \"eslint-plugin-react/lib/rules/jsx-child-element-spacing\" {\n  declare module.exports: any;\n}\n\ndeclare module \"eslint-plugin-react/lib/rules/jsx-closing-bracket-location\" {\n  declare module.exports: any;\n}\n\ndeclare module \"eslint-plugin-react/lib/rules/jsx-closing-tag-location\" {\n  declare module.exports: any;\n}\n\ndeclare module \"eslint-plugin-react/lib/rules/jsx-curly-brace-presence\" {\n  declare module.exports: any;\n}\n\ndeclare module \"eslint-plugin-react/lib/rules/jsx-curly-spacing\" {\n  declare module.exports: any;\n}\n\ndeclare module \"eslint-plugin-react/lib/rules/jsx-equals-spacing\" {\n  declare module.exports: any;\n}\n\ndeclare module \"eslint-plugin-react/lib/rules/jsx-filename-extension\" {\n  declare module.exports: any;\n}\n\ndeclare module \"eslint-plugin-react/lib/rules/jsx-first-prop-new-line\" {\n  declare module.exports: any;\n}\n\ndeclare module \"eslint-plugin-react/lib/rules/jsx-handler-names\" {\n  declare module.exports: any;\n}\n\ndeclare module \"eslint-plugin-react/lib/rules/jsx-indent-props\" {\n  declare module.exports: any;\n}\n\ndeclare module \"eslint-plugin-react/lib/rules/jsx-indent\" {\n  declare module.exports: any;\n}\n\ndeclare module \"eslint-plugin-react/lib/rules/jsx-key\" {\n  declare module.exports: any;\n}\n\ndeclare module \"eslint-plugin-react/lib/rules/jsx-max-depth\" {\n  declare module.exports: any;\n}\n\ndeclare module \"eslint-plugin-react/lib/rules/jsx-max-props-per-line\" {\n  declare module.exports: any;\n}\n\ndeclare module \"eslint-plugin-react/lib/rules/jsx-no-bind\" {\n  declare module.exports: any;\n}\n\ndeclare module \"eslint-plugin-react/lib/rules/jsx-no-comment-textnodes\" {\n  declare module.exports: any;\n}\n\ndeclare module \"eslint-plugin-react/lib/rules/jsx-no-duplicate-props\" {\n  declare module.exports: any;\n}\n\ndeclare module \"eslint-plugin-react/lib/rules/jsx-no-literals\" {\n  declare module.exports: any;\n}\n\ndeclare module \"eslint-plugin-react/lib/rules/jsx-no-target-blank\" {\n  declare module.exports: any;\n}\n\ndeclare module \"eslint-plugin-react/lib/rules/jsx-no-undef\" {\n  declare module.exports: any;\n}\n\ndeclare module \"eslint-plugin-react/lib/rules/jsx-one-expression-per-line\" {\n  declare module.exports: any;\n}\n\ndeclare module \"eslint-plugin-react/lib/rules/jsx-pascal-case\" {\n  declare module.exports: any;\n}\n\ndeclare module \"eslint-plugin-react/lib/rules/jsx-props-no-multi-spaces\" {\n  declare module.exports: any;\n}\n\ndeclare module \"eslint-plugin-react/lib/rules/jsx-sort-default-props\" {\n  declare module.exports: any;\n}\n\ndeclare module \"eslint-plugin-react/lib/rules/jsx-sort-props\" {\n  declare module.exports: any;\n}\n\ndeclare module \"eslint-plugin-react/lib/rules/jsx-space-before-closing\" {\n  declare module.exports: any;\n}\n\ndeclare module \"eslint-plugin-react/lib/rules/jsx-tag-spacing\" {\n  declare module.exports: any;\n}\n\ndeclare module \"eslint-plugin-react/lib/rules/jsx-uses-react\" {\n  declare module.exports: any;\n}\n\ndeclare module \"eslint-plugin-react/lib/rules/jsx-uses-vars\" {\n  declare module.exports: any;\n}\n\ndeclare module \"eslint-plugin-react/lib/rules/jsx-wrap-multilines\" {\n  declare module.exports: any;\n}\n\ndeclare module \"eslint-plugin-react/lib/rules/no-access-state-in-setstate\" {\n  declare module.exports: any;\n}\n\ndeclare module \"eslint-plugin-react/lib/rules/no-array-index-key\" {\n  declare module.exports: any;\n}\n\ndeclare module \"eslint-plugin-react/lib/rules/no-children-prop\" {\n  declare module.exports: any;\n}\n\ndeclare module \"eslint-plugin-react/lib/rules/no-danger-with-children\" {\n  declare module.exports: any;\n}\n\ndeclare module \"eslint-plugin-react/lib/rules/no-danger\" {\n  declare module.exports: any;\n}\n\ndeclare module \"eslint-plugin-react/lib/rules/no-deprecated\" {\n  declare module.exports: any;\n}\n\ndeclare module \"eslint-plugin-react/lib/rules/no-did-mount-set-state\" {\n  declare module.exports: any;\n}\n\ndeclare module \"eslint-plugin-react/lib/rules/no-did-update-set-state\" {\n  declare module.exports: any;\n}\n\ndeclare module \"eslint-plugin-react/lib/rules/no-direct-mutation-state\" {\n  declare module.exports: any;\n}\n\ndeclare module \"eslint-plugin-react/lib/rules/no-find-dom-node\" {\n  declare module.exports: any;\n}\n\ndeclare module \"eslint-plugin-react/lib/rules/no-is-mounted\" {\n  declare module.exports: any;\n}\n\ndeclare module \"eslint-plugin-react/lib/rules/no-multi-comp\" {\n  declare module.exports: any;\n}\n\ndeclare module \"eslint-plugin-react/lib/rules/no-redundant-should-component-update\" {\n  declare module.exports: any;\n}\n\ndeclare module \"eslint-plugin-react/lib/rules/no-render-return-value\" {\n  declare module.exports: any;\n}\n\ndeclare module \"eslint-plugin-react/lib/rules/no-set-state\" {\n  declare module.exports: any;\n}\n\ndeclare module \"eslint-plugin-react/lib/rules/no-string-refs\" {\n  declare module.exports: any;\n}\n\ndeclare module \"eslint-plugin-react/lib/rules/no-this-in-sfc\" {\n  declare module.exports: any;\n}\n\ndeclare module \"eslint-plugin-react/lib/rules/no-typos\" {\n  declare module.exports: any;\n}\n\ndeclare module \"eslint-plugin-react/lib/rules/no-unescaped-entities\" {\n  declare module.exports: any;\n}\n\ndeclare module \"eslint-plugin-react/lib/rules/no-unknown-property\" {\n  declare module.exports: any;\n}\n\ndeclare module \"eslint-plugin-react/lib/rules/no-unsafe\" {\n  declare module.exports: any;\n}\n\ndeclare module \"eslint-plugin-react/lib/rules/no-unused-prop-types\" {\n  declare module.exports: any;\n}\n\ndeclare module \"eslint-plugin-react/lib/rules/no-unused-state\" {\n  declare module.exports: any;\n}\n\ndeclare module \"eslint-plugin-react/lib/rules/no-will-update-set-state\" {\n  declare module.exports: any;\n}\n\ndeclare module \"eslint-plugin-react/lib/rules/prefer-es6-class\" {\n  declare module.exports: any;\n}\n\ndeclare module \"eslint-plugin-react/lib/rules/prefer-stateless-function\" {\n  declare module.exports: any;\n}\n\ndeclare module \"eslint-plugin-react/lib/rules/prop-types\" {\n  declare module.exports: any;\n}\n\ndeclare module \"eslint-plugin-react/lib/rules/react-in-jsx-scope\" {\n  declare module.exports: any;\n}\n\ndeclare module \"eslint-plugin-react/lib/rules/require-default-props\" {\n  declare module.exports: any;\n}\n\ndeclare module \"eslint-plugin-react/lib/rules/require-optimization\" {\n  declare module.exports: any;\n}\n\ndeclare module \"eslint-plugin-react/lib/rules/require-render-return\" {\n  declare module.exports: any;\n}\n\ndeclare module \"eslint-plugin-react/lib/rules/self-closing-comp\" {\n  declare module.exports: any;\n}\n\ndeclare module \"eslint-plugin-react/lib/rules/sort-comp\" {\n  declare module.exports: any;\n}\n\ndeclare module \"eslint-plugin-react/lib/rules/sort-prop-types\" {\n  declare module.exports: any;\n}\n\ndeclare module \"eslint-plugin-react/lib/rules/style-prop-object\" {\n  declare module.exports: any;\n}\n\ndeclare module \"eslint-plugin-react/lib/rules/void-dom-elements-no-children\" {\n  declare module.exports: any;\n}\n\ndeclare module \"eslint-plugin-react/lib/util/annotations\" {\n  declare module.exports: any;\n}\n\ndeclare module \"eslint-plugin-react/lib/util/ast\" {\n  declare module.exports: any;\n}\n\ndeclare module \"eslint-plugin-react/lib/util/Components\" {\n  declare module.exports: any;\n}\n\ndeclare module \"eslint-plugin-react/lib/util/docsUrl\" {\n  declare module.exports: any;\n}\n\ndeclare module \"eslint-plugin-react/lib/util/getTokenBeforeClosingBracket\" {\n  declare module.exports: any;\n}\n\ndeclare module \"eslint-plugin-react/lib/util/jsx\" {\n  declare module.exports: any;\n}\n\ndeclare module \"eslint-plugin-react/lib/util/log\" {\n  declare module.exports: any;\n}\n\ndeclare module \"eslint-plugin-react/lib/util/makeNoMethodSetStateRule\" {\n  declare module.exports: any;\n}\n\ndeclare module \"eslint-plugin-react/lib/util/pragma\" {\n  declare module.exports: any;\n}\n\ndeclare module \"eslint-plugin-react/lib/util/props\" {\n  declare module.exports: any;\n}\n\ndeclare module \"eslint-plugin-react/lib/util/propTypes\" {\n  declare module.exports: any;\n}\n\ndeclare module \"eslint-plugin-react/lib/util/variable\" {\n  declare module.exports: any;\n}\n\ndeclare module \"eslint-plugin-react/lib/util/version\" {\n  declare module.exports: any;\n}\n\n// Filename aliases\ndeclare module \"eslint-plugin-react/index\" {\n  declare module.exports: $Exports<\"eslint-plugin-react\">;\n}\ndeclare module \"eslint-plugin-react/index.js\" {\n  declare module.exports: $Exports<\"eslint-plugin-react\">;\n}\ndeclare module \"eslint-plugin-react/lib/rules/boolean-prop-naming.js\" {\n  declare module.exports: $Exports<\n    \"eslint-plugin-react/lib/rules/boolean-prop-naming\",\n  >;\n}\ndeclare module \"eslint-plugin-react/lib/rules/button-has-type.js\" {\n  declare module.exports: $Exports<\n    \"eslint-plugin-react/lib/rules/button-has-type\",\n  >;\n}\ndeclare module \"eslint-plugin-react/lib/rules/default-props-match-prop-types.js\" {\n  declare module.exports: $Exports<\n    \"eslint-plugin-react/lib/rules/default-props-match-prop-types\",\n  >;\n}\ndeclare module \"eslint-plugin-react/lib/rules/destructuring-assignment.js\" {\n  declare module.exports: $Exports<\n    \"eslint-plugin-react/lib/rules/destructuring-assignment\",\n  >;\n}\ndeclare module \"eslint-plugin-react/lib/rules/display-name.js\" {\n  declare module.exports: $Exports<\n    \"eslint-plugin-react/lib/rules/display-name\",\n  >;\n}\ndeclare module \"eslint-plugin-react/lib/rules/forbid-component-props.js\" {\n  declare module.exports: $Exports<\n    \"eslint-plugin-react/lib/rules/forbid-component-props\",\n  >;\n}\ndeclare module \"eslint-plugin-react/lib/rules/forbid-dom-props.js\" {\n  declare module.exports: $Exports<\n    \"eslint-plugin-react/lib/rules/forbid-dom-props\",\n  >;\n}\ndeclare module \"eslint-plugin-react/lib/rules/forbid-elements.js\" {\n  declare module.exports: $Exports<\n    \"eslint-plugin-react/lib/rules/forbid-elements\",\n  >;\n}\ndeclare module \"eslint-plugin-react/lib/rules/forbid-foreign-prop-types.js\" {\n  declare module.exports: $Exports<\n    \"eslint-plugin-react/lib/rules/forbid-foreign-prop-types\",\n  >;\n}\ndeclare module \"eslint-plugin-react/lib/rules/forbid-prop-types.js\" {\n  declare module.exports: $Exports<\n    \"eslint-plugin-react/lib/rules/forbid-prop-types\",\n  >;\n}\ndeclare module \"eslint-plugin-react/lib/rules/jsx-boolean-value.js\" {\n  declare module.exports: $Exports<\n    \"eslint-plugin-react/lib/rules/jsx-boolean-value\",\n  >;\n}\ndeclare module \"eslint-plugin-react/lib/rules/jsx-child-element-spacing.js\" {\n  declare module.exports: $Exports<\n    \"eslint-plugin-react/lib/rules/jsx-child-element-spacing\",\n  >;\n}\ndeclare module \"eslint-plugin-react/lib/rules/jsx-closing-bracket-location.js\" {\n  declare module.exports: $Exports<\n    \"eslint-plugin-react/lib/rules/jsx-closing-bracket-location\",\n  >;\n}\ndeclare module \"eslint-plugin-react/lib/rules/jsx-closing-tag-location.js\" {\n  declare module.exports: $Exports<\n    \"eslint-plugin-react/lib/rules/jsx-closing-tag-location\",\n  >;\n}\ndeclare module \"eslint-plugin-react/lib/rules/jsx-curly-brace-presence.js\" {\n  declare module.exports: $Exports<\n    \"eslint-plugin-react/lib/rules/jsx-curly-brace-presence\",\n  >;\n}\ndeclare module \"eslint-plugin-react/lib/rules/jsx-curly-spacing.js\" {\n  declare module.exports: $Exports<\n    \"eslint-plugin-react/lib/rules/jsx-curly-spacing\",\n  >;\n}\ndeclare module \"eslint-plugin-react/lib/rules/jsx-equals-spacing.js\" {\n  declare module.exports: $Exports<\n    \"eslint-plugin-react/lib/rules/jsx-equals-spacing\",\n  >;\n}\ndeclare module \"eslint-plugin-react/lib/rules/jsx-filename-extension.js\" {\n  declare module.exports: $Exports<\n    \"eslint-plugin-react/lib/rules/jsx-filename-extension\",\n  >;\n}\ndeclare module \"eslint-plugin-react/lib/rules/jsx-first-prop-new-line.js\" {\n  declare module.exports: $Exports<\n    \"eslint-plugin-react/lib/rules/jsx-first-prop-new-line\",\n  >;\n}\ndeclare module \"eslint-plugin-react/lib/rules/jsx-handler-names.js\" {\n  declare module.exports: $Exports<\n    \"eslint-plugin-react/lib/rules/jsx-handler-names\",\n  >;\n}\ndeclare module \"eslint-plugin-react/lib/rules/jsx-indent-props.js\" {\n  declare module.exports: $Exports<\n    \"eslint-plugin-react/lib/rules/jsx-indent-props\",\n  >;\n}\ndeclare module \"eslint-plugin-react/lib/rules/jsx-indent.js\" {\n  declare module.exports: $Exports<\"eslint-plugin-react/lib/rules/jsx-indent\">;\n}\ndeclare module \"eslint-plugin-react/lib/rules/jsx-key.js\" {\n  declare module.exports: $Exports<\"eslint-plugin-react/lib/rules/jsx-key\">;\n}\ndeclare module \"eslint-plugin-react/lib/rules/jsx-max-depth.js\" {\n  declare module.exports: $Exports<\n    \"eslint-plugin-react/lib/rules/jsx-max-depth\",\n  >;\n}\ndeclare module \"eslint-plugin-react/lib/rules/jsx-max-props-per-line.js\" {\n  declare module.exports: $Exports<\n    \"eslint-plugin-react/lib/rules/jsx-max-props-per-line\",\n  >;\n}\ndeclare module \"eslint-plugin-react/lib/rules/jsx-no-bind.js\" {\n  declare module.exports: $Exports<\"eslint-plugin-react/lib/rules/jsx-no-bind\">;\n}\ndeclare module \"eslint-plugin-react/lib/rules/jsx-no-comment-textnodes.js\" {\n  declare module.exports: $Exports<\n    \"eslint-plugin-react/lib/rules/jsx-no-comment-textnodes\",\n  >;\n}\ndeclare module \"eslint-plugin-react/lib/rules/jsx-no-duplicate-props.js\" {\n  declare module.exports: $Exports<\n    \"eslint-plugin-react/lib/rules/jsx-no-duplicate-props\",\n  >;\n}\ndeclare module \"eslint-plugin-react/lib/rules/jsx-no-literals.js\" {\n  declare module.exports: $Exports<\n    \"eslint-plugin-react/lib/rules/jsx-no-literals\",\n  >;\n}\ndeclare module \"eslint-plugin-react/lib/rules/jsx-no-target-blank.js\" {\n  declare module.exports: $Exports<\n    \"eslint-plugin-react/lib/rules/jsx-no-target-blank\",\n  >;\n}\ndeclare module \"eslint-plugin-react/lib/rules/jsx-no-undef.js\" {\n  declare module.exports: $Exports<\n    \"eslint-plugin-react/lib/rules/jsx-no-undef\",\n  >;\n}\ndeclare module \"eslint-plugin-react/lib/rules/jsx-one-expression-per-line.js\" {\n  declare module.exports: $Exports<\n    \"eslint-plugin-react/lib/rules/jsx-one-expression-per-line\",\n  >;\n}\ndeclare module \"eslint-plugin-react/lib/rules/jsx-pascal-case.js\" {\n  declare module.exports: $Exports<\n    \"eslint-plugin-react/lib/rules/jsx-pascal-case\",\n  >;\n}\ndeclare module \"eslint-plugin-react/lib/rules/jsx-props-no-multi-spaces.js\" {\n  declare module.exports: $Exports<\n    \"eslint-plugin-react/lib/rules/jsx-props-no-multi-spaces\",\n  >;\n}\ndeclare module \"eslint-plugin-react/lib/rules/jsx-sort-default-props.js\" {\n  declare module.exports: $Exports<\n    \"eslint-plugin-react/lib/rules/jsx-sort-default-props\",\n  >;\n}\ndeclare module \"eslint-plugin-react/lib/rules/jsx-sort-props.js\" {\n  declare module.exports: $Exports<\n    \"eslint-plugin-react/lib/rules/jsx-sort-props\",\n  >;\n}\ndeclare module \"eslint-plugin-react/lib/rules/jsx-space-before-closing.js\" {\n  declare module.exports: $Exports<\n    \"eslint-plugin-react/lib/rules/jsx-space-before-closing\",\n  >;\n}\ndeclare module \"eslint-plugin-react/lib/rules/jsx-tag-spacing.js\" {\n  declare module.exports: $Exports<\n    \"eslint-plugin-react/lib/rules/jsx-tag-spacing\",\n  >;\n}\ndeclare module \"eslint-plugin-react/lib/rules/jsx-uses-react.js\" {\n  declare module.exports: $Exports<\n    \"eslint-plugin-react/lib/rules/jsx-uses-react\",\n  >;\n}\ndeclare module \"eslint-plugin-react/lib/rules/jsx-uses-vars.js\" {\n  declare module.exports: $Exports<\n    \"eslint-plugin-react/lib/rules/jsx-uses-vars\",\n  >;\n}\ndeclare module \"eslint-plugin-react/lib/rules/jsx-wrap-multilines.js\" {\n  declare module.exports: $Exports<\n    \"eslint-plugin-react/lib/rules/jsx-wrap-multilines\",\n  >;\n}\ndeclare module \"eslint-plugin-react/lib/rules/no-access-state-in-setstate.js\" {\n  declare module.exports: $Exports<\n    \"eslint-plugin-react/lib/rules/no-access-state-in-setstate\",\n  >;\n}\ndeclare module \"eslint-plugin-react/lib/rules/no-array-index-key.js\" {\n  declare module.exports: $Exports<\n    \"eslint-plugin-react/lib/rules/no-array-index-key\",\n  >;\n}\ndeclare module \"eslint-plugin-react/lib/rules/no-children-prop.js\" {\n  declare module.exports: $Exports<\n    \"eslint-plugin-react/lib/rules/no-children-prop\",\n  >;\n}\ndeclare module \"eslint-plugin-react/lib/rules/no-danger-with-children.js\" {\n  declare module.exports: $Exports<\n    \"eslint-plugin-react/lib/rules/no-danger-with-children\",\n  >;\n}\ndeclare module \"eslint-plugin-react/lib/rules/no-danger.js\" {\n  declare module.exports: $Exports<\"eslint-plugin-react/lib/rules/no-danger\">;\n}\ndeclare module \"eslint-plugin-react/lib/rules/no-deprecated.js\" {\n  declare module.exports: $Exports<\n    \"eslint-plugin-react/lib/rules/no-deprecated\",\n  >;\n}\ndeclare module \"eslint-plugin-react/lib/rules/no-did-mount-set-state.js\" {\n  declare module.exports: $Exports<\n    \"eslint-plugin-react/lib/rules/no-did-mount-set-state\",\n  >;\n}\ndeclare module \"eslint-plugin-react/lib/rules/no-did-update-set-state.js\" {\n  declare module.exports: $Exports<\n    \"eslint-plugin-react/lib/rules/no-did-update-set-state\",\n  >;\n}\ndeclare module \"eslint-plugin-react/lib/rules/no-direct-mutation-state.js\" {\n  declare module.exports: $Exports<\n    \"eslint-plugin-react/lib/rules/no-direct-mutation-state\",\n  >;\n}\ndeclare module \"eslint-plugin-react/lib/rules/no-find-dom-node.js\" {\n  declare module.exports: $Exports<\n    \"eslint-plugin-react/lib/rules/no-find-dom-node\",\n  >;\n}\ndeclare module \"eslint-plugin-react/lib/rules/no-is-mounted.js\" {\n  declare module.exports: $Exports<\n    \"eslint-plugin-react/lib/rules/no-is-mounted\",\n  >;\n}\ndeclare module \"eslint-plugin-react/lib/rules/no-multi-comp.js\" {\n  declare module.exports: $Exports<\n    \"eslint-plugin-react/lib/rules/no-multi-comp\",\n  >;\n}\ndeclare module \"eslint-plugin-react/lib/rules/no-redundant-should-component-update.js\" {\n  declare module.exports: $Exports<\n    \"eslint-plugin-react/lib/rules/no-redundant-should-component-update\",\n  >;\n}\ndeclare module \"eslint-plugin-react/lib/rules/no-render-return-value.js\" {\n  declare module.exports: $Exports<\n    \"eslint-plugin-react/lib/rules/no-render-return-value\",\n  >;\n}\ndeclare module \"eslint-plugin-react/lib/rules/no-set-state.js\" {\n  declare module.exports: $Exports<\n    \"eslint-plugin-react/lib/rules/no-set-state\",\n  >;\n}\ndeclare module \"eslint-plugin-react/lib/rules/no-string-refs.js\" {\n  declare module.exports: $Exports<\n    \"eslint-plugin-react/lib/rules/no-string-refs\",\n  >;\n}\ndeclare module \"eslint-plugin-react/lib/rules/no-this-in-sfc.js\" {\n  declare module.exports: $Exports<\n    \"eslint-plugin-react/lib/rules/no-this-in-sfc\",\n  >;\n}\ndeclare module \"eslint-plugin-react/lib/rules/no-typos.js\" {\n  declare module.exports: $Exports<\"eslint-plugin-react/lib/rules/no-typos\">;\n}\ndeclare module \"eslint-plugin-react/lib/rules/no-unescaped-entities.js\" {\n  declare module.exports: $Exports<\n    \"eslint-plugin-react/lib/rules/no-unescaped-entities\",\n  >;\n}\ndeclare module \"eslint-plugin-react/lib/rules/no-unknown-property.js\" {\n  declare module.exports: $Exports<\n    \"eslint-plugin-react/lib/rules/no-unknown-property\",\n  >;\n}\ndeclare module \"eslint-plugin-react/lib/rules/no-unsafe.js\" {\n  declare module.exports: $Exports<\"eslint-plugin-react/lib/rules/no-unsafe\">;\n}\ndeclare module \"eslint-plugin-react/lib/rules/no-unused-prop-types.js\" {\n  declare module.exports: $Exports<\n    \"eslint-plugin-react/lib/rules/no-unused-prop-types\",\n  >;\n}\ndeclare module \"eslint-plugin-react/lib/rules/no-unused-state.js\" {\n  declare module.exports: $Exports<\n    \"eslint-plugin-react/lib/rules/no-unused-state\",\n  >;\n}\ndeclare module \"eslint-plugin-react/lib/rules/no-will-update-set-state.js\" {\n  declare module.exports: $Exports<\n    \"eslint-plugin-react/lib/rules/no-will-update-set-state\",\n  >;\n}\ndeclare module \"eslint-plugin-react/lib/rules/prefer-es6-class.js\" {\n  declare module.exports: $Exports<\n    \"eslint-plugin-react/lib/rules/prefer-es6-class\",\n  >;\n}\ndeclare module \"eslint-plugin-react/lib/rules/prefer-stateless-function.js\" {\n  declare module.exports: $Exports<\n    \"eslint-plugin-react/lib/rules/prefer-stateless-function\",\n  >;\n}\ndeclare module \"eslint-plugin-react/lib/rules/prop-types.js\" {\n  declare module.exports: $Exports<\"eslint-plugin-react/lib/rules/prop-types\">;\n}\ndeclare module \"eslint-plugin-react/lib/rules/react-in-jsx-scope.js\" {\n  declare module.exports: $Exports<\n    \"eslint-plugin-react/lib/rules/react-in-jsx-scope\",\n  >;\n}\ndeclare module \"eslint-plugin-react/lib/rules/require-default-props.js\" {\n  declare module.exports: $Exports<\n    \"eslint-plugin-react/lib/rules/require-default-props\",\n  >;\n}\ndeclare module \"eslint-plugin-react/lib/rules/require-optimization.js\" {\n  declare module.exports: $Exports<\n    \"eslint-plugin-react/lib/rules/require-optimization\",\n  >;\n}\ndeclare module \"eslint-plugin-react/lib/rules/require-render-return.js\" {\n  declare module.exports: $Exports<\n    \"eslint-plugin-react/lib/rules/require-render-return\",\n  >;\n}\ndeclare module \"eslint-plugin-react/lib/rules/self-closing-comp.js\" {\n  declare module.exports: $Exports<\n    \"eslint-plugin-react/lib/rules/self-closing-comp\",\n  >;\n}\ndeclare module \"eslint-plugin-react/lib/rules/sort-comp.js\" {\n  declare module.exports: $Exports<\"eslint-plugin-react/lib/rules/sort-comp\">;\n}\ndeclare module \"eslint-plugin-react/lib/rules/sort-prop-types.js\" {\n  declare module.exports: $Exports<\n    \"eslint-plugin-react/lib/rules/sort-prop-types\",\n  >;\n}\ndeclare module \"eslint-plugin-react/lib/rules/style-prop-object.js\" {\n  declare module.exports: $Exports<\n    \"eslint-plugin-react/lib/rules/style-prop-object\",\n  >;\n}\ndeclare module \"eslint-plugin-react/lib/rules/void-dom-elements-no-children.js\" {\n  declare module.exports: $Exports<\n    \"eslint-plugin-react/lib/rules/void-dom-elements-no-children\",\n  >;\n}\ndeclare module \"eslint-plugin-react/lib/util/annotations.js\" {\n  declare module.exports: $Exports<\"eslint-plugin-react/lib/util/annotations\">;\n}\ndeclare module \"eslint-plugin-react/lib/util/ast.js\" {\n  declare module.exports: $Exports<\"eslint-plugin-react/lib/util/ast\">;\n}\ndeclare module \"eslint-plugin-react/lib/util/Components.js\" {\n  declare module.exports: $Exports<\"eslint-plugin-react/lib/util/Components\">;\n}\ndeclare module \"eslint-plugin-react/lib/util/docsUrl.js\" {\n  declare module.exports: $Exports<\"eslint-plugin-react/lib/util/docsUrl\">;\n}\ndeclare module \"eslint-plugin-react/lib/util/getTokenBeforeClosingBracket.js\" {\n  declare module.exports: $Exports<\n    \"eslint-plugin-react/lib/util/getTokenBeforeClosingBracket\",\n  >;\n}\ndeclare module \"eslint-plugin-react/lib/util/jsx.js\" {\n  declare module.exports: $Exports<\"eslint-plugin-react/lib/util/jsx\">;\n}\ndeclare module \"eslint-plugin-react/lib/util/log.js\" {\n  declare module.exports: $Exports<\"eslint-plugin-react/lib/util/log\">;\n}\ndeclare module \"eslint-plugin-react/lib/util/makeNoMethodSetStateRule.js\" {\n  declare module.exports: $Exports<\n    \"eslint-plugin-react/lib/util/makeNoMethodSetStateRule\",\n  >;\n}\ndeclare module \"eslint-plugin-react/lib/util/pragma.js\" {\n  declare module.exports: $Exports<\"eslint-plugin-react/lib/util/pragma\">;\n}\ndeclare module \"eslint-plugin-react/lib/util/props.js\" {\n  declare module.exports: $Exports<\"eslint-plugin-react/lib/util/props\">;\n}\ndeclare module \"eslint-plugin-react/lib/util/propTypes.js\" {\n  declare module.exports: $Exports<\"eslint-plugin-react/lib/util/propTypes\">;\n}\ndeclare module \"eslint-plugin-react/lib/util/variable.js\" {\n  declare module.exports: $Exports<\"eslint-plugin-react/lib/util/variable\">;\n}\ndeclare module \"eslint-plugin-react/lib/util/version.js\" {\n  declare module.exports: $Exports<\"eslint-plugin-react/lib/util/version\">;\n}\n"
  },
  {
    "path": "flow-typed/npm/eslint_vx.x.x.js",
    "content": "// flow-typed signature: a730ec2f47b90952dbc5e118bb2105a3\n// flow-typed version: <<STUB>>/eslint_v^5.7.0/flow_v0.87.0\n\n/**\n * This is an autogenerated libdef stub for:\n *\n *   'eslint'\n *\n * Fill this stub out by replacing all the `any` types.\n *\n * Once filled out, we encourage you to share your work with the\n * community by sending a pull request to:\n * https://github.com/flowtype/flow-typed\n */\n\ndeclare module \"eslint\" {\n  declare module.exports: any;\n}\n\n/**\n * We include stubs for each file inside this npm package in case you need to\n * require those files directly. Feel free to delete any files that aren't\n * needed.\n */\ndeclare module \"eslint/bin/eslint\" {\n  declare module.exports: any;\n}\n\ndeclare module \"eslint/conf/config-schema\" {\n  declare module.exports: any;\n}\n\ndeclare module \"eslint/conf/default-cli-options\" {\n  declare module.exports: any;\n}\n\ndeclare module \"eslint/conf/environments\" {\n  declare module.exports: any;\n}\n\ndeclare module \"eslint/conf/eslint-all\" {\n  declare module.exports: any;\n}\n\ndeclare module \"eslint/conf/eslint-recommended\" {\n  declare module.exports: any;\n}\n\ndeclare module \"eslint/lib/api\" {\n  declare module.exports: any;\n}\n\ndeclare module \"eslint/lib/cli-engine\" {\n  declare module.exports: any;\n}\n\ndeclare module \"eslint/lib/cli\" {\n  declare module.exports: any;\n}\n\ndeclare module \"eslint/lib/code-path-analysis/code-path-analyzer\" {\n  declare module.exports: any;\n}\n\ndeclare module \"eslint/lib/code-path-analysis/code-path-segment\" {\n  declare module.exports: any;\n}\n\ndeclare module \"eslint/lib/code-path-analysis/code-path-state\" {\n  declare module.exports: any;\n}\n\ndeclare module \"eslint/lib/code-path-analysis/code-path\" {\n  declare module.exports: any;\n}\n\ndeclare module \"eslint/lib/code-path-analysis/debug-helpers\" {\n  declare module.exports: any;\n}\n\ndeclare module \"eslint/lib/code-path-analysis/fork-context\" {\n  declare module.exports: any;\n}\n\ndeclare module \"eslint/lib/code-path-analysis/id-generator\" {\n  declare module.exports: any;\n}\n\ndeclare module \"eslint/lib/config\" {\n  declare module.exports: any;\n}\n\ndeclare module \"eslint/lib/config/autoconfig\" {\n  declare module.exports: any;\n}\n\ndeclare module \"eslint/lib/config/config-cache\" {\n  declare module.exports: any;\n}\n\ndeclare module \"eslint/lib/config/config-file\" {\n  declare module.exports: any;\n}\n\ndeclare module \"eslint/lib/config/config-initializer\" {\n  declare module.exports: any;\n}\n\ndeclare module \"eslint/lib/config/config-ops\" {\n  declare module.exports: any;\n}\n\ndeclare module \"eslint/lib/config/config-rule\" {\n  declare module.exports: any;\n}\n\ndeclare module \"eslint/lib/config/config-validator\" {\n  declare module.exports: any;\n}\n\ndeclare module \"eslint/lib/config/environments\" {\n  declare module.exports: any;\n}\n\ndeclare module \"eslint/lib/config/plugins\" {\n  declare module.exports: any;\n}\n\ndeclare module \"eslint/lib/formatters/checkstyle\" {\n  declare module.exports: any;\n}\n\ndeclare module \"eslint/lib/formatters/codeframe\" {\n  declare module.exports: any;\n}\n\ndeclare module \"eslint/lib/formatters/compact\" {\n  declare module.exports: any;\n}\n\ndeclare module \"eslint/lib/formatters/html\" {\n  declare module.exports: any;\n}\n\ndeclare module \"eslint/lib/formatters/jslint-xml\" {\n  declare module.exports: any;\n}\n\ndeclare module \"eslint/lib/formatters/json\" {\n  declare module.exports: any;\n}\n\ndeclare module \"eslint/lib/formatters/junit\" {\n  declare module.exports: any;\n}\n\ndeclare module \"eslint/lib/formatters/stylish\" {\n  declare module.exports: any;\n}\n\ndeclare module \"eslint/lib/formatters/table\" {\n  declare module.exports: any;\n}\n\ndeclare module \"eslint/lib/formatters/tap\" {\n  declare module.exports: any;\n}\n\ndeclare module \"eslint/lib/formatters/unix\" {\n  declare module.exports: any;\n}\n\ndeclare module \"eslint/lib/formatters/visualstudio\" {\n  declare module.exports: any;\n}\n\ndeclare module \"eslint/lib/ignored-paths\" {\n  declare module.exports: any;\n}\n\ndeclare module \"eslint/lib/linter\" {\n  declare module.exports: any;\n}\n\ndeclare module \"eslint/lib/load-rules\" {\n  declare module.exports: any;\n}\n\ndeclare module \"eslint/lib/options\" {\n  declare module.exports: any;\n}\n\ndeclare module \"eslint/lib/report-translator\" {\n  declare module.exports: any;\n}\n\ndeclare module \"eslint/lib/rules\" {\n  declare module.exports: any;\n}\n\ndeclare module \"eslint/lib/rules/accessor-pairs\" {\n  declare module.exports: any;\n}\n\ndeclare module \"eslint/lib/rules/array-bracket-newline\" {\n  declare module.exports: any;\n}\n\ndeclare module \"eslint/lib/rules/array-bracket-spacing\" {\n  declare module.exports: any;\n}\n\ndeclare module \"eslint/lib/rules/array-callback-return\" {\n  declare module.exports: any;\n}\n\ndeclare module \"eslint/lib/rules/array-element-newline\" {\n  declare module.exports: any;\n}\n\ndeclare module \"eslint/lib/rules/arrow-body-style\" {\n  declare module.exports: any;\n}\n\ndeclare module \"eslint/lib/rules/arrow-parens\" {\n  declare module.exports: any;\n}\n\ndeclare module \"eslint/lib/rules/arrow-spacing\" {\n  declare module.exports: any;\n}\n\ndeclare module \"eslint/lib/rules/block-scoped-var\" {\n  declare module.exports: any;\n}\n\ndeclare module \"eslint/lib/rules/block-spacing\" {\n  declare module.exports: any;\n}\n\ndeclare module \"eslint/lib/rules/brace-style\" {\n  declare module.exports: any;\n}\n\ndeclare module \"eslint/lib/rules/callback-return\" {\n  declare module.exports: any;\n}\n\ndeclare module \"eslint/lib/rules/camelcase\" {\n  declare module.exports: any;\n}\n\ndeclare module \"eslint/lib/rules/capitalized-comments\" {\n  declare module.exports: any;\n}\n\ndeclare module \"eslint/lib/rules/class-methods-use-this\" {\n  declare module.exports: any;\n}\n\ndeclare module \"eslint/lib/rules/comma-dangle\" {\n  declare module.exports: any;\n}\n\ndeclare module \"eslint/lib/rules/comma-spacing\" {\n  declare module.exports: any;\n}\n\ndeclare module \"eslint/lib/rules/comma-style\" {\n  declare module.exports: any;\n}\n\ndeclare module \"eslint/lib/rules/complexity\" {\n  declare module.exports: any;\n}\n\ndeclare module \"eslint/lib/rules/computed-property-spacing\" {\n  declare module.exports: any;\n}\n\ndeclare module \"eslint/lib/rules/consistent-return\" {\n  declare module.exports: any;\n}\n\ndeclare module \"eslint/lib/rules/consistent-this\" {\n  declare module.exports: any;\n}\n\ndeclare module \"eslint/lib/rules/constructor-super\" {\n  declare module.exports: any;\n}\n\ndeclare module \"eslint/lib/rules/curly\" {\n  declare module.exports: any;\n}\n\ndeclare module \"eslint/lib/rules/default-case\" {\n  declare module.exports: any;\n}\n\ndeclare module \"eslint/lib/rules/dot-location\" {\n  declare module.exports: any;\n}\n\ndeclare module \"eslint/lib/rules/dot-notation\" {\n  declare module.exports: any;\n}\n\ndeclare module \"eslint/lib/rules/eol-last\" {\n  declare module.exports: any;\n}\n\ndeclare module \"eslint/lib/rules/eqeqeq\" {\n  declare module.exports: any;\n}\n\ndeclare module \"eslint/lib/rules/for-direction\" {\n  declare module.exports: any;\n}\n\ndeclare module \"eslint/lib/rules/func-call-spacing\" {\n  declare module.exports: any;\n}\n\ndeclare module \"eslint/lib/rules/func-name-matching\" {\n  declare module.exports: any;\n}\n\ndeclare module \"eslint/lib/rules/func-names\" {\n  declare module.exports: any;\n}\n\ndeclare module \"eslint/lib/rules/func-style\" {\n  declare module.exports: any;\n}\n\ndeclare module \"eslint/lib/rules/function-paren-newline\" {\n  declare module.exports: any;\n}\n\ndeclare module \"eslint/lib/rules/generator-star-spacing\" {\n  declare module.exports: any;\n}\n\ndeclare module \"eslint/lib/rules/getter-return\" {\n  declare module.exports: any;\n}\n\ndeclare module \"eslint/lib/rules/global-require\" {\n  declare module.exports: any;\n}\n\ndeclare module \"eslint/lib/rules/guard-for-in\" {\n  declare module.exports: any;\n}\n\ndeclare module \"eslint/lib/rules/handle-callback-err\" {\n  declare module.exports: any;\n}\n\ndeclare module \"eslint/lib/rules/id-blacklist\" {\n  declare module.exports: any;\n}\n\ndeclare module \"eslint/lib/rules/id-length\" {\n  declare module.exports: any;\n}\n\ndeclare module \"eslint/lib/rules/id-match\" {\n  declare module.exports: any;\n}\n\ndeclare module \"eslint/lib/rules/implicit-arrow-linebreak\" {\n  declare module.exports: any;\n}\n\ndeclare module \"eslint/lib/rules/indent-legacy\" {\n  declare module.exports: any;\n}\n\ndeclare module \"eslint/lib/rules/indent\" {\n  declare module.exports: any;\n}\n\ndeclare module \"eslint/lib/rules/init-declarations\" {\n  declare module.exports: any;\n}\n\ndeclare module \"eslint/lib/rules/jsx-quotes\" {\n  declare module.exports: any;\n}\n\ndeclare module \"eslint/lib/rules/key-spacing\" {\n  declare module.exports: any;\n}\n\ndeclare module \"eslint/lib/rules/keyword-spacing\" {\n  declare module.exports: any;\n}\n\ndeclare module \"eslint/lib/rules/line-comment-position\" {\n  declare module.exports: any;\n}\n\ndeclare module \"eslint/lib/rules/linebreak-style\" {\n  declare module.exports: any;\n}\n\ndeclare module \"eslint/lib/rules/lines-around-comment\" {\n  declare module.exports: any;\n}\n\ndeclare module \"eslint/lib/rules/lines-around-directive\" {\n  declare module.exports: any;\n}\n\ndeclare module \"eslint/lib/rules/lines-between-class-members\" {\n  declare module.exports: any;\n}\n\ndeclare module \"eslint/lib/rules/max-classes-per-file\" {\n  declare module.exports: any;\n}\n\ndeclare module \"eslint/lib/rules/max-depth\" {\n  declare module.exports: any;\n}\n\ndeclare module \"eslint/lib/rules/max-len\" {\n  declare module.exports: any;\n}\n\ndeclare module \"eslint/lib/rules/max-lines-per-function\" {\n  declare module.exports: any;\n}\n\ndeclare module \"eslint/lib/rules/max-lines\" {\n  declare module.exports: any;\n}\n\ndeclare module \"eslint/lib/rules/max-nested-callbacks\" {\n  declare module.exports: any;\n}\n\ndeclare module \"eslint/lib/rules/max-params\" {\n  declare module.exports: any;\n}\n\ndeclare module \"eslint/lib/rules/max-statements-per-line\" {\n  declare module.exports: any;\n}\n\ndeclare module \"eslint/lib/rules/max-statements\" {\n  declare module.exports: any;\n}\n\ndeclare module \"eslint/lib/rules/multiline-comment-style\" {\n  declare module.exports: any;\n}\n\ndeclare module \"eslint/lib/rules/multiline-ternary\" {\n  declare module.exports: any;\n}\n\ndeclare module \"eslint/lib/rules/new-cap\" {\n  declare module.exports: any;\n}\n\ndeclare module \"eslint/lib/rules/new-parens\" {\n  declare module.exports: any;\n}\n\ndeclare module \"eslint/lib/rules/newline-after-var\" {\n  declare module.exports: any;\n}\n\ndeclare module \"eslint/lib/rules/newline-before-return\" {\n  declare module.exports: any;\n}\n\ndeclare module \"eslint/lib/rules/newline-per-chained-call\" {\n  declare module.exports: any;\n}\n\ndeclare module \"eslint/lib/rules/no-alert\" {\n  declare module.exports: any;\n}\n\ndeclare module \"eslint/lib/rules/no-array-constructor\" {\n  declare module.exports: any;\n}\n\ndeclare module \"eslint/lib/rules/no-async-promise-executor\" {\n  declare module.exports: any;\n}\n\ndeclare module \"eslint/lib/rules/no-await-in-loop\" {\n  declare module.exports: any;\n}\n\ndeclare module \"eslint/lib/rules/no-bitwise\" {\n  declare module.exports: any;\n}\n\ndeclare module \"eslint/lib/rules/no-buffer-constructor\" {\n  declare module.exports: any;\n}\n\ndeclare module \"eslint/lib/rules/no-caller\" {\n  declare module.exports: any;\n}\n\ndeclare module \"eslint/lib/rules/no-case-declarations\" {\n  declare module.exports: any;\n}\n\ndeclare module \"eslint/lib/rules/no-catch-shadow\" {\n  declare module.exports: any;\n}\n\ndeclare module \"eslint/lib/rules/no-class-assign\" {\n  declare module.exports: any;\n}\n\ndeclare module \"eslint/lib/rules/no-compare-neg-zero\" {\n  declare module.exports: any;\n}\n\ndeclare module \"eslint/lib/rules/no-cond-assign\" {\n  declare module.exports: any;\n}\n\ndeclare module \"eslint/lib/rules/no-confusing-arrow\" {\n  declare module.exports: any;\n}\n\ndeclare module \"eslint/lib/rules/no-console\" {\n  declare module.exports: any;\n}\n\ndeclare module \"eslint/lib/rules/no-const-assign\" {\n  declare module.exports: any;\n}\n\ndeclare module \"eslint/lib/rules/no-constant-condition\" {\n  declare module.exports: any;\n}\n\ndeclare module \"eslint/lib/rules/no-continue\" {\n  declare module.exports: any;\n}\n\ndeclare module \"eslint/lib/rules/no-control-regex\" {\n  declare module.exports: any;\n}\n\ndeclare module \"eslint/lib/rules/no-debugger\" {\n  declare module.exports: any;\n}\n\ndeclare module \"eslint/lib/rules/no-delete-var\" {\n  declare module.exports: any;\n}\n\ndeclare module \"eslint/lib/rules/no-div-regex\" {\n  declare module.exports: any;\n}\n\ndeclare module \"eslint/lib/rules/no-dupe-args\" {\n  declare module.exports: any;\n}\n\ndeclare module \"eslint/lib/rules/no-dupe-class-members\" {\n  declare module.exports: any;\n}\n\ndeclare module \"eslint/lib/rules/no-dupe-keys\" {\n  declare module.exports: any;\n}\n\ndeclare module \"eslint/lib/rules/no-duplicate-case\" {\n  declare module.exports: any;\n}\n\ndeclare module \"eslint/lib/rules/no-duplicate-imports\" {\n  declare module.exports: any;\n}\n\ndeclare module \"eslint/lib/rules/no-else-return\" {\n  declare module.exports: any;\n}\n\ndeclare module \"eslint/lib/rules/no-empty-character-class\" {\n  declare module.exports: any;\n}\n\ndeclare module \"eslint/lib/rules/no-empty-function\" {\n  declare module.exports: any;\n}\n\ndeclare module \"eslint/lib/rules/no-empty-pattern\" {\n  declare module.exports: any;\n}\n\ndeclare module \"eslint/lib/rules/no-empty\" {\n  declare module.exports: any;\n}\n\ndeclare module \"eslint/lib/rules/no-eq-null\" {\n  declare module.exports: any;\n}\n\ndeclare module \"eslint/lib/rules/no-eval\" {\n  declare module.exports: any;\n}\n\ndeclare module \"eslint/lib/rules/no-ex-assign\" {\n  declare module.exports: any;\n}\n\ndeclare module \"eslint/lib/rules/no-extend-native\" {\n  declare module.exports: any;\n}\n\ndeclare module \"eslint/lib/rules/no-extra-bind\" {\n  declare module.exports: any;\n}\n\ndeclare module \"eslint/lib/rules/no-extra-boolean-cast\" {\n  declare module.exports: any;\n}\n\ndeclare module \"eslint/lib/rules/no-extra-label\" {\n  declare module.exports: any;\n}\n\ndeclare module \"eslint/lib/rules/no-extra-parens\" {\n  declare module.exports: any;\n}\n\ndeclare module \"eslint/lib/rules/no-extra-semi\" {\n  declare module.exports: any;\n}\n\ndeclare module \"eslint/lib/rules/no-fallthrough\" {\n  declare module.exports: any;\n}\n\ndeclare module \"eslint/lib/rules/no-floating-decimal\" {\n  declare module.exports: any;\n}\n\ndeclare module \"eslint/lib/rules/no-func-assign\" {\n  declare module.exports: any;\n}\n\ndeclare module \"eslint/lib/rules/no-global-assign\" {\n  declare module.exports: any;\n}\n\ndeclare module \"eslint/lib/rules/no-implicit-coercion\" {\n  declare module.exports: any;\n}\n\ndeclare module \"eslint/lib/rules/no-implicit-globals\" {\n  declare module.exports: any;\n}\n\ndeclare module \"eslint/lib/rules/no-implied-eval\" {\n  declare module.exports: any;\n}\n\ndeclare module \"eslint/lib/rules/no-inline-comments\" {\n  declare module.exports: any;\n}\n\ndeclare module \"eslint/lib/rules/no-inner-declarations\" {\n  declare module.exports: any;\n}\n\ndeclare module \"eslint/lib/rules/no-invalid-regexp\" {\n  declare module.exports: any;\n}\n\ndeclare module \"eslint/lib/rules/no-invalid-this\" {\n  declare module.exports: any;\n}\n\ndeclare module \"eslint/lib/rules/no-irregular-whitespace\" {\n  declare module.exports: any;\n}\n\ndeclare module \"eslint/lib/rules/no-iterator\" {\n  declare module.exports: any;\n}\n\ndeclare module \"eslint/lib/rules/no-label-var\" {\n  declare module.exports: any;\n}\n\ndeclare module \"eslint/lib/rules/no-labels\" {\n  declare module.exports: any;\n}\n\ndeclare module \"eslint/lib/rules/no-lone-blocks\" {\n  declare module.exports: any;\n}\n\ndeclare module \"eslint/lib/rules/no-lonely-if\" {\n  declare module.exports: any;\n}\n\ndeclare module \"eslint/lib/rules/no-loop-func\" {\n  declare module.exports: any;\n}\n\ndeclare module \"eslint/lib/rules/no-magic-numbers\" {\n  declare module.exports: any;\n}\n\ndeclare module \"eslint/lib/rules/no-misleading-character-class\" {\n  declare module.exports: any;\n}\n\ndeclare module \"eslint/lib/rules/no-mixed-operators\" {\n  declare module.exports: any;\n}\n\ndeclare module \"eslint/lib/rules/no-mixed-requires\" {\n  declare module.exports: any;\n}\n\ndeclare module \"eslint/lib/rules/no-mixed-spaces-and-tabs\" {\n  declare module.exports: any;\n}\n\ndeclare module \"eslint/lib/rules/no-multi-assign\" {\n  declare module.exports: any;\n}\n\ndeclare module \"eslint/lib/rules/no-multi-spaces\" {\n  declare module.exports: any;\n}\n\ndeclare module \"eslint/lib/rules/no-multi-str\" {\n  declare module.exports: any;\n}\n\ndeclare module \"eslint/lib/rules/no-multiple-empty-lines\" {\n  declare module.exports: any;\n}\n\ndeclare module \"eslint/lib/rules/no-native-reassign\" {\n  declare module.exports: any;\n}\n\ndeclare module \"eslint/lib/rules/no-negated-condition\" {\n  declare module.exports: any;\n}\n\ndeclare module \"eslint/lib/rules/no-negated-in-lhs\" {\n  declare module.exports: any;\n}\n\ndeclare module \"eslint/lib/rules/no-nested-ternary\" {\n  declare module.exports: any;\n}\n\ndeclare module \"eslint/lib/rules/no-new-func\" {\n  declare module.exports: any;\n}\n\ndeclare module \"eslint/lib/rules/no-new-object\" {\n  declare module.exports: any;\n}\n\ndeclare module \"eslint/lib/rules/no-new-require\" {\n  declare module.exports: any;\n}\n\ndeclare module \"eslint/lib/rules/no-new-symbol\" {\n  declare module.exports: any;\n}\n\ndeclare module \"eslint/lib/rules/no-new-wrappers\" {\n  declare module.exports: any;\n}\n\ndeclare module \"eslint/lib/rules/no-new\" {\n  declare module.exports: any;\n}\n\ndeclare module \"eslint/lib/rules/no-obj-calls\" {\n  declare module.exports: any;\n}\n\ndeclare module \"eslint/lib/rules/no-octal-escape\" {\n  declare module.exports: any;\n}\n\ndeclare module \"eslint/lib/rules/no-octal\" {\n  declare module.exports: any;\n}\n\ndeclare module \"eslint/lib/rules/no-param-reassign\" {\n  declare module.exports: any;\n}\n\ndeclare module \"eslint/lib/rules/no-path-concat\" {\n  declare module.exports: any;\n}\n\ndeclare module \"eslint/lib/rules/no-plusplus\" {\n  declare module.exports: any;\n}\n\ndeclare module \"eslint/lib/rules/no-process-env\" {\n  declare module.exports: any;\n}\n\ndeclare module \"eslint/lib/rules/no-process-exit\" {\n  declare module.exports: any;\n}\n\ndeclare module \"eslint/lib/rules/no-proto\" {\n  declare module.exports: any;\n}\n\ndeclare module \"eslint/lib/rules/no-prototype-builtins\" {\n  declare module.exports: any;\n}\n\ndeclare module \"eslint/lib/rules/no-redeclare\" {\n  declare module.exports: any;\n}\n\ndeclare module \"eslint/lib/rules/no-regex-spaces\" {\n  declare module.exports: any;\n}\n\ndeclare module \"eslint/lib/rules/no-restricted-globals\" {\n  declare module.exports: any;\n}\n\ndeclare module \"eslint/lib/rules/no-restricted-imports\" {\n  declare module.exports: any;\n}\n\ndeclare module \"eslint/lib/rules/no-restricted-modules\" {\n  declare module.exports: any;\n}\n\ndeclare module \"eslint/lib/rules/no-restricted-properties\" {\n  declare module.exports: any;\n}\n\ndeclare module \"eslint/lib/rules/no-restricted-syntax\" {\n  declare module.exports: any;\n}\n\ndeclare module \"eslint/lib/rules/no-return-assign\" {\n  declare module.exports: any;\n}\n\ndeclare module \"eslint/lib/rules/no-return-await\" {\n  declare module.exports: any;\n}\n\ndeclare module \"eslint/lib/rules/no-script-url\" {\n  declare module.exports: any;\n}\n\ndeclare module \"eslint/lib/rules/no-self-assign\" {\n  declare module.exports: any;\n}\n\ndeclare module \"eslint/lib/rules/no-self-compare\" {\n  declare module.exports: any;\n}\n\ndeclare module \"eslint/lib/rules/no-sequences\" {\n  declare module.exports: any;\n}\n\ndeclare module \"eslint/lib/rules/no-shadow-restricted-names\" {\n  declare module.exports: any;\n}\n\ndeclare module \"eslint/lib/rules/no-shadow\" {\n  declare module.exports: any;\n}\n\ndeclare module \"eslint/lib/rules/no-spaced-func\" {\n  declare module.exports: any;\n}\n\ndeclare module \"eslint/lib/rules/no-sparse-arrays\" {\n  declare module.exports: any;\n}\n\ndeclare module \"eslint/lib/rules/no-sync\" {\n  declare module.exports: any;\n}\n\ndeclare module \"eslint/lib/rules/no-tabs\" {\n  declare module.exports: any;\n}\n\ndeclare module \"eslint/lib/rules/no-template-curly-in-string\" {\n  declare module.exports: any;\n}\n\ndeclare module \"eslint/lib/rules/no-ternary\" {\n  declare module.exports: any;\n}\n\ndeclare module \"eslint/lib/rules/no-this-before-super\" {\n  declare module.exports: any;\n}\n\ndeclare module \"eslint/lib/rules/no-throw-literal\" {\n  declare module.exports: any;\n}\n\ndeclare module \"eslint/lib/rules/no-trailing-spaces\" {\n  declare module.exports: any;\n}\n\ndeclare module \"eslint/lib/rules/no-undef-init\" {\n  declare module.exports: any;\n}\n\ndeclare module \"eslint/lib/rules/no-undef\" {\n  declare module.exports: any;\n}\n\ndeclare module \"eslint/lib/rules/no-undefined\" {\n  declare module.exports: any;\n}\n\ndeclare module \"eslint/lib/rules/no-underscore-dangle\" {\n  declare module.exports: any;\n}\n\ndeclare module \"eslint/lib/rules/no-unexpected-multiline\" {\n  declare module.exports: any;\n}\n\ndeclare module \"eslint/lib/rules/no-unmodified-loop-condition\" {\n  declare module.exports: any;\n}\n\ndeclare module \"eslint/lib/rules/no-unneeded-ternary\" {\n  declare module.exports: any;\n}\n\ndeclare module \"eslint/lib/rules/no-unreachable\" {\n  declare module.exports: any;\n}\n\ndeclare module \"eslint/lib/rules/no-unsafe-finally\" {\n  declare module.exports: any;\n}\n\ndeclare module \"eslint/lib/rules/no-unsafe-negation\" {\n  declare module.exports: any;\n}\n\ndeclare module \"eslint/lib/rules/no-unused-expressions\" {\n  declare module.exports: any;\n}\n\ndeclare module \"eslint/lib/rules/no-unused-labels\" {\n  declare module.exports: any;\n}\n\ndeclare module \"eslint/lib/rules/no-unused-vars\" {\n  declare module.exports: any;\n}\n\ndeclare module \"eslint/lib/rules/no-use-before-define\" {\n  declare module.exports: any;\n}\n\ndeclare module \"eslint/lib/rules/no-useless-call\" {\n  declare module.exports: any;\n}\n\ndeclare module \"eslint/lib/rules/no-useless-computed-key\" {\n  declare module.exports: any;\n}\n\ndeclare module \"eslint/lib/rules/no-useless-concat\" {\n  declare module.exports: any;\n}\n\ndeclare module \"eslint/lib/rules/no-useless-constructor\" {\n  declare module.exports: any;\n}\n\ndeclare module \"eslint/lib/rules/no-useless-escape\" {\n  declare module.exports: any;\n}\n\ndeclare module \"eslint/lib/rules/no-useless-rename\" {\n  declare module.exports: any;\n}\n\ndeclare module \"eslint/lib/rules/no-useless-return\" {\n  declare module.exports: any;\n}\n\ndeclare module \"eslint/lib/rules/no-var\" {\n  declare module.exports: any;\n}\n\ndeclare module \"eslint/lib/rules/no-void\" {\n  declare module.exports: any;\n}\n\ndeclare module \"eslint/lib/rules/no-warning-comments\" {\n  declare module.exports: any;\n}\n\ndeclare module \"eslint/lib/rules/no-whitespace-before-property\" {\n  declare module.exports: any;\n}\n\ndeclare module \"eslint/lib/rules/no-with\" {\n  declare module.exports: any;\n}\n\ndeclare module \"eslint/lib/rules/nonblock-statement-body-position\" {\n  declare module.exports: any;\n}\n\ndeclare module \"eslint/lib/rules/object-curly-newline\" {\n  declare module.exports: any;\n}\n\ndeclare module \"eslint/lib/rules/object-curly-spacing\" {\n  declare module.exports: any;\n}\n\ndeclare module \"eslint/lib/rules/object-property-newline\" {\n  declare module.exports: any;\n}\n\ndeclare module \"eslint/lib/rules/object-shorthand\" {\n  declare module.exports: any;\n}\n\ndeclare module \"eslint/lib/rules/one-var-declaration-per-line\" {\n  declare module.exports: any;\n}\n\ndeclare module \"eslint/lib/rules/one-var\" {\n  declare module.exports: any;\n}\n\ndeclare module \"eslint/lib/rules/operator-assignment\" {\n  declare module.exports: any;\n}\n\ndeclare module \"eslint/lib/rules/operator-linebreak\" {\n  declare module.exports: any;\n}\n\ndeclare module \"eslint/lib/rules/padded-blocks\" {\n  declare module.exports: any;\n}\n\ndeclare module \"eslint/lib/rules/padding-line-between-statements\" {\n  declare module.exports: any;\n}\n\ndeclare module \"eslint/lib/rules/prefer-arrow-callback\" {\n  declare module.exports: any;\n}\n\ndeclare module \"eslint/lib/rules/prefer-const\" {\n  declare module.exports: any;\n}\n\ndeclare module \"eslint/lib/rules/prefer-destructuring\" {\n  declare module.exports: any;\n}\n\ndeclare module \"eslint/lib/rules/prefer-numeric-literals\" {\n  declare module.exports: any;\n}\n\ndeclare module \"eslint/lib/rules/prefer-object-spread\" {\n  declare module.exports: any;\n}\n\ndeclare module \"eslint/lib/rules/prefer-promise-reject-errors\" {\n  declare module.exports: any;\n}\n\ndeclare module \"eslint/lib/rules/prefer-reflect\" {\n  declare module.exports: any;\n}\n\ndeclare module \"eslint/lib/rules/prefer-rest-params\" {\n  declare module.exports: any;\n}\n\ndeclare module \"eslint/lib/rules/prefer-spread\" {\n  declare module.exports: any;\n}\n\ndeclare module \"eslint/lib/rules/prefer-template\" {\n  declare module.exports: any;\n}\n\ndeclare module \"eslint/lib/rules/quote-props\" {\n  declare module.exports: any;\n}\n\ndeclare module \"eslint/lib/rules/quotes\" {\n  declare module.exports: any;\n}\n\ndeclare module \"eslint/lib/rules/radix\" {\n  declare module.exports: any;\n}\n\ndeclare module \"eslint/lib/rules/require-atomic-updates\" {\n  declare module.exports: any;\n}\n\ndeclare module \"eslint/lib/rules/require-await\" {\n  declare module.exports: any;\n}\n\ndeclare module \"eslint/lib/rules/require-jsdoc\" {\n  declare module.exports: any;\n}\n\ndeclare module \"eslint/lib/rules/require-unicode-regexp\" {\n  declare module.exports: any;\n}\n\ndeclare module \"eslint/lib/rules/require-yield\" {\n  declare module.exports: any;\n}\n\ndeclare module \"eslint/lib/rules/rest-spread-spacing\" {\n  declare module.exports: any;\n}\n\ndeclare module \"eslint/lib/rules/semi-spacing\" {\n  declare module.exports: any;\n}\n\ndeclare module \"eslint/lib/rules/semi-style\" {\n  declare module.exports: any;\n}\n\ndeclare module \"eslint/lib/rules/semi\" {\n  declare module.exports: any;\n}\n\ndeclare module \"eslint/lib/rules/sort-imports\" {\n  declare module.exports: any;\n}\n\ndeclare module \"eslint/lib/rules/sort-keys\" {\n  declare module.exports: any;\n}\n\ndeclare module \"eslint/lib/rules/sort-vars\" {\n  declare module.exports: any;\n}\n\ndeclare module \"eslint/lib/rules/space-before-blocks\" {\n  declare module.exports: any;\n}\n\ndeclare module \"eslint/lib/rules/space-before-function-paren\" {\n  declare module.exports: any;\n}\n\ndeclare module \"eslint/lib/rules/space-in-parens\" {\n  declare module.exports: any;\n}\n\ndeclare module \"eslint/lib/rules/space-infix-ops\" {\n  declare module.exports: any;\n}\n\ndeclare module \"eslint/lib/rules/space-unary-ops\" {\n  declare module.exports: any;\n}\n\ndeclare module \"eslint/lib/rules/spaced-comment\" {\n  declare module.exports: any;\n}\n\ndeclare module \"eslint/lib/rules/strict\" {\n  declare module.exports: any;\n}\n\ndeclare module \"eslint/lib/rules/switch-colon-spacing\" {\n  declare module.exports: any;\n}\n\ndeclare module \"eslint/lib/rules/symbol-description\" {\n  declare module.exports: any;\n}\n\ndeclare module \"eslint/lib/rules/template-curly-spacing\" {\n  declare module.exports: any;\n}\n\ndeclare module \"eslint/lib/rules/template-tag-spacing\" {\n  declare module.exports: any;\n}\n\ndeclare module \"eslint/lib/rules/unicode-bom\" {\n  declare module.exports: any;\n}\n\ndeclare module \"eslint/lib/rules/use-isnan\" {\n  declare module.exports: any;\n}\n\ndeclare module \"eslint/lib/rules/valid-jsdoc\" {\n  declare module.exports: any;\n}\n\ndeclare module \"eslint/lib/rules/valid-typeof\" {\n  declare module.exports: any;\n}\n\ndeclare module \"eslint/lib/rules/vars-on-top\" {\n  declare module.exports: any;\n}\n\ndeclare module \"eslint/lib/rules/wrap-iife\" {\n  declare module.exports: any;\n}\n\ndeclare module \"eslint/lib/rules/wrap-regex\" {\n  declare module.exports: any;\n}\n\ndeclare module \"eslint/lib/rules/yield-star-spacing\" {\n  declare module.exports: any;\n}\n\ndeclare module \"eslint/lib/rules/yoda\" {\n  declare module.exports: any;\n}\n\ndeclare module \"eslint/lib/testers/rule-tester\" {\n  declare module.exports: any;\n}\n\ndeclare module \"eslint/lib/token-store/backward-token-comment-cursor\" {\n  declare module.exports: any;\n}\n\ndeclare module \"eslint/lib/token-store/backward-token-cursor\" {\n  declare module.exports: any;\n}\n\ndeclare module \"eslint/lib/token-store/cursor\" {\n  declare module.exports: any;\n}\n\ndeclare module \"eslint/lib/token-store/cursors\" {\n  declare module.exports: any;\n}\n\ndeclare module \"eslint/lib/token-store/decorative-cursor\" {\n  declare module.exports: any;\n}\n\ndeclare module \"eslint/lib/token-store/filter-cursor\" {\n  declare module.exports: any;\n}\n\ndeclare module \"eslint/lib/token-store/forward-token-comment-cursor\" {\n  declare module.exports: any;\n}\n\ndeclare module \"eslint/lib/token-store/forward-token-cursor\" {\n  declare module.exports: any;\n}\n\ndeclare module \"eslint/lib/token-store/index\" {\n  declare module.exports: any;\n}\n\ndeclare module \"eslint/lib/token-store/limit-cursor\" {\n  declare module.exports: any;\n}\n\ndeclare module \"eslint/lib/token-store/padded-token-cursor\" {\n  declare module.exports: any;\n}\n\ndeclare module \"eslint/lib/token-store/skip-cursor\" {\n  declare module.exports: any;\n}\n\ndeclare module \"eslint/lib/token-store/utils\" {\n  declare module.exports: any;\n}\n\ndeclare module \"eslint/lib/util/ajv\" {\n  declare module.exports: any;\n}\n\ndeclare module \"eslint/lib/util/apply-disable-directives\" {\n  declare module.exports: any;\n}\n\ndeclare module \"eslint/lib/util/ast-utils\" {\n  declare module.exports: any;\n}\n\ndeclare module \"eslint/lib/util/file-finder\" {\n  declare module.exports: any;\n}\n\ndeclare module \"eslint/lib/util/fix-tracker\" {\n  declare module.exports: any;\n}\n\ndeclare module \"eslint/lib/util/glob-utils\" {\n  declare module.exports: any;\n}\n\ndeclare module \"eslint/lib/util/glob\" {\n  declare module.exports: any;\n}\n\ndeclare module \"eslint/lib/util/hash\" {\n  declare module.exports: any;\n}\n\ndeclare module \"eslint/lib/util/interpolate\" {\n  declare module.exports: any;\n}\n\ndeclare module \"eslint/lib/util/keywords\" {\n  declare module.exports: any;\n}\n\ndeclare module \"eslint/lib/util/lint-result-cache\" {\n  declare module.exports: any;\n}\n\ndeclare module \"eslint/lib/util/logging\" {\n  declare module.exports: any;\n}\n\ndeclare module \"eslint/lib/util/module-resolver\" {\n  declare module.exports: any;\n}\n\ndeclare module \"eslint/lib/util/naming\" {\n  declare module.exports: any;\n}\n\ndeclare module \"eslint/lib/util/node-event-generator\" {\n  declare module.exports: any;\n}\n\ndeclare module \"eslint/lib/util/npm-utils\" {\n  declare module.exports: any;\n}\n\ndeclare module \"eslint/lib/util/path-utils\" {\n  declare module.exports: any;\n}\n\ndeclare module \"eslint/lib/util/patterns/letters\" {\n  declare module.exports: any;\n}\n\ndeclare module \"eslint/lib/util/rule-fixer\" {\n  declare module.exports: any;\n}\n\ndeclare module \"eslint/lib/util/safe-emitter\" {\n  declare module.exports: any;\n}\n\ndeclare module \"eslint/lib/util/source-code-fixer\" {\n  declare module.exports: any;\n}\n\ndeclare module \"eslint/lib/util/source-code-utils\" {\n  declare module.exports: any;\n}\n\ndeclare module \"eslint/lib/util/source-code\" {\n  declare module.exports: any;\n}\n\ndeclare module \"eslint/lib/util/timing\" {\n  declare module.exports: any;\n}\n\ndeclare module \"eslint/lib/util/traverser\" {\n  declare module.exports: any;\n}\n\ndeclare module \"eslint/lib/util/unicode/index\" {\n  declare module.exports: any;\n}\n\ndeclare module \"eslint/lib/util/unicode/is-combining-character\" {\n  declare module.exports: any;\n}\n\ndeclare module \"eslint/lib/util/unicode/is-emoji-modifier\" {\n  declare module.exports: any;\n}\n\ndeclare module \"eslint/lib/util/unicode/is-regional-indicator-symbol\" {\n  declare module.exports: any;\n}\n\ndeclare module \"eslint/lib/util/unicode/is-surrogate-pair\" {\n  declare module.exports: any;\n}\n\ndeclare module \"eslint/lib/util/xml-escape\" {\n  declare module.exports: any;\n}\n\n// Filename aliases\ndeclare module \"eslint/bin/eslint.js\" {\n  declare module.exports: $Exports<\"eslint/bin/eslint\">;\n}\ndeclare module \"eslint/conf/config-schema.js\" {\n  declare module.exports: $Exports<\"eslint/conf/config-schema\">;\n}\ndeclare module \"eslint/conf/default-cli-options.js\" {\n  declare module.exports: $Exports<\"eslint/conf/default-cli-options\">;\n}\ndeclare module \"eslint/conf/environments.js\" {\n  declare module.exports: $Exports<\"eslint/conf/environments\">;\n}\ndeclare module \"eslint/conf/eslint-all.js\" {\n  declare module.exports: $Exports<\"eslint/conf/eslint-all\">;\n}\ndeclare module \"eslint/conf/eslint-recommended.js\" {\n  declare module.exports: $Exports<\"eslint/conf/eslint-recommended\">;\n}\ndeclare module \"eslint/lib/api.js\" {\n  declare module.exports: $Exports<\"eslint/lib/api\">;\n}\ndeclare module \"eslint/lib/cli-engine.js\" {\n  declare module.exports: $Exports<\"eslint/lib/cli-engine\">;\n}\ndeclare module \"eslint/lib/cli.js\" {\n  declare module.exports: $Exports<\"eslint/lib/cli\">;\n}\ndeclare module \"eslint/lib/code-path-analysis/code-path-analyzer.js\" {\n  declare module.exports: $Exports<\n    \"eslint/lib/code-path-analysis/code-path-analyzer\",\n  >;\n}\ndeclare module \"eslint/lib/code-path-analysis/code-path-segment.js\" {\n  declare module.exports: $Exports<\n    \"eslint/lib/code-path-analysis/code-path-segment\",\n  >;\n}\ndeclare module \"eslint/lib/code-path-analysis/code-path-state.js\" {\n  declare module.exports: $Exports<\n    \"eslint/lib/code-path-analysis/code-path-state\",\n  >;\n}\ndeclare module \"eslint/lib/code-path-analysis/code-path.js\" {\n  declare module.exports: $Exports<\"eslint/lib/code-path-analysis/code-path\">;\n}\ndeclare module \"eslint/lib/code-path-analysis/debug-helpers.js\" {\n  declare module.exports: $Exports<\n    \"eslint/lib/code-path-analysis/debug-helpers\",\n  >;\n}\ndeclare module \"eslint/lib/code-path-analysis/fork-context.js\" {\n  declare module.exports: $Exports<\n    \"eslint/lib/code-path-analysis/fork-context\",\n  >;\n}\ndeclare module \"eslint/lib/code-path-analysis/id-generator.js\" {\n  declare module.exports: $Exports<\n    \"eslint/lib/code-path-analysis/id-generator\",\n  >;\n}\ndeclare module \"eslint/lib/config.js\" {\n  declare module.exports: $Exports<\"eslint/lib/config\">;\n}\ndeclare module \"eslint/lib/config/autoconfig.js\" {\n  declare module.exports: $Exports<\"eslint/lib/config/autoconfig\">;\n}\ndeclare module \"eslint/lib/config/config-cache.js\" {\n  declare module.exports: $Exports<\"eslint/lib/config/config-cache\">;\n}\ndeclare module \"eslint/lib/config/config-file.js\" {\n  declare module.exports: $Exports<\"eslint/lib/config/config-file\">;\n}\ndeclare module \"eslint/lib/config/config-initializer.js\" {\n  declare module.exports: $Exports<\"eslint/lib/config/config-initializer\">;\n}\ndeclare module \"eslint/lib/config/config-ops.js\" {\n  declare module.exports: $Exports<\"eslint/lib/config/config-ops\">;\n}\ndeclare module \"eslint/lib/config/config-rule.js\" {\n  declare module.exports: $Exports<\"eslint/lib/config/config-rule\">;\n}\ndeclare module \"eslint/lib/config/config-validator.js\" {\n  declare module.exports: $Exports<\"eslint/lib/config/config-validator\">;\n}\ndeclare module \"eslint/lib/config/environments.js\" {\n  declare module.exports: $Exports<\"eslint/lib/config/environments\">;\n}\ndeclare module \"eslint/lib/config/plugins.js\" {\n  declare module.exports: $Exports<\"eslint/lib/config/plugins\">;\n}\ndeclare module \"eslint/lib/formatters/checkstyle.js\" {\n  declare module.exports: $Exports<\"eslint/lib/formatters/checkstyle\">;\n}\ndeclare module \"eslint/lib/formatters/codeframe.js\" {\n  declare module.exports: $Exports<\"eslint/lib/formatters/codeframe\">;\n}\ndeclare module \"eslint/lib/formatters/compact.js\" {\n  declare module.exports: $Exports<\"eslint/lib/formatters/compact\">;\n}\ndeclare module \"eslint/lib/formatters/html.js\" {\n  declare module.exports: $Exports<\"eslint/lib/formatters/html\">;\n}\ndeclare module \"eslint/lib/formatters/jslint-xml.js\" {\n  declare module.exports: $Exports<\"eslint/lib/formatters/jslint-xml\">;\n}\ndeclare module \"eslint/lib/formatters/json.js\" {\n  declare module.exports: $Exports<\"eslint/lib/formatters/json\">;\n}\ndeclare module \"eslint/lib/formatters/junit.js\" {\n  declare module.exports: $Exports<\"eslint/lib/formatters/junit\">;\n}\ndeclare module \"eslint/lib/formatters/stylish.js\" {\n  declare module.exports: $Exports<\"eslint/lib/formatters/stylish\">;\n}\ndeclare module \"eslint/lib/formatters/table.js\" {\n  declare module.exports: $Exports<\"eslint/lib/formatters/table\">;\n}\ndeclare module \"eslint/lib/formatters/tap.js\" {\n  declare module.exports: $Exports<\"eslint/lib/formatters/tap\">;\n}\ndeclare module \"eslint/lib/formatters/unix.js\" {\n  declare module.exports: $Exports<\"eslint/lib/formatters/unix\">;\n}\ndeclare module \"eslint/lib/formatters/visualstudio.js\" {\n  declare module.exports: $Exports<\"eslint/lib/formatters/visualstudio\">;\n}\ndeclare module \"eslint/lib/ignored-paths.js\" {\n  declare module.exports: $Exports<\"eslint/lib/ignored-paths\">;\n}\ndeclare module \"eslint/lib/linter.js\" {\n  declare module.exports: $Exports<\"eslint/lib/linter\">;\n}\ndeclare module \"eslint/lib/load-rules.js\" {\n  declare module.exports: $Exports<\"eslint/lib/load-rules\">;\n}\ndeclare module \"eslint/lib/options.js\" {\n  declare module.exports: $Exports<\"eslint/lib/options\">;\n}\ndeclare module \"eslint/lib/report-translator.js\" {\n  declare module.exports: $Exports<\"eslint/lib/report-translator\">;\n}\ndeclare module \"eslint/lib/rules.js\" {\n  declare module.exports: $Exports<\"eslint/lib/rules\">;\n}\ndeclare module \"eslint/lib/rules/accessor-pairs.js\" {\n  declare module.exports: $Exports<\"eslint/lib/rules/accessor-pairs\">;\n}\ndeclare module \"eslint/lib/rules/array-bracket-newline.js\" {\n  declare module.exports: $Exports<\"eslint/lib/rules/array-bracket-newline\">;\n}\ndeclare module \"eslint/lib/rules/array-bracket-spacing.js\" {\n  declare module.exports: $Exports<\"eslint/lib/rules/array-bracket-spacing\">;\n}\ndeclare module \"eslint/lib/rules/array-callback-return.js\" {\n  declare module.exports: $Exports<\"eslint/lib/rules/array-callback-return\">;\n}\ndeclare module \"eslint/lib/rules/array-element-newline.js\" {\n  declare module.exports: $Exports<\"eslint/lib/rules/array-element-newline\">;\n}\ndeclare module \"eslint/lib/rules/arrow-body-style.js\" {\n  declare module.exports: $Exports<\"eslint/lib/rules/arrow-body-style\">;\n}\ndeclare module \"eslint/lib/rules/arrow-parens.js\" {\n  declare module.exports: $Exports<\"eslint/lib/rules/arrow-parens\">;\n}\ndeclare module \"eslint/lib/rules/arrow-spacing.js\" {\n  declare module.exports: $Exports<\"eslint/lib/rules/arrow-spacing\">;\n}\ndeclare module \"eslint/lib/rules/block-scoped-var.js\" {\n  declare module.exports: $Exports<\"eslint/lib/rules/block-scoped-var\">;\n}\ndeclare module \"eslint/lib/rules/block-spacing.js\" {\n  declare module.exports: $Exports<\"eslint/lib/rules/block-spacing\">;\n}\ndeclare module \"eslint/lib/rules/brace-style.js\" {\n  declare module.exports: $Exports<\"eslint/lib/rules/brace-style\">;\n}\ndeclare module \"eslint/lib/rules/callback-return.js\" {\n  declare module.exports: $Exports<\"eslint/lib/rules/callback-return\">;\n}\ndeclare module \"eslint/lib/rules/camelcase.js\" {\n  declare module.exports: $Exports<\"eslint/lib/rules/camelcase\">;\n}\ndeclare module \"eslint/lib/rules/capitalized-comments.js\" {\n  declare module.exports: $Exports<\"eslint/lib/rules/capitalized-comments\">;\n}\ndeclare module \"eslint/lib/rules/class-methods-use-this.js\" {\n  declare module.exports: $Exports<\"eslint/lib/rules/class-methods-use-this\">;\n}\ndeclare module \"eslint/lib/rules/comma-dangle.js\" {\n  declare module.exports: $Exports<\"eslint/lib/rules/comma-dangle\">;\n}\ndeclare module \"eslint/lib/rules/comma-spacing.js\" {\n  declare module.exports: $Exports<\"eslint/lib/rules/comma-spacing\">;\n}\ndeclare module \"eslint/lib/rules/comma-style.js\" {\n  declare module.exports: $Exports<\"eslint/lib/rules/comma-style\">;\n}\ndeclare module \"eslint/lib/rules/complexity.js\" {\n  declare module.exports: $Exports<\"eslint/lib/rules/complexity\">;\n}\ndeclare module \"eslint/lib/rules/computed-property-spacing.js\" {\n  declare module.exports: $Exports<\n    \"eslint/lib/rules/computed-property-spacing\",\n  >;\n}\ndeclare module \"eslint/lib/rules/consistent-return.js\" {\n  declare module.exports: $Exports<\"eslint/lib/rules/consistent-return\">;\n}\ndeclare module \"eslint/lib/rules/consistent-this.js\" {\n  declare module.exports: $Exports<\"eslint/lib/rules/consistent-this\">;\n}\ndeclare module \"eslint/lib/rules/constructor-super.js\" {\n  declare module.exports: $Exports<\"eslint/lib/rules/constructor-super\">;\n}\ndeclare module \"eslint/lib/rules/curly.js\" {\n  declare module.exports: $Exports<\"eslint/lib/rules/curly\">;\n}\ndeclare module \"eslint/lib/rules/default-case.js\" {\n  declare module.exports: $Exports<\"eslint/lib/rules/default-case\">;\n}\ndeclare module \"eslint/lib/rules/dot-location.js\" {\n  declare module.exports: $Exports<\"eslint/lib/rules/dot-location\">;\n}\ndeclare module \"eslint/lib/rules/dot-notation.js\" {\n  declare module.exports: $Exports<\"eslint/lib/rules/dot-notation\">;\n}\ndeclare module \"eslint/lib/rules/eol-last.js\" {\n  declare module.exports: $Exports<\"eslint/lib/rules/eol-last\">;\n}\ndeclare module \"eslint/lib/rules/eqeqeq.js\" {\n  declare module.exports: $Exports<\"eslint/lib/rules/eqeqeq\">;\n}\ndeclare module \"eslint/lib/rules/for-direction.js\" {\n  declare module.exports: $Exports<\"eslint/lib/rules/for-direction\">;\n}\ndeclare module \"eslint/lib/rules/func-call-spacing.js\" {\n  declare module.exports: $Exports<\"eslint/lib/rules/func-call-spacing\">;\n}\ndeclare module \"eslint/lib/rules/func-name-matching.js\" {\n  declare module.exports: $Exports<\"eslint/lib/rules/func-name-matching\">;\n}\ndeclare module \"eslint/lib/rules/func-names.js\" {\n  declare module.exports: $Exports<\"eslint/lib/rules/func-names\">;\n}\ndeclare module \"eslint/lib/rules/func-style.js\" {\n  declare module.exports: $Exports<\"eslint/lib/rules/func-style\">;\n}\ndeclare module \"eslint/lib/rules/function-paren-newline.js\" {\n  declare module.exports: $Exports<\"eslint/lib/rules/function-paren-newline\">;\n}\ndeclare module \"eslint/lib/rules/generator-star-spacing.js\" {\n  declare module.exports: $Exports<\"eslint/lib/rules/generator-star-spacing\">;\n}\ndeclare module \"eslint/lib/rules/getter-return.js\" {\n  declare module.exports: $Exports<\"eslint/lib/rules/getter-return\">;\n}\ndeclare module \"eslint/lib/rules/global-require.js\" {\n  declare module.exports: $Exports<\"eslint/lib/rules/global-require\">;\n}\ndeclare module \"eslint/lib/rules/guard-for-in.js\" {\n  declare module.exports: $Exports<\"eslint/lib/rules/guard-for-in\">;\n}\ndeclare module \"eslint/lib/rules/handle-callback-err.js\" {\n  declare module.exports: $Exports<\"eslint/lib/rules/handle-callback-err\">;\n}\ndeclare module \"eslint/lib/rules/id-blacklist.js\" {\n  declare module.exports: $Exports<\"eslint/lib/rules/id-blacklist\">;\n}\ndeclare module \"eslint/lib/rules/id-length.js\" {\n  declare module.exports: $Exports<\"eslint/lib/rules/id-length\">;\n}\ndeclare module \"eslint/lib/rules/id-match.js\" {\n  declare module.exports: $Exports<\"eslint/lib/rules/id-match\">;\n}\ndeclare module \"eslint/lib/rules/implicit-arrow-linebreak.js\" {\n  declare module.exports: $Exports<\"eslint/lib/rules/implicit-arrow-linebreak\">;\n}\ndeclare module \"eslint/lib/rules/indent-legacy.js\" {\n  declare module.exports: $Exports<\"eslint/lib/rules/indent-legacy\">;\n}\ndeclare module \"eslint/lib/rules/indent.js\" {\n  declare module.exports: $Exports<\"eslint/lib/rules/indent\">;\n}\ndeclare module \"eslint/lib/rules/init-declarations.js\" {\n  declare module.exports: $Exports<\"eslint/lib/rules/init-declarations\">;\n}\ndeclare module \"eslint/lib/rules/jsx-quotes.js\" {\n  declare module.exports: $Exports<\"eslint/lib/rules/jsx-quotes\">;\n}\ndeclare module \"eslint/lib/rules/key-spacing.js\" {\n  declare module.exports: $Exports<\"eslint/lib/rules/key-spacing\">;\n}\ndeclare module \"eslint/lib/rules/keyword-spacing.js\" {\n  declare module.exports: $Exports<\"eslint/lib/rules/keyword-spacing\">;\n}\ndeclare module \"eslint/lib/rules/line-comment-position.js\" {\n  declare module.exports: $Exports<\"eslint/lib/rules/line-comment-position\">;\n}\ndeclare module \"eslint/lib/rules/linebreak-style.js\" {\n  declare module.exports: $Exports<\"eslint/lib/rules/linebreak-style\">;\n}\ndeclare module \"eslint/lib/rules/lines-around-comment.js\" {\n  declare module.exports: $Exports<\"eslint/lib/rules/lines-around-comment\">;\n}\ndeclare module \"eslint/lib/rules/lines-around-directive.js\" {\n  declare module.exports: $Exports<\"eslint/lib/rules/lines-around-directive\">;\n}\ndeclare module \"eslint/lib/rules/lines-between-class-members.js\" {\n  declare module.exports: $Exports<\n    \"eslint/lib/rules/lines-between-class-members\",\n  >;\n}\ndeclare module \"eslint/lib/rules/max-classes-per-file.js\" {\n  declare module.exports: $Exports<\"eslint/lib/rules/max-classes-per-file\">;\n}\ndeclare module \"eslint/lib/rules/max-depth.js\" {\n  declare module.exports: $Exports<\"eslint/lib/rules/max-depth\">;\n}\ndeclare module \"eslint/lib/rules/max-len.js\" {\n  declare module.exports: $Exports<\"eslint/lib/rules/max-len\">;\n}\ndeclare module \"eslint/lib/rules/max-lines-per-function.js\" {\n  declare module.exports: $Exports<\"eslint/lib/rules/max-lines-per-function\">;\n}\ndeclare module \"eslint/lib/rules/max-lines.js\" {\n  declare module.exports: $Exports<\"eslint/lib/rules/max-lines\">;\n}\ndeclare module \"eslint/lib/rules/max-nested-callbacks.js\" {\n  declare module.exports: $Exports<\"eslint/lib/rules/max-nested-callbacks\">;\n}\ndeclare module \"eslint/lib/rules/max-params.js\" {\n  declare module.exports: $Exports<\"eslint/lib/rules/max-params\">;\n}\ndeclare module \"eslint/lib/rules/max-statements-per-line.js\" {\n  declare module.exports: $Exports<\"eslint/lib/rules/max-statements-per-line\">;\n}\ndeclare module \"eslint/lib/rules/max-statements.js\" {\n  declare module.exports: $Exports<\"eslint/lib/rules/max-statements\">;\n}\ndeclare module \"eslint/lib/rules/multiline-comment-style.js\" {\n  declare module.exports: $Exports<\"eslint/lib/rules/multiline-comment-style\">;\n}\ndeclare module \"eslint/lib/rules/multiline-ternary.js\" {\n  declare module.exports: $Exports<\"eslint/lib/rules/multiline-ternary\">;\n}\ndeclare module \"eslint/lib/rules/new-cap.js\" {\n  declare module.exports: $Exports<\"eslint/lib/rules/new-cap\">;\n}\ndeclare module \"eslint/lib/rules/new-parens.js\" {\n  declare module.exports: $Exports<\"eslint/lib/rules/new-parens\">;\n}\ndeclare module \"eslint/lib/rules/newline-after-var.js\" {\n  declare module.exports: $Exports<\"eslint/lib/rules/newline-after-var\">;\n}\ndeclare module \"eslint/lib/rules/newline-before-return.js\" {\n  declare module.exports: $Exports<\"eslint/lib/rules/newline-before-return\">;\n}\ndeclare module \"eslint/lib/rules/newline-per-chained-call.js\" {\n  declare module.exports: $Exports<\"eslint/lib/rules/newline-per-chained-call\">;\n}\ndeclare module \"eslint/lib/rules/no-alert.js\" {\n  declare module.exports: $Exports<\"eslint/lib/rules/no-alert\">;\n}\ndeclare module \"eslint/lib/rules/no-array-constructor.js\" {\n  declare module.exports: $Exports<\"eslint/lib/rules/no-array-constructor\">;\n}\ndeclare module \"eslint/lib/rules/no-async-promise-executor.js\" {\n  declare module.exports: $Exports<\n    \"eslint/lib/rules/no-async-promise-executor\",\n  >;\n}\ndeclare module \"eslint/lib/rules/no-await-in-loop.js\" {\n  declare module.exports: $Exports<\"eslint/lib/rules/no-await-in-loop\">;\n}\ndeclare module \"eslint/lib/rules/no-bitwise.js\" {\n  declare module.exports: $Exports<\"eslint/lib/rules/no-bitwise\">;\n}\ndeclare module \"eslint/lib/rules/no-buffer-constructor.js\" {\n  declare module.exports: $Exports<\"eslint/lib/rules/no-buffer-constructor\">;\n}\ndeclare module \"eslint/lib/rules/no-caller.js\" {\n  declare module.exports: $Exports<\"eslint/lib/rules/no-caller\">;\n}\ndeclare module \"eslint/lib/rules/no-case-declarations.js\" {\n  declare module.exports: $Exports<\"eslint/lib/rules/no-case-declarations\">;\n}\ndeclare module \"eslint/lib/rules/no-catch-shadow.js\" {\n  declare module.exports: $Exports<\"eslint/lib/rules/no-catch-shadow\">;\n}\ndeclare module \"eslint/lib/rules/no-class-assign.js\" {\n  declare module.exports: $Exports<\"eslint/lib/rules/no-class-assign\">;\n}\ndeclare module \"eslint/lib/rules/no-compare-neg-zero.js\" {\n  declare module.exports: $Exports<\"eslint/lib/rules/no-compare-neg-zero\">;\n}\ndeclare module \"eslint/lib/rules/no-cond-assign.js\" {\n  declare module.exports: $Exports<\"eslint/lib/rules/no-cond-assign\">;\n}\ndeclare module \"eslint/lib/rules/no-confusing-arrow.js\" {\n  declare module.exports: $Exports<\"eslint/lib/rules/no-confusing-arrow\">;\n}\ndeclare module \"eslint/lib/rules/no-console.js\" {\n  declare module.exports: $Exports<\"eslint/lib/rules/no-console\">;\n}\ndeclare module \"eslint/lib/rules/no-const-assign.js\" {\n  declare module.exports: $Exports<\"eslint/lib/rules/no-const-assign\">;\n}\ndeclare module \"eslint/lib/rules/no-constant-condition.js\" {\n  declare module.exports: $Exports<\"eslint/lib/rules/no-constant-condition\">;\n}\ndeclare module \"eslint/lib/rules/no-continue.js\" {\n  declare module.exports: $Exports<\"eslint/lib/rules/no-continue\">;\n}\ndeclare module \"eslint/lib/rules/no-control-regex.js\" {\n  declare module.exports: $Exports<\"eslint/lib/rules/no-control-regex\">;\n}\ndeclare module \"eslint/lib/rules/no-debugger.js\" {\n  declare module.exports: $Exports<\"eslint/lib/rules/no-debugger\">;\n}\ndeclare module \"eslint/lib/rules/no-delete-var.js\" {\n  declare module.exports: $Exports<\"eslint/lib/rules/no-delete-var\">;\n}\ndeclare module \"eslint/lib/rules/no-div-regex.js\" {\n  declare module.exports: $Exports<\"eslint/lib/rules/no-div-regex\">;\n}\ndeclare module \"eslint/lib/rules/no-dupe-args.js\" {\n  declare module.exports: $Exports<\"eslint/lib/rules/no-dupe-args\">;\n}\ndeclare module \"eslint/lib/rules/no-dupe-class-members.js\" {\n  declare module.exports: $Exports<\"eslint/lib/rules/no-dupe-class-members\">;\n}\ndeclare module \"eslint/lib/rules/no-dupe-keys.js\" {\n  declare module.exports: $Exports<\"eslint/lib/rules/no-dupe-keys\">;\n}\ndeclare module \"eslint/lib/rules/no-duplicate-case.js\" {\n  declare module.exports: $Exports<\"eslint/lib/rules/no-duplicate-case\">;\n}\ndeclare module \"eslint/lib/rules/no-duplicate-imports.js\" {\n  declare module.exports: $Exports<\"eslint/lib/rules/no-duplicate-imports\">;\n}\ndeclare module \"eslint/lib/rules/no-else-return.js\" {\n  declare module.exports: $Exports<\"eslint/lib/rules/no-else-return\">;\n}\ndeclare module \"eslint/lib/rules/no-empty-character-class.js\" {\n  declare module.exports: $Exports<\"eslint/lib/rules/no-empty-character-class\">;\n}\ndeclare module \"eslint/lib/rules/no-empty-function.js\" {\n  declare module.exports: $Exports<\"eslint/lib/rules/no-empty-function\">;\n}\ndeclare module \"eslint/lib/rules/no-empty-pattern.js\" {\n  declare module.exports: $Exports<\"eslint/lib/rules/no-empty-pattern\">;\n}\ndeclare module \"eslint/lib/rules/no-empty.js\" {\n  declare module.exports: $Exports<\"eslint/lib/rules/no-empty\">;\n}\ndeclare module \"eslint/lib/rules/no-eq-null.js\" {\n  declare module.exports: $Exports<\"eslint/lib/rules/no-eq-null\">;\n}\ndeclare module \"eslint/lib/rules/no-eval.js\" {\n  declare module.exports: $Exports<\"eslint/lib/rules/no-eval\">;\n}\ndeclare module \"eslint/lib/rules/no-ex-assign.js\" {\n  declare module.exports: $Exports<\"eslint/lib/rules/no-ex-assign\">;\n}\ndeclare module \"eslint/lib/rules/no-extend-native.js\" {\n  declare module.exports: $Exports<\"eslint/lib/rules/no-extend-native\">;\n}\ndeclare module \"eslint/lib/rules/no-extra-bind.js\" {\n  declare module.exports: $Exports<\"eslint/lib/rules/no-extra-bind\">;\n}\ndeclare module \"eslint/lib/rules/no-extra-boolean-cast.js\" {\n  declare module.exports: $Exports<\"eslint/lib/rules/no-extra-boolean-cast\">;\n}\ndeclare module \"eslint/lib/rules/no-extra-label.js\" {\n  declare module.exports: $Exports<\"eslint/lib/rules/no-extra-label\">;\n}\ndeclare module \"eslint/lib/rules/no-extra-parens.js\" {\n  declare module.exports: $Exports<\"eslint/lib/rules/no-extra-parens\">;\n}\ndeclare module \"eslint/lib/rules/no-extra-semi.js\" {\n  declare module.exports: $Exports<\"eslint/lib/rules/no-extra-semi\">;\n}\ndeclare module \"eslint/lib/rules/no-fallthrough.js\" {\n  declare module.exports: $Exports<\"eslint/lib/rules/no-fallthrough\">;\n}\ndeclare module \"eslint/lib/rules/no-floating-decimal.js\" {\n  declare module.exports: $Exports<\"eslint/lib/rules/no-floating-decimal\">;\n}\ndeclare module \"eslint/lib/rules/no-func-assign.js\" {\n  declare module.exports: $Exports<\"eslint/lib/rules/no-func-assign\">;\n}\ndeclare module \"eslint/lib/rules/no-global-assign.js\" {\n  declare module.exports: $Exports<\"eslint/lib/rules/no-global-assign\">;\n}\ndeclare module \"eslint/lib/rules/no-implicit-coercion.js\" {\n  declare module.exports: $Exports<\"eslint/lib/rules/no-implicit-coercion\">;\n}\ndeclare module \"eslint/lib/rules/no-implicit-globals.js\" {\n  declare module.exports: $Exports<\"eslint/lib/rules/no-implicit-globals\">;\n}\ndeclare module \"eslint/lib/rules/no-implied-eval.js\" {\n  declare module.exports: $Exports<\"eslint/lib/rules/no-implied-eval\">;\n}\ndeclare module \"eslint/lib/rules/no-inline-comments.js\" {\n  declare module.exports: $Exports<\"eslint/lib/rules/no-inline-comments\">;\n}\ndeclare module \"eslint/lib/rules/no-inner-declarations.js\" {\n  declare module.exports: $Exports<\"eslint/lib/rules/no-inner-declarations\">;\n}\ndeclare module \"eslint/lib/rules/no-invalid-regexp.js\" {\n  declare module.exports: $Exports<\"eslint/lib/rules/no-invalid-regexp\">;\n}\ndeclare module \"eslint/lib/rules/no-invalid-this.js\" {\n  declare module.exports: $Exports<\"eslint/lib/rules/no-invalid-this\">;\n}\ndeclare module \"eslint/lib/rules/no-irregular-whitespace.js\" {\n  declare module.exports: $Exports<\"eslint/lib/rules/no-irregular-whitespace\">;\n}\ndeclare module \"eslint/lib/rules/no-iterator.js\" {\n  declare module.exports: $Exports<\"eslint/lib/rules/no-iterator\">;\n}\ndeclare module \"eslint/lib/rules/no-label-var.js\" {\n  declare module.exports: $Exports<\"eslint/lib/rules/no-label-var\">;\n}\ndeclare module \"eslint/lib/rules/no-labels.js\" {\n  declare module.exports: $Exports<\"eslint/lib/rules/no-labels\">;\n}\ndeclare module \"eslint/lib/rules/no-lone-blocks.js\" {\n  declare module.exports: $Exports<\"eslint/lib/rules/no-lone-blocks\">;\n}\ndeclare module \"eslint/lib/rules/no-lonely-if.js\" {\n  declare module.exports: $Exports<\"eslint/lib/rules/no-lonely-if\">;\n}\ndeclare module \"eslint/lib/rules/no-loop-func.js\" {\n  declare module.exports: $Exports<\"eslint/lib/rules/no-loop-func\">;\n}\ndeclare module \"eslint/lib/rules/no-magic-numbers.js\" {\n  declare module.exports: $Exports<\"eslint/lib/rules/no-magic-numbers\">;\n}\ndeclare module \"eslint/lib/rules/no-misleading-character-class.js\" {\n  declare module.exports: $Exports<\n    \"eslint/lib/rules/no-misleading-character-class\",\n  >;\n}\ndeclare module \"eslint/lib/rules/no-mixed-operators.js\" {\n  declare module.exports: $Exports<\"eslint/lib/rules/no-mixed-operators\">;\n}\ndeclare module \"eslint/lib/rules/no-mixed-requires.js\" {\n  declare module.exports: $Exports<\"eslint/lib/rules/no-mixed-requires\">;\n}\ndeclare module \"eslint/lib/rules/no-mixed-spaces-and-tabs.js\" {\n  declare module.exports: $Exports<\"eslint/lib/rules/no-mixed-spaces-and-tabs\">;\n}\ndeclare module \"eslint/lib/rules/no-multi-assign.js\" {\n  declare module.exports: $Exports<\"eslint/lib/rules/no-multi-assign\">;\n}\ndeclare module \"eslint/lib/rules/no-multi-spaces.js\" {\n  declare module.exports: $Exports<\"eslint/lib/rules/no-multi-spaces\">;\n}\ndeclare module \"eslint/lib/rules/no-multi-str.js\" {\n  declare module.exports: $Exports<\"eslint/lib/rules/no-multi-str\">;\n}\ndeclare module \"eslint/lib/rules/no-multiple-empty-lines.js\" {\n  declare module.exports: $Exports<\"eslint/lib/rules/no-multiple-empty-lines\">;\n}\ndeclare module \"eslint/lib/rules/no-native-reassign.js\" {\n  declare module.exports: $Exports<\"eslint/lib/rules/no-native-reassign\">;\n}\ndeclare module \"eslint/lib/rules/no-negated-condition.js\" {\n  declare module.exports: $Exports<\"eslint/lib/rules/no-negated-condition\">;\n}\ndeclare module \"eslint/lib/rules/no-negated-in-lhs.js\" {\n  declare module.exports: $Exports<\"eslint/lib/rules/no-negated-in-lhs\">;\n}\ndeclare module \"eslint/lib/rules/no-nested-ternary.js\" {\n  declare module.exports: $Exports<\"eslint/lib/rules/no-nested-ternary\">;\n}\ndeclare module \"eslint/lib/rules/no-new-func.js\" {\n  declare module.exports: $Exports<\"eslint/lib/rules/no-new-func\">;\n}\ndeclare module \"eslint/lib/rules/no-new-object.js\" {\n  declare module.exports: $Exports<\"eslint/lib/rules/no-new-object\">;\n}\ndeclare module \"eslint/lib/rules/no-new-require.js\" {\n  declare module.exports: $Exports<\"eslint/lib/rules/no-new-require\">;\n}\ndeclare module \"eslint/lib/rules/no-new-symbol.js\" {\n  declare module.exports: $Exports<\"eslint/lib/rules/no-new-symbol\">;\n}\ndeclare module \"eslint/lib/rules/no-new-wrappers.js\" {\n  declare module.exports: $Exports<\"eslint/lib/rules/no-new-wrappers\">;\n}\ndeclare module \"eslint/lib/rules/no-new.js\" {\n  declare module.exports: $Exports<\"eslint/lib/rules/no-new\">;\n}\ndeclare module \"eslint/lib/rules/no-obj-calls.js\" {\n  declare module.exports: $Exports<\"eslint/lib/rules/no-obj-calls\">;\n}\ndeclare module \"eslint/lib/rules/no-octal-escape.js\" {\n  declare module.exports: $Exports<\"eslint/lib/rules/no-octal-escape\">;\n}\ndeclare module \"eslint/lib/rules/no-octal.js\" {\n  declare module.exports: $Exports<\"eslint/lib/rules/no-octal\">;\n}\ndeclare module \"eslint/lib/rules/no-param-reassign.js\" {\n  declare module.exports: $Exports<\"eslint/lib/rules/no-param-reassign\">;\n}\ndeclare module \"eslint/lib/rules/no-path-concat.js\" {\n  declare module.exports: $Exports<\"eslint/lib/rules/no-path-concat\">;\n}\ndeclare module \"eslint/lib/rules/no-plusplus.js\" {\n  declare module.exports: $Exports<\"eslint/lib/rules/no-plusplus\">;\n}\ndeclare module \"eslint/lib/rules/no-process-env.js\" {\n  declare module.exports: $Exports<\"eslint/lib/rules/no-process-env\">;\n}\ndeclare module \"eslint/lib/rules/no-process-exit.js\" {\n  declare module.exports: $Exports<\"eslint/lib/rules/no-process-exit\">;\n}\ndeclare module \"eslint/lib/rules/no-proto.js\" {\n  declare module.exports: $Exports<\"eslint/lib/rules/no-proto\">;\n}\ndeclare module \"eslint/lib/rules/no-prototype-builtins.js\" {\n  declare module.exports: $Exports<\"eslint/lib/rules/no-prototype-builtins\">;\n}\ndeclare module \"eslint/lib/rules/no-redeclare.js\" {\n  declare module.exports: $Exports<\"eslint/lib/rules/no-redeclare\">;\n}\ndeclare module \"eslint/lib/rules/no-regex-spaces.js\" {\n  declare module.exports: $Exports<\"eslint/lib/rules/no-regex-spaces\">;\n}\ndeclare module \"eslint/lib/rules/no-restricted-globals.js\" {\n  declare module.exports: $Exports<\"eslint/lib/rules/no-restricted-globals\">;\n}\ndeclare module \"eslint/lib/rules/no-restricted-imports.js\" {\n  declare module.exports: $Exports<\"eslint/lib/rules/no-restricted-imports\">;\n}\ndeclare module \"eslint/lib/rules/no-restricted-modules.js\" {\n  declare module.exports: $Exports<\"eslint/lib/rules/no-restricted-modules\">;\n}\ndeclare module \"eslint/lib/rules/no-restricted-properties.js\" {\n  declare module.exports: $Exports<\"eslint/lib/rules/no-restricted-properties\">;\n}\ndeclare module \"eslint/lib/rules/no-restricted-syntax.js\" {\n  declare module.exports: $Exports<\"eslint/lib/rules/no-restricted-syntax\">;\n}\ndeclare module \"eslint/lib/rules/no-return-assign.js\" {\n  declare module.exports: $Exports<\"eslint/lib/rules/no-return-assign\">;\n}\ndeclare module \"eslint/lib/rules/no-return-await.js\" {\n  declare module.exports: $Exports<\"eslint/lib/rules/no-return-await\">;\n}\ndeclare module \"eslint/lib/rules/no-script-url.js\" {\n  declare module.exports: $Exports<\"eslint/lib/rules/no-script-url\">;\n}\ndeclare module \"eslint/lib/rules/no-self-assign.js\" {\n  declare module.exports: $Exports<\"eslint/lib/rules/no-self-assign\">;\n}\ndeclare module \"eslint/lib/rules/no-self-compare.js\" {\n  declare module.exports: $Exports<\"eslint/lib/rules/no-self-compare\">;\n}\ndeclare module \"eslint/lib/rules/no-sequences.js\" {\n  declare module.exports: $Exports<\"eslint/lib/rules/no-sequences\">;\n}\ndeclare module \"eslint/lib/rules/no-shadow-restricted-names.js\" {\n  declare module.exports: $Exports<\n    \"eslint/lib/rules/no-shadow-restricted-names\",\n  >;\n}\ndeclare module \"eslint/lib/rules/no-shadow.js\" {\n  declare module.exports: $Exports<\"eslint/lib/rules/no-shadow\">;\n}\ndeclare module \"eslint/lib/rules/no-spaced-func.js\" {\n  declare module.exports: $Exports<\"eslint/lib/rules/no-spaced-func\">;\n}\ndeclare module \"eslint/lib/rules/no-sparse-arrays.js\" {\n  declare module.exports: $Exports<\"eslint/lib/rules/no-sparse-arrays\">;\n}\ndeclare module \"eslint/lib/rules/no-sync.js\" {\n  declare module.exports: $Exports<\"eslint/lib/rules/no-sync\">;\n}\ndeclare module \"eslint/lib/rules/no-tabs.js\" {\n  declare module.exports: $Exports<\"eslint/lib/rules/no-tabs\">;\n}\ndeclare module \"eslint/lib/rules/no-template-curly-in-string.js\" {\n  declare module.exports: $Exports<\n    \"eslint/lib/rules/no-template-curly-in-string\",\n  >;\n}\ndeclare module \"eslint/lib/rules/no-ternary.js\" {\n  declare module.exports: $Exports<\"eslint/lib/rules/no-ternary\">;\n}\ndeclare module \"eslint/lib/rules/no-this-before-super.js\" {\n  declare module.exports: $Exports<\"eslint/lib/rules/no-this-before-super\">;\n}\ndeclare module \"eslint/lib/rules/no-throw-literal.js\" {\n  declare module.exports: $Exports<\"eslint/lib/rules/no-throw-literal\">;\n}\ndeclare module \"eslint/lib/rules/no-trailing-spaces.js\" {\n  declare module.exports: $Exports<\"eslint/lib/rules/no-trailing-spaces\">;\n}\ndeclare module \"eslint/lib/rules/no-undef-init.js\" {\n  declare module.exports: $Exports<\"eslint/lib/rules/no-undef-init\">;\n}\ndeclare module \"eslint/lib/rules/no-undef.js\" {\n  declare module.exports: $Exports<\"eslint/lib/rules/no-undef\">;\n}\ndeclare module \"eslint/lib/rules/no-undefined.js\" {\n  declare module.exports: $Exports<\"eslint/lib/rules/no-undefined\">;\n}\ndeclare module \"eslint/lib/rules/no-underscore-dangle.js\" {\n  declare module.exports: $Exports<\"eslint/lib/rules/no-underscore-dangle\">;\n}\ndeclare module \"eslint/lib/rules/no-unexpected-multiline.js\" {\n  declare module.exports: $Exports<\"eslint/lib/rules/no-unexpected-multiline\">;\n}\ndeclare module \"eslint/lib/rules/no-unmodified-loop-condition.js\" {\n  declare module.exports: $Exports<\n    \"eslint/lib/rules/no-unmodified-loop-condition\",\n  >;\n}\ndeclare module \"eslint/lib/rules/no-unneeded-ternary.js\" {\n  declare module.exports: $Exports<\"eslint/lib/rules/no-unneeded-ternary\">;\n}\ndeclare module \"eslint/lib/rules/no-unreachable.js\" {\n  declare module.exports: $Exports<\"eslint/lib/rules/no-unreachable\">;\n}\ndeclare module \"eslint/lib/rules/no-unsafe-finally.js\" {\n  declare module.exports: $Exports<\"eslint/lib/rules/no-unsafe-finally\">;\n}\ndeclare module \"eslint/lib/rules/no-unsafe-negation.js\" {\n  declare module.exports: $Exports<\"eslint/lib/rules/no-unsafe-negation\">;\n}\ndeclare module \"eslint/lib/rules/no-unused-expressions.js\" {\n  declare module.exports: $Exports<\"eslint/lib/rules/no-unused-expressions\">;\n}\ndeclare module \"eslint/lib/rules/no-unused-labels.js\" {\n  declare module.exports: $Exports<\"eslint/lib/rules/no-unused-labels\">;\n}\ndeclare module \"eslint/lib/rules/no-unused-vars.js\" {\n  declare module.exports: $Exports<\"eslint/lib/rules/no-unused-vars\">;\n}\ndeclare module \"eslint/lib/rules/no-use-before-define.js\" {\n  declare module.exports: $Exports<\"eslint/lib/rules/no-use-before-define\">;\n}\ndeclare module \"eslint/lib/rules/no-useless-call.js\" {\n  declare module.exports: $Exports<\"eslint/lib/rules/no-useless-call\">;\n}\ndeclare module \"eslint/lib/rules/no-useless-computed-key.js\" {\n  declare module.exports: $Exports<\"eslint/lib/rules/no-useless-computed-key\">;\n}\ndeclare module \"eslint/lib/rules/no-useless-concat.js\" {\n  declare module.exports: $Exports<\"eslint/lib/rules/no-useless-concat\">;\n}\ndeclare module \"eslint/lib/rules/no-useless-constructor.js\" {\n  declare module.exports: $Exports<\"eslint/lib/rules/no-useless-constructor\">;\n}\ndeclare module \"eslint/lib/rules/no-useless-escape.js\" {\n  declare module.exports: $Exports<\"eslint/lib/rules/no-useless-escape\">;\n}\ndeclare module \"eslint/lib/rules/no-useless-rename.js\" {\n  declare module.exports: $Exports<\"eslint/lib/rules/no-useless-rename\">;\n}\ndeclare module \"eslint/lib/rules/no-useless-return.js\" {\n  declare module.exports: $Exports<\"eslint/lib/rules/no-useless-return\">;\n}\ndeclare module \"eslint/lib/rules/no-var.js\" {\n  declare module.exports: $Exports<\"eslint/lib/rules/no-var\">;\n}\ndeclare module \"eslint/lib/rules/no-void.js\" {\n  declare module.exports: $Exports<\"eslint/lib/rules/no-void\">;\n}\ndeclare module \"eslint/lib/rules/no-warning-comments.js\" {\n  declare module.exports: $Exports<\"eslint/lib/rules/no-warning-comments\">;\n}\ndeclare module \"eslint/lib/rules/no-whitespace-before-property.js\" {\n  declare module.exports: $Exports<\n    \"eslint/lib/rules/no-whitespace-before-property\",\n  >;\n}\ndeclare module \"eslint/lib/rules/no-with.js\" {\n  declare module.exports: $Exports<\"eslint/lib/rules/no-with\">;\n}\ndeclare module \"eslint/lib/rules/nonblock-statement-body-position.js\" {\n  declare module.exports: $Exports<\n    \"eslint/lib/rules/nonblock-statement-body-position\",\n  >;\n}\ndeclare module \"eslint/lib/rules/object-curly-newline.js\" {\n  declare module.exports: $Exports<\"eslint/lib/rules/object-curly-newline\">;\n}\ndeclare module \"eslint/lib/rules/object-curly-spacing.js\" {\n  declare module.exports: $Exports<\"eslint/lib/rules/object-curly-spacing\">;\n}\ndeclare module \"eslint/lib/rules/object-property-newline.js\" {\n  declare module.exports: $Exports<\"eslint/lib/rules/object-property-newline\">;\n}\ndeclare module \"eslint/lib/rules/object-shorthand.js\" {\n  declare module.exports: $Exports<\"eslint/lib/rules/object-shorthand\">;\n}\ndeclare module \"eslint/lib/rules/one-var-declaration-per-line.js\" {\n  declare module.exports: $Exports<\n    \"eslint/lib/rules/one-var-declaration-per-line\",\n  >;\n}\ndeclare module \"eslint/lib/rules/one-var.js\" {\n  declare module.exports: $Exports<\"eslint/lib/rules/one-var\">;\n}\ndeclare module \"eslint/lib/rules/operator-assignment.js\" {\n  declare module.exports: $Exports<\"eslint/lib/rules/operator-assignment\">;\n}\ndeclare module \"eslint/lib/rules/operator-linebreak.js\" {\n  declare module.exports: $Exports<\"eslint/lib/rules/operator-linebreak\">;\n}\ndeclare module \"eslint/lib/rules/padded-blocks.js\" {\n  declare module.exports: $Exports<\"eslint/lib/rules/padded-blocks\">;\n}\ndeclare module \"eslint/lib/rules/padding-line-between-statements.js\" {\n  declare module.exports: $Exports<\n    \"eslint/lib/rules/padding-line-between-statements\",\n  >;\n}\ndeclare module \"eslint/lib/rules/prefer-arrow-callback.js\" {\n  declare module.exports: $Exports<\"eslint/lib/rules/prefer-arrow-callback\">;\n}\ndeclare module \"eslint/lib/rules/prefer-const.js\" {\n  declare module.exports: $Exports<\"eslint/lib/rules/prefer-const\">;\n}\ndeclare module \"eslint/lib/rules/prefer-destructuring.js\" {\n  declare module.exports: $Exports<\"eslint/lib/rules/prefer-destructuring\">;\n}\ndeclare module \"eslint/lib/rules/prefer-numeric-literals.js\" {\n  declare module.exports: $Exports<\"eslint/lib/rules/prefer-numeric-literals\">;\n}\ndeclare module \"eslint/lib/rules/prefer-object-spread.js\" {\n  declare module.exports: $Exports<\"eslint/lib/rules/prefer-object-spread\">;\n}\ndeclare module \"eslint/lib/rules/prefer-promise-reject-errors.js\" {\n  declare module.exports: $Exports<\n    \"eslint/lib/rules/prefer-promise-reject-errors\",\n  >;\n}\ndeclare module \"eslint/lib/rules/prefer-reflect.js\" {\n  declare module.exports: $Exports<\"eslint/lib/rules/prefer-reflect\">;\n}\ndeclare module \"eslint/lib/rules/prefer-rest-params.js\" {\n  declare module.exports: $Exports<\"eslint/lib/rules/prefer-rest-params\">;\n}\ndeclare module \"eslint/lib/rules/prefer-spread.js\" {\n  declare module.exports: $Exports<\"eslint/lib/rules/prefer-spread\">;\n}\ndeclare module \"eslint/lib/rules/prefer-template.js\" {\n  declare module.exports: $Exports<\"eslint/lib/rules/prefer-template\">;\n}\ndeclare module \"eslint/lib/rules/quote-props.js\" {\n  declare module.exports: $Exports<\"eslint/lib/rules/quote-props\">;\n}\ndeclare module \"eslint/lib/rules/quotes.js\" {\n  declare module.exports: $Exports<\"eslint/lib/rules/quotes\">;\n}\ndeclare module \"eslint/lib/rules/radix.js\" {\n  declare module.exports: $Exports<\"eslint/lib/rules/radix\">;\n}\ndeclare module \"eslint/lib/rules/require-atomic-updates.js\" {\n  declare module.exports: $Exports<\"eslint/lib/rules/require-atomic-updates\">;\n}\ndeclare module \"eslint/lib/rules/require-await.js\" {\n  declare module.exports: $Exports<\"eslint/lib/rules/require-await\">;\n}\ndeclare module \"eslint/lib/rules/require-jsdoc.js\" {\n  declare module.exports: $Exports<\"eslint/lib/rules/require-jsdoc\">;\n}\ndeclare module \"eslint/lib/rules/require-unicode-regexp.js\" {\n  declare module.exports: $Exports<\"eslint/lib/rules/require-unicode-regexp\">;\n}\ndeclare module \"eslint/lib/rules/require-yield.js\" {\n  declare module.exports: $Exports<\"eslint/lib/rules/require-yield\">;\n}\ndeclare module \"eslint/lib/rules/rest-spread-spacing.js\" {\n  declare module.exports: $Exports<\"eslint/lib/rules/rest-spread-spacing\">;\n}\ndeclare module \"eslint/lib/rules/semi-spacing.js\" {\n  declare module.exports: $Exports<\"eslint/lib/rules/semi-spacing\">;\n}\ndeclare module \"eslint/lib/rules/semi-style.js\" {\n  declare module.exports: $Exports<\"eslint/lib/rules/semi-style\">;\n}\ndeclare module \"eslint/lib/rules/semi.js\" {\n  declare module.exports: $Exports<\"eslint/lib/rules/semi\">;\n}\ndeclare module \"eslint/lib/rules/sort-imports.js\" {\n  declare module.exports: $Exports<\"eslint/lib/rules/sort-imports\">;\n}\ndeclare module \"eslint/lib/rules/sort-keys.js\" {\n  declare module.exports: $Exports<\"eslint/lib/rules/sort-keys\">;\n}\ndeclare module \"eslint/lib/rules/sort-vars.js\" {\n  declare module.exports: $Exports<\"eslint/lib/rules/sort-vars\">;\n}\ndeclare module \"eslint/lib/rules/space-before-blocks.js\" {\n  declare module.exports: $Exports<\"eslint/lib/rules/space-before-blocks\">;\n}\ndeclare module \"eslint/lib/rules/space-before-function-paren.js\" {\n  declare module.exports: $Exports<\n    \"eslint/lib/rules/space-before-function-paren\",\n  >;\n}\ndeclare module \"eslint/lib/rules/space-in-parens.js\" {\n  declare module.exports: $Exports<\"eslint/lib/rules/space-in-parens\">;\n}\ndeclare module \"eslint/lib/rules/space-infix-ops.js\" {\n  declare module.exports: $Exports<\"eslint/lib/rules/space-infix-ops\">;\n}\ndeclare module \"eslint/lib/rules/space-unary-ops.js\" {\n  declare module.exports: $Exports<\"eslint/lib/rules/space-unary-ops\">;\n}\ndeclare module \"eslint/lib/rules/spaced-comment.js\" {\n  declare module.exports: $Exports<\"eslint/lib/rules/spaced-comment\">;\n}\ndeclare module \"eslint/lib/rules/strict.js\" {\n  declare module.exports: $Exports<\"eslint/lib/rules/strict\">;\n}\ndeclare module \"eslint/lib/rules/switch-colon-spacing.js\" {\n  declare module.exports: $Exports<\"eslint/lib/rules/switch-colon-spacing\">;\n}\ndeclare module \"eslint/lib/rules/symbol-description.js\" {\n  declare module.exports: $Exports<\"eslint/lib/rules/symbol-description\">;\n}\ndeclare module \"eslint/lib/rules/template-curly-spacing.js\" {\n  declare module.exports: $Exports<\"eslint/lib/rules/template-curly-spacing\">;\n}\ndeclare module \"eslint/lib/rules/template-tag-spacing.js\" {\n  declare module.exports: $Exports<\"eslint/lib/rules/template-tag-spacing\">;\n}\ndeclare module \"eslint/lib/rules/unicode-bom.js\" {\n  declare module.exports: $Exports<\"eslint/lib/rules/unicode-bom\">;\n}\ndeclare module \"eslint/lib/rules/use-isnan.js\" {\n  declare module.exports: $Exports<\"eslint/lib/rules/use-isnan\">;\n}\ndeclare module \"eslint/lib/rules/valid-jsdoc.js\" {\n  declare module.exports: $Exports<\"eslint/lib/rules/valid-jsdoc\">;\n}\ndeclare module \"eslint/lib/rules/valid-typeof.js\" {\n  declare module.exports: $Exports<\"eslint/lib/rules/valid-typeof\">;\n}\ndeclare module \"eslint/lib/rules/vars-on-top.js\" {\n  declare module.exports: $Exports<\"eslint/lib/rules/vars-on-top\">;\n}\ndeclare module \"eslint/lib/rules/wrap-iife.js\" {\n  declare module.exports: $Exports<\"eslint/lib/rules/wrap-iife\">;\n}\ndeclare module \"eslint/lib/rules/wrap-regex.js\" {\n  declare module.exports: $Exports<\"eslint/lib/rules/wrap-regex\">;\n}\ndeclare module \"eslint/lib/rules/yield-star-spacing.js\" {\n  declare module.exports: $Exports<\"eslint/lib/rules/yield-star-spacing\">;\n}\ndeclare module \"eslint/lib/rules/yoda.js\" {\n  declare module.exports: $Exports<\"eslint/lib/rules/yoda\">;\n}\ndeclare module \"eslint/lib/testers/rule-tester.js\" {\n  declare module.exports: $Exports<\"eslint/lib/testers/rule-tester\">;\n}\ndeclare module \"eslint/lib/token-store/backward-token-comment-cursor.js\" {\n  declare module.exports: $Exports<\n    \"eslint/lib/token-store/backward-token-comment-cursor\",\n  >;\n}\ndeclare module \"eslint/lib/token-store/backward-token-cursor.js\" {\n  declare module.exports: $Exports<\n    \"eslint/lib/token-store/backward-token-cursor\",\n  >;\n}\ndeclare module \"eslint/lib/token-store/cursor.js\" {\n  declare module.exports: $Exports<\"eslint/lib/token-store/cursor\">;\n}\ndeclare module \"eslint/lib/token-store/cursors.js\" {\n  declare module.exports: $Exports<\"eslint/lib/token-store/cursors\">;\n}\ndeclare module \"eslint/lib/token-store/decorative-cursor.js\" {\n  declare module.exports: $Exports<\"eslint/lib/token-store/decorative-cursor\">;\n}\ndeclare module \"eslint/lib/token-store/filter-cursor.js\" {\n  declare module.exports: $Exports<\"eslint/lib/token-store/filter-cursor\">;\n}\ndeclare module \"eslint/lib/token-store/forward-token-comment-cursor.js\" {\n  declare module.exports: $Exports<\n    \"eslint/lib/token-store/forward-token-comment-cursor\",\n  >;\n}\ndeclare module \"eslint/lib/token-store/forward-token-cursor.js\" {\n  declare module.exports: $Exports<\n    \"eslint/lib/token-store/forward-token-cursor\",\n  >;\n}\ndeclare module \"eslint/lib/token-store/index.js\" {\n  declare module.exports: $Exports<\"eslint/lib/token-store/index\">;\n}\ndeclare module \"eslint/lib/token-store/limit-cursor.js\" {\n  declare module.exports: $Exports<\"eslint/lib/token-store/limit-cursor\">;\n}\ndeclare module \"eslint/lib/token-store/padded-token-cursor.js\" {\n  declare module.exports: $Exports<\n    \"eslint/lib/token-store/padded-token-cursor\",\n  >;\n}\ndeclare module \"eslint/lib/token-store/skip-cursor.js\" {\n  declare module.exports: $Exports<\"eslint/lib/token-store/skip-cursor\">;\n}\ndeclare module \"eslint/lib/token-store/utils.js\" {\n  declare module.exports: $Exports<\"eslint/lib/token-store/utils\">;\n}\ndeclare module \"eslint/lib/util/ajv.js\" {\n  declare module.exports: $Exports<\"eslint/lib/util/ajv\">;\n}\ndeclare module \"eslint/lib/util/apply-disable-directives.js\" {\n  declare module.exports: $Exports<\"eslint/lib/util/apply-disable-directives\">;\n}\ndeclare module \"eslint/lib/util/ast-utils.js\" {\n  declare module.exports: $Exports<\"eslint/lib/util/ast-utils\">;\n}\ndeclare module \"eslint/lib/util/file-finder.js\" {\n  declare module.exports: $Exports<\"eslint/lib/util/file-finder\">;\n}\ndeclare module \"eslint/lib/util/fix-tracker.js\" {\n  declare module.exports: $Exports<\"eslint/lib/util/fix-tracker\">;\n}\ndeclare module \"eslint/lib/util/glob-utils.js\" {\n  declare module.exports: $Exports<\"eslint/lib/util/glob-utils\">;\n}\ndeclare module \"eslint/lib/util/glob.js\" {\n  declare module.exports: $Exports<\"eslint/lib/util/glob\">;\n}\ndeclare module \"eslint/lib/util/hash.js\" {\n  declare module.exports: $Exports<\"eslint/lib/util/hash\">;\n}\ndeclare module \"eslint/lib/util/interpolate.js\" {\n  declare module.exports: $Exports<\"eslint/lib/util/interpolate\">;\n}\ndeclare module \"eslint/lib/util/keywords.js\" {\n  declare module.exports: $Exports<\"eslint/lib/util/keywords\">;\n}\ndeclare module \"eslint/lib/util/lint-result-cache.js\" {\n  declare module.exports: $Exports<\"eslint/lib/util/lint-result-cache\">;\n}\ndeclare module \"eslint/lib/util/logging.js\" {\n  declare module.exports: $Exports<\"eslint/lib/util/logging\">;\n}\ndeclare module \"eslint/lib/util/module-resolver.js\" {\n  declare module.exports: $Exports<\"eslint/lib/util/module-resolver\">;\n}\ndeclare module \"eslint/lib/util/naming.js\" {\n  declare module.exports: $Exports<\"eslint/lib/util/naming\">;\n}\ndeclare module \"eslint/lib/util/node-event-generator.js\" {\n  declare module.exports: $Exports<\"eslint/lib/util/node-event-generator\">;\n}\ndeclare module \"eslint/lib/util/npm-utils.js\" {\n  declare module.exports: $Exports<\"eslint/lib/util/npm-utils\">;\n}\ndeclare module \"eslint/lib/util/path-utils.js\" {\n  declare module.exports: $Exports<\"eslint/lib/util/path-utils\">;\n}\ndeclare module \"eslint/lib/util/patterns/letters.js\" {\n  declare module.exports: $Exports<\"eslint/lib/util/patterns/letters\">;\n}\ndeclare module \"eslint/lib/util/rule-fixer.js\" {\n  declare module.exports: $Exports<\"eslint/lib/util/rule-fixer\">;\n}\ndeclare module \"eslint/lib/util/safe-emitter.js\" {\n  declare module.exports: $Exports<\"eslint/lib/util/safe-emitter\">;\n}\ndeclare module \"eslint/lib/util/source-code-fixer.js\" {\n  declare module.exports: $Exports<\"eslint/lib/util/source-code-fixer\">;\n}\ndeclare module \"eslint/lib/util/source-code-utils.js\" {\n  declare module.exports: $Exports<\"eslint/lib/util/source-code-utils\">;\n}\ndeclare module \"eslint/lib/util/source-code.js\" {\n  declare module.exports: $Exports<\"eslint/lib/util/source-code\">;\n}\ndeclare module \"eslint/lib/util/timing.js\" {\n  declare module.exports: $Exports<\"eslint/lib/util/timing\">;\n}\ndeclare module \"eslint/lib/util/traverser.js\" {\n  declare module.exports: $Exports<\"eslint/lib/util/traverser\">;\n}\ndeclare module \"eslint/lib/util/unicode/index.js\" {\n  declare module.exports: $Exports<\"eslint/lib/util/unicode/index\">;\n}\ndeclare module \"eslint/lib/util/unicode/is-combining-character.js\" {\n  declare module.exports: $Exports<\n    \"eslint/lib/util/unicode/is-combining-character\",\n  >;\n}\ndeclare module \"eslint/lib/util/unicode/is-emoji-modifier.js\" {\n  declare module.exports: $Exports<\"eslint/lib/util/unicode/is-emoji-modifier\">;\n}\ndeclare module \"eslint/lib/util/unicode/is-regional-indicator-symbol.js\" {\n  declare module.exports: $Exports<\n    \"eslint/lib/util/unicode/is-regional-indicator-symbol\",\n  >;\n}\ndeclare module \"eslint/lib/util/unicode/is-surrogate-pair.js\" {\n  declare module.exports: $Exports<\"eslint/lib/util/unicode/is-surrogate-pair\">;\n}\ndeclare module \"eslint/lib/util/xml-escape.js\" {\n  declare module.exports: $Exports<\"eslint/lib/util/xml-escape\">;\n}\n"
  },
  {
    "path": "flow-typed/npm/express_v4.x.x.js",
    "content": "import * as http from \"http\";\nimport type { Socket } from \"net\";\n\ndeclare type express$RouterOptions = {\n  caseSensitive?: boolean,\n  mergeParams?: boolean,\n  strict?: boolean,\n};\n\ndeclare class express$RequestResponseBase {\n  app: express$Application;\n  get(field: string): string | void;\n}\n\ndeclare type express$RequestParams = {\n  [param: string]: string,\n};\n\ndeclare class express$Request extends http$IncomingMessage\n  mixins express$RequestResponseBase {\n  baseUrl: string;\n  body: mixed;\n  cookies: { [cookie: string]: string };\n  connection: Socket;\n  fresh: boolean;\n  hostname: string;\n  ip: string;\n  ips: Array<string>;\n  method: string;\n  originalUrl: string;\n  params: express$RequestParams;\n  path: string;\n  protocol: \"https\" | \"http\";\n  query: { [name: string]: string | Array<string> };\n  route: string;\n  secure: boolean;\n  signedCookies: { [signedCookie: string]: string };\n  stale: boolean;\n  subdomains: Array<string>;\n  xhr: boolean;\n  accepts(types: string): string | false;\n  accepts(types: Array<string>): string | false;\n  acceptsCharsets(...charsets: Array<string>): string | false;\n  acceptsEncodings(...encoding: Array<string>): string | false;\n  acceptsLanguages(...lang: Array<string>): string | false;\n  header(field: string): string | void;\n  is(type: string): boolean;\n  param(name: string, defaultValue?: string): string | void;\n}\n\ndeclare type express$CookieOptions = {\n  domain?: string,\n  encode?: (value: string) => string,\n  expires?: Date,\n  httpOnly?: boolean,\n  maxAge?: number,\n  path?: string,\n  secure?: boolean,\n  signed?: boolean,\n};\n\ndeclare type express$Path = string | RegExp;\n\ndeclare type express$RenderCallback = (\n  err: Error | null,\n  html?: string,\n) => mixed;\n\ndeclare type express$SendFileOptions = {\n  maxAge?: number,\n  root?: string,\n  lastModified?: boolean,\n  headers?: { [name: string]: string },\n  dotfiles?: \"allow\" | \"deny\" | \"ignore\",\n};\n\ndeclare class express$Response extends http$ServerResponse\n  mixins express$RequestResponseBase {\n  headersSent: boolean;\n  locals: { [name: string]: mixed };\n  append(field: string, value?: string): this;\n  attachment(filename?: string): this;\n  cookie(name: string, value: string, options?: express$CookieOptions): this;\n  clearCookie(name: string, options?: express$CookieOptions): this;\n  download(\n    path: string,\n    filename?: string,\n    callback?: (err?: ?Error) => void,\n  ): this;\n  format(typesObject: { [type: string]: Function }): this;\n  json(body?: mixed): this;\n  jsonp(body?: mixed): this;\n  links(links: { [name: string]: string }): this;\n  location(path: string): this;\n  redirect(url: string, ...args: Array<void>): this;\n  redirect(status: number, url: string, ...args: Array<void>): this;\n  render(\n    view: string,\n    locals?: { [name: string]: mixed },\n    callback?: express$RenderCallback,\n  ): this;\n  send(body?: mixed): this;\n  sendFile(\n    path: string,\n    options?: express$SendFileOptions,\n    callback?: (err?: ?Error) => mixed,\n  ): this;\n  sendStatus(statusCode: number): this;\n  header(field: string, value?: string): this;\n  header(headers: { [name: string]: string }): this;\n  set(field: string, value?: string | string[]): this;\n  set(headers: { [name: string]: string }): this;\n  status(statusCode: number): this;\n  type(type: string): this;\n  vary(field: string): this;\n  req: express$Request;\n}\n\ndeclare type express$NextFunction = (err?: ?Error | \"route\") => mixed;\ndeclare type express$Middleware =\n  | ((\n      req: $Subtype<express$Request>,\n      res: express$Response,\n      next: express$NextFunction,\n    ) => mixed)\n  | ((\n      error: Error,\n      req: $Subtype<express$Request>,\n      res: express$Response,\n      next: express$NextFunction,\n    ) => mixed);\ndeclare interface express$RouteMethodType<T> {\n  (middleware: express$Middleware): T;\n  (...middleware: Array<express$Middleware>): T;\n  (\n    path: express$Path | express$Path[],\n    ...middleware: Array<express$Middleware>\n  ): T;\n}\ndeclare class express$Route {\n  all: express$RouteMethodType<this>;\n  get: express$RouteMethodType<this>;\n  post: express$RouteMethodType<this>;\n  put: express$RouteMethodType<this>;\n  head: express$RouteMethodType<this>;\n  delete: express$RouteMethodType<this>;\n  options: express$RouteMethodType<this>;\n  trace: express$RouteMethodType<this>;\n  copy: express$RouteMethodType<this>;\n  lock: express$RouteMethodType<this>;\n  mkcol: express$RouteMethodType<this>;\n  move: express$RouteMethodType<this>;\n  purge: express$RouteMethodType<this>;\n  propfind: express$RouteMethodType<this>;\n  proppatch: express$RouteMethodType<this>;\n  unlock: express$RouteMethodType<this>;\n  report: express$RouteMethodType<this>;\n  mkactivity: express$RouteMethodType<this>;\n  checkout: express$RouteMethodType<this>;\n  merge: express$RouteMethodType<this>;\n\n  // @TODO Missing 'm-search' but get flow illegal name error.\n\n  notify: express$RouteMethodType<this>;\n  subscribe: express$RouteMethodType<this>;\n  unsubscribe: express$RouteMethodType<this>;\n  patch: express$RouteMethodType<this>;\n  search: express$RouteMethodType<this>;\n  connect: express$RouteMethodType<this>;\n}\n\ndeclare class express$Router extends express$Route {\n  constructor(options?: express$RouterOptions): void;\n  route(path: string): express$Route;\n  static (options?: express$RouterOptions): express$Router;\n  use(middleware: express$Middleware): this;\n  use(...middleware: Array<express$Middleware>): this;\n  use(\n    path: express$Path | express$Path[],\n    ...middleware: Array<express$Middleware>\n  ): this;\n  use(path: string, router: express$Router): this;\n  handle(\n    req: http$IncomingMessage,\n    res: http$ServerResponse,\n    next: express$NextFunction,\n  ): void;\n  param(\n    param: string,\n    callback: (\n      req: $Subtype<express$Request>,\n      res: express$Response,\n      next: express$NextFunction,\n      id: string,\n    ) => mixed,\n  ): void;\n  (\n    req: http$IncomingMessage,\n    res: http$ServerResponse,\n    next?: ?express$NextFunction,\n  ): void;\n}\n\n/*\nWith flow-bin ^0.59, express app.listen() is deemed to return any and fails flow type coverage.\nWhich is ironic because https://github.com/facebook/flow/blob/master/Changelog.md#misc-2 (release notes for 0.59)\nsays \"Improves typings for Node.js HTTP server listen() function.\"  See that?  IMPROVES!\nTo work around this issue, we changed Server to ?Server here, so that our invocations of express.listen() will\nnot be deemed to lack type coverage.\n*/\n\ndeclare class express$Application extends express$Router\n  mixins events$EventEmitter {\n  constructor(): void;\n  locals: { [name: string]: mixed };\n  mountpath: string;\n  listen(\n    port: number,\n    hostname?: string,\n    backlog?: number,\n    callback?: (err?: ?Error) => mixed,\n  ): ?http.Server;\n  listen(\n    port: number,\n    hostname?: string,\n    callback?: (err?: ?Error) => mixed,\n  ): ?http.Server;\n  listen(port: number, callback?: (err?: ?Error) => mixed): ?http.Server;\n  listen(path: string, callback?: (err?: ?Error) => mixed): ?http.Server;\n  listen(handle: Object, callback?: (err?: ?Error) => mixed): ?http.Server;\n  disable(name: string): void;\n  disabled(name: string): boolean;\n  enable(name: string): express$Application;\n  enabled(name: string): boolean;\n  engine(name: string, callback: Function): void;\n  /**\n   * Mixed will not be taken as a value option. Issue around using the GET http method name and the get for settings.\n   */\n  //   get(name: string): mixed;\n  set(name: string, value: mixed): mixed;\n  render(\n    name: string,\n    optionsOrFunction: { [name: string]: mixed },\n    callback: express$RenderCallback,\n  ): void;\n  handle(\n    req: http$IncomingMessage,\n    res: http$ServerResponse,\n    next?: ?express$NextFunction,\n  ): void;\n  // callable signature is not inherited\n  (\n    req: http$IncomingMessage,\n    res: http$ServerResponse,\n    next?: ?express$NextFunction,\n  ): void;\n}\n\ndeclare type JsonOptions = {\n  inflate?: boolean,\n  limit?: string | number,\n  reviver?: (key: string, value: mixed) => mixed,\n  strict?: boolean,\n  type?: string | Array<string> | ((req: express$Request) => boolean),\n  verify?: (\n    req: express$Request,\n    res: express$Response,\n    buf: Buffer,\n    encoding: string,\n  ) => mixed,\n};\n\ndeclare type express$UrlEncodedOptions = {\n  extended?: boolean,\n  inflate?: boolean,\n  limit?: string | number,\n  parameterLimit?: number,\n  type?: string | Array<string> | ((req: express$Request) => boolean),\n  verify?: (\n    req: express$Request,\n    res: express$Response,\n    buf: Buffer,\n    encoding: string,\n  ) => mixed,\n};\n\ndeclare module \"express\" {\n  declare export type RouterOptions = express$RouterOptions;\n  declare export type CookieOptions = express$CookieOptions;\n  declare export type Middleware = express$Middleware;\n  declare export type NextFunction = express$NextFunction;\n  declare export type RequestParams = express$RequestParams;\n  declare export type $Response = express$Response;\n  declare export type $Request = express$Request;\n  declare export type $Application = express$Application;\n\n  declare module.exports: {\n    (): express$Application, // If you try to call like a function, it will use this signature\n    json: (opts: ?JsonOptions) => express$Middleware,\n    static: (root: string, options?: Object) => express$Middleware, // `static` property on the function\n    Router: typeof express$Router, // `Router` property on the function\n    urlencoded: (opts: ?express$UrlEncodedOptions) => express$Middleware,\n  };\n}\n"
  },
  {
    "path": "flow-typed/npm/flow-bin_v0.x.x.js",
    "content": "// flow-typed signature: 6a5610678d4b01e13bbfbbc62bdaf583\n// flow-typed version: 3817bc6980/flow-bin_v0.x.x/flow_>=v0.25.x\n\ndeclare module \"flow-bin\" {\n  declare module.exports: string;\n}\n"
  },
  {
    "path": "flow-typed/npm/get-port_vx.x.x.js",
    "content": "// flow-typed signature: 786772ba7faa8bb08a34713f36b54613\n// flow-typed version: <<STUB>>/get-port_v2/flow_v0.68.0\n\n/**\n * This is an autogenerated libdef stub for:\n *\n *   'get-port'\n *\n * Fill this stub out by replacing all the `any` types.\n *\n * Once filled out, we encourage you to share your work with the\n * community by sending a pull request to:\n * https://github.com/flowtype/flow-typed\n */\n\ndeclare module \"get-port\" {\n  declare module.exports: any;\n}\n\n/**\n * We include stubs for each file inside this npm package in case you need to\n * require those files directly. Feel free to delete any files that aren't\n * needed.\n */\n\n// Filename aliases\ndeclare module \"get-port/index\" {\n  declare module.exports: $Exports<\"get-port\">;\n}\ndeclare module \"get-port/index.js\" {\n  declare module.exports: $Exports<\"get-port\">;\n}\n"
  },
  {
    "path": "flow-typed/npm/git-exec-and-restage_vx.x.x.js",
    "content": "// flow-typed signature: 98a9fe7ccb051a9597b6ba2753e9d302\n// flow-typed version: <<STUB>>/git-exec-and-restage_v^1.0.1/flow_v0.87.0\n\n/**\n * This is an autogenerated libdef stub for:\n *\n *   'git-exec-and-restage'\n *\n * Fill this stub out by replacing all the `any` types.\n *\n * Once filled out, we encourage you to share your work with the\n * community by sending a pull request to:\n * https://github.com/flowtype/flow-typed\n */\n\ndeclare module \"git-exec-and-restage\" {\n  declare module.exports: any;\n}\n\n/**\n * We include stubs for each file inside this npm package in case you need to\n * require those files directly. Feel free to delete any files that aren't\n * needed.\n */\ndeclare module \"git-exec-and-restage/dist/CliError\" {\n  declare module.exports: any;\n}\n\ndeclare module \"git-exec-and-restage/dist/gitUtils\" {\n  declare module.exports: any;\n}\n\ndeclare module \"git-exec-and-restage/dist/index\" {\n  declare module.exports: any;\n}\n\ndeclare module \"git-exec-and-restage/dist/polyfills\" {\n  declare module.exports: any;\n}\n\n// Filename aliases\ndeclare module \"git-exec-and-restage/dist/CliError.js\" {\n  declare module.exports: $Exports<\"git-exec-and-restage/dist/CliError\">;\n}\ndeclare module \"git-exec-and-restage/dist/gitUtils.js\" {\n  declare module.exports: $Exports<\"git-exec-and-restage/dist/gitUtils\">;\n}\ndeclare module \"git-exec-and-restage/dist/index.js\" {\n  declare module.exports: $Exports<\"git-exec-and-restage/dist/index\">;\n}\ndeclare module \"git-exec-and-restage/dist/polyfills.js\" {\n  declare module.exports: $Exports<\"git-exec-and-restage/dist/polyfills\">;\n}\n"
  },
  {
    "path": "flow-typed/npm/glamor_vx.x.x.js",
    "content": "// flow-typed signature: 30f3e89638978a54c56f2c9e8f161531\n// flow-typed version: <<STUB>>/glamor_v2/flow_v0.68.0\n\n/**\n * This is an autogenerated libdef stub for:\n *\n *   'glamor'\n *\n * Fill this stub out by replacing all the `any` types.\n *\n * Once filled out, we encourage you to share your work with the\n * community by sending a pull request to:\n * https://github.com/flowtype/flow-typed\n */\n\ndeclare module \"glamor\" {\n  declare module.exports: any;\n}\n\n/**\n * We include stubs for each file inside this npm package in case you need to\n * require those files directly. Feel free to delete any files that aren't\n * needed.\n */\ndeclare module \"glamor/aphrodite\" {\n  declare module.exports: any;\n}\n\ndeclare module \"glamor/babel-hoist\" {\n  declare module.exports: any;\n}\n\ndeclare module \"glamor/babel\" {\n  declare module.exports: any;\n}\n\ndeclare module \"glamor/inline\" {\n  declare module.exports: any;\n}\n\ndeclare module \"glamor/jsxstyle\" {\n  declare module.exports: any;\n}\n\ndeclare module \"glamor/lib/aphrodite\" {\n  declare module.exports: any;\n}\n\ndeclare module \"glamor/lib/babel-hoist\" {\n  declare module.exports: any;\n}\n\ndeclare module \"glamor/lib/clean\" {\n  declare module.exports: any;\n}\n\ndeclare module \"glamor/lib/css/babel\" {\n  declare module.exports: any;\n}\n\ndeclare module \"glamor/lib/css/raw\" {\n  declare module.exports: any;\n}\n\ndeclare module \"glamor/lib/css/spec\" {\n  declare module.exports: any;\n}\n\ndeclare module \"glamor/lib/CSSPropertyOperations/CSSProperty\" {\n  declare module.exports: any;\n}\n\ndeclare module \"glamor/lib/CSSPropertyOperations/dangerousStyleValue\" {\n  declare module.exports: any;\n}\n\ndeclare module \"glamor/lib/CSSPropertyOperations/index\" {\n  declare module.exports: any;\n}\n\ndeclare module \"glamor/lib/hash\" {\n  declare module.exports: any;\n}\n\ndeclare module \"glamor/lib/index\" {\n  declare module.exports: any;\n}\n\ndeclare module \"glamor/lib/inline\" {\n  declare module.exports: any;\n}\n\ndeclare module \"glamor/lib/jsxstyle\" {\n  declare module.exports: any;\n}\n\ndeclare module \"glamor/lib/ous\" {\n  declare module.exports: any;\n}\n\ndeclare module \"glamor/lib/plugins\" {\n  declare module.exports: any;\n}\n\ndeclare module \"glamor/lib/prefixer\" {\n  declare module.exports: any;\n}\n\ndeclare module \"glamor/lib/react\" {\n  declare module.exports: any;\n}\n\ndeclare module \"glamor/lib/reset\" {\n  declare module.exports: any;\n}\n\ndeclare module \"glamor/lib/server\" {\n  declare module.exports: any;\n}\n\ndeclare module \"glamor/lib/sheet\" {\n  declare module.exports: any;\n}\n\ndeclare module \"glamor/lib/styled/index\" {\n  declare module.exports: any;\n}\n\ndeclare module \"glamor/lib/utils\" {\n  declare module.exports: any;\n}\n\ndeclare module \"glamor/ous\" {\n  declare module.exports: any;\n}\n\ndeclare module \"glamor/react\" {\n  declare module.exports: any;\n}\n\ndeclare module \"glamor/reset\" {\n  declare module.exports: any;\n}\n\ndeclare module \"glamor/server\" {\n  declare module.exports: any;\n}\n\ndeclare module \"glamor/styled\" {\n  declare module.exports: any;\n}\n\ndeclare module \"glamor/umd/index\" {\n  declare module.exports: any;\n}\n\ndeclare module \"glamor/umd/index.min\" {\n  declare module.exports: any;\n}\n\ndeclare module \"glamor/utils\" {\n  declare module.exports: any;\n}\n\n// Filename aliases\ndeclare module \"glamor/aphrodite.js\" {\n  declare module.exports: $Exports<\"glamor/aphrodite\">;\n}\ndeclare module \"glamor/babel-hoist.js\" {\n  declare module.exports: $Exports<\"glamor/babel-hoist\">;\n}\ndeclare module \"glamor/babel.js\" {\n  declare module.exports: $Exports<\"glamor/babel\">;\n}\ndeclare module \"glamor/inline.js\" {\n  declare module.exports: $Exports<\"glamor/inline\">;\n}\ndeclare module \"glamor/jsxstyle.js\" {\n  declare module.exports: $Exports<\"glamor/jsxstyle\">;\n}\ndeclare module \"glamor/lib/aphrodite.js\" {\n  declare module.exports: $Exports<\"glamor/lib/aphrodite\">;\n}\ndeclare module \"glamor/lib/babel-hoist.js\" {\n  declare module.exports: $Exports<\"glamor/lib/babel-hoist\">;\n}\ndeclare module \"glamor/lib/clean.js\" {\n  declare module.exports: $Exports<\"glamor/lib/clean\">;\n}\ndeclare module \"glamor/lib/css/babel.js\" {\n  declare module.exports: $Exports<\"glamor/lib/css/babel\">;\n}\ndeclare module \"glamor/lib/css/raw.js\" {\n  declare module.exports: $Exports<\"glamor/lib/css/raw\">;\n}\ndeclare module \"glamor/lib/css/spec.js\" {\n  declare module.exports: $Exports<\"glamor/lib/css/spec\">;\n}\ndeclare module \"glamor/lib/CSSPropertyOperations/CSSProperty.js\" {\n  declare module.exports: $Exports<\n    \"glamor/lib/CSSPropertyOperations/CSSProperty\",\n  >;\n}\ndeclare module \"glamor/lib/CSSPropertyOperations/dangerousStyleValue.js\" {\n  declare module.exports: $Exports<\n    \"glamor/lib/CSSPropertyOperations/dangerousStyleValue\",\n  >;\n}\ndeclare module \"glamor/lib/CSSPropertyOperations/index.js\" {\n  declare module.exports: $Exports<\"glamor/lib/CSSPropertyOperations/index\">;\n}\ndeclare module \"glamor/lib/hash.js\" {\n  declare module.exports: $Exports<\"glamor/lib/hash\">;\n}\ndeclare module \"glamor/lib/index.js\" {\n  declare module.exports: $Exports<\"glamor/lib/index\">;\n}\ndeclare module \"glamor/lib/inline.js\" {\n  declare module.exports: $Exports<\"glamor/lib/inline\">;\n}\ndeclare module \"glamor/lib/jsxstyle.js\" {\n  declare module.exports: $Exports<\"glamor/lib/jsxstyle\">;\n}\ndeclare module \"glamor/lib/ous.js\" {\n  declare module.exports: $Exports<\"glamor/lib/ous\">;\n}\ndeclare module \"glamor/lib/plugins.js\" {\n  declare module.exports: $Exports<\"glamor/lib/plugins\">;\n}\ndeclare module \"glamor/lib/prefixer.js\" {\n  declare module.exports: $Exports<\"glamor/lib/prefixer\">;\n}\ndeclare module \"glamor/lib/react.js\" {\n  declare module.exports: $Exports<\"glamor/lib/react\">;\n}\ndeclare module \"glamor/lib/reset.js\" {\n  declare module.exports: $Exports<\"glamor/lib/reset\">;\n}\ndeclare module \"glamor/lib/server.js\" {\n  declare module.exports: $Exports<\"glamor/lib/server\">;\n}\ndeclare module \"glamor/lib/sheet.js\" {\n  declare module.exports: $Exports<\"glamor/lib/sheet\">;\n}\ndeclare module \"glamor/lib/styled/index.js\" {\n  declare module.exports: $Exports<\"glamor/lib/styled/index\">;\n}\ndeclare module \"glamor/lib/utils.js\" {\n  declare module.exports: $Exports<\"glamor/lib/utils\">;\n}\ndeclare module \"glamor/ous.js\" {\n  declare module.exports: $Exports<\"glamor/ous\">;\n}\ndeclare module \"glamor/react.js\" {\n  declare module.exports: $Exports<\"glamor/react\">;\n}\ndeclare module \"glamor/reset.js\" {\n  declare module.exports: $Exports<\"glamor/reset\">;\n}\ndeclare module \"glamor/server.js\" {\n  declare module.exports: $Exports<\"glamor/server\">;\n}\ndeclare module \"glamor/styled.js\" {\n  declare module.exports: $Exports<\"glamor/styled\">;\n}\ndeclare module \"glamor/umd/index.js\" {\n  declare module.exports: $Exports<\"glamor/umd/index\">;\n}\ndeclare module \"glamor/umd/index.min.js\" {\n  declare module.exports: $Exports<\"glamor/umd/index.min\">;\n}\ndeclare module \"glamor/utils.js\" {\n  declare module.exports: $Exports<\"glamor/utils\">;\n}\n"
  },
  {
    "path": "flow-typed/npm/glamorous_vx.x.x.js",
    "content": "// flow-typed signature: 433dc714344b18148f9dc98a56d05807\n// flow-typed version: <<STUB>>/glamorous_v4/flow_v0.68.0\n\n/**\n * This is an autogenerated libdef stub for:\n *\n *   'glamorous'\n *\n * Fill this stub out by replacing all the `any` types.\n *\n * Once filled out, we encourage you to share your work with the\n * community by sending a pull request to:\n * https://github.com/flowtype/flow-typed\n */\n\ndeclare module \"glamorous\" {\n  declare module.exports: any;\n}\n\n/**\n * We include stubs for each file inside this npm package in case you need to\n * require those files directly. Feel free to delete any files that aren't\n * needed.\n */\ndeclare module \"glamorous/dist/glamorous.cjs\" {\n  declare module.exports: any;\n}\n\ndeclare module \"glamorous/dist/glamorous.cjs.tiny\" {\n  declare module.exports: any;\n}\n\ndeclare module \"glamorous/dist/glamorous.esm\" {\n  declare module.exports: any;\n}\n\ndeclare module \"glamorous/dist/glamorous.esm.tiny\" {\n  declare module.exports: any;\n}\n\ndeclare module \"glamorous/dist/glamorous.umd\" {\n  declare module.exports: any;\n}\n\ndeclare module \"glamorous/dist/glamorous.umd.min\" {\n  declare module.exports: any;\n}\n\ndeclare module \"glamorous/dist/glamorous.umd.min.tiny\" {\n  declare module.exports: any;\n}\n\ndeclare module \"glamorous/dist/glamorous.umd.tiny\" {\n  declare module.exports: any;\n}\n\ndeclare module \"glamorous/preact/dist/glamorous.cjs\" {\n  declare module.exports: any;\n}\n\ndeclare module \"glamorous/preact/dist/glamorous.cjs.tiny\" {\n  declare module.exports: any;\n}\n\ndeclare module \"glamorous/preact/dist/glamorous.esm\" {\n  declare module.exports: any;\n}\n\ndeclare module \"glamorous/preact/dist/glamorous.esm.tiny\" {\n  declare module.exports: any;\n}\n\ndeclare module \"glamorous/preact/dist/glamorous.umd\" {\n  declare module.exports: any;\n}\n\ndeclare module \"glamorous/preact/dist/glamorous.umd.min\" {\n  declare module.exports: any;\n}\n\ndeclare module \"glamorous/preact/dist/glamorous.umd.min.tiny\" {\n  declare module.exports: any;\n}\n\ndeclare module \"glamorous/preact/dist/glamorous.umd.tiny\" {\n  declare module.exports: any;\n}\n\n// Filename aliases\ndeclare module \"glamorous/dist/glamorous.cjs.js\" {\n  declare module.exports: $Exports<\"glamorous/dist/glamorous.cjs\">;\n}\ndeclare module \"glamorous/dist/glamorous.cjs.tiny.js\" {\n  declare module.exports: $Exports<\"glamorous/dist/glamorous.cjs.tiny\">;\n}\ndeclare module \"glamorous/dist/glamorous.esm.js\" {\n  declare module.exports: $Exports<\"glamorous/dist/glamorous.esm\">;\n}\ndeclare module \"glamorous/dist/glamorous.esm.tiny.js\" {\n  declare module.exports: $Exports<\"glamorous/dist/glamorous.esm.tiny\">;\n}\ndeclare module \"glamorous/dist/glamorous.umd.js\" {\n  declare module.exports: $Exports<\"glamorous/dist/glamorous.umd\">;\n}\ndeclare module \"glamorous/dist/glamorous.umd.min.js\" {\n  declare module.exports: $Exports<\"glamorous/dist/glamorous.umd.min\">;\n}\ndeclare module \"glamorous/dist/glamorous.umd.min.tiny.js\" {\n  declare module.exports: $Exports<\"glamorous/dist/glamorous.umd.min.tiny\">;\n}\ndeclare module \"glamorous/dist/glamorous.umd.tiny.js\" {\n  declare module.exports: $Exports<\"glamorous/dist/glamorous.umd.tiny\">;\n}\ndeclare module \"glamorous/preact/dist/glamorous.cjs.js\" {\n  declare module.exports: $Exports<\"glamorous/preact/dist/glamorous.cjs\">;\n}\ndeclare module \"glamorous/preact/dist/glamorous.cjs.tiny.js\" {\n  declare module.exports: $Exports<\"glamorous/preact/dist/glamorous.cjs.tiny\">;\n}\ndeclare module \"glamorous/preact/dist/glamorous.esm.js\" {\n  declare module.exports: $Exports<\"glamorous/preact/dist/glamorous.esm\">;\n}\ndeclare module \"glamorous/preact/dist/glamorous.esm.tiny.js\" {\n  declare module.exports: $Exports<\"glamorous/preact/dist/glamorous.esm.tiny\">;\n}\ndeclare module \"glamorous/preact/dist/glamorous.umd.js\" {\n  declare module.exports: $Exports<\"glamorous/preact/dist/glamorous.umd\">;\n}\ndeclare module \"glamorous/preact/dist/glamorous.umd.min.js\" {\n  declare module.exports: $Exports<\"glamorous/preact/dist/glamorous.umd.min\">;\n}\ndeclare module \"glamorous/preact/dist/glamorous.umd.min.tiny.js\" {\n  declare module.exports: $Exports<\n    \"glamorous/preact/dist/glamorous.umd.min.tiny\",\n  >;\n}\ndeclare module \"glamorous/preact/dist/glamorous.umd.tiny.js\" {\n  declare module.exports: $Exports<\"glamorous/preact/dist/glamorous.umd.tiny\">;\n}\n"
  },
  {
    "path": "flow-typed/npm/globby_vx.x.x.js",
    "content": "// flow-typed signature: ef2ebb6ecf20c7017d6dc5068d4936d8\n// flow-typed version: <<STUB>>/globby_v^6.1.0/flow_v0.87.0\n\n/**\n * This is an autogenerated libdef stub for:\n *\n *   'globby'\n *\n * Fill this stub out by replacing all the `any` types.\n *\n * Once filled out, we encourage you to share your work with the\n * community by sending a pull request to:\n * https://github.com/flowtype/flow-typed\n */\n\ndeclare module \"globby\" {\n  declare module.exports: any;\n}\n\n/**\n * We include stubs for each file inside this npm package in case you need to\n * require those files directly. Feel free to delete any files that aren't\n * needed.\n */\n\n// Filename aliases\ndeclare module \"globby/index\" {\n  declare module.exports: $Exports<\"globby\">;\n}\ndeclare module \"globby/index.js\" {\n  declare module.exports: $Exports<\"globby\">;\n}\n"
  },
  {
    "path": "flow-typed/npm/gray-matter_vx.x.x.js",
    "content": "// flow-typed signature: 7df1c90ff653ead8008f05b6fa3272d1\n// flow-typed version: <<STUB>>/gray-matter_v3/flow_v0.68.0\n\n/**\n * This is an autogenerated libdef stub for:\n *\n *   'gray-matter'\n *\n * Fill this stub out by replacing all the `any` types.\n *\n * Once filled out, we encourage you to share your work with the\n * community by sending a pull request to:\n * https://github.com/flowtype/flow-typed\n */\n\ndeclare module \"gray-matter\" {\n  declare module.exports: any;\n}\n\n/**\n * We include stubs for each file inside this npm package in case you need to\n * require those files directly. Feel free to delete any files that aren't\n * needed.\n */\ndeclare module \"gray-matter/lib/defaults\" {\n  declare module.exports: any;\n}\n\ndeclare module \"gray-matter/lib/engine\" {\n  declare module.exports: any;\n}\n\ndeclare module \"gray-matter/lib/engines\" {\n  declare module.exports: any;\n}\n\ndeclare module \"gray-matter/lib/excerpt\" {\n  declare module.exports: any;\n}\n\ndeclare module \"gray-matter/lib/parse\" {\n  declare module.exports: any;\n}\n\ndeclare module \"gray-matter/lib/stringify\" {\n  declare module.exports: any;\n}\n\ndeclare module \"gray-matter/lib/to-file\" {\n  declare module.exports: any;\n}\n\ndeclare module \"gray-matter/lib/utils\" {\n  declare module.exports: any;\n}\n\n// Filename aliases\ndeclare module \"gray-matter/index\" {\n  declare module.exports: $Exports<\"gray-matter\">;\n}\ndeclare module \"gray-matter/index.js\" {\n  declare module.exports: $Exports<\"gray-matter\">;\n}\ndeclare module \"gray-matter/lib/defaults.js\" {\n  declare module.exports: $Exports<\"gray-matter/lib/defaults\">;\n}\ndeclare module \"gray-matter/lib/engine.js\" {\n  declare module.exports: $Exports<\"gray-matter/lib/engine\">;\n}\ndeclare module \"gray-matter/lib/engines.js\" {\n  declare module.exports: $Exports<\"gray-matter/lib/engines\">;\n}\ndeclare module \"gray-matter/lib/excerpt.js\" {\n  declare module.exports: $Exports<\"gray-matter/lib/excerpt\">;\n}\ndeclare module \"gray-matter/lib/parse.js\" {\n  declare module.exports: $Exports<\"gray-matter/lib/parse\">;\n}\ndeclare module \"gray-matter/lib/stringify.js\" {\n  declare module.exports: $Exports<\"gray-matter/lib/stringify\">;\n}\ndeclare module \"gray-matter/lib/to-file.js\" {\n  declare module.exports: $Exports<\"gray-matter/lib/to-file\">;\n}\ndeclare module \"gray-matter/lib/utils.js\" {\n  declare module.exports: $Exports<\"gray-matter/lib/utils\">;\n}\n"
  },
  {
    "path": "flow-typed/npm/hast-util-sanitize_vx.x.x.js",
    "content": "// flow-typed signature: e6e4d3d9dfe291183010a2049960f362\n// flow-typed version: <<STUB>>/hast-util-sanitize_v1/flow_v0.68.0\n\n/**\n * This is an autogenerated libdef stub for:\n *\n *   'hast-util-sanitize'\n *\n * Fill this stub out by replacing all the `any` types.\n *\n * Once filled out, we encourage you to share your work with the\n * community by sending a pull request to:\n * https://github.com/flowtype/flow-typed\n */\n\ndeclare module \"hast-util-sanitize\" {\n  declare module.exports: any;\n}\n\n/**\n * We include stubs for each file inside this npm package in case you need to\n * require those files directly. Feel free to delete any files that aren't\n * needed.\n */\ndeclare module \"hast-util-sanitize/lib/index\" {\n  declare module.exports: any;\n}\n\n// Filename aliases\ndeclare module \"hast-util-sanitize/index\" {\n  declare module.exports: $Exports<\"hast-util-sanitize\">;\n}\ndeclare module \"hast-util-sanitize/index.js\" {\n  declare module.exports: $Exports<\"hast-util-sanitize\">;\n}\ndeclare module \"hast-util-sanitize/lib/index.js\" {\n  declare module.exports: $Exports<\"hast-util-sanitize/lib/index\">;\n}\n"
  },
  {
    "path": "flow-typed/npm/history_vx.x.x.js",
    "content": "// flow-typed signature: a6928b7e0d8976c1c03b7a0bce3d7a64\n// flow-typed version: <<STUB>>/history_v2/flow_v0.68.0\n\n/**\n * This is an autogenerated libdef stub for:\n *\n *   'history'\n *\n * Fill this stub out by replacing all the `any` types.\n *\n * Once filled out, we encourage you to share your work with the\n * community by sending a pull request to:\n * https://github.com/flowtype/flow-typed\n */\n\ndeclare module \"history\" {\n  declare module.exports: any;\n}\n\n/**\n * We include stubs for each file inside this npm package in case you need to\n * require those files directly. Feel free to delete any files that aren't\n * needed.\n */\ndeclare module \"history/lib/Actions\" {\n  declare module.exports: any;\n}\n\ndeclare module \"history/lib/AsyncUtils\" {\n  declare module.exports: any;\n}\n\ndeclare module \"history/lib/BrowserProtocol\" {\n  declare module.exports: any;\n}\n\ndeclare module \"history/lib/createBrowserHistory\" {\n  declare module.exports: any;\n}\n\ndeclare module \"history/lib/createHashHistory\" {\n  declare module.exports: any;\n}\n\ndeclare module \"history/lib/createHistory\" {\n  declare module.exports: any;\n}\n\ndeclare module \"history/lib/createMemoryHistory\" {\n  declare module.exports: any;\n}\n\ndeclare module \"history/lib/DOMStateStorage\" {\n  declare module.exports: any;\n}\n\ndeclare module \"history/lib/DOMUtils\" {\n  declare module.exports: any;\n}\n\ndeclare module \"history/lib/ExecutionEnvironment\" {\n  declare module.exports: any;\n}\n\ndeclare module \"history/lib/HashProtocol\" {\n  declare module.exports: any;\n}\n\ndeclare module \"history/lib/index\" {\n  declare module.exports: any;\n}\n\ndeclare module \"history/lib/LocationUtils\" {\n  declare module.exports: any;\n}\n\ndeclare module \"history/lib/PathUtils\" {\n  declare module.exports: any;\n}\n\ndeclare module \"history/lib/RefreshProtocol\" {\n  declare module.exports: any;\n}\n\ndeclare module \"history/lib/runTransitionHook\" {\n  declare module.exports: any;\n}\n\ndeclare module \"history/lib/useBasename\" {\n  declare module.exports: any;\n}\n\ndeclare module \"history/lib/useBeforeUnload\" {\n  declare module.exports: any;\n}\n\ndeclare module \"history/lib/useQueries\" {\n  declare module.exports: any;\n}\n\ndeclare module \"history/umd/history\" {\n  declare module.exports: any;\n}\n\ndeclare module \"history/umd/history.min\" {\n  declare module.exports: any;\n}\n\n// Filename aliases\ndeclare module \"history/lib/Actions.js\" {\n  declare module.exports: $Exports<\"history/lib/Actions\">;\n}\ndeclare module \"history/lib/AsyncUtils.js\" {\n  declare module.exports: $Exports<\"history/lib/AsyncUtils\">;\n}\ndeclare module \"history/lib/BrowserProtocol.js\" {\n  declare module.exports: $Exports<\"history/lib/BrowserProtocol\">;\n}\ndeclare module \"history/lib/createBrowserHistory.js\" {\n  declare module.exports: $Exports<\"history/lib/createBrowserHistory\">;\n}\ndeclare module \"history/lib/createHashHistory.js\" {\n  declare module.exports: $Exports<\"history/lib/createHashHistory\">;\n}\ndeclare module \"history/lib/createHistory.js\" {\n  declare module.exports: $Exports<\"history/lib/createHistory\">;\n}\ndeclare module \"history/lib/createMemoryHistory.js\" {\n  declare module.exports: $Exports<\"history/lib/createMemoryHistory\">;\n}\ndeclare module \"history/lib/DOMStateStorage.js\" {\n  declare module.exports: $Exports<\"history/lib/DOMStateStorage\">;\n}\ndeclare module \"history/lib/DOMUtils.js\" {\n  declare module.exports: $Exports<\"history/lib/DOMUtils\">;\n}\ndeclare module \"history/lib/ExecutionEnvironment.js\" {\n  declare module.exports: $Exports<\"history/lib/ExecutionEnvironment\">;\n}\ndeclare module \"history/lib/HashProtocol.js\" {\n  declare module.exports: $Exports<\"history/lib/HashProtocol\">;\n}\ndeclare module \"history/lib/index.js\" {\n  declare module.exports: $Exports<\"history/lib/index\">;\n}\ndeclare module \"history/lib/LocationUtils.js\" {\n  declare module.exports: $Exports<\"history/lib/LocationUtils\">;\n}\ndeclare module \"history/lib/PathUtils.js\" {\n  declare module.exports: $Exports<\"history/lib/PathUtils\">;\n}\ndeclare module \"history/lib/RefreshProtocol.js\" {\n  declare module.exports: $Exports<\"history/lib/RefreshProtocol\">;\n}\ndeclare module \"history/lib/runTransitionHook.js\" {\n  declare module.exports: $Exports<\"history/lib/runTransitionHook\">;\n}\ndeclare module \"history/lib/useBasename.js\" {\n  declare module.exports: $Exports<\"history/lib/useBasename\">;\n}\ndeclare module \"history/lib/useBeforeUnload.js\" {\n  declare module.exports: $Exports<\"history/lib/useBeforeUnload\">;\n}\ndeclare module \"history/lib/useQueries.js\" {\n  declare module.exports: $Exports<\"history/lib/useQueries\">;\n}\ndeclare module \"history/umd/history.js\" {\n  declare module.exports: $Exports<\"history/umd/history\">;\n}\ndeclare module \"history/umd/history.min.js\" {\n  declare module.exports: $Exports<\"history/umd/history.min\">;\n}\n"
  },
  {
    "path": "flow-typed/npm/hoist-non-react-statics_v2.x.x.js",
    "content": "declare module \"hoist-non-react-statics\" {\n  /*\n    S - source component statics\n    TP - target component props\n    SP - additional source component props\n  */\n  declare module.exports: <TP, SP, S>(\n    target: React$ComponentType<TP>,\n    source: React$ComponentType<TP & SP> & S,\n    blacklist?: { [key: $Keys<S>]: boolean },\n  ) => React$ComponentType<TP> & $Shape<S>;\n}\n"
  },
  {
    "path": "flow-typed/npm/husky_vx.x.x.js",
    "content": "// flow-typed signature: 227d9311f08d54bc586ec3d6310d1e93\n// flow-typed version: <<STUB>>/husky_v^0.13.3/flow_v0.87.0\n\n/**\n * This is an autogenerated libdef stub for:\n *\n *   'husky'\n *\n * Fill this stub out by replacing all the `any` types.\n *\n * Once filled out, we encourage you to share your work with the\n * community by sending a pull request to:\n * https://github.com/flowtype/flow-typed\n */\n\ndeclare module \"husky\" {\n  declare module.exports: any;\n}\n\n/**\n * We include stubs for each file inside this npm package in case you need to\n * require those files directly. Feel free to delete any files that aren't\n * needed.\n */\ndeclare module \"husky/bin/install\" {\n  declare module.exports: any;\n}\n\ndeclare module \"husky/bin/uninstall\" {\n  declare module.exports: any;\n}\n\ndeclare module \"husky/src/index\" {\n  declare module.exports: any;\n}\n\n// Filename aliases\ndeclare module \"husky/bin/install.js\" {\n  declare module.exports: $Exports<\"husky/bin/install\">;\n}\ndeclare module \"husky/bin/uninstall.js\" {\n  declare module.exports: $Exports<\"husky/bin/uninstall\">;\n}\ndeclare module \"husky/src/index.js\" {\n  declare module.exports: $Exports<\"husky/src/index\">;\n}\n"
  },
  {
    "path": "flow-typed/npm/jest_v21.x.x.js",
    "content": "// flow-typed signature: 107cf7068b8835594e97f938e8848244\n// flow-typed version: 8b4dd96654/jest_v21.x.x/flow_>=v0.39.x\n\ntype JestMockFn<TArguments: $ReadOnlyArray<*>, TReturn> = {\n  (...args: TArguments): TReturn,\n  /**\n   * An object for introspecting mock calls\n   */\n  mock: {\n    /**\n     * An array that represents all calls that have been made into this mock\n     * function. Each call is represented by an array of arguments that were\n     * passed during the call.\n     */\n    calls: Array<TArguments>,\n    /**\n     * An array that contains all the object instances that have been\n     * instantiated from this mock function.\n     */\n    instances: Array<TReturn>,\n  },\n  /**\n   * Resets all information stored in the mockFn.mock.calls and\n   * mockFn.mock.instances arrays. Often this is useful when you want to clean\n   * up a mock's usage data between two assertions.\n   */\n  mockClear(): void,\n  /**\n   * Resets all information stored in the mock. This is useful when you want to\n   * completely restore a mock back to its initial state.\n   */\n  mockReset(): void,\n  /**\n   * Removes the mock and restores the initial implementation. This is useful\n   * when you want to mock functions in certain test cases and restore the\n   * original implementation in others. Beware that mockFn.mockRestore only\n   * works when mock was created with jest.spyOn. Thus you have to take care of\n   * restoration yourself when manually assigning jest.fn().\n   */\n  mockRestore(): void,\n  /**\n   * Accepts a function that should be used as the implementation of the mock.\n   * The mock itself will still record all calls that go into and instances\n   * that come from itself -- the only difference is that the implementation\n   * will also be executed when the mock is called.\n   */\n  mockImplementation(\n    fn: (...args: TArguments) => TReturn,\n  ): JestMockFn<TArguments, TReturn>,\n  /**\n   * Accepts a function that will be used as an implementation of the mock for\n   * one call to the mocked function. Can be chained so that multiple function\n   * calls produce different results.\n   */\n  mockImplementationOnce(\n    fn: (...args: TArguments) => TReturn,\n  ): JestMockFn<TArguments, TReturn>,\n  /**\n   * Just a simple sugar function for returning `this`\n   */\n  mockReturnThis(): void,\n  /**\n   * Deprecated: use jest.fn(() => value) instead\n   */\n  mockReturnValue(value: TReturn): JestMockFn<TArguments, TReturn>,\n  /**\n   * Sugar for only returning a value once inside your mock\n   */\n  mockReturnValueOnce(value: TReturn): JestMockFn<TArguments, TReturn>,\n};\n\ntype JestAsymmetricEqualityType = {\n  /**\n   * A custom Jasmine equality tester\n   */\n  asymmetricMatch(value: mixed): boolean,\n};\n\ntype JestCallsType = {\n  allArgs(): mixed,\n  all(): mixed,\n  any(): boolean,\n  count(): number,\n  first(): mixed,\n  mostRecent(): mixed,\n  reset(): void,\n};\n\ntype JestClockType = {\n  install(): void,\n  mockDate(date: Date): void,\n  tick(milliseconds?: number): void,\n  uninstall(): void,\n};\n\ntype JestMatcherResult = {\n  message?: string | (() => string),\n  pass: boolean,\n};\n\ntype JestMatcher = (actual: any, expected: any) => JestMatcherResult;\n\ntype JestPromiseType = {\n  /**\n   * Use rejects to unwrap the reason of a rejected promise so any other\n   * matcher can be chained. If the promise is fulfilled the assertion fails.\n   */\n  rejects: JestExpectType,\n  /**\n   * Use resolves to unwrap the value of a fulfilled promise so any other\n   * matcher can be chained. If the promise is rejected the assertion fails.\n   */\n  resolves: JestExpectType,\n};\n\n/**\n *  Plugin: jest-enzyme\n */\ntype EnzymeMatchersType = {\n  toBeChecked(): void,\n  toBeDisabled(): void,\n  toBeEmpty(): void,\n  toBePresent(): void,\n  toContainReact(element: React$Element<any>): void,\n  toHaveClassName(className: string): void,\n  toHaveHTML(html: string): void,\n  toHaveProp(propKey: string, propValue?: any): void,\n  toHaveRef(refName: string): void,\n  toHaveState(stateKey: string, stateValue?: any): void,\n  toHaveStyle(styleKey: string, styleValue?: any): void,\n  toHaveTagName(tagName: string): void,\n  toHaveText(text: string): void,\n  toIncludeText(text: string): void,\n  toHaveValue(value: any): void,\n  toMatchElement(element: React$Element<any>): void,\n  toMatchSelector(selector: string): void,\n};\n\ntype JestExpectType = {\n  not: JestExpectType & EnzymeMatchersType,\n  /**\n   * If you have a mock function, you can use .lastCalledWith to test what\n   * arguments it was last called with.\n   */\n  lastCalledWith(...args: Array<any>): void,\n  /**\n   * toBe just checks that a value is what you expect. It uses === to check\n   * strict equality.\n   */\n  toBe(value: any): void,\n  /**\n   * Use .toHaveBeenCalled to ensure that a mock function got called.\n   */\n  toBeCalled(): void,\n  /**\n   * Use .toBeCalledWith to ensure that a mock function was called with\n   * specific arguments.\n   */\n  toBeCalledWith(...args: Array<any>): void,\n  /**\n   * Using exact equality with floating point numbers is a bad idea. Rounding\n   * means that intuitive things fail.\n   */\n  toBeCloseTo(num: number, delta: any): void,\n  /**\n   * Use .toBeDefined to check that a variable is not undefined.\n   */\n  toBeDefined(): void,\n  /**\n   * Use .toBeFalsy when you don't care what a value is, you just want to\n   * ensure a value is false in a boolean context.\n   */\n  toBeFalsy(): void,\n  /**\n   * To compare floating point numbers, you can use toBeGreaterThan.\n   */\n  toBeGreaterThan(number: number): void,\n  /**\n   * To compare floating point numbers, you can use toBeGreaterThanOrEqual.\n   */\n  toBeGreaterThanOrEqual(number: number): void,\n  /**\n   * To compare floating point numbers, you can use toBeLessThan.\n   */\n  toBeLessThan(number: number): void,\n  /**\n   * To compare floating point numbers, you can use toBeLessThanOrEqual.\n   */\n  toBeLessThanOrEqual(number: number): void,\n  /**\n   * Use .toBeInstanceOf(Class) to check that an object is an instance of a\n   * class.\n   */\n  toBeInstanceOf(cls: Class<*>): void,\n  /**\n   * .toBeNull() is the same as .toBe(null) but the error messages are a bit\n   * nicer.\n   */\n  toBeNull(): void,\n  /**\n   * Use .toBeTruthy when you don't care what a value is, you just want to\n   * ensure a value is true in a boolean context.\n   */\n  toBeTruthy(): void,\n  /**\n   * Use .toBeUndefined to check that a variable is undefined.\n   */\n  toBeUndefined(): void,\n  /**\n   * Use .toContain when you want to check that an item is in a list. For\n   * testing the items in the list, this uses ===, a strict equality check.\n   */\n  toContain(item: any): void,\n  /**\n   * Use .toContainEqual when you want to check that an item is in a list. For\n   * testing the items in the list, this matcher recursively checks the\n   * equality of all fields, rather than checking for object identity.\n   */\n  toContainEqual(item: any): void,\n  /**\n   * Use .toEqual when you want to check that two objects have the same value.\n   * This matcher recursively checks the equality of all fields, rather than\n   * checking for object identity.\n   */\n  toEqual(value: any): void,\n  /**\n   * Use .toHaveBeenCalled to ensure that a mock function got called.\n   */\n  toHaveBeenCalled(): void,\n  /**\n   * Use .toHaveBeenCalledTimes to ensure that a mock function got called exact\n   * number of times.\n   */\n  toHaveBeenCalledTimes(number: number): void,\n  /**\n   * Use .toHaveBeenCalledWith to ensure that a mock function was called with\n   * specific arguments.\n   */\n  toHaveBeenCalledWith(...args: Array<any>): void,\n  /**\n   * Use .toHaveBeenLastCalledWith to ensure that a mock function was last called\n   * with specific arguments.\n   */\n  toHaveBeenLastCalledWith(...args: Array<any>): void,\n  /**\n   * Check that an object has a .length property and it is set to a certain\n   * numeric value.\n   */\n  toHaveLength(number: number): void,\n  /**\n   *\n   */\n  toHaveProperty(propPath: string, value?: any): void,\n  /**\n   * Use .toMatch to check that a string matches a regular expression or string.\n   */\n  toMatch(regexpOrString: RegExp | string): void,\n  /**\n   * Use .toMatchObject to check that a javascript object matches a subset of the properties of an object.\n   */\n  toMatchObject(object: Object | Array<Object>): void,\n  /**\n   * This ensures that a React component matches the most recent snapshot.\n   */\n  toMatchSnapshot(name?: string): void,\n  /**\n   * Use .toThrow to test that a function throws when it is called.\n   * If you want to test that a specific error gets thrown, you can provide an\n   * argument to toThrow. The argument can be a string for the error message,\n   * a class for the error, or a regex that should match the error.\n   *\n   * Alias: .toThrowError\n   */\n  toThrow(message?: string | Error | Class<Error> | RegExp): void,\n  toThrowError(message?: string | Error | Class<Error> | RegExp): void,\n  /**\n   * Use .toThrowErrorMatchingSnapshot to test that a function throws a error\n   * matching the most recent snapshot when it is called.\n   */\n  toThrowErrorMatchingSnapshot(): void,\n};\n\ntype JestObjectType = {\n  /**\n   *  Disables automatic mocking in the module loader.\n   *\n   *  After this method is called, all `require()`s will return the real\n   *  versions of each module (rather than a mocked version).\n   */\n  disableAutomock(): JestObjectType,\n  /**\n   * An un-hoisted version of disableAutomock\n   */\n  autoMockOff(): JestObjectType,\n  /**\n   * Enables automatic mocking in the module loader.\n   */\n  enableAutomock(): JestObjectType,\n  /**\n   * An un-hoisted version of enableAutomock\n   */\n  autoMockOn(): JestObjectType,\n  /**\n   * Clears the mock.calls and mock.instances properties of all mocks.\n   * Equivalent to calling .mockClear() on every mocked function.\n   */\n  clearAllMocks(): JestObjectType,\n  /**\n   * Resets the state of all mocks. Equivalent to calling .mockReset() on every\n   * mocked function.\n   */\n  resetAllMocks(): JestObjectType,\n  /**\n   * Removes any pending timers from the timer system.\n   */\n  clearAllTimers(): void,\n  /**\n   * The same as `mock` but not moved to the top of the expectation by\n   * babel-jest.\n   */\n  doMock(moduleName: string, moduleFactory?: any): JestObjectType,\n  /**\n   * The same as `unmock` but not moved to the top of the expectation by\n   * babel-jest.\n   */\n  dontMock(moduleName: string): JestObjectType,\n  /**\n   * Returns a new, unused mock function. Optionally takes a mock\n   * implementation.\n   */\n  fn<TArguments: $ReadOnlyArray<*>, TReturn>(\n    implementation?: (...args: TArguments) => TReturn,\n  ): JestMockFn<TArguments, TReturn>,\n  /**\n   * Determines if the given function is a mocked function.\n   */\n  isMockFunction(fn: Function): boolean,\n  /**\n   * Given the name of a module, use the automatic mocking system to generate a\n   * mocked version of the module for you.\n   */\n  genMockFromModule(moduleName: string): any,\n  /**\n   * Mocks a module with an auto-mocked version when it is being required.\n   *\n   * The second argument can be used to specify an explicit module factory that\n   * is being run instead of using Jest's automocking feature.\n   *\n   * The third argument can be used to create virtual mocks -- mocks of modules\n   * that don't exist anywhere in the system.\n   */\n  mock(\n    moduleName: string,\n    moduleFactory?: any,\n    options?: Object,\n  ): JestObjectType,\n  /**\n   * Returns the actual module instead of a mock, bypassing all checks on\n   * whether the module should receive a mock implementation or not.\n   */\n  requireActual(moduleName: string): any,\n  /**\n   * Returns a mock module instead of the actual module, bypassing all checks\n   * on whether the module should be required normally or not.\n   */\n  requireMock(moduleName: string): any,\n  /**\n   * Resets the module registry - the cache of all required modules. This is\n   * useful to isolate modules where local state might conflict between tests.\n   */\n  resetModules(): JestObjectType,\n  /**\n   * Exhausts the micro-task queue (usually interfaced in node via\n   * process.nextTick).\n   */\n  runAllTicks(): void,\n  /**\n   * Exhausts the macro-task queue (i.e., all tasks queued by setTimeout(),\n   * setInterval(), and setImmediate()).\n   */\n  runAllTimers(): void,\n  /**\n   * Exhausts all tasks queued by setImmediate().\n   */\n  runAllImmediates(): void,\n  /**\n   * Executes only the macro task queue (i.e. all tasks queued by setTimeout()\n   * or setInterval() and setImmediate()).\n   */\n  runTimersToTime(msToRun: number): void,\n  /**\n   * Executes only the macro-tasks that are currently pending (i.e., only the\n   * tasks that have been queued by setTimeout() or setInterval() up to this\n   * point)\n   */\n  runOnlyPendingTimers(): void,\n  /**\n   * Explicitly supplies the mock object that the module system should return\n   * for the specified module. Note: It is recommended to use jest.mock()\n   * instead.\n   */\n  setMock(moduleName: string, moduleExports: any): JestObjectType,\n  /**\n   * Indicates that the module system should never return a mocked version of\n   * the specified module from require() (e.g. that it should always return the\n   * real module).\n   */\n  unmock(moduleName: string): JestObjectType,\n  /**\n   * Instructs Jest to use fake versions of the standard timer functions\n   * (setTimeout, setInterval, clearTimeout, clearInterval, nextTick,\n   * setImmediate and clearImmediate).\n   */\n  useFakeTimers(): JestObjectType,\n  /**\n   * Instructs Jest to use the real versions of the standard timer functions.\n   */\n  useRealTimers(): JestObjectType,\n  /**\n   * Creates a mock function similar to jest.fn but also tracks calls to\n   * object[methodName].\n   */\n  spyOn(object: Object, methodName: string): JestMockFn<any, any>,\n  /**\n   * Set the default timeout interval for tests and before/after hooks in milliseconds.\n   * Note: The default timeout interval is 5 seconds if this method is not called.\n   */\n  setTimeout(timeout: number): JestObjectType,\n};\n\ntype JestSpyType = {\n  calls: JestCallsType,\n};\n\n/** Runs this function after every test inside this context */\ndeclare function afterEach(\n  fn: (done: () => void) => ?Promise<mixed>,\n  timeout?: number,\n): void;\n/** Runs this function before every test inside this context */\ndeclare function beforeEach(\n  fn: (done: () => void) => ?Promise<mixed>,\n  timeout?: number,\n): void;\n/** Runs this function after all tests have finished inside this context */\ndeclare function afterAll(\n  fn: (done: () => void) => ?Promise<mixed>,\n  timeout?: number,\n): void;\n/** Runs this function before any tests have started inside this context */\ndeclare function beforeAll(\n  fn: (done: () => void) => ?Promise<mixed>,\n  timeout?: number,\n): void;\n\n/** A context for grouping tests together */\ndeclare var describe: {\n  /**\n   * Creates a block that groups together several related tests in one \"test suite\"\n   */\n  (name: string, fn: () => void): void,\n\n  /**\n   * Only run this describe block\n   */\n  only(name: string, fn: () => void): void,\n\n  /**\n   * Skip running this describe block\n   */\n  skip(name: string, fn: () => void): void,\n};\n\n/** An individual test unit */\ndeclare var it: {\n  /**\n   * An individual test unit\n   *\n   * @param {string} Name of Test\n   * @param {Function} Test\n   * @param {number} Timeout for the test, in milliseconds.\n   */\n  (\n    name: string,\n    fn?: (done: () => void) => ?Promise<mixed>,\n    timeout?: number,\n  ): void,\n  /**\n   * Only run this test\n   *\n   * @param {string} Name of Test\n   * @param {Function} Test\n   * @param {number} Timeout for the test, in milliseconds.\n   */\n  only(\n    name: string,\n    fn?: (done: () => void) => ?Promise<mixed>,\n    timeout?: number,\n  ): void,\n  /**\n   * Skip running this test\n   *\n   * @param {string} Name of Test\n   * @param {Function} Test\n   * @param {number} Timeout for the test, in milliseconds.\n   */\n  skip(\n    name: string,\n    fn?: (done: () => void) => ?Promise<mixed>,\n    timeout?: number,\n  ): void,\n  /**\n   * Run the test concurrently\n   *\n   * @param {string} Name of Test\n   * @param {Function} Test\n   * @param {number} Timeout for the test, in milliseconds.\n   */\n  concurrent(\n    name: string,\n    fn?: (done: () => void) => ?Promise<mixed>,\n    timeout?: number,\n  ): void,\n};\ndeclare function fit(\n  name: string,\n  fn: (done: () => void) => ?Promise<mixed>,\n  timeout?: number,\n): void;\n/** An individual test unit */\ndeclare var test: typeof it;\n/** A disabled group of tests */\ndeclare var xdescribe: typeof describe;\n/** A focused group of tests */\ndeclare var fdescribe: typeof describe;\n/** A disabled individual test */\ndeclare var xit: typeof it;\n/** A disabled individual test */\ndeclare var xtest: typeof it;\n\n/** The expect function is used every time you want to test a value */\ndeclare var expect: {\n  /** The object that you want to make assertions against */\n  (value: any): JestExpectType & JestPromiseType & EnzymeMatchersType,\n  /** Add additional Jasmine matchers to Jest's roster */\n  extend(matchers: { [name: string]: JestMatcher }): void,\n  /** Add a module that formats application-specific data structures. */\n  addSnapshotSerializer(serializer: (input: Object) => string): void,\n  assertions(expectedAssertions: number): void,\n  hasAssertions(): void,\n  any(value: mixed): JestAsymmetricEqualityType,\n  anything(): void,\n  arrayContaining(value: Array<mixed>): void,\n  objectContaining(value: Object): void,\n  /** Matches any received string that contains the exact expected string. */\n  stringContaining(value: string): void,\n  stringMatching(value: string | RegExp): void,\n};\n\n// TODO handle return type\n// http://jasmine.github.io/2.4/introduction.html#section-Spies\ndeclare function spyOn(value: mixed, method: string): Object;\n\n/** Holds all functions related to manipulating test runner */\ndeclare var jest: JestObjectType;\n\n/**\n * The global Jasmine object, this is generally not exposed as the public API,\n * using features inside here could break in later versions of Jest.\n */\ndeclare var jasmine: {\n  DEFAULT_TIMEOUT_INTERVAL: number,\n  any(value: mixed): JestAsymmetricEqualityType,\n  anything(): void,\n  arrayContaining(value: Array<mixed>): void,\n  clock(): JestClockType,\n  createSpy(name: string): JestSpyType,\n  createSpyObj(\n    baseName: string,\n    methodNames: Array<string>,\n  ): { [methodName: string]: JestSpyType },\n  objectContaining(value: Object): void,\n  stringMatching(value: string): void,\n};\n"
  },
  {
    "path": "flow-typed/npm/jest_v22.x.x.js",
    "content": "// flow-typed signature: 27b6ff5cf910473843da0caf82e362fe\n// flow-typed version: a3709d51ed/jest_v22.x.x/flow_>=v0.39.x\n\ntype JestMockFn<TArguments: $ReadOnlyArray<*>, TReturn> = {\n  (...args: TArguments): TReturn,\n  /**\n   * An object for introspecting mock calls\n   */\n  mock: {\n    /**\n     * An array that represents all calls that have been made into this mock\n     * function. Each call is represented by an array of arguments that were\n     * passed during the call.\n     */\n    calls: Array<TArguments>,\n    /**\n     * An array that contains all the object instances that have been\n     * instantiated from this mock function.\n     */\n    instances: Array<TReturn>,\n  },\n  /**\n   * Resets all information stored in the mockFn.mock.calls and\n   * mockFn.mock.instances arrays. Often this is useful when you want to clean\n   * up a mock's usage data between two assertions.\n   */\n  mockClear(): void,\n  /**\n   * Resets all information stored in the mock. This is useful when you want to\n   * completely restore a mock back to its initial state.\n   */\n  mockReset(): void,\n  /**\n   * Removes the mock and restores the initial implementation. This is useful\n   * when you want to mock functions in certain test cases and restore the\n   * original implementation in others. Beware that mockFn.mockRestore only\n   * works when mock was created with jest.spyOn. Thus you have to take care of\n   * restoration yourself when manually assigning jest.fn().\n   */\n  mockRestore(): void,\n  /**\n   * Accepts a function that should be used as the implementation of the mock.\n   * The mock itself will still record all calls that go into and instances\n   * that come from itself -- the only difference is that the implementation\n   * will also be executed when the mock is called.\n   */\n  mockImplementation(\n    fn: (...args: TArguments) => TReturn,\n  ): JestMockFn<TArguments, TReturn>,\n  /**\n   * Accepts a function that will be used as an implementation of the mock for\n   * one call to the mocked function. Can be chained so that multiple function\n   * calls produce different results.\n   */\n  mockImplementationOnce(\n    fn: (...args: TArguments) => TReturn,\n  ): JestMockFn<TArguments, TReturn>,\n  /**\n   * Accepts a string to use in test result output in place of \"jest.fn()\" to\n   * indicate which mock function is being referenced.\n   */\n  mockName(name: string): JestMockFn<TArguments, TReturn>,\n  /**\n   * Just a simple sugar function for returning `this`\n   */\n  mockReturnThis(): void,\n  /**\n   * Deprecated: use jest.fn(() => value) instead\n   */\n  mockReturnValue(value: TReturn): JestMockFn<TArguments, TReturn>,\n  /**\n   * Sugar for only returning a value once inside your mock\n   */\n  mockReturnValueOnce(value: TReturn): JestMockFn<TArguments, TReturn>,\n};\n\ntype JestAsymmetricEqualityType = {\n  /**\n   * A custom Jasmine equality tester\n   */\n  asymmetricMatch(value: mixed): boolean,\n};\n\ntype JestCallsType = {\n  allArgs(): mixed,\n  all(): mixed,\n  any(): boolean,\n  count(): number,\n  first(): mixed,\n  mostRecent(): mixed,\n  reset(): void,\n};\n\ntype JestClockType = {\n  install(): void,\n  mockDate(date: Date): void,\n  tick(milliseconds?: number): void,\n  uninstall(): void,\n};\n\ntype JestMatcherResult = {\n  message?: string | (() => string),\n  pass: boolean,\n};\n\ntype JestMatcher = (actual: any, expected: any) => JestMatcherResult;\n\ntype JestPromiseType = {\n  /**\n   * Use rejects to unwrap the reason of a rejected promise so any other\n   * matcher can be chained. If the promise is fulfilled the assertion fails.\n   */\n  rejects: JestExpectType,\n  /**\n   * Use resolves to unwrap the value of a fulfilled promise so any other\n   * matcher can be chained. If the promise is rejected the assertion fails.\n   */\n  resolves: JestExpectType,\n};\n\n/**\n * Jest allows functions and classes to be used as test names in test() and\n * describe()\n */\ntype JestTestName = string | Function;\n\n/**\n *  Plugin: jest-enzyme\n */\ntype EnzymeMatchersType = {\n  toBeChecked(): void,\n  toBeDisabled(): void,\n  toBeEmpty(): void,\n  toBeEmptyRender(): void,\n  toBePresent(): void,\n  toContainReact(element: React$Element<any>): void,\n  toExist(): void,\n  toHaveClassName(className: string): void,\n  toHaveHTML(html: string): void,\n  toHaveProp: ((propKey: string, propValue?: any) => void) &\n    ((props: Object) => void),\n  toHaveRef(refName: string): void,\n  toHaveState: ((stateKey: string, stateValue?: any) => void) &\n    ((state: Object) => void),\n  toHaveStyle: ((styleKey: string, styleValue?: any) => void) &\n    ((style: Object) => void),\n  toHaveTagName(tagName: string): void,\n  toHaveText(text: string): void,\n  toIncludeText(text: string): void,\n  toHaveValue(value: any): void,\n  toMatchElement(element: React$Element<any>): void,\n  toMatchSelector(selector: string): void,\n};\n\n// DOM testing library extensions https://github.com/kentcdodds/dom-testing-library#custom-jest-matchers\ntype DomTestingLibraryType = {\n  toBeInTheDOM(): void,\n  toHaveTextContent(content: string): void,\n  toHaveAttribute(name: string, expectedValue?: string): void,\n};\n\n// Jest JQuery Matchers: https://github.com/unindented/custom-jquery-matchers\ntype JestJQueryMatchersType = {\n  toExist(): void,\n  toHaveLength(len: number): void,\n  toHaveId(id: string): void,\n  toHaveClass(className: string): void,\n  toHaveTag(tag: string): void,\n  toHaveAttr(key: string, val?: any): void,\n  toHaveProp(key: string, val?: any): void,\n  toHaveText(text: string | RegExp): void,\n  toHaveData(key: string, val?: any): void,\n  toHaveValue(val: any): void,\n  toHaveCss(css: { [key: string]: any }): void,\n  toBeChecked(): void,\n  toBeDisabled(): void,\n  toBeEmpty(): void,\n  toBeHidden(): void,\n  toBeSelected(): void,\n  toBeVisible(): void,\n  toBeFocused(): void,\n  toBeInDom(): void,\n  toBeMatchedBy(sel: string): void,\n  toHaveDescendant(sel: string): void,\n  toHaveDescendantWithText(sel: string, text: string | RegExp): void,\n};\n\n// Jest Extended Matchers: https://github.com/jest-community/jest-extended\ntype JestExtendedMatchersType = {\n  /**\n   * Note: Currently unimplemented\n   * Passing assertion\n   *\n   * @param {String} message\n   */\n  //  pass(message: string): void;\n\n  /**\n   * Note: Currently unimplemented\n   * Failing assertion\n   *\n   * @param {String} message\n   */\n  //  fail(message: string): void;\n\n  /**\n   * Use .toBeEmpty when checking if a String '', Array [] or Object {} is empty.\n   */\n  toBeEmpty(): void,\n\n  /**\n   * Use .toBeOneOf when checking if a value is a member of a given Array.\n   * @param {Array.<*>} members\n   */\n  toBeOneOf(members: any[]): void,\n\n  /**\n   * Use `.toBeNil` when checking a value is `null` or `undefined`.\n   */\n  toBeNil(): void,\n\n  /**\n   * Use `.toSatisfy` when you want to use a custom matcher by supplying a predicate function that returns a `Boolean`.\n   * @param {Function} predicate\n   */\n  toSatisfy(predicate: (n: any) => boolean): void,\n\n  /**\n   * Use `.toBeArray` when checking if a value is an `Array`.\n   */\n  toBeArray(): void,\n\n  /**\n   * Use `.toBeArrayOfSize` when checking if a value is an `Array` of size x.\n   * @param {Number} x\n   */\n  toBeArrayOfSize(x: number): void,\n\n  /**\n   * Use `.toIncludeAllMembers` when checking if an `Array` contains all of the same members of a given set.\n   * @param {Array.<*>} members\n   */\n  toIncludeAllMembers(members: any[]): void,\n\n  /**\n   * Use `.toIncludeAnyMembers` when checking if an `Array` contains any of the members of a given set.\n   * @param {Array.<*>} members\n   */\n  toIncludeAnyMembers(members: any[]): void,\n\n  /**\n   * Use `.toSatisfyAll` when you want to use a custom matcher by supplying a predicate function that returns a `Boolean` for all values in an array.\n   * @param {Function} predicate\n   */\n  toSatisfyAll(predicate: (n: any) => boolean): void,\n\n  /**\n   * Use `.toBeBoolean` when checking if a value is a `Boolean`.\n   */\n  toBeBoolean(): void,\n\n  /**\n   * Use `.toBeTrue` when checking a value is equal (===) to `true`.\n   */\n  toBeTrue(): void,\n\n  /**\n   * Use `.toBeFalse` when checking a value is equal (===) to `false`.\n   */\n  toBeFalse(): void,\n\n  /**\n   * Use .toBeDate when checking if a value is a Date.\n   */\n  toBeDate(): void,\n\n  /**\n   * Use `.toBeFunction` when checking if a value is a `Function`.\n   */\n  toBeFunction(): void,\n\n  /**\n   * Use `.toHaveBeenCalledBefore` when checking if a `Mock` was called before another `Mock`.\n   *\n   * Note: Required Jest version >22\n   * Note: Your mock functions will have to be asynchronous to cause the timestamps inside of Jest to occur in a differentJS event loop, otherwise the mock timestamps will all be the same\n   *\n   * @param {Mock} mock\n   */\n  toHaveBeenCalledBefore(mock: JestMockFn<any, any>): void,\n\n  /**\n   * Use `.toBeNumber` when checking if a value is a `Number`.\n   */\n  toBeNumber(): void,\n\n  /**\n   * Use `.toBeNaN` when checking a value is `NaN`.\n   */\n  toBeNaN(): void,\n\n  /**\n   * Use `.toBeFinite` when checking if a value is a `Number`, not `NaN` or `Infinity`.\n   */\n  toBeFinite(): void,\n\n  /**\n   * Use `.toBePositive` when checking if a value is a positive `Number`.\n   */\n  toBePositive(): void,\n\n  /**\n   * Use `.toBeNegative` when checking if a value is a negative `Number`.\n   */\n  toBeNegative(): void,\n\n  /**\n   * Use `.toBeEven` when checking if a value is an even `Number`.\n   */\n  toBeEven(): void,\n\n  /**\n   * Use `.toBeOdd` when checking if a value is an odd `Number`.\n   */\n  toBeOdd(): void,\n\n  /**\n   * Use `.toBeWithin` when checking if a number is in between the given bounds of: start (inclusive) and end (exclusive).\n   *\n   * @param {Number} start\n   * @param {Number} end\n   */\n  toBeWithin(start: number, end: number): void,\n\n  /**\n   * Use `.toBeObject` when checking if a value is an `Object`.\n   */\n  toBeObject(): void,\n\n  /**\n   * Use `.toContainKey` when checking if an object contains the provided key.\n   *\n   * @param {String} key\n   */\n  toContainKey(key: string): void,\n\n  /**\n   * Use `.toContainKeys` when checking if an object has all of the provided keys.\n   *\n   * @param {Array.<String>} keys\n   */\n  toContainKeys(keys: string[]): void,\n\n  /**\n   * Use `.toContainAllKeys` when checking if an object only contains all of the provided keys.\n   *\n   * @param {Array.<String>} keys\n   */\n  toContainAllKeys(keys: string[]): void,\n\n  /**\n   * Use `.toContainAnyKeys` when checking if an object contains at least one of the provided keys.\n   *\n   * @param {Array.<String>} keys\n   */\n  toContainAnyKeys(keys: string[]): void,\n\n  /**\n   * Use `.toContainValue` when checking if an object contains the provided value.\n   *\n   * @param {*} value\n   */\n  toContainValue(value: any): void,\n\n  /**\n   * Use `.toContainValues` when checking if an object contains all of the provided values.\n   *\n   * @param {Array.<*>} values\n   */\n  toContainValues(values: any[]): void,\n\n  /**\n   * Use `.toContainAllValues` when checking if an object only contains all of the provided values.\n   *\n   * @param {Array.<*>} values\n   */\n  toContainAllValues(values: any[]): void,\n\n  /**\n   * Use `.toContainAnyValues` when checking if an object contains at least one of the provided values.\n   *\n   * @param {Array.<*>} values\n   */\n  toContainAnyValues(values: any[]): void,\n\n  /**\n   * Use `.toContainEntry` when checking if an object contains the provided entry.\n   *\n   * @param {Array.<String, String>} entry\n   */\n  toContainEntry(entry: [string, string]): void,\n\n  /**\n   * Use `.toContainEntries` when checking if an object contains all of the provided entries.\n   *\n   * @param {Array.<Array.<String, String>>} entries\n   */\n  toContainEntries(entries: [string, string][]): void,\n\n  /**\n   * Use `.toContainAllEntries` when checking if an object only contains all of the provided entries.\n   *\n   * @param {Array.<Array.<String, String>>} entries\n   */\n  toContainAllEntries(entries: [string, string][]): void,\n\n  /**\n   * Use `.toContainAnyEntries` when checking if an object contains at least one of the provided entries.\n   *\n   * @param {Array.<Array.<String, String>>} entries\n   */\n  toContainAnyEntries(entries: [string, string][]): void,\n\n  /**\n   * Use `.toBeExtensible` when checking if an object is extensible.\n   */\n  toBeExtensible(): void,\n\n  /**\n   * Use `.toBeFrozen` when checking if an object is frozen.\n   */\n  toBeFrozen(): void,\n\n  /**\n   * Use `.toBeSealed` when checking if an object is sealed.\n   */\n  toBeSealed(): void,\n\n  /**\n   * Use `.toBeString` when checking if a value is a `String`.\n   */\n  toBeString(): void,\n\n  /**\n   * Use `.toEqualCaseInsensitive` when checking if a string is equal (===) to another ignoring the casing of both strings.\n   *\n   * @param {String} string\n   */\n  toEqualCaseInsensitive(string: string): void,\n\n  /**\n   * Use `.toStartWith` when checking if a `String` starts with a given `String` prefix.\n   *\n   * @param {String} prefix\n   */\n  toStartWith(prefix: string): void,\n\n  /**\n   * Use `.toEndWith` when checking if a `String` ends with a given `String` suffix.\n   *\n   * @param {String} suffix\n   */\n  toEndWith(suffix: string): void,\n\n  /**\n   * Use `.toInclude` when checking if a `String` includes the given `String` substring.\n   *\n   * @param {String} substring\n   */\n  toInclude(substring: string): void,\n\n  /**\n   * Use `.toIncludeRepeated` when checking if a `String` includes the given `String` substring the correct number of times.\n   *\n   * @param {String} substring\n   * @param {Number} times\n   */\n  toIncludeRepeated(substring: string, times: number): void,\n\n  /**\n   * Use `.toIncludeMultiple` when checking if a `String` includes all of the given substrings.\n   *\n   * @param {Array.<String>} substring\n   */\n  toIncludeMultiple(substring: string[]): void,\n};\n\ntype JestExpectType = {\n  not: JestExpectType &\n    EnzymeMatchersType &\n    DomTestingLibraryType &\n    JestJQueryMatchersType &\n    JestExtendedMatchersType,\n  /**\n   * If you have a mock function, you can use .lastCalledWith to test what\n   * arguments it was last called with.\n   */\n  lastCalledWith(...args: Array<any>): void,\n  /**\n   * toBe just checks that a value is what you expect. It uses === to check\n   * strict equality.\n   */\n  toBe(value: any): void,\n  /**\n   * Use .toHaveBeenCalled to ensure that a mock function got called.\n   */\n  toBeCalled(): void,\n  /**\n   * Use .toBeCalledWith to ensure that a mock function was called with\n   * specific arguments.\n   */\n  toBeCalledWith(...args: Array<any>): void,\n  /**\n   * Using exact equality with floating point numbers is a bad idea. Rounding\n   * means that intuitive things fail.\n   */\n  toBeCloseTo(num: number, delta: any): void,\n  /**\n   * Use .toBeDefined to check that a variable is not undefined.\n   */\n  toBeDefined(): void,\n  /**\n   * Use .toBeFalsy when you don't care what a value is, you just want to\n   * ensure a value is false in a boolean context.\n   */\n  toBeFalsy(): void,\n  /**\n   * To compare floating point numbers, you can use toBeGreaterThan.\n   */\n  toBeGreaterThan(number: number): void,\n  /**\n   * To compare floating point numbers, you can use toBeGreaterThanOrEqual.\n   */\n  toBeGreaterThanOrEqual(number: number): void,\n  /**\n   * To compare floating point numbers, you can use toBeLessThan.\n   */\n  toBeLessThan(number: number): void,\n  /**\n   * To compare floating point numbers, you can use toBeLessThanOrEqual.\n   */\n  toBeLessThanOrEqual(number: number): void,\n  /**\n   * Use .toBeInstanceOf(Class) to check that an object is an instance of a\n   * class.\n   */\n  toBeInstanceOf(cls: Class<*>): void,\n  /**\n   * .toBeNull() is the same as .toBe(null) but the error messages are a bit\n   * nicer.\n   */\n  toBeNull(): void,\n  /**\n   * Use .toBeTruthy when you don't care what a value is, you just want to\n   * ensure a value is true in a boolean context.\n   */\n  toBeTruthy(): void,\n  /**\n   * Use .toBeUndefined to check that a variable is undefined.\n   */\n  toBeUndefined(): void,\n  /**\n   * Use .toContain when you want to check that an item is in a list. For\n   * testing the items in the list, this uses ===, a strict equality check.\n   */\n  toContain(item: any): void,\n  /**\n   * Use .toContainEqual when you want to check that an item is in a list. For\n   * testing the items in the list, this matcher recursively checks the\n   * equality of all fields, rather than checking for object identity.\n   */\n  toContainEqual(item: any): void,\n  /**\n   * Use .toEqual when you want to check that two objects have the same value.\n   * This matcher recursively checks the equality of all fields, rather than\n   * checking for object identity.\n   */\n  toEqual(value: any): void,\n  /**\n   * Use .toHaveBeenCalled to ensure that a mock function got called.\n   */\n  toHaveBeenCalled(): void,\n  /**\n   * Use .toHaveBeenCalledTimes to ensure that a mock function got called exact\n   * number of times.\n   */\n  toHaveBeenCalledTimes(number: number): void,\n  /**\n   * Use .toHaveBeenCalledWith to ensure that a mock function was called with\n   * specific arguments.\n   */\n  toHaveBeenCalledWith(...args: Array<any>): void,\n  /**\n   * Use .toHaveBeenLastCalledWith to ensure that a mock function was last called\n   * with specific arguments.\n   */\n  toHaveBeenLastCalledWith(...args: Array<any>): void,\n  /**\n   * Check that an object has a .length property and it is set to a certain\n   * numeric value.\n   */\n  toHaveLength(number: number): void,\n  /**\n   *\n   */\n  toHaveProperty(propPath: string | Array<string>, value?: any): void,\n  /**\n   * Use .toMatch to check that a string matches a regular expression or string.\n   */\n  toMatch(regexpOrString: RegExp | string): void,\n  /**\n   * Use .toMatchObject to check that a javascript object matches a subset of the properties of an object.\n   */\n  toMatchObject(object: Object | Array<Object>): void,\n  /**\n   * This ensures that a React component matches the most recent snapshot.\n   */\n  toMatchSnapshot(name?: string): void,\n  /**\n   * Use .toThrow to test that a function throws when it is called.\n   * If you want to test that a specific error gets thrown, you can provide an\n   * argument to toThrow. The argument can be a string for the error message,\n   * a class for the error, or a regex that should match the error.\n   *\n   * Alias: .toThrowError\n   */\n  toThrow(message?: string | Error | Class<Error> | RegExp): void,\n  toThrowError(message?: string | Error | Class<Error> | RegExp): void,\n  /**\n   * Use .toThrowErrorMatchingSnapshot to test that a function throws a error\n   * matching the most recent snapshot when it is called.\n   */\n  toThrowErrorMatchingSnapshot(): void,\n};\n\ntype JestObjectType = {\n  /**\n   *  Disables automatic mocking in the module loader.\n   *\n   *  After this method is called, all `require()`s will return the real\n   *  versions of each module (rather than a mocked version).\n   */\n  disableAutomock(): JestObjectType,\n  /**\n   * An un-hoisted version of disableAutomock\n   */\n  autoMockOff(): JestObjectType,\n  /**\n   * Enables automatic mocking in the module loader.\n   */\n  enableAutomock(): JestObjectType,\n  /**\n   * An un-hoisted version of enableAutomock\n   */\n  autoMockOn(): JestObjectType,\n  /**\n   * Clears the mock.calls and mock.instances properties of all mocks.\n   * Equivalent to calling .mockClear() on every mocked function.\n   */\n  clearAllMocks(): JestObjectType,\n  /**\n   * Resets the state of all mocks. Equivalent to calling .mockReset() on every\n   * mocked function.\n   */\n  resetAllMocks(): JestObjectType,\n  /**\n   * Restores all mocks back to their original value.\n   */\n  restoreAllMocks(): JestObjectType,\n  /**\n   * Removes any pending timers from the timer system.\n   */\n  clearAllTimers(): void,\n  /**\n   * The same as `mock` but not moved to the top of the expectation by\n   * babel-jest.\n   */\n  doMock(moduleName: string, moduleFactory?: any): JestObjectType,\n  /**\n   * The same as `unmock` but not moved to the top of the expectation by\n   * babel-jest.\n   */\n  dontMock(moduleName: string): JestObjectType,\n  /**\n   * Returns a new, unused mock function. Optionally takes a mock\n   * implementation.\n   */\n  fn<TArguments: $ReadOnlyArray<*>, TReturn>(\n    implementation?: (...args: TArguments) => TReturn,\n  ): JestMockFn<TArguments, TReturn>,\n  /**\n   * Determines if the given function is a mocked function.\n   */\n  isMockFunction(fn: Function): boolean,\n  /**\n   * Given the name of a module, use the automatic mocking system to generate a\n   * mocked version of the module for you.\n   */\n  genMockFromModule(moduleName: string): any,\n  /**\n   * Mocks a module with an auto-mocked version when it is being required.\n   *\n   * The second argument can be used to specify an explicit module factory that\n   * is being run instead of using Jest's automocking feature.\n   *\n   * The third argument can be used to create virtual mocks -- mocks of modules\n   * that don't exist anywhere in the system.\n   */\n  mock(\n    moduleName: string,\n    moduleFactory?: any,\n    options?: Object,\n  ): JestObjectType,\n  /**\n   * Returns the actual module instead of a mock, bypassing all checks on\n   * whether the module should receive a mock implementation or not.\n   */\n  requireActual(moduleName: string): any,\n  /**\n   * Returns a mock module instead of the actual module, bypassing all checks\n   * on whether the module should be required normally or not.\n   */\n  requireMock(moduleName: string): any,\n  /**\n   * Resets the module registry - the cache of all required modules. This is\n   * useful to isolate modules where local state might conflict between tests.\n   */\n  resetModules(): JestObjectType,\n  /**\n   * Exhausts the micro-task queue (usually interfaced in node via\n   * process.nextTick).\n   */\n  runAllTicks(): void,\n  /**\n   * Exhausts the macro-task queue (i.e., all tasks queued by setTimeout(),\n   * setInterval(), and setImmediate()).\n   */\n  runAllTimers(): void,\n  /**\n   * Exhausts all tasks queued by setImmediate().\n   */\n  runAllImmediates(): void,\n  /**\n   * Executes only the macro task queue (i.e. all tasks queued by setTimeout()\n   * or setInterval() and setImmediate()).\n   */\n  advanceTimersByTime(msToRun: number): void,\n  /**\n   * Executes only the macro task queue (i.e. all tasks queued by setTimeout()\n   * or setInterval() and setImmediate()).\n   *\n   * Renamed to `advanceTimersByTime`.\n   */\n  runTimersToTime(msToRun: number): void,\n  /**\n   * Executes only the macro-tasks that are currently pending (i.e., only the\n   * tasks that have been queued by setTimeout() or setInterval() up to this\n   * point)\n   */\n  runOnlyPendingTimers(): void,\n  /**\n   * Explicitly supplies the mock object that the module system should return\n   * for the specified module. Note: It is recommended to use jest.mock()\n   * instead.\n   */\n  setMock(moduleName: string, moduleExports: any): JestObjectType,\n  /**\n   * Indicates that the module system should never return a mocked version of\n   * the specified module from require() (e.g. that it should always return the\n   * real module).\n   */\n  unmock(moduleName: string): JestObjectType,\n  /**\n   * Instructs Jest to use fake versions of the standard timer functions\n   * (setTimeout, setInterval, clearTimeout, clearInterval, nextTick,\n   * setImmediate and clearImmediate).\n   */\n  useFakeTimers(): JestObjectType,\n  /**\n   * Instructs Jest to use the real versions of the standard timer functions.\n   */\n  useRealTimers(): JestObjectType,\n  /**\n   * Creates a mock function similar to jest.fn but also tracks calls to\n   * object[methodName].\n   */\n  spyOn(\n    object: Object,\n    methodName: string,\n    accessType?: \"get\" | \"set\",\n  ): JestMockFn<any, any>,\n  /**\n   * Set the default timeout interval for tests and before/after hooks in milliseconds.\n   * Note: The default timeout interval is 5 seconds if this method is not called.\n   */\n  setTimeout(timeout: number): JestObjectType,\n};\n\ntype JestSpyType = {\n  calls: JestCallsType,\n};\n\n/** Runs this function after every test inside this context */\ndeclare function afterEach(\n  fn: (done: () => void) => ?Promise<mixed>,\n  timeout?: number,\n): void;\n/** Runs this function before every test inside this context */\ndeclare function beforeEach(\n  fn: (done: () => void) => ?Promise<mixed>,\n  timeout?: number,\n): void;\n/** Runs this function after all tests have finished inside this context */\ndeclare function afterAll(\n  fn: (done: () => void) => ?Promise<mixed>,\n  timeout?: number,\n): void;\n/** Runs this function before any tests have started inside this context */\ndeclare function beforeAll(\n  fn: (done: () => void) => ?Promise<mixed>,\n  timeout?: number,\n): void;\n\n/** A context for grouping tests together */\ndeclare var describe: {\n  /**\n   * Creates a block that groups together several related tests in one \"test suite\"\n   */\n  (name: JestTestName, fn: () => void): void,\n\n  /**\n   * Only run this describe block\n   */\n  only(name: JestTestName, fn: () => void): void,\n\n  /**\n   * Skip running this describe block\n   */\n  skip(name: JestTestName, fn: () => void): void,\n};\n\n/** An individual test unit */\ndeclare var it: {\n  /**\n   * An individual test unit\n   *\n   * @param {JestTestName} Name of Test\n   * @param {Function} Test\n   * @param {number} Timeout for the test, in milliseconds.\n   */\n  (\n    name: JestTestName,\n    fn?: (done: () => void) => ?Promise<mixed>,\n    timeout?: number,\n  ): void,\n  /**\n   * Only run this test\n   *\n   * @param {JestTestName} Name of Test\n   * @param {Function} Test\n   * @param {number} Timeout for the test, in milliseconds.\n   */\n  only(\n    name: JestTestName,\n    fn?: (done: () => void) => ?Promise<mixed>,\n    timeout?: number,\n  ): void,\n  /**\n   * Skip running this test\n   *\n   * @param {JestTestName} Name of Test\n   * @param {Function} Test\n   * @param {number} Timeout for the test, in milliseconds.\n   */\n  skip(\n    name: JestTestName,\n    fn?: (done: () => void) => ?Promise<mixed>,\n    timeout?: number,\n  ): void,\n  /**\n   * Run the test concurrently\n   *\n   * @param {JestTestName} Name of Test\n   * @param {Function} Test\n   * @param {number} Timeout for the test, in milliseconds.\n   */\n  concurrent(\n    name: JestTestName,\n    fn?: (done: () => void) => ?Promise<mixed>,\n    timeout?: number,\n  ): void,\n};\ndeclare function fit(\n  name: JestTestName,\n  fn: (done: () => void) => ?Promise<mixed>,\n  timeout?: number,\n): void;\n/** An individual test unit */\ndeclare var test: typeof it;\n/** A disabled group of tests */\ndeclare var xdescribe: typeof describe;\n/** A focused group of tests */\ndeclare var fdescribe: typeof describe;\n/** A disabled individual test */\ndeclare var xit: typeof it;\n/** A disabled individual test */\ndeclare var xtest: typeof it;\n\ntype JestPrettyFormatColors = {\n  comment: { close: string, open: string },\n  content: { close: string, open: string },\n  prop: { close: string, open: string },\n  tag: { close: string, open: string },\n  value: { close: string, open: string },\n};\n\ntype JestPrettyFormatIndent = string => string;\ntype JestPrettyFormatRefs = Array<any>;\ntype JestPrettyFormatPrint = any => string;\ntype JestPrettyFormatStringOrNull = string | null;\n\ntype JestPrettyFormatOptions = {|\n  callToJSON: boolean,\n  edgeSpacing: string,\n  escapeRegex: boolean,\n  highlight: boolean,\n  indent: number,\n  maxDepth: number,\n  min: boolean,\n  plugins: JestPrettyFormatPlugins,\n  printFunctionName: boolean,\n  spacing: string,\n  theme: {|\n    comment: string,\n    content: string,\n    prop: string,\n    tag: string,\n    value: string,\n  |},\n|};\n\ntype JestPrettyFormatPlugin = {\n  print: (\n    val: any,\n    serialize: JestPrettyFormatPrint,\n    indent: JestPrettyFormatIndent,\n    opts: JestPrettyFormatOptions,\n    colors: JestPrettyFormatColors,\n  ) => string,\n  test: any => boolean,\n};\n\ntype JestPrettyFormatPlugins = Array<JestPrettyFormatPlugin>;\n\n/** The expect function is used every time you want to test a value */\ndeclare var expect: {\n  /** The object that you want to make assertions against */\n  (\n    value: any,\n  ): JestExpectType &\n    JestPromiseType &\n    EnzymeMatchersType &\n    DomTestingLibraryType &\n    JestJQueryMatchersType &\n    JestExtendedMatchersType,\n  /** Add additional Jasmine matchers to Jest's roster */\n  extend(matchers: { [name: string]: JestMatcher }): void,\n  /** Add a module that formats application-specific data structures. */\n  addSnapshotSerializer(pluginModule: JestPrettyFormatPlugin): void,\n  assertions(expectedAssertions: number): void,\n  hasAssertions(): void,\n  any(value: mixed): JestAsymmetricEqualityType,\n  anything(): any,\n  arrayContaining(value: Array<mixed>): Array<mixed>,\n  objectContaining(value: Object): Object,\n  /** Matches any received string that contains the exact expected string. */\n  stringContaining(value: string): string,\n  stringMatching(value: string | RegExp): string,\n};\n\n// TODO handle return type\n// http://jasmine.github.io/2.4/introduction.html#section-Spies\ndeclare function spyOn(value: mixed, method: string): Object;\n\n/** Holds all functions related to manipulating test runner */\ndeclare var jest: JestObjectType;\n\n/**\n * The global Jasmine object, this is generally not exposed as the public API,\n * using features inside here could break in later versions of Jest.\n */\ndeclare var jasmine: {\n  DEFAULT_TIMEOUT_INTERVAL: number,\n  any(value: mixed): JestAsymmetricEqualityType,\n  anything(): any,\n  arrayContaining(value: Array<mixed>): Array<mixed>,\n  clock(): JestClockType,\n  createSpy(name: string): JestSpyType,\n  createSpyObj(\n    baseName: string,\n    methodNames: Array<string>,\n  ): { [methodName: string]: JestSpyType },\n  objectContaining(value: Object): Object,\n  stringMatching(value: string): string,\n};\n"
  },
  {
    "path": "flow-typed/npm/lerna_vx.x.x.js",
    "content": "// flow-typed signature: dea8c2cdb570f5110a2f084f67700a40\n// flow-typed version: <<STUB>>/lerna_v^3.4.0/flow_v0.87.0\n\n/**\n * This is an autogenerated libdef stub for:\n *\n *   'lerna'\n *\n * Fill this stub out by replacing all the `any` types.\n *\n * Once filled out, we encourage you to share your work with the\n * community by sending a pull request to:\n * https://github.com/flowtype/flow-typed\n */\n\ndeclare module \"lerna\" {\n  declare module.exports: any;\n}\n\n/**\n * We include stubs for each file inside this npm package in case you need to\n * require those files directly. Feel free to delete any files that aren't\n * needed.\n */\ndeclare module \"lerna/cli\" {\n  declare module.exports: any;\n}\n\n// Filename aliases\ndeclare module \"lerna/cli.js\" {\n  declare module.exports: $Exports<\"lerna/cli\">;\n}\ndeclare module \"lerna/index\" {\n  declare module.exports: $Exports<\"lerna\">;\n}\ndeclare module \"lerna/index.js\" {\n  declare module.exports: $Exports<\"lerna\">;\n}\n"
  },
  {
    "path": "flow-typed/npm/lint-staged_vx.x.x.js",
    "content": "// flow-typed signature: 52d11ac57e26bd759516e37fd05b87e9\n// flow-typed version: <<STUB>>/lint-staged_v^3.4.0/flow_v0.87.0\n\n/**\n * This is an autogenerated libdef stub for:\n *\n *   'lint-staged'\n *\n * Fill this stub out by replacing all the `any` types.\n *\n * Once filled out, we encourage you to share your work with the\n * community by sending a pull request to:\n * https://github.com/flowtype/flow-typed\n */\n\ndeclare module \"lint-staged\" {\n  declare module.exports: any;\n}\n\n/**\n * We include stubs for each file inside this npm package in case you need to\n * require those files directly. Feel free to delete any files that aren't\n * needed.\n */\ndeclare module \"lint-staged/src/calcChunkSize\" {\n  declare module.exports: any;\n}\n\ndeclare module \"lint-staged/src/findBin\" {\n  declare module.exports: any;\n}\n\ndeclare module \"lint-staged/src/generateTasks\" {\n  declare module.exports: any;\n}\n\ndeclare module \"lint-staged/src/index\" {\n  declare module.exports: any;\n}\n\ndeclare module \"lint-staged/src/readConfigOption\" {\n  declare module.exports: any;\n}\n\ndeclare module \"lint-staged/src/runScript\" {\n  declare module.exports: any;\n}\n\ndeclare module \"lint-staged/test/__mocks__/execa\" {\n  declare module.exports: any;\n}\n\ndeclare module \"lint-staged/test/__mocks__/npm-which\" {\n  declare module.exports: any;\n}\n\ndeclare module \"lint-staged/test/calcChunkSize.spec\" {\n  declare module.exports: any;\n}\n\ndeclare module \"lint-staged/test/findBin.spec\" {\n  declare module.exports: any;\n}\n\ndeclare module \"lint-staged/test/generateTasks.spec\" {\n  declare module.exports: any;\n}\n\ndeclare module \"lint-staged/test/readConfigOption.spec\" {\n  declare module.exports: any;\n}\n\ndeclare module \"lint-staged/test/runScript-mock-findBin.spec\" {\n  declare module.exports: any;\n}\n\ndeclare module \"lint-staged/test/runScript-mock-pMap.spec\" {\n  declare module.exports: any;\n}\n\ndeclare module \"lint-staged/test/runScript.spec\" {\n  declare module.exports: any;\n}\n\ndeclare module \"lint-staged/wallaby\" {\n  declare module.exports: any;\n}\n\n// Filename aliases\ndeclare module \"lint-staged/index\" {\n  declare module.exports: $Exports<\"lint-staged\">;\n}\ndeclare module \"lint-staged/index.js\" {\n  declare module.exports: $Exports<\"lint-staged\">;\n}\ndeclare module \"lint-staged/src/calcChunkSize.js\" {\n  declare module.exports: $Exports<\"lint-staged/src/calcChunkSize\">;\n}\ndeclare module \"lint-staged/src/findBin.js\" {\n  declare module.exports: $Exports<\"lint-staged/src/findBin\">;\n}\ndeclare module \"lint-staged/src/generateTasks.js\" {\n  declare module.exports: $Exports<\"lint-staged/src/generateTasks\">;\n}\ndeclare module \"lint-staged/src/index.js\" {\n  declare module.exports: $Exports<\"lint-staged/src/index\">;\n}\ndeclare module \"lint-staged/src/readConfigOption.js\" {\n  declare module.exports: $Exports<\"lint-staged/src/readConfigOption\">;\n}\ndeclare module \"lint-staged/src/runScript.js\" {\n  declare module.exports: $Exports<\"lint-staged/src/runScript\">;\n}\ndeclare module \"lint-staged/test/__mocks__/execa.js\" {\n  declare module.exports: $Exports<\"lint-staged/test/__mocks__/execa\">;\n}\ndeclare module \"lint-staged/test/__mocks__/npm-which.js\" {\n  declare module.exports: $Exports<\"lint-staged/test/__mocks__/npm-which\">;\n}\ndeclare module \"lint-staged/test/calcChunkSize.spec.js\" {\n  declare module.exports: $Exports<\"lint-staged/test/calcChunkSize.spec\">;\n}\ndeclare module \"lint-staged/test/findBin.spec.js\" {\n  declare module.exports: $Exports<\"lint-staged/test/findBin.spec\">;\n}\ndeclare module \"lint-staged/test/generateTasks.spec.js\" {\n  declare module.exports: $Exports<\"lint-staged/test/generateTasks.spec\">;\n}\ndeclare module \"lint-staged/test/readConfigOption.spec.js\" {\n  declare module.exports: $Exports<\"lint-staged/test/readConfigOption.spec\">;\n}\ndeclare module \"lint-staged/test/runScript-mock-findBin.spec.js\" {\n  declare module.exports: $Exports<\n    \"lint-staged/test/runScript-mock-findBin.spec\",\n  >;\n}\ndeclare module \"lint-staged/test/runScript-mock-pMap.spec.js\" {\n  declare module.exports: $Exports<\"lint-staged/test/runScript-mock-pMap.spec\">;\n}\ndeclare module \"lint-staged/test/runScript.spec.js\" {\n  declare module.exports: $Exports<\"lint-staged/test/runScript.spec\">;\n}\ndeclare module \"lint-staged/wallaby.js\" {\n  declare module.exports: $Exports<\"lint-staged/wallaby\">;\n}\n"
  },
  {
    "path": "flow-typed/npm/lodash.deburr_vx.x.x.js",
    "content": "// flow-typed signature: 6c41a57b8e8e804d91fd3df79603ba04\n// flow-typed version: <<STUB>>/lodash.deburr_v4/flow_v0.68.0\n\n/**\n * This is an autogenerated libdef stub for:\n *\n *   'lodash.deburr'\n *\n * Fill this stub out by replacing all the `any` types.\n *\n * Once filled out, we encourage you to share your work with the\n * community by sending a pull request to:\n * https://github.com/flowtype/flow-typed\n */\n\ndeclare module \"lodash.deburr\" {\n  declare module.exports: any;\n}\n\n/**\n * We include stubs for each file inside this npm package in case you need to\n * require those files directly. Feel free to delete any files that aren't\n * needed.\n */\n\n// Filename aliases\ndeclare module \"lodash.deburr/index\" {\n  declare module.exports: $Exports<\"lodash.deburr\">;\n}\ndeclare module \"lodash.deburr/index.js\" {\n  declare module.exports: $Exports<\"lodash.deburr\">;\n}\n"
  },
  {
    "path": "flow-typed/npm/lodash.flatten_vx.x.x.js",
    "content": "// flow-typed signature: ee088e07465135c5ff23e4771049cfed\n// flow-typed version: <<STUB>>/lodash.flatten_v4/flow_v0.68.0\n\n/**\n * This is an autogenerated libdef stub for:\n *\n *   'lodash.flatten'\n *\n * Fill this stub out by replacing all the `any` types.\n *\n * Once filled out, we encourage you to share your work with the\n * community by sending a pull request to:\n * https://github.com/flowtype/flow-typed\n */\n\ndeclare module \"lodash.flatten\" {\n  declare module.exports: any;\n}\n\n/**\n * We include stubs for each file inside this npm package in case you need to\n * require those files directly. Feel free to delete any files that aren't\n * needed.\n */\n\n// Filename aliases\ndeclare module \"lodash.flatten/index\" {\n  declare module.exports: $Exports<\"lodash.flatten\">;\n}\ndeclare module \"lodash.flatten/index.js\" {\n  declare module.exports: $Exports<\"lodash.flatten\">;\n}\n"
  },
  {
    "path": "flow-typed/npm/lodash.kebabcase_vx.x.x.js",
    "content": "// flow-typed signature: d4169c8eec47d24767c5b2f549b16fe8\n// flow-typed version: <<STUB>>/lodash.kebabcase_v4/flow_v0.68.0\n\n/**\n * This is an autogenerated libdef stub for:\n *\n *   'lodash.kebabcase'\n *\n * Fill this stub out by replacing all the `any` types.\n *\n * Once filled out, we encourage you to share your work with the\n * community by sending a pull request to:\n * https://github.com/flowtype/flow-typed\n */\n\ndeclare module \"lodash.kebabcase\" {\n  declare module.exports: any;\n}\n\n/**\n * We include stubs for each file inside this npm package in case you need to\n * require those files directly. Feel free to delete any files that aren't\n * needed.\n */\n\n// Filename aliases\ndeclare module \"lodash.kebabcase/index\" {\n  declare module.exports: $Exports<\"lodash.kebabcase\">;\n}\ndeclare module \"lodash.kebabcase/index.js\" {\n  declare module.exports: $Exports<\"lodash.kebabcase\">;\n}\n"
  },
  {
    "path": "flow-typed/npm/npm-run-all_vx.x.x.js",
    "content": "// flow-typed signature: 7428d43a1e98b019280134bdaf51cf41\n// flow-typed version: <<STUB>>/npm-run-all_v^3.0.0/flow_v0.87.0\n\n/**\n * This is an autogenerated libdef stub for:\n *\n *   'npm-run-all'\n *\n * Fill this stub out by replacing all the `any` types.\n *\n * Once filled out, we encourage you to share your work with the\n * community by sending a pull request to:\n * https://github.com/flowtype/flow-typed\n */\n\ndeclare module \"npm-run-all\" {\n  declare module.exports: any;\n}\n\n/**\n * We include stubs for each file inside this npm package in case you need to\n * require those files directly. Feel free to delete any files that aren't\n * needed.\n */\ndeclare module \"npm-run-all/bin/common/bootstrap\" {\n  declare module.exports: any;\n}\n\ndeclare module \"npm-run-all/bin/common/parse-cli-args\" {\n  declare module.exports: any;\n}\n\ndeclare module \"npm-run-all/bin/common/version\" {\n  declare module.exports: any;\n}\n\ndeclare module \"npm-run-all/bin/npm-run-all/help\" {\n  declare module.exports: any;\n}\n\ndeclare module \"npm-run-all/bin/npm-run-all/index\" {\n  declare module.exports: any;\n}\n\ndeclare module \"npm-run-all/bin/npm-run-all/main\" {\n  declare module.exports: any;\n}\n\ndeclare module \"npm-run-all/bin/run-p/help\" {\n  declare module.exports: any;\n}\n\ndeclare module \"npm-run-all/bin/run-p/index\" {\n  declare module.exports: any;\n}\n\ndeclare module \"npm-run-all/bin/run-p/main\" {\n  declare module.exports: any;\n}\n\ndeclare module \"npm-run-all/bin/run-s/help\" {\n  declare module.exports: any;\n}\n\ndeclare module \"npm-run-all/bin/run-s/index\" {\n  declare module.exports: any;\n}\n\ndeclare module \"npm-run-all/bin/run-s/main\" {\n  declare module.exports: any;\n}\n\ndeclare module \"npm-run-all/lib/create-header\" {\n  declare module.exports: any;\n}\n\ndeclare module \"npm-run-all/lib/create-prefix-transform-stream\" {\n  declare module.exports: any;\n}\n\ndeclare module \"npm-run-all/lib/index\" {\n  declare module.exports: any;\n}\n\ndeclare module \"npm-run-all/lib/match-tasks\" {\n  declare module.exports: any;\n}\n\ndeclare module \"npm-run-all/lib/npm-run-all-error\" {\n  declare module.exports: any;\n}\n\ndeclare module \"npm-run-all/lib/read-package-json\" {\n  declare module.exports: any;\n}\n\ndeclare module \"npm-run-all/lib/run-task\" {\n  declare module.exports: any;\n}\n\ndeclare module \"npm-run-all/lib/run-tasks-in-parallel\" {\n  declare module.exports: any;\n}\n\ndeclare module \"npm-run-all/lib/run-tasks-in-sequencial\" {\n  declare module.exports: any;\n}\n\ndeclare module \"npm-run-all/lib/spawn-posix\" {\n  declare module.exports: any;\n}\n\ndeclare module \"npm-run-all/lib/spawn-win32\" {\n  declare module.exports: any;\n}\n\ndeclare module \"npm-run-all/lib/spawn\" {\n  declare module.exports: any;\n}\n\n// Filename aliases\ndeclare module \"npm-run-all/bin/common/bootstrap.js\" {\n  declare module.exports: $Exports<\"npm-run-all/bin/common/bootstrap\">;\n}\ndeclare module \"npm-run-all/bin/common/parse-cli-args.js\" {\n  declare module.exports: $Exports<\"npm-run-all/bin/common/parse-cli-args\">;\n}\ndeclare module \"npm-run-all/bin/common/version.js\" {\n  declare module.exports: $Exports<\"npm-run-all/bin/common/version\">;\n}\ndeclare module \"npm-run-all/bin/npm-run-all/help.js\" {\n  declare module.exports: $Exports<\"npm-run-all/bin/npm-run-all/help\">;\n}\ndeclare module \"npm-run-all/bin/npm-run-all/index.js\" {\n  declare module.exports: $Exports<\"npm-run-all/bin/npm-run-all/index\">;\n}\ndeclare module \"npm-run-all/bin/npm-run-all/main.js\" {\n  declare module.exports: $Exports<\"npm-run-all/bin/npm-run-all/main\">;\n}\ndeclare module \"npm-run-all/bin/run-p/help.js\" {\n  declare module.exports: $Exports<\"npm-run-all/bin/run-p/help\">;\n}\ndeclare module \"npm-run-all/bin/run-p/index.js\" {\n  declare module.exports: $Exports<\"npm-run-all/bin/run-p/index\">;\n}\ndeclare module \"npm-run-all/bin/run-p/main.js\" {\n  declare module.exports: $Exports<\"npm-run-all/bin/run-p/main\">;\n}\ndeclare module \"npm-run-all/bin/run-s/help.js\" {\n  declare module.exports: $Exports<\"npm-run-all/bin/run-s/help\">;\n}\ndeclare module \"npm-run-all/bin/run-s/index.js\" {\n  declare module.exports: $Exports<\"npm-run-all/bin/run-s/index\">;\n}\ndeclare module \"npm-run-all/bin/run-s/main.js\" {\n  declare module.exports: $Exports<\"npm-run-all/bin/run-s/main\">;\n}\ndeclare module \"npm-run-all/lib/create-header.js\" {\n  declare module.exports: $Exports<\"npm-run-all/lib/create-header\">;\n}\ndeclare module \"npm-run-all/lib/create-prefix-transform-stream.js\" {\n  declare module.exports: $Exports<\n    \"npm-run-all/lib/create-prefix-transform-stream\",\n  >;\n}\ndeclare module \"npm-run-all/lib/index.js\" {\n  declare module.exports: $Exports<\"npm-run-all/lib/index\">;\n}\ndeclare module \"npm-run-all/lib/match-tasks.js\" {\n  declare module.exports: $Exports<\"npm-run-all/lib/match-tasks\">;\n}\ndeclare module \"npm-run-all/lib/npm-run-all-error.js\" {\n  declare module.exports: $Exports<\"npm-run-all/lib/npm-run-all-error\">;\n}\ndeclare module \"npm-run-all/lib/read-package-json.js\" {\n  declare module.exports: $Exports<\"npm-run-all/lib/read-package-json\">;\n}\ndeclare module \"npm-run-all/lib/run-task.js\" {\n  declare module.exports: $Exports<\"npm-run-all/lib/run-task\">;\n}\ndeclare module \"npm-run-all/lib/run-tasks-in-parallel.js\" {\n  declare module.exports: $Exports<\"npm-run-all/lib/run-tasks-in-parallel\">;\n}\ndeclare module \"npm-run-all/lib/run-tasks-in-sequencial.js\" {\n  declare module.exports: $Exports<\"npm-run-all/lib/run-tasks-in-sequencial\">;\n}\ndeclare module \"npm-run-all/lib/spawn-posix.js\" {\n  declare module.exports: $Exports<\"npm-run-all/lib/spawn-posix\">;\n}\ndeclare module \"npm-run-all/lib/spawn-win32.js\" {\n  declare module.exports: $Exports<\"npm-run-all/lib/spawn-win32\">;\n}\ndeclare module \"npm-run-all/lib/spawn.js\" {\n  declare module.exports: $Exports<\"npm-run-all/lib/spawn\">;\n}\n"
  },
  {
    "path": "flow-typed/npm/p-map_vx.x.x.js",
    "content": "// flow-typed signature: 24d1d061bb4cc7d3bbacacbd5e4aa07c\n// flow-typed version: <<STUB>>/p-map_v1/flow_v0.68.0\n\n/**\n * This is an autogenerated libdef stub for:\n *\n *   'p-map'\n *\n * Fill this stub out by replacing all the `any` types.\n *\n * Once filled out, we encourage you to share your work with the\n * community by sending a pull request to:\n * https://github.com/flowtype/flow-typed\n */\n\ndeclare module \"p-map\" {\n  declare module.exports: any;\n}\n\n/**\n * We include stubs for each file inside this npm package in case you need to\n * require those files directly. Feel free to delete any files that aren't\n * needed.\n */\n\n// Filename aliases\ndeclare module \"p-map/index\" {\n  declare module.exports: $Exports<\"p-map\">;\n}\ndeclare module \"p-map/index.js\" {\n  declare module.exports: $Exports<\"p-map\">;\n}\n"
  },
  {
    "path": "flow-typed/npm/prettier_v1.x.x.js",
    "content": "// flow-typed signature: 066c92e9ccb5f0711df8d73cbca837d6\n// flow-typed version: 9e32affdbd/prettier_v1.x.x/flow_>=v0.56.x\n\ndeclare module \"prettier\" {\n  declare export type AST = Object;\n  declare export type Doc = Object;\n  declare export type FastPath = Object;\n\n  declare export type PrettierParserName =\n    | \"babylon\"\n    | \"flow\"\n    | \"typescript\"\n    | \"postcss\"\n    | \"css\"\n    | \"less\"\n    | \"scss\"\n    | \"json\"\n    | \"graphql\"\n    | \"markdown\"\n    | \"vue\";\n\n  declare export type PrettierParser = {\n    [name: PrettierParserName]: (text: string, options?: Object) => AST,\n  };\n\n  declare export type CustomParser = (\n    text: string,\n    parsers: PrettierParser,\n    options: Options,\n  ) => AST;\n\n  declare export type Options = {|\n    printWidth?: number,\n    tabWidth?: number,\n    useTabs?: boolean,\n    semi?: boolean,\n    singleQuote?: boolean,\n    trailingComma?: \"none\" | \"es5\" | \"all\",\n    bracketSpacing?: boolean,\n    jsxBracketSameLine?: boolean,\n    arrowParens?: \"avoid\" | \"always\",\n    rangeStart?: number,\n    rangeEnd?: number,\n    parser?: PrettierParserName | CustomParser,\n    filepath?: string,\n    requirePragma?: boolean,\n    insertPragma?: boolean,\n    proseWrap?: \"always\" | \"never\" | \"preserve\",\n    plugins?: Array<string | Plugin>,\n  |};\n\n  declare export type Plugin = {\n    languages: SupportLanguage,\n    parsers: { [parserName: string]: Parser },\n    printers: { [astFormat: string]: Printer },\n  };\n\n  declare export type Parser = {\n    parse: (\n      text: string,\n      parsers: { [parserName: string]: Parser },\n      options: Object,\n    ) => AST,\n    astFormat: string,\n  };\n\n  declare export type Printer = {\n    print: (\n      path: FastPath,\n      options: Object,\n      print: (path: FastPath) => Doc,\n    ) => Doc,\n    embed: (\n      path: FastPath,\n      print: (path: FastPath) => Doc,\n      textToDoc: (text: string, options: Object) => Doc,\n      options: Object,\n    ) => ?Doc,\n  };\n\n  declare export type CursorOptions = {|\n    cursorOffset: number,\n    printWidth?: $PropertyType<Options, \"printWidth\">,\n    tabWidth?: $PropertyType<Options, \"tabWidth\">,\n    useTabs?: $PropertyType<Options, \"useTabs\">,\n    semi?: $PropertyType<Options, \"semi\">,\n    singleQuote?: $PropertyType<Options, \"singleQuote\">,\n    trailingComma?: $PropertyType<Options, \"trailingComma\">,\n    bracketSpacing?: $PropertyType<Options, \"bracketSpacing\">,\n    jsxBracketSameLine?: $PropertyType<Options, \"jsxBracketSameLine\">,\n    arrowParens?: $PropertyType<Options, \"arrowParens\">,\n    parser?: $PropertyType<Options, \"parser\">,\n    filepath?: $PropertyType<Options, \"filepath\">,\n    requirePragma?: $PropertyType<Options, \"requirePragma\">,\n    insertPragma?: $PropertyType<Options, \"insertPragma\">,\n    proseWrap?: $PropertyType<Options, \"proseWrap\">,\n    plugins?: $PropertyType<Options, \"plugins\">,\n  |};\n\n  declare export type CursorResult = {|\n    formatted: string,\n    cursorOffset: number,\n  |};\n\n  declare export type ResolveConfigOptions = {|\n    useCache?: boolean,\n    config?: string,\n    editorconfig?: boolean,\n  |};\n\n  declare export type SupportLanguage = {\n    name: string,\n    since: string,\n    parsers: Array<string>,\n    group?: string,\n    tmScope: string,\n    aceMode: string,\n    codemirrorMode: string,\n    codemirrorMimeType: string,\n    aliases?: Array<string>,\n    extensions: Array<string>,\n    filenames?: Array<string>,\n    linguistLanguageId: number,\n    vscodeLanguageIds: Array<string>,\n  };\n\n  declare export type SupportOption = {|\n    since: string,\n    type: \"int\" | \"boolean\" | \"choice\" | \"path\",\n    deprecated?: string,\n    redirect?: SupportOptionRedirect,\n    description: string,\n    oppositeDescription?: string,\n    default: SupportOptionValue,\n    range?: SupportOptionRange,\n    choices?: SupportOptionChoice,\n  |};\n\n  declare export type SupportOptionRedirect = {|\n    options: string,\n    value: SupportOptionValue,\n  |};\n\n  declare export type SupportOptionRange = {|\n    start: number,\n    end: number,\n    step: number,\n  |};\n\n  declare export type SupportOptionChoice = {|\n    value: boolean | string,\n    description?: string,\n    since?: string,\n    deprecated?: string,\n    redirect?: SupportOptionValue,\n  |};\n\n  declare export type SupportOptionValue = number | boolean | string;\n\n  declare export type SupportInfo = {|\n    languages: Array<SupportLanguage>,\n    options: Array<SupportOption>,\n  |};\n\n  declare export type Prettier = {|\n    format: (source: string, options?: Options) => string,\n    check: (source: string, options?: Options) => boolean,\n    formatWithCursor: (source: string, options: CursorOptions) => CursorResult,\n    resolveConfig: {\n      (filePath: string, options?: ResolveConfigOptions): Promise<?Options>,\n      sync(filePath: string, options?: ResolveConfigOptions): ?Options,\n    },\n    clearConfigCache: () => void,\n    getSupportInfo: (version?: string) => SupportInfo,\n  |};\n\n  declare export default Prettier;\n}\n"
  },
  {
    "path": "flow-typed/npm/prop-types_v15.x.x.js",
    "content": "// flow-typed signature: d9a983bb1ac458a256c31c139047bdbb\n// flow-typed version: 927687984d/prop-types_v15.x.x/flow_>=v0.41.x\n\ntype $npm$propTypes$ReactPropsCheckType = (\n  props: any,\n  propName: string,\n  componentName: string,\n  href?: string,\n) => ?Error;\n\ndeclare module \"prop-types\" {\n  declare var array: React$PropType$Primitive<Array<any>>;\n  declare var bool: React$PropType$Primitive<boolean>;\n  declare var func: React$PropType$Primitive<Function>;\n  declare var number: React$PropType$Primitive<number>;\n  declare var object: React$PropType$Primitive<Object>;\n  declare var string: React$PropType$Primitive<string>;\n  declare var symbol: React$PropType$Primitive<Symbol>;\n  declare var any: React$PropType$Primitive<any>;\n  declare var arrayOf: React$PropType$ArrayOf;\n  declare var element: React$PropType$Primitive<any>; /* TODO */\n  declare var instanceOf: React$PropType$InstanceOf;\n  declare var node: React$PropType$Primitive<any>; /* TODO */\n  declare var objectOf: React$PropType$ObjectOf;\n  declare var oneOf: React$PropType$OneOf;\n  declare var oneOfType: React$PropType$OneOfType;\n  declare var shape: React$PropType$Shape;\n\n  declare function checkPropTypes<V>(\n    propTypes: $Subtype<{ [_: $Keys<V>]: $npm$propTypes$ReactPropsCheckType }>,\n    values: V,\n    location: string,\n    componentName: string,\n    getStack: ?() => ?string,\n  ): void;\n}\n"
  },
  {
    "path": "flow-typed/npm/radium_vx.x.x.js",
    "content": "// flow-typed signature: 448e8acf974245701845820402e2a591\n// flow-typed version: <<STUB>>/radium_v0/flow_v0.68.0\n\n/**\n * This is an autogenerated libdef stub for:\n *\n *   'radium'\n *\n * Fill this stub out by replacing all the `any` types.\n *\n * Once filled out, we encourage you to share your work with the\n * community by sending a pull request to:\n * https://github.com/flowtype/flow-typed\n */\n\ndeclare module \"radium\" {\n  declare module.exports: any;\n}\n\n/**\n * We include stubs for each file inside this npm package in case you need to\n * require those files directly. Feel free to delete any files that aren't\n * needed.\n */\ndeclare module \"radium/dist/radium\" {\n  declare module.exports: any;\n}\n\ndeclare module \"radium/dist/radium.min\" {\n  declare module.exports: any;\n}\n\ndeclare module \"radium/lib/append-important-to-each-value\" {\n  declare module.exports: any;\n}\n\ndeclare module \"radium/lib/append-px-if-needed\" {\n  declare module.exports: any;\n}\n\ndeclare module \"radium/lib/camel-case-props-to-dash-case\" {\n  declare module.exports: any;\n}\n\ndeclare module \"radium/lib/components/style-root\" {\n  declare module.exports: any;\n}\n\ndeclare module \"radium/lib/components/style-sheet\" {\n  declare module.exports: any;\n}\n\ndeclare module \"radium/lib/components/style\" {\n  declare module.exports: any;\n}\n\ndeclare module \"radium/lib/config\" {\n  declare module.exports: any;\n}\n\ndeclare module \"radium/lib/css-rule-set-to-string\" {\n  declare module.exports: any;\n}\n\ndeclare module \"radium/lib/enhancer\" {\n  declare module.exports: any;\n}\n\ndeclare module \"radium/lib/get-state-key\" {\n  declare module.exports: any;\n}\n\ndeclare module \"radium/lib/get-state\" {\n  declare module.exports: any;\n}\n\ndeclare module \"radium/lib/hash\" {\n  declare module.exports: any;\n}\n\ndeclare module \"radium/lib/index\" {\n  declare module.exports: any;\n}\n\ndeclare module \"radium/lib/keyframes\" {\n  declare module.exports: any;\n}\n\ndeclare module \"radium/lib/map-object\" {\n  declare module.exports: any;\n}\n\ndeclare module \"radium/lib/merge-styles\" {\n  declare module.exports: any;\n}\n\ndeclare module \"radium/lib/plugins/check-props-plugin\" {\n  declare module.exports: any;\n}\n\ndeclare module \"radium/lib/plugins/index\" {\n  declare module.exports: any;\n}\n\ndeclare module \"radium/lib/plugins/keyframes-plugin\" {\n  declare module.exports: any;\n}\n\ndeclare module \"radium/lib/plugins/merge-style-array-plugin\" {\n  declare module.exports: any;\n}\n\ndeclare module \"radium/lib/plugins/mouse-up-listener\" {\n  declare module.exports: any;\n}\n\ndeclare module \"radium/lib/plugins/prefix-plugin\" {\n  declare module.exports: any;\n}\n\ndeclare module \"radium/lib/plugins/remove-nested-styles-plugin\" {\n  declare module.exports: any;\n}\n\ndeclare module \"radium/lib/plugins/resolve-interaction-styles-plugin\" {\n  declare module.exports: any;\n}\n\ndeclare module \"radium/lib/plugins/resolve-media-queries-plugin\" {\n  declare module.exports: any;\n}\n\ndeclare module \"radium/lib/plugins/visited-plugin\" {\n  declare module.exports: any;\n}\n\ndeclare module \"radium/lib/prefixer\" {\n  declare module.exports: any;\n}\n\ndeclare module \"radium/lib/resolve-styles\" {\n  declare module.exports: any;\n}\n\ndeclare module \"radium/lib/style-keeper\" {\n  declare module.exports: any;\n}\n\ndeclare module \"radium/lib/test-helpers\" {\n  declare module.exports: any;\n}\n\ndeclare module \"radium/src/__mocks__/exenv\" {\n  declare module.exports: any;\n}\n\ndeclare module \"radium/src/__mocks__/prefixer\" {\n  declare module.exports: any;\n}\n\ndeclare module \"radium/src/__tests__/camel-case-props-to-dash-case-test\" {\n  declare module.exports: any;\n}\n\ndeclare module \"radium/src/__tests__/enhancer-test\" {\n  declare module.exports: any;\n}\n\ndeclare module \"radium/src/__tests__/get-state-test\" {\n  declare module.exports: any;\n}\n\ndeclare module \"radium/src/__tests__/keyframes-test\" {\n  declare module.exports: any;\n}\n\ndeclare module \"radium/src/__tests__/media-query-test\" {\n  declare module.exports: any;\n}\n\ndeclare module \"radium/src/__tests__/radium-test\" {\n  declare module.exports: any;\n}\n\ndeclare module \"radium/src/__tests__/remove-nested-styles-test\" {\n  declare module.exports: any;\n}\n\ndeclare module \"radium/src/__tests__/resolve-styles-test\" {\n  declare module.exports: any;\n}\n\ndeclare module \"radium/src/__tests__/style-component-test\" {\n  declare module.exports: any;\n}\n\ndeclare module \"radium/src/__tests__/visited-test\" {\n  declare module.exports: any;\n}\n\ndeclare module \"radium/src/append-important-to-each-value\" {\n  declare module.exports: any;\n}\n\ndeclare module \"radium/src/append-px-if-needed\" {\n  declare module.exports: any;\n}\n\ndeclare module \"radium/src/camel-case-props-to-dash-case\" {\n  declare module.exports: any;\n}\n\ndeclare module \"radium/src/components/style-root\" {\n  declare module.exports: any;\n}\n\ndeclare module \"radium/src/components/style-sheet\" {\n  declare module.exports: any;\n}\n\ndeclare module \"radium/src/components/style\" {\n  declare module.exports: any;\n}\n\ndeclare module \"radium/src/config\" {\n  declare module.exports: any;\n}\n\ndeclare module \"radium/src/css-rule-set-to-string\" {\n  declare module.exports: any;\n}\n\ndeclare module \"radium/src/enhancer\" {\n  declare module.exports: any;\n}\n\ndeclare module \"radium/src/get-state-key\" {\n  declare module.exports: any;\n}\n\ndeclare module \"radium/src/get-state\" {\n  declare module.exports: any;\n}\n\ndeclare module \"radium/src/hash\" {\n  declare module.exports: any;\n}\n\ndeclare module \"radium/src/index\" {\n  declare module.exports: any;\n}\n\ndeclare module \"radium/src/keyframes\" {\n  declare module.exports: any;\n}\n\ndeclare module \"radium/src/map-object\" {\n  declare module.exports: any;\n}\n\ndeclare module \"radium/src/merge-styles\" {\n  declare module.exports: any;\n}\n\ndeclare module \"radium/src/plugins/check-props-plugin\" {\n  declare module.exports: any;\n}\n\ndeclare module \"radium/src/plugins/index\" {\n  declare module.exports: any;\n}\n\ndeclare module \"radium/src/plugins/keyframes-plugin\" {\n  declare module.exports: any;\n}\n\ndeclare module \"radium/src/plugins/merge-style-array-plugin\" {\n  declare module.exports: any;\n}\n\ndeclare module \"radium/src/plugins/mouse-up-listener\" {\n  declare module.exports: any;\n}\n\ndeclare module \"radium/src/plugins/prefix-plugin\" {\n  declare module.exports: any;\n}\n\ndeclare module \"radium/src/plugins/remove-nested-styles-plugin\" {\n  declare module.exports: any;\n}\n\ndeclare module \"radium/src/plugins/resolve-interaction-styles-plugin\" {\n  declare module.exports: any;\n}\n\ndeclare module \"radium/src/plugins/resolve-media-queries-plugin\" {\n  declare module.exports: any;\n}\n\ndeclare module \"radium/src/plugins/visited-plugin\" {\n  declare module.exports: any;\n}\n\ndeclare module \"radium/src/prefixer\" {\n  declare module.exports: any;\n}\n\ndeclare module \"radium/src/resolve-styles\" {\n  declare module.exports: any;\n}\n\ndeclare module \"radium/src/style-keeper\" {\n  declare module.exports: any;\n}\n\ndeclare module \"radium/src/test-helpers\" {\n  declare module.exports: any;\n}\n\n// Filename aliases\ndeclare module \"radium/dist/radium.js\" {\n  declare module.exports: $Exports<\"radium/dist/radium\">;\n}\ndeclare module \"radium/dist/radium.min.js\" {\n  declare module.exports: $Exports<\"radium/dist/radium.min\">;\n}\ndeclare module \"radium/lib/append-important-to-each-value.js\" {\n  declare module.exports: $Exports<\"radium/lib/append-important-to-each-value\">;\n}\ndeclare module \"radium/lib/append-px-if-needed.js\" {\n  declare module.exports: $Exports<\"radium/lib/append-px-if-needed\">;\n}\ndeclare module \"radium/lib/camel-case-props-to-dash-case.js\" {\n  declare module.exports: $Exports<\"radium/lib/camel-case-props-to-dash-case\">;\n}\ndeclare module \"radium/lib/components/style-root.js\" {\n  declare module.exports: $Exports<\"radium/lib/components/style-root\">;\n}\ndeclare module \"radium/lib/components/style-sheet.js\" {\n  declare module.exports: $Exports<\"radium/lib/components/style-sheet\">;\n}\ndeclare module \"radium/lib/components/style.js\" {\n  declare module.exports: $Exports<\"radium/lib/components/style\">;\n}\ndeclare module \"radium/lib/config.js\" {\n  declare module.exports: $Exports<\"radium/lib/config\">;\n}\ndeclare module \"radium/lib/css-rule-set-to-string.js\" {\n  declare module.exports: $Exports<\"radium/lib/css-rule-set-to-string\">;\n}\ndeclare module \"radium/lib/enhancer.js\" {\n  declare module.exports: $Exports<\"radium/lib/enhancer\">;\n}\ndeclare module \"radium/lib/get-state-key.js\" {\n  declare module.exports: $Exports<\"radium/lib/get-state-key\">;\n}\ndeclare module \"radium/lib/get-state.js\" {\n  declare module.exports: $Exports<\"radium/lib/get-state\">;\n}\ndeclare module \"radium/lib/hash.js\" {\n  declare module.exports: $Exports<\"radium/lib/hash\">;\n}\ndeclare module \"radium/lib/index.js\" {\n  declare module.exports: $Exports<\"radium/lib/index\">;\n}\ndeclare module \"radium/lib/keyframes.js\" {\n  declare module.exports: $Exports<\"radium/lib/keyframes\">;\n}\ndeclare module \"radium/lib/map-object.js\" {\n  declare module.exports: $Exports<\"radium/lib/map-object\">;\n}\ndeclare module \"radium/lib/merge-styles.js\" {\n  declare module.exports: $Exports<\"radium/lib/merge-styles\">;\n}\ndeclare module \"radium/lib/plugins/check-props-plugin.js\" {\n  declare module.exports: $Exports<\"radium/lib/plugins/check-props-plugin\">;\n}\ndeclare module \"radium/lib/plugins/index.js\" {\n  declare module.exports: $Exports<\"radium/lib/plugins/index\">;\n}\ndeclare module \"radium/lib/plugins/keyframes-plugin.js\" {\n  declare module.exports: $Exports<\"radium/lib/plugins/keyframes-plugin\">;\n}\ndeclare module \"radium/lib/plugins/merge-style-array-plugin.js\" {\n  declare module.exports: $Exports<\n    \"radium/lib/plugins/merge-style-array-plugin\",\n  >;\n}\ndeclare module \"radium/lib/plugins/mouse-up-listener.js\" {\n  declare module.exports: $Exports<\"radium/lib/plugins/mouse-up-listener\">;\n}\ndeclare module \"radium/lib/plugins/prefix-plugin.js\" {\n  declare module.exports: $Exports<\"radium/lib/plugins/prefix-plugin\">;\n}\ndeclare module \"radium/lib/plugins/remove-nested-styles-plugin.js\" {\n  declare module.exports: $Exports<\n    \"radium/lib/plugins/remove-nested-styles-plugin\",\n  >;\n}\ndeclare module \"radium/lib/plugins/resolve-interaction-styles-plugin.js\" {\n  declare module.exports: $Exports<\n    \"radium/lib/plugins/resolve-interaction-styles-plugin\",\n  >;\n}\ndeclare module \"radium/lib/plugins/resolve-media-queries-plugin.js\" {\n  declare module.exports: $Exports<\n    \"radium/lib/plugins/resolve-media-queries-plugin\",\n  >;\n}\ndeclare module \"radium/lib/plugins/visited-plugin.js\" {\n  declare module.exports: $Exports<\"radium/lib/plugins/visited-plugin\">;\n}\ndeclare module \"radium/lib/prefixer.js\" {\n  declare module.exports: $Exports<\"radium/lib/prefixer\">;\n}\ndeclare module \"radium/lib/resolve-styles.js\" {\n  declare module.exports: $Exports<\"radium/lib/resolve-styles\">;\n}\ndeclare module \"radium/lib/style-keeper.js\" {\n  declare module.exports: $Exports<\"radium/lib/style-keeper\">;\n}\ndeclare module \"radium/lib/test-helpers.js\" {\n  declare module.exports: $Exports<\"radium/lib/test-helpers\">;\n}\ndeclare module \"radium/src/__mocks__/exenv.js\" {\n  declare module.exports: $Exports<\"radium/src/__mocks__/exenv\">;\n}\ndeclare module \"radium/src/__mocks__/prefixer.js\" {\n  declare module.exports: $Exports<\"radium/src/__mocks__/prefixer\">;\n}\ndeclare module \"radium/src/__tests__/camel-case-props-to-dash-case-test.js\" {\n  declare module.exports: $Exports<\n    \"radium/src/__tests__/camel-case-props-to-dash-case-test\",\n  >;\n}\ndeclare module \"radium/src/__tests__/enhancer-test.js\" {\n  declare module.exports: $Exports<\"radium/src/__tests__/enhancer-test\">;\n}\ndeclare module \"radium/src/__tests__/get-state-test.js\" {\n  declare module.exports: $Exports<\"radium/src/__tests__/get-state-test\">;\n}\ndeclare module \"radium/src/__tests__/keyframes-test.js\" {\n  declare module.exports: $Exports<\"radium/src/__tests__/keyframes-test\">;\n}\ndeclare module \"radium/src/__tests__/media-query-test.js\" {\n  declare module.exports: $Exports<\"radium/src/__tests__/media-query-test\">;\n}\ndeclare module \"radium/src/__tests__/radium-test.js\" {\n  declare module.exports: $Exports<\"radium/src/__tests__/radium-test\">;\n}\ndeclare module \"radium/src/__tests__/remove-nested-styles-test.js\" {\n  declare module.exports: $Exports<\n    \"radium/src/__tests__/remove-nested-styles-test\",\n  >;\n}\ndeclare module \"radium/src/__tests__/resolve-styles-test.js\" {\n  declare module.exports: $Exports<\"radium/src/__tests__/resolve-styles-test\">;\n}\ndeclare module \"radium/src/__tests__/style-component-test.js\" {\n  declare module.exports: $Exports<\"radium/src/__tests__/style-component-test\">;\n}\ndeclare module \"radium/src/__tests__/visited-test.js\" {\n  declare module.exports: $Exports<\"radium/src/__tests__/visited-test\">;\n}\ndeclare module \"radium/src/append-important-to-each-value.js\" {\n  declare module.exports: $Exports<\"radium/src/append-important-to-each-value\">;\n}\ndeclare module \"radium/src/append-px-if-needed.js\" {\n  declare module.exports: $Exports<\"radium/src/append-px-if-needed\">;\n}\ndeclare module \"radium/src/camel-case-props-to-dash-case.js\" {\n  declare module.exports: $Exports<\"radium/src/camel-case-props-to-dash-case\">;\n}\ndeclare module \"radium/src/components/style-root.js\" {\n  declare module.exports: $Exports<\"radium/src/components/style-root\">;\n}\ndeclare module \"radium/src/components/style-sheet.js\" {\n  declare module.exports: $Exports<\"radium/src/components/style-sheet\">;\n}\ndeclare module \"radium/src/components/style.js\" {\n  declare module.exports: $Exports<\"radium/src/components/style\">;\n}\ndeclare module \"radium/src/config.js\" {\n  declare module.exports: $Exports<\"radium/src/config\">;\n}\ndeclare module \"radium/src/css-rule-set-to-string.js\" {\n  declare module.exports: $Exports<\"radium/src/css-rule-set-to-string\">;\n}\ndeclare module \"radium/src/enhancer.js\" {\n  declare module.exports: $Exports<\"radium/src/enhancer\">;\n}\ndeclare module \"radium/src/get-state-key.js\" {\n  declare module.exports: $Exports<\"radium/src/get-state-key\">;\n}\ndeclare module \"radium/src/get-state.js\" {\n  declare module.exports: $Exports<\"radium/src/get-state\">;\n}\ndeclare module \"radium/src/hash.js\" {\n  declare module.exports: $Exports<\"radium/src/hash\">;\n}\ndeclare module \"radium/src/index.js\" {\n  declare module.exports: $Exports<\"radium/src/index\">;\n}\ndeclare module \"radium/src/keyframes.js\" {\n  declare module.exports: $Exports<\"radium/src/keyframes\">;\n}\ndeclare module \"radium/src/map-object.js\" {\n  declare module.exports: $Exports<\"radium/src/map-object\">;\n}\ndeclare module \"radium/src/merge-styles.js\" {\n  declare module.exports: $Exports<\"radium/src/merge-styles\">;\n}\ndeclare module \"radium/src/plugins/check-props-plugin.js\" {\n  declare module.exports: $Exports<\"radium/src/plugins/check-props-plugin\">;\n}\ndeclare module \"radium/src/plugins/index.js\" {\n  declare module.exports: $Exports<\"radium/src/plugins/index\">;\n}\ndeclare module \"radium/src/plugins/keyframes-plugin.js\" {\n  declare module.exports: $Exports<\"radium/src/plugins/keyframes-plugin\">;\n}\ndeclare module \"radium/src/plugins/merge-style-array-plugin.js\" {\n  declare module.exports: $Exports<\n    \"radium/src/plugins/merge-style-array-plugin\",\n  >;\n}\ndeclare module \"radium/src/plugins/mouse-up-listener.js\" {\n  declare module.exports: $Exports<\"radium/src/plugins/mouse-up-listener\">;\n}\ndeclare module \"radium/src/plugins/prefix-plugin.js\" {\n  declare module.exports: $Exports<\"radium/src/plugins/prefix-plugin\">;\n}\ndeclare module \"radium/src/plugins/remove-nested-styles-plugin.js\" {\n  declare module.exports: $Exports<\n    \"radium/src/plugins/remove-nested-styles-plugin\",\n  >;\n}\ndeclare module \"radium/src/plugins/resolve-interaction-styles-plugin.js\" {\n  declare module.exports: $Exports<\n    \"radium/src/plugins/resolve-interaction-styles-plugin\",\n  >;\n}\ndeclare module \"radium/src/plugins/resolve-media-queries-plugin.js\" {\n  declare module.exports: $Exports<\n    \"radium/src/plugins/resolve-media-queries-plugin\",\n  >;\n}\ndeclare module \"radium/src/plugins/visited-plugin.js\" {\n  declare module.exports: $Exports<\"radium/src/plugins/visited-plugin\">;\n}\ndeclare module \"radium/src/prefixer.js\" {\n  declare module.exports: $Exports<\"radium/src/prefixer\">;\n}\ndeclare module \"radium/src/resolve-styles.js\" {\n  declare module.exports: $Exports<\"radium/src/resolve-styles\">;\n}\ndeclare module \"radium/src/style-keeper.js\" {\n  declare module.exports: $Exports<\"radium/src/style-keeper\">;\n}\ndeclare module \"radium/src/test-helpers.js\" {\n  declare module.exports: $Exports<\"radium/src/test-helpers\">;\n}\n"
  },
  {
    "path": "flow-typed/npm/react-dev-utils_vx.x.x.js",
    "content": "// flow-typed signature: 157e25859f1d980319935815b9f4f2d7\n// flow-typed version: <<STUB>>/react-dev-utils_v4/flow_v0.68.0\n\n/**\n * This is an autogenerated libdef stub for:\n *\n *   'react-dev-utils'\n *\n * Fill this stub out by replacing all the `any` types.\n *\n * Once filled out, we encourage you to share your work with the\n * community by sending a pull request to:\n * https://github.com/flowtype/flow-typed\n */\n\ndeclare module \"react-dev-utils\" {\n  declare module.exports: any;\n}\n\n/**\n * We include stubs for each file inside this npm package in case you need to\n * require those files directly. Feel free to delete any files that aren't\n * needed.\n */\ndeclare module \"react-dev-utils/checkRequiredFiles\" {\n  declare module.exports: any;\n}\n\ndeclare module \"react-dev-utils/clearConsole\" {\n  declare module.exports: any;\n}\n\ndeclare module \"react-dev-utils/crossSpawn\" {\n  declare module.exports: any;\n}\n\ndeclare module \"react-dev-utils/errorOverlayMiddleware\" {\n  declare module.exports: any;\n}\n\ndeclare module \"react-dev-utils/eslintFormatter\" {\n  declare module.exports: any;\n}\n\ndeclare module \"react-dev-utils/FileSizeReporter\" {\n  declare module.exports: any;\n}\n\ndeclare module \"react-dev-utils/formatWebpackMessages\" {\n  declare module.exports: any;\n}\n\ndeclare module \"react-dev-utils/getProcessForPort\" {\n  declare module.exports: any;\n}\n\ndeclare module \"react-dev-utils/inquirer\" {\n  declare module.exports: any;\n}\n\ndeclare module \"react-dev-utils/InterpolateHtmlPlugin\" {\n  declare module.exports: any;\n}\n\ndeclare module \"react-dev-utils/launchEditor\" {\n  declare module.exports: any;\n}\n\ndeclare module \"react-dev-utils/launchEditorEndpoint\" {\n  declare module.exports: any;\n}\n\ndeclare module \"react-dev-utils/ModuleScopePlugin\" {\n  declare module.exports: any;\n}\n\ndeclare module \"react-dev-utils/noopServiceWorkerMiddleware\" {\n  declare module.exports: any;\n}\n\ndeclare module \"react-dev-utils/openBrowser\" {\n  declare module.exports: any;\n}\n\ndeclare module \"react-dev-utils/printBuildError\" {\n  declare module.exports: any;\n}\n\ndeclare module \"react-dev-utils/printHostingInstructions\" {\n  declare module.exports: any;\n}\n\ndeclare module \"react-dev-utils/WatchMissingNodeModulesPlugin\" {\n  declare module.exports: any;\n}\n\ndeclare module \"react-dev-utils/WebpackDevServerUtils\" {\n  declare module.exports: any;\n}\n\ndeclare module \"react-dev-utils/webpackHotDevClient\" {\n  declare module.exports: any;\n}\n\n// Filename aliases\ndeclare module \"react-dev-utils/checkRequiredFiles.js\" {\n  declare module.exports: $Exports<\"react-dev-utils/checkRequiredFiles\">;\n}\ndeclare module \"react-dev-utils/clearConsole.js\" {\n  declare module.exports: $Exports<\"react-dev-utils/clearConsole\">;\n}\ndeclare module \"react-dev-utils/crossSpawn.js\" {\n  declare module.exports: $Exports<\"react-dev-utils/crossSpawn\">;\n}\ndeclare module \"react-dev-utils/errorOverlayMiddleware.js\" {\n  declare module.exports: $Exports<\"react-dev-utils/errorOverlayMiddleware\">;\n}\ndeclare module \"react-dev-utils/eslintFormatter.js\" {\n  declare module.exports: $Exports<\"react-dev-utils/eslintFormatter\">;\n}\ndeclare module \"react-dev-utils/FileSizeReporter.js\" {\n  declare module.exports: $Exports<\"react-dev-utils/FileSizeReporter\">;\n}\ndeclare module \"react-dev-utils/formatWebpackMessages.js\" {\n  declare module.exports: $Exports<\"react-dev-utils/formatWebpackMessages\">;\n}\ndeclare module \"react-dev-utils/getProcessForPort.js\" {\n  declare module.exports: $Exports<\"react-dev-utils/getProcessForPort\">;\n}\ndeclare module \"react-dev-utils/inquirer.js\" {\n  declare module.exports: $Exports<\"react-dev-utils/inquirer\">;\n}\ndeclare module \"react-dev-utils/InterpolateHtmlPlugin.js\" {\n  declare module.exports: $Exports<\"react-dev-utils/InterpolateHtmlPlugin\">;\n}\ndeclare module \"react-dev-utils/launchEditor.js\" {\n  declare module.exports: $Exports<\"react-dev-utils/launchEditor\">;\n}\ndeclare module \"react-dev-utils/launchEditorEndpoint.js\" {\n  declare module.exports: $Exports<\"react-dev-utils/launchEditorEndpoint\">;\n}\ndeclare module \"react-dev-utils/ModuleScopePlugin.js\" {\n  declare module.exports: $Exports<\"react-dev-utils/ModuleScopePlugin\">;\n}\ndeclare module \"react-dev-utils/noopServiceWorkerMiddleware.js\" {\n  declare module.exports: $Exports<\n    \"react-dev-utils/noopServiceWorkerMiddleware\",\n  >;\n}\ndeclare module \"react-dev-utils/openBrowser.js\" {\n  declare module.exports: $Exports<\"react-dev-utils/openBrowser\">;\n}\ndeclare module \"react-dev-utils/printBuildError.js\" {\n  declare module.exports: $Exports<\"react-dev-utils/printBuildError\">;\n}\ndeclare module \"react-dev-utils/printHostingInstructions.js\" {\n  declare module.exports: $Exports<\"react-dev-utils/printHostingInstructions\">;\n}\ndeclare module \"react-dev-utils/WatchMissingNodeModulesPlugin.js\" {\n  declare module.exports: $Exports<\n    \"react-dev-utils/WatchMissingNodeModulesPlugin\",\n  >;\n}\ndeclare module \"react-dev-utils/WebpackDevServerUtils.js\" {\n  declare module.exports: $Exports<\"react-dev-utils/WebpackDevServerUtils\">;\n}\ndeclare module \"react-dev-utils/webpackHotDevClient.js\" {\n  declare module.exports: $Exports<\"react-dev-utils/webpackHotDevClient\">;\n}\n"
  },
  {
    "path": "flow-typed/npm/react-emotion_vx.x.x.js",
    "content": "// flow-typed signature: 3b76d38204eef8fa597b9543988151d9\n// flow-typed version: <<STUB>>/react-emotion_v8/flow_v0.68.0\n\n/**\n * This is an autogenerated libdef stub for:\n *\n *   'react-emotion'\n *\n * Fill this stub out by replacing all the `any` types.\n *\n * Once filled out, we encourage you to share your work with the\n * community by sending a pull request to:\n * https://github.com/flowtype/flow-typed\n */\n\ndeclare module \"react-emotion\" {\n  declare module.exports: any;\n}\n\n/**\n * We include stubs for each file inside this npm package in case you need to\n * require those files directly. Feel free to delete any files that aren't\n * needed.\n */\ndeclare module \"react-emotion/dist/DO-NOT-USE.min\" {\n  declare module.exports: any;\n}\n\ndeclare module \"react-emotion/dist/index.cjs\" {\n  declare module.exports: any;\n}\n\ndeclare module \"react-emotion/dist/index.es\" {\n  declare module.exports: any;\n}\n\ndeclare module \"react-emotion/macro\" {\n  declare module.exports: any;\n}\n\ndeclare module \"react-emotion/src/index\" {\n  declare module.exports: any;\n}\n\ndeclare module \"react-emotion/src/props\" {\n  declare module.exports: any;\n}\n\n// Filename aliases\ndeclare module \"react-emotion/dist/DO-NOT-USE.min.js\" {\n  declare module.exports: $Exports<\"react-emotion/dist/DO-NOT-USE.min\">;\n}\ndeclare module \"react-emotion/dist/index.cjs.js\" {\n  declare module.exports: $Exports<\"react-emotion/dist/index.cjs\">;\n}\ndeclare module \"react-emotion/dist/index.es.js\" {\n  declare module.exports: $Exports<\"react-emotion/dist/index.es\">;\n}\ndeclare module \"react-emotion/macro.js\" {\n  declare module.exports: $Exports<\"react-emotion/macro\">;\n}\ndeclare module \"react-emotion/src/index.js\" {\n  declare module.exports: $Exports<\"react-emotion/src/index\">;\n}\ndeclare module \"react-emotion/src/props.js\" {\n  declare module.exports: $Exports<\"react-emotion/src/props\">;\n}\n"
  },
  {
    "path": "flow-typed/npm/react-router_vx.x.x.js",
    "content": "// flow-typed signature: 98d17e022efdbf3eb70b3b8cca10bcbc\n// flow-typed version: <<STUB>>/react-router_v3/flow_v0.68.0\n\n/**\n * This is an autogenerated libdef stub for:\n *\n *   'react-router'\n *\n * Fill this stub out by replacing all the `any` types.\n *\n * Once filled out, we encourage you to share your work with the\n * community by sending a pull request to:\n * https://github.com/flowtype/flow-typed\n */\n\ndeclare module \"react-router\" {\n  declare module.exports: any;\n}\n\n/**\n * We include stubs for each file inside this npm package in case you need to\n * require those files directly. Feel free to delete any files that aren't\n * needed.\n */\ndeclare module \"react-router/es/applyRouterMiddleware\" {\n  declare module.exports: any;\n}\n\ndeclare module \"react-router/es/AsyncUtils\" {\n  declare module.exports: any;\n}\n\ndeclare module \"react-router/es/browserHistory\" {\n  declare module.exports: any;\n}\n\ndeclare module \"react-router/es/computeChangedRoutes\" {\n  declare module.exports: any;\n}\n\ndeclare module \"react-router/es/ContextUtils\" {\n  declare module.exports: any;\n}\n\ndeclare module \"react-router/es/createMemoryHistory\" {\n  declare module.exports: any;\n}\n\ndeclare module \"react-router/es/createRouterHistory\" {\n  declare module.exports: any;\n}\n\ndeclare module \"react-router/es/createTransitionManager\" {\n  declare module.exports: any;\n}\n\ndeclare module \"react-router/es/getComponents\" {\n  declare module.exports: any;\n}\n\ndeclare module \"react-router/es/getRouteParams\" {\n  declare module.exports: any;\n}\n\ndeclare module \"react-router/es/hashHistory\" {\n  declare module.exports: any;\n}\n\ndeclare module \"react-router/es/index\" {\n  declare module.exports: any;\n}\n\ndeclare module \"react-router/es/IndexLink\" {\n  declare module.exports: any;\n}\n\ndeclare module \"react-router/es/IndexRedirect\" {\n  declare module.exports: any;\n}\n\ndeclare module \"react-router/es/IndexRoute\" {\n  declare module.exports: any;\n}\n\ndeclare module \"react-router/es/InternalPropTypes\" {\n  declare module.exports: any;\n}\n\ndeclare module \"react-router/es/isActive\" {\n  declare module.exports: any;\n}\n\ndeclare module \"react-router/es/Link\" {\n  declare module.exports: any;\n}\n\ndeclare module \"react-router/es/match\" {\n  declare module.exports: any;\n}\n\ndeclare module \"react-router/es/matchRoutes\" {\n  declare module.exports: any;\n}\n\ndeclare module \"react-router/es/PatternUtils\" {\n  declare module.exports: any;\n}\n\ndeclare module \"react-router/es/PromiseUtils\" {\n  declare module.exports: any;\n}\n\ndeclare module \"react-router/es/PropTypes\" {\n  declare module.exports: any;\n}\n\ndeclare module \"react-router/es/Redirect\" {\n  declare module.exports: any;\n}\n\ndeclare module \"react-router/es/Route\" {\n  declare module.exports: any;\n}\n\ndeclare module \"react-router/es/Router\" {\n  declare module.exports: any;\n}\n\ndeclare module \"react-router/es/RouterContext\" {\n  declare module.exports: any;\n}\n\ndeclare module \"react-router/es/RouterUtils\" {\n  declare module.exports: any;\n}\n\ndeclare module \"react-router/es/routerWarning\" {\n  declare module.exports: any;\n}\n\ndeclare module \"react-router/es/RouteUtils\" {\n  declare module.exports: any;\n}\n\ndeclare module \"react-router/es/TransitionUtils\" {\n  declare module.exports: any;\n}\n\ndeclare module \"react-router/es/useRouterHistory\" {\n  declare module.exports: any;\n}\n\ndeclare module \"react-router/es/withRouter\" {\n  declare module.exports: any;\n}\n\ndeclare module \"react-router/lib/applyRouterMiddleware\" {\n  declare module.exports: any;\n}\n\ndeclare module \"react-router/lib/AsyncUtils\" {\n  declare module.exports: any;\n}\n\ndeclare module \"react-router/lib/browserHistory\" {\n  declare module.exports: any;\n}\n\ndeclare module \"react-router/lib/computeChangedRoutes\" {\n  declare module.exports: any;\n}\n\ndeclare module \"react-router/lib/ContextUtils\" {\n  declare module.exports: any;\n}\n\ndeclare module \"react-router/lib/createMemoryHistory\" {\n  declare module.exports: any;\n}\n\ndeclare module \"react-router/lib/createRouterHistory\" {\n  declare module.exports: any;\n}\n\ndeclare module \"react-router/lib/createTransitionManager\" {\n  declare module.exports: any;\n}\n\ndeclare module \"react-router/lib/getComponents\" {\n  declare module.exports: any;\n}\n\ndeclare module \"react-router/lib/getRouteParams\" {\n  declare module.exports: any;\n}\n\ndeclare module \"react-router/lib/hashHistory\" {\n  declare module.exports: any;\n}\n\ndeclare module \"react-router/lib/index\" {\n  declare module.exports: any;\n}\n\ndeclare module \"react-router/lib/IndexLink\" {\n  declare module.exports: any;\n}\n\ndeclare module \"react-router/lib/IndexRedirect\" {\n  declare module.exports: any;\n}\n\ndeclare module \"react-router/lib/IndexRoute\" {\n  declare module.exports: any;\n}\n\ndeclare module \"react-router/lib/InternalPropTypes\" {\n  declare module.exports: any;\n}\n\ndeclare module \"react-router/lib/isActive\" {\n  declare module.exports: any;\n}\n\ndeclare module \"react-router/lib/Link\" {\n  declare module.exports: any;\n}\n\ndeclare module \"react-router/lib/match\" {\n  declare module.exports: any;\n}\n\ndeclare module \"react-router/lib/matchRoutes\" {\n  declare module.exports: any;\n}\n\ndeclare module \"react-router/lib/PatternUtils\" {\n  declare module.exports: any;\n}\n\ndeclare module \"react-router/lib/PromiseUtils\" {\n  declare module.exports: any;\n}\n\ndeclare module \"react-router/lib/PropTypes\" {\n  declare module.exports: any;\n}\n\ndeclare module \"react-router/lib/Redirect\" {\n  declare module.exports: any;\n}\n\ndeclare module \"react-router/lib/Route\" {\n  declare module.exports: any;\n}\n\ndeclare module \"react-router/lib/Router\" {\n  declare module.exports: any;\n}\n\ndeclare module \"react-router/lib/RouterContext\" {\n  declare module.exports: any;\n}\n\ndeclare module \"react-router/lib/RouterUtils\" {\n  declare module.exports: any;\n}\n\ndeclare module \"react-router/lib/routerWarning\" {\n  declare module.exports: any;\n}\n\ndeclare module \"react-router/lib/RouteUtils\" {\n  declare module.exports: any;\n}\n\ndeclare module \"react-router/lib/TransitionUtils\" {\n  declare module.exports: any;\n}\n\ndeclare module \"react-router/lib/useRouterHistory\" {\n  declare module.exports: any;\n}\n\ndeclare module \"react-router/lib/withRouter\" {\n  declare module.exports: any;\n}\n\ndeclare module \"react-router/umd/ReactRouter\" {\n  declare module.exports: any;\n}\n\ndeclare module \"react-router/umd/ReactRouter.min\" {\n  declare module.exports: any;\n}\n\n// Filename aliases\ndeclare module \"react-router/es/applyRouterMiddleware.js\" {\n  declare module.exports: $Exports<\"react-router/es/applyRouterMiddleware\">;\n}\ndeclare module \"react-router/es/AsyncUtils.js\" {\n  declare module.exports: $Exports<\"react-router/es/AsyncUtils\">;\n}\ndeclare module \"react-router/es/browserHistory.js\" {\n  declare module.exports: $Exports<\"react-router/es/browserHistory\">;\n}\ndeclare module \"react-router/es/computeChangedRoutes.js\" {\n  declare module.exports: $Exports<\"react-router/es/computeChangedRoutes\">;\n}\ndeclare module \"react-router/es/ContextUtils.js\" {\n  declare module.exports: $Exports<\"react-router/es/ContextUtils\">;\n}\ndeclare module \"react-router/es/createMemoryHistory.js\" {\n  declare module.exports: $Exports<\"react-router/es/createMemoryHistory\">;\n}\ndeclare module \"react-router/es/createRouterHistory.js\" {\n  declare module.exports: $Exports<\"react-router/es/createRouterHistory\">;\n}\ndeclare module \"react-router/es/createTransitionManager.js\" {\n  declare module.exports: $Exports<\"react-router/es/createTransitionManager\">;\n}\ndeclare module \"react-router/es/getComponents.js\" {\n  declare module.exports: $Exports<\"react-router/es/getComponents\">;\n}\ndeclare module \"react-router/es/getRouteParams.js\" {\n  declare module.exports: $Exports<\"react-router/es/getRouteParams\">;\n}\ndeclare module \"react-router/es/hashHistory.js\" {\n  declare module.exports: $Exports<\"react-router/es/hashHistory\">;\n}\ndeclare module \"react-router/es/index.js\" {\n  declare module.exports: $Exports<\"react-router/es/index\">;\n}\ndeclare module \"react-router/es/IndexLink.js\" {\n  declare module.exports: $Exports<\"react-router/es/IndexLink\">;\n}\ndeclare module \"react-router/es/IndexRedirect.js\" {\n  declare module.exports: $Exports<\"react-router/es/IndexRedirect\">;\n}\ndeclare module \"react-router/es/IndexRoute.js\" {\n  declare module.exports: $Exports<\"react-router/es/IndexRoute\">;\n}\ndeclare module \"react-router/es/InternalPropTypes.js\" {\n  declare module.exports: $Exports<\"react-router/es/InternalPropTypes\">;\n}\ndeclare module \"react-router/es/isActive.js\" {\n  declare module.exports: $Exports<\"react-router/es/isActive\">;\n}\ndeclare module \"react-router/es/Link.js\" {\n  declare module.exports: $Exports<\"react-router/es/Link\">;\n}\ndeclare module \"react-router/es/match.js\" {\n  declare module.exports: $Exports<\"react-router/es/match\">;\n}\ndeclare module \"react-router/es/matchRoutes.js\" {\n  declare module.exports: $Exports<\"react-router/es/matchRoutes\">;\n}\ndeclare module \"react-router/es/PatternUtils.js\" {\n  declare module.exports: $Exports<\"react-router/es/PatternUtils\">;\n}\ndeclare module \"react-router/es/PromiseUtils.js\" {\n  declare module.exports: $Exports<\"react-router/es/PromiseUtils\">;\n}\ndeclare module \"react-router/es/PropTypes.js\" {\n  declare module.exports: $Exports<\"react-router/es/PropTypes\">;\n}\ndeclare module \"react-router/es/Redirect.js\" {\n  declare module.exports: $Exports<\"react-router/es/Redirect\">;\n}\ndeclare module \"react-router/es/Route.js\" {\n  declare module.exports: $Exports<\"react-router/es/Route\">;\n}\ndeclare module \"react-router/es/Router.js\" {\n  declare module.exports: $Exports<\"react-router/es/Router\">;\n}\ndeclare module \"react-router/es/RouterContext.js\" {\n  declare module.exports: $Exports<\"react-router/es/RouterContext\">;\n}\ndeclare module \"react-router/es/RouterUtils.js\" {\n  declare module.exports: $Exports<\"react-router/es/RouterUtils\">;\n}\ndeclare module \"react-router/es/routerWarning.js\" {\n  declare module.exports: $Exports<\"react-router/es/routerWarning\">;\n}\ndeclare module \"react-router/es/RouteUtils.js\" {\n  declare module.exports: $Exports<\"react-router/es/RouteUtils\">;\n}\ndeclare module \"react-router/es/TransitionUtils.js\" {\n  declare module.exports: $Exports<\"react-router/es/TransitionUtils\">;\n}\ndeclare module \"react-router/es/useRouterHistory.js\" {\n  declare module.exports: $Exports<\"react-router/es/useRouterHistory\">;\n}\ndeclare module \"react-router/es/withRouter.js\" {\n  declare module.exports: $Exports<\"react-router/es/withRouter\">;\n}\ndeclare module \"react-router/lib/applyRouterMiddleware.js\" {\n  declare module.exports: $Exports<\"react-router/lib/applyRouterMiddleware\">;\n}\ndeclare module \"react-router/lib/AsyncUtils.js\" {\n  declare module.exports: $Exports<\"react-router/lib/AsyncUtils\">;\n}\ndeclare module \"react-router/lib/browserHistory.js\" {\n  declare module.exports: $Exports<\"react-router/lib/browserHistory\">;\n}\ndeclare module \"react-router/lib/computeChangedRoutes.js\" {\n  declare module.exports: $Exports<\"react-router/lib/computeChangedRoutes\">;\n}\ndeclare module \"react-router/lib/ContextUtils.js\" {\n  declare module.exports: $Exports<\"react-router/lib/ContextUtils\">;\n}\ndeclare module \"react-router/lib/createMemoryHistory.js\" {\n  declare module.exports: $Exports<\"react-router/lib/createMemoryHistory\">;\n}\ndeclare module \"react-router/lib/createRouterHistory.js\" {\n  declare module.exports: $Exports<\"react-router/lib/createRouterHistory\">;\n}\ndeclare module \"react-router/lib/createTransitionManager.js\" {\n  declare module.exports: $Exports<\"react-router/lib/createTransitionManager\">;\n}\ndeclare module \"react-router/lib/getComponents.js\" {\n  declare module.exports: $Exports<\"react-router/lib/getComponents\">;\n}\ndeclare module \"react-router/lib/getRouteParams.js\" {\n  declare module.exports: $Exports<\"react-router/lib/getRouteParams\">;\n}\ndeclare module \"react-router/lib/hashHistory.js\" {\n  declare module.exports: $Exports<\"react-router/lib/hashHistory\">;\n}\ndeclare module \"react-router/lib/index.js\" {\n  declare module.exports: $Exports<\"react-router/lib/index\">;\n}\ndeclare module \"react-router/lib/IndexLink.js\" {\n  declare module.exports: $Exports<\"react-router/lib/IndexLink\">;\n}\ndeclare module \"react-router/lib/IndexRedirect.js\" {\n  declare module.exports: $Exports<\"react-router/lib/IndexRedirect\">;\n}\ndeclare module \"react-router/lib/IndexRoute.js\" {\n  declare module.exports: $Exports<\"react-router/lib/IndexRoute\">;\n}\ndeclare module \"react-router/lib/InternalPropTypes.js\" {\n  declare module.exports: $Exports<\"react-router/lib/InternalPropTypes\">;\n}\ndeclare module \"react-router/lib/isActive.js\" {\n  declare module.exports: $Exports<\"react-router/lib/isActive\">;\n}\ndeclare module \"react-router/lib/Link.js\" {\n  declare module.exports: $Exports<\"react-router/lib/Link\">;\n}\ndeclare module \"react-router/lib/match.js\" {\n  declare module.exports: $Exports<\"react-router/lib/match\">;\n}\ndeclare module \"react-router/lib/matchRoutes.js\" {\n  declare module.exports: $Exports<\"react-router/lib/matchRoutes\">;\n}\ndeclare module \"react-router/lib/PatternUtils.js\" {\n  declare module.exports: $Exports<\"react-router/lib/PatternUtils\">;\n}\ndeclare module \"react-router/lib/PromiseUtils.js\" {\n  declare module.exports: $Exports<\"react-router/lib/PromiseUtils\">;\n}\ndeclare module \"react-router/lib/PropTypes.js\" {\n  declare module.exports: $Exports<\"react-router/lib/PropTypes\">;\n}\ndeclare module \"react-router/lib/Redirect.js\" {\n  declare module.exports: $Exports<\"react-router/lib/Redirect\">;\n}\ndeclare module \"react-router/lib/Route.js\" {\n  declare module.exports: $Exports<\"react-router/lib/Route\">;\n}\ndeclare module \"react-router/lib/Router.js\" {\n  declare module.exports: $Exports<\"react-router/lib/Router\">;\n}\ndeclare module \"react-router/lib/RouterContext.js\" {\n  declare module.exports: $Exports<\"react-router/lib/RouterContext\">;\n}\ndeclare module \"react-router/lib/RouterUtils.js\" {\n  declare module.exports: $Exports<\"react-router/lib/RouterUtils\">;\n}\ndeclare module \"react-router/lib/routerWarning.js\" {\n  declare module.exports: $Exports<\"react-router/lib/routerWarning\">;\n}\ndeclare module \"react-router/lib/RouteUtils.js\" {\n  declare module.exports: $Exports<\"react-router/lib/RouteUtils\">;\n}\ndeclare module \"react-router/lib/TransitionUtils.js\" {\n  declare module.exports: $Exports<\"react-router/lib/TransitionUtils\">;\n}\ndeclare module \"react-router/lib/useRouterHistory.js\" {\n  declare module.exports: $Exports<\"react-router/lib/useRouterHistory\">;\n}\ndeclare module \"react-router/lib/withRouter.js\" {\n  declare module.exports: $Exports<\"react-router/lib/withRouter\">;\n}\ndeclare module \"react-router/umd/ReactRouter.js\" {\n  declare module.exports: $Exports<\"react-router/umd/ReactRouter\">;\n}\ndeclare module \"react-router/umd/ReactRouter.min.js\" {\n  declare module.exports: $Exports<\"react-router/umd/ReactRouter.min\">;\n}\n"
  },
  {
    "path": "flow-typed/npm/react-topbar-progress-indicator_vx.x.x.js",
    "content": "// flow-typed signature: dad8dce34f95fb6ee2180474c7149635\n// flow-typed version: <<STUB>>/react-topbar-progress-indicator_v*/flow_v0.68.0\n\n/**\n * This is an autogenerated libdef stub for:\n *\n *   'react-topbar-progress-indicator'\n *\n * Fill this stub out by replacing all the `any` types.\n *\n * Once filled out, we encourage you to share your work with the\n * community by sending a pull request to:\n * https://github.com/flowtype/flow-typed\n */\n\ndeclare module \"react-topbar-progress-indicator\" {\n  declare module.exports: any;\n}\n\n/**\n * We include stubs for each file inside this npm package in case you need to\n * require those files directly. Feel free to delete any files that aren't\n * needed.\n */\ndeclare module \"react-topbar-progress-indicator/lib/index\" {\n  declare module.exports: any;\n}\n\ndeclare module \"react-topbar-progress-indicator/src/index\" {\n  declare module.exports: any;\n}\n\n// Filename aliases\ndeclare module \"react-topbar-progress-indicator/lib/index.js\" {\n  declare module.exports: $Exports<\"react-topbar-progress-indicator/lib/index\">;\n}\ndeclare module \"react-topbar-progress-indicator/src/index.js\" {\n  declare module.exports: $Exports<\"react-topbar-progress-indicator/src/index\">;\n}\n"
  },
  {
    "path": "flow-typed/npm/rehype-autolink-headings_vx.x.x.js",
    "content": "// flow-typed signature: 9679230d79db7d903e2e765077ac4180\n// flow-typed version: <<STUB>>/rehype-autolink-headings_v2/flow_v0.68.0\n\n/**\n * This is an autogenerated libdef stub for:\n *\n *   'rehype-autolink-headings'\n *\n * Fill this stub out by replacing all the `any` types.\n *\n * Once filled out, we encourage you to share your work with the\n * community by sending a pull request to:\n * https://github.com/flowtype/flow-typed\n */\n\ndeclare module \"rehype-autolink-headings\" {\n  declare module.exports: any;\n}\n\n/**\n * We include stubs for each file inside this npm package in case you need to\n * require those files directly. Feel free to delete any files that aren't\n * needed.\n */\n\n// Filename aliases\ndeclare module \"rehype-autolink-headings/index\" {\n  declare module.exports: $Exports<\"rehype-autolink-headings\">;\n}\ndeclare module \"rehype-autolink-headings/index.js\" {\n  declare module.exports: $Exports<\"rehype-autolink-headings\">;\n}\n"
  },
  {
    "path": "flow-typed/npm/rehype-highlight_vx.x.x.js",
    "content": "// flow-typed signature: b4622af126b6a810a28f2c32c9f850e3\n// flow-typed version: <<STUB>>/rehype-highlight_v2/flow_v0.68.0\n\n/**\n * This is an autogenerated libdef stub for:\n *\n *   'rehype-highlight'\n *\n * Fill this stub out by replacing all the `any` types.\n *\n * Once filled out, we encourage you to share your work with the\n * community by sending a pull request to:\n * https://github.com/flowtype/flow-typed\n */\n\ndeclare module \"rehype-highlight\" {\n  declare module.exports: any;\n}\n\n/**\n * We include stubs for each file inside this npm package in case you need to\n * require those files directly. Feel free to delete any files that aren't\n * needed.\n */\n\n// Filename aliases\ndeclare module \"rehype-highlight/index\" {\n  declare module.exports: $Exports<\"rehype-highlight\">;\n}\ndeclare module \"rehype-highlight/index.js\" {\n  declare module.exports: $Exports<\"rehype-highlight\">;\n}\n"
  },
  {
    "path": "flow-typed/npm/rehype-parse_vx.x.x.js",
    "content": "// flow-typed signature: 4842b07c2698f3382ad214a987ab4ab6\n// flow-typed version: <<STUB>>/rehype-parse_v4/flow_v0.68.0\n\n/**\n * This is an autogenerated libdef stub for:\n *\n *   'rehype-parse'\n *\n * Fill this stub out by replacing all the `any` types.\n *\n * Once filled out, we encourage you to share your work with the\n * community by sending a pull request to:\n * https://github.com/flowtype/flow-typed\n */\n\ndeclare module \"rehype-parse\" {\n  declare module.exports: any;\n}\n\n/**\n * We include stubs for each file inside this npm package in case you need to\n * require those files directly. Feel free to delete any files that aren't\n * needed.\n */\n\n// Filename aliases\ndeclare module \"rehype-parse/index\" {\n  declare module.exports: $Exports<\"rehype-parse\">;\n}\ndeclare module \"rehype-parse/index.js\" {\n  declare module.exports: $Exports<\"rehype-parse\">;\n}\n"
  },
  {
    "path": "flow-typed/npm/rehype-raw_vx.x.x.js",
    "content": "// flow-typed signature: 05d02801c3654ed29f4cc39696b93275\n// flow-typed version: <<STUB>>/rehype-raw_v2/flow_v0.68.0\n\n/**\n * This is an autogenerated libdef stub for:\n *\n *   'rehype-raw'\n *\n * Fill this stub out by replacing all the `any` types.\n *\n * Once filled out, we encourage you to share your work with the\n * community by sending a pull request to:\n * https://github.com/flowtype/flow-typed\n */\n\ndeclare module \"rehype-raw\" {\n  declare module.exports: any;\n}\n\n/**\n * We include stubs for each file inside this npm package in case you need to\n * require those files directly. Feel free to delete any files that aren't\n * needed.\n */\n\n// Filename aliases\ndeclare module \"rehype-raw/index\" {\n  declare module.exports: $Exports<\"rehype-raw\">;\n}\ndeclare module \"rehype-raw/index.js\" {\n  declare module.exports: $Exports<\"rehype-raw\">;\n}\n"
  },
  {
    "path": "flow-typed/npm/rehype-react_vx.x.x.js",
    "content": "// flow-typed signature: f8e6dcc4a22a05662c0b5760c3ffbb59\n// flow-typed version: <<STUB>>/rehype-react_v3/flow_v0.68.0\n\n/**\n * This is an autogenerated libdef stub for:\n *\n *   'rehype-react'\n *\n * Fill this stub out by replacing all the `any` types.\n *\n * Once filled out, we encourage you to share your work with the\n * community by sending a pull request to:\n * https://github.com/flowtype/flow-typed\n */\n\ndeclare module \"rehype-react\" {\n  declare module.exports: any;\n}\n\n/**\n * We include stubs for each file inside this npm package in case you need to\n * require those files directly. Feel free to delete any files that aren't\n * needed.\n */\n\n// Filename aliases\ndeclare module \"rehype-react/index\" {\n  declare module.exports: $Exports<\"rehype-react\">;\n}\ndeclare module \"rehype-react/index.js\" {\n  declare module.exports: $Exports<\"rehype-react\">;\n}\n"
  },
  {
    "path": "flow-typed/npm/rehype-slug_vx.x.x.js",
    "content": "// flow-typed signature: ada0d6b5b5a8bc54b7bc6442098a66d6\n// flow-typed version: <<STUB>>/rehype-slug_v2/flow_v0.68.0\n\n/**\n * This is an autogenerated libdef stub for:\n *\n *   'rehype-slug'\n *\n * Fill this stub out by replacing all the `any` types.\n *\n * Once filled out, we encourage you to share your work with the\n * community by sending a pull request to:\n * https://github.com/flowtype/flow-typed\n */\n\ndeclare module \"rehype-slug\" {\n  declare module.exports: any;\n}\n\n/**\n * We include stubs for each file inside this npm package in case you need to\n * require those files directly. Feel free to delete any files that aren't\n * needed.\n */\n\n// Filename aliases\ndeclare module \"rehype-slug/index\" {\n  declare module.exports: $Exports<\"rehype-slug\">;\n}\ndeclare module \"rehype-slug/index.js\" {\n  declare module.exports: $Exports<\"rehype-slug\">;\n}\n"
  },
  {
    "path": "flow-typed/npm/rehype-stringify_vx.x.x.js",
    "content": "// flow-typed signature: 8516381b34c681e5be987297eeed59b5\n// flow-typed version: <<STUB>>/rehype-stringify_v3/flow_v0.68.0\n\n/**\n * This is an autogenerated libdef stub for:\n *\n *   'rehype-stringify'\n *\n * Fill this stub out by replacing all the `any` types.\n *\n * Once filled out, we encourage you to share your work with the\n * community by sending a pull request to:\n * https://github.com/flowtype/flow-typed\n */\n\ndeclare module \"rehype-stringify\" {\n  declare module.exports: any;\n}\n\n/**\n * We include stubs for each file inside this npm package in case you need to\n * require those files directly. Feel free to delete any files that aren't\n * needed.\n */\n\n// Filename aliases\ndeclare module \"rehype-stringify/index\" {\n  declare module.exports: $Exports<\"rehype-stringify\">;\n}\ndeclare module \"rehype-stringify/index.js\" {\n  declare module.exports: $Exports<\"rehype-stringify\">;\n}\n"
  },
  {
    "path": "flow-typed/npm/remark-highlights_vx.x.x.js",
    "content": "// flow-typed signature: f39d9df4dad71bed08c2b6875600f4e7\n// flow-typed version: <<STUB>>/remark-highlights_v*/flow_v0.68.0\n\n/**\n * This is an autogenerated libdef stub for:\n *\n *   'remark-highlights'\n *\n * Fill this stub out by replacing all the `any` types.\n *\n * Once filled out, we encourage you to share your work with the\n * community by sending a pull request to:\n * https://github.com/flowtype/flow-typed\n */\n\ndeclare module \"remark-highlights\" {\n  declare module.exports: any;\n}\n\n/**\n * We include stubs for each file inside this npm package in case you need to\n * require those files directly. Feel free to delete any files that aren't\n * needed.\n */\ndeclare module \"remark-highlights/src/index\" {\n  declare module.exports: any;\n}\n\ndeclare module \"remark-highlights/src/utils/constructConfig\" {\n  declare module.exports: any;\n}\n\ndeclare module \"remark-highlights/src/utils/getIcon\" {\n  declare module.exports: any;\n}\n\ndeclare module \"remark-highlights/src/utils/highlightLines\" {\n  declare module.exports: any;\n}\n\ndeclare module \"remark-highlights/src/utils/highlightNode\" {\n  declare module.exports: any;\n}\n\ndeclare module \"remark-highlights/src/utils/iconsDb\" {\n  declare module.exports: any;\n}\n\ndeclare module \"remark-highlights/src/utils/loadGrammars\" {\n  declare module.exports: any;\n}\n\ndeclare module \"remark-highlights/src/utils/scopeNameFromLang\" {\n  declare module.exports: any;\n}\n\ndeclare module \"remark-highlights/src/utils/wrapNode\" {\n  declare module.exports: any;\n}\n\n// Filename aliases\ndeclare module \"remark-highlights/src/index.js\" {\n  declare module.exports: $Exports<\"remark-highlights/src/index\">;\n}\ndeclare module \"remark-highlights/src/utils/constructConfig.js\" {\n  declare module.exports: $Exports<\n    \"remark-highlights/src/utils/constructConfig\",\n  >;\n}\ndeclare module \"remark-highlights/src/utils/getIcon.js\" {\n  declare module.exports: $Exports<\"remark-highlights/src/utils/getIcon\">;\n}\ndeclare module \"remark-highlights/src/utils/highlightLines.js\" {\n  declare module.exports: $Exports<\n    \"remark-highlights/src/utils/highlightLines\",\n  >;\n}\ndeclare module \"remark-highlights/src/utils/highlightNode.js\" {\n  declare module.exports: $Exports<\"remark-highlights/src/utils/highlightNode\">;\n}\ndeclare module \"remark-highlights/src/utils/iconsDb.js\" {\n  declare module.exports: $Exports<\"remark-highlights/src/utils/iconsDb\">;\n}\ndeclare module \"remark-highlights/src/utils/loadGrammars.js\" {\n  declare module.exports: $Exports<\"remark-highlights/src/utils/loadGrammars\">;\n}\ndeclare module \"remark-highlights/src/utils/scopeNameFromLang.js\" {\n  declare module.exports: $Exports<\n    \"remark-highlights/src/utils/scopeNameFromLang\",\n  >;\n}\ndeclare module \"remark-highlights/src/utils/wrapNode.js\" {\n  declare module.exports: $Exports<\"remark-highlights/src/utils/wrapNode\">;\n}\n"
  },
  {
    "path": "flow-typed/npm/remark-parse_vx.x.x.js",
    "content": "// flow-typed signature: c45392f7172cd7052d2ed37e810a30ce\n// flow-typed version: <<STUB>>/remark-parse_v4/flow_v0.68.0\n\n/**\n * This is an autogenerated libdef stub for:\n *\n *   'remark-parse'\n *\n * Fill this stub out by replacing all the `any` types.\n *\n * Once filled out, we encourage you to share your work with the\n * community by sending a pull request to:\n * https://github.com/flowtype/flow-typed\n */\n\ndeclare module \"remark-parse\" {\n  declare module.exports: any;\n}\n\n/**\n * We include stubs for each file inside this npm package in case you need to\n * require those files directly. Feel free to delete any files that aren't\n * needed.\n */\ndeclare module \"remark-parse/lib/decode\" {\n  declare module.exports: any;\n}\n\ndeclare module \"remark-parse/lib/defaults\" {\n  declare module.exports: any;\n}\n\ndeclare module \"remark-parse/lib/locate/break\" {\n  declare module.exports: any;\n}\n\ndeclare module \"remark-parse/lib/locate/code-inline\" {\n  declare module.exports: any;\n}\n\ndeclare module \"remark-parse/lib/locate/delete\" {\n  declare module.exports: any;\n}\n\ndeclare module \"remark-parse/lib/locate/emphasis\" {\n  declare module.exports: any;\n}\n\ndeclare module \"remark-parse/lib/locate/escape\" {\n  declare module.exports: any;\n}\n\ndeclare module \"remark-parse/lib/locate/link\" {\n  declare module.exports: any;\n}\n\ndeclare module \"remark-parse/lib/locate/strong\" {\n  declare module.exports: any;\n}\n\ndeclare module \"remark-parse/lib/locate/tag\" {\n  declare module.exports: any;\n}\n\ndeclare module \"remark-parse/lib/locate/url\" {\n  declare module.exports: any;\n}\n\ndeclare module \"remark-parse/lib/parse\" {\n  declare module.exports: any;\n}\n\ndeclare module \"remark-parse/lib/parser\" {\n  declare module.exports: any;\n}\n\ndeclare module \"remark-parse/lib/set-options\" {\n  declare module.exports: any;\n}\n\ndeclare module \"remark-parse/lib/tokenize/auto-link\" {\n  declare module.exports: any;\n}\n\ndeclare module \"remark-parse/lib/tokenize/blockquote\" {\n  declare module.exports: any;\n}\n\ndeclare module \"remark-parse/lib/tokenize/break\" {\n  declare module.exports: any;\n}\n\ndeclare module \"remark-parse/lib/tokenize/code-fenced\" {\n  declare module.exports: any;\n}\n\ndeclare module \"remark-parse/lib/tokenize/code-indented\" {\n  declare module.exports: any;\n}\n\ndeclare module \"remark-parse/lib/tokenize/code-inline\" {\n  declare module.exports: any;\n}\n\ndeclare module \"remark-parse/lib/tokenize/definition\" {\n  declare module.exports: any;\n}\n\ndeclare module \"remark-parse/lib/tokenize/delete\" {\n  declare module.exports: any;\n}\n\ndeclare module \"remark-parse/lib/tokenize/emphasis\" {\n  declare module.exports: any;\n}\n\ndeclare module \"remark-parse/lib/tokenize/escape\" {\n  declare module.exports: any;\n}\n\ndeclare module \"remark-parse/lib/tokenize/footnote-definition\" {\n  declare module.exports: any;\n}\n\ndeclare module \"remark-parse/lib/tokenize/heading-atx\" {\n  declare module.exports: any;\n}\n\ndeclare module \"remark-parse/lib/tokenize/heading-setext\" {\n  declare module.exports: any;\n}\n\ndeclare module \"remark-parse/lib/tokenize/html-block\" {\n  declare module.exports: any;\n}\n\ndeclare module \"remark-parse/lib/tokenize/html-inline\" {\n  declare module.exports: any;\n}\n\ndeclare module \"remark-parse/lib/tokenize/link\" {\n  declare module.exports: any;\n}\n\ndeclare module \"remark-parse/lib/tokenize/list\" {\n  declare module.exports: any;\n}\n\ndeclare module \"remark-parse/lib/tokenize/newline\" {\n  declare module.exports: any;\n}\n\ndeclare module \"remark-parse/lib/tokenize/paragraph\" {\n  declare module.exports: any;\n}\n\ndeclare module \"remark-parse/lib/tokenize/reference\" {\n  declare module.exports: any;\n}\n\ndeclare module \"remark-parse/lib/tokenize/strong\" {\n  declare module.exports: any;\n}\n\ndeclare module \"remark-parse/lib/tokenize/table\" {\n  declare module.exports: any;\n}\n\ndeclare module \"remark-parse/lib/tokenize/text\" {\n  declare module.exports: any;\n}\n\ndeclare module \"remark-parse/lib/tokenize/thematic-break\" {\n  declare module.exports: any;\n}\n\ndeclare module \"remark-parse/lib/tokenize/url\" {\n  declare module.exports: any;\n}\n\ndeclare module \"remark-parse/lib/tokenizer\" {\n  declare module.exports: any;\n}\n\ndeclare module \"remark-parse/lib/unescape\" {\n  declare module.exports: any;\n}\n\ndeclare module \"remark-parse/lib/util/get-indentation\" {\n  declare module.exports: any;\n}\n\ndeclare module \"remark-parse/lib/util/html\" {\n  declare module.exports: any;\n}\n\ndeclare module \"remark-parse/lib/util/interrupt\" {\n  declare module.exports: any;\n}\n\ndeclare module \"remark-parse/lib/util/normalize\" {\n  declare module.exports: any;\n}\n\ndeclare module \"remark-parse/lib/util/remove-indentation\" {\n  declare module.exports: any;\n}\n\n// Filename aliases\ndeclare module \"remark-parse/index\" {\n  declare module.exports: $Exports<\"remark-parse\">;\n}\ndeclare module \"remark-parse/index.js\" {\n  declare module.exports: $Exports<\"remark-parse\">;\n}\ndeclare module \"remark-parse/lib/decode.js\" {\n  declare module.exports: $Exports<\"remark-parse/lib/decode\">;\n}\ndeclare module \"remark-parse/lib/defaults.js\" {\n  declare module.exports: $Exports<\"remark-parse/lib/defaults\">;\n}\ndeclare module \"remark-parse/lib/locate/break.js\" {\n  declare module.exports: $Exports<\"remark-parse/lib/locate/break\">;\n}\ndeclare module \"remark-parse/lib/locate/code-inline.js\" {\n  declare module.exports: $Exports<\"remark-parse/lib/locate/code-inline\">;\n}\ndeclare module \"remark-parse/lib/locate/delete.js\" {\n  declare module.exports: $Exports<\"remark-parse/lib/locate/delete\">;\n}\ndeclare module \"remark-parse/lib/locate/emphasis.js\" {\n  declare module.exports: $Exports<\"remark-parse/lib/locate/emphasis\">;\n}\ndeclare module \"remark-parse/lib/locate/escape.js\" {\n  declare module.exports: $Exports<\"remark-parse/lib/locate/escape\">;\n}\ndeclare module \"remark-parse/lib/locate/link.js\" {\n  declare module.exports: $Exports<\"remark-parse/lib/locate/link\">;\n}\ndeclare module \"remark-parse/lib/locate/strong.js\" {\n  declare module.exports: $Exports<\"remark-parse/lib/locate/strong\">;\n}\ndeclare module \"remark-parse/lib/locate/tag.js\" {\n  declare module.exports: $Exports<\"remark-parse/lib/locate/tag\">;\n}\ndeclare module \"remark-parse/lib/locate/url.js\" {\n  declare module.exports: $Exports<\"remark-parse/lib/locate/url\">;\n}\ndeclare module \"remark-parse/lib/parse.js\" {\n  declare module.exports: $Exports<\"remark-parse/lib/parse\">;\n}\ndeclare module \"remark-parse/lib/parser.js\" {\n  declare module.exports: $Exports<\"remark-parse/lib/parser\">;\n}\ndeclare module \"remark-parse/lib/set-options.js\" {\n  declare module.exports: $Exports<\"remark-parse/lib/set-options\">;\n}\ndeclare module \"remark-parse/lib/tokenize/auto-link.js\" {\n  declare module.exports: $Exports<\"remark-parse/lib/tokenize/auto-link\">;\n}\ndeclare module \"remark-parse/lib/tokenize/blockquote.js\" {\n  declare module.exports: $Exports<\"remark-parse/lib/tokenize/blockquote\">;\n}\ndeclare module \"remark-parse/lib/tokenize/break.js\" {\n  declare module.exports: $Exports<\"remark-parse/lib/tokenize/break\">;\n}\ndeclare module \"remark-parse/lib/tokenize/code-fenced.js\" {\n  declare module.exports: $Exports<\"remark-parse/lib/tokenize/code-fenced\">;\n}\ndeclare module \"remark-parse/lib/tokenize/code-indented.js\" {\n  declare module.exports: $Exports<\"remark-parse/lib/tokenize/code-indented\">;\n}\ndeclare module \"remark-parse/lib/tokenize/code-inline.js\" {\n  declare module.exports: $Exports<\"remark-parse/lib/tokenize/code-inline\">;\n}\ndeclare module \"remark-parse/lib/tokenize/definition.js\" {\n  declare module.exports: $Exports<\"remark-parse/lib/tokenize/definition\">;\n}\ndeclare module \"remark-parse/lib/tokenize/delete.js\" {\n  declare module.exports: $Exports<\"remark-parse/lib/tokenize/delete\">;\n}\ndeclare module \"remark-parse/lib/tokenize/emphasis.js\" {\n  declare module.exports: $Exports<\"remark-parse/lib/tokenize/emphasis\">;\n}\ndeclare module \"remark-parse/lib/tokenize/escape.js\" {\n  declare module.exports: $Exports<\"remark-parse/lib/tokenize/escape\">;\n}\ndeclare module \"remark-parse/lib/tokenize/footnote-definition.js\" {\n  declare module.exports: $Exports<\n    \"remark-parse/lib/tokenize/footnote-definition\",\n  >;\n}\ndeclare module \"remark-parse/lib/tokenize/heading-atx.js\" {\n  declare module.exports: $Exports<\"remark-parse/lib/tokenize/heading-atx\">;\n}\ndeclare module \"remark-parse/lib/tokenize/heading-setext.js\" {\n  declare module.exports: $Exports<\"remark-parse/lib/tokenize/heading-setext\">;\n}\ndeclare module \"remark-parse/lib/tokenize/html-block.js\" {\n  declare module.exports: $Exports<\"remark-parse/lib/tokenize/html-block\">;\n}\ndeclare module \"remark-parse/lib/tokenize/html-inline.js\" {\n  declare module.exports: $Exports<\"remark-parse/lib/tokenize/html-inline\">;\n}\ndeclare module \"remark-parse/lib/tokenize/link.js\" {\n  declare module.exports: $Exports<\"remark-parse/lib/tokenize/link\">;\n}\ndeclare module \"remark-parse/lib/tokenize/list.js\" {\n  declare module.exports: $Exports<\"remark-parse/lib/tokenize/list\">;\n}\ndeclare module \"remark-parse/lib/tokenize/newline.js\" {\n  declare module.exports: $Exports<\"remark-parse/lib/tokenize/newline\">;\n}\ndeclare module \"remark-parse/lib/tokenize/paragraph.js\" {\n  declare module.exports: $Exports<\"remark-parse/lib/tokenize/paragraph\">;\n}\ndeclare module \"remark-parse/lib/tokenize/reference.js\" {\n  declare module.exports: $Exports<\"remark-parse/lib/tokenize/reference\">;\n}\ndeclare module \"remark-parse/lib/tokenize/strong.js\" {\n  declare module.exports: $Exports<\"remark-parse/lib/tokenize/strong\">;\n}\ndeclare module \"remark-parse/lib/tokenize/table.js\" {\n  declare module.exports: $Exports<\"remark-parse/lib/tokenize/table\">;\n}\ndeclare module \"remark-parse/lib/tokenize/text.js\" {\n  declare module.exports: $Exports<\"remark-parse/lib/tokenize/text\">;\n}\ndeclare module \"remark-parse/lib/tokenize/thematic-break.js\" {\n  declare module.exports: $Exports<\"remark-parse/lib/tokenize/thematic-break\">;\n}\ndeclare module \"remark-parse/lib/tokenize/url.js\" {\n  declare module.exports: $Exports<\"remark-parse/lib/tokenize/url\">;\n}\ndeclare module \"remark-parse/lib/tokenizer.js\" {\n  declare module.exports: $Exports<\"remark-parse/lib/tokenizer\">;\n}\ndeclare module \"remark-parse/lib/unescape.js\" {\n  declare module.exports: $Exports<\"remark-parse/lib/unescape\">;\n}\ndeclare module \"remark-parse/lib/util/get-indentation.js\" {\n  declare module.exports: $Exports<\"remark-parse/lib/util/get-indentation\">;\n}\ndeclare module \"remark-parse/lib/util/html.js\" {\n  declare module.exports: $Exports<\"remark-parse/lib/util/html\">;\n}\ndeclare module \"remark-parse/lib/util/interrupt.js\" {\n  declare module.exports: $Exports<\"remark-parse/lib/util/interrupt\">;\n}\ndeclare module \"remark-parse/lib/util/normalize.js\" {\n  declare module.exports: $Exports<\"remark-parse/lib/util/normalize\">;\n}\ndeclare module \"remark-parse/lib/util/remove-indentation.js\" {\n  declare module.exports: $Exports<\"remark-parse/lib/util/remove-indentation\">;\n}\n"
  },
  {
    "path": "flow-typed/npm/remark-rehype_vx.x.x.js",
    "content": "// flow-typed signature: 3c29f78ffb6a76af7e2daf974accbb65\n// flow-typed version: <<STUB>>/remark-rehype_v2/flow_v0.68.0\n\n/**\n * This is an autogenerated libdef stub for:\n *\n *   'remark-rehype'\n *\n * Fill this stub out by replacing all the `any` types.\n *\n * Once filled out, we encourage you to share your work with the\n * community by sending a pull request to:\n * https://github.com/flowtype/flow-typed\n */\n\ndeclare module \"remark-rehype\" {\n  declare module.exports: any;\n}\n\n/**\n * We include stubs for each file inside this npm package in case you need to\n * require those files directly. Feel free to delete any files that aren't\n * needed.\n */\n\n// Filename aliases\ndeclare module \"remark-rehype/index\" {\n  declare module.exports: $Exports<\"remark-rehype\">;\n}\ndeclare module \"remark-rehype/index.js\" {\n  declare module.exports: $Exports<\"remark-rehype\">;\n}\n"
  },
  {
    "path": "flow-typed/npm/remark-toc_vx.x.x.js",
    "content": "// flow-typed signature: e27f3c65d7624876119bbf776e5cb235\n// flow-typed version: <<STUB>>/remark-toc_v4/flow_v0.68.0\n\n/**\n * This is an autogenerated libdef stub for:\n *\n *   'remark-toc'\n *\n * Fill this stub out by replacing all the `any` types.\n *\n * Once filled out, we encourage you to share your work with the\n * community by sending a pull request to:\n * https://github.com/flowtype/flow-typed\n */\n\ndeclare module \"remark-toc\" {\n  declare module.exports: any;\n}\n\n/**\n * We include stubs for each file inside this npm package in case you need to\n * require those files directly. Feel free to delete any files that aren't\n * needed.\n */\n\n// Filename aliases\ndeclare module \"remark-toc/index\" {\n  declare module.exports: $Exports<\"remark-toc\">;\n}\ndeclare module \"remark-toc/index.js\" {\n  declare module.exports: $Exports<\"remark-toc\">;\n}\n"
  },
  {
    "path": "flow-typed/npm/rimraf_v2.x.x.js",
    "content": "// flow-typed signature: 1dff23447d5e18f5ac2b05aaec7cfb74\n// flow-typed version: a453e98ea2/rimraf_v2.x.x/flow_>=v0.25.0\n\ndeclare module \"rimraf\" {\n  declare type Options = {\n    maxBusyTries?: number,\n    emfileWait?: number,\n    glob?: boolean,\n    disableGlob?: boolean,\n  };\n\n  declare type Callback = (err: ?Error, path: ?string) => void;\n\n  declare module.exports: {\n    (f: string, opts?: Options | Callback, callback?: Callback): void,\n    sync(path: string, opts?: Options): void,\n  };\n}\n"
  },
  {
    "path": "flow-typed/npm/rss_vx.x.x.js",
    "content": "// flow-typed signature: e4ac33d5d37539c04d320904d310ec8b\n// flow-typed version: <<STUB>>/rss_v1/flow_v0.68.0\n\n/**\n * This is an autogenerated libdef stub for:\n *\n *   'rss'\n *\n * Fill this stub out by replacing all the `any` types.\n *\n * Once filled out, we encourage you to share your work with the\n * community by sending a pull request to:\n * https://github.com/flowtype/flow-typed\n */\n\ndeclare module \"rss\" {\n  declare module.exports: any;\n}\n\n/**\n * We include stubs for each file inside this npm package in case you need to\n * require those files directly. Feel free to delete any files that aren't\n * needed.\n */\ndeclare module \"rss/Gruntfile\" {\n  declare module.exports: any;\n}\n\ndeclare module \"rss/lib/index\" {\n  declare module.exports: any;\n}\n\n// Filename aliases\ndeclare module \"rss/Gruntfile.js\" {\n  declare module.exports: $Exports<\"rss/Gruntfile\">;\n}\ndeclare module \"rss/lib/index.js\" {\n  declare module.exports: $Exports<\"rss/lib/index\">;\n}\n"
  },
  {
    "path": "flow-typed/npm/socket.io-client_vx.x.x.js",
    "content": "// flow-typed signature: 2b128321185af2b6a97558b54ffcfa50\n// flow-typed version: <<STUB>>/socket.io-client_v1/flow_v0.68.0\n\n/**\n * This is an autogenerated libdef stub for:\n *\n *   'socket.io-client'\n *\n * Fill this stub out by replacing all the `any` types.\n *\n * Once filled out, we encourage you to share your work with the\n * community by sending a pull request to:\n * https://github.com/flowtype/flow-typed\n */\n\ndeclare module \"socket.io-client\" {\n  declare module.exports: any;\n}\n\n/**\n * We include stubs for each file inside this npm package in case you need to\n * require those files directly. Feel free to delete any files that aren't\n * needed.\n */\ndeclare module \"socket.io-client/dist/socket.io\" {\n  declare module.exports: any;\n}\n\ndeclare module \"socket.io-client/dist/socket.io.min\" {\n  declare module.exports: any;\n}\n\ndeclare module \"socket.io-client/dist/socket.io.slim\" {\n  declare module.exports: any;\n}\n\ndeclare module \"socket.io-client/dist/socket.io.slim.min\" {\n  declare module.exports: any;\n}\n\ndeclare module \"socket.io-client/lib/index\" {\n  declare module.exports: any;\n}\n\ndeclare module \"socket.io-client/lib/manager\" {\n  declare module.exports: any;\n}\n\ndeclare module \"socket.io-client/lib/on\" {\n  declare module.exports: any;\n}\n\ndeclare module \"socket.io-client/lib/socket\" {\n  declare module.exports: any;\n}\n\ndeclare module \"socket.io-client/lib/url\" {\n  declare module.exports: any;\n}\n\n// Filename aliases\ndeclare module \"socket.io-client/dist/socket.io.js\" {\n  declare module.exports: $Exports<\"socket.io-client/dist/socket.io\">;\n}\ndeclare module \"socket.io-client/dist/socket.io.min.js\" {\n  declare module.exports: $Exports<\"socket.io-client/dist/socket.io.min\">;\n}\ndeclare module \"socket.io-client/dist/socket.io.slim.js\" {\n  declare module.exports: $Exports<\"socket.io-client/dist/socket.io.slim\">;\n}\ndeclare module \"socket.io-client/dist/socket.io.slim.min.js\" {\n  declare module.exports: $Exports<\"socket.io-client/dist/socket.io.slim.min\">;\n}\ndeclare module \"socket.io-client/lib/index.js\" {\n  declare module.exports: $Exports<\"socket.io-client/lib/index\">;\n}\ndeclare module \"socket.io-client/lib/manager.js\" {\n  declare module.exports: $Exports<\"socket.io-client/lib/manager\">;\n}\ndeclare module \"socket.io-client/lib/on.js\" {\n  declare module.exports: $Exports<\"socket.io-client/lib/on\">;\n}\ndeclare module \"socket.io-client/lib/socket.js\" {\n  declare module.exports: $Exports<\"socket.io-client/lib/socket\">;\n}\ndeclare module \"socket.io-client/lib/url.js\" {\n  declare module.exports: $Exports<\"socket.io-client/lib/url\">;\n}\n"
  },
  {
    "path": "flow-typed/npm/socket.io_v1.x.x.js",
    "content": "// flow-typed signature: ea02c8f19c3b71f633fc50877bf36891\n// flow-typed version: 624054eae7/socket.io_v1.x.x/flow_>=v0.47.x\n\ndeclare module \"socket.io\" {\n  declare var server: SocketIOStatic;\n  declare module.exports: typeof server;\n}\n\ndeclare interface SocketIOStatic {\n  /**\n   * Default Server constructor\n   */\n  (): SocketIO$Server;\n\n  /**\n   * Creates a new Server\n   * @param srv The HTTP server that we're going to bind to\n   * @param opts An optional parameters object\n   */\n  (srv: any, opts?: SocketIO$ServerOptions): SocketIO$Server;\n\n  /**\n   * Creates a new Server\n   * @param port A port to bind to, as a number, or a string\n   * @param An optional parameters object\n   */\n  (port: string | number, opts?: SocketIO$ServerOptions): SocketIO$Server;\n\n  /**\n   * Creates a new Server\n   * @param A parameters object\n   */\n  (opts: SocketIO$ServerOptions): SocketIO$Server;\n\n  /**\n   * Backwards compatibility\n   * @see  io().listen()\n   */\n  listen: SocketIOStatic;\n}\n\ndeclare interface SocketIO$Server {\n  engine: {\n    ws: any,\n  };\n\n  /**\n   * A dictionary of all the namespaces currently on this Server\n   */\n  nsps: {\n    [namespace: string]: SocketIO$Namespace,\n  };\n\n  /**\n   * The default '/' Namespace\n   */\n  sockets: SocketIO$Namespace;\n\n  /**\n   * Sets the 'json' flag when emitting an event\n   */\n  json: SocketIO$Server;\n\n  /**\n     * Server request verification function, that checks for allowed origins\n     * @param req The http.IncomingMessage request\n     * @param fn The callback to be called. It should take one parameter, err,\n    which will be null if there was no problem, and one parameter, success,\n    of type boolean\n    */\n  checkRequest(req: any, fn: (err: any, success: boolean) => void): void;\n\n  /**\n   * Gets whether we're serving the client.js file or not\n   * @default  true\n   */\n  serveClient(): boolean;\n\n  /**\n   * Sets whether we're serving the client.js file or not\n   * @param v True if we want to serve the file, false otherwise\n   * @default  true\n   * @return  This Server\n   */\n  serveClient(v: boolean): SocketIO$Server;\n\n  /**\n   * Gets the client serving path\n   * @default  '/socket.io'\n   */\n  path(): string;\n\n  /**\n   * Sets the client serving path\n   * @param v The path to serve the client file on\n   * @default  '/socket.io'\n   * @return  This Server\n   */\n  path(v: string): SocketIO$Server;\n\n  /**\n   * Gets the adapter that we're going to use for handling rooms\n   * @default  typeof Adapter\n   */\n  adapter(): any;\n\n  /**\n   * Sets the adapter (class) that we're going to use for handling rooms\n   * @param v The class for the adapter to create\n   * @default  typeof Adapter\n   * @return  This Server\n   */\n  adapter(v: any): SocketIO$Server;\n\n  /**\n   * Gets the allowed origins for requests\n   * @default  \"*:*\"\n   */\n  origins(): string;\n\n  /**\n     * Sets the allowed origins for requests\n     * @param v The allowed origins, in host:port form\n     * @default  \"*:*\"\n    return This Server\n    */\n  origins(v: string): SocketIO$Server;\n\n  /**\n   * Attaches socket.io to a server\n   * @param srv The http.Server that we want to attach to\n   * @param opts An optional parameters object\n   * @return  This Server\n   */\n  attach(srv: any, opts?: SocketIO$ServerOptions): SocketIO$Server;\n\n  /**\n   * Attaches socket.io to a port\n   * @param port The port that we want to attach to\n   * @param opts An optional parameters object\n   * @return  This Server\n   */\n  attach(port: number, opts?: SocketIO$ServerOptions): SocketIO$Server;\n\n  /**\n   *\n   * @see  attach( srv, opts )\n   */\n  listen(srv: any, opts?: SocketIO$ServerOptions): SocketIO$Server;\n\n  /**\n   *\n   * @see  attach( port, opts )\n   */\n  listen(port: number, opts?: SocketIO$ServerOptions): SocketIO$Server;\n\n  /**\n   * Binds socket.io to an engine.io intsance\n   * @param src The Engine.io (or compatible) server to bind to\n   * @return  This Server\n   */\n  bind(srv: any): SocketIO$Server;\n\n  /**\n   * Called with each incoming connection\n   * @param socket The Engine.io Socket\n   * @return  This Server\n   */\n  onconnection(socket: any): SocketIO$Server;\n\n  /**\n     * Looks up/creates a Namespace\n     * @param nsp The name of the NameSpace to look up/create. Should start\n    with a '/'\n     * @return  The Namespace\n    */\n  of(nsp: string): SocketIO$Namespace;\n\n  /**\n   * Closes the server connection\n   */\n  close(fn?: () => void): void;\n\n  /**\n     * Base 'on' method to add a listener for an event\n     * @param event The event that we want to add a listener for\n     * @param listener The callback to call when we get the event. The parameters\n    for the callback depend on the event\n     * @return  The default '/' Namespace\n    */\n  on(event: string, listener: Function): SocketIO$Namespace;\n\n  /**\n   * Targets a room when emitting to the default '/' Namespace\n   * @param room The name of the room that we're targeting\n   * @return  The default '/' Namespace\n   */\n  to(room: string): SocketIO$Namespace;\n\n  /**\n   *\n   * @see  to( room )\n   */\n  in(room: string): SocketIO$Namespace;\n\n  /**\n     * Registers a middleware function, which is a function that gets executed\n     * for every incoming Socket, on the default '/' Namespace\n     * @param fn The function to call when we get a new incoming socket. It should\n    take one parameter of type Socket, and one callback function to call to\n    execute the next middleware function. The callback can take one optional\n    parameter, err, if there was an error. Errors passed to middleware callbacks\n    are sent as special 'error' packets to clients\n     * @return  The default '/' Namespace\n    */\n  use(\n    fn: (socket: SocketIO$Socket, fn: (err?: any) => void) => void,\n  ): SocketIO$Namespace;\n\n  /**\n     * Emits an event to the default Namespace\n     * @param event The event that we want to emit\n     * @param args Any number of optional arguments to pass with the event. If the\n    last argument is a function, it will be called as an ack. The ack should\n    take whatever data was sent with the packet\n     * @return  The default '/' Namespace\n    */\n  emit(event: string, ...args: any[]): SocketIO$Namespace;\n\n  /**\n   * Sends a 'message' event\n   * @see  emit( event, ...args )\n   * @return  The default '/' Namespace\n   */\n  send(...args: any[]): SocketIO$Namespace;\n\n  /**\n   *\n   * @see  send( ...args )\n   */\n  write(...args: any[]): SocketIO$Namespace;\n\n  /**\n   * Gets a list of clients\n   * @return  The default '/' Namespace\n   */\n  clients(...args: any[]): SocketIO$Namespace;\n\n  /**\n   * Sets the compress flag\n   * @return  The default '/' Namespace\n   */\n  compress(...args: any[]): SocketIO$Namespace;\n}\n\n/**\n * Options to pass to our server when creating it\n */\ndeclare interface SocketIO$ServerOptions {\n  /**\n   * The path to server the client file to\n   * @default  '/socket.io'\n   */\n  path?: string;\n\n  /**\n   * Should we serve the client file?\n   * @default  true\n   */\n  serveClient?: boolean;\n\n  /**\n   * The adapter to use for handling rooms. NOTE: this should be a class,\n   * not an object\n   * @default  typeof Adapter\n   */\n  adapter?: SocketIO$Adapter;\n\n  /**\n   * Accepted origins\n   * @default  '*:*'\n   */\n  origins?: string;\n\n  /**\n   * How many milliseconds without a pong packed to consider the connection closed (engine.io)\n   * @default  60000\n   */\n  pingTimeout?: number;\n\n  /**\n   * How many milliseconds before sending a new ping packet (keep-alive) (engine.io)\n   * @default  25000\n   */\n  pingInterval?: number;\n\n  /**\n   * How many bytes or characters a message can be when polling, before closing the session\n   * (to avoid Dos) (engine.io)\n   * @default  10E7\n   */\n  maxHttpBufferSize?: number;\n\n  /**\n     * A function that receives a given handshake or upgrade request as its first parameter,\n     * and can decide whether to continue or not. The second argument is a function that needs\n    to be called with the decided information: fn( err, success ), where success is a boolean\n    value where false means that the request is rejected, and err is an error code (engine.io)\n     * @default  null\n    */\n  allowRequest?: (\n    request: any,\n    callback: (err: number, success: boolean) => void,\n  ) => void;\n\n  /**\n   * Transports to allow connections to (engine.io)\n   * @default  ['polling','websocket']\n   */\n  transports?: string[];\n\n  /**\n   * Whether to allow transport upgrades (engine.io)\n   * @default  true\n   */\n  allowUpgrades?: boolean;\n\n  /**\n   * parameters of the WebSocket permessage-deflate extension (see ws module).\n   * Set to false to disable (engine.io)\n   * @default  true\n   */\n  perMessageDeflate?: Object | boolean;\n\n  /**\n     * Parameters of the http compression for the polling transports (see zlib).\n     * Set to false to disable, or set an object with parameter \"threshold:number\"\n    to only compress data if the byte size is above this value (1024) (engine.io)\n     * @default  true|1024\n    */\n  httpCompression?: Object | boolean;\n\n  /**\n   * Name of the HTTP cookie that contains the client sid to send as part of\n   * handshake response headers. Set to false to not send one (engine.io)\n   * @default  \"io\"\n   */\n  cookie?: string | boolean;\n}\n\n/**\n * The Namespace, sandboxed environments for sockets, each connection\n * to a Namespace requires a new Socket\n */\ndeclare type SocketIO$Namespace = {\n  /**\n   * The name of the NameSpace\n   */\n  name: string,\n\n  /**\n   * The controller Server for this Namespace\n   */\n  server: SocketIO$Server,\n\n  /**\n   * A dictionary of all the Sockets connected to this Namespace, where\n   * the Socket ID is the key\n   */\n  sockets: {\n    [id: string]: SocketIO$Socket,\n  },\n\n  /**\n   * A dictionary of all the Sockets connected to this Namespace, where\n   * the Socket ID is the key\n   */\n  connected: {\n    [id: string]: SocketIO$Socket,\n  },\n\n  /**\n   * The Adapter that we're using to handle dealing with rooms etc\n   */\n  adapter: SocketIO$Adapter,\n\n  /**\n   * Sets the 'json' flag when emitting an event\n   */\n  json: SocketIO$Namespace,\n\n  /**\n     * Registers a middleware function, which is a function that gets executed\n     * for every incoming Socket\n     * @param fn The function to call when we get a new incoming socket. It should\n    take one parameter of type Socket, and one callback function to call to\n    execute the next middleware function. The callback can take one optional\n    parameter, err, if there was an error. Errors passed to middleware callbacks\n    are sent as special 'error' packets to clients\n     * @return  This Namespace\n    */\n  use(\n    fn: (socket: SocketIO$Socket, fn: (err?: any) => void) => void,\n  ): SocketIO$Namespace,\n\n  /**\n   * Targets a room when emitting\n   * @param room The name of the room that we're targeting\n   * @return  This Namespace\n   */\n  to(room: string): SocketIO$Namespace,\n\n  /**\n   *\n   * @see  to( room )\n   */\n  in(room: string): SocketIO$Namespace,\n\n  /**\n   * Sends a 'message' event\n   * @see  emit( event, ...args )\n   * @return  This Namespace\n   */\n  send(...args: any[]): SocketIO$Namespace,\n\n  /**\n   *\n   * @see  send( ...args )\n   */\n  write(...args: any[]): SocketIO$Namespace,\n\n  /**\n   * The event fired when we get a new connection\n   * @param event The event being fired: 'connection'\n   * @param listener A listener that should take one parameter of type Socket\n   * @return  This Namespace\n   */\n  on(\n    event: \"connection\",\n    listener: (socket: SocketIO$Socket) => void,\n  ): SocketIO$Namespace,\n\n  /**\n   *\n   * @see  on( 'connection', listener )\n   */\n  on(\n    event: \"connect\",\n    listener: (socket: SocketIO$Socket) => void,\n  ): SocketIO$Namespace,\n\n  /**\n     * Base 'on' method to add a listener for an eventThis Namespace\n     * @param event The event that we want to add a listener for\n     * @param listener The callback to call when we get the event. The parameters\n    for the callback depend on the event\n    */\n  on(event: string, listener: Function): SocketIO$Namespace,\n\n  /**\n   * Gets a list of clients.\n   * @return  This Namespace\n   */\n  clients(fn: Function): SocketIO$Namespace,\n\n  /**\n   * Sets the compress flag.\n   * @param compress If `true`, compresses the sending data\n   * @return  This Namespace\n   */\n  compress(compress: boolean): SocketIO$Namespace,\n};\n\n/**\n * The socket, which handles our connection for a namespace. NOTE: while\n * we technically extend NodeJS.EventEmitter, we're not putting it here\nas we have a problem with the emit() event (as it's overridden with a\ndifferent return)\n*/\ndeclare type SocketIO$Socket = {\n  /**\n   * The namespace that this socket is for\n   */\n  nsp: SocketIO$Namespace,\n\n  /**\n   * The Server that our namespace is in\n   */\n  server: SocketIO$Server,\n\n  /**\n   * The Adapter that we use to handle our rooms\n   */\n  adapter: SocketIO$Adapter,\n\n  /**\n   * The unique ID for this Socket. Regenerated at every connection. This is\n   * also the name of the room that the Socket automatically joins on connection\n   */\n  id: string,\n\n  /**\n   * The http.IncomingMessage request sent with the connection. Useful\n   * for recovering headers etc\n   */\n  request: any,\n\n  /**\n   * The Client associated with this Socket\n   */\n  client: SocketIO$Client,\n\n  /**\n   * The underlying Engine.io Socket instance\n   */\n  conn: SocketIO$EngineSocket,\n\n  /**\n   * The list of rooms that this Socket is currently in, where\n   * the ID the the room ID\n   */\n  rooms: {\n    [id: string]: string,\n  },\n\n  /**\n   * Is the Socket currently connected?\n   */\n  connected: boolean,\n\n  /**\n   * Is the Socket currently disconnected?\n   */\n  disconnected: boolean,\n\n  /**\n   * The object used when negociating the handshake\n   */\n  handshake: {\n    /**\n     * The headers passed along with the request. e.g. 'host',\n     * 'connection', 'accept', 'referer', 'cookie'\n     */\n    headers: any,\n\n    /**\n     * The current time, as a string\n     */\n    time: string,\n\n    /**\n     * The remote address of the connection request\n     */\n    address: string,\n\n    /**\n     * Is this a cross-domain request?\n     */\n    xdomain: boolean,\n\n    /**\n     * Is this a secure request?\n     */\n    secure: boolean,\n\n    /**\n     * The timestamp for when this was issued\n     */\n    issued: number,\n\n    /**\n     * The request url\n     */\n    url: string,\n\n    /**\n     * Any query string parameters in the request url\n     */\n    query: any,\n  },\n\n  /**\n   * Sets the 'json' flag when emitting an event\n   */\n  json: SocketIO$Socket,\n\n  /**\n     * Sets the 'volatile' flag when emitting an event. Volatile messages are\n     * messages that can be dropped because of network issues and the like. Use\n    for high-volume/real-time messages where you don't need to receive all\n    of them\n    */\n  volatile: SocketIO$Socket,\n\n  /**\n   * Sets the 'broadcast' flag when emitting an event. Broadcasting an event\n   * will send it to all the other sockets in the namespace except for yourself\n   */\n  broadcast: SocketIO$Socket,\n\n  /**\n   * Targets a room when broadcasting\n   * @param room The name of the room that we're targeting\n   * @return  This Socket\n   */\n  to(room: string): SocketIO$Socket,\n\n  /**\n   *\n   * @see  to( room )\n   */\n  in(room: string): SocketIO$Socket,\n\n  /**\n   * Sends a 'message' event\n   * @see  emit( event, ...args )\n   */\n  send(...args: any[]): SocketIO$Socket,\n\n  /**\n   *\n   * @see  send( ...args )\n   */\n  write(...args: any[]): SocketIO$Socket,\n\n  /**\n     * Joins a room. You can join multiple rooms, and by default, on connection,\n     * you join a room with the same name as your ID\n     * @param name The name of the room that we want to join\n     * @param fn An optional callback to call when we've joined the room. It should\n    take an optional parameter, err, of a possible error\n     * @return  This Socket\n    */\n  join(name: string, fn?: (err?: any) => void): SocketIO$Socket,\n\n  /**\n     * Leaves a room\n     * @param name The name of the room to leave\n     * @param fn An optional callback to call when we've left the room. It should\n    take on optional parameter, err, of a possible error\n    */\n  leave(name: string, fn?: Function): SocketIO$Socket,\n\n  /**\n   * Leaves all the rooms that we've joined\n   */\n  leaveAll(): void,\n\n  /**\n   * Disconnects this Socket\n   * @param close If true, also closes the underlying connection\n   * @return  This Socket\n   */\n  disconnect(close?: boolean): SocketIO$Socket,\n\n  /**\n   * Returns all the callbacks for a particular event\n   * @param event The event that we're looking for the callbacks of\n   * @return  An array of callback Functions, or an empty array if we don't have any\n   */\n  listeners(event: string): Function[],\n\n  /**\n   * Sets the compress flag\n   * @param compress If `true`, compresses the sending data\n   * @return  This Socket\n   */\n  compress(compress: boolean): SocketIO$Socket,\n};\n\n/**\n * The interface used when dealing with rooms etc\n */\ndeclare type SocketIO$Adapter = {\n  /**\n   * The namespace that this adapter is for\n   */\n  nsp: SocketIO$Namespace,\n\n  /**\n   * A dictionary of all the rooms that we have in this namespace\n   * The rooms are made of a `sockets` key which is the dictionary of sockets per ID\n   */\n  rooms: {\n    [room: string]: {\n      sockets: {\n        [id: string]: boolean,\n      },\n      length: number,\n    },\n  },\n\n  /**\n   * A dictionary of all the socket ids that we're dealing with, and all\n   * the rooms that the socket is currently in\n   */\n  sids: {\n    [id: string]: {\n      [room: string]: boolean,\n    },\n  },\n\n  /**\n     * Adds a socket to a room. If the room doesn't exist, it's created\n     * @param id The ID of the socket to add\n     * @param room The name of the room to add the socket to\n     * @param callback An optional callback to call when the socket has been\n    added. It should take an optional parameter, error, if there was a problem\n    */\n  add(id: string, room: string, callback?: (err?: any) => void): void,\n\n  /**\n     * Removes a socket from a room. If there are no more sockets in the room,\n     * the room is deleted\n     * @param id The ID of the socket that we're removing\n     * @param room The name of the room to remove the socket from\n     * @param callback An optional callback to call when the socket has been\n    removed. It should take on optional parameter, error, if there was a problem\n    */\n  del(id: string, room: string, callback?: (err?: any) => void): void,\n\n  /**\n   * Removes a socket from all the rooms that it's joined\n   * @param id The ID of the socket that we're removing\n   */\n  delAll(id: string): void,\n\n  /**\n     * Broadcasts a packet\n     * @param packet The packet to broadcast\n     * @param opts Any options to send along:\n    - rooms: An optional list of rooms to broadcast to. If empty, the packet is broadcast to all sockets\n    - except: A list of Socket IDs to exclude\n    - flags: Any flags that we want to send along ('json', 'volatile', 'broadcast')\n    */\n  broadcast(\n    packet: any,\n    opts: {\n      rooms?: string[],\n      except?: string[],\n      flags?: {\n        [flag: string]: boolean,\n      },\n    },\n  ): void,\n};\n\n/**\n * The client behind each socket (can have multiple sockets)\n */\ndeclare interface SocketIO$Client {\n  /**\n   * The Server that this client belongs to\n   */\n  server: SocketIO$Server;\n\n  /**\n   * The underlying Engine.io Socket instance\n   */\n  conn: SocketIO$EngineSocket;\n\n  /**\n   * The ID for this client. Regenerated at every connection\n   */\n  id: string;\n\n  /**\n   * The http.IncomingMessage request sent with the connection. Useful\n   * for recovering headers etc\n   */\n  request: any;\n\n  /**\n   * The dictionary of sockets currently connect via this client (i.e. to different\n   * namespaces) where the Socket ID is the key\n   */\n  sockets: {\n    [id: string]: SocketIO$Socket,\n  };\n\n  /**\n   * A dictionary of all the namespaces for this client, with the Socket that\n   * deals with that namespace\n   */\n  nsps: {\n    [nsp: string]: SocketIO$Socket,\n  };\n}\n\n/**\n * A reference to the underlying engine.io Socket connection.\n */\ndeclare type SocketIO$EngineSocket = {\n  /**\n   * The ID for this socket - matches Client.id\n   */\n  id: string,\n\n  /**\n   * The Engine.io Server for this socket\n   */\n  server: any,\n\n  /**\n   * The ready state for the client. Either 'opening', 'open', 'closing', or 'closed'\n   */\n  readyState: string,\n\n  /**\n   * The remote IP for this connection\n   */\n  remoteAddress: string,\n\n  /**\n   * whether the transport has been upgraded\n   */\n  upgraded: boolean,\n\n  /**\n   * (http.IncomingMessage): request that originated the Socket\n   */\n  request: any,\n\n  /**\n   * (Transport): transport reference\n   */\n  transport: any,\n};\n"
  },
  {
    "path": "flow-typed/npm/styled-components_v2.x.x.js",
    "content": "// @flow\n\ntype $npm$styledComponents$Interpolation =\n  | (<C: {}>(executionContext: C) => string)\n  | string\n  | number;\ntype $npm$styledComponents$NameGenerator = (hash: number) => string;\n\ntype $npm$styledComponents$TaggedTemplateLiteral<R> = {|\n  (Array<string>, $npm$styledComponents$Interpolation): R,\n|};\n\n// ---- FUNCTIONAL COMPONENT DEFINITIONS ----\ntype $npm$styledComponents$ReactComponentFunctional<Props, DefaultProps = *> = {\n  defaultProps: DefaultProps,\n} & $npm$styledComponents$ReactComponentFunctionalUndefinedDefaultProps<Props>;\n\ntype $npm$styledComponents$ReactComponentFunctionalUndefinedDefaultProps<\n  Props,\n> = React$StatelessFunctionalComponent<Props>;\n\n// ---- CLASS COMPONENT DEFINITIONS ----\nclass $npm$styledComponents$ReactComponent<\n  Props,\n  DefaultProps,\n> extends React$Component<Props> {\n  static defaultProps: DefaultProps;\n}\ntype $npm$styledComponents$ReactComponentClass<Props, DefaultProps = *> = Class<\n  $npm$styledComponents$ReactComponent<Props, DefaultProps>,\n>;\ntype $npm$styledComponents$ReactComponentClassUndefinedDefaultProps<\n  Props,\n> = Class<React$Component<Props, *>>;\n\n// ---- COMPONENT FUNCTIONS INPUT (UNION) & OUTPUT (INTERSECTION) ----\ntype $npm$styledComponents$ReactComponentUnion<\n  Props,\n> = $npm$styledComponents$ReactComponentUnionWithDefaultProps<Props, *>;\n\ntype $npm$styledComponents$ReactComponentUnionWithDefaultProps<\n  Props,\n  DefaultProps,\n> =\n  | $npm$styledComponents$ReactComponentFunctional<Props, DefaultProps>\n  | $npm$styledComponents$ReactComponentFunctionalUndefinedDefaultProps<Props>\n  | $npm$styledComponents$ReactComponentClass<Props, DefaultProps>\n  | $npm$styledComponents$ReactComponentClassUndefinedDefaultProps<Props>;\n\ntype $npm$styledComponents$ReactComponentIntersection<\n  Props,\n  DefaultProps = *,\n> = $npm$styledComponents$ReactComponentFunctional<Props, DefaultProps> &\n  $npm$styledComponents$ReactComponentClass<Props, DefaultProps>;\n\n// ---- WITHCOMPONENT ----\ntype $npm$styledComponents$ReactComponentStyledWithComponent<ComponentList> = <\n  Props,\n  DefaultProps,\n  Input:\n    | ComponentList\n    | $npm$styledComponents$ReactComponentStyled<Props, DefaultProps>\n    | $npm$styledComponents$ReactComponentUnionWithDefaultProps<\n        Props,\n        DefaultProps,\n      >,\n>(\n  Input,\n) => $npm$styledComponents$ReactComponentStyled<Props, DefaultProps>;\n\n// ---- STATIC PROPERTIES ----\ntype $npm$styledComponents$ReactComponentStyledStaticProps<\n  Props,\n  ComponentList,\n> = {|\n  attrs: <AdditionalProps: {}>(\n    AdditionalProps,\n  ) => $npm$styledComponents$ReactComponentStyledTaggedTemplateLiteral<\n    Props & AdditionalProps,\n    ComponentList,\n  >,\n  extend: $npm$styledComponents$ReactComponentStyledTaggedTemplateLiteral<\n    Props,\n    ComponentList,\n  >,\n|};\n\ntype $npm$styledComponents$ReactComponentStyledStaticPropsWithComponent<\n  Props,\n  ComponentList,\n> = {|\n  withComponent: $npm$styledComponents$ReactComponentStyledWithComponent<\n    ComponentList,\n  >,\n  attrs: <AdditionalProps: {}>(\n    AdditionalProps,\n  ) => $npm$styledComponents$ReactComponentStyledTaggedTemplateLiteralWithComponent<\n    Props & AdditionalProps,\n    ComponentList,\n  >,\n  extend: $npm$styledComponents$ReactComponentStyledTaggedTemplateLiteralWithComponent<\n    Props,\n    ComponentList,\n  >,\n|};\n\n// ---- STYLED FUNCTION ----\n// Error: styled(CustomComponent).withComponent('a')\n// Ok:    styled('div').withComponent('a')\ntype $npm$styledComponents$Call<\n  ComponentListKeys,\n> = (ComponentListKeys => $npm$styledComponents$ReactComponentStyledTaggedTemplateLiteralWithComponent<\n  {},\n  ComponentListKeys,\n>) &\n  (<Props>(\n    $npm$styledComponents$ReactComponentUnion<Props>,\n  ) => $npm$styledComponents$ReactComponentStyledTaggedTemplateLiteral<\n    Props,\n    ComponentListKeys,\n  >);\n\n// ---- STYLED COMPONENT ----\ntype $npm$styledComponents$ReactComponentStyled<\n  Props,\n  ComponentList,\n  DefaultProps = *,\n> = $npm$styledComponents$ReactComponentStyledStaticPropsWithComponent<\n  Props,\n  ComponentList,\n> &\n  $npm$styledComponents$ReactComponentIntersection<Props, DefaultProps>;\n\n// ---- TAGGED TEMPLATE LITERAL ----\ntype $npm$styledComponents$ReactComponentStyledTaggedTemplateLiteral<\n  Props,\n  ComponentList,\n> = $npm$styledComponents$ReactComponentStyledStaticProps<\n  Props,\n  ComponentList,\n> &\n  $npm$styledComponents$TaggedTemplateLiteral<\n    $npm$styledComponents$ReactComponentStyled<Props, ComponentList>,\n  >;\n\ntype $npm$styledComponents$ReactComponentStyledTaggedTemplateLiteralWithComponent<\n  Props,\n  ComponentList,\n> = $npm$styledComponents$ReactComponentStyledStaticPropsWithComponent<\n  Props,\n  ComponentList,\n> &\n  $npm$styledComponents$TaggedTemplateLiteral<\n    $npm$styledComponents$ReactComponentStyled<Props, ComponentList>,\n  >;\n\n// ---- WITHTHEME ----\ntype $npm$styledComponents$WithThemeReactComponentClass = <\n  InputProps: { theme: $npm$styledComponents$Theme },\n  InputDefaultProps: {},\n  OutputProps: $Diff<InputProps, { theme: $npm$styledComponents$Theme }>,\n  OutputDefaultProps: InputDefaultProps & {\n    theme: $npm$styledComponents$Theme,\n  },\n>(\n  $npm$styledComponents$ReactComponentClass<InputProps, InputDefaultProps>,\n) => $npm$styledComponents$ReactComponentClass<OutputProps, OutputDefaultProps>;\n\ntype $npm$styledComponents$WithThemeReactComponentClassUndefinedDefaultProps = <\n  InputProps: { theme: $npm$styledComponents$Theme },\n  OutputProps: $Diff<InputProps, { theme: $npm$styledComponents$Theme }>,\n>(\n  $npm$styledComponents$ReactComponentClassUndefinedDefaultProps<InputProps>,\n) => $npm$styledComponents$ReactComponentClass<\n  OutputProps,\n  { theme: $npm$styledComponents$Theme },\n>;\n\ntype $npm$styledComponents$WithThemeReactComponentFunctional = <\n  InputProps: { theme: $npm$styledComponents$Theme },\n  InputDefaultProps: {},\n  OutputProps: $Diff<InputProps, { theme: $npm$styledComponents$Theme }>,\n  OutputDefaultProps: InputDefaultProps & {\n    theme: $npm$styledComponents$Theme,\n  },\n>(\n  $npm$styledComponents$ReactComponentFunctional<InputProps, InputDefaultProps>,\n) => $npm$styledComponents$ReactComponentFunctional<\n  OutputProps,\n  OutputDefaultProps,\n>;\n\ntype $npm$styledComponents$WithThemeReactComponentFunctionalUndefinedDefaultProps = <\n  InputProps: { theme: $npm$styledComponents$Theme },\n  OutputProps: $Diff<InputProps, { theme: $npm$styledComponents$Theme }>,\n>(\n  $npm$styledComponents$ReactComponentFunctionalUndefinedDefaultProps<\n    InputProps,\n  >,\n) => $npm$styledComponents$ReactComponentFunctional<\n  OutputProps,\n  { theme: $npm$styledComponents$Theme },\n>;\n\ntype $npm$styledComponents$WithTheme = $npm$styledComponents$WithThemeReactComponentClass &\n  $npm$styledComponents$WithThemeReactComponentClassUndefinedDefaultProps &\n  $npm$styledComponents$WithThemeReactComponentFunctional &\n  $npm$styledComponents$WithThemeReactComponentFunctionalUndefinedDefaultProps;\n\n// ---- MISC ----\ntype $npm$styledComponents$Theme = { [key: string]: mixed };\ntype $npm$styledComponents$ThemeProviderProps = {\n  theme:\n    | $npm$styledComponents$Theme\n    | ((outerTheme: $npm$styledComponents$Theme) => void),\n};\n\nclass Npm$StyledComponents$ThemeProvider extends React$Component<\n  $npm$styledComponents$ThemeProviderProps,\n> {}\n\nclass Npm$StyledComponents$StyleSheetManager extends React$Component<{\n  sheet: mixed,\n}> {}\n\nclass Npm$StyledComponents$ServerStyleSheet {\n  instance: StyleSheet;\n  collectStyles: (children: any) => React$Node;\n  getStyleTags: () => string;\n  getStyleElement: () => React$Node;\n}\n\ntype $npm$styledComponents$StyledComponentsComponentListKeys = $Subtype<\n  $Keys<$npm$styledComponents$StyledComponentsComponentList>,\n>;\n\ntype $npm$styledComponents$StyledComponentsComponentListValue = $npm$styledComponents$ReactComponentStyledTaggedTemplateLiteralWithComponent<\n  {},\n  $npm$styledComponents$StyledComponentsComponentListKeys,\n>;\n\n// ---- COMPONENT LIST ----\ntype $npm$styledComponents$StyledComponentsComponentList = {|\n  a: $npm$styledComponents$StyledComponentsComponentListValue,\n  abbr: $npm$styledComponents$StyledComponentsComponentListValue,\n  address: $npm$styledComponents$StyledComponentsComponentListValue,\n  area: $npm$styledComponents$StyledComponentsComponentListValue,\n  article: $npm$styledComponents$StyledComponentsComponentListValue,\n  aside: $npm$styledComponents$StyledComponentsComponentListValue,\n  audio: $npm$styledComponents$StyledComponentsComponentListValue,\n  b: $npm$styledComponents$StyledComponentsComponentListValue,\n  base: $npm$styledComponents$StyledComponentsComponentListValue,\n  bdi: $npm$styledComponents$StyledComponentsComponentListValue,\n  bdo: $npm$styledComponents$StyledComponentsComponentListValue,\n  big: $npm$styledComponents$StyledComponentsComponentListValue,\n  blockquote: $npm$styledComponents$StyledComponentsComponentListValue,\n  body: $npm$styledComponents$StyledComponentsComponentListValue,\n  br: $npm$styledComponents$StyledComponentsComponentListValue,\n  button: $npm$styledComponents$StyledComponentsComponentListValue,\n  canvas: $npm$styledComponents$StyledComponentsComponentListValue,\n  caption: $npm$styledComponents$StyledComponentsComponentListValue,\n  cite: $npm$styledComponents$StyledComponentsComponentListValue,\n  code: $npm$styledComponents$StyledComponentsComponentListValue,\n  col: $npm$styledComponents$StyledComponentsComponentListValue,\n  colgroup: $npm$styledComponents$StyledComponentsComponentListValue,\n  data: $npm$styledComponents$StyledComponentsComponentListValue,\n  datalist: $npm$styledComponents$StyledComponentsComponentListValue,\n  dd: $npm$styledComponents$StyledComponentsComponentListValue,\n  del: $npm$styledComponents$StyledComponentsComponentListValue,\n  details: $npm$styledComponents$StyledComponentsComponentListValue,\n  dfn: $npm$styledComponents$StyledComponentsComponentListValue,\n  dialog: $npm$styledComponents$StyledComponentsComponentListValue,\n  div: $npm$styledComponents$StyledComponentsComponentListValue,\n  dl: $npm$styledComponents$StyledComponentsComponentListValue,\n  dt: $npm$styledComponents$StyledComponentsComponentListValue,\n  em: $npm$styledComponents$StyledComponentsComponentListValue,\n  embed: $npm$styledComponents$StyledComponentsComponentListValue,\n  fieldset: $npm$styledComponents$StyledComponentsComponentListValue,\n  figcaption: $npm$styledComponents$StyledComponentsComponentListValue,\n  figure: $npm$styledComponents$StyledComponentsComponentListValue,\n  footer: $npm$styledComponents$StyledComponentsComponentListValue,\n  form: $npm$styledComponents$StyledComponentsComponentListValue,\n  h1: $npm$styledComponents$StyledComponentsComponentListValue,\n  h2: $npm$styledComponents$StyledComponentsComponentListValue,\n  h3: $npm$styledComponents$StyledComponentsComponentListValue,\n  h4: $npm$styledComponents$StyledComponentsComponentListValue,\n  h5: $npm$styledComponents$StyledComponentsComponentListValue,\n  h6: $npm$styledComponents$StyledComponentsComponentListValue,\n  head: $npm$styledComponents$StyledComponentsComponentListValue,\n  header: $npm$styledComponents$StyledComponentsComponentListValue,\n  hgroup: $npm$styledComponents$StyledComponentsComponentListValue,\n  hr: $npm$styledComponents$StyledComponentsComponentListValue,\n  html: $npm$styledComponents$StyledComponentsComponentListValue,\n  i: $npm$styledComponents$StyledComponentsComponentListValue,\n  iframe: $npm$styledComponents$StyledComponentsComponentListValue,\n  img: $npm$styledComponents$StyledComponentsComponentListValue,\n  input: $npm$styledComponents$StyledComponentsComponentListValue,\n  ins: $npm$styledComponents$StyledComponentsComponentListValue,\n  kbd: $npm$styledComponents$StyledComponentsComponentListValue,\n  keygen: $npm$styledComponents$StyledComponentsComponentListValue,\n  label: $npm$styledComponents$StyledComponentsComponentListValue,\n  legend: $npm$styledComponents$StyledComponentsComponentListValue,\n  li: $npm$styledComponents$StyledComponentsComponentListValue,\n  link: $npm$styledComponents$StyledComponentsComponentListValue,\n  main: $npm$styledComponents$StyledComponentsComponentListValue,\n  map: $npm$styledComponents$StyledComponentsComponentListValue,\n  mark: $npm$styledComponents$StyledComponentsComponentListValue,\n  menu: $npm$styledComponents$StyledComponentsComponentListValue,\n  menuitem: $npm$styledComponents$StyledComponentsComponentListValue,\n  meta: $npm$styledComponents$StyledComponentsComponentListValue,\n  meter: $npm$styledComponents$StyledComponentsComponentListValue,\n  nav: $npm$styledComponents$StyledComponentsComponentListValue,\n  noscript: $npm$styledComponents$StyledComponentsComponentListValue,\n  object: $npm$styledComponents$StyledComponentsComponentListValue,\n  ol: $npm$styledComponents$StyledComponentsComponentListValue,\n  optgroup: $npm$styledComponents$StyledComponentsComponentListValue,\n  option: $npm$styledComponents$StyledComponentsComponentListValue,\n  output: $npm$styledComponents$StyledComponentsComponentListValue,\n  p: $npm$styledComponents$StyledComponentsComponentListValue,\n  param: $npm$styledComponents$StyledComponentsComponentListValue,\n  picture: $npm$styledComponents$StyledComponentsComponentListValue,\n  pre: $npm$styledComponents$StyledComponentsComponentListValue,\n  progress: $npm$styledComponents$StyledComponentsComponentListValue,\n  q: $npm$styledComponents$StyledComponentsComponentListValue,\n  rp: $npm$styledComponents$StyledComponentsComponentListValue,\n  rt: $npm$styledComponents$StyledComponentsComponentListValue,\n  ruby: $npm$styledComponents$StyledComponentsComponentListValue,\n  s: $npm$styledComponents$StyledComponentsComponentListValue,\n  samp: $npm$styledComponents$StyledComponentsComponentListValue,\n  script: $npm$styledComponents$StyledComponentsComponentListValue,\n  section: $npm$styledComponents$StyledComponentsComponentListValue,\n  select: $npm$styledComponents$StyledComponentsComponentListValue,\n  small: $npm$styledComponents$StyledComponentsComponentListValue,\n  source: $npm$styledComponents$StyledComponentsComponentListValue,\n  span: $npm$styledComponents$StyledComponentsComponentListValue,\n  strong: $npm$styledComponents$StyledComponentsComponentListValue,\n  style: $npm$styledComponents$StyledComponentsComponentListValue,\n  sub: $npm$styledComponents$StyledComponentsComponentListValue,\n  summary: $npm$styledComponents$StyledComponentsComponentListValue,\n  sup: $npm$styledComponents$StyledComponentsComponentListValue,\n  table: $npm$styledComponents$StyledComponentsComponentListValue,\n  tbody: $npm$styledComponents$StyledComponentsComponentListValue,\n  td: $npm$styledComponents$StyledComponentsComponentListValue,\n  textarea: $npm$styledComponents$StyledComponentsComponentListValue,\n  tfoot: $npm$styledComponents$StyledComponentsComponentListValue,\n  th: $npm$styledComponents$StyledComponentsComponentListValue,\n  thead: $npm$styledComponents$StyledComponentsComponentListValue,\n  time: $npm$styledComponents$StyledComponentsComponentListValue,\n  title: $npm$styledComponents$StyledComponentsComponentListValue,\n  tr: $npm$styledComponents$StyledComponentsComponentListValue,\n  track: $npm$styledComponents$StyledComponentsComponentListValue,\n  u: $npm$styledComponents$StyledComponentsComponentListValue,\n  ul: $npm$styledComponents$StyledComponentsComponentListValue,\n  var: $npm$styledComponents$StyledComponentsComponentListValue,\n  video: $npm$styledComponents$StyledComponentsComponentListValue,\n  wbr: $npm$styledComponents$StyledComponentsComponentListValue,\n\n  // SVG\n  circle: $npm$styledComponents$StyledComponentsComponentListValue,\n  clipPath: $npm$styledComponents$StyledComponentsComponentListValue,\n  defs: $npm$styledComponents$StyledComponentsComponentListValue,\n  ellipse: $npm$styledComponents$StyledComponentsComponentListValue,\n  g: $npm$styledComponents$StyledComponentsComponentListValue,\n  image: $npm$styledComponents$StyledComponentsComponentListValue,\n  line: $npm$styledComponents$StyledComponentsComponentListValue,\n  linearGradient: $npm$styledComponents$StyledComponentsComponentListValue,\n  mask: $npm$styledComponents$StyledComponentsComponentListValue,\n  path: $npm$styledComponents$StyledComponentsComponentListValue,\n  pattern: $npm$styledComponents$StyledComponentsComponentListValue,\n  polygon: $npm$styledComponents$StyledComponentsComponentListValue,\n  polyline: $npm$styledComponents$StyledComponentsComponentListValue,\n  radialGradient: $npm$styledComponents$StyledComponentsComponentListValue,\n  rect: $npm$styledComponents$StyledComponentsComponentListValue,\n  stop: $npm$styledComponents$StyledComponentsComponentListValue,\n  svg: $npm$styledComponents$StyledComponentsComponentListValue,\n  text: $npm$styledComponents$StyledComponentsComponentListValue,\n  tspan: $npm$styledComponents$StyledComponentsComponentListValue,\n|};\n\ndeclare module \"styled-components\" {\n  declare export type Interpolation = $npm$styledComponents$Interpolation;\n  declare export type NameGenerator = $npm$styledComponents$NameGenerator;\n  declare export type Theme = $npm$styledComponents$Theme;\n  declare export type ThemeProviderProps = $npm$styledComponents$ThemeProviderProps;\n  declare export type TaggedTemplateLiteral<\n    R,\n  > = $npm$styledComponents$TaggedTemplateLiteral<R>;\n  declare export type ComponentListKeys = $npm$styledComponents$StyledComponentsComponentListKeys;\n\n  declare export type ReactComponentFunctional<\n    Props: {},\n    DefaultProps: ?{} = *,\n  > = $npm$styledComponents$ReactComponentFunctional<Props, DefaultProps>;\n  declare export type ReactComponentFunctionalUndefinedDefaultProps<\n    Props: {},\n  > = $npm$styledComponents$ReactComponentFunctionalUndefinedDefaultProps<\n    Props,\n  >;\n  declare export type ReactComponentClass<\n    Props: {},\n    DefaultProps: ?{} = *,\n  > = $npm$styledComponents$ReactComponentClass<Props, DefaultProps>;\n  declare export type ReactComponentClassUndefinedDefaultProps<\n    Props: {},\n  > = $npm$styledComponents$ReactComponentClassUndefinedDefaultProps<Props>;\n  declare export type ReactComponentUnion<\n    Props,\n  > = $npm$styledComponents$ReactComponentUnion<Props>;\n  declare export type ReactComponentIntersection<\n    Props,\n  > = $npm$styledComponents$ReactComponentIntersection<Props>;\n  declare export type ReactComponentStyledStaticProps<\n    Props,\n  > = $npm$styledComponents$ReactComponentStyledStaticPropsWithComponent<\n    Props,\n    ComponentListKeys,\n  >;\n  declare export type ReactComponentStyled<\n    Props,\n  > = $npm$styledComponents$ReactComponentStyled<Props, ComponentListKeys>;\n  declare export type ReactComponentStyledTaggedTemplateLiteral<\n    Props,\n  > = $npm$styledComponents$ReactComponentStyledTaggedTemplateLiteralWithComponent<\n    Props,\n    ComponentListKeys,\n  >;\n\n  declare export var css: TaggedTemplateLiteral<Array<Interpolation>>;\n  declare export var injectGlobal: TaggedTemplateLiteral<void>;\n  declare export var keyframes: TaggedTemplateLiteral<string>;\n  declare export var withTheme: $npm$styledComponents$WithTheme;\n  declare export var ServerStyleSheet: typeof Npm$StyledComponents$ServerStyleSheet;\n  declare export var StyleSheetManager: typeof Npm$StyledComponents$StyleSheetManager;\n  declare export var ThemeProvider: typeof Npm$StyledComponents$ThemeProvider;\n\n  declare export default {\n    css: TaggedTemplateLiteral<Array<Interpolation>>,\n    ...$npm$styledComponents$StyledComponentsComponentList,\n  } & {\n    [[call]]: $npm$styledComponents$Call<ComponentListKeys>,\n  };\n}\n\ntype $npm$styledComponents$StyledComponentsNativeComponentListKeys = $Subtype<\n  $Keys<$npm$styledComponents$StyledComponentsNativeComponentList>,\n>;\n\ntype $npm$styledComponents$StyledComponentsNativeComponentListValue = $npm$styledComponents$ReactComponentStyledTaggedTemplateLiteralWithComponent<\n  {},\n  $npm$styledComponents$StyledComponentsNativeComponentListKeys,\n>;\n\ntype $npm$styledComponents$StyledComponentsNativeComponentList = {|\n  ActivityIndicator: $npm$styledComponents$StyledComponentsNativeComponentListValue,\n  ActivityIndicatorIOS: $npm$styledComponents$StyledComponentsNativeComponentListValue,\n  ART: $npm$styledComponents$StyledComponentsNativeComponentListValue,\n  Button: $npm$styledComponents$StyledComponentsNativeComponentListValue,\n  DatePickerIOS: $npm$styledComponents$StyledComponentsNativeComponentListValue,\n  DrawerLayoutAndroid: $npm$styledComponents$StyledComponentsNativeComponentListValue,\n  FlatList: $npm$styledComponents$StyledComponentsNativeComponentListValue,\n  Image: $npm$styledComponents$StyledComponentsNativeComponentListValue,\n  ImageEditor: $npm$styledComponents$StyledComponentsNativeComponentListValue,\n  ImageStore: $npm$styledComponents$StyledComponentsNativeComponentListValue,\n  KeyboardAvoidingView: $npm$styledComponents$StyledComponentsNativeComponentListValue,\n  ListView: $npm$styledComponents$StyledComponentsNativeComponentListValue,\n  MapView: $npm$styledComponents$StyledComponentsNativeComponentListValue,\n  Modal: $npm$styledComponents$StyledComponentsNativeComponentListValue,\n  Navigator: $npm$styledComponents$StyledComponentsNativeComponentListValue,\n  NavigatorIOS: $npm$styledComponents$StyledComponentsNativeComponentListValue,\n  Picker: $npm$styledComponents$StyledComponentsNativeComponentListValue,\n  PickerIOS: $npm$styledComponents$StyledComponentsNativeComponentListValue,\n  ProgressBarAndroid: $npm$styledComponents$StyledComponentsNativeComponentListValue,\n  ProgressViewIOS: $npm$styledComponents$StyledComponentsNativeComponentListValue,\n  RecyclerViewBackedScrollView: $npm$styledComponents$StyledComponentsNativeComponentListValue,\n  RefreshControl: $npm$styledComponents$StyledComponentsNativeComponentListValue,\n  ScrollView: $npm$styledComponents$StyledComponentsNativeComponentListValue,\n  SectionList: $npm$styledComponents$StyledComponentsNativeComponentListValue,\n  SegmentedControlIOS: $npm$styledComponents$StyledComponentsNativeComponentListValue,\n  Slider: $npm$styledComponents$StyledComponentsNativeComponentListValue,\n  SliderIOS: $npm$styledComponents$StyledComponentsNativeComponentListValue,\n  SnapshotViewIOS: $npm$styledComponents$StyledComponentsNativeComponentListValue,\n  StatusBar: $npm$styledComponents$StyledComponentsNativeComponentListValue,\n  SwipeableListView: $npm$styledComponents$StyledComponentsNativeComponentListValue,\n  Switch: $npm$styledComponents$StyledComponentsNativeComponentListValue,\n  SwitchAndroid: $npm$styledComponents$StyledComponentsNativeComponentListValue,\n  SwitchIOS: $npm$styledComponents$StyledComponentsNativeComponentListValue,\n  TabBarIOS: $npm$styledComponents$StyledComponentsNativeComponentListValue,\n  Text: $npm$styledComponents$StyledComponentsNativeComponentListValue,\n  TextInput: $npm$styledComponents$StyledComponentsNativeComponentListValue,\n  ToastAndroid: $npm$styledComponents$StyledComponentsNativeComponentListValue,\n  ToolbarAndroid: $npm$styledComponents$StyledComponentsNativeComponentListValue,\n  Touchable: $npm$styledComponents$StyledComponentsNativeComponentListValue,\n  TouchableHighlight: $npm$styledComponents$StyledComponentsNativeComponentListValue,\n  TouchableNativeFeedback: $npm$styledComponents$StyledComponentsNativeComponentListValue,\n  TouchableOpacity: $npm$styledComponents$StyledComponentsNativeComponentListValue,\n  TouchableWithoutFeedback: $npm$styledComponents$StyledComponentsNativeComponentListValue,\n  View: $npm$styledComponents$StyledComponentsNativeComponentListValue,\n  ViewPagerAndroid: $npm$styledComponents$StyledComponentsNativeComponentListValue,\n  VirtualizedList: $npm$styledComponents$StyledComponentsNativeComponentListValue,\n  WebView: $npm$styledComponents$StyledComponentsNativeComponentListValue,\n|};\n\ndeclare module \"styled-components/native\" {\n  declare export type Interpolation = $npm$styledComponents$Interpolation;\n  declare export type NameGenerator = $npm$styledComponents$NameGenerator;\n  declare export type Theme = $npm$styledComponents$Theme;\n  declare export type ThemeProviderProps = $npm$styledComponents$ThemeProviderProps;\n  declare export type TaggedTemplateLiteral<\n    R,\n  > = $npm$styledComponents$TaggedTemplateLiteral<R>;\n  declare export type NativeComponentListKeys = $npm$styledComponents$StyledComponentsNativeComponentListKeys;\n\n  declare export type ReactComponentFunctional<\n    Props: {},\n    DefaultProps: ?{} = *,\n  > = $npm$styledComponents$ReactComponentFunctional<Props, DefaultProps>;\n  declare export type ReactComponentFunctionalUndefinedDefaultProps<\n    Props: {},\n  > = $npm$styledComponents$ReactComponentFunctionalUndefinedDefaultProps<\n    Props,\n  >;\n  declare export type ReactComponentClass<\n    Props: {},\n    DefaultProps: ?{} = *,\n  > = $npm$styledComponents$ReactComponentClass<Props, DefaultProps>;\n  declare export type ReactComponentClassUndefinedDefaultProps<\n    Props: {},\n  > = $npm$styledComponents$ReactComponentClassUndefinedDefaultProps<Props>;\n  declare export type ReactComponentUnion<\n    Props,\n  > = $npm$styledComponents$ReactComponentUnion<Props>;\n  declare export type ReactComponentIntersection<\n    Props,\n  > = $npm$styledComponents$ReactComponentIntersection<Props>;\n  declare export type ReactComponentStyledStaticProps<\n    Props,\n  > = $npm$styledComponents$ReactComponentStyledStaticPropsWithComponent<\n    Props,\n    NativeComponentListKeys,\n  >;\n  declare export type ReactComponentStyled<\n    Props,\n  > = $npm$styledComponents$ReactComponentStyled<\n    Props,\n    NativeComponentListKeys,\n  >;\n  declare export type ReactComponentStyledTaggedTemplateLiteral<\n    Props,\n  > = $npm$styledComponents$ReactComponentStyledTaggedTemplateLiteralWithComponent<\n    Props,\n    NativeComponentListKeys,\n  >;\n\n  declare export var keyframes: TaggedTemplateLiteral<string>;\n  declare export var withTheme: $npm$styledComponents$WithTheme;\n  declare export var ThemeProvider: typeof Npm$StyledComponents$ThemeProvider;\n  declare export default {\n    css: TaggedTemplateLiteral<Array<Interpolation>>,\n    ...$npm$styledComponents$StyledComponentsNativeComponentList,\n  } & {\n    [[call]]: $npm$styledComponents$Call<NativeComponentListKeys>,\n  };\n}\n"
  },
  {
    "path": "flow-typed/npm/supertest_vx.x.x.js",
    "content": "// flow-typed signature: f46d29fbb284c70159ba0fa287f378ca\n// flow-typed version: <<STUB>>/supertest_v3/flow_v0.68.0\n\n/**\n * This is an autogenerated libdef stub for:\n *\n *   'supertest'\n *\n * Fill this stub out by replacing all the `any` types.\n *\n * Once filled out, we encourage you to share your work with the\n * community by sending a pull request to:\n * https://github.com/flowtype/flow-typed\n */\n\ndeclare module \"supertest\" {\n  declare module.exports: any;\n}\n\n/**\n * We include stubs for each file inside this npm package in case you need to\n * require those files directly. Feel free to delete any files that aren't\n * needed.\n */\ndeclare module \"supertest/lib/agent\" {\n  declare module.exports: any;\n}\n\ndeclare module \"supertest/lib/test\" {\n  declare module.exports: any;\n}\n\ndeclare module \"supertest/test/supertest\" {\n  declare module.exports: any;\n}\n\n// Filename aliases\ndeclare module \"supertest/index\" {\n  declare module.exports: $Exports<\"supertest\">;\n}\ndeclare module \"supertest/index.js\" {\n  declare module.exports: $Exports<\"supertest\">;\n}\ndeclare module \"supertest/lib/agent.js\" {\n  declare module.exports: $Exports<\"supertest/lib/agent\">;\n}\ndeclare module \"supertest/lib/test.js\" {\n  declare module.exports: $Exports<\"supertest/lib/test\">;\n}\ndeclare module \"supertest/test/supertest.js\" {\n  declare module.exports: $Exports<\"supertest/test/supertest\">;\n}\n"
  },
  {
    "path": "flow-typed/npm/trash-cli_vx.x.x.js",
    "content": "// flow-typed signature: 327b01bc348fd71b6109939e5158bef8\n// flow-typed version: <<STUB>>/trash-cli_v^1.4.0/flow_v0.87.0\n\n/**\n * This is an autogenerated libdef stub for:\n *\n *   'trash-cli'\n *\n * Fill this stub out by replacing all the `any` types.\n *\n * Once filled out, we encourage you to share your work with the\n * community by sending a pull request to:\n * https://github.com/flowtype/flow-typed\n */\n\ndeclare module \"trash-cli\" {\n  declare module.exports: any;\n}\n\n/**\n * We include stubs for each file inside this npm package in case you need to\n * require those files directly. Feel free to delete any files that aren't\n * needed.\n */\ndeclare module \"trash-cli/cli\" {\n  declare module.exports: any;\n}\n\n// Filename aliases\ndeclare module \"trash-cli/cli.js\" {\n  declare module.exports: $Exports<\"trash-cli/cli\">;\n}\n"
  },
  {
    "path": "flow-typed/npm/unified_v6.x.x.js",
    "content": "// flow-typed signature: 779ad8f5e6d4648694dc84161cd5cfb2\n// flow-typed version: 614bf49aa8/unified_v6.x.x/flow_>=v0.47.x\n\ninterface Unified$Point {\n  line: mixed;\n  column: mixed;\n  offset?: mixed;\n}\n\ninterface Unified$Position {\n  start: Unified$Point;\n  end: Unified$Point;\n  indent?: mixed;\n}\n\ninterface Unified$Data {}\n\ninterface Unified$Node {\n  type: string;\n  data?: Unified$Data;\n  position?: Unified$Position;\n}\n\ntype Done = (err: Error) => void | ((doc: mixed, extra?: mixed) => void);\n\ndeclare class Unified {\n  data(key: string): mixed;\n  data(key: string, value: mixed): this;\n  freeze(): this;\n  use(plugin: mixed, options?: mixed): this;\n  parse(file: mixed): Unified$Node;\n  stringify(node: Unified$Node, file?: mixed): string;\n  run(node: Unified$Node, file?: mixed): Promise<*>;\n  run(node: Unified$Node, file: mixed, done: Done): void;\n  runSync(node: Unified$Node, file?: mixed): Unified$Node;\n  process(doc: mixed): Promise<*>;\n  process(doc: mixed, done: Done): void;\n  processSync(doc: mixed): mixed;\n}\n\ndeclare module \"unified\" {\n  declare module.exports: () => Unified;\n}\n"
  },
  {
    "path": "flow-typed/npm/yargs_v7.x.x.js",
    "content": "// flow-typed signature: f80a4e6d3b2974596a66aac0367591fc\n// flow-typed version: da30fe6876/yargs_v7.x.x/flow_>=v0.42.x\n\ndeclare module \"yargs\" {\n  declare type Argv = {\n    _: Array<string>,\n    $0: string,\n    [key: string]: mixed,\n  };\n\n  declare type Options = $Shape<{\n    alias: string | Array<string>,\n    array: boolean,\n    boolean: boolean,\n    choices: Array<mixed>,\n    coerce: (arg: mixed) => mixed,\n    config: boolean,\n    configParser: (configPath: string) => { [key: string]: mixed },\n    conflicts: string | { [key: string]: string },\n    count: boolean,\n    default: mixed,\n    defaultDescription: string,\n    demandOption: boolean | string,\n    desc: string,\n    describe: string,\n    description: string,\n    global: boolean,\n    group: string,\n    implies: string | { [key: string]: string },\n    nargs: number,\n    normalize: boolean,\n    number: boolean,\n    requiresArg: boolean,\n    skipValidation: boolean,\n    string: boolean,\n    type: \"array\" | \"boolean\" | \"count\" | \"number\" | \"string\",\n  }>;\n\n  declare type CommonModuleObject = {|\n    command?: string | Array<string>,\n    aliases?: Array<string> | string,\n    builder?: { [key: string]: Options } | ((yargsInstance: Yargs) => mixed),\n    handler?: (argv: Argv) => void,\n  |};\n\n  declare type ModuleObjectDesc = {|\n    ...CommonModuleObject,\n    desc?: string | false,\n  |};\n\n  declare type ModuleObjectDescribe = {|\n    ...CommonModuleObject,\n    describe?: string | false,\n  |};\n\n  declare type ModuleObjectDescription = {|\n    ...CommonModuleObject,\n    description?: string | false,\n  |};\n\n  declare type ModuleObject =\n    | ModuleObjectDesc\n    | ModuleObjectDescribe\n    | ModuleObjectDescription;\n\n  declare class Yargs {\n    (args: Array<string>): Yargs;\n\n    alias(key: string, alias: string): this;\n    alias(alias: { [key: string]: string | Array<string> }): this;\n    argv: Argv;\n    array(key: string | Array<string>): this;\n    boolean(paramter: string | Array<string>): this;\n    check(fn: (argv: Argv, options: Array<string>) => ?boolean): this;\n    choices(key: string, allowed: Array<string>): this;\n    choices(allowed: { [key: string]: Array<string> }): this;\n    coerce(key: string, fn: (value: any) => mixed): this;\n    coerce(object: { [key: string]: (value: any) => mixed }): this;\n    coerce(keys: Array<string>, fn: (value: any) => mixed): this;\n\n    command(\n      cmd: string | Array<string>,\n      desc: string | false,\n      builder?: { [key: string]: Options } | ((yargsInstance: Yargs) => mixed),\n      handler?: Function,\n    ): this;\n\n    command(\n      cmd: string | Array<string>,\n      desc: string | false,\n      module: ModuleObject,\n    ): this;\n\n    command(module: ModuleObject): this;\n\n    completion(\n      cmd: string,\n      description?: string,\n      fn?: (\n        current: string,\n        argv: Argv,\n        done: (competion: Array<string>) => void,\n      ) => ?(Array<string> | Promise<Array<string>>),\n    ): this;\n\n    config(\n      key?: string,\n      description?: string,\n      parseFn?: (configPath: string) => { [key: string]: mixed },\n    ): this;\n    config(\n      key: string,\n      parseFn?: (configPath: string) => { [key: string]: mixed },\n    ): this;\n    config(config: { [key: string]: mixed }): this;\n\n    conflicts(keyA: string, keyB: string): this;\n    conflicts(keys: { [key: string]: string }): this;\n\n    count(name: string): this;\n\n    default(key: string, value: mixed, description?: string): this;\n    default(defaults: { [key: string]: mixed }): this;\n\n    // Deprecated: use demandOption() and demandCommand() instead.\n    demand(key: string, msg?: string | boolean): this;\n    demand(count: number, max?: number, msg?: string | boolean): this;\n\n    demandOption(key: string | Array<string>, msg?: string | boolean): this;\n\n    demandCommand(min: number, minMsg?: string): this;\n    demandCommand(\n      min: number,\n      max: number,\n      minMsg?: string,\n      maxMsg?: string,\n    ): this;\n\n    describe(key: string, description: string): this;\n    describe(describeObject: { [key: string]: string }): this;\n\n    detectLocale(shouldDetect: boolean): this;\n\n    env(prefix?: string): this;\n\n    epilog(text: string): this;\n    epilogue(text: string): this;\n\n    example(cmd: string, desc: string): this;\n\n    exitProcess(enable: boolean): this;\n\n    fail(fn: (failureMessage: string, err: Error, yargs: Yargs) => mixed): this;\n\n    getCompletion(args: Array<string>, fn: () => void): this;\n\n    global(globals: string | Array<string>, isGlobal?: boolean): this;\n\n    group(key: string | Array<string>, groupName: string): this;\n\n    help(option?: string, desc?: string): this;\n\n    implies(keyA: string, keyB: string): this;\n    implies(keys: { [key: string]: string }): this;\n\n    locale(\n      locale:\n        | \"de\"\n        | \"en\"\n        | \"es\"\n        | \"fr\"\n        | \"hi\"\n        | \"hu\"\n        | \"id\"\n        | \"it\"\n        | \"ja\"\n        | \"ko\"\n        | \"nb\"\n        | \"pirate\"\n        | \"pl\"\n        | \"pt\"\n        | \"pt_BR\"\n        | \"ru\"\n        | \"th\"\n        | \"tr\"\n        | \"zh_CN\",\n    ): this;\n    locale(): string;\n\n    nargs(key: string, count: number): this;\n\n    normalize(key: string): this;\n\n    number(key: string | Array<string>): this;\n\n    option(key: string, options?: Options): this;\n    option(optionMap: { [key: string]: Options }): this;\n\n    options(key: string, options?: Options): this;\n    options(optionMap: { [key: string]: Options }): this;\n\n    parse(\n      args: string | Array<string>,\n      context?: { [key: string]: mixed },\n      parseCallback?: (err: Error, argv: Argv, output?: string) => void,\n    ): Argv;\n    parse(\n      args: string | Array<string>,\n      parseCallback?: (err: Error, argv: Argv, output?: string) => void,\n    ): Argv;\n\n    pkgConf(key: string, cwd?: string): this;\n\n    recommendCommands(): this;\n\n    // Alias of demand()\n    require(key: string, msg: string | boolean): this;\n    require(count: number, max?: number, msg?: string | boolean): this;\n\n    requiresArg(key: string | Array<string>): this;\n\n    reset(): this;\n\n    showCompletionScript(): this;\n\n    showHelp(consoleLevel?: \"error\" | \"warn\" | \"log\"): this;\n\n    showHelpOnFail(enable: boolean, message?: string): this;\n\n    strict(): this;\n\n    skipValidation(key: string): this;\n\n    strict(global?: boolean): this;\n\n    string(key: string | Array<string>): this;\n\n    updateLocale(obj: { [key: string]: string }): this;\n    updateStrings(obj: { [key: string]: string }): this;\n\n    usage(message: string, opts?: { [key: string]: Options }): this;\n\n    version(): this;\n    version(version: string): this;\n    version(option: string | (() => string), version: string): this;\n    version(\n      option: string | (() => string),\n      description: string | (() => string),\n      version: string,\n    ): this;\n\n    wrap(columns: number | null): this;\n  }\n\n  declare module.exports: Yargs;\n}\n"
  },
  {
    "path": "flow-typed/phenomic.js",
    "content": "// @flow\n\ndeclare type Url = {\n  href: string,\n  protocol: string,\n  slashes?: boolean,\n  host: string,\n  auth?: string,\n  hostname: string,\n  port?: string,\n  pathname: string,\n  search?: string,\n  path?: string,\n  query?: Object,\n  hash?: string,\n};\n\ndeclare type PhenomicDBConfig = {|\n  sortFunctions?: {\n    [key: string]: (PhenomicDBEntry, PhenomicDBEntry) => number,\n  },\n|};\n\ndeclare type PhenomicDBEntryInput = {|\n  data: Object,\n  partial: Object,\n|};\ndeclare type PhenomicDBEntry = {|\n  data: Object,\n  partial: Object,\n  id: string,\n|};\n\ndeclare type PhenomicDBEntryPartial = {\n  id: string,\n};\ndeclare type PhenomicDBEntryDetailed = {|\n  id: string,\n  value: {\n    body?: any,\n  },\n|};\n\ndeclare type PhenomicDBSubRegistry = Array<PhenomicDBEntry>;\ndeclare type PhenomicDBRegistry = { [key: string]: PhenomicDBSubRegistry };\n\ndeclare type PhenomicDB = {|\n  _getDatabase: () => PhenomicDBRegistry,\n  _setDatabase: PhenomicDBRegistry => void,\n  destroy: () => void,\n  put: (\n    sub: null | string | $ReadOnlyArray<string>,\n    id: string,\n    value?: PhenomicDBEntryInput,\n  ) => void,\n  update: (\n    sub: null | string | $ReadOnlyArray<string>,\n    id: string,\n    value?: PhenomicDBEntryInput,\n  ) => void,\n  get: (\n    sub: null | string | $ReadOnlyArray<string>,\n    id: string,\n  ) => PhenomicDBEntryDetailed,\n  getPartial: (\n    sub: string | $ReadOnlyArray<string>,\n    id: string,\n  ) => mixed | PhenomicDBEntryPartial,\n  getList: (\n    sub: null | string | $ReadOnlyArray<string>,\n    query?: {\n      gt?: string,\n      gte?: string,\n      lt?: string,\n      lte?: string,\n      limit?: number,\n      sort?: string,\n      reverse?: boolean,\n    },\n    filter?: string,\n    filterValue?: string,\n  ) => $ReadOnlyArray<PhenomicDBEntryPartial>,\n|};\n\ndeclare type PhenomicInputPluginOption = { [optionName: string]: mixed };\n\ndeclare type PhenomicInputPlugin =\n  | string\n  // | {| default: PhenomicPluginModule<PhenomicInputPluginOption> |}\n  | PhenomicPluginModule<PhenomicInputPluginOption>;\n\ndeclare type PhenomicInputPluginWithOptionalOptions =\n  | PhenomicInputPlugin\n  | $ReadOnlyArray<PhenomicInputPlugin | PhenomicInputPluginOption>;\n\ndeclare type PhenomicInputPreset = (any) => PhenomicInputPlugins;\ndeclare type PhenomicInputMaybePreset = string | PhenomicInputMaybePreset;\n\ndeclare type PhenomicInputPlugins = {|\n  plugins?:\n    | $ReadOnlyArray<PhenomicInputPluginWithOptionalOptions>\n    | {\n        [name: string]: PhenomicInputPluginWithOptionalOptions,\n      },\n  presets?: $ReadOnlyArray<\n    | PhenomicInputMaybePreset\n    | $ReadOnlyArray<\n        | PhenomicInputMaybePreset\n        | $ReadOnlyArray<$ReadOnlyArray<string | PhenomicInputPluginOption>>\n        | {\n            [name: string]: PhenomicInputPluginOption,\n          },\n      >,\n  >,\n|};\n\ntype globs = $ReadOnlyArray<string>;\n\ndeclare type PhenomicInputConfig = {|\n  baseUrl?: string,\n  path?: string,\n  content?: { [key: string]: globs | {| root: string, globs: globs |} },\n  outdir?: string,\n  port?: number,\n  socketPort?: number,\n  bundleName?: string,\n  db?: PhenomicDBConfig,\n  ...PhenomicInputPlugins,\n|};\n\ndeclare type PhenomicContentFile = {|\n  name: string,\n  fullpath: string,\n  // exists: boolean,\n  // type: string\n|};\n\ntype PhenomicTransformResult = {|\n  data: Object,\n  partial: Object,\n|};\n\ntype ReactCompo = Function;\n\ndeclare type PhenomicAppType = {|\n  routes: React$Node,\n|};\n\ndeclare type PhenomicHtmlPropsType = {|\n  App: ReactCompo,\n  render: (\n    app: React$Node,\n  ) => {|\n    assets: PhenomicAssets,\n    html: string,\n    Main: ReactCompo,\n    State: ReactCompo,\n    Style: ReactCompo,\n    Script: ReactCompo,\n  |},\n|};\n\ndeclare type PhenomicHtmlType = (props: PhenomicHtmlPropsType) => React$Node;\n\ndeclare type PhenomicPluginModule<Opt> = (\n  config: PhenomicConfig,\n  options: Opt,\n) => PhenomicPlugin;\n\ndeclare type PhenomicTransformer = ({|\n  file: PhenomicContentFile,\n  contents: Buffer,\n|}) => PhenomicTransformResult | Promise<PhenomicTransformResult>;\n\ndeclare type PhenomicPlugin = {|\n  name: string,\n  // transformer\n  supportedFileTypes?: $ReadOnlyArray<string>,\n  transform?: PhenomicTransformer,\n  // api\n  extendAPI?: ({|\n    apiServer: express$Application,\n    db: PhenomicDB,\n  |}) => mixed,\n  // collector\n  collect?: ({|\n    db: PhenomicDB,\n    transformers: PhenomicPlugins,\n  |}) => void | Promise<void>,\n  // bunder\n  buildForPrerendering?: () => Promise<PhenomicAppType>,\n  build?: () => PhenomicAssets,\n  // renderer\n  getRoutes?: PhenomicAppType => any,\n  // urls-resolver\n  resolveURLs?: ({|\n    routes: any,\n  |}) => Promise<$ReadOnlyArray<string>>,\n  renderStatic?: ({|\n    app: PhenomicAppType,\n    assets: PhenomicAssets,\n    location: string,\n  |}) => Promise<$ReadOnlyArray<{| path: string, contents: string |}>>,\n  renderDevServer?: ({|\n    assets: PhenomicAssets,\n    location: string,\n  |}) => string,\n  // common\n  addDevServerMiddlewares?: () =>\n    | $ReadOnlyArray<express$Middleware>\n    | Promise<$ReadOnlyArray<express$Middleware>>,\n  beforeBuild?: () => void | Promise<void>,\n  afterBuild?: () => void | Promise<void>,\n|};\n\ndeclare type PhenomicPlugins = $ReadOnlyArray<PhenomicPlugin>;\n\ndeclare type PhenomicConfig = {|\n  baseUrl: Url,\n  path: string,\n  content: { [key: string]: globs | {| root: string, globs: globs |} },\n  outdir: string,\n  port: number,\n  socketPort: number,\n  bundleName: string,\n  db: PhenomicDBConfig,\n  plugins: $ReadOnlyArray<PhenomicPlugin>,\n|};\n\ndeclare type PhenomicQueryConfig = {|\n  path?: string,\n  id?: string,\n  after?: string,\n  by?: string,\n  value?: string,\n  order?: string,\n  sort?: string,\n  limit?: number,\n|};\n\ndeclare type PhenomicRoute = {|\n  path: string,\n  params?: { [key: string]: any },\n  component: {\n    getInitialProps?: ({ params: { [key: string]: any } }) => Object,\n    getAllPossibleUrls?: ({ path: string }) => $ReadOnlyArray<string>,\n    getQueries?: ({ params: { [key: string]: any } }) => {\n      [key: string]: PhenomicQueryConfig,\n    },\n  },\n|};\n\ndeclare type PhenomicAssets = { [key: string]: string };\n\ndeclare type phenomic$Query = string;\ndeclare type phenomic$Queries = $ReadOnlyArray<phenomic$Query>;\n"
  },
  {
    "path": "jest-setup.js",
    "content": "/* eslint-disable */\n// https://github.com/facebook/jest/issues/3552\njest.doMock(\"oniguruma\", function mockOniguruma() {\n  // https://github.com/atom/node-oniguruma/blob/3664b41e615697a3abd3b13e67226d177fa4143b/src/oniguruma.js\n  // with just \"configurable: true\" on Object.defineProperty\n\n  \"use strict\";\n\n  const OnigScanner = require(\"oniguruma/build/Release/onig_scanner.node\")\n    .OnigScanner;\n  const OnigString = require(\"oniguruma/build/Release/onig_scanner.node\")\n    .OnigString;\n\n  function OnigRegExp(source) {\n    this.source = source;\n    this.scanner = new OnigScanner([this.source]);\n  }\n\n  OnigRegExp.prototype.captureIndicesForMatch = function(string, match) {\n    var capture, captureIndices, i, len;\n    if (match != null) {\n      captureIndices = match.captureIndices;\n      string = this.scanner.convertToString(string);\n      for (i = 0, len = captureIndices.length; i < len; i++) {\n        capture = captureIndices[i];\n        capture.match = string.slice(capture.start, capture.end);\n      }\n      return captureIndices;\n    } else {\n      return null;\n    }\n  };\n\n  OnigRegExp.prototype.searchSync = function(string, startPosition) {\n    var match;\n    if (startPosition == null) {\n      startPosition = 0;\n    }\n    match = this.scanner.findNextMatchSync(string, startPosition);\n    return this.captureIndicesForMatch(string, match);\n  };\n\n  OnigRegExp.prototype.search = function(string, startPosition, callback) {\n    if (startPosition == null) {\n      startPosition = 0;\n    }\n    if (typeof startPosition === \"function\") {\n      callback = startPosition;\n      startPosition = 0;\n    }\n    return this.scanner.findNextMatch(\n      string,\n      startPosition,\n      (function(_this) {\n        return function(error, match) {\n          return typeof callback === \"function\"\n            ? callback(error, _this.captureIndicesForMatch(string, match))\n            : void 0;\n        };\n      })(this),\n    );\n  };\n\n  OnigRegExp.prototype.testSync = function(string) {\n    return this.searchSync(string) != null;\n  };\n\n  OnigRegExp.prototype.test = function(string, callback) {\n    return this.search(string, 0, function(error, result) {\n      return typeof callback === \"function\"\n        ? callback(error, result != null)\n        : void 0;\n    });\n  };\n\n  OnigScanner.prototype.findNextMatch = function(\n    string,\n    startPosition,\n    callback,\n  ) {\n    if (startPosition == null) startPosition = 0;\n    if (typeof startPosition === \"function\") {\n      callback = startPosition;\n      startPosition = 0;\n    }\n\n    string = this.convertToString(string);\n    startPosition = this.convertToNumber(startPosition);\n\n    this._findNextMatch(string, startPosition, (error, match) => {\n      if (match) match.scanner = this;\n      return callback(error, match);\n    });\n  };\n\n  OnigScanner.prototype.findNextMatchSync = function(string, startPosition) {\n    if (startPosition == null) {\n      startPosition = 0;\n    }\n    string = this.convertToString(string);\n    startPosition = this.convertToNumber(startPosition);\n\n    let match = this._findNextMatchSync(string, startPosition);\n    if (match) match.scanner = this;\n    return match;\n  };\n\n  OnigScanner.prototype.convertToString = function(value) {\n    if (value === undefined) return \"undefined\";\n    if (value === null) return \"null\";\n    if (value.constructor == OnigString) return value;\n    return value.toString();\n  };\n\n  OnigScanner.prototype.convertToNumber = function(value) {\n    value = parseInt(value);\n    if (!isFinite(value)) {\n      value = 0;\n    }\n    value = Math.max(value, 0);\n    return value;\n  };\n\n  OnigString.prototype.substring = function(start, end) {\n    return this.content.substring(start, end);\n  };\n\n  OnigString.prototype.toString = function(start, end) {\n    return this.content;\n  };\n\n  Object.defineProperty(OnigString.prototype, \"length\", {\n    get() {\n      return this.content.length;\n    },\n    // https://github.com/facebook/jest/issues/3552\n    configurable: true,\n  });\n\n  // exports.OnigScanner = OnigScanner\n  // exports.OnigRegExp = OnigRegExp\n  // exports.OnigString = OnigString\n  return { OnigScanner, OnigRegExp, OnigString };\n});\n/* eslint-enable */\n"
  },
  {
    "path": "lerna.json",
    "content": "{\n  \"version\": \"1.0.0\",\n  \"registry\": \"https://registry.npmjs.org/\",\n  \"npmClient\": \"yarn\",\n  \"useWorkspaces\": true,\n  \"command\": {\n    \"exec\": {\n      \"ignore\": [\"website\", \"@phenomic/example-*\"]\n    }\n  }\n}\n"
  },
  {
    "path": "logo/.gitignore",
    "content": "*@*x.png\n"
  },
  {
    "path": "netlify.toml",
    "content": "[build]\n  publish = \"website/dist\"\n  command = \"yarn website:build\"\n[build.environment]\n  NODE_VERSION = \"10\"\n  YARN_VERSION = \"1.16.0\"\n  YARN_FLAGS = \"--pure-lockfile\"\n"
  },
  {
    "path": "package.json",
    "content": "{\n  \"private\": true,\n  \"name\": \"@phenomic/core\",\n  \"repository\": \"https://github.com/phenomic/phenomic.git\",\n  \"homepage\": \"https://phenomic.io\",\n  \"license\": \"MIT\",\n  \"authors\": [\n    \"Maxime Thirouin (MoOx)\",\n    \"bloodyowl <bloodyowl@icloud.com>\"\n  ],\n  \"devDependencies\": {\n    \"@babel/cli\": \"^7.0.0\",\n    \"@babel/core\": \"^7.0.0\",\n    \"@babel/node\": \"^7.0.0\",\n    \"@babel/plugin-proposal-class-properties\": \"^7.0.0\",\n    \"@babel/plugin-proposal-object-rest-spread\": \"^7.0.0\",\n    \"@babel/plugin-transform-runtime\": \"^7.0.0\",\n    \"@babel/preset-env\": \"^7.0.0\",\n    \"@babel/preset-flow\": \"^7.0.0\",\n    \"@babel/preset-react\": \"^7.0.0\",\n    \"@babel/runtime\": \"^7.0.0\",\n    \"babel-core\": \"7.0.0-bridge.0\",\n    \"babel-eslint\": \"^10.0.0\",\n    \"babel-jest\": \"^23.6.0\",\n    \"bs-platform\": \"^5.0.4\",\n    \"chalk\": \"^1.1.3\",\n    \"cross-env\": \"^2.0.0\",\n    \"cross-spawn\": \"^5.1.0\",\n    \"eslint\": \"^5.7.0\",\n    \"eslint-config-i-am-meticulous\": \"^11.0.0\",\n    \"eslint-import-resolver-webpack\": \"^0.10.0\",\n    \"eslint-plugin-flowtype\": \"^3.0.0\",\n    \"eslint-plugin-react\": \"^7.11.0\",\n    \"eslint-plugin-react-native\": \"^3.5.0\",\n    \"flow-bin\": \"^0.87.0\",\n    \"git-exec-and-restage\": \"^1.0.1\",\n    \"globby\": \"^6.1.0\",\n    \"husky\": \"^0.13.3\",\n    \"jest\": \"^23.0.0\",\n    \"lerna\": \"^3.14.0\",\n    \"lint-staged\": \"^3.4.0\",\n    \"npm-run-all\": \"^3.0.0\",\n    \"prettier\": \"^1.8.0\",\n    \"replace\": \"^1.0.0\",\n    \"trash-cli\": \"^1.4.0\"\n  },\n  \"scripts\": {\n    \"#<git hooks>\": \"handled by husky\",\n    \"precommit\": \"lint-staged\",\n    \"#</git hooks>\": \"handled by husky\",\n    \"cleanup-node_modules\": \"trash node_modules packages/*/node_modules examples/*/node_modules website/node_modules\",\n    \"clean\": \"trash \\\"packages/*/lib\\\" \\\"{examples,packages,website}/*/src/*.bs.js\\\" && lerna exec --parallel -- bsb -clean-world\",\n    \"transpile\": \"yarn transpile:re && yarn transpile:js\",\n    \"transpile:js\": \"lerna exec -- babel --config-file ../../babel.config.js src --optional runtime --out-dir lib --ignore \\\\\\\"src/**/__tests__\\\\\\\"\",\n    \"transpile:re\": \"lerna exec -- bsb -make-world\",\n    \"posttranspile\": \"lerna run prepare\",\n    \"watch\": \"npm-run-all --parallel watch:*\",\n    \"watch:js\": \"lerna exec --parallel -- babel --config-file ../../babel.config.js -w src --optional runtime --out-dir lib --ignore \\\\\\\"src/**/__tests__\\\\\\\"\",\n    \"#watch:re-workaround\": \"https://github.com/lerna/lerna/issues/1745\",\n    \"watch:re-workaround\": \"replace '\\\\[\\\"ignore\\\",' '[\\\"inherit\\\",' ./node_modules/@lerna/child-process/index.js\",\n    \"watch:re\": \"lerna exec --parallel -- bsb -make-world -w\",\n    \"prepare\": \"yarn clean && yarn transpile && yarn watch:re-workaround\",\n    \"prerelease\": \"yarn prepare\",\n    \"release\": \"lerna publish\",\n    \"format\": \"yarn format:most && yarn format:re\",\n    \"format:most\": \"prettier --write \\\"**/*.{js,json,css,md}\\\"\",\n    \"format:re\": \"find . -name \\\"*.re\\\" | grep -v \\\"node_modules\\\" | xargs bsrefmt --in-place\",\n    \"links\": \"lerna exec -- yarn link\",\n    \"lint:eslint\": \"eslint --ignore-path .gitignore --fix packages examples website\",\n    \"lint:flow\": \"flow check\",\n    \"lint\": \"npm-run-all --parallel lint:*\",\n    \"tests\": \"jest --runInBand --coverage packages\",\n    \"examples:build\": \"babel-node scripts/examples.js\",\n    \"examples:tests\": \"jest --bail examples\",\n    \"examples\": \"yarn examples:build && yarn examples:tests\",\n    \"website:start\": \"cd website && yarn start\",\n    \"website:build\": \"cd website && yarn build\",\n    \"website:test\": \"cd website && yarn test && cd .. && jest website\",\n    \"test\": \"yarn lint && yarn tests\",\n    \"test-without-lint\": \"yarn tests\",\n    \"posttest\": \"yarn examples && yarn website:test\"\n  },\n  \"prettier\": {\n    \"trailingComma\": \"all\",\n    \"proseWrap\": \"always\"\n  },\n  \"lint-staged\": {\n    \"*.{js,json,css,md}\": [\n      \"git-exec-and-restage prettier --write\"\n    ]\n  },\n  \"eslintConfig\": {\n    \"extends\": [\n      \"eslint-config-i-am-meticulous/react-flow\",\n      \"eslint-config-i-am-meticulous/react-native\"\n    ],\n    \"env\": {\n      \"jest\": true\n    },\n    \"rules\": {\n      \"import/no-namespace\": 0,\n      \"import/max-dependencies\": [\n        2,\n        {\n          \"max\": 20\n        }\n      ],\n      \"react/sort-comp\": 0\n    },\n    \"settings\": {\n      \"import/resolver\": {\n        \"webpack\": {\n          \"config\": {\n            \"resolve\": {\n              \"extensions\": [\n                \".web.js\",\n                \".js\",\n                \".json\"\n              ]\n            }\n          }\n        }\n      }\n    }\n  },\n  \"jest\": {\n    \"transform\": {\n      \"^.+\\\\.js$\": \"./babel-jest.upward.js\"\n    },\n    \"setupFiles\": [\n      \"./jest-setup.js\"\n    ],\n    \"testURL\": \"http://url.tld/path\",\n    \"coveragePathIgnorePatterns\": [\n      \"/node_modules/\",\n      \"jest-setup.js\"\n    ],\n    \"testPathIgnorePatterns\": [\n      \"/_output/\",\n      \"/__fixtures__\"\n    ],\n    \"modulePathIgnorePatterns\": [\n      \"/dist/\"\n    ]\n  },\n  \"workspaces\": [\n    \"website\",\n    \"examples/*\",\n    \"packages/*\"\n  ]\n}\n"
  },
  {
    "path": "packages/api-client/README.md",
    "content": "# @phenomic/api-client\n\n> Phenomic API client that allow you to make queries to retrieve resources\n\n➡ More details at [phenomic.io](https://phenomic.io/)\n"
  },
  {
    "path": "packages/api-client/bsconfig.json",
    "content": "{\n  \"name\": \"@phenomic/api-client\",\n  \"refmt\": 3,\n  \"reason\": {\n    \"react-jsx\": 3\n  },\n  \"sources\": [\n    {\n      \"dir\": \"src\",\n      \"subdirs\": true\n    }\n  ],\n  \"suffix\": \".bs.js\",\n  \"package-specs\": {\n    \"module\": \"commonjs\",\n    \"in-source\": true\n  }\n}\n"
  },
  {
    "path": "packages/api-client/docs/README.md",
    "content": "---\ntitle: Phenomic content API client\n---\n\nThis module helps to call the content API.\n\nTwo modules are exported: `query` and `url`.\n\n**Keep in mind that you will probably only use `query` via a plugin (eg: react)\nand not even have to use `url` method yourself.**\n\n## `query`\n\nThis module helps to normalize and validate a query. It takes an object as\nargument and there is 2 ways to use it.\n\n### Get a single item\n\nAs soon as you pass an `id` key in the argument, query is assumed to be a single\nitem query. The only other option accepted will be `path`.\n\n```js\nimport { query } from \"@phenomic/api-client\";\n// note that some plugin/preset re-export it directly, for convenience\n\n// ...\n\nconst id = \"some-id\"; // might be assumed from url\nconst pageQuery = query({\n  path: \"content/pages\", // allow to query a folder\n  id,\n});\n```\n\n### Get multiple items\n\nUnless you make a single item query (= no `id`), you will make a multiple items\nquery.\n\nQueries accept multiple options:\n\n- `path` (optional): folder you want to look in,\n- `by` (optional): allow you to filter by a given key. Can be a metadata from\n  your content (eg: `tags` from front-matter markdown files, `license` of some\n  package.json etc).\n- `value` (optional): make sense if you use `by` option. Allows you to filter a\n  given value (eg: `{ by: 'tags', value: 'javascript' }`).\n- `order` (optional): `\"asc\"` or `\"desc\"` (default to desc),\n- `limit` (optional): allows to limit number of results for a query,\n- `sort` (optional): allows to sort results on a metadata key, or via a\n  [custom function name](https://phenomic.io/en/packages/core/docs/configuration/#dbsortfunctions),\n- `after` (optional): allows to paginate result. This parameter is a hash that\n  is pointing to specific place in the list for the given path. By not being a\n  simple page number, this allows you to make immutable pagination. Renderer\n  plugins should handle this argument perfectly and will generate all possible\n  pages at any starting point (200 results without pagination will give you 200\n  pages possibles, even if you will use less, according to your `limit`).\n\nThis query will get a list of 6 posts, after a given entry (= paginated query)\n\n```js\nconst after = \"/* read from the url, it's a base64 hash */\";\nconst postsQuery = query({\n  path: \"content/posts\",\n  limit: 6,\n  after, // if undefined, will read return the 6 first posts\n});\n```\n\nThis query will get a list of 6 posts, filtered by tags with the value\n`javascript`, after a given entry (= paginated query)\n\n```js\nconst after = \"/* read from the url, it's a base64 hash */\";\nconst postsQuery = query({\n  path: \"content/posts\",\n  limit: 6,\n  by: \"tags\",\n  value: \"javascript\",\n  after, // if undefined, will read return the 6 first posts\n});\n```\n\n## `url`\n\nThis module helps to transform the queries to url. It takes a query and return a\nstring. Usually used by plugin methods that will handle the query for you.\n"
  },
  {
    "path": "packages/api-client/package.json",
    "content": "{\n  \"name\": \"@phenomic/api-client\",\n  \"version\": \"1.0.0\",\n  \"publishConfig\": {\n    \"access\": \"public\"\n  },\n  \"repository\": \"https://github.com/phenomic/phenomic.git\",\n  \"homepage\": \"https://phenomic.io\",\n  \"license\": \"MIT\",\n  \"authors\": [\n    \"Maxime Thirouin (MoOx)\",\n    \"bloodyowl <bloodyowl@icloud.com>\"\n  ],\n  \"keywords\": [\n    \"phenomic\",\n    \"phenomic-package\"\n  ],\n  \"description\": \"Phenomic Content API client that allow you to make queries to retrieve resources\",\n  \"main\": \"lib/index.js\",\n  \"files\": [\n    \"lib\",\n    \"src\",\n    \"!**/__tests__\",\n    \"bsconfig.json\"\n  ],\n  \"dependencies\": {\n    \"cross-fetch\": \"^2.2.3\",\n    \"debug\": \"^2.6.0\",\n    \"simple-json-fetch\": \"^1.0.1\"\n  }\n}\n"
  },
  {
    "path": "packages/api-client/src/__tests__/__snapshots__/url-test.js.snap",
    "content": "// Jest Snapshot v1, https://goo.gl/fbAQLP\n\nexports[`should build url for items by date 1`] = `\"/posts/by-date/1/desc/date.json\"`;\n\nexports[`should build url for single item 1`] = `\"/posts/item/test.json\"`;\n\nexports[`should build url for specific tag 1`] = `\"/posts/by-tag/test/desc/date.json\"`;\n\nexports[`should build url for specific tag 2`] = `\"/posts/by-tag/test/asc/date.json\"`;\n\nexports[`should build url for specific tag 3`] = `\"/posts/by-tag/test/asc/date/limit-10.json\"`;\n\nexports[`should build url for specific tag 4`] = `\"/posts/by-tag/test/asc/date/limit-10/after-BASE64.json\"`;\n\nexports[`should build url for specific tag 5`] = `\"local/posts/by-tag/test/asc/date/limit-10/after-BASE64.json\"`;\n"
  },
  {
    "path": "packages/api-client/src/__tests__/url-test.js",
    "content": "// @flow\n\nimport url from \"../url\";\n\nit(\"should build url for single item\", () => {\n  expect(\n    url({\n      path: \"posts\",\n      id: \"test\",\n    }),\n  ).toMatchSnapshot();\n});\n\nit(\"should build url for items by date\", () => {\n  expect(\n    url({\n      path: \"posts\",\n      by: \"date\",\n    }),\n  ).toMatchSnapshot();\n});\n\nit(\"should build url for specific tag\", () => {\n  expect(\n    url({\n      path: \"posts\",\n      by: \"tag\",\n      value: \"test\",\n    }),\n  ).toMatchSnapshot();\n\n  expect(\n    url({\n      path: \"posts\",\n      by: \"tag\",\n      value: \"test\",\n      order: \"asc\",\n    }),\n  ).toMatchSnapshot();\n\n  expect(\n    url({\n      path: \"posts\",\n      by: \"tag\",\n      value: \"test\",\n      order: \"asc\",\n      limit: 10,\n    }),\n  ).toMatchSnapshot();\n\n  expect(\n    url({\n      path: \"posts\",\n      by: \"tag\",\n      value: \"test\",\n      order: \"asc\",\n      limit: 10,\n      after: \"BASE64\",\n    }),\n  ).toMatchSnapshot();\n\n  expect(\n    url({\n      root: \"local\",\n      path: \"posts\",\n      by: \"tag\",\n      value: \"test\",\n      order: \"asc\",\n      limit: 10,\n      after: \"BASE64\",\n    }),\n  ).toMatchSnapshot();\n});\n"
  },
  {
    "path": "packages/api-client/src/fetch.js",
    "content": "// @flow\n\nimport \"cross-fetch/polyfill\";\nimport jsonFetch from \"simple-json-fetch\";\n\nimport createURL from \"./url\";\n\nexport default (config: PhenomicQueryConfig) => {\n  return jsonFetch(\n    createURL({\n      ...config,\n      // @todo find a way to avoid bundling the line with localhost in production\n      root:\n        (typeof window === \"undefined\"\n          ? // $FlowFixMe yeah yeah\n            `http://localhost:${process.env.PHENOMIC_RESTAPI_PORT}`\n          : ``) + `${process.env.PHENOMIC_APP_BASENAME || \"/\"}phenomic`,\n    }),\n  ).then(res => res.json);\n};\n"
  },
  {
    "path": "packages/api-client/src/index.js",
    "content": "// @flow\n\nimport query from \"./query\";\nimport url from \"./url\";\n\nexport { query, url };\n"
  },
  {
    "path": "packages/api-client/src/phenomicApiClient.re",
    "content": "[@bs.module \"@phenomic/api-client/lib/query\"]\nexternal internalQuery: Js.t({..}) => Js.t({..}) = \"query\";\n\ntype queryConfigItem = {\n  path: string,\n  id: string,\n};\n\ntype listConfig = {\n  path: string,\n  by: option(string),\n  value: option(string),\n  order: option(string),\n  sort: option(string),\n  limit: option(int),\n};\n\ntype paginatedListConfig = {\n  path: string,\n  by: option(string),\n  value: option(string),\n  order: option(string),\n  sort: option(string),\n  limit: option(int),\n  after: option(string),\n};\n\ntype queryConfig =\n  | Item(queryConfigItem)\n  | List(listConfig)\n  | PaginatedList(paginatedListConfig);\n\nlet query = queryConfig =>\n  switch (queryConfig) {\n  | Item(queryConfigItem) => {\n      \"path\": queryConfigItem.path,\n      \"id\": Js.Nullable.return(queryConfigItem.id),\n      \"by\": Js.Nullable.undefined,\n      \"value\": Js.Nullable.undefined,\n      \"order\": Js.Nullable.undefined,\n      \"sort\": Js.Nullable.undefined,\n      \"limit\": Js.Nullable.undefined,\n      \"after\": Js.Nullable.undefined,\n    }\n  | List(queryConfigList) => {\n      \"path\": queryConfigList.path,\n      \"id\": Js.Nullable.undefined,\n      \"by\": Js.Nullable.fromOption(queryConfigList.by),\n      \"value\": Js.Nullable.fromOption(queryConfigList.value),\n      \"order\": Js.Nullable.fromOption(queryConfigList.order),\n      \"sort\": Js.Nullable.fromOption(queryConfigList.sort),\n      \"limit\": Js.Nullable.fromOption(queryConfigList.limit),\n      \"after\": Js.Nullable.undefined,\n    }\n  | PaginatedList(queryConfigPaginatedList) => {\n      \"path\": queryConfigPaginatedList.path,\n      \"id\": Js.Nullable.undefined,\n      \"by\": Js.Nullable.fromOption(queryConfigPaginatedList.by),\n      \"value\": Js.Nullable.fromOption(queryConfigPaginatedList.value),\n      \"order\": Js.Nullable.fromOption(queryConfigPaginatedList.order),\n      \"sort\": Js.Nullable.fromOption(queryConfigPaginatedList.sort),\n      \"limit\": Js.Nullable.fromOption(queryConfigPaginatedList.limit),\n      \"after\": Js.Nullable.fromOption(queryConfigPaginatedList.after),\n    }\n  };\n"
  },
  {
    "path": "packages/api-client/src/query.js",
    "content": "// @flow\n\nconst debug = require(\"debug\")(\"phenomic:api-client\");\n\nfunction removeUndefined<T: {}>(obj: T): T {\n  const newObj = {};\n  // $FlowFixMe stfu\n  Object.keys(obj).forEach(key => {\n    if (typeof obj[key] !== undefined) {\n      newObj[key] = obj[key];\n    }\n  });\n  // $FlowFixMe stfu\n  return newObj;\n}\n\nfunction query(config: PhenomicQueryConfig): PhenomicQueryConfig {\n  debug(\"query\", config);\n\n  // note that during static build, we initiate the query with no id\n  if (config.id !== undefined) {\n    return {\n      path: config.path,\n      id: config.id,\n    };\n  }\n\n  return removeUndefined({\n    path: config.path,\n    by: config.by || \"default\",\n    value: config.by && config.value ? config.value : \"1\",\n    order: config.order ? config.order : \"desc\",\n    limit: config.limit ? parseInt(config.limit, 10) : undefined,\n    sort: config.sort || \"date\",\n    after: config.after,\n  });\n}\n\nexport default query;\n"
  },
  {
    "path": "packages/api-client/src/url.js",
    "content": "// @flow\n\nfunction postfix(url) {\n  return `${url}.json`;\n}\n\nconst protect = encodeURIComponent;\nconst urlify = (pieces: $ReadOnlyArray<?string>): string =>\n  pieces.filter(piece => typeof piece !== \"undefined\").join(\"/\");\n\nfunction url(config: Object): string {\n  const root = config.root || \"\";\n  if (typeof config === \"string\") {\n    return urlify([root, config]);\n  }\n  if (typeof config.id === \"string\") {\n    return postfix(\n      urlify([\n        root,\n        config.path ? protect(config.path) : undefined,\n        \"item\",\n        config.id,\n      ]),\n    );\n  }\n  return postfix(\n    urlify([\n      root,\n      config.path ? protect(config.path) : undefined,\n      `by-${protect(config.by)}`,\n      protect(config.value || \"1\"),\n      protect(config.order || \"desc\"),\n      protect(config.sort || \"date\"),\n      ...(config.limit ? [`limit-${protect(config.limit)}`] : []),\n      ...(config.limit && config.after\n        ? [`after-${protect(config.after)}`]\n        : []),\n    ]),\n  );\n}\n\nexport default url;\n"
  },
  {
    "path": "packages/babel-preset/README.md",
    "content": "# @phenomic/babel-preset\n\n> Babel preset, recommended for Phenomic\n\nBasically\n[babel-preset-react-app](https://github.com/facebookincubator/create-react-app/tree/master/packages/babel-preset-react-app)\nfor now\n\n➡ More details at [phenomic.io](https://phenomic.io/)\n"
  },
  {
    "path": "packages/babel-preset/bsconfig.json",
    "content": "{\n  \"name\": \"@phenomic/babel-preset\",\n  \"refmt\": 3,\n  \"reason\": {\n    \"react-jsx\": 3\n  },\n  \"sources\": [\n    {\n      \"dir\": \"src\",\n      \"subdirs\": true\n    }\n  ],\n  \"suffix\": \".bs.js\",\n  \"package-specs\": {\n    \"module\": \"commonjs\",\n    \"in-source\": true\n  }\n}\n"
  },
  {
    "path": "packages/babel-preset/package.json",
    "content": "{\n  \"name\": \"@phenomic/babel-preset\",\n  \"version\": \"1.0.0\",\n  \"publishConfig\": {\n    \"access\": \"public\"\n  },\n  \"repository\": \"https://github.com/phenomic/phenomic.git\",\n  \"homepage\": \"https://phenomic.io\",\n  \"license\": \"MIT\",\n  \"authors\": [\n    \"Maxime Thirouin (MoOx)\",\n    \"bloodyowl <bloodyowl@icloud.com>\"\n  ],\n  \"keywords\": [\n    \"phenomic\"\n  ],\n  \"description\": \"Babel preset, recommended for Phenomic\",\n  \"main\": \"lib/index.js\",\n  \"files\": [\n    \"lib\",\n    \"src\",\n    \"!**/__tests__\"\n  ],\n  \"dependencies\": {\n    \"@babel/plugin-proposal-class-properties\": \"^7.0.0\",\n    \"@babel/plugin-proposal-object-rest-spread\": \"^7.0.0\",\n    \"@babel/plugin-syntax-dynamic-import\": \"^7.0.0\",\n    \"@babel/plugin-transform-runtime\": \"^7.0.0\",\n    \"@babel/preset-env\": \"^7.0.0\",\n    \"@babel/preset-flow\": \"^7.0.0\",\n    \"@babel/preset-react\": \"^7.0.0\",\n    \"@babel/runtime\": \"^7.0.0\",\n    \"babel-plugin-dynamic-import-node\": \"^2.2.0\",\n    \"babel-plugin-transform-react-remove-prop-types\": \"^0.4.21\"\n  }\n}\n"
  },
  {
    "path": "packages/babel-preset/src/index.js",
    "content": "// @flow\n\n// most of this has been inspired by\n// https://github.com/facebook/create-react-app/tree/master/packages/babel-preset-react-app\n\nmodule.exports = () => ({\n  presets: [\n    [\n      require(\"@babel/preset-env\"),\n      {\n        ...(process.env.PHENOMIC_ENV === \"static\"\n          ? {\n              targets: {\n                node: \"current\",\n              },\n            }\n          : {\n              // Do not transform modules to CJS since bundler like webpack handle it\n              modules: false,\n            }),\n        // If users import all core-js they're probably not concerned with\n        // bundle size. We shouldn't rely on magic to try and shrink it.\n        useBuiltIns: false,\n        // Exclude transforms that make all code slower\n        exclude: [\"transform-typeof-symbol\"],\n      },\n    ],\n    [\n      require(\"@babel/preset-react\"),\n      {\n        // Adds component stack to warning messages\n        // Adds __self attribute to JSX which React will use for some warnings\n        development: process.env.PHENOMIC_ENV !== \"static\",\n        // Will use the native built-in instead of trying to polyfill\n        // behavior for any plugins that require one.\n        useBuiltIns: true,\n      },\n    ],\n    require(\"@babel/preset-flow\"),\n  ],\n  plugins: [\n    // Enable loose mode to use assignment instead of defineProperty\n    // See discussion in https://github.com/facebook/create-react-app/issues/4263\n    [\n      require(\"@babel/plugin-proposal-class-properties\"),\n      {\n        loose: true,\n      },\n    ],\n    // The following two plugins use Object.assign directly, instead of Babel's\n    // extends helper. Note that this assumes `Object.assign` is available.\n    // { ...todo, completed: true }\n    [\n      require(\"@babel/plugin-proposal-object-rest-spread\"),\n      {\n        useBuiltIns: true,\n      },\n    ],\n    // Polyfills the runtime needed for async/await, generators, and friends\n    // https://babeljs.io/docs/en/babel-plugin-transform-runtime\n    [\n      require(\"@babel/plugin-transform-runtime\"),\n      {\n        corejs: false,\n        helpers: false,\n        regenerator: true,\n        useESModules: process.env.PHENOMIC_ENV === \"static\",\n      },\n    ],\n    ...(process.env.NODE_ENV === \"production\"\n      ? [\n          [\n            // Remove PropTypes from production build\n            require(\"babel-plugin-transform-react-remove-prop-types\"),\n            {\n              removeImport: true,\n            },\n          ],\n        ]\n      : []),\n    // Adds syntax support for import()\n    require(\"@babel/plugin-syntax-dynamic-import\"),\n    // Transform dynamic import to require\n    ...(process.env.PHENOMIC_ENV === \"static\"\n      ? [require(\"babel-plugin-dynamic-import-node\")]\n      : []),\n  ],\n});\n"
  },
  {
    "path": "packages/bs-platform/README.md",
    "content": "# @phenomic/bs-platform\n\n> lib to avoid entire bs-platform for all packages\n\n➡ More details at [phenomic.io](https://phenomic.io/)\n"
  },
  {
    "path": "packages/bs-platform/bsconfig.json",
    "content": "{\n  \"name\": \"@phenomic/bs-platform\",\n  \"refmt\": 3,\n  \"reason\": {\n    \"react-jsx\": 3\n  },\n  \"sources\": [],\n  \"suffix\": \".bs.js\",\n  \"package-specs\": {\n    \"module\": \"commonjs\",\n    \"in-source\": true\n  }\n}\n"
  },
  {
    "path": "packages/bs-platform/package.json",
    "content": "{\n  \"name\": \"@phenomic/bs-platform\",\n  \"version\": \"1.0.0\",\n  \"publishConfig\": {\n    \"access\": \"public\"\n  },\n  \"repository\": \"https://github.com/phenomic/phenomic.git\",\n  \"homepage\": \"https://phenomic.io\",\n  \"license\": \"MIT\",\n  \"authors\": [\n    \"Maxime Thirouin (MoOx)\"\n  ],\n  \"description\": \"bs-platform/lib files for phenomic\",\n  \"files\": [\n    \"lib/**/*.js\"\n  ],\n  \"devDependencies\": {\n    \"bs-platform\": \"^5.0.4\",\n    \"cpy-cli\": \"^2.0.0\",\n    \"replace\": \"^1.0.0\"\n  },\n  \"scripts\": {\n    \"prepare\": \"cpy \\\"../../node_modules/bs-platform/lib/js/*.js\\\" lib/js && cpy \\\"../../node_modules/bs-platform/lib/es6/*.js\\\" lib/es6\"\n  }\n}\n"
  },
  {
    "path": "packages/bs-platform/src/.gitkeep-because-i-am-too-lazy-too-make-lerna-commands-smarter",
    "content": ""
  },
  {
    "path": "packages/bs-platform/tweak",
    "content": "#!/usr/bin/env bash\n\n# sed is not cross platform...\n#sed -i '' -e 's/require(\"bs-platform\\/lib/require(\"@phenomic\\/bs-platform\\/lib/g' $1\n../../../bs-platform/node_modules/.bin/replace 'require\\(\"bs-platform\\/lib' 'require(\"@phenomic/bs-platform/lib' \"$1\""
  },
  {
    "path": "packages/cli/README.md",
    "content": "# @phenomic/cli\n\n> Phenomic CLI\n\n➡ More details at [phenomic.io](https://phenomic.io/)\n"
  },
  {
    "path": "packages/cli/bsconfig.json",
    "content": "{\n  \"name\": \"@phenomic/cli\",\n  \"refmt\": 3,\n  \"reason\": {\n    \"react-jsx\": 3\n  },\n  \"sources\": [\n    {\n      \"dir\": \"src\",\n      \"subdirs\": true\n    }\n  ],\n  \"suffix\": \".bs.js\",\n  \"package-specs\": {\n    \"module\": \"commonjs\",\n    \"in-source\": true\n  }\n}\n"
  },
  {
    "path": "packages/cli/docs/README.md",
    "content": "---\ntitle: Phenomic CLI\n---\n\nA simple CLI wrapper around\n[built-in commands](https://phenomic.io/en/packages/core/docs/cli/).\n"
  },
  {
    "path": "packages/cli/index.js",
    "content": "#!/usr/bin/env node\n\n// @flow\n\n// require by babel-preset-react-app\n// This is used like this since babel transformed file don't finish\n// on the client\n// webpack (or similar) handle their own env.\n// anyway it's redifined a bit later by start/build commands\nprocess.env.BABEL_ENV = \"development\";\n\n// this babel register is mainly so you can have a webpack config file in es6\n// without a .babel extension\nrequire(\"@babel/register\")({\n  presets: [\n    // used to allow react/flow in Html.js for plugin react\n    // @todo: consider moving babel-register in this plugin for this file only?\n    require.resolve(\"@babel/preset-flow\"),\n    require.resolve(\"@babel/preset-react\"),\n    // used to allow import/export\n    // see https://github.com/phenomic/phenomic/issues/1170\n    [\n      require.resolve(\"@babel/preset-env\"),\n      {\n        targets: {\n          node: \"current\",\n        },\n      },\n    ],\n  ],\n  plugins: [\n    require.resolve(\"@babel/plugin-proposal-class-properties\"),\n    require.resolve(\"@babel/plugin-proposal-object-rest-spread\"),\n  ],\n  sourceMap: \"inline\",\n});\n\n// $FlowFixMe lib/* are ignored\nrequire(\"./lib/bin.js\");\n"
  },
  {
    "path": "packages/cli/package.json",
    "content": "{\n  \"name\": \"@phenomic/cli\",\n  \"version\": \"1.0.0\",\n  \"publishConfig\": {\n    \"access\": \"public\"\n  },\n  \"repository\": \"https://github.com/phenomic/phenomic.git\",\n  \"homepage\": \"https://phenomic.io\",\n  \"license\": \"MIT\",\n  \"authors\": [\n    \"Maxime Thirouin (MoOx)\",\n    \"bloodyowl <bloodyowl@icloud.com>\"\n  ],\n  \"keywords\": [\n    \"phenomic\",\n    \"phenomic-package\"\n  ],\n  \"description\": \"Phenomic CLI\",\n  \"bin\": {\n    \"phenomic\": \"index.js\"\n  },\n  \"files\": [\n    \"index.js\",\n    \"lib\"\n  ],\n  \"dependencies\": {\n    \"@babel/plugin-proposal-class-properties\": \"^7.0.0\",\n    \"@babel/plugin-proposal-object-rest-spread\": \"^7.0.0\",\n    \"@babel/preset-env\": \"^7.0.0\",\n    \"@babel/preset-flow\": \"^7.0.0\",\n    \"@babel/preset-react\": \"^7.0.0\",\n    \"@babel/register\": \"^7.0.0\",\n    \"@phenomic/core\": \"^1.0.0\",\n    \"chalk\": \"^1.1.3\",\n    \"debug\": \"^2.6.0\",\n    \"semver\": \"^5.3.0\",\n    \"yargs\": \"^7.0.2\"\n  },\n  \"peerDependencies\": {\n    \"@babel/core\": \"^7.0.0\",\n    \"@phenomic/core\": \"^1.0.0-beta.3\"\n  },\n  \"devDependencies\": {\n    \"@phenomic/core\": \"^1.0.0-beta.3\"\n  }\n}\n"
  },
  {
    "path": "packages/cli/src/__tests__/check-engine.js",
    "content": "// @flow\n\n// module.exports is used\n// eslint-disable-next-line import/default\nimport checkEngine from \"../check-engine\";\n\ntest(\"should not throw when sastifies\", () => {\n  expect(() => checkEngine(\"6.0.0\", \"3.0.0\", false)).not.toThrow();\n\n  expect(() => checkEngine(\"6.0.0\", \"2.0.0\", \"1.0.1\")).not.toThrow();\n});\n\ntest(\"should throw when node version doesn't sastify\", () => {\n  expect(() => checkEngine(\"3.0.0\", \"2.0.0\", false)).toThrow(\n    /node version is 3.0.0/,\n  );\n});\n\ntest(\"should throw when npm version doesn't sastify\", () => {\n  expect(() => checkEngine(\"4.2.0\", \"2.0.0\", false)).toThrow(\n    /npm version is 2.0.0/,\n  );\n});\n\ntest(\"should throw when both node and npm version doesn't sastify\", () => {\n  expect(() => checkEngine(\"3.0.0\", \"2.0.0\", false)).toThrow(\n    /node version is 3.0.0 (.*) npm version is 2.0.0/,\n  );\n});\n\ntest(\"should throw when npm or yarn version doesn't sastify\", () => {\n  expect(() => checkEngine(\"6.0.0\", \"2.0.0\", \"0.15.0\")).toThrow();\n});\n"
  },
  {
    "path": "packages/cli/src/bin.js",
    "content": "// @flow\n\nimport checkEngine from \"./check-engine.js\";\nimport commands from \"./commands.js\";\n\ncheckEngine();\ncommands();\n"
  },
  {
    "path": "packages/cli/src/check-engine.js",
    "content": "// @flow\n\nimport { execSync } from \"child_process\";\n\nimport semver from \"semver\";\nimport colors from \"chalk\";\nimport pkg from \"@phenomic/core/package.json\";\n\nconst platformSuffix = process.platform === \"win32\" ? \".cmd\" : \"\";\nconst npm = \"npm\" + platformSuffix;\nconst yarn = \"yarn\" + platformSuffix;\n\nexport default function checkVersion(\n  nodeVersion?: string,\n  npmVersion?: string,\n  yarnVersion?: string | boolean,\n) {\n  const requirements = pkg.engines;\n  nodeVersion = nodeVersion || process.version;\n  npmVersion =\n    npmVersion ||\n    execSync(npm + \" --version\")\n      .toString()\n      .trim();\n  try {\n    yarnVersion =\n      yarnVersion !== undefined\n        ? yarnVersion\n        : execSync(yarn + \" --version\")\n            .toString()\n            .trim();\n  } catch (e) {\n    // nothing, assuming yarn does not exist\n    yarnVersion = false;\n  }\n\n  if (\n    !(\n      semver.satisfies(nodeVersion, requirements.node) &&\n      (semver.satisfies(npmVersion, requirements.npm) ||\n        (typeof yarnVersion === \"string\" &&\n          semver.satisfies(yarnVersion, requirements.yarn)))\n    )\n  ) {\n    const errorMessage = colors.yellow(\n      \"\\n⚠️ \" +\n        \"Phenomic requires at least \" +\n        \"node@\" +\n        requirements.node +\n        \" and \" +\n        \"npm@\" +\n        requirements.npm +\n        \" (or yarn@\" +\n        requirements.yarn +\n        \")\" +\n        \"\\n\\n\" +\n        \"Your node version is \" +\n        nodeVersion +\n        (yarnVersion ? \", \" : \" and \") +\n        \"your npm version is \" +\n        npmVersion +\n        (typeof yarnVersion !== \"string\"\n          ? \"\"\n          : \" and \" + \"your yarn version is \" + yarnVersion) +\n        \"\\n\\n\" +\n        colors.yellow(\"See 'Setup' instruction in documentation.\") +\n        \" \" +\n        \"https://phenomic.io/docs/setup/\",\n    );\n    if (process.env.NODE_ENV === \"test\") {\n      throw new Error(errorMessage);\n    }\n    console.error(errorMessage);\n    process.exit(1);\n  }\n}\n"
  },
  {
    "path": "packages/cli/src/commands.js",
    "content": "// @flow\n\nimport yargs from \"yargs\";\n// @todo remove that and use project config\nimport phenomic from \"@phenomic/core\";\n\nyargs.command(\n  \"start\",\n  \"start your project (server / development mode)\",\n  {},\n  () => phenomic.start(),\n);\n\nyargs.command(\n  \"build\",\n  \"build your project (static / production mode)\",\n  {},\n  () => phenomic.build(),\n);\n\nyargs.command(\n  \"preview\",\n  \"build & serve your project (static / production mode)\",\n  {},\n  () => phenomic.preview(),\n);\n\nexport default () => {\n  yargs.parse(process.argv);\n};\n"
  },
  {
    "path": "packages/core/README.md",
    "content": "# @phenomic/core\n\n> Phenomic core package\n\n➡ More details at [phenomic.io](https://phenomic.io/)\n"
  },
  {
    "path": "packages/core/bsconfig.json",
    "content": "{\n  \"name\": \"@phenomic/core\",\n  \"refmt\": 3,\n  \"reason\": {\n    \"react-jsx\": 3\n  },\n  \"sources\": [\n    {\n      \"dir\": \"src\",\n      \"subdirs\": true\n    }\n  ],\n  \"suffix\": \".bs.js\",\n  \"package-specs\": {\n    \"module\": \"commonjs\",\n    \"in-source\": true\n  },\n  \"js-post-build\": {\n    \"cmd\": \"./../bs-platform/tweak\"\n  }\n}\n"
  },
  {
    "path": "packages/core/docs/README.md",
    "content": "---\ntitle: Introduction\npriority: 1\n---\n\nPhenomic is a modular website compiler that helps you build static websites\noptimised for SEO and UX with a modern approach: you can **build your website\nthe same way you build an app**.\n\nPhenomic differs from other SSGs by allowing you to pick the technologies,\nlibraries, and frameworks of your choice and build your website with them. You\ncan decide which renderer you want to use (such as _React_), which bundler (such\nas _Webpack_) and so on. If the solution you want is not implemented yet,\n**Phenomic accepts plugins** so you can bring your own flavor!\n\nWhat Phenomic produces is simple: **static files** that you can deploy on any\nstatic hosting system (HTML, CSS, JavaScript, images etc). This means the server\nwhere you deploy your website doesn't require a runtime. The result served will\nbe **an SEO friendly website** (all pages are pre-built and can be served as\nHTML files) that is **optimised for fast browsing** (after the first HTML page,\nJavaScript files will handle client side navigation and only download what is\nnecessary without full page reloads).\n\nYou can thus offer the **best user experience** by immediately serving\npre-generated HTML for first visits (or all pages, for search engine bots and\nbrowsers that don't interpret JavaScript) and then using the power of JavaScript\nto **avoid full page reloads** by only downloading small chunks of data for each\nadditional page & interaction.\n"
  },
  {
    "path": "packages/core/docs/api.md",
    "content": "---\npriority: 5\ntitle: Content API\nsubtitle: \"What it is, when to use it\"\n---\n\nPhenomic content API is optional. It only make sense if you use files as your\ncontent input (eg: markdown). As soon as you use it, JSON files will be created\nduring static rendering. This static JSON files will be used client side\nnavigation instead of HTML files after the first page viewed.\n\nThe optional content API offers additional steps during the process:\n\n- Content files are read from the filesystem (+ watched for change during\n  development)\n- Those files are transformed as data\\*\n- The data resulting from the transformation is injected into Phenomic database\n  and later accessible via the content API\n\nTo access those data, you will use the\n[api-client](https://phenomic.io/en/packages/api-client/docs/) but probably not\ndirectly via this module. Renderer plugins might expose wrapper around the\n`query` utility (eg:\n[`withPhenomicApi` higher order component for react plugin](https://phenomic.io/en/packages/plugin-renderer-react/docs/)).\n"
  },
  {
    "path": "packages/core/docs/cli.md",
    "content": "---\npriority: 3\ntitle: CLI commands\nsubtitle: \"Detail about individual commands\"\n---\n\n## CLI installation\n\n⚠️ _We recommend you **not** to install Phenomic CLI as a global package on your\nOS._\n\nAs shown in [tutorials](https://phenomic.io/en/tutorials), we recommend you to\ninstall this package locally to your project and use aliases in your\n`package.json`.\n\n```json\n{\n  \"...\": \"...\",\n  \"devDependencies\": {\n    \"@phenomic/cli\": \"^1.0.0-beta.2\",\n    \"@phenomic/core\": \"^1.0.0-beta.2\",\n    \"@phenomic/...\": \"...\"\n  },\n  \"scripts\": {\n    \"start\": \"phenomic start\",\n    \"build\": \"phenomic build\",\n    \"preview\": \"phenomic preview\"\n  }\n}\n```\n\n## CLI commands\n\n### `start`\n\nThis command starts the development server. It will show you the address you\nshould use to see your website and will show you additional informations like\nbundler status, content api messages etc.\n\n### `build`\n\nThis command starts the static build process and will render all possibles urls\n(according to your routes and queries) in your\n[`outdir`](./configuration.md#configuration-source) folder.\n\n### `preview`\n\nThis command starts the static build process (exactly like `build` command) and\nalso directly serve the result. Address will be displayed to you. This is handy\nto have a preview of what the result will looks like on your static server as\nyou may sometimes encounter minor differences between development server and\nstatic build.\n"
  },
  {
    "path": "packages/core/docs/configuration.md",
    "content": "---\npriority: 3\ntitle: Configuration\nsubtitle: How to configure Phenomic\n---\n\nPhenomic needs a configuration in order to start. The minimum to give is what\nplugins or presets you need. A minimal example configuration could be like this\n\n```json\n{\n  \"presets\": [\"@phenomic/preset-react-app\"]\n}\n```\n\n## Configuration source\n\nWe use [cosmiconfig](https://github.com/davidtheclark/cosmiconfig) to load the\nconfiguration, so it's up to you to use the format and file you want. Here are\nsome example with the previous configuration\n\n### `package.json`\n\n```json\n{\n  \"...\": \"...\",\n  \"phenomic\": {\n    \"presets\": [\"@phenomic/preset-react-app\"]\n  }\n}\n```\n\n### `.phenomicrc(.json)`\n\n```json\n{\n  \"presets\": [\"@phenomic/preset-react-app\"]\n}\n```\n\nNote that yaml is also supported in .rc files.\n\n### `phenomic.config.js`\n\n```js\nmodule.exports = {\n  presets: [\"@phenomic/preset-react-app\"],\n};\n```\n\nNote that we recommend you to start with `package.json` for simplicity and avoid\nthe .rc hell, but that's up to you. Some advanced options accept JavaScript, so\nin some case, you might end up with a `phenomic.config.js`.\n\n## Options\n\nTo make this simple, here is a gigantic commented configuration. Everything is\noptional except having at least a few `plugins` or a `preset`\n\n### `baseUrl`\n\n_(default: none)_\n\nRoot of your website. This is especially handy if your website is not at a root\ndomain In this case, development will reflect the base path. Example:\n\n```js\n{\n  // here development will start on http://localhost:3333/your/website\n  baseUrl: \"http://root.of/your/website\";\n}\n```\n\n### `path`\n\n_(default: `process.cwd()`)_\n\nRoot of the project. Used as root for other options like `outdir`.\n\n### `content`\n\n_(default: `{ content: [\"**/*\"] }`)_\n\nObject that define the content to read from the filesystem that will be injected\nin content api. Key is used as the root for future queries.\n\nBy default it loads everything from `{path}/content/**/*`.\n\nYou can load from any path you want\n\n```js\n{\n  content: {\n    posts: [\"**/*\"],\n    portfolio: [\"entries/*.md\"]\n  }\n}\n```\n\n_Note: If you provide `key: [array of globs]`, key will be used as the root\nfolder when doing your query._\n[More on this in content api documentation](./api.md)\n\nIf you need relative path for a root but don't want your queries to includes\nawkward paths with dots, you can send instead an object\n`key: { root: string, globs: [array of globs]}`.\n\nExample:\n\n```js\n{\n  content: {\n    content: [\"**/*\"],\n    someKey: {\n      root: \"../somewhere\",\n      globs: [\"*/docs/**/*.md\"]\n    }\n  }\n}\n```\n\n### `outdir`\n\n_(default: `\"dist\"`)_\n\nLocation of the static website output. Note that it will be generated in the\n`path` folder: default value will be `{process.cwd()}/dist` according to default\npath option.\n\n### `port`\n\n_(default: `\"3333\"`)_\n\nDevelopment server port.\n\n### `socketPort`\n\n_(default: `\"3334\"`)_\n\nDevelopment socket port (used for hot loading on data).\n\n### `bundleName`\n\n_(default: `\"phenomic\"`)_\n\nPrefix for javascript/css bundles used by the\n[bundlers plugins](./how-phenomic-works.md#bundler-plugins)\n\n### `plugins`\n\n_(default: `[]`)_\n\nPlugins accept various form (array/objects).\n\n```js\n{\n  // Array are accepted\n  plugins: [\n    // Accepts string (that are assumed as node_modules)\n    \"@phenomic/plugin-from-node_modules\",\n\n    // Accepts array [name, option]\n    [\n      \"@phenomic/plugin-some-other-plugin\",\n      {\n        // plugin option\n        someKey: \"someValue\"\n      }\n    ],\n\n    // Accepts function\n    // See Writing plugins documentation\n    () => {\n      return {\n        name: \"plugin-name\",\n\n        // fakes names, see plugins documentation\n        methodSupportedByPhenomic: () => {},\n        anotherMethodSupportedByPhenomic: () => {}\n      }\n    }\n  ],\n}\n```\n\nObjects are also supported but keep in mind that keys are not used (it can be\nused as comment).\n\n```js\n{\n  plugins: {\n    // Accepts string (that are assumed as node_modules)\n    someKey: \"@phenomic/plugin-from-node_modules\",\n\n    // Accepts array [name, option]\n    anotherKey: [\n      \"@phenomic/plugin-some-other-plugin\",\n      {\n        // plugin option\n        someKey: \"someValue\"\n      }\n    ],\n  }\n}\n```\n\n### `presets`\n\n_(default: none)_\n\nPresets are a function that returns a an object with plugins (and others presets\nin case you want to extend an existing preset).\n\nPresets accept various form (array/objects).\n\n```js\n{\n  // Array are accepted\n  presets: [\n    // Accepts string (that are assumed as node_modules)\n    \"@phenomic/preset-react-app\",\n\n    // Accepts array [name, {pluginKey: option}]\n    [\n      \"@phenomic/preset-some-other-preset\",\n      {\n        // options passed to plugin included in the preset\n        [\n          \"pluginKey\",\n          {\n            someKey: \"someValue\"\n          }\n        ]\n      }\n    ],\n\n    // Accepts array/object mix [name, {pluginKey: option}]\n    [\n      \"@phenomic/preset-some-other-preset\",\n      {\n        // options passed to plugin included in the preset\n        pluginKey: {\n          someKey: \"someValue\"\n        }\n      }\n    ],\n\n    // Accepts function\n    () => ({\n      plugins: [\"some-plugin\", \"some-other-plugins\"]\n      // plugins supports the array/objects like explained above\n    }),\n\n    // and array of functions/options\n    [\n      () => ({\n        plugins: [\"some-plugin\", \"some-other-plugins\"]\n        // plugins supports the array/objects like explained above\n      }),\n      { \"some-plugins\": { option: \"value\" } }\n    ]\n  ];\n}\n```\n\nObjects are supported, like for plugins.\n\n```js\n{\n  presets: {\n    // Accepts string (that are assumed as node_modules)\n    \"@phenomic/preset-react-app\": \"@phenomic/preset-react-app\",\n\n    // see plugins for possibilities\n    \"phenomic-preset-something\": () => ({\n      plugins: [\"some-plugin\", \"some-other-plugins\"]\n    })\n  }\n}\n```\n\n### `db`\n\n_(default: `{}`)_\n\nUsed to send some options to the database used for content api.\n\n#### `db.sortFunctions`\n\nCustom sort functions used for content api.\n\n```js\n{\n  db: {\n    sortFunctions: {\n      // keys are the way you will enable this sort\n      // implementation follow Array.prototype.sort()\n      // https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/sort\n      customName: (a, b) => {\n        // a & b are database entries:\n        // { data: Object, partial: Object }\n        // You can except to have all data in the `data` key\n        // (eg: looking for the title? `a.data.title`)\n\n        // here is an approximation of the default sort function as an example\n        // (not exact implementation as we have a string as a parameter,\n        // which is not accessible here, since you can create as many functions\n        // as you need.\n        // See Content API documentation for usage\n\n        // sort by date first\n        const va = a.data.date;\n        const vb = b.data.date;\n        if (!va && vb) return -1;\n        if (!vb && va) return 1;\n        if (va && vb && vb > va) return -1;\n        if (va && vb && va > vb) return 1;\n\n        // fallbacks instead of weird order\n        // sort by title\n        if (b.data.title > a.data.title) return -1;\n        if (a.data.title > b.data.title) return 1;\n\n        // or sort by filename\n        if (b.data.filename > a.data.filename) return -1;\n        if (a.data.filename > b.data.filename) return 1;\n\n        return 0;\n      };\n    }\n  }\n}\n```\n"
  },
  {
    "path": "packages/core/docs/faq.md",
    "content": "---\npriority: 10\ntitle: FAQ\n---\n\n## What is CSR?\n\nClient Side Rendering.\n\n## What is SSR?\n\nStatic Side Rendering. It usually means _Server Side Rendering_ but in our case,\nit's pretty much the same so we decided to use this acronym.\n"
  },
  {
    "path": "packages/core/docs/how-phenomic-works.md",
    "content": "---\ntitle: How Phenomic works\npriority: 2\n---\n\n## Phenomic Lifecycle\n\nThe lifecycle of Phenomic is pretty light and can be summarized like this:\n\n- Initialisation from [configuration](./configuration.md),\n- Bundling of (or two) JavaScript bundles (for [CSR](./faq.md#what-is-csr) &\n  [SSR](./faq.md#what-is-ssr)),\n- [Content API](./api.md) initialisation from transformed content files\n  (optional),\n- Rendering via a development server or static rendering as files for\n  production.\n\nWhat's cool about Phenomic is that the entire lifecycle is configurable via\nplugins.\n\n---\n\nRelying on [existing plugins](https://phenomic.io/en/plugins/) is a good first\nstep to get started with Phenomic. Even better, you can directly choose a\n[preset](https://phenomic.io/en/tutorials/) to start using it in seconds. And if\nyou don't find something that fit your needs or just miss something, your can\n[make your own plugin](./writing-plugins.md).\n\n## Plugins\n\nPhenomic took inspiration from _metalsmith_ by choosing to have a very light\ncore highly extensible with plugins.\n\nPlugins can interact at all stage of Phenomic process (during both development\nor static generation). A plugin can do multiple things but generally you will\nfind this 4 types of plugins.\n\n### Renderer plugins\n\nThis will handle the generation of the html/dom (static/client side). That's\nprobably the most important type of plugins. Depending of the renderer plugin\nyou will choose, this might completely change your experience with Phenomic.\n\n_Example:\n[React (@phenomic/plugin-renderer-react)](https://phenomic.io/en/packages/plugin-renderer-react/docs/)_\n\n### Bundler plugins\n\nThis will handle the javascript bundles that will be generated for the browser\n(and also used for static generation).\n\n_Example:\n[Webpack (@phenomic/plugin-bundler-webpack)](https://phenomic.io/en/packages/plugin-bundler-webpack/docs/)_\n\n### Transformer plugins\n\nThis will handle the transformation of files found by phenomic. Optional if you\ndirectly hit an existing API.\n\n_Example:\n[Markdown (@phenomic/plugin-transformer-markdown)](https://phenomic.io/en/packages/plugin-transform-markdown/docs/)\nor\n[JSON (@phenomic/plugin-transformer-json)](https://phenomic.io/en/packages/plugin-transform-json/docs/)_\\_.\n\n### Other kind of plugins\n\nYou will also find some various kind of plugins that can do some other stuffs\nlike generating an RSS feed from your content files or just serve static files\nfrom a `/public` folder (eg: `robots.txt` and friends).\n\n## Presets\n\nPresets are a collection of plugins. For now we have only one,\n[but we want more](https://github.com/phenomic/phenomic/issues?q=is%3Aopen+label%3Aplugin).\n\nThat's the fastest way to start with Phenomic. You can directly check out\nexisting [tutorials](https://phenomic.io/en/tutorials/)\n"
  },
  {
    "path": "packages/core/docs/writing-plugins.md",
    "content": "---\npriority: 4\ntitle: Writing plugins\n---\n\nPlugins are the strength of Phenomic and what make it so flexible and reusable.\nPhenomic allows you to interact with it at several state of the process\ndepending on what you need.\n\n[Learn more about Phenomic lifecycle](./how-phenomic-works.md#lifecycle)\n\nTo know how to use a plugin see\n[the configuration `plugins` option](./configuration.md#plugins).\n\n## Creating your plugin\n\nA plugin can take the form of a node_modules or directly a function in the\nconfiguration. It must be a function that returns object.\n\n```js\nmodule.exports = (/* options */) => {\n  return {\n    // plugin\n    name: \"phenomic-plugin-name\",\n\n    // fake method name\n    method1: () => {},\n    method2: () => {},\n  };\n};\n```\n\nNote that you can also export using ES2015 export\n\n```js\nconst yourPlugin = (/* options */) => {\n  return {\n    // plugin\n    // ...\n  };\n};\n\nexport default yourPlugin;\n```\n\nIf your plugin accepts options, you can use the first parameter of the function.\nThis parameter will receive the option that you can inject via\n[the configuration `plugins` option](./configuration.md#plugins).\n\n## Examples\n\nThe best source of examples will be phenomic\n[plugins included in our repository](https://github.com/phenomic/phenomic/tree/master/packages).\n\nPlugins interesting part are usually located at\n`phenomic/packages/plugin-*/src/index.js`.\n\n## Lifecycle methods\n\nHere are the list of methods that allows you to interact with Phenomic\nlifecycle.\n\n### `collect`\n\nThe method `collect` is useful if you plan to use [Content API](./api.md). It\nallows you to collect your data before rendering and to inject it into the\ndatabase.\n\n```js\ncollect: ({ db, transformers }) => Promise;\n```\n\nIt receive the database and all transformers plugin as arguments\n\nUsed in\n\n- https://github.com/phenomic/phenomic/tree/master/packages/plugin-collector-files/src/index.js\n\n### `supportedFileTypes` + `transform`\n\nThe method `transform` is useful if you plan to use [Content API](./api.md). It\nallows you to transform files (that match `supportedFileTypes` - array of files\nextensions) as something ready for Phenomic database.\n\n#### `supportedFileTypes`\n\nArray of files extensions.\n\nExample\n\n```js\nsupportedFileTypes: [\"md\", \"markdown\"]; // will match *.md and *.markdown\n```\n\nUsed in\n\n- https://github.com/phenomic/phenomic/tree/master/packages/plugin-transform-markdown/src/index.js\n- https://github.com/phenomic/phenomic/tree/master/packages/plugin-transform-asciidoc/src/index.js\n- https://github.com/phenomic/phenomic/tree/master/packages/plugin-transform-json/src/index.js\n\n#### `transform`\n\nFunction that accepts an object and must return an result ready for Phenomic\ndatabase:\n\n```js\ntransform: ({\n  // you will only receive file that match `supportedFileTypes`\n  file: { name: string, fullpath: string },\n  contents: Buffer\n}) {\n  // do your thing to parse `contents`\n  // ...\n\n  // then return a database entry\n  return {\n    data: Object,\n    partial: Object\n  };\n}\n```\n\nLearn more about database entries in [Content API documentation](./api.md).\n\nUsed in\n\n- https://github.com/phenomic/phenomic/tree/master/packages/plugin-transform-markdown/src/index.js\n- https://github.com/phenomic/phenomic/tree/master/packages/plugin-transform-asciidoc/src/index.js\n- https://github.com/phenomic/phenomic/tree/master/packages/plugin-transform-json/src/index.js\n\n### `build`\n\nAllows you to do a JavaScript bundle for client side rendering (CSR). Should\nreturn an object (map) of files (js and css) generated by the bundler.\n\n```js\nbuild: () => assets,\n```\n\nUsed in\n\n- https://github.com/phenomic/phenomic/tree/master/packages/plugin-bundler-webpack/src/index.js\n\n### `buildForPrerendering`\n\nAllows you to do a JavaScript bundle for static side rendering (SSR).\n\nThe result will be passed to the [`getRoutes()`](#getroutes) method. Your can\nreturn a promise.\n\n```js\nbuildForPrerendering: () => Promise<result that will be passed to `getRoutes`>,\n```\n\nUsed in\n\n- https://github.com/phenomic/phenomic/tree/master/packages/plugin-bundler-webpack/src/index.js\n\n### `getRoutes`\n\n```js\ngetRoutes: (resultOf_buildForPrerendering) => routes,\n```\n\nUsed in\n\n- https://github.com/phenomic/phenomic/tree/master/packages/plugin-renderer-react/src/index.js\n\n### `resolveURLs`\n\nAllows to resolve all possibles URLS for static side rendering (SSR). Receive an\nobject with the routes returned by `getRoutes`.\n\n```js\nresolveURLs: ({\n  routes\n}) => Promise<Array<url>>,\n```\n\nUsed in\n\n- https://github.com/phenomic/phenomic/tree/master/packages/plugin-renderer-react/src/index.js\n\n### `renderStatic`\n\nAllows to statically generated some files. Receive an object that contains the\nresult of `buildForPrerendering`, `build` and the url to render. Should return\nan array of files (a file is a `path` + its `contents`). Promise are accepted.\n\n```js\nrenderStatic: ({|\n  app /* result of `buildForPrerendering` */,\n  assets /* result of `build` */,\n  location /* url to prerender */\n|}) => Promise<Array<{ path, contents }>>,\n```\n\nUsed in\n\n- https://github.com/phenomic/phenomic/tree/master/packages/plugin-renderer-react/src/index.js\n\n### `renderDevServer`\n\nAllows to generated the HTML for the entry point for development. Receive an\nobject that contains the result of `build` and the url to render.\n\nShould return some HTML.\n\n```js\nrenderDevServer: ({\n  assets  /* result of `build` */,\n  location /* url to prerender */\n}) => htmlString,\n```\n\nUsed in\n\n- https://github.com/phenomic/phenomic/tree/master/packages/plugin-renderer-react/src/index.js\n\n### `addDevServerMiddlewares`\n\nAllows you to inject some express middleware for development server. Should\nreturn an array of express middlewares. Promise are accepted.\n\n```js\naddDevServerMiddlewares: () =>\n  | Array<express$Middleware>\n  | Promise<Array<express$Middleware>>,\n```\n\nUsed in\n\n- https://github.com/phenomic/phenomic/tree/master/packages/plugin-bundler-webpack/src/index.js\n- https://github.com/phenomic/phenomic/tree/master/packages/plugin-public-assets/src/index.js\n- https://github.com/phenomic/phenomic/tree/master/packages/plugin-rss-feed/src/index.js\n\n### `beforeBuild`\n\nAllows you to do anything before the build. Can return a promise.\n\n```js\nbeforeBuild: () => void | Promise<void>,\n```\n\nUsed in\n\n- https://github.com/phenomic/phenomic/tree/master/packages/plugin-public-assets/src/index.js\n\n### `afterBuild`\n\nAllows you to do anything after the build. Can return a promise.\n\n```js\nafterBuild: () => void | Promise<void>\n```\n\n### `extendAPI`\n\nAllows to extend the API with new endpoints. Handy for custom queries to the\ndatabase. Accept an object with API (express server) and Phenomic databse to hit\ndirectly on it.\n\nExample\n\n```js\nextendAPI: ({\n  apiServer /* express api server */,\n  db /* phenomic databse */\n}) => {\n  apiServer.get(\"/your-custom-path/:path/:id.json\", async function(\n    req,\n    res\n  ) {\n    try {\n      // get an item from its id\n      const entry = db.get(req.params.path, req.params.id);\n\n      // some business logic\n      // ...\n\n      res.json(/* your json */);\n    } catch (error) {\n      res.status(404).end();\n    }\n  });\n},\n```\n\nLearn more about database [Content API documentation](./api.md).\n\nUsed in\n\n- https://github.com/phenomic/phenomic/tree/master/packages/plugin-api-related-content/src/index.js\n"
  },
  {
    "path": "packages/core/package.json",
    "content": "{\n  \"name\": \"@phenomic/core\",\n  \"version\": \"1.0.0\",\n  \"publishConfig\": {\n    \"access\": \"public\"\n  },\n  \"repository\": \"https://github.com/phenomic/phenomic.git\",\n  \"homepage\": \"https://phenomic.io\",\n  \"license\": \"MIT\",\n  \"authors\": [\n    \"Maxime Thirouin (MoOx)\",\n    \"bloodyowl <bloodyowl@icloud.com>\"\n  ],\n  \"keywords\": [\n    \"static\",\n    \"website\",\n    \"generator\",\n    \"compiler\",\n    \"phenomic\",\n    \"phenomic-package\"\n  ],\n  \"description\": \"Phenomic core package\",\n  \"main\": \"lib/index.js\",\n  \"files\": [\n    \"lib\",\n    \"src\",\n    \"!**/__tests__\"\n  ],\n  \"dependencies\": {\n    \"@babel/runtime\": \"^7.0.0\",\n    \"@phenomic/api-client\": \"^1.0.0\",\n    \"@phenomic/bs-platform\": \"^1.0.0\",\n    \"chalk\": \"^1.1.3\",\n    \"cosmiconfig\": \"^2.1.1\",\n    \"debug\": \"^2.6.0\",\n    \"deep-assign\": \"^2.0.0\",\n    \"dotenv\": \"^5.0.1\",\n    \"dotenv-expand\": \"^4.2.0\",\n    \"express\": \"^4.14.0\",\n    \"find-cache-dir\": \"^2.0.0\",\n    \"get-port\": \"^2.1.0\",\n    \"log-symbols\": \"^1.0.2\",\n    \"mkdirp\": \"^0.5.1\",\n    \"p-map\": \"^1.2.0\",\n    \"react-dev-utils\": \"^4.2.1\",\n    \"rimraf\": \"^2.5.4\",\n    \"serve\": \"^6.5.6\",\n    \"url\": \"^0.11.0\"\n  },\n  \"engines\": {\n    \"node\": \">=4.2.0\",\n    \"npm\": \">=3.0.0\",\n    \"yarn\": \">=1.0.0\"\n  },\n  \"devDependencies\": {\n    \"supertest\": \"^3.0.0\"\n  }\n}\n"
  },
  {
    "path": "packages/core/src/BsFindCacheDir.re",
    "content": "type options = {\n  .\n  \"name\": string,\n  \"create\": bool,\n};\n\n[@bs.module] external findCacheDir: options => string = \"find-cache-dir\";\n\nlet make = (~name, ~create, _) =>\n  findCacheDir({\"name\": name, \"create\": create});\n"
  },
  {
    "path": "packages/core/src/Utils.re",
    "content": "let durationSince = (~lastTime, ~now=Js.Date.now(), ()): string => {\n  let duration = now -. lastTime;\n  if (duration > 1000.) {\n    Js.Float.toString(duration /. 1000.) ++ \"s\";\n  } else {\n    Js.Float.toString(duration) ++ \"ms\";\n  };\n};\n\nlet findCacheDirectory = (~name=?, _) =>\n  BsFindCacheDir.make(\n    ~name=\n      switch (name) {\n      | None => \"phenomic\"\n      | Some(n) => \"phenomic/\" ++ n\n      },\n    ~create=true,\n    (),\n  );\n"
  },
  {
    "path": "packages/core/src/api/__tests__/index.js",
    "content": "// @flow\n\nimport request from \"supertest\";\n\nimport createDB from \"../../db\";\nimport dbFixtures from \"../../db/__tests__/__fixtures__\";\n\nimport createServer from \"..\";\n\nconst db = createDB({});\ndb._setDatabase(dbFixtures);\n\nconst server = createServer({\n  db,\n  plugins: [\n    {\n      name: \"test-api\",\n      extendAPI: () => {},\n    },\n    {\n      name: \"test-nothing\",\n    },\n  ],\n  rootPath: \"\",\n});\n\nit(\"should return basic response\", async () => {\n  await request(server)\n    .get(\"/unknown\")\n    .expect(404);\n\n  await request(server)\n    .get(\"/\")\n    .expect(200);\n});\n\nit(\"should return handle simple query for list\", async () => {\n  await request(server)\n    .get(\"/news/by-default/1/asc/date.json\")\n    .expect(200);\n\n  await request(server)\n    .get(\"/news/by-default/1/asc/date/limit-2.json\")\n    .expect(200);\n\n  // await request(server)\n  //   .get(\"/news/by-default/1/asc/limit-:limit/after-:after.json\")\n  //   .expect(200);\n});\n\nit(\"should return handle simple query for items\", async () => {\n  await request(server)\n    .get(\"/item/unknown.json\")\n    .expect(404);\n\n  await request(server)\n    .get(\"/item/news/2017/06/introducing-1.0.0-alpha.json\")\n    .expect(200);\n\n  await request(server)\n    .get(\"/unknown/item/really.json\")\n    .expect(404);\n\n  await request(server)\n    .get(\"/news/item/2017/06/introducing-1.0.0-alpha.json\")\n    .expect(200);\n});\n"
  },
  {
    "path": "packages/core/src/api/helpers.js",
    "content": "// @flow\n\nexport const encode = (text: string) => Buffer.from(text).toString(\"base64\");\nexport const decode = (text: string) => Buffer.from(text, \"base64\").toString();\n"
  },
  {
    "path": "packages/core/src/api/index.js",
    "content": "// @flow\n\nimport express from \"express\";\n\nimport pkg from \"../../package.json\";\nimport log from \"../utils/log\";\n\nimport { encode, decode } from \"./helpers\";\n\nconst debug = require(\"debug\")(\"phenomic:core:api\");\n\nconst connect = (list, limit, previousList = []) => {\n  const hasNextPage = limit === undefined ? false : list.length > limit;\n  const hasPreviousPage = previousList.length > 0;\n  const previousPageIsFirst = limit ? previousList.length <= limit : false;\n  // we are retrieving limit + 1 to know if there is more page or not\n  // so when getting the previous item, we need to check if we want the last\n  // item or the one before (since we added one to the limit)\n  const previousIndex = previousList.length - 1 - (previousPageIsFirst ? 0 : 1);\n  const nextIndex = list.length - 1;\n  return {\n    previousPageIsFirst,\n    previous:\n      hasPreviousPage && previousList[previousIndex]\n        ? encode(previousList[previousIndex].id)\n        : undefined,\n    next:\n      hasNextPage && list[nextIndex] ? encode(list[nextIndex].id) : undefined,\n    list: list.slice(0, limit),\n  };\n};\n\nfunction createAPIServer({\n  db,\n  plugins,\n  rootPath,\n}: {|\n  db: PhenomicDB,\n  plugins: PhenomicPlugins,\n  rootPath: string,\n|}) {\n  debug(\"creating server\");\n  const apiServer = express();\n\n  apiServer.get(rootPath + \"/\", async function(\n    req: express$Request,\n    res: express$Response,\n  ) {\n    debug(\"get api version\");\n    res.json({\n      engine: \"phenomic\",\n      version: pkg.version,\n    });\n  });\n\n  apiServer.get(\n    rootPath + \"/:path/by-:filter/:value/:order/:sort.json\",\n    async function(req: express$Request, res: express$Response) {\n      debug(req.url, JSON.stringify(req.params));\n      try {\n        const sort = req.params.sort;\n        const reverse = req.params.order === \"desc\";\n        const list = await db.getList(\n          req.params.path,\n          {\n            sort,\n            reverse,\n          },\n          req.params.filter,\n          req.params.value,\n        );\n        res.json(connect(list));\n      } catch (error) {\n        log.error(error.message);\n        debug(error);\n        res.status(404).end();\n      }\n    },\n  );\n\n  apiServer.get(\n    rootPath + \"/:path/by-:filter/:value/:order/:sort/limit-:limit.json\",\n    async function(req: express$Request, res: express$Response) {\n      debug(req.url, JSON.stringify(req.params));\n      try {\n        const limit = parseInt(req.params.limit);\n        const sort = req.params.sort;\n        const reverse = req.params.order === \"desc\";\n        const list = await db.getList(\n          req.params.path,\n          {\n            limit: limit + 1,\n            sort,\n            reverse,\n          },\n          req.params.filter,\n          req.params.value,\n        );\n        res.json(\n          connect(\n            list,\n            limit,\n          ),\n        );\n      } catch (error) {\n        log.error(error.message);\n        debug(error);\n        res.status(404).end();\n      }\n    },\n  );\n\n  apiServer.get(\n    rootPath +\n      \"/:path/by-:filter/:value/:order/:sort/limit-:limit/after-:after.json\",\n    async function(req: express$Request, res: express$Response) {\n      debug(req.url, JSON.stringify(req.params));\n      try {\n        const limit = parseInt(req.params.limit);\n        const after = decode(req.params.after);\n        // @todo check lt validity (exist?); otherwise, trigger an error (404?)\n        // cause during dev all \"lt\" are responding 200, even random values\n        // but in production, it's not the case as only known values are\n        // generated as endpoints\n        const sort = req.params.sort;\n        const reverse = req.params.order === \"desc\";\n        const [list, previousList] = await Promise.all([\n          db.getList(\n            req.params.path,\n            {\n              limit: limit + 1,\n              gte: after,\n              sort,\n              reverse,\n            },\n            req.params.filter,\n            req.params.value,\n          ),\n          db.getList(\n            req.params.path,\n            {\n              limit: limit + 1,\n              gt: after,\n              sort,\n              reverse: !reverse,\n            },\n            req.params.filter,\n            req.params.value,\n          ),\n        ]);\n        res.json(\n          connect(\n            list,\n            limit,\n            previousList,\n          ),\n        );\n      } catch (error) {\n        log.error(error.message);\n        debug(error);\n        res.status(404).end();\n      }\n    },\n  );\n\n  apiServer.get(rootPath + \"/:path/item/*?.json\", async function(\n    req: express$Request,\n    res: express$Response,\n  ) {\n    debug(req.url, JSON.stringify(req.params));\n    try {\n      // thing/item/.json means you want /item/thing.json\n      // (because thing/index.md => thing)\n      if (!req.params[\"0\"]) {\n        const resource = await db.get(null, req.params.path);\n        res.json(resource.value);\n      } else {\n        const resource = await db.get(req.params.path, req.params[\"0\"]);\n        res.json(resource.value);\n      }\n    } catch (error) {\n      log.error(error.message);\n      debug(error);\n      res.status(404).end();\n    }\n  });\n\n  apiServer.get(\n    rootPath + \"/by-:filter/:value/:order/:sort.json\",\n    async function(req: express$Request, res: express$Response) {\n      debug(req.url, JSON.stringify(req.params));\n      try {\n        const sort = req.params.sort;\n        const reverse = req.params.order === \"desc\";\n        const list = await db.getList(\n          null,\n          {\n            sort,\n            reverse,\n          },\n          req.params.filter,\n          req.params.value,\n        );\n        res.json(connect(list));\n      } catch (error) {\n        log.error(error.message);\n        debug(error);\n        res.status(404).end();\n      }\n    },\n  );\n\n  apiServer.get(\n    rootPath + \"/by-:filter/:value/:order/:sort/limit-:limit.json\",\n    async function(req: express$Request, res: express$Response) {\n      debug(req.url, JSON.stringify(req.params));\n      try {\n        const limit = parseInt(req.params.limit);\n        const sort = req.params.sort;\n        const reverse = req.params.order === \"desc\";\n        const list = await db.getList(\n          null,\n          {\n            limit: limit + 1,\n            sort,\n            reverse,\n          },\n          req.params.filter,\n          req.params.value,\n        );\n        res.json(\n          connect(\n            list,\n            limit,\n          ),\n        );\n      } catch (error) {\n        log.error(error.message);\n        debug(error);\n        res.status(404).end();\n      }\n    },\n  );\n\n  apiServer.get(\n    rootPath + \"/by-:filter/:value/:order/:sort/limit-:limit/after-:after.json\",\n    async function(req: express$Request, res: express$Response) {\n      debug(req.url, JSON.stringify(req.params));\n      try {\n        const limit = parseInt(req.params.limit);\n        const after = decode(req.params.after);\n        // @todo check lt validity (exist?); otherwise, trigger an error (404?)\n        // cause during dev all \"lt\" are responding 200, even random values\n        // but in production, it's not the case as only known values are\n        // generated as endpoints\n        const sort = req.params.sort;\n        const reverse = req.params.order === \"desc\";\n        const [list, previousList] = await Promise.all([\n          db.getList(\n            null,\n            {\n              limit: limit + 1,\n              gte: after,\n              sort,\n              reverse,\n            },\n            req.params.filter,\n            req.params.value,\n          ),\n          db.getList(\n            null,\n            {\n              limit: limit + 1,\n              gt: after,\n              sort,\n              reverse: !reverse,\n            },\n            req.params.filter,\n            req.params.value,\n          ),\n        ]);\n        res.json(\n          connect(\n            list,\n            limit,\n            previousList,\n          ),\n        );\n      } catch (error) {\n        log.error(error.message);\n        debug(error);\n        res.status(404).end();\n      }\n    },\n  );\n\n  apiServer.get(rootPath + \"/item/*?.json\", async function(\n    req: express$Request,\n    res: express$Response,\n  ) {\n    debug(req.url, JSON.stringify(req.params));\n    // /item/.json means you want /item/index.json\n    // (because thing/index.md => thing)\n    const id = req.params[\"0\"] || \"index\";\n    try {\n      const resource = await db.get(null, id);\n      res.json(resource.value);\n    } catch (error) {\n      log.error(error.message);\n      debug(error);\n      res.status(404).end();\n    }\n  });\n\n  // Install the plugins\n  plugins.forEach(plugin => {\n    if (typeof plugin.extendAPI === \"function\") {\n      debug(`installing plugin '${plugin.name}'`);\n      if (typeof plugin.extendAPI === \"function\") {\n        plugin.extendAPI({ apiServer, db });\n      }\n    } else {\n      debug(`plugin '${plugin.name}' have no API definition`);\n    }\n  });\n\n  return apiServer;\n}\n\nexport default createAPIServer;\n"
  },
  {
    "path": "packages/core/src/commands/build.js",
    "content": "// @flow\n\nimport path from \"path\";\n\nimport getPort from \"get-port\";\nimport rimraf from \"rimraf\";\nimport pMap from \"p-map\";\n\nimport createAPIServer from \"../api\";\nimport writeFile from \"../utils/writeFile\";\nimport createDB from \"../db\";\nimport log from \"../utils/log\";\nimport errorFormatter from \"../utils/error-formatter\";\nimport Utils from \"../Utils.bs.js\";\n\nconst debug = require(\"debug\")(\"phenomic:core:commands:build\");\n\nlet lastStamp = Date.now();\nconst startStamp = lastStamp;\n\nasync function build(config: PhenomicConfig) {\n  log(\"⚡️ Starting engine...\");\n  debug(\"cleaning dist\");\n  rimraf.sync(\"dist\");\n\n  process.env.NODE_ENV = process.env.NODE_ENV || \"production\";\n  process.env.BABEL_ENV = process.env.BABEL_ENV || \"production\";\n  process.env.PHENOMIC_ENV = \"static\";\n  process.env.PHENOMIC_RESTAPI_PORT = String(await getPort());\n  debug(\"building\");\n  debug(\"process.env.NODE_ENV\", process.env.NODE_ENV);\n  debug(\"process.env.BABEL_ENV\", process.env.BABEL_ENV);\n  debug(\"process.env.PHENOMIC_ENV\", process.env.PHENOMIC_ENV);\n  debug(\"process.env.PHENOMIC_RESTAPI_PORT\", process.env.PHENOMIC_RESTAPI_PORT);\n  const db = createDB(config.db);\n  const phenomicAPIServer = createAPIServer({\n    db,\n    plugins: config.plugins,\n    rootPath: config.baseUrl.pathname + \"phenomic\",\n  });\n  const runningPhenomicAPIServer = phenomicAPIServer.listen(\n    parseInt(process.env.PHENOMIC_RESTAPI_PORT, 10),\n  );\n  debug(\"server ready\");\n  try {\n    log(\"Building client bundle...\");\n    const bundlers = config.plugins.filter(p => p.buildForPrerendering);\n    const bundler = bundlers[0];\n    await Promise.all(\n      config.plugins.map(plugin => plugin.beforeBuild && plugin.beforeBuild()),\n    );\n    if (!bundler || !bundler.build) {\n      throw new Error(\"a bundler is required (plugin implementing `build`)\");\n    }\n    const assets = await bundler.build();\n    debug(\"assets\", assets);\n    log.success(\"📦 Client bundle done \" + Utils.durationSince(lastStamp));\n    lastStamp = Date.now();\n    log(\"Bulding static bundle...\");\n    if (!bundler || !bundler.buildForPrerendering) {\n      throw new Error(\n        \"a bundler is required (plugin implementing `buildForPrerendering`)\",\n      );\n    }\n    const app = await bundler.buildForPrerendering();\n    debug(\"app\", app);\n    log.success(\"📦 Static bundle done \" + Utils.durationSince(lastStamp));\n    log(\"Processing content...\");\n    lastStamp = Date.now();\n\n    const transformers = config.plugins.filter(plugin => plugin.transform);\n    // collectors\n    await Promise.all(\n      config.plugins.map(p => p.collect && p.collect({ db, transformers })),\n    );\n\n    log.success(\"📝 Content processed \" + Utils.durationSince(lastStamp));\n    log(\"Starting static pre-rendering...\");\n    lastStamp = Date.now();\n    const renderers: PhenomicPlugins = config.plugins.filter(p => p.getRoutes);\n    const renderer = renderers[0];\n    if (!renderer || !renderer.getRoutes) {\n      throw new Error(\n        \"a renderer is required (plugin implementing `getRoutes`)\",\n      );\n    }\n    const routes = renderer.getRoutes(app);\n    let nbUrls = 0;\n    let nbUrlsFailed = 0;\n    await Promise.all(\n      config.plugins.map(async plugin => {\n        if (!plugin.resolveURLs) {\n          debug(\"nor 'resolveURLs' method for plugin \", plugin.name);\n          return;\n        }\n        if (!plugin.renderStatic) {\n          debug(\"nor 'renderStatic' method for plugin \", plugin.name);\n          return;\n        }\n        if (typeof plugin.resolveURLs !== \"function\") {\n          throw new Error(\n            `'resolveURLs' method from ${\n              plugin.name\n            } must be a function, received '${typeof plugin.resolveURLs}'`,\n          );\n        }\n        if (typeof plugin.renderStatic !== \"function\") {\n          throw new Error(\n            `'renderStatic' method from ${\n              plugin.name\n            } must be a function, received '${typeof plugin.renderStatic}'`,\n          );\n        }\n        const renderStatic = plugin.renderStatic;\n        const urls = await plugin.resolveURLs({\n          routes,\n        });\n        nbUrls += urls.length;\n        debug(\"urls have been resolved for \", plugin.name, urls);\n        await pMap(\n          urls,\n          async location => {\n            debug(`'${location}': prepend file and deps`);\n            try {\n              const files = await renderStatic({\n                app,\n                assets,\n                location,\n              });\n              debug(`'${location}': files & deps collected`, files);\n              return Promise.all(\n                files.map(file =>\n                  writeFile(\n                    path.join(config.outdir, decodeURIComponent(file.path)),\n                    file.contents,\n                  ),\n                ),\n              );\n            } catch (e) {\n              // do not crash entire build, just log and continue\n              nbUrlsFailed++;\n              const betterError = errorFormatter(e);\n              log.warn(\n                \"An url failed to pre-render /\" +\n                  location +\n                  \":\\n\" +\n                  (betterError.stack\n                    ? betterError.stack\n                    : betterError.toString()),\n              );\n              return Promise.resolve([]);\n            }\n          },\n          { concurrency: 50 },\n        );\n      }),\n    );\n    if (nbUrls === 0) {\n      log.warn(\n        `No URLs resolved. You should probably double-check your routes. If you are using a single '*' route, you need to add an '/' to get a least a static entry point.`,\n      );\n    }\n    const now = Date.now();\n    log.success(\n      \"📦 Static pre-rendering done \" +\n        Utils.durationSince(lastStamp, now) +\n        ` (${nbUrls} file${nbUrls > 1 ? \"s\" : \"\"} ≈ ${Math.ceil(\n          (now - lastStamp) / nbUrls,\n        )}ms/file)`,\n    );\n    lastStamp = Date.now();\n\n    const pluginsWithAfterBuildHooks = config.plugins.filter(\n      plugin => typeof plugin.afterBuild === \"function\",\n    );\n    if (pluginsWithAfterBuildHooks.length > 0) {\n      await Promise.all(\n        pluginsWithAfterBuildHooks.map(\n          plugin => plugin.afterBuild && plugin.afterBuild(),\n        ),\n      );\n      log.success(\n        \"After build hook finished \" + Utils.durationSince(lastStamp),\n      );\n      lastStamp = Date.now();\n    }\n\n    if (runningPhenomicAPIServer) {\n      runningPhenomicAPIServer.close();\n    }\n    debug(\"server closed\");\n    if (nbUrlsFailed === 0) {\n      log.success(\"Build done \" + Utils.durationSince(startStamp));\n    } else {\n      log.error(\n        `${nbUrlsFailed} file${\n          nbUrlsFailed > 1 ? \"s\" : \"\"\n        } have not been pre-rendered. See errors above for more details`,\n      );\n      log.warn(\"Build done with errors \" + Utils.durationSince(startStamp));\n      process.exit(2);\n    }\n  } catch (error) {\n    if (runningPhenomicAPIServer) {\n      runningPhenomicAPIServer.close();\n    }\n    debug(\"server closed due to error\");\n    log.error(\"Build failed \" + Utils.durationSince(startStamp));\n    throw error;\n  }\n}\nexport default (options: Object) => build(options);\n"
  },
  {
    "path": "packages/core/src/commands/start.js",
    "content": "// @flow\n\nimport express from \"express\";\nimport getProcessForPort from \"react-dev-utils/getProcessForPort\";\nimport chalk from \"chalk\";\n\nimport createDB from \"../db\";\nimport createAPIServer from \"../api\";\nimport log from \"../utils/log\";\n\nconst debug = require(\"debug\")(\"phenomic:core:commands:start\");\n\nasync function createDevServer({ config }: { config: PhenomicConfig }) {\n  debug(\"creating dev server\");\n  const devServer = express();\n  await Promise.all(\n    config.plugins.map(async plugin => {\n      if (plugin.addDevServerMiddlewares)\n        debug(\"adding dev server middlewares for \" + plugin.name);\n      if (plugin.addDevServerMiddlewares) {\n        return (await plugin.addDevServerMiddlewares()).map(async m => {\n          const resolved = await m;\n          if (resolved) devServer.use(resolved);\n          else\n            debug(\n              \"A middleware hasn't returned anything for \" + plugin.name,\n              \", skipping\",\n              m,\n            );\n        });\n      }\n    }),\n  );\n  return devServer;\n}\n\nasync function start(config: PhenomicConfig) {\n  log(\"️⚡️ Starting development server...\");\n  process.env.NODE_ENV = process.env.NODE_ENV || \"development\";\n  process.env.BABEL_ENV = process.env.BABEL_ENV || \"development\";\n  process.env.PHENOMIC_ENV = \"development\";\n  process.env.PHENOMIC_RESTAPI_PORT = String(config.port);\n  process.env.PHENOMIC_SOCKET_PORT = String(config.socketPort);\n  debug(\"starting phenomic server\");\n  const db = createDB(config.db);\n  const renderers = config.plugins.filter(p => p.getRoutes);\n  const renderer: PhenomicPlugin = renderers[0];\n  const transformers = config.plugins.filter(plugin => plugin.transform);\n  // collectors\n  await Promise.all(\n    config.plugins.map(p => p.collect && p.collect({ db, transformers })),\n  );\n\n  const phenomicServer = createAPIServer({\n    db,\n    plugins: config.plugins,\n    rootPath: config.baseUrl.pathname + \"phenomic\",\n  });\n  const bundlerServer = await createDevServer({ config });\n  bundlerServer.use(phenomicServer);\n  // $FlowFixMe flow is lost with async function for express\n  bundlerServer.get(\"*\", function(req, res) {\n    res.type(\".html\");\n    if (typeof renderer.renderDevServer !== \"function\") {\n      res.end(\n        \"Phenomic renderer requires a 'renderDevServer' function to be exposed\",\n      );\n    } else {\n      res.end(\n        renderer.renderDevServer({\n          assets: res.locals.assets,\n          location: req.originalUrl,\n        }),\n      );\n    }\n  });\n  const server = bundlerServer.listen(config.port);\n  if (server) {\n    server.on(\"error\", err => {\n      if (err.errno === \"EADDRINUSE\") {\n        const existingProcess = getProcessForPort(err.port);\n        log(\n          chalk.yellow(\n            `Something is already running on port ${err.port}. ${\n              existingProcess ? `Probably:\\n${existingProcess}\\n` : \"\"\n            }`,\n          ),\n        );\n      } else {\n        log(err);\n      }\n      process.exit(1);\n    });\n  }\n  log.success(\n    `🔗 Development server ready on http://localhost:${config.port}` +\n      config.baseUrl.pathname,\n  );\n}\n\nexport default start;\n"
  },
  {
    "path": "packages/core/src/configuration/__tests__/__snapshots__/flattenConfiguration.js.snap",
    "content": "// Jest Snapshot v1, https://goo.gl/fbAQLP\n\nexports[`should flatten a list of plugins (array) 1`] = `\nArray [\n  Object {\n    \"module\": [Function],\n    \"name\": \"a\",\n    \"options\": undefined,\n  },\n  Object {\n    \"module\": [Function],\n    \"name\": \"b\",\n    \"options\": undefined,\n  },\n]\n`;\n\nexports[`should flatten a list of plugins (object) 1`] = `\nArray [\n  Object {\n    \"module\": [Function],\n    \"name\": \"a\",\n    \"options\": undefined,\n  },\n  Object {\n    \"module\": [Function],\n    \"name\": \"b\",\n    \"options\": undefined,\n  },\n]\n`;\n\nexports[`should flatten a list of plugins with options (array) 1`] = `\nArray [\n  Object {\n    \"module\": [Function],\n    \"name\": \"a\",\n    \"options\": Object {\n      \"option\": \"-\",\n    },\n  },\n  Object {\n    \"module\": [Function],\n    \"name\": \"b\",\n    \"options\": undefined,\n  },\n]\n`;\n\nexports[`should flatten a list of plugins with options (object) 1`] = `\nArray [\n  Object {\n    \"module\": [Function],\n    \"name\": \"a\",\n    \"options\": Object {\n      \"option\": \"-\",\n    },\n  },\n  Object {\n    \"module\": [Function],\n    \"name\": \"b\",\n    \"options\": undefined,\n  },\n]\n`;\n\nexports[`should flatten a preset (array) 1`] = `\nArray [\n  Object {\n    \"module\": [Function],\n    \"name\": \"a\",\n    \"options\": undefined,\n  },\n  Object {\n    \"module\": [Function],\n    \"name\": \"b\",\n    \"options\": undefined,\n  },\n]\n`;\n\nexports[`should flatten a preset (object) 1`] = `\nArray [\n  Object {\n    \"module\": [Function],\n    \"name\": \"a\",\n    \"options\": undefined,\n  },\n  Object {\n    \"module\": [Function],\n    \"name\": \"b\",\n    \"options\": undefined,\n  },\n]\n`;\n\nexports[`should flatten a preset and plugins 1`] = `\nArray [\n  Object {\n    \"module\": [Function],\n    \"name\": \"a\",\n    \"options\": undefined,\n  },\n  Object {\n    \"module\": [Function],\n    \"name\": \"b\",\n    \"options\": undefined,\n  },\n  Object {\n    \"module\": [Function],\n    \"name\": \"c\",\n    \"options\": undefined,\n  },\n]\n`;\n\nexports[`should flatten nested presets 1`] = `\nArray [\n  Object {\n    \"module\": [Function],\n    \"name\": \"a\",\n    \"options\": undefined,\n  },\n  Object {\n    \"module\": [Function],\n    \"name\": \"b\",\n    \"options\": undefined,\n  },\n  Object {\n    \"module\": [Function],\n    \"name\": \"c\",\n    \"options\": undefined,\n  },\n  Object {\n    \"module\": [Function],\n    \"name\": \"d\",\n    \"options\": undefined,\n  },\n]\n`;\n\nexports[`should flatten presets with options (array) 1`] = `\nArray [\n  Object {\n    \"module\": [Function],\n    \"name\": \"a\",\n    \"options\": Object {\n      \"option\": \"-\",\n    },\n  },\n  Object {\n    \"module\": [Function],\n    \"name\": \"b\",\n    \"options\": undefined,\n  },\n  Object {\n    \"module\": [Function],\n    \"name\": \"c\",\n    \"options\": undefined,\n  },\n]\n`;\n\nexports[`should flatten presets with options (object) 1`] = `\nArray [\n  Object {\n    \"module\": [Function],\n    \"name\": \"a\",\n    \"options\": Object {\n      \"option\": \"-\",\n    },\n  },\n  Object {\n    \"module\": [Function],\n    \"name\": \"b\",\n    \"options\": undefined,\n  },\n  Object {\n    \"module\": [Function],\n    \"name\": \"c\",\n    \"options\": undefined,\n  },\n]\n`;\n"
  },
  {
    "path": "packages/core/src/configuration/__tests__/__snapshots__/normalize-base-url.test.js.snap",
    "content": "// Jest Snapshot v1, https://goo.gl/fbAQLP\n\nexports[`should normalize base url with a trailing slash 1`] = `\nObject {\n  \"auth\": null,\n  \"hash\": null,\n  \"host\": \"t.e\",\n  \"hostname\": \"t.e\",\n  \"href\": \"http://t.e/st/\",\n  \"path\": \"/st/\",\n  \"pathname\": \"/st/\",\n  \"port\": null,\n  \"protocol\": \"http:\",\n  \"query\": null,\n  \"search\": null,\n  \"slashes\": true,\n}\n`;\n"
  },
  {
    "path": "packages/core/src/configuration/__tests__/flattenConfiguration.js",
    "content": "// @flow\n\nimport { flattenPresets } from \"../flattenConfiguration\";\n\nfunction a() {\n  return { name: \"a\" };\n}\nfunction b() {\n  return { name: \"b\" };\n}\nfunction c() {\n  return { name: \"c\" };\n}\nfunction d() {\n  return { name: \"d\" };\n}\n\ntest(\"should flatten a list of plugins (array)\", () => {\n  expect(\n    flattenPresets({\n      plugins: [a, b],\n    }),\n  ).toMatchSnapshot();\n});\n\ntest(\"should flatten a list of plugins (object)\", () => {\n  expect(\n    flattenPresets({\n      plugins: { a, b },\n    }),\n  ).toMatchSnapshot();\n});\n\ntest(\"should flatten a list of plugins with options (array)\", () => {\n  expect(\n    flattenPresets({\n      plugins: [\n        [(a: PhenomicPluginModule<PhenomicInputPluginOption>), { option: \"-\" }],\n        b,\n      ],\n    }),\n  ).toMatchSnapshot();\n});\n\ntest(\"should flatten a list of plugins with options (object)\", () => {\n  expect(\n    flattenPresets({\n      plugins: {\n        a: [\n          (a: PhenomicPluginModule<PhenomicInputPluginOption>),\n          { option: \"-\" },\n        ],\n        b,\n      },\n    }),\n  ).toMatchSnapshot();\n});\n\ntest(\"should flatten a preset (array)\", () => {\n  expect(\n    flattenPresets({\n      presets: [\n        () => ({\n          plugins: [a, b],\n        }),\n      ],\n    }),\n  ).toMatchSnapshot();\n});\n\ntest(\"should flatten a preset (object)\", () => {\n  expect(\n    flattenPresets({\n      presets: [\n        () => ({\n          plugins: { a, b },\n        }),\n      ],\n    }),\n  ).toMatchSnapshot();\n});\n\ntest(\"should flatten a preset and plugins\", () => {\n  expect(\n    flattenPresets({\n      presets: [\n        () => ({\n          plugins: [a],\n        }),\n      ],\n      plugins: [b, c],\n    }),\n  ).toMatchSnapshot();\n});\n\ntest(\"should flatten nested presets\", () => {\n  expect(\n    flattenPresets({\n      presets: [\n        () => ({\n          presets: [\n            () => ({\n              plugins: { a },\n            }),\n          ],\n          plugins: [b],\n        }),\n      ],\n      plugins: [c, d],\n    }),\n  ).toMatchSnapshot();\n});\n\ntest(\"should flatten presets with options (array)\", () => {\n  expect(\n    flattenPresets({\n      presets: [\n        [\n          () => ({\n            plugins: { a, b, c },\n          }),\n          [[\"a\", { option: \"-\" }]],\n        ],\n      ],\n    }),\n  ).toMatchSnapshot();\n});\n\ntest(\"should flatten presets with options (object)\", () => {\n  expect(\n    flattenPresets({\n      presets: [\n        [\n          () => ({\n            plugins: { a, b, c },\n          }),\n          { a: { option: \"-\" } },\n        ],\n      ],\n    }),\n  ).toMatchSnapshot();\n});\n"
  },
  {
    "path": "packages/core/src/configuration/__tests__/normalize-base-url.test.js",
    "content": "// @flow\n\nimport normalizeBaseUrl from \"../normalize-base-url.js\";\n\nit(\"should normalize base url with a trailing slash\", () => {\n  expect(normalizeBaseUrl(\"http://t.e/st\")).toMatchSnapshot();\n});\n"
  },
  {
    "path": "packages/core/src/configuration/flattenConfiguration.js",
    "content": "// @flow\n\nimport defaultConfig from \"../defaultConfig.js\";\n\nimport normalizeBaseUrl from \"./normalize-base-url.js\";\n\nconst debug = require(\"debug\")(\"phenomic:core:configuration\");\n\ntype ModuleWithOption<T> = {|\n  module: T,\n  options?: PhenomicInputPluginOption,\n  name: string,\n|};\n\nfunction normalizeModule<T>(module): ModuleWithOption<T> {\n  let flatModule = module;\n  let options: PhenomicInputPluginOption;\n  if (Array.isArray(module)) {\n    if (module.length !== 2) {\n      throw new Error(\n        \"When using array to register a phenomic module, please an array with 2 items only\" +\n          \"Given \" +\n          module.length,\n      );\n    }\n    flatModule = module[0];\n    if (typeof module[0] !== \"string\" && typeof module[0] !== \"function\") {\n      throw new Error(\n        \"module should be a string or a function but received \" +\n          typeof module[0],\n      );\n    }\n    if (!module[1] || typeof module[1] !== \"object\") {\n      throw new Error(\n        \"options should be an object but received \" + typeof module[1],\n      );\n    }\n    // $FlowFixMe we can't cover everything\n    options = module[1];\n  }\n  const preNormalizedModule: T =\n    // $FlowFixMe 🤫\n    typeof flatModule === \"string\"\n      ? // $FlowFixMe yeah yeah, I know what I am doing flow\n        require(require.resolve(flatModule))\n      : flatModule;\n\n  // for es6 transpiled code\n  if (\n    typeof preNormalizedModule === \"object\" &&\n    preNormalizedModule &&\n    typeof preNormalizedModule.default === \"function\"\n  ) {\n    const normalizedModule = preNormalizedModule.default;\n    // debug(\"normalizeModule (default)\", normalizedModule);\n    return {\n      module: normalizedModule,\n      options,\n      name: typeof flatModule === \"string\" ? flatModule : normalizedModule.name,\n    };\n  }\n  if (typeof preNormalizedModule === \"function\") {\n    const normalizedModule = preNormalizedModule;\n    // debug(\"normalizeModule\", normalizedModule);\n    return {\n      module: normalizedModule,\n      options,\n      name: typeof flatModule === \"string\" ? flatModule : normalizedModule.name,\n    };\n  }\n  throw new Error(\"unknow module type \" + typeof module);\n}\n\nfunction flattenPresets(\n  pluginsConfig: PhenomicInputPlugins,\n  presetOptions?: PhenomicInputPluginOption,\n): $ReadOnlyArray<ModuleWithOption<PhenomicInputPluginOption>> {\n  debug(\"flattenPresets\", pluginsConfig);\n  const presets: $ReadOnlyArray<ModuleWithOption<PhenomicInputPreset>> = (\n    pluginsConfig.presets || []\n  ).map(normalizeModule);\n  const pluginsFromPresets = presets.reduce(\n    (acc, preset: ModuleWithOption<PhenomicInputPreset>) => {\n      const presetResult = preset.module(preset.options);\n      const flattenPreset = flattenPresets(presetResult, preset.options);\n      return acc.concat(flattenPreset);\n    },\n    [],\n  );\n  const pluginsFromPlugins = Array.isArray(pluginsConfig.plugins)\n    ? pluginsConfig.plugins.map(normalizeModule)\n    : pluginsConfig.plugins\n      ? Object.keys(pluginsConfig.plugins).map(k =>\n          // $FlowFixMe ?\n          normalizeModule(pluginsConfig.plugins[k]),\n        )\n      : [];\n  // inject preset options\n  if (presetOptions)\n    if (Array.isArray(presetOptions))\n      presetOptions.forEach(options => {\n        const pluginName = options[0];\n        const opts = options[1];\n        const plugin = pluginsFromPlugins.find(\n          plugin => plugin.name === pluginName,\n        );\n        if (!plugin) {\n          throw new Error(`${pluginName} not found to pass preset options`);\n        }\n        if (opts) {\n          plugin.options = {\n            ...(plugin.options || {}),\n            ...opts,\n          };\n        }\n      });\n    else\n      Object.keys(presetOptions).forEach(pluginName => {\n        if (!pluginName) {\n          debug(\"No plugin name found\");\n          return;\n        }\n        const plugin = pluginsFromPlugins.find(\n          plugin => plugin.name === pluginName,\n        );\n        if (!plugin) {\n          throw new Error(`${pluginName} not found to pass preset options`);\n        }\n        if (presetOptions && presetOptions[pluginName]) {\n          plugin.options = {\n            ...(plugin.options || {}),\n            ...presetOptions[pluginName],\n          };\n        }\n      });\n  const plugins = [...pluginsFromPresets, ...pluginsFromPlugins];\n  debug(\"flattenPresets plugins\", plugins);\n  return plugins;\n}\n\nfunction initPlugins(\n  plugins: $ReadOnlyArray<PhenomicPluginModule<{}>>,\n  partialConfig = {},\n) {\n  return plugins.map(plugin => {\n    const pluginInstance = plugin.module(partialConfig, plugin.options);\n    debug(\"plugin\", pluginInstance.name);\n    if (Array.isArray(pluginInstance)) {\n      throw new Error(\n        \"Array of plugins should be specified in 'presets' section of your configuration\",\n      );\n    }\n    return pluginInstance;\n  });\n}\n\nfunction flattenConfiguration(config: PhenomicInputConfig): PhenomicConfig {\n  debug(\"flattenConfiguration\", config);\n  const partialConfig: PhenomicConfig = {\n    baseUrl: config.baseUrl\n      ? normalizeBaseUrl(config.baseUrl)\n      : defaultConfig.baseUrl,\n    path: config.path || defaultConfig.path,\n    content: config.content || defaultConfig.content,\n    outdir: config.outdir || defaultConfig.outdir,\n    port: config.port || defaultConfig.port,\n    socketPort: config.socketPort || defaultConfig.socketPort,\n    bundleName: config.bundleName || defaultConfig.bundleName,\n    db: config.db || defaultConfig.db,\n    plugins: [],\n  };\n  const partialPlugins = flattenPresets({\n    plugins: config.plugins || [],\n    presets: config.presets || [],\n  });\n\n  // instanciate plugins with config\n  // $FlowFixMe whatever...\n  partialConfig.plugins = initPlugins(partialPlugins, partialConfig);\n\n  return partialConfig;\n}\n\nexport { flattenPresets };\nexport default flattenConfiguration;\n"
  },
  {
    "path": "packages/core/src/configuration/get-client-environment.js",
    "content": "// @flow\n\n// inspired from https://github.com/facebook/create-react-app/blob/779dad55465de81972ec72257c734e4afae17094/packages/react-scripts/config/env.js\n\nimport fs from \"fs\";\nimport path from \"path\";\nimport { format } from \"url\";\n\n// Grab NODE_ENV and PHENOMIC_* environment variables and prepare them to be\n// injected into the application.\nconst NODE_ENV = process.env.NODE_ENV || \"development\";\nconst RE_PHENOMIC = /^PHENOMIC_/i;\nconst root = path.join(process.cwd(), \".env\");\n\n// https://github.com/bkeepers/dotenv#what-other-env-files-can-i-use\n// Don't include `.env.local` for `test` environment\n// since normally you expect tests to produce the same\n// results for everyone\nconst dotenvFiles =\n  NODE_ENV !== \"test\"\n    ? [\n        `${root}.${NODE_ENV}.local`,\n        `${root}.${NODE_ENV}`,\n        `${root}.local`,\n        root,\n      ]\n    : [`${root}.${NODE_ENV}`, root];\n\n// Load environment variables from .env* files. Suppress warnings using silent\n// if this file is missing. dotenv will never modify any environment variables\n// that have already been set.  Variable expansion is supported in .env files.\n// https://github.com/motdotla/dotenv\n// https://github.com/motdotla/dotenv-expand\ndotenvFiles.forEach(dotenvFile => {\n  if (fs.existsSync(dotenvFile)) {\n    require(\"dotenv-expand\")(\n      require(\"dotenv\").config({\n        path: dotenvFile,\n      }),\n    );\n  }\n});\n\nexport default function getClientEnvironment(config: PhenomicConfig) {\n  process.env.PHENOMIC_APP_BASEURL = format(config.baseUrl);\n  process.env.PHENOMIC_APP_BASENAME = config.baseUrl.pathname;\n  return Object.keys(process.env)\n    .filter(key => RE_PHENOMIC.test(key))\n    .reduce(\n      (env, key) => {\n        env[key] = process.env[key];\n        return env;\n      },\n      {\n        NODE_ENV,\n      },\n    );\n}\n"
  },
  {
    "path": "packages/core/src/configuration/normalize-base-url.js",
    "content": "// @flow\n\nimport { parse, format } from \"url\";\n\nexport default (url: string): Url => {\n  const baseUrl = parse(url);\n\n  // ensure trailing slash\n  if (baseUrl.pathname && !baseUrl.pathname.endsWith(\"/\")) {\n    baseUrl.pathname = baseUrl.pathname + \"/\";\n  }\n\n  // update baseUrl.href since pathname has been updated\n  // the usage of the spread operator is to avoid having the \"magic\" Object\n  // returned by node (eg: make assertions difficult)\n  return {\n    ...parse(\n      format({\n        // baseUrl cannot just be passed directly\n        // https://github.com/facebook/flow/issues/908\n        href: baseUrl.href,\n        protocol: baseUrl.protocol,\n        slashes: baseUrl.slashes,\n        auth: baseUrl.auth,\n        hostname: baseUrl.hostname,\n        port: baseUrl.port,\n        host: baseUrl.host,\n        pathname: baseUrl.pathname,\n        search: baseUrl.search,\n        query: baseUrl.query,\n        hash: baseUrl.hash,\n      }),\n    ),\n  };\n};\n"
  },
  {
    "path": "packages/core/src/db/__tests__/__fixtures__/index.js",
    "content": "// @flow\n\nexport default {\n  __null__: [\n    {\n      data: {\n        filename: \"bloodyowl.json\",\n        name: \"bloodyowl\",\n        bio: \"bloodyowl short bio\",\n        body: \"bloodyowl long bio\",\n      },\n      partial: {\n        filename: \"bloodyowl.json\",\n        name: \"bloodyowl\",\n        bio: \"bloodyowl short bio\",\n        body: \"bloodyowl long bio\",\n      },\n      id: \"authors/bloodyowl\",\n    },\n    {\n      data: {\n        filename: \"moox.json\",\n        name: \"moox\",\n        bio: \"moox short bio\",\n        body: \"moox long bio\",\n      },\n      partial: {\n        filename: \"moox.json\",\n        name: \"moox\",\n        bio: \"moox short bio\",\n        body: \"moox long bio\",\n      },\n      id: \"authors/moox\",\n    },\n    {\n      data: {\n        filename: \"introducing-1.0.0-alpha.md\",\n        date: \"2017-06-02T00:00:00.000Z\",\n        title: \"Introducing Phenomic 1.0.0 first alpha\",\n        authors: [\"bloodyowl\"],\n        body: { t: \"div\", c: [\"Hi there. Alpha blah blah.\"] },\n      },\n      partial: {\n        filename: \"introducing-1.0.0-alpha.md\",\n        date: \"2017-06-02T00:00:00.000Z\",\n        title: \"Introducing Phenomic 1.0.0 first alpha\",\n        authors: [\"bloodyowl\"],\n      },\n      id: \"news/2017/06/introducing-1.0.0-alpha\",\n    },\n    {\n      data: {\n        filename: \"acrowithbrian.com.md\",\n        title: \"Brian Cruikshank Acro\",\n        url: \"https://www.acrowithbrian.com/\",\n        source: \"https://github.com/brianrc/acrowithbrian-site\",\n        showcaseTags: [\"event\", \"blog\", \"learning\", \"business\"],\n        body: { t: \"div\" },\n      },\n      partial: {\n        filename: \"acrowithbrian.com.md\",\n        title: \"Brian Cruikshank Acro\",\n        url: \"https://www.acrowithbrian.com/\",\n        source: \"https://github.com/brianrc/acrowithbrian-site\",\n        showcaseTags: [\"event\", \"blog\", \"learning\", \"business\"],\n      },\n      id: \"showcase/entry/acrowithbrian.com\",\n    },\n    {\n      data: {\n        filename: \"anthonydugois.com__polynomic.md\",\n        title: \"Polynomic\",\n        url: \"http://anthonydugois.com/polynomic/\",\n        source: \"https://github.com/anthonydugois/polynomic\",\n        showcaseTags: [\"docs\", \"open-source\"],\n        body: { t: \"div\" },\n      },\n      partial: {\n        filename: \"anthonydugois.com__polynomic.md\",\n        title: \"Polynomic\",\n        url: \"http://anthonydugois.com/polynomic/\",\n        source: \"https://github.com/anthonydugois/polynomic\",\n        showcaseTags: [\"docs\", \"open-source\"],\n      },\n      id: \"showcase/entry/anthonydugois.com__polynomic\",\n    },\n    {\n      data: {\n        filename: \"ced.photo.md\",\n        title: \"CeD photo\",\n        url: \"https://www.ced.photo\",\n        source: \"https://github.com/xuopled/ced.photo\",\n        showcaseTags: [\"blog\", \"business\"],\n        body: { t: \"p\", c: [\"Ced.photo is a ....\"] },\n      },\n      partial: {\n        filename: \"ced.photo.md\",\n        title: \"CeD photo\",\n        url: \"https://www.ced.photo\",\n        source: \"https://github.com/xuopled/ced.photo\",\n        showcaseTags: [\"blog\", \"business\"],\n      },\n      id: \"showcase/entry/ced.photo\",\n    },\n    {\n      data: {\n        filename: \"submit.md\",\n        title: \"Submit a website/app made with Phenomic to the Showcase\",\n        body: { t: \"div\" },\n      },\n      partial: {\n        filename: \"submit.md\",\n        title: \"Submit a website/app made with Phenomic to the Showcase\",\n      },\n      id: \"showcase/submit\",\n    },\n    {\n      data: { filename: \"event.md\", name: \"Event\", body: \"like wat\" },\n      partial: { filename: \"event.md\", name: \"Event\" },\n      id: \"showcaseTags/event\",\n    },\n    {\n      data: {\n        filename: \"open-source.md\",\n        name: \"Open Source\",\n        body: \"like OSS\",\n      },\n      partial: { filename: \"open-source.md\", name: \"Open Source\" },\n      id: \"showcaseTags/open-source\",\n    },\n  ],\n  showcaseTags: [\n    {\n      data: { filename: \"event.md\", name: \"Event\", body: \"like wat\" },\n      partial: { filename: \"event.md\", name: \"Event\" },\n      id: \"event\",\n    },\n    {\n      data: {\n        filename: \"open-source.md\",\n        name: \"Open Source\",\n        body: \"like OSS\",\n      },\n      partial: { filename: \"open-source.md\", name: \"Open Source\" },\n      id: \"open-source\",\n    },\n  ],\n  showcaseTags$$default: [\n    { data: {}, partial: {}, id: \"blog\" },\n    { data: {}, partial: {}, id: \"business\" },\n    { data: {}, partial: {}, id: \"docs\" },\n    { data: {}, partial: {}, id: \"event\" },\n    { data: {}, partial: {}, id: \"learning\" },\n    { data: {}, partial: {}, id: \"open-source\" },\n  ],\n  \"showcaseTags$$name$$Open Source\": [\n    { data: {}, partial: {}, id: \"open-source\" },\n  ],\n  name$$default: [\n    { data: {}, partial: {}, id: \"Event\" },\n    { data: {}, partial: {}, id: \"Open Source\" },\n    { data: {}, partial: {}, id: \"bloodyowl\" },\n    { data: {}, partial: {}, id: \"moox\" },\n  ],\n  name$$path$$showcaseTags: [\n    { data: {}, partial: {}, id: \"Event\" },\n    { data: {}, partial: {}, id: \"Open Source\" },\n  ],\n  \"showcaseTags$$body$$like OSS\": [\n    { data: {}, partial: {}, id: \"open-source\" },\n  ],\n  body$$default: [\n    { data: {}, partial: {}, id: \"bloodyowl long bio\" },\n    { data: {}, partial: {}, id: \"like OSS\" },\n    { data: {}, partial: {}, id: \"like wat\" },\n    { data: {}, partial: {}, id: \"moox long bio\" },\n  ],\n  body$$path$$showcaseTags: [\n    { data: {}, partial: {}, id: \"like OSS\" },\n    { data: {}, partial: {}, id: \"like wat\" },\n  ],\n  \"showcaseTags/open-source.md\": [\n    {\n      data: {\n        filename: \"open-source.md\",\n        name: \"Open Source\",\n        body: \"like OSS\",\n      },\n      partial: { filename: \"open-source.md\", name: \"Open Source\" },\n      id: \"showcaseTags/open-source\",\n    },\n  ],\n  \"showcaseTags/open-source.md$$default\": [\n    { data: {}, partial: {}, id: \"showcaseTags/open-source\" },\n  ],\n  \"showcaseTags/open-source.md$$name$$Open Source\": [\n    { data: {}, partial: {}, id: \"showcaseTags/open-source\" },\n  ],\n  \"name$$path$$showcaseTags/open-source.md\": [\n    { data: {}, partial: {}, id: \"Open Source\" },\n  ],\n  \"showcaseTags/open-source.md$$body$$like OSS\": [\n    { data: {}, partial: {}, id: \"showcaseTags/open-source\" },\n  ],\n  \"body$$path$$showcaseTags/open-source.md\": [\n    { data: {}, partial: {}, id: \"like OSS\" },\n  ],\n  showcase: [\n    {\n      data: {\n        filename: \"acrowithbrian.com.md\",\n        title: \"Brian Cruikshank Acro\",\n        url: \"https://www.acrowithbrian.com/\",\n        source: \"https://github.com/brianrc/acrowithbrian-site\",\n        showcaseTags: [\"event\", \"blog\", \"learning\", \"business\"],\n        body: { t: \"div\" },\n      },\n      partial: {\n        filename: \"acrowithbrian.com.md\",\n        title: \"Brian Cruikshank Acro\",\n        url: \"https://www.acrowithbrian.com/\",\n        source: \"https://github.com/brianrc/acrowithbrian-site\",\n        showcaseTags: [\"event\", \"blog\", \"learning\", \"business\"],\n      },\n      id: \"entry/acrowithbrian.com\",\n    },\n    {\n      data: {\n        filename: \"anthonydugois.com__polynomic.md\",\n        title: \"Polynomic\",\n        url: \"http://anthonydugois.com/polynomic/\",\n        source: \"https://github.com/anthonydugois/polynomic\",\n        showcaseTags: [\"docs\", \"open-source\"],\n        body: { t: \"div\" },\n      },\n      partial: {\n        filename: \"anthonydugois.com__polynomic.md\",\n        title: \"Polynomic\",\n        url: \"http://anthonydugois.com/polynomic/\",\n        source: \"https://github.com/anthonydugois/polynomic\",\n        showcaseTags: [\"docs\", \"open-source\"],\n      },\n      id: \"entry/anthonydugois.com__polynomic\",\n    },\n    {\n      data: {\n        filename: \"ced.photo.md\",\n        title: \"CeD photo\",\n        url: \"https://www.ced.photo\",\n        source: \"https://github.com/xuopled/ced.photo\",\n        showcaseTags: [\"blog\", \"business\"],\n        body: { t: \"p\", c: [\"Ced.photo is a ....\"] },\n      },\n      partial: {\n        filename: \"ced.photo.md\",\n        title: \"CeD photo\",\n        url: \"https://www.ced.photo\",\n        source: \"https://github.com/xuopled/ced.photo\",\n        showcaseTags: [\"blog\", \"business\"],\n      },\n      id: \"entry/ced.photo\",\n    },\n    {\n      data: {\n        filename: \"submit.md\",\n        title: \"Submit a website/app made with Phenomic to the Showcase\",\n        body: { t: \"div\" },\n      },\n      partial: {\n        filename: \"submit.md\",\n        title: \"Submit a website/app made with Phenomic to the Showcase\",\n      },\n      id: \"submit\",\n    },\n  ],\n  showcase$$default: [\n    { data: {}, partial: {}, id: \"entry/acrowithbrian.com\" },\n    { data: {}, partial: {}, id: \"entry/anthonydugois.com__polynomic\" },\n    { data: {}, partial: {}, id: \"entry/ced.photo\" },\n    { data: {}, partial: {}, id: \"submit\" },\n  ],\n  \"showcase$$title$$Brian Cruikshank Acro\": [\n    { data: {}, partial: {}, id: \"entry/acrowithbrian.com\" },\n  ],\n  title$$default: [\n    { data: {}, partial: {}, id: \"Brian Cruikshank Acro\" },\n    { data: {}, partial: {}, id: \"CeD photo\" },\n    { data: {}, partial: {}, id: \"Introducing Phenomic 1.0.0 first alpha\" },\n    { data: {}, partial: {}, id: \"Polynomic\" },\n    {\n      data: {},\n      partial: {},\n      id: \"Submit a website/app made with Phenomic to the Showcase\",\n    },\n  ],\n  title$$path$$showcase: [\n    { data: {}, partial: {}, id: \"Brian Cruikshank Acro\" },\n    { data: {}, partial: {}, id: \"CeD photo\" },\n    { data: {}, partial: {}, id: \"Polynomic\" },\n    {\n      data: {},\n      partial: {},\n      id: \"Submit a website/app made with Phenomic to the Showcase\",\n    },\n  ],\n  \"showcase$$url$$https://www.acrowithbrian.com/\": [\n    { data: {}, partial: {}, id: \"entry/acrowithbrian.com\" },\n  ],\n  url$$default: [\n    { data: {}, partial: {}, id: \"http://anthonydugois.com/polynomic/\" },\n    { data: {}, partial: {}, id: \"https://www.acrowithbrian.com/\" },\n    { data: {}, partial: {}, id: \"https://www.ced.photo\" },\n  ],\n  url$$path$$showcase: [\n    { data: {}, partial: {}, id: \"http://anthonydugois.com/polynomic/\" },\n    { data: {}, partial: {}, id: \"https://www.acrowithbrian.com/\" },\n    { data: {}, partial: {}, id: \"https://www.ced.photo\" },\n  ],\n  \"showcase$$source$$https://github.com/brianrc/acrowithbrian-site\": [\n    { data: {}, partial: {}, id: \"entry/acrowithbrian.com\" },\n  ],\n  source$$default: [\n    { data: {}, partial: {}, id: \"https://github.com/anthonydugois/polynomic\" },\n    {\n      data: {},\n      partial: {},\n      id: \"https://github.com/brianrc/acrowithbrian-site\",\n    },\n    { data: {}, partial: {}, id: \"https://github.com/xuopled/ced.photo\" },\n  ],\n  source$$path$$showcase: [\n    { data: {}, partial: {}, id: \"https://github.com/anthonydugois/polynomic\" },\n    {\n      data: {},\n      partial: {},\n      id: \"https://github.com/brianrc/acrowithbrian-site\",\n    },\n    { data: {}, partial: {}, id: \"https://github.com/xuopled/ced.photo\" },\n  ],\n  showcase$$showcaseTags$$event: [\n    { data: {}, partial: {}, id: \"entry/acrowithbrian.com\" },\n  ],\n  showcaseTags$$path$$showcase: [\n    { data: {}, partial: {}, id: \"blog\" },\n    { data: {}, partial: {}, id: \"business\" },\n    { data: {}, partial: {}, id: \"docs\" },\n    { data: {}, partial: {}, id: \"event\" },\n    { data: {}, partial: {}, id: \"learning\" },\n    { data: {}, partial: {}, id: \"open-source\" },\n  ],\n  showcase$$showcaseTags$$blog: [\n    { data: {}, partial: {}, id: \"entry/acrowithbrian.com\" },\n    { data: {}, partial: {}, id: \"entry/ced.photo\" },\n  ],\n  showcase$$showcaseTags$$learning: [\n    { data: {}, partial: {}, id: \"entry/acrowithbrian.com\" },\n  ],\n  showcase$$showcaseTags$$business: [\n    { data: {}, partial: {}, id: \"entry/acrowithbrian.com\" },\n    { data: {}, partial: {}, id: \"entry/ced.photo\" },\n  ],\n  \"showcase/entry\": [\n    {\n      data: {\n        filename: \"acrowithbrian.com.md\",\n        title: \"Brian Cruikshank Acro\",\n        url: \"https://www.acrowithbrian.com/\",\n        source: \"https://github.com/brianrc/acrowithbrian-site\",\n        showcaseTags: [\"event\", \"blog\", \"learning\", \"business\"],\n        body: { t: \"div\" },\n      },\n      partial: {\n        filename: \"acrowithbrian.com.md\",\n        title: \"Brian Cruikshank Acro\",\n        url: \"https://www.acrowithbrian.com/\",\n        source: \"https://github.com/brianrc/acrowithbrian-site\",\n        showcaseTags: [\"event\", \"blog\", \"learning\", \"business\"],\n      },\n      id: \"acrowithbrian.com\",\n    },\n    {\n      data: {\n        filename: \"anthonydugois.com__polynomic.md\",\n        title: \"Polynomic\",\n        url: \"http://anthonydugois.com/polynomic/\",\n        source: \"https://github.com/anthonydugois/polynomic\",\n        showcaseTags: [\"docs\", \"open-source\"],\n        body: { t: \"div\" },\n      },\n      partial: {\n        filename: \"anthonydugois.com__polynomic.md\",\n        title: \"Polynomic\",\n        url: \"http://anthonydugois.com/polynomic/\",\n        source: \"https://github.com/anthonydugois/polynomic\",\n        showcaseTags: [\"docs\", \"open-source\"],\n      },\n      id: \"anthonydugois.com__polynomic\",\n    },\n    {\n      data: {\n        filename: \"ced.photo.md\",\n        title: \"CeD photo\",\n        url: \"https://www.ced.photo\",\n        source: \"https://github.com/xuopled/ced.photo\",\n        showcaseTags: [\"blog\", \"business\"],\n        body: { t: \"p\", c: [\"Ced.photo is a ....\"] },\n      },\n      partial: {\n        filename: \"ced.photo.md\",\n        title: \"CeD photo\",\n        url: \"https://www.ced.photo\",\n        source: \"https://github.com/xuopled/ced.photo\",\n        showcaseTags: [\"blog\", \"business\"],\n      },\n      id: \"ced.photo\",\n    },\n  ],\n  \"showcase/entry$$default\": [\n    { data: {}, partial: {}, id: \"acrowithbrian.com\" },\n    { data: {}, partial: {}, id: \"anthonydugois.com__polynomic\" },\n    { data: {}, partial: {}, id: \"ced.photo\" },\n  ],\n  \"showcase/entry$$title$$Brian Cruikshank Acro\": [\n    { data: {}, partial: {}, id: \"acrowithbrian.com\" },\n  ],\n  \"title$$path$$showcase/entry\": [\n    { data: {}, partial: {}, id: \"Brian Cruikshank Acro\" },\n    { data: {}, partial: {}, id: \"CeD photo\" },\n    { data: {}, partial: {}, id: \"Polynomic\" },\n  ],\n  \"showcase/entry$$url$$https://www.acrowithbrian.com/\": [\n    { data: {}, partial: {}, id: \"acrowithbrian.com\" },\n  ],\n  \"url$$path$$showcase/entry\": [\n    { data: {}, partial: {}, id: \"http://anthonydugois.com/polynomic/\" },\n    { data: {}, partial: {}, id: \"https://www.acrowithbrian.com/\" },\n    { data: {}, partial: {}, id: \"https://www.ced.photo\" },\n  ],\n  \"showcase/entry$$source$$https://github.com/brianrc/acrowithbrian-site\": [\n    { data: {}, partial: {}, id: \"acrowithbrian.com\" },\n  ],\n  \"source$$path$$showcase/entry\": [\n    { data: {}, partial: {}, id: \"https://github.com/anthonydugois/polynomic\" },\n    {\n      data: {},\n      partial: {},\n      id: \"https://github.com/brianrc/acrowithbrian-site\",\n    },\n    { data: {}, partial: {}, id: \"https://github.com/xuopled/ced.photo\" },\n  ],\n  \"showcase/entry$$showcaseTags$$event\": [\n    { data: {}, partial: {}, id: \"acrowithbrian.com\" },\n  ],\n  \"showcaseTags$$path$$showcase/entry\": [\n    { data: {}, partial: {}, id: \"blog\" },\n    { data: {}, partial: {}, id: \"business\" },\n    { data: {}, partial: {}, id: \"docs\" },\n    { data: {}, partial: {}, id: \"event\" },\n    { data: {}, partial: {}, id: \"learning\" },\n    { data: {}, partial: {}, id: \"open-source\" },\n  ],\n  \"showcase/entry$$showcaseTags$$blog\": [\n    { data: {}, partial: {}, id: \"acrowithbrian.com\" },\n    { data: {}, partial: {}, id: \"ced.photo\" },\n  ],\n  \"showcase/entry$$showcaseTags$$learning\": [\n    { data: {}, partial: {}, id: \"acrowithbrian.com\" },\n  ],\n  \"showcase/entry$$showcaseTags$$business\": [\n    { data: {}, partial: {}, id: \"acrowithbrian.com\" },\n    { data: {}, partial: {}, id: \"ced.photo\" },\n  ],\n  \"showcase/entry/acrowithbrian.com.md\": [\n    {\n      data: {\n        filename: \"acrowithbrian.com.md\",\n        title: \"Brian Cruikshank Acro\",\n        url: \"https://www.acrowithbrian.com/\",\n        source: \"https://github.com/brianrc/acrowithbrian-site\",\n        showcaseTags: [\"event\", \"blog\", \"learning\", \"business\"],\n        body: { t: \"div\" },\n      },\n      partial: {\n        filename: \"acrowithbrian.com.md\",\n        title: \"Brian Cruikshank Acro\",\n        url: \"https://www.acrowithbrian.com/\",\n        source: \"https://github.com/brianrc/acrowithbrian-site\",\n        showcaseTags: [\"event\", \"blog\", \"learning\", \"business\"],\n      },\n      id: \"showcase/entry/acrowithbrian.com\",\n    },\n  ],\n  \"showcase/entry/acrowithbrian.com.md$$default\": [\n    { data: {}, partial: {}, id: \"showcase/entry/acrowithbrian.com\" },\n  ],\n  \"showcase/entry/acrowithbrian.com.md$$title$$Brian Cruikshank Acro\": [\n    { data: {}, partial: {}, id: \"showcase/entry/acrowithbrian.com\" },\n  ],\n  \"title$$path$$showcase/entry/acrowithbrian.com.md\": [\n    { data: {}, partial: {}, id: \"Brian Cruikshank Acro\" },\n  ],\n  \"showcase/entry/acrowithbrian.com.md$$url$$https://www.acrowithbrian.com/\": [\n    { data: {}, partial: {}, id: \"showcase/entry/acrowithbrian.com\" },\n  ],\n  \"url$$path$$showcase/entry/acrowithbrian.com.md\": [\n    { data: {}, partial: {}, id: \"https://www.acrowithbrian.com/\" },\n  ],\n  \"showcase/entry/acrowithbrian.com.md$$source$$https://github.com/brianrc/acrowithbrian-site\": [\n    { data: {}, partial: {}, id: \"showcase/entry/acrowithbrian.com\" },\n  ],\n  \"source$$path$$showcase/entry/acrowithbrian.com.md\": [\n    {\n      data: {},\n      partial: {},\n      id: \"https://github.com/brianrc/acrowithbrian-site\",\n    },\n  ],\n  \"showcase/entry/acrowithbrian.com.md$$showcaseTags$$event\": [\n    { data: {}, partial: {}, id: \"showcase/entry/acrowithbrian.com\" },\n  ],\n  \"showcaseTags$$path$$showcase/entry/acrowithbrian.com.md\": [\n    { data: {}, partial: {}, id: \"blog\" },\n    { data: {}, partial: {}, id: \"business\" },\n    { data: {}, partial: {}, id: \"event\" },\n    { data: {}, partial: {}, id: \"learning\" },\n  ],\n  \"showcase/entry/acrowithbrian.com.md$$showcaseTags$$blog\": [\n    { data: {}, partial: {}, id: \"showcase/entry/acrowithbrian.com\" },\n  ],\n  \"showcase/entry/acrowithbrian.com.md$$showcaseTags$$learning\": [\n    { data: {}, partial: {}, id: \"showcase/entry/acrowithbrian.com\" },\n  ],\n  \"showcase/entry/acrowithbrian.com.md$$showcaseTags$$business\": [\n    { data: {}, partial: {}, id: \"showcase/entry/acrowithbrian.com\" },\n  ],\n  showcase$$title$$Polynomic: [\n    { data: {}, partial: {}, id: \"entry/anthonydugois.com__polynomic\" },\n  ],\n  \"showcase$$url$$http://anthonydugois.com/polynomic/\": [\n    { data: {}, partial: {}, id: \"entry/anthonydugois.com__polynomic\" },\n  ],\n  \"showcase$$source$$https://github.com/anthonydugois/polynomic\": [\n    { data: {}, partial: {}, id: \"entry/anthonydugois.com__polynomic\" },\n  ],\n  showcase$$showcaseTags$$docs: [\n    { data: {}, partial: {}, id: \"entry/anthonydugois.com__polynomic\" },\n  ],\n  \"showcase$$showcaseTags$$open-source\": [\n    { data: {}, partial: {}, id: \"entry/anthonydugois.com__polynomic\" },\n  ],\n  \"showcase/entry$$title$$Polynomic\": [\n    { data: {}, partial: {}, id: \"anthonydugois.com__polynomic\" },\n  ],\n  \"showcase/entry$$url$$http://anthonydugois.com/polynomic/\": [\n    { data: {}, partial: {}, id: \"anthonydugois.com__polynomic\" },\n  ],\n  \"showcase/entry$$source$$https://github.com/anthonydugois/polynomic\": [\n    { data: {}, partial: {}, id: \"anthonydugois.com__polynomic\" },\n  ],\n  \"showcase/entry$$showcaseTags$$docs\": [\n    { data: {}, partial: {}, id: \"anthonydugois.com__polynomic\" },\n  ],\n  \"showcase/entry$$showcaseTags$$open-source\": [\n    { data: {}, partial: {}, id: \"anthonydugois.com__polynomic\" },\n  ],\n  \"showcase/entry/anthonydugois.com__polynomic.md\": [\n    {\n      data: {\n        filename: \"anthonydugois.com__polynomic.md\",\n        title: \"Polynomic\",\n        url: \"http://anthonydugois.com/polynomic/\",\n        source: \"https://github.com/anthonydugois/polynomic\",\n        showcaseTags: [\"docs\", \"open-source\"],\n        body: { t: \"div\" },\n      },\n      partial: {\n        filename: \"anthonydugois.com__polynomic.md\",\n        title: \"Polynomic\",\n        url: \"http://anthonydugois.com/polynomic/\",\n        source: \"https://github.com/anthonydugois/polynomic\",\n        showcaseTags: [\"docs\", \"open-source\"],\n      },\n      id: \"showcase/entry/anthonydugois.com__polynomic\",\n    },\n  ],\n  \"showcase/entry/anthonydugois.com__polynomic.md$$default\": [\n    {\n      data: {},\n      partial: {},\n      id: \"showcase/entry/anthonydugois.com__polynomic\",\n    },\n  ],\n  \"showcase/entry/anthonydugois.com__polynomic.md$$title$$Polynomic\": [\n    {\n      data: {},\n      partial: {},\n      id: \"showcase/entry/anthonydugois.com__polynomic\",\n    },\n  ],\n  \"title$$path$$showcase/entry/anthonydugois.com__polynomic.md\": [\n    { data: {}, partial: {}, id: \"Polynomic\" },\n  ],\n  \"showcase/entry/anthonydugois.com__polynomic.md$$url$$http://anthonydugois.com/polynomic/\": [\n    {\n      data: {},\n      partial: {},\n      id: \"showcase/entry/anthonydugois.com__polynomic\",\n    },\n  ],\n  \"url$$path$$showcase/entry/anthonydugois.com__polynomic.md\": [\n    { data: {}, partial: {}, id: \"http://anthonydugois.com/polynomic/\" },\n  ],\n  \"showcase/entry/anthonydugois.com__polynomic.md$$source$$https://github.com/anthonydugois/polynomic\": [\n    {\n      data: {},\n      partial: {},\n      id: \"showcase/entry/anthonydugois.com__polynomic\",\n    },\n  ],\n  \"source$$path$$showcase/entry/anthonydugois.com__polynomic.md\": [\n    { data: {}, partial: {}, id: \"https://github.com/anthonydugois/polynomic\" },\n  ],\n  \"showcase/entry/anthonydugois.com__polynomic.md$$showcaseTags$$docs\": [\n    {\n      data: {},\n      partial: {},\n      id: \"showcase/entry/anthonydugois.com__polynomic\",\n    },\n  ],\n  \"showcaseTags$$path$$showcase/entry/anthonydugois.com__polynomic.md\": [\n    { data: {}, partial: {}, id: \"docs\" },\n    { data: {}, partial: {}, id: \"open-source\" },\n  ],\n  \"showcase/entry/anthonydugois.com__polynomic.md$$showcaseTags$$open-source\": [\n    {\n      data: {},\n      partial: {},\n      id: \"showcase/entry/anthonydugois.com__polynomic\",\n    },\n  ],\n  \"showcase$$title$$CeD photo\": [\n    { data: {}, partial: {}, id: \"entry/ced.photo\" },\n  ],\n  \"showcase$$url$$https://www.ced.photo\": [\n    { data: {}, partial: {}, id: \"entry/ced.photo\" },\n  ],\n  \"showcase$$source$$https://github.com/xuopled/ced.photo\": [\n    { data: {}, partial: {}, id: \"entry/ced.photo\" },\n  ],\n  \"showcase/entry$$title$$CeD photo\": [\n    { data: {}, partial: {}, id: \"ced.photo\" },\n  ],\n  \"showcase/entry$$url$$https://www.ced.photo\": [\n    { data: {}, partial: {}, id: \"ced.photo\" },\n  ],\n  \"showcase/entry$$source$$https://github.com/xuopled/ced.photo\": [\n    { data: {}, partial: {}, id: \"ced.photo\" },\n  ],\n  \"showcase/entry/ced.photo.md\": [\n    {\n      data: {\n        filename: \"ced.photo.md\",\n        title: \"CeD photo\",\n        url: \"https://www.ced.photo\",\n        source: \"https://github.com/xuopled/ced.photo\",\n        showcaseTags: [\"blog\", \"business\"],\n        body: { t: \"p\", c: [\"Ced.photo is a ....\"] },\n      },\n      partial: {\n        filename: \"ced.photo.md\",\n        title: \"CeD photo\",\n        url: \"https://www.ced.photo\",\n        source: \"https://github.com/xuopled/ced.photo\",\n        showcaseTags: [\"blog\", \"business\"],\n      },\n      id: \"showcase/entry/ced.photo\",\n    },\n  ],\n  \"showcase/entry/ced.photo.md$$default\": [\n    { data: {}, partial: {}, id: \"showcase/entry/ced.photo\" },\n  ],\n  \"showcase/entry/ced.photo.md$$title$$CeD photo\": [\n    { data: {}, partial: {}, id: \"showcase/entry/ced.photo\" },\n  ],\n  \"title$$path$$showcase/entry/ced.photo.md\": [\n    { data: {}, partial: {}, id: \"CeD photo\" },\n  ],\n  \"showcase/entry/ced.photo.md$$url$$https://www.ced.photo\": [\n    { data: {}, partial: {}, id: \"showcase/entry/ced.photo\" },\n  ],\n  \"url$$path$$showcase/entry/ced.photo.md\": [\n    { data: {}, partial: {}, id: \"https://www.ced.photo\" },\n  ],\n  \"showcase/entry/ced.photo.md$$source$$https://github.com/xuopled/ced.photo\": [\n    { data: {}, partial: {}, id: \"showcase/entry/ced.photo\" },\n  ],\n  \"source$$path$$showcase/entry/ced.photo.md\": [\n    { data: {}, partial: {}, id: \"https://github.com/xuopled/ced.photo\" },\n  ],\n  \"showcase/entry/ced.photo.md$$showcaseTags$$blog\": [\n    { data: {}, partial: {}, id: \"showcase/entry/ced.photo\" },\n  ],\n  \"showcaseTags$$path$$showcase/entry/ced.photo.md\": [\n    { data: {}, partial: {}, id: \"blog\" },\n    { data: {}, partial: {}, id: \"business\" },\n  ],\n  \"showcase/entry/ced.photo.md$$showcaseTags$$business\": [\n    { data: {}, partial: {}, id: \"showcase/entry/ced.photo\" },\n  ],\n  news: [\n    {\n      data: {\n        filename: \"introducing-1.0.0-alpha.md\",\n        date: \"2017-06-02T00:00:00.000Z\",\n        title: \"Introducing Phenomic 1.0.0 first alpha\",\n        authors: [\"bloodyowl\"],\n        body: { t: \"div\", c: [\"Hi there. Alpha blah blah.\"] },\n      },\n      partial: {\n        filename: \"introducing-1.0.0-alpha.md\",\n        date: \"2017-06-02T00:00:00.000Z\",\n        title: \"Introducing Phenomic 1.0.0 first alpha\",\n        authors: [\"bloodyowl\"],\n      },\n      id: \"2017/06/introducing-1.0.0-alpha\",\n    },\n  ],\n  news$$default: [\n    { data: {}, partial: {}, id: \"2017/06/introducing-1.0.0-alpha\" },\n  ],\n  \"news$$date$$2017-06-02T00:00:00.000Z\": [\n    { data: {}, partial: {}, id: \"2017/06/introducing-1.0.0-alpha\" },\n  ],\n  date$$default: [{ data: {}, partial: {}, id: \"2017-06-02T00:00:00.000Z\" }],\n  date$$path$$news: [{ data: {}, partial: {}, id: \"2017-06-02T00:00:00.000Z\" }],\n  \"news$$title$$Introducing Phenomic 1.0.0 first alpha\": [\n    { data: {}, partial: {}, id: \"2017/06/introducing-1.0.0-alpha\" },\n  ],\n  title$$path$$news: [\n    { data: {}, partial: {}, id: \"Introducing Phenomic 1.0.0 first alpha\" },\n  ],\n  news$$authors$$bloodyowl: [\n    { data: {}, partial: {}, id: \"2017/06/introducing-1.0.0-alpha\" },\n  ],\n  authors$$default: [\n    { data: {}, partial: {}, id: \"bloodyowl\" },\n    { data: {}, partial: {}, id: \"moox\" },\n  ],\n  authors$$path$$news: [{ data: {}, partial: {}, id: \"bloodyowl\" }],\n  \"news/2017\": [\n    {\n      data: {\n        filename: \"introducing-1.0.0-alpha.md\",\n        date: \"2017-06-02T00:00:00.000Z\",\n        title: \"Introducing Phenomic 1.0.0 first alpha\",\n        authors: [\"bloodyowl\"],\n        body: { t: \"div\", c: [\"Hi there. Alpha blah blah.\"] },\n      },\n      partial: {\n        filename: \"introducing-1.0.0-alpha.md\",\n        date: \"2017-06-02T00:00:00.000Z\",\n        title: \"Introducing Phenomic 1.0.0 first alpha\",\n        authors: [\"bloodyowl\"],\n      },\n      id: \"06/introducing-1.0.0-alpha\",\n    },\n  ],\n  \"news/2017$$default\": [\n    { data: {}, partial: {}, id: \"06/introducing-1.0.0-alpha\" },\n  ],\n  \"news/2017$$date$$2017-06-02T00:00:00.000Z\": [\n    { data: {}, partial: {}, id: \"06/introducing-1.0.0-alpha\" },\n  ],\n  \"date$$path$$news/2017\": [\n    { data: {}, partial: {}, id: \"2017-06-02T00:00:00.000Z\" },\n  ],\n  \"news/2017$$title$$Introducing Phenomic 1.0.0 first alpha\": [\n    { data: {}, partial: {}, id: \"06/introducing-1.0.0-alpha\" },\n  ],\n  \"title$$path$$news/2017\": [\n    { data: {}, partial: {}, id: \"Introducing Phenomic 1.0.0 first alpha\" },\n  ],\n  \"news/2017$$authors$$bloodyowl\": [\n    { data: {}, partial: {}, id: \"06/introducing-1.0.0-alpha\" },\n  ],\n  \"authors$$path$$news/2017\": [{ data: {}, partial: {}, id: \"bloodyowl\" }],\n  \"news/2017/06\": [\n    {\n      data: {\n        filename: \"introducing-1.0.0-alpha.md\",\n        date: \"2017-06-02T00:00:00.000Z\",\n        title: \"Introducing Phenomic 1.0.0 first alpha\",\n        authors: [\"bloodyowl\"],\n        body: { t: \"div\", c: [\"Hi there. Alpha blah blah.\"] },\n      },\n      partial: {\n        filename: \"introducing-1.0.0-alpha.md\",\n        date: \"2017-06-02T00:00:00.000Z\",\n        title: \"Introducing Phenomic 1.0.0 first alpha\",\n        authors: [\"bloodyowl\"],\n      },\n      id: \"introducing-1.0.0-alpha\",\n    },\n  ],\n  \"news/2017/06$$default\": [\n    { data: {}, partial: {}, id: \"introducing-1.0.0-alpha\" },\n  ],\n  \"news/2017/06$$date$$2017-06-02T00:00:00.000Z\": [\n    { data: {}, partial: {}, id: \"introducing-1.0.0-alpha\" },\n  ],\n  \"date$$path$$news/2017/06\": [\n    { data: {}, partial: {}, id: \"2017-06-02T00:00:00.000Z\" },\n  ],\n  \"news/2017/06$$title$$Introducing Phenomic 1.0.0 first alpha\": [\n    { data: {}, partial: {}, id: \"introducing-1.0.0-alpha\" },\n  ],\n  \"title$$path$$news/2017/06\": [\n    { data: {}, partial: {}, id: \"Introducing Phenomic 1.0.0 first alpha\" },\n  ],\n  \"news/2017/06$$authors$$bloodyowl\": [\n    { data: {}, partial: {}, id: \"introducing-1.0.0-alpha\" },\n  ],\n  \"authors$$path$$news/2017/06\": [{ data: {}, partial: {}, id: \"bloodyowl\" }],\n  \"news/2017/06/introducing-1.0.0-alpha.md\": [\n    {\n      data: {\n        filename: \"introducing-1.0.0-alpha.md\",\n        date: \"2017-06-02T00:00:00.000Z\",\n        title: \"Introducing Phenomic 1.0.0 first alpha\",\n        authors: [\"bloodyowl\"],\n        body: { t: \"div\", c: [\"Hi there. Alpha blah blah.\"] },\n      },\n      partial: {\n        filename: \"introducing-1.0.0-alpha.md\",\n        date: \"2017-06-02T00:00:00.000Z\",\n        title: \"Introducing Phenomic 1.0.0 first alpha\",\n        authors: [\"bloodyowl\"],\n      },\n      id: \"news/2017/06/introducing-1.0.0-alpha\",\n    },\n  ],\n  \"news/2017/06/introducing-1.0.0-alpha.md$$default\": [\n    { data: {}, partial: {}, id: \"news/2017/06/introducing-1.0.0-alpha\" },\n  ],\n  \"news/2017/06/introducing-1.0.0-alpha.md$$date$$2017-06-02T00:00:00.000Z\": [\n    { data: {}, partial: {}, id: \"news/2017/06/introducing-1.0.0-alpha\" },\n  ],\n  \"date$$path$$news/2017/06/introducing-1.0.0-alpha.md\": [\n    { data: {}, partial: {}, id: \"2017-06-02T00:00:00.000Z\" },\n  ],\n  \"news/2017/06/introducing-1.0.0-alpha.md$$title$$Introducing Phenomic 1.0.0 first alpha\": [\n    { data: {}, partial: {}, id: \"news/2017/06/introducing-1.0.0-alpha\" },\n  ],\n  \"title$$path$$news/2017/06/introducing-1.0.0-alpha.md\": [\n    { data: {}, partial: {}, id: \"Introducing Phenomic 1.0.0 first alpha\" },\n  ],\n  \"news/2017/06/introducing-1.0.0-alpha.md$$authors$$bloodyowl\": [\n    { data: {}, partial: {}, id: \"news/2017/06/introducing-1.0.0-alpha\" },\n  ],\n  \"authors$$path$$news/2017/06/introducing-1.0.0-alpha.md\": [\n    { data: {}, partial: {}, id: \"bloodyowl\" },\n  ],\n  \"showcase$$title$$Submit a website/app made with Phenomic to the Showcase\": [\n    { data: {}, partial: {}, id: \"submit\" },\n  ],\n  \"showcase/submit.md\": [\n    {\n      data: {\n        filename: \"submit.md\",\n        title: \"Submit a website/app made with Phenomic to the Showcase\",\n        body: { t: \"div\" },\n      },\n      partial: {\n        filename: \"submit.md\",\n        title: \"Submit a website/app made with Phenomic to the Showcase\",\n      },\n      id: \"showcase/submit\",\n    },\n  ],\n  \"showcase/submit.md$$default\": [\n    { data: {}, partial: {}, id: \"showcase/submit\" },\n  ],\n  \"showcase/submit.md$$title$$Submit a website/app made with Phenomic to the Showcase\": [\n    { data: {}, partial: {}, id: \"showcase/submit\" },\n  ],\n  \"title$$path$$showcase/submit.md\": [\n    {\n      data: {},\n      partial: {},\n      id: \"Submit a website/app made with Phenomic to the Showcase\",\n    },\n  ],\n  authors: [\n    {\n      data: {\n        filename: \"bloodyowl.json\",\n        name: \"bloodyowl\",\n        bio: \"bloodyowl short bio\",\n        body: \"bloodyowl long bio\",\n      },\n      partial: {\n        filename: \"bloodyowl.json\",\n        name: \"bloodyowl\",\n        bio: \"bloodyowl short bio\",\n        body: \"bloodyowl long bio\",\n      },\n      id: \"bloodyowl\",\n    },\n    {\n      data: {\n        filename: \"moox.json\",\n        name: \"moox\",\n        bio: \"moox short bio\",\n        body: \"moox long bio\",\n      },\n      partial: {\n        filename: \"moox.json\",\n        name: \"moox\",\n        bio: \"moox short bio\",\n        body: \"moox long bio\",\n      },\n      id: \"moox\",\n    },\n  ],\n  authors$$name$$moox: [{ data: {}, partial: {}, id: \"moox\" }],\n  name$$path$$authors: [\n    { data: {}, partial: {}, id: \"bloodyowl\" },\n    { data: {}, partial: {}, id: \"moox\" },\n  ],\n  \"authors$$bio$$moox short bio\": [{ data: {}, partial: {}, id: \"moox\" }],\n  bio$$default: [\n    { data: {}, partial: {}, id: \"bloodyowl short bio\" },\n    { data: {}, partial: {}, id: \"moox short bio\" },\n  ],\n  bio$$path$$authors: [\n    { data: {}, partial: {}, id: \"bloodyowl short bio\" },\n    { data: {}, partial: {}, id: \"moox short bio\" },\n  ],\n  \"authors$$body$$moox long bio\": [{ data: {}, partial: {}, id: \"moox\" }],\n  body$$path$$authors: [\n    { data: {}, partial: {}, id: \"bloodyowl long bio\" },\n    { data: {}, partial: {}, id: \"moox long bio\" },\n  ],\n  \"authors/moox.json\": [\n    {\n      data: {\n        filename: \"moox.json\",\n        name: \"moox\",\n        bio: \"moox short bio\",\n        body: \"moox long bio\",\n      },\n      partial: {\n        filename: \"moox.json\",\n        name: \"moox\",\n        bio: \"moox short bio\",\n        body: \"moox long bio\",\n      },\n      id: \"authors/moox\",\n    },\n  ],\n  \"authors/moox.json$$default\": [{ data: {}, partial: {}, id: \"authors/moox\" }],\n  \"authors/moox.json$$name$$moox\": [\n    { data: {}, partial: {}, id: \"authors/moox\" },\n  ],\n  \"name$$path$$authors/moox.json\": [{ data: {}, partial: {}, id: \"moox\" }],\n  \"authors/moox.json$$bio$$moox short bio\": [\n    { data: {}, partial: {}, id: \"authors/moox\" },\n  ],\n  \"bio$$path$$authors/moox.json\": [\n    { data: {}, partial: {}, id: \"moox short bio\" },\n  ],\n  \"authors/moox.json$$body$$moox long bio\": [\n    { data: {}, partial: {}, id: \"authors/moox\" },\n  ],\n  \"body$$path$$authors/moox.json\": [\n    { data: {}, partial: {}, id: \"moox long bio\" },\n  ],\n  authors$$name$$bloodyowl: [{ data: {}, partial: {}, id: \"bloodyowl\" }],\n  \"authors$$bio$$bloodyowl short bio\": [\n    { data: {}, partial: {}, id: \"bloodyowl\" },\n  ],\n  \"authors$$body$$bloodyowl long bio\": [\n    { data: {}, partial: {}, id: \"bloodyowl\" },\n  ],\n  \"authors/bloodyowl.json\": [\n    {\n      data: {\n        filename: \"bloodyowl.json\",\n        name: \"bloodyowl\",\n        bio: \"bloodyowl short bio\",\n        body: \"bloodyowl long bio\",\n      },\n      partial: {\n        filename: \"bloodyowl.json\",\n        name: \"bloodyowl\",\n        bio: \"bloodyowl short bio\",\n        body: \"bloodyowl long bio\",\n      },\n      id: \"authors/bloodyowl\",\n    },\n  ],\n  \"authors/bloodyowl.json$$default\": [\n    { data: {}, partial: {}, id: \"authors/bloodyowl\" },\n  ],\n  \"authors/bloodyowl.json$$name$$bloodyowl\": [\n    { data: {}, partial: {}, id: \"authors/bloodyowl\" },\n  ],\n  \"name$$path$$authors/bloodyowl.json\": [\n    { data: {}, partial: {}, id: \"bloodyowl\" },\n  ],\n  \"authors/bloodyowl.json$$bio$$bloodyowl short bio\": [\n    { data: {}, partial: {}, id: \"authors/bloodyowl\" },\n  ],\n  \"bio$$path$$authors/bloodyowl.json\": [\n    { data: {}, partial: {}, id: \"bloodyowl short bio\" },\n  ],\n  \"authors/bloodyowl.json$$body$$bloodyowl long bio\": [\n    { data: {}, partial: {}, id: \"authors/bloodyowl\" },\n  ],\n  \"body$$path$$authors/bloodyowl.json\": [\n    { data: {}, partial: {}, id: \"bloodyowl long bio\" },\n  ],\n  showcaseTags$$name$$Event: [{ data: {}, partial: {}, id: \"event\" }],\n  \"showcaseTags$$body$$like wat\": [{ data: {}, partial: {}, id: \"event\" }],\n  \"showcaseTags/event.md\": [\n    {\n      data: { filename: \"event.md\", name: \"Event\", body: \"like wat\" },\n      partial: { filename: \"event.md\", name: \"Event\" },\n      id: \"showcaseTags/event\",\n    },\n  ],\n  \"showcaseTags/event.md$$default\": [\n    { data: {}, partial: {}, id: \"showcaseTags/event\" },\n  ],\n  \"showcaseTags/event.md$$name$$Event\": [\n    { data: {}, partial: {}, id: \"showcaseTags/event\" },\n  ],\n  \"name$$path$$showcaseTags/event.md\": [{ data: {}, partial: {}, id: \"Event\" }],\n  \"showcaseTags/event.md$$body$$like wat\": [\n    { data: {}, partial: {}, id: \"showcaseTags/event\" },\n  ],\n  \"body$$path$$showcaseTags/event.md\": [\n    { data: {}, partial: {}, id: \"like wat\" },\n  ],\n};\n"
  },
  {
    "path": "packages/core/src/db/__tests__/__snapshots__/index-test.js.snap",
    "content": "// Jest Snapshot v1, https://goo.gl/fbAQLP\n\nexports[`db should be able to get a list 1`] = `\nArray [\n  Object {\n    \"id\": \"baz\",\n    \"title\": \"title-baz\",\n  },\n  Object {\n    \"id\": \"foo\",\n    \"title\": \"title-foo\",\n  },\n]\n`;\n\nexports[`db should be able to get a list after (starting) some value 1`] = `\nArray [\n  Object {\n    \"id\": \"eoo\",\n    \"title\": \"title-eoo\",\n  },\n  Object {\n    \"id\": \"foo\",\n    \"title\": \"title-foo\",\n  },\n]\n`;\n\nexports[`db should be able to get a list after some value 1`] = `\nArray [\n  Object {\n    \"id\": \"foo\",\n    \"title\": \"title-foo\",\n  },\n]\n`;\n\nexports[`db should be able to get a list before (starting) some value 1`] = `\nArray [\n  Object {\n    \"id\": \"baz\",\n    \"title\": \"title-baz\",\n  },\n  Object {\n    \"id\": \"eoo\",\n    \"title\": \"title-eoo\",\n  },\n]\n`;\n\nexports[`db should be able to get a list before some value 1`] = `\nArray [\n  Object {\n    \"id\": \"baz\",\n    \"title\": \"title-baz\",\n  },\n]\n`;\n\nexports[`db should be able to get a list with a limited count 1`] = `\nArray [\n  Object {\n    \"id\": \"baz\",\n    \"title\": \"title-baz\",\n  },\n]\n`;\n\nexports[`db should be able to get a list with a specific query 1`] = `\nArray [\n  Object {\n    \"id\": \"bar\",\n    \"title\": \"title-bar\",\n  },\n  Object {\n    \"id\": \"foo\",\n    \"title\": \"title-foo\",\n  },\n]\n`;\n\nexports[`db should be able to get a reversed list 1`] = `\nArray [\n  Object {\n    \"id\": \"foo\",\n    \"title\": \"title-foo\",\n  },\n  Object {\n    \"id\": \"baz\",\n    \"title\": \"title-baz\",\n  },\n]\n`;\n\nexports[`db should be able to get an item with relations 1`] = `\nObject {\n  \"id\": \"foo\",\n  \"value\": Object {\n    \"authors1\": Array [\n      Object {\n        \"id\": \"foo\",\n        \"name\": \"foo-name\",\n      },\n    ],\n  },\n}\n`;\n\nexports[`db should be able to put & get a value 1`] = `\nObject {\n  \"id\": \"bar\",\n  \"value\": Object {\n    \"title\": \"bar\",\n  },\n}\n`;\n\nexports[`db should throw when value isn't there 1`] = `[NotFoundError: ID 'baz' not found in database ('error')]`;\n"
  },
  {
    "path": "packages/core/src/db/__tests__/index-test.js",
    "content": "// @flow\n\nimport createDB from \"..\";\n\nconst db = createDB({});\n\ndescribe(\"db\", () => {\n  beforeEach(() => {\n    // $FlowFixMe whatever\n    jest.resetModuleRegistry();\n  });\n\n  it(\"should be able to put & get a value\", () => {\n    return Promise.all([\n      db.put(\"collection-1\", \"bar\", {\n        data: { title: \"bar\" },\n        partial: { title: \"bar\" },\n      }),\n    ])\n      .then(() => db.get(\"collection-1\", \"bar\"))\n      .then(value => expect(value).toMatchSnapshot());\n  });\n\n  it(\"should be able to get an item with relations\", () => {\n    i++;\n    return Promise.all([\n      db.put(\"authors\" + i, \"foo\", {\n        data: { name: \"foo-name\", bio: \"foo-bio\" },\n        partial: { name: \"foo-name\" },\n      }),\n      db.put(\"bar\" + i, \"foo\", {\n        data: { [\"authors\" + i]: [\"foo\"] },\n        partial: { [\"authors\" + i]: [\"foo\"] },\n      }),\n    ])\n      .then(() => db.get(\"bar\" + i, \"foo\"))\n      .then(value => expect(value).toMatchSnapshot());\n  });\n\n  let i = 0;\n\n  it(\"should be able to get a list\", () => {\n    return Promise.all([\n      db.put(\"test-list\", \"baz\", { data: {}, partial: { title: \"title-baz\" } }),\n      db.put(\"test-list\", \"foo\", { data: {}, partial: { title: \"title-foo\" } }),\n    ])\n      .then(() => db.getList(\"test-list\", {}, \"default\", \"\"))\n      .then(value => expect(value).toMatchSnapshot());\n  });\n\n  it(\"should be able to get a reversed list\", () => {\n    return Promise.all([\n      db.put(\"test-reversed-list\", \"baz\", {\n        data: {},\n        partial: { title: \"title-baz\" },\n      }),\n      db.put(\"test-reversed-list\", \"foo\", {\n        data: {},\n        partial: { title: \"title-foo\" },\n      }),\n    ])\n      .then(() =>\n        db.getList(\"test-reversed-list\", { reverse: true }, \"default\", \"\"),\n      )\n      .then(value => expect(value).toMatchSnapshot());\n  });\n\n  it(\"should be able to get a list after (starting) some value\", () => {\n    return Promise.all([\n      db.put(\"test-gte-list\", \"baz\", {\n        data: {},\n        partial: { title: \"title-baz\" },\n      }),\n      db.put(\"test-gte-list\", \"eoo\", {\n        data: {},\n        partial: { title: \"title-eoo\" },\n      }),\n      db.put(\"test-gte-list\", \"foo\", {\n        data: {},\n        partial: { title: \"title-foo\" },\n      }),\n    ])\n      .then(() => db.getList(\"test-gte-list\", { gte: \"eoo\" }, \"default\", \"\"))\n      .then(value => expect(value).toMatchSnapshot());\n  });\n\n  it(\"should be able to get a list after some value\", () => {\n    return Promise.all([\n      db.put(\"test-gt-list\", \"baz\", {\n        data: {},\n        partial: { title: \"title-baz\" },\n      }),\n      db.put(\"test-gt-list\", \"eoo\", {\n        data: {},\n        partial: { title: \"title-eoo\" },\n      }),\n      db.put(\"test-gt-list\", \"foo\", {\n        data: {},\n        partial: { title: \"title-foo\" },\n      }),\n    ])\n      .then(() => db.getList(\"test-gt-list\", { gt: \"eoo\" }, \"default\", \"\"))\n      .then(value => expect(value).toMatchSnapshot());\n  });\n\n  it(\"should be able to get a list before (starting) some value\", () => {\n    return Promise.all([\n      db.put(\"test-lte-list\", \"baz\", {\n        data: {},\n        partial: { title: \"title-baz\" },\n      }),\n      db.put(\"test-lte-list\", \"eoo\", {\n        data: {},\n        partial: { title: \"title-eoo\" },\n      }),\n      db.put(\"test-lte-list\", \"foo\", {\n        data: {},\n        partial: { title: \"title-foo\" },\n      }),\n    ])\n      .then(() => db.getList(\"test-lte-list\", { lte: \"eoo\" }, \"default\", \"\"))\n      .then(value => expect(value).toMatchSnapshot());\n  });\n\n  it(\"should be able to get a list before some value\", () => {\n    return Promise.all([\n      db.put(\"test-lt-list\", \"baz\", {\n        data: {},\n        partial: { title: \"title-baz\" },\n      }),\n      db.put(\"test-lt-list\", \"eoo\", {\n        data: {},\n        partial: { title: \"title-eoo\" },\n      }),\n      db.put(\"test-lt-list\", \"foo\", {\n        data: {},\n        partial: { title: \"title-foo\" },\n      }),\n    ])\n      .then(() => db.getList(\"test-lt-list\", { lt: \"eoo\" }, \"default\", \"\"))\n      .then(value => expect(value).toMatchSnapshot());\n  });\n\n  it(\"should be able to get a list with a limited count\", () => {\n    return Promise.all([\n      db.put(\"test-limit-list\", \"baz\", {\n        data: {},\n        partial: { title: \"title-baz\" },\n      }),\n      db.put(\"test-limit-list\", \"foo\", {\n        data: {},\n        partial: { title: \"title-foo\" },\n      }),\n    ])\n      .then(() => db.getList(\"test-limit-list\", { limit: 1 }, \"default\", \"\"))\n      .then(value => expect(value).toMatchSnapshot());\n  });\n\n  it(\"should throw when value isn't there\", () => {\n    try {\n      db.get(\"error\", \"baz\");\n    } catch (error) {\n      expect(error).toMatchSnapshot();\n    }\n  });\n\n  it(\"should be able to get a list with a specific query\", () => {\n    return Promise.all([\n      db.put(\"test-query-list\", \"foo\", {\n        data: { title: \"title-foo\", tags: [\"a\", \"b\"] },\n        partial: { title: \"title-foo\" },\n      }),\n      db.put(\"test-query-list\", \"bar\", {\n        data: { title: \"title-bar\", tags: [\"a\", \"c\"] },\n        partial: { title: \"title-bar\" },\n      }),\n      db.put(\"test-query-list\", \"baz\", {\n        data: { title: \"title-baz\", tags: [\"b\", \"c\"] },\n        partial: { title: \"title-baz\" },\n      }),\n    ])\n      .then(() => db.getList(\"test-query-list\", {}, \"tags\", \"a\"))\n      .then(value => expect(value).toMatchSnapshot());\n  });\n});\n"
  },
  {
    "path": "packages/core/src/db/index.js",
    "content": "// @flow\n\nimport merge from \"deep-assign\";\n\nconst glue = \"$$\";\nconst nullSub = \"__null__\";\nconst emptyDatabase: PhenomicDBRegistry = {};\nlet database: PhenomicDBRegistry = emptyDatabase;\n\nconst orderById = (a, b) => (b.id > a.id ? -1 : 1);\n\n// if you update this function, please update docs/configuration.md section\nfunction defaultSort(sort = \"date\") {\n  return (a, b) => {\n    // sort by asked flag\n    const va = a.data[sort];\n    const vb = b.data[sort];\n    if (!va && vb) return -1;\n    if (!vb && va) return 1;\n    if (va && vb && vb > va) return -1;\n    if (va && vb && va > vb) return 1;\n\n    // fallbacks instead of weird order\n    // sort by title\n    if (b.data.title > a.data.title) return -1;\n    if (a.data.title > b.data.title) return 1;\n\n    // or sort by filename\n    if (b.data.filename > a.data.filename) return -1;\n    if (a.data.filename > b.data.filename) return 1;\n    return 0;\n  };\n}\n\nfunction getSublevel(\n  sub: null | string | $ReadOnlyArray<string>,\n  filter: ?string,\n  filterValue: ?string,\n) {\n  if (!Array.isArray(sub)) {\n    sub = [sub === null ? nullSub : sub];\n  }\n  let db = database[sub.join(glue)] || [];\n  if (filter && filterValue && filter !== \"default\") {\n    db = db.filter(item => {\n      if (Array.isArray(item.data[filter])) {\n        return item.data[filter].indexOf(filterValue) > -1;\n      }\n      return item.data[filter] === filterValue;\n    });\n  }\n  return db;\n}\n\nfunction putToSublevel(\n  subName: null | string | $ReadOnlyArray<string>,\n  value: PhenomicDBEntry,\n) {\n  if (!Array.isArray(subName)) {\n    subName = [subName === null ? nullSub : subName];\n  }\n  const subname = subName.join(glue);\n  const sub = database[subname] || [];\n  database = {\n    ...database,\n    [subname]: [...sub.filter(item => item.id !== value.id), value].sort(\n      orderById,\n    ),\n  };\n}\n\nfunction updateToSublevel(\n  subName: null | string | $ReadOnlyArray<string>,\n  value: PhenomicDBEntry,\n) {\n  if (!Array.isArray(subName)) {\n    subName = [subName === null ? nullSub : subName];\n  }\n  const subname = subName.join(glue);\n  const sub = database[subname] || [];\n  database = {\n    ...database,\n    [subname]: [\n      ...sub.filter(item => item.id !== value.id),\n      merge({}, sub.find(item => item.id === value.id) || {}, value),\n    ].sort(orderById),\n  };\n}\n\nclass NotFoundError extends Error {\n  constructor(...args) {\n    super(...args);\n    this.name = \"NotFoundError\";\n  }\n}\n\nconst createDB = (dbConfig: PhenomicDBConfig) => {\n  const db = {\n    _getDatabase(): PhenomicDBRegistry {\n      return database;\n    },\n    _setDatabase(newDb: PhenomicDBRegistry) {\n      database = newDb;\n    },\n    destroy() {\n      database = emptyDatabase;\n    },\n    put(\n      sub: null | string | $ReadOnlyArray<string>,\n      id: string,\n      value: PhenomicDBEntryInput = { data: {}, partial: {} },\n    ) {\n      putToSublevel(sub, {\n        data: value.data,\n        partial: value.partial,\n        id,\n      });\n    },\n    update(\n      sub: null | string | $ReadOnlyArray<string>,\n      id: string,\n      value: PhenomicDBEntryInput = { data: {}, partial: {} },\n    ) {\n      updateToSublevel(sub, {\n        data: value.data,\n        partial: value.partial,\n        id,\n      });\n    },\n    get(\n      sub: null | string | $ReadOnlyArray<string>,\n      id: string,\n    ): PhenomicDBEntryDetailed {\n      const item = getSublevel(sub).find(item => item.id === id);\n      if (typeof item === \"undefined\") {\n        throw new NotFoundError(\n          `ID '${id}' not found in database ('${String(sub)}')`,\n        );\n      }\n      const { body, ...metadata } = item.data;\n      const relatedData = getDataRelations(metadata);\n      return {\n        id: id,\n        value: {\n          ...relatedData,\n          ...(body ? { body } : {}),\n        },\n      };\n    },\n    getPartial(\n      sub: null | string | $ReadOnlyArray<string>,\n      id: string,\n    ): mixed | PhenomicDBEntryPartial {\n      const item = getSublevel(sub).find(item => item.id === id);\n      if (!item) {\n        return id;\n      }\n      const type = typeof item.partial;\n      if (type === \"string\" || type === \"number\" || type === \"boolean\") {\n        return item.partial;\n      }\n      return { id, ...item.partial };\n    },\n\n    getList(\n      sub: null | string | $ReadOnlyArray<string>,\n      query: {\n        gt?: string,\n        gte?: string,\n        lt?: string,\n        lte?: string,\n        limit?: number,\n        sort?: string,\n        reverse?: boolean,\n      } = {},\n      filter: string = \"default\",\n      filterValue: string = \"\",\n    ): $ReadOnlyArray<any> {\n      let collection = getSublevel(sub, filter, filterValue);\n      collection.sort(\n        dbConfig.sortFunctions &&\n        query.sort &&\n        dbConfig.sortFunctions[query.sort]\n          ? dbConfig.sortFunctions[query.sort]\n          : defaultSort(query.sort),\n      );\n      if (query.reverse) {\n        collection = collection.concat().reverse();\n      }\n      if (query.gte) {\n        const index = collection.findIndex(item => item.id === query.gte);\n        collection = index > -1 ? collection.slice(index) : collection;\n      } else if (query.gt) {\n        const index = collection.findIndex(item => item.id === query.gt);\n        collection = index > -1 ? collection.slice(index + 1) : collection;\n      } else if (query.lte) {\n        const index = collection.findIndex(item => item.id === query.lte);\n        collection = index > -1 ? collection.slice(0, index + 1) : collection;\n      } else if (query.lt) {\n        const index = collection.findIndex(item => item.id === query.lt);\n        collection = index > -1 ? collection.slice(0, index) : collection;\n      }\n      if (typeof query.limit === \"number\") {\n        collection = collection.slice(\n          0,\n          Math.min(query.limit, collection.length),\n        );\n      }\n\n      return collection.map(item => {\n        const value = db.getPartial(sub, item.id);\n        const type = typeof value;\n        if (\n          type === \"string\" ||\n          type === \"number\" ||\n          type === \"boolean\" ||\n          Array.isArray(value)\n        ) {\n          return {\n            id: item.id,\n            value,\n          };\n        }\n        return {\n          ...value,\n          id: item.id,\n        };\n      });\n    },\n  };\n\n  function getDataRelation(fieldName, ids) {\n    try {\n      if (Array.isArray(ids)) {\n        return ids.map(id => db.getPartial(fieldName, id));\n      }\n      return db.getPartial(fieldName, ids);\n    } catch (error) {\n      return ids;\n    }\n  }\n\n  function getDataRelations(fields) {\n    const ids = Object.keys(fields);\n    const resolvedValues = ids.map(id => getDataRelation(id, fields[id]));\n    return ids.reduce((resolvedFields, id, index) => {\n      resolvedFields[id] = resolvedValues[index];\n      return resolvedFields;\n    }, {});\n  }\n\n  return db;\n};\n\nexport default createDB;\n"
  },
  {
    "path": "packages/core/src/defaultConfig.js",
    "content": "// @flow\n\nimport normalizeBaseUrl from \"./configuration/normalize-base-url.js\";\n\nconst defaultConfig: PhenomicConfig = {\n  baseUrl: normalizeBaseUrl(\"http://localhost\"),\n  path: process.cwd(),\n  content: { content: [\"**/*\"] },\n  outdir: \"dist\",\n  port: 3333,\n  socketPort: 3334,\n  bundleName: \"phenomic.main\",\n  db: {},\n  plugins: [],\n};\nexport default defaultConfig;\n"
  },
  {
    "path": "packages/core/src/index.js",
    "content": "// @flow\n\nimport cosmiconfig from \"cosmiconfig\";\nimport serve from \"serve\";\n\nimport flattenConfiguration from \"./configuration/flattenConfiguration.js\";\nimport start from \"./commands/start.js\";\nimport build from \"./commands/build.js\";\nimport log from \"./utils/log.js\";\n\nconst handleError = error => {\n  if (error.message) log.error(error.message);\n  if (error.stack) log.error(error.stack);\n  process.exit(1);\n};\n\nfunction normalizeConfiguration(\n  config?: PhenomicInputConfig,\n): Promise<PhenomicConfig> {\n  const configExplorer = cosmiconfig(\"phenomic\", { cache: false });\n  return configExplorer\n    .load(process.cwd())\n    .then(result => {\n      if (result === null) {\n        throw new Error(\n          \"No configuration file found. Please add a 'phenomic' section in package.json or \" +\n            \"create a file named .phenomicrc(.json|.yaml)? or phenomic.config.js.\" +\n            \"\\nSee https://phenomic.io/en/packages/core/docs/configuration/\",\n        );\n      }\n      return flattenConfiguration({\n        ...result.config,\n        ...(config || {}),\n      });\n    })\n    .catch(handleError);\n}\n\nexport default {\n  start(inputConfig?: PhenomicInputConfig) {\n    normalizeConfiguration(inputConfig)\n      .then(start)\n      .catch(handleError);\n  },\n  build(inputConfig?: PhenomicInputConfig) {\n    normalizeConfiguration(inputConfig)\n      .then(build)\n      .catch(handleError);\n  },\n  async preview(inputConfig?: PhenomicInputConfig) {\n    try {\n      const config = await normalizeConfiguration(inputConfig);\n      await build(config);\n      log(\n        `⚡️ Serving on http://localhost:${config.port}` +\n          config.baseUrl.pathname,\n      );\n      serve(config.outdir, {\n        port: config.port,\n      });\n    } catch (e) {\n      handleError(e);\n    }\n  },\n};\n"
  },
  {
    "path": "packages/core/src/logger/__tests__/index.js",
    "content": "// @flow\n\nimport logSymbols from \"log-symbols\";\n\nimport logger from \"..\";\n\ntest(\"log should log\", () => {\n  const log = logger(\"sender test\", false);\n\n  // we can't snapshot because of logSymbols & colors...\n  const colorStart =\n    process.platform !== \"win32\" && !process.env.CIRCLECI ? \"\u001b[90m\" : \"\";\n  const colorEnd =\n    process.platform !== \"win32\" && !process.env.CIRCLECI ? \"\u001b[39m\" : \"\";\n\n  expect(log(\"test msg\")).toBe(\n    `${logSymbols.info} ${colorStart}sender test:${colorEnd} test msg`,\n  );\n  expect(log.debug(\"test debug\")).toBe(\n    `  ${colorStart}sender test:${colorEnd} test debug`,\n  );\n  expect(log.info(\"test info\")).toBe(\n    `${logSymbols.info} ${colorStart}sender test:${colorEnd} test info`,\n  );\n  expect(log.success(\"test success\")).toBe(\n    `${logSymbols.success} ${colorStart}sender test:${colorEnd} test success`,\n  );\n  expect(log.warn(\"test warning\")).toBe(\n    `${logSymbols.warning} ${colorStart}sender test:${colorEnd} test warning`,\n  );\n  expect(log.error(\"test error\")).toBe(\n    `${logSymbols.error} ${colorStart}sender test:${colorEnd} test error`,\n  );\n});\n"
  },
  {
    "path": "packages/core/src/logger/index.js",
    "content": "// @flow\n\nimport color from \"chalk\";\nimport logSymbols from \"log-symbols\";\n\nconst INFO = \"info\";\nconst SUCCESS = \"success\";\nconst WARN = \"warning\";\nconst ERROR = \"error\";\n\n// from log-symbols\ntype TypeType = \"info\" | \"success\" | \"warning\" | \"error\" | null;\ntype WriterType = false | ((msg: string) => void);\n\nconst log = (\n  sender: string,\n  symbol: TypeType,\n  message: string,\n  writer: WriterType,\n): string => {\n  const msg = `${symbol ? logSymbols[symbol] : \" \"} ${color.gray(\n    sender + \":\",\n  )} ${message}`;\n  if (writer) {\n    writer(msg);\n  }\n  return msg;\n};\n\nexport default (sender: string, writer: WriterType = console.log) => {\n  const logger = (msg: string) => log(sender, INFO, msg, writer);\n  logger.trace = (msg: string) => log(sender, null, msg, writer);\n  logger.debug = (msg: string) => log(sender, null, msg, writer);\n  logger.info = (msg: string) => log(sender, INFO, msg, writer);\n  logger.success = (msg: string) => log(sender, SUCCESS, msg, writer);\n  logger.warn = (msg: string) => log(sender, WARN, msg, writer);\n  logger.error = (msg: string) => log(sender, ERROR, msg, writer);\n  return logger;\n};\n"
  },
  {
    "path": "packages/core/src/utils/__tests__/__snapshots__/resolveAll-test.js.snap",
    "content": "// Jest Snapshot v1, https://goo.gl/fbAQLP\n\nexports[`resolveAll should reject if a promise rejects 1`] = `2`;\n\nexports[`resolveAll should resolve all values in object 1`] = `\nObject {\n  \"a\": 1,\n  \"b\": 2,\n}\n`;\n\nexports[`resolveAll should resolve non promises values 1`] = `\nObject {\n  \"a\": 1,\n  \"b\": 2,\n}\n`;\n"
  },
  {
    "path": "packages/core/src/utils/__tests__/error-formatter-test.js",
    "content": "import path from \"path\";\n\nimport errorFormatter, { help } from \"../error-formatter.js\";\n\nconst s = path.sep;\n\ntest(\"errorFormatter\", () => {\n  const cwd = process.cwd();\n  const error = new Error();\n  error.message = \"Test\";\n\n  error.stack = `\nTypeError:\n\nclientBundleStats.toJson is not a function\n\n    at ${cwd}${s}lib${s}builder${s}index.js:66:70\n    at exports.default (${cwd}${s}lib${s}_utils${s}log${s}index.js:88:17)\n    at ${cwd}${s}lib${s}builder${s}index.js:63:34\n    at run (${cwd}${s}node_modules${s}core-js${s}modules${s}es6.promise.js:87:22)\n    at ${cwd}${s}node_modules${s}core-js${s}modules${s}es6.promise.js:100:28\n    at flush (${cwd}${s}node_modules${s}core-js${s}modules${s}_microtask.js:18:9)\n    at _combinedTickCallback (internal${s}process${s}next_tick.js:67:7)\n    at process._tickCallback (internal${s}process${s}next_tick.js:98:9)\n    at Module.runMain (module.js:592:11)\n    at run (bootstrap_node.js:394:7)\n    at startup (bootstrap_node.js:149:9)\n    at bootstrap_node.js:509:3\n`;\n  expect(errorFormatter(error).stack).toBe(\n    `\nTypeError:\n\nclientBundleStats.toJson is not a function\n\n    at lib${s}builder${s}index.js:66:70\n    at exports.default (lib${s}_utils${s}log${s}index.js:88:17)\n    at lib${s}builder${s}index.js:63:34\n    at run (node_modules${s}core-js${s}modules${s}es6.promise.js:87:22)\n    at node_modules${s}core-js${s}modules${s}es6.promise.js:100:28\n    at flush (node_modules${s}core-js${s}modules${s}_microtask.js:18:9)\n    at _combinedTickCallback (internal${s}process${s}next_tick.js:67:7)\n    at process._tickCallback (internal${s}process${s}next_tick.js:98:9)\n    at Module.runMain (module.js:592:11)\n    at run (bootstrap_node.js:394:7)\n    at startup (bootstrap_node.js:149:9)\n    at bootstrap_node.js:509:3\n`,\n  );\n\n  error.stack = `\nTypeError:\n\nwindow is not defined\n\n    at blah\n`;\n  expect(errorFormatter(error).stack).toBe(\n    `\nTypeError:\n\nwindow is not defined\n\n    at blah\n` + help,\n  );\n});\n"
  },
  {
    "path": "packages/core/src/utils/__tests__/resolveAll-test.js",
    "content": "// @flow\n\nimport resolveAll from \"../resolveAll\";\n\ndescribe(\"resolveAll\", () => {\n  it(\"should resolve all values in object\", () => {\n    return resolveAll({\n      a: Promise.resolve(1),\n      b: Promise.resolve(2),\n    }).then(values => {\n      expect(values).toMatchSnapshot();\n    });\n  });\n\n  it(\"should resolve non promises values\", () => {\n    return resolveAll({ a: Promise.resolve(1), b: 2 }).then(values => {\n      expect(values).toMatchSnapshot();\n    });\n  });\n\n  it(\"should reject if a promise rejects\", () => {\n    return resolveAll({\n      a: Promise.resolve(1),\n      b: Promise.reject(2),\n    }).catch(reason => {\n      expect(reason).toMatchSnapshot();\n    });\n  });\n});\n"
  },
  {
    "path": "packages/core/src/utils/error-formatter.js",
    "content": "// @flow\n\nimport os from \"os\";\nimport path from \"path\";\n\nimport colors from \"chalk\";\n\n// import { findCacheDirectory } from \"../Utils.bs.js\";\n\nconst normalizeWinPath = path => path.replace(/\\\\/g, \"\\\\\\\\\");\nconst cwd = normalizeWinPath(process.cwd());\n// const cache = normalizeWinPath(findCacheDirectory());\nconst reSep = normalizeWinPath(path.sep);\n// const cleanStaticBuildPathRE = new RegExp(cache + reSep, \"gm\");\nconst cwdRE = new RegExp(cwd + reSep, \"g\");\nconst homeRE = new RegExp(os.homedir(), \"g\");\n\nconst cleanPaths = string =>\n  string\n    // normalize windows path\n    .replace(/\\\\+g/, \"/\")\n    // cleanup\n    // .replace(cleanStaticBuildPathRE, \"\")\n    .replace(cwdRE, \"\")\n    .replace(homeRE, \"~\");\n\nconst notDefinedRE = /\\s+(.*)( is not defined.*)/gm;\nexport const help = colors.yellow(\n  \"\\n\\n\" +\n    \"If you are seeing this message during the static build, that means you are \" +\n    \"probably using an API only available in the browser (such as 'window', \" +\n    \"'document', 'Element'...). Note that a module can be responsible for this. \" +\n    \"\\n\" +\n    \"In order to prevent this error, you can simply avoid calling the code \" +\n    \"responsible when the dependency is not available. \" +\n    \"\\n\\n\" +\n    \"Examples:\\n\" +\n    `For a single API call:\n\n  const element = typeof document !== \"undefined\" ? document.querySelector(\".something\") : null\n\n  if (element) {\n    // do your thing with your element\n  }\n\nFor a module:\n\n  const clipboard = (typeof window !== \"undefined\") ? require(\"clipboard\") : null\n\n  // then later\n\n  if (clipboard) {\n    // do your thing using the module\n  }\n  `,\n);\n\nexport default (error: Error) => {\n  error.message = colors.red(error.message);\n  // sometimes paths are in message\n  // eg: errors thrown by webpack loaders/plugin\n  error.message = cleanPaths(error.message);\n  error.stack = cleanPaths(error.stack);\n  if (error.message.match(notDefinedRE) || error.stack.match(notDefinedRE)) {\n    error.stack += help;\n  }\n  return error;\n};\n"
  },
  {
    "path": "packages/core/src/utils/getPath.js",
    "content": "// @flow\n\nimport fs from \"fs\";\n\nexport default (path: string): Promise<string> =>\n  new Promise((resolve, reject) =>\n    fs.stat(path, err => (err ? reject(err) : resolve(path))),\n  );\n"
  },
  {
    "path": "packages/core/src/utils/log.js",
    "content": "// @flow\n\nimport logger from \"../logger\";\n\nconst logSource = \"@phenomic\";\n\nexport default logger(logSource);\n"
  },
  {
    "path": "packages/core/src/utils/resolveAll.js",
    "content": "// @flow\n\nconst resolveAll = (objectOfPromises: {\n  [key: string]: any,\n}): { [key: string]: any } => {\n  const finalObject = {};\n  return Promise.all(\n    Object.keys(objectOfPromises).map(key =>\n      Promise.resolve(objectOfPromises[key]).then(\n        value => (finalObject[key] = value),\n      ),\n    ),\n  ).then(() => finalObject);\n};\n\nexport default resolveAll;\n"
  },
  {
    "path": "packages/core/src/utils/writeFile.js",
    "content": "// @flow\n\nimport path from \"path\";\nimport fs from \"fs\";\n\nimport mkdirp from \"mkdirp\";\n\nconst writeFile = (filepath: string, data: string): Promise<void> =>\n  new Promise((resolve, reject) => {\n    mkdirp(path.dirname(filepath), error => {\n      if (error) {\n        reject(error);\n        return;\n      }\n      fs.writeFile(filepath, data, error => {\n        if (error) {\n          reject(error);\n        } else {\n          resolve();\n        }\n      });\n    });\n  });\n\nexport default writeFile;\n"
  },
  {
    "path": "packages/helpers-transform/README.md",
    "content": "# @phenomic/helpers-transform\n\n> Phenomic helpers for transform plugins\n\n➡ More details at [phenomic.io](https://phenomic.io/)\n"
  },
  {
    "path": "packages/helpers-transform/bsconfig.json",
    "content": "{\n  \"name\": \"@phenomic/helpers-transform\",\n  \"refmt\": 3,\n  \"reason\": {\n    \"react-jsx\": 3\n  },\n  \"sources\": [\n    {\n      \"dir\": \"src\",\n      \"subdirs\": true\n    }\n  ],\n  \"suffix\": \".bs.js\",\n  \"package-specs\": {\n    \"module\": \"commonjs\",\n    \"in-source\": true\n  }\n}\n"
  },
  {
    "path": "packages/helpers-transform/docs/README.md",
    "content": "---\ntitle: Phenomic helpers for transform plugins\n---\n\nThis module export multiple utilities for transform plugins:\n\n- [extractMetaFromBodyNode](./extractMetaFromBodyNode.md)\n- [unifiedProcessor](./unifiedProcessor.md)\n"
  },
  {
    "path": "packages/helpers-transform/docs/extractMetaFromBodyNode.md",
    "content": "---\ntitle: extractMetaFromBodyNode\n---\n\n@todo\n\n- https://github.com/phenomic/phenomic/tree/master/packages/plugin-transform-markdown/src/index.js\n- https://github.com/phenomic/phenomic/tree/master/packages/plugin-transform-asciidoc/src/index.js\n"
  },
  {
    "path": "packages/helpers-transform/docs/unifiedProcessor.md",
    "content": "---\ntitle: unifiedProcessor\n---\n\n@todo\n\n- https://github.com/phenomic/phenomic/tree/master/packages/plugin-transform-markdown/src/index.js\n- https://github.com/phenomic/phenomic/tree/master/packages/plugin-transform-asciidoc/src/index.js\n"
  },
  {
    "path": "packages/helpers-transform/package.json",
    "content": "{\n  \"name\": \"@phenomic/helpers-transform\",\n  \"version\": \"1.0.0\",\n  \"publishConfig\": {\n    \"access\": \"public\"\n  },\n  \"repository\": \"https://github.com/phenomic/phenomic.git\",\n  \"homepage\": \"https://phenomic.io\",\n  \"license\": \"MIT\",\n  \"authors\": [\n    \"Maxime Thirouin (MoOx)\"\n  ],\n  \"keywords\": [\n    \"phenomic\",\n    \"phenomic-package\"\n  ],\n  \"description\": \"Phenomic helpers for transform plugins\",\n  \"main\": \"lib/index.js\",\n  \"files\": [\n    \"lib\",\n    \"src\",\n    \"!**/__tests__\"\n  ],\n  \"dependencies\": {\n    \"debug\": \"^2.6.0\",\n    \"rehype-react\": \"^3.0.0\",\n    \"rehype-stringify\": \"^3.0.0\",\n    \"unified\": \"^6.0.0\"\n  },\n  \"peerDependencies\": {\n    \"@phenomic/core\": \"^1.0.0-beta.3\"\n  },\n  \"devDependencies\": {\n    \"@phenomic/core\": \"^1.0.0\",\n    \"rehype-autolink-headings\": \"^2.0.0\",\n    \"rehype-raw\": \"^2.0.0\",\n    \"rehype-react\": \"^3.0.0\",\n    \"rehype-slug\": \"^2.0.0\",\n    \"rehype-stringify\": \"^3.0.0\",\n    \"remark-highlights\": \"^1.0.0\",\n    \"remark-parse\": \"^4.0.0\",\n    \"remark-rehype\": \"^2.0.0\",\n    \"remark-toc\": \"^4.0.0\"\n  }\n}\n"
  },
  {
    "path": "packages/helpers-transform/src/__tests__/__snapshots__/extractMetaFromBodyNode.js.snap",
    "content": "// Jest Snapshot v1, https://goo.gl/fbAQLP\n\nexports[`should guess partial data from body AST 1`] = `\nObject {\n  \"headings\": Array [\n    Object {\n      \"id\": \"auto-title\",\n      \"level\": 1,\n      \"text\": \"Auto title\",\n    },\n    Object {\n      \"id\": \"sub-title\",\n      \"level\": 2,\n      \"text\": \"Sub title\",\n    },\n    Object {\n      \"id\": \"another-level-2\",\n      \"level\": 2,\n      \"text\": \"Another Level 2\",\n    },\n    Object {\n      \"id\": \"a-level-3\",\n      \"level\": 3,\n      \"text\": \"A level 3\",\n    },\n  ],\n  \"title\": \"Auto title\",\n}\n`;\n"
  },
  {
    "path": "packages/helpers-transform/src/__tests__/__snapshots__/unifiedProcessor.js.snap",
    "content": "// Jest Snapshot v1, https://goo.gl/fbAQLP\n\nexports[`should render markdown as html 1`] = `\n\"<h2 id=\\\\\"test\\\\\"><a aria-hidden=\\\\\"true\\\\\" href=\\\\\"#test\\\\\"><span class=\\\\\"icon icon-link\\\\\"></span></a>Test</h2>\n<p><a href=\\\\\"href\\\\\">link</a></p>\n<pre class=\\\\\"editor editor-colors\\\\\"><div class=\\\\\"line\\\\\"><span class=\\\\\"syntax--source syntax--js\\\\\"><span class=\\\\\"syntax--entity syntax--name syntax--type syntax--object syntax--console syntax--js\\\\\"><span>console</span></span><span class=\\\\\"syntax--meta syntax--method-call syntax--js\\\\\"><span class=\\\\\"syntax--meta syntax--delimiter syntax--method syntax--period syntax--js\\\\\"><span>.</span></span><span class=\\\\\"syntax--support syntax--function syntax--console syntax--js\\\\\"><span>log</span></span><span class=\\\\\"syntax--meta syntax--arguments syntax--js\\\\\"><span class=\\\\\"syntax--punctuation syntax--definition syntax--arguments syntax--begin syntax--bracket syntax--round syntax--js\\\\\"><span>(</span></span><span class=\\\\\"syntax--support syntax--variable syntax--dom syntax--js\\\\\"><span>window</span></span><span class=\\\\\"syntax--punctuation syntax--definition syntax--arguments syntax--end syntax--bracket syntax--round syntax--js\\\\\"><span>)</span></span></span></span></span></div></pre>\n<p><button>Random Html</button>\n<button>Random react like stuff</button></p>\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n<table><thead><tr><th align=\\\\\"left\\\\\">Left-aligned</th><th align=\\\\\"center\\\\\">Center-aligned</th><th align=\\\\\"right\\\\\">Right-aligned</th></tr></thead><tbody><tr><td align=\\\\\"left\\\\\">left one</td><td align=\\\\\"center\\\\\">center one</td><td align=\\\\\"right\\\\\">right one</td></tr><tr><td align=\\\\\"left\\\\\">left two</td><td align=\\\\\"center\\\\\">center two</td><td align=\\\\\"right\\\\\">right two</td></tr></tbody></table>\"\n`;\n\nexports[`should render markdown as json (react component) 1`] = `\nObject {\n  \"c\": Array [\n    Object {\n      \"c\": Array [\n        Object {\n          \"c\": Array [\n            Object {\n              \"p\": Object {\n                \"class\": \"icon icon-link\",\n              },\n              \"t\": \"span\",\n            },\n          ],\n          \"p\": Object {\n            \"aria-hidden\": \"true\",\n            \"href\": \"#test\",\n          },\n          \"t\": \"a\",\n        },\n        \"Test\",\n      ],\n      \"p\": Object {\n        \"id\": \"test\",\n      },\n      \"t\": \"h2\",\n    },\n    \"\n\",\n    Object {\n      \"c\": Array [\n        Object {\n          \"c\": Array [\n            \"link\",\n          ],\n          \"p\": Object {\n            \"href\": \"href\",\n          },\n          \"t\": \"a\",\n        },\n      ],\n      \"t\": \"p\",\n    },\n    \"\n\",\n    Object {\n      \"c\": Array [\n        Object {\n          \"c\": Array [\n            Object {\n              \"c\": Array [\n                Object {\n                  \"c\": Array [\n                    Object {\n                      \"c\": Array [\n                        \"console\",\n                      ],\n                      \"t\": \"span\",\n                    },\n                  ],\n                  \"p\": Object {\n                    \"class\": \"syntax--entity syntax--name syntax--type syntax--object syntax--console syntax--js\",\n                  },\n                  \"t\": \"span\",\n                },\n                Object {\n                  \"c\": Array [\n                    Object {\n                      \"c\": Array [\n                        Object {\n                          \"c\": Array [\n                            \".\",\n                          ],\n                          \"t\": \"span\",\n                        },\n                      ],\n                      \"p\": Object {\n                        \"class\": \"syntax--meta syntax--delimiter syntax--method syntax--period syntax--js\",\n                      },\n                      \"t\": \"span\",\n                    },\n                    Object {\n                      \"c\": Array [\n                        Object {\n                          \"c\": Array [\n                            \"log\",\n                          ],\n                          \"t\": \"span\",\n                        },\n                      ],\n                      \"p\": Object {\n                        \"class\": \"syntax--support syntax--function syntax--console syntax--js\",\n                      },\n                      \"t\": \"span\",\n                    },\n                    Object {\n                      \"c\": Array [\n                        Object {\n                          \"c\": Array [\n                            Object {\n                              \"c\": Array [\n                                \"(\",\n                              ],\n                              \"t\": \"span\",\n                            },\n                          ],\n                          \"p\": Object {\n                            \"class\": \"syntax--punctuation syntax--definition syntax--arguments syntax--begin syntax--bracket syntax--round syntax--js\",\n                          },\n                          \"t\": \"span\",\n                        },\n                        Object {\n                          \"c\": Array [\n                            Object {\n                              \"c\": Array [\n                                \"window\",\n                              ],\n                              \"t\": \"span\",\n                            },\n                          ],\n                          \"p\": Object {\n                            \"class\": \"syntax--support syntax--variable syntax--dom syntax--js\",\n                          },\n                          \"t\": \"span\",\n                        },\n                        Object {\n                          \"c\": Array [\n                            Object {\n                              \"c\": Array [\n                                \")\",\n                              ],\n                              \"t\": \"span\",\n                            },\n                          ],\n                          \"p\": Object {\n                            \"class\": \"syntax--punctuation syntax--definition syntax--arguments syntax--end syntax--bracket syntax--round syntax--js\",\n                          },\n                          \"t\": \"span\",\n                        },\n                      ],\n                      \"p\": Object {\n                        \"class\": \"syntax--meta syntax--arguments syntax--js\",\n                      },\n                      \"t\": \"span\",\n                    },\n                  ],\n                  \"p\": Object {\n                    \"class\": \"syntax--meta syntax--method-call syntax--js\",\n                  },\n                  \"t\": \"span\",\n                },\n              ],\n              \"p\": Object {\n                \"class\": \"syntax--source syntax--js\",\n              },\n              \"t\": \"span\",\n            },\n          ],\n          \"p\": Object {\n            \"class\": \"line\",\n          },\n          \"t\": \"div\",\n        },\n      ],\n      \"p\": Object {\n        \"class\": \"editor editor-colors\",\n      },\n      \"t\": \"pre\",\n    },\n    \"\n\",\n    Object {\n      \"c\": Array [\n        Object {\n          \"c\": Array [\n            \"Random Html\",\n          ],\n          \"t\": \"button\",\n        },\n        \"\n\",\n        Object {\n          \"c\": Array [\n            \"Random react like stuff\",\n          ],\n          \"t\": \"button\",\n        },\n      ],\n      \"t\": \"p\",\n    },\n    \"\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\",\n    Object {\n      \"c\": Array [\n        Object {\n          \"c\": Array [\n            Object {\n              \"c\": Array [\n                Object {\n                  \"c\": Array [\n                    \"Left-aligned\",\n                  ],\n                  \"p\": Object {\n                    \"align\": \"left\",\n                  },\n                  \"t\": \"th\",\n                },\n                Object {\n                  \"c\": Array [\n                    \"Center-aligned\",\n                  ],\n                  \"p\": Object {\n                    \"align\": \"center\",\n                  },\n                  \"t\": \"th\",\n                },\n                Object {\n                  \"c\": Array [\n                    \"Right-aligned\",\n                  ],\n                  \"p\": Object {\n                    \"align\": \"right\",\n                  },\n                  \"t\": \"th\",\n                },\n              ],\n              \"t\": \"tr\",\n            },\n          ],\n          \"t\": \"thead\",\n        },\n        Object {\n          \"c\": Array [\n            Object {\n              \"c\": Array [\n                Object {\n                  \"c\": Array [\n                    \"left one\",\n                  ],\n                  \"p\": Object {\n                    \"align\": \"left\",\n                  },\n                  \"t\": \"td\",\n                },\n                Object {\n                  \"c\": Array [\n                    \"center one\",\n                  ],\n                  \"p\": Object {\n                    \"align\": \"center\",\n                  },\n                  \"t\": \"td\",\n                },\n                Object {\n                  \"c\": Array [\n                    \"right one\",\n                  ],\n                  \"p\": Object {\n                    \"align\": \"right\",\n                  },\n                  \"t\": \"td\",\n                },\n              ],\n              \"t\": \"tr\",\n            },\n            Object {\n              \"c\": Array [\n                Object {\n                  \"c\": Array [\n                    \"left two\",\n                  ],\n                  \"p\": Object {\n                    \"align\": \"left\",\n                  },\n                  \"t\": \"td\",\n                },\n                Object {\n                  \"c\": Array [\n                    \"center two\",\n                  ],\n                  \"p\": Object {\n                    \"align\": \"center\",\n                  },\n                  \"t\": \"td\",\n                },\n                Object {\n                  \"c\": Array [\n                    \"right two\",\n                  ],\n                  \"p\": Object {\n                    \"align\": \"right\",\n                  },\n                  \"t\": \"td\",\n                },\n              ],\n              \"t\": \"tr\",\n            },\n          ],\n          \"t\": \"tbody\",\n        },\n      ],\n      \"t\": \"table\",\n    },\n  ],\n  \"t\": \"div\",\n}\n`;\n"
  },
  {
    "path": "packages/helpers-transform/src/__tests__/extractMetaFromBodyNode.js",
    "content": "// @flow\n\nimport extractMetaFromBodyNode from \"../extractMetaFromBodyNode.js\";\n\nit(\"should guess partial data from body AST\", () => {\n  expect(\n    extractMetaFromBodyNode({\n      c: [\n        {\n          c: [\n            {\n              c: [\n                {\n                  p: {\n                    className: \"icon icon-link\",\n                  },\n                  t: \"span\",\n                },\n              ],\n              p: {\n                \"aria-hidden\": true,\n                href: \"#auto-title\",\n              },\n              t: \"a\",\n            },\n            \"Auto title\",\n          ],\n          p: {\n            id: \"auto-title\",\n          },\n          t: \"h1\",\n        },\n        \"\\n\",\n        {\n          c: [\n            {\n              c: [\n                {\n                  p: {\n                    className: \"icon icon-link\",\n                  },\n                  t: \"span\",\n                },\n              ],\n              p: {\n                \"aria-hidden\": true,\n                href: \"#sub-title\",\n              },\n              t: \"a\",\n            },\n            \"Sub title\",\n          ],\n          p: {\n            id: \"sub-title\",\n          },\n          t: \"h2\",\n        },\n        \"\\n\",\n        {\n          c: [\"Content\"],\n          t: \"p\",\n        },\n        \"\\n\",\n        {\n          c: [\n            {\n              c: [\n                {\n                  p: {\n                    className: \"icon icon-link\",\n                  },\n                  t: \"span\",\n                },\n              ],\n              p: {\n                \"aria-hidden\": true,\n                href: \"#another-level-2\",\n              },\n              t: \"a\",\n            },\n            \"Another Level 2\",\n          ],\n          p: {\n            id: \"another-level-2\",\n          },\n          t: \"h2\",\n        },\n        \"\\n\",\n        {\n          c: [\n            {\n              c: [\n                {\n                  p: {\n                    className: \"icon icon-link\",\n                  },\n                  t: \"span\",\n                },\n              ],\n              p: {\n                \"aria-hidden\": true,\n                href: \"#a-level-3\",\n              },\n              t: \"a\",\n            },\n            \"A level 3\",\n          ],\n          p: {\n            id: \"a-level-3\",\n          },\n          t: \"h3\",\n        },\n      ],\n      t: \"div\",\n    }),\n  ).toMatchSnapshot();\n});\n"
  },
  {
    "path": "packages/helpers-transform/src/__tests__/unifiedProcessor.js",
    "content": "// @flow\n\nimport unifiedProcessor from \"../unifiedProcessor.js\";\n\n// ripped from plugin-transform-markdown\nconst defaultMdOptions = {\n  output: \"html\",\n  plugins: [\n    require(\"remark-parse\"),\n    require(\"remark-toc\"),\n    require(\"remark-highlights\"),\n    [require(\"remark-rehype\"), { allowDangerousHTML: true }],\n    require(\"rehype-raw\"),\n    require(\"rehype-slug\"),\n    require(\"rehype-autolink-headings\"),\n  ],\n};\n\nconst input = `## Test\n[link](href)\n\\`\\`\\`js\nconsole.log(window)\n\\`\\`\\`\n\n<button>Random Html</button>\n<Button>Random react like stuff</Button>\n\n| Left-aligned | Center-aligned | Right-aligned |\n| :---         |     :---:      |          ---: |\n| left one     | center one     | right one     |\n| left two     | center two     | right two     |\n`;\n\nit(\"should render markdown as json (react component)\", () => {\n  const processor = unifiedProcessor({\n    output: \"json\",\n    plugins: defaultMdOptions.plugins,\n  });\n  // $FlowFixMe mixed insn't ok?\n  const md = processor.processSync(input).contents;\n  expect(md).toMatchSnapshot();\n});\n\nit(\"should render markdown as html\", () => {\n  const processor = unifiedProcessor({ plugins: defaultMdOptions.plugins });\n  // $FlowFixMe mixed insn't ok?\n  const md = processor.processSync(input).contents;\n  expect(md).toMatchSnapshot();\n});\n"
  },
  {
    "path": "packages/helpers-transform/src/extractMetaFromBodyNode.js",
    "content": "// @flow\n\ntype Node =\n  | string\n  | {|\n      t?: string,\n      p?: Object,\n      c?: Node | $ReadOnlyArray<Node>,\n    |};\n\nconst renderText = (node?: Node): string => {\n  if (!node) return \"\";\n  if (typeof node === \"string\") return node;\n  return Array.isArray(node.c)\n    ? node.c.map((child: Node) => renderText(child)).join(\"\")\n    : renderText(node.c);\n};\n\nconst getHeadings = (\n  node?: Node,\n): $ReadOnlyArray<{ level: number, text: string, id: string }> => {\n  if (!node) return [];\n  if (typeof node.t === \"string\") {\n    const tag = node.t;\n    const level = parseInt(tag[1], 10);\n    if (tag[0] === \"h\" && !isNaN(level)) {\n      return [\n        {\n          level,\n          text: renderText(node),\n          id: node.p && node.p.id ? String(node.p.id) : \"\",\n        },\n      ];\n    }\n  }\n  return (Array.isArray(node.c)\n    ? // $FlowFixMe stfu\n      node.c.reduce((acc, child: Node) => acc.concat(getHeadings(child)), [])\n    : // $FlowFixMe stfu\n      getHeadings(node.c)\n  ).filter(h => h);\n};\n\nexport default (node: Node) => {\n  const headings = getHeadings(node);\n  const firstH1 = headings.find(h => h.level === 1);\n  return {\n    ...(firstH1 ? { title: firstH1.text } : {}),\n    ...(headings.length > 0 ? { headings } : {}),\n  };\n};\n"
  },
  {
    "path": "packages/helpers-transform/src/unifiedProcessor.js",
    "content": "// @flow\n\nimport unified from \"unified\";\nimport html from \"rehype-stringify\";\nimport rehype2react from \"rehype-react\";\n\nexport type plugin =\n  | string\n  | Function\n  | $ReadOnlyArray<string | Function | any>;\n\n// here we optimize structure just a little to have to smallest json possible\nconst createElement = (component, props, children) => {\n  return {\n    t: component,\n    ...(props && Object.keys(props).length ? { p: props } : {}),\n    ...(children ? { c: children } : {}),\n  };\n};\n\nexport default ({\n  output,\n  plugins,\n}: {|\n  output?: \"json\" | \"html\",\n  plugins?: $ReadOnlyArray<plugin>,\n|} = {}) => {\n  const processor = unified();\n  if (plugins)\n    plugins.forEach(plugin => {\n      if (typeof plugin === \"function\") {\n        processor.use(plugin);\n        return;\n      }\n      if (typeof plugin === \"string\") {\n        // $FlowFixMe 🤫\n        processor.use(require(plugin));\n        return;\n      }\n      if (Array.isArray(plugin) && plugin.length === 2) {\n        if (typeof plugin[0] === \"function\") {\n          processor.use(plugin[0], plugin[1]);\n          return;\n        }\n        if (typeof plugin[0] === \"string\") {\n          // $FlowFixMe 🤫\n          processor.use(require(plugin[0]), plugin[1]);\n          return;\n        }\n      }\n      throw new Error(\n        \"A plugin for 'unified' can be a string (module name), a function, or an array of [string|function, {options}]. You gave \" +\n          plugin.toString(),\n      );\n    });\n\n  if (output === \"json\") {\n    processor.use(rehype2react, { createElement });\n  } else {\n    processor.use(html);\n  }\n\n  return processor;\n};\n"
  },
  {
    "path": "packages/plugin-api-related-content/README.md",
    "content": "# @phenomic/plugin-api-related-content\n\n> Phenomic plugin to generate related content API for resources\n\n➡ More details at [phenomic.io](https://phenomic.io/)\n"
  },
  {
    "path": "packages/plugin-api-related-content/bsconfig.json",
    "content": "{\n  \"name\": \"@phenomic/plugin-api-related-content\",\n  \"refmt\": 3,\n  \"reason\": {\n    \"react-jsx\": 3\n  },\n  \"sources\": [\n    {\n      \"dir\": \"src\",\n      \"subdirs\": true\n    }\n  ],\n  \"suffix\": \".bs.js\",\n  \"package-specs\": {\n    \"module\": \"commonjs\",\n    \"in-source\": true\n  }\n}\n"
  },
  {
    "path": "packages/plugin-api-related-content/docs/README.md",
    "content": "---\ntitle: \"@phenomic/plugin-api-related-content\"\n---\n\n@todo\n"
  },
  {
    "path": "packages/plugin-api-related-content/package.json",
    "content": "{\n  \"name\": \"@phenomic/plugin-api-related-content\",\n  \"version\": \"1.0.0\",\n  \"publishConfig\": {\n    \"access\": \"public\"\n  },\n  \"repository\": \"https://github.com/phenomic/phenomic.git\",\n  \"homepage\": \"https://phenomic.io\",\n  \"license\": \"MIT\",\n  \"authors\": [\n    \"Maxime Thirouin (MoOx)\",\n    \"bloodyowl <bloodyowl@icloud.com>\"\n  ],\n  \"keywords\": [\n    \"phenomic\",\n    \"phenomic-plugin\"\n  ],\n  \"description\": \"Phenomic plugin to generate related content API for resources\",\n  \"main\": \"lib/index.js\",\n  \"files\": [\n    \"lib\",\n    \"src\",\n    \"!**/__tests__\"\n  ],\n  \"dependencies\": {\n    \"debug\": \"^2.6.0\",\n    \"lodash.flatten\": \"^4.4.0\"\n  },\n  \"peerDependencies\": {\n    \"@phenomic/core\": \"^1.0.0-beta.3\"\n  },\n  \"devDependencies\": {\n    \"@phenomic/core\": \"^1.0.0\"\n  }\n}\n"
  },
  {
    "path": "packages/plugin-api-related-content/src/index.js",
    "content": "// @flow\n\nimport flatten from \"lodash.flatten\";\n\nconst debug = require(\"debug\")(\"phenomic:plugin:api-related-content\");\n\nconst apiRelatedContent: PhenomicPluginModule<{}> = () => {\n  return {\n    name: \"@phenomic/plugin-api-related-content\",\n    extendAPI({ apiServer }) {\n      // $FlowFixMe flow is lost with async function for express\n      apiServer.get(\"/related/:path/limit-:limit/*.json\", async function(\n        req,\n        res,\n      ) {\n        debug(req.url, JSON.stringify(req.params));\n        try {\n          const limit = parseInt(res.params.limit);\n          const post = await req.db.get([req.params.path], req.params[0]);\n          const lists = await Promise.all([\n            ...post.value.tags.map(tag =>\n              req.db.getList(\n                req.params.path,\n                {\n                  limit: limit + 1,\n                },\n                \"tags\",\n                tag,\n              ),\n            ),\n            req.db.getList(req.params.path, { limit: limit + 1 }),\n          ]);\n          const flattenedList = flatten(lists);\n          const listWithoutCurrentPost = flattenedList.filter(\n            item => item.id !== post.value.id,\n          );\n          res.json(listWithoutCurrentPost);\n        } catch (error) {\n          res.status(404).end();\n        }\n      });\n    },\n  };\n};\n\nexport default apiRelatedContent;\n"
  },
  {
    "path": "packages/plugin-bundler-webpack/README.md",
    "content": "# @phenomic/plugin-bundler-webpack\n\n> Phenomic plugin that allow you to use webpack to bundle you website/app\n\n➡ More details at [phenomic.io](https://phenomic.io/)\n"
  },
  {
    "path": "packages/plugin-bundler-webpack/bsconfig.json",
    "content": "{\n  \"name\": \"@phenomic/plugin-bundler-webpack\",\n  \"refmt\": 3,\n  \"reason\": {\n    \"react-jsx\": 3\n  },\n  \"sources\": [\n    {\n      \"dir\": \"src\",\n      \"subdirs\": true\n    }\n  ],\n  \"suffix\": \".bs.js\",\n  \"package-specs\": {\n    \"module\": \"commonjs\",\n    \"in-source\": true\n  }\n}\n"
  },
  {
    "path": "packages/plugin-bundler-webpack/docs/README.md",
    "content": "# @phenomic/plugin-bundler-webpack\n\n## Custom webpack config\n\nThis plugin provides a [minimal webpack config](../src/webpack.config.js) (to\nmake it easy for newbies), but it should auto read your custom\n`webpack.config.js` at the root of you project.\n\nProviding your own webpack config should help you if you want custom loaders.\n\nPhenomic requirements should be automatically injected (eg:\n`process.env.NODE_ENV`).\n\n⚠️ _Note that your webpack config won't be merged with the default of this\nplugin. It's up to you to start from this one if you want to keep it and only\nadd some loaders._\n"
  },
  {
    "path": "packages/plugin-bundler-webpack/package.json",
    "content": "{\n  \"name\": \"@phenomic/plugin-bundler-webpack\",\n  \"version\": \"1.0.0\",\n  \"publishConfig\": {\n    \"access\": \"public\"\n  },\n  \"repository\": \"https://github.com/phenomic/phenomic.git\",\n  \"homepage\": \"https://phenomic.io\",\n  \"license\": \"MIT\",\n  \"authors\": [\n    \"Maxime Thirouin (MoOx)\",\n    \"bloodyowl <bloodyowl@icloud.com>\"\n  ],\n  \"keywords\": [\n    \"phenomic\",\n    \"phenomic-plugin\",\n    \"webpack\"\n  ],\n  \"description\": \"Phenomic plugin that allow you to use webpack to bundle you website/app\",\n  \"main\": \"lib/index.js\",\n  \"files\": [\n    \"lib\",\n    \"src\",\n    \"!**/__tests__\"\n  ],\n  \"dependencies\": {\n    \"@babel/core\": \"^7.0.0\",\n    \"@phenomic/babel-preset\": \"^1.0.0\",\n    \"babel-loader\": \"^8.0.0\",\n    \"chalk\": \"^1.1.3\",\n    \"css-loader\": \"^1.0.0\",\n    \"debug\": \"^2.6.0\",\n    \"mini-css-extract-plugin\": \"^0.4.0\",\n    \"multili\": \"^1.1.0\",\n    \"source-map-support\": \"^0.5.0\",\n    \"style-loader\": \"^0.16.1\",\n    \"webpack\": \"^4.0.0\",\n    \"webpack-dev-middleware\": \"^3.0.0\",\n    \"webpack-hot-middleware\": \"^2.0.0\"\n  },\n  \"peerDependencies\": {\n    \"@phenomic/core\": \"^1.0.0-beta.3\"\n  },\n  \"devDependencies\": {\n    \"@phenomic/core\": \"^1.0.0\"\n  }\n}\n"
  },
  {
    "path": "packages/plugin-bundler-webpack/src/WebpackConfigValidator.js",
    "content": "// @flow\n\nimport multili from \"multili\";\n\nconst typeOf = value => {\n  const type = typeof value;\n  if (Array.isArray(value)) {\n    return \"array\";\n  }\n  if (value === null) {\n    return \"null\";\n  }\n  return type;\n};\n\nexport default (webpackConfig: Object, config: PhenomicConfig) => {\n  if (!webpackConfig.entry || !webpackConfig.entry[config.bundleName]) {\n    let error = `@phenomic/plugin-bundler-webpack expects an entry named '${\n      config.bundleName\n    }' in your webpack config.\\n`;\n    // be careful about the indentation here\n    let adviceCode = `[\n            process.env.PHENOMIC_ENV !== \"static\" && require.resolve(\"webpack-hot-middleware/client\"),\n            \"./App.js\"\n          ].filter(item => item)`;\n    const type = typeOf(webpackConfig.entry);\n    if (type === \"object\") {\n      // $FlowFixMe here we know we have an object, see typeOf function\n      error += `Your current entries keys are '${Object.keys(\n        webpackConfig.entry,\n      )}'.\\n`;\n    } else {\n      error += `Your current entry is of type '${type}'.\\n`;\n    }\n    if (type === \"string\" || type === \"array\") {\n      adviceCode = JSON.stringify(webpackConfig.entry);\n    }\n    error += multili(`\n      Please use an object like this:\n\n        entry: {\n          \"phenomic.main\": ${adviceCode},\n        }\n\n    `);\n    throw new Error(error);\n  }\n};\n"
  },
  {
    "path": "packages/plugin-bundler-webpack/src/WebpackGetConfig.js",
    "content": "// @flow\n\nimport path from \"path\";\nimport fs from \"fs\";\n\nimport webpack from \"webpack\";\n\nimport validate from \"./WebpackConfigValidator.js\";\n\nconst debug = require(\"debug\")(\"phenomic:plugin:bundler-webpack\");\n\nexport default (config: PhenomicConfig) => {\n  let webpackConfig;\n  const userWebpackConfigPath = path.join(config.path, \"webpack.config.js\");\n  if (fs.existsSync(userWebpackConfigPath)) {\n    // $FlowFixMe no I can't\n    webpackConfig = require(userWebpackConfigPath);\n    webpackConfig = (webpackConfig.default\n      ? webpackConfig.default\n      : webpackConfig)(config);\n    debug(\"webpack.config.js used\");\n  } else {\n    debug(\"webpack.config.js not found\");\n    const userWebpackConfigBabelPath = path.join(\n      config.path,\n      \"webpack.config.babel.js\",\n    );\n    if (fs.existsSync(userWebpackConfigBabelPath)) {\n      // $FlowFixMe no I can't\n      webpackConfig = require(userWebpackConfigBabelPath);\n      webpackConfig = (webpackConfig.default\n        ? webpackConfig.default\n        : webpackConfig)(config);\n      debug(\"webpack.config.babel.js used\");\n    } else {\n      debug(\"webpack.config.babel.js not found\");\n      // $FlowFixMe no I can't\n      webpackConfig = require(path.join(__dirname, \"webpack.config.js\"))(\n        config,\n      );\n      debug(\"default webpack config used\");\n    }\n  }\n  validate(webpackConfig, config);\n  debug(webpackConfig);\n  return {\n    ...webpackConfig,\n    plugins: [\n      ...(webpackConfig.plugins || []),\n      new webpack.DefinePlugin({\n        \"process.env.NODE_ENV\": JSON.stringify(process.env.NODE_ENV),\n      }),\n    ],\n  };\n};\n"
  },
  {
    "path": "packages/plugin-bundler-webpack/src/WebpackServerConfigModifier.js",
    "content": "import webpack from \"webpack\";\n\nimport getWebpackConfig from \"./WebpackGetConfig.js\";\n\nconst requireSourceMapSupport = `require('${require\n  .resolve(\"source-map-support/register\")\n  // windows support\n  .replace(/\\\\/g, \"/\")}');`;\n\nconst defaultExternals = [\n  // we could consider node_modules as externals deps\n  // and so use something like\n  // /^[A-Za-z0-9-_]/\n  // to not bundle all deps in the static build (for perf)\n  // the problem is that if people rely on node_modules for stuff\n  // like css, this breaks their build.\n  //\n  // @todo find a better way than a whitelist\n\n  // to support react hooks, we need to be sure that static rendering\n  // use only one react\n  // https://github.com/facebook/react/issues/13991\n  \"react\",\n  \"react-dom\",\n\n  // https://github.com/websockets/ws/issues/1220\n  \"bufferutil\",\n  \"utf-8-validate\",\n\n  /^apollo(\\/.*)?/,\n  /^aphrodite(\\/.*)?/,\n  /^emotion(\\/.*)?/,\n  /^glamor(\\/.*)?/,\n  /^react-native(-web)?(\\/.*)?/, // \"react-native-web\" can be used as an alias or \"react-native\"\n  /^react-helmet(\\/.*)?/,\n  /^styled-components(\\/.*)?/,\n];\n\nexport default (config, cacheDir) => {\n  const webpackConfig = getWebpackConfig(config);\n  return {\n    ...webpackConfig,\n    // only keep the entry we are going to use\n    entry: {\n      [config.bundleName]: webpackConfig.entry[config.bundleName],\n    },\n    // adjust some config details to be node focused\n    target: \"node\",\n    // externals for package/relative name\n    externals: [...(webpackConfig.externals || defaultExternals)],\n    output: {\n      publicPath: config.baseUrl.pathname,\n      path: cacheDir,\n      filename: \"[name].js\",\n      library: \"app\",\n      libraryTarget: \"commonjs2\",\n      devtoolModuleFilenameTemplate: \"[absolute-resource-path]\",\n    },\n    plugins: [\n      ...webpackConfig.plugins,\n      // sourcemaps\n      new webpack.BannerPlugin({\n        banner: requireSourceMapSupport,\n        raw: true,\n        entryOnly: false,\n      }),\n      // Ignore annoying isomorphic-fetch / cross-fetch encoding/iconv-loader warning\n      // \"Critical dependency: the request of a dependency is an expression\"\n      new webpack.IgnorePlugin(/\\/iconv-loader$/),\n    ],\n    // sourcemaps\n    devtool: \"#source-map\",\n  };\n};\n"
  },
  {
    "path": "packages/plugin-bundler-webpack/src/__tests__/__snapshots__/index.js.snap",
    "content": "// Jest Snapshot v1, https://goo.gl/fbAQLP\n\nexports[`validate array 1`] = `\n[Error: @phenomic/plugin-bundler-webpack expects an entry named 'phenomic.main' in your webpack config.\nYour current entry is of type 'array'.\n\nPlease use an object like this:\n\n  entry: {\n    \"phenomic.main\": [\"something.js\",\"App.js\"],\n  }\n\n]\n`;\n\nexports[`validate nothing 1`] = `\n[Error: @phenomic/plugin-bundler-webpack expects an entry named 'phenomic.main' in your webpack config.\nYour current entry is of type 'undefined'.\n\nPlease use an object like this:\n\n  entry: {\n    \"phenomic.main\": [\n      process.env.PHENOMIC_ENV !== \"static\" && require.resolve(\"webpack-hot-middleware/client\"),\n      \"./App.js\"\n    ].filter(item => item),\n  }\n\n]\n`;\n\nexports[`validate object without key 1`] = `\n[Error: @phenomic/plugin-bundler-webpack expects an entry named 'phenomic.main' in your webpack config.\nYour current entries keys are 'stuff,thing'.\n\nPlease use an object like this:\n\n  entry: {\n    \"phenomic.main\": [\n      process.env.PHENOMIC_ENV !== \"static\" && require.resolve(\"webpack-hot-middleware/client\"),\n      \"./App.js\"\n    ].filter(item => item),\n  }\n\n]\n`;\n\nexports[`validate string 1`] = `\n[Error: @phenomic/plugin-bundler-webpack expects an entry named 'phenomic.main' in your webpack config.\nYour current entry is of type 'string'.\n\nPlease use an object like this:\n\n  entry: {\n    \"phenomic.main\": \"App.js\",\n  }\n\n]\n`;\n"
  },
  {
    "path": "packages/plugin-bundler-webpack/src/__tests__/index.js",
    "content": "// @flow\n\nimport defaultConfig from \"@phenomic/core/lib/defaultConfig.js\";\n\nimport validate from \"../WebpackConfigValidator.js\";\n\nconst defaultWebpackConfig = require(\"../webpack.config.js\");\n\ntest(\"validate default config\", () => {\n  expect(() => {\n    validate(defaultWebpackConfig(defaultConfig), defaultConfig);\n  }).not.toThrow();\n});\n\ntest(\"validate nothing\", () => {\n  try {\n    validate({}, defaultConfig);\n    throw new Error(\"pass but should not\");\n  } catch (e) {\n    expect(e).toMatchSnapshot();\n  }\n});\n\ntest(\"validate string\", () => {\n  try {\n    validate(\n      {\n        entry: \"App.js\",\n      },\n      defaultConfig,\n    );\n    throw new Error(\"pass but should not\");\n  } catch (e) {\n    expect(e).toMatchSnapshot();\n  }\n});\n\ntest(\"validate array\", () => {\n  try {\n    validate(\n      {\n        entry: [\"something.js\", \"App.js\"],\n      },\n      defaultConfig,\n    );\n    throw new Error(\"pass but should not\");\n  } catch (e) {\n    expect(e).toMatchSnapshot();\n  }\n});\n\ntest(\"validate object without key\", () => {\n  try {\n    validate(\n      {\n        entry: {\n          stuff: [\"something.js\", \"App.js\"],\n          thing: [\"something.js\", \"App.js\"],\n        },\n      },\n      defaultConfig,\n    );\n    throw new Error(\"pass but should not\");\n  } catch (e) {\n    expect(e).toMatchSnapshot();\n  }\n});\n"
  },
  {
    "path": "packages/plugin-bundler-webpack/src/index.js",
    "content": "// @flow\n\nimport path from \"path\";\n\nimport webpack from \"webpack\";\nimport webpackDevMiddleware from \"webpack-dev-middleware\";\nimport webpackHotMiddleware from \"webpack-hot-middleware\";\nimport logger from \"@phenomic/core/lib/logger\";\nimport { findCacheDirectory } from \"@phenomic/core/lib/Utils.bs.js\";\n\nimport webpackPromise from \"./webpack-promise.js\";\nimport getWebpackConfig from \"./WebpackGetConfig.js\";\nimport WebpackServerConfigModifier from \"./WebpackServerConfigModifier.js\";\n\nconst debug = require(\"debug\")(\"phenomic:plugin:bundler-webpack\");\n\nconst pluginName = \"@phenomic/plugin-bundler-webpack\";\nconst log = logger(pluginName);\n\nconst cacheDir = findCacheDirectory(\"webpack\");\n\nconst bundlerWebpack: PhenomicPluginModule<{}> = config => {\n  return {\n    name: pluginName,\n    addDevServerMiddlewares() {\n      debug(\"get middlewares\");\n      const webpackConfig = getWebpackConfig(config);\n      // $FlowFixMe interface sucks\n      const compiler = webpack(webpackConfig);\n      let assets = {};\n      // $FlowFixMe interface sucks\n      compiler.hooks.done.tap(pluginName + \"/dev-server-middleware\", stats => {\n        assets = {};\n        const namedChunks = stats.compilation.namedChunks;\n        namedChunks.forEach((chunk, chunkName) => {\n          const files = chunk.files.filter(\n            file => !file.endsWith(\".hot-update.js\"),\n          );\n          if (files.length) {\n            assets = {\n              ...assets,\n              [chunkName]: files.shift(),\n            };\n          }\n        });\n      });\n      return [\n        (\n          req: express$Request,\n          res: express$Response,\n          next: express$NextFunction,\n        ) => {\n          res.locals.assets = assets;\n          next();\n        },\n        webpackDevMiddleware(compiler, {\n          publicPath: config.baseUrl.pathname,\n          logLevel: \"warn\",\n          stats: webpackConfig.stats,\n          // logger: log, // output info even if logLevel: \"warn\"\n        }),\n        webpackHotMiddleware(compiler, { reload: true, log }),\n      ];\n    },\n    buildForPrerendering() {\n      debug(\"build for prerendering\");\n      return webpackPromise(WebpackServerConfigModifier(config, cacheDir)).then(\n        // $FlowFixMe no I can't\n        () => require(path.join(cacheDir, config.bundleName)).default,\n      );\n    },\n    build() {\n      debug(\"build\");\n      return webpackPromise(getWebpackConfig(config)).then(\n        stats => stats.toJson().assetsByChunkName,\n      );\n    },\n  };\n};\n\nexport default bundlerWebpack;\n"
  },
  {
    "path": "packages/plugin-bundler-webpack/src/webpack-promise.js",
    "content": "// @flow\nimport webpack from \"webpack\";\nimport logger from \"@phenomic/core/lib/logger\";\n\nconst pluginName = \"@phenomic/plugin-bundler-webpack\";\nconst log = logger(pluginName);\n\nexport default function(webpackConfig: Object): Promise<any> {\n  return new Promise((resolve, reject) => {\n    // $FlowFixMe interface sucks\n    webpack(webpackConfig).run((err, stats) => {\n      if (err) {\n        reject(err);\n      }\n\n      if (stats.hasWarnings()) {\n        log.warn(stats.toString(webpackConfig.stats).trim());\n      }\n\n      if (stats.hasErrors()) {\n        log.error(stats.toString(webpackConfig.stats).trim());\n        reject(\"webpack build failed with errors\");\n      }\n\n      resolve(stats);\n    });\n  });\n}\n"
  },
  {
    "path": "packages/plugin-bundler-webpack/src/webpack.config.js",
    "content": "// @flow\n\nimport path from \"path\";\n\nimport getClientEnvironment from \"@phenomic/core/lib/configuration/get-client-environment.js\";\nimport webpack from \"webpack\";\n// $FlowFixMe lazy me\nimport MiniCssExtractPlugin from \"mini-css-extract-plugin\";\nimport { findCacheDirectory } from \"@phenomic/core/lib/Utils.bs.js\";\n\nconst cacheDir = findCacheDirectory(\"webpack-babel\");\n\nmodule.exports = (config: PhenomicConfig) => ({\n  // https://webpack.js.org/configuration/stats/#stats\n  stats: \"minimal\",\n  mode: process.env.NODE_ENV,\n  entry: {\n    [config.bundleName]: [\n      process.env.PHENOMIC_ENV !== \"static\" &&\n        require.resolve(\"webpack-hot-middleware/client\"),\n      path.join(config.path, \"App.js\"),\n    ].filter(item => item),\n  },\n  output: {\n    publicPath: config.baseUrl.pathname,\n    path: path.isAbsolute(config.outdir)\n      ? config.outdir\n      : path.join(config.path, config.outdir),\n    ...(process.env.PHENOMIC_ENV !== \"static\"\n      ? {\n          filename: \"phenomic/[name].js\",\n          chunkFilename: \"phenomic/[name].chunk.js\",\n        }\n      : {\n          filename: \"phenomic/[name].[chunkhash:8].js\",\n          chunkFilename: \"phenomic/[name].[chunkhash:8].chunk.js\",\n        }),\n  },\n  module: {\n    rules: [\n      {\n        test: /\\.js$/,\n        exclude: /node_modules/,\n        use: [\n          {\n            loader: require.resolve(\"babel-loader\"),\n            options: {\n              cacheDirectory: cacheDir,\n              presets: [require(\"@phenomic/babel-preset\")],\n            },\n          },\n        ],\n      },\n      {\n        test: /\\.css$/,\n        use: [\n          process.env.PHENOMIC_ENV !== \"static\"\n            ? \"style-loader\"\n            : MiniCssExtractPlugin.loader,\n          require.resolve(\"css-loader\"),\n        ],\n      },\n    ],\n  },\n  // $FlowFixMe lazy me\n  plugins: [\n    process.env.PHENOMIC_ENV === \"static\" &&\n      new MiniCssExtractPlugin({\n        filename: \"phenomic/[name].[chunkhash:8].css\",\n        chunkFilename: \"phenomic/[name].[chunkhash:8].chunk.css\",\n      }),\n    (() => {\n      const envVars = getClientEnvironment(config);\n      return new webpack.DefinePlugin({\n        \"process.env\": Object.keys(envVars).reduce((env, key) => {\n          env[key] = JSON.stringify(envVars[key]);\n          return env;\n        }, {}),\n      });\n    })(),\n    process.env.PHENOMIC_ENV !== \"static\" &&\n      new webpack.HotModuleReplacementPlugin(),\n  ].filter(item => item),\n\n  resolve: {\n    // react-native(-web) | react-primitives\n    extensions: [\".web.js\", \".js\", \".json\"],\n  },\n\n  // eslint-disable-next-line max-len\n  // https://github.com/facebookincubator/create-react-app/blob/fbdff9d722d6ce669a090138022c4d3536ae95bb/packages/react-scripts/config/webpack.config.prod.js#L279-L285\n  node: {\n    fs: \"empty\",\n    net: \"empty\",\n    tls: \"empty\",\n  },\n});\n"
  },
  {
    "path": "packages/plugin-collector-files/README.md",
    "content": "# @phenomic/plugin-collector-files\n\n> Phenomic plugin to collect resources from files\n\n➡ More details at [phenomic.io](https://phenomic.io/)\n"
  },
  {
    "path": "packages/plugin-collector-files/bsconfig.json",
    "content": "{\n  \"name\": \"@phenomic/plugin-collector-files\",\n  \"refmt\": 3,\n  \"reason\": {\n    \"react-jsx\": 3\n  },\n  \"sources\": [\n    {\n      \"dir\": \"src\",\n      \"subdirs\": true\n    }\n  ],\n  \"suffix\": \".bs.js\",\n  \"package-specs\": {\n    \"module\": \"commonjs\",\n    \"in-source\": true\n  }\n}\n"
  },
  {
    "path": "packages/plugin-collector-files/package.json",
    "content": "{\n  \"name\": \"@phenomic/plugin-collector-files\",\n  \"version\": \"1.0.0\",\n  \"publishConfig\": {\n    \"access\": \"public\"\n  },\n  \"repository\": \"https://github.com/phenomic/phenomic.git\",\n  \"homepage\": \"https://phenomic.io\",\n  \"license\": \"MIT\",\n  \"authors\": [\n    \"Maxime Thirouin (MoOx)\",\n    \"bloodyowl <bloodyowl@icloud.com>\"\n  ],\n  \"keywords\": [\n    \"phenomic\",\n    \"phenomic-plugin\"\n  ],\n  \"description\": \"Phenomic plugin to collect resources from files\",\n  \"main\": \"lib/index.js\",\n  \"files\": [\n    \"lib\",\n    \"src\",\n    \"!**/__tests__\"\n  ],\n  \"dependencies\": {\n    \"debug\": \"^2.6.0\",\n    \"globby\": \"^6.1.0\",\n    \"sane\": \"^1.7.0\",\n    \"socket.io\": \"^1.7.2\"\n  },\n  \"peerDependencies\": {\n    \"@phenomic/core\": \"^1.0.0-beta.3\"\n  },\n  \"devDependencies\": {\n    \"@phenomic/core\": \"^1.0.0\"\n  }\n}\n"
  },
  {
    "path": "packages/plugin-collector-files/src/__tests__/__fixtures__/authors/bloodyowl.json",
    "content": "{\n  \"data\": {\n    \"name\": \"bloodyowl\",\n    \"bio\": \"bloodyowl short bio\",\n    \"body\": \"bloodyowl long bio\"\n  },\n  \"partial\": {\n    \"name\": \"bloodyowl\",\n    \"bio\": \"bloodyowl short bio\",\n    \"body\": \"bloodyowl long bio\"\n  }\n}\n"
  },
  {
    "path": "packages/plugin-collector-files/src/__tests__/__fixtures__/authors/moox.json",
    "content": "{\n  \"data\": {\n    \"name\": \"moox\",\n    \"bio\": \"moox short bio\",\n    \"body\": \"moox long bio\"\n  },\n  \"partial\": {\n    \"name\": \"moox\",\n    \"bio\": \"moox short bio\",\n    \"body\": \"moox long bio\"\n  }\n}\n"
  },
  {
    "path": "packages/plugin-collector-files/src/__tests__/__fixtures__/news/2017/06/introducing-1.0.0-alpha.json",
    "content": "{\n  \"data\": {\n    \"date\": \"2017-06-02T00:00:00.000Z\",\n    \"title\": \"Introducing Phenomic 1.0.0 first alpha\",\n    \"authors\": [\"bloodyowl\"],\n    \"body\": {\n      \"t\": \"div\",\n      \"c\": [\"Hi there. Alpha blah blah.\"]\n    }\n  },\n  \"partial\": {\n    \"date\": \"2017-06-02T00:00:00.000Z\",\n    \"title\": \"Introducing Phenomic 1.0.0 first alpha\",\n    \"authors\": [\"bloodyowl\"]\n  }\n}\n"
  },
  {
    "path": "packages/plugin-collector-files/src/__tests__/__fixtures__/showcase/entry/acrowithbrian.com.json",
    "content": "{\n  \"data\": {\n    \"title\": \"Brian Cruikshank Acro\",\n    \"url\": \"https://www.acrowithbrian.com/\",\n    \"source\": \"https://github.com/brianrc/acrowithbrian-site\",\n    \"showcaseTags\": [\"event\", \"blog\", \"learning\", \"business\"],\n    \"body\": { \"t\": \"div\" }\n  },\n  \"partial\": {\n    \"title\": \"Brian Cruikshank Acro\",\n    \"url\": \"https://www.acrowithbrian.com/\",\n    \"source\": \"https://github.com/brianrc/acrowithbrian-site\",\n    \"showcaseTags\": [\"event\", \"blog\", \"learning\", \"business\"]\n  }\n}\n"
  },
  {
    "path": "packages/plugin-collector-files/src/__tests__/__fixtures__/showcase/entry/anthonydugois.com__polynomic.json",
    "content": "{\n  \"data\": {\n    \"title\": \"Polynomic\",\n    \"url\": \"http://anthonydugois.com/polynomic/\",\n    \"source\": \"https://github.com/anthonydugois/polynomic\",\n    \"showcaseTags\": [\"docs\", \"open-source\"],\n    \"body\": { \"t\": \"div\" }\n  },\n  \"partial\": {\n    \"title\": \"Polynomic\",\n    \"url\": \"http://anthonydugois.com/polynomic/\",\n    \"source\": \"https://github.com/anthonydugois/polynomic\",\n    \"showcaseTags\": [\"docs\", \"open-source\"]\n  }\n}\n"
  },
  {
    "path": "packages/plugin-collector-files/src/__tests__/__fixtures__/showcase/entry/ced.photo.json",
    "content": "{\n  \"data\": {\n    \"title\": \"CeD photo\",\n    \"url\": \"https://www.ced.photo\",\n    \"source\": \"https://github.com/xuopled/ced.photo\",\n    \"showcaseTags\": [\"blog\", \"business\"],\n    \"body\": {\n      \"t\": \"p\",\n      \"c\": [\"Ced.photo is a ....\"]\n    }\n  },\n  \"partial\": {\n    \"title\": \"CeD photo\",\n    \"url\": \"https://www.ced.photo\",\n    \"source\": \"https://github.com/xuopled/ced.photo\",\n    \"showcaseTags\": [\"blog\", \"business\"]\n  }\n}\n"
  },
  {
    "path": "packages/plugin-collector-files/src/__tests__/__fixtures__/showcase/submit.json",
    "content": "{\n  \"data\": {\n    \"title\": \"Submit a website/app made with Phenomic to the Showcase\",\n    \"body\": {\n      \"t\": \"div\"\n    }\n  },\n  \"partial\": {\n    \"title\": \"Submit a website/app made with Phenomic to the Showcase\"\n  }\n}\n"
  },
  {
    "path": "packages/plugin-collector-files/src/__tests__/__fixtures__/showcaseTags/event.json",
    "content": "{\n  \"data\": {\n    \"name\": \"Event\",\n    \"body\": \"like wat\"\n  },\n  \"partial\": {\n    \"name\": \"Event\"\n  }\n}\n"
  },
  {
    "path": "packages/plugin-collector-files/src/__tests__/__fixtures__/showcaseTags/open-source.json",
    "content": "{\n  \"data\": {\n    \"name\": \"Open Source\",\n    \"body\": \"like OSS\"\n  },\n  \"partial\": {\n    \"name\": \"Open Source\"\n  }\n}\n"
  },
  {
    "path": "packages/plugin-collector-files/src/__tests__/__snapshots__/collect.js.snap",
    "content": "// Jest Snapshot v1, https://goo.gl/fbAQLP\n\nexports[`should collect everything 1`] = `\nArray [\n  Object {\n    \"filename\": \"acrowithbrian.com.json\",\n    \"id\": \"showcase/entry/acrowithbrian.com\",\n    \"showcaseTags\": Array [\n      \"event\",\n      \"blog\",\n      \"learning\",\n      \"business\",\n    ],\n    \"source\": \"https://github.com/brianrc/acrowithbrian-site\",\n    \"title\": \"Brian Cruikshank Acro\",\n    \"url\": \"https://www.acrowithbrian.com/\",\n  },\n  Object {\n    \"filename\": \"anthonydugois.com__polynomic.json\",\n    \"id\": \"showcase/entry/anthonydugois.com__polynomic\",\n    \"showcaseTags\": Array [\n      \"docs\",\n      \"open-source\",\n    ],\n    \"source\": \"https://github.com/anthonydugois/polynomic\",\n    \"title\": \"Polynomic\",\n    \"url\": \"http://anthonydugois.com/polynomic/\",\n  },\n  Object {\n    \"bio\": \"bloodyowl short bio\",\n    \"body\": \"bloodyowl long bio\",\n    \"filename\": \"bloodyowl.json\",\n    \"id\": \"authors/bloodyowl\",\n    \"name\": \"bloodyowl\",\n  },\n  Object {\n    \"filename\": \"ced.photo.json\",\n    \"id\": \"showcase/entry/ced.photo\",\n    \"showcaseTags\": Array [\n      \"blog\",\n      \"business\",\n    ],\n    \"source\": \"https://github.com/xuopled/ced.photo\",\n    \"title\": \"CeD photo\",\n    \"url\": \"https://www.ced.photo\",\n  },\n  Object {\n    \"filename\": \"event.json\",\n    \"id\": \"showcaseTags/event\",\n    \"name\": \"Event\",\n  },\n  Object {\n    \"bio\": \"moox short bio\",\n    \"body\": \"moox long bio\",\n    \"filename\": \"moox.json\",\n    \"id\": \"authors/moox\",\n    \"name\": \"moox\",\n  },\n  Object {\n    \"filename\": \"open-source.json\",\n    \"id\": \"showcaseTags/open-source\",\n    \"name\": \"Open Source\",\n  },\n  Object {\n    \"filename\": \"submit.json\",\n    \"id\": \"showcase/submit\",\n    \"title\": \"Submit a website/app made with Phenomic to the Showcase\",\n  },\n  Object {\n    \"authors\": Array [\n      \"bloodyowl\",\n    ],\n    \"date\": \"2017-06-02T00:00:00.000Z\",\n    \"filename\": \"introducing-1.0.0-alpha.json\",\n    \"id\": \"news/2017/06/introducing-1.0.0-alpha\",\n    \"title\": \"Introducing Phenomic 1.0.0 first alpha\",\n  },\n]\n`;\n\nexports[`should collect metadata 1`] = `\nArray [\n  Object {\n    \"filename\": \"event.json\",\n    \"id\": \"event\",\n    \"name\": \"Event\",\n  },\n  Object {\n    \"filename\": \"open-source.json\",\n    \"id\": \"open-source\",\n    \"name\": \"Open Source\",\n  },\n]\n`;\n\nexports[`should collect specific item 1`] = `\nObject {\n  \"id\": \"news/2017/06/introducing-1.0.0-alpha\",\n  \"value\": Object {\n    \"authors\": Array [\n      Object {\n        \"bio\": \"bloodyowl short bio\",\n        \"body\": \"bloodyowl long bio\",\n        \"filename\": \"bloodyowl.json\",\n        \"id\": \"bloodyowl\",\n        \"name\": \"bloodyowl\",\n      },\n    ],\n    \"body\": Object {\n      \"c\": Array [\n        \"Hi there. Alpha blah blah.\",\n      ],\n      \"t\": \"div\",\n    },\n    \"date\": \"2017-06-02T00:00:00.000Z\",\n    \"filename\": \"introducing-1.0.0-alpha.json\",\n    \"title\": \"Introducing Phenomic 1.0.0 first alpha\",\n  },\n}\n`;\n\nexports[`should collect specific path 1`] = `\nArray [\n  Object {\n    \"authors\": Array [\n      \"bloodyowl\",\n    ],\n    \"date\": \"2017-06-02T00:00:00.000Z\",\n    \"filename\": \"introducing-1.0.0-alpha.json\",\n    \"id\": \"06/introducing-1.0.0-alpha\",\n    \"title\": \"Introducing Phenomic 1.0.0 first alpha\",\n  },\n]\n`;\n"
  },
  {
    "path": "packages/plugin-collector-files/src/__tests__/collect.js",
    "content": "// @flow\n\nimport createDB from \"@phenomic/core/lib/db\";\nimport defaultConfig from \"@phenomic/core/lib/defaultConfig.js\";\n\nimport collector from \"..\";\n\nconst db = createDB({});\n\nconst config = {\n  ...defaultConfig,\n  path: __dirname,\n  content: {\n    \"\": { root: \"__fixtures__\", globs: [\"**/*\"] },\n  },\n};\n\nconst p = collector(config, {});\nit(\"should collect everything\", async () => {\n  if (p.collect) {\n    await p.collect({\n      db,\n      transformers: [\n        {\n          name: \"@phenomic/plugin-default-transform\",\n          supportedFileTypes: [\"json\"],\n          transform({ contents }) {\n            return JSON.parse(contents.toString());\n          },\n        },\n      ],\n    });\n  }\n\n  expect(await db.getList(\"__null__\")).toMatchSnapshot();\n});\n\nit(\"should collect specific path\", async () => {\n  expect(await db.getList(\"news/2017\")).toMatchSnapshot();\n});\n\nit(\"should collect metadata\", async () => {\n  expect(await db.getList(\"showcaseTags\")).toMatchSnapshot();\n});\n\nit(\"should collect specific item\", async () => {\n  expect(\n    await db.get(\"__null__\", \"news/2017/06/introducing-1.0.0-alpha\"),\n  ).toMatchSnapshot();\n});\n"
  },
  {
    "path": "packages/plugin-collector-files/src/__tests__/index.js",
    "content": "// @flow\n\nimport { makeId, getFieldValue, injectData, parsePath } from \"..\";\n\nit(\"should be able to generate keys\", () => {\n  expect(makeId(\"test\", { partial: {}, data: {} })).toEqual(\"test\");\n\n  expect(makeId(\"test.md\", { partial: {}, data: {} })).toEqual(\"test\");\n\n  // @todo handle this case\n  expect(makeId(\"test/index.md\", { partial: {}, data: {} })).toEqual(\"test\");\n  expect(makeId(\"test/test/index.md\", { partial: {}, data: {} })).toEqual(\n    \"test/test\",\n  );\n  expect(makeId(\"test\\\\test\\\\index.md\", { partial: {}, data: {} })).toEqual(\n    \"test/test\",\n  );\n\n  expect(makeId(\"test.md\", { partial: {}, data: { path: \"yep\" } })).toEqual(\n    \"yep\",\n  );\n});\n\nit(\"should be able to generate fields lists from arrays\", () => {\n  expect(\n    getFieldValue({ partial: {}, data: { tags: [\"test\", \"test2\"] } }, \"tags\"),\n  ).toEqual([\"test\", \"test2\"]);\n});\n\nit(\"should be able to generate fields lists from strings\", () => {\n  expect(\n    getFieldValue({ partial: {}, data: { tags: \"test\" } }, \"tags\"),\n  ).toEqual([\"test\"]);\n});\n\nit(\"should be able to generate fields lists from numbers\", () => {\n  expect(getFieldValue({ partial: {}, data: { tags: 2 } }, \"tags\")).toEqual([\n    2,\n  ]);\n});\n\nit(\"should be able to generate fields lists from booleans\", () => {\n  expect(getFieldValue({ partial: {}, data: { tags: false } }, \"tags\")).toEqual(\n    [false],\n  );\n});\n\nit(\"should be able to inject date from filename in data\", () => {\n  expect(injectData(\"2010-01-13-test.md\", { partial: {}, data: {} })).toEqual({\n    partial: {\n      date: \"2010-01-13\",\n      filename: \"2010-01-13-test.md\",\n    },\n    data: {\n      date: \"2010-01-13\",\n      filename: \"2010-01-13-test.md\",\n    },\n  });\n  expect(injectData(\"test.md\", { partial: {}, data: {} })).toEqual({\n    partial: {\n      filename: \"test.md\",\n    },\n    data: {\n      filename: \"test.md\",\n    },\n  });\n});\n\nit(\"should be able to parse filepath\", () => {\n  expect(parsePath(\"posts/november/2017-11-11-test.md\")).toEqual({\n    name: \"2017-11-11-test.md\",\n    allPaths: [\"posts\", \"posts/november\", \"posts/november/2017-11-11-test.md\"],\n  });\n});\n"
  },
  {
    "path": "packages/plugin-collector-files/src/index.js",
    "content": "// @flow\n\nimport fs from \"fs\";\nimport path from \"path\";\n\nimport globby from \"globby\";\nimport socketIO from \"socket.io\";\nimport logger from \"@phenomic/core/lib/logger\";\nimport getPath from \"@phenomic/core/lib/utils/getPath.js\";\n\nimport createWatcher from \"./watch.js\";\n\nconst debug = require(\"debug\")(\"phenomic:plugin:collector-files\");\n\nconst pluginName = \"@phenomic/plugin-collector-files\";\nconst log = logger(pluginName);\n\nconst sep = \"/\";\nfunction normalizeWindowsPath(value: string): string {\n  return value.replace(/(\\/|\\\\)+/g, sep);\n}\n\nconst toFile = (root, filepath) => ({\n  name: filepath,\n  fullpath: path.join(root, filepath),\n});\n\nfunction glob({\n  path,\n  patterns,\n}: {|\n  path: string,\n  patterns: $ReadOnlyArray<string>,\n|}): $ReadOnlyArray<PhenomicContentFile> {\n  return globby.sync(patterns, { cwd: path }).map(file => toFile(path, file));\n}\n\nconst readFile = (path: string): Promise<Buffer> =>\n  new Promise((resolve, reject) =>\n    fs.readFile(path, (error, file) => (error ? reject(error) : resolve(file))),\n  );\n\nexport function makeId(name: string, json: PhenomicTransformResult): string {\n  if (json.data.path) {\n    debug(`id for '${name}' is '${json.data.path}' (from json)`);\n    return json.data.path;\n  }\n  // normalize windows path\n  name = normalizeWindowsPath(name);\n  // remove (index).md,json etc, for id\n  const id = name\n    // remove extension for prettier keys\n    .replace(path.extname(name), \"\")\n    // remove index too (and consider README as index)\n    .replace(/\\/(index|README)$/, \"\");\n  debug(`id for '${name}' is '${id}' (automatically computed)`);\n  return id;\n}\n\nexport function formatDate(dateString: string) {\n  const date = new Date(dateString).toISOString();\n  return date.substring(0, date.indexOf(\"T\"));\n}\n\nfunction isLiteral(value) {\n  const type = typeof value;\n  return type === \"string\" || type === \"number\" || type === \"boolean\";\n}\n\nfunction isArrayOfLiterals(array) {\n  return Array.isArray(array) && array.every(isLiteral);\n}\n\nexport function getFieldValue(json: PhenomicTransformResult, id: string) {\n  if (isArrayOfLiterals(json.data[id])) {\n    return json.data[id];\n  }\n  if (isLiteral(json.data[id])) {\n    return [json.data[id]];\n  }\n  return [];\n}\n\nconst dateLength = \"YYYY-MM-DD\".length;\nexport function injectData(\n  name: string,\n  json: PhenomicTransformResult,\n): PhenomicTransformResult {\n  const injectedData: Object = {\n    filename: name,\n  };\n  try {\n    injectedData.date = formatDate(name.slice(0, dateLength));\n  } catch (e) {\n    // assuming date is not valid\n  }\n  return {\n    data: {\n      ...injectedData,\n      ...json.data,\n    },\n    partial: {\n      ...injectedData,\n      ...json.partial,\n    },\n  };\n}\n\nexport function parsePath(\n  name: string,\n): {| name: string, allPaths: $ReadOnlyArray<string> |} {\n  const pathSegments = name.split(sep);\n  return {\n    name: pathSegments[pathSegments.length - 1],\n    allPaths: pathSegments.reduce((acc, v) => {\n      acc.push(acc.length > 0 ? acc[acc.length - 1] + sep + v : v);\n      return acc;\n    }, []),\n  };\n}\n\nconst collectData = async ({ db, filename, data }) => {\n  // console.log(filename, data);\n  const json = data;\n  filename = normalizeWindowsPath(filename);\n  const id = makeId(filename, json);\n  const { name, allPaths } = parsePath(filename);\n\n  const adjustedJSON = injectData(name, json);\n  // debug(`collecting '${name}'`, adjustedJSON);\n  debug(`collecting '${name}' for ${allPaths.join(\", \")}`);\n  // full resource, not sorted\n  db.put(null, id, adjustedJSON);\n  return allPaths.map(pathName => {\n    let relativeKey = id.replace(pathName + sep, \"\");\n    if (relativeKey === pathName) {\n      relativeKey = \"\";\n    }\n    // debug(`collecting '${relativeKey}' for path '${pathName}'`);\n    // @todo optimize this and avoid inserting adjustedJSON several times\n    // we should be able to inject a ref to get it back from __null__ when\n    // reading\n    db.put([pathName], relativeKey, adjustedJSON);\n    db.put([pathName, \"default\"], relativeKey);\n    Object.keys(json.data).map(type => {\n      return getFieldValue(json, type).map(fieldValue => {\n        // debug(\n        //   `collecting '${relativeKey}' for path '${pathName}': ${type}/${\n        //     fieldValue\n        //   }`\n        // );\n        db.update([pathName, type, fieldValue], relativeKey);\n        db.update([type, \"default\"], fieldValue);\n        db.update([type, \"path\", pathName], fieldValue);\n      });\n    });\n  });\n};\n\nconst processFile = async ({\n  file,\n  contents,\n  transform,\n}: {\n  file: PhenomicContentFile,\n  contents: Buffer,\n  transform: PhenomicTransformer,\n}) => {\n  const transformed: PhenomicTransformResult = await transform({\n    file,\n    contents,\n  });\n\n  debug(`${file.name} processed`);\n  // Don't show drafts in production\n  if (process.env.NODE_ENV === \"production\" && transformed.data.draft) {\n    debug(`${file.name} skipped because it's a draft`);\n    return;\n  }\n\n  return transformed;\n};\n\ntype options = {|\n  // @todo move core config as plugin options\n|} | void; // void? https://github.com/facebook/flow/issues/2977\n\nconst collectorFiles: PhenomicPluginModule<options> = (\n  config: PhenomicConfig,\n  options?: options,\n) => {\n  let transformedMap: {\n    [key: string]: {|\n      contentKey: string,\n      file: PhenomicContentFile,\n      contents: Buffer,\n      transformed: PhenomicTransformResult,\n    |},\n  } = {};\n\n  return {\n    name: pluginName,\n    async collect({ db, transformers }) {\n      const transformByFileTypes: { [key: string]: PhenomicTransformer } = {};\n      transformers.forEach(\n        plugin =>\n          plugin.supportedFileTypes &&\n          plugin.supportedFileTypes.forEach(fileType => {\n            if (plugin.transform)\n              transformByFileTypes[fileType] = plugin.transform;\n          }),\n      );\n\n      const readAndTransform = async (\n        contentKey: string,\n        file: PhenomicContentFile,\n      ) => {\n        const transformer =\n          transformByFileTypes[path.extname(file.name).slice(1)];\n        // nothing to do with the file, ignoring\n        if (!transformer) {\n          debug(`No transformers found for ${file.name}, skipping`);\n          return;\n        }\n\n        // read file\n        let contents;\n        try {\n          contents = await readFile(file.fullpath);\n        } catch (err) {\n          if (err.code !== \"EISDIR\") console.error(file.name, err.message);\n          return;\n        }\n\n        const transformed = await processFile({\n          file,\n          contents: contents,\n          transform: transformer,\n        });\n\n        // for any reason, a transformer can decide to not return anything\n        if (!transformed) {\n          debug(`Transformation empty for ${file.name}, skipping`);\n          return;\n        }\n        // keep in memory for dev\n        transformedMap[file.fullpath] = {\n          contentKey,\n          file,\n          contents: contents,\n          transformed,\n        };\n      };\n      const forget = fullpath => {\n        delete transformedMap[fullpath];\n      };\n\n      const collectAll = async () => {\n        await db.destroy();\n        return await Promise.all(\n          Object.keys(transformedMap).map(fullpath =>\n            collectData({\n              db,\n              filename: path.join(\n                transformedMap[fullpath].contentKey,\n                transformedMap[fullpath].file.name,\n              ),\n              data: transformedMap[fullpath].transformed,\n            }),\n          ),\n        );\n      };\n\n      const maybeFolders = await Promise.all(\n        Object.keys(config.content).map(async contentKey => {\n          let globs;\n          try {\n            let folder;\n\n            // \"key(and folder)\": [\"glob/*\"]\n            if (Array.isArray(config.content[contentKey])) {\n              folder = path.join(config.path, contentKey);\n              globs = config.content[contentKey];\n            } else if (\n              config.content[contentKey].root &&\n              config.content[contentKey].globs\n            ) {\n              // \"key\": {root: folder, globs: [\"glob/*\"] }\n              folder = path.join(config.path, config.content[contentKey].root);\n              // $FlowFixMe stfu\n              globs = config.content[contentKey].globs;\n            } else {\n              throw new Error(\n                \"Unexpected config for 'content' option: \" +\n                  config.content[contentKey].toString(),\n              );\n            }\n\n            const contentPath = await getPath(folder);\n            return { contentKey, contentPath, globs };\n          } catch (e) {\n            log.warn(\n              `no '${contentKey}' folder found or unable to read files. Please create and put files in this folder (or double check it) if you want the content to be accessible (eg: markdown or JSON files). `,\n            );\n            return {};\n          }\n        }),\n      );\n\n      const folders = maybeFolders.filter(\n        folder => folder.contentKey !== undefined,\n      );\n\n      if (folders.length <= 0) {\n        return;\n      }\n\n      await Promise.all(\n        folders.map(async ({ contentKey, contentPath, globs }) => {\n          const files = glob({\n            path: contentPath,\n            // $FlowFixMe lazy me\n            patterns: globs,\n          });\n          await Promise.all(\n            files.map(file => readAndTransform(contentKey, file)),\n          );\n        }),\n      );\n      await collectAll();\n\n      if (process.env.PHENOMIC_ENV !== \"development\") {\n        // clean memory now as this won't be reused\n        transformedMap = {};\n        return;\n      }\n      // @todo if we want to make things \"clean\", we should returns\n      // socket/watchers so we can close those properly\n      const io = socketIO(config.socketPort);\n      await Promise.all(\n        folders.map(async ({ contentKey, contentPath, globs }) => {\n          const watcher = createWatcher({\n            path: await getPath(contentPath),\n            // $FlowFixMe stfu\n            patterns: globs,\n          });\n\n          watcher.on(\"ready\", () => {\n            debug(\"watcher ready\");\n            // io.emit(\"change\");\n          });\n          watcher.on(\"change\", async (name, root) => {\n            debug(`${name} has been updated`);\n            log.info(`${name} has been updated`);\n            await readAndTransform(contentKey, {\n              name,\n              fullpath: path.join(root, name),\n            });\n            await collectAll();\n            io.emit(\"change\");\n            debug(`Data updated`);\n          });\n          watcher.on(\"add\", async (name, root) => {\n            debug(`${name} has been added`);\n            log.info(`${name} has been added`);\n            await readAndTransform(contentKey, {\n              name,\n              fullpath: path.join(root, name),\n            });\n            await collectAll();\n            io.emit(\"change\");\n            debug(`Data updated`);\n          });\n          watcher.on(\"delete\", async (name, root) => {\n            log.info(`${name} has been deleted`);\n            forget(path.join(root, name));\n            await collectAll();\n            io.emit(\"change\");\n            debug(`Data updated`);\n          });\n          return watcher;\n        }),\n      );\n    },\n  };\n};\n\nexport default collectorFiles;\n"
  },
  {
    "path": "packages/plugin-collector-files/src/watch.js",
    "content": "// @flow\n\nimport sane from \"sane\";\n\nconst execSync = require(\"child_process\").execSync;\n\nconst canUseWatchman = ((): boolean => {\n  try {\n    execSync(\"watchman --version\", { stdio: [\"ignore\"] });\n    return true;\n  } catch (e) {\n    return false;\n  }\n})();\n\nconst debug = require(\"debug\")(\"phenomic:plugin:collector-files\");\n\nexport default (options: {\n  path: string,\n  patterns: $ReadOnlyArray<string>,\n}) => {\n  debug(\"path:\", options.path);\n  debug(\"extensions:\", options.patterns);\n  return sane(options.path, {\n    watchman: canUseWatchman,\n    glob: options.patterns,\n  });\n};\n"
  },
  {
    "path": "packages/plugin-public-assets/README.md",
    "content": "# @phenomic/plugin-public-assets\n\n> Phenomic plugin to copy a public directory to dist\n\n➡ More details at [phenomic.io](https://phenomic.io/)\n"
  },
  {
    "path": "packages/plugin-public-assets/bsconfig.json",
    "content": "{\n  \"name\": \"@phenomic/plugin-public-assets\",\n  \"refmt\": 3,\n  \"reason\": {\n    \"react-jsx\": 3\n  },\n  \"sources\": [\n    {\n      \"dir\": \"src\",\n      \"subdirs\": true\n    }\n  ],\n  \"suffix\": \".bs.js\",\n  \"package-specs\": {\n    \"module\": \"commonjs\",\n    \"in-source\": true\n  }\n}\n"
  },
  {
    "path": "packages/plugin-public-assets/docs/README.md",
    "content": "# @phenomic/plugin-public-assets\n\n@todo\n"
  },
  {
    "path": "packages/plugin-public-assets/package.json",
    "content": "{\n  \"name\": \"@phenomic/plugin-public-assets\",\n  \"version\": \"1.0.0\",\n  \"publishConfig\": {\n    \"access\": \"public\"\n  },\n  \"repository\": \"https://github.com/phenomic/phenomic.git\",\n  \"homepage\": \"https://phenomic.io\",\n  \"license\": \"MIT\",\n  \"authors\": [\n    \"Maxime Thirouin (MoOx)\",\n    \"bloodyowl <bloodyowl@icloud.com>\"\n  ],\n  \"keywords\": [\n    \"phenomic\",\n    \"phenomic-plugin\"\n  ],\n  \"description\": \"Phenomic plugin to copy a public directory to dist\",\n  \"main\": \"lib/index.js\",\n  \"files\": [\n    \"lib\",\n    \"src\",\n    \"!**/__tests__\"\n  ],\n  \"dependencies\": {\n    \"express\": \"^4.14.0\",\n    \"fs-extra\": \"^3.0.1\"\n  },\n  \"peerDependencies\": {\n    \"@phenomic/core\": \"^1.0.0-beta.3\"\n  },\n  \"devDependencies\": {\n    \"@phenomic/core\": \"^1.0.0\"\n  }\n}\n"
  },
  {
    "path": "packages/plugin-public-assets/src/index.js",
    "content": "// @flow\n\nimport path from \"path\";\n\nimport express from \"express\";\nimport fse from \"fs-extra\";\nimport logger from \"@phenomic/core/lib/logger\";\nimport getPath from \"@phenomic/core/lib/utils/getPath\";\n\ntype options = {|\n  path: string,\n|};\n\nconst pluginName = \"@phenomic/plugin-public-assets\";\nconst log = logger(pluginName);\n\nconst defaultOptions = {\n  path: \"public\",\n};\n\nconst publicAssets: PhenomicPluginModule<options> = (\n  config: PhenomicConfig,\n  options = defaultOptions,\n) => {\n  const warnNoPublic = () => {\n    log.warn(\n      `No '${\n        options.path\n      }' folder found. Please create this folder if you want static files to be served from the root (eg: favicon.ico).`,\n    );\n  };\n  return {\n    name: pluginName,\n    addDevServerMiddlewares() {\n      return getPath(path.join(config.path, options.path)).then(\n        (publicPath: string) => [express.static(publicPath)],\n        () => {\n          warnNoPublic();\n          return [];\n        },\n      );\n    },\n    beforeBuild() {\n      return new Promise((resolve, reject) => {\n        getPath(path.join(config.path, options.path)).then(\n          (publicPath: string) => {\n            fse.copy(publicPath, path.join(config.path, config.outdir), err => {\n              if (err) {\n                reject(err);\n              }\n              resolve();\n            });\n          },\n          () => {\n            warnNoPublic();\n            resolve();\n          },\n        );\n      });\n    },\n  };\n};\n\nexport default publicAssets;\n"
  },
  {
    "path": "packages/plugin-renderer-react/README.md",
    "content": "# @phenomic/plugin-renderer-react\n\n> Phenomic plugin that allow you to use React to render your website/app.\n\n➡ More details at [phenomic.io](https://phenomic.io/)\n"
  },
  {
    "path": "packages/plugin-renderer-react/bsconfig.json",
    "content": "{\n  \"name\": \"@phenomic/plugin-renderer-react\",\n  \"refmt\": 3,\n  \"reason\": {\n    \"react-jsx\": 3\n  },\n  \"sources\": [\n    {\n      \"dir\": \"src\",\n      \"subdirs\": true\n    }\n  ],\n  \"suffix\": \".bs.js\",\n  \"package-specs\": {\n    \"module\": \"commonjs\",\n    \"in-source\": true\n  },\n  \"bs-dependencies\": [\"reason-react\"]\n}\n"
  },
  {
    "path": "packages/plugin-renderer-react/docs/README.md",
    "content": "---\ntitle: \"Phenomic React renderer plugin\"\n---\n\n@todo\n"
  },
  {
    "path": "packages/plugin-renderer-react/package.json",
    "content": "{\n  \"name\": \"@phenomic/plugin-renderer-react\",\n  \"version\": \"1.0.0\",\n  \"publishConfig\": {\n    \"access\": \"public\"\n  },\n  \"repository\": \"https://github.com/phenomic/phenomic.git\",\n  \"homepage\": \"https://phenomic.io\",\n  \"license\": \"MIT\",\n  \"authors\": [\n    \"Maxime Thirouin (MoOx)\",\n    \"bloodyowl <bloodyowl@icloud.com>\"\n  ],\n  \"keywords\": [\n    \"phenomic\",\n    \"phenomic-plugin\",\n    \"react\"\n  ],\n  \"description\": \"Phenomic plugin that allow you to use React to render your website/app\",\n  \"main\": \"lib/index.js\",\n  \"files\": [\n    \"lib\",\n    \"src\",\n    \"!**/__tests__\",\n    \"bsconfig.json\"\n  ],\n  \"dependencies\": {\n    \"@phenomic/api-client\": \"^1.0.0\",\n    \"chalk\": \"^1.1.3\",\n    \"classnames\": \"^2.2.5\",\n    \"debug\": \"^2.6.0\",\n    \"hoist-non-react-statics\": \"^2.5.0\",\n    \"prop-types\": \"^15.5.8\",\n    \"socket.io-client\": \"^1.7.2\",\n    \"striptags\": \"^2.0.0\",\n    \"url-join\": \"^2.0.2\"\n  },\n  \"peerDependencies\": {\n    \"@phenomic/core\": \"^1.0.0-beta.3\",\n    \"react\": \"^15.0.0 || ^16.0.0\",\n    \"react-dom\": \"^15.0.0 || ^16.0.0\",\n    \"react-router\": \"^3.2.0\"\n  },\n  \"devDependencies\": {\n    \"@phenomic/core\": \"^1.0.0\",\n    \"jsx-test-helpers\": \"^3.0.0\",\n    \"react\": \"^16.8.0\",\n    \"react-dom\": \"^16.8.0\",\n    \"react-router\": \"^3.2.0\"\n  }\n}\n"
  },
  {
    "path": "packages/plugin-renderer-react/src/__tests__/__snapshots__/resolveURLs-list.js.snap",
    "content": "// Jest Snapshot v1, https://goo.gl/fbAQLP\n\nexports[`should be able to resolve dynamic urls 1`] = `\nArray [\n  \"test/test-1\",\n  \"test/test-2\",\n]\n`;\n"
  },
  {
    "path": "packages/plugin-renderer-react/src/__tests__/__snapshots__/resolveURLs.js.snap",
    "content": "// Jest Snapshot v1, https://goo.gl/fbAQLP\n\nexports[`should be able to generate a multiple static url 1`] = `\nArray [\n  \"\",\n  \"test\",\n]\n`;\n\nexports[`should be able to generate a single url 1`] = `\nArray [\n  \"\",\n]\n`;\n\nexports[`should be able to get urls from the static method 1`] = `\nArray [\n  \"\",\n  \"test/1\",\n  \"test/2\",\n  \"test/3\",\n]\n`;\n"
  },
  {
    "path": "packages/plugin-renderer-react/src/__tests__/resolveURLs-list.js",
    "content": "// @flow\n\n/* eslint-disable import/first */\njest.mock(\"@phenomic/api-client/lib/fetch\", () => () =>\n  Promise.resolve({\n    list: [{ id: \"test-1\" }, { id: \"test-2\" }],\n  }),\n);\n\nimport query from \"@phenomic/api-client/lib/query\";\n\nimport resolve from \"../resolveURLs.js\";\n\nit(\"should be able to resolve dynamic urls\", async () => {\n  expect(\n    await resolve({\n      routes: [\n        {\n          path: \"/test/*\",\n          component: {\n            getQueries: (/*params: PhenomicQueryConfig*/) => ({\n              test: query({\n                // id: \"one\"\n                // path?: string,\n                // after?: string,\n                // by?: string,\n                // value?: string,\n                // order?: string,\n                // limit?: number\n              }),\n            }),\n          },\n        },\n      ],\n    }),\n  ).toMatchSnapshot();\n});\n"
  },
  {
    "path": "packages/plugin-renderer-react/src/__tests__/resolveURLs.js",
    "content": "// @flow\n\n/* eslint-disable import/first */\njest.mock(\"@phenomic/api-client/lib/fetch\", () => () =>\n  Promise.resolve({\n    list: [],\n  }),\n);\n\nimport resolve from \"../resolveURLs.js\";\n\nconst NoopComponent = {\n  fakeComponent: true, // to pass test on component being valid\n};\n\nit(\"should be able to generate a single url\", async () => {\n  expect(\n    await resolve({\n      routes: [\n        {\n          path: \"/\",\n          component: NoopComponent,\n        },\n      ],\n    }),\n  ).toMatchSnapshot();\n});\n\nit(\"should be able to generate a multiple static url\", async () => {\n  expect(\n    await resolve({\n      routes: [\n        {\n          path: \"/\",\n          component: NoopComponent,\n        },\n        {\n          path: \"/test\",\n          component: NoopComponent,\n        },\n      ],\n    }),\n  ).toMatchSnapshot();\n});\n\nit(\"should be able to get urls from the static method\", async () => {\n  function getAllPossibleUrls({ path }) {\n    if (!path.includes(\":arg\")) return [path];\n    return [1, 2, 3].map(i => path.replace(\":arg\", String(i)));\n  }\n\n  expect(\n    await resolve({\n      routes: [\n        {\n          path: \"/\",\n          component: {\n            getAllPossibleUrls,\n          },\n        },\n        {\n          path: \"/test/:arg\",\n          component: {\n            getAllPossibleUrls,\n          },\n        },\n      ],\n    }),\n  ).toMatchSnapshot();\n});\n"
  },
  {
    "path": "packages/plugin-renderer-react/src/bodyRenderer.re",
    "content": "type reasonChildren = list(reasonChild)\nand reasonChild =\n  | String(string)\n  | Element(string, Js.t({.}), reasonChildren)\n  | Empty;\n\ntype jsBody = {\n  .\n  \"t\": string,\n  \"p\": Js.t({.}),\n  \"c\": Js.Null_undefined.t(array(jsBody)),\n};\n\nlet rec jsTreeToReason = (jsChild: jsBody) =>\n  switch ([%bs.raw {| Object.prototype.toString.call(jsChild) |}]) {\n  | \"[object String]\" => String(Js.String.make(jsChild))\n  | \"[object Object]\" =>\n    let tag = Js.String.make(jsChild##t);\n    let props = [%bs.raw\n      \"(function() {\n        var p = Object.assign({}, jsChild.p);\n        if (p.class) {\n          p.className = p.class;\n          delete p.class;\n        }\n        return p;\n      })()\"\n    ];\n    let children =\n      switch (Js.Null_undefined.toOption(jsChild##c)) {\n      | Some(c) => List.map(jsTreeToReason, Array.to_list(c))\n      | None => []\n      };\n    Element(tag, props, children);\n  | _ => Empty\n  };\n\n[@react.component]\nlet make = (~body: jsBody) => {\n  let rec renderChild = child =>\n    switch (child) {\n    | String(string) => React.string(string)\n    | Element(tag, originalProps, reasonChildren) =>\n      switch (tag) {\n      | \"a\" =>\n        <Link\n          href=[%bs.raw {| child[1].href |}]\n          style=[%bs.raw {| child[1].style |}]\n          activeStyle=[%bs.raw {| child[1].activeStyle |}]\n          className=[%bs.raw {| child[1].className |}]\n          activeClassName=[%bs.raw {| child[1].activeClassName |}]>\n          {React.array(Array.of_list(List.map(renderChild, reasonChildren)))}\n        </Link>\n      | _ =>\n        ReactDOMRe.createElement(\n          tag,\n          ~props=ReactDOMRe.objToDOMProps(originalProps),\n          [|\n            React.array(\n              Array.of_list(List.map(renderChild, reasonChildren)),\n            ),\n          |],\n        )\n      }\n    | Empty => React.null\n    };\n  body |> jsTreeToReason |> renderChild;\n};\n"
  },
  {
    "path": "packages/plugin-renderer-react/src/client.js",
    "content": "// @flow\n\nimport query from \"@phenomic/api-client/lib/query\";\n\nimport createApp, { renderApp } from \"./createApp.js\";\nimport createContainer from \"./deprecated-createContainer.js\";\nimport withInitialProps from \"./withInitialProps\";\nimport withPhenomicApi from \"./withPhenomicApi\";\nimport Provider from \"./components/Provider\";\nimport BodyRenderer from \"./components/BodyRenderer\";\nimport textRenderer from \"./components/textRenderer\";\nimport Link from \"./components/Link\";\n\nexport {\n  renderApp,\n  createApp,\n  createContainer,\n  withInitialProps,\n  withPhenomicApi,\n  Provider,\n  query,\n  BodyRenderer,\n  textRenderer,\n  Link,\n};\n"
  },
  {
    "path": "packages/plugin-renderer-react/src/components/BodyRenderer.js",
    "content": "// @flow\n\n/* eslint-disable react/no-multi-comp */\n// because it considers render() as a react compo\n/* eslint-disable react/no-unused-prop-types */\n// because it's a bit dumb\n\nimport * as React from \"react\";\n\nimport Link from \"./Link.js\";\n\ntype ComponentType = string | React.ComponentType<*>;\n\n// eslint-disable-next-line flowtype/require-exact-type\ntype OptionsType = {\n  components?: { [key: string]: ComponentType },\n  DefaultComponent?: ComponentType,\n};\n\ntype ItemType =\n  | string\n  | {\n      // tag\n      t?: string,\n      // props\n      p?: Object,\n      // children\n      c: ItemType | $ReadOnlyArray<ItemType>,\n    };\n\ntype PropsType = OptionsType & {\n  children?: ItemType,\n};\n\nconst defaultProps = { DefaultComponent: \"div\" };\n\nconst defaultOptions: OptionsType = {\n  components: {\n    a: Link,\n  },\n};\n\nconst render = (item: ItemType, options: OptionsType, key: ?any) => {\n  if (!item) {\n    return null;\n  }\n  if (typeof item === \"string\") {\n    return item;\n  }\n  const { p: props = {}, c: children } = item;\n  const Tag =\n    (options.components && item.t && options.components[item.t]) ||\n    item.t ||\n    options.DefaultComponent ||\n    defaultProps.DefaultComponent;\n\n  const newProps = { ...props };\n  // special case for html class\n  if (newProps.class) {\n    newProps.className = newProps.class;\n    delete newProps.class;\n  }\n\n  return (\n    // $FlowFixMe will fix later\n    <Tag {...newProps} key={key}>\n      {Array.isArray(children)\n        ? children.map((child: ItemType, key) => render(child, options, key))\n        : render(children, options)}\n    </Tag>\n  );\n};\n\nconst BodyRenderer = ({ children, ...props }: PropsType) => {\n  if (typeof children === \"undefined\") {\n    console.error(\n      \"@phenomic/plugin-renderer-react: BodyRenderer expects at least a child\",\n    );\n    return null;\n  }\n  if (typeof children === \"string\") {\n    return <div dangerouslySetInnerHTML={{ __html: children }} />;\n  }\n  const r = render(children, {\n    ...defaultOptions,\n    ...(props || defaultProps),\n    // force to mix components, as default one (Link) is crucial\n    components: {\n      ...defaultOptions.components,\n      ...(props.components || {}),\n    },\n  });\n  const { DefaultComponent = defaultProps.DefaultComponent } = props;\n  return typeof r === \"string\" ? <DefaultComponent>{r}</DefaultComponent> : r;\n};\n\nexport default BodyRenderer;\n"
  },
  {
    "path": "packages/plugin-renderer-react/src/components/HTML.js",
    "content": "// @flow\n\nimport * as React from \"react\";\n\nconst Html: PhenomicHtmlType = ({ App, render }: PhenomicHtmlPropsType) => {\n  const { Main, State, Script, Style } = render(<App />);\n  return (\n    <html>\n      <head>\n        <meta charSet=\"utf-8\" />\n        <meta name=\"viewport\" content=\"width=device-width, initial-scale=1\" />\n        <Style />\n      </head>\n      <body>\n        <Main />\n        <State />\n        <Script />\n      </body>\n    </html>\n  );\n};\n\nexport default Html;\n"
  },
  {
    "path": "packages/plugin-renderer-react/src/components/Link.hash.js",
    "content": "// @flow\n\nconst lookForElement = (id: string) => {\n  // id=\n  const element = document.getElementById(id);\n  if (element) return element;\n  // name=\n  const elementsSet = document.getElementsByName(id);\n  if (elementsSet.length) return elementsSet[0];\n};\n\nlet retryTimeout = null;\nlet retryCount = 0;\nconst retryDelay = 100;\nconst retryMax = 1000; // 1000 * retryDelay = retry during 10s in case of slow network\n\n// @todo instead of doing a max number of tries, we could imagine trying every\n// x previous delay x 2 (; previous delay = delay x 2)\n\nconst moveToHash = (id: string) => {\n  if (id === \"\") return;\n  const element = lookForElement(id);\n  if (!element && retryCount < retryMax) {\n    retryTimeout = setTimeout(() => {\n      retryCount++;\n      moveToHash(id);\n    }, retryDelay);\n  }\n  if (element) element.scrollIntoView();\n};\n\nexport default (hash: string) => {\n  retryCount = 1;\n  if (retryTimeout) {\n    clearTimeout(retryTimeout);\n  }\n  moveToHash(hash.replace(/^#/, \"\"));\n};\n"
  },
  {
    "path": "packages/plugin-renderer-react/src/components/Link.js",
    "content": "// @flow\nimport * as React from \"react\";\nimport PropTypes from \"prop-types\";\nimport cx from \"classnames\";\n\nimport moveToHash from \"./Link.hash.js\";\n\nconst BASENAME = process.env.PHENOMIC_APP_BASENAME || \"/\";\n\nconst origin = url =>\n  // jsdom can return \"null\" string...\n  (url.origin !== \"null\" && url.origin) ||\n  // // IE does not correctly handle origin, maybe Edge does...\n  url.protocol + \"//\" + url.hostname + (url.port ? \":\" + url.port : \"\");\n\ntype PropsType = {|\n  style?: Object,\n  activeStyle?: Object,\n  className?: string,\n  activeClassName?: string,\n  to?: string,\n  href?: string,\n  children?: React.Node,\n  onClick?: (event: SyntheticEvent<HTMLAnchorElement>) => void,\n  onPress?: (event: SyntheticEvent<HTMLAnchorElement>) => void,\n|};\n\nexport const isSameOrigin = (url: HTMLAnchorElement) =>\n  origin(url) === origin(window.location) &&\n  url.pathname.indexOf(BASENAME) > -1;\n\nconst shouldIgnoreEvent = (event: SyntheticEvent<HTMLAnchorElement>) =>\n  // If target prop is set (e.g. to \"_blank\"), let browser handle link.\n  (event.currentTarget && event.currentTarget.target) ||\n  event.defaultPrevented ||\n  // $FlowFixMe modifier pressed\n  (event.metaKey || event.altKey || event.ctrlKey || event.shiftKey || false);\n\nconst goToUrl = (event: SyntheticEvent<HTMLAnchorElement>, router: Object) => {\n  if (event.currentTarget && isSameOrigin(event.currentTarget)) {\n    event.preventDefault();\n    // extract to get only interesting parts\n    const { pathname, search, hash } = event.currentTarget;\n    const route = {\n      // ensure we don't provide the basename (if defined in rr config)\n      // but ensure we provide a / as the first char\n      // ( to avoid rr weird bug where page is ok, but url is drunk)\n      pathname: pathname.replace(BASENAME.slice(0, -1), \"\"),\n      search,\n      hash,\n    };\n    // react-router v3\n    if (router.push) router.push(route);\n    else if (router.history && router.history.push)\n      // react-router v4\n      // $FlowFixMe well it's hard to support 2 APIs ?\n      router.history.push(route);\n\n    // react-router doesn't handle the scroll\n    // so we scroll to top or move to the hash\n    if (!hash) window.scrollTo(0, 0);\n    else moveToHash(hash);\n  }\n};\n\nexport const handleEvent = (\n  props: Object,\n  router: Object,\n  test?: (event: SyntheticEvent<HTMLAnchorElement>, props?: Object) => boolean,\n) => (\n  event:\n    | SyntheticMouseEvent<HTMLAnchorElement>\n    | SyntheticKeyboardEvent<HTMLAnchorElement>,\n) => {\n  if (props && props.onPress) props.onPress(event);\n  if (props && props.onClick) props.onClick(event);\n  if (!shouldIgnoreEvent(event) && (test ? test(event, props) : true))\n    goToUrl(event, router);\n};\n\nexport const handleClick = (props: Object, router: Object) =>\n  handleEvent(\n    props,\n    router,\n    // $FlowFixMe left click\n    (event: SyntheticMouseEvent<HTMLAnchorElement>) => event.button === 0,\n  );\n\nexport const handleKeyDown = (props: Object, router: Object) =>\n  handleEvent(\n    props,\n    router,\n    // $FlowFixMe  enter key\n    (event: SyntheticKeyboardEvent<HTMLAnchorElement>) => event.keyCode === 13,\n  );\n\nexport const isActive = (url: string, { router }: Object) => {\n  let urlObj = { pathname: url };\n  // trick to normalize url when possible, by the browser\n  // (eg: relative links are \"resolved\")\n  if (typeof document !== \"undefined\") {\n    const link = document.createElement(\"a\");\n    link.href = url;\n    if (isSameOrigin(link)) {\n      urlObj = { pathname: link.pathname };\n      // now 'urlObj' is absolute\n    }\n  }\n\n  return router && router.isActive && router.isActive(urlObj);\n};\n\nfunction Link(props: PropsType, context: Object) {\n  const {\n    to,\n    style,\n    activeStyle,\n    className,\n    activeClassName,\n    ...otherProps\n  } = props;\n  const href = to || props.href || \"\";\n\n  const isUrlActive = isActive(href, context);\n  const computedClassName = cx(className, isUrlActive && activeClassName);\n  const computedStyle = {\n    ...style,\n    ...(isUrlActive ? activeStyle : {}),\n  };\n\n  return (\n    <a\n      {...otherProps}\n      href={\n        href.indexOf(\"://\") > -1\n          ? href\n          : href.charAt(0) === \"/\"\n            ? BASENAME + href.slice(1)\n            : href\n      }\n      onClick={handleClick(props, context.router)}\n      onKeyDown={handleKeyDown(props, context.router)}\n      // weird syntax to avoid undefined/empty object/strings\n      // for now, it's falling back to normal links\n      {...(Object.keys(computedStyle).length ? { style: computedStyle } : {})}\n      {...(computedClassName ? { className: computedClassName } : {})}\n    />\n  );\n}\n\nLink.contextTypes = {\n  router: PropTypes.object.isRequired,\n};\n\nLink.displayName = \"Link\";\n\nexport default Link;\n"
  },
  {
    "path": "packages/plugin-renderer-react/src/components/Provider.js",
    "content": "// @flow\n\nimport * as React from \"react\";\nimport PropTypes from \"prop-types\";\n\nimport performQuery from \"../shared/performQuery\";\n\ntype props = {|\n  children?: React.Node,\n  store: Object,\n  __prerendering?: boolean,\n|};\n\nclass Provider extends React.Component<props> {\n  static childContextTypes = {\n    query: PropTypes.func,\n    phenomic: PropTypes.object.isRequired,\n    __prerendering: PropTypes.bool,\n  };\n  getChildContext() {\n    return {\n      phenomic: this.props.store,\n      query: this.query,\n      __prerendering: !!this.props.__prerendering,\n    };\n  }\n  query = (queries: $ReadOnlyArray<any>) => {\n    performQuery(this.props.store, queries);\n  };\n  render() {\n    return React.Children.only(this.props.children);\n  }\n}\n\nexport default Provider;\n"
  },
  {
    "path": "packages/plugin-renderer-react/src/components/__tests__/BodyRenderer.js",
    "content": "// @flow\n\n/* eslint-disable react/no-multi-comp */\n\nimport * as React from \"react\";\nimport { render, renderJSX } from \"jsx-test-helpers\";\n\nimport BodyRenderer from \"../BodyRenderer\";\n\ntest(\"BodyRenderer tells you when pass undefined\", () => {\n  const spy = jest.spyOn(console, \"error\");\n  expect(render(<BodyRenderer />)).toMatchSnapshot();\n  expect(spy).toHaveBeenCalled();\n});\n\ntest(\"BodyRenderer works with raw html\", () => {\n  expect(\n    renderJSX(<BodyRenderer>{\"<h1>Test</h1\"}</BodyRenderer>),\n  ).toMatchSnapshot();\n});\n\ntest(\"BodyRenderer works with phenomic json body\", () => {\n  expect(\n    renderJSX(\n      <BodyRenderer>\n        {{\n          t: \"p\",\n          p: { className: \"test\" },\n          c: [\n            {\n              t: \"a\",\n              p: { href: \"http://test\" },\n              c: \"Link\",\n            },\n          ],\n        }}\n      </BodyRenderer>,\n    ),\n  ).toMatchSnapshot();\n});\n\ntest(\"BodyRenderer accepts a map for components\", () => {\n  const map = {\n    p: function View(props: Object) {\n      return <div>{props.children}</div>;\n    },\n    a: function Link(props: Object) {\n      return (\n        <a href={props.href} className=\"auto\">\n          {props.children}\n        </a>\n      );\n    },\n  };\n  expect(\n    renderJSX(\n      <BodyRenderer components={map}>\n        {{\n          t: \"p\",\n          p: { className: \"test\" },\n          c: [\n            {\n              t: \"a\",\n              p: { href: \"http://test\" },\n              c: \"Link\",\n            },\n          ],\n        }}\n      </BodyRenderer>,\n    ),\n  ).toMatchSnapshot();\n});\n"
  },
  {
    "path": "packages/plugin-renderer-react/src/components/__tests__/Html.js",
    "content": "// @flow\n\n/* eslint-disable react/no-multi-comp */\n\nimport * as React from \"react\";\nimport { renderJSX } from \"jsx-test-helpers\";\n\nimport Html from \"../HTML\";\n\nconst App = () => <div>{\"App\"}</div>;\nconst render = App => {\n  return {\n    Main: () => <App />,\n    State: () => <script type=\"text/json\">{'{st:\"ate\"}'}</script>,\n    Script: () => <script src=\"sc/ript\" />,\n    Style: () => <link src=\"sc/ript\" />,\n    assets: {},\n  };\n};\n\ntest(\"Html works\", () => {\n  expect(renderJSX(<Html App={App} render={render} />)).toMatchSnapshot();\n});\n"
  },
  {
    "path": "packages/plugin-renderer-react/src/components/__tests__/Link.js",
    "content": "// @flow\n\n/* eslint-disable react/no-multi-comp */\n\nimport * as React from \"react\";\nimport { renderJSX } from \"jsx-test-helpers\";\n\nimport Link from \"../Link\";\n\ntest(\"Link works with ``to``\", () => {\n  expect(renderJSX(<Link to=\"/b\">{\"c\"}</Link>)).toMatchSnapshot();\n});\n\ntest(\"Link onPress/onClick\", () => {\n  const onPress = jest.fn();\n  renderJSX(\n    <Link to=\"/b\" onPress={onPress}>\n      {\"c\"}\n    </Link>,\n    render => render.props.onPress({}),\n  );\n  expect(onPress).toHaveBeenCalled();\n\n  const onClick = jest.fn();\n  renderJSX(\n    <Link to=\"/b\" onClick={onClick}>\n      {\"c\"}\n    </Link>,\n    render => render.props.onClick({}),\n  );\n  expect(onClick).toHaveBeenCalled();\n});\n\ntest(\"Link works with ``href``\", () => {\n  expect(renderJSX(<Link href=\"/b\">{\"c\"}</Link>)).toMatchSnapshot();\n});\n\ntest(\"Link works with external ``href``\", () => {\n  expect(renderJSX(<Link href=\"http://b.com\">{\"c\"}</Link>)).toMatchSnapshot();\n});\n\ntest(\"Link works with external ``href``\", () => {\n  expect(renderJSX(<Link href=\"http://b.com\">{\"c\"}</Link>)).toMatchSnapshot();\n});\n\ntest(\"Link works with internal ``href``\", () => {\n  expect(\n    renderJSX(<Link href=\"http://url.tld/internal\">{\"c\"}</Link>),\n  ).toMatchSnapshot();\n  expect(renderJSX(<Link href=\"/internal\">{\"c\"}</Link>)).toMatchSnapshot();\n});\n\ntest(\"Link activeClassName?\", () => {\n  expect(\n    renderJSX(\n      <Link href=\"/internal\" activeClassName=\"activeCx\">\n        {\"c\"}\n      </Link>,\n      {\n        router: { isActive: () => true },\n      },\n    ),\n  ).toMatchSnapshot();\n  expect(\n    renderJSX(\n      <Link href=\"/internal\" activeClassName=\"activeCx\">\n        {\"c\"}\n      </Link>,\n      {\n        router: { isActive: () => false },\n      },\n    ),\n  ).toMatchSnapshot();\n});\n\n/* eslint-disable react-native/no-inline-styles */\ntest(\"Link activeStyle?\", () => {\n  expect(\n    renderJSX(\n      <Link href=\"/internal\" activeStyle={{ color: \"blue\" }}>\n        {\"c\"}\n      </Link>,\n      {\n        router: { isActive: () => true },\n      },\n    ),\n  ).toMatchSnapshot();\n  expect(\n    renderJSX(\n      <Link href=\"/internal\" activeStyle={{ color: \"blue\" }}>\n        {\"c\"}\n      </Link>,\n      {\n        router: { isActive: () => false },\n      },\n    ),\n  ).toMatchSnapshot();\n});\n/* eslint-enable react-native/no-inline-styles */\n"
  },
  {
    "path": "packages/plugin-renderer-react/src/components/__tests__/__snapshots__/BodyRenderer.js.snap",
    "content": "// Jest Snapshot v1, https://goo.gl/fbAQLP\n\nexports[`BodyRenderer accepts a map for components 1`] = `\n\"<View className=\\\\\"test\\\\\">\n  <Link href=\\\\\"http://test\\\\\">\n    Link\n  </Link>\n</View>\"\n`;\n\nexports[`BodyRenderer tells you when pass undefined 1`] = `null`;\n\nexports[`BodyRenderer works with phenomic json body 1`] = `\n\"<p className=\\\\\"test\\\\\">\n  <Link href=\\\\\"http://test\\\\\">\n    Link\n  </Link>\n</p>\"\n`;\n\nexports[`BodyRenderer works with raw html 1`] = `\n\"<div\n  dangerouslySetInnerHTML={{\n    __html: '<h1>Test</h1'\n  }}\n />\"\n`;\n"
  },
  {
    "path": "packages/plugin-renderer-react/src/components/__tests__/__snapshots__/Html.js.snap",
    "content": "// Jest Snapshot v1, https://goo.gl/fbAQLP\n\nexports[`Html works 1`] = `\n\"<html>\n  <head>\n    <meta charSet=\\\\\"utf-8\\\\\" />\n    <meta\n      content=\\\\\"width=device-width, initial-scale=1\\\\\"\n      name=\\\\\"viewport\\\\\"\n    />\n    <Style />\n  </head>\n  <body>\n    <Main />\n    <State />\n    <Script />\n  </body>\n</html>\"\n`;\n"
  },
  {
    "path": "packages/plugin-renderer-react/src/components/__tests__/__snapshots__/Link.js.snap",
    "content": "// Jest Snapshot v1, https://goo.gl/fbAQLP\n\nexports[`Link activeClassName? 1`] = `\n\"<a\n  className=\\\\\"activeCx\\\\\"\n  href=\\\\\"/internal\\\\\"\n  onClick={function noRefCheck() {}}\n  onKeyDown={function noRefCheck() {}}\n>\n  c\n</a>\"\n`;\n\nexports[`Link activeClassName? 2`] = `\n\"<a\n  href=\\\\\"/internal\\\\\"\n  onClick={function noRefCheck() {}}\n  onKeyDown={function noRefCheck() {}}\n>\n  c\n</a>\"\n`;\n\nexports[`Link activeStyle? 1`] = `\n\"<a\n  href=\\\\\"/internal\\\\\"\n  onClick={function noRefCheck() {}}\n  onKeyDown={function noRefCheck() {}}\n  style={{\n    color: 'blue'\n  }}\n>\n  c\n</a>\"\n`;\n\nexports[`Link activeStyle? 2`] = `\n\"<a\n  href=\\\\\"/internal\\\\\"\n  onClick={function noRefCheck() {}}\n  onKeyDown={function noRefCheck() {}}\n>\n  c\n</a>\"\n`;\n\nexports[`Link works with \\`\\`href\\`\\` 1`] = `\n\"<a\n  href=\\\\\"/b\\\\\"\n  onClick={function noRefCheck() {}}\n  onKeyDown={function noRefCheck() {}}\n>\n  c\n</a>\"\n`;\n\nexports[`Link works with \\`\\`to\\`\\` 1`] = `\n\"<a\n  href=\\\\\"/b\\\\\"\n  onClick={function noRefCheck() {}}\n  onKeyDown={function noRefCheck() {}}\n>\n  c\n</a>\"\n`;\n\nexports[`Link works with external \\`\\`href\\`\\` 1`] = `\n\"<a\n  href=\\\\\"http://b.com\\\\\"\n  onClick={function noRefCheck() {}}\n  onKeyDown={function noRefCheck() {}}\n>\n  c\n</a>\"\n`;\n\nexports[`Link works with external \\`\\`href\\`\\` 2`] = `\n\"<a\n  href=\\\\\"http://b.com\\\\\"\n  onClick={function noRefCheck() {}}\n  onKeyDown={function noRefCheck() {}}\n>\n  c\n</a>\"\n`;\n\nexports[`Link works with internal \\`\\`href\\`\\` 1`] = `\n\"<a\n  href=\\\\\"http://url.tld/internal\\\\\"\n  onClick={function noRefCheck() {}}\n  onKeyDown={function noRefCheck() {}}\n>\n  c\n</a>\"\n`;\n\nexports[`Link works with internal \\`\\`href\\`\\` 2`] = `\n\"<a\n  href=\\\\\"/internal\\\\\"\n  onClick={function noRefCheck() {}}\n  onKeyDown={function noRefCheck() {}}\n>\n  c\n</a>\"\n`;\n"
  },
  {
    "path": "packages/plugin-renderer-react/src/components/__tests__/__snapshots__/textRenderer.js.snap",
    "content": "// Jest Snapshot v1, https://goo.gl/fbAQLP\n\nexports[`textRenderer tells you when pass undefined 1`] = `\"\"`;\n\nexports[`textRenderer works with phenomic json body 1`] = `\"Link text fat\"`;\n\nexports[`textRenderer works with raw html 1`] = `\"Test\"`;\n"
  },
  {
    "path": "packages/plugin-renderer-react/src/components/__tests__/textRenderer.js",
    "content": "// @flow\n\n/* eslint-disable react/no-multi-comp */\n\nimport textRenderer from \"../textRenderer\";\n\ntest(\"textRenderer tells you when pass undefined\", () => {\n  const spy = jest.spyOn(console, \"error\");\n  expect(textRenderer()).toMatchSnapshot();\n  expect(spy).toHaveBeenCalled();\n});\n\ntest(\"textRenderer works with raw html\", () => {\n  expect(textRenderer(\"<h1>Test</h1\")).toMatchSnapshot();\n});\n\ntest(\"textRenderer works with phenomic json body\", () => {\n  expect(\n    textRenderer({\n      t: \"p\",\n      p: { className: \"test\" },\n      c: [\n        {\n          t: \"a\",\n          p: { href: \"http://test\" },\n          c: \"Link\",\n        },\n        \" \",\n        {\n          t: \"span\",\n          c: \"text\",\n        },\n        \" \",\n        {\n          t: \"strong\",\n          c: \"fat\",\n        },\n      ],\n    }),\n  ).toMatchSnapshot();\n});\n"
  },
  {
    "path": "packages/plugin-renderer-react/src/components/textRenderer.js",
    "content": "// @flow\n\n/* eslint-disable react/no-multi-comp */\n// because it considers render() as a react compo\n/* eslint-disable react/no-unused-prop-types */\n// because it's a bit dumb\n\nimport striptags from \"striptags\";\n\ntype ItemType =\n  | string\n  | {\n      // tag\n      t?: string,\n      // props\n      p?: Object,\n      // children\n      c: ItemType | $ReadOnlyArray<ItemType>,\n    };\n\nconst render = (item: ItemType) => {\n  if (!item) {\n    return \"\";\n  }\n\n  if (typeof item === \"string\") {\n    return item;\n  }\n\n  const { c: children } = item;\n\n  return Array.isArray(children)\n    ? children.map((child: ItemType) => render(child)).join(\"\")\n    : render(children);\n};\n\nconst textRenderer = (tree?: ItemType) => {\n  if (typeof tree === \"undefined\") {\n    console.error(\n      \"@phenomic/plugin-renderer-react: textRenderer expects at least a child\",\n    );\n    return \"\";\n  }\n\n  if (typeof tree === \"string\") {\n    return striptags(tree);\n  }\n\n  return render(tree);\n};\n\nexport default textRenderer;\n"
  },
  {
    "path": "packages/plugin-renderer-react/src/createApp.js",
    "content": "// @flow\n\nimport * as React from \"react\";\nimport ReactDOM from \"react-dom\";\n\nimport Provider from \"./components/Provider\";\nimport createStore from \"./shared/store\";\n\nconst debug = require(\"debug\")(\"phenomic:plugin:renderer-react\");\n\nconst defaultRender =\n  typeof document !== \"undefined\" &&\n  !document.querySelector(\"#phenomic-DevLoader\") &&\n  ReactDOM.hydrate\n    ? ReactDOM.hydrate\n    : ReactDOM.render;\n\nlet store;\n\nexport const renderApp = (\n  routes: () => React.Element<any>,\n  render: Function = defaultRender,\n  callback?: () => void,\n) => {\n  debug(\"client rendering\");\n\n  const initialStateNode = document.getElementById(\"PhenomicHydration\");\n  store =\n    store ||\n    createStore(\n      initialStateNode && initialStateNode.textContent\n        ? JSON.parse(initialStateNode.textContent)\n        : undefined,\n    );\n\n  let root = document.getElementById(\"PhenomicRoot\");\n  if (!root) {\n    root = document.createElement(\"div\");\n    root.id = \"PhenomicRoot\";\n    if (!document.body) {\n      throw new Error(\"Rendering the app without a body element is impossible\");\n    }\n    document.body.appendChild(root);\n  }\n\n  render(<Provider store={store}>{routes()}</Provider>, root, callback);\n};\n\nexport default (\n  routes: () => React.Element<any>,\n  render?: Function,\n  callback?: () => void,\n): PhenomicAppType => {\n  if (typeof window !== \"undefined\") {\n    renderApp(routes, render, callback);\n  }\n  return {\n    routes: routes(),\n  };\n};\n"
  },
  {
    "path": "packages/plugin-renderer-react/src/deprecated-createContainer.js",
    "content": "// @flow\n\nimport * as React from \"react\";\n\nimport { getDisplayName } from \"./utils\";\nimport withPhenomicApi from \"./withPhenomicApi\";\n\nexport default function deprecatedCreateContainer<P>(\n  ComposedComponent: React.ComponentType<P>,\n  getQueries: (props: Object) => Object = () => ({}),\n) {\n  const displayName = getDisplayName(ComposedComponent);\n  console.warn(\n    \"`createContainer` has been renamed to `withPhenomicApi`. You can just replace this and this warning will go away (you can import the new name from the same place as before), in \" +\n      displayName,\n  );\n  return withPhenomicApi(ComposedComponent, getQueries);\n}\n"
  },
  {
    "path": "packages/plugin-renderer-react/src/index.js",
    "content": "// @flow\n\nimport renderDevServer from \"./server/dev-server\";\nimport renderStatic from \"./server/static\";\nimport getRoutes from \"./server/getRoutes\";\nimport resolveURLs from \"./resolveURLs\";\n\nconst rendererReact: PhenomicPluginModule<{}> = (config: PhenomicConfig) => {\n  return {\n    name: \"@phenomic/plugin-renderer-react\",\n    getRoutes,\n    resolveURLs,\n    renderDevServer: renderDevServer(config),\n    renderStatic: renderStatic(config),\n  };\n};\n\nexport default rendererReact;\n"
  },
  {
    "path": "packages/plugin-renderer-react/src/link.re",
    "content": "[@bs.module \"@phenomic/plugin-renderer-react/lib/components/Link\"]\n[@react.component]\nexternal make:\n  (\n    ~href: string=?,\n    ~style: ReactDOMRe.Style.t=?,\n    ~activeStyle: ReactDOMRe.Style.t=?,\n    ~className: string=?,\n    ~activeClassName: string=?,\n    ~children: React.element\n  ) =>\n  React.element =\n  \"default\";\n"
  },
  {
    "path": "packages/plugin-renderer-react/src/phenomicRendererReactClient.re",
    "content": "[@bs.module \"@phenomic/plugin-renderer-react/lib/client\"]\nexternal createContainer_: (React.component('a), Js.t({..})) => React.component('b) =\n  \"createContainer\";\n\n[@bs.module \"@phenomic/plugin-renderer-react/lib/client\"]\nexternal withPhenomicApi_: (React.component('a), Js.t({..})) => React.component('b) =\n  \"withPhenomicApi\";\n\n[@bs.module \"@phenomic/plugin-renderer-react/lib/client\"]\nexternal withInitialProps_:\n  (React.component('a), Js.t({..})) => React.component('b) =\n  \"withInitialProps\";\n\nmodule BodyRenderer = BodyRenderer;\n\nmodule Link = Link;\n\nlet createContainer = (comp, queries) => createContainer_(comp, queries);\n\nlet withPhenomicApi = (comp, queries) => withPhenomicApi_(comp, queries);\n\nlet withInitialProps = comp => withInitialProps_(comp);\n\ntype jsNodeList('a) = {\n  .\n  \"list\": array('a),\n  \"previousPageIsFirst\": bool,\n  \"previous\": Js.nullable(string),\n  \"next\": Js.nullable(string),\n};\n\ntype edge('a) =\n  | Idle('a)\n  | Loading\n  | Inactive\n  | Errored;\n\ntype jsEdge('a) = {\n  .\n  \"status\": string,\n  \"node\": 'a,\n};\n\nlet jsEdge = jsEdge =>\n  switch (jsEdge##status) {\n  | \"loading\" => Loading\n  | \"error\" => Errored\n  | \"idle\" => Idle(jsEdge##node)\n  | \"inactive\"\n  | _ => Inactive\n  };\n"
  },
  {
    "path": "packages/plugin-renderer-react/src/renderHTML.js",
    "content": "// @flow\n\nimport path from \"path\";\n\nimport * as React from \"react\";\nimport ReactDOMServer from \"react-dom/server\";\n\nimport DefaultHtml from \"./components/HTML\";\n\nconst debug = require(\"debug\")(\"phenomic:plugin:renderer-react\");\n\n/* eslint-disable react/no-multi-comp */\n/* eslint-disable react/jsx-no-bind */\n\nconst isNotFoundError = e => e.code === \"MODULE_NOT_FOUND\";\n\ntype htmlPropsType = {|\n  WrappedApp: ReactCompo,\n  renderAsObject: (\n    app: React$Node,\n  ) => {\n    main: string,\n    state?: Object | null,\n    assets: PhenomicAssets,\n  },\n|};\n\nconst renderHTML = (props: htmlPropsType, config: PhenomicConfig): string => {\n  let Html: PhenomicHtmlType;\n  try {\n    // $FlowFixMe Shushhhh!\n    Html = require(path.join(config.path, \"Html.js\")).default;\n  } catch (e) {\n    if (!isNotFoundError(e)) {\n      throw e;\n    }\n    debug(\"Html component cannot be used\", e.toString());\n    Html = DefaultHtml;\n  }\n\n  /* eslint-disable react/prop-types */\n  return (\n    \"<!DOCTYPE html>\" +\n    ReactDOMServer.renderToStaticMarkup(\n      <Html\n        App={props.WrappedApp}\n        render={UserWrappedApp => {\n          const { main, state, assets } = props.renderAsObject(UserWrappedApp);\n          const sets: $ReadOnlyArray<string> = Object.keys(assets).reduce(\n            (acc, name) => acc.concat(assets[name]),\n            [],\n          );\n          const css = sets.filter(asset => asset.endsWith(\".css\")).shift();\n          const js = sets.filter(asset => asset.endsWith(\".js\")).shift();\n          return {\n            html: main,\n            Main: ({ html = main }) => (\n              <div\n                id=\"PhenomicRoot\"\n                dangerouslySetInnerHTML={{ __html: html || null }}\n              />\n            ),\n            State: () =>\n              state && (\n                <script\n                  id=\"PhenomicHydration\"\n                  type=\"text/json\"\n                  dangerouslySetInnerHTML={{\n                    __html: JSON.stringify(state),\n                  }}\n                />\n              ),\n            // eslint-disable-next-line react/no-multi-comp\n            Style: () =>\n              css ? (\n                <link rel=\"stylesheet\" href={config.baseUrl.pathname + css} />\n              ) : null,\n            Script: () =>\n              js ? (\n                <script src={config.baseUrl.pathname + js} async={true} />\n              ) : null,\n            assets,\n          };\n        }}\n      />,\n    )\n  );\n};\n\nexport default renderHTML;\n"
  },
  {
    "path": "packages/plugin-renderer-react/src/resolveURLs.js",
    "content": "// @flow\n\nimport resolveUrlsFromPhenomicApi from \"./resolveUrlsFromPhenomicApi\";\n\nconst debug = require(\"debug\")(\"phenomic:plugin:renderer-react\");\n\nconst arrayUnique = array => [...new Set(array)];\n\nconst flatten = (array: $ReadOnlyArray<any>) => {\n  const flattenedArray = [];\n  array.forEach(item => {\n    if (Array.isArray(item)) flattenedArray.push(...flatten(item));\n    else flattenedArray.push(item);\n  });\n\n  return flattenedArray;\n};\n\nconst resolveUrlsForDynamicParams = async function(route: PhenomicRoute) {\n  if (\n    // reference is incorrect? (eg: import { Thing } instead of import Thing)\n    !route.component ||\n    // no export?\n    (Object.keys(route.component).length === 0 &&\n      // $FlowFixMe we know, u don't\n      route.component.constructor === Object)\n  ) {\n    throw new Error(\n      `Route with path '${\n        route.path\n      }' have no component (or an undefined value).\\n` +\n        \"Check the component reference and its origin. Are the import/export correct?\",\n    );\n  }\n  const maybeResolvedRoute = await resolveUrlsFromPhenomicApi(route);\n  if (maybeResolvedRoute !== false) {\n    return maybeResolvedRoute;\n  }\n\n  if (route.component.getAllPossibleUrls) {\n    return await route.component.getAllPossibleUrls({ path: route.path });\n  }\n\n  return route.path;\n};\n\nconst normalizePath = (path: string) => path.replace(/^\\//, \"\");\n\nconst resolveUrls = async function({\n  routes,\n}: {\n  routes: $ReadOnlyArray<PhenomicRoute>,\n}) {\n  const dynamicRoutes = await Promise.all(\n    routes.map(route => resolveUrlsForDynamicParams(route)),\n  );\n  const flattenedDynamicRoutes = flatten(dynamicRoutes);\n  const filtredDynamicRoutes = flattenedDynamicRoutes.filter(url => {\n    if (url.includes(\"*\")) {\n      debug(\n        `${url} is including a '*' but it has not been resolved: url is skipped`,\n      );\n      return false;\n    }\n    return true;\n  });\n\n  const normalizedURLs = filtredDynamicRoutes.map(normalizePath);\n  debug(\"normalize urls\", normalizedURLs);\n  return arrayUnique(normalizedURLs);\n};\n\nexport default resolveUrls;\n"
  },
  {
    "path": "packages/plugin-renderer-react/src/resolveUrlsFromPhenomicApi.js",
    "content": "// @flow\n\nimport fetchRestApi from \"@phenomic/api-client/lib/fetch\";\nimport query from \"@phenomic/api-client/lib/query\";\nimport { encode } from \"@phenomic/core/lib/api/helpers\";\n\nconst debug = require(\"debug\")(\"phenomic:plugin:renderer-react\");\n\nconst defaultQueryKey = \"default\";\nconst mainKey = \"id\";\n\nconst arrayUnique = array => [...new Set(array)];\n\nconst getMainQuery = (routeQueries, route) => {\n  const keys = Object.keys(routeQueries);\n  const firstKey = keys[0];\n  const firstKeyAsInt = parseInt(firstKey, 10);\n  // parseInt(\"12.\") == \"12\"\n  if (\n    // $FlowFixMe it's on purpose\n    firstKeyAsInt == firstKey &&\n    String(firstKeyAsInt).length == firstKey.length\n  ) {\n    console.warn(`The main path used for ${route.path} is ${firstKey}`);\n  }\n  return { key: firstKey, item: routeQueries[firstKey] };\n};\n\nexport default async function(route: PhenomicRoute) {\n  // double check, to make flow happy\n  if (!route.component.getQueries) {\n    return false;\n  }\n  const routeQueries = route.component.getQueries({\n    // why are we doing this?\n    params: route.params || {},\n  });\n  const mainQuery = getMainQuery(routeQueries, route);\n  if (!mainQuery.item) {\n    debug(\"no query detected for\", route.path);\n    return false;\n  }\n\n  debug(route.path, `fetching path '${mainQuery.key}'`, routeQueries);\n  let key =\n    (routeQueries[mainQuery.key] && routeQueries[mainQuery.key].by) || mainKey;\n  if (key === defaultQueryKey) {\n    key = mainKey;\n  }\n  let queryResult;\n  try {\n    queryResult = await fetchRestApi(query({ path: mainQuery.item.path }));\n  } catch (e) {\n    // log simple-json-fetch error if any\n    throw e.error || e;\n  }\n  debug(\n    route.path,\n    `path fetched. ${queryResult.list.length} items (id: ${key})`,\n  );\n  // get all possible values for the query\n  const list = arrayUnique(\n    queryResult.list.reduce((acc, item) => {\n      if (!item[key]) return acc;\n      if (Array.isArray(item[key])) acc = acc.concat(item[key]);\n      else acc.push(item[key]);\n      return acc;\n    }, []),\n  );\n  debug(route.path, \"list (unique)\", list);\n  const urlsData = list.reduce((acc, value) => {\n    let resolvedPath = route.path.replace(\":\" + key, value);\n    let params = { [key]: value };\n\n    // try * if url has not param\n    if (key === mainKey && resolvedPath === route.path) {\n      resolvedPath = resolvedPath.replace(\"*\", value);\n      // react-router splat is considered as the id\n      params = { splat: value };\n    }\n    if (route.path !== resolvedPath)\n      acc.push({ ...route, path: resolvedPath, params });\n    return acc;\n  }, []);\n\n  debug(route.path, \"urls data\", urlsData);\n\n  // if no data found, we still try to render something\n  const finalUrlsData = urlsData.length ? urlsData : [{ path: route.path }];\n  // try :after with key\n  const reAfter = /:after\\b/;\n\n  return finalUrlsData.reduce((acc, routeData) => {\n    if (!routeData.path.match(reAfter)) {\n      acc.push(routeData.path);\n    } else {\n      queryResult.list.map(item => {\n        // $FlowFixMe params[key] act as a truthy value\n        if (routeData.params && routeData.params[key]) {\n          if (\n            (Array.isArray(item[key]) &&\n              item[key].includes(routeData.params[key])) ||\n            item[key] === routeData.params[key]\n          ) {\n            acc.push(routeData.path.replace(reAfter, encode(item.id)));\n          }\n        } else {\n          acc.push(routeData.path.replace(reAfter, encode(item.id)));\n        }\n      });\n    }\n\n    return acc;\n  }, []);\n}\n"
  },
  {
    "path": "packages/plugin-renderer-react/src/server/__tests__/__snapshots__/getRoutes.js.snap",
    "content": "// Jest Snapshot v1, https://goo.gl/fbAQLP\n\nexports[`should resolve URLs based on routes 1`] = `\nArray [\n  Object {\n    \"component\": [Function],\n    \"path\": \"/\",\n  },\n  Object {\n    \"component\": [Function],\n    \"path\": \"/docs/*\",\n  },\n  Object {\n    \"component\": [Function],\n    \"path\": \"/*\",\n  },\n]\n`;\n"
  },
  {
    "path": "packages/plugin-renderer-react/src/server/__tests__/getRoutes.js",
    "content": "// @flow\n\nimport * as React from \"react\";\n\nimport getRoutes from \"../getRoutes\";\n\nconst Noop = () => {\n  return null;\n};\nconst noop = () => {};\nit(\"should resolve URLs based on routes\", async () => {\n  const Router = Noop;\n  const Route = Noop;\n  const browserHistory = noop;\n  const Wrapper = Noop;\n  const Home = Noop;\n  const DocPage = Noop;\n  const PageError = Noop;\n\n  expect(\n    await getRoutes({\n      routes: (\n        <Router history={browserHistory}>\n          <Route component={Wrapper}>\n            <Route path=\"/\" component={Home} />\n            <Route path=\"/docs/*\" component={DocPage} />\n            <Route path=\"*\" component={PageError} />\n          </Route>\n        </Router>\n      ),\n    }),\n  ).toMatchSnapshot();\n});\n"
  },
  {
    "path": "packages/plugin-renderer-react/src/server/dev-server.js",
    "content": "// @flow\n\nimport * as React from \"react\";\nimport ReactDOMServer from \"react-dom/server\";\n\nimport renderHTML from \"../renderHTML\";\n\nconst DefaultDevContent = () => (\n  /* eslint-disable react-native/no-inline-styles */\n  <div\n    id=\"phenomic-DevLoader\"\n    style={{\n      color: \"red\",\n      font: \"caption\",\n      fontSize: \"2rem\",\n      padding: \"40vh 10vw\",\n      textAlign: \"center\",\n    }}\n  >\n    ...\n    <script\n      dangerouslySetInnerHTML={{\n        __html: `\n    window.onerror = function(e) {\n      var devLoader = document.querySelector(\"#phenomic-DevLoader\")\n      if (devLoader) { devLoader.innerHTML = e.toString() }\n      // only need to use this code once\n      window.onerror = null\n    }`,\n      }}\n    />\n    <noscript>\n      {`Phenomic development server requires JavaScript.\n      If you want to check our your website works without JavaScript, you need to\n      build the static version and server the result.\n      You can do this by doing in your terminal:`}\n      <pre style={{ textAlign: \"left\" }}>\n        <code>\n          {\"npm run build\" +\n            \"\\n\" +\n            \"npm install -g serve\" +\n            \"\\n\" +\n            \"serve dist\"}\n        </code>\n      </pre>\n    </noscript>\n  </div>\n);\n/* eslint-enable react-native/no-inline-styles */\n\nconst _renderDevServer = (\n  config,\n  {\n    assets,\n    // location\n  },\n) =>\n  renderHTML(\n    {\n      WrappedApp: DefaultDevContent,\n      renderAsObject: UserWrappedApp => ({\n        main:\n          process.env.PHENOMIC_ENV === \"static\"\n            ? ReactDOMServer.renderToString(UserWrappedApp)\n            : ReactDOMServer.renderToStaticMarkup(UserWrappedApp),\n        state: null,\n        assets,\n      }),\n    },\n    config,\n  );\n\nconst renderDevServer = (config: PhenomicConfig) => (args: {|\n  assets: PhenomicAssets,\n  location: string,\n|}) => _renderDevServer(config, args);\n\nexport default renderDevServer;\n"
  },
  {
    "path": "packages/plugin-renderer-react/src/server/getRoutes.js",
    "content": "// @flow\n\nimport urlJoin from \"url-join\";\nimport { createRouteFromReactElement } from \"react-router/lib/RouteUtils\";\n\nconst debug = require(\"debug\")(\"phenomic:plugin:renderer-react\");\n\nfunction flattenRoutes(routes, path = \"\") {\n  debug(\"flattenRoutes\");\n\n  return routes.reduce((acc, route) => {\n    const nextRoute = {\n      ...route,\n      path: (route.path || \"\").startsWith(\"/\")\n        ? route.path\n        : route.path\n          ? urlJoin(path, route.path)\n          : path,\n    };\n    if (route.childRoutes) {\n      acc.push(...flattenRoutes(nextRoute.childRoutes, nextRoute.path));\n    } else {\n      acc.push(nextRoute);\n    }\n    return acc;\n  }, []);\n}\n\nfunction getRoutes(app: PhenomicAppType) {\n  const routes = createRouteFromReactElement(app.routes);\n  const flatRoutes = flattenRoutes(routes.childRoutes);\n  debug(flatRoutes);\n  return flatRoutes;\n}\n\nexport default getRoutes;\n"
  },
  {
    "path": "packages/plugin-renderer-react/src/server/static.js",
    "content": "// @flow\n\nimport path from \"path\";\n\nimport * as React from \"react\";\nimport ReactDOMServer from \"react-dom/server\";\nimport { match, RouterContext } from \"react-router\";\nimport { createRouteFromReactElement } from \"react-router/lib/RouteUtils\";\nimport createURL from \"@phenomic/api-client/lib/url\";\n\nimport Provider from \"../components/Provider\";\nimport createStore from \"../shared/store\";\nimport performQuery from \"../shared/performQuery\";\nimport { encode, decode } from \"../shared/QueryString\";\nimport renderHTML from \"../renderHTML\";\nimport type { StoreType } from \"../shared/store\";\n\nconst debug = require(\"debug\")(\"phenomic:plugin:renderer-react\");\n\nfunction getMatch({ routes, location }) {\n  return new Promise((resolve, reject) => {\n    match(\n      { routes, location: `/${location}` },\n      (error, redirectLocation, renderProps) => {\n        if (error) reject(error);\n        else resolve({ renderProps, redirectLocation });\n      },\n    );\n  });\n}\n\nfunction staticRenderToString(\n  config: PhenomicConfig,\n  store: StoreType,\n  { renderProps }: { renderProps: Object },\n  renderHTML: typeof renderHTML,\n  assets: PhenomicAssets,\n) {\n  return renderHTML(\n    {\n      WrappedApp: () => (\n        <Provider store={store}>\n          <RouterContext {...renderProps} />\n        </Provider>\n      ),\n      renderAsObject: (UserWrappedApp: React.Node) => ({\n        main: ReactDOMServer.renderToString(UserWrappedApp),\n        state: store.getState(),\n        assets,\n      }),\n    },\n    config,\n  );\n}\n\nconst _renderStatic = async (\n  config: PhenomicConfig,\n  {\n    app,\n    assets,\n    location,\n  }: {|\n    app: PhenomicAppType,\n    assets: PhenomicAssets,\n    location: string,\n  |},\n) => {\n  debug(location, \"server renderering\");\n\n  const routes = createRouteFromReactElement(app.routes);\n  const store = createStore();\n  const { renderProps, redirectLocation } = await getMatch({\n    routes,\n    location,\n  });\n\n  // debug(location, \"renderProps\", renderProps);\n\n  // debug(location, \"phenomic api store is going to be filled\");\n  const phenomicApiContainers = renderProps.components.filter(\n    item => item && typeof item.getQueries === \"function\",\n  );\n  await Promise.all(\n    phenomicApiContainers.map(item => {\n      const queries = item.getQueries(renderProps);\n      return performQuery(\n        store,\n        Object.keys(queries).map(key => encode(queries[key])),\n      );\n    }),\n  );\n  // debug(location, \"phenomic api store has been prepared\");\n\n  const containers = renderProps.components.filter(\n    item => item && typeof item.getInitialProps === \"function\",\n  );\n  // we should only have one\n  if (containers.length > 1) {\n    throw Error(\n      \"Only a single async container can be used on a given route (`static async getInitialProps`), found \" +\n        containers.length,\n    );\n  }\n  await Promise.all(\n    containers.map(async item => {\n      renderProps.params.__initialPropsForSSR = await item.getInitialProps({\n        pathname: renderProps.location.pathname,\n        params: renderProps.params,\n      });\n    }),\n  );\n\n  const contents = await staticRenderToString(\n    config,\n    store,\n    { renderProps, redirectLocation },\n    renderHTML,\n    assets,\n  );\n  const state = store.getState();\n  // don't prepend index.html if location already have .html\n  const filepath = location.match(/\\.html$/)\n    ? location\n    : path.join(location, \"index.html\");\n  return [\n    { path: filepath, contents },\n    ...Object.keys(state).map(key => ({\n      path: createURL({ root: \"phenomic\", ...decode(key) }),\n      contents: JSON.stringify(state[key].node),\n    })),\n  ];\n};\n\nconst renderStatic = (config: PhenomicConfig) => (args: {|\n  app: PhenomicAppType,\n  assets: PhenomicAssets,\n  location: string,\n|}) => _renderStatic(config, args);\n\nexport default renderStatic;\n"
  },
  {
    "path": "packages/plugin-renderer-react/src/shared/QueryString.js",
    "content": "// @flow\n\nexport function encode(object: Object) {\n  return Object.keys(object)\n    .filter(key => object[key] !== null && object[key] !== undefined)\n    .map(key => `${encodeURIComponent(key)}=${encodeURIComponent(object[key])}`)\n    .join(\"&\");\n}\n\nexport function decode(string: string) {\n  if (string.charAt(0) === \"?\" || string.charAt(0) === \"#\") {\n    string = string.slice(1);\n  }\n  const params = string.split(\"&\");\n  return params.reduce((acc, param) => {\n    const [key, value] = param.split(\"=\");\n    acc[decodeURIComponent(key)] = decodeURIComponent(value);\n    return acc;\n  }, {});\n}\n"
  },
  {
    "path": "packages/plugin-renderer-react/src/shared/__tests__/QueryString-test.js",
    "content": "// @flow\n\nimport { encode, decode } from \"../QueryString\";\n\nit(\"should encode query string\", () => {\n  expect(encode({ a: \"1\", b: \"foo\" })).toMatchSnapshot();\n});\n\nit(\"should decode query string\", () => {\n  expect(decode(\"a=1&b=foo\")).toMatchSnapshot();\n\n  expect(decode(\"?a=1&b=foo\")).toEqual(decode(\"a=1&b=foo\"));\n});\n"
  },
  {
    "path": "packages/plugin-renderer-react/src/shared/__tests__/__snapshots__/QueryString-test.js.snap",
    "content": "// Jest Snapshot v1, https://goo.gl/fbAQLP\n\nexports[`should decode query string 1`] = `\nObject {\n  \"a\": \"1\",\n  \"b\": \"foo\",\n}\n`;\n\nexports[`should encode query string 1`] = `\"a=1&b=foo\"`;\n"
  },
  {
    "path": "packages/plugin-renderer-react/src/shared/__tests__/__snapshots__/mapValues-test.js.snap",
    "content": "// Jest Snapshot v1, https://goo.gl/fbAQLP\n\nexports[`mapValues should map object values 1`] = `\nObject {\n  \"a\": 2,\n  \"b\": 4,\n}\n`;\n"
  },
  {
    "path": "packages/plugin-renderer-react/src/shared/__tests__/mapValues-test.js",
    "content": "// @flow\n\nimport mapValues from \"../mapValues\";\n\ndescribe(\"mapValues\", () => {\n  it(\"should map object values\", () => {\n    expect(mapValues({ a: 1, b: 2 }, value => value * 2)).toMatchSnapshot();\n  });\n});\n"
  },
  {
    "path": "packages/plugin-renderer-react/src/shared/mapValues.js",
    "content": "// @flow\n\nconst mapValues = (object: Object, func: Function) => {\n  return Object.keys(object).reduce(\n    (acc, key) =>\n      Object.assign(acc, {\n        [key]: func(object[key], key),\n      }),\n    {},\n  );\n};\n\nexport default mapValues;\n"
  },
  {
    "path": "packages/plugin-renderer-react/src/shared/performQuery.js",
    "content": "// @flow\n\nimport fetchRestApi from \"@phenomic/api-client/lib/fetch\";\n\nimport { decode } from \"./QueryString\";\nimport type { StoreType } from \"./store\";\n\nfunction performQuery(store: StoreType, queries: phenomic$Queries) {\n  return Promise.all(\n    queries.map(key => {\n      store.setAsLoading(key);\n      return fetchRestApi(decode(key))\n        .then(value => store.set(key, value))\n        .catch(error => store.setAsError(key, error));\n    }),\n  );\n}\n\nexport default performQuery;\n"
  },
  {
    "path": "packages/plugin-renderer-react/src/shared/store/__tests__/__snapshots__/index-test.js.snap",
    "content": "// Jest Snapshot v1, https://goo.gl/fbAQLP\n\nexports[`createStore should create a store with an empty state 1`] = `Object {}`;\n\nexports[`createStore should create a store with an filled state 1`] = `\nObject {\n  \"foo\": \"bar\",\n}\n`;\n"
  },
  {
    "path": "packages/plugin-renderer-react/src/shared/store/__tests__/index-test.js",
    "content": "// @flow\n\nimport createStore from \"..\";\n\ndescribe(\"createStore\", () => {\n  it(\"should create a store with an empty state\", () => {\n    const store = createStore();\n    expect(store.getState()).toMatchSnapshot();\n  });\n\n  it(\"should create a store with an filled state\", () => {\n    const store = createStore({ foo: \"bar\" });\n    expect(store.getState()).toMatchSnapshot();\n  });\n\n  it(\"should notify of changes\", () => {\n    const store = createStore();\n    const subscriber = jest.fn();\n    store.subscribe(subscriber);\n    store.set(\"foo\", \"bar\");\n    expect(subscriber.mock.calls.length).toBe(1);\n  });\n\n  it(\"subscribe should return an unsubscribe function\", () => {\n    const store = createStore();\n    const subscriber = jest.fn();\n    const unsubscribe = store.subscribe(subscriber);\n    store.set(\"foo\", \"bar\");\n    unsubscribe();\n    store.set(\"bar\", \"baz\");\n    expect(subscriber.mock.calls.length).toBe(1);\n  });\n});\n"
  },
  {
    "path": "packages/plugin-renderer-react/src/shared/store/index.js",
    "content": "// @flow\n\ntype StateType = Object;\ntype SubscriberType = Function;\n\nconst NO_VALUE_EDGE = {\n  status: \"inactive\",\n  node: null,\n};\n\nexport type unsubscribeType = () => void;\nexport type StoreType = {|\n  subscribe: (func: SubscriberType) => unsubscribeType,\n  get: (key: string) => any,\n  set: (key: string, node: any) => void,\n  setAsLoading: (key: string) => any,\n  setAsError: (key: string, node: any) => any,\n  getState: () => StateType,\n|};\n\nfunction createStore(state: StateType = {}): StoreType {\n  let subscribers: $ReadOnlyArray<SubscriberType> = [];\n\n  function subscribe(func: SubscriberType) {\n    subscribers = [...subscribers, func];\n    return function unsubscribe() {\n      subscribers = subscribers.filter(item => item !== func);\n    };\n  }\n\n  function get(key: string) {\n    if (state.hasOwnProperty(key)) {\n      return state[key];\n    }\n    return NO_VALUE_EDGE;\n  }\n\n  function set(key: string, node: any) {\n    update({\n      [key]: {\n        status: \"idle\",\n        node,\n      },\n    });\n  }\n\n  function setAsLoading(key: string) {\n    update({\n      [key]: {\n        status: \"loading\",\n        node: get(key).node,\n      },\n    });\n  }\n\n  function setAsError(key: string, error: any) {\n    update({\n      [key]: {\n        status: \"error\",\n        node: null,\n        error,\n      },\n    });\n  }\n\n  function update(nextState: StateType) {\n    state = { ...state, ...nextState };\n    subscribers.forEach(func => func());\n  }\n\n  function getState() {\n    return state;\n  }\n\n  return {\n    subscribe,\n    get,\n    set,\n    setAsLoading,\n    setAsError,\n    getState,\n  };\n}\n\nexport default createStore;\n"
  },
  {
    "path": "packages/plugin-renderer-react/src/utils.js",
    "content": "// @flow\n\nimport * as React from \"react\";\n\nexport function getDisplayName(Component: React.ComponentType<*>) {\n  return Component.displayName || Component.name || \"Unknown\";\n}\n"
  },
  {
    "path": "packages/plugin-renderer-react/src/withInitialProps.js",
    "content": "// @flow\n\nimport * as React from \"react\";\nimport hoistStatics from \"hoist-non-react-statics\";\n\nimport { getDisplayName } from \"./utils\";\n\ntype props = {|\n  // react-router v3\n  location: any,\n  params: {|\n    // SSR trick\n    __initialPropsForSSR: Object,\n    __initialErrorForSSR: any,\n  |},\n|};\n\ntype state = {|\n  status: \"loading\" | \"ready\" | \"error\",\n  props?: Object,\n  error?: any,\n|};\n\nexport default function withInitialProps<P>(\n  ComposedComponent: React.ComponentType<P>,\n) {\n  const displayName = getDisplayName(ComposedComponent);\n\n  class PhenomicContainerWithInitialProps extends React.Component<\n    props,\n    state,\n  > {\n    state: state = {\n      status: \"loading\",\n    };\n\n    _previousInitialPropsArgs = {\n      pathname: undefined,\n      params: undefined,\n    };\n\n    static displayName = `withInitialProps(${displayName})`;\n\n    constructor(props: props) {\n      super(props);\n\n      // SSR\n      if (props.params.__initialPropsForSSR) {\n        this.state = {\n          status: \"ready\",\n          props: props.params.__initialPropsForSSR,\n        };\n      }\n      if (props.params.__initialErrorForSSR) {\n        this.state = {\n          status: \"error\",\n          error: props.params.__initialErrorForSSR,\n        };\n      }\n    }\n\n    componentDidMount() {\n      // CSR\n      this.update();\n    }\n\n    componentDidUpdate() {\n      // CSR\n      this.update();\n    }\n\n    update() {\n      const initialPropsArgs = {\n        pathname: this.props.location.pathname,\n        params: this.props.params,\n      };\n      if (\n        this._previousInitialPropsArgs.pathname !== initialPropsArgs.pathname ||\n        this._previousInitialPropsArgs.params !== initialPropsArgs.params\n      ) {\n        this._previousInitialPropsArgs = initialPropsArgs;\n        // $FlowFixMe it's a requirement\n        const res = ComposedComponent.getInitialProps(initialPropsArgs);\n        if (res.then) {\n          res.then(\n            props => this.setState({ status: \"ready\", props }),\n            error => this.setState({ status: \"error\", error }),\n          );\n        } else {\n          // probably an edge case, but just in case people do weird things :)\n          // eslint-disable-next-line react/no-did-mount-set-state\n          this.setState({ status: \"ready\", props: res });\n        }\n      }\n    }\n\n    render() {\n      return (\n        <ComposedComponent\n          {...this.props}\n          status={this.state.status}\n          error={this.state.error}\n          {...this.state.props}\n        />\n      );\n    }\n  }\n\n  // $FlowFixMe I am lazy and \"it works on my computer\"\n  return hoistStatics(PhenomicContainerWithInitialProps, ComposedComponent);\n}\n"
  },
  {
    "path": "packages/plugin-renderer-react/src/withPhenomicApi.js",
    "content": "// @flow\n\nimport * as React from \"react\";\nimport PropTypes from \"prop-types\";\nimport hoistStatics from \"hoist-non-react-statics\";\n\nimport { getDisplayName } from \"./utils\";\nimport mapValues from \"./shared/mapValues\";\nimport { encode } from \"./shared/QueryString\";\n\ntype props = Object;\n\nexport default function withPhenomicApi<P>(\n  ComposedComponent: React.ComponentType<P>,\n  getQueries: (props: Object) => Object = () => ({}),\n) {\n  const socketServerURL =\n    // $FlowFixMe yeah yeah\n    \"http://localhost:\" + process.env.PHENOMIC_SOCKET_PORT;\n  const displayName = getDisplayName(ComposedComponent);\n\n  class PhenomicContainerWithApi extends React.Component<props, void> {\n    unsubscribe: Function | null;\n    queries: Object;\n\n    static getQueries = getQueries;\n    static contextTypes = {\n      query: PropTypes.func,\n      phenomic: PropTypes.object,\n      __prerendering: PropTypes.bool,\n    };\n\n    static displayName = `withPhenomicApi(${displayName})`;\n\n    constructor(props: props, context: Object) {\n      super(props, context);\n      this.computeQueries(props);\n      // if we're on the server, let's just run the query\n      if (this.context.__prerendering) {\n        this.query();\n      }\n    }\n\n    componentDidMount() {\n      if (!this.context.__prerendering) {\n        this.query();\n      }\n      this.unsubscribe = this.context.phenomic.subscribe(() => this.update());\n      if (process.env.NODE_ENV !== \"production\") {\n        require(\"socket.io-client\")(socketServerURL).on(\n          \"change\",\n          this.forceQuery,\n        );\n      }\n    }\n\n    // UNSAFE_componentWillReceiveProps(props: props) {\n    // eslint-disable-next-line\n    componentWillReceiveProps(props: props) {\n      this.computeQueries(props);\n      this.schedule(() => this.query());\n    }\n\n    componentWillUnmount() {\n      if (typeof this.unsubscribe === \"function\") {\n        this.unsubscribe();\n      }\n      this.unsubscribe = null;\n\n      if (process.env.NODE_ENV !== \"production\") {\n        require(\"socket.io-client\")(socketServerURL).removeListener(\n          \"change\",\n          this.forceQuery,\n        );\n      }\n    }\n\n    forceQuery = () => {\n      this.query(true);\n    };\n    update = () => {\n      this.schedule(() => this.forceUpdate());\n    };\n    schedule = (func: Function) => {\n      requestAnimationFrame(() => {\n        if (typeof this.unsubscribe === \"function\") {\n          func();\n        }\n      });\n    };\n    computeQueries = (props: props) => {\n      this.queries = mapValues(getQueries(props), encode);\n    };\n    query = (force: boolean = false) => {\n      const store = this.context.phenomic;\n      const values = Object.keys(this.queries).map(key => this.queries[key]);\n      if (force) {\n        this.context.query(values);\n      } else {\n        this.context.query(\n          values.filter(item => store.get(item).status !== \"idle\"),\n        );\n      }\n    };\n    render() {\n      const store = this.context.phenomic;\n      const values = Object.keys(this.queries).map(key => this.queries[key]);\n      const isLoading = values.some(item => !store.get(item).node);\n      const hasErrored = values.some(\n        item => store.get(item).status === \"error\",\n      );\n      const props = mapValues(this.queries, (value, key) =>\n        store.get(this.queries[key]),\n      );\n      if (hasErrored) {\n        console.error(\n          \"An item is in error state\",\n          values.find(item => store.get(item).status === \"error\"),\n        );\n        return <ComposedComponent {...this.props} hasError={true} {...props} />;\n      }\n      return (\n        <ComposedComponent {...this.props} isLoading={isLoading} {...props} />\n      );\n    }\n  }\n\n  // $FlowFixMe I am lazy and \"it works on my computer\"\n  return hoistStatics(PhenomicContainerWithApi, ComposedComponent);\n}\n"
  },
  {
    "path": "packages/plugin-rss-feed/README.md",
    "content": "# @phenomic/plugin-rss-feed\n\n> Phenomic plugin to generate RSS feed\n\n➡ More details at [phenomic.io](https://phenomic.io/)\n"
  },
  {
    "path": "packages/plugin-rss-feed/bsconfig.json",
    "content": "{\n  \"name\": \"@phenomic/plugin-rss-feed\",\n  \"refmt\": 3,\n  \"reason\": {\n    \"react-jsx\": 3\n  },\n  \"sources\": [\n    {\n      \"dir\": \"src\",\n      \"subdirs\": true\n    }\n  ],\n  \"suffix\": \".bs.js\",\n  \"package-specs\": {\n    \"module\": \"commonjs\",\n    \"in-source\": true\n  }\n}\n"
  },
  {
    "path": "packages/plugin-rss-feed/docs/README.md",
    "content": "# @phenomic/plugin-rss-feed\n\n@todo\n"
  },
  {
    "path": "packages/plugin-rss-feed/package.json",
    "content": "{\n  \"name\": \"@phenomic/plugin-rss-feed\",\n  \"version\": \"1.0.0\",\n  \"publishConfig\": {\n    \"access\": \"public\"\n  },\n  \"repository\": \"https://github.com/phenomic/phenomic.git\",\n  \"homepage\": \"https://phenomic.io\",\n  \"license\": \"MIT\",\n  \"authors\": [\n    \"Maxime Thirouin (MoOx)\",\n    \"bloodyowl <bloodyowl@icloud.com>\"\n  ],\n  \"keywords\": [\n    \"phenomic\",\n    \"phenomic-plugin\",\n    \"rss\",\n    \"feed\"\n  ],\n  \"description\": \"Phenomic plugin to generate a RSS feed\",\n  \"main\": \"lib/index.js\",\n  \"files\": [\n    \"lib\",\n    \"src\",\n    \"!**/__tests__\"\n  ],\n  \"dependencies\": {\n    \"@phenomic/api-client\": \"^1.0.0\",\n    \"debug\": \"^2.6.0\",\n    \"express\": \"^4.14.0\",\n    \"rss\": \"^1.2.1\"\n  },\n  \"peerDependencies\": {\n    \"@phenomic/core\": \"^1.0.0-beta.3\"\n  },\n  \"devDependencies\": {\n    \"@phenomic/core\": \"^1.0.0\"\n  }\n}\n"
  },
  {
    "path": "packages/plugin-rss-feed/src/index.js",
    "content": "// @flow\n\nimport url from \"url\";\n\nimport fetchRestApi from \"@phenomic/api-client/lib/fetch\";\nimport query from \"@phenomic/api-client/lib/query\";\nimport logger from \"@phenomic/core/lib/logger\";\nimport express from \"express\";\nimport RSS from \"rss\";\n\nconst pluginName = \"@phenomic/plugin-rss-feed\";\nconst log = logger(pluginName);\nconst debug = require(\"debug\")(\"phenomic:plugin:rss-feed\");\n\nexport type options = {|\n  feeds: {\n    [feedUrl: string]: {|\n      // https://www.npmjs.com/package/rss#feedoptions\n      feedOptions: Object,\n      query: PhenomicQueryConfig,\n      map?: ((phenomicItem: Object) => Object) | { [key: string]: string },\n    |},\n  },\n|};\n\nconst makeItemFromObject = (item, map) =>\n  // $FlowFixMe waaat?\n  Object.keys(map).reduce((acc, key) => {\n    acc[key] = item[map[key]];\n    return acc;\n  }, {});\n\nconst defaultMap = {\n  title: \"title\",\n  url: \"id\",\n  date: \"date\",\n  // @todo\n  // description: \"excerpt\",\n  // optional, we assume this are good defaults\n  author: \"author\",\n  categories: \"tags\",\n};\n\nconst defaultOptions = {\n  feeds: {\n    \"feed.xml\": {\n      feedOptions: {},\n      query: { path: \"content/posts\", limit: 20 },\n    },\n  },\n};\n\nconst makeFeed = async (ROOT, feedUrl, feedConfig): Promise<string> => {\n  const rss = new RSS({\n    feed_url: ROOT + feedUrl,\n    site_url: ROOT,\n    generator: \"Phenomic\",\n    ...feedConfig.feedOptions,\n  });\n  const items = await fetchRestApi(query(feedConfig.query));\n  items.list.forEach(item => {\n    // special trick for rss feeds :)\n    item.id =\n      ROOT +\n      (feedConfig.query.path ? feedConfig.query.path + \"/\" : \"\") +\n      item.id +\n      \"/\";\n    const mappedItem =\n      typeof feedConfig.map === \"function\"\n        ? feedConfig.map(item)\n        : makeItemFromObject(item, feedConfig.map || defaultMap);\n    debug(\"item\", item, mappedItem);\n    rss.item(mappedItem);\n  });\n  return rss.xml(\n    process.env.PHENOMIC_ENV === \"development\" ? { indent: true } : {},\n  );\n};\n\nconst getFeedKeys = options => {\n  const keys = Object.keys(options.feeds);\n  if (!keys.length) {\n    log.warn(\n      `No 'feeds' founds in options. Please add entries.\\n Current options:\\n ${JSON.stringify(\n        options,\n        null,\n        2,\n      )}).`,\n    );\n  }\n  return keys;\n};\n\nconst getRoot = (config: PhenomicConfig) =>\n  url.format(config.baseUrl).slice(0, -1) +\n  (process.env.PHENOMIC_ENV === \"development\" ? `:${config.port}/` : \"/\");\n\nconst rssFeed: PhenomicPluginModule<options> = (\n  config: PhenomicConfig,\n  options: options = defaultOptions,\n) => {\n  return {\n    name: pluginName,\n    addDevServerMiddlewares() {\n      const router = express.Router();\n      getFeedKeys(options).forEach(feedUrl => {\n        router.get(\"/\" + feedUrl, async (req, res: express$Response) => {\n          debug(req.url);\n          try {\n            const output = await makeFeed(\n              getRoot(config),\n              feedUrl,\n              options.feeds[feedUrl],\n            );\n            res.type(\"xml\").send(output);\n          } catch (error) {\n            log.error(error.toString());\n            debug(error);\n            res.status(500).end();\n          }\n        });\n      });\n      return [router];\n    },\n    resolveURLs() {\n      return Promise.resolve(getFeedKeys(options));\n    },\n    async renderStatic({ location }: { location: string }) {\n      return [\n        {\n          path: location,\n          contents: await makeFeed(\n            getRoot(config),\n            location,\n            options.feeds[location],\n          ),\n        },\n      ];\n    },\n  };\n};\n\nexport default rssFeed;\n"
  },
  {
    "path": "packages/plugin-sitemap/README.md",
    "content": "# @phenomic/plugin-sitemap\n\n> Phenomic plugin to generate sitemap\n\n➡ More details at [phenomic.io](https://phenomic.io/)\n\n---\n\n**NOT PUBLISHED YET AS IT'S INCOMPLETE**\n"
  },
  {
    "path": "packages/plugin-sitemap/bsconfig.json",
    "content": "{\n  \"name\": \"@phenomic/plugin-sitemap\",\n  \"refmt\": 3,\n  \"reason\": {\n    \"react-jsx\": 3\n  },\n  \"sources\": [\n    {\n      \"dir\": \"src\",\n      \"subdirs\": true\n    }\n  ],\n  \"suffix\": \".bs.js\",\n  \"package-specs\": {\n    \"module\": \"commonjs\",\n    \"in-source\": true\n  }\n}\n"
  },
  {
    "path": "packages/plugin-sitemap/package.json",
    "content": "{\n  \"private\": true,\n  \"name\": \"@phenomic/plugin-sitemap\",\n  \"version\": \"1.0.0\",\n  \"publishConfig\": {\n    \"access\": \"public\"\n  },\n  \"repository\": \"https://github.com/phenomic/phenomic.git\",\n  \"homepage\": \"https://phenomic.io\",\n  \"license\": \"MIT\",\n  \"authors\": [\n    \"Maxime Thirouin (MoOx)\",\n    \"bloodyowl <bloodyowl@icloud.com>\"\n  ],\n  \"keywords\": [\n    \"phenomic\",\n    \"phenomic-plugin\",\n    \"sitemap\"\n  ],\n  \"description\": \"Phenomic plugin to generate a sitemap\",\n  \"main\": \"lib/index.js\",\n  \"files\": [\n    \"lib\",\n    \"src\",\n    \"!**/__tests__\"\n  ]\n}\n"
  },
  {
    "path": "packages/plugin-sitemap/src/index.js",
    "content": "// @flow\n\n// @todo sitemap\n// import sm from \"sitemap\"\n\nconst sitemap: PhenomicPluginModule<{}> = () => {\n  return {\n    name: \"@phenomic/plugin-sitemap\",\n    /*\n    getFile() {\n      sm.createSitemap({\n        hostname: ROOT,\n        cacheTime: 600000,\n        urls: urls.map((url) => ({ url })),\n      })\n      .toXML((error, xml) => error ? reject(error) : resolve(xml))\n    }\n    */\n  };\n};\n\nexport default sitemap;\n"
  },
  {
    "path": "packages/plugin-transform-asciidoc/README.md",
    "content": "# @phenomic/plugin-transform-asciidoc\n\n> Phenomic plugin to transform asciidoc resources.\n\n➡ More details at [phenomic.io](https://phenomic.io/)\n"
  },
  {
    "path": "packages/plugin-transform-asciidoc/bsconfig.json",
    "content": "{\n  \"name\": \"@phenomic/plugin-transform-asciidoc\",\n  \"refmt\": 3,\n  \"reason\": {\n    \"react-jsx\": 3\n  },\n  \"sources\": [\n    {\n      \"dir\": \"src\",\n      \"subdirs\": true\n    }\n  ],\n  \"suffix\": \".bs.js\",\n  \"package-specs\": {\n    \"module\": \"commonjs\",\n    \"in-source\": true\n  }\n}\n"
  },
  {
    "path": "packages/plugin-transform-asciidoc/docs/README.md",
    "content": "# @phenomic/plugin-transform-asciidoc\n\n@todo\n"
  },
  {
    "path": "packages/plugin-transform-asciidoc/package.json",
    "content": "{\n  \"name\": \"@phenomic/plugin-transform-asciidoc\",\n  \"version\": \"1.0.0\",\n  \"publishConfig\": {\n    \"access\": \"public\"\n  },\n  \"repository\": \"https://github.com/phenomic/phenomic.git\",\n  \"homepage\": \"https://phenomic.io\",\n  \"license\": \"MIT\",\n  \"authors\": [\n    \"Ezra Lalonde\",\n    \"Maxime Thirouin (MoOx)\"\n  ],\n  \"keywords\": [\n    \"phenomic\",\n    \"phenomic-plugin\",\n    \"asciidoc\",\n    \"asciidoctor\"\n  ],\n  \"description\": \"Phenomic plugin to transform asciidoc resources\",\n  \"main\": \"lib/index.js\",\n  \"files\": [\n    \"lib\",\n    \"src\",\n    \"!**/__tests__\"\n  ],\n  \"dependencies\": {\n    \"@phenomic/helpers-transform\": \"^1.0.0\",\n    \"asciidoctor.js\": \"^1.5.6-preview.3\",\n    \"debug\": \"^2.6.0\",\n    \"rehype-autolink-headings\": \"^2.0.0\",\n    \"rehype-highlight\": \"^2.0.1\",\n    \"rehype-parse\": \"^4.0.0\",\n    \"rehype-raw\": \"^2.0.0\",\n    \"rehype-slug\": \"^2.0.0\"\n  },\n  \"peerDependencies\": {\n    \"@phenomic/core\": \"^1.0.0-beta.3\"\n  },\n  \"devDependencies\": {\n    \"@phenomic/core\": \"^1.0.0\"\n  }\n}\n"
  },
  {
    "path": "packages/plugin-transform-asciidoc/src/__tests__/__snapshots__/index.js.snap",
    "content": "// Jest Snapshot v1, https://goo.gl/fbAQLP\n\nexports[`should transform asciidoc as html 1`] = `\nObject {\n  \"data\": Object {\n    \"appendix-caption\": \"Appendix\",\n    \"appendix-refsig\": \"Appendix\",\n    \"attribute-missing\": \"skip\",\n    \"attribute-undefined\": \"drop-line\",\n    \"author\": \"Ezra Lalonde\",\n    \"authorcount\": 1,\n    \"authorinitials\": \"EL\",\n    \"authors\": \"Ezra Lalonde\",\n    \"backend-html5\": \"\",\n    \"backend-html5-doctype-article\": \"\",\n    \"basebackend-html\": \"\",\n    \"basebackend-html-doctype-article\": \"\",\n    \"body\": \"<div id=\\\\\"preamble\\\\\">\n<div class=\\\\\"sectionbody\\\\\">\n<div class=\\\\\"paragraph\\\\\">\n<p>Test of Asciidoc.js transformer for Phenomic.</p>\n</div>\n</div>\n</div>\n<div class=\\\\\"sect1\\\\\">\n<h2 id=\\\\\"_heading\\\\\"><a aria-hidden=\\\\\"true\\\\\" href=\\\\\"#_heading\\\\\"><span class=\\\\\"icon icon-link\\\\\"></span></a>Heading</h2>\n<div class=\\\\\"sectionbody\\\\\">\n<div class=\\\\\"ulist\\\\\">\n<ul>\n<li>\n<p>item 1</p>\n</li>\n<li>\n<p>item 2</p>\n</li>\n</ul>\n</div>\n<div class=\\\\\"listingblock\\\\\">\n<div class=\\\\\"content\\\\\">\n<pre class=\\\\\"highlight\\\\\"><code class=\\\\\"hljs language-javascript\\\\\" data-lang=\\\\\"javascript\\\\\"><span class=\\\\\"hljs-keyword\\\\\">const</span> name = <span class=\\\\\"hljs-string\\\\\">\\\\\"Ezra\\\\\"</span>\n<span class=\\\\\"hljs-built_in\\\\\">console</span>.log(<span class=\\\\\"hljs-string\\\\\">\\`Hello, <span class=\\\\\"hljs-subst\\\\\">\\${name}</span>!\\`</span>)</code></pre>\n</div>\n</div>\n</div>\n</div>\",\n    \"caution-caption\": \"Caution\",\n    \"chapter-refsig\": \"Chapter\",\n    \"date\": \"2011-12-25\",\n    \"doctitle\": \"Hello, AsciiDoc!\",\n    \"doctype-article\": \"\",\n    \"email\": \"ezra@usefuliftrue.com\",\n    \"example-caption\": \"Example\",\n    \"figure-caption\": \"Figure\",\n    \"filetype-html\": \"\",\n    \"firstname\": \"Ezra\",\n    \"header_footer\": \"false\",\n    \"iconfont-remote\": \"\",\n    \"iconsdir\": \"/path/to/icons\",\n    \"important-caption\": \"Important\",\n    \"last-update-label\": \"Last updated\",\n    \"lastname\": \"Lalonde\",\n    \"layout\": undefined,\n    \"manname-title\": \"NAME\",\n    \"max-attribute-value-size\": 4096,\n    \"max-include-depth\": 64,\n    \"note-caption\": \"Note\",\n    \"notitle\": \"\",\n    \"prewrap\": \"\",\n    \"revdate\": \"2017-10-05\",\n    \"revnumber\": \"1.0\",\n    \"revremark\": \"First draft\",\n    \"sectids\": \"\",\n    \"section-refsig\": \"Section\",\n    \"showdate\": true,\n    \"stylesdir\": \".\",\n    \"stylesheet\": \"\",\n    \"table-caption\": \"Table\",\n    \"tags\": Array [\n      \"phenomic\",\n      \"documentation\",\n      \"test\",\n      \"déjà vu\",\n    ],\n    \"tip-caption\": \"Tip\",\n    \"title\": \"Hello, AsciiDoc!\",\n    \"toc-placement\": \"auto\",\n    \"toc-title\": \"Table of Contents\",\n    \"untitled-label\": \"Untitled\",\n    \"version-label\": \"Version\",\n    \"warning-caption\": \"Warning\",\n    \"webfonts\": \"\",\n  },\n  \"partial\": Object {\n    \"appendix-caption\": \"Appendix\",\n    \"appendix-refsig\": \"Appendix\",\n    \"attribute-missing\": \"skip\",\n    \"attribute-undefined\": \"drop-line\",\n    \"author\": \"Ezra Lalonde\",\n    \"authorcount\": 1,\n    \"authorinitials\": \"EL\",\n    \"authors\": \"Ezra Lalonde\",\n    \"backend-html5\": \"\",\n    \"backend-html5-doctype-article\": \"\",\n    \"basebackend-html\": \"\",\n    \"basebackend-html-doctype-article\": \"\",\n    \"caution-caption\": \"Caution\",\n    \"chapter-refsig\": \"Chapter\",\n    \"date\": \"2011-12-25\",\n    \"doctitle\": \"Hello, AsciiDoc!\",\n    \"doctype-article\": \"\",\n    \"email\": \"ezra@usefuliftrue.com\",\n    \"example-caption\": \"Example\",\n    \"figure-caption\": \"Figure\",\n    \"filetype-html\": \"\",\n    \"firstname\": \"Ezra\",\n    \"header_footer\": \"false\",\n    \"iconfont-remote\": \"\",\n    \"iconsdir\": \"/path/to/icons\",\n    \"important-caption\": \"Important\",\n    \"last-update-label\": \"Last updated\",\n    \"lastname\": \"Lalonde\",\n    \"layout\": undefined,\n    \"manname-title\": \"NAME\",\n    \"max-attribute-value-size\": 4096,\n    \"max-include-depth\": 64,\n    \"note-caption\": \"Note\",\n    \"notitle\": \"\",\n    \"prewrap\": \"\",\n    \"revdate\": \"2017-10-05\",\n    \"revnumber\": \"1.0\",\n    \"revremark\": \"First draft\",\n    \"sectids\": \"\",\n    \"section-refsig\": \"Section\",\n    \"showdate\": true,\n    \"stylesdir\": \".\",\n    \"stylesheet\": \"\",\n    \"table-caption\": \"Table\",\n    \"tags\": Array [\n      \"phenomic\",\n      \"documentation\",\n      \"test\",\n      \"déjà vu\",\n    ],\n    \"tip-caption\": \"Tip\",\n    \"title\": \"Hello, AsciiDoc!\",\n    \"toc-placement\": \"auto\",\n    \"toc-title\": \"Table of Contents\",\n    \"untitled-label\": \"Untitled\",\n    \"version-label\": \"Version\",\n    \"warning-caption\": \"Warning\",\n    \"webfonts\": \"\",\n  },\n}\n`;\n\nexports[`should transform asciidoc as json 1`] = `\nObject {\n  \"data\": Object {\n    \"appendix-caption\": \"Appendix\",\n    \"appendix-refsig\": \"Appendix\",\n    \"attribute-missing\": \"skip\",\n    \"attribute-undefined\": \"drop-line\",\n    \"author\": \"Ezra Lalonde\",\n    \"authorcount\": 1,\n    \"authorinitials\": \"EL\",\n    \"authors\": \"Ezra Lalonde\",\n    \"backend-html5\": \"\",\n    \"backend-html5-doctype-article\": \"\",\n    \"basebackend-html\": \"\",\n    \"basebackend-html-doctype-article\": \"\",\n    \"body\": Object {\n      \"c\": Array [\n        Object {\n          \"c\": Array [\n            \"\n\",\n            Object {\n              \"c\": Array [\n                \"\n\",\n                Object {\n                  \"c\": Array [\n                    \"\n\",\n                    Object {\n                      \"c\": Array [\n                        \"Test of Asciidoc.js transformer for Phenomic.\",\n                      ],\n                      \"t\": \"p\",\n                    },\n                    \"\n\",\n                  ],\n                  \"p\": Object {\n                    \"class\": \"paragraph\",\n                  },\n                  \"t\": \"div\",\n                },\n                \"\n\",\n              ],\n              \"p\": Object {\n                \"class\": \"sectionbody\",\n              },\n              \"t\": \"div\",\n            },\n            \"\n\",\n          ],\n          \"p\": Object {\n            \"id\": \"preamble\",\n          },\n          \"t\": \"div\",\n        },\n        \"\n\",\n        Object {\n          \"c\": Array [\n            \"\n\",\n            Object {\n              \"c\": Array [\n                Object {\n                  \"c\": Array [\n                    Object {\n                      \"p\": Object {\n                        \"class\": \"icon icon-link\",\n                      },\n                      \"t\": \"span\",\n                    },\n                  ],\n                  \"p\": Object {\n                    \"aria-hidden\": \"true\",\n                    \"href\": \"#_heading\",\n                  },\n                  \"t\": \"a\",\n                },\n                \"Heading\",\n              ],\n              \"p\": Object {\n                \"id\": \"_heading\",\n              },\n              \"t\": \"h2\",\n            },\n            \"\n\",\n            Object {\n              \"c\": Array [\n                \"\n\",\n                Object {\n                  \"c\": Array [\n                    \"\n\",\n                    Object {\n                      \"c\": Array [\n                        \"\n\",\n                        Object {\n                          \"c\": Array [\n                            \"\n\",\n                            Object {\n                              \"c\": Array [\n                                \"item 1\",\n                              ],\n                              \"t\": \"p\",\n                            },\n                            \"\n\",\n                          ],\n                          \"t\": \"li\",\n                        },\n                        \"\n\",\n                        Object {\n                          \"c\": Array [\n                            \"\n\",\n                            Object {\n                              \"c\": Array [\n                                \"item 2\",\n                              ],\n                              \"t\": \"p\",\n                            },\n                            \"\n\",\n                          ],\n                          \"t\": \"li\",\n                        },\n                        \"\n\",\n                      ],\n                      \"t\": \"ul\",\n                    },\n                    \"\n\",\n                  ],\n                  \"p\": Object {\n                    \"class\": \"ulist\",\n                  },\n                  \"t\": \"div\",\n                },\n                \"\n\",\n                Object {\n                  \"c\": Array [\n                    \"\n\",\n                    Object {\n                      \"c\": Array [\n                        \"\n\",\n                        Object {\n                          \"c\": Array [\n                            Object {\n                              \"c\": Array [\n                                Object {\n                                  \"c\": Array [\n                                    \"const\",\n                                  ],\n                                  \"p\": Object {\n                                    \"class\": \"hljs-keyword\",\n                                  },\n                                  \"t\": \"span\",\n                                },\n                                \" name = \",\n                                Object {\n                                  \"c\": Array [\n                                    \"\\\\\"Ezra\\\\\"\",\n                                  ],\n                                  \"p\": Object {\n                                    \"class\": \"hljs-string\",\n                                  },\n                                  \"t\": \"span\",\n                                },\n                                \"\n\",\n                                Object {\n                                  \"c\": Array [\n                                    \"console\",\n                                  ],\n                                  \"p\": Object {\n                                    \"class\": \"hljs-built_in\",\n                                  },\n                                  \"t\": \"span\",\n                                },\n                                \".log(\",\n                                Object {\n                                  \"c\": Array [\n                                    \"\\`Hello, \",\n                                    Object {\n                                      \"c\": Array [\n                                        \"\\${name}\",\n                                      ],\n                                      \"p\": Object {\n                                        \"class\": \"hljs-subst\",\n                                      },\n                                      \"t\": \"span\",\n                                    },\n                                    \"!\\`\",\n                                  ],\n                                  \"p\": Object {\n                                    \"class\": \"hljs-string\",\n                                  },\n                                  \"t\": \"span\",\n                                },\n                                \")\",\n                              ],\n                              \"p\": Object {\n                                \"class\": \"hljs language-javascript\",\n                                \"data-lang\": \"javascript\",\n                              },\n                              \"t\": \"code\",\n                            },\n                          ],\n                          \"p\": Object {\n                            \"class\": \"highlight\",\n                          },\n                          \"t\": \"pre\",\n                        },\n                        \"\n\",\n                      ],\n                      \"p\": Object {\n                        \"class\": \"content\",\n                      },\n                      \"t\": \"div\",\n                    },\n                    \"\n\",\n                  ],\n                  \"p\": Object {\n                    \"class\": \"listingblock\",\n                  },\n                  \"t\": \"div\",\n                },\n                \"\n\",\n              ],\n              \"p\": Object {\n                \"class\": \"sectionbody\",\n              },\n              \"t\": \"div\",\n            },\n            \"\n\",\n          ],\n          \"p\": Object {\n            \"class\": \"sect1\",\n          },\n          \"t\": \"div\",\n        },\n      ],\n      \"t\": \"div\",\n    },\n    \"caution-caption\": \"Caution\",\n    \"chapter-refsig\": \"Chapter\",\n    \"date\": \"2017-10-05\",\n    \"doctitle\": \"Hello, AsciiDoc!\",\n    \"doctype-article\": \"\",\n    \"email\": \"ezra@usefuliftrue.com\",\n    \"example-caption\": \"Example\",\n    \"figure-caption\": \"Figure\",\n    \"filetype-html\": \"\",\n    \"firstname\": \"Ezra\",\n    \"header_footer\": \"false\",\n    \"headings\": Array [\n      Object {\n        \"id\": \"_heading\",\n        \"level\": 2,\n        \"text\": \"Heading\",\n      },\n    ],\n    \"iconfont-remote\": \"\",\n    \"iconsdir\": \"/path/to/icons\",\n    \"important-caption\": \"Important\",\n    \"last-update-label\": \"Last updated\",\n    \"lastname\": \"Lalonde\",\n    \"layout\": undefined,\n    \"manname-title\": \"NAME\",\n    \"max-attribute-value-size\": 4096,\n    \"max-include-depth\": 64,\n    \"note-caption\": \"Note\",\n    \"notitle\": \"\",\n    \"prewrap\": \"\",\n    \"revdate\": \"2017-10-05\",\n    \"revnumber\": \"1.0\",\n    \"revremark\": \"First draft\",\n    \"sectids\": \"\",\n    \"section-refsig\": \"Section\",\n    \"showdate\": true,\n    \"stylesdir\": \".\",\n    \"stylesheet\": \"\",\n    \"table-caption\": \"Table\",\n    \"tags\": Array [],\n    \"tip-caption\": \"Tip\",\n    \"title\": \"Hello, AsciiDoc!\",\n    \"toc-placement\": \"auto\",\n    \"toc-title\": \"Table of Contents\",\n    \"untitled-label\": \"Untitled\",\n    \"version-label\": \"Version\",\n    \"warning-caption\": \"Warning\",\n    \"webfonts\": \"\",\n  },\n  \"partial\": Object {\n    \"appendix-caption\": \"Appendix\",\n    \"appendix-refsig\": \"Appendix\",\n    \"attribute-missing\": \"skip\",\n    \"attribute-undefined\": \"drop-line\",\n    \"author\": \"Ezra Lalonde\",\n    \"authorcount\": 1,\n    \"authorinitials\": \"EL\",\n    \"authors\": \"Ezra Lalonde\",\n    \"backend-html5\": \"\",\n    \"backend-html5-doctype-article\": \"\",\n    \"basebackend-html\": \"\",\n    \"basebackend-html-doctype-article\": \"\",\n    \"caution-caption\": \"Caution\",\n    \"chapter-refsig\": \"Chapter\",\n    \"date\": \"2017-10-05\",\n    \"doctitle\": \"Hello, AsciiDoc!\",\n    \"doctype-article\": \"\",\n    \"email\": \"ezra@usefuliftrue.com\",\n    \"example-caption\": \"Example\",\n    \"figure-caption\": \"Figure\",\n    \"filetype-html\": \"\",\n    \"firstname\": \"Ezra\",\n    \"header_footer\": \"false\",\n    \"headings\": Array [\n      Object {\n        \"id\": \"_heading\",\n        \"level\": 2,\n        \"text\": \"Heading\",\n      },\n    ],\n    \"iconfont-remote\": \"\",\n    \"iconsdir\": \"/path/to/icons\",\n    \"important-caption\": \"Important\",\n    \"last-update-label\": \"Last updated\",\n    \"lastname\": \"Lalonde\",\n    \"layout\": undefined,\n    \"manname-title\": \"NAME\",\n    \"max-attribute-value-size\": 4096,\n    \"max-include-depth\": 64,\n    \"note-caption\": \"Note\",\n    \"notitle\": \"\",\n    \"prewrap\": \"\",\n    \"revdate\": \"2017-10-05\",\n    \"revnumber\": \"1.0\",\n    \"revremark\": \"First draft\",\n    \"sectids\": \"\",\n    \"section-refsig\": \"Section\",\n    \"showdate\": true,\n    \"stylesdir\": \".\",\n    \"stylesheet\": \"\",\n    \"table-caption\": \"Table\",\n    \"tags\": Array [],\n    \"tip-caption\": \"Tip\",\n    \"title\": \"Hello, AsciiDoc!\",\n    \"toc-placement\": \"auto\",\n    \"toc-title\": \"Table of Contents\",\n    \"untitled-label\": \"Untitled\",\n    \"version-label\": \"Version\",\n    \"warning-caption\": \"Warning\",\n    \"webfonts\": \"\",\n  },\n}\n`;\n"
  },
  {
    "path": "packages/plugin-transform-asciidoc/src/__tests__/index.js",
    "content": "// @flow\n\nimport config from \"@phenomic/core/lib/defaultConfig.js\";\n\nimport transformAsciidoc from \"../index.js\";\n\nit(\"should transform asciidoc as html\", () => {\n  const plugin = transformAsciidoc(config, {});\n  expect(typeof plugin.transform === \"function\").toBe(true);\n  expect(\n    typeof plugin.transform === \"function\" &&\n      // $FlowFixMe you are so funny sometime flow\n      plugin.transform({\n        file: {\n          name: \"file.adoc\",\n          fullpath: \"/test/file.adoc\",\n          // exists: true,\n          // type: \"wat\"\n        },\n        contents: Buffer.from(`\n= Hello, AsciiDoc!\nEzra Lalonde <ezra@usefuliftrue.com>\nv1.0, 2017-10-05: First draft\n:date: 2011-12-25\n:tags: phenomic, documentation, test, déjà vu\n:iconsdir: /path/to/icons\nTest of Asciidoc.js transformer for Phenomic.\n\n== Heading\n\n* item 1\n* item 2\n\n[source,javascript]\nconst name = \"Ezra\"\nconsole.log(\\`Hello, \\${name}!\\`)\n`),\n      }),\n  ).toMatchSnapshot();\n});\n\nit(\"should transform asciidoc as json\", () => {\n  const plugin = transformAsciidoc(config, { output: \"json\" });\n  expect(typeof plugin.transform === \"function\").toBe(true);\n  expect(\n    typeof plugin.transform === \"function\" &&\n      // $FlowFixMe you are so funny sometime flow\n      plugin.transform({\n        file: {\n          name: \"file.adoc\",\n          fullpath: \"/test/file.adoc\",\n          // exists: true,\n          // type: \"wat\"\n        },\n        contents: Buffer.from(`\n= Hello, AsciiDoc!\nEzra Lalonde <ezra@usefuliftrue.com>\nv1.0, 2017-10-05: First draft\n:iconsdir: /path/to/icons\nTest of Asciidoc.js transformer for Phenomic.\n\n== Heading\n\n* item 1\n* item 2\n\n[source,javascript]\nconst name = \"Ezra\"\nconsole.log(\\`Hello, \\${name}!\\`)\n`),\n      }),\n  ).toMatchSnapshot();\n});\n"
  },
  {
    "path": "packages/plugin-transform-asciidoc/src/default-options.js",
    "content": "// @flow\n\nconst defaultOptions = {\n  output: \"html\",\n  plugins: [\n    [require(\"rehype-parse\"), { fragment: true }],\n    require(\"rehype-slug\"),\n    require(\"rehype-autolink-headings\"),\n    require(\"rehype-highlight\"),\n  ],\n};\n\nexport default defaultOptions;\n"
  },
  {
    "path": "packages/plugin-transform-asciidoc/src/index.js",
    "content": "// @flow\n\nimport asciidoctor from \"asciidoctor.js\";\nimport unifiedProcessor from \"@phenomic/helpers-transform/lib/unifiedProcessor\";\nimport type { plugin } from \"@phenomic/helpers-transform/lib//unifiedProcessor\";\nimport extractMetaFromBodyNode from \"@phenomic/helpers-transform/lib/extractMetaFromBodyNode\";\n\nimport defaultOptions from \"./default-options\";\n\n// eslint-disable-next-line\nconst debug = require(\"debug\")(\"phenomic:plugin:transform-asciidoc\");\n\nconst adDefaultOptions = {\n  safe: \"secure\",\n  attributes: {\n    header_footer: \"false\",\n    \"linkcss!\": \"\",\n    \"copycss!\": \"\",\n  },\n};\n\nconst envAttributes = [\n  \"asciidoctor\",\n  \"asciidoctor-version\",\n  \"backend\",\n  \"basebackend\",\n  \"docdate\",\n  \"docdatetime\",\n  \"docdir\",\n  \"docfile\",\n  \"docfilesuffix\",\n  \"docname\",\n  \"doctime\",\n  \"doctype\",\n  \"docyear\",\n  \"embedded\",\n  \"filetype\",\n  \"htmlsyntax\",\n  \"localdate\",\n  \"localdatetime\",\n  \"localtime\",\n  \"localyear\",\n  \"outdir\",\n  \"outfile\",\n  \"outfilesuffix\",\n  \"safe-mode-level\",\n  \"safe-mode-name\",\n  \"safe-mode-unsafe\",\n  \"safe-mode-safe\",\n  \"safe-mode-server\",\n  \"safe-mode-secure\",\n  \"user-home\",\n];\n\ntype options = {|\n  output?: \"json\" | \"html\",\n  plugins?: $ReadOnlyArray<plugin>,\n|} | void; // void? https://github.com/facebook/flow/issues/2977\n\nconst name = \"@phenomic/plugin-transform-asciidoc\";\n\nconst transformAsciidoc: PhenomicPluginModule<options> = (\n  config: PhenomicConfig,\n  options?: options,\n) => {\n  const processor = unifiedProcessor({\n    output: (options && options.output) || defaultOptions.output,\n    plugins: (options && options.plugins) || defaultOptions.plugins,\n  });\n\n  return {\n    name,\n    supportedFileTypes: [\"asciidoc\", \"adoc\", \"ad\"],\n    transform: ({\n      file,\n      contents,\n    }: {|\n      file: PhenomicContentFile,\n      contents: Buffer,\n    |}) => {\n      debug(`transforming ${file.fullpath}`);\n      const ad = asciidoctor();\n      const doc = ad.load(contents, adDefaultOptions);\n      const tags = doc.getAttribute(\"tags\");\n\n      const content = ad.convert(contents, adDefaultOptions);\n      // $FlowFixMe it's here, I can feel it Flow\n      const body = processor.processSync(content).contents;\n\n      const partial = {\n        ...extractMetaFromBodyNode(body),\n        ...doc.attributes.$$smap,\n        date:\n          doc.getAttribute(\"date\") || doc.getAttribute(\"revdate\") || undefined,\n        // title fallback\n        title: doc.getAttribute(\"doctitle\") || file.name,\n        layout: doc.getAttribute(\"layout\"),\n        showdate: doc.getAttribute(\"nodate\", true),\n        tags: tags ? tags.split(\",\").map(t => t.trim()) : [],\n      };\n      envAttributes.map(key => delete partial[key]);\n\n      return {\n        data: {\n          ...partial,\n          body,\n        },\n        partial,\n      };\n    },\n  };\n};\n\nexport default transformAsciidoc;\n"
  },
  {
    "path": "packages/plugin-transform-json/README.md",
    "content": "# @phenomic/plugin-transform-json\n\n> Phenomic plugin to transform JSON resources.\n\n➡ More details at [phenomic.io](https://phenomic.io/)\n"
  },
  {
    "path": "packages/plugin-transform-json/bsconfig.json",
    "content": "{\n  \"name\": \"@phenomic/plugin-transform-json\",\n  \"refmt\": 3,\n  \"reason\": {\n    \"react-jsx\": 3\n  },\n  \"sources\": [\n    {\n      \"dir\": \"src\",\n      \"subdirs\": true\n    }\n  ],\n  \"suffix\": \".bs.js\",\n  \"package-specs\": {\n    \"module\": \"commonjs\",\n    \"in-source\": true\n  }\n}\n"
  },
  {
    "path": "packages/plugin-transform-json/docs/README.md",
    "content": "# @phenomic/plugin-transform-json\n\n@todo\n"
  },
  {
    "path": "packages/plugin-transform-json/package.json",
    "content": "{\n  \"name\": \"@phenomic/plugin-transform-json\",\n  \"version\": \"1.0.0\",\n  \"publishConfig\": {\n    \"access\": \"public\"\n  },\n  \"repository\": \"https://github.com/phenomic/phenomic.git\",\n  \"homepage\": \"https://phenomic.io\",\n  \"license\": \"MIT\",\n  \"authors\": [\n    \"Maxime Thirouin (MoOx)\",\n    \"bloodyowl <bloodyowl@icloud.com>\"\n  ],\n  \"keywords\": [\n    \"phenomic\",\n    \"phenomic-plugin\",\n    \"json\"\n  ],\n  \"description\": \"Phenomic plugin to transform JSON resources\",\n  \"main\": \"lib/index.js\",\n  \"files\": [\n    \"lib\",\n    \"src\",\n    \"!**/__tests__\"\n  ],\n  \"dependencies\": {\n    \"debug\": \"^2.6.0\"\n  },\n  \"peerDependencies\": {\n    \"@phenomic/core\": \"^1.0.0-beta.3\"\n  },\n  \"devDependencies\": {\n    \"@phenomic/core\": \"^1.0.0\"\n  }\n}\n"
  },
  {
    "path": "packages/plugin-transform-json/src/__tests__/__snapshots__/index.js.snap",
    "content": "// Jest Snapshot v1, https://goo.gl/fbAQLP\n\nexports[`should transform json as json 1`] = `\nObject {\n  \"data\": Object {\n    \"somedata\": \"Normal version\",\n    \"test\": \"a\",\n    \"test2\": \"b\",\n  },\n  \"partial\": Object {\n    \"somedata\": \"Normal version\",\n    \"test\": \"a\",\n    \"test2\": \"b\",\n    \"title\": \"file.json\",\n  },\n}\n`;\n\nexports[`should transform json as json and support partial 1`] = `\nObject {\n  \"data\": Object {\n    \"partial\": Object {\n      \"somedata\": \"Light version\",\n    },\n    \"somedata\": \"Normal version\",\n    \"test\": \"a\",\n    \"test2\": \"b\",\n  },\n  \"partial\": Object {\n    \"somedata\": \"Light version\",\n    \"title\": \"file.json\",\n  },\n}\n`;\n"
  },
  {
    "path": "packages/plugin-transform-json/src/__tests__/index.js",
    "content": "// @flow\n\nimport config from \"@phenomic/core/lib/defaultConfig.js\";\n\nimport transformJSON from \"../index.js\";\n\nit(\"should transform json as json\", () => {\n  const plugin = transformJSON(config, {});\n  expect(typeof plugin.transform === \"function\").toBe(true);\n  expect(\n    typeof plugin.transform === \"function\" &&\n      // $FlowFixMe you are so funny sometime flow\n      plugin.transform({\n        file: {\n          name: \"file.json\",\n          fullpath: \"/test/file.json\",\n          // exists: true,\n          // type: \"wat\"\n        },\n        contents: Buffer.from(\n          `{\n      \"test\": \"a\",\n      \"test2\": \"b\",\n      \"somedata\": \"Normal version\"\n    }`,\n        ),\n      }),\n  ).toMatchSnapshot();\n});\n\nit(\"should transform json as json and support partial\", () => {\n  const plugin = transformJSON(config, {});\n  expect(typeof plugin.transform === \"function\").toBe(true);\n  expect(\n    typeof plugin.transform === \"function\" &&\n      // $FlowFixMe you are so funny sometime flow\n      plugin.transform({\n        file: {\n          name: \"file.json\",\n          fullpath: \"/test/file.json\",\n          // exists: true,\n          // type: \"wat\"\n        },\n        contents: Buffer.from(\n          `{\n      \"test\": \"a\",\n      \"test2\": \"b\",\n      \"somedata\": \"Normal version\",\n      \"partial\": {\n        \"somedata\": \"Light version\"\n      }\n    }`,\n        ),\n      }),\n  ).toMatchSnapshot();\n});\n"
  },
  {
    "path": "packages/plugin-transform-json/src/index.js",
    "content": "// @flow\n\nconst debug = require(\"debug\")(\"phenomic:plugin:transform-json\");\n\nconst transformJSON: PhenomicPluginModule<{}> = () => {\n  return {\n    name: \"@phenomic/plugin-transform-json\",\n    supportedFileTypes: [\"json\"],\n    transform({\n      file,\n      contents,\n    }: {|\n      file: PhenomicContentFile,\n      contents: Buffer,\n    |}): PhenomicTransformResult {\n      debug(`transforming ${file.name}`);\n\n      const json = JSON.parse(contents.toString());\n\n      const partial = {\n        // title fallback\n        title: file.name,\n        ...(json.partial || json),\n      };\n\n      return {\n        data: json,\n        partial,\n      };\n    },\n  };\n};\n\nexport default transformJSON;\n"
  },
  {
    "path": "packages/plugin-transform-markdown/README.md",
    "content": "# @phenomic/plugin-transform-markdown\n\n> Phenomic plugin to transform markdown resources.\n\n➡ More details at [phenomic.io](https://phenomic.io/)\n"
  },
  {
    "path": "packages/plugin-transform-markdown/bsconfig.json",
    "content": "{\n  \"name\": \"@phenomic/plugin-transform-markdown\",\n  \"refmt\": 3,\n  \"reason\": {\n    \"react-jsx\": 3\n  },\n  \"sources\": [\n    {\n      \"dir\": \"src\",\n      \"subdirs\": true\n    }\n  ],\n  \"suffix\": \".bs.js\",\n  \"package-specs\": {\n    \"module\": \"commonjs\",\n    \"in-source\": true\n  }\n}\n"
  },
  {
    "path": "packages/plugin-transform-markdown/docs/README.md",
    "content": "# @phenomic/plugin-transform-markdown\n\n@todo\n"
  },
  {
    "path": "packages/plugin-transform-markdown/package.json",
    "content": "{\n  \"name\": \"@phenomic/plugin-transform-markdown\",\n  \"version\": \"1.0.0\",\n  \"publishConfig\": {\n    \"access\": \"public\"\n  },\n  \"repository\": \"https://github.com/phenomic/phenomic.git\",\n  \"homepage\": \"https://phenomic.io\",\n  \"license\": \"MIT\",\n  \"authors\": [\n    \"Maxime Thirouin (MoOx)\",\n    \"bloodyowl <bloodyowl@icloud.com>\"\n  ],\n  \"keywords\": [\n    \"phenomic\",\n    \"phenomic-plugin\",\n    \"markdown\",\n    \"remark\",\n    \"rehype\",\n    \"react\"\n  ],\n  \"description\": \"Phenomic plugin to transform markdown resources\",\n  \"main\": \"lib/index.js\",\n  \"files\": [\n    \"lib\",\n    \"src\",\n    \"!**/__tests__\"\n  ],\n  \"dependencies\": {\n    \"@phenomic/helpers-transform\": \"^1.0.0\",\n    \"debug\": \"^2.6.0\",\n    \"gray-matter\": \"^3.0.0\",\n    \"rehype-autolink-headings\": \"^2.0.0\",\n    \"rehype-raw\": \"^2.0.0\",\n    \"rehype-slug\": \"^2.0.0\",\n    \"rehype-stringify\": \"^3.0.0\",\n    \"remark-highlights\": \"^1.0.0\",\n    \"remark-parse\": \"^4.0.0\",\n    \"remark-rehype\": \"^2.0.0\",\n    \"remark-toc\": \"^4.0.0\"\n  },\n  \"peerDependencies\": {\n    \"@phenomic/core\": \"^1.0.0-beta.3\"\n  },\n  \"devDependencies\": {\n    \"@phenomic/core\": \"^1.0.0\"\n  }\n}\n"
  },
  {
    "path": "packages/plugin-transform-markdown/src/__tests__/__snapshots__/index.js.snap",
    "content": "// Jest Snapshot v1, https://goo.gl/fbAQLP\n\nexports[`should transform markdown as html 1`] = `\nObject {\n  \"data\": Object {\n    \"body\": \"<h2 id=\\\\\"test\\\\\"><a aria-hidden=\\\\\"true\\\\\" href=\\\\\"#test\\\\\"><span class=\\\\\"icon icon-link\\\\\"></span></a>Test</h2>\n<p><a href=\\\\\"href\\\\\">link</a></p>\n<pre class=\\\\\"editor editor-colors\\\\\"><div class=\\\\\"line\\\\\"><span class=\\\\\"syntax--source syntax--js\\\\\"><span class=\\\\\"syntax--entity syntax--name syntax--type syntax--object syntax--console syntax--js\\\\\"><span>console</span></span><span class=\\\\\"syntax--meta syntax--method-call syntax--js\\\\\"><span class=\\\\\"syntax--meta syntax--delimiter syntax--method syntax--period syntax--js\\\\\"><span>.</span></span><span class=\\\\\"syntax--support syntax--function syntax--console syntax--js\\\\\"><span>log</span></span><span class=\\\\\"syntax--meta syntax--arguments syntax--js\\\\\"><span class=\\\\\"syntax--punctuation syntax--definition syntax--arguments syntax--begin syntax--bracket syntax--round syntax--js\\\\\"><span>(</span></span><span class=\\\\\"syntax--support syntax--variable syntax--dom syntax--js\\\\\"><span>window</span></span><span class=\\\\\"syntax--punctuation syntax--definition syntax--arguments syntax--end syntax--bracket syntax--round syntax--js\\\\\"><span>)</span></span></span></span></span></div></pre>\",\n    \"test\": \"a\",\n    \"test2\": \"b\",\n    \"title\": \"file.json\",\n  },\n  \"partial\": Object {\n    \"test\": \"a\",\n    \"test2\": \"b\",\n    \"title\": \"file.json\",\n  },\n}\n`;\n\nexports[`should transform markdown as json 1`] = `\nObject {\n  \"data\": Object {\n    \"body\": Object {\n      \"c\": Array [\n        Object {\n          \"c\": Array [\n            Object {\n              \"c\": Array [\n                Object {\n                  \"p\": Object {\n                    \"class\": \"icon icon-link\",\n                  },\n                  \"t\": \"span\",\n                },\n              ],\n              \"p\": Object {\n                \"aria-hidden\": \"true\",\n                \"href\": \"#test\",\n              },\n              \"t\": \"a\",\n            },\n            \"Test\",\n          ],\n          \"p\": Object {\n            \"id\": \"test\",\n          },\n          \"t\": \"h2\",\n        },\n        \"\n\",\n        Object {\n          \"c\": Array [\n            Object {\n              \"c\": Array [\n                \"link\",\n              ],\n              \"p\": Object {\n                \"href\": \"href\",\n              },\n              \"t\": \"a\",\n            },\n          ],\n          \"t\": \"p\",\n        },\n        \"\n\",\n        Object {\n          \"c\": Array [\n            Object {\n              \"c\": Array [\n                Object {\n                  \"c\": Array [\n                    Object {\n                      \"c\": Array [\n                        Object {\n                          \"c\": Array [\n                            \"console\",\n                          ],\n                          \"t\": \"span\",\n                        },\n                      ],\n                      \"p\": Object {\n                        \"class\": \"syntax--entity syntax--name syntax--type syntax--object syntax--console syntax--js\",\n                      },\n                      \"t\": \"span\",\n                    },\n                    Object {\n                      \"c\": Array [\n                        Object {\n                          \"c\": Array [\n                            Object {\n                              \"c\": Array [\n                                \".\",\n                              ],\n                              \"t\": \"span\",\n                            },\n                          ],\n                          \"p\": Object {\n                            \"class\": \"syntax--meta syntax--delimiter syntax--method syntax--period syntax--js\",\n                          },\n                          \"t\": \"span\",\n                        },\n                        Object {\n                          \"c\": Array [\n                            Object {\n                              \"c\": Array [\n                                \"log\",\n                              ],\n                              \"t\": \"span\",\n                            },\n                          ],\n                          \"p\": Object {\n                            \"class\": \"syntax--support syntax--function syntax--console syntax--js\",\n                          },\n                          \"t\": \"span\",\n                        },\n                        Object {\n                          \"c\": Array [\n                            Object {\n                              \"c\": Array [\n                                Object {\n                                  \"c\": Array [\n                                    \"(\",\n                                  ],\n                                  \"t\": \"span\",\n                                },\n                              ],\n                              \"p\": Object {\n                                \"class\": \"syntax--punctuation syntax--definition syntax--arguments syntax--begin syntax--bracket syntax--round syntax--js\",\n                              },\n                              \"t\": \"span\",\n                            },\n                            Object {\n                              \"c\": Array [\n                                Object {\n                                  \"c\": Array [\n                                    \"window\",\n                                  ],\n                                  \"t\": \"span\",\n                                },\n                              ],\n                              \"p\": Object {\n                                \"class\": \"syntax--support syntax--variable syntax--dom syntax--js\",\n                              },\n                              \"t\": \"span\",\n                            },\n                            Object {\n                              \"c\": Array [\n                                Object {\n                                  \"c\": Array [\n                                    \")\",\n                                  ],\n                                  \"t\": \"span\",\n                                },\n                              ],\n                              \"p\": Object {\n                                \"class\": \"syntax--punctuation syntax--definition syntax--arguments syntax--end syntax--bracket syntax--round syntax--js\",\n                              },\n                              \"t\": \"span\",\n                            },\n                          ],\n                          \"p\": Object {\n                            \"class\": \"syntax--meta syntax--arguments syntax--js\",\n                          },\n                          \"t\": \"span\",\n                        },\n                      ],\n                      \"p\": Object {\n                        \"class\": \"syntax--meta syntax--method-call syntax--js\",\n                      },\n                      \"t\": \"span\",\n                    },\n                  ],\n                  \"p\": Object {\n                    \"class\": \"syntax--source syntax--js\",\n                  },\n                  \"t\": \"span\",\n                },\n              ],\n              \"p\": Object {\n                \"class\": \"line\",\n              },\n              \"t\": \"div\",\n            },\n          ],\n          \"p\": Object {\n            \"class\": \"editor editor-colors\",\n          },\n          \"t\": \"pre\",\n        },\n      ],\n      \"t\": \"div\",\n    },\n    \"headings\": Array [\n      Object {\n        \"id\": \"test\",\n        \"level\": 2,\n        \"text\": \"Test\",\n      },\n    ],\n    \"test\": \"a\",\n    \"test2\": \"b\",\n    \"title\": \"file.json\",\n  },\n  \"partial\": Object {\n    \"headings\": Array [\n      Object {\n        \"id\": \"test\",\n        \"level\": 2,\n        \"text\": \"Test\",\n      },\n    ],\n    \"test\": \"a\",\n    \"test2\": \"b\",\n    \"title\": \"file.json\",\n  },\n}\n`;\n"
  },
  {
    "path": "packages/plugin-transform-markdown/src/__tests__/index.js",
    "content": "// @flow\n\nimport config from \"@phenomic/core/lib/defaultConfig.js\";\n\nimport transformMarkdown from \"../index.js\";\n\nit(\"should transform markdown as html\", () => {\n  const plugin = transformMarkdown(config);\n  expect(typeof plugin.transform === \"function\").toBe(true);\n  expect(\n    typeof plugin.transform === \"function\" &&\n      // $FlowFixMe you are so funny sometime flow\n      plugin.transform({\n        file: {\n          name: \"file.json\",\n          fullpath: \"/test/file.json\",\n          // exists: true,\n          // type: \"wat\"\n        },\n        contents: Buffer.from(\n          `---\ntest: a\ntest2: b\n---\n` + \"## Test\\n[link](href)\\n```js\\nconsole.log(window)\\n```\",\n        ),\n      }),\n  ).toMatchSnapshot();\n});\n\nit(\"should transform markdown as json\", () => {\n  const plugin = transformMarkdown(config, { output: \"json\" });\n  expect(typeof plugin.transform === \"function\").toBe(true);\n  expect(\n    typeof plugin.transform === \"function\" &&\n      // $FlowFixMe you are so funny sometime flow\n      plugin.transform({\n        file: {\n          name: \"file.json\",\n          fullpath: \"/test/file.json\",\n          // exists: true,\n          // type: \"wat\"\n        },\n        contents: Buffer.from(\n          `---\ntest: a\ntest2: b\n---\n` + \"## Test\\n[link](href)\\n```js\\nconsole.log(window)\\n```\",\n        ),\n      }),\n  ).toMatchSnapshot();\n});\n"
  },
  {
    "path": "packages/plugin-transform-markdown/src/default-options.js",
    "content": "// @flow\n\nconst defaultOptions = {\n  output: \"html\",\n  // Below \"html\" means \"something that looks like html\"\n  // The idea is to allow any kind of tags\n  // in order to map them later and allow custom react components in place of real\n  // html tags\n  plugins: [\n    // first markdown\n    require(\"remark-parse\"),\n    require(\"remark-toc\"),\n    //\n    // List of language Here\n    // https://github.com/atom/highlights/tree/master/deps\n    // if language is not in the list, use `additionalLangs: [\"language-{yourlanguage}\"]`\n    // and add this package (`language-{yourlanguage}`) to your node_modules\n    //\n    // To generated a CSS theme,\n    // https://github.com/MoOx/atom-syntax-theme-to-highlights-css\n    //\n    require(\"remark-highlights\"),\n    // markdown to html ast\n    // this is to allow \"raw\" things (html in md and md in html)\n    [require(\"remark-rehype\"), { allowDangerousHTML: true }],\n    require(\"rehype-raw\"),\n    // then some traditional plugins\n    require(\"rehype-slug\"),\n    require(\"rehype-autolink-headings\"),\n  ],\n};\n\nexport default defaultOptions;\n"
  },
  {
    "path": "packages/plugin-transform-markdown/src/index.js",
    "content": "// @flow\n\nimport frontMatterParser from \"gray-matter\";\nimport unifiedProcessor from \"@phenomic/helpers-transform/lib/unifiedProcessor\";\nimport extractMetaFromBodyNode from \"@phenomic/helpers-transform/lib/extractMetaFromBodyNode\";\nimport type { plugin } from \"@phenomic/helpers-transform/lib//unifiedProcessor\";\n\nimport defaultOptions from \"./default-options\";\n\n// eslint-disable-next-line\nconst debug = require(\"debug\")(\"phenomic:plugin:transform-markdown\");\n\ntype options = {|\n  output?: \"json\" | \"html\",\n  plugins?: $ReadOnlyArray<plugin>,\n|} | void; // void? https://github.com/facebook/flow/issues/2977\n\nconst name = \"@phenomic/plugin-transform-markdown\";\n\nconst transformMarkdown: PhenomicPluginModule<options> = (\n  config: PhenomicConfig,\n  options?: options,\n) => {\n  const processor = unifiedProcessor({\n    output: (options && options.output) || defaultOptions.output,\n    plugins: (options && options.plugins) || defaultOptions.plugins,\n  });\n\n  return {\n    name,\n    supportedFileTypes: [\"md\", \"markdown\"],\n    transform: ({\n      file,\n      contents,\n    }: {|\n      file: PhenomicContentFile,\n      contents: Buffer,\n    |}) => {\n      debug(`transforming ${file.fullpath}`);\n      const front = frontMatterParser(contents.toString());\n      debug(`front matter for ${file.fullpath}`, front.data);\n      // $FlowFixMe it's here, I can feel it Flow\n      const body = processor.processSync(front.content).contents;\n      const partial = {\n        // title fallback\n        title: file.name,\n        ...extractMetaFromBodyNode(body),\n        ...front.data,\n      };\n\n      return {\n        data: {\n          ...partial,\n          body,\n        },\n        partial,\n      };\n    },\n  };\n};\n\nexport default transformMarkdown;\n"
  },
  {
    "path": "packages/preset-react-app/README.md",
    "content": "# @phenomic/preset-react-app\n\n> Phenomic React app preset\n\n- renderer: react (`@phenomic/plugin-renderer-react`)\n- bundler: webpack (`@phenomic/plugin-bundler-webpack`)\n- collector: files (`@phenomic/plugin-collector-files`)\n- transformers: markdown and JSON (`@phenomic/plugin-transform-markdown` +\n  `@phenomic/plugin-transform-json`)\n\n---\n\nCheck out our\n[Getting started with Phenomic and `@phenomic/preset-react-app`](docs/getting-started/README.md)\n\n---\n\n➡ More details at [phenomic.io](https://phenomic.io/)\n"
  },
  {
    "path": "packages/preset-react-app/bsconfig.json",
    "content": "{\n  \"name\": \"@phenomic/preset-react-app\",\n  \"refmt\": 3,\n  \"reason\": {\n    \"react-jsx\": 3\n  },\n  \"sources\": [\n    {\n      \"dir\": \"src\",\n      \"subdirs\": true\n    }\n  ],\n  \"suffix\": \".bs.js\",\n  \"package-specs\": {\n    \"module\": \"commonjs\",\n    \"in-source\": true\n  },\n  \"bs-dependencies\": [\n    \"reason-react\",\n    \"@phenomic/api-client\",\n    \"@phenomic/plugin-renderer-react\"\n  ]\n}\n"
  },
  {
    "path": "packages/preset-react-app/docs/README.md",
    "content": "# Phenomic React app preset\n\n- renderer: react (`@phenomic/plugin-renderer-react`)\n- bundler: webpack (`@phenomic/plugin-bundler-webpack`)\n- collector: files (`@phenomic/plugin-collector-files`)\n- transformers: markdown and JSON (`@phenomic/plugin-transform-markdown` +\n  `@phenomic/plugin-transform-json`)\n\n---\n\nCheck out our [Getting started](./getting-started/README.md)\n"
  },
  {
    "path": "packages/preset-react-app/docs/getting-started/01.md",
    "content": "# Installation\n\nThe react preset we are going to use will work with React and Webpack.\n\n```console\nnpm install --save-dev react react-dom react-router@^3.2.0\nnpm install --save-dev @phenomic/core @phenomic/cli @phenomic/preset-react-app\n```\n\nThese lines will install Phenomic and its\n[react app preset](https://github.com/phenomic/phenomic/tree/master/packages/preset-react-app).\n\n⚠️ _If you don't have a `package.json` you can do this simple command to get a\nvalid one:_\n\n```console\necho '{\"private\":true}' > package.json\n```\n\n---\n\nThe react preset will allow you to consume Markdown and JSON files as data\nresources to generate your website/app.\n\n<details>\n<summary>See complete <code>package.json</code></summary>\n(versions might be more recent)\n\n```json\n{\n  \"private\": true,\n  \"devDependencies\": {\n    \"@phenomic/core\": \"^1.0.0-alpha.1\",\n    \"@phenomic/cli\": \"^1.0.0-alpha.1\",\n    \"@phenomic/preset-react-app\": \"^1.0.0-alpha.1\",\n    \"react\": \"^16.8.0\",\n    \"react-dom\": \"^16.8.0\",\n    \"react-router\": \"^3.2.0\"\n  }\n}\n```\n\n</details>\n\n## Configuration\n\nHere we going to tell Phenomic the plugins we want to use via the preset. To do\nso, we are going to add a `phenomic` section in our `package.json`\n\n```json\n{\n  \"...\": \"...\",\n  \"phenomic\": {\n    \"presets\": [\"@phenomic/preset-react-app\"]\n  }\n}\n```\n\n<details>\n<summary>See complete <code>package.json</code></summary>\n\n```json\n{\n  \"private\": true,\n  \"devDependencies\": {\n    \"@phenomic/core\": \"^1.0.0-alpha.1\",\n    \"@phenomic/cli\": \"^1.0.0-alpha.1\",\n    \"@phenomic/preset-react-app\": \"^1.0.0-alpha.1\",\n    \"react\": \"^16.8.0\",\n    \"react-dom\": \"^16.8.0\",\n    \"react-router\": \"^3.2.0\"\n  },\n  \"phenomic\": {\n    \"presets\": [\"@phenomic/preset-react-app\"]\n  }\n}\n```\n\n</details>\n\n---\n\n→ [Continue tutorial](02.md)\n"
  },
  {
    "path": "packages/preset-react-app/docs/getting-started/02.md",
    "content": "# Your first page\n\nNow we will need to create the entry point of your website/app. Let's create a\nfile `App.js`, placing it on the root directory of your project (sibling to\n`package.json`).\n\n```js\nimport React from \"react\";\nimport { Router, Route, browserHistory } from \"react-router\";\nimport { createApp } from \"@phenomic/preset-react-app/lib/client\";\n\nconst Home = () => (\n  <div>\n    <p>This is a homepage</p>\n  </div>\n);\n\nexport default createApp(() => (\n  <Router history={browserHistory}>\n    <Route path=\"/\" component={Home} />\n  </Router>\n));\n```\n\nHere we defined a router with one route that will be the homepage. Let's check\nthis page in a browser.\n\n## Starting the development server\n\nPhenomic CLI have 2 commands: `start` (development server) and `build` (to\ngenerate static build).\n\nLet's add this commands into some scripts of the `package.json`\n\n```json\n{\n  \"...\": \"...\",\n  \"scripts\": {\n    \"start\": \"phenomic start\",\n    \"build\": \"phenomic build\"\n  }\n}\n```\n\n<details>\n<summary>See complete <code>package.json</code></summary>\n\n```json\n{\n  \"private\": true,\n  \"devDependencies\": {\n    \"@phenomic/core\": \"^1.0.0-alpha.1\",\n    \"@phenomic/cli\": \"^1.0.0-alpha.1\",\n    \"@phenomic/preset-react-app\": \"^1.0.0-alpha.1\",\n    \"react\": \"^16.8.0\",\n    \"react-dom\": \"^16.8.0\",\n    \"react-router\": \"^3.2.0\"\n  },\n  \"phenomic\": {\n    \"presets\": [\"@phenomic/preset-react-app\"]\n  },\n  \"scripts\": {\n    \"start\": \"phenomic start\",\n    \"build\": \"phenomic build\"\n  }\n}\n```\n\n</details>\n\nNow we can use `npm start` to start the website/app. Website/app should be\naccessible via [http://localhost:3333](http://localhost:3333).\n\nEnjoy your hello world!\n\n---\n\n→ [Continue tutorial](03.md)\n"
  },
  {
    "path": "packages/preset-react-app/docs/getting-started/03.md",
    "content": "# Adding a page from markdown file\n\nOne homepage is cool, but we might want to add more content. Let's create a\nmarkdown file in our `content` folder.\n\nPlace the content below in a new file `content/posts/first-post.md`.\n\n```md\n# This is a [Markdown](https://en.wikipedia.org/wiki/Markdown#Example) file\n\nIf you are new to Markdown, you might want to check those links:\n\n- [What is Markdown?](http://whatismarkdown.com/)\n- [Mastering Markdown, a GitHub guide](https://guides.github.com/features/mastering-markdown/)\n- [wikipedia.org/wiki/Markdown](https://en.wikipedia.org/wiki/Markdown#Example)\n- [masteringmarkdown.com](http://masteringmarkdown.com/)\n```\n\nNow let's add a simple route to our `App.js`\n\n```js\nexport default createApp(() => (\n  <Router history={browserHistory}>\n    <Route path=\"/\" component={Home} />\n    <Route path=\"/blog/*\" component={BlogPostContainer} />\n  </Router>\n));\n```\n\nWe also need to create a `BlogPostContainer` component to render the posts.\n\n```js\nimport { Router, Route, browserHistory, Link } from \"react-router\";\nimport {\n  createApp,\n  withPhenomicApi,\n  query,\n  BodyRenderer\n} from \"@phenomic/preset-react-app/lib/client\";\n\n// ...\n\nconst BlogPost = ({ isLoading, page }) => (\n  <div>\n    {isLoading && \"Loading...\"}\n    {!isLoading &&\n      page.node && (\n        <article>\n          <h1>{page.node.title}</h1>\n          <BodyRenderer>{page.node.body}</BodyRenderer>\n        </article>\n      )}\n    <footer>\n      <Link to=\"/\">Go to home</Link>\n    </footer>\n  </div>\n);\n\nconst BlogPostContainer = withPhenomicApi(BlogPost, props => ({\n  page: query({ path: \"content/posts\", id: props.params.splat })\n}));\n\n// ...\nexport default createApp(() => (\n  // ...\n))\n```\n\nIn our example above, we are doing a `query` on the path `content/posts`. We are using\nthe `id` to find a single item. `id` is the filename, in our case\n`first-post` (the .md extension is ignored, and `stuff/index.md` being\nconsidered as `stuff`).\n\n## Accessing the markdown page\n\nWe just created a route and a component to retrieve the markdown file. Now we\ncan access our post by accessing directly\n[http://localhost:3333/blog/first-post/](http://localhost:3333/blog/first-post/).\n\n---\n\n→ [Continue tutorial](04.md)\n"
  },
  {
    "path": "packages/preset-react-app/docs/getting-started/04.md",
    "content": "# Generating list of pages\n\nAccessing directly an url is cool, but only when you know it! It would be nice\nto have a list of existing pages (in our case, `posts`). So let's add an index\non our `Home`!\n\nFor this we will need to wrap our `Home` with a container like for `BlogPosts`.\nThe difference here is that we are going to make a query an entire path.\n\n```js\nconst HomeContainer = withPhenomicApi(Home, () => ({\n  posts: query({ path: \"content/posts\" }),\n}));\n```\n\nIt's easier than before, same `query`, but without `id`.\n\nNow we need to change our route to use `HomeContainer` instead of `Home`\n\n```js\nexport default createApp(() => (\n  <Router history={browserHistory}>\n    <Route path=\"/\" component={HomeContainer} />\n    <Route path=\"/blog/*\" component={BlogPostContainer} />\n  </Router>\n));\n```\n\nMaybe you noticed that we actually didn't use our resources in our `Home`\ncomponent? Let's display the list of posts with this change\n\n```js\nimport { Router, Route, browserHistory, Link } from \"react-router\";\n// ..\n\nconst Home = ({ isLoading, posts }) => (\n  <div>\n    <h1>Home</h1>\n    {isLoading && \"Loading...\"}\n    {!isLoading && (\n      <ul>\n        {posts &&\n          posts.node &&\n          posts.node.list &&\n          posts.node.list.map(post => (\n            <li key={post.id}>\n              <Link to={`/blog/${post.id}/`}>{post.title || post.id}</Link>\n            </li>\n          ))}\n      </ul>\n    )}\n  </div>\n);\n```\n\nNow your homepage should render a list with your single post. But wait, the\nlabel being used is the `id`?! This can be improved by adding meta data into\nyour markdown file.\n\n## The front-matter\n\nAt the top of each markdown file, we can add \"front-matter\" in a section\nseparated by 3 dashes, `---`. You can store anything you want in there. It's by\ndefault a [YAML section](https://en.wikipedia.org/wiki/YAML#Sample_document),\nbut you can use\n[other formats like JSON, TOML, JavaScript...](https://www.npmjs.com/package/gray-matter#highlights).\n\nLet's modify our file with a `title` property. And while we are editing this\nfile, we can also add a `date`\n\n```md\n---\ntitle: \"First post\"\ndate: \"2017-01-01\"\n---\n\n# This is a [Markdown](https://en.wikipedia.org/wiki/Markdown#Example) file\n\n...\n```\n\nNow, check out your homepage, you should see the title. Keep in mind that this\nfront-matter can contains all kind of informations like date, authors name,\ntags, image reference etc. By default some keys are automatically interpreted as\nway to query your content. This allows you to query posts for a single author, a\nspecific tag and even order by date.\n\n---\n\n→ [Continue tutorial](05.md)\n"
  },
  {
    "path": "packages/preset-react-app/docs/getting-started/05.md",
    "content": "# Immutable pagination\n\nWhen you will start having a lot of content, you might want to add pagination.\nFrom a developer perspective, it is very straight forward to enable pagination\non a query. Let's continue with our list of posts by adding more parameters\n\n```js\nconst HomeContainer = withPhenomicApi(Home, () => ({\n  posts: query({ path: \"content/posts\", limit: 2 }),\n}));\n```\n\nHere we just added a `limit` parameter. That's enough to limit the number of\nitems, but won't help to handle next pages.\n\nWe decided to solve the pagination problem with a single parameter: `after`.\nThis parameter is a hash that is pointing to specific place in the list for the\ngiven path.\n\nBefore adding it in the query, we need to actually create a link to access the\nnext page! Let's add a link in our Home component. In React you can only have\none parent in a component. In this case the `div` in our home component is the\nparent. Make sure to add the link inside the `div` but at the end of it.\n\n```js\n<div>\n  {posts.node &&\n    posts.node.next && (\n      <Link to={`/after/${posts.node.next}/`}>Older posts</Link>\n    )}\n</div>\n```\n\nWe now have to be able to read it from the router so that we can pass it to the\nquery. So, we will add a route in the router:\n\n```js\nexport default createApp(() => (\n  <Router history={browserHistory}>\n    <Route path=\"/\" component={HomeContainer} />\n    <Route path=\"/after/:after\" component={HomeContainer} />\n    <Route path=\"/blog/*\" component={BlogPostContainer} />\n  </Router>\n));\n```\n\nThis link will look like\n`http://localhost:3333/after/MjAxNC0wNS0yMC1zdWR3ZWItMjAxNA==`\n\nOne more thing is to be done now that we have the url understood by the router:\nwe need to use `after` in our query. Let's modify the query like this:\n\n```js\nconst HomeContainer = withPhenomicApi(Home, props => ({\n  posts: query({ path: \"content/posts\", limit: 2, after: props.params.after }),\n}));\n```\n\nWith this we should now have the url working. And now you have a pagination that\nwill never die. It's like an immutable pagination!\n\nWhat does this mean? Think about the url `/page/2`. You may want to share it...\nbut content may have changed if new posts were added, right? With our approach,\nusing a hash, we have a url that never changes and that will always return the\nsame result with the same query. This process involves generating all possible\npages under the hood, but that's Phenomic's job.\n\nOh, and before continuing, you should add another simple link for \"Newer posts\"\n\n```js\n<div>\n  {posts.node &&\n    posts.node.previous && (\n      <Link\n        to={\n          posts.node.previousPageIsFirst\n            ? `/`\n            : `/after/${posts.node.previous}/`\n        }\n      >\n        Newer posts\n      </Link>\n    )}\n</div>\n```\n\n---\n\n→ [Continue tutorial](06.md)\n"
  },
  {
    "path": "packages/preset-react-app/docs/getting-started/06.md",
    "content": "# Handle pages meta (HTML `<head>`)\n\nThe recommended way to manage HTML meta tags (title, description, links,\nexternal scripts/styles, facebook & twitter meta...) is to use\n[react-helmet](https://github.com/nfl/react-helmet) package.\n\nThis reusable React component will manage all of your changes to the document\nhead. It takes plain HTML tags and outputs plain HTML tags.\n\n⚠️ _You can even define `<html>` and `<body>` attributes_.\n\nFirst, install `react-helmet`\n\n```console\nnpm install --save react-helmet\n```\n\nYou can start using `react-helmet` directly in any components:\n\n```js\nimport Head from \"react-helmet\";\nimport {\n  createApp,\n  withPhenomicApi,\n  query,\n  BodyRenderer,\n  textRenderer,\n} from \"@phenomic/preset-react-app/lib/client\";\n\n// ...\n\nconst Home = ({ isLoading, posts }) => (\n  <div>\n    <Head>\n      <title>Hello world</title>\n      <meta name=\"description\" content=\"Everything is awesome!\" />\n    </Head>\n    <h1>Home</h1>\n    {!isLoading && <ul>{/* ... */}</ul>}\n  </div>\n);\n\n// ...\n\nconst BlogPost = ({ isLoading, page }) => (\n  <div>\n    {isLoading && \"Loading...\"}\n    {!isLoading &&\n      page.node && (\n        <article>\n          <Head>\n            <title>{page.node.title}</title>\n            <meta\n              name=\"description\"\n              content={textRenderer(page.node.body).slice(0, 150) + \"…\"}\n            />\n          </Head>\n          <h1>{page.node.title}</h1>\n          <BodyRenderer>{page.node.body}</BodyRenderer>\n        </article>\n      )}\n    <footer>{/* ... */}</footer>\n  </div>\n);\n```\n\nIn order to have the injection of meta into your static html files, you will\nneed a custom html template.\n\n⚠️ _Default `Html` component is very rudimentary and should be adapted if you\ncare about SEO_.\n\nHere is what you need to add if you want to include all `react-helmet` output:\n\n```js\n// Html.js\nexport default ({ App, render }) => {\n  // if needed, you can know if you are in development or in static rendering\n  // const isDev = process.env.PHENOMIC_ENV === \"development\"\n  const { Main, State, Script, Style } = render(<App />);\n  const helmet = Head.renderStatic();\n  return (\n    <html {...helmet.htmlAttributes.toComponent()}>\n      <head>\n        {helmet.meta.toComponent()}\n        {helmet.title.toComponent()}\n        {helmet.base.toComponent()}\n        <Style />\n        {helmet.link.toComponent()}\n        {helmet.style.toComponent()}\n        {helmet.script.toComponent()}\n        {helmet.noscript.toComponent()}\n      </head>\n      <body {...helmet.bodyAttributes.toComponent()}>\n        <Main />\n        <State />\n        <Script />\n      </body>\n    </html>\n  );\n};\n```\n\n**This file `Html.js` file should be placed next to `App.js`**\n\nNow your static render should include all meta generated by `react-helmet`.\n\n**To know more about all the things you can do with `react-helmet`, please read\n[the documentation](https://github.com/nfl/react-helmet#readme).**\n\n---\n\n→ [Continue tutorial](07.md)\n"
  },
  {
    "path": "packages/preset-react-app/docs/getting-started/07.md",
    "content": "# Setup a global layout with a common header and footer\n\nSimple problem means simple solution: you need to use a common wrapper\ncomponent.\n\n```js\nimport Head from \"react-helmet\";\n\nconst Layout = ({ children }) => (\n  <div>\n    <Head>\n      <html lang=\"en\" /> {/* this is valid react-helmet usage! */}\n      <meta charSet=\"utf-8\" />\n      <meta name=\"viewport\" content=\"width=device-width, initial-scale=1\" />\n    </Head>\n    <header>{/* ... */}</header>\n    <div>{children}</div>\n    <footer>{/* ... */}</footer>\n  </div>\n);\n```\n\nNow you can replace previous `<div>` used in previous example:\n\n```js\nconst Home = ({ posts }) => <Layout>{/* .... */}</Layout>;\n\n// ...\n\nconst BlogPost = ({ page }) => <Layout>{/* .... */}</Layout>;\n```\n\nIf you need different layouts, you can just use a common base component, and do\nsome alternatives based on it.\n\nIf you want to specify layout from markdown files, you can handle this yourself\nin your component specified in your routes.\n\nHere is a simple implementation\n\n```js\n// ...\nconst DefaultPostLayout = ({ title, body }) => (\n  <article>\n    <Head>\n      <title>{title}</title>\n      <meta\n        name=\"description\"\n        content={textRenderer(body).slice(0, 150) + \"…\"}\n      />\n    </Head>\n    <h1>{title}</h1>\n    <BodyRenderer>{body}</BodyRenderer>\n  </article>\n);\n\nconst HeroPostLayout = ({ title, body }) => (\n  <article>\n    <Head>\n      <title>{title}</title>\n      <meta\n        name=\"description\"\n        content={textRenderer(body).slice(0, 150) + \"…\"}\n      />\n    </Head>\n    <div style={{ padding: \"4rem\", background: \"pink\", color: \"#fff\" }}>\n      <h1>{title}</h1>\n    </div>\n    <BodyRenderer>{body}</BodyRenderer>\n  </article>\n);\n\nconst PostLayouts = {\n  default: DefaultPostLayout,\n  hero: HeroPostLayout,\n};\n\nconst BlogPost = ({ isLoading, page }) => {\n  const PostLayout =\n    (page.node && PostLayouts[page.node.layout]) || PostLayouts.default;\n  return (\n    <Layout>\n      {isLoading && \"Loading...\"}\n      {!isLoading && page.node && <PostLayout {...page.node} />}\n      <footer>\n        <Link to=\"/\">Go to home</Link>\n      </footer>\n    </Layout>\n  );\n};\n```\n\nThen to use it, you can just add a `layout` property in your front-matter\n\n```md\n---\ntitle: Another post\nlayout: hero\n---\n\nBlah blah...\n```\n\n(Feel free to name the `layout` property how you prefer (eg: `type`)).\n\n---\n\n→ [Continue tutorial](08.md)\n"
  },
  {
    "path": "packages/preset-react-app/docs/getting-started/08.md",
    "content": "# Hot loading\n\nYou might be interested by hot loading, which allow you to edit your code and\nget instant feedback in your browser. By default, CSS changes will already be\ninstantly hot loaded, like the content. But you might also want to tweak your\nReact components in real time. In order to do that, you have to edit a little\nyour `App.js`:\n\nReplace this\n\n```js\nimport { createApp } from \"@phenomic/preset-react-app/lib/client\";\n\n// ...\n\nexport default createApp(() => (\n  <Router history={browserHistory}>{/* ... */}</Router>\n));\n```\n\nBy the following code:\n\n```js\nimport { createApp, renderApp } from \"@phenomic/preset-react-app/lib/client\";\n\n// ...\n\nconst routes = () => <Router history={browserHistory}>{/* ... */}</Router>;\n\nexport default createApp(routes);\n\nif (module.hot) {\n  module.hot.accept(() => renderApp(routes));\n}\n```\n\nThis will re-render your app as soon as an update in your code is received.\n\n---\n\n→ [Continue tutorial](09.md)\n"
  },
  {
    "path": "packages/preset-react-app/docs/getting-started/09.md",
    "content": "# Handling page not found (404) and unknown URLs\n\n**Because Phenomic will only generated during static build all possible _known_\nURLs for _known resources_**, we need to handle the case where URLs requested\ndoes not match any result.\n\nEverytime we use a star (`*`) and (sometimes) a parameter (`:name`) in a\n`<Route` definition, you will need to handle the case for data requested do not\nexist. With our previous example, we will need to add some case in multiple\nplaces.\n\nLet's create a component to render the error\n\n```js\nconst PageError = ({ error }) => {\n  const status = (error && error.status) || 404;\n  const message = error && status !== 404 ? error.statusText : \"Page not found\";\n\n  return (\n    <div>\n      <Head>\n        <title>{message}</title>\n      </Head>\n      <h1>{message}</h1>\n    </div>\n  );\n};\n```\n\nNow we need to catch all routes so we need to add a `*` after all routes\n\n```js\nconst routes = () => (\n  <Router history={browserHistory}>\n    <Route path=\"/\" component={HomeContainer} />\n    <Route path=\"/after/:after\" component={HomeContainer} />\n    <Route path=\"/blog/*\" component={BlogPostContainer} />\n    <Route path=\"*\" component={PageError} />\n  </Router>\n);\n```\n\nHere it's almost done. We just miss all unknown error under `/blog/*` that won't\nbe caught by the new route. So we will need to edit `BlogPost` to handle this\nkind of problem:\n\n```js\nconst BlogPost = ({ hasError, isLoading, page }) => {\n  if (hasError) {\n    return <PageError error={page.error} />;\n  }\n\n  return <Layout>{/* ...*/}</Layout>;\n};\n```\n\nThe fact that you have to handle each unknown routes that have a wildcard allows\nyou to offer more accurate error pages.\n\n---\n\n→ [Continue tutorial](10.md)\n"
  },
  {
    "path": "packages/preset-react-app/docs/getting-started/10.md",
    "content": "# Building your app as static HTML files\n\nA single command to build your site into a `dist` folder\n\n```console\nnpm run build\n```\n\n⚠️ **Note that this folder need to be served from a real web server.** You\ncannot just open an `index.html` and expect the client code to work correctly.\nIf you want to run the built project locally, you can run it with these commands\n\n```console\nnpm install -g serve\nserve dist\n```\n\nThis will install a small web server and launch your project from `dist`.\n\n## Debugging static build\n\nDuring the static build, you might get some different kinds of errors\n\n### `Invariant Violation`\n\n```\nInvariant Violation: Minified React error #61; visit http://facebook.github.io/react/docs/error-decoder.html?invariant=61 for the full message or use the non-minified dev environment for full errors and additional helpful warnings.\n```\n\nBy default, the static build has `process.env.NODE_ENV` set to `production`. You\ncan start the static build like this\n\n```console\nNODE_ENV=development npm run build\n```\n\nThen you can return to the console and you should have a more explicit error.\n\n### Debugging Phenomic core\n\nPhenomic uses [debug](https://github.com/visionmedia/debug) under the hood, so\nit's pretty easy to get a very verbose output in your terminal. You can start or\nbuild your project by prefixing your command with the `DEBUG` environment\nvariable set to `phenomic:*`\n\n```console\nNODE_ENV=development DEBUG=phenomic:* npm run build\n```\n\nDepending on what you want to view/filter, you can use a more spefic value for\n`DEBUG` (eg: `DEBUG=phenomic:core:*`).\n\n## Deploying static build\n\nYou can deploy the `dist` folder to any kind of static hosting. Nothing special\nis supposed to be done!\n\n---\n\nCongratulations! You successfully followed our tutorial. You can find the source\nin\n[phenomic/examples/react-app-getting-started](https://github.com/phenomic/phenomic/tree/master/examples/react-app-getting-started)\n"
  },
  {
    "path": "packages/preset-react-app/docs/getting-started/README.md",
    "content": "# Getting started\n\nWe recommend you to follow this tutorial step by step in order to learn how to\nuse Phenomic with the React preset.\n\n1. [Installation of Phenomic with `@phenomic/preset-react-app`](01.md)\n2. [Your first page](02.md)\n3. [Adding a page from markdown file](03.md)\n4. [Generating list of pages](04.md)\n5. [Immutable pagination](05.md)\n6. [Handle pages meta (HTML `<head>`)](06.md)\n7. [Setup a global layout with a common header and footer](07.md)\n8. [Hot loading](08.md)\n9. [Handling page not found (404) and unknown URLs](09.md)\n10. [Building your app as static HTML files](10.md)\n\n---\n\nℹ️ You can find the complete source of this tutorial in\n[phenomic/examples/react-app-getting-started](https://github.com/phenomic/phenomic/tree/master/examples/react-app-getting-started).\n"
  },
  {
    "path": "packages/preset-react-app/package.json",
    "content": "{\n  \"name\": \"@phenomic/preset-react-app\",\n  \"version\": \"1.0.0\",\n  \"publishConfig\": {\n    \"access\": \"public\"\n  },\n  \"repository\": \"https://github.com/phenomic/phenomic.git\",\n  \"homepage\": \"https://phenomic.io\",\n  \"license\": \"MIT\",\n  \"authors\": [\n    \"Maxime Thirouin (MoOx)\",\n    \"bloodyowl <bloodyowl@icloud.com>\"\n  ],\n  \"keywords\": [\n    \"phenomic\",\n    \"phenomic-preset\",\n    \"react\",\n    \"webpack\",\n    \"markdown\",\n    \"json\"\n  ],\n  \"description\": \"Phenomic React app preset\",\n  \"main\": \"lib/index.js\",\n  \"files\": [\n    \"lib\",\n    \"src\",\n    \"!**/__tests__\",\n    \"bsconfig.json\"\n  ],\n  \"dependencies\": {\n    \"@phenomic/plugin-api-related-content\": \"^1.0.0\",\n    \"@phenomic/plugin-bundler-webpack\": \"^1.0.0\",\n    \"@phenomic/plugin-collector-files\": \"^1.0.0\",\n    \"@phenomic/plugin-public-assets\": \"^1.0.0\",\n    \"@phenomic/plugin-renderer-react\": \"^1.0.0\",\n    \"@phenomic/plugin-transform-json\": \"^1.0.0\",\n    \"@phenomic/plugin-transform-markdown\": \"^1.0.0\"\n  }\n}\n"
  },
  {
    "path": "packages/preset-react-app/src/client.js",
    "content": "// @flow\n\nimport {\n  renderApp,\n  createApp,\n  createContainer,\n  withInitialProps,\n  withPhenomicApi,\n  query,\n  BodyRenderer,\n  textRenderer,\n  Link,\n} from \"@phenomic/plugin-renderer-react/lib/client\";\n\nexport {\n  renderApp,\n  createApp,\n  createContainer,\n  withInitialProps,\n  withPhenomicApi,\n  query,\n  BodyRenderer,\n  textRenderer,\n  Link,\n};\n"
  },
  {
    "path": "packages/preset-react-app/src/index.js",
    "content": "// @flow\n\nimport bundlerWebpack from \"@phenomic/plugin-bundler-webpack\";\nimport rendererReact from \"@phenomic/plugin-renderer-react\";\nimport collectorFiles from \"@phenomic/plugin-collector-files\";\nimport transformMarkdown from \"@phenomic/plugin-transform-markdown\";\nimport transformJson from \"@phenomic/plugin-transform-json\";\nimport apiRelatedContent from \"@phenomic/plugin-api-related-content\";\nimport publicAssets from \"@phenomic/plugin-public-assets\";\n\nconst presetReactApp = () => {\n  return {\n    plugins: {\n      \"@phenomic/plugin-bundler-webpack\": bundlerWebpack,\n      \"@phenomic/plugin-renderer-react\": rendererReact,\n      \"@phenomic/plugin-transform-markdown\": [\n        transformMarkdown,\n        { output: \"json\" },\n      ],\n      \"@phenomic/plugin-transform-json\": transformJson,\n      \"@phenomic/plugin-collector-files\": collectorFiles,\n      \"@phenomic/plugin-api-related-content\": apiRelatedContent,\n      \"@phenomic/plugin-public-asset\": publicAssets,\n    },\n  };\n};\n\nexport default presetReactApp;\n"
  },
  {
    "path": "packages/preset-react-app/src/phenomicPresetReactApp.re",
    "content": "include PhenomicApiClient;\n\ninclude PhenomicRendererReactClient;\n/* for now only as js\n   import createApp, { renderApp } from \"./createApp.js\";\n   import createContainer from \"./deprecated-createContainer\";\n   import withPhenomicApi from \"./withPhenomicApi\";\n   import withInitialProps from \"./withInitialProps\";\n   import Provider from \"./components/Provider\";\n   import textRenderer from \"./components/textRenderer\";\n   */\n"
  },
  {
    "path": "scripts/examples.js",
    "content": "// @flow\n\nimport path from \"path\";\n\nimport globby from \"globby\";\n\nimport { runCommand } from \"./utils.js\";\n\nconsole.log(`Building all examples...\\n`);\n\nconst args = process.argv.slice(2);\n\nconst examplesFolder = __dirname + \"/../examples\";\nconst examples = globby.sync(\"*/package.json\", {\n  cwd: examplesFolder,\n});\nexamples.filter(example => example.match(args[0])).forEach(examplePkg => {\n  const example = path.dirname(examplePkg);\n  console.log(\"- examples/\" + example);\n  runCommand(\"npm\", [\"run\", \"build\"], {\n    cwd: path.join(examplesFolder, example),\n    // stdio: \"ignore\"\n  });\n});\n"
  },
  {
    "path": "scripts/utils.js",
    "content": "// @flow\n\nconst spawnSync = require(\"cross-spawn\").sync;\nconst chalk = require(\"chalk\");\n\nexport const runCommand = (\n  cmd: string,\n  args: $ReadOnlyArray<string>,\n  options: Object = {},\n) => {\n  console.log(chalk.dim(`$ ${cmd} ${args.join(\" \")}`));\n  const result = spawnSync(cmd, args, { stdio: \"inherit\", ...options });\n  if (result.error || result.status !== 0) {\n    const message = \"Error running command.\";\n    const error = new Error(message);\n    error.stack = result.error;\n    throw error;\n  }\n};\n"
  },
  {
    "path": "website/.gitignore",
    "content": "# node / npm\nnode_modules\n*.log\n\n# phenomic build\ndist\n.screenshots\npublic/showcase/entry\n"
  },
  {
    "path": "website/App.js",
    "content": "// @flow\n\nimport * as React from \"react\";\nimport { Router, Route, IndexRoute, browserHistory } from \"react-router\";\nimport { AppRegistry } from \"react-native-web\";\nimport { createApp, renderApp } from \"@phenomic/preset-react-app/lib/client\";\nimport GA from \"react-ga\";\n\nimport \"./defaults.css\";\nimport \"./highlights-theme.css\";\n\nimport Wrapper from \"./components/Wrapper\";\nimport Home from \"./components/Home\";\nimport PageDoc from \"./components/PageDoc\";\nimport Tutorials from \"./components/Tutorials\";\nimport Plugins from \"./components/Plugins\";\nimport ShowcasePage from \"./components/PageShowcase\";\nimport ShowcaseList, { ShowcaseListByTag } from \"./components/ShowcaseList\";\nimport PageError from \"./components/PageError\";\nimport BlogItem from \"./components/BlogItem\";\nimport BlogList from \"./components/BlogList\";\nimport PagePackageList from \"./components/PagePackageList\";\n\n// Google Analytics\nconst isProduction = process.env.NODE_ENV === \"production\";\nif (isProduction) GA.initialize(\"UA-76349880-1\");\nconst pageView = isProduction\n  ? () => {\n      const url = window.location.pathname + window.location.search;\n      GA.set({ page: url });\n      GA.pageview(url);\n    }\n  : () => console.info(\"New pageview\", window.location.href);\n\n// @todo handle more languages\nconst routes = () => (\n  <Router history={browserHistory} onUpdate={pageView}>\n    <Route component={Wrapper}>\n      <Route path=\"/\" component={Home} />\n      <Route path=\"/en/\">\n        <IndexRoute component={PageDoc} />\n        <Route path=\"packages\" component={PagePackageList} />\n        <Route path=\"packages/*\" component={PageDoc} />\n        <Route path=\"tutorials\" component={Tutorials} />\n        <Route path=\"plugins\" component={Plugins} />\n        <Route path=\"blog\" component={BlogList} />\n        <Route path=\"blog/after/:after\" component={BlogList} />\n        <Route path=\"blog/*\" component={BlogItem} />\n        <Route path=\"showcase\" component={ShowcaseList} />\n        <Route path=\"showcase/after/:after\" component={ShowcaseList} />\n        <Route\n          path=\"showcase/tag/:showcaseTags\"\n          component={ShowcaseListByTag}\n        />\n        <Route\n          path=\"showcase/tag/:showcaseTags/after/:after\"\n          component={ShowcaseListByTag}\n        />\n        <Route path=\"showcase/*\" component={ShowcasePage} />\n      </Route>\n      <Route path=\"404.html\" component={PageError} />\n      <Route path=\"*\" component={PageError} />\n    </Route>\n  </Router>\n);\n\nconst render = (rootComponent, rootTag) => {\n  AppRegistry.registerComponent(\"App\", () => () => rootComponent);\n  AppRegistry.runApplication(\"App\", { rootTag });\n};\n\nexport default createApp(routes, render);\n\nif (module.hot) {\n  module.hot.accept(() => renderApp(routes, render));\n}\n\n// kill previous website ServiceWorker\nif (typeof navigator !== \"undefined\" && \"serviceWorker\" in navigator) {\n  navigator.serviceWorker.getRegistrations().then(registrations => {\n    for (const registration of registrations) registration.unregister();\n  });\n}\n"
  },
  {
    "path": "website/Html.js",
    "content": "// @flow\n\nimport * as React from \"react\";\nimport Head from \"react-helmet\";\nimport { AppRegistry } from \"react-native-web\";\n\nconst Html = ({ App, render }: PhenomicHtmlPropsType) => {\n  AppRegistry.registerComponent(\"App\", () => App);\n  const app = AppRegistry.getApplication(\"App\");\n  const { Main, State, Script, Style } = render(app.element);\n  const helmet = Head.renderStatic();\n  return (\n    <html {...helmet.htmlAttributes.toComponent()}>\n      <head>\n        {helmet.meta.toComponent()}\n        {helmet.title.toComponent()}\n        {helmet.base.toComponent()}\n        {app.getStyleElement()}\n        <Style />\n        {helmet.link.toComponent()}\n        {helmet.style.toComponent()}\n        {helmet.script.toComponent()}\n        {helmet.noscript.toComponent()}\n      </head>\n      <body {...helmet.bodyAttributes.toComponent()}>\n        <Main />\n        <State />\n        <Script />\n      </body>\n    </html>\n  );\n};\n\nexport default Html;\n"
  },
  {
    "path": "website/__tests__/index.js",
    "content": "// @flow\n\n/* eslint-disable import/no-extraneous-dependencies */\nimport globby from \"globby\";\n\nconst testFolder = __dirname + \"/../dist\";\nconst files = globby.sync(\"**/*\", {\n  cwd: testFolder,\n  nodir: true,\n  dot: true,\n});\n\nit(\"should have basic pages\", () => {\n  expect(files.includes(\"404.html\")).toBeTruthy();\n  expect(files.includes(\"index.html\")).toBeTruthy();\n  expect(\n    files.filter(f => f.startsWith(\"en/packages/\")).length > 10,\n  ).toBeTruthy();\n  expect(files.includes(\"en/blog/index.html\")).toBeTruthy();\n  expect(files.includes(\"en/showcase/index.html\")).toBeTruthy();\n  expect(files.includes(\"feed.xml\")).toBeTruthy();\n});\n\nit(\"should have some generated pages for pagination\", () => {\n  expect(\n    files.filter(f => f.startsWith(\"en/blog/after/\")).length,\n  ).toBeGreaterThan(0);\n  expect(\n    files.filter(f => f.startsWith(\"en/showcase/after/\")).length,\n  ).toBeGreaterThan(0);\n});\n\nit(\"should have some generated pages for metadata and pagination\", () => {\n  // random tag pages\n  expect(files.includes(\"en/showcase/tag/blog/index.html\")).toBeTruthy();\n  expect(\n    files.filter(f => f.startsWith(\"en/showcase/tag/blog/after/\")).length,\n  ).toBeGreaterThan(0);\n  expect(files.includes(\"en/showcase/tag/open-source/index.html\")).toBeTruthy();\n  expect(\n    files.filter(f => f.startsWith(\"en/showcase/tag/open-source/after/\"))\n      .length,\n  ).toBeGreaterThan(0);\n});\n\nit(\"should have api files\", () => {\n  expect(\n    files.filter(f => f.startsWith(\"phenomic\") && f.endsWith(\".json\")).length,\n  ).toBeGreaterThan(0);\n  expect(\n    files.includes(\n      \"phenomic/content/blog/by-default/1/desc/date/limit-12.json\",\n    ),\n  ).toBeTruthy();\n  expect(\n    files.includes(\n      \"phenomic/content/blog/by-default/1/desc/date/limit-12/after-MjAxNy0wNi0wMi1pbnRyb2R1Y2luZy0xLjAuMC1hbHBoYQ==.json\",\n    ),\n  ).toBeTruthy();\n  expect(\n    files.includes(\n      \"phenomic/content/blog/item/2017-06-02-introducing-1.0.0-alpha.json\",\n    ),\n  ).toBeTruthy();\n  expect(\n    files.filter(\n      f =>\n        f.startsWith(\"phenomic/content/showcase/entry/by-default\") &&\n        f.endsWith(\".json\"),\n    ).length,\n  ).toBeGreaterThan(0);\n  expect(\n    files.filter(\n      f =>\n        f.startsWith(\"phenomic/content/showcase/entry/by-showcaseTags\") &&\n        f.endsWith(\".json\"),\n    ).length,\n  ).toBeGreaterThan(0);\n});\n"
  },
  {
    "path": "website/components/ActivityIndicator.js",
    "content": "// @flow\n\nimport * as React from \"react\";\nimport TopBarProgressIndicator from \"react-topbar-progress-indicator\";\n\nTopBarProgressIndicator.config({\n  barThickness: 4,\n  barColors: {\n    \"0\": \"#fff\",\n    \"1.0\": \"#fff\",\n  },\n  shadowBlur: 5,\n});\n\nconst devicePixelRatio =\n  typeof window === \"undefined\" ? 1 : window.devicePixelRatio || 1;\n\nconst tupleToColor = (param, alpha) => `rgba(${param.join(\",\")}, ${alpha})`;\n\ntype Props = {|\n  size: number,\n  color: $ReadOnlyArray<number, number, number>,\n|};\n\nclass ActivityIndicator extends React.Component<Props> {\n  static defaultProps = {\n    size: 24.0,\n    color: [200, 200, 200],\n  };\n  componentDidMount() {\n    this.tick();\n  }\n  componentWillUnmount() {\n    cancelAnimationFrame(this.frame);\n  }\n  setCanvasRef = canvas => {\n    if (canvas) {\n      this.canvasContext = canvas.getContext(\"2d\");\n    }\n  };\n  draw() {\n    const context = this.canvasContext;\n    if (!context) {\n      return;\n    }\n    const actualSize = this.props.size * devicePixelRatio;\n    context.clearRect(0.0, 0.0, actualSize, actualSize);\n    context.translate(actualSize / 2.0, actualSize / 2.0);\n    context.rotate(0.172665);\n    context.translate(-(actualSize / 2.0), -(actualSize / 2.0));\n    const centeredArc = (...args) =>\n      context.arc(actualSize / 2.0, actualSize / 2.0, ...args);\n    context.beginPath();\n    centeredArc(actualSize * 0.5, Math.PI, 0.0, false, context);\n    centeredArc(actualSize * 0.3, 0.0, Math.PI, true, context);\n    context.fillStyle = tupleToColor(this.props.color, 1.0);\n    context.fill();\n    context.closePath();\n    context.beginPath();\n    centeredArc(actualSize * 0.5, 0.0, Math.PI, false, context);\n    centeredArc(actualSize * 0.3, Math.PI, 0.0, true, context);\n    const gradient = context.createLinearGradient(\n      0.0,\n      actualSize * 0.5,\n      actualSize * 0.75,\n      actualSize * 0.5,\n    );\n    gradient.addColorStop(0.5, tupleToColor(this.props.color, 1.0));\n    gradient.addColorStop(1.0, tupleToColor(this.props.color, 0.0));\n    context.fillStyle = gradient;\n    context.fill();\n  }\n  tick = () => {\n    this.draw();\n    this.frame = requestAnimationFrame(this.tick);\n  };\n  render() {\n    const actualSize = this.props.size * devicePixelRatio;\n    return (\n      <React.Fragment>\n        <TopBarProgressIndicator />\n        <canvas\n          width={actualSize}\n          height={actualSize}\n          style={{\n            width: this.props.size,\n            height: this.props.size,\n            alignSelf: \"center\",\n            margin: \"10px 0\",\n          }}\n          ref={this.setCanvasRef}\n        />\n      </React.Fragment>\n    );\n  }\n}\n\nexport default ActivityIndicator;\n"
  },
  {
    "path": "website/components/BackgroundGradient.web.js",
    "content": "// @flow\n\nimport * as React from \"react\";\nimport { StyleSheet, createElement } from \"react-native-web\";\n\ntype PropsType = {|\n  start: string,\n  end: string,\n  direction?: string,\n  style: any,\n  children?: React.Node,\n|};\nconst Div = props => createElement(\"div\", props);\n// eslint-disable-next-line react/no-multi-comp\nconst BackgroundGradient = (props: PropsType) => (\n  <Div\n    style={[\n      styles.container,\n      makeGradient(props.start, props.end, props.direction),\n      props.style,\n    ]}\n  >\n    {props.children}\n  </Div>\n);\n\nconst styles = StyleSheet.create({\n  container: {\n    position: \"relative\",\n    display: \"flex\",\n    flexDirection: \"column\",\n  },\n});\n\nconst makeGradient = (start, end, direction = \"to bottom right\") => ({\n  backgroundColor: start,\n  background: `linear-gradient(${direction}, ${start}, ${end})`,\n});\n\nexport default BackgroundGradient;\n"
  },
  {
    "path": "website/components/BlogItem.js",
    "content": "// @flow\n\nimport * as React from \"react\";\nimport { withPhenomicApi, query } from \"@phenomic/preset-react-app/lib/client\";\nimport { StyleSheet, Text } from \"react-native-web\";\n\nimport Flex from \"./Flex\";\nimport Spacer from \"./Spacer\";\nimport ActivityIndicator from \"./ActivityIndicator\";\nimport MarkdownGenerated from \"./MarkdownGenerated\";\nimport PageError from \"./PageError\";\nimport Header from \"./Header\";\nimport Footer from \"./Footer\";\nimport BodySmallContainer from \"./BodySmallContainer\";\n\nconst BlogItem = (props: Object) => {\n  if (props.hasError) {\n    return <PageError error={props.item.error} />;\n  }\n\n  return (\n    <Flex>\n      <Header title={props.item && props.item.node && props.item.node.title} />\n      <BodySmallContainer>\n        <Spacer large={true}>\n          {props.isLoading && <ActivityIndicator />}\n          {!props.isLoading && (\n            <React.Fragment>\n              <Text style={styles.date}>\n                {new Date(props.item.node.date).toLocaleDateString(\"en-US\", {\n                  year: \"numeric\",\n                  month: \"long\",\n                  day: \"numeric\",\n                })}\n              </Text>\n              <MarkdownGenerated\n                body={props.item.node.body}\n                filename={props.item.node.filename}\n              />\n            </React.Fragment>\n          )}\n        </Spacer>\n      </BodySmallContainer>\n      <Spacer large={true} />\n      <Footer />\n    </Flex>\n  );\n};\n\nconst styles = StyleSheet.create({\n  date: {\n    position: \"absolute\",\n    right: 0,\n    top: 0,\n    color: \"rgba(0, 0, 0, 0.25)\",\n    fontSize: 14,\n    textAlign: \"right\",\n  },\n});\n\nexport default withPhenomicApi(BlogItem, props => ({\n  item: query({\n    path: \"content/blog\",\n    id: props.params.splat,\n  }),\n}));\n"
  },
  {
    "path": "website/components/BlogList.js",
    "content": "// @flow\n\nimport * as React from \"react\";\nimport { View, StyleSheet } from \"react-native-web\";\nimport { withPhenomicApi, query } from \"@phenomic/preset-react-app/lib/client\";\n\nimport Link from \"./Link\";\nimport Flex from \"./Flex\";\nimport Spacer from \"./Spacer\";\nimport ActivityIndicator from \"./ActivityIndicator\";\nimport PageError from \"./PageError\";\nimport Header from \"./Header\";\nimport Footer from \"./Footer\";\nimport BodyContainer from \"./BodyContainer\";\nimport BlogListItem from \"./BlogListItem\";\n\nconst BlogList = (props: Object) => {\n  if (props.hasError) {\n    return <PageError error={props.list.error} />;\n  }\n\n  return (\n    <Flex>\n      <Header title={\"Blog\"} />\n      <BodyContainer style={styles.container}>\n        {props.isLoading && <ActivityIndicator />}\n        {!props.isLoading && (\n          <React.Fragment>\n            <View style={styles.list}>\n              {props.list.node.list.map(item => (\n                <BlogListItem key={item.id} item={item} />\n              ))}\n            </View>\n            <Spacer />\n            <View style={styles.paginationRow}>\n              <View style={styles.paginationColumn}>\n                {props.list.node &&\n                  props.list.node.next && (\n                    <Link\n                      style={styles.link}\n                      href={`/en/blog/after/${props.list.node.next}`}\n                    >\n                      {\"← Previous entries\"}\n                    </Link>\n                  )}\n              </View>\n              <View style={styles.paginationColumn}>\n                {props.list.node &&\n                  props.list.node.previous && (\n                    <Link\n                      style={styles.link}\n                      href={\n                        props.list.node.previousPageIsFirst\n                          ? `/en/blog`\n                          : `/en/blog/after/${props.list.node.previous}`\n                      }\n                    >\n                      {\"Recent entries →\"}\n                    </Link>\n                  )}\n              </View>\n            </View>\n          </React.Fragment>\n        )}\n      </BodyContainer>\n      <Spacer large={true} />\n      <Footer />\n    </Flex>\n  );\n};\n\nconst styles = StyleSheet.create({\n  container: {\n    paddingVertical: 20,\n  },\n  list: {\n    flexDirection: \"row\",\n    flexWrap: \"wrap\",\n    justifyContent: \"flex-start\",\n    alignItems: \"flex-start\",\n  },\n  paginationRow: {\n    flexDirection: \"row\",\n  },\n  paginationColumn: {\n    width: \"50%\",\n    padding: 10,\n    // alignItems: \"center\",\n    justifyContent: \"center\",\n  },\n});\n\nexport default withPhenomicApi(BlogList, props => ({\n  list: query({\n    path: \"content/blog\",\n    limit: 12,\n    after: props.params.after,\n  }),\n}));\n"
  },
  {
    "path": "website/components/BlogListItem.js",
    "content": "// @flow\n\nimport * as React from \"react\";\nimport { View, Text, StyleSheet } from \"react-native-web\";\n\nimport Link from \"./Link\";\n\nconst BlogListItem = props => (\n  <Link.Block\n    href={\"/en/blog/\" + props.item.id}\n    style={styles.link}\n    blockProps={{ style: styles.block }}\n  >\n    <View style={styles.wrapper}>\n      <View>\n        <Text style={styles.title}>{props.item.title}</Text>\n      </View>\n      <Text style={styles.date}>\n        {new Date(props.item.date).toLocaleDateString(\"en-US\", {\n          year: \"numeric\",\n          month: \"long\",\n          day: \"numeric\",\n        })}\n      </Text>\n      {props.item.author && (\n        <Text style={styles.author}>{\"By \" + props.item.author}</Text>\n      )}\n    </View>\n  </Link.Block>\n);\n\nconst styles = StyleSheet.create({\n  block: {\n    // flexBasis: 400,\n    minWidth: 250,\n    width: \"33%\",\n  },\n  wrapper: {\n    flexGrow: 1,\n    marginHorizontal: 10,\n    borderBottomWidth: StyleSheet.hairlineWidth,\n    borderBottomColor: \"rgba(0, 0, 0, 0.1)\",\n  },\n  link: {\n    flex: 1,\n    display: \"flex\",\n    flexDirection: \"column\",\n    textDecorationLine: \"none\",\n    color: \"inherit\",\n    paddingVertical: 20,\n    paddingHorizontal: 10,\n  },\n  title: {\n    fontWeight: \"700\",\n    fontSize: 22,\n    paddingBottom: 10,\n  },\n  date: {\n    color: \"rgba(0, 0, 0, 0.5)\",\n    fontSize: 14,\n  },\n  author: {\n    fontWeight: \"100\",\n    paddingVertical: 10,\n  },\n});\n\nexport default BlogListItem;\n"
  },
  {
    "path": "website/components/BodyContainer.js",
    "content": "// @flow\n\nimport * as React from \"react\";\nimport { StyleSheet, View } from \"react-native-web\";\n\nconst BodyContainer = (props: Object) => (\n  <View style={[props.style, styles.container]}>{props.children}</View>\n);\n\nconst styles = StyleSheet.create({\n  container: {\n    flexGrow: 1,\n    width: \"100%\",\n    maxWidth: 1260,\n    marginLeft: \"auto\",\n    marginRight: \"auto\",\n  },\n});\n\nexport default BodyContainer;\n"
  },
  {
    "path": "website/components/BodySmallContainer.js",
    "content": "// @flow\n\nimport * as React from \"react\";\nimport { StyleSheet, View } from \"react-native-web\";\n\nconst BodyContainer = (props: Object) => (\n  <View style={[props.style, styles.container]}>{props.children}</View>\n);\n\nconst styles = StyleSheet.create({\n  container: {\n    flexGrow: 1,\n    width: \"100%\",\n    maxWidth: 700,\n    marginLeft: \"auto\",\n    marginRight: \"auto\",\n  },\n});\n\nexport default BodyContainer;\n"
  },
  {
    "path": "website/components/Browser.js",
    "content": "// @flow\n\nimport * as React from \"react\";\nimport { StyleSheet, View } from \"react-native-web\";\n\nconst Browser = (props: Object) => (\n  <View style={[props.style, styles.editor]}>\n    <View style={styles.header}>\n      <View style={[styles.bullet, { backgroundColor: \"#FC4948\" }]} />\n      <View style={[styles.bullet, { backgroundColor: \"#FDB424\" }]} />\n      <View style={[styles.bullet, { backgroundColor: \"#29C231\" }]} />\n    </View>\n    <View style={styles.content}>\n      <View style={styles.contentContainer}>{props.children}</View>\n    </View>\n  </View>\n);\n\nconst radius = 4;\nconst padding = 8;\nconst bulletSize = 8;\nconst styles = StyleSheet.create({\n  editor: {\n    flexGrow: 1,\n  },\n  header: {\n    flexDirection: \"row\",\n    // fontSize: 12,\n    borderTopLeftRadius: radius,\n    borderTopRightRadius: radius,\n    padding: padding,\n    backgroundColor: \"#12171C\",\n  },\n  bullet: {\n    width: bulletSize,\n    height: bulletSize,\n    borderRadius: bulletSize,\n    marginRight: bulletSize / 2,\n  },\n  content: {\n    flexGrow: 1,\n    borderBottomLeftRadius: radius,\n    borderBottomRightRadius: radius,\n    padding: 6,\n    paddingTop: 0,\n    backgroundColor: \"#171D23\",\n  },\n  contentContainer: {\n    flexGrow: 1,\n    backgroundColor: \"#fff\",\n  },\n});\n\nexport default Browser;\n"
  },
  {
    "path": "website/components/DocSearch.js",
    "content": "// @flow\n\nimport React, { Component } from \"react\";\nimport { StyleSheet, TextInput } from \"react-native-web\";\nimport Helmet from \"react-helmet\";\n// eslint-disable-next-line\nimport PropTypes from \"prop-types\";\n\nimport IconMagnifier from \"../svgs/IconMagnifier\";\n\nimport Spacer from \"./Spacer\";\n\nclass DocSearch extends Component {\n  componentDidMount() {\n    const d = document.createElement(\"script\");\n    d.async = true;\n    d.src =\n      \"https://cdn.jsdelivr.net/npm/docsearch.js@2/dist/cdn/docsearch.min.js\";\n    d.onload = () => {\n      window.docsearch({\n        // for styling\n        debug: true,\n        apiKey: \"0bf74c99bb453ef31b325b4449823529\",\n        indexName: \"phenomic\",\n        inputSelector: \"#algolia-docsearch\",\n        openOnFocus: true,\n        handleSelected: (input, event, suggestion) => {\n          // rr4 || rr3\n          (this.context.router.history || this.context.router).push(\n            suggestion.url.replace(\"https://phenomic.io\", \"\"),\n          );\n        },\n      });\n    };\n    document.getElementsByTagName(\"body\")[0].appendChild(d);\n  }\n\n  shouldComponentUpdate() {\n    return false;\n  }\n\n  render() {\n    return (\n      <Spacer style={styles.container}>\n        <Helmet\n          link={[\n            {\n              rel: \"stylesheet\",\n              href:\n                \"https://cdn.jsdelivr.net/npm/docsearch.js@2/dist/cdn/docsearch.min.css\",\n            },\n          ]}\n        />\n        <IconMagnifier width=\"20\" height=\"20\" fill=\"#fff\" />\n        <style>{`\n          .algolia-autocomplete { width: 100% }\n        `}</style>\n        <TextInput\n          id=\"algolia-docsearch\"\n          placeholder=\"Search\"\n          placeholderTextColor=\"#fff\"\n          style={styles.textInput}\n        />\n      </Spacer>\n    );\n  }\n}\n\nDocSearch.contextTypes = {\n  router: PropTypes.object.isRequired,\n};\n\nconst styles = StyleSheet.create({\n  container: {\n    flex: 1,\n    flexDirection: \"row\",\n    alignItems: \"center\",\n    borderWidth: StyleSheet.hairlineWidth,\n    borderColor: \"rgba(255,255,255,0.2)\",\n    backgroundColor: \"rgba(255,255,255,0.1)\",\n    borderRadius: 3,\n    paddingHorizontal: Spacer.small,\n    paddingVertical: Spacer.small / 2,\n  },\n  textInput: {\n    width: \"100%\",\n    color: \"#fff\",\n    paddingVertical: Spacer.small / 2,\n    paddingHorizontal: Spacer.small / 2,\n    marginHorizontal: Spacer.small / 2,\n  },\n});\n\nexport default DocSearch;\n"
  },
  {
    "path": "website/components/Editor.js",
    "content": "// @flow\n\nimport * as React from \"react\";\nimport { StyleSheet, View, Text } from \"react-native-web\";\n\nconst Editor = (props: Object) => (\n  <View style={styles.editor}>\n    <View style={styles.header}>\n      <Text style={styles.headerText}>{props.header}</Text>\n    </View>\n    <View style={styles.content}>\n      <pre style={rawStyles.contentPre}>{props.children}</pre>\n    </View>\n  </View>\n);\n\nconst radius = 4;\nconst padding = 14;\nconst styles = StyleSheet.create({\n  editor: {\n    flexGrow: 1,\n  },\n  header: {\n    borderTopLeftRadius: radius,\n    borderTopRightRadius: radius,\n    padding: padding,\n    backgroundColor: \"#12171C\",\n    borderBottomWidth: 1,\n    borderBottomColor: \"#0E1216\",\n  },\n  headerText: {\n    fontSize: 14,\n    color: \"rgba(203, 211, 219, 0.65)\",\n  },\n  content: {\n    flexGrow: 1,\n    borderBottomLeftRadius: radius,\n    borderBottomRightRadius: radius,\n    padding,\n    backgroundColor: \"#171D23\",\n  },\n});\n\nconst rawStyles = {\n  contentPre: {\n    fontSize: 18,\n    lineHeight: 1.5,\n    margin: 0,\n    color: \"#CDE4FF\",\n  },\n};\n\nexport default Editor;\n"
  },
  {
    "path": "website/components/Flex.js",
    "content": "// @flow\n\nimport * as React from \"react\";\nimport { StyleSheet, View } from \"react-native-web\";\n\nconst Flex = (props: Object) => (\n  <View style={[styles.flex, props.style]}>{props.children}</View>\n);\n\nconst styles = StyleSheet.create({\n  flex: {\n    flexGrow: 1,\n  },\n});\n\nexport default Flex;\n"
  },
  {
    "path": "website/components/Footer.js",
    "content": "// @flow\n\nimport * as React from \"react\";\nimport { StyleSheet } from \"react-native-web\";\n\nimport BodyContainer from \"./BodyContainer\";\nimport BackgroundGradient from \"./BackgroundGradient\";\nimport FooterNavBar from \"./FooterNavBar\";\n\nconst Footer = (props: Object) => (\n  <BackgroundGradient style={props.style} start=\"#2A2A2A\" end=\"#121212\">\n    <BodyContainer style={styles.hero}>\n      <FooterNavBar />\n    </BodyContainer>\n  </BackgroundGradient>\n);\n\nconst styles = StyleSheet.create({\n  hero: {\n    paddingTop: 40,\n    paddingBottom: 60,\n  },\n});\n\nexport default Footer;\n"
  },
  {
    "path": "website/components/FooterNavBar.js",
    "content": "// @flow\n\nimport * as React from \"react\";\nimport { View, Text, StyleSheet } from \"react-native-web\";\n\nimport Link from \"./Link\";\nimport PhenomicLogo from \"./PhenomicLogo\";\n\nconst FooterNavBar = () => (\n  <View style={styles.container}>\n    <View style={styles.col}>\n      <PhenomicLogo />\n    </View>\n    <View style={styles.col}>\n      <Link.Touchable\n        href=\"/en/packages/core/docs/\"\n        style={styles.link}\n        activeStyle={styles.linkActive}\n      >\n        <Text style={styles.linkText}>{\"Docs\"}</Text>\n      </Link.Touchable>\n      <Link.Touchable\n        href=\"/en/tutorials/\"\n        style={styles.link}\n        activeStyle={styles.linkActive}\n      >\n        <Text style={styles.linkText}>{\"Tutorials\"}</Text>\n      </Link.Touchable>\n      <Link.Touchable\n        href=\"/en/plugins/\"\n        style={styles.link}\n        activeStyle={styles.linkActive}\n      >\n        <Text style={styles.linkText}>{\"Plugins\"}</Text>\n      </Link.Touchable>\n      <Link.Touchable\n        href=\"/en/blog/\"\n        style={styles.link}\n        activeStyle={styles.linkActive}\n      >\n        <Text style={styles.linkText}>{\"Blog\"}</Text>\n      </Link.Touchable>\n      <Link.Touchable\n        href=\"/en/showcase/\"\n        style={styles.link}\n        activeStyle={styles.linkActive}\n      >\n        <Text style={[styles.linkText]}>{\"Showcase\"}</Text>\n      </Link.Touchable>\n    </View>\n    <View style={styles.col}>\n      <Link.Touchable\n        href=\"https://github.com/phenomic/phenomic\"\n        style={styles.link}\n      >\n        <Text style={styles.linkText}>{\"GitHub\"}</Text>\n      </Link.Touchable>\n      <Link.Touchable\n        href=\"https://twitter.com/Phenomic_app\"\n        style={styles.link}\n      >\n        <Text style={styles.linkText}>{\"Twitter\"}</Text>\n      </Link.Touchable>\n      <Link.Touchable href=\"https://spectrum.chat/phenomic\" style={styles.link}>\n        <Text style={styles.linkText}>{\"Spectrum\"}</Text>\n      </Link.Touchable>\n      <Link.Touchable\n        href=\"https://gitter.im/MoOx/phenomic\"\n        style={styles.link}\n      >\n        <Text style={styles.linkText}>{\"Gitter\"}</Text>\n      </Link.Touchable>\n    </View>\n  </View>\n);\n\nconst styles = StyleSheet.create({\n  container: {\n    flexDirection: \"row\",\n    flexWrap: \"wrap\",\n    paddingLeft: 20,\n    paddingRight: 20,\n  },\n  col: {\n    flex: 1,\n    alignItems: \"flex-start\",\n  },\n  link: {\n    textDecorationLine: \"none\",\n    padding: 10,\n  },\n  linkActive: {\n    backgroundColor: \"rgba(255,255,255, 0.1)\",\n  },\n  linkText: {\n    color: \"#fff\",\n  },\n});\n\nexport default FooterNavBar;\n"
  },
  {
    "path": "website/components/Header.js",
    "content": "// @flow\n\nimport * as React from \"react\";\nimport { View, Text, StyleSheet, createElement } from \"react-native-web\";\nimport Head from \"react-helmet\";\n\nimport Spacer from \"./Spacer\";\nimport BodyContainer from \"./BodyContainer\";\nimport BackgroundGradient from \"./BackgroundGradient\";\nimport HeaderNavBar from \"./HeaderNavBar\";\n\n/* eslint-disable react/no-multi-comp */\n\nconst Heading = p => createElement(\"h1\", p);\n\nconst Header = (props: Object) => (\n  <BackgroundGradient\n    style={[styles.container, props.style]}\n    start=\"#006BF6\"\n    end=\"#10E951\"\n    direction=\"135deg\"\n  >\n    <HeaderNavBar />\n    <BodyContainer style={styles.hero}>\n      <Head>\n        <title>{props.headTitle || props.title}</title>\n      </Head>\n      {/* @todo h1 or shit */}\n      <Spacer large={true}>\n        <Heading style={styles.heroText}>{props.title}</Heading>\n        <Text style={styles.heroSubText}>{props.subtitle}</Text>\n      </Spacer>\n      {props.children && <View style={styles.children}>{props.children}</View>}\n    </BodyContainer>\n  </BackgroundGradient>\n);\n\nconst styles = StyleSheet.create({\n  container: {\n    zIndex: 1 /* for DocSearch component autocomplete results */,\n  },\n  hero: {\n    paddingTop: 40,\n    paddingBottom: 60,\n  },\n  heroText: {\n    color: \"#fff\",\n    fontSize: 48,\n    fontWeight: \"200\",\n    textAlign: \"center\",\n    margin: 0,\n    padding: 0,\n  },\n  heroSubText: {\n    color: \"#fff\",\n    opacity: 0.6,\n    fontSize: 20,\n    fontWeight: \"300\",\n    textAlign: \"center\",\n  },\n  children: {},\n});\n\nexport default Header;\n"
  },
  {
    "path": "website/components/HeaderNavBar.js",
    "content": "// @flow\n\nimport * as React from \"react\";\nimport { View, Text, StyleSheet } from \"react-native-web\";\n\nimport IconWrench from \"../svgs/IconWrench\";\nimport IconTools from \"../svgs/IconTools\";\nimport Github from \"../svgs/Github\";\nimport Twitter from \"../svgs/Twitter\";\nimport Spectrum from \"../svgs/Spectrum\";\nimport Gitter from \"../svgs/Gitter\";\n\nimport PhenomicLogo from \"./PhenomicLogo\";\nimport DocSearch from \"./DocSearch\";\nimport Link from \"./Link\";\nimport Spacer from \"./Spacer\";\n\nconst HeaderNavBar = () => (\n  <React.Fragment>\n    <View style={[styles.rowFlex, styles.wip]}>\n      <Spacer small={true}>\n        <Text style={styles.wipText}>\n          <IconWrench height=\"16\" fill=\"#041d0f\" style={{ margin: \"0 10px\" }} />\n          {\" This website is a work in progress. \"}\n          <IconTools height=\"16\" fill=\"#041d0f\" style={{ margin: \"0 10px\" }} />\n        </Text>\n      </Spacer>\n    </View>\n    <View style={[styles.rowFlex, styles.header]}>\n      <View style={[styles.rowFlex, styles.left]}>\n        <PhenomicLogo />\n        <Spacer small={true} style={[styles.rowFlex, styles.menu]}>\n          <Link.Touchable\n            href=\"/en/packages/core/docs/\"\n            style={styles.link}\n            activeStyle={styles.linkActive}\n          >\n            <Text style={styles.linkText}>{\"Docs\"}</Text>\n          </Link.Touchable>\n          <Link.Touchable\n            href=\"/en/tutorials/\"\n            style={styles.link}\n            activeStyle={styles.linkActive}\n          >\n            <Text style={styles.linkText}>{\"Tutorials\"}</Text>\n          </Link.Touchable>\n          <Link.Touchable\n            href=\"/en/plugins/\"\n            style={styles.link}\n            activeStyle={styles.linkActive}\n          >\n            <Text style={styles.linkText}>{\"Plugins\"}</Text>\n          </Link.Touchable>\n          <Link.Touchable\n            href=\"/en/blog/\"\n            style={styles.link}\n            activeStyle={styles.linkActive}\n          >\n            <Text style={styles.linkText}>{\"Blog\"}</Text>\n          </Link.Touchable>\n        </Spacer>\n      </View>\n      <View style={[styles.rowFlex, styles.right]}>\n        <Spacer small={true} style={[styles.row, styles.search]}>\n          <DocSearch />\n        </Spacer>\n        <Spacer small={true} style={[styles.rowFlex, styles.social]}>\n          <Link.Touchable\n            href=\"https://github.com/phenomic/phenomic\"\n            style={[styles.link, styles.linkIcon]}\n            title={\"GitHub\"}\n          >\n            <Github height={iconSize} fill=\"#fff\" />\n            <Text style={styles.linkIconText}>{\"GitHub\"}</Text>\n          </Link.Touchable>\n          <Link.Touchable\n            href=\"https://twitter.com/Phenomic_app\"\n            style={[styles.link, styles.linkIcon]}\n            title={\"Twitter\"}\n          >\n            <Twitter height={iconSize} fill=\"#fff\" />\n            <Text style={styles.linkIconText}>{\"Twitter\"}</Text>\n          </Link.Touchable>\n          <Link.Touchable\n            href=\"https://spectrum.chat/phenomic\"\n            style={[styles.link, styles.linkIcon]}\n            title={\"Community\"}\n          >\n            <Spectrum height={iconSize} fill=\"#fff\" />\n            <Text style={styles.linkIconText}>{\"Spectrum\"}</Text>\n          </Link.Touchable>\n          <Link.Touchable\n            href=\"https://gitter.im/MoOx/phenomic\"\n            style={[styles.link, styles.linkIcon]}\n            title={\"Chat\"}\n          >\n            <Gitter height={iconSize} fill=\"#fff\" />\n            <Text style={styles.linkIconText}>{\"Gitter\"}</Text>\n          </Link.Touchable>\n        </Spacer>\n      </View>\n    </View>\n  </React.Fragment>\n);\n\nconst iconSize = 24;\nconst styles = StyleSheet.create({\n  rowFlex: {\n    // flexShrink: 1,\n    flexDirection: \"row\",\n    flexWrap: \"wrap\",\n    alignItems: \"center\",\n  },\n  row: {\n    flexDirection: \"row\",\n  },\n  wip: {\n    justifyContent: \"space-between\",\n    alignItems: \"center\",\n    backgroundColor: \"#fff\",\n  },\n  wipText: {\n    display: \"flex\",\n    flexDirection: \"row\",\n    alignItems: \"center\",\n    alignSelf: \"center\",\n    color: \"#041d0f\",\n    fontWeight: \"100\",\n  },\n  header: {\n    zIndex: 1 /* for DocSearch component autocomplete results */,\n    flexWrap: \"wrap\",\n    justifyContent: \"space-between\",\n    alignItems: \"flex-start\",\n    backgroundColor: \"rgba(0,0,0,0.25)\",\n  },\n  left: {\n    flex: 1,\n    // minWidth: 500,\n    flexBasis: 500,\n  },\n  right: {\n    flex: 1,\n    // minWidth: 350,\n    flexBasis: 350,\n    justifyContent: \"flex-end\",\n  },\n  menu: {\n    flexGrow: 1,\n    justifyContent: \"flex-end\",\n  },\n  search: {\n    flex: 1,\n  },\n  social: {\n    flexGrow: 1,\n    // flex: 1,\n    flexShrink: 0,\n    justifyContent: \"flex-end\",\n  },\n  link: {\n    textDecorationLine: \"none\",\n    paddingVertical: Spacer.small,\n    paddingHorizontal: Spacer.small,\n  },\n  linkIcon: {\n    display: \"flex\",\n    flexDirection: \"column\",\n    paddingVertical: 8,\n  },\n  linkActive: {\n    backgroundColor: \"rgba(0, 0, 0, 0.1)\",\n  },\n  linkText: {\n    color: \"#fff\",\n    fontSize: 18,\n    fontWeight: \"300\",\n  },\n  linkIconText: {\n    color: \"#fff\",\n    paddingTop: 2,\n    fontSize: 8,\n    fontWeight: \"200\",\n  },\n});\n\nexport default HeaderNavBar;\n"
  },
  {
    "path": "website/components/Home.js",
    "content": "// @flow\n\nimport * as React from \"react\";\nimport Head from \"react-helmet\";\nimport { StyleSheet, Text, View } from \"react-native-web\";\nimport { withPhenomicApi } from \"@phenomic/preset-react-app/lib/client\";\n\nimport PhenomicLogoWhite from \"../svgs/PhenomicLogoWhite\";\nimport PhenomicText from \"../svgs/PhenomicText\";\n\nimport BackgroundGradient from \"./BackgroundGradient\";\nimport HeaderNavBar from \"./HeaderNavBar\";\nimport Footer from \"./Footer\";\nimport Flex from \"./Flex\";\nimport Spacer from \"./Spacer\";\nimport BodyContainer from \"./BodyContainer\";\n\nconst Home = () => (\n  <Flex style={{ overflow: \"hidden\" }}>\n    <View style={styles.heroContainer}>\n      <BackgroundGradient\n        style={styles.heroGradient}\n        start=\"#006BF6\"\n        end=\"#10E951\"\n        direction=\"135deg\"\n      >\n        {/* <ImageBackground\n        style={styles.heroGradient}\n        source={{ uri: \"/bg/jack-cain-326608-unsplash-.jpg\" }}\n      > */}\n        {global.window && (\n          <PhenomicLogoWhite\n            height={Math.max(window.innerWidth, window.innerHeight) * 0.75}\n            style={{\n              opacity: 0.06,\n              position: \"absolute\",\n              top: window.innerHeight * 0.2,\n              right: window.innerWidth * 0.1,\n              transform: [{ rotate: \"20deg\" }],\n            }}\n          />\n        )}\n      </BackgroundGradient>\n      {/* </ImageBackground> */}\n      <Head>\n        <title>\n          {\"Phenomic, a modular website compiler (static site generator)\"}\n        </title>\n      </Head>\n      <HeaderNavBar />\n      <BodyContainer style={styles.hero}>\n        {/* @todo h1 or shit */}\n        <View style={styles.row}>\n          <Spacer large={true}>\n            <PhenomicText style={{ maxHeight: \"72px\" }} />\n          </Spacer>\n        </View>\n        <Text style={styles.heroSubtitleText}>\n          {\"Meet the modular website compiler\"}\n        </Text>\n      </BodyContainer>\n    </View>\n    <BodyContainer style={styles.gettingStarted}>\n      <Text />\n      <Spacer large={true} style={styles.block}>\n        <Text style={styles.blockTitle}>\n          {\"A static site generator like no other\"}\n        </Text>\n        <Text style={styles.blockText}>\n          {`Phenomic is a modular website compiler that helps you to build static websites, with a modern approach: you will make your website the same way you build an app.`}\n        </Text>\n      </Spacer>\n      <Spacer large={true} style={styles.block}>\n        <Text style={styles.blockTitle}>\n          {\"A website built with things you like\"}\n        </Text>\n        <Text style={styles.blockText}>\n          {`Phenomic is different from other SSG by allowing you to pick the technologies, libraries, frameworks of your choice and build your website with it. You can decide the renderer you want to use (like React), your bundler (like Webpack) and so on. If the solution you are looking for is not implemented yet, Phenomic accepts plugins so you can bring your own flavor!.`}\n          {/* <Text style={styles.button>{\"Choose your flavor\"}</Text> */}\n        </Text>\n      </Spacer>\n      <Spacer large={true} style={styles.block}>\n        <Text style={styles.blockTitle}>\n          {\"A static website, 100% SEO friendly\"}\n        </Text>\n        <Text style={styles.blockText}>\n          {`When development is done, Phenomic will help you to produce for you static files that you can deploy on any static hosting (HTML, CSS and JavaScript files). The result will be an SEO friendly website (all pages built and can be served as HTML files) and optimised for fast browsing (after the first HTML page, JavaScript files will handle client side navigation and only download what is necessary without full pages reload).`}\n          {/* <Text style={styles.button>{\"Tell me more about SEO\"}</Text> */}\n        </Text>\n      </Spacer>\n      <Spacer large={true} style={styles.block}>\n        <Text style={styles.blockTitle}>\n          {\"A website with lightning fast UX\"}\n        </Text>\n        <Text style={styles.blockText}>\n          {`This way you offer the best user experience by immediately serving pre-generated HTML for first visits (or all pages, for search engine bots and browsers that don't interpret JavaScript) and then using the power of JavaScript to avoid full page reloads by only downloading small chunks of data for each page & interaction.`}\n          {/* <Text style={styles.button>{\"Get started\"}</Text> */}\n        </Text>\n      </Spacer>\n      <Spacer large={true} style={styles.block}>\n        <Text style={styles.blockTitle}>{\"Phenomic ♥️ JAMStack\"}</Text>\n        <Text style={styles.blockText}>\n          {`Phenomic completely embraces the JAMStack way of building websites and apps that delivers better performance, higher security, lower cost of scaling, and a better developer experience.`}\n          {/* <Text style={styles.button>{\"More about deployment\"}</Text> */}\n        </Text>\n      </Spacer>\n    </BodyContainer>\n    <Spacer large={true} />\n    <Footer />\n  </Flex>\n);\n\nconst styles = StyleSheet.create({\n  heroContainer: {\n    zIndex: 1 /* for DocSearch component autocomplete results */,\n    marginBottom: Spacer.large * 3,\n  },\n  heroGradient: {\n    ...StyleSheet.absoluteFillObject,\n    overflow: \"hidden\",\n    top: -100,\n    zIndex: 0,\n    minWidth: \"120vh\",\n    maxWidth: \"120%\",\n    transform: [{ rotate: \"-5deg\" }, { scale: 1.2 }],\n  },\n  hero: {\n    paddingTop: Spacer.large,\n  },\n  heroSubtitleText: {\n    fontSize: 22,\n    fontWeight: \"300\",\n    paddingVertical: 20,\n    color: \"#fff\",\n    textAlign: \"center\",\n    opacity: 0.6,\n  },\n  row: {\n    flexDirection: \"row\",\n    flexWrap: \"wrap\",\n    justifyContent: \"center\",\n  },\n  block: {},\n  blockTitle: {\n    fontSize: 48,\n    color: \"#4A90E2\",\n    fontWeight: \"200\",\n  },\n  blockText: {\n    paddingVertical: Spacer.large,\n    fontSize: 22,\n    lineHeight: 33,\n    fontWeight: \"300\",\n  },\n});\n\nexport default withPhenomicApi(Home);\n"
  },
  {
    "path": "website/components/HomeCodeExample.js",
    "content": "// @flow\n\nimport * as React from \"react\";\nimport { StyleSheet, View, Text } from \"react-native-web\";\n\nimport Editor from \"./Editor\";\nimport Spacer from \"./Spacer\";\n\nconst CodeExample = () => (\n  <View style={{ flexGrow: 1, flexShrink: 1 }}>\n    <View style={styles.row}>\n      <Spacer style={styles.item}>\n        <View style={styles.itemHeader}>\n          <View style={styles.number}>\n            <Text style={styles.numberText}>{\"1\"}</Text>\n          </View>\n          <View style={styles.itemLabel}>\n            <Text style={styles.itemTitle}>{\"Get your content\"}</Text>\n            <Text style={styles.itemSubTitle}>\n              {\"Markdown, JSON... From fs, REST, GraphQL APIs...\"}\n            </Text>\n          </View>\n        </View>\n        <Editor header={\"content/index.md\"}>{`---\ndate: 2017-05-23\ntitle: Helloworld!\n---\n\n## Welcome!\n\nThis is an article`}</Editor>\n      </Spacer>\n      <Spacer style={styles.item}>\n        <View style={styles.itemHeader}>\n          <View style={styles.number}>\n            <Text style={styles.numberText}>{\"2\"}</Text>\n          </View>\n          <View style={styles.itemLabel}>\n            <Text style={styles.itemTitle}>{\"Write your templates\"}</Text>\n            <Text style={styles.itemSubTitle}>\n              {\"Choose your renderer (React, Vue, Handlebars...)\"}\n            </Text>\n          </View>\n        </View>\n        <Editor header={\"src/Article.js\"}>{`const Article = props =>\n<div>\n  <h2>\n    {props.title}\n  </h2>\n  <BodyRenderer\n    body={props.body}\n  />\n</div>`}</Editor>\n      </Spacer>\n      <Spacer style={styles.item}>\n        <View style={styles.itemHeader}>\n          <View style={styles.number}>\n            <Text style={styles.numberText}>{\"3\"}</Text>\n          </View>\n          <View style={styles.itemLabel}>\n            <Text style={styles.itemTitle}>{\"Compile your website\"}</Text>\n            <Text style={styles.itemSubTitle}>\n              {\"Deploy it on any static hosting service\"}\n            </Text>\n          </View>\n        </View>\n        <Editor header={\"$ ~\"}>{`$ phenomic build\n✔ Collecting content\n✔ Building server app\n✔ Generating files\n✔ Building client app\nDone!\n$ # Deploy`}</Editor>\n      </Spacer>\n    </View>\n  </View>\n);\n\nconst styles = StyleSheet.create({\n  row: {\n    flex: 1,\n    flexDirection: \"row\",\n    flexWrap: \"wrap\",\n  },\n  item: {\n    flexGrow: 1,\n    flexShrink: 1,\n    minWidth: 250,\n  },\n  itemHeader: {\n    flexDirection: \"row\",\n    paddingBottom: 10,\n  },\n  number: {\n    backgroundColor: \"#7a8ca3\",\n    borderRadius: \"50%\",\n    width: 40,\n    height: 40,\n  },\n  numberText: {\n    color: \"#fff\",\n    fontSize: 20,\n    lineHeight: 40,\n    fontWeight: \"900\",\n    textAlign: \"center\",\n  },\n  itemLabel: {\n    flexShrink: 1,\n    paddingLeft: 10,\n  },\n  itemTitle: {\n    fontSize: 22,\n    color: \"#7a8ca3\",\n  },\n  itemSubTitle: {\n    fontWeight: \"200\",\n    color: \"#6f84a1\",\n  },\n});\n\nexport default CodeExample;\n"
  },
  {
    "path": "website/components/Link.web.js",
    "content": "// @flow\n\nimport * as React from \"react\";\nimport { StyleSheet, View, Text } from \"react-native-web\";\n// eslint-disable-next-line\nimport PropTypes from \"prop-types\";\n\n// eslint-disable-next-line\nimport {\n  isActive,\n  handleEvent,\n} from \"@phenomic/plugin-renderer-react/lib/components/Link.js\";\n\nimport Stylable from \"./react-stylable\";\n\nconst BASENAME = process.env.PHENOMIC_APP_BASENAME || \"/\";\n\ntype PropsType = {|\n  style?: any,\n  activeStyle?: any,\n  href: string,\n|};\n\nconst Link = (\n  { style, activeStyle, href, ...props }: PropsType,\n  context: Object,\n) => {\n  return (\n    <Text\n      {...props}\n      accessibilityRole=\"link\"\n      style={[style, isActive(href, context) && activeStyle]}\n      href={\n        href.indexOf(\"://\") > -1\n          ? href\n          : href.charAt(0) === \"/\"\n            ? BASENAME + href.slice(1)\n            : href\n      }\n      onPress={handleEvent(props, context.router)}\n    />\n  );\n};\n\nLink.contextTypes = {\n  router: PropTypes.object.isRequired,\n};\n\n// @todo using TouchableOpacity make the external links unusable with keyboard\n// https://github.com/necolas/react-native-web/issues/643\n\n/* eslint-disable */\nLink.Block = ({ blockProps = {}, ...props }: PropsType) => (\n  <View style={[blockProps.style, { flexGrow: 1 }]}>\n    <Stylable\n      accessible={false}\n      style={[styles.touchable, props.style, { display: \"flex\" }]}\n      hoveredOrFocusedStyle={styles.hoveredOrFocused}\n      touchedStyle={styles.touchabled}\n    >\n      <Link {...props} />\n    </Stylable>\n  </View>\n);\n\nLink.Touchable = (props: PropsType) => (\n  <Stylable\n    accessible={false}\n    style={[styles.touchable, props.style]}\n    hoveredOrFocusedStyle={styles.hoveredOrFocused}\n    touchedStyle={styles.touchabled}\n  >\n    <Link {...props} />\n  </Stylable>\n);\n/* eslint-enable */\n\nexport default Link;\n\nconst styles = StyleSheet.create({\n  touchable: {\n    transitionDuration: \"0.1s\",\n    transitionProperty: \"opacity\",\n  },\n  hoveredOrFocused: {\n    opacity: 0.8,\n  },\n  touchabled: {\n    opacity: 0.6,\n  },\n});\n"
  },
  {
    "path": "website/components/MarkdownGenerated.js",
    "content": "// @flow\n\nimport * as React from \"react\";\nimport { BodyRenderer } from \"@phenomic/preset-react-app/lib/client\";\n\nimport MarkdownHeading from \"./MarkdownHeading\";\n\ntype Node =\n  | string\n  | {|\n      t?: string,\n      p?: Object,\n      c?: Node | $ReadOnlyArray<Node>,\n    |};\n\nconst forEachHref = (node?: Node, callback: string => string) => {\n  if (!node) return;\n  if (typeof node !== \"object\") return node;\n  const newNode = {\n    ...node,\n  };\n  if (node.p && node.p.href) {\n    // $FlowFixMe stfu\n    newNode.p = {\n      ...node.p,\n      href: callback(node.p.href),\n    };\n  }\n  if (Array.isArray(node.c))\n    // $FlowFixMe stfu\n    newNode.c = node.c.map((child: Node) => forEachHref(child, callback));\n  else if (node.c)\n    // $FlowFixMe stfu\n    newNode.c = forEachHref(node.c, callback);\n  return newNode;\n};\n\nconst removeExtFromHref = (ext: string = \"md|json\") => (href: string) =>\n  href.replace(new RegExp(`(\\\\.${ext})(#.*)?$`), \"/$2\");\n\nconst cleanIndexAndReadme = (href: string) =>\n  href.replace(/\\/(index|README)(#.*)?\\/?$/, \"/$2\");\n\nconst replaceOriginalHostnameWithLocal = (href: string) =>\n  href.replace(\n    process.env.PHENOMIC_APP_BASEURL, // replace production http://realdomain/\n    process.env.PHENOMIC_APP_BASENAME, // by / so hardcoded link works locally\n  );\n\nconst cleanAllHref = (node?: Node, filenameSource: string) => {\n  return forEachHref(node, href => {\n    // prefix is to adjust local (relative) links that are links from docs\n    // that will work on github, but won't here\n    // eg: a.md links to './b.md'. Since a.md is a/, .b.md needs to become ../b/\n    // (note that the .md cleanup is done)\n    const prefix =\n      !href.startsWith(\"/\") &&\n      !href.startsWith(\"#\") &&\n      !href.startsWith(\"http://\") &&\n      !href.startsWith(\"https://\") &&\n      !(filenameSource === \"index.md\" || filenameSource === \"README.md\")\n        ? \"../\"\n        : \"\";\n    const h = replaceOriginalHostnameWithLocal(\n      cleanIndexAndReadme(removeExtFromHref()(href)),\n    );\n    return prefix + h;\n  });\n};\n\nconst MarkdownGenerated = (props: {| body: Node, filename: string |}) => (\n  <div className=\"phenomic-Markdown\">\n    {props.body && (\n      <BodyRenderer\n        components={{\n          h1: MarkdownHeading.H1,\n          h2: MarkdownHeading.H2,\n          h3: MarkdownHeading.H3,\n          h4: MarkdownHeading.H4,\n          h5: MarkdownHeading.H5,\n          h6: MarkdownHeading.H6,\n        }}\n      >\n        {cleanAllHref(props.body, props.filename)}\n      </BodyRenderer>\n    )}\n  </div>\n);\n\nexport default MarkdownGenerated;\n"
  },
  {
    "path": "website/components/MarkdownHeading.js",
    "content": "// @flow\n\nimport * as React from \"react\";\nimport { StyleSheet, createElement } from \"react-native-web\";\n\nimport IconLink from \"../svgs/IconLink\";\n\nimport Link from \"./Link\";\nimport Hoverable from \"./react-stylable/hoverable\";\nimport Focusable from \"./react-stylable/focusable\";\n\n/* eslint-disable react/no-multi-comp */\n\nconst RNIconLink = p => createElement(IconLink, p);\n\nconst MarkdownHeading = (level: number) => {\n  const Header = p => createElement(\"h\" + level, p);\n  return Hoverable(\n    Focusable(({ hovered, focused, ...props }: Object) => {\n      return (\n        <Header {...props}>\n          <Link\n            href={\"#\" + props.id}\n            style={[styles.link, (hovered || focused) && styles.linkVisible]}\n          >\n            <RNIconLink style={styles.icon} />\n          </Link>\n          {props.children.slice(1)}\n        </Header>\n      );\n    }),\n  );\n};\n\nconst anchorSize = 22;\nconst anchorPadding = 6;\nconst styles = StyleSheet.create({\n  link: {\n    display: \"flex\",\n    alignItems: \"center\",\n    position: \"absolute\",\n    top: 0,\n    bottom: 0,\n    left: -anchorSize - anchorPadding,\n    transitionDuration: \"0.2s\",\n    opacity: 0,\n  },\n  linkVisible: {\n    opacity: 0.8,\n  },\n  icon: {\n    height: anchorSize + anchorPadding,\n    padding: anchorPadding,\n  },\n});\n\nconst headings = {\n  H1: MarkdownHeading(1),\n  H2: MarkdownHeading(2),\n  H3: MarkdownHeading(3),\n  H4: MarkdownHeading(4),\n  H5: MarkdownHeading(5),\n  H6: MarkdownHeading(6),\n};\n\nexport default headings;\n"
  },
  {
    "path": "website/components/PackageListItem.js",
    "content": "// @flow\n\nimport * as React from \"react\";\nimport { View, Text, StyleSheet } from \"react-native-web\";\n\nimport Link from \"./Link\";\n\nconst PackageListItem = (props: {| package: Object |}) => (\n  <Link.Block\n    href={\"/en/packages/\" + props.package.id.replace(/package$/, \"docs\") + \"/\"}\n    style={styles.link}\n    blockProps={{ style: styles.block }}\n  >\n    <View style={styles.wrapper}>\n      <View>\n        <Text style={styles.name}>{props.package.name}</Text>\n      </View>\n      {props.package.author && (\n        <Text style={styles.author}>{\"By \" + props.package.author}</Text>\n      )}\n      {props.package.authors && (\n        <Text style={styles.author}>\n          {\"By \"}\n          {props.package.authors\n            .map(author => {\n              let a = author;\n              // remove <email> (avoid spam)\n              a = a.replace(/ <.+@.+>/g, \"\");\n              // assume \"Name (nick)\" => \"Name @github\"\n              a = a.replace(/ \\(([a-zA-Z_]+)\\)/g, \" @$1\");\n              // no space at all? assume github handle\n              if (!a.includes(\" \")) {\n                a = \"@\" + a;\n              }\n              // if something looks like a github handle, we only show that\n              if (\n                a.includes(\"@\") &&\n                (a.startsWith(\"@\") || a.includes(\"(@\") || a.includes(\" @\"))\n              ) {\n                a = a.slice(a.indexOf(\"@\"));\n              }\n              return a;\n            })\n            .join(\", \")}\n        </Text>\n      )}\n    </View>\n  </Link.Block>\n);\n\nconst styles = StyleSheet.create({\n  block: {\n    // flexBasis: 400,\n    minWidth: 250,\n    width: \"33%\",\n  },\n  wrapper: {\n    flexGrow: 1,\n    marginHorizontal: 10,\n    borderBottomWidth: StyleSheet.hairlineWidth,\n    borderBottomColor: \"rgba(0, 0, 0, 0.1)\",\n  },\n  link: {\n    flex: 1,\n    display: \"flex\",\n    flexDirection: \"column\",\n    textDecorationLine: \"none\",\n    color: \"inherit\",\n    paddingVertical: 20,\n    paddingHorizontal: 10,\n  },\n  name: {\n    fontWeight: \"700\",\n    fontSize: 22,\n    paddingBottom: 10,\n  },\n  author: {\n    fontWeight: \"100\",\n    color: \"#999\",\n  },\n});\n\nexport default PackageListItem;\n"
  },
  {
    "path": "website/components/Page.js",
    "content": "// @flow\n\nimport * as React from \"react\";\nimport { StyleSheet, View, Text } from \"react-native-web\";\n/* eslint-disable-next-line */\nimport PropTypes from \"prop-types\";\n/* eslint-disable-next-line */\nimport { isActive } from \"@phenomic/plugin-renderer-react/lib/components/Link.js\";\n\nimport Stylable from \"./react-stylable\";\nimport Flex from \"./Flex\";\nimport Link from \"./Link\";\nimport Spacer from \"./Spacer\";\nimport ActivityIndicator from \"./ActivityIndicator\";\nimport MarkdownGenerated from \"./MarkdownGenerated\";\nimport PageError from \"./PageError\";\nimport Header from \"./Header\";\nimport Footer from \"./Footer\";\nimport BodyContainer from \"./BodyContainer\";\nimport BodySmallContainer from \"./BodySmallContainer\";\n\nconst layouts = {\n  Default: props => (\n    <MarkdownGenerated body={props.node.body} filename={props.node.filename} />\n  ),\n};\n\nconst sort = (a, b) => {\n  if (a.priority && b.priority) {\n    if (a.priority < b.priority) return -1;\n    if (a.priority > b.priority) return 1;\n  }\n  if (a.priority) return 1;\n  if (b.priority) return -1;\n  if (a.id < b.id) return -1;\n  if (a.id > b.id) return 1;\n  return 0;\n};\n\nexport function readPkgFromId(id: string) {\n  const pieces = id ? id.split(\"/\") : [];\n  return pieces.shift();\n}\n\n// eslint-disable-next-line react/no-multi-comp\nconst Page = (props: Object, context: Object) => {\n  if (props.hasError) {\n    return <PageError error={props.page.error} />;\n  }\n\n  const Container = props.pages ? BodyContainer : BodySmallContainer;\n  let Layout = layouts.Default;\n  if (\n    props.page &&\n    props.page.node &&\n    props.page.node.layout &&\n    layouts[props.page.node.layout]\n  ) {\n    Layout = layouts[props.page.node.layout];\n  }\n\n  const currentPkg = readPkgFromId(props.params.splat);\n\n  return (\n    <Flex>\n      <Header\n        title={props.page && props.page.node && props.page.node.title}\n        subtitle={props.page && props.page.node && props.page.node.subtitle}\n      />\n      <Container>\n        <View style={styles.row}>\n          {props.pages && (\n            <Spacer large={true} style={styles.sidebar}>\n              {props.pages.node &&\n                props.pages.node.list\n                  .filter(\n                    p =>\n                      readPkgFromId(p.id) == currentPkg &&\n                      // avoid package.json files\n                      !p.title.endsWith(\"package.json\"),\n                  )\n                  .sort(sort)\n                  .map(page => {\n                    const href = `/en/packages/${page.id}/`;\n                    return (\n                      <React.Fragment key={page.id}>\n                        <Stylable\n                          style={styles.sidebarLink}\n                          activeStyle={styles.sidebarLinkActive}\n                          hoveredOrFocusedStyle={styles.sidebarLinkFocused}\n                        >\n                          <Link href={href}>\n                            <Spacer>\n                              <Text>{page.title}</Text>\n                            </Spacer>\n                          </Link>\n                        </Stylable>\n                        {isActive(href, context) && (\n                          <View>\n                            {Array.isArray(page.headings) &&\n                              page.headings\n                                .map(\n                                  h =>\n                                    h.level === 1 &&\n                                    page.title === h.text ? null : (\n                                      <Stylable\n                                        style={[\n                                          styles.sidebarHeadingLink,\n                                          styles[\n                                            \"sidebarHeadingLink\" + h.level\n                                          ],\n                                        ]}\n                                        activeStyle={[\n                                          styles.sidebarHeadingLinkActive,\n                                          styles[\n                                            \"sidebarHeadingLink\" +\n                                              h.level +\n                                              \"Active\"\n                                          ],\n                                        ]}\n                                        hoveredOrFocusedStyle={[\n                                          styles.sidebarHeadingLinkFocused,\n                                          styles[\n                                            \"sidebarHeadingLink\" +\n                                              h.level +\n                                              \"Focused\"\n                                          ],\n                                        ]}\n                                      >\n                                        <Link href={href + \"#\" + h.id}>\n                                          <Spacer small={true} key={h.text}>\n                                            <Text>{h.text}</Text>\n                                          </Spacer>\n                                        </Link>\n                                      </Stylable>\n                                    ),\n                                )\n                                .filter(heading => heading)}\n                          </View>\n                        )}\n                      </React.Fragment>\n                    );\n                  })}\n            </Spacer>\n          )}\n          <Spacer large={true} style={styles.content}>\n            {props.isLoading && <ActivityIndicator />}\n            {!props.isLoading && <Layout node={props.page.node} />}\n          </Spacer>\n        </View>\n      </Container>\n      <Spacer large={true} />\n      <Footer />\n    </Flex>\n  );\n};\n\nconst styles = StyleSheet.create({\n  row: {\n    flexDirection: \"row\",\n    flexWrap: \"wrap\",\n  },\n  sidebar: {\n    flex: 0,\n    flexBasis: 250,\n    marginTop: 30,\n  },\n  sidebarLink: {\n    fontSize: 18,\n    color: \"#006BF6\",\n    borderLeftWidth: 4,\n    borderLeftStyle: \"solid\",\n    borderLeftColor: \"transparent\",\n  },\n  sidebarLinkActive: {\n    borderLeftColor: \"#02CA83\",\n  },\n  sidebarLinkFocused: {\n    color: \"#fff\",\n    backgroundColor: \"#006BF6\",\n  },\n  sidebarHeadingLink: {\n    fontWeight: \"300\",\n    color: \"#006BF6\",\n  },\n  sidebarHeadingLinkActive: {\n    borderLeftColor: \"#02CA83\",\n  },\n  sidebarHeadingLinkFocused: {\n    color: \"#fff\",\n    backgroundColor: \"#006BF6\",\n  },\n  /* eslint-disable react-native/no-unused-styles */\n  sidebarHeadingLink1: { marginLeft: Spacer.small * 1 },\n  sidebarHeadingLink2: { marginLeft: Spacer.small * 2 },\n  sidebarHeadingLink3: { marginLeft: Spacer.small * 3 },\n  sidebarHeadingLink4: { marginLeft: Spacer.small * 4 },\n  sidebarHeadingLink5: { marginLeft: Spacer.small * 5 },\n  sidebarHeadingLink6: { marginLeft: Spacer.small * 6 },\n  /* eslint-enable react-native/no-unused-styles */\n  content: {\n    flex: 2,\n    flexBasis: 400,\n  },\n});\n\nexport default Page;\n"
  },
  {
    "path": "website/components/PageDoc.js",
    "content": "// @flow\n\nimport { withPhenomicApi, query } from \"@phenomic/preset-react-app/lib/client\";\n\nimport Page from \"./Page\";\n\nexport default withPhenomicApi(Page, props => {\n  return {\n    page: query({\n      path: `packages`,\n      id: props.params.splat,\n    }),\n    pages: query({\n      path: `packages`,\n    }),\n  };\n});\n"
  },
  {
    "path": "website/components/PageError.js",
    "content": "// @flow\n\nimport * as React from \"react\";\nimport { StyleSheet, View, Text } from \"react-native-web\";\n\nimport BodyContainer from \"./BodyContainer\";\nimport Header from \"./Header\";\nimport Footer from \"./Footer\";\n\nconst PageError = ({ error }: { error: Object }) => {\n  const status = (error && error.status) || 404;\n  const errorText =\n    error && status !== 404 ? error.statusText : \"Page not found\";\n\n  return (\n    <View>\n      <Header title={errorText} />\n      <BodyContainer style={styles.container}>\n        <Text style={styles.oops}>{\"Oooops!\"}</Text>\n        <View>\n          <Text style={styles.title}>\n            <strong>{status}</strong> {errorText}\n          </Text>\n          {status === 404 && (\n            <View>\n              <Text>\n                {\"It seems you found a broken link. \"}\n                {\"Sorry about that. \"}\n                <br />\n                {\"Do not hesitate to report this page.\"}\n              </Text>\n            </View>\n          )}\n        </View>\n      </BodyContainer>\n      <Footer />\n    </View>\n  );\n};\n\nconst styles = StyleSheet.create({\n  container: {\n    display: \"flex\",\n    flexDirection: \"column\",\n    justifyContent: \"center\",\n    alignItems: \"center\",\n    minHeight: \"50vh\",\n    padding: \"1rem 0\",\n  },\n  oops: {\n    fontSize: \"4rem\",\n    lineHeight: \"4rem\",\n    color: \"#ddd\",\n  },\n  title: {\n    margin: 60,\n    fontSize: 24,\n    lineHeight: 48,\n    textAlign: \"center\",\n  },\n});\nexport default PageError;\n"
  },
  {
    "path": "website/components/PagePackageList.js",
    "content": "// @flow\n\nimport * as React from \"react\";\nimport { View, StyleSheet } from \"react-native-web\";\nimport { withPhenomicApi, query } from \"@phenomic/preset-react-app/lib/client\";\n\nimport Flex from \"./Flex\";\nimport Spacer from \"./Spacer\";\nimport ActivityIndicator from \"./ActivityIndicator\";\nimport PageError from \"./PageError\";\nimport Header from \"./Header\";\nimport Footer from \"./Footer\";\nimport BodyContainer from \"./BodyContainer\";\nimport PackageListItem from \"./PackageListItem\";\n\nconst PagePackageList = (props: Object) => {\n  if (props.hasError) {\n    return <PageError error={props.packages.error} />;\n  }\n\n  return (\n    <Flex>\n      <Header title={\"Packages\"} />\n      <BodyContainer style={styles.container}>\n        {props.isLoading && <ActivityIndicator />}\n        {!props.isLoading && (\n          <React.Fragment>\n            <View style={styles.list}>\n              {props.packages.node.list\n                // only released pkg\n                .filter(pkg => !pkg.private)\n                .map(item => (\n                  <PackageListItem key={item.id} package={item} />\n                ))}\n            </View>\n            <Spacer />\n          </React.Fragment>\n        )}\n      </BodyContainer>\n      <Spacer large={true} />\n      <Footer />\n    </Flex>\n  );\n};\n\nconst styles = StyleSheet.create({\n  container: {\n    paddingVertical: 20,\n  },\n  list: {\n    flexDirection: \"row\",\n    flexWrap: \"wrap\",\n    justifyContent: \"flex-start\",\n    alignItems: \"flex-start\",\n  },\n});\n\nexport default withPhenomicApi(PagePackageList, () => ({\n  packages: query({\n    path: \"packages\",\n    by: \"keywords\",\n    value: \"phenomic-package\",\n    sort: \"name\",\n    order: \"asc\",\n  }),\n}));\n"
  },
  {
    "path": "website/components/PageShowcase.js",
    "content": "// @flow\n\nimport { withPhenomicApi, query } from \"@phenomic/preset-react-app/lib/client\";\n\nimport Page from \"./Page\";\n\nexport default withPhenomicApi(Page, props => ({\n  page: query({\n    path: \"content/showcase\",\n    id: props.params.splat,\n  }),\n}));\n"
  },
  {
    "path": "website/components/PhenomicLogo.js",
    "content": "// @flow\n\nimport * as React from \"react\";\nimport { StyleSheet, Dimensions, View, Text } from \"react-native-web\";\n\nimport { version } from \"../../lerna.json\";\nimport PhenomicLogoWhite from \"../svgs/PhenomicLogoWhite\";\nimport PhenomicText from \"../svgs/PhenomicText\";\n\nimport Link from \"./Link\";\nimport Spacer from \"./Spacer\";\n\nclass PhenomicLogo extends React.PureComponent<void, void> {\n  componentDidMount() {\n    if (typeof window !== undefined) {\n      window.addEventListener(\"resize\", this.handleLayout);\n    }\n  }\n\n  componentWillUnmount() {\n    if (typeof window !== undefined) {\n      window.removeEventListener(\"resize\", this.handleLayout);\n    }\n  }\n\n  handleLayout = () => {\n    if (!this.timeout) {\n      this.timeout = setTimeout(() => {\n        this.timeout = null;\n        this.forceUpdate();\n      }, 500);\n    }\n  };\n\n  render() {\n    const { width } = Dimensions.get(\"window\");\n\n    return (\n      <Spacer style={styles.container}>\n        <Link.Touchable href=\"/\">\n          <Spacer small={true} style={{ flex: 0 }}>\n            <PhenomicLogoWhite height=\"42\" />\n          </Spacer>\n        </Link.Touchable>\n        {width > 500 && (\n          <View style={{ flexShrink: 1 }}>\n            <Link.Touchable href=\"/\">\n              <Spacer small={true}>\n                <PhenomicText height=\"18\" />\n              </Spacer>\n            </Link.Touchable>\n            <Link.Touchable\n              href=\"https://github.com/phenomic/phenomic/releases\"\n              style={styles.version}\n            >\n              <Spacer small={true}>\n                <Text style={styles.versionText}>{\"v\" + version}</Text>\n              </Spacer>\n            </Link.Touchable>\n          </View>\n        )}\n      </Spacer>\n    );\n  }\n}\n\nconst styles = StyleSheet.create({\n  container: {\n    flexGrow: 0,\n    flexShrink: 1,\n    flexBasis: 64,\n    flexDirection: \"row\",\n    alignItems: \"center\",\n  },\n  version: {\n    position: \"absolute\",\n    bottom: -Spacer.normal,\n    textDecorationLine: \"none\",\n    color: \"#fff\",\n    opacity: 0.2,\n    fontSize: 12,\n  },\n  versionText: {\n    wordBreak: \"keep-all\",\n  },\n});\n\nexport default PhenomicLogo;\n"
  },
  {
    "path": "website/components/Plugins.js",
    "content": "// @flow\n\nimport * as React from \"react\";\nimport { View, Text, StyleSheet } from \"react-native-web\";\n\nimport Header from \"./Header\";\nimport Footer from \"./Footer\";\nimport BodyContainer from \"./BodyContainer\";\nimport Flex from \"./Flex\";\nimport Spacer from \"./Spacer\";\n\nconst Plugins = () => {\n  return (\n    <Flex>\n      <Header\n        title={\"Plugins\"}\n        subtitle={\"Discover existing Phenomic plugins\"}\n      />\n      <BodyContainer>\n        <View style={styles.row}>\n          <Spacer large={true}>\n            <Text\n              style={{\n                color: \"#32325d\",\n                fontSize: 24,\n                fontWeight: \"800\",\n                textAlign: \"center\",\n              }}\n            >\n              {\"WIP\"}\n            </Text>\n          </Spacer>\n        </View>\n      </BodyContainer>\n      <Footer />\n    </Flex>\n  );\n};\n\nconst styles = StyleSheet.create({\n  row: {\n    flexDirection: \"row\",\n    alignItems: \"center\",\n    justifyContent: \"center\",\n  },\n});\n\nexport default Plugins;\n"
  },
  {
    "path": "website/components/ShowcaseList.js",
    "content": "// @flow\n\nimport * as React from \"react\";\nimport { View, Text, Image, StyleSheet, createElement } from \"react-native-web\";\nimport { withPhenomicApi, query } from \"@phenomic/preset-react-app/lib/client\";\n\nimport urlToSlug from \"../modules/url-to-slug\";\nimport { screenshotsSize } from \"../package.json\";\n\nimport Flex from \"./Flex\";\nimport Link from \"./Link\";\nimport Spacer from \"./Spacer\";\nimport ActivityIndicator from \"./ActivityIndicator\";\nimport Header from \"./Header\";\nimport Footer from \"./Footer\";\nimport BodyContainer from \"./BodyContainer\";\n\nconst Div = props => createElement(\"div\", props);\n// eslint-disable-next-line react/no-multi-comp\nconst ShowcaseList = (props: Object) => (\n  <Flex>\n    <Header headTitle={\"Phenomic Showcase \"} title={\"Who's using Phenomic?\"} />\n    <BodyContainer style={styles.page}>\n      {props.isLoading && <ActivityIndicator />}\n      {!props.isLoading && (\n        <View>\n          <Link href={\"/en/showcase/submit/\"} style={styles.addYourOwn}>\n            {\"+ Add your website\"}\n          </Link>\n          {props.params &&\n            props.params.showcaseTags && (\n              <View style={styles.currentFilter}>\n                <Text style={styles.filterMessage}>\n                  {\"You are currently viewing projects that match \"}\n                  <em>{props.params.showcaseTags}</em>\n                  {\" tag. \"}\n                  <Link href={\"/en/showcase/\"} style={styles.filterMessageLink}>\n                    {\"View all.\"}\n                  </Link>\n                </Text>\n              </View>\n            )}\n          <View style={styles.list}>\n            {props.showcase.node.list.map(item => (\n              <View style={styles.item} key={item.id}>\n                <View style={styles.row}>\n                  <Text style={styles.itemName}>{item.title}</Text>\n                  <Text>{\" \"}</Text>\n                  {item.source && (\n                    <Link\n                      style={styles.itemLinkSource}\n                      href={item.source}\n                      target=\"_blank\"\n                    >\n                      {\"(Source)\"}\n                    </Link>\n                  )}\n                </View>\n                <View style={styles.tags}>\n                  {item.showcaseTags &&\n                    item.showcaseTags.map(tag => (\n                      <Link\n                        key={tag}\n                        href={`/en/showcase/tag/${tag}/`}\n                        style={styles.itemTag}\n                      >\n                        {tag}\n                      </Link>\n                    ))}\n                </View>\n                <a href={item.url} target=\"_blank\" rel=\"noopener noreferrer\">\n                  <Image\n                    source={{\n                      uri: `/showcase/entry/${urlToSlug(item.url)}-large.jpg`,\n                    }}\n                    style={styles.imageLarge}\n                    resizeMode=\"cover\"\n                  />\n                  <Div style={styles.imageContainerSmall}>\n                    <Image\n                      source={{\n                        uri: `/showcase/entry/${urlToSlug(item.url)}-small.jpg`,\n                      }}\n                      style={styles.imageSmall}\n                      resizeMode=\"cover\"\n                    />\n                  </Div>\n                </a>\n              </View>\n            ))}\n          </View>\n          <View style={styles.paginationRow}>\n            <View style={styles.paginationColumn}>\n              {props.showcase.node &&\n                props.showcase.node.previous && (\n                  <Link\n                    style={styles.link}\n                    href={\n                      props.showcase.node.previousPageIsFirst\n                        ? `/en/showcase`\n                        : `/en/showcase/${\n                            props.params.showcaseTags\n                              ? `tag/${props.params.showcaseTags}/`\n                              : \"\"\n                          }after/${props.showcase.node.previous}`\n                    }\n                  >\n                    {\"← Previous\"}\n                  </Link>\n                )}\n            </View>\n            <View style={styles.paginationColumn}>\n              {props.showcase.node &&\n                props.showcase.node.next && (\n                  <Link\n                    style={styles.link}\n                    href={`/en/showcase/${\n                      props.params.showcaseTags\n                        ? `tag/${props.params.showcaseTags}/`\n                        : \"\"\n                    }after/${props.showcase.node.next}`}\n                  >\n                    {\"Next →\"}\n                  </Link>\n                )}\n            </View>\n          </View>\n        </View>\n      )}\n    </BodyContainer>\n    <Spacer large={true} />\n    <Footer />\n  </Flex>\n);\n\nconst styles = StyleSheet.create({\n  row: {\n    flexDirection: \"row\",\n    alignItems: \"center\",\n  },\n  page: {\n    paddingTop: 10,\n    paddingBottom: 10,\n  },\n  addYourOwn: {\n    justifyContent: \"flex-end\",\n    position: \"absolute\",\n    right: 20,\n    top: -40,\n    fontSize: 16,\n    color: \"#fff\",\n    textDecorationLine: \"underline\",\n  },\n  currentFilter: {\n    padding: 10,\n    flexDirection: \"row\",\n    justifyContent: \"center\",\n  },\n  filterMessage: {\n    padding: 10,\n    color: \"#4078c0\",\n    backgroundColor: \"#e6f1f6\",\n    borderRadius: 3,\n  },\n  filterMessageLink: {\n    color: \"#4078c0\",\n    fontWeight: \"bold\",\n  },\n  list: {\n    flexDirection: \"row\",\n    flexWrap: \"wrap\",\n  },\n  item: {\n    flexGrow: 1,\n    minWidth: 250,\n    position: \"relative\",\n    width: \"50%\",\n    padding: 20,\n  },\n  imageLarge: {\n    flexGrow: 1,\n    paddingBottom:\n      (100 * screenshotsSize.large.height) / screenshotsSize.large.width + \"%\",\n    borderWidth: 1,\n    borderColor: \"rgba(0,0,0,.1)\",\n    borderRadius: 4,\n  },\n  imageContainerSmall: {\n    position: \"absolute\",\n    right: -10,\n    bottom: -10,\n    width: \"20%\",\n  },\n  imageSmall: {\n    flexGrow: 1,\n    width: \"100%\",\n    paddingBottom:\n      (100 * screenshotsSize.small.height) / screenshotsSize.small.width + \"%\",\n    borderWidth: 1,\n    borderColor: \"rgba(0,0,0,.1)\",\n    borderRadius: 4,\n  },\n  itemName: {\n    fontWeight: \"700\",\n    fontSize: 18,\n    lineHeight: 18 * 2,\n    color: \"#424345\",\n  },\n  itemLinkSource: {\n    fontSize: 12,\n    textDecorationLine: \"none\",\n    color: \"#006df4\",\n    opacity: 0.4,\n  },\n  tags: {\n    flexDirection: \"row\",\n    justifyContent: \"flex-end\",\n    marginRight: -10,\n  },\n  itemTag: {\n    fontSize: 12,\n    lineHeight: 24,\n    margin: 10,\n    paddingLeft: 6,\n    paddingRight: 6,\n    color: \"#08b09b\",\n    backgroundColor: \"#fff\",\n    borderRadius: 3,\n  },\n  paginationRow: {\n    flexDirection: \"row\",\n  },\n  paginationColumn: {\n    width: \"50%\",\n    padding: 10,\n    alignItems: \"center\",\n    justifyContent: \"center\",\n  },\n  link: {\n    color: \"#006df4\",\n    fontSize: 18,\n    padding: 20,\n  },\n});\n\nexport { ShowcaseList as Component };\n\nexport default withPhenomicApi(ShowcaseList, props => ({\n  showcase: query({\n    path: \"content/showcase/entry\",\n    order: \"asc\",\n    sort: \"showcase\",\n    limit: 10,\n    after: props.params.after,\n  }),\n}));\n\nexport const ShowcaseListByTag = withPhenomicApi(ShowcaseList, props => ({\n  showcase: query({\n    path: \"content/showcase/entry\",\n    by: \"showcaseTags\",\n    value: props.params.showcaseTags,\n    order: \"asc\",\n    sort: \"showcase\",\n    limit: 10,\n    after: props.params.after,\n  }),\n}));\n"
  },
  {
    "path": "website/components/Spacer.js",
    "content": "// @flow\n\nimport * as React from \"react\";\nimport { StyleSheet, View } from \"react-native-web\";\n\ntype p = {|\n  horizontal?: boolean,\n  vertical?: boolean,\n  small?: boolean,\n  smallHorizontal?: boolean,\n  smallVertical?: boolean,\n  large?: boolean,\n  largeHorizontal?: boolean,\n  largeVertical?: boolean,\n|};\nconst Spacer = (props: p) => (\n  <View\n    style={[\n      styles.default,\n      !props.horizontal && !props.vertical && styles.normalMargin,\n      props.horizontal && styles.normalMarginHorizontal,\n      props.vertical && styles.normalMarginVertical,\n      props.small && styles.smallMargin,\n      props.large && styles.largeMargin,\n      props.smallHorizontal && styles.smallMarginHorizontal,\n      props.smallVertical && styles.smallMarginVertical,\n      props.largeHorizontal && styles.largeMarginHorizontal,\n      props.largeVertical && styles.largeMarginVertical,\n      props.style,\n    ]}\n  >\n    {props.children}\n  </View>\n);\nSpacer.small = 10;\nSpacer.normal = 20;\nSpacer.large = 40;\n\nconst styles = StyleSheet.create({\n  default: {\n    flex: 1,\n  },\n  normalMargin: {\n    marginHorizontal: Spacer.normal / 2,\n    marginVertical: Spacer.normal / 2,\n  },\n  normalMarginHorizontal: {\n    marginHorizontal: Spacer.normal / 2,\n  },\n  normalMarginVertical: {\n    marginVertical: Spacer.normal / 2,\n  },\n  smallMargin: {\n    marginHorizontal: Spacer.small / 2,\n    marginVertical: Spacer.small / 2,\n  },\n  smallMarginVertical: {\n    marginVertical: Spacer.small / 2,\n  },\n  smallMarginHorizontal: {\n    marginHorizontal: Spacer.small / 2,\n  },\n  largeMargin: {\n    marginHorizontal: Spacer.large / 2,\n    marginVertical: Spacer.large / 2,\n  },\n  largeMarginHorizontal: {\n    marginHorizontal: Spacer.large / 2,\n  },\n  largeMarginVertical: {\n    marginVertical: Spacer.large / 2,\n  },\n});\n\nexport default Spacer;\n"
  },
  {
    "path": "website/components/Spinner.js",
    "content": "// @flow\n\nimport * as React from \"react\";\n\ntype props = {|\n  style?: any,\n  borderWidth?: string,\n  delay: number,\n  duration: string,\n  color: string,\n  color2: string,\n|};\nclass Spinner extends React.PureComponent<props, { visible: boolean }> {\n  state = {\n    visible: false,\n  };\n\n  _timeout: TimeoutID;\n\n  componentDidMount() {\n    this._timeout = setTimeout(\n      () => this.setState({ visible: true }),\n      this.props.delay || 250,\n    );\n  }\n  componentWillUnmount() {\n    clearTimeout(this._timeout);\n  }\n\n  render() {\n    return (\n      <React.Fragment>\n        <style\n          dangerouslySetInnerHTML={{\n            __html: `@keyframes Spinner-rotation { from { transform: rotate(0); } to { transform: rotate(359deg); } }`,\n          }}\n        />\n        <div\n          style={{\n            opacity: this.state.visible ? 1 : 0,\n            border: `${this.props.borderWidth || \"10px\"} solid ${this.props\n              .color || \"rgba(0,0,0,0.2)\"}`,\n            borderTopColor: this.props.color2 || \"rgba(0,0,0,0.8)\",\n            animation: `Spinner-rotation ${this.props.duration ||\n              \"0.8s\"} infinite linear`,\n            borderRadius: \"100%\",\n            transition: \"opacity 4s\",\n            ...(this.props.style || {}),\n          }}\n        />\n      </React.Fragment>\n    );\n  }\n}\n\nexport default Spinner;\n"
  },
  {
    "path": "website/components/Tutorials.js",
    "content": "// @flow\n\nimport * as React from \"react\";\nimport { View, Text, StyleSheet } from \"react-native-web\";\n\nimport Header from \"./Header\";\nimport Footer from \"./Footer\";\nimport BodyContainer from \"./BodyContainer\";\nimport Flex from \"./Flex\";\nimport Link from \"./Link\";\nimport Spacer from \"./Spacer\";\n\nconst items = [\n  {\n    title: \"React App\",\n    Icon: require(\"../svgs/ReactLogo\").default,\n    link: \"/en/packages/preset-react-app/docs/\",\n  },\n];\n\nconst Tutorials = () => {\n  return (\n    <Flex>\n      <Header\n        title={\"Tutorials\"}\n        subtitle={\"Start with Phenomic, step by step\"}\n      />\n      <BodyContainer>\n        <View style={styles.row}>\n          <Spacer large={true}>\n            <Text\n              style={{\n                color: \"#32325d\",\n                fontSize: 24,\n                fontWeight: \"800\",\n                textAlign: \"center\",\n              }}\n            >\n              {\"Start by choosing your ecosystem\"}\n            </Text>\n          </Spacer>\n        </View>\n        <View style={styles.logos}>\n          {items.map((item, i) => (\n            <Link.Block\n              key={i}\n              blockProps={{ style: styles.logoWrapper }}\n              style={[styles.logo, item.todo && styles.todo]}\n              href={item.link}\n            >\n              <View style={styles.img}>\n                <item.Icon height={item.height || 128} />\n              </View>\n              <Text style={styles.logoTitle}>{item.title}</Text>\n            </Link.Block>\n          ))}\n        </View>\n        <Spacer large={true} style={styles.row}>\n          <Link\n            style={styles.notice}\n            href=\"https://github.com/phenomic/phenomic/labels/plugin\"\n          >\n            {\"Don't see what you're looking for?\"}\n          </Link>\n        </Spacer>\n      </BodyContainer>\n      <Footer />\n    </Flex>\n  );\n};\n\nconst styles = StyleSheet.create({\n  row: {\n    flexDirection: \"row\",\n    alignItems: \"center\",\n    justifyContent: \"center\",\n  },\n  logos: {\n    marginTop: 48,\n    marginBottom: 24,\n    borderTopWidth: 1,\n    borderTopColor: \"#dfe7ed\",\n    flexDirection: \"row\",\n    flexWrap: \"wrap\",\n    justifyContent: \"center\",\n    alignItems: \"center\",\n  },\n  logoWrapper: {\n    minWidth: \"33%\",\n  },\n  logo: {\n    borderBottomWidth: 1,\n    borderBottomColor: \"#dfe7ed\",\n    borderBottomStyle: \"solid\",\n    flexGrow: 1,\n    flexDirection: \"column\",\n    paddingVertical: 48,\n    alignItems: \"center\",\n    color: \"inherit\",\n    textDecorationStyle: \"none\",\n  },\n  logoTitle: {\n    fontSize: 18,\n    fontWeight: \"300\",\n    color: \"#4c4d63\",\n  },\n  img: {\n    flexGrow: 1,\n    justifyContent: \"center\",\n    marginBottom: 24,\n  },\n  todo: {\n    opacity: 0.25,\n    filter: \"blur(1px) grayscale(75%)\",\n  },\n  notice: {\n    opacity: 0.25,\n    // fontSize: 24,\n    paddingVertical: 48,\n  },\n});\n\nexport default Tutorials;\n"
  },
  {
    "path": "website/components/Wrapper.js",
    "content": "// @flow\n\nimport * as React from \"react\";\nimport { StyleSheet, View } from \"react-native-web\";\nimport Head from \"react-helmet\";\n\nconst Wrapper = (props: Object) => (\n  <View style={styles.wrapper}>\n    <Head>\n      <meta charSet=\"utf-8\" />\n      <meta name=\"viewport\" content=\"width=device-width, initial-scale=1\" />\n      <link\n        rel=\"apple-touch-icon\"\n        sizes=\"180x180\"\n        href=\"/apple-touch-icon.png\"\n      />\n      <link\n        rel=\"icon\"\n        type=\"image/png\"\n        sizes=\"32x32\"\n        href=\"/favicon-32x32.png\"\n      />\n      <link\n        rel=\"icon\"\n        type=\"image/png\"\n        sizes=\"16x16\"\n        href=\"/favicon-16x16.png\"\n      />\n      <link rel=\"manifest\" href=\"/site.webmanifest\" />\n      <link rel=\"mask-icon\" href=\"/safari-pinned-tab.svg\" color=\"#5bbad5\" />\n      <meta name=\"msapplication-TileColor\" content=\"#ffffff\" />\n      <meta name=\"theme-color\" content=\"#ffffff\" />\n    </Head>\n    {props.children}\n  </View>\n);\n\nconst styles = StyleSheet.create({\n  wrapper: {\n    flex: 1,\n    backgroundColor: \"#F2F5F8\",\n  },\n});\n\nexport default Wrapper;\n"
  },
  {
    "path": "website/components/react-stylable/focusable.js",
    "content": "// @flow\n\nimport * as React from \"react\";\n\ntype props = {|\n  onFocus?: () => void,\n  onBlur?: () => void,\n|};\n\ntype state = {|\n  focused: boolean,\n|};\n\nexport default (ComposedComponent: React.ComponentType<*>) => {\n  class Focusable extends React.Component<props, state> {\n    props: props;\n\n    state: state = {\n      focused: false,\n    };\n\n    handleFocus = (event: React$SyntheticEvent): void => {\n      this.setState({ focused: true });\n      if (typeof this.props.onFocus === \"function\") {\n        this.props.onFocus(event);\n      }\n    };\n\n    handleBlur = (event: React$SyntheticEvent): void => {\n      this.setState({ focused: false });\n      if (typeof this.props.onBlur === \"function\") {\n        this.props.onBlur(event);\n      }\n    };\n\n    render() {\n      return (\n        <ComposedComponent\n          {...this.props}\n          {...this.state}\n          onFocus={this.handleFocus}\n          onBlur={this.handleBlur}\n        />\n      );\n    }\n  }\n\n  return Focusable;\n};\n"
  },
  {
    "path": "website/components/react-stylable/hoverable.js",
    "content": "// @flow\n\nimport * as React from \"react\";\n\ntype props = {|\n  onMouseEnter?: () => void,\n  onMouseLeave?: () => void,\n|};\n\ntype state = {|\n  hovered: boolean,\n|};\n\nexport default (ComposedComponent: React.ComponentType<*>) => {\n  class Hoverable extends React.Component<props, state> {\n    props: props;\n\n    state: state = {\n      hovered: false,\n    };\n\n    handleMouseEnter = (event: React$SyntheticEvent): void => {\n      this.setState({ hovered: true });\n      if (typeof this.props.onMouseEnter === \"function\") {\n        this.props.onMouseEnter(event);\n      }\n    };\n\n    handleMouseLeave = (event: React$SyntheticEvent): void => {\n      this.setState({ hovered: false });\n      if (typeof this.props.onMouseLeave === \"function\") {\n        this.props.onMouseLeave(event);\n      }\n    };\n\n    render() {\n      return (\n        <ComposedComponent\n          {...this.props}\n          {...this.state}\n          onMouseEnter={this.handleMouseEnter}\n          onMouseLeave={this.handleMouseLeave}\n        />\n      );\n    }\n  }\n\n  return Hoverable;\n};\n"
  },
  {
    "path": "website/components/react-stylable/index.js",
    "content": "// @flow\n\nimport React from \"react\";\n\nimport Hoverable from \"./hoverable\";\nimport Focusable from \"./focusable\";\nimport Touchable from \"./touchable\";\nimport TouchableMouse from \"./touchable-mouse\";\n\ntype p = {|\n  children?: React$Element<any>,\n\n  // hoc\n  hovered: boolean,\n  focused: boolean,\n  touched: boolean,\n\n  // user\n  style?: any,\n  hoveredStyle?: any,\n  focusedStyle?: any,\n  touchedStyle?: any,\n  hoveredOrFocusedStyle?: any,\n|};\n\nconst Stylable = (props: p) => {\n  const {\n    hovered,\n    focused,\n    touched,\n    style,\n    hoveredStyle,\n    focusedStyle,\n    touchedStyle,\n    hoveredOrFocusedStyle,\n    children,\n    ...othersProps\n  } = props;\n\n  return React.cloneElement(children, {\n    ...othersProps,\n    style: [\n      style,\n      hovered && hoveredStyle,\n      focused && focusedStyle,\n      (hovered || focused) && hoveredOrFocusedStyle,\n      touched && touchedStyle,\n    ],\n  });\n};\n\nexport default Hoverable(Focusable(Touchable(TouchableMouse(Stylable))));\n"
  },
  {
    "path": "website/components/react-stylable/touchable-mouse.js",
    "content": "// @flow\n\nimport * as React from \"react\";\n\ntype props = {|\n  onMouseDown?: () => void,\n  onMouseUp?: () => void,\n|};\n\ntype state = {|\n  touched: boolean,\n|};\n\nexport default (ComposedComponent: React.ComponentType<*>) => {\n  class MouseDownable extends React.Component<props, state> {\n    props: props;\n\n    state: state = {\n      touched: false,\n    };\n\n    handleMouseDown = (event: React$SyntheticEvent): void => {\n      this.setState({ touched: true });\n      if (typeof this.props.onMouseDown === \"function\") {\n        this.props.onMouseDown(event);\n      }\n    };\n\n    handleMouseUp = (event: React$SyntheticEvent): void => {\n      this.setState({ touched: false });\n      if (typeof this.props.onMouseUp === \"function\") {\n        this.props.onMouseUp(event);\n      }\n    };\n\n    render() {\n      return (\n        <ComposedComponent\n          {...this.props}\n          {...this.state}\n          onMouseDown={this.handleMouseDown}\n          onMouseUp={this.handleMouseUp}\n        />\n      );\n    }\n  }\n\n  return MouseDownable;\n};\n"
  },
  {
    "path": "website/components/react-stylable/touchable.js",
    "content": "// @flow\n\nimport * as React from \"react\";\n\ntype props = {|\n  onTouchStart?: () => void,\n  onTouchEnd?: () => void,\n|};\n\ntype state = {|\n  touched: boolean,\n|};\n\nexport default (ComposedComponent: React.ComponentType<*>) => {\n  class TouchStartable extends React.Component<props, state> {\n    props: props;\n\n    state: state = {\n      touched: false,\n    };\n\n    handleTouchStart = (event: React$SyntheticEvent): void => {\n      this.setState({ touched: true });\n      if (typeof this.props.onTouchStart === \"function\") {\n        this.props.onTouchStart(event);\n      }\n    };\n\n    handleTouchEnd = (event: React$SyntheticEvent): void => {\n      this.setState({ touched: false });\n      if (typeof this.props.onTouchEnd === \"function\") {\n        this.props.onTouchEnd(event);\n      }\n    };\n\n    render() {\n      return (\n        <ComposedComponent\n          {...this.props}\n          {...this.state}\n          onTouchStart={this.handleTouchStart}\n          onTouchEnd={this.handleTouchEnd}\n        />\n      );\n    }\n  }\n\n  return TouchStartable;\n};\n"
  },
  {
    "path": "website/content/blog/2017-06-02-introducing-1.0.0-alpha.md",
    "content": "---\ntitle: Introducing Phenomic 1.0.0 first alpha\nauthor: bloodyowl\n---\n\n## A complete rewrite\n\nPhenomic is a static website generator that has been in v0.\\* for quite a while\nnow. As we wanted to release a v1, we took some time to think about what needed\nto change, and what we could do better for our stable API.\n\nA few months ago, we started the reflexion. As our GitHub issues were mainly\nbikeshedding and user-specific needs, we realised that we were trying to bring\ntoo much in our core module, which was preventing us from moving forward to\nwhere we wanted to push Phenomic.\n\nWe then started prototyping a new version in consideration of what we want it to\nbe capable of:\n\n- Use an HTTP API as content source, which would enable us to build static\n  versions of multiple CMS\n- Have a powerful querying API\n- Build scalable static web apps\n- Handle pagination\n\nTherefore we decided to make a simple core API and put the specifics in plugins.\nPhenomic for now has a default preset with Webpack and React, but opens the way\nfor any other bundler or UI library (ping us if you'd like to implement Rollup,\nVue or Angular).\n\nToday we're officially releasing the first alpha of our 1.0.0 API, and we'd be\nreally grateful for your feedback while we finalise the last details and the\ndocs.\n\nBe sure to check out [\"Getting Started\"](https://phenomic.io/en/tutorials/)\npage!\n\nYou can have a look on\n[this website source](https://github.com/phenomic/phenomic/tree/master/website)\nand\n[learn how to get started](https://github.com/phenomic/phenomic/tree/master/packages/preset-react-app/docs/getting-started/README.md).\n\nWe hope you'll like this release!\n"
  },
  {
    "path": "website/content/blog/2017-06-10-v1.0.0-alpha.3.md",
    "content": "---\ntitle: v1.0.0-alpha.3\ntag_name: v1.0.0-alpha.3\nlink: https://github.com/phenomic/phenomic/releases/tag/v1.0.0-alpha.3\nauthor: MoOx\nprerelease: true\n---\n\n## Changes\n\n- change(`@phenomic/core`): merge `getMiddlewares` and `defineDevMiddleware` as\n  `addDevServerMiddlewares`\n  ([4322731](https://github.com/phenomic/phenomic/commit/4322731a7abbd18dd0557b488af875cc5152c9ae) -\n  @MoOx)\n- change(`@phenomic/plugin-bundler-webpack`): now require a consistent\n  bundleName (from config, default to \"phenomic.main\")\n  ([c8678c0](https://github.com/phenomic/phenomic/commit/c8678c0bf2b24389d2faa8508c4c543b0d99f889) -\n  @MoOx)\n- `@phenomic/core` is now a peer dependency of all packages\n  ([f86f253](https://github.com/phenomic/phenomic/commit/f86f2538a9643331e6979f9da2415ded4472ab80) -\n  @MoOx)\n\n## Fixes\n\n- fix(`@phenomic/plugin-bundler-webpack`): set webpack & webpack-dev-middleware\n  as deps ([#1049](https://github.com/phenomic/phenomic/issues/1049) - @MoOx)\n- fix(`@phenomic/plugin-collector-files`): normalize path for windows\n  ([#1046](https://github.com/phenomic/phenomic/issues/1046) - @shaunmarx)\n- fix(`@phenomic/plugin-public-assets`): make \"public\" folder optional\n  ([4322731](https://github.com/phenomic/phenomic/commit/4322731a7abbd18dd0557b488af875cc5152c9ae) -\n  @MoOx)\n- fix(`@phenomic/core`): make \"content\" folder optional\n  ([e892781](https://github.com/phenomic/phenomic/commit/e892781e9e0a9f80f33cc572ed0211785a7677b5) -\n  @MoOx)\n- fix(`@phenomic/core`): don't log start & do cleanup when build script is\n  interpreted (should happen when used)\n  ([d361185](https://github.com/phenomic/phenomic/commit/d361185da835159a3b92e21f3543eeb19efde5b0) -\n  @MoOx)\n\n## New features\n\n- feat(`@phenomic/core`): add an logger utility to normalize plugin logs ouput\n  (`import logger from '@phenomic/core/lib/logger'; const log = logger(\"plugin name\"); log.info(\"stuff\");`)\n  ([f908a58](https://github.com/phenomic/phenomic/commit/f908a58c99c8cba1bac3f6e78bcd70914013a759) -\n  @MoOx)\n- feat(`@phenomic/plugin-renderer-react`): BodyRenderer component now accept a\n  \"components\" map\n  ([d3500ae](https://github.com/phenomic/phenomic/commit/d3500ae6d04202518efdbf280387d9713d15807f) -\n  @MoOx)\n"
  },
  {
    "path": "website/content/blog/2017-07-11-v1.0.0-alpha.4.md",
    "content": "---\ntitle: v1.0.0-alpha.4\ntag_name: v1.0.0-alpha.4\nlink: https://github.com/phenomic/phenomic/releases/tag/v1.0.0-alpha.4\nauthor: MoOx\nprerelease: true\n---\n\nfix(@phenomic/core): support static rendering of \"by\" parameters for main\n(first) collection `collection` params in routes is now useless as we consider\nthe first collection of the queries as the main query. (@MoOx)\n\nfeat(@phenomic/cli): add a default babel config\n([#1071](https://github.com/phenomic/phenomic/issues/1071) - @MoOx)\n\nfeat(@phenomic/plugin-renderer-react): render path that finish with html as is\n([#1106](https://github.com/phenomic/phenomic/issues/1106) - @MoOx)\n\nfix(@phenomic/plugin-renderer-react): Prevent our react context usage from\ncolliding with redux\n([#1086](https://github.com/phenomic/phenomic/issues/1086) - @bloodyowl)\n"
  },
  {
    "path": "website/content/blog/2017-08-09-v1.0.0-alpha.5.md",
    "content": "---\ntitle: v1.0.0-alpha.5\ntag_name: v1.0.0-alpha.5\nlink: https://github.com/phenomic/phenomic/releases/tag/v1.0.0-alpha.5\nauthor: MoOx\nprerelease: true\n---\n\n🎉 We added examples in `examples/*` for\n[react-app](https://github.com/phenomic/phenomic/tree/master/examples/react-app)\nand\n[reason-react-app](https://github.com/phenomic/phenomic/tree/master/examples/reason-react-app).\n\nWe also have prepared a workflow to be able to quickly add more examples with\nautomated testing to prevent any kind of regressions. Documentation is also\ncovered by tests to prevent regressions.\n\nStay tuned for more examples. And do not hesitate to add some!\n\nDo not hesitate to contact us if you want to contribute as our CONTRIBUTING.md\nis still a WIP :)\n\n# tl;dr;\n\n- Tons of fixes in\n  [Getting Started](https://github.com/phenomic/phenomic/blob/master/packages/preset-react-app/docs/getting-started/README.md)\n- Fixed & improved pagination and static rendering\n- Examples for preset-react-app & reason\n- Client side navigation enabled for markdown link\n- \"Various fixes\" 🙃\n\n# Notable fixes & improvements\n\n## `@phenomic/core`\n\n- Fix static rendering for collection items (when no by param is used)\n  ([#1114](https://github.com/phenomic/phenomic/issues/1114) - @MoOx)\n\n- Fix pagination `previous` that was incorrect for second page (@MoOx)\n\n- Fix `order: 'asc'` for queries (@MoOx)\n\n- Pre-rendering now handle ALL possible pages for pagination. This is a huge\n  step forward as we now have a real immutable pagination that opens a number of\n  possibilities like infinite scrolling mixed with immutable pages urls! (@MoOx,\n  @bloodyowl)\n\n## `@phenomic/plugin-public-assets`\n\n- Prevent infinite static build step if no \"public\" folder exist (@MoOx)\n\n## `@phenomic/plugin-bundler-webpack`\n\n- Only shallow error if config file does not exist\n  ([#1085](https://github.com/phenomic/phenomic/issues/1085) - @MoOx)\n\n## `@phenomic/plugin-renderer-react`\n\n- New `Link` component that you should use instead of react-router v3 one. It\n  enables client side routing for markdown by default and **also handle relative\n  and external urls** unlike react-router v3 `Link`. (@MoOx)\n\n## `@phenomic/preset-react-app`\n\n- Update for Getting Started (@MoOx, @Izhaki, @nicolas-zozol, @andrwh, @soycode,\n  @YuyingWu, @syndia)\n\n## `@phenomic/reason`\n\n- Various mysterious updates by @bloodyowl. Please refer to the\n  [examples/reason-react-app](https://github.com/phenomic/phenomic/tree/master/examples/reason-react-app)\n  until API is stable & doc is complete.\n\n[PR #1111](https://github.com/phenomic/phenomic/pull/1111)\n"
  },
  {
    "path": "website/content/blog/2017-09-08-v1.0.0-alpha.6.md",
    "content": "---\ntitle: v1.0.0-alpha.6\ntag_name: v1.0.0-alpha.6\nlink: https://github.com/phenomic/phenomic/releases/tag/v1.0.0-alpha.6\nauthor: MoOx\nprerelease: true\n---\n\nWe have made some tiny breaking changes (easy to update) for a better future (to\ngive you more power (eg: query for sub-folder & choice for whatever css-in-js\nsolution you want :)\n\nWe have added plenty of\n[examples](https://github.com/phenomic/phenomic/tree/master/examples). Be sure\nto take a look!\n\nFYI, those examples will always be up to date with Phenomic API as those are\nautomatically tested in our full test suit (with some assertions to check the\nresult)!\n\n# tl;dr\n\n## 💥 **Breaking change**\n\n- `collection` concept has been replaced by a simple `path`.\n- Html component must be in its own file & offers controls for rendering of the\n  HTML (eg: for CSS-in-JS static rendering), see details below.\n- Some change simple have been made for API of render plugins (if you wrote one,\n  let us know!).\n\n## ✨ New features\n\n- JS/CSS now have hashes in the filename to avoid caching issues.\n- CSS files can now be easily injected in the Html.\n- Some enhancements on webpack default config.\n- React plugin now exports a function to render content as raw text (handy for\n  meta description & similar)\n\n---\n\n## Details\n\n### `@phenomic/core`\n\n- 💥 **Breaking change** we changed a little renderer plugin API:\n  - `renderServer` becomes `renderStatic`\n  - `renderHTML` is now hidden and replaced by `renderDevServer` method that\n    accept assets (key: array of filenames) returned by build or injected by\n    `addDevServerMiddlewares` in res.locals.assets (@MoOx)\n- 💥 **Breaking change** `collection` concept has been replaced by a simple\n  `path`. You can just replace all `collection` in your query by `path` and it\n  should work. What you are winning here is the ability to query using a\n  sub-folder.\n\n### `@phenomic/plugin-bundler-webpack`\n\n- Upgrade to webpack@^3.0.0. It's a bit faster on our website (28s vs 24s -\n  Phenomic part is > 2s).\n  ([#1137](https://github.com/phenomic/phenomic/pull/1137) - @MoOx)\n- Properly pass assets to the core (so CSS and JS files are known) (@MoOx)\n\n### `@phenomic/plugin-renderer-react` & `@phenomic/preset-react-app`\n\n- 💥 **Breaking change** props passed to Html components are now components to\n  render & not string. This will allow people to wrap rendering (eg: so they can\n  use whatever CSS-in-JS solutions).\n\nPreviously, a minimal `Html` component was like\n\n```js\nconst Html = props => (\n  <html>\n    <head>\n      <meta charSet=\"utf-8\" />\n      <meta name=\"viewport\" content=\"width=device-width, initial-scale=1\" />\n    </head>\n    <body className=\"wrapper\">\n      {props.body}\n      {props.state}\n      {props.script}\n    </body>\n  </html>\n);\n```\n\nNow it should be\n\n```js\nconst Html = ({ App, render }) => {\n  const { Main, State, Script, Style } = render(<App />);\n  // you have also an `assets` object if you want more control to renders js/css files\n  return (\n    <html>\n      <head>\n        <meta charSet=\"utf-8\" />\n        <meta name=\"viewport\" content=\"width=device-width, initial-scale=1\" />\n        <Style />\n      </head>\n      <body className=\"wrapper\">\n        <Main />\n        <State />\n        <Script />\n      </body>\n    </html>\n  );\n```\n\n([#1094](https://github.com/phenomic/phenomic/issues/1094) - @MoOx)\n\n- A new `textRenderer` to convert page content to raw text is now export.\n\n```js\nimport {\n  createApp,\n  createContainer,\n  query,\n  BodyRenderer,\n  /***** I AM NEW *****/\n  textRenderer,\n  /********************/\n} from \"@phenomic/preset-react-app/lib/client\";\n// also available from \"@phenomic/plugin-renderer-react/lib/client\"\n\nconst BlogPost = ({ isLoading, page }) => (\n  <div>\n    {isLoading && \"Loading...\"}\n    {!isLoading &&\n      page.node && (\n        <article>\n          <Head>\n            <title>{page.node.title}</title>\n            /***** TRY ME *****/\n            <meta\n              name=\"description\"\n              content={textRenderer(page.node.body).slice(0, 150) + \"…\"}\n            />\n            /******************/\n          </Head>\n          <h1>{page.node.title}</h1>\n          <BodyRenderer>{page.node.body}</BodyRenderer>\n        </article>\n      )}\n    {/* ... */}\n  </div>\n);\n```\n\n([#1084](https://github.com/phenomic/phenomic/issues/1084) - @MoOx)\n"
  },
  {
    "path": "website/content/blog/2017-09-15-v1.0.0-alpha.7.md",
    "content": "---\ntitle: v1.0.0-alpha.7\ntag_name: v1.0.0-alpha.7\nlink: https://github.com/phenomic/phenomic/releases/tag/v1.0.0-alpha.7\nauthor: MoOx\nprerelease: true\n---\n\n# 🎉 No breaking changes 🎉\n\nOnly fixes & improvements!\n\n---\n\n- [`@phenomic/core`: **Fix encoding issue for static generated API files**](https://github.com/phenomic/phenomic/commit/058b20a6b674cd750c8e4ebdeb89dc669c8559f4),\n  by @MoOx, reported by @ArthurClemens in\n  [#1158](https://github.com/phenomic/phenomic/issues/1158)\n\n- [`@phenomic/plugin-bundler-webpack`: **Fix react-native-web StyleSheet pre-rendering (regression with 1.0.0-alpha-6 changes)**](https://github.com/phenomic/phenomic/commit/aa3d06f605b20d2744e186e24f6371d5f2604d50),\n  by @MoOx\n\n- [`@phenomic/plugin-renderer-react`: **Avoid unnecessary React warning in development**](https://github.com/phenomic/phenomic/commit/0918b79370c066f0e4ff3577ee448f6356c92d45),\n  by @MoOx, reported by @DominikGuzei in\n  [#1155](https://github.com/phenomic/phenomic/issues/1155)\n\n- [`@phenomic/core`: **Add a explicit message if dev server is running when you try to build static version**](https://github.com/phenomic/phenomic/commit/2a3f40e2cb95a8a92408eb9ac7be56cfee8116dc),\n  by @MoOx, reported by @ArthurClemens in\n  [#1156](https://github.com/phenomic/phenomic/issues/1156)\n\n- [`@phenomic/plugin-renderer-react`: **Fix incorrect class name(s) rendering for Link component**](https://github.com/phenomic/phenomic/commit/50f9a62dbee06eabc631259d056f06e962db9c0e),\n  by @MoOx, reported by @DominikGuzei in\n  [#1154](https://github.com/phenomic/phenomic/issues/1154)\n\n- [`@phenomic/plugin-renderer-react`: **Improve Link behavior for better accessibility (respect modifiers, target + keyboard navigation)**](https://github.com/phenomic/phenomic/commit/5b7422465c7755e51ef07bac1a53a6bcaf4610ab),\n  by @MoOx\n\n  The Link component (by default used to navigate between content (eg: markdown)\n  link) has been improved:\n\n  - does not use directly react-router Link, but instead just push the url in\n    the navigation history (which is supported by react-router)\n  - respect target=\\_blank original behavior\n  - respect keyboard modifiers original behaviors (eg: cmd+click, alt+click etc)\n  - work better with keyboard navigation (enter key) has it's now triggering\n    client side navigation!\n\n  This component can receive onClick and onPress callback that can trigger a\n  preventDefault() to avoid the original behavior of the component if necessary.\n"
  },
  {
    "path": "website/content/blog/2017-09-16-v1.0.0-alpha.8.md",
    "content": "---\ntitle: v1.0.0-alpha.8\ntag_name: v1.0.0-alpha.8\nlink: https://github.com/phenomic/phenomic/releases/tag/v1.0.0-alpha.8\nauthor: MoOx\nprerelease: true\n---\n\n# 🎉 No breaking changes 🎉\n\nA simple bug fix on an edge case for paginated queries + a fix for an\nundocumented component :)\n\n---\n\n- [`@phenomic/core:` Fix \"hasNextPage\" & \"next\" reference for a paginated query when a page ends with the last item of the entire collection](https://github.com/phenomic/phenomic/commit/7c167686c679493b594d771222fc961eccd921fb),\n  by @MoOx, reported by @ArthurClemens\n\n- [`@phenomic/plugin-renderer-react:` Fix activeStyle for Link component (+ refactoring for internal/external links management)](https://github.com/phenomic/phenomic/commit/83b0181ae6444670b65703d65cce59cb3516b1a8),\n  by @MoOx\n"
  },
  {
    "path": "website/content/blog/2017-09-27-v1.0.0-alpha.10.md",
    "content": "---\ntitle: 1.0.0 Super Alpha X\ntag_name: v1.0.0-alpha.10\nlink: https://github.com/phenomic/phenomic/releases/tag/v1.0.0-alpha.10\nauthor: MoOx\nprerelease: true\n---\n\nBecause it’s a trend to skip version 9, we are bumping from alpha.8 to alpha.10\n(pronounced “alpha X”).\n\n![phenomic-x](https://user-images.githubusercontent.com/157534/30936524-72e91776-a3d4-11e7-8022-ef9338ce7d2a.jpg)\n\n---\n\n😍 Phenomic was already React 16 ready thanks to our architecture. We are now\nfully compatible (= no warnings)\n\n# 💥 2 minor breaking changes\n\n- [`@phenomic/reason`: `Link` component `toURL` prop is now `href`](https://github.com/phenomic/phenomic/commit/b126dc9dae6b57e2c49509577e45135b79ce7f21),\n  by @MoOx\n\n- `@phenomic/plugin-transform-markdown`: Anchor that was present by default have\n  been removed by default. See new feature at the end 😉\n\n## 🐛 Bugfixes\n\n- [`@phenomic/api-client`: Fix encoding issue for query with path + id](https://github.com/phenomic/phenomic/commit/34a223f9620f01ada8be75e832670292089c2a1a),\n  by @MoOx, reported by @ArthurClemens & @tleef (in\n  [#1168](https://github.com/phenomic/phenomic/issues/1168))\n\n- [`@phenomic/plugin-bundler-webpack`: react-helmet `renderStatic()` now works as expected](https://github.com/phenomic/phenomic/commit/f9ce59c8d3997592a14a6f0ad11d5c997edfee89),\n  by @MoOx, reported by @ArthurClemens & @hellais (in\n  [#1167](https://github.com/phenomic/phenomic/issues/1167))\n\n- [`@phenomic/reason`: pass all props to Link component](https://github.com/phenomic/phenomic/commit/2dd164f8a46e3514149d789dbf77b9364e50d12a),\n  by @MoOx\n\n- [`@phenomic/plugin-bundler-webpack`: ensure full glamor & aphrodite static rendering compatibility out of the box](https://github.com/phenomic/phenomic/commit/381b4490bb4b9418273958533ae46c2384b79044),\n  by @MoOx, reported by @owenhoskins\n\n## 👍 Improvements\n\n- [`@phenomic/plugin-renderer-react`: React 16 compatibility](https://github.com/phenomic/phenomic/commit/19a8246ffd1ec88b069340791659b862abc772c2),\n  by @MoOx, helped by @JulienPradet\n\n- [`@phenomic/babel-preset`: babel-preset-react-app to latest version](https://github.com/phenomic/phenomic/commit/137ca8c96b0033ac80300900e03cda7d65fb27a1),\n  by @MoOx, reported by @DominikGuzei (in\n  [#1162](https://github.com/phenomic/phenomic/issues/1162))\n\n- [`@phenomic/plugin-renderer-react`: avoid some warnings about some props that Link component pass to a tag](https://github.com/phenomic/phenomic/commit/a83b0d113364c4074ace5c21a55a281b4a541069),\n  by @MoOx\n\n## ✨ New (AWESOME) feature 🔥\n\n- [`@phenomic/plugin-transform-markdown`: allow custom markup](https://github.com/phenomic/phenomic/commit/1bd1d2f6f15a12082d07061bdc25d46aaae1b86f),\n  by @MoOx, reported by @MoOx, @bherila, @daine and @jfjessup (in\n  [#817](https://github.com/phenomic/phenomic/issues/817) &\n  [#1098](https://github.com/phenomic/phenomic/issues/1098)) This plugin now use\n  [unified](http://unifiedjs.github.io) directly instead of\n  [remark](https://github.com/wooorm/remark) so we can mix remark with\n  [rehype](https://github.com/wooorm/rehype) to allow custom markup. This will\n  open up usage of custom react components when rendering markdown tree with a\n  custom mapping. Anchor that was present by default have been removed. We will\n  introduce in next release a support for custom plugin passed from the config\n  to add it back.\n"
  },
  {
    "path": "website/content/blog/2017-09-30-v1.0.0-alpha.11.md",
    "content": "---\ntitle: v1.0.0 Super Alpha XI\ntag_name: v1.0.0-alpha.11\nlink: https://github.com/phenomic/phenomic/releases/tag/v1.0.0-alpha.11\nauthor: MoOx\nprerelease: true\n---\n\n## 💥 Minor breaking change\n\n- [`@phenomic/plugin-bundler-webpack`: upgrade to webpack@^3.0.0](https://github.com/phenomic/phenomic/commit/b5a9694528293af964dc75f3525ac71d2a5d2a3b),\n  by @MoOx, reported (in\n  [#1078](https://github.com/phenomic/phenomic/issues/1078)) This should not\n  create you any issue and upgrade should be transparent for you.\n\n## 🐛 Bugfix\n\n- [`@phenomic/cli`: Use a dump babel-preset-(env|react) to cover most use case for node executed code](https://github.com/phenomic/phenomic/commit/98bdfa4d053511090dbb75a9c3a2a437d9714245),\n  by @MoOx, reported by @benjaminshafii, @ArthurClemens & @DominikGuzei (in\n  [#1170](https://github.com/phenomic/phenomic/issues/1170))\n"
  },
  {
    "path": "website/content/blog/2017-10-11-v1.0.0-alpha.12.md",
    "content": "---\ntitle: v1.0.0-alpha.12\ntag_name: v1.0.0-alpha.12\nlink: https://github.com/phenomic/phenomic/releases/tag/v1.0.0-alpha.12\nauthor: MoOx\nprerelease: true\n---\n\n# 🎉 No breaking changes 🎉\n\nOnly good stuff!\n\nNotable additions & changes:\n\n## 🔥 New plugin\n\n- [`@phenomic/plugin-transform-asciidoc`: Create asciidoc transformer plugin using Asciidoctor.js](https://github.com/phenomic/phenomic/commit/807f296145e47a211488f09455b5162826fc4e41),\n  by @ezralalonde, requested by @kepinpin (in\n  [#1153](https://github.com/phenomic/phenomic/issues/1153))\n\n## 🌟 New Example\n\n**_⚠️ WARNING: This example can blow you mind as it can show you things you were\nnot prepared to. ⚠️_**\n\n- [React app with custom markdown tags rendered by custom react component](https://github.com/phenomic/phenomic/commit/9631a697f54b682a9bd9fd9eb1120101e9e41279)\n  by @MoOx\n\n## 🐛 Bugfixes\n\n- [`@phenomic/reason`: Bring bsconfig.json to the npm package](https://github.com/phenomic/phenomic/commit/b388e8ad0e17733898e09ec65eeba23617728e56),\n  by @bloodyowl, reported by @bloodyowl (in\n  [#1171](https://github.com/phenomic/phenomic/issues/1171)) and @rickyvetter So\n  now we can use reason package without any copy/paste/hack 🙃 Note that this\n  package is going to be exploded as a `preset-reason` that will contains\n  `plugin-renderer-reason` + `plugin-renderer-reason-react` in next release.\n\n- [`@phenomic/api-client`: correctly handle url without path (and protect path from query by id)](https://github.com/phenomic/phenomic/commit/bb2748162739faac0741637d111981bcab7569ef),\n  by @MoOx\n\n## 👍 Improvements\n\n- [`@phenomic/core`: Display a warning if no html files are generated during static build](https://github.com/phenomic/phenomic/commit/e8ffa26e65f9b353d4614e97baa891c5ec84f537),\n  by @MoOx, requested by @xuopled (in\n  [#1166](https://github.com/phenomic/phenomic/issues/1166))\n\n- [`@phenomic/core` + `@phenomic/api-client`: Make `path` parameter for query optional](https://github.com/phenomic/phenomic/commit/c6fdb5c48daec2955f64110c53ffa85363cc0b64),\n  by @MoOx (in [#1173](https://github.com/phenomic/phenomic/issues/1173))\n"
  },
  {
    "path": "website/content/blog/2017-10-19-v1.0.0-alpha.13.md",
    "content": "---\ntitle: v1.0.0-alpha.13\ntag_name: v1.0.0-alpha.13\nlink: https://github.com/phenomic/phenomic/releases/tag/v1.0.0-alpha.13\nauthor: MoOx\nprerelease: true\n---\n\n# 🎉 No breaking changes 🎉\n\nMain reason of this release is the scalability issue: you can now build a\nwebsite with hundreds of pages. Pre-rendering step takes around 4s for 1000\npages 😁\n\n## 🐛 Bugfix\n\n- [`@phenomic/core`: Fix issue when too many files are being transformed and contains undefined or null by adding a concurrency limit to hit API](https://github.com/phenomic/phenomic/commit/bc97c107aca59f46097e7b77cd6961d0f51462ea),\n  by @MoOx, reported by @ArthurClemens\n\n## 👍 Improvement\n\n- [`@phenomic/core`: Stop shallowing error from API server during static build](https://github.com/phenomic/phenomic/commit/928d67799ea36366b07784b53ef1ebbc0cc4a2d7),\n  by @MoOx, reported by @ArthurClemens\n\n## ✨ New feature\n\n- [`@phenomic/plugin-renderer-react`: expose html from `renderApp()` result](https://github.com/phenomic/phenomic/commit/24f301aca59c2ba0b368123b0304836596b3fbd2),\n  That allows CSS-in-JS to easily optimize (critical) CSS extraction. by @MoOx\n\n## 🌟 New Example\n\n- [`examples/react-app-styles-with-emotion`](https://github.com/phenomic/phenomic/commit/4855324ade822fb90c2b9b31fd0615231ac61765),\n  by @tgrecojs and @MoOx\n\n## 👌 Improved Examples\n\n- [`examples/react-app-styles-with-glamor`: critical css only](https://github.com/phenomic/phenomic/commit/561d59581a9fd3728ba65bbf505c1192fc3e4082),\n  by @MoOx\n\n- [`examples/react-app-styles-with-glamorous``: critical css only](https://github.com/phenomic/phenomic/commit/2ad218202c2b43349ed4762ca79bac001a61b76e),\n  by @MoOx\n"
  },
  {
    "path": "website/content/blog/2017-12-04-v1.0.0-alpha.14.md",
    "content": "---\ntitle: v1.0.0-alpha.14\ntag_name: v1.0.0-alpha.14\nlink: https://github.com/phenomic/phenomic/releases/tag/v1.0.0-alpha.14\nauthor: MoOx\nprerelease: true\n---\n\nWindows compatibility! Yeay! We can thanks [tretton37](http://tretton37.com)\nthat invited @MoOx to work on phenomic for an entire day with a dedicated team\nof developers (including @oscar-b, @emilpalsson and many more)!\n\n🎉 **[We can also thanks our backers](http://opencollective.com/phenomic) that\nare supporting us for a while! Thanks for believing in Phenomic!**\n\n---\n\n## If you are a JavaScript user 🎉 No breaking changes 🎉\n\n## If you are a ReasonML user 💥 _(minor) breaking change_ is expected 💥\n\n---\n\nNote that we replaced our database engine, to unlock new features in future\nreleases. This should not change anything for you, but if you have weird\ndifferences or behaviors, please reach us.\n\n---\n\n## 💥 Breaking changes\n\n- [`@phenomic/reason`: this plugin is deprecated](https://github.com/phenomic/phenomic/commit/4c9fb4a738ee1c26035e53d15ba8878298b9b26c)\n  by @MoOx You can now directly includes some packages instead of this one in\n  your `bsconfig.json`. See\n  https://github.com/phenomic/phenomic/blob/4c9fb4a738ee1c26035e53d15ba8878298b9b26c/examples/reason-react-app/bsconfig.json#L14-L16\n  You can remove this package from your `package.json`. Each packages should\n  have bs-bindings (or native reasonml code). If not, do not hesitate to open\n  issue or help us! Feel free to reach us on our\n  [chat](http://gitter.im/phenomic/phenomic) if you struggle updating.\n\n## 🐛 Bugfixes\n\n- [`@phenomic/plugin-collector-files`: Fix date parse from filename when using sub folders](https://github.com/phenomic/phenomic/commit/6a593daf159cc325c48d11efa10a9e19267b1bf6),\n  by @emilpalsson , reported by @dlindahl (in\n  [#1096](https://github.com/phenomic/phenomic/issues/1096))\n\n- [`@phenomic/plugin-bundler-webpack`: Make webpack follow configured outdir](https://github.com/phenomic/phenomic/commit/0e15e24121b2dc463437b0b9684d9264abd53bb9),\n  by @emilpalsson\n\n## 👍 Improvements\n\n- `@phenomic/core`: Full windows compatibility\n  ([433c63d](https://github.com/phenomic/phenomic/commit/433c63d723126707ba12f9f25deadf54fbbaa88c)\n  and\n  [f858688](https://github.com/phenomic/phenomic/commit/f85868832cd2ef2c096bbd71f60c6ba9f6e13c55))\n- [`@phenomic/core`: Gracefully handle if port is busy when starting dev server](https://github.com/phenomic/phenomic/commit/ac792d5bba85cbf73be9d01e9a68a73b2b8d2619),\n  by @oscar-b, reported by @DavidWells (in\n  [#897](https://github.com/phenomic/phenomic/issues/897))\n"
  },
  {
    "path": "website/content/blog/2017-12-04-v1.0.0-alpha.15.md",
    "content": "---\ntitle: v1.0.0-alpha.15\ntag_name: v1.0.0-alpha.15\nlink: https://github.com/phenomic/phenomic/releases/tag/v1.0.0-alpha.15\nauthor: MoOx\nprerelease: true\n---\n\n# 🎉 No breaking changes 🎉\n\n## 🐛 Bugfix\n\n- [`@phenomic/core`: Prevent watcher from crashing when a file is renamed (or saved with vim)](https://github.com/phenomic/phenomic/commit/a132ad03d5cec522703c2b95160a0b1eaebf5d18),\n  by @hugmanrique, reported by @ArthurClemens (in\n  [#1157](https://github.com/phenomic/phenomic/issues/1157)) and @drazik (in\n  [#1208](https://github.com/phenomic/phenomic/issues/1208)) (#1211)\n"
  },
  {
    "path": "website/content/blog/2017-12-06-v1.0.0-alpha.16.md",
    "content": "---\ntitle: v1.0.0-alpha.16\ntag_name: v1.0.0-alpha.16\nlink: https://github.com/phenomic/phenomic/releases/tag/v1.0.0-alpha.16\nauthor: MoOx\nprerelease: true\n---\n\n# 🎉 No breaking changes 🎉\n\n## 🐛 Reason fix\n\nOoops! We forgot to publish `bsconfig.json` files for new reason packages. Fixed\nby @MoOx in\n[#19746b6](https://github.com/phenomic/phenomic/commit/19746b622f69359097c28182ac709e73dfec0cd9),\nreported by @Essential\n"
  },
  {
    "path": "website/content/blog/2017-12-06-v1.0.0-alpha.17.md",
    "content": "---\ntitle: v1.0.0-alpha.17\ntag_name: v1.0.0-alpha.17\nlink: https://github.com/phenomic/phenomic/releases/tag/v1.0.0-alpha.17\nauthor: MoOx\nprerelease: true\n---\n\n# 🎉 No breaking changes 🎉\n\n## 🐛 Reason fix, round 2\n\nOoops! We forgot to publish `.re` files for new reason packages. Fixed by @MoOx\nin\n[#e010f0f](https://github.com/phenomic/phenomic/commit/e010f0fc257dceac19f57e5bf2e938d0d2f5e1f2)\n"
  },
  {
    "path": "website/content/blog/2017-12-20-v1.0.0-alpha.18.md",
    "content": "---\ntitle: v1.0.0-alpha.18\ntag_name: v1.0.0-alpha.18\nlink: https://github.com/phenomic/phenomic/releases/tag/v1.0.0-alpha.18\nauthor: MoOx\nprerelease: true\n---\n\n- 🐛 `@phenomic/core`: various regression to database introduced in\n  `v1.0.0-alpha.14` by @MoOx\n\n* 💥\n  [`@phenomic/plugin-collector-files`: remove specific code for `author` field automatically associated with `authors` in the database](https://github.com/phenomic/phenomic/commit/2e2b3e17e21a51c933e4437be7e92b7eeac55778),\n  by @MoOx\n\nIf you were previously relying on the fact that the meta `author` from a file\nwas magically resolved to a possible `authors` from your database, you should\ninstead rely on the generic behavior that works with identical names. This means\nyou should change `author: \"name\"` to `authors: [\"name\"]`. This will produce the\nsame magic resolution when retrieving content from a single (`id` based) query.\nIf you really want the old behavior back, we should think about a generic\nsolution. So please open an issue.\n"
  },
  {
    "path": "website/content/blog/2018-01-11-v1.0.0-alpha.19.md",
    "content": "---\ntitle: v1.0.0-alpha.19\ntag_name: v1.0.0-alpha.19\nlink: https://github.com/phenomic/phenomic/releases/tag/v1.0.0-alpha.19\nauthor: MoOx\nprerelease: true\n---\n\n# 💥 Includes _Breaking changes_ for Reason users.\n\nThis release is mostly a bunch of improvements (with a minor breaking change)\nfor Reason users in addition to a bugfix for an edge case.\n\n## 💥 Breaking changes (Reason only)\n\n- [`@phenomic/plugin-renderer-react`: (Reason) `jsEdgeToReason` is now `jsEdge`](https://github.com/phenomic/phenomic/commit/6599f41d4139c430801b44a2e043b60f29a1f4bd),\n  by @MoOx There is no transformation anymore. Transformation should be made in\n  your component. This change is accompanied with a new type to help you (see\n  `jsNodeList` type below). We highly recommend you to take a look to the\n  updated example. See below for more details.\n\n## 🐛 Bugfixes\n\n- [`@phenomic/core`: support query without path for prerendering as it’s supported by database](https://github.com/phenomic/phenomic/commit/a32c7dbd095ba16c703e71d30a935f5d509db81f),\n  by @MoOx\n\n## ⚠️ Deprecation\n\n- [`hasPreviousPage` & `hasNextPage` are deprecated](https://github.com/phenomic/phenomic/commit/69361b82c856f30727ec5588b098f31831be5637),\n  by @MoOx Please test directly the existence of `previous` and `next`. It will\n  continue to work for a while, but will be remove some day. _This is to make it\n  more straight forward to use pagination in Reason._\n\n## 💪 Improvements\n\n- [`@phenomic/core`: `previousPageIsFirst` now always return a value (`false` instead of `undefined`)](https://github.com/phenomic/phenomic/commit/e12b53d464c005e8bf44d66a58099f886870aff8),\n  by @MoOx _This is to make it more straight forward to use pagination in\n  Reason._\n\n- [`@phenomic/plugin-renderer-react`: (Reason) expose `jsNodeList` type](https://github.com/phenomic/phenomic/commit/3d0f24c7e96857d614d3ae1478ce59626f2ea65a),\n  by @MoOx It is the type of data that comes from list queries.\n\n## 👌 Improved Example (Reason)\n\n@MoOx worked a lot on the `examples/reason-react-app`:\n\n- upgrade to reason-react 0.3.1\n- we switched to es6 for bs generated files\n- we added pagination, like in the JavaScript example\n- we added react-helmet usage (via bs-react-helmet)\n- we reorganized the code and added tiny helpers\n\n---\n\n♥️ If you have questions, recommendations or improvements to submit, you can\nreach us on our [chat](https://gitter.im/phenomic/phenomic) or via the\n[issues](https://github.com/phenomic/phenomic/issues/new)\n"
  },
  {
    "path": "website/content/blog/2018-01-24-v1.0.0-alpha.20.md",
    "content": "---\ntitle: v1.0.0-alpha.20\ntag_name: v1.0.0-alpha.20\nlink: https://github.com/phenomic/phenomic/releases/tag/v1.0.0-alpha.20\nauthor: MoOx\nprerelease: true\n---\n\n- [💥 `@phenomic/plugin-bundler-webpack`: remove react-native-web alias for react-native as latest version (0.3.x) rely on babel plugin](https://github.com/phenomic/phenomic/commit/3659957b08b1b983f902af0d4a1d93d7d54e2864),\n  by @MoOx\n\n- [🐛 `@phenomic/plugin-bundler-webpack`: fix react-native-web styles prerendering issues with latest version (0.3.x))](https://github.com/phenomic/phenomic/commit/d51090852dab5dc750f4b92ceb0b0c0e4134389d),\n  by @MoOx\n\n- [🐛 `@phenomic/plugin-bundler-webpack`: stop hiding user webpack issues](https://github.com/phenomic/phenomic/commit/242f6c5eac2a009dc42bcdb73b59feed8e82b64b),\n  by @MoOx, reported by @thangngoc89 (in\n  [#1216](https://github.com/phenomic/phenomic/issues/1216))\n"
  },
  {
    "path": "website/content/blog/2018-03-08-v1.0.0-beta.0.md",
    "content": "---\ntitle: v1.0.0-beta.0\ntag_name: v1.0.0-beta.0\nlink: https://github.com/phenomic/phenomic/releases/tag/v1.0.0-beta.0\nauthor: MoOx\nprerelease: true\n---\n\nWe are on the road to final 1.0.0!\n\nWhat is planned:\n\n- We only plan to add an new generic API to fetch any kind of data (like\n  `async getInitialProps` in Next.js) & a few minor improvements.\n- We will also soon publish a few benchmarks between some well known others\n  static site gen (that might reveal things…).\n- We will try to add a bunch of plugins to show the world what Phenomic can\n  really do.\n\nIf you have any question you can ask us on\n[Spectrum](https://spectrum.chat/phenomic) or on\n[Gitter](https://gitter.im/MoOx/phenomic).\n\n## Core\n\n- [🚨 `@phenomic/core`: `dist` option is now relative to `path`](https://github.com/phenomic/phenomic/commit/24657cc6b9b85e725d25f2dd5bb82367a2956b59)\n  by @MoOx\n- [✨ `@phenomic/core`: introduce `content` option to folder for the content](https://github.com/phenomic/phenomic/commit/24657cc6b9b85e725d25f2dd5bb82367a2956b59)\n  by @MoOx\n- [🐛 `@phenomic/core`: correctly throw fetch error during static build](https://github.com/phenomic/phenomic/commit/141a6cbb0fa51426685e3f5ca8e4274a87f35b64)\n  by @MoOx\n- [🐛 `@phenomic/core`: add missing API entry points for queries without path](https://github.com/phenomic/phenomic/commit/d0572d3ac6c817f64e6cb7680595e5db2e458bbd)\n  by @MoOx\n\n## ReasonML\n\n- Use bs-platform@^2.2.0\n- [🐛 `@phenomic/plugin-renderer-react`: Fix jsEdge Errored state that was never in this state](https://github.com/phenomic/phenomic/commit/7efdffa78defb974d0f2ff9bbfd1cd47af7dbe23),\n  by @MoOx\n- [🐛 `@phenomic/plugin-renderer-react`: Remove unneeded div around bodyRenderer](https://github.com/phenomic/phenomic/commit/9c6fb6627cb6b075267f367b0a0d3541975da38d),\n  by @ulrikstrid\n- [🐛 `@phenomic/plugin-renderer-react`: (reason) Fix return type for query builder](https://github.com/phenomic/phenomic/commit/a54a78e1dfa7a6138a488103ded6816891f8ed90),\n  by @bloodyowl, reported by @ulrikstrid (in\n  [#1230](https://github.com/phenomic/phenomic/pull/1230))\n- [✨ `examples/reason-react-app`: handle error pages](https://github.com/phenomic/phenomic/commit/b0f585622dd6eec1d553d6545cd2ee0716d504f5),\n  by @MoOx\n\n## Website\n\n- Remove sites in the showcase that were not using Phenomic anymore (or where\n  unavailable). We used a script to detect Phenomic on those website that we\n  will run periodically. by @MoOx\n- Move the website from `docs` to `website` folder, more clear for contributors\n  by @MoOx\n- Add a link to our new [Spectrum community](https://spectrum.chat/phenomic) (by\n  @mxstbr)\n- Add favicons & friends\n\n## Internal\n\n- Migration to Circle CI 2.0\n- Readme update\n- PNGs logo added into git repo (previously only sketch & svgs were available)\n"
  },
  {
    "path": "website/content/blog/2018-03-30-v1.0.0-beta.1.md",
    "content": "---\ntitle: v1.0.0-beta.1\ntag_name: v1.0.0-beta.1\nlink: https://github.com/phenomic/phenomic/releases/tag/v1.0.0-beta.1\nauthor: MoOx\nprerelease: true\n---\n\nThis release might include breaking changes for you.\n\nThis is one of the final step before stable 1.0.0! The breaking changes included\nin this release are for the best. We have worked hard so you can be able to use\nsimple options for plugins, exactly like babel. More on this below.\n\n**If you use `@phenomic/preset-react-app` without any customisation, you are\nprobably all good**\n\n- Just be careful if you where using JSON\n- If you code was working without any warning, you don’t have anything to do\n  except looking for `hasNextPage` & `hasPreviousPage`. If you were still using\n  those, just replace your test with the presence of next`or`previous` directly.\n\n**If your are using custom plugins, you will have to update some signatures.**\n\n## 🚨Breaking changes\n\n[🚨 Remove deprecated attributes for pagination and routes](https://github.com/phenomic/phenomic/commit/fe68e8c94db3054d68582f4cbb68b86e63eb6b2c)\nby @MoOx\n\n[🐛 🚨 `@phenomic/plugin-transform-json`: support array by passing all js on as data (+use a partial version is accessible)](https://github.com/phenomic/phenomic/commit/84e3abd928779a734779e1b6a61eb9006cb28e05)\nby @MoOx\n\nPreviously, using JSON files that were array was broken. We were spreading JSON\nlike if it was an object. We adjusted the behavior that might affect `partial`\n(when you fetch list via queries) if you had a \"partial\" entry in your JSON\n(edge case). Reach us on our community tools if you struggle updating.\n\n[🚨 `@phenomic/plugin-transform-markdown`: upgrade to gray-matter@3](https://github.com/phenomic/phenomic/commit/cba0e43521c98d7bf789e7bf472abb141c1f84e1)\nby @MoOx\n\nIf you are using something else than JSON, YAML of JavaScript in your\nfront-matter, please open an issue so we can improve the situation so we can\nwork on allowing `engine` option\nhttps://www.npmjs.com/package/gray-matter#optionsengines\n\n[🚨 `@phenomic/core`: `collect` method for plugin should now be `collectFile`.](https://github.com/phenomic/phenomic/commit/2d2f806cfee35aa6fa21d88ba5465bb37dad8119)\nby @MoOx\n\n[🚨 `@phenomic/core`: many plugin methods have their signature that have been updated](https://github.com/phenomic/phenomic/commit/2d2f806cfee35aa6fa21d88ba5465bb37dad8119)\nby @MoOx\n\nPlease check flow definitions until docs is online (major change is that config\nis not send since plugin receive it when it's created). All signatures for\nplugin have been adjusted. Please take a look if you are a plugin author. See\nhttps://github.com/phenomic/phenomic/blob/954fbe16f20a51af90cbd6a25502da1426e4bdc5/flow-typed/phenomic.js#L159-L202\n\n## ✨ New features and improvements\n\n[✨ `@phenomic/*`: we can now configure every plugins from phenomic config.](https://github.com/phenomic/phenomic/commit/2d2f806cfee35aa6fa21d88ba5465bb37dad8119)\nby @MoOx\n\nSee last item of this list to see an example ;)\n\n[✨ `@phenomic/core`: support `baseUrl` option in configuration](https://github.com/phenomic/phenomic/commit/edfefa9488c656a21a01d7c691bd9629de975449)\nby @MoOx\n\nYou can now send a baseUrl in phenomic configuration. This allow website to work\nat a folder level of a domain (eg: http://domain.tld/root/).\n\n```json\n{\n  \"baseUrl\": \"http://mydomain.com/root-of-my-site/“,\n  \"presets\": [\"@phenomic/preset-react-app\"]\n}\n```\n\n**Note that this will directly be reflected during development for your mental\nhealth! This means you will have to open\n`http://localhost:3333/root-of-my-site/`**\n\n[✨ `@phenomic/core`: support .env(.\\_)? files for PHENOMIC\\_\\_ env vars](https://github.com/phenomic/phenomic/commit/62378ca14bc87365b5b2b0448254b64acdce1944)\nby @MoOx\n\nLike CRA support `REACT_APP_*` env var to be passed over to your JavaScript\nduring compilation, you will have access to `PHENOMIC_*` var that you can define\nfrom .env files. We are using https://github.com/motdotla/dotenv hunder the\nhood.\n\n[✨ `@phenomic/core`: we added a new plugin api so any plugin can add static or dynamic url on runtime (`resolveURLs`)](https://github.com/phenomic/phenomic/commit/2d2f806cfee35aa6fa21d88ba5465bb37dad8119)\nby @MoOx\n\n[✨ `@phenomic/core`: `renderStatic` is now not limited to a single plugin. Multiples plugins (those that have a `resolveURLs` can now render static files).](https://github.com/phenomic/phenomic/commit/2d2f806cfee35aa6fa21d88ba5465bb37dad8119)\nby @MoOx\n\n[✨ `@phenomic/api-client`: `import fetchRestApi from \"@phenomic/api-client/lib/fetch\";` to fetch phenomic api directly.](https://github.com/phenomic/phenomic/commit/2d2f806cfee35aa6fa21d88ba5465bb37dad8119)\nby @MoOx\n\nThis method is mostly for plugin developers. Calling this method should be made\nwith `import query from \"@phenomic/api-client/lib/query”;`. Be careful to use\nthis method wisely as it won’t be magically pre-rendered for all end point\nunless a plugin handle the static rendering of the resource.\n\n[✨ `@phenomic/plugin-bundler-webpack`: respect `baseUrl` option](https://github.com/phenomic/phenomic/commit/edfefa9488c656a21a01d7c691bd9629de975449)\nby @MoOx\n\n[✨ `@phenomic/plugin-bundler-webpack`: inject NODE*ENV + PHENOMIC*\\* env var (PHENOMIC_ENV & PHENOMIC_APP_BASENAME for now)](https://github.com/phenomic/phenomic/commit/edfefa9488c656a21a01d7c691bd9629de975449)\nby @MoOx\n\n[✨ `@phenomic/plugin-renderer-react`: expose enhanced Link component that respect `baseUrl` option](https://github.com/phenomic/phenomic/commit/edfefa9488c656a21a01d7c691bd9629de975449)\nby @MoOx\n\n[✨ `@phenomic/plugin-rss-feed`: this is now a thing and can generate multiples feed](https://github.com/phenomic/phenomic/commit/4584963559c0ef9e71612e709b14b9006085ffed)\nby @MoOx\n\nExample of the config for Phenomic website\n\n```json\n{\n  \"baseUrl\": \"http://phenomic.io/\",\n  \"presets\": [\"@phenomic/preset-react-app\"],\n  \"plugins\": [\n    [\n      \"@phenomic/plugin-rss-feed\",\n      {\n        \"feeds\": {\n          \"feed.xml\": {\n            \"feedOptions\": {\n              \"title\": \"Phenomic.io\",\n              \"description\": \"Phenomic news\"\n            },\n            \"query\": { \"path\": \"news\", \"limit\": 20 }\n          }\n        }\n      }\n    ]\n  ]\n}\n```\n\n📝 Various minor docs improvements by @getDanArias\n"
  },
  {
    "path": "website/content/blog/2018-04-07-v1.0.0-beta.2.md",
    "content": "---\ntitle: 1.0.0-beta.2\ntag_name: v1.0.0-beta.2\nlink: https://github.com/phenomic/phenomic/releases/tag/v1.0.0-beta.2\nauthor: MoOx\nprerelease: true\n---\n\n# Stable 1.0.0, we are almost there!\n\nThis release is probably the penultimate before the stable release. It brings us\n2 majors things:\n\n- 🎉 For React users, 2 methods, supported via the new `withInitialProps` HOC,\n  allows you to consume any kind of data (not just Phenomic API but any kind of\n  REST APIs, GraphQL APIs for CMS etc) via `static async getInitialProps()`.\n  This API, inspired by Next.js is not alone as it comes with another new method\n  for the pre-rendering step, called `static async getAllPossibleUrls()`.\n- 💪 We adjusted 2 transform plugins (markdown and asciidoc) so you can directly\n  pass to those the [unified](https://unifiedjs.github.io) plugins you want to\n  use.\n\nThis release is an important step for us as it brings us our missing pieces to\nbe happy with Phenomic current state. Stay tuned for the final release, that\nwill be done at the same time as we will publish documentations on the website.\n\n🤩 We also created a new\n[react-app-blog](https://github.com/phenomic/phenomic/tree/master/examples/react-app-blog)\nexample that you can use as a good starting point to create any site (not only a\nblog - and we plan to push more examples when we will hit stable 1.0.0). This\nstarter includes some pages, some posts, and the usage of our new fresh API to\ncreate pages from github data (but you can just use this and replace with any\nkind of API) to generate client side and static generated pages from those data!\nFor the architecture, we used something simple, with a few components for\nheader/footer with differents layouts etc. We also included a standard error\npage (used for 404). For the styling, we didn't wanted to do something too\nopinionated and also something too old school (CSS in dedicated files since we\nall love CSS-in-JS), so we took an simple approach in the middle, with a CSS\nstyle tags per components. This allows CSS lover to just extract the CSS in\nfiles, and CSS-in-JS lovers to easily convert in places the styles. Remember\nthat we have\n[plenty of examples to know how to handle CSS via any kind of solutions](https://github.com/phenomic/phenomic/tree/master/examples).\nYou will find a visual preview at the end of this post.\n\n## Details\n\n[⚠️ `@phenomic/plugin-renderer-react`: `createContainer` is now `withPhenomicApi`(you will get a warning until you update your import)](https://github.com/phenomic/phenomic/commit/a4e12968f9d8d871e82e24d14c5b11cd4d1b6f59)\nby @MoOx Not a breaking change yet, but will be during stable 1.0.0 release.\n\n[🐛 `@phenomic/plugin-collector-files`: fix edge case when you request an index file with an id (db was not correctly filled)](https://github.com/phenomic/phenomic/commit/a8648fcf5de98d21024d5853f56b7f9cdf08859f)\nby @MoOx\n\n[🐛 `@phenomic/core`: fix edge case when you request an empty id (for `index`)](https://github.com/phenomic/phenomic/commit/17f830a6a4a35956ec67d665b9e6036932c2bb70)\nby @MoOx\n\n[🐛 `@phenomic/core`: fix time log between pre-rendering and after build hook](https://github.com/phenomic/phenomic/commit/4888896f4614e2cf45130358adde771ccd1dbf5e)\nby @MoOx\n\n[🐛 `@phenomic/plugin-transform-markdown`: code is now highlighted without failing if language is not recognized](https://github.com/phenomic/phenomic/commit/dd24918679b4acb5316b261bf3e032f8f305263c)\nby @MoOx\n\n[🚨`@phenomic/plugin-transform-markdown`: remark/rehype plugins order have been changed a bit](https://github.com/phenomic/phenomic/commit/dd24918679b4acb5316b261bf3e032f8f305263c)\nby @MoOx This should only affect you if you were relying on (previously broken)\ncode highlight.\n\n[🚨/✨ `@phenomic/plugin-transform-asciidoc`: plugin have been update to work like markdown.](https://github.com/phenomic/phenomic/commit/dd24918679b4acb5316b261bf3e032f8f305263c)\nby @MoOx Previously we never tested this plugin on a real project so we are not\nsure it has ever worked correctly 😁.\n\n[✨ `@phenomic/plugin-transform-markdown`: you can now specifiy options for highlighting language unsupported by default](https://github.com/phenomic/phenomic/commit/dd24918679b4acb5316b261bf3e032f8f305263c)\nby @MoOx\n\n[✨ `@phenomic/plugin-transform-markdown`: you can now choose between json/html mode for the rendering via `output` option](https://github.com/phenomic/phenomic/commit/dd24918679b4acb5316b261bf3e032f8f305263c)\nby @MoOx\n\n[✨ `@phenomic/plugin-transform-markdown`: new `plugins` option to replace unified/remark/rehype plugins](https://github.com/phenomic/phenomic/commit/dd24918679b4acb5316b261bf3e032f8f305263c)\nby @MoOx\n\n[✨ `@phenomic/plugin-transform-asciidoc`: you can now choose between json/html mode for the rendering via `output` option](https://github.com/phenomic/phenomic/commit/dd24918679b4acb5316b261bf3e032f8f305263c)\nby @MoOx\n\n[✨ `@phenomic/plugin-transform-asciidoc`: new `plugins` option to replace unified/remark/rehype plugins](https://github.com/phenomic/phenomic/commit/dd24918679b4acb5316b261bf3e032f8f305263c)\nby @MoOx\n\n[✨ `@phenomic/helpers-transform`: new package that exposes stuff shared across transform plugin](https://github.com/phenomic/phenomic/commit/dd24918679b4acb5316b261bf3e032f8f305263c)\nby @MoOx\n\n[✨ `@phenomic/plugin-renderer-react`: `withInitialProps` HOC that supports `static async getInitialProps({pathname, params})` and `static async getAllPossibleUrls({path})`](https://github.com/phenomic/phenomic/commit/a4e12968f9d8d871e82e24d14c5b11cd4d1b6f59)\nby @MoOx This allows to generate pages with any source of data (fetch from any\nkind of REST, Grapql APIs). Inspired by Next.js.\\\nYou can check our [example of usage in our react-app-blog example](https://github.com/phenomic/phenomic/commit/955abe1bf398109188587f2f30395352cdb7fb2a#diff-bd62372cd295cbc2187ac3152a4745bcR24)\n\n[✨ `@phenomic/plugin-renderer-react`: `withPhenomicApi` HOC (previously named `createContainer`)](https://github.com/phenomic/phenomic/commit/a4e12968f9d8d871e82e24d14c5b11cd4d1b6f59)\nby @MoOx\n\n[🎉 examples/react-app-blog: a sweet starter to discover phenomic with react and make a blog in a few minutes](https://github.com/phenomic/phenomic/commit/4e52d7c409c422d01856af24b9845c2cb4ee621c)\nby @MoOx\n\n## Preview of the homepage of the new react-app-blog example\n\n[![preview](https://user-images.githubusercontent.com/157534/38459800-d22f4932-3aae-11e8-9af8-b2169c87f7ee.png)](https://github.com/phenomic/phenomic/tree/master/examples/react-app-blog)\n"
  },
  {
    "path": "website/content/blog/2018-05-22-v1.0.0-beta.3.md",
    "content": "---\ntitle: 1.0.0-beta.3\ntag_name: v1.0.0-beta.3\nlink: https://github.com/phenomic/phenomic/releases/tag/v1.0.0-beta.3\nauthor: MoOx\nprerelease: true\n---\n\n# Hopefully, the last beta\n\nWe are very close to our final and stable release for v1. Why we didn't ship\nthis version already? Some people like to move fast & break things. But we\nwanted to have a correct design for the v1 so future majors version won't break\ntoo much things.\n\nWhat we did for v0.x was an experiment and we learned a lot of things by running\nthis in production on moderate websites. We have spent a lot of brain energy to\nmake a scalable & flexible solution with a small API surface.\n\nWe have designed an architecture that follow React way of thinking, by offering\na [centralized lifecycle](/en/packages/core/docs/writing-plugins/). With that in\nmind we have adjusted our goal and make React & Webpack, 2 core pieces of v0.x,\nfirst class plugins in our v1.x. This opens up lot of nice things to support\nReact or Webpack alternatives.\n\n## Documentation is a work in progress 🎉\n\nFirst thing to celebrate, we started to work on our website! You can now find\n[documentation for the core](/en/packages/core/docs/) and the\n[react preset tutorial](/en/packages/preset-react-app/docs/)! More things will\nfollow!\n\n## 2 small breaking changes\n\nBelow you will find 2 small breaking changes, **very easy to adjust** (that will\nprobably consist of adding `content` in front of all your current existing query\nto our content api or to adjust your configuration).\n\n[🚨 `@phenomic/core`: `content` options now supports multiples entries and globs ](https://github.com/phenomic/phenomic/commit/05ef940603981bb9971b02234a31e601d29067f7)\n(+\n[fixup](https://github.com/phenomic/phenomic/commit/c79b572fa9c54cf88419dac1f6367e3cd5a5c0ef))\nby @MoOx\n\n**All your previous queries won't work with this breaking change** but don't\nworry, it's very easy to adjust your code.\n\nWe are sorry to add a breaking change now, but it's for the better.\n\n**Solution 1 (recommended)**: You will have to add \"content/\" in front of all\nyour `path` in your queries. Why? It's for being more explicit and also be able\nto support multiples sources (multiples folders) to avoid duplicate names\nwithout a weird configuration. The upgrade is pretty easy.\n\nFor example\n\n```js\nconst HomeContainer = withPhenomicApi(Home, props => ({\n  posts: query({\n    path: \"posts\",\n  }),\n}));\n```\n\nWill become\n\n```js\nconst HomeContainer = withPhenomicApi(Home, props => ({\n  posts: query({\n    path: \"content/posts\",\n  }),\n}));\n```\n\n**Solution 2 (for lazy people)**: You can keep the previous behavior very easily\nby using this value for `content` option:\n`\"\": {root: \"content\", globs: [\"**/*\"]}`. You can throw that in your\n`package.json` in a `phenomic` like this:\n\n```json\n  \"phenomic\": {\n    \"content\": {\n      \"\": {root: \"content\", globs: [\"**/*\"]}\n    },\n    \"presets\": [\"@phenomic/preset-react-app\"]\n  }\n```\n\n[🚨 `@phenomic/plugin-rss-feed`: now lookup in `content/posts` by default. ](https://github.com/phenomic/phenomic/commit/05ef940603981bb9971b02234a31e601d29067f7)\nby @MoOx\n\nTo get previous behavior back, just use this configuration (adjust to match\nyours):\n\n```json\n  \"phenomic\": {\n    \"presets\": [\"@phenomic/preset-react-app\"],\n    \"plugins\": [\n      [\n        \"@phenomic/plugin-rss-feed\",\n        {\n          \"feeds\": {\n            \"feed.xml\": {\n              \"query\": {\n                \"path\": \"content/posts\"\n              }\n            }\n          }\n        }\n      ]\n    ]\n  },\n```\n\n## Bugfixes\n\n[🐛 `@phenomic/plugin-renderer-react`: Handle scroll like it should (to top or to the hash if any) ](https://github.com/phenomic/phenomic/commit/d4824c531073e31fa1b74f45bbdaf7db1ba642e3)\nby @MoOx\n\n[🐛`phenomic/plugin-collector-files`: correctly clean extensions from filename for id (not only md|json but all extensions by the plugin loaded at runtime) ](https://github.com/phenomic/phenomic/commit/b924d0bca097ba31e9f38c0c0a35c68fa98865ae)\nby @MoOx\n\n## Tons of small improvements\n\nAs we started to actively working on our documentation, we have added tons of\nsmall improvements.\n\n[✨ `@phenomic/plugin-renderer-react`: add render + callback option to createApp/renderApp for custom rendering ](https://github.com/phenomic/phenomic/commit/ce083d92f7abced22dbc8a2884649a92f47cdf41)\nby @MoOx\n\nThis commit allows you to use a custom render() function. This way to render the\napp is required by some solutions that needs a custom wrapper for styles\npre-rendering (eg: react-native-web).\n\n[🎉 examples/react-native-web-app ](https://github.com/phenomic/phenomic/commit/dd9d19f6e3a5dba60e7262311c8eb060d8661070)\nby @MoOx\n\n[✨ `@phenomic/core`: add socketPort option (and switch to 3334 since 1415 can be used by dbstar) ](https://github.com/phenomic/phenomic/commit/645c89977f955b619c7bb9018f08f0d3259a379a)\nby @MoOx\n\n[✨`@phenomic/core`: Improve error shown from database access ](https://github.com/phenomic/phenomic/commit/4df49e34e6eeef33e0676f5293933d67db8daa3c)\nby @MoOx\n\n[✨ `@phenomic/core`: Improve error message from database not found entry ](https://github.com/phenomic/phenomic/commit/fc729aa0dee61d2fc81b5b294f583f705bf40bf6)\nby @MoOx\n\n[🔥 Add a new helper to extract meta from body nodes (title + headings list) ](https://github.com/phenomic/phenomic/commit/da0d4da4d5a39c865dd68d78a14ee3533adcb943)\n(+\n[fixup](https://github.com/phenomic/phenomic/commit/1b68eff0c6a0e299da3e3c7a9c897cc4338525aa))\nby @MoOx\n\nThis helper is used in `@phenomic/plugin-transform-markdown` and\n`@phenomic/plugin-transform-asciidoc` to **automatically add a `title` meta**\neven if you don't have frontmatter. Pretty cool for files that you don't\ncontrol. This helper also returns a list of headings in your content, which is\npretty convenient to make a **table of content** at the top of you page or in a\nsidebar.\n\n[✨ `@phenomic/plugin-transform-markdown`: add title fallback extracted from markdown body if no title is in the frontmatter + add a list of markdown headings ](https://github.com/phenomic/phenomic/commit/3f35a51dc09f5a00cb2ad3d268d820563addbcab)\n(+\n[fixup](https://github.com/phenomic/phenomic/commit/1b68eff0c6a0e299da3e3c7a9c897cc4338525aa))\nby @MoOx\n\n[✨ `@phenomic/plugin-transform-asciidoc`: add title fallback extracted from markdown body if no title is in the frontmatter + add a list of markdown headings ](https://github.com/phenomic/phenomic/commit/3f35a51dc09f5a00cb2ad3d268d820563addbcab)\n(+\n[fixup](https://github.com/phenomic/phenomic/commit/1b68eff0c6a0e299da3e3c7a9c897cc4338525aa))\nby @MoOx\n\n[✨ `@phenomic/plugin-transform-json`: add title fallback ](https://github.com/phenomic/phenomic/commit/3f35a51dc09f5a00cb2ad3d268d820563addbcab)\nby @MoOx\n\n[✨ `@phenomic/core`: better display in case of error during start/build ](https://github.com/phenomic/phenomic/commit/ef32bb098a9a561aa483d2267a355c20f3a69beb)\nby @MoOx\n\n[✨ `@phenomic/core`: add options to sort db results ](https://github.com/phenomic/phenomic/commit/a1f869ab5669083073dcdb310a1c86bfa87b213b)\nby @MoOx\n\nThis feature is pretty awesome and allows you to add custom order to your query.\nAs a good example, we wanted to sort our showcase with the following algorithm:\n\n- Sites with a flag `curated` first\n- Sites with many tags\n- Sites with tags \"blog\" at the end.\n\nIn order to do so, we have introduced this option and we hope you will like it.\nYou can check out the\n[documentation for `db.sortFunctions`](/en/packages/core/docs/configuration/#dbsortfunctions)\nand take a look to the\n[one we use for the showcase](https://github.com/phenomic/phenomic/blob/801c2ad9720cb17cb599597f0dc1e020e1b581b9/website/phenomic.config.js#L32-L52).\n\n[✨ `@phenomic/cli`: add preview command ](https://github.com/phenomic/phenomic/commit/88c10b94c26830b2c2397da2fc2477f6175e5626)\nby @MoOx\n\n[✨ `@phenomic/core`: add preview command to build & serve results ](https://github.com/phenomic/phenomic/commit/c2e0ecc9c7d6d75b4817eb7551dc690e4280081f)\nby @MoOx\n\nNow you can run\n\n```console\nphenomic preview\n```\n\nThis will build and serve the website, to mimic production (as you will have the\npre-rendered files and the client side reconciliation).\n"
  },
  {
    "path": "website/content/blog/2018-10-27-v1.0.0-beta.4.md",
    "content": "---\ntitle: 1.0.0-beta.4\ntag_name: v1.0.0-beta.4\nlink: https://github.com/phenomic/phenomic/releases/tag/v1.0.0-beta.4\nauthor: MoOx\nprerelease: true\n---\n\nThis is a minor beta that only brings the following:\n\n- Add `PHENOMIC_APP_BASEURL` env variable (entire `baseUrl` option as a string)\n  (in\n  [3799fa8](https://github.com/phenomic/phenomic/commit/3799fa8571c7162d92b724a1dcb5d4aade009dde)\n  by @MoOx)\n- `@phenomic/plugin-rss-feed`: fail with a http 500 if rss feed fail to be\n  generated (in\n  [26c8d95](https://github.com/phenomic/phenomic/commit/26c8d959625a51d030859e0bbb8d991cb4301079)\n  by @MoOx)\n- `@phenomic/plugin-bundler-webpack`: Make root for App.js configurable (in\n  [78ecd47](https://github.com/phenomic/phenomic/commit/78ecd47dda0fa0d9ed586c3054a82c5df3bb9577)\n  by @airtonix)\n- `@phenomic/plugin-renderer-react`: fix issues with class attributes (coming\n  from markdown) (in\n  [927aea2](https://github.com/phenomic/phenomic/commit/927aea249c8b279fd178dc9b5aa2a809e83c7151)\n  by @MoOx)\n- Internal refactoring by @MoOx\n\nWebsite has been a WIP for a few month now, mostly due to a break @MoOx took\nfrom his keyboard.\n\nStable 1.0.0 is missing a change for the database engine that is currently\ncausing performance issues _during development_ as soon as you get a hundred of\npages. All efforts are currently on this improvement.\n\n## For Reason users\n\n- Upgrade `bs-platform` to 4.x and `reason-react` to 0.5.x (in\n  [6067bc9](https://github.com/phenomic/phenomic/commit/6067bc9c94b0cc525829739d5cb9c8076cdc4599),\n  [1e4de9a](https://github.com/phenomic/phenomic/commit/1e4de9ad1e126854e0c5e1908da42635ae80768b)\n  and\n  [086c0af](https://github.com/phenomic/phenomic/commit/086c0aff5ded9466210560708bd20e000c1e02bb)\n  by @MoOx)\n"
  },
  {
    "path": "website/content/blog/2018-11-26-v1.0.0-beta.5.md",
    "content": "---\ntitle: 1.0.0-beta.5\ntag_name: v1.0.0-beta.5\nlink: https://github.com/phenomic/phenomic/releases/tag/v1.0.0-beta.5\nauthor: MoOx\nprerelease: true\n---\n\n🚨\n[We upgraded webpack from v3 to v4](https://github.com/phenomic/phenomic/commit/7405e56f1dfa0bd404bcbfcc64d0bb5c9fa8a680).\n\nSo this release might be a breaking change if you use a custom webpack. If you\nuse webpack without custom config, you should not have any problem. Note that\nyou could still use v3 webpack plugin if you don’t rely on the react-app preset\nand specifying the webpack beta.3 plugin version.\n\n⚠️\n[We removed react-hot-loader](https://github.com/phenomic/phenomic/commit/e268c6adf3851d785b507f6588175d81af4720c6)\n\nWe decided to do, like CRA & Next.js, to not include react-hot-loader for now.\nPrevious version of phenomic could create infinite loop in case of an error in a\nreact component…. It’s not stable enough & it’s not going to be better in the\nfuture, when React hooks will land as a stable feature.\n\n---\n\nBeside this small update, we are working on a react + reason + graphql example\n😋 and also a huge improvement on the content API!\n"
  },
  {
    "path": "website/content/blog/2018-12-08-v1.0.0-beta.6.md",
    "content": "---\ntitle: 1.0.0-beta.6\ntag_name: v1.0.0-beta.6\nlink: https://github.com/phenomic/phenomic/releases/tag/v1.0.0-beta.6\nauthor: MoOx\nprerelease: true\n---\n\n## Erratum\n\nCheck out [beta.7](../v1.0.0-beta.7/) which includes bugfixes related to this\nrelease.\n\n## 🚨 Breaking change\n\n- [Upgrade from babel 6 to babel 7](https://github.com/phenomic/phenomic/commit/bb0ce41b4fde26fbe4230601f3c39a6a442e873e)\n  ([+fixup](https://github.com/phenomic/phenomic/commit/09525f2058788030132026050a7cf55cab61527a)).\n  ⚠️ If you were using phenomic without any custom babel config, this update\n  should be transparent for you.\n- Reason users: you will night to replace `*.js` by `*.bs.js` for some files Eg:\n  `import { createContainer } from \"@phenomic/preset-react-app/lib/es6/src/phenomicPresetReactApp.js\";`\n  to\n  `import { createContainer } from \"@phenomic/preset-react-app/lib/es6/src/phenomicPresetReactApp.bs.js\";`\n\n## 😋 Fixes\n\n- [plugin-bundler-webpack: Fix: Add apollo support (defined as external dependency to avoid SSR issues with in memory cache)](https://github.com/phenomic/phenomic/commit/7b7afcb797ea4c991cfed0bc71f9afa8b218afa4)\n- [plugin-renderer-react: Fix: provide same props for getInitialProps during SSR and CSR (pathname+params)](https://github.com/phenomic/phenomic/commit/b4fb5d826dc23a282a7eb82674c8f0fd13da8320).\n  We previously send too many props during SSR to `getInitialProps()`, different\n  from CSR)\n- [plugin-renderer-react: fix issue with \"class\" prop generated from markdown in BodyRenderer](https://github.com/phenomic/phenomic/commit/80157cb0d443667adf8db6372b9143b844756e03)\n\n## 👍 Improvements\n\n- [core: Failing URLs during static pre-rendering do not crash the entire build anymore](https://github.com/phenomic/phenomic/commit/cd75f861db108a5e37a8a6f45b1d2ae7a2fc0f11)\n- [core: Better error reporting about errors like `window is not defined` during static build with a tip on how to fix it](https://github.com/phenomic/phenomic/commit/94ae4f71b1dfbc7f335c2253b022ec6562ca9707)\n- [core: CLI output is now more sweet](https://github.com/phenomic/phenomic/commit/9656d92de1a8a7c469e62a2931c70df0e8cca2a5).\n  Here is a before/after.  \n  ![phenomic-cli-beta 6](https://user-images.githubusercontent.com/157534/49691182-147b4580-fb3d-11e8-9ec9-235d71377051.jpg)\n- [core: avoid deprecated Buffer warning](https://github.com/phenomic/phenomic/commit/22ff8f904443b42c4b861a587fab0b7db134aa88)\n- [plugin-bundler-webpack: Hide annoying warning `Critical dependency: the request of a dependency is an expression`](https://github.com/phenomic/phenomic/commit/931f60f157fb6f7e926b80639a1550bdb779e00a)\n- [plugin-bunder-webpack: errors/warnings are now rendered using native webpack output](https://github.com/phenomic/phenomic/commit/73399f13c06f132a123735b25274b8009efdb3f5)\n- [plugin-bundler-webpack: development mode is now showing \"minimal\" output by default](https://github.com/phenomic/phenomic/commit/389346045df23b216f81ed5ca17b5bb6c83e9af8)\n- [plugin-bundler-webpack: cache is now enabled for babel-loader](https://github.com/phenomic/phenomic/commit/31530cdc8980adb667357198d9df1472da2f7784)\n- [plugin-bundler-webpack: allow config to be exported as es6 (export default)](https://github.com/phenomic/phenomic/commit/629fd542b6b17ff3aaefe3bd1de346b472e156b0)\n\n## 🥳 Internal\n\n- Refactoring of webpack bundler plugin in order to prepare future SSR rendering\n  enabled in dev mode\n- Reason code (generated as javascript) used in the core codebase (experimental)\n- Multiple other minors improvements...\n"
  },
  {
    "path": "website/content/blog/2018-12-09-v1.0.0-beta.7.md",
    "content": "---\ntitle: 1.0.0-beta.7\ntag_name: v1.0.0-beta.7\nlink: https://github.com/phenomic/phenomic/releases/tag/v1.0.0-beta.7\nauthor: MoOx\nprerelease: true\n---\n\nQuick release for issues related with beta.6\n\n## 💥 Fixes\n\n- [plugin-bundler-webpack: Add missing `@babel/core` dependency](https://github.com/phenomic/phenomic/commit/ebc95abeb0f6ff1f61795a66708d0a68dc429819)\n- [babel-preset: fix config to work even in non-static or non production](https://github.com/phenomic/phenomic/commit/c3d16873daec4349ddc76d8a688affcdc91d507a)\n"
  },
  {
    "path": "website/content/blog/2018-12-20-v1.0.0-beta.8.md",
    "content": "---\ntitle: 1.0.0-beta.8\ntag_name: v1.0.0-beta.8\nlink: https://github.com/phenomic/phenomic/releases/tag/v1.0.0-beta.8\nauthor: MoOx\nprerelease: true\n---\n\nMinor update to provide some fixes:\n\n- [@phenomic/plugin-bundler-webpack: (fix) put \"react-native\" as external, like react-native-web](https://github.com/phenomic/phenomic/commit/cc22c5d856905104ba15ee56ab74e54051dd6a12)\n- [@phenomic/cli: Add missing peer dep](https://github.com/phenomic/phenomic/commit/7885367d5301aa539dc33e51e8a2be7c5c5cef70)\n- [@phenomic/core: remove \"bs-platform\" as a core dependency](https://github.com/phenomic/phenomic/commit/31f52bf165838fc60f2c929c4f2f608d06c21d81)\n"
  },
  {
    "path": "website/content/blog/2019-01-18-v10.0-beta.9.md",
    "content": "---\ntitle: 1.0.0-beta.9\ntag_name: v1.0.0-beta.9\nlink: https://github.com/phenomic/phenomic/releases/tag/v1.0.0-beta.9\nauthor: MoOx\nprerelease: true\n---\n\n## 💥 (Minor) Changes\n\n- [`@phenomic/plugin-transform-markdown`: stop converting `tags` case automatically](https://github.com/phenomic/phenomic/commit/6bd15881c200d8305120f03a1675a1cc10dbd497)\n- [`@phenomic/plugin-transform-asciidoc`: stop converting `tags` case automatically](https://github.com/phenomic/phenomic/commit/ce0d3f92129f8e11bc088e162255b016bfcd2328)\n\n## 💪 Fixes\n\n- [`@phenomic/plugin-collector-files`: fix \"draft skipped for production\" feature](https://github.com/phenomic/phenomic/commit/81768df67c1718ba2e5ea89e760cbedc52277472)\n"
  },
  {
    "path": "website/content/blog/2019-03-15-v1.0.0-beta.10.md",
    "content": "---\ntitle: 1.0.0-beta.10\ntag_name: v1.0.0-beta.10\nlink: https://github.com/phenomic/phenomic/releases/tag/v1.0.0-beta.10\nauthor: MoOx\nprerelease: true\n---\n\nMinor release to add support for\n[React Hooks](https://reactjs.org/docs/hooks-intro.html)!\n\n## 💪 Fixes\n\n- [`@phenomic/plugin-renderer-react`: Add support for react hooks](https://github.com/phenomic/phenomic/commit/cccee0e9)\n  by @MoOx\n- [`@phenomic/plugin-transform-asciidoc`: Remove unused imports](https://github.com/phenomic/phenomic/commit/dc1513a8)\n  by @DanielRuf\n- [`@phenomic/plugin-transform-asciidoc`: fix tags spacing according to markdown behavior, for consitency accross format](https://github.com/phenomic/phenomic/commit/03d8a769)\n  by @MoOx\n- various minor docs improvements by @MoOx, @drazik & @nalanirojas25\n"
  },
  {
    "path": "website/content/blog/2019-03-24-v1.0.0-beta.11.md",
    "content": "---\ntitle: 1.0.0-beta.11\ntag_name: v1.0.0-beta.11\nlink: https://github.com/phenomic/phenomic/releases/tag/v1.0.0-beta.11\nauthor: MoOx\nprerelease: true\n---\n\n## 💪 Fixes\n\n- [`@phenomic/plugin-bundler-webpack`: Fix Styled components FOUC with v4](https://github.com/phenomic/phenomic/commit/1cf635b)\n  by @Jokinen\n- Internals changes to ensure bs-platform 5 compatibility by @MoOx\n"
  },
  {
    "path": "website/content/blog/2019-05-28-v1.0.0",
    "content": "---\ntitle: 1.0.0\ntag_name: v1.0.0\nlink: https://github.com/phenomic/phenomic/releases/tag/v1.0.0\nauthor: MoOx\nprerelease: true\n---\n\nWithout noize, 1.0.0 is out.\n\n## 💥 Reason User Change\n\n- [`@phenomic/plugin-renderer-react`: Update ReasonReact JSX to version 3](https://github.com/phenomic/phenomic/commit/b3f49c4)\n  by @arecvlohe\n"
  },
  {
    "path": "website/content/showcase/entry/anthonydugois.com__polynomic.md",
    "content": "---\ntitle: Polynomic\nurl: http://anthonydugois.com/polynomic/\nsource: https://github.com/anthonydugois/polynomic\nshowcaseTags:\n  - docs\n  - open-source\n---\n"
  },
  {
    "path": "website/content/showcase/entry/ced.photo.md",
    "content": "---\ntitle: CeD photo\nurl: https://www.ced.photo\nsource: https://github.com/xuopled/ced.photo\nshowcaseTags:\n  - blog\n  - business\n---\n\nCed.photo is a portfolio of a french passionate photographer and videomaker.\n"
  },
  {
    "path": "website/content/showcase/entry/cpp.daynhauhoc.com.md",
    "content": "---\ntitle: Learn C++ (Vietnamese)\nurl: http://cpp.daynhauhoc.com/\nsource: https://github.com/thangngoc89/dnh-cpp/\nshowcaseTags:\n  - learning\n---\n"
  },
  {
    "path": "website/content/showcase/entry/cssnano.co.md",
    "content": "---\ntitle: cssnano\nurl: http://cssnano.co/\nsource: https://github.com/ben-eb/cssnano/tree/master/docs\nshowcaseTags:\n  - docs\n  - open-source\n---\n"
  },
  {
    "path": "website/content/showcase/entry/duxxie.nl.md",
    "content": "---\ntitle: Duxxie\nurl: https://duxxie.nl\nshowcaseTags:\n  - business\n  - multi-languages\n---\n"
  },
  {
    "path": "website/content/showcase/entry/haywirez.com.md",
    "content": "---\ntitle: Haywirez\nurl: https://haywirez.com\nshowcaseTags:\n  - blog\n  - learning\n---\n\nUses a custom markdown parser to render react components in posts.\n"
  },
  {
    "path": "website/content/showcase/entry/istanbul.js.org.md",
    "content": "---\ntitle: Istanbul JS\nurl: http://istanbul.js.org/\nsource: https://github.com/istanbuljs/istanbuljs.github.io\nshowcaseTags:\n  - docs\n  - open-source\n---\n"
  },
  {
    "path": "website/content/showcase/entry/kevin940726.github.io.md",
    "content": "---\ntitle: Kai Hao\nurl: https://kevin940726.github.io\nsource: https://github.com/kevin940726/kevin940726.github.io\nshowcaseTags:\n  - blog\n---\n"
  },
  {
    "path": "website/content/showcase/entry/khoanguyen.me.md",
    "content": "---\ntitle: Khoa Nguyen's Blog\nurl: https://khoanguyen.me/\nsource: https://github.com/thangngoc89/blog\nshowcaseTags:\n  - blog\n---\n"
  },
  {
    "path": "website/content/showcase/entry/meetfranz.com.md",
    "content": "---\ntitle: Franz\nurl: https://meetfranz.com\nshowcaseTags:\n  - docs\n  - community\n  - open-source\n  - business\n---\n"
  },
  {
    "path": "website/content/showcase/entry/nhakhoaphuocbinh.com.md",
    "content": "---\ntitle: Phước Bình Dental Clinic\nurl: https://nhakhoaphuocbinh.com/\nsource: https://github.com/thangngoc89/nhakhoaphuocbinh\nshowcaseTags:\n  - business\n---\n"
  },
  {
    "path": "website/content/showcase/entry/postcss.org.md",
    "content": "---\ntitle: PostCSS\nurl: http://postcss.org/\nsource: https://github.com/postcss/postcss.org\nshowcaseTags:\n  - docs\n  - open-source\n---\n"
  },
  {
    "path": "website/content/showcase/entry/putaindecode.io.md",
    "content": "---\ntitle: Putain de code !\nurl: http://putaindecode.io/\nsource: https://github.com/putaindecode/putaindecode.io\nshowcaseTags:\n  - open-source\n  - community\n  - learning\n  - multi-languages\n---\n"
  },
  {
    "path": "website/content/showcase/entry/slashgear.github.io.md",
    "content": "---\ntitle: Slashgear Blog\nurl: https://slashgear.github.io\nshowcaseTags:\n  - blog\n---\n"
  },
  {
    "path": "website/content/showcase/entry/stylelint.io.md",
    "content": "---\ntitle: Stylelint\nurl: http://stylelint.io/\nsource: https://github.com/stylelint/stylelint.io\nshowcaseTags:\n  - docs\n  - open-source\n---\n"
  },
  {
    "path": "website/content/showcase/entry/www.acrowithbrian.com.md",
    "content": "---\ntitle: Brian Cruikshank Acro\nurl: https://www.acrowithbrian.com/\nsource: https://github.com/brianrc/acrowithbrian-site\nshowcaseTags:\n  - event\n  - blog\n  - learning\n  - business\n---\n"
  },
  {
    "path": "website/content/showcase/entry/www.asimkt.com.md",
    "content": "---\ntitle: Asim K T Portfolio\nurl: https://www.asimkt.com/\nsource: https://github.com/asimkt/portfolio\nshowcaseTags:\n  - blog\n---\n\nPortfolio site of Asim K T, A front end developer from Bangalore, India. An open\nsource, sleek and simple design with minimal colors.\n"
  },
  {
    "path": "website/content/showcase/entry/www.boscnegre-vacances.com.md",
    "content": "---\ntitle: Bosc Nègre Vacances\nurl: https://www.boscnegre-vacances.com\nsource: https://github.com/boscnegre-vacances/boscnegre-vacances.github.io\nshowcaseTags:\n  - blog\n  - business\n  - multi-languages\n---\n\nOfficial wesite of Bosc-Nègre, an holiday village with 23 charming cottages in\nthe \"Perigord Noir\". (Dordogne, France)\n"
  },
  {
    "path": "website/content/showcase/entry/www.codepreneur.io.md",
    "content": "---\ntitle: codepreneur.io\nurl: https://www.codepreneur.io/\nsource: https://github.com/codepreneur/site\nshowcaseTags:\n  - blog\n---\n"
  },
  {
    "path": "website/content/showcase/submit.md",
    "content": "---\ntitle: Submit a website/app made with Phenomic to the Showcase\n---\n\nTo submit your site, you just need to\n[create a text file](https://github.com/phenomic/phenomic/new/master/website/content/showcase/entry/).\n🚀 Screenshots will be taken automatically!\n\nYou should be able to submit this file as a\n[pull request](https://help.github.com/articles/creating-a-pull-request/) via\nGitHub interface.\n\nPlease name the file as the domain of you website. If your website is in a\nfolder, replace `/` by 2 underscores (`__`).\n\nEg:\n\n- `http://some.where/` => `some.where.md`\n- `https://www.somewhere.else/` => `www.somewhere.else.md`\n- `https://www.somewhere.else/right/here` =>\n  `www.somewhere.else__right__here.md`\n\nFor the content of the file, you must use the following format:\n\n```md\n---\ntitle: My super title\nurl: http://url-of-the-website/app\nsource: https://github.com/url/of-the-source-(optional-if-relevant)\nshowcaseTags:\n  - docs\n  - community\n  - open-source\n  - event\n  - blog\n  - learning\n  - business\n  - multi-languages\n  -  # Choose what you need in that list only! Ask on our chat if you are not sure :)\n---\n\nA description and technical detail here (optional)\n```\n"
  },
  {
    "path": "website/defaults.css",
    "content": "html,\nbody {\n  height: 100%;\n}\n\nhtml {\n  box-sizing: border-box;\n}\n*,\n*:before,\n*:after {\n  box-sizing: inherit;\n}\n\n#PhenomicRoot {\n  display: flex;\n  min-height: 100%;\n}\n\n/* workaround react-native-web absolute positining\n which creates lags when scrolling */\n#PhenomicRoot > div {\n  position: relative !important;\n}\n\nbody {\n  font-family: -apple-system, BlinkMacSystemFont, \"Segoe UI\", \"Roboto\", \"Oxygen\",\n    \"Ubuntu\", \"Cantarell\", \"Fira Sans\", \"Droid Sans\", \"Helvetica Neue\",\n    sans-serif;\n}\n\n.phenomic-Markdown {\n  font-size: 18px;\n  line-height: 1.65;\n  color: #525f7f;\n}\n\n.phenomic-Markdown h1,\n.phenomic-Markdown h2,\n.phenomic-Markdown h3,\n.phenomic-Markdown h4,\n.phenomic-Markdown h5,\n.phenomic-Markdown h6 {\n  position: relative;\n  color: #32325d;\n}\n\n.phenomic-Markdown .phenomic-HeadingAnchor {\n  position: absolute;\n  top: 0;\n  bottom: 0;\n  left: -32px;\n  text-align: center;\n  padding-left: 10px;\n  padding-right: 10px;\n  width: 20px;\n  text-decoration: none;\n  opacity: 0.1;\n  transition: opacity 0.2s;\n}\n\n.phenomic-Markdown h1:hover .phenomic-HeadingAnchor,\n.phenomic-Markdown h2:hover .phenomic-HeadingAnchor,\n.phenomic-Markdown h3:hover .phenomic-HeadingAnchor,\n.phenomic-Markdown h4:hover .phenomic-HeadingAnchor,\n.phenomic-Markdown h5:hover .phenomic-HeadingAnchor,\n.phenomic-Markdown h6:hover .phenomic-HeadingAnchor {\n  opacity: 1;\n}\n\n.phenomic-Markdown a {\n  color: #006bf6;\n}\n\n.phenomic-Markdown img {\n  max-width: 100%;\n}\n\n.phenomic-Markdown code {\n  font-family: monospace;\n}\n"
  },
  {
    "path": "website/highlights-theme.css",
    "content": ".editor {\n  padding: 10px 16px;\n  border: 1px solid #11171c;\n  border-radius: 6px;\n  overflow-x: auto;\n  font-size: 14px;\n  line-height: 22px;\n  font-family: Menlo, Monaco, Consolas, Courier New, monospace;\n}\n\n/*\n  Code below has been generated with the following command:\n\n  npx atom-syntax-theme-to-highlights-css --clipboard https://github.com/simurai/duotone-dark-sea-syntax\n\n  More details at https://github.com/MoOx/atom-syntax-theme-to-highlights-css\n*/\n\n.editor {\n  color: #88b4e7;\n  background-color: hsl(210, 20%, 20%);\n}\n.editor .line.cursor-line {\n  background-color: rgba(52, 68, 85, 0.26);\n}\n.editor .invisible {\n  color: #88b4e7;\n}\n.editor .cursor {\n  border-color: #52ffc5;\n  border-left-width: 2px;\n}\n.editor .selection .region {\n  background-color: #344455;\n}\n.editor .bracket-matcher .region {\n  border-bottom: 1px solid #52ffc5;\n}\n.editor .invisible-character {\n  color: #303f4f;\n  -webkit-font-smoothing: antialiased;\n}\n.editor .indent-guide {\n  color: #303f4f;\n}\n.editor .wrap-guide {\n  background-color: #303f4f;\n}\n.editor .find-result .region.region.region,\n.editor .current-result .region.region.region {\n  border-radius: 0px;\n  background-color: rgba(82, 255, 197, 0.16);\n  transition: border-color 0.4s;\n}\n.editor .find-result .region.region.region {\n  border: 2px solid transparent;\n}\n.editor .current-result .region.region.region {\n  border: 2px solid #52ffc5;\n  transition-duration: 0.1s;\n}\n.editor .gutter .line-number {\n  color: #586f89;\n  -webkit-font-smoothing: antialiased;\n}\n.editor .gutter .line-number.git-line-removed:before {\n  bottom: -3px;\n}\n.editor .gutter .line-number.git-line-removed:after {\n  content: \"\";\n  position: absolute;\n  left: 0px;\n  bottom: 0px;\n  width: 25px;\n  border-bottom: 1px dotted rgba(224, 82, 82, 0.5);\n  pointer-events: none;\n}\n.editor .gutter .line-number.cursor-line {\n  color: #88b4e7;\n  background-color: #232d39;\n}\n.editor .gutter .line-number.cursor-line-no-selection {\n  background-color: transparent;\n}\n.editor .gutter .line-number .icon-right {\n  color: #88b4e7;\n}\n.editor .gutter .line-number.folded,\n.editor .gutter .line-number:after,\n.editor .fold-marker:after {\n  color: #88b4e7;\n}\n.uno-1 {\n  color: #d6e9ff;\n}\n.uno-2 {\n  color: #88b4e7;\n}\n.uno-3 {\n  color: #5d8cc0;\n}\n.uno-4 {\n  color: #586f89;\n}\n.uno-5 {\n  color: #444c55;\n}\n.duo-1 {\n  color: #34febb;\n}\n.duo-2 {\n  color: #32ae85;\n}\n.duo-3 {\n  color: #42675a;\n}\n.syntax--source {\n  color: #88b4e7;\n}\n.syntax--html.syntax--elements,\n.syntax--entity,\n.syntax--tag,\n.syntax--function-call {\n  color: #d6e9ff;\n}\n.syntax--attribute-name,\n.syntax--character.syntax--escape {\n  color: #5d8cc0;\n}\n.syntax--support {\n  color: #586f89;\n}\n.syntax--variable {\n  color: #5d8cc0;\n}\n.syntax--string,\n.syntax--constant,\n.syntax--storage.syntax--type {\n  color: #34febb;\n}\n.syntax--keyword,\n.syntax--storage {\n  color: #32ae85;\n}\n.syntax--punctuation,\n.syntax--bracket,\n.syntax--brace {\n  color: #444c55;\n}\n.syntax--string .syntax--punctuation {\n  color: #42675a;\n}\n.syntax--comment {\n  color: #586f89;\n  font-style: italic;\n}\n.syntax--bold {\n  font-weight: bold;\n}\n.syntax--italic {\n  font-style: italic;\n}\n.syntax--c .syntax--parens,\n.syntax--c .syntax--block {\n  color: #88b4e7;\n}\n.syntax--c .syntax--parens .syntax--punctuation,\n.syntax--c .syntax--block .syntax--punctuation,\n.syntax--c .syntax--parens .syntax--bracket,\n.syntax--c .syntax--block .syntax--bracket,\n.syntax--c .syntax--parens .syntax--brace,\n.syntax--c .syntax--block .syntax--brace {\n  color: #444c55;\n}\n.syntax--c .syntax--parens .syntax--string .syntax--punctuation,\n.syntax--c .syntax--block .syntax--string .syntax--punctuation {\n  color: #42675a;\n}\n.syntax--c .syntax--comment {\n  color: #42675a;\n}\n.syntax--source.syntax--clojure .syntax--expression {\n  color: #34febb;\n}\n.syntax--source.syntax--clojure .syntax--expression .syntax--punctuation {\n  color: #444c55;\n}\n.syntax--source.syntax--clojure .syntax--symbol {\n  color: #88b4e7;\n}\n.syntax--source.syntax--clojure .syntax--vector {\n  color: #586f89;\n}\n.syntax--coffee.syntax--source {\n  color: #586f89;\n}\n.syntax--source.syntax--cs .syntax--meta {\n  color: #586f89;\n}\n.syntax--source.syntax--cs .syntax--method {\n  color: #88b4e7;\n}\n.syntax--css.syntax--source {\n  color: #444c55;\n}\n.syntax--css.syntax--support.syntax--property-name {\n  color: #5d8cc0;\n}\n.syntax--css.syntax--attribute-name.syntax--id,\n.syntax--css.syntax--attribute-name.syntax--class,\n.syntax--css.syntax--attribute-name.syntax--parent-selector {\n  color: #d6e9ff;\n}\n.syntax--css.syntax--unit {\n  color: #32ae85;\n}\n.syntax--css.syntax--function {\n  color: #42675a;\n}\n.syntax--css.syntax--punctuation.syntax--terminator {\n  color: #42675a;\n}\n.syntax--css.syntax--at-rule {\n  color: #d6e9ff;\n}\n.syntax--css.syntax--at-rule .syntax--keyword.syntax--punctuation {\n  color: inherit;\n}\n.syntax--gfm {\n  color: #d6e9ff;\n}\n.syntax--gfm .syntax--punctuation,\n.syntax--gfm .syntax--bracket,\n.syntax--gfm .syntax--brace {\n  color: #444c55;\n}\n.syntax--gfm .syntax--string .syntax--punctuation {\n  color: #42675a;\n}\n.syntax--gfm .syntax--link {\n  color: #88b4e7;\n}\n.syntax--gfm.syntax--markup {\n  color: #88b4e7;\n}\n.syntax--gfm.syntax--markup.syntax--bold {\n  font-weight: bold;\n}\n.syntax--gfm.syntax--markup.syntax--italic {\n  font-style: italic;\n}\n.syntax--gfm.syntax--markup.syntax--strike {\n  color: #444c55;\n  text-decoration: line-through;\n}\n.syntax--gfm.syntax--markup.syntax--raw {\n  color: #34febb;\n}\n.syntax--gfm.syntax--markup.syntax--raw .syntax--support,\n.syntax--gfm.syntax--markup.syntax--code .syntax--support {\n  color: #586f89;\n}\n.syntax--gfm.syntax--comment {\n  color: #586f89;\n}\n.syntax--gfm.syntax--comment.syntax--quote {\n  color: #88b4e7;\n}\n.syntax--gfm.syntax--table {\n  color: #34febb;\n}\n.syntax--gfm.syntax--table .syntax--border,\n.syntax--gfm.syntax--table .syntax--pipe {\n  color: #444c55;\n}\n.syntax--gfm.syntax--variable,\n.syntax--gfm.syntax--entity {\n  color: #34febb;\n}\n.syntax--gfm.syntax--support {\n  color: #32ae85;\n}\n.syntax--gfm.syntax--heading-1,\n.syntax--gfm.syntax--heading-2,\n.syntax--gfm.syntax--heading-3 {\n  color: #34febb;\n}\n.syntax--gfm.syntax--heading-4,\n.syntax--gfm.syntax--heading-5,\n.syntax--gfm.syntax--heading-6 {\n  color: #32ae85;\n}\n.syntax--haskell.syntax--source {\n  color: #88b4e7;\n}\n.syntax--haskell.syntax--source .syntax--punctuation,\n.syntax--haskell.syntax--source .syntax--bracket,\n.syntax--haskell.syntax--source .syntax--brace {\n  color: #444c55;\n}\n.syntax--haskell.syntax--source .syntax--string .syntax--punctuation {\n  color: #42675a;\n}\n.syntax--html.syntax--meta {\n  color: #444c55;\n}\n.syntax--html.syntax--embedded .syntax--meta,\n.syntax--html.syntax--doctype,\n.syntax--html.syntax--text {\n  color: #586f89;\n}\n.syntax--html .syntax--string .syntax--id {\n  color: #34febb;\n}\n.syntax--jade.syntax--text,\n.syntax--jade .syntax--constant.syntax--name.syntax--attribute.syntax--tag {\n  color: #586f89;\n}\n.syntax--jade .syntax--meta.syntax--control.syntax--flow {\n  color: #88b4e7;\n}\n.syntax--jade .syntax--attribute-name.syntax--id {\n  color: #34febb;\n}\n.syntax--java .syntax--method {\n  color: #88b4e7;\n}\n.syntax--java .syntax--method .syntax--punctuation,\n.syntax--java .syntax--method .syntax--bracket,\n.syntax--java .syntax--method .syntax--brace {\n  color: #444c55;\n}\n.syntax--java .syntax--method .syntax--string .syntax--punctuation {\n  color: #42675a;\n}\n.syntax--java .syntax--dereference {\n  color: #586f89;\n}\n.syntax--js.syntax--delimiter {\n  color: #444c55;\n}\n.syntax--js.syntax--source {\n  color: #88b4e7;\n}\n.syntax--js.syntax--source .syntax--punctuation,\n.syntax--js.syntax--source .syntax--bracket,\n.syntax--js.syntax--source .syntax--brace {\n  color: #444c55;\n}\n.syntax--js.syntax--source .syntax--string .syntax--punctuation {\n  color: #42675a;\n}\n.syntax--json .syntax--string {\n  color: #88b4e7;\n}\n.syntax--json .syntax--string .syntax--punctuation {\n  color: #444c55;\n}\n.syntax--json .syntax--value > .syntax--string {\n  color: #34febb;\n}\n.syntax--json .syntax--value > .syntax--string .syntax--punctuation {\n  color: #444c55;\n}\n.syntax--json .syntax--value .syntax--constant {\n  color: #32ae85;\n}\n.syntax--less.syntax--variable:first-child {\n  color: #88b4e7;\n}\n.syntax--less .syntax--mixin {\n  color: #32ae85;\n}\n.syntax--mediawiki {\n  color: #d6e9ff;\n}\n.syntax--mediawiki .syntax--punctuation,\n.syntax--mediawiki .syntax--bracket,\n.syntax--mediawiki .syntax--brace {\n  color: #444c55;\n}\n.syntax--mediawiki .syntax--string .syntax--punctuation {\n  color: #42675a;\n}\n.syntax--mediawiki .syntax--wiki-link {\n  color: #88b4e7;\n}\n.syntax--mediawiki .syntax--heading {\n  color: #34febb;\n}\n.syntax--mediawiki .syntax--function-call {\n  color: #32ae85;\n}\n.syntax--mediawiki .syntax--value {\n  color: #34febb;\n}\n.syntax--mediawiki .syntax--fix_this_later {\n  color: #88b4e7;\n}\n.syntax--mediawiki .syntax--pipe,\n.syntax--mediawiki .syntax--link,\n.syntax--mediawiki .syntax--tag {\n  color: #444c55;\n}\n.syntax--php .syntax--string-contents {\n  color: #34febb;\n}\n.syntax--sass .syntax--at-rule .syntax--at-rule,\n.syntax--sass .syntax--at-rule .syntax--at-rule > .syntax--punctuation {\n  color: #d6e9ff;\n}\n.syntax--sass .syntax--mixin + .syntax--function,\n.syntax--sass .syntax--include + .syntax--function {\n  color: #32ae85;\n}\n.syntax--sass.syntax--property-value {\n  color: #34febb;\n}\n.syntax--sass.syntax--property-value .syntax--function {\n  color: #88b4e7;\n}\n.syntax--sass.syntax--property-value .syntax--punctuation {\n  color: #444c55;\n}\n.syntax--sass.syntax--variable.syntax--parameter.syntax--url {\n  color: #34febb;\n}\n.syntax--sass.syntax--class,\n.syntax--sass.syntax--parent-selector-suffix {\n  color: #d6e9ff;\n}\n.syntax--scss .syntax--at-rule .syntax--at-rule,\n.syntax--scss .syntax--at-rule .syntax--at-rule > .syntax--punctuation {\n  color: #d6e9ff;\n}\n.syntax--scss .syntax--mixin + .syntax--function,\n.syntax--scss .syntax--include + .syntax--function {\n  color: #32ae85;\n}\n.syntax--scss.syntax--property-value {\n  color: #34febb;\n}\n.syntax--scss.syntax--property-value .syntax--function {\n  color: #88b4e7;\n}\n.syntax--scss.syntax--property-value .syntax--punctuation {\n  color: #444c55;\n}\n.syntax--scss.syntax--variable.syntax--parameter.syntax--url {\n  color: #34febb;\n}\n.syntax--scss.syntax--class,\n.syntax--scss.syntax--parent-selector-suffix {\n  color: #d6e9ff;\n}\n.syntax--slim.syntax--meta {\n  color: #444c55;\n}\n.syntax--slim.syntax--text {\n  color: #586f89;\n}\n.syntax--slim .syntax--string .syntax--id {\n  color: #34febb;\n}\n.syntax--stylus .syntax--function .syntax--name {\n  color: #32ae85;\n}\n.syntax--tex .syntax--other {\n  color: #32ae85;\n}\n.syntax--tex .syntax--reference {\n  color: #88b4e7;\n}\n.syntax--plain .syntax--text {\n  color: #d6e9ff;\n}\n.syntax--yaml .syntax--tag {\n  color: #88b4e7;\n}\n.syntax--yaml .syntax--constant {\n  color: #32ae85;\n}\n.syntax--yaml .syntax--punctuation {\n  color: #444c55;\n}\n"
  },
  {
    "path": "website/modules/url-to-slug.js",
    "content": "// @flow\n\nexport default url =>\n  url\n    .replace(/https?:\\/\\//, \"\")\n    .replace(/\\/$/, \"\")\n    .replace(/\\//g, \"_\");\n"
  },
  {
    "path": "website/package.json",
    "content": "{\n  \"private\": true,\n  \"name\": \"website\",\n  \"version\": \"1.0.0\",\n  \"repository\": \"https://github.com/phenomic/phenomic.git\",\n  \"scripts\": {\n    \"prepare\": \"svgr --no-dimensions --out-dir svgs svgs\",\n    \"releases-as-markdown\": \"babel-node --config-file ../babel.config.js upward scripts/releases-as-markdown.js\",\n    \"showcase-screenshots\": \"babel-node --config-file ../babel.config.js upward scripts/showcase-screenshots.js\",\n    \"optim\": \"imageoptim --jpeg-mini --image-alpha --quit --directory dist\",\n    \"start\": \"phenomic start\",\n    \"prebuild\": \"yarn showcase-screenshots\",\n    \"build\": \"phenomic build\",\n    \"pretest\": \"yarn showcase-screenshots\",\n    \"test\": \"yarn build\",\n    \"predeploy\": \"yarn test && (yarn optim || echo \\\"optim skipped because of failure\\\")\",\n    \"deploy\": \"./scripts/deploy.sh\"\n  },\n  \"dependencies\": {\n    \"@phenomic/cli\": \"^1.0.0\",\n    \"@phenomic/core\": \"^1.0.0\",\n    \"@phenomic/preset-react-app\": \"^1.0.0\",\n    \"react\": \"^16.8.0\",\n    \"react-dom\": \"^16.8.0\",\n    \"react-ga\": \"^2.0.0\",\n    \"react-helmet\": \"^5.0.0\",\n    \"react-native-web\": \"^0.9.0\",\n    \"react-router\": \"^3.2.0\",\n    \"react-topbar-progress-indicator\": \"^2.0.0\"\n  },\n  \"devDependencies\": {\n    \"babel-cli\": \"^6.24.1\",\n    \"cross-fetch\": \"^2.2.3\",\n    \"gray-matter\": \"^3.0.0\",\n    \"image-optim\": \"^3.0.0\",\n    \"imageoptim-cli\": \"^1.15.4\",\n    \"mkdirp\": \"^0.5.1\",\n    \"puppeteer\": \"^1.1.1\",\n    \"rimraf\": \"^2.6.1\",\n    \"simple-json-fetch\": \"^1.0.1\",\n    \"svgr\": \"^1.9.1\"\n  },\n  \"screenshotsSize\": {\n    \"large\": {\n      \"width\": 1366,\n      \"height\": 768\n    },\n    \"small\": {\n      \"width\": 360,\n      \"height\": 640\n    }\n  },\n  \"eslintConfig\": {\n    \"rules\": {\n      \"react/prop-types\": 0,\n      \"react-native/no-inline-styles\": 0\n    }\n  }\n}\n"
  },
  {
    "path": "website/phenomic.config.js",
    "content": "// @flow\n\nmodule.exports = {\n  baseUrl: \"https://phenomic.io/\",\n  content: {\n    content: [\"**/*\"],\n    packages: {\n      root: \"../packages\",\n      globs: [\"*/package.json\", \"*/docs/**/*.md\"],\n    },\n  },\n  presets: [\"@phenomic/preset-react-app\"],\n  plugins: [\n    [\n      \"@phenomic/plugin-rss-feed\",\n      {\n        feeds: {\n          \"feed.xml\": {\n            feedOptions: {\n              title: \"Phenomic.io\",\n              description: \"Phenomic news\",\n            },\n            query: {\n              path: \"content/blog\",\n              limit: 20,\n            },\n          },\n        },\n      },\n    ],\n  ],\n  db: {\n    sortFunctions: {\n      showcase: (a, b) => {\n        if (a.data.curated && !b.data.curated) return -1;\n        if (!a.data.curated && b.data.curated) return 1;\n\n        // more tags first\n        if (a.data.showcaseTags.length < b.data.showcaseTags.length) return 1;\n        if (a.data.showcaseTags.length > b.data.showcaseTags.length) return -1;\n\n        // blog last\n        if (\n          a.data.showcaseTags.indexOf(\"blog\") === -1 &&\n          b.data.showcaseTags.indexOf(\"blog\") > -1\n        ) {\n          return -1;\n        }\n\n        return 0;\n      },\n    },\n  },\n};\n"
  },
  {
    "path": "website/public/.nojekyll",
    "content": ""
  },
  {
    "path": "website/public/CNAME",
    "content": "phenomic.io"
  },
  {
    "path": "website/public/browserconfig.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<browserconfig>\n    <msapplication>\n        <tile>\n            <square150x150logo src=\"/mstile-150x150.png\"/>\n            <TileColor>#ffffff</TileColor>\n        </tile>\n    </msapplication>\n</browserconfig>\n"
  },
  {
    "path": "website/public/site.webmanifest",
    "content": "{\n    \"name\": \"\",\n    \"short_name\": \"\",\n    \"icons\": [\n        {\n            \"src\": \"/android-chrome-192x192.png\",\n            \"sizes\": \"192x192\",\n            \"type\": \"image/png\"\n        },\n        {\n            \"src\": \"/android-chrome-512x512.png\",\n            \"sizes\": \"512x512\",\n            \"type\": \"image/png\"\n        }\n    ],\n    \"theme_color\": \"#ffffff\",\n    \"background_color\": \"#ffffff\",\n    \"display\": \"standalone\"\n}\n"
  },
  {
    "path": "website/scripts/deploy.sh",
    "content": "#!/usr/bin/env bash\nGIT_DEPLOY_REPO=${GIT_DEPLOY_REPO:-$(node -e 'process.stdout.write(require(\"./package.json\").repository)')}\n\ncd dist && \\\n$(npm bin)/rimraf .git && \\\ngit init && \\\ngit add . && \\\ngit commit -m \"Deploy to GitHub Pages\" && \\\ngit push --force \"${GIT_DEPLOY_REPO}\" master:gh-pages\n"
  },
  {
    "path": "website/scripts/releases-as-markdown.js",
    "content": "// @flow\n\nimport fs from \"fs\";\nimport path from \"path\";\n\nimport \"cross-fetch/polyfill\";\nimport jsonFetch from \"simple-json-fetch\";\n\n(async function() {\n  try {\n    const releases = (await jsonFetch(\n      \"https://api.github.com/repos/phenomic/phenomic/releases\",\n    )).json;\n    releases.forEach(release => {\n      // skip pre 1.x\n      if (\n        release.tag_name.startsWith(\"v0.\") ||\n        release.tag_name.startsWith(\"0.\")\n      )\n        return;\n\n      const date = release.published_at.slice(0, \"YYYY-MM-DD\".length);\n      const md = `---\ntitle: ${release.name || release.tag_name}\ntag_name: ${release.tag_name}\nlink: ${release.html_url}\nauthor: ${release.author.login}\nprerelease: ${release.prerelease}\n---\n\n${release.body}\n`;\n      const filename = path.join(\n        __dirname,\n        \"..\",\n        \"content\",\n        \"blog\",\n        date + \"-\" + release.tag_name + \".md\",\n      );\n      fs.writeFileSync(filename, md);\n    });\n  } catch (e) {\n    console.error(\"❌ \" + e.message);\n  }\n})();\n"
  },
  {
    "path": "website/scripts/showcase-screenshots.js",
    "content": "// @flow\n\nimport { resolve, join } from \"path\";\nimport fs from \"fs\";\n\nimport mkdirp from \"mkdirp\";\nimport grayMatter from \"gray-matter\";\nimport puppeteer from \"puppeteer\";\nimport optimizer from \"image-optim\";\n\nimport urlToSlug from \"../modules/url-to-slug\";\nimport { screenshotsSize } from \"../package.json\";\n\nconst cacheDir = resolve(__dirname, \"..\", \".screenshots\");\nconst showcaseDir = resolve(__dirname, \"..\", \"content\", \"showcase\", \"entry\");\nconst screenshotsLocation = resolve(\n  __dirname,\n  \"..\",\n  \"public\",\n  \"showcase\",\n  \"entry\",\n);\n\nconst showcasesFiles = fs\n  .readdirSync(showcaseDir)\n  .filter(file => !file.startsWith(\".\"));\n\nconst listTmp = [];\nshowcasesFiles.forEach(file => {\n  const showcaseFile = fs.readFileSync(join(showcaseDir, file), {\n    encoding: \"utf-8\",\n  });\n  const showcase = grayMatter(showcaseFile);\n\n  listTmp.push({ file, ...showcase.data });\n});\n\n// console.log(listTmp);\n// process.exit(1);\nconst list = listTmp; // .slice(0, 2); // for tests\n\nmkdirp.sync(cacheDir);\nmkdirp.sync(screenshotsLocation);\n\nconst screenshots = list.reduce((screenshots, { file, url }) => {\n  const filename = urlToSlug(url);\n  return [\n    ...screenshots,\n    {\n      file,\n      url,\n      jpgLocation: join(screenshotsLocation, filename + \"-large.jpg\"),\n      ...screenshotsSize.large,\n    },\n    {\n      file,\n      url,\n      jpgLocation: join(screenshotsLocation, filename + \"-small.jpg\"),\n      ...screenshotsSize.small,\n    },\n  ];\n}, []);\n\nconst optimizeScreenshot = async ({ url, jpgLocation }) => {\n  return optimizer\n    .optimize(jpgLocation)\n    .then(() => console.log(\"📦 \", url, \"optimized\"));\n};\n\n(async () => {\n  const browser = await puppeteer.launch({\n    // netlify fails to run puppeteer\n    // https://github.com/GoogleChrome/puppeteer/issues/1321#issuecomment-378361236\n    args: [\"--disable-dev-shm-usage\"],\n  });\n  for (const s in screenshots) {\n    const { file, url, jpgLocation, width, height } = screenshots[s];\n    try {\n      // skip if jpeg exist\n      fs.readFileSync(jpgLocation);\n    } catch (e) {\n      try {\n        console.log(\"👉 Visiting \", url);\n        const page = await browser.newPage();\n        await page.goto(url);\n        if (\n          (await page.$(\"#PhenomicRoot\")) === null &&\n          (await page.$(\"#phenomic\")) === null &&\n          (await page.$(\"#statinamic\")) === null // back to the future\n        ) {\n          console.error(\"⚠️ \", url, \"Website seems not to run phenomic\");\n          console.error(\"🚒 tip: git rm \" + join(showcaseDir, file));\n        } else {\n          console.log(\"📷 \", url, \"Taking screenshot\", width, height);\n          await page.setViewport({ width, height });\n          await page.screenshot({\n            path: jpgLocation,\n            type: \"jpeg\",\n            quality: 40,\n          });\n          await optimizeScreenshot({ url, jpgLocation });\n          console.log(\"📸 \", url, width, height);\n        }\n      } catch (e) {\n        console.error(\"🚨 \", url, e.message);\n      }\n    }\n  }\n\n  await browser.close();\n})();\n"
  },
  {
    "path": "website/webpack.config.js",
    "content": "// @flow\n\nimport defaultWebpackConfig from \"@phenomic/plugin-bundler-webpack/lib/webpack.config.js\"; // eslint-disable-line\n\nexport default (config: PhenomicConfig) => {\n  const webpackConfig = defaultWebpackConfig(config);\n  return {\n    ...webpackConfig,\n    resolve: {\n      ...webpackConfig.resolve,\n      alias: {\n        ...webpackConfig.resolve.alias,\n        \"react-native$\": \"react-native-web\",\n      },\n    },\n    performance: {\n      hints: false,\n    },\n  };\n};\n"
  }
]