Commit Graph

451 Commits

Author SHA1 Message Date
Pieter De Baets 283df8d55f Enable Jest tests
Reviewed By: @amasad

Differential Revision: D2422290
2015-09-20 16:48:35 -07:00
Christoph Pojer 3f02fd9371 Codemod tests to use top-level-requires
Reviewed By: @DmitrySoshnikov

Differential Revision: D2456250
2015-09-19 15:41:29 -07:00
DengYun 9e37caebbb Generate module name seperated by '/' on Windows.
Summary: I think packager on different platform should generate same output if possible. So packager should replace '\\' in module name with '/' on Windows.

Closes https://github.com/facebook/react-native/pull/2813

Reviewed By: @​svcscm

Differential Revision: D2458634

Pulled By: @martinbigio
2015-09-18 15:15:28 -07:00
mqli d7dadf9a5c Fixing the packager infinite loop on Windows
Summary: The issue here https://github.com/facebook/react-native/issues/2787

The root path '/' dosn't match windows root path
Closes https://github.com/facebook/react-native/pull/2789

Reviewed By: @​svcscm

Differential Revision: D2452718

Pulled By: @martinbigio
2015-09-18 06:05:22 -07:00
facebook-github-bot-6 b1943d588c Get back 100% in sync with fb codebase 2015-09-16 10:30:53 -07:00
Martín Bigio c1c61a4e88 defeat race condition when replying to client
Summary: @​public

The server dies after 30 seconds if it has no jobs on it's queue. The problem is that the jobs counter gets decreased before returning the bytes to the client. As a consequence, it's possible that the server dies while it's returning the bytes to the client, or just after it finished returning the bytes to the client.

To avoid both issues lets move the counter decrease a few lines below and bump the timer to make sure we have time to fully write the bytes on the socket and let the client close the connection before the server dies.

Reviewed By: @vjeux

Differential Revision: D2445264
2015-09-15 16:25:25 -07:00
Amjad Masad 86a099d00a Refactor DependencyResolver into request/response
Reviewed By: @martinbigio

Differential Revision: D2425842
2015-09-11 17:01:35 -07:00
Christopher Chedeau 87d4d3c55c Revert internal files that didn't get pulled internally first
See all the packager files in this commit:
f83675d191 (diff-7b5603771e245e5b0cd7223277db3db4)

cc @foghina
2015-09-11 16:59:28 -07:00
Amjad Masad 676c1c3a45 Fix server tests
Summary: @​public
Invoking an extra promise caused failures in the promise-based tests. This fixes them.

Reviewed By: @vjeux

Differential Revision: D2432431
2015-09-11 13:30:33 -07:00
Amjad Masad 2c321df75c Client should throw when server unexpectedly closes the connection
Reviewed By: @natthu

Differential Revision: D2425357
2015-09-09 16:35:25 -07:00
Amjad Masad b8209572bb Handle EEXIST error when starting the server
Reviewed By: @cpojer

Differential Revision: D2426373
2015-09-09 16:10:33 -07:00
Amjad Masad c308774bc1 Protect against races in deleting corrupt cache
Reviewed By: @cpojer

Differential Revision: D2426450
2015-09-09 16:05:39 -07:00
Amjad Masad 68fb275c78 Pass in platform argument in offline building
Summary: how did this ever work?
All build jobs must pass in the platform argument.
This also turns the "platform" argument into a required one.

I added a task to infer the platform argument from the filename here: t8306875

Reviewed By: @martinbigio

Differential Revision: D2425114
2015-09-09 14:45:58 -07:00
Christopher Chedeau ef080b699d Fix declareOpts test
Summary: When we updated joi, the error message was changed. I removed the content to prevent similar errors in the future.

Reviewed By: @amasad

Differential Revision: D2424048
2015-09-09 11:25:28 -07:00
Tadeu Zagallo 91e235465b Move systrace helper out of the packager
Summary: @​public

The profiler helper shouldn't live inside the packager itself, move
it to the packager.js file with other middlewares.

Reviewed By: @martinbigio

Differential Revision: D2424878
2015-09-09 11:25:24 -07:00
Christopher Chedeau b59784573b Revert "unbreak tests"
This reverts commit f9b2709c8d39b1ec6f729d315855f05d427ab75b.
2015-09-09 11:10:50 -07:00
Christopher Chedeau 086adda39b unbreak tests 2015-09-08 20:00:42 -07:00
Christopher Chedeau 1a428c2c90 Updates from Tue 8 Sep 2015-09-08 16:54:44 -07:00
Alex Kotliarskyi 802578a78e [ReactNative] Pipe `platform` option all the way to the asset server 2015-09-08 11:37:38 -08:00
Martín Bigio 7beb248c06 [react-packager] Bump ipc timeout 2015-09-08 04:50:25 -08:00
Amjad Masad 2727f4b5ea [react-packager] Allow a longer startup time before the server dies
Summary:
1. When the server starts up, it only gives itself 30 second to live before receiving any connections/jobs
2. There is a startup cost with starting the server and handshaking
3. The server dies before the client has a chance to connect to it

Solution:
1. While the server should die pretty fast after it's done it's work, we should have a longer timeout for starting it
2. I also added accompanying server logs with client connection errors
2015-09-07 10:31:49 -08:00
Amjad Masad b7d76074a0 [react-packager] Support platform extensions in image requires
Summary:
We don't currently support platform extensions in asset modules.
This adds supports for it:

```
require('./a.png');
```

Will require 'a.ios.png' if it exists and 'a.png' if it doesn't.
2015-09-04 15:17:14 -08:00
Tadeu Zagallo 79abdb2250 [RectNative][Packager] Cache minification result
Summary:
The packager just cached the result of the bundle, but would minify
it on every request. Change it to cache the minification result.
2015-09-04 12:22:50 -08:00
Amjad Masad 734edf5cd4 [react-packager] Socket Server should not die while there active connections
Summary:
Saw an issue with a build because of an ENONT error: https://fb.facebook.com/groups/716936458354972/permalink/923628747685741/

My hypothesis:

1. We issue a ping to the socket (in SocketInterface/index.js) a decides if the available socket is alive
2. We see that it's alive but by the time we actually connect to it the server would've died

Solution:

1. The server shouldn't die as long as there are clients connected to it (currently it only stay alive as long as there are jobs)
2. The "ping" should only disconnect once the client is connected
3. Finally, have a better error message than ENOENT
2015-09-03 14:48:19 -08:00
Tadeu Zagallo bcbe99b3af [ReactNative][Packager] Fix source maps for minified sources
Summary:
The packager was ignoring minification for source map requests.
2015-09-03 12:01:57 -08:00
Spencer Ahrens bad0a5cb46 Updates from Thu Sep 3rd. 2015-09-03 12:55:40 -07:00
Amjad Masad 672b7b0070 [react-packager] Sourcemap url should include the same args as the bundle url
Summary:
Sourcemap urls were generated as just the pathname (no options) which meant that they generated source for the wrong bundle.

Even worse, there exists a race condition when multiple request to the same bundle has different types of paltform arguments (in this case one could be 'ios' and the other is undefined). The fix will this will come later as it's more involved -- will need to refactor the dependency resolver to have a per-request state.
2015-09-02 15:34:54 -08:00
Amjad Masad c48ce25de6 [react-packager] Fix cache issues 2015-09-01 16:43:17 -08:00
Amjad Masad f9b1658c6f [react-pacakger] Max idle time for socket server is too long 2015-09-01 11:40:47 -08:00
Spencer Ahrens 0621018da6 Updates from Mon Aug 31st. 2015-08-31 16:31:41 -07:00
Amjad Masad c980942899 [react-pacakger] Fix failing test
Summary:
Fix failing test that matches the exact error string to match using `contains`.

I was under the impression that jest tests were running in CI -- turns out not yet.
2015-08-31 12:42:29 -08:00
Amjad Masad 217f12a08f [react-packager] Fail loudly with errors from the transformer 2015-08-31 09:27:26 -08:00
Martín Bigio b617c43a03 [react-packager] Cache BundlesLayout 2015-08-31 07:13:35 -08:00
Martín Bigio 42ee9b1ca6 [react-packager] `System.import` transform 2015-08-27 09:28:48 -08:00
Amjad Masad 3c3af9c609 [react-packager] Fix races
Summary:
A few potential races to fix:

1. Multiple clients maybe racing to delete a zombie socket
2. Servers who should die because other servers are already listening are taking the socket with them (move `process.on('exit'` code to after the server is listening
3. Servers which are redundant should immediatly die
2015-08-27 01:41:11 -08:00
Amjad Masad 1892f4aba4 [react-packager] bump create server timeout to 60s 2015-08-26 23:11:44 -08:00
Alex Kotliarskyi a5e6cc568b [react-native] Fix tests and re-enable CI 2015-08-26 20:58:24 -08:00
Martín Bigio 971b70d72f [react-packager] Make sure server is listening on socket 2015-08-26 16:25:17 -08:00
Martin Konicek 8b317dc05c Updates from Wed 26 Aug 2015-08-26 14:04:01 +01:00
Amjad Masad 84f498cd2b [react-packager] Cleanup socket interface code 2015-08-25 17:36:08 -08:00
Amjad Masad 782aafd16a [react-native] bump create server timeout 2015-08-25 17:13:13 -08:00
Martin Konicek ecc89a8383 Add chalk mock 2015-08-25 22:02:19 +01:00
Martin Konicek 39681a6649 Updates from Tue 25 Aug 2015-08-25 19:21:59 +01:00
Martin Konicek fc90a2de9a [ReactNative] Unbreak OSS packager JS tests 2015-08-25 10:18:39 -08:00
Natansh Verma 5cf5ecc319 Revert "[packager] Unbreak Bundler test" 2015-08-25 09:53:45 -08:00
Amjad Masad 54125e524a [react-packager] Expose a socket interface
Summary:
Buck (our build system) currently starts multiple packager instances for each target and may build multiple targets in parallel. This means we're paying startup costs and are duplicating the work. This enables us to start one instance of the packager and connect to it via socket to do all the work that needs to be done.

The way this is structured:

1. SocketServer: A server that listens on a socket path that is generated based on the server options
2. SocketClient: Interfaces with the server and exposes the operations that we support as methods
3. SocketInterface: Integration point and responsible for forking off the server
2015-08-25 09:37:08 -08:00
Martin Konicek 81d5a70806 [packager] Unbreak Bundler test 2015-08-25 09:24:42 -08:00
Krzysztof Magiera c4f5334e92 [ReactNative] Respect --assets-dest in "download from server" mode 2015-08-25 07:22:05 -08:00
Martín Bigio 976e6927ca [react-packager] Fix OSS tests 2015-08-24 18:49:05 -08:00
Amjad Masad 1ff4e914f8 [react-packager] Implement transformer progress bar
Summary:
The transform step in currently the longest one in the bundling process. This adds a progress bar to track the transform progress.

{F23096660}
2015-08-24 16:09:34 -08:00
Christopher Chedeau c675840fd9 [Logs] Name fs step
Summary:
There are two fs steps and it wasn't clear why. This now puts the right label:

```
[9:38:25 PM] <START> Building in-memory fs for JavaScript
[9:38:27 PM] <END>   Building in-memory fs for JavaScript (2030ms)
[9:38:27 PM] <START> Building in-memory fs for Assets
[9:38:27 PM] <END>   Building in-memory fs for Assets (615ms)
```
2015-08-21 14:29:05 -07:00
Martin Bigio 569bf00280 [react-packager] unbreak tests 2015-08-21 09:38:37 -07:00
Martín Bigio 6eea41c718 [react-packager] Avoid referring `Module` like objects in `BundlesLayout`
Summary:
The `BundlesLayout` will be used as a persistent index. As such, it would be easier to avoid having dependencies to `Module`, `Package`, `Asset`, etc. We're not using that information for now and if we happen to need to use it we could always fetch it using the `ModuleCache`.
2015-08-21 08:13:58 -07:00
Martín Bigio 51e1a1f6a2 [react-packager] Move async dependencies to `System.import`
Summary:
We've decided to move the syntax for asynchronously requiring async dependencies. The new syntax works better with promises and therefore withe async/await as well. The new syntax looks like this: `System.import('moduleA').then(moduleA => {...});` or if you're using async/await you could simply do:
  let moduleA = await System.import('moduleA');
  new moduleA().someFunction();

If you need to require multiple dependencies just do:
  Promise
    .all([System.import('moduleA'), System.import('moduleB')])
    .then((moduleA, moduleB) => {...})

or the equivalent using async/await
2015-08-21 07:56:19 -07:00
Amjad Masad 1d7b858d74 [react-native] Update graceful-fs and use it in _build_bundle.js 2015-08-20 23:58:51 -07:00
Amjad Masad 4a423d7bba [react-packager] Fix error in template string and bump timeout
Summary:
Fix error in the template string (no plus, thinks it's a function).
And bump the timeout to 30 seconds because a file is taking more than 10 seconds `js/RKJSModules/Libraries/FBComponents/FBFed/FeedStoryFragments.js`
2015-08-20 15:29:38 -07:00
Martín Bigio 2330fa6bce [react-packager] Integration test for `runServerHere.sh` 2015-08-20 12:00:06 -07:00
Martín Bigio 06eb63b54d [react-packager] Introduce bundle IDs and keep track of parent/child
Summary:
Since JS doesn't have the guarantee that once a bundle is loaded it will stay in memory (and this is something we actually don't want to enforce to keep memmory usage low), we need to keep track of parent/child relationships on the packager to pass it down to native. As part of this diff, we also introduced an ID for each bundle. The ID for a child bundle is shynthetized as the bundleID of the parent module + an index which gets incremented every time a new bundle is created. For instance given this tree:

       a,b
    c       f
  d   e       g

the ID for `d` will be `bundle.0.1.2`, the one for e will be `bundle.0.1.3` and the one for `g` will be `bundle.0.5.6`. This information will be useful to figure out which bundles need to be loaded when a `require.ensure` is re-written.
2015-08-20 10:19:09 -07:00
Amjad Masad 54a8fe9156 [react-packger] Add a timeout on transform jobs
Summary:
There's been a case where Babel can hang indefinitely on a file parse/transform. Possibly related to https://github.com/babel/babel/issues/2211

This adds a timeout to transform jobs and throws an error informing the user of the offending file. The timeout interval defaults to 10 seconds, but can be changed via an option.
2015-08-19 17:42:28 -07:00
Amjad Masad c5b2dcaf9d [react-packager] Remove unnecessary 'chalk' module mock 2015-08-19 17:28:18 -07:00
Amjad Masad 208f54002f [react-packager] Make the fs mock async 2015-08-19 17:17:15 -07:00
Amjad Masad 866df6d37c [react-packager] Wait for haste map before accepting any requests
Summary:
D2319999 introduced a regression where we stopped waiting for the "build haste map" step to finish before we accept any requests. This makes sure that we block on that.

Need to unbreak with this, but will follow up with a test to catch this in the future.
2015-08-19 16:17:37 -07:00
Martín Bigio d8c8993758 [react-packager] Fix bug on Bundles Layout algorithm
Summary:
The layout algorithm wasn't getting deep into the sync dependencies recursively to async dependencies.
2015-08-19 14:20:38 -07:00
Alex Kotliarskyi 90ca49cbd6 [RN] Unbreak packager 2015-08-18 18:29:32 -07:00
Martín Bigio 02b8f264ef [react-packager] Modernize Activity to ES6 2015-08-18 15:25:18 -07:00
Martín Bigio f77f48c61c [react-packager] Modernize AssetServer to ES6 2015-08-18 14:38:40 -07:00
Ben Alpert 801dd2d133 [ReactNative] Don't redbox for React warnings when not using Chrome executor 2015-08-17 16:02:10 -07:00
Felix Oghină f11da8affb Merge pull request #2298 from foghina/yo
[cli] convert project generation to use yeoman
2015-08-17 13:51:24 +01:00
Amjad Masad 3555afb66d [reat-packager] Switch platform resolution based on query param
Summary:
Currently the platform selection is controlled by the blacklist. However, since we want to use the same server instance for cross-platform development, we need this to be controlled per request.

One outstanding issue, is that the DependencyGraph class wasn't designed that way and it doesn't have a per-request state. This means that with the current design race conditions is possible. If we got a request for a different platfrom while processing the previous request, we may change the outcome of the previous request.

To fix this a larger refactor is needed. I'll follow up a diff to do that.

Finally, so I don't break the universe like last time, I'll leave it up to the RN guys to update the call sites.
2015-08-15 13:28:18 -07:00
Alex Kotliarskyi 44b97249e9 [ReactNative] Add ability to listen for Packager events 2015-08-14 14:28:45 -08:00
Martín Bigio daf56c32eb [react-packager] Modernize `Server` to ES6 2015-08-14 12:34:23 -08:00
Martín Bigio fec5d8d4d4 [react-packager] Cache in which bundle is each module
Summary:
Not that at the moment a module can be present in multiple bundles, so the new API will return only one of them. In the near future we'll impose the invariant that a module can only be present in a single bundle so this API will return the exact bundle in which it is.
2015-08-14 12:30:30 -08:00
Martín Bigio c3be08e66b [react-packager] Modernize `Server-test` by using ES6 features 2015-08-14 12:23:02 -08:00
Amjad Masad 7664d5fb76 [react-packager] Use module objects across the codebase (rid of getPlainObject etc)
Summary:
Instead of using plain objects and having to convert to and from them we just use the `Module` class across the codebase.
This seems cleaner and can enforce the type as opposed to fuzzy objects.
2015-08-13 15:52:31 -08:00
Amjad Masad a372af9956 [react-packager] Remove horribly outdated example_project
Summary:
Removes some old unused code.
2015-08-13 13:02:52 -08:00
Martín Bigio 8644bfd09c [react-packager] Introduce Bundler
Summary:
Introduce a Bundler capable of generating the layout of modules for a given entry point. The current algorithm is the most trivial we could come up with: (1)it puts all the sync dependencies into the same bundle and (2) each group of async  dependencies with all their dependencies into a separate bundle. For async dependencies we do this recursivelly, meaning that async dependencies could have async dependencies which will end up on separate bundles as well.

The output of of the layout is an array of bundles. Each bundle is just an array for now with the dependencies in the order the requires where processed. Using this information we should be able to generate the actual bundles by using the `/path/to/entry/point.bundle` endpoint. We might change the structure of this json in the future, for instance to account for parent/child bundles relationships.

The next step will be to improve this algorithm to avoid repeating quite a bit dependencies across bundles.
2015-08-13 12:57:55 -08:00
Amjad Masad 1751d1c6fc [react-packager] Set a lifetime on workers to avoid memory leaks 2015-08-12 19:26:26 -08:00
Martín Bigio ce6acf1586 [react-packager] Introduce `require.ensure`
Summary:
This is the first step to add support for splitting the JS bundle into multiple ones. This diff adds support for keeping track of the async dependencies each module has. To do so we introduce the following syntax:

  require.ensure(['dep1', 'dep2, ..., 'depN'], callback);

Where the callback function is asynchronously invoked once all the indicated modules are loaded.

Internally, the packager keeps track of every set of async dependencies a module has. So for instance if a module looks like this:
  require.ensure(['dep1'], () => {...});
  require.ensure(['dep2'], () => {...});

the `Module` object will keep track of each set of dependencies separately (because we might want to put them on separate bundles).
2015-08-12 12:23:42 -08:00
Amjad Masad 3f1619b158 [react-packager] Rename 'Package' to 'Bundle'
Summary:
The word Package is overloaded, it may mean npm package, or may mean a collection of bundles. Neither is what we mean. We mean `bundle`.

This renames it and modernize some of the Bundler code.
2015-08-12 12:09:01 -08:00
Felix Oghină 6ed3ba3e41 [cli] convert project generation to use yeoman 2015-08-12 12:04:27 +01:00
Martín Bigio d1772eebe6 [react-packager] Fix Cache-test 2015-08-11 11:27:15 -08:00
Christopher Chedeau cf1a313d5c Bust jest caching and fix tests 2015-08-11 11:02:19 -07:00
Evan Solomon d1dc802e20 [Babel] Upgrade babel and regenerator to the latest version
Summary:
See c0fd4c1f9e
Closes https://github.com/facebook/react-native/pull/1753
Github Author: Evan Solomon <evan@evanalyze.com>

@allow-crlf-text
2015-08-10 20:37:39 -08:00
Martín Bigio 8c521f9749 [react-packager] Add more granular Activity logging 2015-08-10 16:25:04 -08:00
Martín Bigio 49fde903b8 [react-packager] Promote Cache to top level
Summary:
The cache is only used for JSTransformer at the moment. We're doing IO and some computation to get each module's name, whether is a haste or node module and it's dependencies. This work happens on startup so by caching this value we shouldbe able to reduce the start up time. Lets promote the Cache to the Packager level to be able to use it by any of the components of the packager. For now, on this diff we'll start using it to cache the mentioned fields.

Also we had to introduce the concept of fields in the cache as manually merging the date we had for each path is not possible as we're using promisses all around. With the new API, each field is a promise.

@amasad and I did some manual testing to measure the impact of this change and looks like it's saves 1 second when building the haste map (which represents 50% of the time). Overall this reduces 1 second of start up time which was currently about 8s on my mac book pro.
2015-08-10 16:25:03 -08:00
Martín Bigio 06f508a55a [JSAppServer] Don't keep track of not found packages 2015-08-06 11:34:56 -08:00
Thomas Aylott f47a29f922 [react-packager] Fixes stack traces
Summary:
TransformErrors weren't showing stack traces, making it hard to debug problems in transformer code.
2015-08-05 12:46:30 -08:00
James Ide 7b1ffed4e7 [Async] Enable async/await and update UIExplorer and tests
Summary:
- Enables async/await in .babelrc and transformer.js
- Adds regenerator to package.json. Users still need to explicitly require the regenerator runtime -- this is so that you only pay for what you use.
- Update AsyncStorage examples in UIExplorer to use async/await
- Update promise tests in UIExplorer to use async/await in addition to the promise API

Closes https://github.com/facebook/react-native/pull/1765
Github Author: James Ide <ide@jameside.com>
2015-08-04 05:35:13 -08:00
Amjad Masad 63a96af6c6 [react-packager] Add support for platform in the resolver
Summary:
Teach the resolver about platform-based resolution. The platform extension is inferred from the entry point.
It works for haste modules, as well as node-based resolution.
2015-08-03 18:29:20 -08:00
James Ide 03b4050c6e [Packager] Include Content-Type headers with bundle and source maps
Summary:
The packager did not send back the Content-Type headers. Adding these.

Closes https://github.com/facebook/react-native/pull/2029
Github Author: James Ide <ide@jameside.com>
2015-07-24 18:46:17 -08:00
Dave Sibiski f7d51c750f [Packager] Fix when loading a path that can't be handled
Summary:
[Packager] Adds `NotFoundError` when loading a path that can't be handled

Resolves https://github.com/facebook/react-native/issues/1944
Closes https://github.com/facebook/react-native/pull/1948
Github Author: Dave Sibiski <dsibiski@gmail.com>
2015-07-15 08:25:31 -08:00
Amjad Masad 802ad3feb3 [react-packager] fix test 2015-07-01 17:37:51 -08:00
James Ide 62431c7f62 [Tests] Update tests to run on io.js with the latest version of jest
Summary:
[This is a preview diff for getting RN's tests to pass with a future version of jest that supports io.js and other future versions of Node. This can be merged once the diff to update jest is merged upstream and published.]

Updates the tests in small ways so they run on io.js with two updates:

 - The Cache test which relies on Promises uses `runAllImmediates` for modern versions of Node because bluebird uses `setImmediate` instead of `process.nextTick` for Node >0.10.

Closes https://github.com/facebook/react-native/pull/1382
Github Author: James Ide <ide@jameside.com>

Test Plan:  Run `npm test` with the latest version of jest.
2015-07-01 13:02:29 -08:00
Amjad Masad 70dde863ae [react-packager] Use latest babel-core in place of babel (40% perf improvement) 2015-06-30 03:55:21 -08:00
Amjad Masad 6b2c12e300 [react-packager] Update sane to get a new version of fb-watchman (perf) 2015-06-26 17:48:39 -08:00
Amjad Masad 15a0f07c5f [react-packager] Enable watchman fs crawl
Summary:
@public
Now that watchman perf issue was fixed we can enable watchman-based fs crawling which is faster than node.
This showed an existing issue with some files missing from the blacklist which I addressed.

Test Plan:
./fbrnios.sh run
click around and scroll all the apps
2015-06-26 16:20:50 -08:00
Amjad Masad 737a32417f [react-packager] Injectible file crawlers (2x crawl speedup) 2015-06-24 18:04:57 -08:00
Jing Chen 693fd0bbe5 [events] Add JS require time and fix up some existing logs 2015-06-24 16:59:00 -08:00
Amjad Masad 95800d1564 [react-packager] Fix the confused node_modules detection function
Summary:
@public

We have a function that detects whether a give file is to be treated as a node_modules. If so it doesn't have access to the haste module map. There is an exception to this rule which is a few modules that are allowed to do that. Currently thats react-native, react-tools, and parse.

The current implementation had a bug where if you had `react-native` (or react-tools etc) in the name before the actual package root then the detection will be off. This fixes the problem by starting from the `lastIndexOf('node_modules')` directory, that way nothing confuses us.

Test Plan:
./runJestTests.sh
export OSS, patch, run e2e test
2015-06-24 15:20:35 -08:00
Christopher Chedeau fef3c7294d [ReactNative] Bring in node console.log formatting
Summary:
@public

The current output of console.log is extremely bad. If you pass NaN, it shows up as null (super confusing I know -_-), if you pass a cyclical object, it just says that it is cyclic and that's it. It doesn't print up the first few levels which are NOT cyclical and would be really helpful.

It turns out that nodejs console.log pretty printer is really awesome and can be easily extracted as a few hundred lines. This is going to be such a productivity boost that I think it's the right tradeoff to embed it like this

Test Plan:
```
var a = {kikoo: {lol: 1}}
a.kikoo.nice = a;

console.log(a);
> { kikoo: { lol: 1, nice: [Circular] } }

console.log(NaN)
> NaN
```
2015-06-24 14:11:55 -08:00
Forbes Lindesay bc1f94b7b2 Replace bluebird with promise 2015-06-22 08:44:03 -08:00
Bill Fisher 050f0b3558 [ReactNative][easy] fix server 500 response typo
Summary:
@public
corrected small typo in the 500 response from the packager server

Test Plan: add throw to promise function prior to error handler, run packager, cache a bundle with bundle extension URI, open /debug/packages, see clean 500 error
2015-06-20 16:43:18 -08:00
Amjad Masad 695a5c2fbc [react-packager] Cache in-memory file lookups (~200ms win on file change) 2015-06-19 22:47:26 -08:00
Amjad Masad 8faa406e96 [react-packager] Rewrite dependency graph (support node_modules, speed, fix bugs etc)
Summary:
@public
Fixes #773, #1055
The resolver was getting a bit unwieldy because a lot has changed since the initial writing (porting node-haste).
This also splits up a large complex file into the following:

* Makes use of classes: Module, AssetModule, Package, and AssetModule_DEPRECATED (`image!` modules)
* DependencyGraph is lazy for everything that isn't haste modules and packages (need to read ahead of time)
* Lazy makes it fast, easier to reason about, and easier to add new loaders
* Has a centralized filesystem wrapper: fast-fs (ffs)
* ffs is async and lazy for any read operation and sync for directory/file lookup which makes it fast
* we can easily drop in different adapters for ffs to be able to build up the tree: watchman, git ls-files, etc
* use es6 for classes and easier to read promise-based code

Follow up diffs will include:
* Using new types (Module, AssetModule etc) in the rest of the codebase (currently we convert to plain object which is a bit of a hack)
* using watchman to build up the fs
* some caching at the object creation level (we are recreating Modules and Packages many times, we can cache them)
* A plugin system for loaders (e.g. @tadeuzagallo wants to add a native module loader)

Test Plan:
* ./runJestTests.sh react-packager
* ./runJestTests.sh PackagerIntegration
* Export open source and run the e2e test
* reset cache
* ./fbrnios.sh run and click around
2015-06-19 18:05:18 -08:00
Amjad Masad 0405c82798 [react-packager] Cache based on options, not url
Summary:
@public

We cached based on url, which wasn't unique becuase some options would be defaulted. This was obvious when starting the server via fbrnios which tries to warmup the bundle.
And then when the device woke up it will send a request (that is identical in reality) but would miss the cache.

This changes the cache key into a JSON stringification of the options.

Test Plan:
* ./runJestTests.sh
* ./fbrnios.sh run
2015-06-19 15:14:31 -08:00
Amjad Masad 4b9d5f8ad0 [react-packager] Add tests to ensure we return all dependency types 2015-06-18 21:27:55 -08:00
Amjad Masad 253544cb45 [react-packager] Make it safe to include files without a newline at the end
Summary:
@public
Fixes #1431
Fixes #1005
Files with no newlines and a comment at the end of the file would've caused a syntax error in the bundle:

```js
__d('module', function() {
hi();
// wow })
```

This fixes the issue by inserting a new lines before `})`.

Test Plan:
* ./runJestTests.sh
* ./runJestTests.sh PackagerIntegration
* open app to the playground app
* add an error
* observe that the redbox has the correct lines
2015-06-16 12:02:49 -08:00
Tadeu Zagallo 24026b6c25 [ReactNative] Revert packager ignoring node_modules 2015-06-11 10:45:32 -08:00
Spencer Ahrens 712c52609b [ReactNative] Fix require-time redboxes 2015-06-09 15:42:47 -08:00
Eric Vicenti a2396a6446 Revert [react-packager] Add support for nested node_modules 2015-06-05 08:44:06 -08:00
Amjad Masad db842e2c23 [react-packager] Fix more node_modules resolution rules
Summary:
@public
Fixes #773
This fixes `.json` name resolution. And also reads `package.json` when doing a directory module resolution.
The algorithm can be found here: https://nodejs.org/api/modules.html
I'll probably start including the node (or browserify) modules test in later diffs to make sure we're fully compliant.

Test Plan:
* ./runJestTests.sh
* ./runJestTests.sh PackagerIntegration
* open playground and require a json file
* test redbox
2015-06-04 15:07:03 -08:00
Amjad Masad 581673ff3a [react-packager] Support packages with '.' in the name
Summary:
@public
Fixes issue #1055
For some historical reason we used to strip the extension of the module name before passing it to `resolveDependency` which is completly capable of handling all kinds of names. The fix is one line, but added a few tests for this.

Test Plan:
* ./runJestTests.sh
* ./runJestTests.sh PacakgerIntegration
* Open app and click around
2015-06-03 14:07:31 -08:00
Amjad Masad e4da97c24a [react-packager] Add support for nested node_modules
Summary:
@public
The packager's resolver started out imitating node-haste, which meant that we didn't support nested modules. Now this is a problem. Bigger projects are bound to have versions of different versions of the same package at different levels of the dependency tree. This
makes loading dependencies lazy for node_modules and implements the node resolution algorithm. However, it also mantains that some
modules are still "haste" format, which currently defaults to "react-native" and "react-tools".

Finally, this means ~5 seconds speed up on every server start. This should also have a big impact on open source users with projects with big node_modules.

Test Plan:
1- test the app with --reset-cache
2- click around test and production apps
3- update the OSS library
4- create a new project
5- npm install multiple modules
6- create some version conflict in your project
7- make sure we do the "right" thing
8- test file changes to make sure it works
2015-06-03 11:35:48 -08:00
Tadeu Zagallo 65103e0c63 [ReactNative] Update sane fork + FileWatcher config 2015-05-28 07:12:41 -08:00
Tadeu Zagallo fddc50b98b [ReactNative] Add option to file watcher to ignore node_modules 2015-05-28 01:18:47 -08:00
Amjad Masad a6a8432100 [react-packager] Introduce buildPackage API 2015-05-22 17:28:27 -08:00
Amjad Masad 61efe8a34b [react-packager] Use actual error types
Summary:
@public
Previously, we had to use errors as a property on the result object because there was no way to pass custom props between
the child worker and the parent. This has been fixed in node-worker-farm (D2092153) and now we can use regular errors.
This also adapts the transformer to babel-specific errors. Generic errors, however, should still work and render readable
info.

Additionally, I deprecated, but maintained backwards compatiblity for people in OSS that are using custom transformers.

Test Plan:
1. `./runJestTests.sh`
2. `./runJestTests.sh PackagerIntegration`
3. open the playground app
4. Add a syntax error. Say `1=x` somewhere in the file
5. Reload and see error message 'SyntaxError <filename> description (line:col)'
6. Make sure that the stack trace is clickable and it attempts to open the editor to the location
2015-05-22 10:21:26 -08:00
Amjad Masad 2271166a83 [react-packager] Add first class support to popular image formats
Summary:
@public
1. Default to first class support of popular image formats
2. Add tests to make sure we support other than png

Test Plan:
1. ./runJestTests.sh
2. Add test.png and test.jpg images in the Playground app dir
3. require both images and render then in the playground app
4. they render
2015-05-20 15:28:29 -08:00
Amjad Masad c9c61222cf [react-packager] Implement getJSModulePaths API 2015-05-20 13:38:46 -08:00
Amjad Masad 46e1404a76 [react-native] Fix source map issue with virtual modules 2015-05-15 15:49:11 -08:00
Amjad Masad e5b939d623 [react-packager] Use transformer name in cache name
Summary:
@public
Shouldn't confuse the cache from files transformed by different transformers. This takes into account the transformer in the cache hash name.

Test Plan:
* start server with --babel
* generate bundle
* start server with --jstransform
* generate bundle
* compare them and they're different
2015-05-13 14:49:28 -08:00
Spencer Ahrens ac49f8ca99 [ReactNative] differentiate fatal and soft exceptions 2015-05-13 13:24:37 -07:00
Nick Lockwood a91b293682 decode pathName when extracting from url 2015-05-13 13:24:36 -07:00
Dmitry Soshnikov 5663456373 [jest] Update to v0.4.2 2015-05-13 13:24:35 -07:00
Alex Kotliarskyi 2f4dcae505 [ReactNative] Register assets with AssetRegistry 2015-05-07 17:27:42 -08:00
Amjad Masad b05ca45244 [react-packager] Use gracful-fs to avoid EMFILE errors
Summary:
@public
Currently, every time we call into the packager we have to change the ulimit to make sure
we don't hit the EMFILE error (the packager uses as much concurrency as possible).

Using graceful-fs, the fs module -- with monkey patching -- becomes intelligent enough to recover
from EMFILE errors.

Test Plan:
* set `ulimit -n 256*
* start server
* request from your browser: http://localhost:8081/RKJSModules/MainBundle/CatalystBundle.includeRequire.bundle
* it works
2015-05-05 14:30:43 -08:00
Spencer Ahrens 95a120b663 [ReactNative] improve console logging a little bit 2015-05-04 18:57:03 -08:00
Amjad Masad 830646529a [react-packager] Combine source maps coming from transformer
Summary:
@public
Fixes [#393](https://github.com/facebook/react-native/issues/393). Currently the transformer assumes line-preserving compilers and defaults to a super-fast source map generation process. However, we need to support compilers that aren't preserving lines.
I had feared this wuold slow down the server but I came about a little known peace of the spec that defines an "indexed source map" just for the purpose of concating files: https://docs.google.com/document/d/1U1RGAehQwRypUTovF1KRlpiOFze0b-_2gc6fAH0KY0k/edit

Test Plan:
1. runJestTests.sh
2. run server and click around example apps
3. add a custom transporter like babel
4. add a custom file and a debugger statement
5. debug in chrome and make sure it works

redbox still works
2015-05-01 16:59:14 -08:00
Tim Yung 0fde2c2583 JS: Use Object.defineProperty for Array Polyfills 2015-04-28 15:56:40 -08:00
Alex Kotliarskyi fca69ad9d5 [ReactNative] Bump watchman timeout to 25s 2015-04-27 19:30:02 -08:00
Kevin Gozali 2115b67bd9 [ReactNative][madman] Reverted D2014357 2015-04-23 16:04:16 -08:00
Philipp von Weitershausen 0b3ca1c53e [ReactNative] Back out D2014163 entirely 2015-04-23 12:02:47 -08:00
Amjad Masad f635db3b6d [react-packager] Change uri to name 2015-04-23 11:52:00 -08:00
Amjad Masad 91b320cf35 [react-packager] Fix jest tests 2015-04-23 11:39:41 -08:00
Philipp von Weitershausen 240424714e [ReactNative] Disable console.error => redboxes to unwedge Android 2015-04-23 09:56:15 -08:00
Spencer Ahrens 4e96edb8b1 [ReactNative] console.error shows RedBox with pretty stack trace 2015-04-22 15:51:41 -08:00
Amjad Masad d4b5f2e514 [react-packager] Additional data to asset modules 2015-04-22 10:59:37 -08:00
Amjad Masad 2645ffb69a [react-packager] bump watchman watch timeout to 10 seconds 2015-04-21 10:59:29 -08:00
Amjad Masad f91f7084ec [react-packager] Allow json files as modules 2015-04-21 10:51:15 -08:00
Amjad Masad 201d65dead [react-packager] Implement Packager::getAssets 2015-04-20 16:01:15 -08:00
Alex Kotliarskyi f7e2e4114b [ReactNative] Dim packager output 2015-04-17 16:12:25 -08:00
Amjad Masad ed3aaadc39 [react-packager] Add more information to deprecated asset requires 2015-04-17 15:14:13 -08:00
James Ide a68cc06f0b [Errors] Fix Red Box by fixing providesModule parsing
Summary:
cc @amasad

An error occurred while trying to display the Red Box since loadSourceMap was not included in the JS
bundle. This is because node-haste was treating its docblock as a multiline directive which doesn't make sense for `@providesModule`.

In loadSourceMap.js's case, the directive's value was parsed as "loadSourceMap -- disabled flow due to mysterious validation errors --".

There are two fixes: add a newline under the `@providesModule` directive, and change the module ID code to look at only the first token of the directive. I opted for the latter so we avoid this class of bugs entirely and AFAIK it's nonsensical to have multiple `@providesModule` values anyway.

Closes https://github.com/facebook/react-native/pull/866
Github Author: James Ide <ide@jameside.com>

Test Plan:  Run the packager, trigger an error in an app, see the red box now show up again.
2015-04-17 09:45:35 -08:00
Peter Cottle 83ee7ad9dd [ReactNative|Easy] Change watchman too-long error message
Summary:
@wez Mentioned this in Issue #239 -- right now when watchman takes too long we recommend you run `watchman` from your terminal which actually expects some arguments, so it prints out the following:

```
[pcottle:~/Desktop/react-native:changeErrorMessage]$ watchman
{
    "error": "invalid command (expected an array with some elements!)",
    "cli_validated": true,
    "version": "3.0.0"
}
```

basically this ends up being more confusing since the command we recommend you run errors out, so lets change it to `watchman version` which at least exists cleanly.

I kept the troubleshooting link as https://facebook.github.io/watchman/docs/troubleshooting.html since it sounds like we will update that with the issue people run into in #239
Closes https://github.com/facebook/react-native/pull/825
Github Author: Peter Cottle <pcottle@fb.com>

Test Plan: Imported from GitHub, without a `Test Plan:` line.
2015-04-17 09:16:22 -08:00
Amjad Masad 2fabfdae11 [react-packager] Add asset extensions to file watch glob in the project root 2015-04-17 09:03:41 -08:00
Tadeu Zagallo 4b52f2eacc [ReactNative] Send batched calls from objc to js every frame + add bridge profiling 2015-04-17 04:01:02 -08:00
Amjad Masad f45d032659 [react-packager] Remove links to internal wiki 2015-04-16 13:14:41 -08:00
Amjad Masad 852f8533a1 [react-packager] implement /assets endpoint to serve assets 2015-04-16 13:00:48 -08:00
Amjad Masad a998049c08 [react-packager] Add Array.prototype.es6 polyfill 2015-04-14 15:15:53 -08:00
Amjad Masad 4a3e69ec74 [react-packager] Support @nx resolution postfix for assets 2015-04-14 10:43:39 -08:00
Tim Yung 39da8034dd React Native: Add String.prototyp.es6 Polyfill 2015-04-13 13:25:35 -08:00
Amjad Masad 4b9ec6c5f7 [react-packager] Correct module extension regexp 2015-04-09 12:07:23 -08:00
Amjad Masad 21f1497418 [react-packager] Implement the browser field package.json spec 2015-04-09 11:59:48 -08:00
Amjad Masad 408160de7d [react-packager] Don't depend on error.stack being available 2015-04-08 14:23:18 -08:00
Amjad Masad f88167157c [react-packager] Implement new style asset packaging (with dimensions) 2015-04-08 13:11:21 -08:00
Spencer Ahrens 061de15c1c [ReactNative] Do flow check when running packager 2015-04-07 21:40:05 -08:00
Amjad Masad 31e0018c1c [react-packager] Deprecate global image namespace in favor of CommonJS resolution 2015-04-03 17:19:10 -08:00
Amjad Masad e22b4e000b [react-packager] Don't cache rejected promise 2015-04-03 15:47:26 -08:00
Pilwon Huh d476461120 react-packager: Add ES6 import statement support to DependencyGraph.
Summary:
This PR teaches packager's `DependencyGraph` how to extract dependencies written with ES6 `import` statements.

It fixes the issue where you are not able to write your app with ES6 `import` statements when your custom transformer (replacing the default [JSTransform](https://github.com/facebook/jstransform), for example, [babel](http://babeljs.io/)) already supports the ES6 `import` syntax.

It will also be useful for [JSTransform](https://github.com/facebook/jstransform) later on once it implements `import` feature too.
Closes https://github.com/facebook/react-native/pull/386
Github Author: Pilwon Huh <pilwon@gmail.com>

Test Plan: runJestTests.sh
2015-04-03 11:40:54 -08:00
Amjad Masad bedd4029c8 [react-packager] Ignore dotfiles in file watching 2015-04-02 06:11:16 -08:00
Jacob Gable ab9f78496f Do not expose define references in require polyfill
Summary:
See #406

Made sure the jest tests pass but didn't know a good unit test to add for this.
Closes https://github.com/facebook/react-native/pull/427
Github Author: Jacob Gable <jacob.gable@gmail.com>

Test Plan:
* ./runJestTests
* start app and click around
2015-03-31 22:32:39 -08:00
Pilwon Huh 7f6255b16f [react-packager] Switch from Q to Bluebird as promises library
Summary:
This PR improves performance of `react-packager` by switching the promises library from the [Q](https://github.com/kriskowal/q) to [Bluebird](https://github.com/petkaantonov/bluebird).

[Here is the test result](https://github.com/facebook/react-native/issues/361#issuecomment-87829808) showing a noticeable difference. (2x speed improvement)

Please refer to [this issue](https://github.com/facebook/react-native/issues/361) for more details.
Closes https://github.com/facebook/react-native/pull/516
Github Author: Pilwon Huh <pilwon@gmail.com>

Test Plan:
./runJestTests
start app and click around
2015-03-31 21:24:13 -08:00
Amjad Masad 69ae1bb3b7 [react-packager] Fix EISDIR error 2015-03-31 19:49:05 -08:00
daviskoh 28a0a2586d Bugfix/require module regexp
Summary:
Resolves https://github.com/facebook/react-native/issues/316. Also updated the spec for the Haste Dependency Resolver. Not sure if these changes are the ones desired so feedback would be welcome!
Closes https://github.com/facebook/react-native/pull/368
Github Author: daviskoh <koh.davis.0@gmail.com>

Test Plan: ./runJestTests
2015-03-31 17:37:39 -08:00
Amjad Masad e306f4e8d5 [react-packager] Inherit from Error correctly 2015-03-27 21:47:19 -08:00
Amjad Masad 4a67c84426 [react-packager] Watch asset roots for changes to update dependency graph 2015-03-27 09:18:00 -08:00
Amjad Masad b2eba1072b [react-packager] Fix node v0.11.14 query parse bug 2015-03-26 14:33:33 -08:00
Amjad Masad f68c24069e [react-packager] better error when main file not found 2015-03-26 10:38:50 -08:00
Amjad Masad ec1b9ec735 [react-packager] kill non-standard RAW_SOURCE_MAP 2015-03-24 17:17:02 -08:00
Amjad Masad bef3d46cee [react-packager] Fix more issues with node modules 2015-03-24 16:07:56 -08:00
Amjad Masad fc92348d8b [react-packager] Fix regression with transform errors 2015-03-23 18:55:36 -08:00
Alex Kotliarskyi 7e2b9bfd77 [ReactNative] Remove `arc build` instructions from require 2015-03-23 17:18:19 -08:00
Amjad Masad 81634084bc [react-packager] Default to index.js from main if it's a dir 2015-03-23 14:55:52 -08:00
Christopher Chedeau a2c32d4d29 [ReactNative] Expanded license on js packager files 2015-03-23 11:28:51 -08:00
Amjad Masad 375797ae36 [react-packager] Pick up package changes while running 2015-03-23 11:15:52 -08:00
Amjad Masad 01c8933949 [react-packager] Allow entry point extensions like .ios.js 2015-03-20 17:24:51 -08:00
Amjad Masad 2e2f3b3d9b [react-packager] Hash cache file name information to avoid long names 2015-03-19 16:40:35 -08:00
Amjad Masad 566a177464 [react-packager] Fix OOM 2015-03-19 11:50:27 -08:00
Amjad Masad ace7e3613f [react-packager] Add assetRoots option 2015-03-18 18:26:35 -08:00
Martin Kosiba 8a1b71c287 [react_native] JS files from D1919491: Improve JS logging 2015-03-18 07:30:18 -08:00
Amjad Masad be992c90e9 [react-packager] small fixes to image loader 2015-03-16 14:45:40 -08:00
Christopher Chedeau 6dfa8c0e4d [ReactNative] Fix File Watcher test 2015-03-14 16:50:54 -08:00
Amjad Masad d2cf0de12e [react-packager] Implement image loading i.e. ix('img') -> require('image!img'); 2015-03-13 16:10:58 -08:00
Amjad Masad 7874698b6b [react-packager] onchange endpoint that informs of changes 2015-03-06 15:28:32 -08:00
Amjad Masad 50220f1384 [react-packager] dev option needs to default to true for backwards compat 2015-03-06 14:45:23 -08:00
Amjad Masad 3d92dd422c [react-packager] Add minify option as query param 2015-03-05 12:12:42 -08:00
Amjad Masad a4d041ce62 [react-packager] Make dev a query param option 2015-03-04 21:24:08 -08:00
Amjad Masad 5bd8155f0b [react-packager] Start converting options to query params 2015-03-04 19:06:51 -08:00
Amjad Masad 41743e5987 [react-packager] Recover and warn from corrupted cache file 2015-03-03 17:49:42 -08:00
Amjad Masad 37cab152b5 [react-packager] check-in node_modules and update tests 2015-03-03 02:02:51 -08:00
Amjad Masad c289844144 [react-packager] Implement bundle minification 2015-03-02 23:19:41 -08:00
James Ide ee00675dab [react-packager] Add dev option to CLI | James Ide
Summary:
Exposes the dev option that is already there to the CLI so that you can turn off invariant checks, etc. I also made it omit the inlined source map when dev=false which made it a lot faster to run on a phone, both due to smaller download size and fewer bytes to copy from Obj-C to JS and evaluate.
Closes https://github.com/facebook/react-native/pull/112
Github Author: James Ide <ide@jameside.com>

Test Plan:
* ./runJestTests.sh
* test bundle creation with `bundle.sh`
* test `load_dependencies.js` script
* start the server and click around shell app
2015-03-02 21:11:07 -08:00
Amjad Masad 68b02a843c [react-packager] Better transform errors 2015-02-28 17:13:23 -08:00
Amjad Masad c435ce74b6 [React Native][react-packager] Fix test runner and fialing tests 2015-02-28 14:55:00 -08:00
Amjad Masad 887cb9ff71 [react-packager] transformModulePath option is not actually required 2015-02-27 10:51:07 -08:00
Amjad Masad d740d17d42 [react-packager] Fix lint errors 2015-02-25 20:29:42 -08:00
Chengyin Liu 3d65001426 [react-packager] fix a typo s/pacakge/package
Summary:
Closes https://github.com/facebook/react-native/pull/83
Github Author: Chengyin Liu <chengyin.liu@gmail.com>

Test Plan: Imported from GitHub, without a `Test Plan:` line.
2015-02-25 16:07:13 -08:00
Amjad Masad 4e8a8e5a0e [react-packager] Fix jest tests 2015-02-25 14:17:42 -08:00
Amjad Masad 4a3025da0c [react-packager] Cleanup option passing and validation 2015-02-24 15:17:40 -08:00
Amjad Masad 61b7183ae0 [react-packager][cleanup options 1/2] add npm installed joi validation library 2015-02-23 13:11:35 -08:00
Spencer Ahrens 382e1553af [react-packager][streamline oss] Move open sourced JS source to react-native-github 2015-02-19 21:25:11 -08:00