[
  {
    "path": ".github/FUNDING.yml",
    "content": "# These are supported funding model platforms\n\ngithub: jaredpetersen\ncustom: https://paypal.me/jaredtpetersen"
  },
  {
    "path": ".gitignore",
    "content": "# See https://help.github.com/ignore-files/ for more about ignoring files.\n\n# dependencies\n/node_modules\n\n# testing\n/coverage\n/storybook-static\n\n# production\n/build\n\n# misc\n.DS_Store\n.env.local\n.env.development.local\n.env.test.local\n.env.production.local\n\nnpm-debug.log*\nyarn-debug.log*\nyarn-error.log*\n"
  },
  {
    "path": ".storybook/addons.js",
    "content": "import '@storybook/addon-actions/register';\nimport '@storybook/addon-links/register';\n"
  },
  {
    "path": ".storybook/config.js",
    "content": "import { configure } from '@storybook/react';\n\nfunction loadStories() {\n  require('../src/common/dropdown-toggle-select/index.story.jsx');\n  require('../src/navbar/index.story.jsx');\n  require('../src/editor/index.story.jsx');\n  require('../src/editor/toolbar/index.story.jsx');\n  require('../src/editor/toolbar/font-dropdown/index.story.jsx');\n  require('../src/editor/toolbar/size-dropdown/index.story.jsx');\n  require('../src/editor/toolbar/theme-dropdown/index.story.jsx');\n  require('../src/editor/document/index.story.jsx');\n  require('../src/heart/index.story.jsx');\n  require('../src/not-found/index.story.jsx');\n}\n\nconfigure(loadStories, module);\n"
  },
  {
    "path": ".storybook/preview-head.html",
    "content": "<link rel=\"stylesheet\" href=\"https://use.fontawesome.com/releases/v5.1.0/css/solid.css\" integrity=\"sha384-TbilV5Lbhlwdyc4RuIV/JhD8NR+BfMrvz4BL5QFa2we1hQu6wvREr3v6XSRfCTRp\" crossorigin=\"anonymous\">\n<link rel=\"stylesheet\" href=\"https://use.fontawesome.com/releases/v5.1.0/css/brands.css\" integrity=\"sha384-7xAnn7Zm3QC1jFjVc1A6v/toepoG3JXboQYzbM0jrPzou9OFXm/fY6Z/XiIebl/k\" crossorigin=\"anonymous\">\n<link rel=\"stylesheet\" href=\"https://use.fontawesome.com/releases/v5.1.0/css/fontawesome.css\" integrity=\"sha384-ozJwkrqb90Oa3ZNb+yKFW2lToAWYdTiF1vt8JiH5ptTGHTGcN7qdoR1F95e0kYyG\" crossorigin=\"anonymous\">\n"
  },
  {
    "path": ".travis.yml",
    "content": "language: node_js\nnode_js:\n  - \"node\"\n  - \"lts/*\"\n  - \"9\"\n  - \"8\"\nscript:\n  - npm run build\n  - npm test -- --coverage\n"
  },
  {
    "path": "LICENSE",
    "content": "The MIT License (MIT)\n\nCopyright (c) 2018 Jared Petersen\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": "# codeprinter\n\n[![Build Status](https://travis-ci.org/jaredpetersen/codeprinter.svg?branch=master)](https://travis-ci.org/jaredpetersen/codeprinter) [![Donate](https://img.shields.io/badge/donate-%E2%9D%A4-F33452.svg)](https://paypal.me/jaredtpetersen)\n\ncodeprinter's goal is pretty self-explanatory: to make it easier to print out code on paper. Many IDE's either don't allow you to print or have some weird quirks like adding unnecessary headers and footers, not allowing you to change your font size, or not providing syntax highlighting on your printout.\n\ncodeprinter makes it easy. Simply copy your code into the text box, select your desired font, font size, syntax highlighting theme, and whether or not you would like line numbers and then hit print.\n\n## Usage\n\ncodeprinter is currently hosted by GitHub Pages at http://jaredpetersen.github.io/codeprinter/.\n\nIf you're concerned about pasting code into some website, you can use it locally as well. codeprinter is a React project that uses NPM and Node.js, so [you'll need both installed](https://nodejs.org/en/download/) in order to do so. Right now, codeprinter supports Node 8.x or higher, but the latest LTS version is always recommended.\n\nOnce that's out of the way, run the following commands to install the dependencies, build the application, and run it:\n\n```\nnpm install\nnpm run build\nnpm start\n```\n\n## Screenshots\n\n![Paste your code](https://i.imgur.com/adhS1Cz.png)\n![Change your font size](https://i.imgur.com/TlgIxpi.png)\n![Print your code](https://i.imgur.com/IYHqP0z.png)\n\n## How to Contribute\n\nFind a bug? Want to request a new feature? Awesome! Create an [issue](https://github.com/jaredpetersen/codeprinter/issues) and/or submit a [pull request](https://github.com/jaredpetersen/codeprinter/pulls). Just want to show your support for the project? [Buy me a cup of coffee](https://paypal.me/jaredtpetersen).\n"
  },
  {
    "path": "package.json",
    "content": "{\n  \"name\": \"codeprinter\",\n  \"version\": \"1.1.2\",\n  \"private\": true,\n  \"homepage\": \"http://jaredpetersen.github.io/codeprinter\",\n  \"engines\": {\n    \"node\": \">=8.6.0\"\n  },\n  \"scripts\": {\n    \"start\": \"react-scripts start\",\n    \"build\": \"react-scripts build\",\n    \"test\": \"react-scripts test --watchAll=false\",\n    \"pretty\": \"prettier --print-width 120 --single-quote --write \\\"**/*.{js,jsx,css,json,md}\\\"\",\n    \"build-storybook\": \"build-storybook -s public\",\n    \"storybook\": \"start-storybook -p 9009 -s public\",\n    \"predeploy\": \"npm run build\",\n    \"deploy\": \"gh-pages -d build\"\n  },\n  \"jest\": {\n    \"collectCoverageFrom\": [\n      \"src/**/*.{js,jsx}\",\n      \"!<rootDir>/node_modules/\",\n      \"!src/index.jsx\",\n      \"!src/registerServiceWorker.js\",\n      \"!setupTests.js\",\n      \"!src/**/*.story.{js,jsx}\"\n    ],\n    \"coverageReporters\": [\n      \"json\",\n      \"lcov\",\n      \"html\",\n      \"text\"\n    ],\n    \"transformIgnorePatterns\": [\n      \"/node_modules/(?!(react-syntax-highlighter)/)\"\n    ]\n  },\n  \"husky\": {\n    \"hooks\": {\n      \"pre-commit\": \"lint-staged\"\n    }\n  },\n  \"lint-staged\": {\n    \"**/*.{js,jsx,css,json,md}\": [\n      \"prettier --print-width 120 --single-quote --write\",\n      \"git add\"\n    ]\n  },\n  \"dependencies\": {\n    \"bootstrap\": \"^4.4.1\",\n    \"prop-types\": \"^15.7.2\",\n    \"react\": \"^16.12.0\",\n    \"react-dom\": \"^16.12.0\",\n    \"react-router-dom\": \"^5.1.2\",\n    \"react-scripts\": \"^3.3.0\",\n    \"react-syntax-highlighter\": \"^11.0.2\",\n    \"reactstrap\": \"^8.2.0\"\n  },\n  \"devDependencies\": {\n    \"@storybook/addon-actions\": \"^5.2.8\",\n    \"@storybook/addon-links\": \"^5.2.8\",\n    \"@storybook/addons\": \"^5.2.8\",\n    \"@storybook/react\": \"^5.2.8\",\n    \"enzyme\": \"^3.10.0\",\n    \"enzyme-adapter-react-16\": \"^1.15.1\",\n    \"gh-pages\": \"^2.1.1\",\n    \"husky\": \"^3.1.0\",\n    \"lint-staged\": \"^9.5.0\",\n    \"prettier\": \"1.19.1\"\n  },\n  \"browserslist\": [\n    \">0.2%\",\n    \"not dead\",\n    \"not ie <= 11\",\n    \"not op_mini all\"\n  ]\n}\n"
  },
  {
    "path": "public/index.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en\">\n  <head>\n    <meta charset=\"utf-8\">\n    <meta name=\"description\" content=\"Print out code easily\">\n    <meta name=\"viewport\" content=\"width=device-width, initial-scale=1, shrink-to-fit=no\">\n    <meta name=\"theme-color\" content=\"#343a40\">\n    <link rel=\"manifest\" href=\"%PUBLIC_URL%/manifest.json\">\n    <link rel=\"shortcut icon\" href=\"%PUBLIC_URL%/favicon.ico\">\n    <link href=\"https://fonts.googleapis.com/css?family=Anonymous+Pro|Cousine|Cutive+Mono|Fira+Mono|IBM+Plex+Mono|Inconsolata|Nanum+Gothic+Coding|Nova+Mono|Overpass+Mono:300,400|Oxygen+Mono|PT+Mono|Roboto+Mono|Share+Tech+Mono|Source+Code+Pro|Space+Mono|Ubuntu+Mono\" rel=\"stylesheet\">\n    <title>codeprinter</title>\n    <link rel=\"stylesheet\" href=\"https://use.fontawesome.com/releases/v5.1.0/css/solid.css\" integrity=\"sha384-TbilV5Lbhlwdyc4RuIV/JhD8NR+BfMrvz4BL5QFa2we1hQu6wvREr3v6XSRfCTRp\" crossorigin=\"anonymous\">\n    <link rel=\"stylesheet\" href=\"https://use.fontawesome.com/releases/v5.1.0/css/brands.css\" integrity=\"sha384-7xAnn7Zm3QC1jFjVc1A6v/toepoG3JXboQYzbM0jrPzou9OFXm/fY6Z/XiIebl/k\" crossorigin=\"anonymous\">\n    <link rel=\"stylesheet\" href=\"https://use.fontawesome.com/releases/v5.1.0/css/fontawesome.css\" integrity=\"sha384-ozJwkrqb90Oa3ZNb+yKFW2lToAWYdTiF1vt8JiH5ptTGHTGcN7qdoR1F95e0kYyG\" crossorigin=\"anonymous\">\n  </head>\n  <body>\n    <noscript>\n      You need to enable JavaScript to run this app.\n    </noscript>\n    <div id=\"root\"></div>\n  </body>\n</html>\n"
  },
  {
    "path": "public/manifest.json",
    "content": "{\n  \"short_name\": \"codeprinter\",\n  \"name\": \"codeprinter\",\n  \"description\": \"Print out code easily\",\n  \"icons\": [\n    {\n      \"src\": \"favicon.ico\",\n      \"sizes\": \"64x64 32x32 24x24 16x16\",\n      \"type\": \"image/x-icon\"\n    }\n  ],\n  \"start_url\": \"/\",\n  \"display\": \"standalone\",\n  \"theme_color\": \"#343a40\",\n  \"background_color\": \"#ffffff\"\n}\n"
  },
  {
    "path": "src/App.jsx",
    "content": "import React, { Component } from 'react';\nimport { BrowserRouter as Router, Switch, Route } from 'react-router-dom';\nimport Navbar from './navbar';\nimport Editor from './editor';\nimport Heart from './heart';\nimport NotFound from './not-found';\n\nclass App extends Component {\n  constructor(props) {\n    super(props);\n\n    this.state = {};\n  }\n\n  render() {\n    return (\n      <Router basename={process.env.PUBLIC_URL}>\n        <div className=\"h-100\">\n          <Navbar />\n          <Switch>\n            <Route exact path=\"/\" component={Editor} />\n            <Route exact path=\"/heart\" component={Heart} />\n            <Route component={NotFound} />\n          </Switch>\n        </div>\n      </Router>\n    );\n  }\n}\n\nexport default App;\n"
  },
  {
    "path": "src/App.test.jsx",
    "content": "import React from 'react';\nimport { shallow } from 'enzyme';\nimport App from './App';\n\ndescribe('App', () => {\n  it('renders without crashing', () => {\n    shallow(<App />);\n  });\n});\n"
  },
  {
    "path": "src/common/dropdown-toggle-select/index.css",
    "content": ".dropdown-toggle-select::after {\n  display: inline-block;\n  width: 0;\n  height: 0;\n  margin-left: 0.255em;\n  vertical-align: 0.255em;\n  content: '';\n  border-top: 0.3em solid;\n  border-right: 0.3em solid transparent;\n  border-bottom: 0;\n  border-left: 0.3em solid transparent;\n  position: absolute;\n  right: 12px;\n  top: 45%;\n}\n\n.btn-outline-dropdown-toggle-select {\n  background-color: transparent;\n  background-image: none;\n  border-color: #ced4da;\n}\n\n.btn-outline-dropdown-toggle-select:hover {\n}\n"
  },
  {
    "path": "src/common/dropdown-toggle-select/index.jsx",
    "content": "import React from 'react';\nimport PropTypes from 'prop-types';\nimport { DropdownToggle } from 'reactstrap';\nimport './index.css';\n\nconst DropdownToggleSelect = props => {\n  const style = Object.assign({}, { textAlign: 'left' }, props.style);\n\n  return (\n    <DropdownToggle\n      outline\n      color=\"dropdown-toggle-select\"\n      block\n      {...props}\n      className=\"dropdown-toggle-select\"\n      style={style}\n    />\n  );\n};\n\n// Rely on the propTypes provided by reacstrap\nDropdownToggleSelect.propTypes = {\n  className: PropTypes.string,\n  style: PropTypes.object,\n  disabled: PropTypes.bool,\n  onClick: PropTypes.func,\n  'data-toggle': PropTypes.string,\n  'aria-haspopup': PropTypes.bool,\n  // For DropdownToggle usage inside a Nav\n  nav: PropTypes.bool,\n  // Defaults to Button component\n  tag: PropTypes.any\n};\n\nexport default DropdownToggleSelect;\n"
  },
  {
    "path": "src/common/dropdown-toggle-select/index.story.jsx",
    "content": "import React from 'react';\nimport { storiesOf } from '@storybook/react';\nimport { action } from '@storybook/addon-actions';\nimport 'bootstrap/dist/css/bootstrap.css';\nimport { UncontrolledDropdown, DropdownMenu, DropdownItem } from 'reactstrap';\nimport DropdownToggleSelect from './index.jsx';\n\nstoriesOf('Common/DropdownToggleSelect', module).add('default', () => (\n  <UncontrolledDropdown inNavbar>\n    <DropdownToggleSelect>Dropdown</DropdownToggleSelect>\n    <DropdownMenu>\n      <DropdownItem onClick={action('onClick - Item 1')}>Item 1</DropdownItem>\n      <DropdownItem onClick={action('onClick - Item 2')}>Item 2</DropdownItem>\n      <DropdownItem onClick={action('onClick - Item 3')}>Item 3</DropdownItem>\n    </DropdownMenu>\n  </UncontrolledDropdown>\n));\n"
  },
  {
    "path": "src/common/dropdown-toggle-select/index.test.jsx",
    "content": "import React from 'react';\nimport { shallow } from 'enzyme';\nimport DropdownToggleSelect from './index.jsx';\n\ndescribe('Common DropdownToggleSelect', () => {\n  it('renders without crashing', () => {\n    shallow(<DropdownToggleSelect>Dropdown</DropdownToggleSelect>);\n  });\n});\n"
  },
  {
    "path": "src/editor/document/index.css",
    "content": "@media only print {\n  .no-print {\n    display: none !important;\n  }\n}\n\n@media only screen {\n  .only-print {\n    display: none !important;\n  }\n}\n\ncode {\n  counter-reset: line;\n}\n\n.code-line {\n  counter-increment: line;\n  position: relative;\n  display: block;\n  margin-left: 2.5em;\n  padding-left: 1em;\n  border-left: 1px solid transparent;\n}\n\n.code-line:before {\n  content: '  ' counter(line);\n  position: absolute;\n  margin-left: -3.5em;\n  color: #212529;\n}\n\n.code-line:nth-child(n + 10):before {\n  content: ' ' counter(line);\n}\n\n.code-line:nth-child(n + 100):before {\n  content: counter(line);\n}\n\n.code-line-vertical {\n  counter-increment: line;\n  position: relative;\n  display: block;\n  margin-left: 2.5em;\n  padding-left: 1em;\n  border-left: 1px solid #212529;\n}\n\n.code-line-vertical:before {\n  content: '  ' counter(line);\n  position: absolute;\n  margin-left: -3.5em;\n  color: #212529;\n}\n\n.code-line-vertical:nth-child(n + 10):before {\n  content: ' ' counter(line);\n}\n\n.code-line-vertical:nth-child(n + 100):before {\n  content: counter(line);\n}\n"
  },
  {
    "path": "src/editor/document/index.jsx",
    "content": "import React, { Component } from 'react';\nimport PropTypes from 'prop-types';\nimport { Row, Col, Input } from 'reactstrap';\nimport SyntaxHighlighter from 'react-syntax-highlighter';\nimport {\n  defaultStyle,\n  arduinoLight,\n  ascetic,\n  docco,\n  githubGist,\n  grayscale,\n  idea,\n  tomorrow,\n  vs,\n  xcode\n} from 'react-syntax-highlighter/dist/esm/styles/hljs';\nimport './index.css';\n\nconst themeMap = {\n  Arduino: arduinoLight,\n  Ascetic: ascetic,\n  Docco: docco,\n  GitHub: githubGist,\n  Grayscale: grayscale,\n  hljs: defaultStyle,\n  Idea: idea,\n  Tomorrow: tomorrow,\n  VS: vs,\n  Xcode: xcode\n};\n\nconst themes = Object.keys(themeMap);\n\nclass Document extends Component {\n  constructor(props) {\n    super(props);\n\n    this.defaultCode =\n      '// Welcome to codeprinter!\\n' +\n      'const foo = () => {\\n' +\n      \"  console.log('This is where your code will be printed out!');\\n\" +\n      '};';\n\n    this.state = {\n      code: this.defaultCode\n    };\n\n    this.onChange = this.onChange.bind(this);\n  }\n\n  onChange(event) {\n    const code = event.target.value === '' ? this.defaultCode : event.target.value;\n    this.setState({ code });\n  }\n\n  render() {\n    let placeholder = 'Paste your code in here!';\n\n    const lineNumberStyle = lineNumbers => {\n      switch (lineNumbers) {\n        case 'standard':\n          return { className: 'code-line' };\n        case 'vertical':\n          return { className: 'code-line-vertical' };\n        default:\n          return null;\n      }\n    };\n\n    return (\n      <div className=\"h-100 d-flex flex-column\">\n        <Row className=\"no-print flex-grow-1\">\n          <Col className=\"flex-grow-1\">\n            <Input\n              type=\"textarea\"\n              id=\"typeSpace\"\n              placeholder={placeholder}\n              onChange={this.onChange}\n              style={{ height: '100%', resize: 'none' }}\n            />\n          </Col>\n        </Row>\n\n        <div id=\"printSpace\" className=\"only-print\" style={{ fontSize: '62.5%' }}>\n          <SyntaxHighlighter\n            lineProps={lineNumberStyle(this.props.lineNumbers)}\n            wrapLines={true}\n            style={themeMap[this.props.theme] || ''}\n            codeTagProps={{\n              style: { fontFamily: `\"${this.props.font}\", monospace`, fontSize: `${this.props.size}pt` }\n            }}\n            lineNumberStyle={{ fontFamily: `\"${this.props.font}\", monospace`, fontSize: `${this.props.size}pt` }}\n            customStyle={{ border: 'none' }}\n          >\n            {this.state.code}\n          </SyntaxHighlighter>\n        </div>\n      </div>\n    );\n  }\n}\n\nDocument.propTypes = {\n  font: PropTypes.string.isRequired,\n  size: PropTypes.number.isRequired,\n  theme: PropTypes.oneOf(['None', ...Object.keys(themeMap)]).isRequired,\n  lineNumbers: PropTypes.oneOf(['none', 'standard', 'vertical']).isRequired\n};\n\nexport default Document;\nexport { Document, themes };\n"
  },
  {
    "path": "src/editor/document/index.story.jsx",
    "content": "import React from 'react';\nimport { storiesOf } from '@storybook/react';\nimport 'bootstrap/dist/css/bootstrap.css';\nimport Document from './index';\n\nstoriesOf('Editor/Document', module).add('default', () => (\n  <Document font={'Anonymous Pro'} size={12} theme={'GitHub'} numbers={true} />\n));\n"
  },
  {
    "path": "src/editor/document/index.test.jsx",
    "content": "import React from 'react';\nimport { shallow } from 'enzyme';\nimport { Document, themes } from './index';\nimport { Input } from 'reactstrap';\nimport SyntaxHighlighter from 'react-syntax-highlighter';\n\ndescribe('Editor Document', () => {\n  it('renders without crashing', () => {\n    shallow(<Document font={'Anonymous Pro'} size={12} theme={'GitHub'} lineNumbers={'standard'} />);\n  });\n\n  it('renders the print section with some default code when text is not provided', () => {\n    const document = shallow(<Document font={'Anonymous Pro'} size={12} theme={'GitHub'} lineNumbers={'standard'} />);\n    const expectedDefaultCode =\n      '// Welcome to codeprinter!\\n' +\n      'const foo = () => {\\n' +\n      \"  console.log('This is where your code will be printed out!');\\n\" +\n      '};';\n    const syntaxHighlighter = document.find(SyntaxHighlighter);\n\n    expect(syntaxHighlighter.children().text()).toEqual(expectedDefaultCode);\n  });\n\n  it('adds text to the print section when typing in the text area', () => {\n    const document = shallow(<Document font={'Anonymous Pro'} size={12} theme={'GitHub'} lineNumbers={'standard'} />);\n    const expectedCode = 'some code';\n\n    document.find(Input).simulate('change', { target: { value: expectedCode } });\n\n    const syntaxHighlighter = document.find(SyntaxHighlighter);\n\n    expect(syntaxHighlighter.children().text()).toEqual(expectedCode);\n  });\n\n  it('renders the placeholder', () => {\n    const document = shallow(<Document font={'Anonymous Pro'} size={12} theme={'GitHub'} lineNumbers={'none'} />);\n    const expectedPlaceholder = 'Paste your code in here!';\n\n    const textarea = document.find(Input);\n\n    expect(textarea.prop('placeholder')).toEqual(expectedPlaceholder);\n  });\n\n  it('renders the code with the specified font', () => {\n    const expectedFont = 'Space Mono';\n    const document = shallow(<Document font={expectedFont} size={12} theme={'GitHub'} lineNumbers={'standard'} />);\n\n    const syntaxHighlighter = document.find(SyntaxHighlighter);\n\n    expect(syntaxHighlighter.prop('codeTagProps').style.fontFamily).toEqual(`\"${expectedFont}\", monospace`);\n  });\n\n  it('renders the code with the specified font size', () => {\n    const expectedSize = 14;\n    const document = shallow(\n      <Document font={'Anonymous Pro'} size={expectedSize} theme={'GitHub'} lineNumbers={'standard'} />\n    );\n\n    const syntaxHighlighter = document.find(SyntaxHighlighter);\n\n    expect(syntaxHighlighter.prop('codeTagProps').style.fontSize).toEqual(`${expectedSize}pt`);\n  });\n\n  it('renders the code with the specified theme', () => {\n    const document = shallow(<Document font={'Anonymous Pro'} size={12} theme={'GitHub'} lineNumbers={'none'} />);\n\n    const syntaxHighlighter = document.find(SyntaxHighlighter);\n\n    expect(syntaxHighlighter.prop('style')).not.toEqual('');\n  });\n\n  it('renders the code with no theme if the theme passed is None', () => {\n    const document = shallow(<Document font={'Anonymous Pro'} size={12} theme={'None'} lineNumbers={'none'} />);\n\n    const syntaxHighlighter = document.find(SyntaxHighlighter);\n\n    expect(syntaxHighlighter.prop('style')).toEqual('');\n  });\n\n  it('renders the code without line numbers', () => {\n    const lineNumbers = 'none';\n    const document = shallow(<Document font={'Anonymous Pro'} size={12} theme={'GitHub'} lineNumbers={lineNumbers} />);\n\n    const syntaxHighlighter = document.find(SyntaxHighlighter);\n\n    expect(syntaxHighlighter.prop('lineProps')).toBeNull();\n  });\n\n  it('renders the code with standard line numbers', () => {\n    const lineNumbers = 'standard';\n    const document = shallow(<Document font={'Anonymous Pro'} size={12} theme={'GitHub'} lineNumbers={lineNumbers} />);\n\n    const syntaxHighlighter = document.find(SyntaxHighlighter);\n\n    expect(syntaxHighlighter.prop('lineProps')).toEqual({ className: 'code-line' });\n  });\n\n  it('renders the code with vertical line numbers', () => {\n    const lineNumbers = 'vertical';\n    const document = shallow(<Document font={'Anonymous Pro'} size={12} theme={'GitHub'} lineNumbers={lineNumbers} />);\n\n    const syntaxHighlighter = document.find(SyntaxHighlighter);\n\n    expect(syntaxHighlighter.prop('lineProps')).toEqual({ className: 'code-line-vertical' });\n  });\n});\n\ndescribe('Editor Document Theme Map', () => {\n  it('returns a map of the available themes', () => {\n    const expectedThemes = [\n      'Arduino',\n      'Ascetic',\n      'Docco',\n      'GitHub',\n      'Grayscale',\n      'hljs',\n      'Idea',\n      'Tomorrow',\n      'VS',\n      'Xcode'\n    ];\n\n    expect(themes).toEqual(expectedThemes);\n  });\n});\n"
  },
  {
    "path": "src/editor/index.jsx",
    "content": "import React, { Component } from 'react';\nimport { Container } from 'reactstrap';\nimport Toolbar from './toolbar';\nimport { Document, themes } from './document';\n\nclass Editor extends Component {\n  constructor(props) {\n    super(props);\n\n    this.fonts = [\n      'Anonymous Pro',\n      'Cousine',\n      'Cutive Mono',\n      'Fira Mono',\n      'IBM Plex Mono',\n      'Inconsolata',\n      'Nanum Gothic Coding',\n      'Nova Mono',\n      'Overpass Mono',\n      'Oxygen Mono',\n      'PT Mono',\n      'Roboto Mono',\n      'Share Tech Mono',\n      'Source Code Pro',\n      'Space Mono',\n      'Ubuntu Mono'\n    ];\n\n    this.sizes = [8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18];\n\n    this.themes = ['None', ...themes];\n\n    this.state = {\n      style: {\n        font: this.fonts[11],\n        size: this.sizes[2],\n        theme: this.themes[0],\n        lineNumbers: 'none'\n      }\n    };\n\n    this.onChange = this.onChange.bind(this);\n  }\n\n  onPrint() {\n    window.print();\n  }\n\n  onChange(toolbar) {\n    const style = {\n      font: toolbar.activeFont,\n      size: toolbar.activeSize,\n      theme: toolbar.activeTheme,\n      lineNumbers: toolbar.lineNumbers\n    };\n    this.setState({ style });\n  }\n\n  render() {\n    return (\n      <div className=\"responsive-container\">\n        <Toolbar\n          fonts={this.fonts}\n          activeFont={this.state.style.font}\n          sizes={this.sizes}\n          activeSize={this.state.style.size}\n          themes={this.themes}\n          activeTheme={this.state.style.theme}\n          lineNumbers={this.state.style.lineNumbers}\n          onChange={this.onChange}\n          onPrint={this.onPrint}\n        />\n        <Container fluid={true} className=\"h-100\">\n          <Document\n            font={this.state.style.font}\n            size={this.state.style.size}\n            theme={this.state.style.theme}\n            lineNumbers={this.state.style.lineNumbers}\n          />\n        </Container>\n      </div>\n    );\n  }\n}\n\nEditor.propTypes = {};\n\nexport default Editor;\n"
  },
  {
    "path": "src/editor/index.story.jsx",
    "content": "import React from 'react';\nimport { storiesOf } from '@storybook/react';\nimport 'bootstrap/dist/css/bootstrap.css';\nimport Editor from './index';\n\nstoriesOf('Editor', module).add('default', () => <Editor />);\n"
  },
  {
    "path": "src/editor/index.test.jsx",
    "content": "import React from 'react';\nimport { shallow, mount } from 'enzyme';\nimport Editor from './index';\nimport Toolbar from './toolbar';\nimport Document from './document';\nimport FontDropdown from './toolbar/font-dropdown';\nimport SizeDropdown from './toolbar/size-dropdown';\nimport ThemeDropdown from './toolbar/theme-dropdown';\nimport { Button, DropdownItem } from 'reactstrap';\n\ndescribe('Editor', () => {\n  it('renders without crashing', () => {\n    shallow(<Editor />);\n  });\n\n  it('renders a toolbar', () => {\n    const editor = shallow(<Editor />);\n    const toolbar = editor.find(Toolbar);\n\n    const expectedFonts = [\n      'Anonymous Pro',\n      'Cousine',\n      'Cutive Mono',\n      'Fira Mono',\n      'IBM Plex Mono',\n      'Inconsolata',\n      'Nanum Gothic Coding',\n      'Nova Mono',\n      'Overpass Mono',\n      'Oxygen Mono',\n      'PT Mono',\n      'Roboto Mono',\n      'Share Tech Mono',\n      'Source Code Pro',\n      'Space Mono',\n      'Ubuntu Mono'\n    ];\n\n    expect(toolbar.prop('fonts')).toEqual(expectedFonts);\n    expect(toolbar.prop('activeFont')).toEqual(expectedFonts[11]);\n\n    const expectedSizes = [8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18];\n\n    expect(toolbar.prop('sizes')).toEqual(expectedSizes);\n    expect(toolbar.prop('activeSize')).toEqual(expectedSizes[2]);\n\n    const expectedThemes = [\n      'None',\n      'Arduino',\n      'Ascetic',\n      'Docco',\n      'GitHub',\n      'Grayscale',\n      'hljs',\n      'Idea',\n      'Tomorrow',\n      'VS',\n      'Xcode'\n    ];\n\n    expect(toolbar.prop('themes')).toEqual(expectedThemes);\n    expect(toolbar.prop('activeTheme')).toEqual(expectedThemes[0]);\n\n    expect(toolbar.prop('lineNumbers')).toEqual('none');\n  });\n\n  it('renders a document', () => {\n    const editor = shallow(<Editor />);\n    const document = editor.find(Document);\n\n    expect(document.prop('font')).toEqual('Roboto Mono');\n    expect(document.prop('size')).toEqual(10);\n    expect(document.prop('theme')).toEqual('None');\n    expect(document.prop('lineNumbers')).toEqual('none');\n  });\n\n  it('prints the page when the print button is pressed', () => {\n    global.print = jest.fn();\n    const editor = shallow(<Editor />);\n    const toolbar = editor.find(Toolbar);\n    const printButton = toolbar\n      .dive()\n      .find(Button)\n      .find('#print');\n\n    printButton.simulate('click');\n\n    expect(global.print).toHaveBeenCalledTimes(1);\n  });\n\n  it('renders a font change on toolbar font select', () => {\n    const editor = shallow(<Editor />);\n    const toolbar = editor.find(Toolbar);\n    const fontDropdown = toolbar.dive().find(FontDropdown);\n    const dropdownItems = fontDropdown.dive().find(DropdownItem);\n\n    dropdownItems.at(2).simulate('click');\n    editor.update();\n\n    const document = editor.find(Document);\n\n    expect(document.prop('font')).not.toEqual('Roboto Mono');\n  });\n\n  it('renders a size change on toolbar size select', () => {\n    const editor = shallow(<Editor />);\n    const toolbar = editor.find(Toolbar);\n    const sizeDropdown = toolbar.dive().find(SizeDropdown);\n    const dropdownItems = sizeDropdown.dive().find(DropdownItem);\n\n    dropdownItems.at(6).simulate('click');\n    editor.update();\n\n    const document = editor.find(Document);\n\n    expect(document.prop('size')).not.toEqual(10);\n  });\n\n  it('renders a theme change on toolbar theme select', () => {\n    const editor = shallow(<Editor />);\n    const toolbar = editor.find(Toolbar);\n    const themeDropdown = toolbar.dive().find(ThemeDropdown);\n    const dropdownItems = themeDropdown.dive().find(DropdownItem);\n\n    dropdownItems.at(2).simulate('click');\n    editor.update();\n\n    const document = editor.find(Document);\n\n    expect(document.prop('size')).not.toEqual('None');\n  });\n});\n"
  },
  {
    "path": "src/editor/toolbar/font-dropdown/__snapshots__/index.test.jsx.snap",
    "content": "// Jest Snapshot v1, https://goo.gl/fbAQLP\n\nexports[`Editor Toolbar FontDropdown renders all of the fonts as dropdown options 1`] = `\n<div\n  className=\"dropdown\"\n  onKeyDown={[Function]}\n>\n  <button\n    aria-expanded={false}\n    aria-haspopup={true}\n    aria-label={null}\n    className=\"dropdown-toggle-select btn btn-outline-dropdown-toggle-select btn-block\"\n    onClick={[Function]}\n    style={\n      Object {\n        \"fontFamily\": \"\\\\\"sans-serif\\\\\", monospace\",\n        \"textAlign\": \"left\",\n      }\n    }\n    type=\"button\"\n  >\n    sans-serif\n  </button>\n  <div\n    aria-hidden={true}\n    className=\"dropdown-menu\"\n    role=\"menu\"\n    tabIndex=\"-1\"\n  >\n    <button\n      className=\"dropdown-item\"\n      onClick={[Function]}\n      role=\"menuitem\"\n      style={\n        Object {\n          \"fontFamily\": \"\\\\\"serif\\\\\", monospace\",\n        }\n      }\n      tabIndex=\"0\"\n      type=\"button\"\n    >\n      serif\n    </button>\n    <button\n      className=\"dropdown-item active\"\n      onClick={[Function]}\n      role=\"menuitem\"\n      style={\n        Object {\n          \"fontFamily\": \"\\\\\"sans-serif\\\\\", monospace\",\n        }\n      }\n      tabIndex=\"0\"\n      type=\"button\"\n    >\n      sans-serif\n    </button>\n  </div>\n</div>\n`;\n"
  },
  {
    "path": "src/editor/toolbar/font-dropdown/index.jsx",
    "content": "import React from 'react';\nimport PropTypes from 'prop-types';\nimport { UncontrolledDropdown, DropdownMenu, DropdownItem } from 'reactstrap';\nimport DropdownToggleSelect from '../../../common/dropdown-toggle-select';\n\nconst FontDropdown = ({ fonts, active, onSelect }) => {\n  const dropdownItems = fonts.map(font => {\n    return (\n      <DropdownItem\n        key={font}\n        active={font === active}\n        onClick={() => onSelect(font)}\n        style={{ fontFamily: `\"${font}\", monospace` }}\n      >\n        {font}\n      </DropdownItem>\n    );\n  });\n\n  return (\n    <UncontrolledDropdown inNavbar>\n      <DropdownToggleSelect style={{ fontFamily: `\"${active}\", monospace` }}>{active}</DropdownToggleSelect>\n      <DropdownMenu>{dropdownItems}</DropdownMenu>\n    </UncontrolledDropdown>\n  );\n};\n\nFontDropdown.propTypes = {\n  fonts: PropTypes.arrayOf(PropTypes.string).isRequired,\n  active: PropTypes.string.isRequired,\n  onSelect: PropTypes.func\n};\n\nexport default FontDropdown;\n"
  },
  {
    "path": "src/editor/toolbar/font-dropdown/index.story.jsx",
    "content": "import React from 'react';\nimport { storiesOf } from '@storybook/react';\nimport { action } from '@storybook/addon-actions';\nimport 'bootstrap/dist/css/bootstrap.css';\nimport FontDropdown from './index';\n\nstoriesOf('Editor/Toolbar/FontDropdown', module).add('default', () => {\n  const fonts = ['Anonymous Pro', 'Cousine', 'Cutive Mono'];\n\n  return <FontDropdown fonts={fonts} active={fonts[0]} onSelect={action('selected')} />;\n});\n"
  },
  {
    "path": "src/editor/toolbar/font-dropdown/index.test.jsx",
    "content": "import React from 'react';\nimport { shallow } from 'enzyme';\nimport renderer from 'react-test-renderer';\nimport FontDropdown from './index';\nimport { DropdownItem } from 'reactstrap';\n\ndescribe('Editor Toolbar FontDropdown', () => {\n  it('renders without crashing', () => {\n    const fonts = ['serif', 'sans-serif'];\n    shallow(<FontDropdown fonts={fonts} active={fonts[0]} onSelect={() => {}} />);\n  });\n\n  it('renders all of the fonts as dropdown options', () => {\n    const fonts = ['serif', 'sans-serif'];\n    const tree = renderer.create(<FontDropdown fonts={fonts} active={fonts[1]} onSelect={() => {}} />).toJSON();\n\n    expect(tree).toMatchSnapshot();\n  });\n\n  it('calls the onSelect function on selecting a dropdown option', () => {\n    const fonts = ['serif', 'sans-serif'];\n    const onSelect = jest.fn();\n    const fontDropdown = shallow(<FontDropdown fonts={fonts} active={fonts[0]} onSelect={onSelect} />);\n\n    fontDropdown\n      .find(DropdownItem)\n      .last()\n      .simulate('click');\n\n    expect(onSelect).toHaveBeenCalledTimes(1);\n  });\n});\n"
  },
  {
    "path": "src/editor/toolbar/index.jsx",
    "content": "import React from 'react';\nimport PropTypes from 'prop-types';\nimport { Col, Navbar, Button } from 'reactstrap';\nimport FontDropdown from './font-dropdown';\nimport SizeDropdown from './size-dropdown';\nimport ThemeDropdown from './theme-dropdown';\n\nconst Toolbar = ({ fonts, activeFont, sizes, activeSize, themes, activeTheme, lineNumbers, onChange, onPrint }) => {\n  return (\n    <Navbar color=\"#FFFFFF\" light expand=\"sm\" style={{ marginBottom: 5 }}>\n      <div className=\"form-row\" style={{ width: '100%' }}>\n        <Col xs=\"9\" md=\"4\" className=\"my-2 my-md-0\">\n          <FontDropdown\n            fonts={fonts}\n            active={activeFont}\n            onSelect={activeFont => onChange({ activeFont, activeSize, activeTheme, lineNumbers })}\n          />\n        </Col>\n        <Col xs=\"3\" md=\"2\" className=\"my-2 my-md-0\">\n          <SizeDropdown\n            sizes={sizes}\n            active={activeSize}\n            onSelect={activeSize => onChange({ activeFont, activeSize, activeTheme, lineNumbers })}\n          />\n        </Col>\n        <Col xs=\"12\" md=\"3\" className=\"my-2 my-md-0\">\n          <ThemeDropdown\n            themes={themes}\n            active={activeTheme}\n            onSelect={activeTheme => onChange({ activeFont, activeSize, activeTheme, lineNumbers })}\n          />\n        </Col>\n        <Col xs=\"4\" md=\"auto\" className=\"my-2 my-md-0\">\n          <Button\n            id=\"line-numbers-none\"\n            active={lineNumbers === 'none'}\n            outline\n            color=\"secondary\"\n            style={{ width: '100%' }}\n            onClick={() => onChange({ activeFont, activeSize, activeTheme, lineNumbers: 'none' })}\n          >\n            -\n          </Button>\n        </Col>\n        <Col xs=\"4\" md=\"auto\" className=\"my-2 my-md-0\">\n          <Button\n            id=\"line-numbers-standard\"\n            active={lineNumbers === 'standard'}\n            outline\n            color=\"secondary\"\n            style={{ width: '100%' }}\n            onClick={() => onChange({ activeFont, activeSize, activeTheme, lineNumbers: 'standard' })}\n          >\n            #\n          </Button>\n        </Col>\n        <Col xs=\"4\" md=\"auto\" className=\"my-2 my-md-0\">\n          <Button\n            id=\"line-numbers-vertical\"\n            active={lineNumbers === 'vertical'}\n            outline\n            color=\"secondary\"\n            style={{ width: '100%' }}\n            onClick={() => onChange({ activeFont, activeSize, activeTheme, lineNumbers: 'vertical' })}\n          >\n            #|\n          </Button>\n        </Col>\n        <Col xs=\"12\" md=\"auto\" className=\"my-2 my-md-0\">\n          <Button id=\"print\" outline color=\"success\" onClick={onPrint} style={{ width: '100%' }}>\n            Print\n          </Button>\n        </Col>\n      </div>\n    </Navbar>\n  );\n};\n\nToolbar.propTypes = {\n  fonts: PropTypes.arrayOf(PropTypes.string).isRequired,\n  activeFont: PropTypes.string.isRequired,\n  sizes: PropTypes.arrayOf(PropTypes.number).isRequired,\n  activeSize: PropTypes.number.isRequired,\n  themes: PropTypes.arrayOf(PropTypes.string).isRequired,\n  activeTheme: PropTypes.string.isRequired,\n  lineNumbers: PropTypes.oneOf(['none', 'standard', 'vertical']).isRequired,\n  onChange: PropTypes.func,\n  onPrint: PropTypes.func\n};\n\nexport default Toolbar;\n"
  },
  {
    "path": "src/editor/toolbar/index.story.jsx",
    "content": "import React from 'react';\nimport { storiesOf } from '@storybook/react';\nimport { action } from '@storybook/addon-actions';\nimport 'bootstrap/dist/css/bootstrap.css';\nimport Toolbar from './index';\n\nstoriesOf('Editor/Toolbar', module).add('default', () => {\n  const fonts = ['Anonymous Pro', 'Cousine', 'Cutive Mono'];\n\n  const sizes = [8, 9, 10, 11, 12];\n\n  const themes = ['GitHub', 'VS', 'Xcode'];\n\n  return (\n    <Toolbar\n      fonts={fonts}\n      activeFont={fonts[0]}\n      sizes={sizes}\n      activeSize={sizes[0]}\n      themes={themes}\n      activeTheme={themes[0]}\n      linNumbers={'none'}\n      onChange={action('changed')}\n      onPrint={action('print')}\n    />\n  );\n});\n"
  },
  {
    "path": "src/editor/toolbar/index.test.jsx",
    "content": "import React from 'react';\nimport { shallow } from 'enzyme';\nimport Toolbar from './index';\nimport FontDropdown from './font-dropdown';\nimport SizeDropdown from './size-dropdown';\nimport ThemeDropdown from './theme-dropdown';\n\ndescribe('Editor Toolbar', () => {\n  it('renders without crashing', () => {\n    const fonts = ['Anonymous Pro', 'Cousine', 'Cutive Mono'];\n\n    const sizes = [8, 9, 10, 11, 12];\n\n    const themes = ['GitHub', 'VS', 'Xcode'];\n\n    shallow(\n      <Toolbar\n        fonts={fonts}\n        activeFont={fonts[0]}\n        sizes={sizes}\n        activeSize={sizes[0]}\n        themes={themes}\n        activeTheme={themes[0]}\n        lineNumbers={'none'}\n        onChange={() => {}}\n        onPrint={() => {}}\n      />\n    );\n  });\n\n  it('renders the fonts in a dropdown', () => {\n    const fonts = ['Anonymous Pro', 'Cousine', 'Cutive Mono'];\n\n    const sizes = [8, 9, 10, 11, 12];\n\n    const themes = ['GitHub', 'VS', 'Xcode'];\n\n    const toolbar = shallow(\n      <Toolbar\n        fonts={fonts}\n        activeFont={fonts[0]}\n        sizes={sizes}\n        activeSize={sizes[0]}\n        themes={themes}\n        activeTheme={themes[0]}\n        lineNumbers={'none'}\n        onChange={() => {}}\n        onPrint={() => {}}\n      />\n    );\n\n    const fontDropdown = toolbar.find(FontDropdown);\n\n    expect(fontDropdown.prop('fonts')).toEqual(fonts);\n    expect(fontDropdown.prop('active')).toEqual(fonts[0]);\n  });\n\n  it('renders the sizes in a dropdown', () => {\n    const fonts = ['Anonymous Pro', 'Cousine', 'Cutive Mono'];\n\n    const sizes = [8, 9, 10, 11, 12];\n\n    const themes = ['GitHub', 'VS', 'Xcode'];\n\n    const toolbar = shallow(\n      <Toolbar\n        fonts={fonts}\n        activeFont={fonts[0]}\n        sizes={sizes}\n        activeSize={sizes[0]}\n        themes={themes}\n        activeTheme={themes[0]}\n        lineNumbers={'none'}\n        onChange={() => {}}\n        onPrint={() => {}}\n      />\n    );\n\n    const sizeDropdown = toolbar.find(SizeDropdown);\n\n    expect(sizeDropdown.prop('sizes')).toEqual(sizes);\n    expect(sizeDropdown.prop('active')).toEqual(sizes[0]);\n  });\n\n  it('renders the themes in a dropdown', () => {\n    const fonts = ['Anonymous Pro', 'Cousine', 'Cutive Mono'];\n\n    const sizes = [8, 9, 10, 11, 12];\n\n    const themes = ['GitHub', 'VS', 'Xcode'];\n\n    const toolbar = shallow(\n      <Toolbar\n        fonts={fonts}\n        activeFont={fonts[0]}\n        sizes={sizes}\n        activeSize={sizes[0]}\n        themes={themes}\n        activeTheme={themes[0]}\n        lineNumbers={'none'}\n        onChange={() => {}}\n        onPrint={() => {}}\n      />\n    );\n\n    const themeDropdown = toolbar.find(ThemeDropdown);\n\n    expect(themeDropdown.prop('themes')).toEqual(themes);\n    expect(themeDropdown.prop('active')).toEqual(themes[0]);\n  });\n\n  it('renders none line numbers (none)', () => {\n    const fonts = ['Anonymous Pro', 'Cousine', 'Cutive Mono'];\n\n    const sizes = [8, 9, 10, 11, 12];\n\n    const themes = ['GitHub', 'VS', 'Xcode'];\n\n    const toolbar = shallow(\n      <Toolbar\n        fonts={fonts}\n        activeFont={fonts[0]}\n        sizes={sizes}\n        activeSize={sizes[0]}\n        themes={themes}\n        activeTheme={themes[0]}\n        lineNumbers={'none'}\n        onChange={() => {}}\n        onPrint={() => {}}\n      />\n    );\n\n    const lineNumbersNoneButton = toolbar.find('#line-numbers-none');\n    const lineNumbersStandardButton = toolbar.find('#line-numbers-standard');\n    const lineNumbersVerticalButton = toolbar.find('#line-numbers-vertical');\n\n    expect(lineNumbersNoneButton.prop('active')).toEqual(true);\n    expect(lineNumbersStandardButton.prop('active')).toEqual(false);\n    expect(lineNumbersVerticalButton.prop('active')).toEqual(false);\n  });\n\n  it('renders none line numbers (standard)', () => {\n    const fonts = ['Anonymous Pro', 'Cousine', 'Cutive Mono'];\n\n    const sizes = [8, 9, 10, 11, 12];\n\n    const themes = ['GitHub', 'VS', 'Xcode'];\n\n    const toolbar = shallow(\n      <Toolbar\n        fonts={fonts}\n        activeFont={fonts[0]}\n        sizes={sizes}\n        activeSize={sizes[0]}\n        themes={themes}\n        activeTheme={themes[0]}\n        lineNumbers={'standard'}\n        onChange={() => {}}\n        onPrint={() => {}}\n      />\n    );\n\n    const lineNumbersNoneButton = toolbar.find('#line-numbers-none');\n    const lineNumbersStandardButton = toolbar.find('#line-numbers-standard');\n    const lineNumbersVerticalButton = toolbar.find('#line-numbers-vertical');\n\n    expect(lineNumbersNoneButton.prop('active')).toEqual(false);\n    expect(lineNumbersStandardButton.prop('active')).toEqual(true);\n    expect(lineNumbersVerticalButton.prop('active')).toEqual(false);\n  });\n\n  it('renders none line numbers (none)', () => {\n    const fonts = ['Anonymous Pro', 'Cousine', 'Cutive Mono'];\n\n    const sizes = [8, 9, 10, 11, 12];\n\n    const themes = ['GitHub', 'VS', 'Xcode'];\n\n    const toolbar = shallow(\n      <Toolbar\n        fonts={fonts}\n        activeFont={fonts[0]}\n        sizes={sizes}\n        activeSize={sizes[0]}\n        themes={themes}\n        activeTheme={themes[0]}\n        lineNumbers={'vertical'}\n        onChange={() => {}}\n        onPrint={() => {}}\n      />\n    );\n\n    const lineNumbersNoneButton = toolbar.find('#line-numbers-none');\n    const lineNumbersStandardButton = toolbar.find('#line-numbers-standard');\n    const lineNumbersVerticalButton = toolbar.find('#line-numbers-vertical');\n\n    expect(lineNumbersNoneButton.prop('active')).toEqual(false);\n    expect(lineNumbersStandardButton.prop('active')).toEqual(false);\n    expect(lineNumbersVerticalButton.prop('active')).toEqual(true);\n  });\n});\n"
  },
  {
    "path": "src/editor/toolbar/size-dropdown/__snapshots__/index.test.jsx.snap",
    "content": "// Jest Snapshot v1, https://goo.gl/fbAQLP\n\nexports[`Editor Toolbar SizeDropdown renders all of the sizes as dropdown options 1`] = `\n<div\n  className=\"dropdown\"\n  onKeyDown={[Function]}\n>\n  <button\n    aria-expanded={false}\n    aria-haspopup={true}\n    aria-label={null}\n    className=\"dropdown-toggle-select btn btn-outline-dropdown-toggle-select btn-block\"\n    onClick={[Function]}\n    style={\n      Object {\n        \"textAlign\": \"left\",\n      }\n    }\n    type=\"button\"\n  >\n    9\n  </button>\n  <div\n    aria-hidden={true}\n    className=\"dropdown-menu\"\n    role=\"menu\"\n    tabIndex=\"-1\"\n  >\n    <button\n      className=\"dropdown-item\"\n      onClick={[Function]}\n      role=\"menuitem\"\n      tabIndex=\"0\"\n      type=\"button\"\n    >\n      8\n    </button>\n    <button\n      className=\"dropdown-item active\"\n      onClick={[Function]}\n      role=\"menuitem\"\n      tabIndex=\"0\"\n      type=\"button\"\n    >\n      9\n    </button>\n    <button\n      className=\"dropdown-item\"\n      onClick={[Function]}\n      role=\"menuitem\"\n      tabIndex=\"0\"\n      type=\"button\"\n    >\n      10\n    </button>\n    <button\n      className=\"dropdown-item\"\n      onClick={[Function]}\n      role=\"menuitem\"\n      tabIndex=\"0\"\n      type=\"button\"\n    >\n      11\n    </button>\n    <button\n      className=\"dropdown-item\"\n      onClick={[Function]}\n      role=\"menuitem\"\n      tabIndex=\"0\"\n      type=\"button\"\n    >\n      12\n    </button>\n  </div>\n</div>\n`;\n"
  },
  {
    "path": "src/editor/toolbar/size-dropdown/index.jsx",
    "content": "import React from 'react';\nimport PropTypes from 'prop-types';\nimport { UncontrolledDropdown, DropdownMenu, DropdownItem } from 'reactstrap';\nimport DropdownToggleSelect from '../../../common/dropdown-toggle-select';\n\nconst SizeDropdown = ({ sizes, active, onSelect }) => {\n  const dropdownItems = sizes.map(size => (\n    <DropdownItem key={size} active={size === active} onClick={() => onSelect(size)}>\n      {size}\n    </DropdownItem>\n  ));\n\n  return (\n    <UncontrolledDropdown inNavbar>\n      <DropdownToggleSelect>{active}</DropdownToggleSelect>\n      <DropdownMenu>{dropdownItems}</DropdownMenu>\n    </UncontrolledDropdown>\n  );\n};\n\nSizeDropdown.propTypes = {\n  sizes: PropTypes.arrayOf(PropTypes.number).isRequired,\n  active: PropTypes.number.isRequired,\n  onSelect: PropTypes.func\n};\n\nexport default SizeDropdown;\n"
  },
  {
    "path": "src/editor/toolbar/size-dropdown/index.story.jsx",
    "content": "import React from 'react';\nimport { storiesOf } from '@storybook/react';\nimport { action } from '@storybook/addon-actions';\nimport 'bootstrap/dist/css/bootstrap.css';\nimport SizeDropdown from './index';\n\nstoriesOf('Editor/Toolbar/SizeDropdown', module).add('default', () => {\n  const sizes = [8, 9, 10, 11, 12];\n\n  return <SizeDropdown sizes={sizes} active={sizes[0]} onSelect={action('selected')} />;\n});\n"
  },
  {
    "path": "src/editor/toolbar/size-dropdown/index.test.jsx",
    "content": "import React from 'react';\nimport { shallow } from 'enzyme';\nimport renderer from 'react-test-renderer';\nimport SizeDropdown from './index';\nimport { DropdownItem } from 'reactstrap';\n\ndescribe('Editor Toolbar SizeDropdown', () => {\n  it('renders without crashing', () => {\n    const sizes = [8, 9, 10, 11, 12];\n    shallow(<SizeDropdown sizes={sizes} active={sizes[0]} onSelect={() => {}} />);\n  });\n\n  it('renders all of the sizes as dropdown options', () => {\n    const sizes = [8, 9, 10, 11, 12];\n    const tree = renderer.create(<SizeDropdown sizes={sizes} active={sizes[1]} onSelect={() => {}} />).toJSON();\n\n    expect(tree).toMatchSnapshot();\n  });\n\n  it('calls the onSelect function on selecting a dropdown option', () => {\n    const sizes = [8, 9, 10, 11, 12];\n    const onSelect = jest.fn();\n    const sizeDropdown = shallow(<SizeDropdown sizes={sizes} active={sizes[0]} onSelect={onSelect} />);\n\n    sizeDropdown\n      .find(DropdownItem)\n      .last()\n      .simulate('click');\n\n    expect(onSelect).toHaveBeenCalledTimes(1);\n  });\n});\n"
  },
  {
    "path": "src/editor/toolbar/theme-dropdown/__snapshots__/index.test.jsx.snap",
    "content": "// Jest Snapshot v1, https://goo.gl/fbAQLP\n\nexports[`Editor Toolbar ThemeDropdown renders all of the themes as dropdown options 1`] = `\n<div\n  className=\"dropdown\"\n  onKeyDown={[Function]}\n>\n  <button\n    aria-expanded={false}\n    aria-haspopup={true}\n    aria-label={null}\n    className=\"dropdown-toggle-select btn btn-outline-dropdown-toggle-select btn-block\"\n    onClick={[Function]}\n    style={\n      Object {\n        \"textAlign\": \"left\",\n      }\n    }\n    type=\"button\"\n  >\n    VS\n  </button>\n  <div\n    aria-hidden={true}\n    className=\"dropdown-menu\"\n    role=\"menu\"\n    tabIndex=\"-1\"\n  >\n    <button\n      className=\"dropdown-item\"\n      onClick={[Function]}\n      role=\"menuitem\"\n      tabIndex=\"0\"\n      type=\"button\"\n    >\n      GitHub\n    </button>\n    <button\n      className=\"dropdown-item active\"\n      onClick={[Function]}\n      role=\"menuitem\"\n      tabIndex=\"0\"\n      type=\"button\"\n    >\n      VS\n    </button>\n    <button\n      className=\"dropdown-item\"\n      onClick={[Function]}\n      role=\"menuitem\"\n      tabIndex=\"0\"\n      type=\"button\"\n    >\n      Xcode\n    </button>\n  </div>\n</div>\n`;\n"
  },
  {
    "path": "src/editor/toolbar/theme-dropdown/index.jsx",
    "content": "import React from 'react';\nimport PropTypes from 'prop-types';\nimport { UncontrolledDropdown, DropdownMenu, DropdownItem } from 'reactstrap';\nimport DropdownToggleSelect from '../../../common/dropdown-toggle-select';\n\nconst ThemeDropdown = ({ themes, active, onSelect }) => {\n  const dropdownItems = themes.map(theme => (\n    <DropdownItem key={theme} active={theme === active} onClick={() => onSelect(theme)}>\n      {theme}\n    </DropdownItem>\n  ));\n\n  return (\n    <UncontrolledDropdown inNavbar>\n      <DropdownToggleSelect>{active}</DropdownToggleSelect>\n      <DropdownMenu>{dropdownItems}</DropdownMenu>\n    </UncontrolledDropdown>\n  );\n};\n\nThemeDropdown.propTypes = {\n  themes: PropTypes.arrayOf(PropTypes.string).isRequired,\n  active: PropTypes.string.isRequired,\n  onSelect: PropTypes.func\n};\n\nexport default ThemeDropdown;\n"
  },
  {
    "path": "src/editor/toolbar/theme-dropdown/index.story.jsx",
    "content": "import React from 'react';\nimport { storiesOf } from '@storybook/react';\nimport { action } from '@storybook/addon-actions';\nimport 'bootstrap/dist/css/bootstrap.css';\nimport ThemeDropdown from './index';\n\nstoriesOf('Editor/Toolbar/ThemeDropdown', module).add('default', () => {\n  const themes = ['GitHub', 'VS', 'Xcode'];\n\n  return <ThemeDropdown themes={themes} active={themes[0]} onSelect={action('selected')} />;\n});\n"
  },
  {
    "path": "src/editor/toolbar/theme-dropdown/index.test.jsx",
    "content": "import React from 'react';\nimport { shallow } from 'enzyme';\nimport renderer from 'react-test-renderer';\nimport ThemeDropdown from './index';\nimport { DropdownItem } from 'reactstrap';\n\ndescribe('Editor Toolbar ThemeDropdown', () => {\n  it('renders without crashing', () => {\n    const themes = ['GitHub', 'VS', 'Xcode'];\n    shallow(<ThemeDropdown themes={themes} active={themes[0]} onSelect={() => {}} />);\n  });\n\n  it('renders all of the themes as dropdown options', () => {\n    const themes = ['GitHub', 'VS', 'Xcode'];\n    const tree = renderer.create(<ThemeDropdown themes={themes} active={themes[1]} onSelect={() => {}} />).toJSON();\n\n    expect(tree).toMatchSnapshot();\n  });\n\n  it('calls the onSelect function on selecting a dropdown option ', () => {\n    const themes = ['GitHub', 'VS', 'Xcode'];\n    const onSelect = jest.fn();\n    const themeDropdown = shallow(<ThemeDropdown themes={themes} active={themes[0]} onSelect={onSelect} />);\n\n    themeDropdown\n      .find(DropdownItem)\n      .last()\n      .simulate('click');\n\n    expect(onSelect).toHaveBeenCalledTimes(1);\n  });\n});\n"
  },
  {
    "path": "src/heart/__snapshots__/index.test.jsx.snap",
    "content": "// Jest Snapshot v1, https://goo.gl/fbAQLP\n\nexports[`Heart renders correctly 1`] = `\n<div\n  className=\"responsive-container container-fluid\"\n  style={\n    Object {\n      \"marginTop\": 10,\n    }\n  }\n>\n  <div\n    className=\"row\"\n  >\n    <div\n      className=\"col\"\n    >\n      <h2>\n        <i\n          className=\"fas fa-heart text-danger\"\n          title=\"Heart\"\n        />\n         codeprinter?\n      </h2>\n      <hr />\n      <p>\n        That's awesome! Let the developer know on\n         \n        <a\n          href=\"https://twitter.com/jaredtpetersen\"\n          rel=\"noopener noreferrer\"\n          target=\"_blank\"\n        >\n          Twitter\n        </a>\n        ,\n         \n        <a\n          href=\"https://paypal.me/jaredtpetersen\"\n          rel=\"noopener noreferrer\"\n          target=\"_blank\"\n        >\n          donate\n        </a>\n        , or star the repository on\n         \n        <a\n          href=\"https://github.com/jaredpetersen/codeprinter\"\n          rel=\"noopener noreferrer\"\n          target=\"_blank\"\n        >\n          GitHub\n        </a>\n        .\n      </p>\n      <p>\n        Found a bug? Want to request a new feature? Great! Just create an issue on GitHub. We're welcome to pull requests.\n      </p>\n      <h2>\n        <i\n          className=\"fas fa-info-circle text-primary\"\n          title=\"Info\"\n        />\n         About the Developer\n      </h2>\n      <hr />\n      <p>\n        This software was developed by Jared Petersen.\n      </p>\n      <p>\n        You can check out his other repositories on\n         \n        <a\n          href=\"https://github.com/jaredpetersen\"\n          rel=\"noopener noreferrer\"\n          target=\"_blank\"\n        >\n          GitHub\n        </a>\n         \n        or look at his résumé on\n         \n        <a\n          href=\"https://www.linkedin.com/in/petersenjared\"\n          rel=\"noopener noreferrer\"\n          target=\"_blank\"\n        >\n          LinkedIn\n        </a>\n      </p>\n    </div>\n  </div>\n</div>\n`;\n"
  },
  {
    "path": "src/heart/index.jsx",
    "content": "import React from 'react';\nimport { Container, Row, Col } from 'reactstrap';\n\nconst Heart = () => {\n  return (\n    <Container fluid={true} className=\"responsive-container\" style={{ marginTop: 10 }}>\n      <Row>\n        <Col>\n          <h2>\n            <i className=\"fas fa-heart text-danger\" title=\"Heart\" /> codeprinter?\n          </h2>\n          <hr />\n          <p>\n            That's awesome! Let the developer know on{' '}\n            <a href=\"https://twitter.com/jaredtpetersen\" target=\"_blank\" rel=\"noopener noreferrer\">\n              Twitter\n            </a>\n            ,{' '}\n            <a href=\"https://paypal.me/jaredtpetersen\" target=\"_blank\" rel=\"noopener noreferrer\">\n              donate\n            </a>\n            , or star the repository on{' '}\n            <a href=\"https://github.com/jaredpetersen/codeprinter\" target=\"_blank\" rel=\"noopener noreferrer\">\n              GitHub\n            </a>\n            .\n          </p>\n          <p>\n            Found a bug? Want to request a new feature? Great! Just create an issue on GitHub. We're welcome to pull\n            requests.\n          </p>\n\n          <h2>\n            <i className=\"fas fa-info-circle text-primary\" title=\"Info\" /> About the Developer\n          </h2>\n          <hr />\n          <p>This software was developed by Jared Petersen.</p>\n          <p>\n            You can check out his other repositories on{' '}\n            <a href=\"https://github.com/jaredpetersen\" target=\"_blank\" rel=\"noopener noreferrer\">\n              GitHub\n            </a>{' '}\n            or look at his résumé on{' '}\n            <a href=\"https://www.linkedin.com/in/petersenjared\" target=\"_blank\" rel=\"noopener noreferrer\">\n              LinkedIn\n            </a>\n          </p>\n        </Col>\n      </Row>\n    </Container>\n  );\n};\n\nHeart.propTypes = {};\n\nexport default Heart;\n"
  },
  {
    "path": "src/heart/index.story.jsx",
    "content": "import React from 'react';\nimport { storiesOf } from '@storybook/react';\nimport 'bootstrap/dist/css/bootstrap.css';\nimport Heart from './index';\n\nstoriesOf('Heart', module).add('default', () => <Heart />);\n"
  },
  {
    "path": "src/heart/index.test.jsx",
    "content": "import React from 'react';\nimport { shallow } from 'enzyme';\nimport renderer from 'react-test-renderer';\nimport Heart from './index';\n\ndescribe('Heart', () => {\n  it('renders without crashing', () => {\n    shallow(<Heart />);\n  });\n\n  it('renders correctly', () => {\n    const tree = renderer.create(<Heart />).toJSON();\n\n    expect(tree).toMatchSnapshot();\n  });\n});\n"
  },
  {
    "path": "src/index.css",
    "content": "body {\n  margin: 0;\n  padding: 0;\n  font-family: sans-serif;\n}\n\nbody,\nhtml,\n#root {\n  height: 100%;\n}\n\n@media screen and (max-width: 767px) {\n  .responsive-container {\n    height: calc(100% - 254px);\n  }\n}\n\n@media screen and (min-width: 768px) {\n  .responsive-container {\n    height: calc(100% - 130px);\n  }\n}\n"
  },
  {
    "path": "src/index.jsx",
    "content": "import React from 'react';\nimport ReactDOM from 'react-dom';\nimport './index.css';\nimport 'bootstrap/dist/css/bootstrap.css';\nimport App from './App';\nimport registerServiceWorker from './registerServiceWorker';\n\nReactDOM.render(<App />, document.getElementById('root'));\nregisterServiceWorker();\n"
  },
  {
    "path": "src/navbar/index.jsx",
    "content": "import React from 'react';\nimport { Collapse, Navbar, NavbarToggler, NavbarBrand, Nav, NavItem, NavLink, Badge } from 'reactstrap';\nimport { Link } from 'react-router-dom';\n\nclass CustomNavbar extends React.Component {\n  constructor(props) {\n    super(props);\n\n    this.state = {\n      isOpen: false,\n      sizes: Array.from({ length: 9 }, (x, i) => i + 8)\n    };\n\n    this.toggle = this.toggle.bind(this);\n  }\n\n  toggle() {\n    this.setState({ isOpen: !this.state.isOpen });\n  }\n\n  render() {\n    return (\n      <Navbar color=\"dark\" dark expand=\"sm\" className=\"flex-shrink-0\">\n        <NavbarBrand tag={Link} to=\"/\">\n          <Badge color=\"success\">codeprinter</Badge>\n        </NavbarBrand>\n        <NavbarToggler onClick={this.toggle} />\n        <Collapse isOpen={this.state.isOpen} navbar>\n          <Nav className=\"ml-auto\" navbar>\n            <NavItem>\n              <NavLink href=\"https://github.com/jaredpetersen/codeprinter\" target=\"_blank\">\n                <i className=\"fab fa-github-alt text-white\" title=\"GitHub\" />\n              </NavLink>\n            </NavItem>\n            <NavItem>\n              <NavLink tag={Link} to=\"/heart\">\n                <i className=\"fas fa-heart text-danger\" title=\"Heart\" />\n              </NavLink>\n            </NavItem>\n          </Nav>\n        </Collapse>\n      </Navbar>\n    );\n  }\n}\n\nCustomNavbar.propTypes = {};\n\nexport default CustomNavbar;\n"
  },
  {
    "path": "src/navbar/index.story.jsx",
    "content": "import React from 'react';\nimport { storiesOf } from '@storybook/react';\nimport { BrowserRouter as Router } from 'react-router-dom';\nimport 'bootstrap/dist/css/bootstrap.css';\nimport Navbar from './index';\n\nstoriesOf('Navbar', module).add('default', () => (\n  <Router>\n    <Navbar />\n  </Router>\n));\n"
  },
  {
    "path": "src/navbar/index.test.jsx",
    "content": "import React from 'react';\nimport { shallow } from 'enzyme';\nimport Navbar from './index';\nimport { NavbarToggler, Collapse } from 'reactstrap';\n\ndescribe('Navbar', () => {\n  it('renders without crashing', () => {\n    shallow(<Navbar />);\n  });\n\n  it('toggles the navbar when clicking on the navbar toggler', () => {\n    const navbar = shallow(<Navbar />);\n    const navbarToggler = navbar.find(NavbarToggler);\n\n    expect(navbar.find(Collapse).prop('isOpen')).toEqual(false);\n\n    navbarToggler.simulate('click');\n\n    expect(navbar.find(Collapse).prop('isOpen')).toEqual(true);\n  });\n});\n"
  },
  {
    "path": "src/not-found/__snapshots__/index.test.jsx.snap",
    "content": "// Jest Snapshot v1, https://goo.gl/fbAQLP\n\nexports[`NotFound renders correctly 1`] = `\n<div\n  className=\"responsive-container container-fluid\"\n  style={\n    Object {\n      \"marginTop\": 10,\n    }\n  }\n>\n  <div\n    className=\"row\"\n  >\n    <div\n      className=\"col\"\n    >\n      <h2>\n        <i\n          className=\"fas fa-map-signs text-warning\"\n        />\n         404 Not Found\n      </h2>\n      <hr />\n      <p>\n        It looks like you're lost. Let's go \n        <a\n          href=\"/\"\n          onClick={[Function]}\n        >\n          home\n        </a>\n        .\n      </p>\n    </div>\n  </div>\n</div>\n`;\n"
  },
  {
    "path": "src/not-found/index.jsx",
    "content": "import React from 'react';\nimport { Container, Row, Col } from 'reactstrap';\nimport { Link } from 'react-router-dom';\n\nconst NotFound = () => {\n  return (\n    <Container fluid={true} className=\"responsive-container\" style={{ marginTop: 10 }}>\n      <Row>\n        <Col>\n          <h2>\n            <i className=\"fas fa-map-signs text-warning\" /> 404 Not Found\n          </h2>\n          <hr />\n          <p>\n            It looks like you're lost. Let's go <Link to=\"/\">home</Link>.\n          </p>\n        </Col>\n      </Row>\n    </Container>\n  );\n};\n\nNotFound.propTypes = {};\n\nexport default NotFound;\n"
  },
  {
    "path": "src/not-found/index.story.jsx",
    "content": "import React from 'react';\nimport { storiesOf } from '@storybook/react';\nimport { BrowserRouter as Router } from 'react-router-dom';\nimport 'bootstrap/dist/css/bootstrap.css';\nimport NotFound from './index';\n\nstoriesOf('Not Found', module).add('default', () => (\n  <Router>\n    <NotFound />\n  </Router>\n));\n"
  },
  {
    "path": "src/not-found/index.test.jsx",
    "content": "import React from 'react';\nimport { shallow } from 'enzyme';\nimport renderer from 'react-test-renderer';\nimport NotFound from './index';\nimport { BrowserRouter as Router } from 'react-router-dom';\n\ndescribe('NotFound', () => {\n  it('renders without crashing', () => {\n    shallow(<NotFound />);\n  });\n\n  it('renders correctly', () => {\n    const tree = renderer\n      .create(\n        <Router>\n          <NotFound />\n        </Router>\n      )\n      .toJSON();\n\n    expect(tree).toMatchSnapshot();\n  });\n});\n"
  },
  {
    "path": "src/registerServiceWorker.js",
    "content": "// In production, we register a service worker to serve assets from local cache.\n\n// This lets the app load faster on subsequent visits in production, and gives\n// it offline capabilities. However, it also means that developers (and users)\n// will only see deployed updates on the \"N+1\" visit to a page, since previously\n// cached resources are updated in the background.\n\n// To learn more about the benefits of this model, read https://goo.gl/KwvDNy.\n// This link also includes instructions on opting out of this behavior.\n\nconst isLocalhost = Boolean(\n  window.location.hostname === 'localhost' ||\n    // [::1] is the IPv6 localhost address.\n    window.location.hostname === '[::1]' ||\n    // 127.0.0.1/8 is considered localhost for IPv4.\n    window.location.hostname.match(/^127(?:\\.(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)){3}$/)\n);\n\nexport default function register() {\n  if (process.env.NODE_ENV === 'production' && 'serviceWorker' in navigator) {\n    // The URL constructor is available in all browsers that support SW.\n    const publicUrl = new URL(process.env.PUBLIC_URL, window.location);\n    if (publicUrl.origin !== window.location.origin) {\n      // Our service worker won't work if PUBLIC_URL is on a different origin\n      // from what our page is served on. This might happen if a CDN is used to\n      // serve assets; see https://github.com/facebookincubator/create-react-app/issues/2374\n      return;\n    }\n\n    window.addEventListener('load', () => {\n      const swUrl = `${process.env.PUBLIC_URL}/service-worker.js`;\n\n      if (isLocalhost) {\n        // This is running on localhost. Lets check if a service worker still exists or not.\n        checkValidServiceWorker(swUrl);\n\n        // Add some additional logging to localhost, pointing developers to the\n        // service worker/PWA documentation.\n        navigator.serviceWorker.ready.then(() => {\n          console.log(\n            'This web app is being served cache-first by a service ' +\n              'worker. To learn more, visit https://goo.gl/SC7cgQ'\n          );\n        });\n      } else {\n        // Is not local host. Just register service worker\n        registerValidSW(swUrl);\n      }\n    });\n  }\n}\n\nfunction registerValidSW(swUrl) {\n  navigator.serviceWorker\n    .register(swUrl)\n    .then(registration => {\n      registration.onupdatefound = () => {\n        const installingWorker = registration.installing;\n        installingWorker.onstatechange = () => {\n          if (installingWorker.state === 'installed') {\n            if (navigator.serviceWorker.controller) {\n              // At this point, the old content will have been purged and\n              // the fresh content will have been added to the cache.\n              // It's the perfect time to display a \"New content is\n              // available; please refresh.\" message in your web app.\n              console.log('New content is available; please refresh.');\n            } else {\n              // At this point, everything has been precached.\n              // It's the perfect time to display a\n              // \"Content is cached for offline use.\" message.\n              console.log('Content is cached for offline use.');\n            }\n          }\n        };\n      };\n    })\n    .catch(error => {\n      console.error('Error during service worker registration:', error);\n    });\n}\n\nfunction checkValidServiceWorker(swUrl) {\n  // Check if the service worker can be found. If it can't reload the page.\n  fetch(swUrl)\n    .then(response => {\n      // Ensure service worker exists, and that we really are getting a JS file.\n      if (response.status === 404 || response.headers.get('content-type').indexOf('javascript') === -1) {\n        // No service worker found. Probably a different app. Reload the page.\n        navigator.serviceWorker.ready.then(registration => {\n          registration.unregister().then(() => {\n            window.location.reload();\n          });\n        });\n      } else {\n        // Service worker found. Proceed as normal.\n        registerValidSW(swUrl);\n      }\n    })\n    .catch(() => {\n      console.log('No internet connection found. App is running in offline mode.');\n    });\n}\n\nexport function unregister() {\n  if ('serviceWorker' in navigator) {\n    navigator.serviceWorker.ready.then(registration => {\n      registration.unregister();\n    });\n  }\n}\n"
  },
  {
    "path": "src/setupTests.js",
    "content": "import { configure } from 'enzyme';\nimport Adapter from 'enzyme-adapter-react-16';\n\nconfigure({ adapter: new Adapter() });\n"
  }
]