Full Code of reactjs/react-rails for AI

main cd977b5b89c9 cached
250 files
2.9 MB
783.7k tokens
1300 symbols
1 requests
Download .txt
Showing preview only (3,130K chars total). Download the full file or copy to clipboard to get everything.
Repository: reactjs/react-rails
Branch: main
Commit: cd977b5b89c9
Files: 250
Total size: 2.9 MB

Directory structure:
gitextract_k0i4cvxl/

├── .bowerrc
├── .codeclimate.yml
├── .github/
│   ├── ISSUE_TEMPLATE.md
│   ├── PULL_REQUEST_TEMPLATE.md
│   └── workflows/
│       ├── claude-code-review.yml
│       ├── claude.yml
│       ├── rubocop.yml
│       └── ruby.yml
├── .gitignore
├── .pryrc
├── .rubocop.yml
├── .rubocop_todo.yml
├── Appraisals
├── CHANGELOG.md
├── CODE_OF_CONDUCT.md
├── CONTRIBUTING.md
├── Gemfile
├── Guardfile
├── LICENSE
├── LintingGemfile
├── README.md
├── Rakefile
├── SECURITY.md
├── VERSIONS.md
├── check_for_uncommitted_files.sh
├── docs/
│   ├── common-errors.md
│   ├── component-generator.md
│   ├── controller-actions.md
│   ├── get-started.md
│   ├── migrating-from-react-rails-to-react_on_rails.md
│   ├── server-side-rendering.md
│   ├── ujs.md
│   ├── upgrading.md
│   └── view-helper.md
├── gemfiles/
│   ├── base.gemfile
│   ├── connection_pool_3.gemfile
│   ├── propshaft.gemfile
│   ├── shakapacker.gemfile
│   ├── sprockets_3.gemfile
│   └── sprockets_4.gemfile
├── lib/
│   ├── assets/
│   │   ├── javascripts/
│   │   │   ├── JSXTransformer.js
│   │   │   └── react_ujs.js
│   │   └── react-source/
│   │       ├── development/
│   │       │   ├── react-server.js
│   │       │   └── react.js
│   │       └── production/
│   │           ├── react-server.js
│   │           └── react.js
│   ├── generators/
│   │   ├── react/
│   │   │   ├── component_generator.rb
│   │   │   └── install_generator.rb
│   │   └── templates/
│   │       ├── .gitkeep
│   │       ├── component.es6.jsx
│   │       ├── component.es6.tsx
│   │       ├── component.js.jsx
│   │       ├── component.js.jsx.coffee
│   │       ├── component.js.jsx.tsx
│   │       ├── react_server_rendering.rb
│   │       ├── server_rendering.js
│   │       └── server_rendering_pack.js
│   ├── react/
│   │   ├── jsx/
│   │   │   ├── babel_transformer.rb
│   │   │   ├── jsx_transformer.rb
│   │   │   ├── processor.rb
│   │   │   ├── sprockets_strategy.rb
│   │   │   └── template.rb
│   │   ├── jsx.rb
│   │   ├── rails/
│   │   │   ├── asset_variant.rb
│   │   │   ├── component_mount.rb
│   │   │   ├── controller_lifecycle.rb
│   │   │   ├── controller_renderer.rb
│   │   │   ├── railtie.rb
│   │   │   ├── test_helper.rb
│   │   │   ├── version.rb
│   │   │   └── view_helper.rb
│   │   ├── rails.rb
│   │   ├── server_rendering/
│   │   │   ├── bundle_renderer/
│   │   │   │   ├── console_polyfill.js
│   │   │   │   ├── console_replay.js
│   │   │   │   ├── console_reset.js
│   │   │   │   └── timeout_polyfill.js
│   │   │   ├── bundle_renderer.rb
│   │   │   ├── environment_container.rb
│   │   │   ├── exec_js_renderer.rb
│   │   │   ├── manifest_container.rb
│   │   │   ├── propshaft_container.rb
│   │   │   ├── separate_server_bundle_container.rb
│   │   │   └── yaml_manifest_container.rb
│   │   └── server_rendering.rb
│   ├── react-rails.rb
│   └── react.rb
├── package.json
├── rakelib/
│   └── create_release.rake
├── react-builds/
│   ├── package.json
│   ├── react-browser.js
│   ├── react-server.js
│   └── webpack.config.js
├── react-rails.gemspec
├── react_ujs/
│   ├── dist/
│   │   └── react_ujs.js
│   ├── index.js
│   ├── readme.md
│   ├── src/
│   │   ├── events/
│   │   │   ├── detect.js
│   │   │   ├── native.js
│   │   │   ├── pjax.js
│   │   │   ├── turbolinks.js
│   │   │   ├── turbolinksClassic.js
│   │   │   └── turbolinksClassicDeprecated.js
│   │   ├── getConstructor/
│   │   │   ├── fromGlobal.js
│   │   │   ├── fromRequireContext.js
│   │   │   ├── fromRequireContextWithGlobalFallback.js
│   │   │   └── fromRequireContextsWithGlobalFallback.js
│   │   ├── reactDomClient.js
│   │   ├── renderHelpers.js
│   │   └── supportsRootApi.js
│   └── webpack.config.js
└── test/
    ├── bin/
    │   └── create-fake-js-package-managers
    ├── dummy/
    │   ├── .gitignore
    │   ├── .postcssrc.yml
    │   ├── README.rdoc
    │   ├── Rakefile
    │   ├── app/
    │   │   ├── assets/
    │   │   │   ├── config/
    │   │   │   │   └── manifest.js
    │   │   │   ├── images/
    │   │   │   │   └── .keep
    │   │   │   ├── javascripts/
    │   │   │   │   ├── app_no_turbolinks.js
    │   │   │   │   ├── application.js
    │   │   │   │   ├── components/
    │   │   │   │   │   ├── PlainJSTodo.js
    │   │   │   │   │   ├── Todo.js.jsx.coffee
    │   │   │   │   │   ├── TodoList.js.jsx
    │   │   │   │   │   ├── TodoListWithConsoleLog.js.jsx
    │   │   │   │   │   └── WithSetTimeout.js.jsx
    │   │   │   │   ├── components.js
    │   │   │   │   ├── example.js.jsx
    │   │   │   │   ├── example2.js.jsx.coffee
    │   │   │   │   ├── example3.js.jsx
    │   │   │   │   ├── flow_types_example.js.jsx
    │   │   │   │   ├── harmony_example.js.jsx
    │   │   │   │   ├── pages.js
    │   │   │   │   ├── require_test/
    │   │   │   │   │   ├── jsx_preprocessor_test.jsx
    │   │   │   │   │   ├── jsx_require_child_coffee.coffee
    │   │   │   │   │   ├── jsx_require_child_js.js
    │   │   │   │   │   └── jsx_require_child_jsx.jsx
    │   │   │   │   ├── server_rendering.js
    │   │   │   │   └── turbolinks_only.js
    │   │   │   └── stylesheets/
    │   │   │       └── application.css
    │   │   ├── controllers/
    │   │   │   ├── application_controller.rb
    │   │   │   ├── concerns/
    │   │   │   │   └── .keep
    │   │   │   ├── counters_controller.rb
    │   │   │   ├── pack_components_controller.rb
    │   │   │   ├── pages_controller.rb
    │   │   │   └── server_controller.rb
    │   │   ├── helpers/
    │   │   │   └── application_helper.rb
    │   │   ├── javascript/
    │   │   │   ├── components/
    │   │   │   │   ├── Counter.js
    │   │   │   │   ├── GreetingMessage.js
    │   │   │   │   ├── Todo.js
    │   │   │   │   ├── TodoList.js
    │   │   │   │   ├── TodoListWithConsoleLog.js
    │   │   │   │   ├── WithSetTimeout.js
    │   │   │   │   ├── export_default_component.js
    │   │   │   │   ├── named_export_component.js
    │   │   │   │   └── subfolder/
    │   │   │   │       └── exports_component.js
    │   │   │   ├── controllers/
    │   │   │   │   └── mount_counters.js
    │   │   │   └── packs/
    │   │   │       ├── application.js
    │   │   │       └── server_rendering.js
    │   │   ├── mailers/
    │   │   │   └── .keep
    │   │   ├── models/
    │   │   │   ├── .keep
    │   │   │   └── concerns/
    │   │   │       └── .keep
    │   │   ├── pants/
    │   │   │   └── yfronts.js
    │   │   └── views/
    │   │       ├── counters/
    │   │       │   ├── create.turbo_stream.erb
    │   │       │   └── index.html.erb
    │   │       ├── layouts/
    │   │       │   ├── app_no_turbolinks.html.erb
    │   │       │   └── application.html.erb
    │   │       ├── pack_components/
    │   │       │   └── show.html.erb
    │   │       ├── pages/
    │   │       │   ├── _component_with_inner_html.html.erb
    │   │       │   └── show.html.erb
    │   │       └── server/
    │   │           ├── console_example.html.erb
    │   │           ├── console_example_suppressed.html.erb
    │   │           └── show.html.erb
    │   ├── babel.config.js
    │   ├── bin/
    │   │   ├── bundle
    │   │   ├── rails
    │   │   ├── rake
    │   │   ├── shakapacker
    │   │   ├── shakapacker-dev-server
    │   │   └── yarn
    │   ├── config/
    │   │   ├── application.rb
    │   │   ├── boot.rb
    │   │   ├── environment.rb
    │   │   ├── environments/
    │   │   │   ├── development.rb
    │   │   │   ├── production.rb
    │   │   │   └── test.rb
    │   │   ├── initializers/
    │   │   │   ├── backtrace_silencers.rb
    │   │   │   ├── filter_parameter_logging.rb
    │   │   │   ├── inflections.rb
    │   │   │   ├── mime_types.rb
    │   │   │   ├── react.rb
    │   │   │   ├── secret_token.rb
    │   │   │   ├── session_store.rb
    │   │   │   └── wrap_parameters.rb
    │   │   ├── locales/
    │   │   │   └── en.yml
    │   │   ├── routes.rb
    │   │   ├── shakapacker.yml
    │   │   └── webpack/
    │   │       ├── clientWebpackConfig.js
    │   │       ├── commonWebpackConfig.js
    │   │       ├── development.js
    │   │       ├── production.js
    │   │       ├── serverClientOrBoth.js
    │   │       ├── serverWebpackConfig.js
    │   │       ├── test.js
    │   │       └── webpack.config.js
    │   ├── config.ru
    │   ├── lib/
    │   │   └── assets/
    │   │       └── .keep
    │   ├── log/
    │   │   └── .keep
    │   ├── package.json
    │   ├── public/
    │   │   ├── 404.html
    │   │   ├── 422.html
    │   │   └── 500.html
    │   └── vendor/
    │       └── assets/
    │           ├── javascripts/
    │           │   └── .gitkeep
    │           └── react/
    │               ├── JSXTransformer__.js
    │               └── test/
    │                   └── react__.js
    ├── generators/
    │   ├── coffee_component_generator_test.rb
    │   ├── component_generator_test.rb
    │   ├── es6_component_generator_test.rb
    │   ├── install_generator_sprockets_test.rb
    │   ├── install_generator_webpacker_test.rb
    │   └── ts_es6_component_generator_test.rb
    ├── helper_files/
    │   ├── TodoListWithUpdates.js
    │   ├── TodoListWithUpdates.js.jsx
    │   └── WithoutSprockets.js
    ├── react/
    │   ├── jsx/
    │   │   ├── jsx_prepocessor_test.rb
    │   │   └── jsx_transformer_test.rb
    │   ├── jsx_test.rb
    │   ├── rails/
    │   │   ├── asset_variant_test.rb
    │   │   ├── component_mount_test.rb
    │   │   ├── controller_lifecycle_test.rb
    │   │   ├── pages_controller_test.rb
    │   │   ├── railtie_test.rb
    │   │   ├── react_rails_ujs_test.rb
    │   │   ├── realtime_update_test.rb
    │   │   ├── test_helper_test.rb
    │   │   ├── view_helper_test.rb
    │   │   └── webpacker_test.rb
    │   ├── server_rendering/
    │   │   ├── bundle_renderer_test.rb
    │   │   ├── console_replay_test.rb
    │   │   ├── exec_js_renderer_test.rb
    │   │   ├── manifest_container_test.rb
    │   │   ├── propshaft_container_test.rb
    │   │   ├── webpacker_containers_test.rb
    │   │   └── yaml_manifest_container_test.rb
    │   └── server_rendering_test.rb
    ├── react_asset_test.rb
    ├── react_test.rb
    ├── server_rendered_html_test.rb
    ├── support/
    │   ├── propshaft_helpers.rb
    │   ├── sprockets_helpers.rb
    │   └── webpacker_helpers.rb
    └── test_helper.rb

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

================================================
FILE: .bowerrc
================================================
{
  "directory" : "vendor/"
}


================================================
FILE: .codeclimate.yml
================================================
version: '2'
exclude_patterns:
- lib/assets/
- react-builds/
- react_ujs/dist/
- test/


================================================
FILE: .github/ISSUE_TEMPLATE.md
================================================
Help us help you! Have you looked for similar issues? Do you have reproduction steps? [Contributing Guide](CONTRIBUTING.md#reporting-bugs)

### Steps to reproduce

(Guidelines for creating a bug report are [available
here](../CONTRIBUTING.md#reporting-bugs))

### Expected behavior
Tell us what should happen

### Actual behavior
Tell us what happens instead

### System configuration
- **Shakapacker or Sprockets version**:
- **React-Rails version**:
- **Rect_UJS version**:
- **Rails version**:
- **Ruby version**:


-------

(Describe your issue here)


================================================
FILE: .github/PULL_REQUEST_TEMPLATE.md
================================================
### Summary

_Remove this paragraph and provide a general description of the code changes in your pull
request... were there any bugs you had fixed? If so, mention them. If
these bugs have open GitHub issues, be sure to tag them here as well,
to keep the conversation linked together._

### Other Information

_Remove this paragraph and mention any other important and relevant information such as benchmarks._

### Pull Request checklist
_Remove this line after checking all the items here. If the item is not applicable to the PR, both check it out and wrap it by `~`._

- [ ] Add/update test to cover these changes
- [ ] Update documentation
- [ ] Update CHANGELOG file


================================================
FILE: .github/workflows/claude-code-review.yml
================================================
name: Claude Code Review

on:
  pull_request:
    types: [opened, synchronize]
    # Optional: Only run on specific file changes
    # paths:
    #   - "src/**/*.ts"
    #   - "src/**/*.tsx"
    #   - "src/**/*.js"
    #   - "src/**/*.jsx"

jobs:
  claude-review:
    # Optional: Filter by PR author
    # if: |
    #   github.event.pull_request.user.login == 'external-contributor' ||
    #   github.event.pull_request.user.login == 'new-developer' ||
    #   github.event.pull_request.author_association == 'FIRST_TIME_CONTRIBUTOR'

    runs-on: ubuntu-latest
    permissions:
      contents: read
      pull-requests: read
      issues: read
      id-token: write

    steps:
      - name: Checkout repository
        uses: actions/checkout@v4
        with:
          fetch-depth: 1

      - name: Run Claude Code Review
        id: claude-review
        uses: anthropics/claude-code-action@v1
        with:
          claude_code_oauth_token: ${{ secrets.CLAUDE_CODE_OAUTH_TOKEN }}
          prompt: |
            REPO: ${{ github.repository }}
            PR NUMBER: ${{ github.event.pull_request.number }}

            Please review this pull request and provide feedback on:
            - Code quality and best practices
            - Potential bugs or issues
            - Performance considerations
            - Security concerns
            - Test coverage

            Use the repository's CLAUDE.md for guidance on style and conventions. Be constructive and helpful in your feedback.

            Use `gh pr comment` with your Bash tool to leave your review as a comment on the PR.

          # See https://github.com/anthropics/claude-code-action/blob/main/docs/usage.md
          # or https://code.claude.com/docs/en/cli-reference for available options
          claude_args: '--allowed-tools "Bash(gh issue view:*),Bash(gh search:*),Bash(gh issue list:*),Bash(gh pr comment:*),Bash(gh pr diff:*),Bash(gh pr view:*),Bash(gh pr list:*)"'



================================================
FILE: .github/workflows/claude.yml
================================================
name: Claude Code

on:
  issue_comment:
    types: [created]
  pull_request_review_comment:
    types: [created]
  issues:
    types: [opened, assigned]
  pull_request_review:
    types: [submitted]

jobs:
  claude:
    if: |
      (github.event_name == 'issue_comment' && contains(github.event.comment.body, '@claude')) ||
      (github.event_name == 'pull_request_review_comment' && contains(github.event.comment.body, '@claude')) ||
      (github.event_name == 'pull_request_review' && contains(github.event.review.body, '@claude')) ||
      (github.event_name == 'issues' && (contains(github.event.issue.body, '@claude') || contains(github.event.issue.title, '@claude')))
    runs-on: ubuntu-latest
    permissions:
      contents: read
      pull-requests: read
      issues: read
      id-token: write
      actions: read # Required for Claude to read CI results on PRs
    steps:
      - name: Checkout repository
        uses: actions/checkout@v4
        with:
          fetch-depth: 1

      - name: Run Claude Code
        id: claude
        uses: anthropics/claude-code-action@v1
        with:
          claude_code_oauth_token: ${{ secrets.CLAUDE_CODE_OAUTH_TOKEN }}

          # This is an optional setting that allows Claude to read CI results on PRs
          additional_permissions: |
            actions: read

          # Optional: Give a custom prompt to Claude. If this is not specified, Claude will perform the instructions specified in the comment that tagged it.
          # prompt: 'Update the pull request description to include a summary of changes.'

          # Optional: Add claude_args to customize behavior and configuration
          # See https://github.com/anthropics/claude-code-action/blob/main/docs/usage.md
          # or https://code.claude.com/docs/en/cli-reference for available options
          # claude_args: '--allowed-tools Bash(gh pr:*)'



================================================
FILE: .github/workflows/rubocop.yml
================================================
name: Rubocop

on:
  push:
    branches:
      - 'main'
  pull_request:

jobs:
  rubocop:
    name: Rubocop
    runs-on: ${{ matrix.os }}
    strategy:
      matrix:
        os: [ubuntu-latest]
        ruby: ['2.7', '3.0', '3.1', '3.2', '3.3']
    env:
      # $BUNDLE_GEMFILE must be set at the job level, so it is set for all steps
      BUNDLE_GEMFILE: ${{ github.workspace }}/LintingGemfile

    steps:
      - uses: actions/checkout@v4
        with:
          persist-credentials: false
      - uses: ruby/setup-ruby@v1
        with:
          ruby-version: ${{ matrix.ruby }}
          bundler-cache: true
      - name: Run rubocop
        run: bundle exec rubocop


================================================
FILE: .github/workflows/ruby.yml
================================================
# This workflow uses actions that are not certified by GitHub.
# They are provided by a third-party and are governed by
# separate terms of service, privacy policy, and support
# documentation.
# This workflow will download a prebuilt Ruby version, install dependencies and run tests with Rake
# For more information see: https://github.com/marketplace/actions/setup-ruby-jruby-and-truffleruby

name: Ruby

on:
  push:
    branches:
      - 'main'
  pull_request:

jobs:
  check_react_and_ujs:
    strategy:
      fail-fast: true
      matrix:
        ruby: ['2.7']
    runs-on: ubuntu-latest
    env:
      PACKAGE_JSON_FALLBACK_MANAGER: yarn_classic
    steps:
      - uses: actions/checkout@v4
        with:
          persist-credentials: false
      - uses: actions/setup-node@v3
      - name: Save root node_modules to cache
        uses: actions/cache@v3
        with:
          path: node_modules
          key: package-node-modules-cache-${{ hashFiles('yarn.lock') }}
      - name: Save react-builds/node_modules to cache
        uses: actions/cache@v3
        with:
          path: react-builds/node_modules
          key: dummy-app-node-modules-cache-${{ hashFiles('react-builds/yarn.lock') }}
      - uses: ruby/setup-ruby@v1
        with:
          bundler: 2.4.9
          ruby-version: ${{ matrix.ruby }}
      - name: Save ruby gems to cache
        uses: actions/cache@v3
        with:
          path: vendor/bundle
          key: root-gem-cache-${{ matrix.ruby }}-${{ hashFiles('Gemfile.lock') }}
      - name: Install Ruby Gems
        run: bundle check --path=vendor/bundle || bundle _2.4.9_ install --path=vendor/bundle --jobs=4 --retry=3
      - run: yarn
      - run: bundle exec rake react:update
      - run: bundle exec rake ujs:update
      - run: ./check_for_uncommitted_files.sh

  test:
    needs: check_react_and_ujs
    strategy:
      fail-fast: false
      matrix:
        js_package_manager:
          - name: npm
            installer: npm
          - name: yarn_classic
            installer: yarn
          - name: pnpm
            installer: pnpm
          - name: bun
            installer: bun
        ruby: ['2.7']
        gemfile:
          # These have shakapacker:
          - base
          - shakapacker
          # These don't have shakapacker:
          - propshaft
          - sprockets_3
          - sprockets_4
    runs-on: ubuntu-latest
    env:
      # $BUNDLE_GEMFILE must be set at the job level, so it is set for all steps
      BUNDLE_GEMFILE: ${{ github.workspace }}/gemfiles/${{ matrix.gemfile }}.gemfile
      # Workaround b/c upgrading Minitest broke some mocking expectations
      # having to do with automatic kwarg splatting
      MT_KWARGS_HACK: 1
      PACKAGE_JSON_FALLBACK_MANAGER: ${{ matrix.js_package_manager.name }}
      SHAKAPACKER_USE_PACKAGE_JSON_GEM: true
    steps:
    - uses: actions/checkout@v4
      with:
        persist-credentials: false
    - uses: actions/setup-node@v3
    - run: sudo npm -g install yalc ${{ matrix.js_package_manager.installer }}
    - run: yalc publish
    - name: Save root node_modules to cache
      uses: actions/cache@v3
      with:
        path: node_modules
        key: package-node-modules-cache-${{ hashFiles('yarn.lock') }}
    - name: Save test/dummy/node_modules to cache
      uses: actions/cache@v3
      with:
        path: test/dummy/node_modules
        key: dummy-app-node-modules-cache-${{ hashFiles('test/dummy/yarn.lock') }}
    - uses: ruby/setup-ruby@v1
      with:
        bundler: 2.4.9
        ruby-version: ${{ matrix.ruby }}
    - run: bundle config set --local path 'test/dummy/vendor/bundle'
    - run: ./test/bin/create-fake-js-package-managers ${{ matrix.js_package_manager.installer }}
    - name: Save dummy app ruby gems to cache
      uses: actions/cache@v3
      with:
        path: test/dummy/vendor/bundle
        key: dummy-app-gem-cache-${{ matrix.ruby }}-${{ hashFiles(format('{0}/gemfiles/{1}.gemfile.lock', github.workspace, matrix.gemfile)) }}
    - name: Install Ruby Gems for dummy app
      run: bundle lock --add-platform 'x86_64-linux' && bundle check --path=test/dummy/vendor/bundle || bundle _2.4.9_ install --frozen --path=test/dummy/vendor/bundle --jobs=4 --retry=3
    - run: cd test/dummy && yalc add react_ujs && ${{ matrix.js_package_manager.installer }} install
    - run: bundle exec rake test
      env:
        NODE_OPTIONS: --openssl-legacy-provider

  test_connection_pool_v3:
    needs: check_react_and_ujs
    strategy:
      fail-fast: false
      matrix:
        js_package_manager:
          - name: npm
            installer: npm
          - name: yarn_classic
            installer: yarn
          - name: pnpm
            installer: pnpm
          - name: bun
            installer: bun
        ruby: [3.2]
        gemfile: [connection_pool_3]
    runs-on: ubuntu-latest
    env:
      # $BUNDLE_GEMFILE must be set at the job level, so it is set for all steps
      BUNDLE_GEMFILE: ${{ github.workspace }}/gemfiles/${{ matrix.gemfile }}.gemfile
      # Workaround b/c upgrading Minitest broke some mocking expectations
      # having to do with automatic kwarg splatting
      MT_KWARGS_HACK: 1
      PACKAGE_JSON_FALLBACK_MANAGER: ${{ matrix.js_package_manager.name }}
      SHAKAPACKER_USE_PACKAGE_JSON_GEM: true
    steps:
    - uses: actions/checkout@v4
      with:
        persist-credentials: false
    - uses: actions/setup-node@v3
    - run: sudo npm -g install yalc ${{ matrix.js_package_manager.installer }}
    - run: yalc publish
    - name: Save root node_modules to cache
      uses: actions/cache@v3
      with:
        path: node_modules
        key: package-node-modules-cache-${{ hashFiles('yarn.lock') }}
    - name: Save test/dummy/node_modules to cache
      uses: actions/cache@v3
      with:
        path: test/dummy/node_modules
        key: dummy-app-node-modules-cache-${{ hashFiles('test/dummy/yarn.lock') }}
    - uses: ruby/setup-ruby@v1
      with:
        bundler: 2.4.9
        ruby-version: ${{ matrix.ruby }}
    - run: bundle config set --local path 'test/dummy/vendor/bundle'
    - run: ./test/bin/create-fake-js-package-managers ${{ matrix.js_package_manager.installer }}
    - name: Save dummy app ruby gems to cache
      uses: actions/cache@v3
      with:
        path: test/dummy/vendor/bundle
        key: dummy-app-gem-cache-${{ hashFiles(format('{0}/gemfiles/{1}.gemfile.lock', github.workspace, matrix.gemfile)) }}
    - name: Install Ruby Gems for dummy app
      run: bundle lock --add-platform 'x86_64-linux' && bundle check --path=test/dummy/vendor/bundle || bundle _2.4.9_ install --frozen --path=test/dummy/vendor/bundle --jobs=4 --retry=3
    - run: cd test/dummy && yalc add react_ujs && ${{ matrix.js_package_manager.installer }} install
    - run: bundle exec rake test
      env:
        NODE_OPTIONS: --openssl-legacy-provider


================================================
FILE: .gitignore
================================================
*.gem
*.log
test/*/tmp
test/*/public/packs
*.swp
/vendor/react
**/node_modules
react-builds/build
coverage/
**/.yalc/**
yalc.lock
/vendor/bundle
.bundle/config
gemfiles/.bundle/


================================================
FILE: .pryrc
================================================
if defined?(PryByebug)
  Pry.commands.alias_command 's', 'step'
  Pry.commands.alias_command 'n', 'next'
  Pry.commands.alias_command 'f', 'finish'
  Pry.commands.alias_command 'c', 'continue'
end


================================================
FILE: .rubocop.yml
================================================
inherit_from: .rubocop_todo.yml

require:
  - rubocop-performance
  - rubocop-minitest

AllCops:
  NewCops: enable
  TargetRubyVersion: 2.5
  DisplayCopNames: true

  Include:
    - '**/Rakefile'
    - '**/config.ru'
    - 'Gemfile'
    - '**/*.rb'
    - '**/*.rake'

  Exclude:
  <% `git status --ignored --porcelain`.lines.grep(/^!! /).each do |path| %>
    - <%= path.sub(/^!! /, '') %>
  <% end %>
    - '**/*.js'
    - '**/node_modules/**/*'
    - '**/public/**/*'
    - '**/tmp/**/*'
    - 'vendor/**/*'
    - 'test/dummy_sprockets/**/*'
    - 'test/dummy_webpacker1/**/*'
    - 'test/dummy_webpacker2/**/*'
    - 'test/dummy_webpacker3/**/*'
    - 'react_ujs/**/*'

Naming/FileName:
  Exclude:
    - '**/Gemfile'
    - '**/Rakefile'
    - 'lib/react-rails.rb'

Layout/LineLength:
  Max: 120

Style/StringLiterals:
  EnforcedStyle: double_quotes

Style/Documentation:
  Enabled: false

Style/HashEachMethods:
  Enabled: true

Style/HashTransformKeys:
  Enabled: true

Style/HashTransformValues:
  Enabled: true

Metrics/AbcSize:
  Max: 28

Metrics/CyclomaticComplexity:
  Max: 7

Metrics/PerceivedComplexity:
  Max: 10

Metrics/ClassLength:
  Max: 150

Metrics/ParameterLists:
  Max: 5
  CountKeywordArgs: false

Metrics/MethodLength:
  Max: 41

Metrics/ModuleLength:
  Max: 180

Naming/RescuedExceptionsVariableName:
  Enabled: false

# Style/GlobalVars:
  # Exclude:
  #   - 'spec/dummy/config/environments/development.rb'

Metrics/BlockLength:
  Exclude:
    - 'test/**/*_test.rb'

================================================
FILE: .rubocop_todo.yml
================================================
# This configuration was generated by
# `rubocop --auto-gen-config`
# on 2023-06-30 00:26:13 UTC using RuboCop version 1.53.1.
# The point is for the user to remove these configuration records
# one by one as the offenses are removed from the code base.
# Note that changes in the inspected code, or installation of new
# versions of RuboCop, may require this file to be generated again.

# Offense count: 2
Lint/IneffectiveAccessModifier:
  Exclude:
    - 'lib/generators/react/component_generator.rb'

# Offense count: 1
# Configuration parameters: CountComments, CountAsOne.
Metrics/ClassLength:
  Exclude:
    - 'lib/generators/react/component_generator.rb'


================================================
FILE: Appraisals
================================================
appraise 'propshaft' do
  gem 'propshaft', '~> 1.0.x'
end

appraise 'sprockets_4' do
  gem 'sprockets', '~> 4.0.x'
  gem 'sprockets-rails'
  gem 'turbolinks', '~> 5'
  gem 'mini_racer', :platforms => :mri
end

appraise 'sprockets_3' do
  gem 'sprockets', '~> 3.5'
  gem 'sprockets-rails'
  gem 'turbolinks', '~> 5'
  gem 'mini_racer', :platforms => :mri
end

appraise 'shakapacker' do
  gem 'shakapacker', '7.2.0'
end

appraise 'connection_pool_3' do
  gem 'connection_pool', '~> 3'
end


================================================
FILE: CHANGELOG.md
================================================
# Changelog for React-Rails

If you need help upgrading `react-rails`, `webpacker` to `shakapacker`, or JS packages, contact justin@shakacode.com. We can upgrade your project and improve your development and customer experiences, allowing you to focus on building new features or fixing bugs instead.

For an overview of working with us, see our [Client Engagement Model](https://www.shakacode.com/blog/client-engagement-model/) article and [how we bill for time](https://www.shakacode.com/blog/shortcut-jira-trello-github-toggl-time-and-task-tracking/).

We also specialize in helping development teams lower infrastructure and CI costs. Check out our project [Control Plane Flow](https://github.com/shakacode/control-plane-flow/), which can allow you to get the ease of Heroku with the power of Kubernetes and big cost savings.

If you think ShakaCode can help your project, [click here](https://meetings.hubspot.com/justingordon/30-minute-consultation) to book a call with [Justin Gordon](mailto:justin@shakacode.com), the creator of React on Rails and Shakapacker.

You also might want to consider the [react_on_rails](https://github.com/shakacode/react_on_rails) gem.

## Unreleased
Changes since the last non-beta release.

_Please add entries here for your pull requests that have not yet been released. Include LINKS for PRs and committers._

## [3.3.0] - 2024-11-22

#### Added
- Support for Propshaft server rendering. [PR 1345](https://github.com/reactjs/react-rails/pull/1345) by [elektronaut](https://github.com/elektronaut)

#### Fixed

- Support `connection_pool` v3 [PR 1367](https://github.com/reactjs/react-rails/pull/1367) by [G-Rath](https://github.com/G-Rath).

## [3.2.1] - 2024-05-16

#### Fixed
- Replaced call to ReactRailsUJS.unmountComponents that was erroneously removed by [PR 1290](https://github.com/reactjs/react-rails/pull/1305) in 3.0.0 [PR 1339](https://github.com/reactjs/react-rails/pull/1339).

- Prevent roots from being re-created when using React 18 [PR 1305](https://github.com/reactjs/react-rails/pull/1305) by [diogobeda](https://github.com/diogobeda)

## [3.2.0] - 2024-01-10

#### Changed
- Support other JS package managers using `package_json` gem [PR #1306](https://github.com/reactjs/react-rails/pull/1306) by [G-Rath](https://github.com/G-Rath).
- Make es6 and ts usable at same time. #1299

## [3.1.1] - 2023-08-16

#### Removed
- Removed the replace-null functionality due a severe logic error added in 3.1.0 #1300

## [3.1.0] - 2023-08-15

#### Added
- Added option to replace `null`s in props with `undefined` via `config.react.null_to_undefined_props` in `config/application.rb` #1293

## [3.0.0] - 2023-08-14

### Breaking Changes
- Requires separate compilations for server & client bundles if using Shakapacker (see [Webpack config](https://github.com/reactjs/react-rails/tree/main/test/dummy/config/webpack)) #1274
- Replaces WebpackManifestContainer, which searched for assets in the webpack manifest, with SeparateServerBundleContainer, which expects a single server bundle file & does not use the webpack manifest at all. #1274
- Upgrades React-Rails' embedded react to v18.2.0. Uses node polyfill plugin & fast-text-encoder for SSR text encoding. #1290
- If using Webpacker/Shakapacker, requires upgrading to Shakapacker v7 #1274 and #1285

#### Changed
- The `react:component` generator now generates a function component by default #1271

## [2.7.1] - 2023-05-19

#### Bug Fixes
- Fix ReactDomClient initialization error during SSR. #1278

## [2.7.0] - 2023-05-06

[#1209 2.7 Release Discussion](https://github.com/reactjs/react-rails/issues/1209)

#### New Features
- Camelizes keys with primitive values, in addition to hashes #946
- Expose alternative implementations for `ReactUJS.getConstructor` #1050
- Include turbolinks in dev and update webdrivers #1174
- Add support for multiple `require.context` with addition of `useContexts` #1144
- Update many dependencies

#### Bug Fixes
- Fix installation crash caused by absolute path for `source_entry_path` in default `config/webpacker.yml` coming from `shakapacker` version 6.x - #1216
- Fix warning for loading `react-dom` in React 18 - #1269

## 2.6.2

#### New Features

- React 16.14
- Support for ShakaPacker
- Preparation for React 18 #1151

#### Bug Fixes

- URI.open instead of open #1099
- No longer unmount components on Turbolinks navigation #1135

## 2.6.1

#### Breaking Changes

#### New Features

- React 16.9.0
- Sprockets users get React_UJS 2.6.1

#### Deprecation

- Removed tests for Rails 3, 4, 5.0
- Removed tests for Sprockets 2
- Removed tests for Webpacker 1.1, 2

#### Bug Fixes

- React_UJS 2.6.1 still complies with ES5 #1027 #1026 #1016
- Support RubyGems pattern for Alpha releases when detecting sprockets version #1047

## 2.6.0

#### Breaking Changes

#### New Features

- Typescript component generator #990
- Enhanced Turbolinks Support #978 #962

#### Deprecation

#### Bug Fixes

- assert_react_component will not pass tests where the case was different #979
- action_controller/test_case was accidentally `required` in dev #996

## 2.5.0

#### Breaking Changes

#### New Features

- React 16.8.6 prebundled #977
- Added `assert_react_component` test helper #957
- Supports Webpacker 4, Ruby 2.6 #934
- Supports camelize on ActionController::Parameters #932

#### Deprecation

#### Bug Fixes

- Linting fix to generated JS #941
- (Meta) Tests for react-rails updated #892 #894 #916

## 2.4.7

#### New Features

- React 16.4.2 prebundled #914

## 2.4.6

#### New Features

- React 16.4.1 prebundled #909

## 2.4.5

#### New Features

- React 16.3.2 prebundled #908
- Supports Webpacker 4.x #895
- Enhanced generator to create components in subdirectories #890
- Explicitly support Rails 5.2 #893
- Enhanced documentation for Turbolinks usage #900

## 2.4.4

#### New Features

- React 16.2 prebundled #856, #874
- Use Fragments instead of Divs by default #856
- Explicitly support Ruby 2.5 #857
- Add support for controller rendering using `camelize_props` #869
- Many readme, doc and guide updates including Typescript #873, #865, #862, #854, #852, #849

#### Deprecation

- Drop explicit support for Ruby 2.1 #866
- Drop explicit support for Rails 3, 4.0, 4.1 #866
- If the gem continues to work on Ruby and Rails below what is in Travis, it is accidental.

#### Bug Fixes

- Correct behaviour of Turbolinks 5 mounting #868, 848
- Correct behaviour of JQuery3 removing "on" #867, 762

## 2.4.3

#### Bug Fixes

- Call ReactDOM.render() when react_component :prerender option is falsy, instead of ReactDOM.hydrate() #844, #842

## 2.4.2

#### Bug Fixes

- ReactDOM.hydrate() may not be defined for everyone, it will now use hydrate if it is defined or fallback to render #832

## 2.4.1

#### New Features

- Webpacker gets ES6 components by default #822
- ReactDOM.hydrate() #828
- Documentation updates #830

#### Deprecation

#### Bug Fixes

- Webpacker local manifest sometimes had double asset_hosts if the dev server was running #834 thanks @joeyparis

## 2.4.0

#### Breaking Changes

- (Sprockets) Prebundled React upgraded to 16 #792
- (Sprockets) Addons removed #792

#### Bug Fixes

- Coffeescript generator exports correctly #799, #800
- Running detector manually no longer breaks if Turbolinks is not preset #802

## 2.3.1

#### Breaking Changes

- React Deprecations for 15.4, 15.5, 15.6 in preparation for 16 handled in prebundled version #789, #798

#### New Features

- Generator now makes modern style `createReactClass`(JS) or `extends React.Component`(ES6, CoffeeScript) code

#### Deprecation

- Next version will drop the addons option as they are not supported with React 16
- TheRubyRacer's newest version (0.12.3 at time of writing) only supports libV8 (3.16.14.15) which is too old for some new JS features, future versions of this gem will need more modern ExecJS runtimes such as mini_racer (currently on libV8 5.9.x)

#### Bug Fixes

## 2.3.0

#### New Features

- Webpacker and Webpack 3 support #777
- Update to React 15.6.2 #789

#### Deprecation

#### Bug Fixes

## 2.2.1

#### New Features

- Support `config.react.server_renderer_directories` in initializers #729

#### Bug Fixes

- Fix Railtie watcher to update its timestamp when files change #722
- Don't use `yarn` binstub because webpacker doesn't provide it anymore #717

## 2.2.0

#### New Features

- Improve error handling when components aren't found #704

#### Bug Fixes

- Camelize filename when generating for webpack #703
- Include node module boilerplate when generating for webpack #710
- Don't look for non-existent `Turbolinks.EVENTS` #708

## 2.1.0 (April 18, 2017)

#### New Features

- Support Rails 5.1 #697

#### Bug Fixes

- Fix UJS unmounting by selector #696

## 2.0.2 (April 13, 2017)

#### New Features

- Rerun events detection at any time with `ReactRailsUJS.detectEvents()` #693
- Make the NPM version of `react_ujs` match the Rubygem version

`2.0.1` was skipped because a bad version of `react_ujs` was published to NPM.

## 2.0.0 (April 13, 2017)

#### Breaking Changes

- Server rendering loads `server_rendering.js` by default #471 . Upgrade by adding a new file which requires the previous defaults:

  ```js
  // app/assets/javascripts/server_rendering.js
  // = require react-server
  // = require components
  ```

#### New Features

- Webpacker support:
  - `react_component` can find components via `require.context` + `ReactRailsUJS.useContext` #678
  - Server rendering detects Webpacker and uses packs #683, #687
  - `ReactRailsUJS` is available from `npm` with `yarn add react_ujs` or `npm install react_ujs` #678
- `per_request_react_rails_prerenderer` Allows you to check out a renderer for the _whole request_ instead of once-per-`react_component` #559

#### Bug Fixes

- Improved watching of server-rendering JS files #687
- Fix console replay:
  - Put the `<script>` tag outside the React.js container to avoid React warnings #691
  - Clear console history between renders #692
- Use better Turbolinks events #690

## 1.11.0 (April 4, 2017)

#### New Features

- Support `prerender: false` when rendering in a controller #680
- Update React to `15.4.2` #681

#### Bug Fixes

- Fix joining asset path in YamlManifestContainer #679
- Remove `coffee-script-source` from dependencies. #667 If you have a version conflict, you should specify the proper version yourself.

## 1.10.0 (October 6, 2016)

#### Breaking Changes

- Alias `window = this;` has been removed from the default server rendering JavaScript to improve detection of the server rendering environment. To get the old behavior, you can add the alias in your own server rendering code. #615

#### New Features

- Calling `setTimeout` or `clearTimeout` in server rendering will raise an informative error because they aren't supported #618
- `prerender:` options will be passed to server renderer methods #641
- `react_component(..., camelize_props:)` option will override the application default #642, #645
- Ship with React.js 15.4.1 #646

#### Deprecation

#### Bug Fixes

- use `['default']` accessor to support old JavaScript versions #619
- `react_component` with a block will correctly render the content inside the `div`

## 1.9.0 (October 6, 2016)

#### Breaking Changes

#### New Features

- Accept extra JS code in `code:` option for SprocketsRenderer #604

#### Bug Fixes

- Use `asset_prefix` for YamlContainer #598
- Fix requiring `.js` from `.es6.jsx` #591

## 1.8.2 (August 9, 2016)

#### New Features

- Update to React 15.3.0 #583

#### Bug Fixes

- Fix `//= require` on Sprockets 3.7+ #582

## 1.8.1 (July 29, 2016)

#### New Features

- Update to React 15.2.1 #569

#### Bug Fixes

- Fix deprecation warnings on Sprockets 3.7+ #574
- Stop building broken addons files #576

## 1.8.0 (June 29, 2016)

#### New Features

- Sprockets 4 Support 🎉 #560
- Depend on Railties, not Rails #558
- Don't depend on `sprockets/railtie` #558
- Expose `React.camelize_props(props_hash)` #556
- Add `rails generate react:ujs --output=...` for copying the UJS into your app #557
- Support Babel 6 module exports & extension point `ReactRailsUJS.getConstructor` #503

## 1.7.2 (June 19, 2016)

#### New Features

- Improved error messages for missing components #538

#### Bug Fixes

- Fix `view_helper_implementation` config #551
- Fallback to `EnvironmentContainer` for server rendering when manifest isn't available #545

## 1.7.1 (May 10, 2016)

#### New Features

- Update to React 15.0.2 #525

#### Bug Fixes

- Update `.to_prepare` for Rails 5 #526
- Use `register_engine` with Sprockets 3 to avoid compiling _all_ files #522

## 1.7.0 (April 29, 2016)

#### New Features

- Update to React 15.0.1 #512
- Support PJAX #518
- Static renders don't include `data-react-` attributes #497

#### Bug Fixes

- Better unmounting on Turbolinks 5 #521
- Fix console replay #496

## 1.6.2 (February 28, 2016)

#### Bug Fixes

- Fix Server Rendering for Rails 3.2 #487

## 1.6.1 (February 28, 2016)

#### New Features

- UJS can mount and unmount a component by ID (not only the component's children) #466
- Support Turbolinks 5 #475

#### Bug Fixes

- Support nested arrays with `camelize_props` #480
- Improve Sprockets 3 compatibility #453
- Fix install-generator `require` spacing #476

## 1.6.0 (February 4, 2016)

#### New Features

- Individual add-ons can be included in a bundle with sprockets require directives. #457
- Support `sprockets-rails` 3 #430
- Update to React 0.14.6

#### Bug Fixes

- Fix install generator when `//= require`s are malformed #463
- Use `before_action` if available #456
- Add CHANGELOG to gem bundle #471
- Use `window.attachEvent` to support IE8 without jQuery 😬#446

## 1.5.0 (November 25, 2015)

#### New Features

- Update to React 0.14.3 #412
- `config.react.camelize_props = true` will camelize `react_component` prop keys #409

#### Bug Fixes

- Fix chained `.es6` file names with JSX processor #411
- Don't insert `// =require`s multiple times #398

## 1.4.2 (November 5, 2015)

#### New Features

- Component generator `--coffee` option #387
- Support Sprockets 4 with a JSX processor #385

#### Bug Fixes

- Support custom attributes when rendering from controller #384

## 1.4.1 (October 23, 2015)

#### Bug Fixes

- Minify & optimize the production build of React.js #380

## 1.4.0 (October 22, 2015)

#### New Features

- Include React.js 0.14

## 1.3.3 (October 21, 2015)

#### Bug Fixes

- Also support React 0.14 in `unmountComponents` #372
- Use a fallback view helper in case a Rails controller wasn't used #375

## 1.3.2 (October 13, 2015)

#### New Features

- The UJS can mount and unmount components within a given DOM node #358
- Support dropped-in React 0.14 in UJS #366

## 1.3.1 (September 18, 2015)

#### Bug Fixes

- Use controller lifecycle hooks for view helper (tests don't run middlewares) #356

## 1.3.0 (September 15, 2015)

#### New Features

- Render components directly from the controller with `render component: ...` #329
- Provide a custom view helper with `config.react.view_helper_implementation` #346

#### Bug Fixes

- Allow `react-rails` configs to be set in initializers #347

## 1.2.0 (August 19, 2015)

#### New Features

- Support `--es6` option in component generator #332
- Support Sprockets 3 #322

#### Bug Fixes

- Don't bother unmounting components `onBeforeUnload` #318
- Include `React::Rails::VERSION` in the gem #335

## 1.1.0 (July 9, 2015)

#### Breaking Changes

- Changed server rendering configuration names #253

  | Old                                | New                                                     |
  | ---------------------------------- | ------------------------------------------------------- |
  | `config.react.timeout`             | `config.react.server_renderer_timeout`                  |
  | `config.react.max_renderers`       | `config.react.server_renderer_pool_size`                |
  | `config.react.react_js`            | `config.react.server_renderer_options[:files]`          |
  | `config.react.component_filenames` | `config.react.server_renderer_options[:files]`          |
  | `config.react.replay_console`      | `config.react.server_renderer_options[:replay_console]` |
  | (none)                             | `config.react.server_renderer`                          |

- JSX is transformed by Babel, not JSTransform #295

#### New Features

- Allow custom renderers for server rendering #253
- Server render with `renderToStaticMarkup` via `prerender: :static` #253
- Accept `config.react.jsx_transform_options = {asset_path: "path/to/JSXTransformer.js"}` #273
- Added `BabelTransformer` for transforming JSX #295
- Added `ExecJSRenderer` to server rendering tools
- Accept `config.react.jsx_transformer_class` #302

#### Deprecations

- `JSXTransformer` won't be updated

#### Bug Fixes

- Fix gem versions in tests #270
- Expire the Sprockets cache if you change React.js builds #257
- Instead of copying builds into local directires, add different React.js builds to the asset pipeline #254
- Camelize attribute names in the component generator #262
- Add `tilt` dependency #248
- Default prerender pool size to 1 #302

## 1.0.0 (April 7, 2015)

#### New Features

- Vendor versions of React.js with `config.variant`, `config.addons` and `//= require react`
- Component generator
- View helper and UJS for mounting components
- Server rendering with `prerender: true`
- Transform `.jsx` in the asset pipeline

[Unreleased]: https://github.com/reactjs/react-rails/compare/v3.3.0...main
[3.3.0]: https://github.com/reactjs/react-rails/compare/v3.2.1...v3.3.0
[3.2.1]: https://github.com/reactjs/react-rails/compare/v3.2.0...v3.2.1
[3.2.0]: https://github.com/reactjs/react-rails/compare/v3.1.1...v3.2.0
[3.1.1]: https://github.com/reactjs/react-rails/compare/v3.1.0...v3.1.1
[3.1.0]: https://github.com/reactjs/react-rails/compare/v3.0.0...v3.1.0
[3.0.0]: https://github.com/reactjs/react-rails/compare/v2.7.1...v3.0.0
[2.7.1]: https://github.com/reactjs/react-rails/compare/v2.7.0...v2.7.1
[2.7.0]: https://github.com/reactjs/react-rails/compare/v2.6.2...v2.7.0


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

## Our Pledge

In the interest of fostering an open and welcoming environment, we as contributors and maintainers pledge to making participation in our project and our community a harassment-free experience for everyone, regardless of age, body size, disability, ethnicity, gender identity and expression, level of experience, nationality, personal appearance, race, religion, or sexual identity and orientation.

## Our Standards

Examples of behavior that contributes to creating a positive environment include:

* Using welcoming and inclusive language
* Being respectful of differing viewpoints and experiences
* Gracefully accepting constructive criticism
* Focusing on what is best for the community
* Showing empathy towards other community members

Examples of unacceptable behavior by participants include:

* The use of sexualized language or imagery and unwelcome sexual attention or advances
* Trolling, insulting/derogatory comments, and personal or political attacks
* Public or private harassment
* Publishing others' private information, such as a physical or electronic address, without explicit permission
* Other conduct which could reasonably be considered inappropriate in a professional setting

## Our Responsibilities

Project maintainers are responsible for clarifying the standards of acceptable behavior and are expected to take appropriate and fair corrective action in response to any instances of unacceptable behavior.

Project maintainers have the right and responsibility to remove, edit, or reject comments, commits, code, wiki edits, issues, and other contributions that are not aligned to this Code of Conduct, or to ban temporarily or permanently any contributor for other behaviors that they deem inappropriate, threatening, offensive, or harmful.

## Scope

This Code of Conduct applies both within project spaces and in public spaces when an individual is representing the project or its community. Examples of representing a project or community include using an official project e-mail address, posting via an official social media account, or acting as an appointed representative at an online or offline event. Representation of a project may be further defined and clarified by project maintainers.

## Enforcement

Instances of abusive, harassing, or otherwise unacceptable behavior may be reported by contacting the project team at neonmd@hotmail.co.uk. The project team will review and investigate all complaints, and will respond in a way that it deems appropriate to the circumstances. The project team is obligated to maintain confidentiality with regard to the reporter of an incident. Further details of specific enforcement policies may be posted separately.

Project maintainers who do not follow or enforce the Code of Conduct in good faith may face temporary or permanent repercussions as determined by other members of the project's leadership.

## Attribution

This Code of Conduct is adapted from the [Contributor Covenant][homepage], version 1.4, available at [http://contributor-covenant.org/version/1/4][version]

[homepage]: http://contributor-covenant.org
[version]: http://contributor-covenant.org/version/1/4/


================================================
FILE: CONTRIBUTING.md
================================================
# Contributing to React-Rails

🎉 Thanks for taking the time to contribute! 🎉

With 5 Million+ downloads of the react-rails Gem and another 2 Million+ downloads of react_ujs on NPM, you're helping the biggest React + Rails community!

What follows is a set of guidelines for contributing to React-Rails, inside the [react-js Organization](https://github.com/reactjs), part of the wider [React Community](https://reactcommunity.org/)

By contributing to React-Rails, you agree to abide by the [code of conduct](https://github.com/reactjs/react-rails/blob/main/CODE_OF_CONDUCT.md).

<!-- START doctoc generated TOC please keep comment here to allow auto update -->
<!-- DON'T EDIT THIS SECTION, INSTEAD RE-RUN doctoc TO UPDATE -->


- [How Can I Contribute?](#how-can-i-contribute)
  - [Reporting Bugs](#reporting-bugs)
    - [Before Submitting A Bug Report](#before-submitting-a-bug-report)
    - [How Do I Submit A (Good) Bug Report?](#how-do-i-submit-a-good-bug-report)
  - [Your First Code Contribution](#your-first-code-contribution)
    - [Pull Requests](#pull-requests)
    - [Development](#development)
      - [Local dev](#local-dev)
      - [Running tests](#running-tests)
      - [Updating the pre-bundled react](#updating-the-pre-bundled-react)
      - [Updating ReactRailsUJS](#updating-reactrailsujs)
      - [Releasing the Gem](#releasing-the-gem)
- [Styleguides](#styleguides)
  - [Git Commit Messages](#git-commit-messages)
  - [Ruby styleguide](#ruby-styleguide)
- [Issue and Pull Request Labels](#issue-and-pull-request-labels)

<!-- END doctoc generated TOC please keep comment here to allow auto update -->

## How Can I Contribute?

### Reporting Bugs

#### Before Submitting A Bug Report
* **Check the [wiki](https://github.com/reactjs/react-rails/wiki).** You might be able to find a guide on what you're experiencing. Most importantly, check if you can reproduce the problem [in the latest version of React-Rails with React_ujs](https://github.com/reactjs/react-rails/tree/main), sometimes we have already fixed the issue.
* **Perform a [cursory search](https://github.com/reactjs/react-rails/issues)** to see if the problem has already been reported. If it has **and the issue is still open**, add a comment to the existing issue instead of opening a new one. If **the issue is closed** open a new issue with reproduction steps and reference the old one.
* **If the problem is with pre-rendering, turn off pre-rendering and look at Chrome's developer console**, that normally reveals more details about what the true error message is if it's a syntax error in a component or failing to require a component file.

#### How Do I Submit A (Good) Bug Report?
Bugs are tracked as [GitHub issues](https://guides.github.com/features/issues/).
Create an issue and provide the following information by filling in [the template](.github/ISSUE_TEMPLATE.md).

Explain the problem and include additional details to help maintainers reproduce the problem:

* **Use a clear and descriptive title** for the issue to identify the problem.
* **Describe the exact steps which reproduce the problem** in as many details as possible. When listing steps, **don't just say what you did, but explain how you did it**. For example, If you're using Browserify instead of Webpacker, how did you do it?
* **Provide specific examples to demonstrate the steps**. Include links to files or GitHub projects, Gists, or copy/pasteable snippets, which you use in those examples. If you're providing snippets in the issue, use [Markdown code blocks](https://help.github.com/articles/markdown-basics/#multiple-lines).
* **Describe the behavior you observed after following the steps** and point out what exactly is the problem with that behavior.
* **Explain which behavior you expected to see instead and why.**
* **Include screenshots and animated GIFs** which show you following the described steps and clearly demonstrate the problem. You can use [this tool](http://www.cockos.com/licecap/) to record GIFs on macOS and Windows, and [this tool](https://github.com/colinkeenan/silentcast) or [this tool](https://github.com/GNOME/byzanz) on Linux.

Include details about your configuration and environment, React-Rails integrates many tools, versions of many things could be the culprit, though we try test as many as reasonable in our [Travis Build](.travis.yml)

* **Which version of React-Rails are you using?**
* **Which version of React_UJS are you using?**
* **Which version of Shakapacker/Sprockets are you using?**
* **Which version of Rails are you using?**

### Your First Code Contribution

Unsure where to begin contributing to React-Rails? You can start by looking through these `help-wanted` issues:

* [Help wanted issues](https://github.com/reactjs/react-rails/issues?q=is%3Aopen+is%3Aissue+label%3A%22help+wanted%22)

This issue list is sorted by total number of comments. While not perfect, number of comments is a reasonable proxy for impact a given change will have.

#### Pull Requests

See [git commit message style](#git-commit-messages)

* Fill in [the required template](.github/PULL_REQUEST_TEMPLATE.md)
* Do not include issue numbers in the PR title
* Include screenshots and animated GIFs in your pull request whenever possible.
* Follow the [styleguides](#styleguides) where possible but readability is the most important!
* Include intention-revealing [Minitest](https://github.com/seattlerb/minitest) tests in the `./test` folder. It's important people know *why* a test exists by reading it more than *what* it does, we can read the source for the *what*.
* Document new code where you're able.

#### Development

##### Local dev

Clone down the [react-rails-example-app](https://github.com/bookofgreg/react-rails-example-app), it has several branches for different scenarios. It's designed to contain very simple examples of each feature of React-Rails.

To develop Ruby code, change the Gemfile to point to a local copy of react-rails.
```
gem 'react-rails', path: '../react-rails'
```

To develop the React_UJS NPM Package, make your changes and run `npm pack` to make a `.tgz` bundle, then in react-rails-example-app `yarn add ../react_ujs-<version>.tgz`

##### Running tests

Run `yalc publish --push` in the root directory of the gem to ensure the test suites use the exact same js code used in the currenlty developing ReactRails.

`bundle exec appraisal install` to install gems on every gemfile Appraisal contains.
`rake test` or `bundle exec appraisal rake test` runs everything.
or run a specific suite using `bundle exec appraisal <appraisal name> rake test`
- Find appraisal names in [Appraisals](Appraisals)
- Integration tests run in Headless Chrome which is included in Chrome (59+ linux,OSX | 60+ Windows)
- ChromeDriver is included with `chromedriver-helper` gem so no need to manually install that 👍

**Note:** If using Ruby 2.7, set `MT_KWARGS_HACK=1` to ensure Minitest runs smoothly.

##### Updating the pre-bundled react
- Update React with `rake react:update`
It outputs an ironically webpacked couple of files into `lib/assets/react-source/<environment>/react(-server).js` where it will be picked up by `sprockets` in `lib/react/rails/asset_variant.rb`

##### Updating ReactRailsUJS
- Update the UJS with `rake ujs:update`

##### Releasing the Gem
- (For Maintainers) To release a new RubyGems version:
  - Update the [changelog](CHANGELOG.md) (find recent changes on GitHub by listing commits or showing closed PRs)
  - Regular versions: `bundle exec rake create_release\[2.7.0\]`
  - RC versions: `bundle exec rake create_release\[2.7.0.rc.2\]`
  - Note, `rake create_release` runs `rake react:update` and `rake ujs:update`

## Styleguides

### Git Commit Messages

* Use the present tense ("Add feature" not "Added feature")
* Use the imperative mood ("Move cursor to..." not "Moves cursor to...")
* Limit the first line to 72 characters or less
* Reference issues and pull requests liberally after the first line
* * When only changing documentation, include `[ci skip]` in the [commit description](https://docs.travis-ci.com/user/customizing-the-build/#Skipping-a-build) so we don't waste Travis's Open source resources.
* Consider starting the commit message with an applicable emoji:
    * :art: `:art:` when improving the format/structure of the code
    * :racehorse: `:racehorse:` when improving performance
    * :memo: `:memo:` when writing docs
    * :bug: `:bug:` when fixing a bug
    * :fire: `:fire:` when removing code or files
    * :green_heart: `:green_heart:` when fixing the CI build
    * :white_check_mark: `:white_check_mark:` when adding tests
    * :lock: `:lock:` when dealing with security
    * :arrow_up: `:arrow_up:` when upgrading dependencies
    * :arrow_down: `:arrow_down:` when downgrading dependencies
    * :shirt: `:shirt:` when removing linter warnings

### Ruby styleguide

Ruby Style in this repo should attempt to follow the standard ruby styles as defined in `Rubocop`. This is more of a guide than a rule so use common sense, readability is more important than the style guide!

## Issue and Pull Request Labels

Todo

Finally, thanks to the [Atom Organization](https://github.com/atom) where this Contributing guide is based! :heart: :green_heart:


================================================
FILE: Gemfile
================================================
# frozen_string_literal: true

source "http://rubygems.org"

gemspec


================================================
FILE: Guardfile
================================================
guard :minitest do
  # with Minitest::Unit
  watch(%r{^test/(.*)\/?(.*)_test\.rb$})
  watch(%r{^lib/(.*/)?([^/]+)\.rb$})     { |m| "test/#{m[1]}#{m[2]}_test.rb" }
  watch(%r{^test/test_helper\.rb$})      { 'test' }
end


================================================
FILE: LICENSE
================================================
                                 Apache License
                           Version 2.0, January 2004
                        http://www.apache.org/licenses/

   TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION

   1. Definitions.

      "License" shall mean the terms and conditions for use, reproduction,
      and distribution as defined by Sections 1 through 9 of this document.

      "Licensor" shall mean the copyright owner or entity authorized by
      the copyright owner that is granting the License.

      "Legal Entity" shall mean the union of the acting entity and all
      other entities that control, are controlled by, or are under common
      control with that entity. For the purposes of this definition,
      "control" means (i) the power, direct or indirect, to cause the
      direction or management of such entity, whether by contract or
      otherwise, or (ii) ownership of fifty percent (50%) or more of the
      outstanding shares, or (iii) beneficial ownership of such entity.

      "You" (or "Your") shall mean an individual or Legal Entity
      exercising permissions granted by this License.

      "Source" form shall mean the preferred form for making modifications,
      including but not limited to software source code, documentation
      source, and configuration files.

      "Object" form shall mean any form resulting from mechanical
      transformation or translation of a Source form, including but
      not limited to compiled object code, generated documentation,
      and conversions to other media types.

      "Work" shall mean the work of authorship, whether in Source or
      Object form, made available under the License, as indicated by a
      copyright notice that is included in or attached to the work
      (an example is provided in the Appendix below).

      "Derivative Works" shall mean any work, whether in Source or Object
      form, that is based on (or derived from) the Work and for which the
      editorial revisions, annotations, elaborations, or other modifications
      represent, as a whole, an original work of authorship. For the purposes
      of this License, Derivative Works shall not include works that remain
      separable from, or merely link (or bind by name) to the interfaces of,
      the Work and Derivative Works thereof.

      "Contribution" shall mean any work of authorship, including
      the original version of the Work and any modifications or additions
      to that Work or Derivative Works thereof, that is intentionally
      submitted to Licensor for inclusion in the Work by the copyright owner
      or by an individual or Legal Entity authorized to submit on behalf of
      the copyright owner. For the purposes of this definition, "submitted"
      means any form of electronic, verbal, or written communication sent
      to the Licensor or its representatives, including but not limited to
      communication on electronic mailing lists, source code control systems,
      and issue tracking systems that are managed by, or on behalf of, the
      Licensor for the purpose of discussing and improving the Work, but
      excluding communication that is conspicuously marked or otherwise
      designated in writing by the copyright owner as "Not a Contribution."

      "Contributor" shall mean Licensor and any individual or Legal Entity
      on behalf of whom a Contribution has been received by Licensor and
      subsequently incorporated within the Work.

   2. Grant of Copyright License. Subject to the terms and conditions of
      this License, each Contributor hereby grants to You a perpetual,
      worldwide, non-exclusive, no-charge, royalty-free, irrevocable
      copyright license to reproduce, prepare Derivative Works of,
      publicly display, publicly perform, sublicense, and distribute the
      Work and such Derivative Works in Source or Object form.

   3. Grant of Patent License. Subject to the terms and conditions of
      this License, each Contributor hereby grants to You a perpetual,
      worldwide, non-exclusive, no-charge, royalty-free, irrevocable
      (except as stated in this section) patent license to make, have made,
      use, offer to sell, sell, import, and otherwise transfer the Work,
      where such license applies only to those patent claims licensable
      by such Contributor that are necessarily infringed by their
      Contribution(s) alone or by combination of their Contribution(s)
      with the Work to which such Contribution(s) was submitted. If You
      institute patent litigation against any entity (including a
      cross-claim or counterclaim in a lawsuit) alleging that the Work
      or a Contribution incorporated within the Work constitutes direct
      or contributory patent infringement, then any patent licenses
      granted to You under this License for that Work shall terminate
      as of the date such litigation is filed.

   4. Redistribution. You may reproduce and distribute copies of the
      Work or Derivative Works thereof in any medium, with or without
      modifications, and in Source or Object form, provided that You
      meet the following conditions:

      (a) You must give any other recipients of the Work or
          Derivative Works a copy of this License; and

      (b) You must cause any modified files to carry prominent notices
          stating that You changed the files; and

      (c) You must retain, in the Source form of any Derivative Works
          that You distribute, all copyright, patent, trademark, and
          attribution notices from the Source form of the Work,
          excluding those notices that do not pertain to any part of
          the Derivative Works; and

      (d) If the Work includes a "NOTICE" text file as part of its
          distribution, then any Derivative Works that You distribute must
          include a readable copy of the attribution notices contained
          within such NOTICE file, excluding those notices that do not
          pertain to any part of the Derivative Works, in at least one
          of the following places: within a NOTICE text file distributed
          as part of the Derivative Works; within the Source form or
          documentation, if provided along with the Derivative Works; or,
          within a display generated by the Derivative Works, if and
          wherever such third-party notices normally appear. The contents
          of the NOTICE file are for informational purposes only and
          do not modify the License. You may add Your own attribution
          notices within Derivative Works that You distribute, alongside
          or as an addendum to the NOTICE text from the Work, provided
          that such additional attribution notices cannot be construed
          as modifying the License.

      You may add Your own copyright statement to Your modifications and
      may provide additional or different license terms and conditions
      for use, reproduction, or distribution of Your modifications, or
      for any such Derivative Works as a whole, provided Your use,
      reproduction, and distribution of the Work otherwise complies with
      the conditions stated in this License.

   5. Submission of Contributions. Unless You explicitly state otherwise,
      any Contribution intentionally submitted for inclusion in the Work
      by You to the Licensor shall be under the terms and conditions of
      this License, without any additional terms or conditions.
      Notwithstanding the above, nothing herein shall supersede or modify
      the terms of any separate license agreement you may have executed
      with Licensor regarding such Contributions.

   6. Trademarks. This License does not grant permission to use the trade
      names, trademarks, service marks, or product names of the Licensor,
      except as required for reasonable and customary use in describing the
      origin of the Work and reproducing the content of the NOTICE file.

   7. Disclaimer of Warranty. Unless required by applicable law or
      agreed to in writing, Licensor provides the Work (and each
      Contributor provides its Contributions) on an "AS IS" BASIS,
      WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
      implied, including, without limitation, any warranties or conditions
      of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
      PARTICULAR PURPOSE. You are solely responsible for determining the
      appropriateness of using or redistributing the Work and assume any
      risks associated with Your exercise of permissions under this License.

   8. Limitation of Liability. In no event and under no legal theory,
      whether in tort (including negligence), contract, or otherwise,
      unless required by applicable law (such as deliberate and grossly
      negligent acts) or agreed to in writing, shall any Contributor be
      liable to You for damages, including any direct, indirect, special,
      incidental, or consequential damages of any character arising as a
      result of this License or out of the use or inability to use the
      Work (including but not limited to damages for loss of goodwill,
      work stoppage, computer failure or malfunction, or any and all
      other commercial damages or losses), even if such Contributor
      has been advised of the possibility of such damages.

   9. Accepting Warranty or Additional Liability. While redistributing
      the Work or Derivative Works thereof, You may choose to offer,
      and charge a fee for, acceptance of support, warranty, indemnity,
      or other liability obligations and/or rights consistent with this
      License. However, in accepting such obligations, You may act only
      on Your own behalf and on Your sole responsibility, not on behalf
      of any other Contributor, and only if You agree to indemnify,
      defend, and hold each Contributor harmless for any liability
      incurred by, or claims asserted against, such Contributor by reason
      of your accepting any such warranty or additional liability.

   END OF TERMS AND CONDITIONS

   APPENDIX: How to apply the Apache License to your work.

      To apply the Apache License to your work, attach the following
      boilerplate notice, with the fields enclosed by brackets "[]"
      replaced with your own identifying information. (Don't include
      the brackets!)  The text should be enclosed in the appropriate
      comment syntax for the file format. We also recommend that a
      file or class name and description of purpose be included on the
      same "printed page" as the copyright notice for easier
      identification within third-party archives.

   Copyright [yyyy] [name of copyright owner]

   Licensed under the Apache License, Version 2.0 (the "License");
   you may not use this file except in compliance with the License.
   You may obtain a copy of the License at

       http://www.apache.org/licenses/LICENSE-2.0

   Unless required by applicable law or agreed to in writing, software
   distributed under the License is distributed on an "AS IS" BASIS,
   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
   See the License for the specific language governing permissions and
   limitations under the License.


================================================
FILE: LintingGemfile
================================================
# frozen_string_literal: true

source "http://rubygems.org"
# To install gems from this Gemfile locally, use BUNDLE_GEMFILE=./LintingGemfile bundle exec rubocop
gem "rubocop"
gem "rubocop-minitest"
gem "rubocop-performance"


================================================
FILE: README.md
================================================
# React-Rails v3

[![Gem](https://img.shields.io/gem/v/react-rails.svg?style=flat-square)](http://rubygems.org/gems/react-rails)
[![npm](https://img.shields.io/npm/v/react_ujs.svg?style=flat-square)](https://www.npmjs.com/package/react_ujs)
[![Ruby](https://github.com/reactjs/react-rails/actions/workflows/ruby.yml/badge.svg)](https://github.com/reactjs/react-rails/actions/workflows/ruby.yml)

For version 2.7 documentation, visit the [2.7-stable](https://github.com/reactjs/react-rails/tree/2.7-stable) branch.

## Summary
React-Rails is a flexible tool to use [React](http://facebook.github.io/react/) with Rails. The benefits:
* Automatically renders React server-side and client-side
* Supports [Shakapacker](https://github.com/shakacode/shakapacker) v7
* Supports Propshaft
* Supports Sprockets 4.x, 3.x
* Lets you use [JSX](http://facebook.github.io/react/docs/jsx-in-depth.html), [ES6](http://es6-features.org/), [TypeScript](https://www.typescriptlang.org/), [CoffeeScript](http://coffeescript.org/)

---

While ShakaCode will continue to support this gem, you might consider migrating to [React on Rails](https://github.com/shakacode/react_on_rails) or [React on Rails Pro with proper Node rendering](https://www.shakacode.com/react-on-rails-pro/).

Why? React on Rails code receives much more active development and testing. For example, consider the [ReactRailsUJS](https://github.com/reactjs/react-rails/blob/main/react_ujs/index.js) implementation compared to the [ReactOnRails Node package](https://github.com/shakacode/react_on_rails/tree/master/node_package) which is written in TypeScript. For another example, React on Rails has work underway to support the latest React features, such as [React Server Components](https://react.dev/reference/rsc/server-components).

You can find [migration to React on Rails steps here](https://github.com/reactjs/react-rails/blob/main/docs/migrating-from-react-rails-to-react_on_rails.md).

---
## ShakaCode Support

[ShakaCode](https://www.shakacode.com) focuses on helping Ruby on Rails teams use React and Webpack better. We can upgrade your project and improve your development and customer experiences, allowing you to focus on building new features or fixing bugs instead. 

For an overview of working with us, see our [Client Engagement Model](https://www.shakacode.com/blog/client-engagement-model/) article and [how we bill for time](https://www.shakacode.com/blog/shortcut-jira-trello-github-toggl-time-and-task-tracking/).

We also specialize in helping development teams lower infrastructure and CI costs. Check out our project [Control Plane Flow](https://github.com/shakacode/control-plane-flow/), which can allow you to get the ease of Heroku with the power of Kubernetes and big cost savings.

If you think ShakaCode can help your project, [click here](https://meetings.hubspot.com/justingordon/30-minute-consultation) to book a call with [Justin Gordon](mailto:justin@shakacode.com), the creator of React on Rails and Shakapacker.

Here's a testimonial of how ShakaCode can help from [Florian Gößler](https://github.com/FGoessler) of [Blinkist](https://www.blinkist.com/), January 2, 2023:
> Hey Justin 👋
>
> I just wanted to let you know that we today shipped the webpacker to shakapacker upgrades and it all seems to be running smoothly! Thanks again for all your support and your teams work! 😍
>
> On top of your work, it was now also very easy for me to upgrade Tailwind and include our external node_module based web component library which we were using for our other (more modern) apps already. That work is going to be shipped later this week though as we are polishing the last bits of it. 😉
>
> Have a great 2023 and maybe we get to work together again later in the year! 🙌

Read the [full review here](https://clutch.co/profile/shakacode#reviews?sort_by=date_DESC#review-2118154).

## Resources
* [Click to join **React + Rails Slack**](https://reactrails.slack.com/join/shared_invite/enQtNjY3NTczMjczNzYxLTlmYjdiZmY3MTVlMzU2YWE0OWM0MzNiZDI0MzdkZGFiZTFkYTFkOGVjODBmOWEyYWQ3MzA2NGE1YWJjNmVlMGE). Then join the channel `#react-rails`.
* If upgrading, consider migrating to the [react_on_rails](https://github.com/shakacode/react_on_rails) gem.
* Source code example utilizing React-Rails: https://github.com/BookOfGreg/react-rails-example-app

## Documentation

- [Get started](docs/get-started.md)
  - [Use with Shakapacker](docs/get-started.md#use-with-shakapacker)
    - [Component name](docs/get-started.md#component-name)
    - [File naming](docs/get-started.md#file-naming)
    - [Typescript support](docs/get-started.md#typescript-support)
    - [Test component](docs/get-started.md#test-component)
  - [Use with Asset Pipeline](docs/get-started.md#use-with-asset-pipeline)
    - [Custom JSX Transformer](docs/get-started.md#custom-jsx-transformer)
      - [Transform Plugin Options](docs/get-started.md#transform-plugin-options)
    - [React.js versions](docs/get-started.md#reactjs-versions)
- [View Helper](docs/view-helper.md)
  - [Custom View Helper](docs/view-helper.md#custom-view-helper)
- [UJS](docs/ujs.md)
  - [Mounting & Unmounting](docs/ujs.md#mounting--unmounting)
  - [Event Handling](docs/ujs.md#event-handling)
  - [`getConstructor`](docs/ujs.md#getconstructor)
- [Server-Side Rendering](docs/server-side-rendering.md)
  - [Configuration](docs/server-side-rendering.md#configuration)
  - [JavaScript State](docs/server-side-rendering.md#javascript-state)
  - [Custom Server Renderer](docs/server-side-rendering.md#custom-server-renderer)
- [Controller Actions](docs/controller-actions.md)
- [Component Generator](docs/component-generator.md)
  - [Use with JBuilder](docs/component-generator.md#use-with-jbuilder)
  - [Camelize Props](docs/component-generator.md#camelize-props)
  - [Changing Component Templates](docs/component-generator.md#changing-component-templates)
- [Upgrading](docs/upgrading.md)
  - [2.7 to 3.0](docs/upgrading.md#27-to-30)
  - [2.3 to 2.4](docs/upgrading.md#23-to-24)
- [Migrating from `react-rails` to `react_on_rails`](docs/migrating-from-react-rails-to-react_on_rails.md)
  - [Why migrate?](docs/migrating-from-react-rails-to-react_on_rails.md#why-migrate)
  - [Steps to migrate](docs/migrating-from-react-rails-to-react_on_rails.md#steps-to-migrate)
- [Common Errors](docs/common-errors.md)
  - [Getting warning for `Can't resolve 'react-dom/client'` in React < 18](docs/common-errors.md#getting-warning-for-cant-resolve-react-domclient-in-react--18)
  - [Undefined Set](docs/common-errors.md#undefined-set)
  - [Using TheRubyRacer](docs/common-errors.md#using-therubyracer)
  - [HMR](docs/common-errors.md#hmr)
  - [Tests in component directory](docs/common-errors.md#tests-in-component-directory)

After reading this README file, additional information about React-Rails can be found on the Wiki page:
https://github.com/reactjs/React-Rails/wiki
The Wiki page features a significant amount of additional information about React-Rails, including instructional articles and answers to the most frequently asked questions.

## Related Projects

- [react\_on\_rails](https://github.com/shakacode/react_on_rails): Integration of React with Rails utilizing Webpack, Redux, React-Router.
- [React on Rails Pro](https://www.shakacode.com/react-on-rails-pro/):React on Rails with Node rendering and many other performance enhancements.
- [react-rails-benchmark_renderer](https://github.com/pboling/react-rails-benchmark_renderer) adds performance instrumentation to server rendering.
- [Ruby Hyperstack](https://hyperstack.org/): Use Ruby to build reactive user interfaces with React.

## Contributing

🎉 Thanks for taking the time to contribute! 🎉 See [CONTRIBUTING.md](./CONTRIBUTING.md) for more details.

# Supporters

The following companies provide licenses to the ShakaCode team, supporting the development of this and other open-source projects maintained by ShakaCode. ShakaCode stands by the usefulness of these products!

<br />
<br />

<a href="https://www.jetbrains.com">
  <img src="https://user-images.githubusercontent.com/4244251/184881139-42e4076b-024b-4b30-8c60-c3cd0e758c0a.png" alt="JetBrains" height="120px">
</a>
<a href="https://scoutapp.com">
  <picture>
    <source media="(prefers-color-scheme: dark)" srcset="https://user-images.githubusercontent.com/4244251/184881147-0d077438-3978-40da-ace9-4f650d2efe2e.png">
    <source media="(prefers-color-scheme: light)" srcset="https://user-images.githubusercontent.com/4244251/184881152-9f2d8fba-88ac-4ba6-873b-22387f8711c5.png">
    <img alt="ScoutAPM" src="https://user-images.githubusercontent.com/4244251/184881152-9f2d8fba-88ac-4ba6-873b-22387f8711c5.png" height="120px">
  </picture>
</a>
<a href="https://controlplane.com">
  <picture>
    <img alt="Control Plane" src="https://github.com/shakacode/.github/assets/20628911/90babd87-62c4-4de3-baa4-3d78ef4bec25" height="120px">
  </picture>
</a>
<br />
<a href="https://www.browserstack.com">
  <picture>
    <source media="(prefers-color-scheme: dark)" srcset="https://user-images.githubusercontent.com/4244251/184881122-407dcc29-df78-4b20-a9ad-f597b56f6cdb.png">
    <source media="(prefers-color-scheme: light)" srcset="https://user-images.githubusercontent.com/4244251/184881129-e1edf4b7-3ae1-4ea8-9e6d-3595cf01609e.png">
    <img alt="BrowserStack" src="https://user-images.githubusercontent.com/4244251/184881129-e1edf4b7-3ae1-4ea8-9e6d-3595cf01609e.png" height="55px">
  </picture>
</a>
<a href="https://www.honeybadger.io/">
  <picture>
    <img alt="HoneyBadger" src="https://user-images.githubusercontent.com/4244251/184881133-79ee9c3c-8165-4852-958e-31687b9536f4.png" height="70px">
  </picture>
</a>
<a href="https://coderabbit.ai">
  <picture>
    <source media="(prefers-color-scheme: dark)" srcset="https://victorious-bubble-f69a016683.media.strapiapp.com/White_Typemark_7229870ac5.svg">
    <source media="(prefers-color-scheme: light)" srcset="https://victorious-bubble-f69a016683.media.strapiapp.com/Orange_Typemark_7958cfa790.svg">
    <img alt="CodeRabbit" src="https://victorious-bubble-f69a016683.media.strapiapp.com/Orange_Typemark_7958cfa790.svg" height="55px">
  </picture>
</a>

---

ShakaCode is [hiring](https://jobs.lever.co/shakacode/3bdbfdb3-4495-4611-a279-01dddddb351abe)!


================================================
FILE: Rakefile
================================================
# frozen_string_literal: true

begin
  require "bundler/setup"
rescue LoadError
  puts "You must `gem install bundler` and `bundle install` to run rake tasks"
end

Bundler::GemHelper.install_tasks

require "package_json"

def copy_react_asset(webpack_file, destination_file)
  full_webpack_path = File.expand_path("../react-builds/build/#{webpack_file}", __FILE__)
  full_destination_path = File.expand_path("../lib/assets/react-source/#{destination_file}", __FILE__)
  FileUtils.cp(full_webpack_path, full_destination_path)
end

namespace :react do
  desc "Run the JS build process to put files in the gem source"
  task update: %i[install build copy]

  desc "Install the JavaScript dependencies"
  task :install do
    PackageJson.read("react-builds").manager.install
  end

  desc "Build the JS bundles with Webpack"
  task :build do
    PackageJson.read("react-builds").manager.run("build")
  end

  desc "Copy browser-ready JS files to the gem's asset paths"
  task :copy do
    environments = %w[development production]
    environments.each do |environment|
      copy_react_asset("#{environment}/react-browser.js", "#{environment}/react.js")
      copy_react_asset("#{environment}/react-server.js", "#{environment}/react-server.js")
    end
  end
end

namespace :ujs do
  desc "Run the JS build process to put files in the gem source"
  task update: %i[install build copy]

  desc "Install the JavaScript dependencies"
  task :install do
    PackageJson.read.manager.install
  end

  desc "Build the JS bundles with Webpack"
  task :build do
    PackageJson.read.manager.run("build")
  end

  desc "Copy browser-ready JS files to the gem's asset paths"
  task :copy do
    full_webpack_path = File.expand_path("react_ujs/dist/react_ujs.js", __dir__)
    full_destination_path = File.expand_path("lib/assets/javascripts/react_ujs.js", __dir__)
    FileUtils.cp(full_webpack_path, full_destination_path)
  end

  desc "Publish the package in ./react_ujs/ to npm as `react_ujs`"
  task publish: :update do
    `npm publish`
  end
end

require "appraisal"
require "minitest/test_task"

Minitest::TestTask.create(:test) do |t|
  t.libs << "lib"
  t.libs << "test"
  t.test_globs = ENV["TEST_PATTERN"] || "test/**/*_test.rb"
  t.verbose = ENV["TEST_VERBOSE"] == "1"
  t.warning = false
end

task default: :test

task :test_setup do
  Dir.chdir("./test/dummy") do
    PackageJson.read.manager.install
  end
end

task test: :test_setup


================================================
FILE: SECURITY.md
================================================
# Security Policy

## Supported Versions

We support the [latest version](VERSIONS.md) of the project.

## Reporting a Vulnerability

If you discover a security vulnerability, please send an email to
[security@shakacode.com](mailto:security@shakacode.com). We will respond as
quickly as possible to your report. Please do not disclose the
vulnerability publicly until we have had a chance to address it.

## Security Measures

We take security seriously and have implemented the following measures to
protect our project:

- Regular code reviews
- Automated testing
- Continuous integration and deployment


================================================
FILE: VERSIONS.md
================================================
# Versions

You can control what version of React.js (and JSXTransformer) is used by `react-rails`:

- Use the [bundled version](#bundled-versions) that comes with the gem
- [Drop in a copy](#drop-in-version) of React.js

## Bundled Versions

| Gem      | React.js |                |
| -------- | -------- | -------------- |
| main     | 16.14.0  |
| 2.6.2    | 16.14.0  |
| 2.6.1    | 16.9.0   |
| 2.6.0    | 16.8.6   |
| 2.5.0    | 16.8.6   |
| 2.4.7    | 16.4.2   |
| 2.4.6    | 16.4.1   |
| 2.4.5    | 16.3.2   |
| 2.4.4    | 16.2.0   |
| 2.4.3    | 16.1.1   |
| 2.4.2    | 16.1.1   |
| 2.4.1    | 16.0.0   |
| 2.4.0    | 16.0.0   |
| 2.3.1    | 15.6.2   | Updated Addons |
| 2.3.0    | 15.6.2   |
| 2.2.1    | 15.4.2   |
| 2.2.0    | 15.4.2   |
| 2.1.0    | 15.4.2   |
| 2.0.2    | 15.4.2   |
| 2.0.0    | 15.4.2   |
| 1.11.0   | 15.4.2   |
| 1.10.0   | 15.4.1   |
| 1.9.0    | 15.3.0   |
| 1.8.2    | 15.3.0   |
| 1.8.1    | 15.2.1   |
| 1.8.0    | 15.0.2   |
| 1.7.2    | 15.0.2   |
| 1.7.1    | 15.0.2   |
| 1.7.0    | 15.0.1   |
| 1.6.2    | 0.14.6   |
| 1.6.1    | 0.14.6   |
| 1.6.0    | 0.14.6   |
| 1.5.0    | 0.14.3   |
| 1.4.2    | 0.14.2   |
| 1.4.1    | 0.14.0   |
| 1.4.0    | 0.14.0   |
| 1.3.3    | 0.13.3   |
| 1.3.2    | 0.13.3   |
| 1.3.1    | 0.13.3   |
| 1.3.0    | 0.13.3   |
| 1.2.0    | 0.13.3   |
| 1.1.0    | 0.13.3   |
| 1.0.0    | ~> 0.13  |
| 0.13.0.0 | 0.13.0   |
| 0.12.2.0 | 0.12.2   |
| 0.12.1.0 | 0.12.1   |
| 0.12.0.0 | 0.12.0   |

## Drop-in Version

You can also provide your own copies of React.js and JSXTransformer. Just add a different version of `react.js` and `react-server.js` from this project or `JSXTransformer.js` (case-sensitive) files to the asset pipeline (eg, `app/assets/vendor/`).


================================================
FILE: check_for_uncommitted_files.sh
================================================
#!/bin/bash
set -e

status=$(git status --porcelain)
if [ -n "$status" ]; then
  status="${status//'%'/'%25'}"
  status="${status//$'\n'/'%0A'}"
  status="${status//$'\r'/'%0D'}"
  echo "$status"
  exit 1
else
  echo "The repository is clean"
  exit 0
fi


================================================
FILE: docs/common-errors.md
================================================
# Common Errors

<!-- START doctoc generated TOC please keep comment here to allow auto update -->
<!-- DON'T EDIT THIS SECTION, INSTEAD RE-RUN doctoc TO UPDATE -->

- [Getting warning for `Can't resolve 'react-dom/client'` in React < 18](#getting-warning-for-cant-resolve-react-domclient-in-react--18)
- [Undefined Set](#undefined-set)
- [Using TheRubyRacer](#using-therubyracer)
- [HMR](#hmr)
- [Tests in component directory](#tests-in-component-directory)

<!-- END doctoc generated TOC please keep comment here to allow auto update -->

## Getting warning for `Can't resolve 'react-dom/client'` in React < 18

You may see a warning like this when building a Webpack bundle using any version of React below 18. This warning can be safely [suppressed](https://webpack.js.org/configuration/other-options/#ignorewarnings) in your Webpack configuration. The following is an example of this suppression in `config/webpack/webpack.config.js`:

```diff
- const { webpackConfig } = require('shakapacker')
+ const { webpackConfig, merge } = require('shakapacker')

+const ignoreWarningsConfig = {
+  ignoreWarnings: [/Module not found: Error: Can't resolve 'react-dom\/client'/],
+};

- module.exports = webpackConfig
+ module.exports = merge({}, webpackConfig, ignoreWarningsConfig)
```

## Undefined Set
```
ExecJS::ProgramError (identifier 'Set' undefined):

(execjs):1
```
If you see any variation of this issue, see [Using TheRubyRacer](#using-therubyracer)


## Using TheRubyRacer
TheRubyRacer [hasn't updated LibV8](https://github.com/cowboyd/therubyracer/blob/master/therubyracer.gemspec#L20) (The library that powers Node.js) from v3 in 2 years, any new features are unlikely to work.

LibV8 itself is already [beyond version 7](https://github.com/cowboyd/libv8/releases/tag/v7.3.492.27.1) therefore many serverside issues are caused by old JS engines and fixed by using an up to date one such as [MiniRacer](https://github.com/discourse/mini_racer) or [TheRubyRhino](https://github.com/cowboyd/therubyrhino) on JRuby.

## HMR

Check out [Enabling Hot Module Replacement (HMR)](https://github.com/shakacode/shakapacker/blob/master/docs/react.md#enabling-hot-module-replacement-hmr) in Shakapacker documentation.

One caveat is that currently you [cannot Server-Side Render along with HMR](https://github.com/reactjs/react-rails/issues/925#issuecomment-415469572).

## Tests in component directory

If your tests for react components reside alongside the component files in the `app/javascript/components` directory,
you will get `ModuleNotFoundError` in production environment
since test libraries are devDependencies.

To resolve this issue,
you need to specify a matching pattern in `appllication.js` and `server_rendering.js`.
For example, see the below code:

```js
// app/javascript/packs/application.js
const componentRequireContext = require.context('react_rails_components', true, /^(?!.*\.test)^\.\/.*$/)
const ReactRailsUJS = require('react_ujs')
ReactRailsUJS.useContext(componentRequireContext)
```


================================================
FILE: docs/component-generator.md
================================================
# Component Generator

<!-- START doctoc generated TOC please keep comment here to allow auto update -->
<!-- DON'T EDIT THIS SECTION, INSTEAD RE-RUN doctoc TO UPDATE -->

- [Use with JBuilder](#use-with-jbuilder)
- [Camelize Props](#camelize-props)
- [Changing Component Templates](#changing-component-templates)

<!-- END doctoc generated TOC please keep comment here to allow auto update -->


You can generate a new component file with:

```sh
rails g react:component ComponentName prop1:type prop2:type ... [options]
```

For example,

```sh
rails g react:component Post title:string published:bool published_by:instanceOf{Person}
```

would generate:

```JSX
var Post = createReactClass({
  propTypes: {
    title: PropTypes.string,
    published: PropTypes.bool,
    publishedBy: PropTypes.instanceOf(Person)
  },

  render: function() {
    return (
      <React.Fragment>
        Title: {this.props.title}
        Published: {this.props.published}
        Published By: {this.props.publishedBy}
      </React.Fragment>
    );
  }
});
```

The generator also accepts options:

- `--es6`: generates a function component
- `--coffee`: use CoffeeScript

For example,

```sh
rails g react:component ButtonComponent title:string --es6
```

would generate:

```jsx
import React from "react"
import PropTypes from "prop-types"

function ButtonComponent(props) {
  return (
    <React.Fragment>
      Title: {this.props.title}
    </React.Fragment>
  );
}

ButtonComponent.propTypes = {
  title: PropTypes.string
};

export default ButtonComponent
```

**Note:** In a Shakapacker project, es6 template is the default template in the generator.

Accepted PropTypes are:

- Plain types: `any`, `array`, `bool`, `element`, `func`, `number`, `object`, `node`, `shape`, `string`
- `instanceOf` takes an optional class name in the form of `instanceOf{className}`.
- `oneOf` behaves like an enum, and takes an optional list of strings in the form of `'name:oneOf{one,two,three}'`.
- `oneOfType` takes an optional list of react and custom types in the form of `'model:oneOfType{string,number,OtherType}'`.

Note that the arguments for `oneOf` and `oneOfType` must be enclosed in single quotes
 to prevent your terminal from expanding them into an argument list.

## Use with JBuilder

If you use Jbuilder to pass a JSON string to `react_component`, make sure your JSON is a stringified hash,
not an array. This is not the Rails default -- you should add the root node yourself. For example:

```ruby
# BAD: returns a stringified array
json.array!(@messages) do |message|
  json.extract! message, :id, :name
  json.url message_url(message, format: :json)
end

# GOOD: returns a stringified hash
json.messages(@messages) do |message|
  json.extract! message, :id, :name
  json.url message_url(message, format: :json)
end
```

## Camelize Props

You can configure `camelize_props` option:

```ruby
MyApp::Application.configure do
  config.react.camelize_props = true # default false
end
```

Now, Ruby hashes given to `react_component(...)` as props will have their keys transformed from _underscore_- to _camel_-case, for example:

```ruby
{ all_todos: @todos, current_status: @status }
# becomes:
{ "allTodos" => @todos, "currentStatus" => @status }
```

You can also specify this option in `react_component`:

```erb
<%= react_component('HelloMessage', {name: 'John'}, {camelize_props: true}) %>
```

## Changing Component Templates

To make simple changes to Component templates, copy the respective template file to your Rails project at `lib/templates/react/component/template_filename`.

For example, to change the [ES6 Component template](https://github.com/reactjs/react-rails/blob/main/lib/generators/templates/component.es6.jsx), copy it to `lib/templates/react/component/component.es6.jsx` and modify it.


================================================
FILE: docs/controller-actions.md
================================================
# Controller Actions

<!-- START doctoc generated TOC please keep comment here to allow auto update -->
<!-- DON'T EDIT THIS SECTION, INSTEAD RE-RUN doctoc TO UPDATE -->

<!-- END doctoc generated TOC please keep comment here to allow auto update -->


Components can also be server-rendered directly from a controller action with the custom `component` renderer. For example:

```ruby
class TodoController < ApplicationController
  def index
    @todos = Todo.all
    render component: 'TodoList', props: { todos: @todos }, tag: 'span', class: 'todo'
  end
end
```

You can also provide the "usual" `render` arguments: `content_type`, `layout`, `location` and `status`. By default, your current layout will be used and the component, rather than a view, will be rendered in place of `yield`. Custom data-* attributes can be passed like `data: {remote: true}`.

Prerendering is set to `true` by default, but can be turned off with `prerender: false`.


================================================
FILE: docs/get-started.md
================================================
# Get Started

<!-- START doctoc generated TOC please keep comment here to allow auto update -->
<!-- DON'T EDIT THIS SECTION, INSTEAD RE-RUN doctoc TO UPDATE -->

- [Use with Shakapacker](#use-with-shakapacker)
  - [Component name](#component-name)
  - [File naming](#file-naming)
  - [Typescript support](#typescript-support)
  - [Test component](#test-component)
- [Use with Asset Pipeline](#use-with-asset-pipeline)
  - [Custom JSX Transformer](#custom-jsx-transformer)
    - [Transform Plugin Options](#transform-plugin-options)
  - [React.js versions](#reactjs-versions)

<!-- END doctoc generated TOC please keep comment here to allow auto update -->

## Use with Shakapacker

1. Create a new Rails app:
Prevent installing default javascript dependencies by using `--skip-javascript` option:

```bash
rails new my-app --skip-javascript
cd my-app
```

2. Install `shakapacker`:
```bash
bundle add shakapacker --strict
rails shakapacker:install
```

3. Install `react` and some other required npm packages:
```bash
yarn add react react-dom @babel/preset-react prop-types \
     css-loader style-loader mini-css-extract-plugin css-minimizer-webpack-plugin
```

Also update the Babel configuration in the `package.json` file:

```diff
"babel": {
  "presets": [
-   "./node_modules/shakapacker/package/babel/preset.js"
+   "./node_modules/shakapacker/package/babel/preset.js",
+   "@babel/preset-react"
  ]
},
```

4. Install `react-rails`:
```bash
$ bundle add 'react-rails' --strict
$ rails generate react:install
```

This gives you:

- `app/javascript/components/` directory for your React components
- [`ReactRailsUJS`](./ujs.md) setup in `app/javascript/packs/application.js`
- `app/javascript/packs/server_rendering.js` for [server-side rendering](#server-side-rendering)

5. Generate your first component:
```bash
$ rails g react:component HelloWorld greeting:string
```

You can also generate your component in a subdirectory:

```bash
$ rails g react:component my_subdirectory/HelloWorld greeting:string
```

Note: Your component is added to `app/javascript/components/` by default.

Note: If your component is in a subdirectory you will append the directory path to your erb component call.

Example:
```erb
<%= react_component("my_subdirectory/HelloWorld", { greeting: "Hello from react-rails." }) %>
```

6. [Render it in a Rails view](./view-helper.md):

```erb
<!-- erb: paste this in view -->
<%= react_component("HelloWorld", { greeting: "Hello from react-rails." }) %>
```

7. Lets Start the app:
```bash
$ rails s
```
Output: greeting: Hello from react-rails", inspect webpage in your browser to see the change in tag props.

8. Run dev server (optional)
In order to run dev server with HMR feature you need to parallely run:

```bash
$ ./bin/shakapacker-dev-server
```

Note: On Rails 6 you need to specify `webpack-dev-server` host. To this end, update `config/initializers/content_security_policy.rb` and uncomment relevant lines.

### Component name

The component name tells `react-rails` where to load the component. For example:

`react_component` call | component `require`
-----|-----
`react_component("Item")` | `require("Item")`
`react_component("items/index")` | `require("items/index")`
`react_component("items.Index")` | `require("items").Index`
`react_component("items.Index.Header")` | `require("items").Index.Header`

This way, you can access top-level, default, or named exports.

The `require.context` inserted into `packs/application.js` is used to load components. If you want to load components from a different directory, override it by calling `ReactRailsUJS.useContext`:

```js
var myCustomContext = require.context("custom_components", true)
var ReactRailsUJS = require("react_ujs")
// use `custom_components/` for <%= react_component(...) %> calls
ReactRailsUJS.useContext(myCustomContext)
```

If `require` fails to find your component, [`ReactRailsUJS`](./ujs.md) falls back to the global namespace, described in [Use with Asset Pipeline](#use-with-asset-pipeline).

In some cases, having multiple `require.context` entries may be desired. Examples of this include:

- Refactoring a typical Rails application into a Rails API with an (eventually) separate Single Page Application (SPA). For this use case, one can add a separate pack in addition to the typical `application` one. React components can be shared between the packs but the new pack can use a minimal Rails view layout, different default styling, etc.
- In a larger application, you might find it helpful to split your JavaScript by routes/controllers to avoid serving unused components and improve your site performance by keeping bundles smaller. For example, you might have separate bundles for homepage, search, and checkout routes. In that scenario, you can add an array of `require.context` component directory paths via `useContexts` to `server_rendering.js`, to allow for [Server-Side Rendering](./server-side-rendering.md) across your application:
 
```js
// server_rendering.js
var homepageRequireContext = require.context('homepage', true);
var searchRequireContext = require.context('search', true);
var checkoutRequireContext = require.context('checkout', true);

var ReactRailsUJS = require('react_ujs');
ReactRailsUJS.useContexts([
  homepageRequireContext,
  searchRequireContext,
  checkoutRequireContext
]);
```
### File naming

React-Rails supports plenty of file extensions such as: .js, .jsx.js, .js.jsx, .es6.js, .coffee, etcetera!
Sometimes this will cause a stumble when searching for filenames.

Component File Name | `react_component` call
-----|-----
`app/javascript/components/samplecomponent.js` | `react_component("samplecomponent")`
`app/javascript/components/sample_component.js` | `react_component("sample_component")`
`app/javascript/components/SampleComponent.js` | `react_component("SampleComponent")`
`app/javascript/components/SampleComponent.js.jsx` | Has to be renamed to SampleComponent.jsx, then use `react_component("SampleComponent")`

### Typescript support

```bash
yarn add typescript @babel/preset-typescript
```

Babel won’t perform any type-checking on TypeScript code. To optionally use type-checking run:

```bash
yarn add fork-ts-checker-webpack-plugin
```

Add `tsconfig.json` with the following content:

```json
{
  "compilerOptions": {
    "declaration": false,
    "emitDecoratorMetadata": true,
    "experimentalDecorators": true,
    "lib": ["es6", "dom"],
    "module": "es6",
    "moduleResolution": "node",
    "sourceMap": true,
    "target": "es5",
    "jsx": "react",
    "noEmit": true
  },
  "exclude": ["**/*.spec.ts", "node_modules", "vendor", "public"],
  "compileOnSave": false
}
```

Then modify the webpack config to use it as a plugin:

```js
// config/webpack/webpack.config.js
const { generateWebpackConfig, merge } = require('shakapacker')
const ForkTsCheckerWebpackPlugin = require('fork-ts-checker-webpack-plugin');

const webpackConfig = generateWebpackConfig()

module.exports = merge(
  webpackConfig, {
    plugins: [new ForkTsCheckerWebpackPlugin()]
  }
);
```

Doing this will allow React-Rails to support the .tsx extension. Additionally, it is recommended to add `ts` and `tsx` to the `server_renderer_extensions` in your application configuration:

```ruby
config.react.server_renderer_extensions = ["jsx", "js", "tsx", "ts"]
```

### Test component

You can use `assert_react_component` to test component render:

```erb
<!-- app/views/welcome/index.html.erb -->

<%= react_component("HelloWorld", { greeting: "Hello from react-rails.", info: { name: "react-rails" } }, { class: "hello-world" }) %>
```

```rb
class WelcomeControllerTest < ActionDispatch::IntegrationTest
  test 'assert_react_component' do
    get "/welcome"
    assert_equal 200, response.status

    # assert rendered react component and check the props
    assert_react_component "HelloWorld" do |props|
      assert_equal "Hello from react-rails.", props[:greeting]
      assert_equal "react-rails", props[:info][:name]
      assert_select "[class=?]", "hello-world"
    end

    # or just assert component rendered
    assert_react_component "HelloWorld"
  end
end
```

## Use with Asset Pipeline

`react-rails` provides a pre-bundled React.js & a UJS driver to the Rails asset pipeline. Get started by adding the `react-rails` gem:

```ruby
gem 'react-rails'
```

And then install the react generator:

```
$ rails g react:install
```

Then restart your development server.

This will:

- add some `//= require`s to `application.js`
- add a `components/` directory for React components
- add `server_rendering.js` for [server-side rendering](./server-side-rendering.md)

Now, you can create React components in `.jsx` files:

```JSX
// app/assets/javascripts/components/post.jsx

window.Post = createReactClass({
  render: function() {
    return <h1>{this.props.title}</h1>
  }
})

// or, equivalent:
class Post extends React.Component {
  render() {
    return <h1>{this.props.title}</h1>
  }
}
```

Then, you can render those [components in views](./view-helper.md):

```erb
<%= react_component("Post", {title: "Hello World"}) %>
```

Components must be accessible from the top level, but they may be namespaced, for example:

```erb
<%= react_component("Comments.NewForm", {post_id: @post.id}) %>
<!-- looks for `window.Comments.NewForm` -->
```

### Custom JSX Transformer

`react-rails` uses a transformer class to transform JSX in the asset pipeline. The transformer is initialized once, at boot. You can provide a custom transformer to `config.react.jsx_transformer_class`. The transformer must implement:

- `#initialize(options)`, where options is the value passed to `config.react.jsx_transform_options`
- `#transform(code_string)` to return a string of transformed code

`react-rails` provides two transformers, `React::JSX::BabelTransformer` (which uses [ruby-babel-transpiler](https://github.com/babel/ruby-babel-transpiler)) and `React::JSX::JSXTransformer` (which uses the deprecated `JSXTransformer.js`).

#### Transform Plugin Options

To supply additional transform plugins to your JSX Transformer, assign them to `config.react.jsx_transform_options`

`react-rails` uses the Babel version of the `babel-source` gem.

For example, to use `babel-plugin-transform-class-properties` :

    config.react.jsx_transform_options = {
      optional: ['es7.classProperties']
    }

### React.js versions

`//= require react` brings `React` into your project.

By default, React's [development version] is provided to `Rails.env.development`. You can override the React build with a config:

```ruby
# Here are the defaults:
# config/environments/development.rb
MyApp::Application.configure do
  config.react.variant = :development
end

# config/environments/production.rb
MyApp::Application.configure do
  config.react.variant = :production
end
```

Be sure to restart your Rails server after changing these files. See [VERSIONS.md](https://github.com/reactjs/react-rails/blob/main/VERSIONS.md) to learn which version of React.js is included with your `react-rails` version. In some edge cases you may need to bust the sprockets cache with `rake tmp:clear`


================================================
FILE: docs/migrating-from-react-rails-to-react_on_rails.md
================================================
# Migrating from `react-rails` to `react_on_rails`

<!-- START doctoc generated TOC please keep comment here to allow auto update -->
<!-- DON'T EDIT THIS SECTION, INSTEAD RE-RUN doctoc TO UPDATE -->

- [Why migrate?](#why-migrate)
- [Steps to migrate](#steps-to-migrate)

<!-- END doctoc generated TOC please keep comment here to allow auto update -->


## Why migrate?

[`react_on_rails`](https://github.com/shakacode/react_on_rails/) offers several additional features for a Rails + React application. The following is a table of features comparison.

| **Feature**             | **react-rails** | **react-on-rails** |
| ----------------------- |:---------------:|:------------------:|
| Sprockets               | ✅               | ❌                  |
| Shakapacker             | ✅               | ✅                  |
| SSR                     | ✅               | ✅                  |
| SSR with HMR            | ✅               | ✅                  |
| SSR with React-Router   | ❌               | ✅                  |
| SSR with Code Splitting | ❌               | ✅                  |
| Node SSR                | ❌               | ✅                  |
| Advanced Redux support  | ❌               | ✅                  |
| ReScript support        | ❌               | ✅                  |
| I18n support            | ❌               | ✅                  |

`react_on_rails` offers better performance and bundle optimizations, especially with the option of getting a subscription to `react_on_rails_pro`.

## Steps to migrate

In this guide, it is assumed that you have upgraded the `react-rails` project to use `shakapacker` version 7. To this end, check out [Shakapacker v7 upgrade guide](https://github.com/shakacode/shakapacker/tree/main/docs/v7_upgrade.md). Upgrading `react-rails` to version 3 can make the migration smoother but it is not required.

1. Update Deps

   1. Replace `react-rails` in `Gemfile` with the latest version of `react_on_rails` and run `bundle install`.
   2. Remove `react_ujs` from `package.json` and run `yarn install`.
   3. Commit changes!

2. Run `rails g react_on_rails:install` but do not commit the change. `react_on_rails` installs node dependencies and also creates sample react component, Rails view/controller, and update `config/routes.rb`.

3. Adapt the project: Check the changes and carefully accept, reject, or modify them as per your project's needs. Besides changes in `config/shakapacker` or `babel.config` which are project-specific, here are the most noticeable changes to address:

   1. Check webpack config files at `config/webpack/*`. If coming from `react-rails` v3, the changes are minor since you have already made separate configurations for client and server bundles. The most important change here is to notice the different names for the server bundle entry file. You may choose to stick with `server_rendering.js` or use `server-bundle.js` which is the default name in `react_on_rails`. The decision made here, affects the other steps.

   2. In `app/javascript` directory you may notice some changes.

      1. `react_on_rails` by default uses `bundles` directory for the React components. You may choose to rename `components` into `bundles` to follow the convention.

      2. `react_on_rails` uses `client-bundle.js` and  `server-bundle.js` instead of `application.js` and `server_rendering.js`. There is nothing special about these names. It can be set to use any other name (as mentioned above). If you too choose to follow the new names, consider updating the relevant `javascript_pack_tag` in your Rails views.

      3. Update the content of these files to register your React components for client or server-side rendering. Checking the generated files by `react_on_rails` installation process should give enough hints.

   3. Check Rails views. In `react_on_rails`, `react_component` view helper works slightly differently. It takes two arguments: the component name, and options. Props is one of the options. Take a look at the following example:

      ```diff
      - <%= react_component('Post', { title: 'New Post' }, { prerender: true }) %>
      + <%= react_component('Post', { props: { title: 'New Post' }, prerender: true }) %>
      ```

You can also check [react-rails-to-react-on-rails](https://github.com/shakacode/react-rails-example-app/tree/react-rails-to-react-on-rails) branch on [react-rails example app](https://github.com/shakacode/react-rails-example-app) for an example of migration from `react-rails` v3 to `react_on_rails` v13.4.



================================================
FILE: docs/server-side-rendering.md
================================================
# Server-Side Rendering

<!-- START doctoc generated TOC please keep comment here to allow auto update -->
<!-- DON'T EDIT THIS SECTION, INSTEAD RE-RUN doctoc TO UPDATE -->

- [Configuration](#configuration)
- [JavaScript State](#javascript-state)
- [Custom Server Renderer](#custom-server-renderer)

<!-- END doctoc generated TOC please keep comment here to allow auto update -->


You can render React components inside your Rails server with `prerender: true`:

```erb
<%= react_component('HelloMessage', {name: 'John'}, {prerender: true}) %>
<!-- becomes: -->
<div data-react-class="HelloMessage" data-react-props="{&quot;name&quot;:&quot;John&quot;}">
  <h1>Hello, John!</h1>
</div>
```

_(It will also be mounted by the [UJS](./ujs.md) on page load.)_

Server rendering is powered by [`ExecJS`](https://github.com/rails/execjs) and subject to some requirements:

- `react-rails` must load your code. By convention, it uses `server_rendering.js`, which was created
by the install task. This file must include your components _and_ their dependencies (eg, Underscore.js).
- Requires separate compilations for server & client bundles (see [Webpack config](https://github.com/reactjs/react-rails/tree/main/test/dummy/config/webpack))
- Your code can't reference `document` or `window`. Prerender processes don't have access to `document` or `window`,
so jQuery and some other libs won't work in this environment :(

`ExecJS` supports many backends. CRuby users will get the best performance from [`mini_racer`](https://github.com/discourse/mini_racer#performance).

## Configuration

Server renderers are stored in a pool and reused between requests. Threaded Rubies (eg jRuby) may see a benefit to increasing the pool size beyond the default `0`.

These are the default configurations:

```ruby
# config/application.rb
# These are the defaults if you don't specify any yourself
module MyApp
  class Application < Rails::Application
    # Settings for the pool of renderers:
    config.react.server_renderer_pool_size  ||= 1  # ExecJS doesn't allow more than one on MRI
    config.react.server_renderer_timeout    ||= 20 # seconds
    config.react.server_renderer = React::ServerRendering::BundleRenderer
    config.react.server_renderer_options = {
      files: ["server_rendering.js"],       # files to load for prerendering
      replay_console: true,                 # if true, console.* will be replayed client-side
    }
    # Changing files matching these dirs/exts will cause the server renderer to reload:
    config.react.server_renderer_extensions = ["jsx", "js"]
    config.react.server_renderer_directories = ["/app/assets/javascripts", "/app/javascript/"]
  end
end
```

## JavaScript State

Some of ExecJS's backends are stateful (eg, mini_racer, therubyracer). This means that any side-effects of a prerender will affect later renders with that renderer.

To manage state, you have a couple options:

- Make a custom renderer with `#before_render` / `#after_render` hooks as [described below](#custom-server-renderer)
- Use `per_request_react_rails_prerenderer` to manage state for a whole controller action.

To check out a renderer for the duration of a controller action, call the `per_request_react_rails_prerenderer` helper in the controller class:

```ruby
class PagesController < ApplicationController
  # Use the same React server renderer for the entire request:
  per_request_react_rails_prerenderer
end
```

Then, you can access the ExecJS context directly with `react_rails_prerenderer.context`:

```ruby
def show
  react_rails_prerenderer           # => #<React::ServerRendering::BundleRenderer>
  react_rails_prerenderer.context   # => #<ExecJS::Context>

  # Execute arbitrary JavaScript code
  # `self` is the global context
  react_rails_prerenderer.context.exec("self.Store.setup()")
  render :show
  react_rails_prerenderer.context.exec("self.Store.teardown()")
end
```

`react_rails_prerenderer` may also be accessed in before- or after-actions.

## Custom Server Renderer

`react-rails` depends on a renderer class for rendering components on the server. You can provide a custom renderer class to `config.react.server_renderer`. The class must implement:

- `#initialize(options={})`, which accepts the hash from `config.react.server_renderer_options`
- `#render(component_name, props, prerender_options)` to return a string of HTML

`react-rails` provides two renderer classes: `React::ServerRendering::ExecJSRenderer` and `React::ServerRendering::BundleRenderer`.

`ExecJSRenderer` offers two other points for extension:

- `#before_render(component_name, props, prerender_options)` to return a string of JavaScript to execute _before_ calling `React.render`
- `#after_render(component_name, props, prerender_options)` to return a string of JavaScript to execute _after_ calling `React.render`

Any subclass of `ExecJSRenderer` may use those hooks (for example, `BundleRenderer` uses them to handle `console.*` on the server).


================================================
FILE: docs/ujs.md
================================================
# UJS

<!-- START doctoc generated TOC please keep comment here to allow auto update -->
<!-- DON'T EDIT THIS SECTION, INSTEAD RE-RUN doctoc TO UPDATE -->

- [Mounting & Unmounting](#mounting--unmounting)
- [Event Handling](#event-handling)
- [`getConstructor`](#getconstructor)

<!-- END doctoc generated TOC please keep comment here to allow auto update -->


`react-rails`'s JavaScript is available as `"react_ujs"` in the asset pipeline or from NPM. It attaches itself to the window as `ReactRailsUJS`.

## Mounting & Unmounting

Usually, `react-rails` mounts & unmounts components automatically as described in [Event Handling](#event-handling) below.

You can also mount & unmount components from `<%= react_component(...) %>` tags using UJS:

```js
// Mount all components on the page:
ReactRailsUJS.mountComponents()
// Mount components within a selector:
ReactRailsUJS.mountComponents(".my-class")
// Mount components within a specific node:
ReactRailsUJS.mountComponents(specificDOMnode)

// Unmounting works the same way:
ReactRailsUJS.unmountComponents()
ReactRailsUJS.unmountComponents(".my-class")
ReactRailsUJS.unmountComponents(specificDOMnode)
```

You can use this when the DOM is modified by AJAX calls or modal windows.

## Event Handling

`ReactRailsUJS` checks for various libraries to support their page change events:

- `Turbolinks`
- `pjax`
- `jQuery`
- Native DOM events

`ReactRailsUJS` will automatically mount components on `<%= react_component(...) %>` tags and unmount them when appropriate.

If you need to re-detect events, you can call `detectEvents`:

```js
// Remove previous event handlers and add new ones:
ReactRailsUJS.detectEvents()
```

For example, if `Turbolinks` is loaded _after_ `ReactRailsUJS`, you'll need to call this again. This function removes previous handlers before adding new ones, so it's safe to call as often as needed.

If `Turbolinks` is `import`ed via Shakapacker (and thus not available globally), `ReactRailsUJS` will be unable to locate it. To fix this, you can temporarily add it to the global namespace:

```js
// Order is particular. First start Turbolinks:
Turbolinks.start();
// Add Turbolinks to the global namespace:
window.Turbolinks = Turbolinks;
// Remove previous event handlers and add new ones:
ReactRailsUJS.detectEvents();
// (Optional) Clean up global namespace:
delete window.Turbolinks;
```

## `getConstructor`

Components are loaded with `ReactRailsUJS.getConstructor(className)`. This function has two default implementations, depending on if you're using the asset pipeline or Shakapacker:

- On the asset pipeline, it looks up `className` in the global namespace (`ReactUJS.constructorFromGlobal`).
- On Shakapacker, it `require`s files and accesses named exports, as described in [Use with Shakapacker](./get-started.md#use-with-shakapacker), falling back to the global namespace (`ReactUJS.constructorFromRequireContextWithGlobalFallback`).

You can override this function to customize the mapping of name-to-constructor. [Server-side rendering](./server-side-rendering.md) also uses this function.

For example, the fallback behavior of
`ReactUJS.constructorFromRequireContextWithGlobalFallback` can sometimes make
server-side rendering errors hard to debug as it will swallow the original error
(more info
[here](https://github.com/reactjs/react-rails/issues/264#issuecomment-552326663)).
`ReactUJS.constructorFromRequireContext` is provided for this reason. You can
use it like so:

```js
// Replaces calls to `ReactUJS.useContext`
ReactUJS.getConstructor = ReactUJS.constructorFromRequireContext(require.context('components', true));
```



================================================
FILE: docs/upgrading.md
================================================
# Upgrading

<!-- START doctoc generated TOC please keep comment here to allow auto update -->
<!-- DON'T EDIT THIS SECTION, INSTEAD RE-RUN doctoc TO UPDATE -->

- [2.7 to 3.0](#27-to-30)
- [2.3 to 2.4](#23-to-24)

<!-- END doctoc generated TOC please keep comment here to allow auto update -->


## 2.7 to 3.0
- Keep your `react_ujs` up to date: `yarn upgrade`
- **Drop support for Webpacker:** Before any ReactRails upgrade, make sure upgrading from Webpacker to Shakapacker 7. For more information check out Shakapacker  
- **SSR:** ReactRails 3.x requires separate compilations for server & client bundles. See [Webpack config](https://github.com/reactjs/react-rails/tree/main/test/dummy/config/webpack) directory in the dummy app to addapt the new implementation.

## 2.3 to 2.4

Keep your `react_ujs` up to date, `yarn upgrade`

React-Rails 2.4.x uses React 16+ which no longer has React Addons. Therefore the pre-bundled version of react no longer has an addons version, if you need addons still, there is the 2.3.1+ version of the gem that still has addons.

If you need to make changes in your components for the prebundled react, see the migration docs here:

- https://reactjs.org/blog/2016/11/16/react-v15.4.0.html
- https://reactjs.org/blog/2017/04/07/react-v15.5.0.html
- https://reactjs.org/blog/2017/06/13/react-v15.6.0.html


For the vast majority of cases this will get you most of the migration:
- global find+replace `React.Prop` -> `Prop`
- add `import PropTypes from 'prop-types'` (Webpacker only)
- re-run `bundle exec rails webpacker:install:react` to update npm packages (Webpacker only)


================================================
FILE: docs/view-helper.md
================================================
# View Helper

<!-- START doctoc generated TOC please keep comment here to allow auto update -->
<!-- DON'T EDIT THIS SECTION, INSTEAD RE-RUN doctoc TO UPDATE -->

- [Custom View Helper](#custom-view-helper)

<!-- END doctoc generated TOC please keep comment here to allow auto update -->


`react-rails` includes a view helper and an [unobtrusive JavaScript driver](./ujs.md) which work together to put React components on the page.

The view helper (`react_component`) puts a `div` on the page with the requested component class & props. For example:

```erb
<%= react_component('HelloMessage', name: 'John') %>
<!-- becomes: -->
<div data-react-class="HelloMessage" data-react-props="{&quot;name&quot;:&quot;John&quot;}"></div>
```

On page load, the [`react_ujs` driver](./ujs.md) will scan the page and mount components using `data-react-class`
and `data-react-props`.

The view helper's signature is:

```ruby
react_component(component_class_name, props={}, html_options={})
```

- `component_class_name` is a string which identifies a component. See [getConstructor](./ujs.md#getconstructor) for details.
- `props` is either:
  - an object that responds to `#to_json`; or
  - an already-stringified JSON object (see [JBuilder note](./component-generator.md#use-with-jbuilder) below).
- `html_options` may include:
  - `tag:` to use an element other than a `div` to embed `data-react-class` and `data-react-props`.
  - `prerender: true` to render the component on the server.
  - `camelize_props` to [transform a props hash](./component-generator.md#camelize-props)
  - `**other` Any other arguments (eg `class:`, `id:`) are passed through to [`content_tag`](http://api.rubyonrails.org/classes/ActionView/Helpers/TagHelper.html#method-i-content_tag).


## Custom View Helper

`react-rails` uses a "helper implementation" class to generate the output of the `react_component` helper. The helper is initialized once per request and used for each `react_component` call during that request. You can provide a custom helper class to `config.react.view_helper_implementation`. The class must implement:

- `#react_component(name, props = {}, options = {}, &block)` to return a string to inject into the Rails view
- `#setup(controller_instance)`, called when the helper is initialized at the start of the request
- `#teardown(controller_instance)`, called at the end of the request

`react-rails` provides one implementation, `React::Rails::ComponentMount`.


================================================
FILE: gemfiles/base.gemfile
================================================
# This file was generated by Appraisal

source "http://rubygems.org"

gem "rails", "~> 7.0.x"

gemspec path: "../"


================================================
FILE: gemfiles/connection_pool_3.gemfile
================================================
# This file was generated by Appraisal

source "http://rubygems.org"

gem "connection_pool", "~> 3"

gemspec path: "../"


================================================
FILE: gemfiles/propshaft.gemfile
================================================
# This file was generated by Appraisal

source "http://rubygems.org"

gem "propshaft", "~> 1.0.x"

gemspec path: "../"


================================================
FILE: gemfiles/shakapacker.gemfile
================================================
# This file was generated by Appraisal

source "http://rubygems.org"

gem "shakapacker", "7.2.0"

gemspec path: "../"


================================================
FILE: gemfiles/sprockets_3.gemfile
================================================
# This file was generated by Appraisal

source "http://rubygems.org"

gem "sprockets", "~> 3.5"
gem "sprockets-rails"
gem "turbolinks", "~> 5"
gem "mini_racer", platforms: :mri

gemspec path: "../"


================================================
FILE: gemfiles/sprockets_4.gemfile
================================================
# This file was generated by Appraisal

source "http://rubygems.org"

gem "sprockets", "~> 4.0.x"
gem "sprockets-rails"
gem "turbolinks", "~> 5"
gem "mini_racer", platforms: :mri

gemspec path: "../"


================================================
FILE: lib/assets/javascripts/JSXTransformer.js
================================================
/**
 * JSXTransformer v0.13.3
 */
(function(f){if(typeof exports==="object"&&typeof module!=="undefined"){module.exports=f()}else if(typeof define==="function"&&define.amd){define([],f)}else{var g;if(typeof window!=="undefined"){g=window}else if(typeof global!=="undefined"){g=global}else if(typeof self!=="undefined"){g=self}else{g=this}g.JSXTransformer = f()}})(function(){var define,module,exports;return (function e(t,n,r){function s(o,u){if(!n[o]){if(!t[o]){var a=typeof require=="function"&&require;if(!u&&a)return a(o,!0);if(i)return i(o,!0);var f=new Error("Cannot find module '"+o+"'");throw f.code="MODULE_NOT_FOUND",f}var l=n[o]={exports:{}};t[o][0].call(l.exports,function(e){var n=t[o][1][e];return s(n?n:e)},l,l.exports,e,t,n,r)}return n[o].exports}var i=typeof require=="function"&&require;for(var o=0;o<r.length;o++)s(r[o]);return s})({1:[function(_dereq_,module,exports){
/**
 * Copyright 2013-2015, Facebook, Inc.
 * All rights reserved.
 *
 * This source code is licensed under the BSD-style license found in the
 * LICENSE file in the root directory of this source tree. An additional grant
 * of patent rights can be found in the PATENTS file in the same directory.
 */
/* jshint browser: true */
/* jslint evil: true */
/*eslint-disable no-eval */
/*eslint-disable block-scoped-var */

'use strict';

var ReactTools = _dereq_('../main');
var inlineSourceMap = _dereq_('./inline-source-map');

var headEl;
var dummyAnchor;
var inlineScriptCount = 0;

// The source-map library relies on Object.defineProperty, but IE8 doesn't
// support it fully even with es5-sham. Indeed, es5-sham's defineProperty
// throws when Object.prototype.__defineGetter__ is missing, so we skip building
// the source map in that case.
var supportsAccessors = Object.prototype.hasOwnProperty('__defineGetter__');

/**
 * Run provided code through jstransform.
 *
 * @param {string} source Original source code
 * @param {object?} options Options to pass to jstransform
 * @return {object} object as returned from jstransform
 */
function transformReact(source, options) {
  options = options || {};

  // Force the sourcemaps option manually. We don't want to use it if it will
  // break (see above note about supportsAccessors). We'll only override the
  // value here if sourceMap was specified and is truthy. This guarantees that
  // we won't override any user intent (since this method is exposed publicly).
  if (options.sourceMap) {
    options.sourceMap = supportsAccessors;
  }

  // Otherwise just pass all options straight through to react-tools.
  return ReactTools.transformWithDetails(source, options);
}

/**
 * Eval provided source after transforming it.
 *
 * @param {string} source Original source code
 * @param {object?} options Options to pass to jstransform
 */
function exec(source, options) {
  return eval(transformReact(source, options).code);
}

/**
 * This method returns a nicely formated line of code pointing to the exact
 * location of the error `e`. The line is limited in size so big lines of code
 * are also shown in a readable way.
 *
 * Example:
 * ... x', overflow:'scroll'}} id={} onScroll={this.scroll} class=" ...
 * ^
 *
 * @param {string} code The full string of code
 * @param {Error} e The error being thrown
 * @return {string} formatted message
 * @internal
 */
function createSourceCodeErrorMessage(code, e) {
  var sourceLines = code.split('\n');
  // e.lineNumber is non-standard so we can't depend on its availability. If
  // we're in a browser where it isn't supported, don't even bother trying to
  // format anything. We may also hit a case where the line number is reported
  // incorrectly and is outside the bounds of the actual code. Handle that too.
  if (!e.lineNumber || e.lineNumber > sourceLines.length) {
    return '';
  }
  var erroneousLine = sourceLines[e.lineNumber - 1];

  // Removes any leading indenting spaces and gets the number of
  // chars indenting the `erroneousLine`
  var indentation = 0;
  erroneousLine = erroneousLine.replace(/^\s+/, function(leadingSpaces) {
    indentation = leadingSpaces.length;
    return '';
  });

  // Defines the number of characters that are going to show
  // before and after the erroneous code
  var LIMIT = 30;
  var errorColumn = e.column - indentation;

  if (errorColumn > LIMIT) {
    erroneousLine = '... ' + erroneousLine.slice(errorColumn - LIMIT);
    errorColumn = 4 + LIMIT;
  }
  if (erroneousLine.length - errorColumn > LIMIT) {
    erroneousLine = erroneousLine.slice(0, errorColumn + LIMIT) + ' ...';
  }
  var message = '\n\n' + erroneousLine + '\n';
  message += new Array(errorColumn - 1).join(' ') + '^';
  return message;
}

/**
 * Actually transform the code.
 *
 * @param {string} code
 * @param {string?} url
 * @param {object?} options
 * @return {string} The transformed code.
 * @internal
 */
function transformCode(code, url, options) {
  try {
    var transformed = transformReact(code, options);
  } catch(e) {
    e.message += '\n    at ';
    if (url) {
      if ('fileName' in e) {
        // We set `fileName` if it's supported by this error object and
        // a `url` was provided.
        // The error will correctly point to `url` in Firefox.
        e.fileName = url;
      }
      e.message += url + ':' + e.lineNumber + ':' + e.columnNumber;
    } else {
      e.message += location.href;
    }
    e.message += createSourceCodeErrorMessage(code, e);
    throw e;
  }

  if (!transformed.sourceMap) {
    return transformed.code;
  }

  var source;
  if (url == null) {
    source = 'Inline JSX script';
    inlineScriptCount++;
    if (inlineScriptCount > 1) {
      source += ' (' + inlineScriptCount + ')';
    }
  } else if (dummyAnchor) {
    // Firefox has problems when the sourcemap source is a proper URL with a
    // protocol and hostname, so use the pathname. We could use just the
    // filename, but hopefully using the full path will prevent potential
    // issues where the same filename exists in multiple directories.
    dummyAnchor.href = url;
    source = dummyAnchor.pathname.substr(1);
  }

  return (
    transformed.code +
    '\n' +
    inlineSourceMap(transformed.sourceMap, code, source)
  );
}


/**
 * Appends a script element at the end of the <head> with the content of code,
 * after transforming it.
 *
 * @param {string} code The original source code
 * @param {string?} url Where the code came from. null if inline
 * @param {object?} options Options to pass to jstransform
 * @internal
 */
function run(code, url, options) {
  var scriptEl = document.createElement('script');
  scriptEl.text = transformCode(code, url, options);
  headEl.appendChild(scriptEl);
}

/**
 * Load script from the provided url and pass the content to the callback.
 *
 * @param {string} url The location of the script src
 * @param {function} callback Function to call with the content of url
 * @internal
 */
function load(url, successCallback, errorCallback) {
  var xhr;
  xhr = window.ActiveXObject ? new window.ActiveXObject('Microsoft.XMLHTTP')
                             : new XMLHttpRequest();

  // async, however scripts will be executed in the order they are in the
  // DOM to mirror normal script loading.
  xhr.open('GET', url, true);
  if ('overrideMimeType' in xhr) {
    xhr.overrideMimeType('text/plain');
  }
  xhr.onreadystatechange = function() {
    if (xhr.readyState === 4) {
      if (xhr.status === 0 || xhr.status === 200) {
        successCallback(xhr.responseText);
      } else {
        errorCallback();
        throw new Error('Could not load ' + url);
      }
    }
  };
  return xhr.send(null);
}

/**
 * Loop over provided script tags and get the content, via innerHTML if an
 * inline script, or by using XHR. Transforms are applied if needed. The scripts
 * are executed in the order they are found on the page.
 *
 * @param {array} scripts The <script> elements to load and run.
 * @internal
 */
function loadScripts(scripts) {
  var result = [];
  var count = scripts.length;

  function check() {
    var script, i;

    for (i = 0; i < count; i++) {
      script = result[i];

      if (script.loaded && !script.executed) {
        script.executed = true;
        run(script.content, script.url, script.options);
      } else if (!script.loaded && !script.error && !script.async) {
        break;
      }
    }
  }

  scripts.forEach(function(script, i) {
    var options = {
      sourceMap: true
    };
    if (/;harmony=true(;|$)/.test(script.type)) {
      options.harmony = true;
    }
    if (/;stripTypes=true(;|$)/.test(script.type)) {
      options.stripTypes = true;
    }

    // script.async is always true for non-javascript script tags
    var async = script.hasAttribute('async');

    if (script.src) {
      result[i] = {
        async: async,
        error: false,
        executed: false,
        content: null,
        loaded: false,
        url: script.src,
        options: options
      };

      load(script.src, function(content) {
        result[i].loaded = true;
        result[i].content = content;
        check();
      }, function() {
        result[i].error = true;
        check();
      });
    } else {
      result[i] = {
        async: async,
        error: false,
        executed: false,
        content: script.innerHTML,
        loaded: true,
        url: null,
        options: options
      };
    }
  });

  check();
}

/**
 * Find and run all script tags with type="text/jsx".
 *
 * @internal
 */
function runScripts() {
  var scripts = document.getElementsByTagName('script');

  // Array.prototype.slice cannot be used on NodeList on IE8
  var jsxScripts = [];
  for (var i = 0; i < scripts.length; i++) {
    if (/^text\/jsx(;|$)/.test(scripts.item(i).type)) {
      jsxScripts.push(scripts.item(i));
    }
  }

  if (jsxScripts.length < 1) {
    return;
  }

  console.warn(
    'You are using the in-browser JSX transformer. Be sure to precompile ' +
    'your JSX for production - ' +
    'http://facebook.github.io/react/docs/tooling-integration.html#jsx'
  );

  loadScripts(jsxScripts);
}

// Listen for load event if we're in a browser and then kick off finding and
// running of scripts.
if (typeof window !== 'undefined' && window !== null) {
  headEl = document.getElementsByTagName('head')[0];
  dummyAnchor = document.createElement('a');

  if (window.addEventListener) {
    window.addEventListener('DOMContentLoaded', runScripts, false);
  } else {
    window.attachEvent('onload', runScripts);
  }
}

module.exports = {
  transform: transformReact,
  exec: exec
};

},{"../main":2,"./inline-source-map":41}],2:[function(_dereq_,module,exports){
/**
 * Copyright 2013-2015, Facebook, Inc.
 * All rights reserved.
 *
 * This source code is licensed under the BSD-style license found in the
 * LICENSE file in the root directory of this source tree. An additional grant
 * of patent rights can be found in the PATENTS file in the same directory.
 */

'use strict';
/*eslint-disable no-undef*/
var visitors = _dereq_('./vendor/fbtransform/visitors');
var transform = _dereq_('jstransform').transform;
var typesSyntax = _dereq_('jstransform/visitors/type-syntax');
var inlineSourceMap = _dereq_('./vendor/inline-source-map');

module.exports = {
  transform: function(input, options) {
    options = processOptions(options);
    var output = innerTransform(input, options);
    var result = output.code;
    if (options.sourceMap) {
      var map = inlineSourceMap(
        output.sourceMap,
        input,
        options.filename
      );
      result += '\n' + map;
    }
    return result;
  },
  transformWithDetails: function(input, options) {
    options = processOptions(options);
    var output = innerTransform(input, options);
    var result = {};
    result.code = output.code;
    if (options.sourceMap) {
      result.sourceMap = output.sourceMap.toJSON();
    }
    if (options.filename) {
      result.sourceMap.sources = [options.filename];
    }
    return result;
  }
};

/**
 * Only copy the values that we need. We'll do some preprocessing to account for
 * converting command line flags to options that jstransform can actually use.
 */
function processOptions(opts) {
  opts = opts || {};
  var options = {};

  options.harmony = opts.harmony;
  options.stripTypes = opts.stripTypes;
  options.sourceMap = opts.sourceMap;
  options.filename = opts.sourceFilename;

  if (opts.es6module) {
    options.sourceType = 'module';
  }
  if (opts.nonStrictEs6module) {
    options.sourceType = 'nonStrictModule';
  }

  // Instead of doing any fancy validation, only look for 'es3'. If we have
  // that, then use it. Otherwise use 'es5'.
  options.es3 = opts.target === 'es3';
  options.es5 = !options.es3;

  return options;
}

function innerTransform(input, options) {
  var visitorSets = ['react'];
  if (options.harmony) {
    visitorSets.push('harmony');
  }

  if (options.es3) {
    visitorSets.push('es3');
  }

  if (options.stripTypes) {
    // Stripping types needs to happen before the other transforms
    // unfortunately, due to bad interactions. For example,
    // es6-rest-param-visitors conflict with stripping rest param type
    // annotation
    input = transform(typesSyntax.visitorList, input, options).code;
  }

  var visitorList = visitors.getVisitorsBySet(visitorSets);
  return transform(visitorList, input, options);
}

},{"./vendor/fbtransform/visitors":40,"./vendor/inline-source-map":41,"jstransform":22,"jstransform/visitors/type-syntax":36}],3:[function(_dereq_,module,exports){
/*!
 * The buffer module from node.js, for the browser.
 *
 * @author   Feross Aboukhadijeh <feross@feross.org> <http://feross.org>
 * @license  MIT
 */

var base64 = _dereq_('base64-js')
var ieee754 = _dereq_('ieee754')
var isArray = _dereq_('is-array')

exports.Buffer = Buffer
exports.SlowBuffer = SlowBuffer
exports.INSPECT_MAX_BYTES = 50
Buffer.poolSize = 8192 // not used by this implementation

var kMaxLength = 0x3fffffff
var rootParent = {}

/**
 * If `Buffer.TYPED_ARRAY_SUPPORT`:
 *   === true    Use Uint8Array implementation (fastest)
 *   === false   Use Object implementation (most compatible, even IE6)
 *
 * Browsers that support typed arrays are IE 10+, Firefox 4+, Chrome 7+, Safari 5.1+,
 * Opera 11.6+, iOS 4.2+.
 *
 * Note:
 *
 * - Implementation must support adding new properties to `Uint8Array` instances.
 *   Firefox 4-29 lacked support, fixed in Firefox 30+.
 *   See: https://bugzilla.mozilla.org/show_bug.cgi?id=695438.
 *
 *  - Chrome 9-10 is missing the `TypedArray.prototype.subarray` function.
 *
 *  - IE10 has a broken `TypedArray.prototype.subarray` function which returns arrays of
 *    incorrect length in some situations.
 *
 * We detect these buggy browsers and set `Buffer.TYPED_ARRAY_SUPPORT` to `false` so they will
 * get the Object implementation, which is slower but will work correctly.
 */
Buffer.TYPED_ARRAY_SUPPORT = (function () {
  try {
    var buf = new ArrayBuffer(0)
    var arr = new Uint8Array(buf)
    arr.foo = function () { return 42 }
    return arr.foo() === 42 && // typed array instances can be augmented
        typeof arr.subarray === 'function' && // chrome 9-10 lack `subarray`
        new Uint8Array(1).subarray(1, 1).byteLength === 0 // ie10 has broken `subarray`
  } catch (e) {
    return false
  }
})()

/**
 * Class: Buffer
 * =============
 *
 * The Buffer constructor returns instances of `Uint8Array` that are augmented
 * with function properties for all the node `Buffer` API functions. We use
 * `Uint8Array` so that square bracket notation works as expected -- it returns
 * a single octet.
 *
 * By augmenting the instances, we can avoid modifying the `Uint8Array`
 * prototype.
 */
function Buffer (subject, encoding) {
  var self = this
  if (!(self instanceof Buffer)) return new Buffer(subject, encoding)

  var type = typeof subject
  var length

  if (type === 'number') {
    length = +subject
  } else if (type === 'string') {
    length = Buffer.byteLength(subject, encoding)
  } else if (type === 'object' && subject !== null) {
    // assume object is array-like
    if (subject.type === 'Buffer' && isArray(subject.data)) subject = subject.data
    length = +subject.length
  } else {
    throw new TypeError('must start with number, buffer, array or string')
  }

  if (length > kMaxLength) {
    throw new RangeError('Attempt to allocate Buffer larger than maximum size: 0x' +
      kMaxLength.toString(16) + ' bytes')
  }

  if (length < 0) length = 0
  else length >>>= 0 // coerce to uint32

  if (Buffer.TYPED_ARRAY_SUPPORT) {
    // Preferred: Return an augmented `Uint8Array` instance for best performance
    self = Buffer._augment(new Uint8Array(length)) // eslint-disable-line consistent-this
  } else {
    // Fallback: Return THIS instance of Buffer (created by `new`)
    self.length = length
    self._isBuffer = true
  }

  var i
  if (Buffer.TYPED_ARRAY_SUPPORT && typeof subject.byteLength === 'number') {
    // Speed optimization -- use set if we're copying from a typed array
    self._set(subject)
  } else if (isArrayish(subject)) {
    // Treat array-ish objects as a byte array
    if (Buffer.isBuffer(subject)) {
      for (i = 0; i < length; i++) {
        self[i] = subject.readUInt8(i)
      }
    } else {
      for (i = 0; i < length; i++) {
        self[i] = ((subject[i] % 256) + 256) % 256
      }
    }
  } else if (type === 'string') {
    self.write(subject, 0, encoding)
  } else if (type === 'number' && !Buffer.TYPED_ARRAY_SUPPORT) {
    for (i = 0; i < length; i++) {
      self[i] = 0
    }
  }

  if (length > 0 && length <= Buffer.poolSize) self.parent = rootParent

  return self
}

function SlowBuffer (subject, encoding) {
  if (!(this instanceof SlowBuffer)) return new SlowBuffer(subject, encoding)

  var buf = new Buffer(subject, encoding)
  delete buf.parent
  return buf
}

Buffer.isBuffer = function isBuffer (b) {
  return !!(b != null && b._isBuffer)
}

Buffer.compare = function compare (a, b) {
  if (!Buffer.isBuffer(a) || !Buffer.isBuffer(b)) {
    throw new TypeError('Arguments must be Buffers')
  }

  if (a === b) return 0

  var x = a.length
  var y = b.length
  for (var i = 0, len = Math.min(x, y); i < len && a[i] === b[i]; i++) {}
  if (i !== len) {
    x = a[i]
    y = b[i]
  }
  if (x < y) return -1
  if (y < x) return 1
  return 0
}

Buffer.isEncoding = function isEncoding (encoding) {
  switch (String(encoding).toLowerCase()) {
    case 'hex':
    case 'utf8':
    case 'utf-8':
    case 'ascii':
    case 'binary':
    case 'base64':
    case 'raw':
    case 'ucs2':
    case 'ucs-2':
    case 'utf16le':
    case 'utf-16le':
      return true
    default:
      return false
  }
}

Buffer.concat = function concat (list, totalLength) {
  if (!isArray(list)) throw new TypeError('list argument must be an Array of Buffers.')

  if (list.length === 0) {
    return new Buffer(0)
  } else if (list.length === 1) {
    return list[0]
  }

  var i
  if (totalLength === undefined) {
    totalLength = 0
    for (i = 0; i < list.length; i++) {
      totalLength += list[i].length
    }
  }

  var buf = new Buffer(totalLength)
  var pos = 0
  for (i = 0; i < list.length; i++) {
    var item = list[i]
    item.copy(buf, pos)
    pos += item.length
  }
  return buf
}

Buffer.byteLength = function byteLength (str, encoding) {
  var ret
  str = str + ''
  switch (encoding || 'utf8') {
    case 'ascii':
    case 'binary':
    case 'raw':
      ret = str.length
      break
    case 'ucs2':
    case 'ucs-2':
    case 'utf16le':
    case 'utf-16le':
      ret = str.length * 2
      break
    case 'hex':
      ret = str.length >>> 1
      break
    case 'utf8':
    case 'utf-8':
      ret = utf8ToBytes(str).length
      break
    case 'base64':
      ret = base64ToBytes(str).length
      break
    default:
      ret = str.length
  }
  return ret
}

// pre-set for values that may exist in the future
Buffer.prototype.length = undefined
Buffer.prototype.parent = undefined

// toString(encoding, start=0, end=buffer.length)
Buffer.prototype.toString = function toString (encoding, start, end) {
  var loweredCase = false

  start = start >>> 0
  end = end === undefined || end === Infinity ? this.length : end >>> 0

  if (!encoding) encoding = 'utf8'
  if (start < 0) start = 0
  if (end > this.length) end = this.length
  if (end <= start) return ''

  while (true) {
    switch (encoding) {
      case 'hex':
        return hexSlice(this, start, end)

      case 'utf8':
      case 'utf-8':
        return utf8Slice(this, start, end)

      case 'ascii':
        return asciiSlice(this, start, end)

      case 'binary':
        return binarySlice(this, start, end)

      case 'base64':
        return base64Slice(this, start, end)

      case 'ucs2':
      case 'ucs-2':
      case 'utf16le':
      case 'utf-16le':
        return utf16leSlice(this, start, end)

      default:
        if (loweredCase) throw new TypeError('Unknown encoding: ' + encoding)
        encoding = (encoding + '').toLowerCase()
        loweredCase = true
    }
  }
}

Buffer.prototype.equals = function equals (b) {
  if (!Buffer.isBuffer(b)) throw new TypeError('Argument must be a Buffer')
  if (this === b) return true
  return Buffer.compare(this, b) === 0
}

Buffer.prototype.inspect = function inspect () {
  var str = ''
  var max = exports.INSPECT_MAX_BYTES
  if (this.length > 0) {
    str = this.toString('hex', 0, max).match(/.{2}/g).join(' ')
    if (this.length > max) str += ' ... '
  }
  return '<Buffer ' + str + '>'
}

Buffer.prototype.compare = function compare (b) {
  if (!Buffer.isBuffer(b)) throw new TypeError('Argument must be a Buffer')
  if (this === b) return 0
  return Buffer.compare(this, b)
}

Buffer.prototype.indexOf = function indexOf (val, byteOffset) {
  if (byteOffset > 0x7fffffff) byteOffset = 0x7fffffff
  else if (byteOffset < -0x80000000) byteOffset = -0x80000000
  byteOffset >>= 0

  if (this.length === 0) return -1
  if (byteOffset >= this.length) return -1

  // Negative offsets start from the end of the buffer
  if (byteOffset < 0) byteOffset = Math.max(this.length + byteOffset, 0)

  if (typeof val === 'string') {
    if (val.length === 0) return -1 // special case: looking for empty string always fails
    return String.prototype.indexOf.call(this, val, byteOffset)
  }
  if (Buffer.isBuffer(val)) {
    return arrayIndexOf(this, val, byteOffset)
  }
  if (typeof val === 'number') {
    if (Buffer.TYPED_ARRAY_SUPPORT && Uint8Array.prototype.indexOf === 'function') {
      return Uint8Array.prototype.indexOf.call(this, val, byteOffset)
    }
    return arrayIndexOf(this, [ val ], byteOffset)
  }

  function arrayIndexOf (arr, val, byteOffset) {
    var foundIndex = -1
    for (var i = 0; byteOffset + i < arr.length; i++) {
      if (arr[byteOffset + i] === val[foundIndex === -1 ? 0 : i - foundIndex]) {
        if (foundIndex === -1) foundIndex = i
        if (i - foundIndex + 1 === val.length) return byteOffset + foundIndex
      } else {
        foundIndex = -1
      }
    }
    return -1
  }

  throw new TypeError('val must be string, number or Buffer')
}

// `get` will be removed in Node 0.13+
Buffer.prototype.get = function get (offset) {
  console.log('.get() is deprecated. Access using array indexes instead.')
  return this.readUInt8(offset)
}

// `set` will be removed in Node 0.13+
Buffer.prototype.set = function set (v, offset) {
  console.log('.set() is deprecated. Access using array indexes instead.')
  return this.writeUInt8(v, offset)
}

function hexWrite (buf, string, offset, length) {
  offset = Number(offset) || 0
  var remaining = buf.length - offset
  if (!length) {
    length = remaining
  } else {
    length = Number(length)
    if (length > remaining) {
      length = remaining
    }
  }

  // must be an even number of digits
  var strLen = string.length
  if (strLen % 2 !== 0) throw new Error('Invalid hex string')

  if (length > strLen / 2) {
    length = strLen / 2
  }
  for (var i = 0; i < length; i++) {
    var parsed = parseInt(string.substr(i * 2, 2), 16)
    if (isNaN(parsed)) throw new Error('Invalid hex string')
    buf[offset + i] = parsed
  }
  return i
}

function utf8Write (buf, string, offset, length) {
  var charsWritten = blitBuffer(utf8ToBytes(string, buf.length - offset), buf, offset, length)
  return charsWritten
}

function asciiWrite (buf, string, offset, length) {
  var charsWritten = blitBuffer(asciiToBytes(string), buf, offset, length)
  return charsWritten
}

function binaryWrite (buf, string, offset, length) {
  return asciiWrite(buf, string, offset, length)
}

function base64Write (buf, string, offset, length) {
  var charsWritten = blitBuffer(base64ToBytes(string), buf, offset, length)
  return charsWritten
}

function utf16leWrite (buf, string, offset, length) {
  var charsWritten = blitBuffer(utf16leToBytes(string, buf.length - offset), buf, offset, length)
  return charsWritten
}

Buffer.prototype.write = function write (string, offset, length, encoding) {
  // Support both (string, offset, length, encoding)
  // and the legacy (string, encoding, offset, length)
  if (isFinite(offset)) {
    if (!isFinite(length)) {
      encoding = length
      length = undefined
    }
  } else {  // legacy
    var swap = encoding
    encoding = offset
    offset = length
    length = swap
  }

  offset = Number(offset) || 0

  if (length < 0 || offset < 0 || offset > this.length) {
    throw new RangeError('attempt to write outside buffer bounds')
  }

  var remaining = this.length - offset
  if (!length) {
    length = remaining
  } else {
    length = Number(length)
    if (length > remaining) {
      length = remaining
    }
  }
  encoding = String(encoding || 'utf8').toLowerCase()

  var ret
  switch (encoding) {
    case 'hex':
      ret = hexWrite(this, string, offset, length)
      break
    case 'utf8':
    case 'utf-8':
      ret = utf8Write(this, string, offset, length)
      break
    case 'ascii':
      ret = asciiWrite(this, string, offset, length)
      break
    case 'binary':
      ret = binaryWrite(this, string, offset, length)
      break
    case 'base64':
      ret = base64Write(this, string, offset, length)
      break
    case 'ucs2':
    case 'ucs-2':
    case 'utf16le':
    case 'utf-16le':
      ret = utf16leWrite(this, string, offset, length)
      break
    default:
      throw new TypeError('Unknown encoding: ' + encoding)
  }
  return ret
}

Buffer.prototype.toJSON = function toJSON () {
  return {
    type: 'Buffer',
    data: Array.prototype.slice.call(this._arr || this, 0)
  }
}

function base64Slice (buf, start, end) {
  if (start === 0 && end === buf.length) {
    return base64.fromByteArray(buf)
  } else {
    return base64.fromByteArray(buf.slice(start, end))
  }
}

function utf8Slice (buf, start, end) {
  var res = ''
  var tmp = ''
  end = Math.min(buf.length, end)

  for (var i = start; i < end; i++) {
    if (buf[i] <= 0x7F) {
      res += decodeUtf8Char(tmp) + String.fromCharCode(buf[i])
      tmp = ''
    } else {
      tmp += '%' + buf[i].toString(16)
    }
  }

  return res + decodeUtf8Char(tmp)
}

function asciiSlice (buf, start, end) {
  var ret = ''
  end = Math.min(buf.length, end)

  for (var i = start; i < end; i++) {
    ret += String.fromCharCode(buf[i] & 0x7F)
  }
  return ret
}

function binarySlice (buf, start, end) {
  var ret = ''
  end = Math.min(buf.length, end)

  for (var i = start; i < end; i++) {
    ret += String.fromCharCode(buf[i])
  }
  return ret
}

function hexSlice (buf, start, end) {
  var len = buf.length

  if (!start || start < 0) start = 0
  if (!end || end < 0 || end > len) end = len

  var out = ''
  for (var i = start; i < end; i++) {
    out += toHex(buf[i])
  }
  return out
}

function utf16leSlice (buf, start, end) {
  var bytes = buf.slice(start, end)
  var res = ''
  for (var i = 0; i < bytes.length; i += 2) {
    res += String.fromCharCode(bytes[i] + bytes[i + 1] * 256)
  }
  return res
}

Buffer.prototype.slice = function slice (start, end) {
  var len = this.length
  start = ~~start
  end = end === undefined ? len : ~~end

  if (start < 0) {
    start += len
    if (start < 0) start = 0
  } else if (start > len) {
    start = len
  }

  if (end < 0) {
    end += len
    if (end < 0) end = 0
  } else if (end > len) {
    end = len
  }

  if (end < start) end = start

  var newBuf
  if (Buffer.TYPED_ARRAY_SUPPORT) {
    newBuf = Buffer._augment(this.subarray(start, end))
  } else {
    var sliceLen = end - start
    newBuf = new Buffer(sliceLen, undefined)
    for (var i = 0; i < sliceLen; i++) {
      newBuf[i] = this[i + start]
    }
  }

  if (newBuf.length) newBuf.parent = this.parent || this

  return newBuf
}

/*
 * Need to make sure that buffer isn't trying to write out of bounds.
 */
function checkOffset (offset, ext, length) {
  if ((offset % 1) !== 0 || offset < 0) throw new RangeError('offset is not uint')
  if (offset + ext > length) throw new RangeError('Trying to access beyond buffer length')
}

Buffer.prototype.readUIntLE = function readUIntLE (offset, byteLength, noAssert) {
  offset = offset >>> 0
  byteLength = byteLength >>> 0
  if (!noAssert) checkOffset(offset, byteLength, this.length)

  var val = this[offset]
  var mul = 1
  var i = 0
  while (++i < byteLength && (mul *= 0x100)) {
    val += this[offset + i] * mul
  }

  return val
}

Buffer.prototype.readUIntBE = function readUIntBE (offset, byteLength, noAssert) {
  offset = offset >>> 0
  byteLength = byteLength >>> 0
  if (!noAssert) {
    checkOffset(offset, byteLength, this.length)
  }

  var val = this[offset + --byteLength]
  var mul = 1
  while (byteLength > 0 && (mul *= 0x100)) {
    val += this[offset + --byteLength] * mul
  }

  return val
}

Buffer.prototype.readUInt8 = function readUInt8 (offset, noAssert) {
  if (!noAssert) checkOffset(offset, 1, this.length)
  return this[offset]
}

Buffer.prototype.readUInt16LE = function readUInt16LE (offset, noAssert) {
  if (!noAssert) checkOffset(offset, 2, this.length)
  return this[offset] | (this[offset + 1] << 8)
}

Buffer.prototype.readUInt16BE = function readUInt16BE (offset, noAssert) {
  if (!noAssert) checkOffset(offset, 2, this.length)
  return (this[offset] << 8) | this[offset + 1]
}

Buffer.prototype.readUInt32LE = function readUInt32LE (offset, noAssert) {
  if (!noAssert) checkOffset(offset, 4, this.length)

  return ((this[offset]) |
      (this[offset + 1] << 8) |
      (this[offset + 2] << 16)) +
      (this[offset + 3] * 0x1000000)
}

Buffer.prototype.readUInt32BE = function readUInt32BE (offset, noAssert) {
  if (!noAssert) checkOffset(offset, 4, this.length)

  return (this[offset] * 0x1000000) +
    ((this[offset + 1] << 16) |
    (this[offset + 2] << 8) |
    this[offset + 3])
}

Buffer.prototype.readIntLE = function readIntLE (offset, byteLength, noAssert) {
  offset = offset >>> 0
  byteLength = byteLength >>> 0
  if (!noAssert) checkOffset(offset, byteLength, this.length)

  var val = this[offset]
  var mul = 1
  var i = 0
  while (++i < byteLength && (mul *= 0x100)) {
    val += this[offset + i] * mul
  }
  mul *= 0x80

  if (val >= mul) val -= Math.pow(2, 8 * byteLength)

  return val
}

Buffer.prototype.readIntBE = function readIntBE (offset, byteLength, noAssert) {
  offset = offset >>> 0
  byteLength = byteLength >>> 0
  if (!noAssert) checkOffset(offset, byteLength, this.length)

  var i = byteLength
  var mul = 1
  var val = this[offset + --i]
  while (i > 0 && (mul *= 0x100)) {
    val += this[offset + --i] * mul
  }
  mul *= 0x80

  if (val >= mul) val -= Math.pow(2, 8 * byteLength)

  return val
}

Buffer.prototype.readInt8 = function readInt8 (offset, noAssert) {
  if (!noAssert) checkOffset(offset, 1, this.length)
  if (!(this[offset] & 0x80)) return (this[offset])
  return ((0xff - this[offset] + 1) * -1)
}

Buffer.prototype.readInt16LE = function readInt16LE (offset, noAssert) {
  if (!noAssert) checkOffset(offset, 2, this.length)
  var val = this[offset] | (this[offset + 1] << 8)
  return (val & 0x8000) ? val | 0xFFFF0000 : val
}

Buffer.prototype.readInt16BE = function readInt16BE (offset, noAssert) {
  if (!noAssert) checkOffset(offset, 2, this.length)
  var val = this[offset + 1] | (this[offset] << 8)
  return (val & 0x8000) ? val | 0xFFFF0000 : val
}

Buffer.prototype.readInt32LE = function readInt32LE (offset, noAssert) {
  if (!noAssert) checkOffset(offset, 4, this.length)

  return (this[offset]) |
    (this[offset + 1] << 8) |
    (this[offset + 2] << 16) |
    (this[offset + 3] << 24)
}

Buffer.prototype.readInt32BE = function readInt32BE (offset, noAssert) {
  if (!noAssert) checkOffset(offset, 4, this.length)

  return (this[offset] << 24) |
    (this[offset + 1] << 16) |
    (this[offset + 2] << 8) |
    (this[offset + 3])
}

Buffer.prototype.readFloatLE = function readFloatLE (offset, noAssert) {
  if (!noAssert) checkOffset(offset, 4, this.length)
  return ieee754.read(this, offset, true, 23, 4)
}

Buffer.prototype.readFloatBE = function readFloatBE (offset, noAssert) {
  if (!noAssert) checkOffset(offset, 4, this.length)
  return ieee754.read(this, offset, false, 23, 4)
}

Buffer.prototype.readDoubleLE = function readDoubleLE (offset, noAssert) {
  if (!noAssert) checkOffset(offset, 8, this.length)
  return ieee754.read(this, offset, true, 52, 8)
}

Buffer.prototype.readDoubleBE = function readDoubleBE (offset, noAssert) {
  if (!noAssert) checkOffset(offset, 8, this.length)
  return ieee754.read(this, offset, false, 52, 8)
}

function checkInt (buf, value, offset, ext, max, min) {
  if (!Buffer.isBuffer(buf)) throw new TypeError('buffer must be a Buffer instance')
  if (value > max || value < min) throw new RangeError('value is out of bounds')
  if (offset + ext > buf.length) throw new RangeError('index out of range')
}

Buffer.prototype.writeUIntLE = function writeUIntLE (value, offset, byteLength, noAssert) {
  value = +value
  offset = offset >>> 0
  byteLength = byteLength >>> 0
  if (!noAssert) checkInt(this, value, offset, byteLength, Math.pow(2, 8 * byteLength), 0)

  var mul = 1
  var i = 0
  this[offset] = value & 0xFF
  while (++i < byteLength && (mul *= 0x100)) {
    this[offset + i] = (value / mul) >>> 0 & 0xFF
  }

  return offset + byteLength
}

Buffer.prototype.writeUIntBE = function writeUIntBE (value, offset, byteLength, noAssert) {
  value = +value
  offset = offset >>> 0
  byteLength = byteLength >>> 0
  if (!noAssert) checkInt(this, value, offset, byteLength, Math.pow(2, 8 * byteLength), 0)

  var i = byteLength - 1
  var mul = 1
  this[offset + i] = value & 0xFF
  while (--i >= 0 && (mul *= 0x100)) {
    this[offset + i] = (value / mul) >>> 0 & 0xFF
  }

  return offset + byteLength
}

Buffer.prototype.writeUInt8 = function writeUInt8 (value, offset, noAssert) {
  value = +value
  offset = offset >>> 0
  if (!noAssert) checkInt(this, value, offset, 1, 0xff, 0)
  if (!Buffer.TYPED_ARRAY_SUPPORT) value = Math.floor(value)
  this[offset] = value
  return offset + 1
}

function objectWriteUInt16 (buf, value, offset, littleEndian) {
  if (value < 0) value = 0xffff + value + 1
  for (var i = 0, j = Math.min(buf.length - offset, 2); i < j; i++) {
    buf[offset + i] = (value & (0xff << (8 * (littleEndian ? i : 1 - i)))) >>>
      (littleEndian ? i : 1 - i) * 8
  }
}

Buffer.prototype.writeUInt16LE = function writeUInt16LE (value, offset, noAssert) {
  value = +value
  offset = offset >>> 0
  if (!noAssert) checkInt(this, value, offset, 2, 0xffff, 0)
  if (Buffer.TYPED_ARRAY_SUPPORT) {
    this[offset] = value
    this[offset + 1] = (value >>> 8)
  } else {
    objectWriteUInt16(this, value, offset, true)
  }
  return offset + 2
}

Buffer.prototype.writeUInt16BE = function writeUInt16BE (value, offset, noAssert) {
  value = +value
  offset = offset >>> 0
  if (!noAssert) checkInt(this, value, offset, 2, 0xffff, 0)
  if (Buffer.TYPED_ARRAY_SUPPORT) {
    this[offset] = (value >>> 8)
    this[offset + 1] = value
  } else {
    objectWriteUInt16(this, value, offset, false)
  }
  return offset + 2
}

function objectWriteUInt32 (buf, value, offset, littleEndian) {
  if (value < 0) value = 0xffffffff + value + 1
  for (var i = 0, j = Math.min(buf.length - offset, 4); i < j; i++) {
    buf[offset + i] = (value >>> (littleEndian ? i : 3 - i) * 8) & 0xff
  }
}

Buffer.prototype.writeUInt32LE = function writeUInt32LE (value, offset, noAssert) {
  value = +value
  offset = offset >>> 0
  if (!noAssert) checkInt(this, value, offset, 4, 0xffffffff, 0)
  if (Buffer.TYPED_ARRAY_SUPPORT) {
    this[offset + 3] = (value >>> 24)
    this[offset + 2] = (value >>> 16)
    this[offset + 1] = (value >>> 8)
    this[offset] = value
  } else {
    objectWriteUInt32(this, value, offset, true)
  }
  return offset + 4
}

Buffer.prototype.writeUInt32BE = function writeUInt32BE (value, offset, noAssert) {
  value = +value
  offset = offset >>> 0
  if (!noAssert) checkInt(this, value, offset, 4, 0xffffffff, 0)
  if (Buffer.TYPED_ARRAY_SUPPORT) {
    this[offset] = (value >>> 24)
    this[offset + 1] = (value >>> 16)
    this[offset + 2] = (value >>> 8)
    this[offset + 3] = value
  } else {
    objectWriteUInt32(this, value, offset, false)
  }
  return offset + 4
}

Buffer.prototype.writeIntLE = function writeIntLE (value, offset, byteLength, noAssert) {
  value = +value
  offset = offset >>> 0
  if (!noAssert) {
    checkInt(
      this, value, offset, byteLength,
      Math.pow(2, 8 * byteLength - 1) - 1,
      -Math.pow(2, 8 * byteLength - 1)
    )
  }

  var i = 0
  var mul = 1
  var sub = value < 0 ? 1 : 0
  this[offset] = value & 0xFF
  while (++i < byteLength && (mul *= 0x100)) {
    this[offset + i] = ((value / mul) >> 0) - sub & 0xFF
  }

  return offset + byteLength
}

Buffer.prototype.writeIntBE = function writeIntBE (value, offset, byteLength, noAssert) {
  value = +value
  offset = offset >>> 0
  if (!noAssert) {
    checkInt(
      this, value, offset, byteLength,
      Math.pow(2, 8 * byteLength - 1) - 1,
      -Math.pow(2, 8 * byteLength - 1)
    )
  }

  var i = byteLength - 1
  var mul = 1
  var sub = value < 0 ? 1 : 0
  this[offset + i] = value & 0xFF
  while (--i >= 0 && (mul *= 0x100)) {
    this[offset + i] = ((value / mul) >> 0) - sub & 0xFF
  }

  return offset + byteLength
}

Buffer.prototype.writeInt8 = function writeInt8 (value, offset, noAssert) {
  value = +value
  offset = offset >>> 0
  if (!noAssert) checkInt(this, value, offset, 1, 0x7f, -0x80)
  if (!Buffer.TYPED_ARRAY_SUPPORT) value = Math.floor(value)
  if (value < 0) value = 0xff + value + 1
  this[offset] = value
  return offset + 1
}

Buffer.prototype.writeInt16LE = function writeInt16LE (value, offset, noAssert) {
  value = +value
  offset = offset >>> 0
  if (!noAssert) checkInt(this, value, offset, 2, 0x7fff, -0x8000)
  if (Buffer.TYPED_ARRAY_SUPPORT) {
    this[offset] = value
    this[offset + 1] = (value >>> 8)
  } else {
    objectWriteUInt16(this, value, offset, true)
  }
  return offset + 2
}

Buffer.prototype.writeInt16BE = function writeInt16BE (value, offset, noAssert) {
  value = +value
  offset = offset >>> 0
  if (!noAssert) checkInt(this, value, offset, 2, 0x7fff, -0x8000)
  if (Buffer.TYPED_ARRAY_SUPPORT) {
    this[offset] = (value >>> 8)
    this[offset + 1] = value
  } else {
    objectWriteUInt16(this, value, offset, false)
  }
  return offset + 2
}

Buffer.prototype.writeInt32LE = function writeInt32LE (value, offset, noAssert) {
  value = +value
  offset = offset >>> 0
  if (!noAssert) checkInt(this, value, offset, 4, 0x7fffffff, -0x80000000)
  if (Buffer.TYPED_ARRAY_SUPPORT) {
    this[offset] = value
    this[offset + 1] = (value >>> 8)
    this[offset + 2] = (value >>> 16)
    this[offset + 3] = (value >>> 24)
  } else {
    objectWriteUInt32(this, value, offset, true)
  }
  return offset + 4
}

Buffer.prototype.writeInt32BE = function writeInt32BE (value, offset, noAssert) {
  value = +value
  offset = offset >>> 0
  if (!noAssert) checkInt(this, value, offset, 4, 0x7fffffff, -0x80000000)
  if (value < 0) value = 0xffffffff + value + 1
  if (Buffer.TYPED_ARRAY_SUPPORT) {
    this[offset] = (value >>> 24)
    this[offset + 1] = (value >>> 16)
    this[offset + 2] = (value >>> 8)
    this[offset + 3] = value
  } else {
    objectWriteUInt32(this, value, offset, false)
  }
  return offset + 4
}

function checkIEEE754 (buf, value, offset, ext, max, min) {
  if (value > max || value < min) throw new RangeError('value is out of bounds')
  if (offset + ext > buf.length) throw new RangeError('index out of range')
  if (offset < 0) throw new RangeError('index out of range')
}

function writeFloat (buf, value, offset, littleEndian, noAssert) {
  if (!noAssert) {
    checkIEEE754(buf, value, offset, 4, 3.4028234663852886e+38, -3.4028234663852886e+38)
  }
  ieee754.write(buf, value, offset, littleEndian, 23, 4)
  return offset + 4
}

Buffer.prototype.writeFloatLE = function writeFloatLE (value, offset, noAssert) {
  return writeFloat(this, value, offset, true, noAssert)
}

Buffer.prototype.writeFloatBE = function writeFloatBE (value, offset, noAssert) {
  return writeFloat(this, value, offset, false, noAssert)
}

function writeDouble (buf, value, offset, littleEndian, noAssert) {
  if (!noAssert) {
    checkIEEE754(buf, value, offset, 8, 1.7976931348623157E+308, -1.7976931348623157E+308)
  }
  ieee754.write(buf, value, offset, littleEndian, 52, 8)
  return offset + 8
}

Buffer.prototype.writeDoubleLE = function writeDoubleLE (value, offset, noAssert) {
  return writeDouble(this, value, offset, true, noAssert)
}

Buffer.prototype.writeDoubleBE = function writeDoubleBE (value, offset, noAssert) {
  return writeDouble(this, value, offset, false, noAssert)
}

// copy(targetBuffer, targetStart=0, sourceStart=0, sourceEnd=buffer.length)
Buffer.prototype.copy = function copy (target, target_start, start, end) {
  if (!start) start = 0
  if (!end && end !== 0) end = this.length
  if (target_start >= target.length) target_start = target.length
  if (!target_start) target_start = 0
  if (end > 0 && end < start) end = start

  // Copy 0 bytes; we're done
  if (end === start) return 0
  if (target.length === 0 || this.length === 0) return 0

  // Fatal error conditions
  if (target_start < 0) {
    throw new RangeError('targetStart out of bounds')
  }
  if (start < 0 || start >= this.length) throw new RangeError('sourceStart out of bounds')
  if (end < 0) throw new RangeError('sourceEnd out of bounds')

  // Are we oob?
  if (end > this.length) end = this.length
  if (target.length - target_start < end - start) {
    end = target.length - target_start + start
  }

  var len = end - start

  if (len < 1000 || !Buffer.TYPED_ARRAY_SUPPORT) {
    for (var i = 0; i < len; i++) {
      target[i + target_start] = this[i + start]
    }
  } else {
    target._set(this.subarray(start, start + len), target_start)
  }

  return len
}

// fill(value, start=0, end=buffer.length)
Buffer.prototype.fill = function fill (value, start, end) {
  if (!value) value = 0
  if (!start) start = 0
  if (!end) end = this.length

  if (end < start) throw new RangeError('end < start')

  // Fill 0 bytes; we're done
  if (end === start) return
  if (this.length === 0) return

  if (start < 0 || start >= this.length) throw new RangeError('start out of bounds')
  if (end < 0 || end > this.length) throw new RangeError('end out of bounds')

  var i
  if (typeof value === 'number') {
    for (i = start; i < end; i++) {
      this[i] = value
    }
  } else {
    var bytes = utf8ToBytes(value.toString())
    var len = bytes.length
    for (i = start; i < end; i++) {
      this[i] = bytes[i % len]
    }
  }

  return this
}

/**
 * Creates a new `ArrayBuffer` with the *copied* memory of the buffer instance.
 * Added in Node 0.12. Only available in browsers that support ArrayBuffer.
 */
Buffer.prototype.toArrayBuffer = function toArrayBuffer () {
  if (typeof Uint8Array !== 'undefined') {
    if (Buffer.TYPED_ARRAY_SUPPORT) {
      return (new Buffer(this)).buffer
    } else {
      var buf = new Uint8Array(this.length)
      for (var i = 0, len = buf.length; i < len; i += 1) {
        buf[i] = this[i]
      }
      return buf.buffer
    }
  } else {
    throw new TypeError('Buffer.toArrayBuffer not supported in this browser')
  }
}

// HELPER FUNCTIONS
// ================

var BP = Buffer.prototype

/**
 * Augment a Uint8Array *instance* (not the Uint8Array class!) with Buffer methods
 */
Buffer._augment = function _augment (arr) {
  arr.constructor = Buffer
  arr._isBuffer = true

  // save reference to original Uint8Array set method before overwriting
  arr._set = arr.set

  // deprecated, will be removed in node 0.13+
  arr.get = BP.get
  arr.set = BP.set

  arr.write = BP.write
  arr.toString = BP.toString
  arr.toLocaleString = BP.toString
  arr.toJSON = BP.toJSON
  arr.equals = BP.equals
  arr.compare = BP.compare
  arr.indexOf = BP.indexOf
  arr.copy = BP.copy
  arr.slice = BP.slice
  arr.readUIntLE = BP.readUIntLE
  arr.readUIntBE = BP.readUIntBE
  arr.readUInt8 = BP.readUInt8
  arr.readUInt16LE = BP.readUInt16LE
  arr.readUInt16BE = BP.readUInt16BE
  arr.readUInt32LE = BP.readUInt32LE
  arr.readUInt32BE = BP.readUInt32BE
  arr.readIntLE = BP.readIntLE
  arr.readIntBE = BP.readIntBE
  arr.readInt8 = BP.readInt8
  arr.readInt16LE = BP.readInt16LE
  arr.readInt16BE = BP.readInt16BE
  arr.readInt32LE = BP.readInt32LE
  arr.readInt32BE = BP.readInt32BE
  arr.readFloatLE = BP.readFloatLE
  arr.readFloatBE = BP.readFloatBE
  arr.readDoubleLE = BP.readDoubleLE
  arr.readDoubleBE = BP.readDoubleBE
  arr.writeUInt8 = BP.writeUInt8
  arr.writeUIntLE = BP.writeUIntLE
  arr.writeUIntBE = BP.writeUIntBE
  arr.writeUInt16LE = BP.writeUInt16LE
  arr.writeUInt16BE = BP.writeUInt16BE
  arr.writeUInt32LE = BP.writeUInt32LE
  arr.writeUInt32BE = BP.writeUInt32BE
  arr.writeIntLE = BP.writeIntLE
  arr.writeIntBE = BP.writeIntBE
  arr.writeInt8 = BP.writeInt8
  arr.writeInt16LE = BP.writeInt16LE
  arr.writeInt16BE = BP.writeInt16BE
  arr.writeInt32LE = BP.writeInt32LE
  arr.writeInt32BE = BP.writeInt32BE
  arr.writeFloatLE = BP.writeFloatLE
  arr.writeFloatBE = BP.writeFloatBE
  arr.writeDoubleLE = BP.writeDoubleLE
  arr.writeDoubleBE = BP.writeDoubleBE
  arr.fill = BP.fill
  arr.inspect = BP.inspect
  arr.toArrayBuffer = BP.toArrayBuffer

  return arr
}

var INVALID_BASE64_RE = /[^+\/0-9A-z\-]/g

function base64clean (str) {
  // Node strips out invalid characters like \n and \t from the string, base64-js does not
  str = stringtrim(str).replace(INVALID_BASE64_RE, '')
  // Node converts strings with length < 2 to ''
  if (str.length < 2) return ''
  // Node allows for non-padded base64 strings (missing trailing ===), base64-js does not
  while (str.length % 4 !== 0) {
    str = str + '='
  }
  return str
}

function stringtrim (str) {
  if (str.trim) return str.trim()
  return str.replace(/^\s+|\s+$/g, '')
}

function isArrayish (subject) {
  return isArray(subject) || Buffer.isBuffer(subject) ||
      subject && typeof subject === 'object' &&
      typeof subject.length === 'number'
}

function toHex (n) {
  if (n < 16) return '0' + n.toString(16)
  return n.toString(16)
}

function utf8ToBytes (string, units) {
  units = units || Infinity
  var codePoint
  var length = string.length
  var leadSurrogate = null
  var bytes = []
  var i = 0

  for (; i < length; i++) {
    codePoint = string.charCodeAt(i)

    // is surrogate component
    if (codePoint > 0xD7FF && codePoint < 0xE000) {
      // last char was a lead
      if (leadSurrogate) {
        // 2 leads in a row
        if (codePoint < 0xDC00) {
          if ((units -= 3) > -1) bytes.push(0xEF, 0xBF, 0xBD)
          leadSurrogate = codePoint
          continue
        } else {
          // valid surrogate pair
          codePoint = leadSurrogate - 0xD800 << 10 | codePoint - 0xDC00 | 0x10000
          leadSurrogate = null
        }
      } else {
        // no lead yet

        if (codePoint > 0xDBFF) {
          // unexpected trail
          if ((units -= 3) > -1) bytes.push(0xEF, 0xBF, 0xBD)
          continue
        } else if (i + 1 === length) {
          // unpaired lead
          if ((units -= 3) > -1) bytes.push(0xEF, 0xBF, 0xBD)
          continue
        } else {
          // valid lead
          leadSurrogate = codePoint
          continue
        }
      }
    } else if (leadSurrogate) {
      // valid bmp char, but last char was a lead
      if ((units -= 3) > -1) bytes.push(0xEF, 0xBF, 0xBD)
      leadSurrogate = null
    }

    // encode utf8
    if (codePoint < 0x80) {
      if ((units -= 1) < 0) break
      bytes.push(codePoint)
    } else if (codePoint < 0x800) {
      if ((units -= 2) < 0) break
      bytes.push(
        codePoint >> 0x6 | 0xC0,
        codePoint & 0x3F | 0x80
      )
    } else if (codePoint < 0x10000) {
      if ((units -= 3) < 0) break
      bytes.push(
        codePoint >> 0xC | 0xE0,
        codePoint >> 0x6 & 0x3F | 0x80,
        codePoint & 0x3F | 0x80
      )
    } else if (codePoint < 0x200000) {
      if ((units -= 4) < 0) break
      bytes.push(
        codePoint >> 0x12 | 0xF0,
        codePoint >> 0xC & 0x3F | 0x80,
        codePoint >> 0x6 & 0x3F | 0x80,
        codePoint & 0x3F | 0x80
      )
    } else {
      throw new Error('Invalid code point')
    }
  }

  return bytes
}

function asciiToBytes (str) {
  var byteArray = []
  for (var i = 0; i < str.length; i++) {
    // Node's code seems to be doing this and not & 0x7F..
    byteArray.push(str.charCodeAt(i) & 0xFF)
  }
  return byteArray
}

function utf16leToBytes (str, units) {
  var c, hi, lo
  var byteArray = []
  for (var i = 0; i < str.length; i++) {
    if ((units -= 2) < 0) break

    c = str.charCodeAt(i)
    hi = c >> 8
    lo = c % 256
    byteArray.push(lo)
    byteArray.push(hi)
  }

  return byteArray
}

function base64ToBytes (str) {
  return base64.toByteArray(base64clean(str))
}

function blitBuffer (src, dst, offset, length) {
  for (var i = 0; i < length; i++) {
    if ((i + offset >= dst.length) || (i >= src.length)) break
    dst[i + offset] = src[i]
  }
  return i
}

function decodeUtf8Char (str) {
  try {
    return decodeURIComponent(str)
  } catch (err) {
    return String.fromCharCode(0xFFFD) // UTF 8 invalid char
  }
}

},{"base64-js":4,"ieee754":5,"is-array":6}],4:[function(_dereq_,module,exports){
var lookup = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/';

;(function (exports) {
	'use strict';

  var Arr = (typeof Uint8Array !== 'undefined')
    ? Uint8Array
    : Array

	var PLUS   = '+'.charCodeAt(0)
	var SLASH  = '/'.charCodeAt(0)
	var NUMBER = '0'.charCodeAt(0)
	var LOWER  = 'a'.charCodeAt(0)
	var UPPER  = 'A'.charCodeAt(0)
	var PLUS_URL_SAFE = '-'.charCodeAt(0)
	var SLASH_URL_SAFE = '_'.charCodeAt(0)

	function decode (elt) {
		var code = elt.charCodeAt(0)
		if (code === PLUS ||
		    code === PLUS_URL_SAFE)
			return 62 // '+'
		if (code === SLASH ||
		    code === SLASH_URL_SAFE)
			return 63 // '/'
		if (code < NUMBER)
			return -1 //no match
		if (code < NUMBER + 10)
			return code - NUMBER + 26 + 26
		if (code < UPPER + 26)
			return code - UPPER
		if (code < LOWER + 26)
			return code - LOWER + 26
	}

	function b64ToByteArray (b64) {
		var i, j, l, tmp, placeHolders, arr

		if (b64.length % 4 > 0) {
			throw new Error('Invalid string. Length must be a multiple of 4')
		}

		// the number of equal signs (place holders)
		// if there are two placeholders, than the two characters before it
		// represent one byte
		// if there is only one, then the three characters before it represent 2 bytes
		// this is just a cheap hack to not do indexOf twice
		var len = b64.length
		placeHolders = '=' === b64.charAt(len - 2) ? 2 : '=' === b64.charAt(len - 1) ? 1 : 0

		// base64 is 4/3 + up to two characters of the original data
		arr = new Arr(b64.length * 3 / 4 - placeHolders)

		// if there are placeholders, only get up to the last complete 4 chars
		l = placeHolders > 0 ? b64.length - 4 : b64.length

		var L = 0

		function push (v) {
			arr[L++] = v
		}

		for (i = 0, j = 0; i < l; i += 4, j += 3) {
			tmp = (decode(b64.charAt(i)) << 18) | (decode(b64.charAt(i + 1)) << 12) | (decode(b64.charAt(i + 2)) << 6) | decode(b64.charAt(i + 3))
			push((tmp & 0xFF0000) >> 16)
			push((tmp & 0xFF00) >> 8)
			push(tmp & 0xFF)
		}

		if (placeHolders === 2) {
			tmp = (decode(b64.charAt(i)) << 2) | (decode(b64.charAt(i + 1)) >> 4)
			push(tmp & 0xFF)
		} else if (placeHolders === 1) {
			tmp = (decode(b64.charAt(i)) << 10) | (decode(b64.charAt(i + 1)) << 4) | (decode(b64.charAt(i + 2)) >> 2)
			push((tmp >> 8) & 0xFF)
			push(tmp & 0xFF)
		}

		return arr
	}

	function uint8ToBase64 (uint8) {
		var i,
			extraBytes = uint8.length % 3, // if we have 1 byte left, pad 2 bytes
			output = "",
			temp, length

		function encode (num) {
			return lookup.charAt(num)
		}

		function tripletToBase64 (num) {
			return encode(num >> 18 & 0x3F) + encode(num >> 12 & 0x3F) + encode(num >> 6 & 0x3F) + encode(num & 0x3F)
		}

		// go through the array every three bytes, we'll deal with trailing stuff later
		for (i = 0, length = uint8.length - extraBytes; i < length; i += 3) {
			temp = (uint8[i] << 16) + (uint8[i + 1] << 8) + (uint8[i + 2])
			output += tripletToBase64(temp)
		}

		// pad the end with zeros, but make sure to not forget the extra bytes
		switch (extraBytes) {
			case 1:
				temp = uint8[uint8.length - 1]
				output += encode(temp >> 2)
				output += encode((temp << 4) & 0x3F)
				output += '=='
				break
			case 2:
				temp = (uint8[uint8.length - 2] << 8) + (uint8[uint8.length - 1])
				output += encode(temp >> 10)
				output += encode((temp >> 4) & 0x3F)
				output += encode((temp << 2) & 0x3F)
				output += '='
				break
		}

		return output
	}

	exports.toByteArray = b64ToByteArray
	exports.fromByteArray = uint8ToBase64
}(typeof exports === 'undefined' ? (this.base64js = {}) : exports))

},{}],5:[function(_dereq_,module,exports){
exports.read = function(buffer, offset, isLE, mLen, nBytes) {
  var e, m,
      eLen = nBytes * 8 - mLen - 1,
      eMax = (1 << eLen) - 1,
      eBias = eMax >> 1,
      nBits = -7,
      i = isLE ? (nBytes - 1) : 0,
      d = isLE ? -1 : 1,
      s = buffer[offset + i];

  i += d;

  e = s & ((1 << (-nBits)) - 1);
  s >>= (-nBits);
  nBits += eLen;
  for (; nBits > 0; e = e * 256 + buffer[offset + i], i += d, nBits -= 8);

  m = e & ((1 << (-nBits)) - 1);
  e >>= (-nBits);
  nBits += mLen;
  for (; nBits > 0; m = m * 256 + buffer[offset + i], i += d, nBits -= 8);

  if (e === 0) {
    e = 1 - eBias;
  } else if (e === eMax) {
    return m ? NaN : ((s ? -1 : 1) * Infinity);
  } else {
    m = m + Math.pow(2, mLen);
    e = e - eBias;
  }
  return (s ? -1 : 1) * m * Math.pow(2, e - mLen);
};

exports.write = function(buffer, value, offset, isLE, mLen, nBytes) {
  var e, m, c,
      eLen = nBytes * 8 - mLen - 1,
      eMax = (1 << eLen) - 1,
      eBias = eMax >> 1,
      rt = (mLen === 23 ? Math.pow(2, -24) - Math.pow(2, -77) : 0),
      i = isLE ? 0 : (nBytes - 1),
      d = isLE ? 1 : -1,
      s = value < 0 || (value === 0 && 1 / value < 0) ? 1 : 0;

  value = Math.abs(value);

  if (isNaN(value) || value === Infinity) {
    m = isNaN(value) ? 1 : 0;
    e = eMax;
  } else {
    e = Math.floor(Math.log(value) / Math.LN2);
    if (value * (c = Math.pow(2, -e)) < 1) {
      e--;
      c *= 2;
    }
    if (e + eBias >= 1) {
      value += rt / c;
    } else {
      value += rt * Math.pow(2, 1 - eBias);
    }
    if (value * c >= 2) {
      e++;
      c /= 2;
    }

    if (e + eBias >= eMax) {
      m = 0;
      e = eMax;
    } else if (e + eBias >= 1) {
      m = (value * c - 1) * Math.pow(2, mLen);
      e = e + eBias;
    } else {
      m = value * Math.pow(2, eBias - 1) * Math.pow(2, mLen);
      e = 0;
    }
  }

  for (; mLen >= 8; buffer[offset + i] = m & 0xff, i += d, m /= 256, mLen -= 8);

  e = (e << mLen) | m;
  eLen += mLen;
  for (; eLen > 0; buffer[offset + i] = e & 0xff, i += d, e /= 256, eLen -= 8);

  buffer[offset + i - d] |= s * 128;
};

},{}],6:[function(_dereq_,module,exports){

/**
 * isArray
 */

var isArray = Array.isArray;

/**
 * toString
 */

var str = Object.prototype.toString;

/**
 * Whether or not the given `val`
 * is an array.
 *
 * example:
 *
 *        isArray([]);
 *        // > true
 *        isArray(arguments);
 *        // > false
 *        isArray('');
 *        // > false
 *
 * @param {mixed} val
 * @return {bool}
 */

module.exports = isArray || function (val) {
  return !! val && '[object Array]' == str.call(val);
};

},{}],7:[function(_dereq_,module,exports){
(function (process){
// Copyright Joyent, Inc. and other Node contributors.
//
// Permission is hereby granted, free of charge, to any person obtaining a
// copy of this software and associated documentation files (the
// "Software"), to deal in the Software without restriction, including
// without limitation the rights to use, copy, modify, merge, publish,
// distribute, sublicense, and/or sell copies of the Software, and to permit
// persons to whom the Software is furnished to do so, subject to the
// following conditions:
//
// The above copyright notice and this permission notice shall be included
// in all copies or substantial portions of the Software.
//
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
// OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN
// NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,
// DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR
// OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE
// USE OR OTHER DEALINGS IN THE SOFTWARE.

// resolves . and .. elements in a path array with directory names there
// must be no slashes, empty elements, or device names (c:\) in the array
// (so also no leading and trailing slashes - it does not distinguish
// relative and absolute paths)
function normalizeArray(parts, allowAboveRoot) {
  // if the path tries to go above the root, `up` ends up > 0
  var up = 0;
  for (var i = parts.length - 1; i >= 0; i--) {
    var last = parts[i];
    if (last === '.') {
      parts.splice(i, 1);
    } else if (last === '..') {
      parts.splice(i, 1);
      up++;
    } else if (up) {
      parts.splice(i, 1);
      up--;
    }
  }

  // if the path is allowed to go above the root, restore leading ..s
  if (allowAboveRoot) {
    for (; up--; up) {
      parts.unshift('..');
    }
  }

  return parts;
}

// Split a filename into [root, dir, basename, ext], unix version
// 'root' is just a slash, or nothing.
var splitPathRe =
    /^(\/?|)([\s\S]*?)((?:\.{1,2}|[^\/]+?|)(\.[^.\/]*|))(?:[\/]*)$/;
var splitPath = function(filename) {
  return splitPathRe.exec(filename).slice(1);
};

// path.resolve([from ...], to)
// posix version
exports.resolve = function() {
  var resolvedPath = '',
      resolvedAbsolute = false;

  for (var i = arguments.length - 1; i >= -1 && !resolvedAbsolute; i--) {
    var path = (i >= 0) ? arguments[i] : process.cwd();

    // Skip empty and invalid entries
    if (typeof path !== 'string') {
      throw new TypeError('Arguments to path.resolve must be strings');
    } else if (!path) {
      continue;
    }

    resolvedPath = path + '/' + resolvedPath;
    resolvedAbsolute = path.charAt(0) === '/';
  }

  // At this point the path should be resolved to a full absolute path, but
  // handle relative paths to be safe (might happen when process.cwd() fails)

  // Normalize the path
  resolvedPath = normalizeArray(filter(resolvedPath.split('/'), function(p) {
    return !!p;
  }), !resolvedAbsolute).join('/');

  return ((resolvedAbsolute ? '/' : '') + resolvedPath) || '.';
};

// path.normalize(path)
// posix version
exports.normalize = function(path) {
  var isAbsolute = exports.isAbsolute(path),
      trailingSlash = substr(path, -1) === '/';

  // Normalize the path
  path = normalizeArray(filter(path.split('/'), function(p) {
    return !!p;
  }), !isAbsolute).join('/');

  if (!path && !isAbsolute) {
    path = '.';
  }
  if (path && trailingSlash) {
    path += '/';
  }

  return (isAbsolute ? '/' : '') + path;
};

// posix version
exports.isAbsolute = function(path) {
  return path.charAt(0) === '/';
};

// posix version
exports.join = function() {
  var paths = Array.prototype.slice.call(arguments, 0);
  return exports.normalize(filter(paths, function(p, index) {
    if (typeof p !== 'string') {
      throw new TypeError('Arguments to path.join must be strings');
    }
    return p;
  }).join('/'));
};


// path.relative(from, to)
// posix version
exports.relative = function(from, to) {
  from = exports.resolve(from).substr(1);
  to = exports.resolve(to).substr(1);

  function trim(arr) {
    var start = 0;
    for (; start < arr.length; start++) {
      if (arr[start] !== '') break;
    }

    var end = arr.length - 1;
    for (; end >= 0; end--) {
      if (arr[end] !== '') break;
    }

    if (start > end) return [];
    return arr.slice(start, end - start + 1);
  }

  var fromParts = trim(from.split('/'));
  var toParts = trim(to.split('/'));

  var length = Math.min(fromParts.length, toParts.length);
  var samePartsLength = length;
  for (var i = 0; i < length; i++) {
    if (fromParts[i] !== toParts[i]) {
      samePartsLength = i;
      break;
    }
  }

  var outputParts = [];
  for (var i = samePartsLength; i < fromParts.length; i++) {
    outputParts.push('..');
  }

  outputParts = outputParts.concat(toParts.slice(samePartsLength));

  return outputParts.join('/');
};

exports.sep = '/';
exports.delimiter = ':';

exports.dirname = function(path) {
  var result = splitPath(path),
      root = result[0],
      dir = result[1];

  if (!root && !dir) {
    // No dirname whatsoever
    return '.';
  }

  if (dir) {
    // It has a dirname, strip trailing slash
    dir = dir.substr(0, dir.length - 1);
  }

  return root + dir;
};


exports.basename = function(path, ext) {
  var f = splitPath(path)[2];
  // TODO: make this comparison case-insensitive on windows?
  if (ext && f.substr(-1 * ext.length) === ext) {
    f = f.substr(0, f.length - ext.length);
  }
  return f;
};


exports.extname = function(path) {
  return splitPath(path)[3];
};

function filter (xs, f) {
    if (xs.filter) return xs.filter(f);
    var res = [];
    for (var i = 0; i < xs.length; i++) {
        if (f(xs[i], i, xs)) res.push(xs[i]);
    }
    return res;
}

// String.prototype.substr - negative index don't work in IE8
var substr = 'ab'.substr(-1) === 'b'
    ? function (str, start, len) { return str.substr(start, len) }
    : function (str, start, len) {
        if (start < 0) start = str.length + start;
        return str.substr(start, len);
    }
;

}).call(this,_dereq_('_process'))
},{"_process":8}],8:[function(_dereq_,module,exports){
// shim for using process in browser

var process = module.exports = {};
var queue = [];
var draining = false;

function drainQueue() {
    if (draining) {
        return;
    }
    draining = true;
    var currentQueue;
    var len = queue.length;
    while(len) {
        currentQueue = queue;
        queue = [];
        var i = -1;
        while (++i < len) {
            currentQueue[i]();
        }
        len = queue.length;
    }
    draining = false;
}
process.nextTick = function (fun) {
    queue.push(fun);
    if (!draining) {
        setTimeout(drainQueue, 0);
    }
};

process.title = 'browser';
process.browser = true;
process.env = {};
process.argv = [];
process.version = ''; // empty string to avoid regexp issues
process.versions = {};

function noop() {}

process.on = noop;
process.addListener = noop;
process.once = noop;
process.off = noop;
process.removeListener = noop;
process.removeAllListeners = noop;
process.emit = noop;

process.binding = function (name) {
    throw new Error('process.binding is not supported');
};

// TODO(shtylman)
process.cwd = function () { return '/' };
process.chdir = function (dir) {
    throw new Error('process.chdir is not supported');
};
process.umask = function() { return 0; };

},{}],9:[function(_dereq_,module,exports){
/*
  Copyright (C) 2013 Ariya Hidayat <ariya.hidayat@gmail.com>
  Copyright (C) 2013 Thaddee Tyl <thaddee.tyl@gmail.com>
  Copyright (C) 2012 Ariya Hidayat <ariya.hidayat@gmail.com>
  Copyright (C) 2012 Mathias Bynens <mathias@qiwi.be>
  Copyright (C) 2012 Joost-Wim Boekesteijn <joost-wim@boekesteijn.nl>
  Copyright (C) 2012 Kris Kowal <kris.kowal@cixar.com>
  Copyright (C) 2012 Yusuke Suzuki <utatane.tea@gmail.com>
  Copyright (C) 2012 Arpad Borsos <arpad.borsos@googlemail.com>
  Copyright (C) 2011 Ariya Hidayat <ariya.hidayat@gmail.com>

  Redistribution and use in source and binary forms, with or without
  modification, are permitted provided that the following conditions are met:

    * Redistributions of source code must retain the above copyright
      notice, this list of conditions and the following disclaimer.
    * Redistributions in binary form must reproduce the above copyright
      notice, this list of conditions and the following disclaimer in the
      documentation and/or other materials provided with the distribution.

  THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
  AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
  IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
  ARE DISCLAIMED. IN NO EVENT SHALL <COPYRIGHT HOLDER> BE LIABLE FOR ANY
  DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
  (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
  LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
  ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
  (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
  THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/

(function (root, factory) {
    'use strict';

    // Universal Module Definition (UMD) to support AMD, CommonJS/Node.js,
    // Rhino, and plain browser loading.

    /* istanbul ignore next */
    if (typeof define === 'function' && define.amd) {
        define(['exports'], factory);
    } else if (typeof exports !== 'undefined') {
        factory(exports);
    } else {
        factory((root.esprima = {}));
    }
}(this, function (exports) {
    'use strict';

    var Token,
        TokenName,
        FnExprTokens,
        Syntax,
        PropertyKind,
        Messages,
        Regex,
        SyntaxTreeDelegate,
        XHTMLEntities,
        ClassPropertyType,
        source,
        strict,
        index,
        lineNumber,
        lineStart,
        length,
        delegate,
        lookahead,
        state,
        extra;

    Token = {
        BooleanLiteral: 1,
        EOF: 2,
        Identifier: 3,
        Keyword: 4,
        NullLiteral: 5,
        NumericLiteral: 6,
        Punctuator: 7,
        StringLiteral: 8,
        RegularExpression: 9,
        Template: 10,
        JSXIdentifier: 11,
        JSXText: 12
    };

    TokenName = {};
    TokenName[Token.BooleanLiteral] = 'Boolean';
    TokenName[Token.EOF] = '<end>';
    TokenName[Token.Identifier] = 'Identifier';
    TokenName[Token.Keyword] = 'Keyword';
    TokenName[Token.NullLiteral] = 'Null';
    TokenName[Token.NumericLiteral] = 'Numeric';
    TokenName[Token.Punctuator] = 'Punctuator';
    TokenName[Token.StringLiteral] = 'String';
    TokenName[Token.JSXIdentifier] = 'JSXIdentifier';
    TokenName[Token.JSXText] = 'JSXText';
    TokenName[Token.RegularExpression] = 'RegularExpression';

    // A function following one of those tokens is an expression.
    FnExprTokens = ['(', '{', '[', 'in', 'typeof', 'instanceof', 'new',
                    'return', 'case', 'delete', 'throw', 'void',
                    // assignment operators
                    '=', '+=', '-=', '*=', '/=', '%=', '<<=', '>>=', '>>>=',
                    '&=', '|=', '^=', ',',
                    // binary/unary operators
                    '+', '-', '*', '/', '%', '++', '--', '<<', '>>', '>>>', '&',
                    '|', '^', '!', '~', '&&', '||', '?', ':', '===', '==', '>=',
                    '<=', '<', '>', '!=', '!=='];

    Syntax = {
        AnyTypeAnnotation: 'AnyTypeAnnotation',
        ArrayExpression: 'ArrayExpression',
        ArrayPattern: 'ArrayPattern',
        ArrayTypeAnnotation: 'ArrayTypeAnnotation',
        ArrowFunctionExpression: 'ArrowFunctionExpression',
        AssignmentExpression: 'AssignmentExpression',
        BinaryExpression: 'BinaryExpression',
        BlockStatement: 'BlockStatement',
        BooleanTypeAnnotation: 'BooleanTypeAnnotation',
        BreakStatement: 'BreakStatement',
        CallExpression: 'CallExpression',
        CatchClause: 'CatchClause',
        ClassBody: 'ClassBody',
        ClassDeclaration: 'ClassDeclaration',
        ClassExpression: 'ClassExpression',
        ClassImplements: 'ClassImplements',
        ClassProperty: 'ClassProperty',
        ComprehensionBlock: 'ComprehensionBlock',
        ComprehensionExpression: 'ComprehensionExpression',
        ConditionalExpression: 'ConditionalExpression',
        ContinueStatement: 'ContinueStatement',
        DebuggerStatement: 'DebuggerStatement',
        DeclareClass: 'DeclareClass',
        DeclareFunction: 'DeclareFunction',
        DeclareModule: 'DeclareModule',
        DeclareVariable: 'DeclareVariable',
        DoWhileStatement: 'DoWhileStatement',
        EmptyStatement: 'EmptyStatement',
        ExportDeclaration: 'ExportDeclaration',
        ExportBatchSpecifier: 'ExportBatchSpecifier',
        ExportSpecifier: 'ExportSpecifier',
        ExpressionStatement: 'ExpressionStatement',
        ForInStatement: 'ForInStatement',
        ForOfStatement: 'ForOfStatement',
        ForStatement: 'ForStatement',
        FunctionDeclaration: 'FunctionDeclaration',
        FunctionExpression: 'FunctionExpression',
        FunctionTypeAnnotation: 'FunctionTypeAnnotation',
        FunctionTypeParam: 'FunctionTypeParam',
        GenericTypeAnnotation: 'GenericTypeAnnotation',
        Identifier: 'Identifier',
        IfStatement: 'IfStatement',
        ImportDeclaration: 'ImportDeclaration',
        ImportDefaultSpecifier: 'ImportDefaultSpecifier',
        ImportNamespaceSpecifier: 'ImportNamespaceSpecifier',
        ImportSpecifier: 'ImportSpecifier',
        InterfaceDeclaration: 'InterfaceDeclaration',
        InterfaceExtends: 'InterfaceExtends',
        IntersectionTypeAnnotation: 'IntersectionTypeAnnotation',
        LabeledStatement: 'LabeledStatement',
        Literal: 'Literal',
        LogicalExpression: 'LogicalExpression',
        MemberExpression: 'MemberExpression',
        MethodDefinition: 'MethodDefinition',
        ModuleSpecifier: 'ModuleSpecifier',
        NewExpression: 'NewExpression',
        NullableTypeAnnotation: 'NullableTypeAnnotation',
        NumberTypeAnnotation: 'NumberTypeAnnotation',
        ObjectExpression: 'ObjectExpression',
        ObjectPattern: 'ObjectPattern',
        ObjectTypeAnnotation: 'ObjectTypeAnnotation',
        ObjectTypeCallProperty: 'ObjectTypeCallProperty',
        ObjectTypeIndexer: 'ObjectTypeIndexer',
        ObjectTypeProperty: 'ObjectTypeProperty',
        Program: 'Program',
        Property: 'Property',
        QualifiedTypeIdentifier: 'QualifiedTypeIdentifier',
        ReturnStatement: 'ReturnStatement',
        SequenceExpression: 'SequenceExpression',
        SpreadElement: 'SpreadElement',
        SpreadProperty: 'SpreadProperty',
        StringLiteralTypeAnnotation: 'StringLiteralTypeAnnotation',
        StringTypeAnnotation: 'StringTypeAnnotation',
        SwitchCase: 'SwitchCase',
        SwitchStatement: 'SwitchStatement',
        TaggedTemplateExpression: 'TaggedTemplateExpression',
        TemplateElement: 'TemplateElement',
        TemplateLiteral: 'TemplateLiteral',
        ThisExpression: 'ThisExpression',
        ThrowStatement: 'ThrowStatement',
        TupleTypeAnnotation: 'TupleTypeAnnotation',
        TryStatement: 'TryStatement',
        TypeAlias: 'TypeAlias',
        TypeAnnotation: 'TypeAnnotation',
        TypeCastExpression: 'TypeCastExpression',
        TypeofTypeAnnotation: 'TypeofTypeAnnotation',
        TypeParameterDeclaration: 'TypeParameterDeclaration',
        TypeParameterInstantiation: 'TypeParameterInstantiation',
        UnaryExpression: 'UnaryExpression',
        UnionTypeAnnotation: 'UnionTypeAnnotation',
        UpdateExpression: 'UpdateExpression',
        VariableDeclaration: 'VariableDeclaration',
        VariableDeclarator: 'VariableDeclarator',
        VoidTypeAnnotation: 'VoidTypeAnnotation',
        WhileStatement: 'WhileStatement',
        WithStatement: 'WithStatement',
        JSXIdentifier: 'JSXIdentifier',
        JSXNamespacedName: 'JSXNamespacedName',
        JSXMemberExpression: 'JSXMemberExpression',
        JSXEmptyExpression: 'JSXEmptyExpression',
        JSXExpressionContainer: 'JSXExpressionContainer',
        JSXElement: 'JSXElement',
        JSXClosingElement: 'JSXClosingElement',
        JSXOpeningElement: 'JSXOpeningElement',
        JSXAttribute: 'JSXAttribute',
        JSXSpreadAttribute: 'JSXSpreadAttribute',
        JSXText: 'JSXText',
        YieldExpression: 'YieldExpression',
        AwaitExpression: 'AwaitExpression'
    };

    PropertyKind = {
        Data: 1,
        Get: 2,
        Set: 4
    };

    ClassPropertyType = {
        'static': 'static',
        prototype: 'prototype'
    };

    // Error messages should be identical to V8.
    Messages = {
        UnexpectedToken: 'Unexpected token %0',
        UnexpectedNumber: 'Unexpected number',
        UnexpectedString: 'Unexpected string',
        UnexpectedIdentifier: 'Unexpected identifier',
        UnexpectedReserved: 'Unexpected reserved word',
        UnexpectedTemplate: 'Unexpected quasi %0',
        UnexpectedEOS: 'Unexpected end of input',
        NewlineAfterThrow: 'Illegal newline after throw',
        InvalidRegExp: 'Invalid regular expression',
        UnterminatedRegExp: 'Invalid regular expression: missing /',
        InvalidLHSInAssignment: 'Invalid left-hand side in assignment',
        InvalidLHSInFormalsList: 'Invalid left-hand side in formals list',
        InvalidLHSInForIn: 'Invalid left-hand side in for-in',
        MultipleDefaultsInSwitch: 'More than one default clause in switch statement',
        NoCatchOrFinally: 'Missing catch or finally after try',
        UnknownLabel: 'Undefined label \'%0\'',
        Redeclaration: '%0 \'%1\' has already been declared',
        IllegalContinue: 'Illegal continue statement',
        IllegalBreak: 'Illegal break statement',
        IllegalDuplicateClassProperty: 'Illegal duplicate property in class definition',
        IllegalClassConstructorProperty: 'Illegal constructor property in class definition',
        IllegalReturn: 'Illegal return statement',
        IllegalSpread: 'Illegal spread element',
        StrictModeWith: 'Strict mode code may not include a with statement',
        StrictCatchVariable: 'Catch variable may not be eval or arguments in strict mode',
        StrictVarName: 'Variable name may not be eval or arguments in strict mode',
        StrictParamName: 'Parameter name eval or arguments is not allowed in strict mode',
        StrictParamDupe: 'Strict mode function may not have duplicate parameter names',
        ParameterAfterRestParameter: 'Rest parameter must be final parameter of an argument list',
        DefaultRestParameter: 'Rest parameter can not have a default value',
        ElementAfterSpreadElement: 'Spread must be the final element of an element list',
        PropertyAfterSpreadProperty: 'A rest property must be the final property of an object literal',
        ObjectPatternAsRestParameter: 'Invalid rest parameter',
        ObjectPatternAsSpread: 'Invalid spread argument',
        StrictFunctionName: 'Function name may not be eval or arguments in strict mode',
        StrictOctalLiteral: 'Octal literals are not allowed in strict mode.',
        StrictDelete: 'Delete of an unqualified identifier in strict mode.',
        StrictDuplicateProperty: 'Duplicate data property in object literal not allowed in strict mode',
        AccessorDataProperty: 'Object literal may not have data and accessor property with the same name',
        AccessorGetSet: 'Object literal may not have multiple get/set accessors with the same name',
        StrictLHSAssignment: 'Assignment to eval or arguments is not allowed in strict mode',
        StrictLHSPostfix: 'Postfix increment/decrement may not have eval or arguments operand in strict mode',
        StrictLHSPrefix: 'Prefix increment/decrement may not have eval or arguments operand in strict mode',
        StrictReservedWord: 'Use of future reserved word in strict mode',
        MissingFromClause: 'Missing from clause',
        NoAsAfterImportNamespace: 'Missing as after import *',
        InvalidModuleSpecifier: 'Invalid module specifier',
        IllegalImportDeclaration: 'Illegal import declaration',
        IllegalExportDeclaration: 'Illegal export declaration',
        NoUninitializedConst: 'Const must be initialized',
        ComprehensionRequiresBlock: 'Comprehension must have at least one block',
        ComprehensionError: 'Comprehension Error',
        EachNotAllowed: 'Each is not supported',
        InvalidJSXAttributeValue: 'JSX value should be either an expression or a quoted JSX text',
        ExpectedJSXClosingTag: 'Expected corresponding JSX closing tag for %0',
        AdjacentJSXElements: 'Adjacent JSX elements must be wrapped in an enclosing tag',
        ConfusedAboutFunctionType: 'Unexpected token =>. It looks like ' +
            'you are trying to write a function type, but you ended up ' +
            'writing a grouped type followed by an =>, which is a syntax ' +
            'error. Remember, function type parameters are named so function ' +
            'types look like (name1: type1, name2: type2) => returnType. You ' +
            'probably wrote (type1) => returnType'
    };

    // See also tools/generate-unicode-regex.py.
    Regex = {
        NonAsciiIdentifierStart: new RegExp('[\xaa\xb5\xba\xc0-\xd6\xd8-\xf6\xf8-\u02c1\u02c6-\u02d1\u02e0-\u02e4\u02ec\u02ee\u0370-\u0374\u0376\u0377\u037a-\u037d\u0386\u0388-\u038a\u038c\u038e-\u03a1\u03a3-\u03f5\u03f7-\u0481\u048a-\u0527\u0531-\u0556\u0559\u0561-\u0587\u05d0-\u05ea\u05f0-\u05f2\u0620-\u064a\u066e\u066f\u0671-\u06d3\u06d5\u06e5\u06e6\u06ee\u06ef\u06fa-\u06fc\u06ff\u0710\u0712-\u072f\u074d-\u07a5\u07b1\u07ca-\u07ea\u07f4\u07f5\u07fa\u0800-\u0815\u081a\u0824\u0828\u0840-\u0858\u08a0\u08a2-\u08ac\u0904-\u0939\u093d\u0950\u0958-\u0961\u0971-\u0977\u0979-\u097f\u0985-\u098c\u098f\u0990\u0993-\u09a8\u09aa-\u09b0\u09b2\u09b6-\u09b9\u09bd\u09ce\u09dc\u09dd\u09df-\u09e1\u09f0\u09f1\u0a05-\u0a0a\u0a0f\u0a10\u0a13-\u0a28\u0a2a-\u0a30\u0a32\u0a33\u0a35\u0a36\u0a38\u0a39\u0a59-\u0a5c\u0a5e\u0a72-\u0a74\u0a85-\u0a8d\u0a8f-\u0a91\u0a93-\u0aa8\u0aaa-\u0ab0\u0ab2\u0ab3\u0ab5-\u0ab9\u0abd\u0ad0\u0ae0\u0ae1\u0b05-\u0b0c\u0b0f\u0b10\u0b13-\u0b28\u0b2a-\u0b30\u0b32\u0b33\u0b35-\u0b39\u0b3d\u0b5c\u0b5d\u0b5f-\u0b61\u0b71\u0b83\u0b85-\u0b8a\u0b8e-\u0b90\u0b92-\u0b95\u0b99\u0b9a\u0b9c\u0b9e\u0b9f\u0ba3\u0ba4\u0ba8-\u0baa\u0bae-\u0bb9\u0bd0\u0c05-\u0c0c\u0c0e-\u0c10\u0c12-\u0c28\u0c2a-\u0c33\u0c35-\u0c39\u0c3d\u0c58\u0c59\u0c60\u0c61\u0c85-\u0c8c\u0c8e-\u0c90\u0c92-\u0ca8\u0caa-\u0cb3\u0cb5-\u0cb9\u0cbd\u0cde\u0ce0\u0ce1\u0cf1\u0cf2\u0d05-\u0d0c\u0d0e-\u0d10\u0d12-\u0d3a\u0d3d\u0d4e\u0d60\u0d61\u0d7a-\u0d7f\u0d85-\u0d96\u0d9a-\u0db1\u0db3-\u0dbb\u0dbd\u0dc0-\u0dc6\u0e01-\u0e30\u0e32\u0e33\u0e40-\u0e46\u0e81\u0e82\u0e84\u0e87\u0e88\u0e8a\u0e8d\u0e94-\u0e97\u0e99-\u0e9f\u0ea1-\u0ea3\u0ea5\u0ea7\u0eaa\u0eab\u0ead-\u0eb0\u0eb2\u0eb3\u0ebd\u0ec0-\u0ec4\u0ec6\u0edc-\u0edf\u0f00\u0f40-\u0f47\u0f49-\u0f6c\u0f88-\u0f8c\u1000-\u102a\u103f\u1050-\u1055\u105a-\u105d\u1061\u1065\u1066\u106e-\u1070\u1075-\u1081\u108e\u10a0-\u10c5\u10c7\u10cd\u10d0-\u10fa\u10fc-\u1248\u124a-\u124d\u1250-\u1256\u1258\u125a-\u125d\u1260-\u1288\u128a-\u128d\u1290-\u12b0\u12b2-\u12b5\u12b8-\u12be\u12c0\u12c2-\u12c5\u12c8-\u12d6\u12d8-\u1310\u1312-\u1315\u1318-\u135a\u1380-\u138f\u13a0-\u13f4\u1401-\u166c\u166f-\u167f\u1681-\u169a\u16a0-\u16ea\u16ee-\u16f0\u1700-\u170c\u170e-\u1711\u1720-\u1731\u1740-\u1751\u1760-\u176c\u176e-\u1770\u1780-\u17b3\u17d7\u17dc\u1820-\u1877\u1880-\u18a8\u18aa\u18b0-\u18f5\u1900-\u191c\u1950-\u196d\u1970-\u1974\u1980-\u19ab\u19c1-\u19c7\u1a00-\u1a16\u1a20-\u1a54\u1aa7\u1b05-\u1b33\u1b45-\u1b4b\u1b83-\u1ba0\u1bae\u1baf\u1bba-\u1be5\u1c00-\u1c23\u1c4d-\u1c4f\u1c5a-\u1c7d\u1ce9-\u1cec\u1cee-\u1cf1\u1cf5\u1cf6\u1d00-\u1dbf\u1e00-\u1f15\u1f18-\u1f1d\u1f20-\u1f45\u1f48-\u1f4d\u1f50-\u1f57\u1f59\u1f5b\u1f5d\u1f5f-\u1f7d\u1f80-\u1fb4\u1fb6-\u1fbc\u1fbe\u1fc2-\u1fc4\u1fc6-\u1fcc\u1fd0-\u1fd3\u1fd6-\u1fdb\u1fe0-\u1fec\u1ff2-\u1ff4\u1ff6-\u1ffc\u2071\u207f\u2090-\u209c\u2102\u2107\u210a-\u2113\u2115\u2119-\u211d\u2124\u2126\u2128\u212a-\u212d\u212f-\u2139\u213c-\u213f\u2145-\u2149\u214e\u2160-\u2188\u2c00-\u2c2e\u2c30-\u2c5e\u2c60-\u2ce4\u2ceb-\u2cee\u2cf2\u2cf3\u2d00-\u2d25\u2d27\u2d2d\u2d30-\u2d67\u2d6f\u2d80-\u2d96\u2da0-\u2da6\u2da8-\u2dae\u2db0-\u2db6\u2db8-\u2dbe\u2dc0-\u2dc6\u2dc8-\u2dce\u2dd0-\u2dd6\u2dd8-\u2dde\u2e2f\u3005-\u3007\u3021-\u3029\u3031-\u3035\u3038-\u303c\u3041-\u3096\u309d-\u309f\u30a1-\u30fa\u30fc-\u30ff\u3105-\u312d\u3131-\u318e\u31a0-\u31ba\u31f0-\u31ff\u3400-\u4db5\u4e00-\u9fcc\ua000-\ua48c\ua4d0-\ua4fd\ua500-\ua60c\ua610-\ua61f\ua62a\ua62b\ua640-\ua66e\ua67f-\ua697\ua6a0-\ua6ef\ua717-\ua71f\ua722-\ua788\ua78b-\ua78e\ua790-\ua793\ua7a0-\ua7aa\ua7f8-\ua801\ua803-\ua805\ua807-\ua80a\ua80c-\ua822\ua840-\ua873\ua882-\ua8b3\ua8f2-\ua8f7\ua8fb\ua90a-\ua925\ua930-\ua946\ua960-\ua97c\ua984-\ua9b2\ua9cf\uaa00-\uaa28\uaa40-\uaa42\uaa44-\uaa4b\uaa60-\uaa76\uaa7a\uaa80-\uaaaf\uaab1\uaab5\uaab6\uaab9-\uaabd\uaac0\uaac2\uaadb-\uaadd\uaae0-\uaaea\uaaf2-\uaaf4\uab01-\uab06\uab09-\uab0e\uab11-\uab16\uab20-\uab26\uab28-\uab2e\uabc0-\uabe2\uac00-\ud7a3\ud7b0-\ud7c6\ud7cb-\ud7fb\uf900-\ufa6d\ufa70-\ufad9\ufb00-\ufb06\ufb13-\ufb17\ufb1d\ufb1f-\ufb28\ufb2a-\ufb36\ufb38-\ufb3c\ufb3e\ufb40\ufb41\ufb43\ufb44\ufb46-\ufbb1\ufbd3-\ufd3d\ufd50-\ufd8f\ufd92-\ufdc7\ufdf0-\ufdfb\ufe70-\ufe74\ufe76-\ufefc\uff21-\uff3a\uff41-\uff5a\uff66-\uffbe\uffc2-\uffc7\uffca-\uffcf\uffd2-\uffd7\uffda-\uffdc]'),
        NonAsciiIdentifierPart: new RegExp('[\xaa\xb5\xba\xc0-\xd6\xd8-\xf6\xf8-\u02c1\u02c6-\u02d1\u02e0-\u02e4\u02ec\u02ee\u0300-\u0374\u0376\u0377\u037a-\u037d\u0386\u0388-\u038a\u038c\u038e-\u03a1\u03a3-\u03f5\u03f7-\u0481\u0483-\u0487\u048a-\u0527\u0531-\u0556\u0559\u0561-\u0587\u0591-\u05bd\u05bf\u05c1\u05c2\u05c4\u05c5\u05c7\u05d0-\u05ea\u05f0-\u05f2\u0610-\u061a\u0620-\u0669\u066e-\u06d3\u06d5-\u06dc\u06df-\u06e8\u06ea-\u06fc\u06ff\u0710-\u074a\u074d-\u07b1\u07c0-\u07f5\u07fa\u0800-\u082d\u0840-\u085b\u08a0\u08a2-\u08ac\u08e4-\u08fe\u0900-\u0963\u0966-\u096f\u0971-\u0977\u0979-\u097f\u0981-\u0983\u0985-\u098c\u098f\u0990\u0993-\u09a8\u09aa-\u09b0\u09b2\u09b6-\u09b9\u09bc-\u09c4\u09c7\u09c8\u09cb-\u09ce\u09d7\u09dc\u09dd\u09df-\u09e3\u09e6-\u09f1\u0a01-\u0a03\u0a05-\u0a0a\u0a0f\u0a10\u0a13-\u0a28\u0a2a-\u0a30\u0a32\u0a33\u0a35\u0a36\u0a38\u0a39\u0a3c\u0a3e-\u0a42\u0a47\u0a48\u0a4b-\u0a4d\u0a51\u0a59-\u0a5c\u0a5e\u0a66-\u0a75\u0a81-\u0a83\u0a85-\u0a8d\u0a8f-\u0a91\u0a93-\u0aa8\u0aaa-\u0ab0\u0ab2\u0ab3\u0ab5-\u0ab9\u0abc-\u0ac5\u0ac7-\u0ac9\u0acb-\u0acd\u0ad0\u0ae0-\u0ae3\u0ae6-\u0aef\u0b01-\u0b03\u0b05-\u0b0c\u0b0f\u0b10\u0b13-\u0b28\u0b2a-\u0b30\u0b32\u0b33\u0b35-\u0b39\u0b3c-\u0b44\u0b47\u0b48\u0b4b-\u0b4d\u0b56\u0b57\u0b5c\u0b5d\u0b5f-\u0b63\u0b66-\u0b6f\u0b71\u0b82\u0b83\u0b85-\u0b8a\u0b8e-\u0b90\u0b92-\u0b95\u0b99\u0b9a\u0b9c\u0b9e\u0b9f\u0ba3\u0ba4\u0ba8-\u0baa\u0bae-\u0bb9\u0bbe-\u0bc2\u0bc6-\u0bc8\u0bca-\u0bcd\u0bd0\u0bd7\u0be6-\u0bef\u0c01-\u0c03\u0c05-\u0c0c\u0c0e-\u0c10\u0c12-\u0c28\u0c2a-\u0c33\u0c35-\u0c39\u0c3d-\u0c44\u0c46-\u0c48\u0c4a-\u0c4d\u0c55\u0c56\u0c58\u0c59\u0c60-\u0c63\u0c66-\u0c6f\u0c82\u0c83\u0c85-\u0c8c\u0c8e-\u0c90\u0c92-\u0ca8\u0caa-\u0cb3\u0cb5-\u0cb9\u0cbc-\u0cc4\u0cc6-\u0cc8\u0cca-\u0ccd\u0cd5\u0cd6\u0cde\u0ce0-\u0ce3\u0ce6-\u0cef\u0cf1\u0cf2\u0d02\u0d03\u0d05-\u0d0c\u0d0e-\u0d10\u0d12-\u0d3a\u0d3d-\u0d44\u0d46-\u0d48\u0d4a-\u0d4e\u0d57\u0d60-\u0d63\u0d66-
Download .txt
gitextract_k0i4cvxl/

├── .bowerrc
├── .codeclimate.yml
├── .github/
│   ├── ISSUE_TEMPLATE.md
│   ├── PULL_REQUEST_TEMPLATE.md
│   └── workflows/
│       ├── claude-code-review.yml
│       ├── claude.yml
│       ├── rubocop.yml
│       └── ruby.yml
├── .gitignore
├── .pryrc
├── .rubocop.yml
├── .rubocop_todo.yml
├── Appraisals
├── CHANGELOG.md
├── CODE_OF_CONDUCT.md
├── CONTRIBUTING.md
├── Gemfile
├── Guardfile
├── LICENSE
├── LintingGemfile
├── README.md
├── Rakefile
├── SECURITY.md
├── VERSIONS.md
├── check_for_uncommitted_files.sh
├── docs/
│   ├── common-errors.md
│   ├── component-generator.md
│   ├── controller-actions.md
│   ├── get-started.md
│   ├── migrating-from-react-rails-to-react_on_rails.md
│   ├── server-side-rendering.md
│   ├── ujs.md
│   ├── upgrading.md
│   └── view-helper.md
├── gemfiles/
│   ├── base.gemfile
│   ├── connection_pool_3.gemfile
│   ├── propshaft.gemfile
│   ├── shakapacker.gemfile
│   ├── sprockets_3.gemfile
│   └── sprockets_4.gemfile
├── lib/
│   ├── assets/
│   │   ├── javascripts/
│   │   │   ├── JSXTransformer.js
│   │   │   └── react_ujs.js
│   │   └── react-source/
│   │       ├── development/
│   │       │   ├── react-server.js
│   │       │   └── react.js
│   │       └── production/
│   │           ├── react-server.js
│   │           └── react.js
│   ├── generators/
│   │   ├── react/
│   │   │   ├── component_generator.rb
│   │   │   └── install_generator.rb
│   │   └── templates/
│   │       ├── .gitkeep
│   │       ├── component.es6.jsx
│   │       ├── component.es6.tsx
│   │       ├── component.js.jsx
│   │       ├── component.js.jsx.coffee
│   │       ├── component.js.jsx.tsx
│   │       ├── react_server_rendering.rb
│   │       ├── server_rendering.js
│   │       └── server_rendering_pack.js
│   ├── react/
│   │   ├── jsx/
│   │   │   ├── babel_transformer.rb
│   │   │   ├── jsx_transformer.rb
│   │   │   ├── processor.rb
│   │   │   ├── sprockets_strategy.rb
│   │   │   └── template.rb
│   │   ├── jsx.rb
│   │   ├── rails/
│   │   │   ├── asset_variant.rb
│   │   │   ├── component_mount.rb
│   │   │   ├── controller_lifecycle.rb
│   │   │   ├── controller_renderer.rb
│   │   │   ├── railtie.rb
│   │   │   ├── test_helper.rb
│   │   │   ├── version.rb
│   │   │   └── view_helper.rb
│   │   ├── rails.rb
│   │   ├── server_rendering/
│   │   │   ├── bundle_renderer/
│   │   │   │   ├── console_polyfill.js
│   │   │   │   ├── console_replay.js
│   │   │   │   ├── console_reset.js
│   │   │   │   └── timeout_polyfill.js
│   │   │   ├── bundle_renderer.rb
│   │   │   ├── environment_container.rb
│   │   │   ├── exec_js_renderer.rb
│   │   │   ├── manifest_container.rb
│   │   │   ├── propshaft_container.rb
│   │   │   ├── separate_server_bundle_container.rb
│   │   │   └── yaml_manifest_container.rb
│   │   └── server_rendering.rb
│   ├── react-rails.rb
│   └── react.rb
├── package.json
├── rakelib/
│   └── create_release.rake
├── react-builds/
│   ├── package.json
│   ├── react-browser.js
│   ├── react-server.js
│   └── webpack.config.js
├── react-rails.gemspec
├── react_ujs/
│   ├── dist/
│   │   └── react_ujs.js
│   ├── index.js
│   ├── readme.md
│   ├── src/
│   │   ├── events/
│   │   │   ├── detect.js
│   │   │   ├── native.js
│   │   │   ├── pjax.js
│   │   │   ├── turbolinks.js
│   │   │   ├── turbolinksClassic.js
│   │   │   └── turbolinksClassicDeprecated.js
│   │   ├── getConstructor/
│   │   │   ├── fromGlobal.js
│   │   │   ├── fromRequireContext.js
│   │   │   ├── fromRequireContextWithGlobalFallback.js
│   │   │   └── fromRequireContextsWithGlobalFallback.js
│   │   ├── reactDomClient.js
│   │   ├── renderHelpers.js
│   │   └── supportsRootApi.js
│   └── webpack.config.js
└── test/
    ├── bin/
    │   └── create-fake-js-package-managers
    ├── dummy/
    │   ├── .gitignore
    │   ├── .postcssrc.yml
    │   ├── README.rdoc
    │   ├── Rakefile
    │   ├── app/
    │   │   ├── assets/
    │   │   │   ├── config/
    │   │   │   │   └── manifest.js
    │   │   │   ├── images/
    │   │   │   │   └── .keep
    │   │   │   ├── javascripts/
    │   │   │   │   ├── app_no_turbolinks.js
    │   │   │   │   ├── application.js
    │   │   │   │   ├── components/
    │   │   │   │   │   ├── PlainJSTodo.js
    │   │   │   │   │   ├── Todo.js.jsx.coffee
    │   │   │   │   │   ├── TodoList.js.jsx
    │   │   │   │   │   ├── TodoListWithConsoleLog.js.jsx
    │   │   │   │   │   └── WithSetTimeout.js.jsx
    │   │   │   │   ├── components.js
    │   │   │   │   ├── example.js.jsx
    │   │   │   │   ├── example2.js.jsx.coffee
    │   │   │   │   ├── example3.js.jsx
    │   │   │   │   ├── flow_types_example.js.jsx
    │   │   │   │   ├── harmony_example.js.jsx
    │   │   │   │   ├── pages.js
    │   │   │   │   ├── require_test/
    │   │   │   │   │   ├── jsx_preprocessor_test.jsx
    │   │   │   │   │   ├── jsx_require_child_coffee.coffee
    │   │   │   │   │   ├── jsx_require_child_js.js
    │   │   │   │   │   └── jsx_require_child_jsx.jsx
    │   │   │   │   ├── server_rendering.js
    │   │   │   │   └── turbolinks_only.js
    │   │   │   └── stylesheets/
    │   │   │       └── application.css
    │   │   ├── controllers/
    │   │   │   ├── application_controller.rb
    │   │   │   ├── concerns/
    │   │   │   │   └── .keep
    │   │   │   ├── counters_controller.rb
    │   │   │   ├── pack_components_controller.rb
    │   │   │   ├── pages_controller.rb
    │   │   │   └── server_controller.rb
    │   │   ├── helpers/
    │   │   │   └── application_helper.rb
    │   │   ├── javascript/
    │   │   │   ├── components/
    │   │   │   │   ├── Counter.js
    │   │   │   │   ├── GreetingMessage.js
    │   │   │   │   ├── Todo.js
    │   │   │   │   ├── TodoList.js
    │   │   │   │   ├── TodoListWithConsoleLog.js
    │   │   │   │   ├── WithSetTimeout.js
    │   │   │   │   ├── export_default_component.js
    │   │   │   │   ├── named_export_component.js
    │   │   │   │   └── subfolder/
    │   │   │   │       └── exports_component.js
    │   │   │   ├── controllers/
    │   │   │   │   └── mount_counters.js
    │   │   │   └── packs/
    │   │   │       ├── application.js
    │   │   │       └── server_rendering.js
    │   │   ├── mailers/
    │   │   │   └── .keep
    │   │   ├── models/
    │   │   │   ├── .keep
    │   │   │   └── concerns/
    │   │   │       └── .keep
    │   │   ├── pants/
    │   │   │   └── yfronts.js
    │   │   └── views/
    │   │       ├── counters/
    │   │       │   ├── create.turbo_stream.erb
    │   │       │   └── index.html.erb
    │   │       ├── layouts/
    │   │       │   ├── app_no_turbolinks.html.erb
    │   │       │   └── application.html.erb
    │   │       ├── pack_components/
    │   │       │   └── show.html.erb
    │   │       ├── pages/
    │   │       │   ├── _component_with_inner_html.html.erb
    │   │       │   └── show.html.erb
    │   │       └── server/
    │   │           ├── console_example.html.erb
    │   │           ├── console_example_suppressed.html.erb
    │   │           └── show.html.erb
    │   ├── babel.config.js
    │   ├── bin/
    │   │   ├── bundle
    │   │   ├── rails
    │   │   ├── rake
    │   │   ├── shakapacker
    │   │   ├── shakapacker-dev-server
    │   │   └── yarn
    │   ├── config/
    │   │   ├── application.rb
    │   │   ├── boot.rb
    │   │   ├── environment.rb
    │   │   ├── environments/
    │   │   │   ├── development.rb
    │   │   │   ├── production.rb
    │   │   │   └── test.rb
    │   │   ├── initializers/
    │   │   │   ├── backtrace_silencers.rb
    │   │   │   ├── filter_parameter_logging.rb
    │   │   │   ├── inflections.rb
    │   │   │   ├── mime_types.rb
    │   │   │   ├── react.rb
    │   │   │   ├── secret_token.rb
    │   │   │   ├── session_store.rb
    │   │   │   └── wrap_parameters.rb
    │   │   ├── locales/
    │   │   │   └── en.yml
    │   │   ├── routes.rb
    │   │   ├── shakapacker.yml
    │   │   └── webpack/
    │   │       ├── clientWebpackConfig.js
    │   │       ├── commonWebpackConfig.js
    │   │       ├── development.js
    │   │       ├── production.js
    │   │       ├── serverClientOrBoth.js
    │   │       ├── serverWebpackConfig.js
    │   │       ├── test.js
    │   │       └── webpack.config.js
    │   ├── config.ru
    │   ├── lib/
    │   │   └── assets/
    │   │       └── .keep
    │   ├── log/
    │   │   └── .keep
    │   ├── package.json
    │   ├── public/
    │   │   ├── 404.html
    │   │   ├── 422.html
    │   │   └── 500.html
    │   └── vendor/
    │       └── assets/
    │           ├── javascripts/
    │           │   └── .gitkeep
    │           └── react/
    │               ├── JSXTransformer__.js
    │               └── test/
    │                   └── react__.js
    ├── generators/
    │   ├── coffee_component_generator_test.rb
    │   ├── component_generator_test.rb
    │   ├── es6_component_generator_test.rb
    │   ├── install_generator_sprockets_test.rb
    │   ├── install_generator_webpacker_test.rb
    │   └── ts_es6_component_generator_test.rb
    ├── helper_files/
    │   ├── TodoListWithUpdates.js
    │   ├── TodoListWithUpdates.js.jsx
    │   └── WithoutSprockets.js
    ├── react/
    │   ├── jsx/
    │   │   ├── jsx_prepocessor_test.rb
    │   │   └── jsx_transformer_test.rb
    │   ├── jsx_test.rb
    │   ├── rails/
    │   │   ├── asset_variant_test.rb
    │   │   ├── component_mount_test.rb
    │   │   ├── controller_lifecycle_test.rb
    │   │   ├── pages_controller_test.rb
    │   │   ├── railtie_test.rb
    │   │   ├── react_rails_ujs_test.rb
    │   │   ├── realtime_update_test.rb
    │   │   ├── test_helper_test.rb
    │   │   ├── view_helper_test.rb
    │   │   └── webpacker_test.rb
    │   ├── server_rendering/
    │   │   ├── bundle_renderer_test.rb
    │   │   ├── console_replay_test.rb
    │   │   ├── exec_js_renderer_test.rb
    │   │   ├── manifest_container_test.rb
    │   │   ├── propshaft_container_test.rb
    │   │   ├── webpacker_containers_test.rb
    │   │   └── yaml_manifest_container_test.rb
    │   └── server_rendering_test.rb
    ├── react_asset_test.rb
    ├── react_test.rb
    ├── server_rendered_html_test.rb
    ├── support/
    │   ├── propshaft_helpers.rb
    │   ├── sprockets_helpers.rb
    │   └── webpacker_helpers.rb
    └── test_helper.rb
Download .txt
SYMBOL INDEX (1300 symbols across 82 files)

FILE: lib/assets/javascripts/JSXTransformer.js
  function s (line 4) | function s(o,u){if(!n[o]){if(!t[o]){var a=typeof require=="function"&&re...
  function transformReact (line 40) | function transformReact(source, options) {
  function exec (line 61) | function exec(source, options) {
  function createSourceCodeErrorMessage (line 79) | function createSourceCodeErrorMessage(code, e) {
  function transformCode (line 124) | function transformCode(code, url, options) {
  function run (line 181) | function run(code, url, options) {
  function load (line 194) | function load(url, successCallback, errorCallback) {
  function loadScripts (line 226) | function loadScripts(scripts) {
  function runScripts (line 299) | function runScripts() {
  function processOptions (line 392) | function processOptions(opts) {
  function innerTransform (line 416) | function innerTransform(input, options) {
  function Buffer (line 505) | function Buffer (subject, encoding) {
  function SlowBuffer (line 569) | function SlowBuffer (subject, encoding) {
  function arrayIndexOf (line 772) | function arrayIndexOf (arr, val, byteOffset) {
  function hexWrite (line 800) | function hexWrite (buf, string, offset, length) {
  function utf8Write (line 827) | function utf8Write (buf, string, offset, length) {
  function asciiWrite (line 832) | function asciiWrite (buf, string, offset, length) {
  function binaryWrite (line 837) | function binaryWrite (buf, string, offset, length) {
  function base64Write (line 841) | function base64Write (buf, string, offset, length) {
  function utf16leWrite (line 846) | function utf16leWrite (buf, string, offset, length) {
  function base64Slice (line 920) | function base64Slice (buf, start, end) {
  function utf8Slice (line 928) | function utf8Slice (buf, start, end) {
  function asciiSlice (line 945) | function asciiSlice (buf, start, end) {
  function binarySlice (line 955) | function binarySlice (buf, start, end) {
  function hexSlice (line 965) | function hexSlice (buf, start, end) {
  function utf16leSlice (line 978) | function utf16leSlice (buf, start, end) {
  function checkOffset (line 1027) | function checkOffset (offset, ext, length) {
  function checkInt (line 1188) | function checkInt (buf, value, offset, ext, max, min) {
  function objectWriteUInt16 (line 1235) | function objectWriteUInt16 (buf, value, offset, littleEndian) {
  function objectWriteUInt32 (line 1269) | function objectWriteUInt32 (buf, value, offset, littleEndian) {
  function checkIEEE754 (line 1417) | function checkIEEE754 (buf, value, offset, ext, max, min) {
  function writeFloat (line 1423) | function writeFloat (buf, value, offset, littleEndian, noAssert) {
  function writeDouble (line 1439) | function writeDouble (buf, value, offset, littleEndian, noAssert) {
  function base64clean (line 1617) | function base64clean (str) {
  function stringtrim (line 1629) | function stringtrim (str) {
  function isArrayish (line 1634) | function isArrayish (subject) {
  function toHex (line 1640) | function toHex (n) {
  function utf8ToBytes (line 1645) | function utf8ToBytes (string, units) {
  function asciiToBytes (line 1726) | function asciiToBytes (str) {
  function utf16leToBytes (line 1735) | function utf16leToBytes (str, units) {
  function base64ToBytes (line 1751) | function base64ToBytes (str) {
  function blitBuffer (line 1755) | function blitBuffer (src, dst, offset, length) {
  function decodeUtf8Char (line 1763) | function decodeUtf8Char (str) {
  function decode (line 1789) | function decode (elt) {
  function b64ToByteArray (line 1807) | function b64ToByteArray (b64) {
  function uint8ToBase64 (line 1853) | function uint8ToBase64 (uint8) {
  function normalizeArray (line 2045) | function normalizeArray(parts, allowAboveRoot) {
  function trim (line 2154) | function trim(arr) {
  function filter (line 2227) | function filter (xs, f) {
  function drainQueue (line 2253) | function drainQueue() {
  function noop (line 2285) | function noop() {}
  function assert (line 2617) | function assert(condition, message) {
  function StringMap (line 2624) | function StringMap() {
  function isDecimalDigit (line 2649) | function isDecimalDigit(ch) {
  function isHexDigit (line 2653) | function isHexDigit(ch) {
  function isOctalDigit (line 2657) | function isOctalDigit(ch) {
  function isWhiteSpace (line 2664) | function isWhiteSpace(ch) {
  function isLineTerminator (line 2675) | function isLineTerminator(ch) {
  function isIdentifierStart (line 2681) | function isIdentifierStart(ch) {
  function isIdentifierPart (line 2689) | function isIdentifierPart(ch) {
  function isFutureReservedWord (line 2700) | function isFutureReservedWord(id) {
  function isStrictModeReservedWord (line 2714) | function isStrictModeReservedWord(id) {
  function isRestrictedWord (line 2731) | function isRestrictedWord(id) {
  function isKeyword (line 2737) | function isKeyword(id) {
  function addComment (line 2776) | function addComment(type, value, start, end, loc) {
  function skipSingleLineComment (line 2806) | function skipSingleLineComment() {
  function skipMultiLineComment (line 2848) | function skipMultiLineComment() {
  function skipComment (line 2897) | function skipComment() {
  function scanHexEscape (line 2931) | function scanHexEscape(prefix) {
  function scanUnicodeCodePointEscape (line 2946) | function scanUnicodeCodePointEscape() {
  function getEscapedIdentifier (line 2978) | function getEscapedIdentifier() {
  function getIdentifier (line 3023) | function getIdentifier() {
  function scanIdentifier (line 3044) | function scanIdentifier() {
  function scanPunctuator (line 3078) | function scanPunctuator() {
  function scanHexLiteral (line 3300) | function scanHexLiteral(start) {
  function scanBinaryLiteral (line 3327) | function scanBinaryLiteral(start) {
  function scanOctalLiteral (line 3362) | function scanOctalLiteral(prefix, start) {
  function scanNumericLiteral (line 3400) | function scanNumericLiteral() {
  function scanStringLiteral (line 3480) | function scanStringLiteral() {
  function scanTemplate (line 3591) | function scanTemplate() {
  function scanTemplateElement (line 3717) | function scanTemplateElement(option) {
  function testRegExp (line 3736) | function testRegExp(pattern, flags) {
  function scanRegExpBody (line 3776) | function scanRegExpBody() {
  function scanRegExpFlags (line 3823) | function scanRegExpFlags() {
  function scanRegExp (line 3868) | function scanRegExp() {
  function isIdentifierName (line 3904) | function isIdentifierName(token) {
  function advanceSlash (line 3911) | function advanceSlash() {
  function advance (line 3971) | function advance() {
  function lex (line 4038) | function lex() {
  function peek (line 4055) | function peek() {
  function lookahead2 (line 4067) | function lookahead2() {
  function rewind (line 4096) | function rewind(token) {
  function markerCreate (line 4103) | function markerCreate() {
  function markerCreatePreserveWhitespace (line 4111) | function markerCreatePreserveWhitespace() {
  function processComment (line 4118) | function processComment(node) {
  function markerApply (line 4170) | function markerApply(marker, node) {
  function peekLineTerminator (line 5085) | function peekLineTerminator() {
  function throwError (line 5102) | function throwError(token, messageFormat) {
  function throwErrorTolerant (line 5129) | function throwErrorTolerant() {
  function throwUnexpected (line 5144) | function throwUnexpected(token) {
  function expect (line 5182) | function expect(value) {
  function expectKeyword (line 5192) | function expectKeyword(keyword, contextual) {
  function expectContextualKeyword (line 5203) | function expectContextualKeyword(keyword) {
  function match (line 5209) | function match(value) {
  function matchKeyword (line 5215) | function matchKeyword(keyword, contextual) {
  function matchContextualKeyword (line 5222) | function matchContextualKeyword(keyword) {
  function matchAssign (line 5228) | function matchAssign() {
  function matchYield (line 5253) | function matchYield() {
  function matchAsync (line 5257) | function matchAsync() {
  function matchAwait (line 5269) | function matchAwait() {
  function consumeSemicolon (line 5273) | function consumeSemicolon() {
  function isLeftHandSide (line 5305) | function isLeftHandSide(expr) {
  function isAssignableLeftHandSide (line 5309) | function isAssignableLeftHandSide(expr) {
  function parseArrayInitialiser (line 5315) | function parseArrayInitialiser() {
  function parsePropertyFunction (line 5379) | function parsePropertyFunction(options) {
  function parsePropertyMethodFunction (line 5414) | function parsePropertyMethodFunction(options) {
  function parseObjectPropertyKey (line 5442) | function parseObjectPropertyKey() {
  function parseObjectProperty (line 5471) | function parseObjectProperty() {
  function parseObjectSpreadProperty (line 5668) | function parseObjectSpreadProperty() {
  function getFieldName (line 5674) | function getFieldName(key) {
  function parseObjectInitialiser (line 5682) | function parseObjectInitialiser() {
  function parseTemplateElement (line 5734) | function parseTemplateElement(option) {
  function parseTemplateLiteral (line 5743) | function parseTemplateLiteral() {
  function parseGroupExpression (line 5761) | function parseGroupExpression() {
  function matchAsyncFuncExprOrDecl (line 5785) | function matchAsyncFuncExprOrDecl() {
  function parsePrimaryExpression (line 5800) | function parsePrimaryExpression() {
  function parseArguments (line 5886) | function parseArguments() {
  function parseSpreadOrAssignmentExpression (line 5911) | function parseSpreadOrAssignmentExpression() {
  function parseNonComputedProperty (line 5920) | function parseNonComputedProperty() {
  function parseNonComputedMember (line 5931) | function parseNonComputedMember() {
  function parseComputedMember (line 5937) | function parseComputedMember() {
  function parseNewExpression (line 5949) | function parseNewExpression() {
  function parseLeftHandSideExpressionAllowCall (line 5959) | function parseLeftHandSideExpressionAllowCall() {
  function parseLeftHandSideExpression (line 5980) | function parseLeftHandSideExpression() {
  function parsePostfixExpression (line 6000) | function parsePostfixExpression() {
  function parseUnaryExpression (line 6028) | function parseUnaryExpression() {
  function binaryPrecedence (line 6072) | function binaryPrecedence(token, allowIn) {
  function parseBinaryExpression (line 6151) | function parseBinaryExpression() {
  function parseConditionalExpression (line 6217) | function parseConditionalExpression() {
  function reinterpretAsAssignmentBindingPattern (line 6240) | function reinterpretAsAssignmentBindingPattern(expr) {
  function reinterpretAsDestructuredParameter (line 6287) | function reinterpretAsDestructuredParameter(options, expr) {
  function reinterpretAsCoverFormalsList (line 6327) | function reinterpretAsCoverFormalsList(expressions) {
  function parseArrowFunctionExpression (line 6386) | function parseArrowFunctionExpression(options, marker) {
  function parseAssignmentExpression (line 6419) | function parseAssignmentExpression() {
  function parseExpression (line 6525) | function parseExpression() {
  function parseStatementList (line 6563) | function parseStatementList() {
  function parseBlock (line 6581) | function parseBlock() {
  function parseTypeParameterDeclaration (line 6595) | function parseTypeParameterDeclaration() {
  function parseTypeParameterInstantiation (line 6612) | function parseTypeParameterInstantiation() {
  function parseObjectTypeIndexer (line 6633) | function parseObjectTypeIndexer(marker, isStatic) {
  function parseObjectTypeMethodish (line 6652) | function parseObjectTypeMethodish(marker) {
  function parseObjectTypeMethod (line 6682) | function parseObjectTypeMethod(marker, isStatic, key) {
  function parseObjectTypeCallProperty (line 6694) | function parseObjectTypeCallProperty(marker, isStatic) {
  function parseObjectType (line 6702) | function parseObjectType(allowStatic) {
  function parseGenericType (line 6767) | function parseGenericType() {
  function parseVoidType (line 6791) | function parseVoidType() {
  function parseTypeofType (line 6797) | function parseTypeofType() {
  function parseTupleType (line 6806) | function parseTupleType() {
  function parseFunctionTypeParam (line 6823) | function parseFunctionTypeParam() {
  function parseFunctionTypeParams (line 6839) | function parseFunctionTypeParams() {
  function parsePrimaryType (line 6858) | function parsePrimaryType() {
  function parsePostfixType (line 6969) | function parsePostfixType() {
  function parsePrefixType (line 6979) | function parsePrefixType() {
  function parseIntersectionType (line 6991) | function parseIntersectionType() {
  function parseUnionType (line 7007) | function parseUnionType() {
  function parseType (line 7022) | function parseType() {
  function parseTypeAnnotation (line 7032) | function parseTypeAnnotation() {
  function parseVariableIdentifier (line 7041) | function parseVariableIdentifier() {
  function parseTypeAnnotatableIdentifier (line 7052) | function parseTypeAnnotatableIdentifier(requireTypeAnnotation, canBeOpti...
  function parseVariableDeclaration (line 7075) | function parseVariableDeclaration(kind) {
  function parseVariableDeclarationList (line 7117) | function parseVariableDeclarationList(kind) {
  function parseVariableStatement (line 7131) | function parseVariableStatement() {
  function parseConstLetDeclaration (line 7147) | function parseConstLetDeclaration(kind) {
  function parseModuleSpecifier (line 7161) | function parseModuleSpecifier() {
  function parseExportBatchSpecifier (line 7173) | function parseExportBatchSpecifier() {
  function parseExportSpecifier (line 7179) | function parseExportSpecifier() {
  function parseExportDeclaration (line 7196) | function parseExportDeclaration() {
  function parseImportSpecifier (line 7308) | function parseImportSpecifier() {
  function parseNamedImports (line 7321) | function parseNamedImports() {
  function parseImportDefaultSpecifier (line 7334) | function parseImportDefaultSpecifier() {
  function parseImportNamespaceSpecifier (line 7343) | function parseImportNamespaceSpecifier() {
  function parseImportDeclaration (line 7357) | function parseImportDeclaration() {
  function parseEmptyStatement (line 7416) | function parseEmptyStatement() {
  function parseExpressionStatement (line 7424) | function parseExpressionStatement() {
  function parseIfStatement (line 7432) | function parseIfStatement() {
  function parseDoWhileStatement (line 7457) | function parseDoWhileStatement() {
  function parseWhileStatement (line 7484) | function parseWhileStatement() {
  function parseForVariableDeclaration (line 7505) | function parseForVariableDeclaration() {
  function parseForStatement (line 7513) | function parseForStatement(opts) {
  function parseContinueStatement (line 7607) | function parseContinueStatement() {
  function parseBreakStatement (line 7650) | function parseBreakStatement() {
  function parseReturnStatement (line 7693) | function parseReturnStatement() {
  function parseWithStatement (line 7728) | function parseWithStatement() {
  function parseSwitchCase (line 7750) | function parseSwitchCase() {
  function parseSwitchStatement (line 7779) | function parseSwitchStatement() {
  function parseThrowStatement (line 7826) | function parseThrowStatement() {
  function parseCatchClause (line 7844) | function parseCatchClause() {
  function parseTryStatement (line 7865) | function parseTryStatement() {
  function parseDebuggerStatement (line 7890) | function parseDebuggerStatement() {
  function parseStatement (line 7901) | function parseStatement() {
  function parseConciseBody (line 7989) | function parseConciseBody() {
  function parseFunctionSourceElements (line 7996) | function parseFunctionSourceElements() {
  function validateParam (line 8062) | function validateParam(options, param, name) {
  function parseParam (line 8087) | function parseParam(options) {
  function parseParams (line 8152) | function parseParams(firstRestricted) {
  function parseFunctionDeclaration (line 8188) | function parseFunctionDeclaration() {
  function parseFunctionExpression (line 8270) | function parseFunctionExpression() {
  function parseYieldExpression (line 8356) | function parseYieldExpression() {
  function parseAwaitExpression (line 8372) | function parseAwaitExpression() {
  function specialMethod (line 8386) | function specialMethod(methodDefinition) {
  function parseMethodDefinition (line 8392) | function parseMethodDefinition(key, isStatic, generator, computed) {
  function parseClassProperty (line 8472) | function parseClassProperty(key, computed, isStatic) {
  function parseClassElement (line 8486) | function parseClassElement() {
  function parseClassBody (line 8528) | function parseClassBody() {
  function parseClassImplements (line 8572) | function parseClassImplements() {
  function parseClassExpression (line 8599) | function parseClassExpression() {
  function parseClassDeclaration (line 8644) | function parseClassDeclaration() {
  function parseSourceElement (line 8683) | function parseSourceElement() {
  function parseProgramElement (line 8740) | function parseProgramElement() {
  function parseProgramElements (line 8755) | function parseProgramElements() {
  function parseProgram (line 8793) | function parseProgram() {
  function getQualifiedJSXName (line 9059) | function getQualifiedJSXName(object) {
  function isJSXIdentifierStart (line 9077) | function isJSXIdentifierStart(ch) {
  function isJSXIdentifierPart (line 9082) | function isJSXIdentifierPart(ch) {
  function scanJSXIdentifier (line 9087) | function scanJSXIdentifier() {
  function scanJSXEntity (line 9108) | function scanJSXEntity() {
  function scanJSXText (line 9146) | function scanJSXText(stopChars) {
  function scanJSXStringLiteral (line 9179) | function scanJSXStringLiteral() {
  function advanceJSXChild (line 9206) | function advanceJSXChild() {
  function parseJSXIdentifier (line 9217) | function parseJSXIdentifier() {
  function parseJSXNamespacedName (line 9228) | function parseJSXNamespacedName() {
  function parseJSXMemberExpression (line 9238) | function parseJSXMemberExpression() {
  function parseJSXElementName (line 9250) | function parseJSXElementName() {
  function parseJSXAttributeName (line 9261) | function parseJSXAttributeName() {
  function parseJSXAttributeValue (line 9269) | function parseJSXAttributeValue() {
  function parseJSXEmptyExpression (line 9291) | function parseJSXEmptyExpression() {
  function parseJSXExpressionContainer (line 9299) | function parseJSXExpressionContainer() {
  function parseJSXSpreadAttribute (line 9323) | function parseJSXSpreadAttribute() {
  function parseJSXAttribute (line 9344) | function parseJSXAttribute() {
  function parseJSXChild (line 9364) | function parseJSXChild() {
  function parseJSXClosingElement (line 9379) | function parseJSXClosingElement() {
  function parseJSXOpeningElement (line 9397) | function parseJSXOpeningElement() {
  function parseJSXElement (line 9432) | function parseJSXElement() {
  function parseTypeAlias (line 9472) | function parseTypeAlias() {
  function parseInterfaceExtends (line 9485) | function parseInterfaceExtends() {
  function parseInterfaceish (line 9499) | function parseInterfaceish(marker, allowStatic) {
  function parseInterface (line 9531) | function parseInterface() {
  function parseDeclareClass (line 9543) | function parseDeclareClass() {
  function parseDeclareFunction (line 9553) | function parseDeclareFunction() {
  function parseDeclareVariable (line 9595) | function parseDeclareVariable() {
  function parseDeclareModule (line 9608) | function parseDeclareModule() {
  function collectToken (line 9649) | function collectToken() {
  function collectRegex (line 9691) | function collectRegex() {
  function filterTokenLocation (line 9734) | function filterTokenLocation() {
  function patch (line 9761) | function patch() {
  function unpatch (line 9771) | function unpatch() {
  function extend (line 9780) | function extend(object, properties) {
  function tokenize (line 9800) | function tokenize(code, options) {
  function parse (line 9892) | function parse(code, options) {
  function ArraySet (line 10070) | function ArraySet() {
  function toVLQSigned (line 10222) | function toVLQSigned(aValue) {
  function fromVLQSigned (line 10234) | function fromVLQSigned(aValue) {
  function recursiveSearch (line 10360) | function recursiveSearch(aLow, aHigh, aNeedle, aHaystack, aCompare) {
  function SourceMapConsumer (line 10469) | function SourceMapConsumer(aSourceMap) {
  function SourceMapGenerator (line 10925) | function SourceMapGenerator(aArgs) {
  function SourceNode (line 11310) | function SourceNode(aLine, aColumn, aSource, aChunks, aName) {
  function addMappingWithCode (line 11410) | function addMappingWithCode(mapping, code) {
  function getArg (line 11678) | function getArg(aArgs, aName, aDefaultValue) {
  function urlParse (line 11692) | function urlParse(aUrl) {
  function urlGenerate (line 11707) | function urlGenerate(aParsedUrl) {
  function join (line 11725) | function join(aRoot, aPath) {
  function toSetString (line 11750) | function toSetString(aStr) {
  function fromSetString (line 11755) | function fromSetString(aStr) {
  function relative (line 11760) | function relative(aRoot, aPath) {
  function strcmp (line 11774) | function strcmp(aStr1, aStr2) {
  function compareByOriginalPositions (line 11788) | function compareByOriginalPositions(mappingA, mappingB, onlyCompareOrigi...
  function compareByGeneratedPositions (line 11829) | function compareByGeneratedPositions(mappingA, mappingB, onlyCompareGene...
  function amdefine (line 11885) | function amdefine(module, requireFn) {
  function extract (line 12189) | function extract(contents) {
  function parse (line 12209) | function parse(docblock) {
  function parseAsObject (line 12240) | function parseAsObject(docblock) {
  function _nodeIsClosureScopeBoundary (line 12288) | function _nodeIsClosureScopeBoundary(node, parentNode) {
  function _nodeIsBlockScopeBoundary (line 12306) | function _nodeIsBlockScopeBoundary(node, parentNode) {
  function traverse (line 12320) | function traverse(node, path, state) {
  function collectClosureIdentsAndTraverse (line 12437) | function collectClosureIdentsAndTraverse(node, path, state) {
  function collectBlockIdentsAndTraverse (line 12447) | function collectBlockIdentsAndTraverse(node, path, state) {
  function visitLocalClosureIdentifiers (line 12457) | function visitLocalClosureIdentifiers(node, path, state) {
  function visitLocalBlockIdentifiers (line 12483) | function visitLocalBlockIdentifiers(node, path, state) {
  function walker (line 12490) | function walker(node, path, state) {
  function getAstForSource (line 12501) | function getAstForSource(source, options) {
  function transform (line 12524) | function transform(visitors, source, options) {
  function createState (line 12589) | function createState(source, rootNode, transformOptions) {
  function updateState (line 12741) | function updateState(state, update) {
  function catchup (line 12758) | function catchup(end, state, contentTransformer) {
  function getNodeSourceText (line 12814) | function getNodeSourceText(node, state) {
  function _replaceNonWhite (line 12818) | function _replaceNonWhite(value) {
  function _stripNonWhite (line 12825) | function _stripNonWhite(value) {
  function getNextSyntacticCharOffset (line 12841) | function getNextSyntacticCharOffset(char, state) {
  function catchupWhiteOut (line 12890) | function catchupWhiteOut(end, state) {
  function catchupWhiteSpace (line 12897) | function catchupWhiteSpace(end, state) {
  function stripNonNewline (line 12905) | function stripNonNewline(value) {
  function catchupNewlines (line 12917) | function catchupNewlines(end, state) {
  function move (line 12928) | function move(end, state) {
  function append (line 12954) | function append(str, state) {
  function updateIndent (line 12980) | function updateIndent(str, state) {
  function indentBefore (line 13008) | function indentBefore(start, state) {
  function getDocblock (line 13021) | function getDocblock(state) {
  function identWithinLexicalScope (line 13030) | function identWithinLexicalScope(identName, state, stopBeforeNode) {
  function identInLocalScope (line 13046) | function identInLocalScope(identName, state) {
  function initScopeMetadata (line 13055) | function initScopeMetadata(boundaryNode, path, node) {
  function declareIdentInLocalScope (line 13063) | function declareIdentInLocalScope(identName, metaData, state) {
  function getLexicalBindingMetadata (line 13072) | function getLexicalBindingMetadata(identName, state) {
  function getLocalBindingMetadata (line 13083) | function getLocalBindingMetadata(identName, state) {
  function analyzeAndTraverse (line 13098) | function analyzeAndTraverse(analyzer, traverser, node, path, state) {
  function getOrderedChildren (line 13128) | function getOrderedChildren(node) {
  function enqueueNodeWithStartIndex (line 13151) | function enqueueNodeWithStartIndex(queue, node) {
  function containsChildOfType (line 13170) | function containsChildOfType(node, type) {
  function containsChildMatching (line 13176) | function containsChildMatching(node, matcher) {
  function getBoundaryNode (line 13204) | function getBoundaryNode(path) {
  function getTempVar (line 13216) | function getTempVar(tempVarIndex) {
  function injectTempVar (line 13220) | function injectTempVar(state) {
  function injectTempVarDeclarations (line 13226) | function injectTempVarDeclarations(state, index) {
  function visitArrowFunction (line 13315) | function visitArrowFunction(traverse, node, path, state) {
  function renderParams (line 13361) | function renderParams(traverse, node, path, state) {
  function isParensFreeSingleParam (line 13375) | function isParensFreeSingleParam(node, state) {
  function renderExpressionBody (line 13380) | function renderExpressionBody(traverse, node, path, state) {
  function renderStatementBody (line 13411) | function renderStatementBody(traverse, node, path, state) {
  function process (line 13443) | function process(traverse, node, path, state) {
  function visitCallSpread (line 13449) | function visitCallSpread(traverse, node, path, state) {
  function resetSymbols (line 13571) | function resetSymbols() {
  function _generateAnonymousClassName (line 13583) | function _generateAnonymousClassName(state) {
  function _getMungedName (line 13595) | function _getMungedName(identName, state) {
  function _getSuperClassInfo (line 13627) | function _getSuperClassInfo(node, state) {
  function _isConstructorMethod (line 13654) | function _isConstructorMethod(classElement) {
  function _shouldMungeIdentifier (line 13665) | function _shouldMungeIdentifier(node, state) {
  function visitClassMethod (line 13679) | function visitClassMethod(traverse, node, path, state) {
  function visitClassFunctionExpression (line 13706) | function visitClassFunctionExpression(traverse, node, path, state) {
  function visitClassMethodParam (line 13823) | function visitClassMethodParam(traverse, node, path, state) {
  function _renderClassBody (line 13850) | function _renderClassBody(traverse, node, path, state) {
  function visitClassDeclaration (line 13940) | function visitClassDeclaration(traverse, node, path, state) {
  function visitClassExpression (line 13964) | function visitClassExpression(traverse, node, path, state) {
  function visitPrivateIdentifier (line 13991) | function visitPrivateIdentifier(traverse, node, path, state) {
  function visitSuperCallExpression (line 14037) | function visitSuperCallExpression(traverse, node, path, state) {
  function visitSuperMemberExpression (line 14098) | function visitSuperMemberExpression(traverse, node, path, state) {
  function visitStructuredVariable (line 14178) | function visitStructuredVariable(traverse, node, path, state) {
  function isStructuredPattern (line 14196) | function isStructuredPattern(node) {
  function getDestructuredComponents (line 14203) | function getDestructuredComponents(node, state) {
  function getPatternItems (line 14255) | function getPatternItems(node) {
  function getPatternItemAccessor (line 14259) | function getPatternItemAccessor(node, patternItem, tmpIndex, idx) {
  function getPatternItemValue (line 14274) | function getPatternItemValue(node, patternItem) {
  function visitStructuredAssignment (line 14287) | function visitStructuredAssignment(traverse, node, path, state) {
  function visitStructuredParameter (line 14320) | function visitStructuredParameter(traverse, node, path, state) {
  function getParamIndex (line 14326) | function getParamIndex(paramNode, path) {
  function isFunctionNode (line 14345) | function isFunctionNode(node) {
  function visitFunctionBodyForStructuredParameter (line 14358) | function visitFunctionBodyForStructuredParameter(traverse, node, path, s...
  function renderDestructuredComponents (line 14374) | function renderDestructuredComponents(funcNode, state) {
  function visitObjectConciseMethod (line 14442) | function visitObjectConciseMethod(traverse, node, path, state) {
  function visitObjectLiteralShortNotation (line 14514) | function visitObjectLiteralShortNotation(traverse, node, path, state) {
  function _nodeIsFunctionWithRestParam (line 14573) | function _nodeIsFunctionWithRestParam(node) {
  function visitFunctionParamsWithRestParam (line 14580) | function visitFunctionParamsWithRestParam(traverse, node, path, state) {
  function renderRestParamSetup (line 14610) | function renderRestParamSetup(functionNode, state) {
  function visitFunctionBodyWithRestParam (line 14622) | function visitFunctionBodyWithRestParam(traverse, node, path, state) {
  function visitTemplateLiteral (line 14670) | function visitTemplateLiteral(traverse, node, path, state) {
  function visitTaggedTemplateExpression (line 14726) | function visitTaggedTemplateExpression(traverse, node, path, state) {
  function getCookedValue (line 14785) | function getCookedValue(templateElement) {
  function getRawValue (line 14789) | function getRawValue(templateElement) {
  function getPropertyNames (line 14840) | function getPropertyNames(properties) {
  function getRestFunctionCall (line 14856) | function getRestFunctionCall(source, exclusion) {
  function getSimpleShallowCopy (line 14860) | function getSimpleShallowCopy(accessorExpression) {
  function renderRestExpression (line 14867) | function renderRestExpression(accessorExpression, excludedProperties) {
  function visitObjectLiteralSpread (line 14899) | function visitObjectLiteralSpread(traverse, node, path, state) {
  function visitProperty (line 15095) | function visitProperty(traverse, node, path, state) {
  function visitMemberExpression (line 15114) | function visitMemberExpression(traverse, node, path, state) {
  function _isFunctionNode (line 15142) | function _isFunctionNode(node) {
  function visitClassProperty (line 15148) | function visitClassProperty(traverse, node, path, state) {
  function visitTypeAlias (line 15157) | function visitTypeAlias(traverse, node, path, state) {
  function visitTypeCast (line 15165) | function visitTypeCast(traverse, node, path, state) {
  function visitInterfaceDeclaration (line 15178) | function visitInterfaceDeclaration(traverse, node, path, state) {
  function visitDeclare (line 15186) | function visitDeclare(traverse, node, path, state) {
  function visitFunctionParametricAnnotation (line 15201) | function visitFunctionParametricAnnotation(traverse, node, path, state) {
  function visitFunctionReturnAnnotation (line 15213) | function visitFunctionReturnAnnotation(traverse, node, path, state) {
  function visitOptionalFunctionParameterAnnotation (line 15222) | function visitOptionalFunctionParameterAnnotation(traverse, node, path, ...
  function visitTypeAnnotatedIdentifier (line 15234) | function visitTypeAnnotatedIdentifier(traverse, node, path, state) {
  function visitTypeAnnotatedObjectOrArrayPattern (line 15243) | function visitTypeAnnotatedObjectOrArrayPattern(traverse, node, path, st...
  function visitMethod (line 15265) | function visitMethod(traverse, node, path, state) {
  function visitImportType (line 15286) | function visitImportType(traverse, node, path, state) {
  function renderJSXLiteral (line 15324) | function renderJSXLiteral(object, isLast, state, start, end) {
  function renderJSXExpressionContainer (line 15388) | function renderJSXExpressionContainer(traverse, object, isLast, path, st...
  function quoteAttrName (line 15406) | function quoteAttrName(attr) {
  function trimLeft (line 15414) | function trimLeft(value) {
  function stripNonWhiteParen (line 15460) | function stripNonWhiteParen(value) {
  function isTagName (line 15465) | function isTagName(name) {
  function visitReactTag (line 15469) | function visitReactTag(traverse, object, path, state) {
  function addDisplayName (line 15682) | function addDisplayName(displayName, object, state) {
  function visitReactDisplayName (line 15728) | function visitReactDisplayName(traverse, object, path, state) {
  function getAllVisitors (line 15847) | function getAllVisitors(excludes) {
  function getVisitorsBySet (line 15864) | function getVisitorsBySet(sets) {
  function inlineSourceMap (line 15903) | function inlineSourceMap(sourceMap, sourceCode, sourceFilename) {

FILE: lib/assets/javascripts/react_ujs.js
  function d (line 1) | function d(){return"function"==typeof i.hydrate||"function"==typeof i.hy...
  function s (line 1) | function s(e,t){return"function"==typeof i.hydrateRoot?i.hydrateRoot(e,t...
  function _ (line 1) | function _(e){return u()?i.createRoot(e):function(e){return{render:t=>i....
  function __webpack_require__ (line 1) | function __webpack_require__(e){var t=__webpack_module_cache__[e];if(voi...

FILE: lib/assets/react-source/development/react-server.js
  function __webpack_require__ (line 451) | function __webpack_require__(moduleId) {

FILE: lib/assets/react-source/development/react.js
  function __webpack_require__ (line 202) | function __webpack_require__(moduleId) {

FILE: lib/assets/react-source/production/react-server.js
  function a (line 2) | function a(e,t,r,n,o,a,i,u){if(!e){var l;if(void 0===t)l=new Error("Mini...
  function f (line 2) | function f(e,t){var r=l.hasOwnProperty(t)?l[t]:null;v.hasOwnProperty(t)&...
  function p (line 2) | function p(e,r){if(r){a("function"!=typeof r,"ReactClass: You're attempt...
  function d (line 2) | function d(e,t){for(var r in a(e&&t&&"object"==typeof e&&"object"==typeo...
  function h (line 2) | function h(e,t){return function(){var r=e.apply(this,arguments),n=t.appl...
  function y (line 2) | function y(e,t){return function(){e.apply(this,arguments),t.apply(this,a...
  function g (line 2) | function g(e,t){return t.bind(e)}
  function t (line 2) | function t(e){for(var t=0,r=Math.min(65536,e.length+1),n=new Uint16Array...
  function i (line 2) | function i(){this.encoding="utf-8"}
  function p (line 2) | function p(e,t){if(n(t&&t.fatal,c,"fatal"),e=e||"utf-8",!(o?Buffer.isEnc...
  function o (line 2) | function o(){throw new Error("setTimeout has not been defined")}
  function a (line 2) | function a(){throw new Error("clearTimeout has not been defined")}
  function i (line 2) | function i(e){if(t===setTimeout)return setTimeout(e,0);if((t===o||!t)&&s...
  function f (line 2) | function f(){s&&u&&(s=!1,u.length?l=u.concat(l):c=-1,l.length&&p())}
  function p (line 2) | function p(){if(!s){var e=i(f);s=!0;for(var t=l.length;t;){for(u=l,l=[];...
  function d (line 2) | function d(e,t){this.fun=e,this.array=t}
  function h (line 2) | function h(){}
  function o (line 2) | function o(){}
  function a (line 2) | function a(){}
  function e (line 2) | function e(e,t,r,o,a,i){if(i!==n){var u=new Error("Calling PropTypes val...
  function t (line 2) | function t(){return e}
  function o (line 2) | function o(e){for(var t="https://reactjs.org/docs/error-decoder.html?inv...
  function s (line 2) | function s(e){return!!a.call(l,e)||!a.call(u,e)&&(i.test(e)?l[e]=!0:(u[e...
  function c (line 2) | function c(e,t,r,n,o,a,i){this.acceptsBooleans=2===t||3===t||4===t,this....
  function d (line 2) | function d(e){return e[1].toUpperCase()}
  function m (line 2) | function m(e){if("boolean"==typeof e||"number"==typeof e)return""+e;e=""...
  function w (line 2) | function w(e,t){return{insertionMode:e,selectedValue:t}}
  function k (line 2) | function k(e,t,r){if("object"!=typeof r)throw Error(o(62));for(var n in ...
  function E (line 2) | function E(e,t,r,n){switch(r){case"style":return void k(e,t,n);case"defa...
  function C (line 2) | function C(e,t,r){if(null!=t){if(null!=r)throw Error(o(60));if("object"!...
  function A (line 2) | function A(e,t,r,n){e.push(_(r));var o,i=r=null;for(o in t)if(a.call(t,o...
  function _ (line 2) | function _(e){var t=P.get(e);if(void 0===t){if(!F.test(e))throw Error(o(...
  function T (line 2) | function T(e,t,r){if(e.push('\x3c!--$?--\x3e<template id="'),null===r)th...
  function O (line 2) | function O(e){return JSON.stringify(e).replace(R,(function(e){switch(e){...
  function j (line 2) | function j(e,t,r,n){return r.generateStaticMarkup?(e.push(m(t)),!1):(""=...
  function K (line 2) | function K(e){if(null==e)return null;if("function"==typeof e)return e.di...
  function ee (line 2) | function ee(e,t){if(!(e=e.contextTypes))return Q;var r,n={};for(r in e)n...
  function re (line 2) | function re(e,t){if(e!==t){e.context._currentValue2=e.parentValue,e=e.pa...
  function ne (line 2) | function ne(e){e.context._currentValue2=e.parentValue,null!==(e=e.parent...
  function oe (line 2) | function oe(e){var t=e.parent;null!==t&&oe(t),e.context._currentValue2=e...
  function ae (line 2) | function ae(e,t){if(e.context._currentValue2=e.parentValue,null===(e=e.p...
  function ie (line 2) | function ie(e,t){var r=t.parent;if(null===r)throw Error(o(402));e.depth=...
  function ue (line 2) | function ue(e){var t=te;t!==e&&(null===t?oe(e):null===e?ne(t):t.depth===...
  function se (line 2) | function se(e,t,r,n){var o=void 0!==e.state?e.state:null;e.updater=le,e....
  function fe (line 2) | function fe(e,t,r){var n=e.id;e=e.overflow;var o=32-pe(n)-1;n&=~(1<<o),r...
  function Ce (line 2) | function Ce(){if(null===ge)throw Error(o(321));return ge}
  function Ae (line 2) | function Ae(){if(0<Ee)throw Error(o(312));return{memoizedState:null,queu...
  function Fe (line 2) | function Fe(){return null===ve?null===be?(Se=!1,be=ve=Ae()):(Se=!0,ve=be...
  function Pe (line 2) | function Pe(){me=ge=null,we=!1,be=null,Ee=0,ve=ke=null}
  function _e (line 2) | function _e(e,t){return"function"==typeof t?t(e):t}
  function Te (line 2) | function Te(e,t,r){if(ge=Ce(),ve=Fe(),Se){var n=ve.queue;if(t=n.dispatch...
  function Re (line 2) | function Re(e,t){if(ge=Ce(),t=void 0===t?null:t,null!==(ve=Fe())){var r=...
  function Oe (line 2) | function Oe(e,t,r){if(25<=Ee)throw Error(o(301));if(e===ge)if(we=!0,e={a...
  function je (line 2) | function je(){throw Error(o(394))}
  function Ie (line 2) | function Ie(){}
  function Be (line 2) | function Be(e){return console.error(e),null}
  function Ue (line 2) | function Ue(){}
  function $e (line 2) | function $e(e,t,r,n,o,a,i,u){e.allPendingTasks++,null===r?e.pendingRootT...
  function ze (line 2) | function ze(e,t,r,n,o,a){return{status:0,id:-1,index:t,parentFlushed:!1,...
  function Ve (line 2) | function Ve(e,t){if(null!=(e=e.onError(t))&&"string"!=typeof e)throw Err...
  function Le (line 2) | function Le(e,t){var r=e.onShellError;r(t),(r=e.onFatalError)(t),null!==...
  function We (line 2) | function We(e,t,r,n,o){for(ge={},me=t,xe=0,e=r(n,o);we;)we=!1,xe=0,Ee+=1...
  function qe (line 2) | function qe(e,t,r,n){var a=r.render(),i=n.childContextTypes;if(null!=i){...
  function He (line 2) | function He(e,t){if(e&&e.defaultProps){for(var r in t=I({},t),e=e.defaul...
  function Ge (line 2) | function Ge(e,t,r,i,u){if("function"==typeof r)if(r.prototype&&r.prototy...
  function Ye (line 2) | function Ye(e,t,r){if(t.node=r,"object"==typeof r&&null!==r){switch(r.$$...
  function Je (line 2) | function Je(e,t,r){for(var n=r.length,o=0;o<n;o++){var a=t.treeContext;t...
  function Ze (line 2) | function Ze(e,t,r){var n=t.blockedSegment.formatContext,o=t.legacyContex...
  function Xe (line 2) | function Xe(e){var t=e.blockedBoundary;(e=e.blockedSegment).status=3,et(...
  function Ke (line 2) | function Ke(e,t,r){var n=e.blockedBoundary;e.blockedSegment.status=3,nul...
  function Qe (line 2) | function Qe(e,t){if(0===t.chunks.length&&1===t.children.length&&null===t...
  function et (line 2) | function et(e,t,r){if(null===t){if(r.parentFlushed){if(null!==e.complete...
  function tt (line 2) | function tt(e){if(2!==e.status){var t=te,r=Ne.current;Ne.current=Me;var ...
  function rt (line 2) | function rt(e,t,r){switch(r.parentFlushed=!0,r.status){case 0:var n=r.id...
  function nt (line 2) | function nt(e,t,r){var n=r.boundary;if(null===n)return rt(e,t,r);if(n.pa...
  function ot (line 2) | function ot(e,t,r){return function(e,t,r,n){switch(r.insertionMode){case...
  function at (line 2) | function at(e,t,r){for(var n=r.completedSegments,a=0;a<n.length;a++)it(e...
  function it (line 2) | function it(e,t,r,n){if(2===n.status)return!0;var a=n.id;if(-1===a){if(-...
  function ut (line 2) | function ut(e,t){try{var r=e.completedRootSegment;if(null!==r&&0===e.pen...
  function lt (line 2) | function lt(e,t){try{var r=e.abortableTasks;r.forEach((function(r){retur...
  function st (line 2) | function st(){}
  function ct (line 2) | function ct(e,t,r,n){var a=!1,i=null,u="",l={push:function(e){return nul...
  function o (line 2) | function o(e){for(var t="https://reactjs.org/docs/error-decoder.html?inv...
  function u (line 2) | function u(e,t){if(0!==t.length)if(512<t.length)0<i&&(e.enqueue(new Uint...
  function l (line 2) | function l(e,t){return u(e,t),!0}
  function s (line 2) | function s(e){a&&0<i&&(e.enqueue(new Uint8Array(a.buffer,0,i)),a=null,i=0)}
  function f (line 2) | function f(e){return c.encode(e)}
  function p (line 2) | function p(e){return c.encode(e)}
  function d (line 2) | function d(e,t){"function"==typeof e.error?e.error(t):e.close()}
  function b (line 2) | function b(e){return!!h.call(m,e)||!h.call(g,e)&&(y.test(e)?m[e]=!0:(g[e...
  function v (line 2) | function v(e,t,r,n,o,a,i){this.acceptsBooleans=2===t||3===t||4===t,this....
  function x (line 2) | function x(e){return e[1].toUpperCase()}
  function A (line 2) | function A(e){if("boolean"==typeof e||"number"==typeof e)return""+e;e=""...
  function D (line 2) | function D(e,t,r,n){return t+("s"===r?"\\u0073":"\\u0053")+n}
  function N (line 2) | function N(e,t){return{insertionMode:e,selectedValue:t}}
  function U (line 2) | function U(e,t,r,n){return""===t?n:(n&&e.push(B),e.push(f(A(t))),!0)}
  function W (line 2) | function W(e,t,r){if("object"!=typeof r)throw Error(o(62));for(var n in ...
  function J (line 2) | function J(e,t,r,n){switch(r){case"style":return void W(e,t,n);case"defa...
  function K (line 2) | function K(e,t,r){if(null!=t){if(null!=r)throw Error(o(60));if("object"!...
  function ee (line 2) | function ee(e,t,r,n){e.push(oe(r));var o,a=r=null;for(o in t)if(h.call(t...
  function oe (line 2) | function oe(e){var t=ne.get(e);if(void 0===t){if(!re.test(e))throw Error...
  function ve (line 2) | function ve(e,t,r){if(u(e,fe),null===r)throw Error(o(395));return u(e,r)...
  function tt (line 2) | function tt(e){return JSON.stringify(e).replace(et,(function(e){switch(e...
  function St (line 2) | function St(e){if(null==e)return null;if("function"==typeof e)return e.d...
  function xt (line 2) | function xt(e,t){if(!(e=e.contextTypes))return wt;var r,n={};for(r in e)...
  function Et (line 2) | function Et(e,t){if(e!==t){e.context._currentValue=e.parentValue,e=e.par...
  function Ct (line 2) | function Ct(e){e.context._currentValue=e.parentValue,null!==(e=e.parent)...
  function At (line 2) | function At(e){var t=e.parent;null!==t&&At(t),e.context._currentValue=e....
  function Ft (line 2) | function Ft(e,t){if(e.context._currentValue=e.parentValue,null===(e=e.pa...
  function Pt (line 2) | function Pt(e,t){var r=t.parent;if(null===r)throw Error(o(402));e.depth=...
  function _t (line 2) | function _t(e){var t=kt;t!==e&&(null===t?At(e):null===e?Ct(t):t.depth===...
  function Rt (line 2) | function Rt(e,t,r,n){var o=void 0!==e.state?e.state:null;e.updater=Tt,e....
  function jt (line 2) | function jt(e,t,r){var n=e.id;e=e.overflow;var o=32-It(n)-1;n&=~(1<<o),r...
  function Gt (line 2) | function Gt(){if(null===Bt)throw Error(o(321));return Bt}
  function Yt (line 2) | function Yt(){if(0<Ht)throw Error(o(312));return{memoizedState:null,queu...
  function Jt (line 2) | function Jt(){return null===zt?null===$t?(Vt=!1,$t=zt=Yt()):(Vt=!0,zt=$t...
  function Zt (line 2) | function Zt(){Ut=Bt=null,Lt=!1,$t=null,Ht=0,zt=qt=null}
  function Xt (line 2) | function Xt(e,t){return"function"==typeof t?t(e):t}
  function Kt (line 2) | function Kt(e,t,r){if(Bt=Gt(),zt=Jt(),Vt){var n=zt.queue;if(t=n.dispatch...
  function Qt (line 2) | function Qt(e,t){if(Bt=Gt(),t=void 0===t?null:t,null!==(zt=Jt())){var r=...
  function er (line 2) | function er(e,t,r){if(25<=Ht)throw Error(o(301));if(e===Bt)if(Lt=!0,e={a...
  function tr (line 2) | function tr(){throw Error(o(394))}
  function rr (line 2) | function rr(){}
  function ir (line 2) | function ir(e){return console.error(e),null}
  function ur (line 2) | function ur(){}
  function lr (line 2) | function lr(e,t,r,n,o,a,i,u){e.allPendingTasks++,null===r?e.pendingRootT...
  function sr (line 2) | function sr(e,t,r,n,o,a){return{status:0,id:-1,index:t,parentFlushed:!1,...
  function cr (line 2) | function cr(e,t){if(null!=(e=e.onError(t))&&"string"!=typeof e)throw Err...
  function fr (line 2) | function fr(e,t){var r=e.onShellError;r(t),(r=e.onFatalError)(t),null!==...
  function pr (line 2) | function pr(e,t,r,n,o){for(Bt={},Ut=t,Wt=0,e=r(n,o);Lt;)Lt=!1,Wt=0,Ht+=1...
  function dr (line 2) | function dr(e,t,r,n){var a=r.render(),i=n.childContextTypes;if(null!=i){...
  function hr (line 2) | function hr(e,t){if(e&&e.defaultProps){for(var r in t=rt({},t),e=e.defau...
  function yr (line 2) | function yr(e,t,r,a,i){if("function"==typeof r)if(r.prototype&&r.prototy...
  function gr (line 2) | function gr(e,t,r){if(t.node=r,"object"==typeof r&&null!==r){switch(r.$$...
  function mr (line 2) | function mr(e,t,r){for(var n=r.length,o=0;o<n;o++){var a=t.treeContext;t...
  function br (line 2) | function br(e,t,r){var n=t.blockedSegment.formatContext,o=t.legacyContex...
  function vr (line 2) | function vr(e){var t=e.blockedBoundary;(e=e.blockedSegment).status=3,xr(...
  function Sr (line 2) | function Sr(e,t,r){var n=e.blockedBoundary;e.blockedSegment.status=3,nul...
  function wr (line 2) | function wr(e,t){if(0===t.chunks.length&&1===t.children.length&&null===t...
  function xr (line 2) | function xr(e,t,r){if(null===t){if(r.parentFlushed){if(null!==e.complete...
  function kr (line 2) | function kr(e){if(2!==e.status){var t=kt,r=ar.current;ar.current=nr;var ...
  function Er (line 2) | function Er(e,t,r){switch(r.parentFlushed=!0,r.status){case 0:var n=r.id...
  function Cr (line 2) | function Cr(e,t,r){var n=r.boundary;if(null===n)return Er(e,t,r);if(n.pa...
  function Ar (line 2) | function Ar(e,t,r){return function(e,t,r,n){switch(r.insertionMode){case...
  function Fr (line 2) | function Fr(e,t,r){for(var n=r.completedSegments,a=0;a<n.length;a++)Pr(e...
  function Pr (line 2) | function Pr(e,t,r,n){if(2===n.status)return!0;var a=n.id;if(-1===a){if(-...
  function _r (line 2) | function _r(e,t){a=new Uint8Array(512),i=0;try{var r=e.completedRootSegm...
  function Tr (line 2) | function Tr(e,t){try{var r=e.abortableTasks;r.forEach((function(r){retur...
  function m (line 2) | function m(e,t,r){this.props=e,this.context=t,this.refs=g,this.updater=r...
  function b (line 2) | function b(){}
  function v (line 2) | function v(e,t,r){this.props=e,this.context=t,this.refs=g,this.updater=r...
  function C (line 2) | function C(e,t,n){var o,a={},i=null,u=null;if(null!=t)for(o in void 0!==...
  function A (line 2) | function A(e){return"object"==typeof e&&null!==e&&e.$$typeof===r}
  function P (line 2) | function P(e,t){return"object"==typeof e&&null!==e&&null!=e.key?function...
  function _ (line 2) | function _(e,t,o,a,i){var u=typeof e;"undefined"!==u&&"boolean"!==u||(e=...
  function T (line 2) | function T(e,t,r){if(null==e)return e;var n=[],o=0;return _(e,n,"","",(f...
  function R (line 2) | function R(e){if(-1===e._status){var t=e._result;(t=t()).then((function(...
  function u (line 2) | function u(e){return e.call.bind(e)}
  function g (line 2) | function g(e,t){if("object"!=typeof e)return!1;try{return t(e),!0}catch(...
  function m (line 2) | function m(e){return"[object Map]"===c(e)}
  function b (line 2) | function b(e){return"[object Set]"===c(e)}
  function v (line 2) | function v(e){return"[object WeakMap]"===c(e)}
  function S (line 2) | function S(e){return"[object WeakSet]"===c(e)}
  function w (line 2) | function w(e){return"[object ArrayBuffer]"===c(e)}
  function x (line 2) | function x(e){return"undefined"!=typeof ArrayBuffer&&(w.working?w(e):e i...
  function k (line 2) | function k(e){return"[object DataView]"===c(e)}
  function E (line 2) | function E(e){return"undefined"!=typeof DataView&&(k.working?k(e):e inst...
  function A (line 2) | function A(e){return"[object SharedArrayBuffer]"===c(e)}
  function F (line 2) | function F(e){return void 0!==C&&(void 0===A.working&&(A.working=A(new C...
  function P (line 2) | function P(e){return g(e,f)}
  function _ (line 2) | function _(e){return g(e,p)}
  function T (line 2) | function T(e){return g(e,d)}
  function R (line 2) | function R(e){return l&&g(e,h)}
  function O (line 2) | function O(e){return s&&g(e,y)}
  function s (line 2) | function s(e,r){var n={seen:[],stylize:f};return arguments.length>=3&&(n...
  function c (line 2) | function c(e,t){var r=s.styles[t];return r?"["+s.colors[r][0]+"m"+e+"[...
  function f (line 2) | function f(e,t){return e}
  function p (line 2) | function p(e,r,n){if(e.customInspect&&r&&C(r.inspect)&&r.inspect!==t.ins...
  function d (line 2) | function d(e){return"["+Error.prototype.toString.call(e)+"]"}
  function h (line 2) | function h(e,t,r,n,o,a){var i,u,l;if((l=Object.getOwnPropertyDescriptor(...
  function y (line 2) | function y(e){return Array.isArray(e)}
  function g (line 2) | function g(e){return"boolean"==typeof e}
  function m (line 2) | function m(e){return null===e}
  function b (line 2) | function b(e){return"number"==typeof e}
  function v (line 2) | function v(e){return"string"==typeof e}
  function S (line 2) | function S(e){return void 0===e}
  function w (line 2) | function w(e){return x(e)&&"[object RegExp]"===A(e)}
  function x (line 2) | function x(e){return"object"==typeof e&&null!==e}
  function k (line 2) | function k(e){return x(e)&&"[object Date]"===A(e)}
  function E (line 2) | function E(e){return x(e)&&("[object Error]"===A(e)||e instanceof Error)}
  function C (line 2) | function C(e){return"function"==typeof e}
  function A (line 2) | function A(e){return Object.prototype.toString.call(e)}
  function F (line 2) | function F(e){return e<10?"0"+e.toString(10):e.toString(10)}
  function _ (line 2) | function _(e,t){return Object.prototype.hasOwnProperty.call(e,t)}
  function R (line 2) | function R(e,t){if(!e){var r=new Error("Promise was rejected with a fals...
  function t (line 2) | function t(){for(var t,r,n=new Promise((function(e,n){t=e,r=n})),o=[],a=...
  function t (line 2) | function t(){for(var t=[],r=0;r<arguments.length;r++)t.push(arguments[r]...
  function r (line 2) | function r(n){var o=t[n];if(void 0!==o)return o.exports;var a=t[n]={expo...

FILE: lib/assets/react-source/production/react.js
  function a (line 2) | function a(e,n,t,r,l,a,o,u){if(!e){var i;if(void 0===n)i=new Error("Mini...
  function f (line 2) | function f(e,n){var t=i.hasOwnProperty(n)?i[n]:null;b.hasOwnProperty(n)&...
  function d (line 2) | function d(e,t){if(t){a("function"!=typeof t,"ReactClass: You're attempt...
  function p (line 2) | function p(e,n){for(var t in a(e&&n&&"object"==typeof e&&"object"==typeo...
  function m (line 2) | function m(e,n){return function(){var t=e.apply(this,arguments),r=n.appl...
  function h (line 2) | function h(e,n){return function(){e.apply(this,arguments),n.apply(this,a...
  function g (line 2) | function g(e,n){return n.bind(e)}
  function l (line 2) | function l(){}
  function a (line 2) | function a(){}
  function e (line 2) | function e(e,n,t,l,a,o){if(o!==r){var u=new Error("Calling PropTypes val...
  function n (line 2) | function n(){return e}
  function a (line 2) | function a(e){for(var n="https://reactjs.org/docs/error-decoder.html?inv...
  function i (line 2) | function i(e,n){s(e,n),s(e+"Capture",n)}
  function s (line 2) | function s(e,n){for(u[e]=n,e=0;e<n.length;e++)o.add(n[e])}
  function h (line 2) | function h(e,n,t,r,l,a,o){this.acceptsBooleans=2===n||3===n||4===n,this....
  function y (line 2) | function y(e){return e[1].toUpperCase()}
  function b (line 2) | function b(e,n,t,r){var l=g.hasOwnProperty(n)?g[n]:null;(null!==l?0!==l....
  function O (line 2) | function O(e){return null===e||"object"!=typeof e?null:"function"==typeo...
  function U (line 2) | function U(e){if(void 0===F)try{throw Error()}catch(e){var n=e.stack.tri...
  function j (line 2) | function j(e,n){if(!e||A)return"";A=!0;var t=Error.prepareStackTrace;Err...
  function V (line 2) | function V(e){switch(e.tag){case 5:return U(e.type);case 16:return U("La...
  function W (line 2) | function W(e){if(null==e)return null;if("function"==typeof e)return e.di...
  function B (line 2) | function B(e){var n=e.type;switch(e.tag){case 24:return"Cache";case 9:re...
  function $ (line 2) | function $(e){switch(typeof e){case"boolean":case"number":case"string":c...
  function H (line 2) | function H(e){var n=e.type;return(e=e.nodeName)&&"input"===e.toLowerCase...
  function Q (line 2) | function Q(e){e._valueTracker||(e._valueTracker=function(e){var n=H(e)?"...
  function Y (line 2) | function Y(e){if(!e)return!1;var n=e._valueTracker;if(!n)return!0;var t=...
  function q (line 2) | function q(e){if(void 0===(e=e||("undefined"!=typeof document?document:v...
  function K (line 2) | function K(e,n){var t=n.checked;return I({},n,{defaultChecked:void 0,def...
  function G (line 2) | function G(e,n){var t=null==n.defaultValue?"":n.defaultValue,r=null!=n.c...
  function X (line 2) | function X(e,n){null!=(n=n.checked)&&b(e,"checked",n,!1)}
  function Z (line 2) | function Z(e,n){X(e,n);var t=$(n.value),r=n.type;if(null!=t)"number"===r...
  function J (line 2) | function J(e,n,t){if(n.hasOwnProperty("value")||n.hasOwnProperty("defaul...
  function ee (line 2) | function ee(e,n,t){"number"===n&&q(e.ownerDocument)===e||(null==t?e.defa...
  function te (line 2) | function te(e,n,t,r){if(e=e.options,n){n={};for(var l=0;l<t.length;l++)n...
  function re (line 2) | function re(e,n){if(null!=n.dangerouslySetInnerHTML)throw Error(a(91));r...
  function le (line 2) | function le(e,n){var t=n.value;if(null==t){if(t=n.children,n=n.defaultVa...
  function ae (line 2) | function ae(e,n){var t=$(n.value),r=$(n.defaultValue);null!=t&&((t=""+t)...
  function oe (line 2) | function oe(e){var n=e.textContent;n===e._wrapperState.initialValue&&""!...
  function ue (line 2) | function ue(e){switch(e){case"svg":return"http://www.w3.org/2000/svg";ca...
  function ie (line 2) | function ie(e,n){return null==e||"http://www.w3.org/1999/xhtml"===e?ue(n...
  function de (line 2) | function de(e,n){if(n){var t=e.firstChild;if(t&&t===e.lastChild&&3===t.n...
  function he (line 2) | function he(e,n,t){return null==n||"boolean"==typeof n||""===n?"":t||"nu...
  function ge (line 2) | function ge(e,n){for(var t in e=e.style,n)if(n.hasOwnProperty(t)){var r=...
  function ye (line 2) | function ye(e,n){if(n){if(ve[e]&&(null!=n.children||null!=n.dangerouslyS...
  function be (line 2) | function be(e,n){if(-1===e.indexOf("-"))return"string"==typeof n.is;swit...
  function ke (line 2) | function ke(e){return(e=e.target||e.srcElement||window).correspondingUse...
  function _e (line 2) | function _e(e){if(e=bl(e)){if("function"!=typeof Se)throw Error(a(280));...
  function Ce (line 2) | function Ce(e){Ee?xe?xe.push(e):xe=[e]:Ee=e}
  function Ne (line 2) | function Ne(){if(Ee){var e=Ee,n=xe;if(xe=Ee=null,_e(e),n)for(e=0;e<n.len...
  function Pe (line 2) | function Pe(e,n){return e(n)}
  function ze (line 2) | function ze(){}
  function Me (line 2) | function Me(e,n,t){if(Te)return e(n,t);Te=!0;try{return Pe(e,n,t)}finall...
  function De (line 2) | function De(e,n){var t=e.stateNode;if(null===t)return null;var r=kl(t);i...
  function Oe (line 2) | function Oe(e,n,t,r,l,a,o,u,i){var s=Array.prototype.slice.call(argument...
  function Ve (line 2) | function Ve(e,n,t,r,l,a,o,u,i){Fe=!1,Ie=null,Oe.apply(je,arguments)}
  function We (line 2) | function We(e){var n=e,t=e;if(e.alternate)for(;n.return;)n=n.return;else...
  function Be (line 2) | function Be(e){if(13===e.tag){var n=e.memoizedState;if(null===n&&null!==...
  function $e (line 2) | function $e(e){if(We(e)!==e)throw Error(a(188))}
  function He (line 2) | function He(e){return null!==(e=function(e){var n=e.alternate;if(!n){if(...
  function Qe (line 2) | function Qe(e){if(5===e.tag||6===e.tag)return e;for(e=e.child;null!==e;)...
  function dn (line 2) | function dn(e){switch(e&-e){case 1:return 1;case 2:return 2;case 4:retur...
  function pn (line 2) | function pn(e,n){var t=e.pendingLanes;if(0===t)return 0;var r=0,l=e.susp...
  function mn (line 2) | function mn(e,n){switch(e){case 1:case 2:case 4:return n+250;case 8:case...
  function hn (line 2) | function hn(e){return 0!=(e=-1073741825&e.pendingLanes)?e:1073741824&e?1...
  function gn (line 2) | function gn(){var e=cn;return 0==(4194240&(cn<<=1))&&(cn=64),e}
  function vn (line 2) | function vn(e){for(var n=[],t=0;31>t;t++)n.push(e);return n}
  function yn (line 2) | function yn(e,n,t){e.pendingLanes|=n,536870912!==n&&(e.suspendedLanes=0,...
  function bn (line 2) | function bn(e,n){var t=e.entangledLanes|=n;for(e=e.entanglements;t;){var...
  function kn (line 2) | function kn(e){return 1<(e&=-e)?4<e?0!=(268435455&e)?16:536870912:4:1}
  function Fn (line 2) | function Fn(e,n){switch(e){case"focusin":case"focusout":zn=null;break;ca...
  function In (line 2) | function In(e,n,t,r,l,a){return null===e||e.nativeEvent!==a?(e={blockedO...
  function Un (line 2) | function Un(e){var n=yl(e.target);if(null!==n){var t=We(n);if(null!==t)i...
  function An (line 2) | function An(e){if(null!==e.blockedOn)return!1;for(var n=e.targetContaine...
  function jn (line 2) | function jn(e,n,t){An(e)&&t.delete(n)}
  function Vn (line 2) | function Vn(){Nn=!1,null!==zn&&An(zn)&&(zn=null),null!==Tn&&An(Tn)&&(Tn=...
  function Wn (line 2) | function Wn(e,n){e.blockedOn===n&&(e.blockedOn=null,Nn||(Nn=!0,l.unstabl...
  function Bn (line 2) | function Bn(e){function n(n){return Wn(n,e)}if(0<Pn.length){Wn(Pn[0],e);...
  function Qn (line 2) | function Qn(e,n,t,r){var l=wn,a=$n.transition;$n.transition=null;try{wn=...
  function Yn (line 2) | function Yn(e,n,t,r){var l=wn,a=$n.transition;$n.transition=null;try{wn=...
  function qn (line 2) | function qn(e,n,t,r){if(Hn){var l=Gn(e,n,t,r);if(null===l)$r(e,n,r,Kn,t)...
  function Gn (line 2) | function Gn(e,n,t,r){if(Kn=null,null!==(e=yl(e=ke(r))))if(null===(n=We(e...
  function Xn (line 2) | function Xn(e){switch(e){case"cancel":case"click":case"close":case"conte...
  function nt (line 2) | function nt(){if(et)return et;var e,n,t=Jn,r=t.length,l="value"in Zn?Zn....
  function tt (line 2) | function tt(e){var n=e.keyCode;return"charCode"in e?0===(e=e.charCode)&&...
  function rt (line 2) | function rt(){return!0}
  function lt (line 2) | function lt(){return!1}
  function at (line 2) | function at(e){function n(n,t,r,l,a){for(var o in this._reactName=n,this...
  function xt (line 2) | function xt(e){var n=this.nativeEvent;return n.getModifierState?n.getMod...
  function _t (line 2) | function _t(){return xt}
  function jt (line 2) | function jt(e,n){switch(e){case"keyup":return-1!==Lt.indexOf(n.keyCode);...
  function Vt (line 2) | function Vt(e){return"object"==typeof(e=e.detail)&&"data"in e?e.data:null}
  function $t (line 2) | function $t(e){var n=e&&e.nodeName&&e.nodeName.toLowerCase();return"inpu...
  function Ht (line 2) | function Ht(e,n,t,r){Ce(r),0<(n=Qr(n,"onChange")).length&&(t=new ct("onC...
  function qt (line 2) | function qt(e){Ur(e,0)}
  function Kt (line 2) | function Kt(e){if(Y(wl(e)))return e}
  function Gt (line 2) | function Gt(e,n){if("change"===e)return n}
  function nr (line 2) | function nr(){Qt&&(Qt.detachEvent("onpropertychange",tr),Yt=Qt=null)}
  function tr (line 2) | function tr(e){if("value"===e.propertyName&&Kt(Yt)){var n=[];Ht(n,Yt,e,k...
  function rr (line 2) | function rr(e,n,t){"focusin"===e?(nr(),Yt=t,(Qt=n).attachEvent("onproper...
  function lr (line 2) | function lr(e){if("selectionchange"===e||"keyup"===e||"keydown"===e)retu...
  function ar (line 2) | function ar(e,n){if("click"===e)return Kt(n)}
  function or (line 2) | function or(e,n){if("input"===e||"change"===e)return Kt(n)}
  function ir (line 2) | function ir(e,n){if(ur(e,n))return!0;if("object"!=typeof e||null===e||"o...
  function sr (line 2) | function sr(e){for(;e&&e.firstChild;)e=e.firstChild;return e}
  function cr (line 2) | function cr(e,n){var t,r=sr(e);for(e=0;r;){if(3===r.nodeType){if(t=e+r.t...
  function fr (line 2) | function fr(e,n){return!(!e||!n)&&(e===n||(!e||3!==e.nodeType)&&(n&&3===...
  function dr (line 2) | function dr(){for(var e=window,n=q();n instanceof e.HTMLIFrameElement;){...
  function pr (line 2) | function pr(e){var n=e&&e.nodeName&&e.nodeName.toLowerCase();return n&&(...
  function mr (line 2) | function mr(e){var n=dr(),t=e.focusedElem,r=e.selectionRange;if(n!==t&&t...
  function wr (line 2) | function wr(e,n,t){var r=t.window===t?t.document:9===t.nodeType?t:t.owne...
  function kr (line 2) | function kr(e,n){var t={};return t[e.toLowerCase()]=n.toLowerCase(),t["W...
  function _r (line 2) | function _r(e){if(Er[e])return Er[e];if(!Sr[e])return e;var n,t=Sr[e];fo...
  function Dr (line 2) | function Dr(e,n){Tr.set(e,n),i(n,[e])}
  function Ir (line 2) | function Ir(e,n,t){var r=e.type||"unknown-event";e.currentTarget=t,funct...
  function Ur (line 2) | function Ur(e,n){n=0!=(4&n);for(var t=0;t<e.length;t++){var r=e[t],l=r.e...
  function Ar (line 2) | function Ar(e,n){var t=n[hl];void 0===t&&(t=n[hl]=new Set);var r=e+"__bu...
  function jr (line 2) | function jr(e,n,t){var r=0;n&&(r|=4),Br(t,e,r,n)}
  function Wr (line 2) | function Wr(e){if(!e[Vr]){e[Vr]=!0,o.forEach((function(n){"selectionchan...
  function Br (line 2) | function Br(e,n,t,r){switch(Xn(n)){case 1:var l=Qn;break;case 4:l=Yn;bre...
  function $r (line 2) | function $r(e,n,t,r,l){var a=r;if(0==(1&n)&&0==(2&n)&&null!==r)e:for(;;)...
  function Hr (line 2) | function Hr(e,n,t){return{instance:e,listener:n,currentTarget:t}}
  function Qr (line 2) | function Qr(e,n){for(var t=n+"Capture",r=[];null!==e;){var l=e,a=l.state...
  function Yr (line 2) | function Yr(e){if(null===e)return null;do{e=e.return}while(e&&5!==e.tag)...
  function qr (line 2) | function qr(e,n,t,r,l){for(var a=n._reactName,o=[];null!==t&&t!==r;){var...
  function Xr (line 2) | function Xr(e){return("string"==typeof e?e:""+e).replace(Kr,"\n").replac...
  function Zr (line 2) | function Zr(e,n,t){if(n=Xr(n),Xr(e)!==n&&t)throw Error(a(425))}
  function Jr (line 2) | function Jr(){}
  function tl (line 2) | function tl(e,n){return"textarea"===e||"noscript"===e||"string"==typeof ...
  function ul (line 2) | function ul(e){setTimeout((function(){throw e}))}
  function il (line 2) | function il(e,n){var t=n,r=0;do{var l=t.nextSibling;if(e.removeChild(t),...
  function sl (line 2) | function sl(e){for(;null!=e;e=e.nextSibling){var n=e.nodeType;if(1===n||...
  function cl (line 2) | function cl(e){e=e.previousSibling;for(var n=0;e;){if(8===e.nodeType){va...
  function yl (line 2) | function yl(e){var n=e[dl];if(n)return n;for(var t=e.parentNode;t;){if(n...
  function bl (line 2) | function bl(e){return!(e=e[dl]||e[ml])||5!==e.tag&&6!==e.tag&&13!==e.tag...
  function wl (line 2) | function wl(e){if(5===e.tag||6===e.tag)return e.stateNode;throw Error(a(...
  function kl (line 2) | function kl(e){return e[pl]||null}
  function xl (line 2) | function xl(e){return{current:e}}
  function _l (line 2) | function _l(e){0>El||(e.current=Sl[El],Sl[El]=null,El--)}
  function Cl (line 2) | function Cl(e,n){El++,Sl[El]=e.current,e.current=n}
  function Ml (line 2) | function Ml(e,n){var t=e.type.contextTypes;if(!t)return Nl;var r=e.state...
  function Dl (line 2) | function Dl(e){return null!=e.childContextTypes}
  function Ll (line 2) | function Ll(){_l(zl),_l(Pl)}
  function Rl (line 2) | function Rl(e,n,t){if(Pl.current!==Nl)throw Error(a(168));Cl(Pl,n),Cl(zl...
  function Ol (line 2) | function Ol(e,n,t){var r=e.stateNode;if(n=n.childContextTypes,"function"...
  function Fl (line 2) | function Fl(e){return e=(e=e.stateNode)&&e.__reactInternalMemoizedMerged...
  function Il (line 2) | function Il(e,n,t){var r=e.stateNode;if(!r)throw Error(a(169));t?(e=Ol(e...
  function Vl (line 2) | function Vl(e){null===Ul?Ul=[e]:Ul.push(e)}
  function Wl (line 2) | function Wl(){if(!jl&&null!==Ul){jl=!0;var e=0,n=wn;try{var t=Ul;for(wn=...
  function Zl (line 2) | function Zl(e,n){Bl[$l++]=Ql,Bl[$l++]=Hl,Hl=e,Ql=n}
  function Jl (line 2) | function Jl(e,n,t){Yl[ql++]=Gl,Yl[ql++]=Xl,Yl[ql++]=Kl,Kl=e;var r=Gl;e=X...
  function ea (line 2) | function ea(e){null!==e.return&&(Zl(e,1),Jl(e,1,0))}
  function na (line 2) | function na(e){for(;e===Hl;)Hl=Bl[--$l],Bl[$l]=null,Ql=Bl[--$l],Bl[$l]=n...
  function oa (line 2) | function oa(e,n){var t=Ds(5,null,null,0);t.elementType="DELETED",t.state...
  function ua (line 2) | function ua(e,n){switch(e.tag){case 5:var t=e.type;return null!==(n=1!==...
  function ia (line 2) | function ia(e){return 0!=(1&e.mode)&&0==(128&e.flags)}
  function sa (line 2) | function sa(e){if(la){var n=ra;if(n){var t=n;if(!ua(e,n)){if(ia(e))throw...
  function ca (line 2) | function ca(e){for(e=e.return;null!==e&&5!==e.tag&&3!==e.tag&&13!==e.tag...
  function fa (line 2) | function fa(e){if(e!==ta)return!1;if(!la)return ca(e),la=!0,!1;var n;if(...
  function da (line 2) | function da(){for(var e=ra;e;)e=sl(e.nextSibling)}
  function pa (line 2) | function pa(){ra=ta=null,la=!1}
  function ma (line 2) | function ma(e){null===aa?aa=[e]:aa.push(e)}
  function ga (line 2) | function ga(e,n){if(e&&e.defaultProps){for(var t in n=I({},n),e=e.defaul...
  function ka (line 2) | function ka(){wa=ba=ya=null}
  function Sa (line 2) | function Sa(e){var n=va.current;_l(va),e._currentValue=n}
  function Ea (line 2) | function Ea(e,n,t){for(;null!==e;){var r=e.alternate;if((e.childLanes&n)...
  function xa (line 2) | function xa(e,n){ya=e,wa=ba=null,null!==(e=e.dependencies)&&null!==e.fir...
  function _a (line 2) | function _a(e){var n=e._currentValue;if(wa!==e)if(e={context:e,memoizedV...
  function Na (line 2) | function Na(e){null===Ca?Ca=[e]:Ca.push(e)}
  function Pa (line 2) | function Pa(e,n,t,r){var l=n.interleaved;return null===l?(t.next=t,Na(n)...
  function za (line 2) | function za(e,n){e.lanes|=n;var t=e.alternate;for(null!==t&&(t.lanes|=n)...
  function Ma (line 2) | function Ma(e){e.updateQueue={baseState:e.memoizedState,firstBaseUpdate:...
  function Da (line 2) | function Da(e,n){e=e.updateQueue,n.updateQueue===e&&(n.updateQueue={base...
  function La (line 2) | function La(e,n){return{eventTime:e,lane:n,tag:0,payload:null,callback:n...
  function Ra (line 2) | function Ra(e,n,t){var r=e.updateQueue;if(null===r)return null;if(r=r.sh...
  function Oa (line 2) | function Oa(e,n,t){if(null!==(n=n.updateQueue)&&(n=n.shared,0!=(4194240&...
  function Fa (line 2) | function Fa(e,n){var t=e.updateQueue,r=e.alternate;if(null!==r&&t===(r=r...
  function Ia (line 2) | function Ia(e,n,t,r){var l=e.updateQueue;Ta=!1;var a=l.firstBaseUpdate,o...
  function Ua (line 2) | function Ua(e,n,t){if(e=n.effects,n.effects=null,null!==e)for(n=0;n<e.le...
  function ja (line 2) | function ja(e,n,t,r){t=null==(t=t(r,n=e.memoizedState))?n:I({},n,t),e.me...
  function Wa (line 2) | function Wa(e,n,t,r,l,a,o){return"function"==typeof(e=e.stateNode).shoul...
  function Ba (line 2) | function Ba(e,n,t){var r=!1,l=Nl,a=n.contextType;return"object"==typeof ...
  function $a (line 2) | function $a(e,n,t,r){e=n.state,"function"==typeof n.componentWillReceive...
  function Ha (line 2) | function Ha(e,n,t,r){var l=e.stateNode;l.props=t,l.state=e.memoizedState...
  function Qa (line 2) | function Qa(e,n,t){if(null!==(e=t.ref)&&"function"!=typeof e&&"object"!=...
  function Ya (line 2) | function Ya(e,n){throw e=Object.prototype.toString.call(n),Error(a(31,"[...
  function qa (line 2) | function qa(e){return(0,e._init)(e._payload)}
  function Ka (line 2) | function Ka(e){function n(n,t){if(e){var r=n.deletions;null===r?(n.delet...
  function to (line 2) | function to(e){if(e===Za)throw Error(a(174));return e}
  function ro (line 2) | function ro(e,n){switch(Cl(no,n),Cl(eo,e),Cl(Ja,Za),e=n.nodeType){case 9...
  function lo (line 2) | function lo(){_l(Ja),_l(eo),_l(no)}
  function ao (line 2) | function ao(e){to(no.current);var n=to(Ja.current),t=ie(n,e.type);n!==t&...
  function oo (line 2) | function oo(e){eo.current===e&&(_l(Ja),_l(eo))}
  function io (line 2) | function io(e){for(var n=e;null!==n;){if(13===n.tag){var t=n.memoizedSta...
  function co (line 2) | function co(){for(var e=0;e<so.length;e++)so[e]._workInProgressVersionPr...
  function So (line 2) | function So(){throw Error(a(321))}
  function Eo (line 2) | function Eo(e,n){if(null===n)return!1;for(var t=0;t<n.length&&t<e.length...
  function xo (line 2) | function xo(e,n,t,r,l,o){if(mo=o,ho=n,n.memoizedState=null,n.updateQueue...
  function _o (line 2) | function _o(){var e=0!==wo;return wo=0,e}
  function Co (line 2) | function Co(){var e={memoizedState:null,baseState:null,baseQueue:null,qu...
  function No (line 2) | function No(){if(null===go){var e=ho.alternate;e=null!==e?e.memoizedStat...
  function Po (line 2) | function Po(e,n){return"function"==typeof n?n(e):n}
  function zo (line 2) | function zo(e){var n=No(),t=n.queue;if(null===t)throw Error(a(311));t.la...
  function To (line 2) | function To(e){var n=No(),t=n.queue;if(null===t)throw Error(a(311));t.la...
  function Mo (line 2) | function Mo(){}
  function Do (line 2) | function Do(e,n){var t=ho,r=No(),l=n(),o=!ur(r.memoizedState,l);if(o&&(r...
  function Lo (line 2) | function Lo(e,n,t){e.flags|=16384,e={getSnapshot:n,value:t},null===(n=ho...
  function Ro (line 2) | function Ro(e,n,t,r){n.value=t,n.getSnapshot=r,Fo(n)&&Io(e)}
  function Oo (line 2) | function Oo(e,n,t){return t((function(){Fo(n)&&Io(e)}))}
  function Fo (line 2) | function Fo(e){var n=e.getSnapshot;e=e.value;try{var t=n();return!ur(e,t...
  function Io (line 2) | function Io(e){var n=za(e,1);null!==n&&rs(n,e,1,-1)}
  function Uo (line 2) | function Uo(e){var n=Co();return"function"==typeof e&&(e=e()),n.memoized...
  function Ao (line 2) | function Ao(e,n,t,r){return e={tag:e,create:n,destroy:t,deps:r,next:null...
  function jo (line 2) | function jo(){return No().memoizedState}
  function Vo (line 2) | function Vo(e,n,t,r){var l=Co();ho.flags|=e,l.memoizedState=Ao(1|n,t,voi...
  function Wo (line 2) | function Wo(e,n,t,r){var l=No();r=void 0===r?null:r;var a=void 0;if(null...
  function Bo (line 2) | function Bo(e,n){return Vo(8390656,8,e,n)}
  function $o (line 2) | function $o(e,n){return Wo(2048,8,e,n)}
  function Ho (line 2) | function Ho(e,n){return Wo(4,2,e,n)}
  function Qo (line 2) | function Qo(e,n){return Wo(4,4,e,n)}
  function Yo (line 2) | function Yo(e,n){return"function"==typeof n?(e=e(),n(e),function(){n(nul...
  function qo (line 2) | function qo(e,n,t){return t=null!=t?t.concat([e]):null,Wo(4,4,Yo.bind(nu...
  function Ko (line 2) | function Ko(){}
  function Go (line 2) | function Go(e,n){var t=No();n=void 0===n?null:n;var r=t.memoizedState;re...
  function Xo (line 2) | function Xo(e,n){var t=No();n=void 0===n?null:n;var r=t.memoizedState;re...
  function Zo (line 2) | function Zo(e,n,t){return 0==(21&mo)?(e.baseState&&(e.baseState=!1,wu=!0...
  function Jo (line 2) | function Jo(e,n){var t=wn;wn=0!==t&&4>t?t:4,e(!0);var r=po.transition;po...
  function eu (line 2) | function eu(){return No().memoizedState}
  function nu (line 2) | function nu(e,n,t){var r=ts(e);t={lane:r,action:t,hasEagerState:!1,eager...
  function tu (line 2) | function tu(e,n,t){var r=ts(e),l={lane:r,action:t,hasEagerState:!1,eager...
  function ru (line 2) | function ru(e){var n=e.alternate;return e===ho||null!==n&&n===ho}
  function lu (line 2) | function lu(e,n){bo=yo=!0;var t=e.pending;null===t?n.next=n:(n.next=t.ne...
  function au (line 2) | function au(e,n,t){if(0!=(4194240&t)){var r=n.lanes;t|=r&=e.pendingLanes...
  function cu (line 2) | function cu(e,n){try{var t="",r=n;do{t+=V(r),r=r.return}while(r);var l=t...
  function fu (line 2) | function fu(e,n,t){return{value:e,source:null,stack:null!=t?t:null,diges...
  function du (line 2) | function du(e,n){try{console.error(n.value)}catch(e){setTimeout((functio...
  function mu (line 2) | function mu(e,n,t){(t=La(-1,t)).tag=3,t.payload={element:null};var r=n.v...
  function hu (line 2) | function hu(e,n,t){(t=La(-1,t)).tag=3;var r=e.type.getDerivedStateFromEr...
  function gu (line 2) | function gu(e,n,t){var r=e.pingCache;if(null===r){r=e.pingCache=new pu;v...
  function vu (line 2) | function vu(e){do{var n;if((n=13===e.tag)&&(n=null===(n=e.memoizedState)...
  function yu (line 2) | function yu(e,n,t,r,l){return 0==(1&e.mode)?(e===n?e.flags|=65536:(e.fla...
  function ku (line 2) | function ku(e,n,t,r){n.child=null===e?Xa(n,null,t,r):Ga(n,e.child,t,r)}
  function Su (line 2) | function Su(e,n,t,r,l){t=t.render;var a=n.ref;return xa(n,l),r=xo(e,n,t,...
  function Eu (line 2) | function Eu(e,n,t,r,l){if(null===e){var a=t.type;return"function"!=typeo...
  function xu (line 2) | function xu(e,n,t,r,l){if(null!==e){var a=e.memoizedProps;if(ir(a,r)&&e....
  function _u (line 2) | function _u(e,n,t){var r=n.pendingProps,l=r.children,a=null!==e?e.memoiz...
  function Cu (line 2) | function Cu(e,n){var t=n.ref;(null===e&&null!==t||null!==e&&e.ref!==t)&&...
  function Nu (line 2) | function Nu(e,n,t,r,l){var a=Dl(t)?Tl:Pl.current;return a=Ml(n,a),xa(n,l...
  function Pu (line 2) | function Pu(e,n,t,r,l){if(Dl(t)){var a=!0;Fl(n)}else a=!1;if(xa(n,l),nul...
  function zu (line 2) | function zu(e,n,t,r,l,a){Cu(e,n);var o=0!=(128&n.flags);if(!r&&!o)return...
  function Tu (line 2) | function Tu(e){var n=e.stateNode;n.pendingContext?Rl(0,n.pendingContext,...
  function Mu (line 2) | function Mu(e,n,t,r,l){return pa(),ma(l),n.flags|=256,ku(e,n,t,r),n.child}
  function Iu (line 2) | function Iu(e){return{baseLanes:e,cachePool:null,transitions:null}}
  function Uu (line 2) | function Uu(e,n,t){var r,l=n.pendingProps,o=uo.current,u=!1,i=0!=(128&n....
  function Au (line 2) | function Au(e,n){return(n=Is({mode:"visible",children:n},e.mode,0,null))...
  function ju (line 2) | function ju(e,n,t,r){return null!==r&&ma(r),Ga(n,e.child,null,t),(e=Au(n...
  function Vu (line 2) | function Vu(e,n,t){e.lanes|=n;var r=e.alternate;null!==r&&(r.lanes|=n),E...
  function Wu (line 2) | function Wu(e,n,t,r,l){var a=e.memoizedState;null===a?e.memoizedState={i...
  function Bu (line 2) | function Bu(e,n,t){var r=n.pendingProps,l=r.revealOrder,a=r.tail;if(ku(e...
  function $u (line 2) | function $u(e,n){0==(1&n.mode)&&null!==e&&(e.alternate=null,n.alternate=...
  function Hu (line 2) | function Hu(e,n,t){if(null!==e&&(n.dependencies=e.dependencies),Ii|=n.la...
  function Qu (line 2) | function Qu(e,n){if(!la)switch(e.tailMode){case"hidden":n=e.tail;for(var...
  function Yu (line 2) | function Yu(e){var n=null!==e.alternate&&e.alternate.child===e.child,t=0...
  function qu (line 2) | function qu(e,n,t){var r=n.pendingProps;switch(na(n),n.tag){case 2:case ...
  function Ku (line 2) | function Ku(e,n){switch(na(n),n.tag){case 1:return Dl(n.type)&&Ll(),6553...
  function ei (line 2) | function ei(e,n){var t=e.ref;if(null!==t)if("function"==typeof t)try{t(n...
  function ni (line 2) | function ni(e,n,t){try{t()}catch(t){_s(e,n,t)}}
  function ri (line 2) | function ri(e,n,t){var r=n.updateQueue;if(null!==(r=null!==r?r.lastEffec...
  function li (line 2) | function li(e,n){if(null!==(n=null!==(n=n.updateQueue)?n.lastEffect:null...
  function ai (line 2) | function ai(e){var n=e.ref;if(null!==n){var t=e.stateNode;e.tag,e=t,"fun...
  function oi (line 2) | function oi(e){var n=e.alternate;null!==n&&(e.alternate=null,oi(n)),e.ch...
  function ui (line 2) | function ui(e){return 5===e.tag||3===e.tag||4===e.tag}
  function ii (line 2) | function ii(e){e:for(;;){for(;null===e.sibling;){if(null===e.return||ui(...
  function si (line 2) | function si(e,n,t){var r=e.tag;if(5===r||6===r)e=e.stateNode,n?8===t.nod...
  function ci (line 2) | function ci(e,n,t){var r=e.tag;if(5===r||6===r)e=e.stateNode,n?t.insertB...
  function pi (line 2) | function pi(e,n,t){for(t=t.child;null!==t;)mi(e,n,t),t=t.sibling}
  function mi (line 2) | function mi(e,n,t){if(an&&"function"==typeof an.onCommitFiberUnmount)try...
  function hi (line 2) | function hi(e){var n=e.updateQueue;if(null!==n){e.updateQueue=null;var t...
  function gi (line 2) | function gi(e,n){var t=n.deletions;if(null!==t)for(var r=0;r<t.length;r+...
  function vi (line 2) | function vi(e,n){var t=e.alternate,r=e.flags;switch(e.tag){case 0:case 1...
  function yi (line 2) | function yi(e){var n=e.flags;if(2&n){try{e:{for(var t=e.return;null!==t;...
  function bi (line 2) | function bi(e,n,t){Ju=e,wi(e,n,t)}
  function wi (line 2) | function wi(e,n,t){for(var r=0!=(1&e.mode);null!==Ju;){var l=Ju,a=l.chil...
  function ki (line 2) | function ki(e){for(;null!==Ju;){var n=Ju;if(0!=(8772&n.flags)){var t=n.a...
  function Si (line 2) | function Si(e){for(;null!==Ju;){var n=Ju;if(n===e){Ju=null;break}var t=n...
  function Ei (line 2) | function Ei(e){for(;null!==Ju;){var n=Ju;try{switch(n.tag){case 0:case 1...
  function ns (line 2) | function ns(){return 0!=(6&zi)?Xe():-1!==Ji?Ji:Ji=Xe()}
  function ts (line 2) | function ts(e){return 0==(1&e.mode)?1:0!=(2&zi)&&0!==Di?Di&-Di:null!==ha...
  function rs (line 2) | function rs(e,n,t,r){if(50<Xi)throw Xi=0,Zi=null,Error(a(185));yn(e,t,r)...
  function ls (line 2) | function ls(e,n){var t=e.callbackNode;!function(e,n){for(var t=e.suspend...
  function as (line 2) | function as(e,n){if(Ji=-1,es=0,0!=(6&zi))throw Error(a(327));var t=e.cal...
  function os (line 2) | function os(e,n){var t=ji;return e.current.memoizedState.isDehydrated&&(...
  function us (line 2) | function us(e){null===Vi?Vi=e:Vi.push.apply(Vi,e)}
  function is (line 2) | function is(e,n){for(n&=~Ai,n&=~Ui,e.suspendedLanes|=n,e.pingedLanes&=~n...
  function ss (line 2) | function ss(e){if(0!=(6&zi))throw Error(a(327));Es();var n=pn(e,0);if(0=...
  function cs (line 2) | function cs(e,n){var t=zi;zi|=1;try{return e(n)}finally{0===(zi=t)&&(Bi=...
  function fs (line 2) | function fs(e){null!==Ki&&0===Ki.tag&&0==(6&zi)&&Es();var n=zi;zi|=1;var...
  function ds (line 2) | function ds(){Li=Ri.current,_l(Ri)}
  function ps (line 2) | function ps(e,n){e.finishedWork=null,e.finishedLanes=0;var t=e.timeoutHa...
  function ms (line 2) | function ms(e,n){for(;;){var t=Mi;try{if(ka(),fo.current=ou,yo){for(var ...
  function hs (line 2) | function hs(){var e=Ci.current;return Ci.current=ou,null===e?ou:e}
  function gs (line 2) | function gs(){0!==Oi&&3!==Oi&&2!==Oi||(Oi=4),null===Ti||0==(268435455&Ii...
  function vs (line 2) | function vs(e,n){var t=zi;zi|=2;var r=hs();for(Ti===e&&Di===n||($i=null,...
  function ys (line 2) | function ys(){for(;null!==Mi;)ws(Mi)}
  function bs (line 2) | function bs(){for(;null!==Mi&&!Ke();)ws(Mi)}
  function ws (line 2) | function ws(e){var n=xi(e.alternate,e,Li);e.memoizedProps=e.pendingProps...
  function ks (line 2) | function ks(e){var n=e;do{var t=n.alternate;if(e=n.return,0==(32768&n.fl...
  function Ss (line 2) | function Ss(e,n,t){var r=wn,l=Pi.transition;try{Pi.transition=null,wn=1,...
  function Es (line 2) | function Es(){if(null!==Ki){var e=kn(Gi),n=Pi.transition,t=wn;try{if(Pi....
  function xs (line 2) | function xs(e,n,t){e=Ra(e,n=mu(0,n=cu(t,n),1),1),n=ns(),null!==e&&(yn(e,...
  function _s (line 2) | function _s(e,n,t){if(3===e.tag)xs(e,e,t);else for(;null!==n;){if(3===n....
  function Cs (line 2) | function Cs(e,n,t){var r=e.pingCache;null!==r&&r.delete(n),n=ns(),e.ping...
  function Ns (line 2) | function Ns(e,n){0===n&&(0==(1&e.mode)?n=1:(n=fn,0==(130023424&(fn<<=1))...
  function Ps (line 2) | function Ps(e){var n=e.memoizedState,t=0;null!==n&&(t=n.retryLane),Ns(e,t)}
  function zs (line 2) | function zs(e,n){var t=0;switch(e.tag){case 13:var r=e.stateNode,l=e.mem...
  function Ts (line 2) | function Ts(e,n){return Ye(e,n)}
  function Ms (line 2) | function Ms(e,n,t,r){this.tag=e,this.key=t,this.sibling=this.child=this....
  function Ds (line 2) | function Ds(e,n,t,r){return new Ms(e,n,t,r)}
  function Ls (line 2) | function Ls(e){return!(!(e=e.prototype)||!e.isReactComponent)}
  function Rs (line 2) | function Rs(e,n){var t=e.alternate;return null===t?((t=Ds(e.tag,n,e.key,...
  function Os (line 2) | function Os(e,n,t,r,l,o){var u=2;if(r=e,"function"==typeof e)Ls(e)&&(u=1...
  function Fs (line 2) | function Fs(e,n,t,r){return(e=Ds(7,e,r,n)).lanes=t,e}
  function Is (line 2) | function Is(e,n,t,r){return(e=Ds(22,e,r,n)).elementType=L,e.lanes=t,e.st...
  function Us (line 2) | function Us(e,n,t){return(e=Ds(6,e,null,n)).lanes=t,e}
  function As (line 2) | function As(e,n,t){return(n=Ds(4,null!==e.children?e.children:[],e.key,n...
  function js (line 2) | function js(e,n,t,r,l){this.tag=n,this.containerInfo=e,this.finishedWork...
  function Vs (line 2) | function Vs(e,n,t,r,l,a,o,u,i){return e=new js(e,n,t,u,i),1===n?(n=1,!0=...
  function Ws (line 2) | function Ws(e){if(!e)return Nl;e:{if(We(e=e._reactInternals)!==e||1!==e....
  function Bs (line 2) | function Bs(e,n,t,r,l,a,o,u,i){return(e=Vs(t,r,!0,e,0,a,0,u,i)).context=...
  function $s (line 2) | function $s(e,n,t,r){var l=n.current,a=ns(),o=ts(l);return t=Ws(t),null=...
  function Hs (line 2) | function Hs(e){return(e=e.current).child?(e.child.tag,e.child.stateNode)...
  function Qs (line 2) | function Qs(e,n){if(null!==(e=e.memoizedState)&&null!==e.dehydrated){var...
  function Ys (line 2) | function Ys(e,n){Qs(e,n),(e=e.alternate)&&Qs(e,n)}
  function Ks (line 2) | function Ks(e){this._internalRoot=e}
  function Gs (line 2) | function Gs(e){this._internalRoot=e}
  function Xs (line 2) | function Xs(e){return!(!e||1!==e.nodeType&&9!==e.nodeType&&11!==e.nodeTy...
  function Zs (line 2) | function Zs(e){return!(!e||1!==e.nodeType&&9!==e.nodeType&&11!==e.nodeTy...
  function Js (line 2) | function Js(){}
  function ec (line 2) | function ec(e,n,t,r,l){var a=t._reactRootContainer;if(a){var o=a;if("fun...
  function v (line 2) | function v(e,n,t){this.props=e,this.context=n,this.refs=g,this.updater=t...
  function y (line 2) | function y(){}
  function b (line 2) | function b(e,n,t){this.props=e,this.context=n,this.refs=g,this.updater=t...
  function _ (line 2) | function _(e,n,r){var l,a={},o=null,u=null;if(null!=n)for(l in void 0!==...
  function C (line 2) | function C(e){return"object"==typeof e&&null!==e&&e.$$typeof===t}
  function P (line 2) | function P(e,n){return"object"==typeof e&&null!==e&&null!=e.key?function...
  function z (line 2) | function z(e,n,l,a,o){var u=typeof e;"undefined"!==u&&"boolean"!==u||(e=...
  function T (line 2) | function T(e,n,t){if(null==e)return e;var r=[],l=0;return z(e,r,"","",(f...
  function M (line 2) | function M(e){if(-1===e._status){var n=e._result;(n=n()).then((function(...
  function t (line 2) | function t(e,n){var t=e.length;e.push(n);e:for(;0<t;){var r=t-1>>>1,l=e[...
  function r (line 2) | function r(e){return 0===e.length?null:e[0]}
  function l (line 2) | function l(e){if(0===e.length)return null;var n=e[0],t=e.pop();if(t!==n)...
  function a (line 2) | function a(e,n){var t=e.sortIndex-n.sortIndex;return 0!==t?t:e.id-n.id}
  function w (line 2) | function w(e){for(var n=r(c);null!==n;){if(null===n.callback)l(c);else{i...
  function k (line 2) | function k(e){if(g=!1,w(e),!h)if(null!==r(s))h=!0,L(S);else{var n=r(c);n...
  function S (line 2) | function S(e,t){h=!1,g&&(g=!1,y(C),C=-1),m=!0;var a=p;try{for(w(t),d=r(s...
  function z (line 2) | function z(){return!(n.unstable_now()-P<N)}
  function T (line 2) | function T(){if(null!==_){var e=n.unstable_now();P=e;var t=!0;try{t=_(!0...
  function L (line 2) | function L(e){_=e,x||(x=!0,E())}
  function R (line 2) | function R(e,t){C=v((function(){e(n.unstable_now())}),t)}
  function o (line 2) | function o(e){var n=a[e];if(void 0!==n)return n.exports;var t=a[e]={expo...

FILE: lib/generators/react/component_generator.rb
  type React (line 3) | module React
    type Generators (line 4) | module Generators
      class ComponentGenerator (line 5) | class ComponentGenerator < ::Rails::Generators::NamedBase
        method create_component_file (line 126) | def create_component_file
        method webpack_configuration (line 154) | def webpack_configuration
        method component_name (line 158) | def component_name
        method file_header (line 162) | def file_header
        method file_footer (line 175) | def file_footer
        method shakapacker? (line 183) | def shakapacker?
        method parse_attributes! (line 187) | def parse_attributes!
        method union? (line 207) | def union?(args = "")
        method ts_lookup (line 211) | def self.ts_lookup(_name, type = "node", args = "")
        method ts_lookup (line 232) | def ts_lookup(name, type = "node", args = "")
        method lookup (line 236) | def self.lookup(type = "node", options = "")
        method lookup (line 252) | def lookup(type = "node", options = "")
        method detect_template_extension (line 256) | def detect_template_extension
        method es6_enabled? (line 270) | def es6_enabled?

FILE: lib/generators/react/install_generator.rb
  type React (line 3) | module React
    type Generators (line 4) | module Generators
      class InstallGenerator (line 5) | class InstallGenerator < ::Rails::Generators::Base
        method create_directory (line 22) | def create_directory
        method setup_react (line 35) | def setup_react
        method create_server_rendering (line 43) | def create_server_rendering
        method shakapacker? (line 59) | def shakapacker?
        method javascript_dir (line 63) | def javascript_dir
        method manifest (line 73) | def manifest
        method setup_react_sprockets (line 77) | def setup_react_sprockets
        method require_package_json_gem (line 106) | def require_package_json_gem
        method setup_react_shakapacker (line 114) | def setup_react_shakapacker
        method shakapacker_source_path (line 126) | def shakapacker_source_path

FILE: lib/react-rails.rb
  type React (line 8) | module React
    type Rails (line 9) | module Rails

FILE: lib/react.rb
  type React (line 3) | module React
    function camelize_props (line 7) | def self.camelize_props(props)

FILE: lib/react/jsx.rb
  type React (line 11) | module React
    type JSX (line 12) | module JSX
      function transform (line 24) | def self.transform(code)

FILE: lib/react/jsx/babel_transformer.rb
  type React (line 4) | module React
    type JSX (line 5) | module JSX
      class BabelTransformer (line 7) | class BabelTransformer
        method initialize (line 10) | def initialize(options)
        method transform (line 23) | def transform(code)

FILE: lib/react/jsx/jsx_transformer.rb
  type React (line 3) | module React
    type JSX (line 4) | module JSX
      class JSXTransformer (line 6) | class JSXTransformer
        method initialize (line 9) | def initialize(options)
        method transform (line 23) | def transform(code)
        method jsx_transform_code (line 30) | def jsx_transform_code

FILE: lib/react/jsx/processor.rb
  type React (line 3) | module React
    type JSX (line 4) | module JSX
      class Processor (line 6) | class Processor
        method call (line 7) | def self.call(input)

FILE: lib/react/jsx/sprockets_strategy.rb
  type React (line 3) | module React
    type JSX (line 4) | module JSX
      type SprocketsStrategy (line 15) | module SprocketsStrategy
        function attach_with_strategy (line 20) | def attach_with_strategy(sprockets_env, strategy_or_nil)
        function detect_strategy (line 26) | def detect_strategy
        function register_engine (line 37) | def register_engine(sprockets_env)
        function register_engine_with_mime_type (line 41) | def register_engine_with_mime_type(sprockets_env)
        function register_processors (line 46) | def register_processors(sprockets_env)

FILE: lib/react/jsx/template.rb
  type React (line 5) | module React
    type JSX (line 6) | module JSX
      class Template (line 8) | class Template < Tilt::Template
        method prepare (line 11) | def prepare; end
        method evaluate (line 13) | def evaluate(_scope, _locals)

FILE: lib/react/rails/asset_variant.rb
  type React (line 3) | module React
    type Rails (line 4) | module Rails
      class AssetVariant (line 7) | class AssetVariant
        method initialize (line 20) | def initialize(options = {})

FILE: lib/react/rails/component_mount.rb
  type React (line 3) | module React
    type Rails (line 4) | module Rails
      class ComponentMount (line 10) | class ComponentMount
        method initialize (line 17) | def initialize
        method setup (line 23) | def setup(controller)
        method teardown (line 27) | def teardown(controller); end
        method react_component (line 32) | def react_component(name, props = {}, options = {}, &block)
        method prerender_component (line 48) | def prerender_component(component_name, props, prerender_options)
        method generate_html_options (line 53) | def generate_html_options(name, options, props, prerender_options)
        method rendered_tag (line 70) | def rendered_tag(html_options, &block)

FILE: lib/react/rails/controller_lifecycle.rb
  type React (line 3) | module React
    type Rails (line 4) | module Rails
      type ControllerLifecycle (line 7) | module ControllerLifecycle
        type ClassMethods (line 17) | module ClassMethods
          function per_request_react_rails_prerenderer (line 20) | def per_request_react_rails_prerenderer
        function use_react_component_helper (line 29) | def use_react_component_helper
        function per_request_react_rails_prerenderer (line 42) | def per_request_react_rails_prerenderer
        function react_rails_prerenderer (line 50) | def react_rails_prerenderer

FILE: lib/react/rails/controller_renderer.rb
  type React (line 3) | module React
    type Rails (line 4) | module Rails
      class ControllerRenderer (line 18) | class ControllerRenderer
        method initialize (line 25) | def initialize(options = {})
        method call (line 31) | def call(component_name, options, &block)
        method default_options (line 39) | def default_options

FILE: lib/react/rails/railtie.rb
  type React (line 5) | module React
    type Rails (line 6) | module Rails
      class Railtie (line 7) | class Railtie < ::Rails::Railtie

FILE: lib/react/rails/test_helper.rb
  type React (line 3) | module React
    type Rails (line 4) | module Rails
      type TestHelper (line 5) | module TestHelper
        function assert_react_component (line 13) | def assert_react_component(name)

FILE: lib/react/rails/version.rb
  type React (line 3) | module React
    type Rails (line 4) | module Rails

FILE: lib/react/rails/view_helper.rb
  type React (line 3) | module React
    type Rails (line 4) | module Rails
      type ViewHelper (line 5) | module ViewHelper
        function react_component (line 21) | def react_component(*args, &block)

FILE: lib/react/server_rendering.rb
  type React (line 7) | module React
    type ServerRendering (line 8) | module ServerRendering
      function reset_pool (line 17) | def self.reset_pool
      function render (line 27) | def self.render(component_name, props, prerender_options)
      function with_renderer (line 34) | def self.with_renderer(&block)
      class PrerenderError (line 39) | class PrerenderError < RuntimeError
        method initialize (line 40) | def initialize(component_name, props, js_message)

FILE: lib/react/server_rendering/bundle_renderer.rb
  type React (line 9) | module React
    type ServerRendering (line 10) | module ServerRendering
      class BundleRenderer (line 15) | class BundleRenderer < ExecJSRenderer
        method initialize (line 22) | def initialize(options = {})
        method render (line 40) | def render(component_name, props, prerender_options)
        method before_render (line 46) | def before_render(_component_name, _props, _prerender_options)
        method after_render (line 50) | def after_render(_component_name, _props, _prerender_options)
        method asset_container (line 68) | def asset_container
        method prepare_options (line 74) | def prepare_options(options)
        method render_function (line 85) | def render_function(opts)
        method prepare_props (line 93) | def prepare_props(props)
        method assets_precompiled? (line 97) | def assets_precompiled?
        method asset_container_class (line 104) | def asset_container_class

FILE: lib/react/server_rendering/bundle_renderer/timeout_polyfill.js
  function getStackTrace (line 1) | function getStackTrace() {
  function printError (line 15) | function printError(functionName){
  function setTimeout (line 20) | function setTimeout() {
  function clearTimeout (line 24) | function clearTimeout() {

FILE: lib/react/server_rendering/environment_container.rb
  type React (line 3) | module React
    type ServerRendering (line 4) | module ServerRendering
      class EnvironmentContainer (line 10) | class EnvironmentContainer
        method initialize (line 11) | def initialize
        method find_asset (line 15) | def find_asset(logical_path)

FILE: lib/react/server_rendering/exec_js_renderer.rb
  type React (line 3) | module React
    type ServerRendering (line 4) | module ServerRendering
      class ExecJSRenderer (line 9) | class ExecJSRenderer
        method initialize (line 13) | def initialize(options = {})
        method render (line 20) | def render(component_name, props, prerender_options)
        method before_render (line 30) | def before_render(_component_name, _props, _prerender_options)
        method after_render (line 34) | def after_render(_component_name, _props, _prerender_options)
        method render_from_parts (line 46) | def render_from_parts(before, main, after)
        method main_render (line 51) | def main_render(component_name, props, prerender_options)
        method compose_js (line 56) | def compose_js(before, main, after)

FILE: lib/react/server_rendering/manifest_container.rb
  type React (line 3) | module React
    type ServerRendering (line 4) | module ServerRendering
      class ManifestContainer (line 9) | class ManifestContainer
        method initialize (line 10) | def initialize
        method find_asset (line 14) | def find_asset(logical_path)
        method compatible? (line 23) | def self.compatible?

FILE: lib/react/server_rendering/propshaft_container.rb
  type React (line 3) | module React
    type ServerRendering (line 4) | module ServerRendering
      class PropshaftContainer (line 6) | class PropshaftContainer
        method assembly (line 8) | def assembly
        method compatible? (line 12) | def compatible?
        method find_asset (line 17) | def find_asset(path)

FILE: lib/react/server_rendering/separate_server_bundle_container.rb
  type React (line 5) | module React
    type ServerRendering (line 6) | module ServerRendering
      class SeparateServerBundleContainer (line 8) | class SeparateServerBundleContainer
        method compatible? (line 9) | def self.compatible?
        method find_asset (line 13) | def find_asset(filename)

FILE: lib/react/server_rendering/yaml_manifest_container.rb
  type React (line 3) | module React
    type ServerRendering (line 4) | module ServerRendering
      class YamlManifestContainer (line 9) | class YamlManifestContainer
        method initialize (line 10) | def initialize
        method find_asset (line 14) | def find_asset(logical_path)
        method compatible? (line 19) | def self.compatible?
        method public_asset_path (line 25) | def public_asset_path(asset_name)

FILE: rakelib/create_release.rake
  type Release (line 52) | module Release
    function gem_root (line 55) | def gem_root
    function sh_in_dir (line 60) | def sh_in_dir(dir, *shell_commands)
    function commit_the_changes (line 68) | def commit_the_changes(message)
    function nothing_to_commit? (line 72) | def nothing_to_commit?
    function ensure_there_is_nothing_to_commit (line 77) | def ensure_there_is_nothing_to_commit
    function make_sure_react_and_ujs_are_updated_and_commited (line 90) | def make_sure_react_and_ujs_are_updated_and_commited
    function object_to_boolean (line 106) | def object_to_boolean(value)
    function convert_rubygem_to_npm_version (line 110) | def convert_rubygem_to_npm_version(gem_version)
    function update_the_local_project (line 117) | def update_the_local_project
    function bump_gem_version (line 130) | def bump_gem_version(gem_version, is_dry_run)
    function release_the_new_gem_version (line 140) | def release_the_new_gem_version(is_dry_run)
    function release_the_new_npm_version (line 148) | def release_the_new_npm_version(npm_version, is_dry_run)
    function push (line 161) | def push

FILE: react_ujs/dist/react_ujs.js
  function d (line 1) | function d(){return"function"==typeof i.hydrate||"function"==typeof i.hy...
  function s (line 1) | function s(e,t){return"function"==typeof i.hydrateRoot?i.hydrateRoot(e,t...
  function _ (line 1) | function _(e){return u()?i.createRoot(e):function(e){return{render:t=>i....
  function __webpack_require__ (line 1) | function __webpack_require__(e){var t=__webpack_module_cache__[e];if(voi...

FILE: react_ujs/src/renderHelpers.js
  function supportsHydration (line 4) | function supportsHydration() {
  function reactHydrate (line 8) | function reactHydrate(node, component) {
  function createReactRootLike (line 16) | function createReactRootLike(node) {
  function legacyReactRootLike (line 23) | function legacyReactRootLike(node) {

FILE: test/dummy/app/assets/javascripts/flow_types_example.js.jsx
  function flowTypesExample (line 1) | function flowTypesExample(i: number, name: string): string {

FILE: test/dummy/app/assets/javascripts/harmony_example.js.jsx
  method generateGreeting (line 3) | generateGreeting() {
  method generateGreetingWithWrapper (line 6) | generateGreetingWithWrapper() {

FILE: test/dummy/app/controllers/application_controller.rb
  class ApplicationController (line 3) | class ApplicationController < ActionController::Base

FILE: test/dummy/app/controllers/counters_controller.rb
  class CountersController (line 3) | class CountersController < ApplicationController
    method index (line 4) | def index
    method create (line 8) | def create

FILE: test/dummy/app/controllers/pack_components_controller.rb
  class PackComponentsController (line 3) | class PackComponentsController < ApplicationController
    method show (line 6) | def show; end

FILE: test/dummy/app/controllers/pages_controller.rb
  class PagesController (line 3) | class PagesController < ApplicationController
    method show (line 6) | def show
    method no_turbolinks (line 22) | def no_turbolinks

FILE: test/dummy/app/controllers/server_controller.rb
  class ServerController (line 3) | class ServerController < ApplicationController
    method show (line 4) | def show
    method console_example (line 9) | def console_example
    method inline_component_prerender_true (line 13) | def inline_component_prerender_true
    method inline_component_prerender_false (line 17) | def inline_component_prerender_false
    method inline_component_with_camelize_props_prerender_true (line 21) | def inline_component_with_camelize_props_prerender_true
    method inline_component_with_camelize_props_prerender_false (line 25) | def inline_component_with_camelize_props_prerender_false
    method component_options (line 32) | def component_options

FILE: test/dummy/app/helpers/application_helper.rb
  type ApplicationHelper (line 3) | module ApplicationHelper

FILE: test/dummy/app/javascript/components/export_default_component.js
  class ExportDefaultComponent (line 3) | class ExportDefaultComponent extends React.Component {
    method render (line 4) | render() {

FILE: test/dummy/app/javascript/controllers/mount_counters.js
  method connect (line 5) | connect() {
  method disconnect (line 9) | disconnect() {
  method observeChange (line 13) | observeChange() {

FILE: test/dummy/config/application.rb
  type Dummy (line 21) | module Dummy
    class Application (line 22) | class Application < Rails::Application

FILE: test/dummy/config/initializers/react.rb
  class CustomComponentMount (line 4) | class CustomComponentMount < React::Rails::ComponentMount

FILE: test/generators/coffee_component_generator_test.rb
  class CoffeeComponentGeneratorTest (line 6) | class CoffeeComponentGeneratorTest < Rails::Generators::TestCase
    method filename (line 12) | def filename
    method filename (line 24) | def filename
    method class_name (line 28) | def class_name

FILE: test/generators/component_generator_test.rb
  class ComponentGeneratorTest (line 6) | class ComponentGeneratorTest < Rails::Generators::TestCase
    method filename (line 12) | def filename
    method filename_with_subfolder (line 16) | def filename_with_subfolder
    method filename (line 20) | def filename
    method filename_with_subfolder (line 24) | def filename_with_subfolder

FILE: test/generators/es6_component_generator_test.rb
  class Es6ComponentGeneratorTest (line 6) | class Es6ComponentGeneratorTest < Rails::Generators::TestCase
    method filename (line 12) | def filename
    method filename (line 16) | def filename
    method component_name (line 21) | def component_name

FILE: test/generators/install_generator_sprockets_test.rb
  class InstallGeneratorSprocketsTest (line 8) | class InstallGeneratorSprocketsTest < Rails::Generators::TestCase
    method copy_directory (line 13) | def copy_directory(dir)
    method init_application_js (line 97) | def init_application_js(content)
    method assert_application_file_created (line 104) | def assert_application_file_created
    method assert_application_file_modified (line 109) | def assert_application_file_modified

FILE: test/generators/install_generator_webpacker_test.rb
  class InstallGeneratorShakapackerTest (line 5) | class InstallGeneratorShakapackerTest < Rails::Generators::TestCase
    method copy_directory (line 19) | def copy_directory(dir)

FILE: test/generators/ts_es6_component_generator_test.rb
  class TsEs6ComponentGeneratorTest (line 6) | class TsEs6ComponentGeneratorTest < Rails::Generators::TestCase
    method filename (line 12) | def filename
    method filename (line 16) | def filename
    method component_name (line 21) | def component_name

FILE: test/react/jsx/jsx_prepocessor_test.rb
  class JSXPreprocessorTest (line 5) | class JSXPreprocessorTest < ActiveSupport::TestCase

FILE: test/react/jsx/jsx_transformer_test.rb
  class JSXTransformerTest (line 5) | class JSXTransformerTest < ActionDispatch::IntegrationTest

FILE: test/react/jsx_test.rb
  class NullTransformer (line 24) | class NullTransformer
    method initialize (line 25) | def initialize(_options = {}); end
    method transform (line 27) | def transform(_code)
  class JSXTransformTest (line 32) | class JSXTransformTest < ActionDispatch::IntegrationTest
    method test_babel_transformer_accepts_babel_transformation_options (line 66) | def test_babel_transformer_accepts_babel_transformation_options

FILE: test/react/rails/asset_variant_test.rb
  class AssetVariantTest (line 5) | class AssetVariantTest < ActiveSupport::TestCase
    method build_variant (line 6) | def build_variant(options)

FILE: test/react/rails/component_mount_test.rb
  class ComponentMountTest (line 5) | class ComponentMountTest < ActionDispatch::IntegrationTest
    type DummyRenderer (line 6) | module DummyRenderer
      function render (line 7) | def self.render(component_name, props, _prerender_options)
    type DummyController (line 12) | module DummyController
      function react_rails_prerenderer (line 13) | def self.react_rails_prerenderer

FILE: test/react/rails/controller_lifecycle_test.rb
  class DummyHelperImplementation (line 7) | class DummyHelperImplementation
    method initialize (line 10) | def initialize
    method setup (line 14) | def setup(controller)
    method teardown (line 18) | def teardown(_env)
    method react_component (line 22) | def react_component(*_args)
  class ControllerLifecycleTest (line 27) | class ControllerLifecycleTest < ActionDispatch::IntegrationTest
    method teardown (line 36) | def teardown

FILE: test/react/rails/pages_controller_test.rb
  class PagesControllerTest (line 5) | class PagesControllerTest < ActionController::TestCase

FILE: test/react/rails/railtie_test.rb
  class RailtieTest (line 5) | class RailtieTest < ActionDispatch::IntegrationTest

FILE: test/react/rails/react_rails_ujs_test.rb
  class ReactRailsUJSTest (line 5) | class ReactRailsUJSTest < ActionDispatch::IntegrationTest
    method assert_greeting (line 10) | def assert_greeting(page, greeting)
    method refute_greeting (line 17) | def refute_greeting(page, greeting)

FILE: test/react/rails/realtime_update_test.rb
  class RealtimeUpdateTest (line 5) | class RealtimeUpdateTest < ActiveSupport::TestCase
    method assert_counter_count (line 9) | def assert_counter_count(page, timer_name, count)

FILE: test/react/rails/test_helper_test.rb
  class TestHelperTest (line 5) | class TestHelperTest < ActionDispatch::IntegrationTest

FILE: test/react/rails/view_helper_test.rb
  class ViewHelperHelper (line 6) | class ViewHelperHelper
  class ViewHelperTest (line 12) | class ViewHelperTest < ActionView::TestCase

FILE: test/react/rails/webpacker_test.rb
  class ReactRailsShakapackerTest (line 5) | class ReactRailsShakapackerTest < ActionDispatch::IntegrationTest

FILE: test/react/server_rendering/bundle_renderer_test.rb
  class BundleRendererTest (line 6) | class BundleRendererTest < ActiveSupport::TestCase

FILE: test/react/server_rendering/console_replay_test.rb
  class ConsoleReplayTest (line 6) | class ConsoleReplayTest < ActionDispatch::IntegrationTest

FILE: test/react/server_rendering/exec_js_renderer_test.rb
  class ExecJSRendererTest (line 17) | class ExecJSRendererTest < ActiveSupport::TestCase
    method before_render (line 44) | def @renderer.before_render(_name, _props, _opts)
    method after_render (line 48) | def @renderer.after_render(_name, _props, _opts)
    method before_render (line 61) | def @renderer.before_render(_name, _props, _opts)
    method after_render (line 65) | def @renderer.after_render(_name, _props, _opts)

FILE: test/react/server_rendering/manifest_container_test.rb
  class ManifestContainerTest (line 12) | class ManifestContainerTest < ActiveSupport::TestCase
    method setup (line 13) | def setup
    method teardown (line 19) | def teardown
    method test_find_asset_gets_asset_contents (line 23) | def test_find_asset_gets_asset_contents

FILE: test/react/server_rendering/propshaft_container_test.rb
  class PropshaftContainerTest (line 6) | class PropshaftContainerTest < ActiveSupport::TestCase
    method test_it_loads_js_from_the_propshaft_container (line 8) | def test_it_loads_js_from_the_propshaft_container

FILE: test/react/server_rendering/webpacker_containers_test.rb
  class ShakapackerManifestContainerTest (line 6) | class ShakapackerManifestContainerTest < ActiveSupport::TestCase
    method test_it_loads_js_from_the_shakapacker_container (line 12) | def test_it_loads_js_from_the_shakapacker_container

FILE: test/react/server_rendering/yaml_manifest_container_test.rb
  class YamlManifestContainerTest (line 6) | class YamlManifestContainerTest < ActiveSupport::TestCase
    method setup (line 7) | def setup
    method teardown (line 13) | def teardown
    method test_find_asset_gets_asset_contents (line 17) | def test_find_asset_gets_asset_contents

FILE: test/react/server_rendering_test.rb
  class NullRenderer (line 5) | class NullRenderer
    method initialize (line 6) | def initialize(options)
    method render (line 11) | def render(component_name, props, prerender_options)
  class ReactServerRenderingTest (line 16) | class ReactServerRenderingTest < ActiveSupport::TestCase

FILE: test/react_asset_test.rb
  class ReactAssetTest (line 5) | class ReactAssetTest < ActionDispatch::IntegrationTest

FILE: test/react_test.rb
  class ReactTest (line 5) | class ReactTest < ActiveSupport::TestCase
    method test_it_camelizes_props (line 6) | def test_it_camelizes_props
    method test_it_camelizes_params (line 34) | def test_it_camelizes_params
    method test_it_camelizes_json_serializable_objects (line 53) | def test_it_camelizes_json_serializable_objects

FILE: test/server_rendered_html_test.rb
  class ServerRenderedHtmlTest (line 6) | class ServerRenderedHtmlTest < ActionDispatch::IntegrationTest
    method wait_to_ensure_asset_pipeline_detects_changes (line 11) | def wait_to_ensure_asset_pipeline_detects_changes

FILE: test/support/propshaft_helpers.rb
  type PropshaftHelpers (line 3) | module PropshaftHelpers
    function available? (line 6) | def available?
    function when_propshaft_available (line 10) | def when_propshaft_available

FILE: test/support/sprockets_helpers.rb
  type SprocketsHelpers (line 3) | module SprocketsHelpers
    function available? (line 6) | def available?
    function when_available (line 16) | def when_available
    function clear_sprockets_cache (line 22) | def clear_sprockets_cache
    function fetch_asset_body (line 30) | def fetch_asset_body(asset_logical_path)
    function manually_expire_asset (line 37) | def manually_expire_asset(asset_name)
    function precompile_assets (line 44) | def precompile_assets
    function clear_precompiled_assets (line 59) | def clear_precompiled_assets
    function invoke_assets_precompile_task (line 68) | def invoke_assets_precompile_task

FILE: test/support/webpacker_helpers.rb
  type ShakapackerHelpers (line 3) | module ShakapackerHelpers
    function available? (line 8) | def available?
    function when_shakapacker_available (line 12) | def when_shakapacker_available
    function compile (line 18) | def compile
    function compile_if_missing (line 30) | def compile_if_missing
    function clear_shakapacker_packs (line 36) | def clear_shakapacker_packs
    function with_dev_server (line 43) | def with_dev_server
    function dev_server_running? (line 91) | def dev_server_running?
    function manifest_refresh (line 111) | def manifest_refresh
    function manifest_lookup (line 115) | def manifest_lookup
    function manifest_data (line 119) | def manifest_data

FILE: test/test_helper.rb
  function reset_transformer (line 45) | def reset_transformer
  function wait_for_turbolinks_to_be_available (line 62) | def wait_for_turbolinks_to_be_available
  function assert_compiled_javascript_matches (line 70) | def assert_compiled_javascript_matches(javascript, expectation)
  function assert_compiled_javascript_includes (line 74) | def assert_compiled_javascript_includes(javascript, expected_part)
  function when_stateful_js_context_available (line 78) | def when_stateful_js_context_available
  function expected_working_jsx (line 84) | def expected_working_jsx
  function expected_working_jsx_in_function_component (line 88) | def expected_working_jsx_in_function_component
  type ParamsHelper (line 92) | module ParamsHelper
    function query_params (line 94) | def query_params(params)
Condensed preview — 250 files, each showing path, character count, and a content snippet. Download the .json file or copy for the full structured content (3,200K chars).
[
  {
    "path": ".bowerrc",
    "chars": 30,
    "preview": "{\n  \"directory\" : \"vendor/\"\n}\n"
  },
  {
    "path": ".codeclimate.yml",
    "chars": 87,
    "preview": "version: '2'\nexclude_patterns:\n- lib/assets/\n- react-builds/\n- react_ujs/dist/\n- test/\n"
  },
  {
    "path": ".github/ISSUE_TEMPLATE.md",
    "chars": 555,
    "preview": "Help us help you! Have you looked for similar issues? Do you have reproduction steps? [Contributing Guide](CONTRIBUTING."
  },
  {
    "path": ".github/PULL_REQUEST_TEMPLATE.md",
    "chars": 673,
    "preview": "### Summary\n\n_Remove this paragraph and provide a general description of the code changes in your pull\nrequest... were t"
  },
  {
    "path": ".github/workflows/claude-code-review.yml",
    "chars": 1952,
    "preview": "name: Claude Code Review\n\non:\n  pull_request:\n    types: [opened, synchronize]\n    # Optional: Only run on specific file"
  },
  {
    "path": ".github/workflows/claude.yml",
    "chars": 1886,
    "preview": "name: Claude Code\n\non:\n  issue_comment:\n    types: [created]\n  pull_request_review_comment:\n    types: [created]\n  issue"
  },
  {
    "path": ".github/workflows/rubocop.yml",
    "chars": 671,
    "preview": "name: Rubocop\n\non:\n  push:\n    branches:\n      - 'main'\n  pull_request:\n\njobs:\n  rubocop:\n    name: Rubocop\n    runs-on:"
  },
  {
    "path": ".github/workflows/ruby.yml",
    "chars": 6866,
    "preview": "# This workflow uses actions that are not certified by GitHub.\n# They are provided by a third-party and are governed by\n"
  },
  {
    "path": ".gitignore",
    "chars": 178,
    "preview": "*.gem\n*.log\ntest/*/tmp\ntest/*/public/packs\n*.swp\n/vendor/react\n**/node_modules\nreact-builds/build\ncoverage/\n**/.yalc/**\n"
  },
  {
    "path": ".pryrc",
    "chars": 197,
    "preview": "if defined?(PryByebug)\n  Pry.commands.alias_command 's', 'step'\n  Pry.commands.alias_command 'n', 'next'\n  Pry.commands."
  },
  {
    "path": ".rubocop.yml",
    "chars": 1489,
    "preview": "inherit_from: .rubocop_todo.yml\n\nrequire:\n  - rubocop-performance\n  - rubocop-minitest\n\nAllCops:\n  NewCops: enable\n  Tar"
  },
  {
    "path": ".rubocop_todo.yml",
    "chars": 662,
    "preview": "# This configuration was generated by\n# `rubocop --auto-gen-config`\n# on 2023-06-30 00:26:13 UTC using RuboCop version 1"
  },
  {
    "path": "Appraisals",
    "chars": 487,
    "preview": "appraise 'propshaft' do\n  gem 'propshaft', '~> 1.0.x'\nend\n\nappraise 'sprockets_4' do\n  gem 'sprockets', '~> 4.0.x'\n  gem"
  },
  {
    "path": "CHANGELOG.md",
    "chars": 18054,
    "preview": "# Changelog for React-Rails\n\nIf you need help upgrading `react-rails`, `webpacker` to `shakapacker`, or JS packages, con"
  },
  {
    "path": "CODE_OF_CONDUCT.md",
    "chars": 3217,
    "preview": "# Contributor Covenant Code of Conduct\n\n## Our Pledge\n\nIn the interest of fostering an open and welcoming environment, w"
  },
  {
    "path": "CONTRIBUTING.md",
    "chars": 9241,
    "preview": "# Contributing to React-Rails\n\n🎉 Thanks for taking the time to contribute! 🎉\n\nWith 5 Million+ downloads of the react-rai"
  },
  {
    "path": "Gemfile",
    "chars": 69,
    "preview": "# frozen_string_literal: true\n\nsource \"http://rubygems.org\"\n\ngemspec\n"
  },
  {
    "path": "Guardfile",
    "chars": 219,
    "preview": "guard :minitest do\n  # with Minitest::Unit\n  watch(%r{^test/(.*)\\/?(.*)_test\\.rb$})\n  watch(%r{^lib/(.*/)?([^/]+)\\.rb$})"
  },
  {
    "path": "LICENSE",
    "chars": 11357,
    "preview": "                                 Apache License\n                           Version 2.0, January 2004\n                   "
  },
  {
    "path": "LintingGemfile",
    "chars": 224,
    "preview": "# frozen_string_literal: true\n\nsource \"http://rubygems.org\"\n# To install gems from this Gemfile locally, use BUNDLE_GEMF"
  },
  {
    "path": "README.md",
    "chars": 10261,
    "preview": "# React-Rails v3\n\n[![Gem](https://img.shields.io/gem/v/react-rails.svg?style=flat-square)](http://rubygems.org/gems/reac"
  },
  {
    "path": "Rakefile",
    "chars": 2437,
    "preview": "# frozen_string_literal: true\n\nbegin\n  require \"bundler/setup\"\nrescue LoadError\n  puts \"You must `gem install bundler` a"
  },
  {
    "path": "SECURITY.md",
    "chars": 606,
    "preview": "# Security Policy\n\n## Supported Versions\n\nWe support the [latest version](VERSIONS.md) of the project.\n\n## Reporting a V"
  },
  {
    "path": "VERSIONS.md",
    "chars": 1739,
    "preview": "# Versions\n\nYou can control what version of React.js (and JSXTransformer) is used by `react-rails`:\n\n- Use the [bundled "
  },
  {
    "path": "check_for_uncommitted_files.sh",
    "chars": 255,
    "preview": "#!/bin/bash\nset -e\n\nstatus=$(git status --porcelain)\nif [ -n \"$status\" ]; then\n  status=\"${status//'%'/'%25'}\"\n  status="
  },
  {
    "path": "docs/common-errors.md",
    "chars": 3014,
    "preview": "# Common Errors\n\n<!-- START doctoc generated TOC please keep comment here to allow auto update -->\n<!-- DON'T EDIT THIS "
  },
  {
    "path": "docs/component-generator.md",
    "chars": 3806,
    "preview": "# Component Generator\n\n<!-- START doctoc generated TOC please keep comment here to allow auto update -->\n<!-- DON'T EDIT"
  },
  {
    "path": "docs/controller-actions.md",
    "chars": 951,
    "preview": "# Controller Actions\n\n<!-- START doctoc generated TOC please keep comment here to allow auto update -->\n<!-- DON'T EDIT "
  },
  {
    "path": "docs/get-started.md",
    "chars": 11142,
    "preview": "# Get Started\n\n<!-- START doctoc generated TOC please keep comment here to allow auto update -->\n<!-- DON'T EDIT THIS SE"
  },
  {
    "path": "docs/migrating-from-react-rails-to-react_on_rails.md",
    "chars": 4533,
    "preview": "# Migrating from `react-rails` to `react_on_rails`\n\n<!-- START doctoc generated TOC please keep comment here to allow au"
  },
  {
    "path": "docs/server-side-rendering.md",
    "chars": 4969,
    "preview": "# Server-Side Rendering\n\n<!-- START doctoc generated TOC please keep comment here to allow auto update -->\n<!-- DON'T ED"
  },
  {
    "path": "docs/ujs.md",
    "chars": 3635,
    "preview": "# UJS\n\n<!-- START doctoc generated TOC please keep comment here to allow auto update -->\n<!-- DON'T EDIT THIS SECTION, I"
  },
  {
    "path": "docs/upgrading.md",
    "chars": 1613,
    "preview": "# Upgrading\n\n<!-- START doctoc generated TOC please keep comment here to allow auto update -->\n<!-- DON'T EDIT THIS SECT"
  },
  {
    "path": "docs/view-helper.md",
    "chars": 2459,
    "preview": "# View Helper\n\n<!-- START doctoc generated TOC please keep comment here to allow auto update -->\n<!-- DON'T EDIT THIS SE"
  },
  {
    "path": "gemfiles/base.gemfile",
    "chars": 115,
    "preview": "# This file was generated by Appraisal\n\nsource \"http://rubygems.org\"\n\ngem \"rails\", \"~> 7.0.x\"\n\ngemspec path: \"../\"\n"
  },
  {
    "path": "gemfiles/connection_pool_3.gemfile",
    "chars": 121,
    "preview": "# This file was generated by Appraisal\n\nsource \"http://rubygems.org\"\n\ngem \"connection_pool\", \"~> 3\"\n\ngemspec path: \"../\""
  },
  {
    "path": "gemfiles/propshaft.gemfile",
    "chars": 119,
    "preview": "# This file was generated by Appraisal\n\nsource \"http://rubygems.org\"\n\ngem \"propshaft\", \"~> 1.0.x\"\n\ngemspec path: \"../\"\n"
  },
  {
    "path": "gemfiles/shakapacker.gemfile",
    "chars": 118,
    "preview": "# This file was generated by Appraisal\n\nsource \"http://rubygems.org\"\n\ngem \"shakapacker\", \"7.2.0\"\n\ngemspec path: \"../\"\n"
  },
  {
    "path": "gemfiles/sprockets_3.gemfile",
    "chars": 198,
    "preview": "# This file was generated by Appraisal\n\nsource \"http://rubygems.org\"\n\ngem \"sprockets\", \"~> 3.5\"\ngem \"sprockets-rails\"\nge"
  },
  {
    "path": "gemfiles/sprockets_4.gemfile",
    "chars": 200,
    "preview": "# This file was generated by Appraisal\n\nsource \"http://rubygems.org\"\n\ngem \"sprockets\", \"~> 4.0.x\"\ngem \"sprockets-rails\"\n"
  },
  {
    "path": "lib/assets/javascripts/JSXTransformer.js",
    "chars": 493020,
    "preview": "/**\n * JSXTransformer v0.13.3\n */\n(function(f){if(typeof exports===\"object\"&&typeof module!==\"undefined\"){module.exports"
  },
  {
    "path": "lib/assets/javascripts/react_ujs.js",
    "chars": 7648,
    "preview": "!function(e,t){\"object\"==typeof exports&&\"object\"==typeof module?module.exports=t(require(\"react\"),require(\"react-dom\"),"
  },
  {
    "path": "lib/assets/react-source/development/react-server.js",
    "chars": 757760,
    "preview": "/*\n * ATTENTION: The \"eval\" devtool has been used (maybe by default in mode: \"development\").\n * This devtool is neither "
  },
  {
    "path": "lib/assets/react-source/development/react.js",
    "chars": 1247698,
    "preview": "/*\n * ATTENTION: The \"eval\" devtool has been used (maybe by default in mode: \"development\").\n * This devtool is neither "
  },
  {
    "path": "lib/assets/react-source/production/react-server.js",
    "chars": 115691,
    "preview": "/*! For license information please see react-server.js.LICENSE.txt */\n(()=>{var e={924:(e,t,r)=>{\"use strict\";var n=r(21"
  },
  {
    "path": "lib/assets/react-source/production/react.js",
    "chars": 147054,
    "preview": "/*! For license information please see react-browser.js.LICENSE.txt */\n(()=>{var e,n,t,r,l={511:(e,n,t)=>{\"use strict\";v"
  },
  {
    "path": "lib/generators/react/component_generator.rb",
    "chars": 8058,
    "preview": "# frozen_string_literal: true\n\nmodule React\n  module Generators\n    class ComponentGenerator < ::Rails::Generators::Name"
  },
  {
    "path": "lib/generators/react/install_generator.rb",
    "chars": 4042,
    "preview": "# frozen_string_literal: true\n\nmodule React\n  module Generators\n    class InstallGenerator < ::Rails::Generators::Base\n "
  },
  {
    "path": "lib/generators/templates/.gitkeep",
    "chars": 0,
    "preview": ""
  },
  {
    "path": "lib/generators/templates/component.es6.jsx",
    "chars": 544,
    "preview": "<%= file_header %>\nconst <%= component_name %> = (props) => {\n  return (\n    <React.Fragment>\n<% attributes.each do |att"
  },
  {
    "path": "lib/generators/templates/component.es6.tsx",
    "chars": 666,
    "preview": "<%= file_header %>\ninterface I<%= component_name %>Props {\n  <% if attributes.size > 0 -%>\n  <% attributes.each do |attr"
  },
  {
    "path": "lib/generators/templates/component.js.jsx",
    "chars": 542,
    "preview": "<%= file_header %>\nfunction <%= component_name %>(props) {\n  return (\n    <React.Fragment>\n<% attributes.each do |attrib"
  },
  {
    "path": "lib/generators/templates/component.js.jsx.coffee",
    "chars": 466,
    "preview": "<%= file_header %>class <%= component_name %> extends React.Component\n<% if attributes.size > 0 -%>\n  @propTypes =\n<% at"
  },
  {
    "path": "lib/generators/templates/component.js.jsx.tsx",
    "chars": 932,
    "preview": "<%= file_header %>\n<% unions = attributes.select{ |a| a[:union] } -%>\n<% if unions.size > 0 -%>\n<% unions.each do |e| -%"
  },
  {
    "path": "lib/generators/templates/react_server_rendering.rb",
    "chars": 187,
    "preview": "# frozen_string_literal: true\n\n# To render React components in production, precompile the server rendering manifest:\nRai"
  },
  {
    "path": "lib/generators/templates/server_rendering.js",
    "chars": 196,
    "preview": "//= require react-server\n//= require react_ujs\n//= require ./components\n//\n// By default, this file is loaded for server"
  },
  {
    "path": "lib/generators/templates/server_rendering_pack.js",
    "chars": 300,
    "preview": "// By default, this pack is loaded for server-side rendering.\n// It must expose react_ujs as `ReactRailsUJS` and prepare"
  },
  {
    "path": "lib/react/jsx/babel_transformer.rb",
    "chars": 1032,
    "preview": "# frozen_string_literal: true\n\nrequire \"babel/transpiler\"\nmodule React\n  module JSX\n    # A {React::JSX}-compliant trans"
  },
  {
    "path": "lib/react/jsx/jsx_transformer.rb",
    "chars": 1112,
    "preview": "# frozen_string_literal: true\n\nmodule React\n  module JSX\n    # A {React::JSX}-compliant transformer which uses the depre"
  },
  {
    "path": "lib/react/jsx/processor.rb",
    "chars": 209,
    "preview": "# frozen_string_literal: true\n\nmodule React\n  module JSX\n    # A Sprockets 3+-compliant processor\n    class Processor\n  "
  },
  {
    "path": "lib/react/jsx/sprockets_strategy.rb",
    "chars": 2606,
    "preview": "# frozen_string_literal: true\n\nmodule React\n  module JSX\n    # Depending on the Sprockets version,\n    # attach JSX tran"
  },
  {
    "path": "lib/react/jsx/template.rb",
    "chars": 334,
    "preview": "# frozen_string_literal: true\n\nrequire \"tilt\"\n\nmodule React\n  module JSX\n    # Sprockets 2-compliant processor\n    class"
  },
  {
    "path": "lib/react/jsx.rb",
    "chars": 893,
    "preview": "# frozen_string_literal: true\n\nrequire \"execjs\"\nrequire \"react/jsx/processor\"\nrequire \"react/jsx/template\"\nrequire \"reac"
  },
  {
    "path": "lib/react/rails/asset_variant.rb",
    "chars": 1098,
    "preview": "# frozen_string_literal: true\n\nmodule React\n  module Rails\n    # This class accepts some options for which build you wan"
  },
  {
    "path": "lib/react/rails/component_mount.rb",
    "chars": 3154,
    "preview": "# frozen_string_literal: true\n\nmodule React\n  module Rails\n    # This is the default view helper implementation.\n    # I"
  },
  {
    "path": "lib/react/rails/controller_lifecycle.rb",
    "chars": 2093,
    "preview": "# frozen_string_literal: true\n\nmodule React\n  module Rails\n    # This module is included into ActionController so that\n "
  },
  {
    "path": "lib/react/rails/controller_renderer.rb",
    "chars": 1414,
    "preview": "# frozen_string_literal: true\n\nmodule React\n  module Rails\n    # A renderer class suitable for `ActionController::Render"
  },
  {
    "path": "lib/react/rails/railtie.rb",
    "chars": 5876,
    "preview": "# frozen_string_literal: true\n\nrequire \"rails\"\n\nmodule React\n  module Rails\n    class Railtie < ::Rails::Railtie\n      c"
  },
  {
    "path": "lib/react/rails/test_helper.rb",
    "chars": 594,
    "preview": "# frozen_string_literal: true\n\nmodule React\n  module Rails\n    module TestHelper\n      extend ActiveSupport::Concern\n\n  "
  },
  {
    "path": "lib/react/rails/version.rb",
    "chars": 237,
    "preview": "# frozen_string_literal: true\n\nmodule React\n  module Rails\n    # If you change this, make sure to update VERSIONS.md\n   "
  },
  {
    "path": "lib/react/rails/view_helper.rb",
    "chars": 905,
    "preview": "# frozen_string_literal: true\n\nmodule React\n  module Rails\n    module ViewHelper\n      # This class will be used for ins"
  },
  {
    "path": "lib/react/rails.rb",
    "chars": 284,
    "preview": "# frozen_string_literal: true\n\nrequire \"react/rails/asset_variant\"\nrequire \"react/rails/railtie\"\nrequire \"react/rails/co"
  },
  {
    "path": "lib/react/server_rendering/bundle_renderer/console_polyfill.js",
    "chars": 216,
    "preview": "var console = { history: [] };\n['error', 'log', 'info', 'warn'].forEach(function (fn) {\n  console[fn] = function () {\n  "
  },
  {
    "path": "lib/react/server_rendering/bundle_renderer/console_replay.js",
    "chars": 331,
    "preview": "(function (history) {\n  if (history && history.length > 0) {\n    result += '\\n<scr'+'ipt class=\"react-rails-console-repl"
  },
  {
    "path": "lib/react/server_rendering/bundle_renderer/console_reset.js",
    "chars": 83,
    "preview": "if (typeof console !== \"undefined\" && console.history) {\n  console.history = [];\n}\n"
  },
  {
    "path": "lib/react/server_rendering/bundle_renderer/timeout_polyfill.js",
    "chars": 612,
    "preview": "function getStackTrace() {\n  var stack;\n  try {\n    throw new Error('');\n  }\n  catch (error) {\n    stack = error.stack |"
  },
  {
    "path": "lib/react/server_rendering/bundle_renderer.rb",
    "chars": 4415,
    "preview": "# frozen_string_literal: true\n\nrequire \"react/server_rendering/environment_container\"\nrequire \"react/server_rendering/ma"
  },
  {
    "path": "lib/react/server_rendering/environment_container.rb",
    "chars": 589,
    "preview": "# frozen_string_literal: true\n\nmodule React\n  module ServerRendering\n    # Return asset contents by getting them from a "
  },
  {
    "path": "lib/react/server_rendering/exec_js_renderer.rb",
    "chars": 2248,
    "preview": "# frozen_string_literal: true\n\nmodule React\n  module ServerRendering\n    # A bare-bones renderer for React.js + Exec.js\n"
  },
  {
    "path": "lib/react/server_rendering/manifest_container.rb",
    "chars": 937,
    "preview": "# frozen_string_literal: true\n\nmodule React\n  module ServerRendering\n    # Get asset content by reading the compiled fil"
  },
  {
    "path": "lib/react/server_rendering/propshaft_container.rb",
    "chars": 524,
    "preview": "# frozen_string_literal: true\n\nmodule React\n  module ServerRendering\n    # Return asset contents by getting them from a "
  },
  {
    "path": "lib/react/server_rendering/separate_server_bundle_container.rb",
    "chars": 424,
    "preview": "# frozen_string_literal: true\n\nrequire \"open-uri\"\n\nmodule React\n  module ServerRendering\n    # Get a compiled file from "
  },
  {
    "path": "lib/react/server_rendering/yaml_manifest_container.rb",
    "chars": 968,
    "preview": "# frozen_string_literal: true\n\nmodule React\n  module ServerRendering\n    # Get asset content by reading the compiled fil"
  },
  {
    "path": "lib/react/server_rendering.rb",
    "chars": 1668,
    "preview": "# frozen_string_literal: true\n\nrequire \"connection_pool\"\nrequire \"react/server_rendering/exec_js_renderer\"\nrequire \"reac"
  },
  {
    "path": "lib/react-rails.rb",
    "chars": 213,
    "preview": "# frozen_string_literal: true\n\nrequire \"react\"\nrequire \"react/jsx\"\nrequire \"react/rails\"\nrequire \"react/server_rendering"
  },
  {
    "path": "lib/react.rb",
    "chars": 693,
    "preview": "# frozen_string_literal: true\n\nmodule React\n  # Recursively camelize `props`, returning a new Hash\n  # @param props [Obj"
  },
  {
    "path": "package.json",
    "chars": 699,
    "preview": "{\n  \"name\": \"react_ujs\",\n  \"version\": \"3.2.1\",\n  \"description\": \"Rails UJS for the react-rails gem\",\n  \"repository\": \"re"
  },
  {
    "path": "rakelib/create_release.rake",
    "chars": 6187,
    "preview": "# frozen_string_literal: true\n\nrequire \"English\"\n\ndesc(\"Releases both the gem and node package using the given version.\n"
  },
  {
    "path": "react-builds/package.json",
    "chars": 550,
    "preview": "{\n  \"name\": \"react-rails-builds\",\n  \"version\": \"0.0.0\",\n  \"description\": \"Prepares react-rails asset files\",\n  \"main\": \""
  },
  {
    "path": "react-builds/react-browser.js",
    "chars": 285,
    "preview": "var React = require(\"react\");\nvar ReactDOM = require(\"react-dom\");\nvar createReactClass = require(\"create-react-class\");"
  },
  {
    "path": "react-builds/react-server.js",
    "chars": 566,
    "preview": "// polyfill TextEncoder & TextDecoder onto `util` b/c `node-util` polyfill doesn't include them\n// https://github.com/br"
  },
  {
    "path": "react-builds/webpack.config.js",
    "chars": 569,
    "preview": "// Use `rake react:update` to build this bundle & copy files into the gem.\n// Be sure to set NODE_ENV=production or NODE"
  },
  {
    "path": "react-rails.gemspec",
    "chars": 1879,
    "preview": "# encoding: utf-8\n\n$:.push File.expand_path('../lib', __FILE__)\nrequire 'react/rails/version'\n\nGem::Specification.new do"
  },
  {
    "path": "react_ujs/dist/react_ujs.js",
    "chars": 7648,
    "preview": "!function(e,t){\"object\"==typeof exports&&\"object\"==typeof module?module.exports=t(require(\"react\"),require(\"react-dom\"),"
  },
  {
    "path": "react_ujs/index.js",
    "chars": 7864,
    "preview": "var React = require(\"react\")\nvar ReactDOM = require(\"react-dom\")\nvar ReactDOMServer = require(\"react-dom/server\")\n\nvar d"
  },
  {
    "path": "react_ujs/readme.md",
    "chars": 150,
    "preview": "# react-rails UJS\n\nUJS driver for [`react-rails`](https://github.com/reactjs/react-rails). See the Ruby gem for license,"
  },
  {
    "path": "react_ujs/src/events/detect.js",
    "chars": 1898,
    "preview": "var nativeEvents = require(\"./native\")\nvar pjaxEvents = require(\"./pjax\")\nvar turbolinksEvents = require(\"./turbolinks\")"
  },
  {
    "path": "react_ujs/src/events/native.js",
    "chars": 529,
    "preview": "module.exports = {\n  // Attach handlers to browser events to mount\n  // (There are no unmount handlers since the page is"
  },
  {
    "path": "react_ujs/src/events/pjax.js",
    "chars": 421,
    "preview": "module.exports = {\n  // pjax support\n  setup: function(ujs) {\n    ujs.handleEvent('ready', ujs.handleMount);\n    ujs.han"
  },
  {
    "path": "react_ujs/src/events/turbolinks.js",
    "chars": 245,
    "preview": "module.exports = {\n  // Turbolinks 5+ got rid of named events (?!)\n  setup: function(ujs) {\n  \tujs.handleEvent('turbolin"
  },
  {
    "path": "react_ujs/src/events/turbolinksClassic.js",
    "chars": 451,
    "preview": "module.exports = {\n  // Attach handlers to Turbolinks-Classic events\n  // for mounting and unmounting components\n  setup"
  },
  {
    "path": "react_ujs/src/events/turbolinksClassicDeprecated.js",
    "chars": 552,
    "preview": "module.exports = {\n  // Before Turbolinks 2.4.0, Turbolinks didn't\n  // have named events and didn't have a before-unloa"
  },
  {
    "path": "react_ujs/src/getConstructor/fromGlobal.js",
    "chars": 673,
    "preview": "// Assume className is simple and can be found at top-level (window).\n// Fallback to eval to handle cases like 'My.React"
  },
  {
    "path": "react_ujs/src/getConstructor/fromRequireContext.js",
    "chars": 752,
    "preview": "// Load React components by requiring them from \"components/\", for example:\n//\n// - \"pages/index\" -> `require(\"component"
  },
  {
    "path": "react_ujs/src/getConstructor/fromRequireContextWithGlobalFallback.js",
    "chars": 688,
    "preview": "// Make a function which:\n// - First tries to require the name\n// - Then falls back to global lookup\nvar fromGlobal = re"
  },
  {
    "path": "react_ujs/src/getConstructor/fromRequireContextsWithGlobalFallback.js",
    "chars": 1039,
    "preview": "// Make a function which:\n// - First tries to require the name\n// - Then falls back to global lookup\nvar fromGlobal = re"
  },
  {
    "path": "react_ujs/src/reactDomClient.js",
    "chars": 698,
    "preview": "import ReactDOM from \"react-dom\"\nimport supportsRootApi from \"./supportsRootApi\"\n\nlet reactDomClient = ReactDOM\n\nif (sup"
  },
  {
    "path": "react_ujs/src/renderHelpers.js",
    "chars": 733,
    "preview": "import ReactDOM from \"./reactDomClient\"\nimport supportsRootApi from \"./supportsRootApi\"\n\nexport function supportsHydrati"
  },
  {
    "path": "react_ujs/src/supportsRootApi.js",
    "chars": 383,
    "preview": "var ReactDOM = require(\"react-dom\")\n\nvar reactMajorVersion, supportsRootApi;\nif (typeof ReactDOM != \"undefined\") {\n  rea"
  },
  {
    "path": "react_ujs/webpack.config.js",
    "chars": 630,
    "preview": "module.exports = {\n  context: __dirname,\n  entry: \"./index.js\",\n  output: {\n    path: __dirname + \"/dist/\",\n    filename"
  },
  {
    "path": "test/bin/create-fake-js-package-managers",
    "chars": 926,
    "preview": "#!/usr/bin/env ruby\n# frozen_string_literal: true\n\n# creates a set of fake JavaScript package managers in a temporary bi"
  },
  {
    "path": "test/dummy/.gitignore",
    "chars": 75,
    "preview": "/public/packs\n/node_modules\n/public/packs\n/public/packs-test\n/node_modules\n"
  },
  {
    "path": "test/dummy/.postcssrc.yml",
    "chars": 58,
    "preview": "plugins:\n  postcss-smart-import: {}\n  postcss-cssnext: {}\n"
  },
  {
    "path": "test/dummy/README.rdoc",
    "chars": 478,
    "preview": "== README\n\nThis README would normally document whatever steps are necessary to get the\napplication up and running.\n\nThin"
  },
  {
    "path": "test/dummy/Rakefile",
    "chars": 277,
    "preview": "# frozen_string_literal: true\n\n# Add your own tasks in files placed in lib/tasks ending in .rake,\n# for example lib/task"
  },
  {
    "path": "test/dummy/app/assets/config/manifest.js",
    "chars": 142,
    "preview": "// Sprockets 4 expects this file\n//\n//= link application.js\n//= link turbolinks_only.js\n//= link application.css\n//= lin"
  },
  {
    "path": "test/dummy/app/assets/images/.keep",
    "chars": 0,
    "preview": ""
  },
  {
    "path": "test/dummy/app/assets/javascripts/app_no_turbolinks.js",
    "chars": 70,
    "preview": "//= require react\n//= require react_ujs\n//= require_tree ./components\n"
  },
  {
    "path": "test/dummy/app/assets/javascripts/application.js",
    "chars": 832,
    "preview": "// This is a manifest file that'll be compiled into application.js, which will include all the files\n// listed below.\n//"
  },
  {
    "path": "test/dummy/app/assets/javascripts/components/PlainJSTodo.js",
    "chars": 120,
    "preview": "var Todo = createReactClass({\n  render: function() {\n    return React.createElement(\"li\", null, this.props.todo)\n  }\n})\n"
  },
  {
    "path": "test/dummy/app/assets/javascripts/components/Todo.js.jsx.coffee",
    "chars": 180,
    "preview": "Todo = createReactClass\n  render: ->\n    `<li>{this.props.todo}</li>`\n\n# Because Coffee files are in an anonymous functi"
  },
  {
    "path": "test/dummy/app/assets/javascripts/components/TodoList.js.jsx",
    "chars": 445,
    "preview": "TodoList = createReactClass({\n  getInitialState: function() {\n    return({mounted: \"nope\"});\n  },\n  componentDidMount: f"
  },
  {
    "path": "test/dummy/app/assets/javascripts/components/TodoListWithConsoleLog.js.jsx",
    "chars": 584,
    "preview": "TodoListWithConsoleLog = createReactClass({\n  getInitialState: function() {\n    console.log('got initial state');\n    re"
  },
  {
    "path": "test/dummy/app/assets/javascripts/components/WithSetTimeout.js.jsx",
    "chars": 204,
    "preview": "WithSetTimeout = createReactClass({\n  componentWillMount: function () {\n    setTimeout(function () {}, 1000)\n    clearTi"
  },
  {
    "path": "test/dummy/app/assets/javascripts/components.js",
    "chars": 67,
    "preview": "//= require_self\n//= require_tree ./components\n//= require ./pages\n"
  },
  {
    "path": "test/dummy/app/assets/javascripts/example.js.jsx",
    "chars": 21,
    "preview": "[2, ...[1]];\n<div/>;\n"
  },
  {
    "path": "test/dummy/app/assets/javascripts/example2.js.jsx.coffee",
    "chars": 124,
    "preview": "Component = createReactClass\n  render: ->\n    `<ExampleComponent videos={this.props.videos} />`\n\nthis.Component = Compon"
  },
  {
    "path": "test/dummy/app/assets/javascripts/example3.js.jsx",
    "chars": 8,
    "preview": "<div/>;\n"
  },
  {
    "path": "test/dummy/app/assets/javascripts/flow_types_example.js.jsx",
    "chars": 76,
    "preview": "function flowTypesExample(i: number, name: string): string {\n  return \"OK\"\n}"
  },
  {
    "path": "test/dummy/app/assets/javascripts/harmony_example.js.jsx",
    "chars": 586,
    "preview": "var HarmonyComponent = createReactClass({\n  statics: {\n    generateGreeting() {\n      return \"Hello Harmony!\"\n    },\n   "
  },
  {
    "path": "test/dummy/app/assets/javascripts/pages.js",
    "chars": 598,
    "preview": "var GreetingMessage = createReactClass({\n  getInitialState: function() {\n    var initialGreeting = 'Hello';\n    if (type"
  },
  {
    "path": "test/dummy/app/assets/javascripts/require_test/jsx_preprocessor_test.jsx",
    "chars": 144,
    "preview": "//= require ./jsx_require_child_jsx\n//= require ./jsx_require_child_js\n//= require ./jsx_require_child_coffee\n<div class"
  },
  {
    "path": "test/dummy/app/assets/javascripts/require_test/jsx_require_child_coffee.coffee",
    "chars": 21,
    "preview": "requireCoffee = true\n"
  },
  {
    "path": "test/dummy/app/assets/javascripts/require_test/jsx_require_child_js.js",
    "chars": 35,
    "preview": "var requirePlainJavascript = true;\n"
  },
  {
    "path": "test/dummy/app/assets/javascripts/require_test/jsx_require_child_jsx.jsx",
    "chars": 32,
    "preview": "<div className=\"require-jsx\" />\n"
  },
  {
    "path": "test/dummy/app/assets/javascripts/server_rendering.js",
    "chars": 72,
    "preview": "//= require react-server\n//= require react_ujs\n//= require ./components\n"
  },
  {
    "path": "test/dummy/app/assets/javascripts/turbolinks_only.js",
    "chars": 23,
    "preview": "//= require turbolinks\n"
  },
  {
    "path": "test/dummy/app/assets/stylesheets/application.css",
    "chars": 546,
    "preview": "/*\n * This is a manifest file that'll be compiled into application.css, which will include all the files\n * listed below"
  },
  {
    "path": "test/dummy/app/controllers/application_controller.rb",
    "chars": 237,
    "preview": "# frozen_string_literal: true\n\nclass ApplicationController < ActionController::Base\n  # Prevent CSRF attacks by raising "
  },
  {
    "path": "test/dummy/app/controllers/concerns/.keep",
    "chars": 0,
    "preview": ""
  },
  {
    "path": "test/dummy/app/controllers/counters_controller.rb",
    "chars": 199,
    "preview": "# frozen_string_literal: true\n\nclass CountersController < ApplicationController\n  def index\n    @counters = [{ name: \"Co"
  },
  {
    "path": "test/dummy/app/controllers/pack_components_controller.rb",
    "chars": 174,
    "preview": "# frozen_string_literal: true\n\nclass PackComponentsController < ApplicationController\n  # make sure Sprockets applicatio"
  },
  {
    "path": "test/dummy/app/controllers/pages_controller.rb",
    "chars": 805,
    "preview": "# frozen_string_literal: true\n\nclass PagesController < ApplicationController\n  per_request_react_rails_prerenderer if Sh"
  },
  {
    "path": "test/dummy/app/controllers/server_controller.rb",
    "chars": 1046,
    "preview": "# frozen_string_literal: true\n\nclass ServerController < ApplicationController\n  def show\n    @component_name = params[:c"
  },
  {
    "path": "test/dummy/app/helpers/application_helper.rb",
    "chars": 60,
    "preview": "# frozen_string_literal: true\n\nmodule ApplicationHelper\nend\n"
  },
  {
    "path": "test/dummy/app/javascript/components/Counter.js",
    "chars": 536,
    "preview": "var React = require(\"react\");\nvar createReactClass = require(\"create-react-class\");\n\nmodule.exports = createReactClass({"
  },
  {
    "path": "test/dummy/app/javascript/components/GreetingMessage.js",
    "chars": 693,
    "preview": "var React = require(\"react\")\nvar createReactClass = require(\"create-react-class\")\n\nmodule.exports = createReactClass({\n "
  },
  {
    "path": "test/dummy/app/javascript/components/Todo.js",
    "chars": 209,
    "preview": "var React = require(\"react\")\nvar createReactClass = require(\"create-react-class\")\n\nmodule.exports = createReactClass({\n "
  },
  {
    "path": "test/dummy/app/javascript/components/TodoList.js",
    "chars": 563,
    "preview": "var React = require(\"react\")\nvar createReactClass = require(\"create-react-class\")\n\nmodule.exports = createReactClass({\n "
  },
  {
    "path": "test/dummy/app/javascript/components/TodoListWithConsoleLog.js",
    "chars": 765,
    "preview": "var React = require(\"react\")\nvar createReactClass = require(\"create-react-class\")\n\nmodule.exports = createReactClass({\n "
  },
  {
    "path": "test/dummy/app/javascript/components/WithSetTimeout.js",
    "chars": 287,
    "preview": "var React = require(\"react\")\nvar createReactClass = require(\"create-react-class\")\n\nmodule.exports = createReactClass({\n "
  },
  {
    "path": "test/dummy/app/javascript/components/export_default_component.js",
    "chars": 154,
    "preview": "var React = require(\"react\")\n\nexport default class ExportDefaultComponent extends React.Component {\n  render() {\n    ret"
  },
  {
    "path": "test/dummy/app/javascript/components/named_export_component.js",
    "chars": 113,
    "preview": "var React = require(\"react\")\n\nmodule.exports = {\n  Component: function(props) { return <h2>Named Export</h2> }\n}\n"
  },
  {
    "path": "test/dummy/app/javascript/components/subfolder/exports_component.js",
    "chars": 93,
    "preview": "var React = require(\"react\")\n\nmodule.exports = function(props) {\n  return <h2>Exports</h2>\n}\n"
  },
  {
    "path": "test/dummy/app/javascript/controllers/mount_counters.js",
    "chars": 641,
    "preview": "var { Controller } = require(\"@hotwired/stimulus\");\nvar ReactRailsUJS = require(\"react_ujs\");\n\nmodule.exports = class ex"
  },
  {
    "path": "test/dummy/app/javascript/packs/application.js",
    "chars": 522,
    "preview": "require(\"@hotwired/turbo-rails\");\nvar { Application } = require(\"@hotwired/stimulus\");\nvar MountCountersController = req"
  },
  {
    "path": "test/dummy/app/javascript/packs/server_rendering.js",
    "chars": 300,
    "preview": "// By default, this pack is loaded for server-side rendering.\n// It must expose react_ujs as `ReactRailsUJS` and prepare"
  },
  {
    "path": "test/dummy/app/mailers/.keep",
    "chars": 0,
    "preview": ""
  },
  {
    "path": "test/dummy/app/models/.keep",
    "chars": 0,
    "preview": ""
  },
  {
    "path": "test/dummy/app/models/concerns/.keep",
    "chars": 0,
    "preview": ""
  },
  {
    "path": "test/dummy/app/pants/yfronts.js",
    "chars": 47,
    "preview": "// used for testing file watcher configuration\n"
  },
  {
    "path": "test/dummy/app/views/counters/create.turbo_stream.erb",
    "chars": 96,
    "preview": "<%= turbo_stream.append :counters do %>\n  <%= react_component(\"Counter\", @counter) %>\n<% end %>\n"
  },
  {
    "path": "test/dummy/app/views/counters/index.html.erb",
    "chars": 367,
    "preview": "<h2>React 18 bug reproduction</h2>\n\n<%= turbo_frame_tag :counters, data: { controller: \"mount-counters\" } do %>\n  <% @co"
  },
  {
    "path": "test/dummy/app/views/layouts/app_no_turbolinks.html.erb",
    "chars": 175,
    "preview": "<!DOCTYPE html>\n<html>\n<head>\n  <title>Dummy</title>\n  <%= javascript_include_tag \"app_no_turbolinks\" %>\n  <%= csrf_meta"
  },
  {
    "path": "test/dummy/app/views/layouts/application.html.erb",
    "chars": 344,
    "preview": "<!DOCTYPE html>\n<html>\n<head>\n  <title>Dummy</title>\n  <% if ShakapackerHelpers.available? %>\n    <%= javascript_pack_ta"
  },
  {
    "path": "test/dummy/app/views/pack_components/show.html.erb",
    "chars": 329,
    "preview": "<%= javascript_pack_tag \"application\" if ShakapackerHelpers.available? %>\n\n<!-- Test each way of exporting a component -"
  },
  {
    "path": "test/dummy/app/views/pages/_component_with_inner_html.html.erb",
    "chars": 148,
    "preview": "<%= react_component 'GreetingMessage', { :name => 'Name' }, { :id => 'component' } do %>\n  <div id=\"unique-nested-id\">Ne"
  },
  {
    "path": "test/dummy/app/views/pages/show.html.erb",
    "chars": 1129,
    "preview": "<ul>\n  <li><%= link_to 'Alice', page_path(id: 0) %></li>\n  <li><%= link_to 'Bob', page_path(id: 1) %></li>\n</ul>\n\n<div i"
  },
  {
    "path": "test/dummy/app/views/server/console_example.html.erb",
    "chars": 84,
    "preview": "<%= react_component \"TodoListWithConsoleLog\", {todos: @todos}, {prerender: true} %>\n"
  },
  {
    "path": "test/dummy/app/views/server/console_example_suppressed.html.erb",
    "chars": 84,
    "preview": "<%= react_component \"TodoListWithConsoleLog\", {todos: @todos}, {prerender: true} %>\n"
  },
  {
    "path": "test/dummy/app/views/server/show.html.erb",
    "chars": 75,
    "preview": "<%= react_component @component_name, {todos: @todos}, {prerender: true} %>\n"
  },
  {
    "path": "test/dummy/babel.config.js",
    "chars": 891,
    "preview": "module.exports = function (api) {\n  const defaultConfigFunc = require('shakapacker/package/babel/preset.js')\n  const res"
  },
  {
    "path": "test/dummy/bin/bundle",
    "chars": 156,
    "preview": "#!/usr/bin/env ruby\n# frozen_string_literal: true\n\nENV[\"BUNDLE_GEMFILE\"] ||= File.expand_path(\"../Gemfile\", __dir__)\nloa"
  },
  {
    "path": "test/dummy/bin/rails",
    "chars": 172,
    "preview": "#!/usr/bin/env ruby\n# frozen_string_literal: true\n\nAPP_PATH = File.expand_path(\"../config/application\", __dir__)\nrequire"
  },
  {
    "path": "test/dummy/bin/rake",
    "chars": 121,
    "preview": "#!/usr/bin/env ruby\n# frozen_string_literal: true\n\nrequire_relative \"../config/boot\"\nrequire \"rake\"\nRake.application.run"
  },
  {
    "path": "test/dummy/bin/shakapacker",
    "chars": 441,
    "preview": "#!/usr/bin/env ruby\n# frozen_string_literal: true\n\nrequire \"pathname\"\nrequire \"bundler/setup\"\nrequire \"shakapacker\"\nrequ"
  },
  {
    "path": "test/dummy/bin/shakapacker-dev-server",
    "chars": 491,
    "preview": "#!/usr/bin/env ruby\n# frozen_string_literal: true\n\nENV[\"RAILS_ENV\"] ||= \"development\"\nENV[\"NODE_ENV\"]  ||= ENV.fetch(\"RA"
  },
  {
    "path": "test/dummy/bin/yarn",
    "chars": 302,
    "preview": "#!/usr/bin/env ruby\n# frozen_string_literal: true\n\nVENDOR_PATH = File.expand_path(\"..\", __dir__)\nDir.chdir(VENDOR_PATH) "
  },
  {
    "path": "test/dummy/config/application.rb",
    "chars": 1903,
    "preview": "# frozen_string_literal: true\n\nrequire File.expand_path(\"boot\", __dir__)\nrequire_relative(\"../../support/sprockets_helpe"
  },
  {
    "path": "test/dummy/config/boot.rb",
    "chars": 264,
    "preview": "# frozen_string_literal: true\n\n# Set up gems listed in the Gemfile.\nENV[\"BUNDLE_GEMFILE\"] ||= File.expand_path(\"../../.."
  },
  {
    "path": "test/dummy/config/environment.rb",
    "chars": 178,
    "preview": "# frozen_string_literal: true\n\n# Load the Rails application.\nrequire File.expand_path(\"application\", __dir__)\n\n# Initial"
  },
  {
    "path": "test/dummy/config/environments/development.rb",
    "chars": 729,
    "preview": "# frozen_string_literal: true\n\nDummy::Application.configure do\n  # Settings specified here will take precedence over tho"
  },
  {
    "path": "test/dummy/config/environments/production.rb",
    "chars": 3278,
    "preview": "# frozen_string_literal: true\n\nDummy::Application.configure do\n  # Settings specified here will take precedence over tho"
  },
  {
    "path": "test/dummy/config/environments/test.rb",
    "chars": 1687,
    "preview": "# frozen_string_literal: true\n\nDummy::Application.configure do\n  # Settings specified here will take precedence over tho"
  },
  {
    "path": "test/dummy/config/initializers/backtrace_silencers.rb",
    "chars": 435,
    "preview": "# frozen_string_literal: true\n\n# Be sure to restart your server when you modify this file.\n\n# You can add backtrace sile"
  },
  {
    "path": "test/dummy/config/initializers/filter_parameter_logging.rb",
    "chars": 225,
    "preview": "# frozen_string_literal: true\n\n# Be sure to restart your server when you modify this file.\n\n# Configure sensitive parame"
  },
  {
    "path": "test/dummy/config/initializers/inflections.rb",
    "chars": 678,
    "preview": "# frozen_string_literal: true\n\n# Be sure to restart your server when you modify this file.\n\n# Add new inflection rules u"
  },
  {
    "path": "test/dummy/config/initializers/mime_types.rb",
    "chars": 236,
    "preview": "# frozen_string_literal: true\n\n# Be sure to restart your server when you modify this file.\n\n# Add new mime types for use"
  },
  {
    "path": "test/dummy/config/initializers/react.rb",
    "chars": 547,
    "preview": "# frozen_string_literal: true\n\n# Override setting set in application.rb\nclass CustomComponentMount < React::Rails::Compo"
  },
  {
    "path": "test/dummy/config/initializers/secret_token.rb",
    "chars": 827,
    "preview": "# frozen_string_literal: true\n\n# Be sure to restart your server when you modify this file.\n\n# Your secret key is used fo"
  },
  {
    "path": "test/dummy/config/initializers/session_store.rb",
    "chars": 169,
    "preview": "# frozen_string_literal: true\n\n# Be sure to restart your server when you modify this file.\n\nDummy::Application.config.se"
  },
  {
    "path": "test/dummy/config/initializers/wrap_parameters.rb",
    "chars": 548,
    "preview": "# frozen_string_literal: true\n\n# Be sure to restart your server when you modify this file.\n\n# This file contains setting"
  },
  {
    "path": "test/dummy/config/locales/en.yml",
    "chars": 634,
    "preview": "# Files in the config/locales directory are used for internationalization\n# and are automatically loaded by Rails. If yo"
  },
  {
    "path": "test/dummy/config/routes.rb",
    "chars": 550,
    "preview": "# frozen_string_literal: true\n\nDummy::Application.routes.draw do\n  get \"no-turbolinks\", to: \"pages#no_turbolinks\"\n  reso"
  },
  {
    "path": "test/dummy/config/shakapacker.yml",
    "chars": 874,
    "preview": "# Note: You must restart bin/webpack-dev-server for changes to take effect\n\ndefault: &default\n  source_path: app/javascr"
  },
  {
    "path": "test/dummy/config/webpack/clientWebpackConfig.js",
    "chars": 523,
    "preview": "const commonWebpackConfig = require('./commonWebpackConfig')\n\nconst configureClient = () => {\n  const clientConfig = com"
  },
  {
    "path": "test/dummy/config/webpack/commonWebpackConfig.js",
    "chars": 845,
    "preview": "// Common configuration applying to client and server configuration\n\nconst { generateWebpackConfig, merge } = require('s"
  },
  {
    "path": "test/dummy/config/webpack/development.js",
    "chars": 661,
    "preview": "const { devServer, inliningCss } = require('shakapacker')\n\nconst webpackConfig = require('./serverClientOrBoth')\n\nconst "
  },
  {
    "path": "test/dummy/config/webpack/production.js",
    "chars": 237,
    "preview": "const webpackConfig = require('./serverClientOrBoth')\n\nconst productionEnvOnly = (_clientWebpackConfig, _serverWebpackCo"
  },
  {
    "path": "test/dummy/config/webpack/serverClientOrBoth.js",
    "chars": 1164,
    "preview": "const clientWebpackConfig = require('./clientWebpackConfig')\nconst serverWebpackConfig = require('./serverWebpackConfig'"
  }
]

// ... and 50 more files (download for full content)

About this extraction

This page contains the full source code of the reactjs/react-rails GitHub repository, extracted and formatted as plain text for AI agents and large language models (LLMs). The extraction includes 250 files (2.9 MB), approximately 783.7k tokens, and a symbol index with 1300 extracted functions, classes, methods, constants, and types. Use this with OpenClaw, Claude, ChatGPT, Cursor, Windsurf, or any other AI tool that accepts text input. You can copy the full output to your clipboard or download it as a .txt file.

Extracted by GitExtract — free GitHub repo to text converter for AI. Built by Nikandr Surkov.

Copied to clipboard!