Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Fix error codes #7999

Merged
merged 5 commits into from
Nov 8, 2016
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
13 changes: 6 additions & 7 deletions gulpfile.js
Original file line number Diff line number Diff line change
Expand Up @@ -266,13 +266,12 @@ gulp.task('react:modules', function() {
});

gulp.task('react:extract-errors', function() {
return merge(
gulp.src(paths.react.src).pipe(extractErrors(errorCodeOpts)),
gulp.src(paths.reactDOM.src).pipe(extractErrors(errorCodeOpts)),
gulp.src(paths.reactNative.src).pipe(extractErrors(errorCodeOpts)),
gulp.src(paths.reactTestRenderer.src).pipe(extractErrors(errorCodeOpts)),
gulp.src(paths.reactNoopRenderer.src).pipe(extractErrors(errorCodeOpts))
);
return gulp.src([].concat(
paths.react.src,
paths.reactDOM.src,
paths.reactNative.src,
paths.reactTestRenderer.src
)).pipe(extractErrors(errorCodeOpts));
Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@gaearon I rebased and removed reactNoopRenderer from the list of extract-errors targets. Please let me know if it makes sense!

Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Yea, totally. I was just copy pasting.

});

gulp.task('default', ['react:modules']);
14 changes: 14 additions & 0 deletions scripts/error-codes/README.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
The error code system substitutes React's invariant error messages with error IDs to provide a better debugging support in production. Check out the blog post [here](https://facebook.github.io/react/blog/2016/07/11/introducing-reacts-error-code-system.html).

## Note for cutting a new React release
1. For each release, we run `gulp react:extract-errors` to update the error codes before calling `npm run build`. The build process uses `codes.json` for a production (minified) build; there should be no warning like `Error message "foo" cannot be found` for a successful release.
2. The updated `codes.json` file should be synced back to the master branch. The error decoder page in our documentation site uses `codes.json` from master; if the json file has been updated, the docs site should also be rebuilt (`rake copy_error_codes` is included in the default `rake release` task).
3. It's not recommended to run `gulp react:extract-errors` directly in master since it may contain commits that are not cherry-picked to a release branch. These error messages might be changed/removed before cutting a new release, and we don't want to add intermediate/temporary error messages to `codes.json`. However, if a PR changes an existing error message and there's a specific production test (which is rare), it's ok to update `codes.json` for that. Please use `gulp react:extract-errors` and don't edit the file manually.

## Structure
The error code system consists of 5 parts:
- [`codes.json`](https://github.com/facebook/react/blob/master/scripts/error-codes/codes.json) contains the mapping from IDs to error messages. This file is generated by the Gulp plugin and is used by both the Babel plugin and the error decoder page in our documentation. This file is append-only, which means an existing code in the file will never be changed/removed.
- [`gulp-extract-errors.js`](https://github.com/facebook/react/blob/master/scripts/error-codes/gulp-extract-errors.js) is a gulp plugin that traverses our codebase and updates `codes.json`. Use it by calling `gulp react:extract-errors`.
- [`dev-expression-with-codes.js`](https://github.com/facebook/react/blob/master/scripts/error-codes/dev-expression-with-codes.js) is a Babel pass that rewrites error messages to IDs for a production (minified) build. Notice that this plugin is not in `.babelrc`; it's being used in the [`gulpfile.js`](https://github.com/facebook/react/blob/master/gulpfile.js#L21) and it has to be run before [`rewrite-modules`](https://github.com/facebook/fbjs/blob/master/packages/babel-preset-fbjs/plugins/rewrite-modules.js) since we search for `require('invariant')` but not `require('./invariant')`.
- [`reactProdInvariant.js`](https://github.com/facebook/react/blob/master/src/shared/utils/reactProdInvariant.js) is the replacement for `invariant` in production. This file gets imported by the Babel plugin and should _not_ be used manually.
- [`ErrorDecoderComponent`](https://github.com/facebook/react/blob/master/docs/_js/ErrorDecoderComponent.js) is a React component that lives at https://facebook.github.io/react/docs/error-decoder.html. This page takes parameters like `?invariant=109&args[]=Foo` and displays a corresponding error message. Our documentation site's [`Rakefile`](https://github.com/facebook/react/blob/master/docs/Rakefile#L64-L69) has a task (`bundle exec rake copy_error_codes`) for adding the latest `codes.json` to the error decoder page. This task is included in the default `bundle exec rake release` task.
10 changes: 9 additions & 1 deletion scripts/error-codes/codes.json
Original file line number Diff line number Diff line change
Expand Up @@ -134,5 +134,13 @@
"132": "Ended a touch event which was not counted in trackedTouchCount.",
"133": "Touch object is missing identifier",
"134": "Touch data should have been recorded on start",
"135": "Cannot find single active touch"
"135": "Cannot find single active touch",
"136": "Attempted to update component `%s` that has already been unmounted (or failed to mount).",
"137": "%s is a void element tag and must neither have `children` nor use `dangerouslySetInnerHTML`.%s",
"138": "Touch object is missing identifier.",
"139": "ReactTestRenderer: .update() can't be called after unmount.",
"140": "Expected hook events to fire for the child before its parent includes it in onSetChildren().",
"141": "Expected onSetChildren() to fire for a container child before its parent includes it in onSetChildren().",
"142": "Expected onBeforeMountComponent() parent and onSetChildren() to be consistent (%s has parents %s and %s).",
"143": "React.Children.only expected to receive a single React element child."
}